From 1854fc194e90646064701d2306d8078bd423e352 Mon Sep 17 00:00:00 2001 From: Jonathan Pryor Date: Mon, 22 Sep 2025 17:00:13 -0400 Subject: [PATCH 1/6] [Mono.Android] Enumify API-36.1 Context: http://github.com/jpobst/BindingStudio Context: https://github.com/jpobst/BindingStudio/pull/1 Use jpobst/BindingStudio to begin enumifying API-36.1. Note: current dotnet/java-interop emits an "extra" `,` on `map.csv` output, which would make for a "noisy" diff (every line changed!). The diff is reduced by removing trailing commas: sed 's/,$//' < src/Mono.Android/new-map.csv > src/Mono.Android/map.csv This keeps the diff to a reasonable size. Update `build-tools/manifest-attribute-codegen` so that: 1. It can be executed from topdir. 2. Warning message are actually emitted when using `dotnet build`. Previously, only the fact that the executed command failed would be printed, but none of the tool output. TODO: figure out if there are any other TODOs. TODO: Flush current BindingStudio output, with the extra commas. --- Documentation/workflow/HowToAddNewApiLevel.md | 234 +++++++++++++++--- .../manifest-attribute-codegen/README.md | 2 +- .../manifest-attribute-codegen.csproj | 15 +- .../manifest-definition.xml | 37 ++- .../manifest-attribute-codegen/metadata.xml | 4 + src/Mono.Android/map.csv | 138 ++++++++++- src/Mono.Android/metadata | 16 ++ src/Mono.Android/methodmap.csv | 77 ++++++ 8 files changed, 467 insertions(+), 56 deletions(-) diff --git a/Documentation/workflow/HowToAddNewApiLevel.md b/Documentation/workflow/HowToAddNewApiLevel.md index 27cfef8aee9..5c926334362 100644 --- a/Documentation/workflow/HowToAddNewApiLevel.md +++ b/Documentation/workflow/HowToAddNewApiLevel.md @@ -6,6 +6,8 @@ The first unstable preview generally ships in late February or early March. At stage for the APIs, we simply add literal bindings for them. We do not spend resources on the more manual parts like enumification that will likely change as the APIs mature. + + ### Review `repository2-3.xml` is an XML description of the Android SDK, @@ -256,6 +258,104 @@ It's a Winforms app, so it only runs on Windows. It's ugly as sin, and has very it prompts you with the exact decisions you need to make, and handles as much dirty work as possible, allowing enumification to be done in a few days. +### Source of Inspiration for enum grouping + +*If the Android sources package has been published* -- which is not always a given, and thus why +historically this could not be relied upon for automated enumification -- then the Android Source +package can be used as a "source of inspiration". The Android Source package is listed in the +repository XML in a "source" remote package: + +```xml + + + + 36.1 + 20 + true + + + 1 + + Sources for Android 36.1 + + + + + + 51810808 + 54cea0371ec284404e06051cd389646d34470da4 + source-36.1_r01.zip + + + + + +``` + +As with other Repository packages, append the `//archive/complete/url` value to +`https://dl.google.com/android/repository/`, creating e.g. +. The contents of +this archive is *Java source code* for the public Android API. + +Within the Java source code is usage of *source-only annotations* which Java IDEs +can use to associate Java constants with method parameters and return types. +For example, from `src/android/view/View.java`: + +```java +public /* partial */ class View { + + @FlaggedApi(FLAG_REQUEST_RECTANGLE_WITH_SOURCE) + public boolean requestRectangleOnScreen(@NonNull Rect rectangle, boolean immediate, + @RectangleOnScreenRequestSource int source) { + … + } + + /** + * @hide + */ + @IntDef(prefix = { "RECTANGLE_ON_SCREEN_REQUEST_SOURCE_" }, value = { + RECTANGLE_ON_SCREEN_REQUEST_SOURCE_UNDEFINED, + RECTANGLE_ON_SCREEN_REQUEST_SOURCE_SCROLL_ONLY, + RECTANGLE_ON_SCREEN_REQUEST_SOURCE_TEXT_CURSOR, + RECTANGLE_ON_SCREEN_REQUEST_SOURCE_INPUT_FOCUS, + }) + @Retention(RetentionPolicy.SOURCE) + public @interface RectangleOnScreenRequestSource {} + + @FlaggedApi(FLAG_REQUEST_RECTANGLE_WITH_SOURCE) + public static final int RECTANGLE_ON_SCREEN_REQUEST_SOURCE_UNDEFINED = 0x00000000; + + @FlaggedApi(FLAG_REQUEST_RECTANGLE_WITH_SOURCE) + public static final int RECTANGLE_ON_SCREEN_REQUEST_SOURCE_SCROLL_ONLY = 0x00000001; + + @FlaggedApi(FLAG_REQUEST_RECTANGLE_WITH_SOURCE) + public static final int RECTANGLE_ON_SCREEN_REQUEST_SOURCE_TEXT_CURSOR = 0x00000002; + + @FlaggedApi(FLAG_REQUEST_RECTANGLE_WITH_SOURCE) + public static final int RECTANGLE_ON_SCREEN_REQUEST_SOURCE_INPUT_FOCUS = 0x00000003; +} +``` + +The `public @interface RectangleOnScreenRequestSource` introduces a *Java annotation*. +The `@RectangleOnScreenRequestSource` annotation itself has +[`@Retention(RetentionPolicy.SOURCE)`](https://developer.android.com/reference/kotlin/java/lang/annotation/Retention.html), +which indicates that the annotation will only be present in *source code*, not `.class` files. +The `@RectangleOnScreenRequestSource` annotation also has an +[`@IntDef` annotation](https://developer.android.com/reference/androidx/annotation/IntDef), which is +used to specify which constants are grouped together. + + * `IntDef.prefix` is an optional string listing a common prefix for all the grouped constants. + * `IntDef.flag` is an optional boolean value specifying whether the grouped constants + are usable in a bitwise context, akin to `[System.Flags]`. + * `IntDef.value` is an array of the grouped constants. + +The `@RectangleOnScreenRequestSource` annotation can then be used on Java method parameters +and return types to indicate which parameters and return types should be enumified. + +Something to consider for the future: *if* Google reliably provides source packages, +these annotations could be used to auto-generate enumified APIs. For now, this information +can be used as a source of inspiration for enum names and what should be in the enums. + ### Extract constants from API Using BindingStudio: @@ -327,12 +427,15 @@ The left tree view can be updated by saving and reopening the `map.csv` file. Using BindingStudio: -- Update the file paths in `MainForm.FindAPILevelMethodsToolStripMenuItem_Click` +- Update the file paths in `MainForm.FindAPILevelMethodsToolStripMenuItem_Click`. + In particular, `api` is the path to the `api-*.xml` file to parse, and + `csv` is the name of a CSV file containing the contents described below. - Run BindingStudio and choose `Tools` -> `Find API Level Methods` -This will create a file of every method in the new API level that takes an `int` as a parameter -or returns an `int` as a return value. Each method will be marked with a `?` in the file -to indicate a decision needs to be made to ignore it or map it to an enum. +The `csv` variable within `MainForm.FindAPILevelMethodsToolStripMenuItem_Click()` is the name +of the created file which contains every method in the new API level that takes an `int` as a +parameter or returns an `int` as a return value. Each method will be marked with a `?` in the +file to indicate a decision needs to be made to ignore it or map it to an enum. Example: ``` @@ -347,7 +450,7 @@ Using BindingStudio: - Choose `File` -> `Open Constant Map` - Choose existing `map.csv`: `xamarin-android/src/Mono.Android/map.csv` - Choose `File` -> `Open Method Map` - - Choose the new `.csv` created in the previous step + - Choose the new `.csv` created in the previous step. The left tree will populate with every method that possibly should be enumified and needs a decision to be made. Clicking a method shows the Android documentation for @@ -358,45 +461,87 @@ Note a method may show up multiple times, once for each parameter or return type There are 3 possible options for a method parameter/return type: -1) Unknown + 1. Unknown -You don't how to handle this method currently, so leaving it in the initial state -of "Unknown" will leave it alone until a decision can be made. + You don't how to handle this method currently, so leaving it in the initial + state of "Unknown" will leave it alone until a decision can be made. -2) Ignore + 2. Ignore -The method parameter/return type should remain an `int` and not be converted to an enum. + The method parameter/return type should remain an `int` and not be converted to an enum. -Ex: -``` -int Add (int value1, int value2) { ... } -``` + For example: + + ```java + int Add (int value1, int value2) { ... } + ``` + + Click the **Ignore** radio button and then the **Save** button. + + 3. Enumify -Click the "Ignore" radio button and then the "Save" button. + The method parameter/return type should be changed to an enum. + + For example: + + ```java + void AudioAttributesBuilder.SetSpatializationBehavior (int sb) {… } + ``` + + - Choose the **Enumify** radio option + - Use the DropDown in the bottom-left to select the enum to use + - When selected, the members of that enum will be shown in the box below the enum + - Alternatively, search for a enum by enum member name using the Search box in the right + - If desired enum is found, clicking it will populate dropdown + - Click **Save** + +Use `File` -> `Save` to save your work often! -3) Enumify +### Turning `int` into `Color` -The method parameter/return type should be changed to an enum. +As part of the above **Mapping methods** process, some methods may appear which should +be an `Android.Graphics.Color`, e.g. methods named `getTextColor()`. -Ex: +[`src/Mono.Android/metadata`](../../src/Mono.Android/metadata) is used to transform `int` +parameter and return types into `Android.Graphics.Color`. This is a manual process. + +To map the return type: + +```xml +Android.Graphics.Color ``` -void AudioAttributesBuilder.SetSpatializationBehavior (int sb) { ... } + +Specifically: + + * `//attr/@path` is the XPath expression to the method name to update + * `//attr/@name` the XML attribute to update. For return types, this is `return`. + * The value of the `` is `Android.Graphics.Color`. + +To map parameter types: + +```xml +Android.Graphics.Color ``` -- Choose the "Enumify" radio option -- Use the DropDown in the middle to select the enum to use - - When selected, the members of that enum will be shown in the box below the enum -- Alternatively, search for a enum by enum member name using the Search box in the right - - If desired enum is found, clicking it will populate dropdown -- Click "Save" + * `//attr/@path` is the XPath expression to the parameter to update + * `//attr/@name` the XML attribute to update. For return types, this is `type`. + * The value of the `` is `Android.Graphics.Color`. -Use `File` -> `Save` to save your work often! ### Finishing the method map The official `methodmap.csv` uses a slightly different format than the one used for enumification. Using BindingStudio: + - Ensure the "new api level method map" CSV file is loaded. - Choose `Tools` -> `Export Final Method Map` - Choose a temporary file name @@ -405,26 +550,41 @@ Using BindingStudio: Congrats! Enumification is complete! ----- Somewhat outdated docs below, update when we do this year's stabilization ---- +But wait, there's more! + +### New `AndroidManifest.xml` elements and attributes -6) new AndroidManifest.xml elements and attributes +`build-tools/manifest-attribute-codegen/manifest-attribute-codegen.cs` can be +compiled to a tool that collects all Manifest elements and attributes with the +API level since when each of them became available. New members are supposed +to be added to the existing `(FooBar)Attribute.cs` and +`(FooBar)Attribute.Partial.cs` in `src/Mono.Android` and +`src/Xamarin.Android.Build.Tasks`, respectively. -`build-tools/manifest-attribute-codegen/manifest-attribute-codegen.cs` can be compiled to a tool that collects all Manifest elements and attributes with the API level since when each of them became available. New members are supposed to be added to the existing `(FooBar)Attribute.cs` and `(FooBar)Attribute.Partial.cs` in `src/Mono.Android` and `src/Xamarin.Android.Build.Tasks` respectively. +See [`build-tools/manifest-attribute-codegen/README.md`](../../build-tools/manifest-attribute-codegen/README.md) +for details. -Note that there are documented and undocumented XML nodes, and we don't have to deal with undocumented ones. +Note that there are documented and undocumented XML nodes, and we don't have to +deal with undocumented ones. Android P introduced no documented XML artifact. -7) Update Android Tooling Versions +### Update Android Tooling Versions + +[`Xamarin.Android.Common.props.in`](../../src/Xamarin.Android.Build.Tasks/Xamarin.Android.Common.props.in) +contains multiple MSBuild properties which provide default versions for various Android SDK packages. +These properties in turn come from properties defined within +[`Configuration.props`](../../Configuration.props). -These sre located in [Xamarin.Android.Common.props.in](../../src/Xamarin.Android.Build.Tasks/Xamarin.Android.Common.props.in). The following MSBuild properties need to be updated to ensure -the latest tool versions are being used. + * `$(AndroidSdkBuildToolsVersion)`: Android SDK `build-tools` version. + Defaults to `$(XABuildToolsFolder)` within `Configuration.props`. + * `$(AndroidSdkPlatformToolsVersion)`: Android SDK `platform-tools` version + Defaults to `$(XAPlatformToolsVersion)` within `Configuration.props`. -`AndroidSdkBuildToolsVersion` -`AndroidSdkPlatformToolsVersion` -`AndroidSdkToolsVersion` +The major version should generally match the new API level. For Android P this will be 28.x.x . If a version which exactly matches the API Level is not available then the latest version should be used. -The major version should match the new API level. For Android P this will be 28.x.x . If a version which exactly matches the API Level is not available then the latest version should be used. +A separate PR should be created which bumps the values within `Configuration.props` +to ensure that all unit tests pass. ## Bindings Finalization diff --git a/build-tools/manifest-attribute-codegen/README.md b/build-tools/manifest-attribute-codegen/README.md index 26f0794e030..168d68a9144 100644 --- a/build-tools/manifest-attribute-codegen/README.md +++ b/build-tools/manifest-attribute-codegen/README.md @@ -28,7 +28,7 @@ Next, from this directory, run: dotnet build -t:GenerateManifestAttributes # alternatively, from toplevel -(cd build-tools/manifest-attribute-codegen && dotnet build -t:GenerateManifestAttributes) +./dotnet-local build -t:GenerateManifestAttributes build-tools/manifest-attribute-codegen/manifest-attribute-codegen.csproj ``` If (1) and (2) are consistent with each other, new `*Attribute.cs` files will be generated. diff --git a/build-tools/manifest-attribute-codegen/manifest-attribute-codegen.csproj b/build-tools/manifest-attribute-codegen/manifest-attribute-codegen.csproj index a7d321b26a9..66d5291ef77 100644 --- a/build-tools/manifest-attribute-codegen/manifest-attribute-codegen.csproj +++ b/build-tools/manifest-attribute-codegen/manifest-attribute-codegen.csproj @@ -25,14 +25,21 @@ DependsOnTargets="Build"> - <_ManifestAttributeCodeGen>..\..\bin\Build$(Configuration)\manifest-attribute-codegen.dll - <_ConfigurationFile>$(MSBuildThisFileDirectory)metadata.xml - <_RepositoryBaseDirectory>..\..\ + <_ManifestAttributeCodeGen>$(TargetPath) <_ManifestFile>$(MSBuildThisFileDirectory)manifest-definition.xml + + <_MacArgs Include=""$(TargetPath)"" /> + <_MacArgs Include=""-sdk-path=$(AndroidSdkFullPath)"" /> + <_MacArgs Include=""-base-dir=$(MSBuildThisFileDirectory)..\.."" /> + <_MacArgs Include=""-metadata-file=$(MSBuildThisFileDirectory)metadata.xml"" /> + <_MacArgs Include=""-output-manifest=$(MSBuildThisFileDirectory)manifest-definition.xml"" /> + + Command=""$(DotNetPreviewTool)" @(_MacArgs, ' ')" + CustomWarningRegularExpression=".*" + /> diff --git a/build-tools/manifest-attribute-codegen/manifest-definition.xml b/build-tools/manifest-attribute-codegen/manifest-definition.xml index 574460fdb70..7e0cab91711 100644 --- a/build-tools/manifest-attribute-codegen/manifest-definition.xml +++ b/build-tools/manifest-attribute-codegen/manifest-definition.xml @@ -96,10 +96,10 @@ - - - - + + + + manifest @@ -117,6 +117,8 @@ + + manifest @@ -172,7 +174,7 @@ - + application @@ -226,7 +228,7 @@ - + provider @@ -272,7 +274,7 @@ - + application @@ -290,7 +292,7 @@ - + application @@ -362,7 +364,7 @@ - + application @@ -381,7 +383,7 @@ - + application @@ -666,8 +668,19 @@ intent-filter - + + permission + + + + + uses-permission + + + + + manifest - + diff --git a/build-tools/manifest-attribute-codegen/metadata.xml b/build-tools/manifest-attribute-codegen/metadata.xml index 75b421d07cb..4ce63eedb37 100644 --- a/build-tools/manifest-attribute-codegen/metadata.xml +++ b/build-tools/manifest-attribute-codegen/metadata.xml @@ -53,6 +53,7 @@ + @@ -73,6 +74,7 @@ + @@ -304,6 +306,8 @@ + + diff --git a/src/Mono.Android/map.csv b/src/Mono.Android/map.csv index c255870d6d4..14b27fa5251 100644 --- a/src/Mono.Android/map.csv +++ b/src/Mono.Android/map.csv @@ -617,8 +617,9 @@ E,35,android/app/AutomaticZenRule.TYPE_SCHEDULE_CALENDAR,2,Android.App.Automatic E,35,android/app/AutomaticZenRule.TYPE_SCHEDULE_TIME,1,Android.App.AutomaticZenRuleType,ScheduleTime,remove, E,35,android/app/AutomaticZenRule.TYPE_THEATER,6,Android.App.AutomaticZenRuleType,Theater,remove, E,35,android/app/AutomaticZenRule.TYPE_UNKNOWN,-1,Android.App.AutomaticZenRuleType,Unknown,remove, -E,28,android/app/backup/BackupAgent.FLAG_CLIENT_SIDE_ENCRYPTION_ENABLED,1,Android.App.Backup.BackupTransportFlags,ClientSideEncryptionEnabled,remove, -E,28,android/app/backup/BackupAgent.FLAG_DEVICE_TO_DEVICE_TRANSFER,2,Android.App.Backup.BackupTransportFlags,DeviceToDeviceTransfer,remove, +E,28,android/app/backup/BackupAgent.FLAG_CLIENT_SIDE_ENCRYPTION_ENABLED,1,Android.App.Backup.BackupTransportFlags,ClientSideEncryptionEnabled,remove,flags +E,36.1,android/app/backup/BackupAgent.FLAG_CROSS_PLATFORM_DATA_TRANSFER_IOS,8,Android.App.Backup.BackupTransportFlags,CrossPlatformDataTransferIos,remove,flags +E,28,android/app/backup/BackupAgent.FLAG_DEVICE_TO_DEVICE_TRANSFER,2,Android.App.Backup.BackupTransportFlags,DeviceToDeviceTransfer,remove,flags E,15,android/app/backup/BackupAgent.TYPE_DIRECTORY,2,Android.App.Backup.BackupFileType,Directory,remove, E,15,android/app/backup/BackupAgent.TYPE_FILE,1,Android.App.Backup.BackupFileType,File,remove, E,34,android/app/BroadcastOptions.DEFERRAL_POLICY_DEFAULT,0,Android.App.BroadcastDeferralPolicy,Default,remove, @@ -1343,6 +1344,11 @@ E,31,android/bluetooth/BluetoothDevice.ADDRESS_TYPE_RANDOM,1,Android.Bluetooth.A E,33,android/bluetooth/BluetoothDevice.ADDRESS_TYPE_UNKNOWN,65535,Android.Bluetooth.AddressType,Unknown,remove, E,10,android/bluetooth/BluetoothDevice.BOND_BONDED,12,Android.Bluetooth.Bond,Bonded,keep, E,10,android/bluetooth/BluetoothDevice.BOND_BONDING,11,Android.Bluetooth.Bond,Bonding,keep, +E,36.1,android/bluetooth/BluetoothDevice.BOND_LOSS_REASON_BREDR_AUTH_FAILURE,1,Android.Bluetooth.BluetoothDeviceBondLossReason,BredrAuthFailure,remove, +E,36.1,android/bluetooth/BluetoothDevice.BOND_LOSS_REASON_BREDR_INCOMING_PAIRING,2,Android.Bluetooth.BluetoothDeviceBondLossReason,BredrIncomingPairing,remove, +E,36.1,android/bluetooth/BluetoothDevice.BOND_LOSS_REASON_LE_ENCRYPT_FAILURE,3,Android.Bluetooth.BluetoothDeviceBondLossReason,LeEncryptFailure,remove, +E,36.1,android/bluetooth/BluetoothDevice.BOND_LOSS_REASON_LE_INCOMING_PAIRING,4,Android.Bluetooth.BluetoothDeviceBondLossReason,LeIncomingPairing,remove, +E,36.1,android/bluetooth/BluetoothDevice.BOND_LOSS_REASON_UNKNOWN,0,Android.Bluetooth.BluetoothDeviceBondLossReason,Unknown,remove, E,10,android/bluetooth/BluetoothDevice.BOND_NONE,10,Android.Bluetooth.Bond,None,keep, E,18,android/bluetooth/BluetoothDevice.DEVICE_TYPE_CLASSIC,1,Android.Bluetooth.BluetoothDeviceType,Classic,remove, E,18,android/bluetooth/BluetoothDevice.DEVICE_TYPE_DUAL,3,Android.Bluetooth.BluetoothDeviceType,Dual,remove, @@ -1351,6 +1357,7 @@ E,18,android/bluetooth/BluetoothDevice.DEVICE_TYPE_UNKNOWN,0,Android.Bluetooth.B E,36,android/bluetooth/BluetoothDevice.ENCRYPTION_ALGORITHM_AES,2,Android.Bluetooth.BluetoothDeviceEncryptionAlgorithm,Aes,remove, E,36,android/bluetooth/BluetoothDevice.ENCRYPTION_ALGORITHM_E0,1,Android.Bluetooth.BluetoothDeviceEncryptionAlgorithm,E0,remove, E,36,android/bluetooth/BluetoothDevice.ENCRYPTION_ALGORITHM_NONE,0,Android.Bluetooth.BluetoothDeviceEncryptionAlgorithm,None,remove, +E,36.1,android/bluetooth/BluetoothDevice.ENCRYPTION_ALGORITHM_UNKNOWN,3,Android.Bluetooth.BluetoothDeviceEncryptionAlgorithm,Unknown,remove, I,0,android/bluetooth/BluetoothDevice.ERROR,-2147483648,,,, I,19,android/bluetooth/BluetoothDevice.PAIRING_VARIANT_PASSKEY_CONFIRMATION,2,,,, I,19,android/bluetooth/BluetoothDevice.PAIRING_VARIANT_PIN,0,,,, @@ -1382,6 +1389,12 @@ E,18,android/bluetooth/BluetoothGatt.GATT_READ_NOT_PERMITTED,2,Android.Bluetooth E,18,android/bluetooth/BluetoothGatt.GATT_REQUEST_NOT_SUPPORTED,6,Android.Bluetooth.GattStatus,RequestNotSupported,remove, E,18,android/bluetooth/BluetoothGatt.GATT_SUCCESS,0,Android.Bluetooth.GattStatus,Success,remove, E,18,android/bluetooth/BluetoothGatt.GATT_WRITE_NOT_PERMITTED,3,Android.Bluetooth.GattStatus,WriteNotPermitted,remove, +E,36.1,android/bluetooth/BluetoothGatt.SUBRATE_MODE_BALANCED,2,Android.Bluetooth.GattSubrateMode,Balanced,remove, +E,36.1,android/bluetooth/BluetoothGatt.SUBRATE_MODE_HIGH,3,Android.Bluetooth.GattSubrateMode,High,remove, +E,36.1,android/bluetooth/BluetoothGatt.SUBRATE_MODE_LOW,1,Android.Bluetooth.GattSubrateMode,Low,remove, +E,36.1,android/bluetooth/BluetoothGatt.SUBRATE_MODE_NOT_UPDATED,255,Android.Bluetooth.GattSubrateMode,NotUpdated,remove, +E,36.1,android/bluetooth/BluetoothGatt.SUBRATE_MODE_OFF,0,Android.Bluetooth.GattSubrateMode,Off,remove, +E,36.1,android/bluetooth/BluetoothGatt.SUBRATE_MODE_SYSTEM_UPDATE,99,Android.Bluetooth.GattSubrateMode,SystemUpdate,remove, E,18,android/bluetooth/BluetoothGattCharacteristic.FORMAT_FLOAT,52,Android.Bluetooth.GattFormat,Float,remove, E,18,android/bluetooth/BluetoothGattCharacteristic.FORMAT_SFLOAT,50,Android.Bluetooth.GattFormat,Sfloat,remove, E,18,android/bluetooth/BluetoothGattCharacteristic.FORMAT_SINT16,34,Android.Bluetooth.GattFormat,Sint16,remove, @@ -1474,6 +1487,7 @@ E,33,android/bluetooth/BluetoothLeAudioCodecConfig.SAMPLE_RATE_NONE,0,Android.Bl E,33,android/bluetooth/BluetoothLeAudioCodecConfig.SOURCE_CODEC_TYPE_INVALID,1000000,Android.Bluetooth.BluetoothLeSourceCodecType,Invalid,remove, E,33,android/bluetooth/BluetoothLeAudioCodecConfig.SOURCE_CODEC_TYPE_LC3,0,Android.Bluetooth.BluetoothLeSourceCodecType,Lc3,remove, E,36,android/bluetooth/BluetoothLeAudioCodecConfig.SOURCE_CODEC_TYPE_OPUS,1,Android.Bluetooth.BluetoothLeSourceCodecType,Opus,remove, +E,36.1,android/bluetooth/BluetoothLeAudioCodecConfig.SOURCE_CODEC_TYPE_OPUS_HI_RES,2,Android.Bluetooth.BluetoothLeSourceCodecType,OpusHiRes,remove, E,23,android/bluetooth/BluetoothSocket.TYPE_L2CAP,3,Android.Bluetooth.BluetoothConnectionType,L2cap,keep, E,36,android/bluetooth/BluetoothSocket.TYPE_LE,4,Android.Bluetooth.BluetoothConnectionType,Le,remove, E,23,android/bluetooth/BluetoothSocket.TYPE_RFCOMM,1,Android.Bluetooth.BluetoothConnectionType,Rfcomm,keep, @@ -1614,6 +1628,9 @@ E,21,android/bluetooth/le/ScanSettings.SCAN_MODE_BALANCED,1,Android.Bluetooth.LE E,21,android/bluetooth/le/ScanSettings.SCAN_MODE_LOW_LATENCY,2,Android.Bluetooth.LE.ScanMode,LowLatency,keep, E,21,android/bluetooth/le/ScanSettings.SCAN_MODE_LOW_POWER,0,Android.Bluetooth.LE.ScanMode,LowPower,keep, E,23,android/bluetooth/le/ScanSettings.SCAN_MODE_OPPORTUNISTIC,-1,Android.Bluetooth.LE.ScanMode,Opportunistic,keep, +E,36.1,android/bluetooth/le/ScanSettings.SCAN_TYPE_ACTIVE,2,Android.Bluetooth.LE.ScanType,Active,remove, +E,36.1,android/bluetooth/le/ScanSettings.SCAN_TYPE_PASSIVE,1,Android.Bluetooth.LE.ScanType,Passive,remove, +E,36.1,android/bluetooth/le/ScanSettings.SCAN_TYPE_UNKNOWN,0,Android.Bluetooth.LE.ScanType,Unknown,remove, A,34,,0,Android.Companion.SystemDataSyncFlags,None,, E,34,android/companion/CompanionDeviceManager.FLAG_CALL_METADATA,1,Android.Companion.SystemDataSyncFlags,CallMetadata,remove,flags E,34,android/companion/CompanionDeviceManager.RESULT_CANCELED,0,Android.Companion.CompanionDeviceResult,Canceled,remove, @@ -1622,6 +1639,7 @@ E,34,android/companion/CompanionDeviceManager.RESULT_INTERNAL_ERROR,3,Android.Co E,34,android/companion/CompanionDeviceManager.RESULT_OK,-1,Android.Companion.CompanionDeviceResult,Ok,remove, E,36,android/companion/CompanionDeviceManager.RESULT_SECURITY_ERROR,4,Android.Companion.CompanionDeviceResult,SecurityError,remove, E,34,android/companion/CompanionDeviceManager.RESULT_USER_REJECTED,1,Android.Companion.CompanionDeviceResult,UserRejected,remove, +E,36.1,android/companion/DevicePresenceEvent.EVENT_ASSOCIATION_REMOVED,6,Android.Companion.DevicePresenceEventType,EventAssociationRemoved,remove, E,36,android/companion/DevicePresenceEvent.EVENT_BLE_APPEARED,0,Android.Companion.DevicePresenceEventType,BleAppeared,remove, E,36,android/companion/DevicePresenceEvent.EVENT_BLE_DISAPPEARED,1,Android.Companion.DevicePresenceEventType,BleDisappeared,remove, E,36,android/companion/DevicePresenceEvent.EVENT_BT_CONNECTED,2,Android.Companion.DevicePresenceEventType,BtConnected,remove, @@ -1910,6 +1928,9 @@ E,16,android/content/pm/PackageInfo.REQUESTED_PERMISSION_GRANTED,2,Android.Conte E,34,android/content/pm/PackageInfo.REQUESTED_PERMISSION_IMPLICIT,4,Android.Content.PM.RequestedPermission,Implicit,remove, E,31,android/content/pm/PackageInfo.REQUESTED_PERMISSION_NEVER_FOR_LOCATION,65536,Android.Content.PM.RequestedPermission,NeverForLocation,remove, E,16,android/content/pm/PackageInfo.REQUESTED_PERMISSION_REQUIRED,1,Android.Content.PM.RequestedPermission,Required,remove, +E,36.1,android/content/pm/PackageInstaller.DEVELOPER_VERIFICATION_FAILED_REASON_DEVELOPER_BLOCKED,2,Android.Content.PM.PackageInstallerDeveloperVerificationFailedReason,DeveloperBlocked,remove, +E,36.1,android/content/pm/PackageInstaller.DEVELOPER_VERIFICATION_FAILED_REASON_NETWORK_UNAVAILABLE,1,Android.Content.PM.PackageInstallerDeveloperVerificationFailedReason,NetworkUnavailable,remove, +E,36.1,android/content/pm/PackageInstaller.DEVELOPER_VERIFICATION_FAILED_REASON_UNKNOWN,0,Android.Content.PM.PackageInstallerDeveloperVerificationFailedReason,Unknown,remove, E,33,android/content/pm/PackageInstaller.PACKAGE_SOURCE_DOWNLOADED_FILE,4,Android.Content.PM.PackageSource,DownloadedFile,remove, E,33,android/content/pm/PackageInstaller.PACKAGE_SOURCE_LOCAL_FILE,3,Android.Content.PM.PackageSource,LocalFile,remove, E,33,android/content/pm/PackageInstaller.PACKAGE_SOURCE_OTHER,1,Android.Content.PM.PackageSource,Other,remove, @@ -2237,6 +2258,7 @@ E,35,android/database/sqlite/SQLiteRawStatement.SQLITE_DATA_TYPE_NULL,5,Android. E,35,android/database/sqlite/SQLiteRawStatement.SQLITE_DATA_TYPE_TEXT,3,Android.Database.Sqlite.SqliteDataType,Text,remove, E,34,android/devicelock/DeviceId.DEVICE_ID_TYPE_IMEI,0,Android.DeviceLock.DeviceIdType,Imei,remove, E,34,android/devicelock/DeviceId.DEVICE_ID_TYPE_MEID,1,Android.DeviceLock.DeviceIdType,Meid,remove, +E,36.1,android/devicelock/DeviceId.DEVICE_ID_TYPE_SERIAL_NUMBER,2,Android.DeviceLock.DeviceIdType,DeviceIdTypeSerialNumber,remove, E,34,android/devicelock/DeviceLockManager.DEVICE_LOCK_ROLE_FINANCING,0,Android.DeviceLock.DeviceLockRole,Financing,remove, E,15,android/drm/DrmConvertedStatus.STATUS_ERROR,3,Android.Drm.DrmConvertedStatusCode,Error,keep, E,15,android/drm/DrmConvertedStatus.STATUS_INPUTDATA_ERROR,2,Android.Drm.DrmConvertedStatusCode,InputDataError,keep, @@ -2320,6 +2342,7 @@ I,26,android/graphics/ColorSpace.MIN_ID,-1,,,, I,28,android/graphics/drawable/AnimatedImageDrawable.REPEAT_INFINITE,-1,,,, E,10,android/graphics/drawable/ClipDrawable.HORIZONTAL,1,Android.Graphics.Drawables.ClipDrawableOrientation,Horizontal,remove, E,10,android/graphics/drawable/ClipDrawable.VERTICAL,2,Android.Graphics.Drawables.ClipDrawableOrientation,Vertical,remove, +E,36.1,android/graphics/drawable/GradientDrawable.ARC,4,Android.Graphics.Drawables.ShapeType,Arc,remove, E,10,android/graphics/drawable/GradientDrawable.LINE,2,Android.Graphics.Drawables.ShapeType,Line,keep, E,10,android/graphics/drawable/GradientDrawable.LINEAR_GRADIENT,0,Android.Graphics.Drawables.GradientType,LinearGradient,keep, E,10,android/graphics/drawable/GradientDrawable.OVAL,1,Android.Graphics.Drawables.ShapeType,Oval,keep, @@ -2454,6 +2477,26 @@ E,34,android/graphics/PathIterator.VERB_MOVE,0,Android.Graphics.PathVerb,Move,re E,34,android/graphics/PathIterator.VERB_QUAD,2,Android.Graphics.PathVerb,Quad,remove, E,10,android/graphics/PathMeasure.POSITION_MATRIX_FLAG,1,Android.Graphics.MatrixFlags,Position,keep, E,10,android/graphics/PathMeasure.TANGENT_MATRIX_FLAG,2,Android.Graphics.MatrixFlags,Tangent,keep, +E,36.1,android/graphics/pdf/component/PdfAnnotationType.FREETEXT,1,Android.Graphics.Pdf.Component.PdfAnnotationTypeEnum,Freetext,remove, +E,36.1,android/graphics/pdf/component/PdfAnnotationType.HIGHLIGHT,2,Android.Graphics.Pdf.Component.PdfAnnotationTypeEnum,Highlight,remove, +E,36.1,android/graphics/pdf/component/PdfAnnotationType.STAMP,3,Android.Graphics.Pdf.Component.PdfAnnotationTypeEnum,Stamp,remove, +E,36.1,android/graphics/pdf/component/PdfAnnotationType.UNKNOWN,0,Android.Graphics.Pdf.Component.PdfAnnotationTypeEnum,Unknown,remove, +E,36.1,android/graphics/pdf/component/PdfPageObjectType.IMAGE,3,Android.Graphics.Pdf.Component.PdfPageObjectTypeEnum,Image,remove, +E,36.1,android/graphics/pdf/component/PdfPageObjectType.PATH,2,Android.Graphics.Pdf.Component.PdfPageObjectTypeEnum,Path,remove, +E,36.1,android/graphics/pdf/component/PdfPageObjectType.TEXT,1,Android.Graphics.Pdf.Component.PdfPageObjectTypeEnum,Text,remove, +E,36.1,android/graphics/pdf/component/PdfPageObjectType.UNKNOWN,0,Android.Graphics.Pdf.Component.PdfPageObjectTypeEnum,Unknown,remove, +E,36.1,android/graphics/pdf/component/PdfPagePathObject.RENDER_MODE_FILL,0,Android.Graphics.Pdf.Component.PdfPagePathObjectRenderMode,Fill,remove, +E,36.1,android/graphics/pdf/component/PdfPagePathObject.RENDER_MODE_FILL_STROKE,2,Android.Graphics.Pdf.Component.PdfPagePathObjectRenderMode,FillStroke,remove, +E,36.1,android/graphics/pdf/component/PdfPagePathObject.RENDER_MODE_STROKE,1,Android.Graphics.Pdf.Component.PdfPagePathObjectRenderMode,Stroke,remove, +E,36.1,android/graphics/pdf/component/PdfPagePathObject.RENDER_MODE_UNKNOWN,-1,Android.Graphics.Pdf.Component.PdfPagePathObjectRenderMode,Unknown,remove, +E,36.1,android/graphics/pdf/component/PdfPageTextObject.RENDER_MODE_FILL,0,Android.Graphics.Pdf.Component.PdfPageTextObjectRenderMode,Fill,remove, +E,36.1,android/graphics/pdf/component/PdfPageTextObject.RENDER_MODE_FILL_STROKE,2,Android.Graphics.Pdf.Component.PdfPageTextObjectRenderMode,FillStroke,remove, +E,36.1,android/graphics/pdf/component/PdfPageTextObject.RENDER_MODE_STROKE,1,Android.Graphics.Pdf.Component.PdfPageTextObjectRenderMode,Stroke,remove, +E,36.1,android/graphics/pdf/component/PdfPageTextObject.RENDER_MODE_UNKNOWN,-1,Android.Graphics.Pdf.Component.PdfPageTextObjectRenderMode,Unknown,remove, +E,36.1,android/graphics/pdf/component/PdfPageTextObjectFont.FONT_FAMILY_COURIER,0,Android.Graphics.Pdf.Component.PdfPageTextObjectFontFamily,Courier,remove, +E,36.1,android/graphics/pdf/component/PdfPageTextObjectFont.FONT_FAMILY_HELVETICA,1,Android.Graphics.Pdf.Component.PdfPageTextObjectFontFamily,Helvetica,remove, +E,36.1,android/graphics/pdf/component/PdfPageTextObjectFont.FONT_FAMILY_SYMBOL,2,Android.Graphics.Pdf.Component.PdfPageTextObjectFontFamily,Symbol,remove, +E,36.1,android/graphics/pdf/component/PdfPageTextObjectFont.FONT_FAMILY_TIMES_NEW_ROMAN,3,Android.Graphics.Pdf.Component.PdfPageTextObjectFontFamily,TimesNewRoman,remove, E,35,android/graphics/pdf/models/FormEditRecord.EDIT_TYPE_CLICK,0,Android.Graphics.Pdf.Models.FormEditRecordEditType,Click,remove, E,35,android/graphics/pdf/models/FormEditRecord.EDIT_TYPE_SET_INDICES,1,Android.Graphics.Pdf.Models.FormEditRecordEditType,SetIndices,remove, E,35,android/graphics/pdf/models/FormEditRecord.EDIT_TYPE_SET_TEXT,2,Android.Graphics.Pdf.Models.FormEditRecordEditType,SetText,remove, @@ -2479,8 +2522,13 @@ E,35,android/graphics/pdf/PdfRendererPreV.PDF_FORM_TYPE_ACRO_FORM,1,Android.Grap E,35,android/graphics/pdf/PdfRendererPreV.PDF_FORM_TYPE_NONE,0,Android.Graphics.Pdf.PdfRendererPreVPdfFormType,None,remove, E,35,android/graphics/pdf/PdfRendererPreV.PDF_FORM_TYPE_XFA_FOREGROUND,3,Android.Graphics.Pdf.PdfRendererPreVPdfFormType,XfaForeground,remove, E,35,android/graphics/pdf/PdfRendererPreV.PDF_FORM_TYPE_XFA_FULL,2,Android.Graphics.Pdf.PdfRendererPreVPdfFormType,XfaFull,remove, +E,36.1,android/graphics/pdf/RenderParams.FLAG_RENDER_FREETEXT_ANNOTATIONS,16,Android.Graphics.Pdf.RenderParamsRenderFlag,FlagRenderFreetextAnnotations,remove, E,35,android/graphics/pdf/RenderParams.FLAG_RENDER_HIGHLIGHT_ANNOTATIONS,4,Android.Graphics.Pdf.RenderParamsRenderFlag,HighlightAnnotations,remove, +E,36.1,android/graphics/pdf/RenderParams.FLAG_RENDER_STAMP_ANNOTATIONS,8,Android.Graphics.Pdf.RenderParamsRenderFlag,FlagRenderStampAnnotations,remove, E,35,android/graphics/pdf/RenderParams.FLAG_RENDER_TEXT_ANNOTATIONS,2,Android.Graphics.Pdf.RenderParamsRenderFlag,TextAnnotations,remove, +E,36.1,android/graphics/pdf/RenderParams.RENDER_FORM_CONTENT_DEFAULT,3,Android.Graphics.Pdf.RenderParamsRenderFormContentMode,Default,remove, +E,36.1,android/graphics/pdf/RenderParams.RENDER_FORM_CONTENT_DISABLED,2,Android.Graphics.Pdf.RenderParamsRenderFormContentMode,Disabled,remove, +E,36.1,android/graphics/pdf/RenderParams.RENDER_FORM_CONTENT_ENABLED,1,Android.Graphics.Pdf.RenderParamsRenderFormContentMode,Enabled,remove, E,35,android/graphics/pdf/RenderParams.RENDER_MODE_FOR_DISPLAY,1,Android.Graphics.Pdf.RenderParamsRenderMode,ForDisplay,remove, E,35,android/graphics/pdf/RenderParams.RENDER_MODE_FOR_PRINT,2,Android.Graphics.Pdf.RenderParamsRenderMode,ForPrint,remove, E,10,android/graphics/PixelFormat.A_8,8,Android.Graphics.Format,A8,keep, @@ -2545,6 +2593,11 @@ E,29,android/hardware/biometrics/BiometricManager.BIOMETRIC_ERROR_NONE_ENROLLED, E,36,android/hardware/biometrics/BiometricManager.BIOMETRIC_ERROR_NOT_ENABLED_FOR_APPS,21,Android.Hardware.Biometrics.BiometricCode,ErrorNotEnabledForApps,remove, E,30,android/hardware/biometrics/BiometricManager.BIOMETRIC_ERROR_SECURITY_UPDATE_REQUIRED,15,Android.Hardware.Biometrics.BiometricCode,ErrorSecurityUpdateRequired,remove, E,29,android/hardware/biometrics/BiometricManager.BIOMETRIC_SUCCESS,0,Android.Hardware.Biometrics.BiometricCode,Success,remove, +E,36.1,android/hardware/biometrics/BiometricManager.ICON_TYPE_ACCOUNT,2,Android.Hardware.Biometrics.BiometricManagerIconType,Account,remove, +E,36.1,android/hardware/biometrics/BiometricManager.ICON_TYPE_GENERIC,3,Android.Hardware.Biometrics.BiometricManagerIconType,Generic,remove, +E,36.1,android/hardware/biometrics/BiometricManager.ICON_TYPE_PASSWORD,0,Android.Hardware.Biometrics.BiometricManagerIconType,Password,remove, +E,36.1,android/hardware/biometrics/BiometricManager.ICON_TYPE_QR_CODE,1,Android.Hardware.Biometrics.BiometricManagerIconType,QrCode,remove, +E,36.1,android/hardware/biometrics/BiometricManager.ICON_TYPE_SETTING,4,Android.Hardware.Biometrics.BiometricManagerIconType,Setting,remove, E,30,android/hardware/biometrics/BiometricPrompt.AUTHENTICATION_RESULT_TYPE_BIOMETRIC,2,Android.Hardware.Biometrics.AuthenticationResultType,Biometric,remove, E,30,android/hardware/biometrics/BiometricPrompt.AUTHENTICATION_RESULT_TYPE_DEVICE_CREDENTIAL,1,Android.Hardware.Biometrics.AuthenticationResultType,DeviceCredential,remove, E,28,android/hardware/biometrics/BiometricPrompt.BIOMETRIC_ACQUIRED_GOOD,0,Android.Hardware.Biometrics.BiometricAcquiredStatus,Good,remove, @@ -2980,6 +3033,7 @@ E,31,android/hardware/display/DeviceProductInfo.CONNECTION_TO_SINK_BUILT_IN,1,An E,31,android/hardware/display/DeviceProductInfo.CONNECTION_TO_SINK_DIRECT,2,Android.Hardware.Display.ConnectionToSinkType,Direct,remove, E,31,android/hardware/display/DeviceProductInfo.CONNECTION_TO_SINK_TRANSITIVE,3,Android.Hardware.Display.ConnectionToSinkType,Transitive,remove, E,31,android/hardware/display/DeviceProductInfo.CONNECTION_TO_SINK_UNKNOWN,0,Android.Hardware.Display.ConnectionToSinkType,Unknown,remove, +E,36.1,android/hardware/display/DisplayManager.BRIGHTNESS_UNIT_PERCENTAGE,1,Android.Hardware.Display.DisplayBrightnessUnit,Percentage,remove, E,31,android/hardware/display/DisplayManager.MATCH_CONTENT_FRAMERATE_ALWAYS,2,Android.Hardware.Display.MatchContentFramerate,Always,remove, E,31,android/hardware/display/DisplayManager.MATCH_CONTENT_FRAMERATE_NEVER,0,Android.Hardware.Display.MatchContentFramerate,Never,remove, E,31,android/hardware/display/DisplayManager.MATCH_CONTENT_FRAMERATE_SEAMLESSS_ONLY,1,Android.Hardware.Display.MatchContentFramerate,SeamlessOnly,remove, @@ -3225,9 +3279,16 @@ E,34,android/health/connect/datatypes/CervicalMucusRecord$CervicalMucusSensation E,34,android/health/connect/datatypes/CervicalMucusRecord$CervicalMucusSensation.SENSATION_MEDIUM,2,Android.Health.Connect.DataTypes.CervicalMucusSensationType,Medium,remove, E,34,android/health/connect/datatypes/CervicalMucusRecord$CervicalMucusSensation.SENSATION_UNKNOWN,0,Android.Health.Connect.DataTypes.CervicalMucusSensationType,Unknown,remove, E,34,android/health/connect/datatypes/Device.DEVICE_TYPE_CHEST_STRAP,7,Android.Health.Connect.DataTypes.HealthDeviceType,ChestStrap,remove, +E,36.1,android/health/connect/datatypes/Device.DEVICE_TYPE_CONSUMER_MEDICAL_DEVICE,9,Android.Health.Connect.DataTypes.HealthDeviceType,ConsumerMedicalDevice,remove, E,34,android/health/connect/datatypes/Device.DEVICE_TYPE_FITNESS_BAND,6,Android.Health.Connect.DataTypes.HealthDeviceType,FitnessBand,remove, +E,36.1,android/health/connect/datatypes/Device.DEVICE_TYPE_FITNESS_EQUIPMENT,13,Android.Health.Connect.DataTypes.HealthDeviceType,FitnessEquipment,remove, +E,36.1,android/health/connect/datatypes/Device.DEVICE_TYPE_FITNESS_MACHINE,12,Android.Health.Connect.DataTypes.HealthDeviceType,FitnessMachine,remove, +E,36.1,android/health/connect/datatypes/Device.DEVICE_TYPE_GLASSES,10,Android.Health.Connect.DataTypes.HealthDeviceType,Glasses,remove, E,34,android/health/connect/datatypes/Device.DEVICE_TYPE_HEAD_MOUNTED,5,Android.Health.Connect.DataTypes.HealthDeviceType,HeadMounted,remove, +E,36.1,android/health/connect/datatypes/Device.DEVICE_TYPE_HEARABLE,11,Android.Health.Connect.DataTypes.HealthDeviceType,Hearable,remove, +E,36.1,android/health/connect/datatypes/Device.DEVICE_TYPE_METER,15,Android.Health.Connect.DataTypes.HealthDeviceType,Meter,remove, E,34,android/health/connect/datatypes/Device.DEVICE_TYPE_PHONE,2,Android.Health.Connect.DataTypes.HealthDeviceType,Phone,remove, +E,36.1,android/health/connect/datatypes/Device.DEVICE_TYPE_PORTABLE_COMPUTER,14,Android.Health.Connect.DataTypes.HealthDeviceType,PortableComputer,remove, E,34,android/health/connect/datatypes/Device.DEVICE_TYPE_RING,4,Android.Health.Connect.DataTypes.HealthDeviceType,Ring,remove, E,34,android/health/connect/datatypes/Device.DEVICE_TYPE_SCALE,3,Android.Health.Connect.DataTypes.HealthDeviceType,Scale,remove, E,34,android/health/connect/datatypes/Device.DEVICE_TYPE_SMART_DISPLAY,8,Android.Health.Connect.DataTypes.HealthDeviceType,SmartDisplay,remove, @@ -4785,6 +4846,7 @@ E,10,android/media/AudioManager.FX_KEYPRESS_STANDARD,5,Android.Media.SoundEffect E,23,android/media/AudioManager.GET_DEVICES_ALL,3,Android.Media.GetDevicesTargets,All,keep,flags E,23,android/media/AudioManager.GET_DEVICES_INPUTS,1,Android.Media.GetDevicesTargets,Inputs,keep,flags E,23,android/media/AudioManager.GET_DEVICES_OUTPUTS,2,Android.Media.GetDevicesTargets,Outputs,keep,flags +E,36.1,android/media/AudioManager.MODE_ASSISTANT_CONVERSATION,7,Android.Media.Mode,AssistantConversation,remove, E,33,android/media/AudioManager.MODE_CALL_REDIRECT,5,Android.Media.Mode,CallRedirect,remove, E,30,android/media/AudioManager.MODE_CALL_SCREENING,4,Android.Media.Mode,CallScreening,remove, E,33,android/media/AudioManager.MODE_COMMUNICATION_REDIRECT,6,Android.Media.Mode,CommunicationRedirect,remove, @@ -5601,6 +5663,7 @@ E,29,android/media/MediaRecorder$OutputFormat.OGG,11,Android.Media.OutputFormat, E,10,android/media/MediaRecorder$OutputFormat.RAW_AMR,3,Android.Media.OutputFormat,RawAmr,keep, E,10,android/media/MediaRecorder$OutputFormat.THREE_GPP,1,Android.Media.OutputFormat,ThreeGpp,keep, E,21,android/media/MediaRecorder$OutputFormat.WEBM,9,Android.Media.OutputFormat,Webm,keep, +E,36.1,android/media/MediaRecorder$VideoEncoder.APV,9,Android.Media.VideoEncoder,Apv,remove, E,33,android/media/MediaRecorder$VideoEncoder.AV1,8,Android.Media.VideoEncoder,Av1,remove, E,10,android/media/MediaRecorder$VideoEncoder.DEFAULT,0,Android.Media.VideoEncoder,Default,keep, E,33,android/media/MediaRecorder$VideoEncoder.DOLBY_VISION,7,Android.Media.VideoEncoder,DolbyVision,remove, @@ -6810,6 +6873,7 @@ E,36,android/net/wifi/p2p/WifiP2pGroup.SECURITY_TYPE_WPA3_COMPATIBILITY,1,Androi E,36,android/net/wifi/p2p/WifiP2pGroup.SECURITY_TYPE_WPA3_SAE,2,Android.Net.Wifi.P2p.GroupSecurityType,Wpa3Sae,remove, E,15,android/net/wifi/p2p/WifiP2pManager.BUSY,2,Android.Net.Wifi.P2p.WifiP2pFailureReason,Busy,remove, E,33,android/net/wifi/p2p/WifiP2pManager.CONNECTION_REQUEST_ACCEPT,0,Android.Net.Wifi.P2p.ConnectionRequestType,Accept,remove, +E,36.1,android/net/wifi/p2p/WifiP2pManager.CONNECTION_REQUEST_DEFER_SHOW_PASSWORD_TO_SERVICE,4,Android.Net.Wifi.P2p.ConnectionRequestType,ConnectionRequestDeferShowPasswordToService,remove, E,33,android/net/wifi/p2p/WifiP2pManager.CONNECTION_REQUEST_DEFER_SHOW_PIN_TO_SERVICE,3,Android.Net.Wifi.P2p.ConnectionRequestType,DeferShowPinToService,remove, E,33,android/net/wifi/p2p/WifiP2pManager.CONNECTION_REQUEST_DEFER_TO_SERVICE,2,Android.Net.Wifi.P2p.ConnectionRequestType,DeferToService,remove, E,33,android/net/wifi/p2p/WifiP2pManager.CONNECTION_REQUEST_REJECT,1,Android.Net.Wifi.P2p.ConnectionRequestType,Reject,remove, @@ -7148,6 +7212,7 @@ E,36,android/nfc/cardemulation/CardEmulation.NFC_INTERNAL_ERROR_UNKNOWN,0,Androi E,36,android/nfc/cardemulation/CardEmulation.PROTOCOL_AND_TECHNOLOGY_ROUTE_DEFAULT,3,Android.Nfc.CardEmulators.ProtocolAndTechnologyRoute,Default,remove, E,36,android/nfc/cardemulation/CardEmulation.PROTOCOL_AND_TECHNOLOGY_ROUTE_DH,0,Android.Nfc.CardEmulators.ProtocolAndTechnologyRoute,Dh,remove, E,36,android/nfc/cardemulation/CardEmulation.PROTOCOL_AND_TECHNOLOGY_ROUTE_ESE,1,Android.Nfc.CardEmulators.ProtocolAndTechnologyRoute,Ese,remove, +E,36.1,android/nfc/cardemulation/CardEmulation.PROTOCOL_AND_TECHNOLOGY_ROUTE_NDEF_NFCEE,4,Android.Nfc.CardEmulators.ProtocolAndTechnologyRoute,ProtocolAndTechnologyRouteNdefNfcee,remove, E,36,android/nfc/cardemulation/CardEmulation.PROTOCOL_AND_TECHNOLOGY_ROUTE_UICC,2,Android.Nfc.CardEmulators.ProtocolAndTechnologyRoute,Uicc,remove, E,36,android/nfc/cardemulation/CardEmulation.PROTOCOL_AND_TECHNOLOGY_ROUTE_UNSET,-1,Android.Nfc.CardEmulators.ProtocolAndTechnologyRoute,Unset,remove, E,19,android/nfc/cardemulation/CardEmulation.SELECTION_MODE_ALWAYS_ASK,1,Android.Nfc.CardEmulators.CardSelectionMode,AlwaysAsk,remove, @@ -9057,7 +9122,12 @@ E,34,android/os/BugreportManager$BugreportCallback.BUGREPORT_ERROR_NO_BUGREPORT_ E,31,android/os/BugreportManager$BugreportCallback.BUGREPORT_ERROR_RUNTIME,2,Android.OS.BugreportErrorCode,Runtime,remove, E,31,android/os/BugreportManager$BugreportCallback.BUGREPORT_ERROR_USER_CONSENT_TIMED_OUT,4,Android.OS.BugreportErrorCode,UserConsentTimedOut,remove, E,31,android/os/BugreportManager$BugreportCallback.BUGREPORT_ERROR_USER_DENIED_CONSENT,3,Android.OS.BugreportErrorCode,UserDeniedConsent,remove, +E,36.1,android/os/Build.BACKPORTED_FIX_STATUS_FIXED,1,Android.OS.BackportedFixStatus,Fixed,remove, +E,36.1,android/os/Build.BACKPORTED_FIX_STATUS_NOT_APPLICABLE,2,Android.OS.BackportedFixStatus,NotApplicable,remove, +E,36.1,android/os/Build.BACKPORTED_FIX_STATUS_NOT_FIXED,3,Android.OS.BackportedFixStatus,NotFixed,remove, +E,36.1,android/os/Build.BACKPORTED_FIX_STATUS_UNKNOWN,0,Android.OS.BackportedFixStatus,Unknown,remove, E,36,android/os/Build$VERSION_CODES_FULL.BAKLAVA,3600000,Android.OS.BuildVersionCodesFull,Baklava,remove, +E,36.1,android/os/Build$VERSION_CODES_FULL.BAKLAVA_1,3600001,Android.OS.BuildVersionCodesFull,Baklava1,remove, E,36,android/os/Build$VERSION_CODES_FULL.BASE,100000,Android.OS.BuildVersionCodesFull,Base,remove, E,36,android/os/Build$VERSION_CODES_FULL.BASE_1_1,200000,Android.OS.BuildVersionCodesFull,Base11,remove, E,36,android/os/Build$VERSION_CODES_FULL.CUPCAKE,300000,Android.OS.BuildVersionCodesFull,Cupcake,remove, @@ -9341,6 +9411,10 @@ E,35,android/os/ProfilingResult.ERROR_NONE,0,Android.OS.ProfilingResultError,Non E,35,android/os/ProfilingResult.ERROR_UNKNOWN,8,Android.OS.ProfilingResultError,Unknown,remove, E,36,android/os/ProfilingTrigger.TRIGGER_TYPE_ANR,2,Android.OS.ProfilingTriggerType,Anr,remove, E,36,android/os/ProfilingTrigger.TRIGGER_TYPE_APP_FULLY_DRAWN,1,Android.OS.ProfilingTriggerType,AppFullyDrawn,remove, +E,36.1,android/os/ProfilingTrigger.TRIGGER_TYPE_APP_REQUEST_RUNNING_TRACE,3,Android.OS.ProfilingTriggerType,TriggerTypeAppRequestRunningTrace,remove, +E,36.1,android/os/ProfilingTrigger.TRIGGER_TYPE_KILL_FORCE_STOP,4,Android.OS.ProfilingTriggerType,TriggerTypeKillForceStop,remove, +E,36.1,android/os/ProfilingTrigger.TRIGGER_TYPE_KILL_RECENTS,5,Android.OS.ProfilingTriggerType,TriggerTypeKillRecents,remove, +E,36.1,android/os/ProfilingTrigger.TRIGGER_TYPE_KILL_TASK_MANAGER,6,Android.OS.ProfilingTriggerType,TriggerTypeKillTaskManager,remove, E,36,android/os/ProfilingTrigger.TRIGGER_TYPE_NONE,0,Android.OS.ProfilingTriggerType,None,remove, E,36,android/os/RemoteCallbackList.FROZEN_CALLEE_POLICY_DROP,3,Android.OS.FrozenCalleePolicy,Drop,remove, E,36,android/os/RemoteCallbackList.FROZEN_CALLEE_POLICY_ENQUEUE_ALL,1,Android.OS.FrozenCalleePolicy,EnqueueAll,remove, @@ -9375,6 +9449,7 @@ I,30,android/os/VibrationAttributes.USAGE_CLASS_MASK,15,,,, E,33,android/os/VibrationAttributes.USAGE_CLASS_MEDIA,3,Android.OS.VibrationAttributesUsageClass,Media,remove, E,30,android/os/VibrationAttributes.USAGE_CLASS_UNKNOWN,0,Android.OS.VibrationAttributesUsageClass,Unknown,remove, E,30,android/os/VibrationAttributes.USAGE_COMMUNICATION_REQUEST,65,Android.OS.VibrationAttributesUsageType,CommunicationRequest,remove, +E,36.1,android/os/VibrationAttributes.USAGE_GESTURE_INPUT,98,Android.OS.VibrationAttributesUsageType,UsageGestureInput,remove, E,30,android/os/VibrationAttributes.USAGE_HARDWARE_FEEDBACK,50,Android.OS.VibrationAttributesUsageType,HardwareFeedback,remove, E,33,android/os/VibrationAttributes.USAGE_MEDIA,19,Android.OS.VibrationAttributesUsageType,Media,remove, E,30,android/os/VibrationAttributes.USAGE_NOTIFICATION,49,Android.OS.VibrationAttributesUsageType,Notification,remove, @@ -9649,6 +9724,8 @@ E,30,android/provider/MediaStore.MATCH_DEFAULT,0,Android.Provider.MediaStoreMatc E,30,android/provider/MediaStore.MATCH_EXCLUDE,2,Android.Provider.MediaStoreMatchBehavior,Exclude,remove, E,30,android/provider/MediaStore.MATCH_INCLUDE,1,Android.Provider.MediaStoreMatchBehavior,Include,remove, E,30,android/provider/MediaStore.MATCH_ONLY,3,Android.Provider.MediaStoreMatchBehavior,Only,remove, +E,36.1,android/provider/MediaStore.PICK_IMAGES_HIGHLIGHT_TYPE_COLLAPSED,0,Android.Provider.MediaStorePickImagesHighlightType,Collapsed,remove, +E,36.1,android/provider/MediaStore.PICK_IMAGES_HIGHLIGHT_TYPE_EXPANDED,1,Android.Provider.MediaStorePickImagesHighlightType,Expanded,remove, E,35,android/provider/MediaStore.PICK_IMAGES_TAB_ALBUMS,0,Android.Provider.MediaStorePickImagesTab,Albums,remove, E,35,android/provider/MediaStore.PICK_IMAGES_TAB_IMAGES,1,Android.Provider.MediaStorePickImagesTab,Images,remove, E,10,android/provider/MediaStore$Images$Thumbnails.FULL_SCREEN_KIND,2,Android.Provider.ThumbnailKind,FullScreenKind,keep, @@ -11507,6 +11584,23 @@ I,0,android/R$color.transparent,17170445,,,, I,0,android/R$color.white,17170443,,,, I,0,android/R$color.widget_edittext_dark,17170442,,,, I,0,android/R$dimen.app_icon_size,17104896,,,, +I,36.1,android/R$dimen.config_motionExpressiveDefaultEffectDamping,17104916,,,, +I,36.1,android/R$dimen.config_motionExpressiveDefaultSpatialDamping,17104915,,,, +I,36.1,android/R$dimen.config_motionExpressiveFastEffectDamping,17104914,,,, +I,36.1,android/R$dimen.config_motionExpressiveFastSpatialDamping,17104913,,,, +I,36.1,android/R$dimen.config_motionExpressiveSlowEffectDamping,17104918,,,, +I,36.1,android/R$dimen.config_motionExpressiveSlowSpatialDamping,17104917,,,, +I,36.1,android/R$dimen.config_motionStandardDefaultEffectDamping,17104910,,,, +I,36.1,android/R$dimen.config_motionStandardDefaultSpatialDamping,17104909,,,, +I,36.1,android/R$dimen.config_motionStandardFastEffectDamping,17104908,,,, +I,36.1,android/R$dimen.config_motionStandardFastSpatialDamping,17104907,,,, +I,36.1,android/R$dimen.config_motionStandardSlowEffectDamping,17104912,,,, +I,36.1,android/R$dimen.config_motionStandardSlowSpatialDamping,17104911,,,, +I,36.1,android/R$dimen.config_shapeCornerRadiusLarge,17104922,,,, +I,36.1,android/R$dimen.config_shapeCornerRadiusMedium,17104921,,,, +I,36.1,android/R$dimen.config_shapeCornerRadiusSmall,17104920,,,, +I,36.1,android/R$dimen.config_shapeCornerRadiusXlarge,17104923,,,, +I,36.1,android/R$dimen.config_shapeCornerRadiusXsmall,17104919,,,, I,15,android/R$dimen.dialog_min_width_major,17104899,,,, I,15,android/R$dimen.dialog_min_width_minor,17104900,,,, I,15,android/R$dimen.notification_large_icon_height,17104902,,,, @@ -11707,6 +11801,7 @@ I,23,android/R$id.accessibilityActionScrollLeft,16908345,,,, I,23,android/R$id.accessibilityActionScrollRight,16908347,,,, I,23,android/R$id.accessibilityActionScrollToPosition,16908343,,,, I,23,android/R$id.accessibilityActionScrollUp,16908344,,,, +I,36.1,android/R$id.accessibilityActionSetExtendedSelection,16908383,,,, I,24,android/R$id.accessibilityActionSetProgress,16908349,,,, I,23,android/R$id.accessibilityActionShowOnScreen,16908342,,,, I,33,android/R$id.accessibilityActionShowTextSuggestions,16908376,,,, @@ -11786,6 +11881,18 @@ I,23,android/R$id.undo,16908338,,,, I,0,android/R$id.widget_frame,16908312,,,, I,0,android/R$integer.config_longAnimTime,17694722,,,, I,0,android/R$integer.config_mediumAnimTime,17694721,,,, +I,36.1,android/R$integer.config_motionExpressiveDefaultEffectStiffness,17694733,,,, +I,36.1,android/R$integer.config_motionExpressiveDefaultSpatialStiffness,17694732,,,, +I,36.1,android/R$integer.config_motionExpressiveFastEffectStiffness,17694731,,,, +I,36.1,android/R$integer.config_motionExpressiveFastSpatialStiffness,17694730,,,, +I,36.1,android/R$integer.config_motionExpressiveSlowEffectStiffness,17694735,,,, +I,36.1,android/R$integer.config_motionExpressiveSlowSpatialStiffness,17694734,,,, +I,36.1,android/R$integer.config_motionStandardDefaultEffectStiffness,17694727,,,, +I,36.1,android/R$integer.config_motionStandardDefaultSpatialStiffness,17694726,,,, +I,36.1,android/R$integer.config_motionStandardFastEffectStiffness,17694725,,,, +I,36.1,android/R$integer.config_motionStandardFastSpatialStiffness,17694724,,,, +I,36.1,android/R$integer.config_motionStandardSlowEffectStiffness,17694729,,,, +I,36.1,android/R$integer.config_motionStandardSlowSpatialStiffness,17694728,,,, I,0,android/R$integer.config_shortAnimTime,17694720,,,, I,15,android/R$integer.status_bar_notification_info_maxnum,17694723,,,, I,15,android/R$interpolator.accelerate_cubic,17563650,,,, @@ -12631,6 +12738,7 @@ E,36,android/ranging/RangingManager.BLE_CS,1,Android.Ranging.RangingManagerType, E,36,android/ranging/RangingManager.BLE_RSSI,3,Android.Ranging.RangingManagerType,BleRssi,remove, E,36,android/ranging/RangingManager.UWB,0,Android.Ranging.RangingManagerType,Uwb,remove, E,36,android/ranging/RangingManager.WIFI_NAN_RTT,2,Android.Ranging.RangingManagerType,WifiNanRtt,remove, +E,36.1,android/ranging/RangingManager.WIFI_STA_RTT,4,Android.Ranging.RangingManagerType,WifiStaRtt,remove, E,36,android/ranging/RangingMeasurement.CONFIDENCE_HIGH,2,Android.Ranging.RangingMeasurementConfidence,High,remove, E,36,android/ranging/RangingMeasurement.CONFIDENCE_LOW,0,Android.Ranging.RangingMeasurementConfidence,Low,remove, E,36,android/ranging/RangingMeasurement.CONFIDENCE_MEDIUM,1,Android.Ranging.RangingMeasurementConfidence,Medium,remove, @@ -12670,6 +12778,7 @@ E,36,android/ranging/uwb/UwbRangingParams.CONFIG_UNICAST_DS_TWR,1,Android.Rangin E,36,android/ranging/uwb/UwbRangingParams.DURATION_1_MS,1,Android.Ranging.Uwb.UwbRangingParamsDuration,Duration1Ms,remove, E,36,android/ranging/uwb/UwbRangingParams.DURATION_2_MS,2,Android.Ranging.Uwb.UwbRangingParamsDuration,Duration2Ms,remove, I,36,android/ranging/uwb/UwbRangingParams.SUB_SESSION_UNDEFINED,-1,,,, +I,36.1,android/ranging/wifi/rtt/RttStationRangingParams.CHANNEL_WIDTH_DEFAULT,255,,,, E,15,android/renderscript/Allocation.USAGE_GRAPHICS_CONSTANTS,8,Android.Renderscripts.AllocationUsage,GraphicsConstants,keep, E,15,android/renderscript/Allocation.USAGE_GRAPHICS_RENDER_TARGET,16,Android.Renderscripts.AllocationUsage,GraphicsRenderTarget,keep, E,15,android/renderscript/Allocation.USAGE_GRAPHICS_TEXTURE,2,Android.Renderscripts.AllocationUsage,GraphicsTexture,keep, @@ -12845,6 +12954,9 @@ E,35,android/service/chooser/ChooserResult.CHOOSER_RESULT_COPY,1,Android.Service E,35,android/service/chooser/ChooserResult.CHOOSER_RESULT_EDIT,2,Android.Service.Chooser.ChooserResultValue,Edit,remove, E,35,android/service/chooser/ChooserResult.CHOOSER_RESULT_SELECTED_COMPONENT,0,Android.Service.Chooser.ChooserResultValue,SelectedComponent,remove, E,35,android/service/chooser/ChooserResult.CHOOSER_RESULT_UNKNOWN,-1,Android.Service.Chooser.ChooserResultValue,Unknown,remove, +E,36.1,android/service/chooser/ChooserSession.STATE_CLOSED,2,Android.Service.Chooser.ChooserSessionState,Closed,remove, +E,36.1,android/service/chooser/ChooserSession.STATE_INITIALIZED,0,Android.Service.Chooser.ChooserSessionState,Initialized,remove, +E,36.1,android/service/chooser/ChooserSession.STATE_STARTED,1,Android.Service.Chooser.ChooserSessionState,Started,remove, E,30,android/service/controls/actions/ControlAction.RESPONSE_CHALLENGE_ACK,3,Android.Service.Controls.Actions.ControlActionResponse,ChallengeAck,remove, E,30,android/service/controls/actions/ControlAction.RESPONSE_CHALLENGE_PASSPHRASE,5,Android.Service.Controls.Actions.ControlActionResponse,ChallengePassphrase,remove, E,30,android/service/controls/actions/ControlAction.RESPONSE_CHALLENGE_PIN,4,Android.Service.Controls.Actions.ControlActionResponse,ChallengePin,remove, @@ -12971,6 +13083,7 @@ E,26,android/service/notification/NotificationListenerService.NOTIFICATION_CHANN E,26,android/service/notification/NotificationListenerService.REASON_APP_CANCEL,8,Android.Service.Notification.NotificationCancelReason,AppCancel,keep, E,26,android/service/notification/NotificationListenerService.REASON_APP_CANCEL_ALL,9,Android.Service.Notification.NotificationCancelReason,AppCancelAll,keep, E,33,android/service/notification/NotificationListenerService.REASON_ASSISTANT_CANCEL,22,Android.Service.Notification.NotificationCancelReason,AssistantCancel,remove, +E,36.1,android/service/notification/NotificationListenerService.REASON_BUNDLE_DISMISSED,24,Android.Service.Notification.NotificationCancelReason,ReasonBundleDismissed,remove, E,26,android/service/notification/NotificationListenerService.REASON_CANCEL,2,Android.Service.Notification.NotificationCancelReason,Cancel,keep, E,26,android/service/notification/NotificationListenerService.REASON_CANCEL_ALL,3,Android.Service.Notification.NotificationCancelReason,CancelAll,keep, E,26,android/service/notification/NotificationListenerService.REASON_CHANNEL_BANNED,17,Android.Service.Notification.NotificationCancelReason,ChannelBanned,keep, @@ -13564,10 +13677,15 @@ E,30,android/telephony/BarringInfo$BarringServiceInfo.BARRING_TYPE_UNCONDITIONAL E,30,android/telephony/BarringInfo$BarringServiceInfo.BARRING_TYPE_UNKNOWN,-1,Android.Telephony.BarringType,Unknown,remove, I,31,android/telephony/CarrierConfigManager.CARRIER_NR_AVAILABILITY_NSA,1,,,, I,31,android/telephony/CarrierConfigManager.CARRIER_NR_AVAILABILITY_SA,2,,,, +?,36.1,android/telephony/CarrierConfigManager.CARRIER_ROAMING_NTN_CONNECT_AUTOMATIC,0,,,, +?,36.1,android/telephony/CarrierConfigManager.CARRIER_ROAMING_NTN_CONNECT_MANUAL,1,,,, I,31,android/telephony/CarrierConfigManager.CROSS_SIM_SPN_FORMAT_CARRIER_NAME_ONLY,0,,,, I,31,android/telephony/CarrierConfigManager.CROSS_SIM_SPN_FORMAT_CARRIER_NAME_WITH_BRANDING,1,,,, I,26,android/telephony/CarrierConfigManager.DATA_CYCLE_THRESHOLD_DISABLED,-2,,,, I,30,android/telephony/CarrierConfigManager.DATA_CYCLE_USE_PLATFORM_DEFAULT,-1,,,, +?,36.1,android/telephony/CarrierConfigManager.SATELLITE_DATA_SUPPORT_ALL,2,,,, +?,36.1,android/telephony/CarrierConfigManager.SATELLITE_DATA_SUPPORT_BANDWIDTH_CONSTRAINED,1,,,, +?,36.1,android/telephony/CarrierConfigManager.SATELLITE_DATA_SUPPORT_ONLY_RESTRICTED,0,,,, I,31,android/telephony/CarrierConfigManager.SERVICE_CLASS_NONE,0,,,, I,31,android/telephony/CarrierConfigManager.SERVICE_CLASS_VOICE,1,,,, I,31,android/telephony/CarrierConfigManager.USSD_OVER_CS_ONLY,2,,,, @@ -14458,6 +14576,8 @@ E,30,android/telephony/ims/ImsReasonInfo.EXTRA_CODE_CALL_RETRY_NORMAL,1,Android. E,30,android/telephony/ims/ImsReasonInfo.EXTRA_CODE_CALL_RETRY_SILENT_REDIAL,2,Android.Telephony.Ims.ExtraCodeCallRetry,SilentRedial,remove, A,31,,0,Android.Telephony.Ims.RegistrationAttributes,None,remove, I,31,android/telephony/ims/ImsRegistrationAttributes.ATTR_EPDG_OVER_CELL_INTERNET,1,Android.Telephony.Ims.RegistrationAttributes,EpdgOverCellInternet,remove, +E,36.1,android/telephony/ims/ImsRegistrationAttributes.ATTR_REGISTRATION_TYPE_EMERGENCY,2,Android.Telephony.Ims.RegistrationAttributes,RegistrationTypeEmergency,remove, +E,36.1,android/telephony/ims/ImsRegistrationAttributes.ATTR_VIRTUAL_FOR_ANONYMOUS_EMERGENCY_CALL,4,Android.Telephony.Ims.RegistrationAttributes,VirtualForAnonymousEmergencyCall,remove, E,33,android/telephony/ims/ImsStateCallback.REASON_IMS_SERVICE_DISCONNECTED,3,Android.Telephony.Ims.ImsStateCallbackReason,ImsServiceDisconnected,remove, E,33,android/telephony/ims/ImsStateCallback.REASON_IMS_SERVICE_NOT_READY,6,Android.Telephony.Ims.ImsStateCallbackReason,ImsServiceNotReady,remove, E,33,android/telephony/ims/ImsStateCallback.REASON_NO_IMS_SERVICE_CONFIGURED,4,Android.Telephony.Ims.ImsStateCallbackReason,NoImsServiceConfigured,remove, @@ -14560,6 +14680,10 @@ E,28,android/telephony/NetworkScan.ERROR_UNSUPPORTED,4,Android.Telephony.ScanRes E,28,android/telephony/NetworkScan.SUCCESS,0,Android.Telephony.ScanResultCode,Success,remove, E,28,android/telephony/NetworkScanRequest.SCAN_TYPE_ONE_SHOT,0,Android.Telephony.NetworkScanType,OneShot,remove, E,28,android/telephony/NetworkScanRequest.SCAN_TYPE_PERIODIC,1,Android.Telephony.NetworkScanType,Periodic,remove, +E,36.1,android/telephony/ParsedPhoneNumber.ERROR_TYPE_FAILED_TO_VALIDATE_EXTRACTED_PHONE_NUMER,1,Android.Telephony.ParsedPhoneNumberErrorType,FailedToValidateExtractedPhoneNumer,remove, +E,36.1,android/telephony/ParsedPhoneNumber.ERROR_TYPE_NONE,0,Android.Telephony.ParsedPhoneNumberErrorType,None,remove, +E,36.1,android/telephony/ParsedPhoneNumber.ERROR_TYPE_NUMBER_PARSE_EXCEPTION,2,Android.Telephony.ParsedPhoneNumberErrorType,NumberParseException,remove, +E,36.1,android/telephony/ParsedPhoneNumber.ERROR_TYPE_UNKNOWN,-1,Android.Telephony.ParsedPhoneNumberErrorType,Unknown,remove, E,28,android/telephony/PhoneNumberUtils.BCD_EXTENDED_TYPE_CALLED_PARTY,2,Android.Telephony.BcdExtendedType,TypeCalledParty,remove, E,28,android/telephony/PhoneNumberUtils.BCD_EXTENDED_TYPE_EF_ADN,1,Android.Telephony.BcdExtendedType,TypeEfAdn,remove, E,10,android/telephony/PhoneNumberUtils.FORMAT_JAPAN,2,Android.Telephony.PhoneNumberFormat,Japan,keep, @@ -14707,6 +14831,7 @@ E,30,android/telephony/SmsManager.RESULT_RIL_SMS_SEND_FAIL_RETRY,101,Android.Tel E,34,android/telephony/SmsManager.RESULT_RIL_SUBSCRIPTION_NOT_AVAILABLE,128,Android.Telephony.SmsResult,RilSubscriptionNotAvailable,remove, E,30,android/telephony/SmsManager.RESULT_RIL_SYSTEM_ERR,108,Android.Telephony.SmsResult,RilSystemErr,remove, E,30,android/telephony/SmsManager.RESULT_SMS_BLOCKED_DURING_EMERGENCY,29,Android.Telephony.SmsResult,SmsBlockedDuringEmergency,remove, +E,36.1,android/telephony/SmsManager.RESULT_SMS_SEND_FAILED_AFTER_MAX_RETRY,138,Android.Telephony.SmsResult,ResultSmsSendFailedAfterMaxRetry,remove, E,30,android/telephony/SmsManager.RESULT_SMS_SEND_RETRY_FAILED,30,Android.Telephony.SmsResult,SmsSendRetryFailed,remove, E,30,android/telephony/SmsManager.RESULT_SYSTEM_ERROR,15,Android.Telephony.SmsResult,SystemError,remove, E,30,android/telephony/SmsManager.RESULT_UNEXPECTED_EVENT_STOP_SENDING,28,Android.Telephony.SmsResult,UnexpectedEventStopSending,remove, @@ -15170,6 +15295,7 @@ E,36,android/view/accessibility/AccessibilityEvent.CONTENT_CHANGE_TYPE_EXPANDED, E,28,android/view/accessibility/AccessibilityEvent.CONTENT_CHANGE_TYPE_PANE_APPEARED,16,Android.Views.Accessibility.ContentChangeTypes,PaneAppeared,remove,flags E,28,android/view/accessibility/AccessibilityEvent.CONTENT_CHANGE_TYPE_PANE_DISAPPEARED,32,Android.Views.Accessibility.ContentChangeTypes,PaneDisappeared,remove,flags E,28,android/view/accessibility/AccessibilityEvent.CONTENT_CHANGE_TYPE_PANE_TITLE,8,Android.Views.Accessibility.ContentChangeTypes,PaneTitle,remove,flags +E,36.1,android/view/accessibility/AccessibilityEvent.CONTENT_CHANGE_TYPE_SORT_DIRECTION,65536,Android.Views.Accessibility.ContentChangeTypes,ContentChangeTypeSortDirection,remove,flags E,30,android/view/accessibility/AccessibilityEvent.CONTENT_CHANGE_TYPE_STATE_DESCRIPTION,64,Android.Views.Accessibility.ContentChangeTypes,StateDescription,remove,flags E,19,android/view/accessibility/AccessibilityEvent.CONTENT_CHANGE_TYPE_SUBTREE,1,Android.Views.Accessibility.ContentChangeTypes,Subtree,remove,flags E,36,android/view/accessibility/AccessibilityEvent.CONTENT_CHANGE_TYPE_SUPPLEMENTAL_DESCRIPTION,32768,Android.Views.Accessibility.ContentChangeTypes,SupplementalDescription,remove,flags @@ -15271,6 +15397,10 @@ E,21,android/view/accessibility/AccessibilityNodeInfo$CollectionInfo.SELECTION_M E,21,android/view/accessibility/AccessibilityNodeInfo$CollectionInfo.SELECTION_MODE_NONE,0,Android.Views.Accessibility.SelectionMode,None,remove, E,21,android/view/accessibility/AccessibilityNodeInfo$CollectionInfo.SELECTION_MODE_SINGLE,1,Android.Views.Accessibility.SelectionMode,Single,remove, I,35,android/view/accessibility/AccessibilityNodeInfo$CollectionInfo.UNDEFINED,-1,Android.Views.Accessibility.SelectionMode,Undefined,remove, +E,36.1,android/view/accessibility/AccessibilityNodeInfo$CollectionItemInfo.SORT_DIRECTION_ASCENDING,1,Android.Views.Accessibility.AccessibilityCollectionSortDirection,Ascending,remove, +E,36.1,android/view/accessibility/AccessibilityNodeInfo$CollectionItemInfo.SORT_DIRECTION_DESCENDING,2,Android.Views.Accessibility.AccessibilityCollectionSortDirection,Descending,remove, +E,36.1,android/view/accessibility/AccessibilityNodeInfo$CollectionItemInfo.SORT_DIRECTION_NONE,0,Android.Views.Accessibility.AccessibilityCollectionSortDirection,None,remove, +E,36.1,android/view/accessibility/AccessibilityNodeInfo$CollectionItemInfo.SORT_DIRECTION_OTHER,3,Android.Views.Accessibility.AccessibilityCollectionSortDirection,Other,remove, E,19,android/view/accessibility/AccessibilityNodeInfo$RangeInfo.RANGE_TYPE_FLOAT,1,Android.Views.Accessibility.RangeType,Float,remove, E,36,android/view/accessibility/AccessibilityNodeInfo$RangeInfo.RANGE_TYPE_INDETERMINATE,3,Android.Views.Accessibility.RangeType,Indeterminate,remove, E,19,android/view/accessibility/AccessibilityNodeInfo$RangeInfo.RANGE_TYPE_INT,0,Android.Views.Accessibility.RangeType,Int,remove, @@ -16235,6 +16365,10 @@ E,26,android/view/View.NOT_FOCUSABLE,0,Android.Views.ViewFocusability,NotFocusab E,10,android/view/View.OVER_SCROLL_ALWAYS,0,Android.Views.OverScrollMode,Always,remove, E,10,android/view/View.OVER_SCROLL_IF_CONTENT_SCROLLS,1,Android.Views.OverScrollMode,IfContentScrolls,remove, E,10,android/view/View.OVER_SCROLL_NEVER,2,Android.Views.OverScrollMode,Never,remove, +E,36.1,android/view/View.RECTANGLE_ON_SCREEN_REQUEST_SOURCE_INPUT_FOCUS,3,Android.Views.ViewRectangleOnScreenRequestSource,InputFocus,remove, +E,36.1,android/view/View.RECTANGLE_ON_SCREEN_REQUEST_SOURCE_SCROLL_ONLY,1,Android.Views.ViewRectangleOnScreenRequestSource,ScrollOnly,remove, +E,36.1,android/view/View.RECTANGLE_ON_SCREEN_REQUEST_SOURCE_TEXT_CURSOR,2,Android.Views.ViewRectangleOnScreenRequestSource,TextCursor,remove, +E,36.1,android/view/View.RECTANGLE_ON_SCREEN_REQUEST_SOURCE_UNDEFINED,0,Android.Views.ViewRectangleOnScreenRequestSource,Undefined,remove, E,16,android/view/View.SCREEN_STATE_OFF,0,Android.Views.ScreenState,Off,remove, E,16,android/view/View.SCREEN_STATE_ON,1,Android.Views.ScreenState,On,remove, E,21,android/view/View.SCROLL_AXIS_HORIZONTAL,1,Android.Views.ScrollAxis,Horizontal,remove,flags diff --git a/src/Mono.Android/metadata b/src/Mono.Android/metadata index 34e01260f21..869c753f6d8 100644 --- a/src/Mono.Android/metadata +++ b/src/Mono.Android/metadata @@ -386,6 +386,16 @@ Android.Graphics.Color Android.Graphics.Color + Android.Graphics.Color + true true diff --git a/src/Mono.Android/methodmap.csv b/src/Mono.Android/methodmap.csv index 6109e630bb8..88166b240a5 100644 --- a/src/Mono.Android/methodmap.csv +++ b/src/Mono.Android/methodmap.csv @@ -4407,3 +4407,80 @@ 36,android.view,SurfaceControl$JankData,getJankType,return,Android.Views.SurfaceJankType 36,android.widget.photopicker,EmbeddedPhotoPickerFeatureInfo,writeToParcel,flags,Android.OS.ParcelableWriteFlags 36,android.window,BackEvent,ctor,swipeEdge,Android.Window.BackEventEdge +36.1,android/adservices/ondevicepersonalization,OnDevicePersonalizationException,ctor,errorCode,Android.AdServices.OnDevicePersonalization.OnDevicePersonalizationError +36.1,android/adservices/ondevicepersonalization,OnDevicePersonalizationException,ctor,errorCode,Android.AdServices.OnDevicePersonalization.OnDevicePersonalizationError +36.1,android/adservices/ondevicepersonalization,OnDevicePersonalizationException,ctor,errorCode,Android.AdServices.OnDevicePersonalization.OnDevicePersonalizationError +36.1,android/adservices/ondevicepersonalization,OnDevicePersonalizationException,ctor,errorCode,Android.AdServices.OnDevicePersonalization.OnDevicePersonalizationError +36.1,android/app/appsearch,SearchResult$EmbeddingMatchInfo,ctor,embeddingSearchMetricType,Android.App.AppSearch.EmbeddingSearchMetricType +36.1,android/app/appsearch,SearchResult$EmbeddingMatchInfo,getEmbeddingSearchMetricType,return,Android.App.AppSearch.EmbeddingSearchMetricType +36.1,android/app/appsearch,SearchResult$EmbeddingMatchInfo,writeToParcel,flags,Android.OS.ParcelableWriteFlags +36.1,android/app/appsearch,SearchResult$MatchRange,writeToParcel,flags,Android.OS.ParcelableWriteFlags +36.1,android/app/appsearch,SearchResult$TextMatchInfo,writeToParcel,flags,Android.OS.ParcelableWriteFlags +36.1,android/app/backup,BackupAgent,onEstimateFullBackupBytes,transportFlags,Android.App.Backup.BackupTransportFlags +36.1,android/app/backup,FullRestoreDataInput,getTransportFlags,return,Android.App.Backup.BackupTransportFlags +36.1,android/app/backup,FullRestoreDataInput,getType,return,Android.App.Backup.BackupFileType +36.1,android/app,NotificationChannel,getOriginalImportance,return,Android.App.NotificationImportance +36.1,android/appwidget,AppWidgetEvent,writeToParcel,flags,Android.OS.ParcelableWriteFlags +36.1,android/bluetooth,BluetoothDevice,getEncryptionStatus,transport,Android.Bluetooth.BluetoothTransports +36.1,android/bluetooth,BluetoothDevice,isConnected,transport,Android.Bluetooth.BluetoothTransports +36.1,android/bluetooth,BluetoothGatt,requestSubrateMode,return,Android.Bluetooth.CurrentBluetoothStatusCodes +36.1,android/bluetooth,BluetoothGatt,requestSubrateMode,subrateMode,Android.Bluetooth.GattSubrateMode +36.1,android/bluetooth,BluetoothGattCallback,onSubrateChange,status,Android.Bluetooth.CurrentBluetoothStatusCodes +36.1,android/bluetooth,BluetoothGattCallback,onSubrateChange,subrateMode,Android.Bluetooth.GattSubrateMode +36.1,android/bluetooth,BluetoothGattServerCallback,onSubrateChange,status,Android.Bluetooth.CurrentBluetoothStatusCodes +36.1,android/bluetooth,BluetoothGattServerCallback,onSubrateChange,subrateMode,Android.Bluetooth.GattSubrateMode +36.1,android/bluetooth,EncryptionStatus,ctor,algorithm,Android.Bluetooth.BluetoothDeviceEncryptionAlgorithm +36.1,android/bluetooth,EncryptionStatus,getAlgorithm,return,Android.Bluetooth.BluetoothDeviceEncryptionAlgorithm +36.1,android/bluetooth/le,ScanSettings,getScanType,return,Android.Bluetooth.LE.ScanType +36.1,android/bluetooth/le,ScanSettings$Builder,setScanType,scanType,Android.Bluetooth.LE.ScanType +36.1,android/content/om,FabricatedOverlay,setResourceValue,dimensionUnit,Android.Util.ComplexUnitType +36.1,android/graphics/pdf/component,PdfAnnotation,getPdfAnnotationType,return,Android.Graphics.Pdf.Component.PdfAnnotationTypeEnum +36.1,android/graphics/pdf/component,PdfPageObject,getPdfObjectType,return,Android.Graphics.Pdf.Component.PdfPageObjectTypeEnum +36.1,android/graphics/pdf/component,PdfPageObjectType,isValidType,type,Android.Graphics.Pdf.Component.PdfPageObjectTypeEnum +36.1,android/graphics/pdf/component,PdfPagePathObject,getRenderMode,return,Android.Graphics.Pdf.Component.PdfPagePathObjectRenderMode +36.1,android/graphics/pdf/component,PdfPagePathObject,setRenderMode,renderMode,Android.Graphics.Pdf.Component.PdfPagePathObjectRenderMode +36.1,android/graphics/pdf/component,PdfPageTextObject,getRenderMode,return,Android.Graphics.Pdf.Component.PdfPagePathObjectRenderMode +36.1,android/graphics/pdf/component,PdfPageTextObject,setRenderMode,renderMode,Android.Graphics.Pdf.Component.PdfPagePathObjectRenderMode +36.1,android/graphics/pdf/component,PdfPageTextObjectFont,ctor,fontFamily,Android.Graphics.Pdf.Component.PdfPageTextObjectFontFamily +36.1,android/graphics/pdf/component,PdfPageTextObjectFont,getFontFamily,return,Android.Graphics.Pdf.Component.PdfPageTextObjectFontFamily +36.1,android/graphics/pdf/component,PdfPageTextObjectFont,setFontFamily,fontFamily,Android.Graphics.Pdf.Component.PdfPageTextObjectFontFamily +36.1,android/graphics/pdf,RenderParams,getRenderFormContentMode,return,Android.Graphics.Pdf.RenderParamsRenderFormContentMode +36.1,android/graphics/pdf,RenderParams$Builder,setRenderFormContentMode,renderFormContentMode,Android.Graphics.Pdf.RenderParamsRenderFormContentMode +36.1,android/hardware/biometrics,BiometricPrompt$Builder,addFallbackOption,iconType,Android.Hardware.Biometrics.BiometricManagerIconType +36.1,android/hardware/biometrics,FallbackOption,ctor,iconType,Android.Hardware.Biometrics.BiometricManagerIconType +36.1,android/hardware/biometrics,FallbackOption,getIconType,return,Android.Hardware.Biometrics.BiometricManagerIconType +36.1,android/hardware/biometrics,FallbackOption,writeToParcel,flags,Android.OS.ParcelableWriteFlags +36.1,android/hardware/camera2/params,OutputConfiguration,getConfiguredFormat,return,Android.Graphics.ImageFormatType +36.1,android/hardware/display,DisplayManager,getBrightness,unit,Android.Hardware.Display.DisplayBrightnessUnit +36.1,android/hardware/display,DisplayManager,setBrightness,unit,Android.Hardware.Display.DisplayBrightnessUnit +36.1,android/hardware/display,DisplayTopology,writeToParcel,flags,Android.OS.ParcelableWriteFlags +36.1,android/health/connect/changelog,ChangeLogTokenRequest$Builder,addMedicalResourceType,medicalResourceType,Android.Health.Connect.DataTypes.MedicalResourceType +36.1,android/media,SuggestedDeviceInfo,getType,return,Android.Media.MediaRoute2Type +36.1,android/media,SuggestedDeviceInfo,writeToParcel,flags,Android.OS.ParcelableWriteFlags +36.1,android/media,SuggestedDeviceInfo$Builder,ctor,type,Android.Media.MediaRoute2Type +36.1,android/net/wifi/p2p,WifiP2pPairingBootstrappingConfig,getPairingBootstrappingMethod,return,Android.Net.Wifi.P2p.PairingBootstrappingMethods +36.1,android/net/wifi,SoftApConfiguration$Builder,setPassphrase,securityType,Android.Net.Wifi.P2p.GroupSecurityType +36.1,android/os,Build,getBackportedFixStatus,return,Android.OS.BackportedFixStatus +36.1,android/os/vibrator,HapticFeedbackRequest,getFeedbackConstant,return,Android.Views.FeedbackConstants +36.1,android/os/vibrator,HapticFeedbackRequest,getFlags,return,Android.Views.FeedbackFlags +36.1,android/os/vibrator,HapticFeedbackRequest,getUsage,return,Android.OS.VibrationAttributesUsageType +36.1,android/os/vibrator,HapticFeedbackRequest$Builder,ctor,constant,Android.Views.FeedbackConstants +36.1,android/os/vibrator,HapticFeedbackRequest$Builder,setFlags,flags,Android.Views.FeedbackFlags +36.1,android/os/vibrator,HapticFeedbackRequest$Builder,setUsage,usage,Android.OS.VibrationAttributesUsageType +36.1,android/ranging/wifi/rtt,RttStationRangingParams,getChannelWidth,return,Android.Net.Wifi.WifiChannelWidth +36.1,android/ranging/wifi/rtt,RttStationRangingParams,getRangingUpdateRate,return,Android.Ranging.Raw.RangingDeviceUpdateRate +36.1,android/ranging/wifi/rtt,RttStationRangingParams,writeToParcel,flags,Android.OS.ParcelableWriteFlags +36.1,android/ranging/wifi/rtt,RttStationRangingParams$Builder,setChannelWidth,channelWidth,Android.Net.Wifi.WifiChannelWidth +36.1,android/ranging/wifi/rtt,RttStationRangingParams$Builder,setRangingUpdateRate,updateRate,Android.Ranging.Raw.RangingDeviceUpdateRate +36.1,android/service/chooser,ChooserSession,getState,return,Android.Service.Chooser.ChooserSessionState +36.1,android/service/chooser,I:ChooserSession$StateListener,onStateChanged,state,Android.Service.Chooser.ChooserSessionState +36.1,android/service/chooser,ChooserSessionToken,writeToParcel,flags,Android.OS.ParcelableWriteFlags +36.1,android/telephony,ParsedPhoneNumber,ctor,errorCode,Android.Telephony.ParsedPhoneNumberErrorType +36.1,android/telephony,ParsedPhoneNumber,getErrorCode,return,Android.Telephony.ParsedPhoneNumberErrorType +36.1,android/telephony,ParsedPhoneNumber,writeToParcel,flags,Android.OS.ParcelableWriteFlags +36.1,android/view/accessibility,AccessibilityNodeInfo$CollectionItemInfo,getSortDirection,return,Android.Views.Accessibility.AccessibilityCollectionSortDirection +36.1,android/view/accessibility,AccessibilityNodeInfo$CollectionItemInfo$Builder,setSortDirection,sortDirection,Android.Views.Accessibility.AccessibilityCollectionSortDirection +36.1,android/view/accessibility,AccessibilityNodeInfo$Selection,writeToParcel,flags,Android.OS.ParcelableWriteFlags +36.1,android/view/accessibility,AccessibilityNodeInfo$SelectionPosition,writeToParcel,flags,Android.OS.ParcelableWriteFlags +36.1,android/view,View,requestRectangleOnScreen,source,Android.Views.ViewRectangleOnScreenRequestSource +36.1,android/view,I:ViewParent,requestChildRectangleOnScreen,source,Android.Views.ViewRectangleOnScreenRequestSource From 7a386b2a49bf07accbad533e72dac8c9bf1d6ec8 Mon Sep 17 00:00:00 2001 From: Jonathan Pryor Date: Thu, 25 Sep 2025 09:34:39 -0400 Subject: [PATCH 2/6] Fix assertion failure in When attempting to declare API-36.1 as the latest stable API, my local (Debug) build promptly started *crashing*. Which was rather unexpected. The most useful lesson in this context: *do not* call `Debug.Assert()` or throw exceptions from code which is called from the Thread Pool. `Debug.Assert()` -- in Debug config builds -- will immediately exit the process, which in turn means that MSBuild `binlog` output is *incomplete*, as MSBuild never gets a chance to flush everything (courtesy of the process aborting!). Throwing an exception is very similar: unhandled exceptions on the thread pool cause the process to abort. MSBuild never has a chance to flush out binlog data. Plumb logging through to `CodeGenDiff` so that the assertion failure can instead become an "Internal Error" message. This fixes my crash. Then there's the matter of the former assertion failure now error message: why was `currentObject.InternalCounter` negative? `currentObject.InternalCounter` was negative because of this line: public static void AddEventHandler([System.Runtime.CompilerServices.NullableAttribute((byte)2)] ref System.WeakReference? implementor, System.Func creator, System.Action setListener, System.Action add) where TInterface : class where TImplementor : Java.Lang.Object, TInterface { } The `where TInterface : class ` was matching this check: content.IndexOf (" class ", StringComparison.Ordinal) and thus the method was being interpreted as the introduction of a new type declaration instead of something to add to the existing `currentObject` scope. This meant that the new `currentObject.InternalCounter` was 0, then we hit `}` to decrement `.InternalCounter`, resulting in a negative value. Fix this by checking for ` partial class `, as was done previously with ` partial struct `, as `Microsoft.DotNet.GenAPI.dll` always emits the `partial` modifier on everything except `enum`s. This fixes the now internal error message former assertion. --- .../CheckApiCompatibility.cs | 2 +- .../CodeGenDiff.cs | 30 +++++++++++++++---- .../JdkInfo.cs | 2 +- 3 files changed, 26 insertions(+), 8 deletions(-) diff --git a/build-tools/Xamarin.Android.Tools.BootstrapTasks/Xamarin.Android.Tools.BootstrapTasks/CheckApiCompatibility.cs b/build-tools/Xamarin.Android.Tools.BootstrapTasks/Xamarin.Android.Tools.BootstrapTasks/CheckApiCompatibility.cs index 3198b2ee94b..b3eaf393436 100644 --- a/build-tools/Xamarin.Android.Tools.BootstrapTasks/Xamarin.Android.Tools.BootstrapTasks/CheckApiCompatibility.cs +++ b/build-tools/Xamarin.Android.Tools.BootstrapTasks/Xamarin.Android.Tools.BootstrapTasks/CheckApiCompatibility.cs @@ -266,7 +266,7 @@ void dataReceived (object sender, DataReceivedEventArgs args) LogError ($"CheckApiCompatibility found nonacceptable Api breakages for ApiLevel: {ApiLevel}.{Environment.NewLine}{string.Join (Environment.NewLine, lines)}"); ReportMissingLines (acceptableIssuesFile.FullName, lines); - var missingItems = CodeGenDiff.GenerateMissingItems (CodeGenPath, contractAssembly.FullName, implementationAssembly.FullName); + var missingItems = CodeGenDiff.GenerateMissingItems (CodeGenPath, contractAssembly.FullName, implementationAssembly.FullName, JdkInfo.CreateTaskLogger (this)); if (missingItems.Any ()) { Log.LogMessage (MessageImportance.High, $"{Environment.NewLine}*** CodeGen missing items***{Environment.NewLine}"); var indent = 0; diff --git a/build-tools/Xamarin.Android.Tools.BootstrapTasks/Xamarin.Android.Tools.BootstrapTasks/CodeGenDiff.cs b/build-tools/Xamarin.Android.Tools.BootstrapTasks/Xamarin.Android.Tools.BootstrapTasks/CodeGenDiff.cs index d87725dde19..e3d625a8c07 100644 --- a/build-tools/Xamarin.Android.Tools.BootstrapTasks/Xamarin.Android.Tools.BootstrapTasks/CodeGenDiff.cs +++ b/build-tools/Xamarin.Android.Tools.BootstrapTasks/Xamarin.Android.Tools.BootstrapTasks/CodeGenDiff.cs @@ -8,10 +8,10 @@ namespace Xamarin.Android.Tools.BootstrapTasks { public sealed class CodeGenDiff { - public static List GenerateMissingItems (string codeGenPath, string contractAssembly, string implementationAssembly) + public static List GenerateMissingItems (string codeGenPath, string contractAssembly, string implementationAssembly, Action logger) { - var contract = GenerateObjectDescription (codeGenPath, contractAssembly); - var implementation = GenerateObjectDescription (codeGenPath, implementationAssembly); + var contract = GenerateObjectDescription (codeGenPath, contractAssembly, logger); + var implementation = GenerateObjectDescription (codeGenPath, implementationAssembly, logger); return Diff (contract, implementation); } @@ -55,7 +55,7 @@ static List Diff (ObjectDescription contract, ObjectDescription implemen return missingItems; } - static ObjectDescription GenerateObjectDescription (string codeGenPath, string assembly) + static ObjectDescription GenerateObjectDescription (string codeGenPath, string assembly, Action logger) { ObjectDescription currentObject = new ObjectDescription () { Item = "root" }; var objectStack = new Stack (); @@ -74,6 +74,8 @@ static ObjectDescription GenerateObjectDescription (string codeGenPath, string a genApiProcess.StartInfo.Arguments += $"\"{assembly}\""; + logger (TraceLevel.Verbose, $"Executing: `\"{genApiProcess.StartInfo.FileName}\" {genApiProcess.StartInfo.Arguments}`"); + genApiProcess.StartInfo.UseShellExecute = false; genApiProcess.StartInfo.CreateNoWindow = true; genApiProcess.StartInfo.RedirectStandardOutput = true; @@ -110,7 +112,12 @@ void dataReceived (object sender, DataReceivedEventArgs args) if (content.StartsWith ("}", StringComparison.OrdinalIgnoreCase)) { currentObject.InternalCounter--; - System.Diagnostics.Debug.Assert (currentObject.InternalCounter >= 0); + if (currentObject.InternalCounter < 0) { + logger (TraceLevel.Error, $"Internal Error! currentObject.InternalCounter is {currentObject.InternalCounter}; must be >= 0! " + + $"currentObject.Item=`{currentObject.Item}`"); + currentObject.InternalCounter = 0; + } + if (currentObject.InternalCounter == 0) { objectStack.Pop (); if (objectStack.Count > 0) { @@ -121,7 +128,7 @@ void dataReceived (object sender, DataReceivedEventArgs args) return; } - if (content.StartsWith ("namespace ", StringComparison.Ordinal) || content.IndexOf (" interface ", StringComparison.Ordinal) != -1 || content.IndexOf (" class ", StringComparison.Ordinal) != -1 || content.IndexOf (" partial struct ", StringComparison.Ordinal) != -1 || content.IndexOf (" enum ", StringComparison.Ordinal) != -1) { + if (content.StartsWith ("namespace ", StringComparison.Ordinal) || LineBeginsType (content)) { if (string.IsNullOrWhiteSpace (currentObject.Item)) { currentObject.Item = content; } else { @@ -163,6 +170,17 @@ void dataReceived (object sender, DataReceivedEventArgs args) return currentObject; } + static bool LineBeginsType (string content) + { + if (content.IndexOf (" partial interface ", StringComparison.Ordinal) != -1 + || content.IndexOf (" partial class ", StringComparison.Ordinal) != -1 + || content.IndexOf (" partial struct ", StringComparison.Ordinal) != -1 + || content.IndexOf (" enum ", StringComparison.Ordinal) != -1) { + return true; + } + return false; + } + class ObjectDescription { public string Item; diff --git a/build-tools/Xamarin.Android.Tools.BootstrapTasks/Xamarin.Android.Tools.BootstrapTasks/JdkInfo.cs b/build-tools/Xamarin.Android.Tools.BootstrapTasks/Xamarin.Android.Tools.BootstrapTasks/JdkInfo.cs index 2b5d28ba39c..2d5d88ecaf0 100644 --- a/build-tools/Xamarin.Android.Tools.BootstrapTasks/Xamarin.Android.Tools.BootstrapTasks/JdkInfo.cs +++ b/build-tools/Xamarin.Android.Tools.BootstrapTasks/Xamarin.Android.Tools.BootstrapTasks/JdkInfo.cs @@ -86,7 +86,7 @@ public override bool Execute () } } - static Action CreateTaskLogger (Task task) + internal static Action CreateTaskLogger (Task task) { Action logger = (level, value) => { switch (level) { From 862b4834d5db0ce171d0efc098c7d2405ba9c954 Mon Sep 17 00:00:00 2001 From: Jonathan Pryor Date: Thu, 25 Sep 2025 12:47:32 -0400 Subject: [PATCH 3/6] Declare API-36.1 as stable! --- Configuration.props | 10 +++--- .../GenerateSupportedPlatforms.cs | 36 ++++++++++++++----- .../ConfigAndData/BuildAndroidPlatforms.cs | 2 +- .../Dependencies/AndroidToolchain.cs | 2 +- ...cceptable-breakages-vReference-net10.0.txt | 16 +++++++++ 5 files changed, 51 insertions(+), 15 deletions(-) diff --git a/Configuration.props b/Configuration.props index 367c6fb1a93..70e6be86911 100644 --- a/Configuration.props +++ b/Configuration.props @@ -25,13 +25,13 @@ 21 - 36 + 36.1 $(AndroidLatestStableApiLevel) - v16.0 + v16.1 - 36.1 - 36.1 - v16.1 + $(AndroidLatestStableApiLevel) + $(AndroidLatestStablePlatformId) + $(AndroidLatestStableFrameworkVersion) $(AndroidLatestStableApiLevel) diff --git a/build-tools/Xamarin.Android.Tools.BootstrapTasks/Xamarin.Android.Tools.BootstrapTasks/GenerateSupportedPlatforms.cs b/build-tools/Xamarin.Android.Tools.BootstrapTasks/Xamarin.Android.Tools.BootstrapTasks/GenerateSupportedPlatforms.cs index 17b2a5b18b3..b0b542f4aee 100644 --- a/build-tools/Xamarin.Android.Tools.BootstrapTasks/Xamarin.Android.Tools.BootstrapTasks/GenerateSupportedPlatforms.cs +++ b/build-tools/Xamarin.Android.Tools.BootstrapTasks/Xamarin.Android.Tools.BootstrapTasks/GenerateSupportedPlatforms.cs @@ -1,3 +1,5 @@ +#nullable enable + using System; using System.IO; using System.Globalization; @@ -30,17 +32,22 @@ public class GenerateSupportedPlatforms : Task /// $(AndroidMinimumDotNetApiLevel) from Configuration.props /// [Required] - public int MinimumApiLevel { get; set; } + public string MinimumApiLevel { get; set; } /// /// Default value for $(TargetPlatformVersion), defaults to MaxStableVersion.ApiLevel /// - public int TargetApiLevel { get; set; } + public string TargetApiLevel { get; set; } public override bool Execute () { - var versions = new AndroidVersions (AndroidApiInfo.Select (ToVersion)); - int targetApiLevel = TargetApiLevel > 0 ? TargetApiLevel : versions.MaxStableVersion.ApiLevel; + + var minVersion = ToVersion (MinimumApiLevel); + var targetVersion = ToVersion (TargetApiLevel); + var versions = new AndroidVersions (AndroidApiInfo.Select (ToAndroidVersion)); + var targetApiLevel = targetVersion != null && targetVersion.Major > 0 + ? targetVersion + : versions.MaxStableVersion.VersionCodeFull; var settings = new XmlWriterSettings { OmitXmlDeclaration = true, Indent = true, @@ -63,7 +70,9 @@ public override bool Execute () writer.WriteEndElement (); // writer.WriteStartElement ("TargetPlatformVersion"); writer.WriteAttributeString ("Condition", " '$(TargetPlatformVersion)' == '' "); - writer.WriteString (targetApiLevel.ToString ("0.0", CultureInfo.InvariantCulture)); + writer.WriteString (targetApiLevel.Major.ToString ()); + writer.WriteString ("."); + writer.WriteString (targetApiLevel.Minor.ToString ()); writer.WriteEndElement (); // writer.WriteStartElement ("AndroidMinimumSupportedApiLevel"); writer.WriteAttributeString ("Condition", " '$(AndroidMinimumSupportedApiLevel)' == '' "); @@ -73,13 +82,13 @@ public override bool Execute () writer.WriteStartElement ("ItemGroup"); foreach (Version versionCode in versions.InstalledBindingVersions - .Where (v => v.ApiLevel >= MinimumApiLevel) + .Where (v => v.VersionCodeFull >= minVersion) .Select (v => v.VersionCodeFull) .Distinct () .OrderBy (v => v)) { writer.WriteStartElement ("AndroidSdkSupportedTargetPlatformVersion"); writer.WriteAttributeString ("Include", versionCode.ToString ()); - if (versionCode.Major < TargetApiLevel) { + if (versionCode < targetVersion) { writer.WriteAttributeString ("DefineConstantsOnly", "true"); } writer.WriteEndElement (); // @@ -93,7 +102,18 @@ public override bool Execute () return !Log.HasLoggedErrors; } - static AndroidVersion ToVersion (ITaskItem item) + static Version? ToVersion (string value) + { + if (Version.TryParse (value, out var version)) { + return version; + } + if (int.TryParse (value, out var major)) { + return new Version (major, 0); + } + return null; + } + + static AndroidVersion ToAndroidVersion (ITaskItem item) { /* diff --git a/build-tools/xaprepare/xaprepare/ConfigAndData/BuildAndroidPlatforms.cs b/build-tools/xaprepare/xaprepare/ConfigAndData/BuildAndroidPlatforms.cs index 72ca923d24e..f767821a506 100644 --- a/build-tools/xaprepare/xaprepare/ConfigAndData/BuildAndroidPlatforms.cs +++ b/build-tools/xaprepare/xaprepare/ConfigAndData/BuildAndroidPlatforms.cs @@ -47,7 +47,7 @@ class BuildAndroidPlatforms new AndroidPlatform (apiName: "UpsideDownCake", apiLevel: 34, platformID: "34", include: "v14.0", framework: "v14.0"), new AndroidPlatform (apiName: "VanillaIceCream", apiLevel: 35, platformID: "35", include: "v15.0", framework: "v15.0"), new AndroidPlatform (apiName: "Baklava", apiLevel: 36, platformID: "36", include: "v16.0", framework: "v16.0"), - new AndroidPlatform (apiName: "CANARY", apiLevel: new Version (36, 1), platformID: "36.1", include: "v16.1", framework: "v16.1", stable: false), + new AndroidPlatform (apiName: "CANARY", apiLevel: new Version (36, 1), platformID: "36.1", include: "v16.1", framework: "v16.1", stable: true), }; } diff --git a/build-tools/xaprepare/xaprepare/ConfigAndData/Dependencies/AndroidToolchain.cs b/build-tools/xaprepare/xaprepare/ConfigAndData/Dependencies/AndroidToolchain.cs index 2a2865f3776..da015000347 100644 --- a/build-tools/xaprepare/xaprepare/ConfigAndData/Dependencies/AndroidToolchain.cs +++ b/build-tools/xaprepare/xaprepare/ConfigAndData/Dependencies/AndroidToolchain.cs @@ -74,7 +74,7 @@ public AndroidToolchain () new AndroidPlatformComponent ("platform-34-ext7_r02", apiLevel: "34", pkgRevision: "2"), new AndroidPlatformComponent ("platform-35_r02", apiLevel: "35", pkgRevision: "2"), new AndroidPlatformComponent ("platform-36_r02", apiLevel: "36", pkgRevision: "2", isLatestStable: true), - new AndroidPlatformComponent ("platform-36.1_r01", apiLevel: "36.1", pkgRevision: "1", isLatestStable: false, isPreview: true), + new AndroidPlatformComponent ("platform-36.1_r01", apiLevel: "36.1", pkgRevision: "1", isLatestStable: true), new AndroidToolchainComponent ("source-36_r01", destDir: Path.Combine ("sources", "android-36"), diff --git a/tests/api-compatibility/acceptable-breakages-vReference-net10.0.txt b/tests/api-compatibility/acceptable-breakages-vReference-net10.0.txt index 8e6e73812da..3cf4b8b71fa 100644 --- a/tests/api-compatibility/acceptable-breakages-vReference-net10.0.txt +++ b/tests/api-compatibility/acceptable-breakages-vReference-net10.0.txt @@ -15,7 +15,23 @@ CannotRemoveAttribute : Attribute 'Android.Runtime.RequiresPermissionAttribute' CannotRemoveAttribute : Attribute 'Android.Runtime.RequiresPermissionAttribute' exists on 'Android.Bluetooth.LE.BluetoothLeAdvertiser.StartAdvertisingSet(Android.Bluetooth.LE.AdvertisingSetParameters, Android.Bluetooth.LE.AdvertiseData, Android.Bluetooth.LE.AdvertiseData, Android.Bluetooth.LE.PeriodicAdvertisingParameters, Android.Bluetooth.LE.AdvertiseData, System.Int32, System.Int32, Android.Bluetooth.LE.AdvertisingSetCallback)' in the contract but not the implementation. CannotRemoveAttribute : Attribute 'Android.Runtime.RequiresPermissionAttribute' exists on 'Android.Bluetooth.LE.BluetoothLeAdvertiser.StartAdvertisingSet(Android.Bluetooth.LE.AdvertisingSetParameters, Android.Bluetooth.LE.AdvertiseData, Android.Bluetooth.LE.AdvertiseData, Android.Bluetooth.LE.PeriodicAdvertisingParameters, Android.Bluetooth.LE.AdvertiseData, System.Int32, System.Int32, Android.Bluetooth.LE.AdvertisingSetCallback, Android.OS.Handler)' in the contract but not the implementation. CannotRemoveAttribute : Attribute 'Android.Runtime.RequiresPermissionAttribute' exists on 'Android.Telephony.TelephonyManager.GetCarrierRestrictionStatus(Java.Util.Concurrent.IExecutor, Java.Util.Functions.IConsumer)' in the contract but not the implementation. +CannotRemoveAttribute : Attribute 'Android.Runtime.RequiresPermissionAttribute' exists on 'Android.Telephony.TelephonyManager.IsMultiSimSupported()' in the contract but not the implementation. +CannotRemoveAttribute : Attribute 'Android.Runtime.RequiresPermissionAttribute' exists on 'Android.Telephony.TelephonyManager.UiccCardsInfo.get()' in the contract but not the implementation. CannotRemoveAttribute : Attribute 'System.Runtime.Versioning.ObsoletedOSPlatformAttribute' exists on 'Android.Graphics.Path.ComputeBounds(Android.Graphics.RectF, System.Boolean)' in the contract but not the implementation. CannotRemoveAttribute : Attribute 'System.Runtime.Versioning.ObsoletedOSPlatformAttribute' exists on 'Android.Views.Display.GetSupportedRefreshRates()' in the contract but not the implementation. CannotRemoveAttribute : Attribute 'System.Runtime.Versioning.ObsoletedOSPlatformAttribute' exists on 'Android.App.AppOpsManager.CheckOp(System.String, System.Int32, System.String)' in the contract but not the implementation. CannotRemoveAttribute : Attribute 'System.Runtime.Versioning.ObsoletedOSPlatformAttribute' exists on 'Android.App.AppOpsManager.CheckOpNoThrow(System.String, System.Int32, System.String)' in the contract but not the implementation. +CannotRemoveAttribute : Attribute 'System.Runtime.Versioning.ObsoletedOSPlatformAttribute' exists on 'Android.Net.Wifi.WifiConfiguration..ctor()' in the contract but not the implementation. +CannotRemoveAttribute : Attribute 'System.Runtime.Versioning.ObsoletedOSPlatformAttribute' exists on 'Android.Net.Wifi.WifiConfiguration..ctor(Android.Net.Wifi.WifiConfiguration)' in the contract but not the implementation. +CannotRemoveAttribute : Attribute 'System.Runtime.Versioning.ObsoletedOSPlatformAttribute' exists on 'Android.Net.Wifi.WifiConfiguration.AuthAlgorithm' in the contract but not the implementation. +CannotRemoveAttribute : Attribute 'System.Runtime.Versioning.ObsoletedOSPlatformAttribute' exists on 'Android.Net.Wifi.WifiConfiguration.DescribeContents()' in the contract but not the implementation. +CannotRemoveAttribute : Attribute 'System.Runtime.Versioning.ObsoletedOSPlatformAttribute' exists on 'Android.Net.Wifi.WifiConfiguration.GroupCipher' in the contract but not the implementation. +CannotRemoveAttribute : Attribute 'System.Runtime.Versioning.ObsoletedOSPlatformAttribute' exists on 'Android.Net.Wifi.WifiConfiguration.GroupMgmtCipher' in the contract but not the implementation. +CannotRemoveAttribute : Attribute 'System.Runtime.Versioning.ObsoletedOSPlatformAttribute' exists on 'Android.Net.Wifi.WifiConfiguration.KeyMgmt' in the contract but not the implementation. +CannotRemoveAttribute : Attribute 'System.Runtime.Versioning.ObsoletedOSPlatformAttribute' exists on 'Android.Net.Wifi.WifiConfiguration.PairwiseCipher' in the contract but not the implementation. +CannotRemoveAttribute : Attribute 'System.Runtime.Versioning.ObsoletedOSPlatformAttribute' exists on 'Android.Net.Wifi.WifiConfiguration.Protocol' in the contract but not the implementation. +CannotRemoveAttribute : Attribute 'System.Runtime.Versioning.ObsoletedOSPlatformAttribute' exists on 'Android.Net.Wifi.WifiConfiguration.SetIpConfiguration(Android.Net.IpConfiguration)' in the contract but not the implementation. +CannotRemoveAttribute : Attribute 'System.Runtime.Versioning.ObsoletedOSPlatformAttribute' exists on 'Android.Net.Wifi.WifiConfiguration.SetSecurityParams(System.Int32)' in the contract but not the implementation. +CannotRemoveAttribute : Attribute 'System.Runtime.Versioning.ObsoletedOSPlatformAttribute' exists on 'Android.Net.Wifi.WifiConfiguration.Status' in the contract but not the implementation. +CannotRemoveAttribute : Attribute 'System.Runtime.Versioning.ObsoletedOSPlatformAttribute' exists on 'Android.Net.Wifi.WifiConfiguration.WriteToParcel(Android.OS.Parcel, Android.OS.ParcelableWriteFlags)' in the contract but not the implementation. +CannotRemoveAttribute : Attribute 'System.Runtime.Versioning.ObsoletedOSPlatformAttribute' exists on 'Android.Net.Wifi.WifiConfiguration' in the contract but not the implementation. From 4028f7e3e0047602b3958a0b540eb1c57a548c8d Mon Sep 17 00:00:00 2001 From: Jonathan Pryor Date: Thu, 25 Sep 2025 14:07:30 -0400 Subject: [PATCH 4/6] Both API-36 and API-36.1 are built, stable Context: https://github.com/dotnet/android/pull/10005 Normally when we declare a new API level as "stable", it is the *only* API that is built. For API-36.1, this is not the case: we want to continue building API-36, *and also* build API-36.1. Mirror #10005: * build both API levels by "repurposing" the `$(AndroidLatestUnstable*)` MSBuild properties as an "alternate set" of stable API levels. * What "really" indicates a `Mono.Android.dll` is unstable is the presence of `ANDROID_UNSTABLE` when building it. This is conditional on `$(IsUnstableVersion)`. Update `$(IsUnstableVersion)` so that it uses the [MSBuild version-comparison functions][0] to compare `$(AndroidApiLevel)` against `$(AndroidLatestStableApiLevel)` (previous behavior) *and also* against `$(AndroidLatestStableApiLevel2)` (new property). This allows API-36.1 to be built via the `*Unstable*` properties while not defining `ANDROID_UNSTABLE.` [0]: https://learn.microsoft.com/en-us/visualstudio/msbuild/property-functions?view=vs-2022#msbuild-version-comparison-functions --- Configuration.props | 9 +++++---- .../automation/yaml-templates/variables.yaml | 2 +- src/Mono.Android/Mono.Android.csproj | 5 ++++- .../acceptable-breakages-vReference-net10.0.txt | 16 ---------------- 4 files changed, 10 insertions(+), 22 deletions(-) diff --git a/Configuration.props b/Configuration.props index 70e6be86911..3837a1f7c6b 100644 --- a/Configuration.props +++ b/Configuration.props @@ -25,13 +25,14 @@ 21 - 36.1 + 36 $(AndroidLatestStableApiLevel) - v16.1 + v16.0 + 36.1 - $(AndroidLatestStableApiLevel) + 36.1 $(AndroidLatestStablePlatformId) - $(AndroidLatestStableFrameworkVersion) + v16.1 $(AndroidLatestStableApiLevel) diff --git a/build-tools/automation/yaml-templates/variables.yaml b/build-tools/automation/yaml-templates/variables.yaml index 83128b44700..27bcf5d0ca5 100644 --- a/build-tools/automation/yaml-templates/variables.yaml +++ b/build-tools/automation/yaml-templates/variables.yaml @@ -63,7 +63,7 @@ variables: - name: IsRelOrTargetingRel value: $[or(startsWith(variables['Build.SourceBranch'], 'refs/heads/release/'), startsWith(variables['System.PullRequest.TargetBranch'], 'release/'))] - name: DefaultTestSdkPlatforms # Comma-separated SDK Platform(s) to install on test agents (no spaces) - value: 36,CANARY + value: 36,36.1 - name: DefaultJavaSdkMajorVersion value: 17 - name: LatestJavaSdkMajorVersion diff --git a/src/Mono.Android/Mono.Android.csproj b/src/Mono.Android/Mono.Android.csproj index 18b95b5ae92..138f11f683e 100644 --- a/src/Mono.Android/Mono.Android.csproj +++ b/src/Mono.Android/Mono.Android.csproj @@ -26,7 +26,10 @@ - true + true $(DefineConstants);ANDROID_UNSTABLE $(_MonoAndroidNETDefaultOutDir) diff --git a/tests/api-compatibility/acceptable-breakages-vReference-net10.0.txt b/tests/api-compatibility/acceptable-breakages-vReference-net10.0.txt index 3cf4b8b71fa..8e6e73812da 100644 --- a/tests/api-compatibility/acceptable-breakages-vReference-net10.0.txt +++ b/tests/api-compatibility/acceptable-breakages-vReference-net10.0.txt @@ -15,23 +15,7 @@ CannotRemoveAttribute : Attribute 'Android.Runtime.RequiresPermissionAttribute' CannotRemoveAttribute : Attribute 'Android.Runtime.RequiresPermissionAttribute' exists on 'Android.Bluetooth.LE.BluetoothLeAdvertiser.StartAdvertisingSet(Android.Bluetooth.LE.AdvertisingSetParameters, Android.Bluetooth.LE.AdvertiseData, Android.Bluetooth.LE.AdvertiseData, Android.Bluetooth.LE.PeriodicAdvertisingParameters, Android.Bluetooth.LE.AdvertiseData, System.Int32, System.Int32, Android.Bluetooth.LE.AdvertisingSetCallback)' in the contract but not the implementation. CannotRemoveAttribute : Attribute 'Android.Runtime.RequiresPermissionAttribute' exists on 'Android.Bluetooth.LE.BluetoothLeAdvertiser.StartAdvertisingSet(Android.Bluetooth.LE.AdvertisingSetParameters, Android.Bluetooth.LE.AdvertiseData, Android.Bluetooth.LE.AdvertiseData, Android.Bluetooth.LE.PeriodicAdvertisingParameters, Android.Bluetooth.LE.AdvertiseData, System.Int32, System.Int32, Android.Bluetooth.LE.AdvertisingSetCallback, Android.OS.Handler)' in the contract but not the implementation. CannotRemoveAttribute : Attribute 'Android.Runtime.RequiresPermissionAttribute' exists on 'Android.Telephony.TelephonyManager.GetCarrierRestrictionStatus(Java.Util.Concurrent.IExecutor, Java.Util.Functions.IConsumer)' in the contract but not the implementation. -CannotRemoveAttribute : Attribute 'Android.Runtime.RequiresPermissionAttribute' exists on 'Android.Telephony.TelephonyManager.IsMultiSimSupported()' in the contract but not the implementation. -CannotRemoveAttribute : Attribute 'Android.Runtime.RequiresPermissionAttribute' exists on 'Android.Telephony.TelephonyManager.UiccCardsInfo.get()' in the contract but not the implementation. CannotRemoveAttribute : Attribute 'System.Runtime.Versioning.ObsoletedOSPlatformAttribute' exists on 'Android.Graphics.Path.ComputeBounds(Android.Graphics.RectF, System.Boolean)' in the contract but not the implementation. CannotRemoveAttribute : Attribute 'System.Runtime.Versioning.ObsoletedOSPlatformAttribute' exists on 'Android.Views.Display.GetSupportedRefreshRates()' in the contract but not the implementation. CannotRemoveAttribute : Attribute 'System.Runtime.Versioning.ObsoletedOSPlatformAttribute' exists on 'Android.App.AppOpsManager.CheckOp(System.String, System.Int32, System.String)' in the contract but not the implementation. CannotRemoveAttribute : Attribute 'System.Runtime.Versioning.ObsoletedOSPlatformAttribute' exists on 'Android.App.AppOpsManager.CheckOpNoThrow(System.String, System.Int32, System.String)' in the contract but not the implementation. -CannotRemoveAttribute : Attribute 'System.Runtime.Versioning.ObsoletedOSPlatformAttribute' exists on 'Android.Net.Wifi.WifiConfiguration..ctor()' in the contract but not the implementation. -CannotRemoveAttribute : Attribute 'System.Runtime.Versioning.ObsoletedOSPlatformAttribute' exists on 'Android.Net.Wifi.WifiConfiguration..ctor(Android.Net.Wifi.WifiConfiguration)' in the contract but not the implementation. -CannotRemoveAttribute : Attribute 'System.Runtime.Versioning.ObsoletedOSPlatformAttribute' exists on 'Android.Net.Wifi.WifiConfiguration.AuthAlgorithm' in the contract but not the implementation. -CannotRemoveAttribute : Attribute 'System.Runtime.Versioning.ObsoletedOSPlatformAttribute' exists on 'Android.Net.Wifi.WifiConfiguration.DescribeContents()' in the contract but not the implementation. -CannotRemoveAttribute : Attribute 'System.Runtime.Versioning.ObsoletedOSPlatformAttribute' exists on 'Android.Net.Wifi.WifiConfiguration.GroupCipher' in the contract but not the implementation. -CannotRemoveAttribute : Attribute 'System.Runtime.Versioning.ObsoletedOSPlatformAttribute' exists on 'Android.Net.Wifi.WifiConfiguration.GroupMgmtCipher' in the contract but not the implementation. -CannotRemoveAttribute : Attribute 'System.Runtime.Versioning.ObsoletedOSPlatformAttribute' exists on 'Android.Net.Wifi.WifiConfiguration.KeyMgmt' in the contract but not the implementation. -CannotRemoveAttribute : Attribute 'System.Runtime.Versioning.ObsoletedOSPlatformAttribute' exists on 'Android.Net.Wifi.WifiConfiguration.PairwiseCipher' in the contract but not the implementation. -CannotRemoveAttribute : Attribute 'System.Runtime.Versioning.ObsoletedOSPlatformAttribute' exists on 'Android.Net.Wifi.WifiConfiguration.Protocol' in the contract but not the implementation. -CannotRemoveAttribute : Attribute 'System.Runtime.Versioning.ObsoletedOSPlatformAttribute' exists on 'Android.Net.Wifi.WifiConfiguration.SetIpConfiguration(Android.Net.IpConfiguration)' in the contract but not the implementation. -CannotRemoveAttribute : Attribute 'System.Runtime.Versioning.ObsoletedOSPlatformAttribute' exists on 'Android.Net.Wifi.WifiConfiguration.SetSecurityParams(System.Int32)' in the contract but not the implementation. -CannotRemoveAttribute : Attribute 'System.Runtime.Versioning.ObsoletedOSPlatformAttribute' exists on 'Android.Net.Wifi.WifiConfiguration.Status' in the contract but not the implementation. -CannotRemoveAttribute : Attribute 'System.Runtime.Versioning.ObsoletedOSPlatformAttribute' exists on 'Android.Net.Wifi.WifiConfiguration.WriteToParcel(Android.OS.Parcel, Android.OS.ParcelableWriteFlags)' in the contract but not the implementation. -CannotRemoveAttribute : Attribute 'System.Runtime.Versioning.ObsoletedOSPlatformAttribute' exists on 'Android.Net.Wifi.WifiConfiguration' in the contract but not the implementation. From f294c4e128d497053987b53dfa90c9cf0ae0565d Mon Sep 17 00:00:00 2001 From: Jonathan Pryor Date: Thu, 25 Sep 2025 14:52:18 -0400 Subject: [PATCH 5/6] Fix warnings-as-errors --- .../GenerateSupportedPlatforms.cs | 17 ++++++++++------- 1 file changed, 10 insertions(+), 7 deletions(-) diff --git a/build-tools/Xamarin.Android.Tools.BootstrapTasks/Xamarin.Android.Tools.BootstrapTasks/GenerateSupportedPlatforms.cs b/build-tools/Xamarin.Android.Tools.BootstrapTasks/Xamarin.Android.Tools.BootstrapTasks/GenerateSupportedPlatforms.cs index b0b542f4aee..2de5972d692 100644 --- a/build-tools/Xamarin.Android.Tools.BootstrapTasks/Xamarin.Android.Tools.BootstrapTasks/GenerateSupportedPlatforms.cs +++ b/build-tools/Xamarin.Android.Tools.BootstrapTasks/Xamarin.Android.Tools.BootstrapTasks/GenerateSupportedPlatforms.cs @@ -20,24 +20,24 @@ public class GenerateSupportedPlatforms : Task /// @(AndroidApiInfo) from .\bin\Build$(Configuration)\Mono.Android.Apis.projitems /// [Required] - public ITaskItem [] AndroidApiInfo { get; set; } + public ITaskItem [] AndroidApiInfo { get; set; } = []; /// /// The output file to generate /// [Required] - public string OutputFile { get; set; } + public string OutputFile { get; set; } = ""; /// /// $(AndroidMinimumDotNetApiLevel) from Configuration.props /// [Required] - public string MinimumApiLevel { get; set; } + public string? MinimumApiLevel { get; set; } /// /// Default value for $(TargetPlatformVersion), defaults to MaxStableVersion.ApiLevel /// - public string TargetApiLevel { get; set; } + public string? TargetApiLevel { get; set; } public override bool Execute () { @@ -47,7 +47,7 @@ public override bool Execute () var versions = new AndroidVersions (AndroidApiInfo.Select (ToAndroidVersion)); var targetApiLevel = targetVersion != null && targetVersion.Major > 0 ? targetVersion - : versions.MaxStableVersion.VersionCodeFull; + : versions.MaxStableVersion!.VersionCodeFull; var settings = new XmlWriterSettings { OmitXmlDeclaration = true, Indent = true, @@ -76,7 +76,7 @@ public override bool Execute () writer.WriteEndElement (); // writer.WriteStartElement ("AndroidMinimumSupportedApiLevel"); writer.WriteAttributeString ("Condition", " '$(AndroidMinimumSupportedApiLevel)' == '' "); - writer.WriteString (MinimumApiLevel.ToString ()); + writer.WriteString (MinimumApiLevel?.ToString () ?? ""); writer.WriteEndElement (); // writer.WriteEndElement (); // @@ -102,8 +102,11 @@ public override bool Execute () return !Log.HasLoggedErrors; } - static Version? ToVersion (string value) + static Version? ToVersion (string? value) { + if (string.IsNullOrEmpty (value)) { + return null; + } if (Version.TryParse (value, out var version)) { return version; } From 0cb53da5239d8142eb394e0eda747b03cc8a38f1 Mon Sep 17 00:00:00 2001 From: Jonathan Pryor Date: Fri, 26 Sep 2025 11:05:40 -0400 Subject: [PATCH 6/6] Fixity Fix. Doh! --- Configuration.props | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Configuration.props b/Configuration.props index 3837a1f7c6b..c5c6b0c7e8f 100644 --- a/Configuration.props +++ b/Configuration.props @@ -31,7 +31,7 @@ 36.1 36.1 - $(AndroidLatestStablePlatformId) + $(AndroidLatestUnstableApiLevel) v16.1 $(AndroidLatestStableApiLevel)