From 0190724fa108e3eae94321cbf4d31bbc0e6000ed Mon Sep 17 00:00:00 2001 From: Jonathan Pobst Date: Wed, 10 Jul 2024 15:45:24 -0500 Subject: [PATCH] [Mono.Android] Add properties for all documented AndroidManifest.xml attributes to `[Activity]`, `[Application]`, etc attributes. --- .../manifest-attribute-codegen/metadata.xml | 249 ++++++++++-------- .../RequiredContentUriPermission.cs | 30 +++ src/Mono.Android/Mono.Android.csproj | 1 + .../PublicAPI/API-35/PublicAPI.Unshipped.txt | 30 +++ .../Utilities/ManifestDocumentElement.cs | 41 +++ .../Xamarin.Android.Build.Tasks.csproj | 3 + .../Android.App/ActivityAttribute.cs | 24 ++ .../Android.App/ApplicationAttribute.cs | 64 +++++ .../Android.App/ServiceAttribute.cs | 8 + 9 files changed, 340 insertions(+), 110 deletions(-) create mode 100644 src/Mono.Android/Android.App/RequiredContentUriPermission.cs diff --git a/build-tools/manifest-attribute-codegen/metadata.xml b/build-tools/manifest-attribute-codegen/metadata.xml index fab099f92ab..b1ebf6cab76 100644 --- a/build-tools/manifest-attribute-codegen/metadata.xml +++ b/build-tools/manifest-attribute-codegen/metadata.xml @@ -73,16 +73,13 @@ - + - - - - + @@ -90,52 +87,42 @@ - + - - - - - - - - - + - - @@ -143,235 +130,274 @@ - - - + + + + + + + + + + + + + + + + - - - + + - - - - - - - - + - - - - + - + - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - - - - - - - - - - - - - - - - + + + - + - + + + - - + - - + + + + + - - - - + + + + + + + + + - - + - - - + - - - - + + + + + + + + - - - - + - + + + + + + + - - - + - - + + + + + - - + - - - - + + + + + + + + + - - - - - + - + + + + + - - - - - + - - + + + + + + + + @@ -379,28 +405,31 @@ - + - + - + - + - + + + + \ No newline at end of file diff --git a/src/Mono.Android/Android.App/RequiredContentUriPermission.cs b/src/Mono.Android/Android.App/RequiredContentUriPermission.cs new file mode 100644 index 00000000000..24bd88d41d9 --- /dev/null +++ b/src/Mono.Android/Android.App/RequiredContentUriPermission.cs @@ -0,0 +1,30 @@ +namespace Android.App; + +// Used by AndroidManifest.xml for the attribute 'activity.requireContentUriPermissionFromCaller'. +public enum RequiredContentUriPermission +{ + /// + /// Default, no specific permissions are required. + /// + None = 0, + + /// + /// Enforces the invoker to have read access to the passed content URIs. + /// + Read = 1, + + /// + /// Enforces the invoker to have write access to the passed content URIs. + /// + Write = 2, + + /// + /// Enforces the invoker to have either read or write access to the passed content URIs. + /// + ReadOrWrite = 3, + + /// + /// Enforces the invoker to have write access to the passed content URIs. + /// + ReadAndWrite = 4, +} diff --git a/src/Mono.Android/Mono.Android.csproj b/src/Mono.Android/Mono.Android.csproj index b9399979b79..300b73652a2 100644 --- a/src/Mono.Android/Mono.Android.csproj +++ b/src/Mono.Android/Mono.Android.csproj @@ -82,6 +82,7 @@ + diff --git a/src/Mono.Android/PublicAPI/API-35/PublicAPI.Unshipped.txt b/src/Mono.Android/PublicAPI/API-35/PublicAPI.Unshipped.txt index 266193a8b8c..388dbc33538 100644 --- a/src/Mono.Android/PublicAPI/API-35/PublicAPI.Unshipped.txt +++ b/src/Mono.Android/PublicAPI/API-35/PublicAPI.Unshipped.txt @@ -502,12 +502,34 @@ Android.AdServices.Topics.EncryptedTopic.KeyIdentifier.get -> string! Android.AdServices.Topics.GetTopicsResponse.Builder.Builder(System.Collections.Generic.IList! topics, System.Collections.Generic.IList! encryptedTopics) -> void Android.AdServices.Topics.GetTopicsResponse.EncryptedTopics.get -> System.Collections.Generic.IList! Android.App.Activity.RequestPermissions(string![]! permissions, int requestCode, int deviceId) -> void +Android.App.ActivityAttribute.CanDisplayOnRemoteDevices.get -> bool +Android.App.ActivityAttribute.CanDisplayOnRemoteDevices.set -> void +Android.App.ActivityAttribute.EnableOnBackInvokedCallback.get -> bool +Android.App.ActivityAttribute.EnableOnBackInvokedCallback.set -> void +Android.App.ActivityAttribute.RequireContentUriPermissionFromCaller.get -> Android.App.RequiredContentUriPermission +Android.App.ActivityAttribute.RequireContentUriPermissionFromCaller.set -> void Android.App.Admin.ContentProtectionPolicy Android.App.Admin.ContentProtectionPolicy.Disabled = 1 -> Android.App.Admin.ContentProtectionPolicy Android.App.Admin.ContentProtectionPolicy.Enabled = 2 -> Android.App.Admin.ContentProtectionPolicy Android.App.Admin.ContentProtectionPolicy.NotControlledByPolicy = 0 -> Android.App.Admin.ContentProtectionPolicy Android.App.Admin.HeadlessDeviceOwnerMode.SingleUser = 2 -> Android.App.Admin.HeadlessDeviceOwnerMode Android.App.Admin.SecurityLogTags.BackupServiceToggled = 210044 -> Android.App.Admin.SecurityLogTags +Android.App.ApplicationAttribute.AllowCrossUidActivitySwitchFromBelow.get -> bool +Android.App.ApplicationAttribute.AllowCrossUidActivitySwitchFromBelow.set -> void +Android.App.ApplicationAttribute.AllowNativeHeapPointerTagging.get -> bool +Android.App.ApplicationAttribute.AllowNativeHeapPointerTagging.set -> void +Android.App.ApplicationAttribute.AppCategory.get -> Android.Content.PM.ApplicationCategories +Android.App.ApplicationAttribute.AppCategory.set -> void +Android.App.ApplicationAttribute.DataExtractionRules.get -> string? +Android.App.ApplicationAttribute.DataExtractionRules.set -> void +Android.App.ApplicationAttribute.GwpAsanMode.get -> Android.Content.PM.GwpAsan +Android.App.ApplicationAttribute.GwpAsanMode.set -> void +Android.App.ApplicationAttribute.HasFragileUserData.get -> bool +Android.App.ApplicationAttribute.HasFragileUserData.set -> void +Android.App.ApplicationAttribute.RequestLegacyExternalStorage.get -> bool +Android.App.ApplicationAttribute.RequestLegacyExternalStorage.set -> void +Android.App.ApplicationAttribute.TestOnly.get -> bool +Android.App.ApplicationAttribute.TestOnly.set -> void Android.App.ApplicationStartInfo Android.App.ApplicationStartInfo.DefiningUid.get -> int Android.App.ApplicationStartInfo.DescribeContents() -> int @@ -735,6 +757,12 @@ Android.App.PropertyAttribute.Resource.get -> string? Android.App.PropertyAttribute.Resource.set -> void Android.App.PropertyAttribute.Value.get -> string? Android.App.PropertyAttribute.Value.set -> void +Android.App.RequiredContentUriPermission +Android.App.RequiredContentUriPermission.None = 0 -> Android.App.RequiredContentUriPermission +Android.App.RequiredContentUriPermission.Read = 1 -> Android.App.RequiredContentUriPermission +Android.App.RequiredContentUriPermission.ReadAndWrite = 4 -> Android.App.RequiredContentUriPermission +Android.App.RequiredContentUriPermission.ReadOrWrite = 3 -> Android.App.RequiredContentUriPermission +Android.App.RequiredContentUriPermission.Write = 2 -> Android.App.RequiredContentUriPermission Android.App.SdkSandbox.AppOwnedSdkSandboxInterface Android.App.SdkSandbox.AppOwnedSdkSandboxInterface.AppOwnedSdkSandboxInterface(string! name, long version, Android.OS.IBinder! binder) -> void Android.App.SdkSandbox.AppOwnedSdkSandboxInterface.DescribeContents() -> int @@ -746,6 +774,8 @@ Android.App.SdkSandbox.AppOwnedSdkSandboxInterface.WriteToParcel(Android.OS.Parc Android.App.SdkSandbox.SdkSandboxManager.AppOwnedSdkSandboxInterfaces.get -> System.Collections.Generic.IList! Android.App.SdkSandbox.SdkSandboxManager.RegisterAppOwnedSdkSandboxInterface(Android.App.SdkSandbox.AppOwnedSdkSandboxInterface! appOwnedSdkSandboxInterface) -> void Android.App.SdkSandbox.SdkSandboxManager.UnregisterAppOwnedSdkSandboxInterface(string! name) -> void +Android.App.ServiceAttribute.Description.get -> string? +Android.App.ServiceAttribute.Description.set -> void Android.App.Usage.StorageStats.GetAppBytesByDataType(Android.App.Usage.StorageStatsAppDataType dataType) -> long Android.App.Usage.StorageStatsAppDataType Android.App.Usage.StorageStatsAppDataType.FileTypeApk = 3 -> Android.App.Usage.StorageStatsAppDataType diff --git a/src/Xamarin.Android.Build.Tasks/Utilities/ManifestDocumentElement.cs b/src/Xamarin.Android.Build.Tasks/Utilities/ManifestDocumentElement.cs index ef3a475a3e4..7c2dc09b91a 100644 --- a/src/Xamarin.Android.Build.Tasks/Utilities/ManifestDocumentElement.cs +++ b/src/Xamarin.Android.Build.Tasks/Utilities/ManifestDocumentElement.cs @@ -184,11 +184,14 @@ string ToAttributeValue (string name, T value, ICustomAttributeProvider provider { typeof (float), (value, p, r, v, c) => value.ToString () }, { typeof (string), (value, p, r, v, c) => value.ToString () }, { typeof (ActivityPersistableMode), (value, p, r, v, c) => ToString ((ActivityPersistableMode) value) }, + { typeof (ApplicationCategories), (value, p, r, v, c) => ToString ((ApplicationCategories) value) }, { typeof (ConfigChanges), (value, p, r, v, c) => ToString ((ConfigChanges) value) }, { typeof (DocumentLaunchMode), (value, p, r, v, c) => ToString ((DocumentLaunchMode) value) }, { typeof (ForegroundService), (value, p, r, v, c) => ToString ((ForegroundService) value) }, + { typeof (GwpAsan), (value, p, r, v, c) => ToString ((GwpAsan) value) }, { typeof (LaunchMode), (value, p, r, v, c) => ToString ((LaunchMode) value) }, { typeof (Protection), (value, p, r, v, c) => ToString ((Protection) value) }, + { typeof (RequiredContentUriPermission), (value, p, r, v, c) => ToString ((RequiredContentUriPermission) value) }, { typeof (ScreenOrientation), (value, p, r, v, c) => ToString ((ScreenOrientation) value, v) }, { typeof (SoftInput), (value, p, r, v, c) => ToString ((SoftInput) value) }, { typeof (UiOptions), (value, p, r, v, c) => ToString ((UiOptions) value) }, @@ -408,6 +411,44 @@ static string ToString (ForegroundService value) return string.Join ("|", values.ToArray ()); } + static string ToString (ApplicationCategories value) + { + return value switch { + ApplicationCategories.Accessibility => "accessibility", + ApplicationCategories.Audio => "audio", + ApplicationCategories.Game => "game", + ApplicationCategories.Image => "image", + ApplicationCategories.Maps => "maps", + ApplicationCategories.News => "news", + ApplicationCategories.Productivity => "productivity", + ApplicationCategories.Social => "social", + ApplicationCategories.Video => "video", + _ => throw new ArgumentException ($"Unsupported ApplicationCategories value '{value}'."), + }; + } + + static string ToString (RequiredContentUriPermission value) + { + return value switch { + RequiredContentUriPermission.None => "none", + RequiredContentUriPermission.Read => "read", + RequiredContentUriPermission.Write => "write", + RequiredContentUriPermission.ReadOrWrite => "readOrWrite", + RequiredContentUriPermission.ReadAndWrite => "readAndWrite", + _ => throw new ArgumentException ($"Unsupported RequiredContentUriPermission value '{value}'."), + }; + } + + static string ToString (GwpAsan value) + { + return value switch { + GwpAsan.Always => "always", + GwpAsan.Default => "never", + GwpAsan.Never => "never", + _ => throw new ArgumentException ($"Unsupported GwpAsan value '{value}'."), + }; + } + IEnumerator IEnumerable.GetEnumerator () { return Mappings.Keys.GetEnumerator (); diff --git a/src/Xamarin.Android.Build.Tasks/Xamarin.Android.Build.Tasks.csproj b/src/Xamarin.Android.Build.Tasks/Xamarin.Android.Build.Tasks.csproj index eeb74021822..2e39fbf7571 100644 --- a/src/Xamarin.Android.Build.Tasks/Xamarin.Android.Build.Tasks.csproj +++ b/src/Xamarin.Android.Build.Tasks/Xamarin.Android.Build.Tasks.csproj @@ -161,6 +161,8 @@ Xamarin.Android.BuildTools.PrepTasks\Sleep.cs + <_MonoAndroidEnum Include="$(AndroidGeneratedClassDirectory)\Android.Content.PM.ApplicationCategories.cs" /> + <_MonoAndroidEnum Include="$(AndroidGeneratedClassDirectory)\Android.Content.PM.GwpAsan.cs" /> <_MonoAndroidEnum Include="$(AndroidGeneratedClassDirectory)\Android.Content.PM.LaunchMode.cs" /> <_MonoAndroidEnum Include="$(AndroidGeneratedClassDirectory)\Android.Content.PM.ScreenOrientation.cs" /> <_MonoAndroidEnum Include="$(AndroidGeneratedClassDirectory)\Android.Content.PM.ConfigChanges.cs" /> @@ -172,6 +174,7 @@ <_MonoAndroidEnum Include="$(AndroidGeneratedClassDirectory)\Android.Content.PM.ActivityPersistableMode.cs" /> <_MonoAndroidEnum Include="$(AndroidGeneratedClassDirectory)\Android.Content.PM.DocumentLaunchMode.cs" /> <_MonoAndroidEnum Include="$(AndroidGeneratedClassDirectory)\Android.Views.WindowRotationAnimation.cs" /> + <_MonoAndroidEnum Include="..\Mono.Android\Android.App\RequiredContentUriPermission.cs" /> Mono.Android\%(Filename)%(Extension) diff --git a/src/Xamarin.Android.NamingCustomAttributes/Android.App/ActivityAttribute.cs b/src/Xamarin.Android.NamingCustomAttributes/Android.App/ActivityAttribute.cs index 53156fc6a1c..7ceb77af310 100644 --- a/src/Xamarin.Android.NamingCustomAttributes/Android.App/ActivityAttribute.cs +++ b/src/Xamarin.Android.NamingCustomAttributes/Android.App/ActivityAttribute.cs @@ -30,6 +30,8 @@ public ActivityAttribute () public string? Banner { get; set; } + public bool CanDisplayOnRemoteDevices { get; set; } + public bool ClearTaskOnLaunch { get; set; } public string? ColorMode { get; set; } @@ -44,6 +46,8 @@ public ActivityAttribute () public bool Enabled { get; set; } + public bool EnableOnBackInvokedCallback { get; set; } + public string? EnableVrMode { get; set; } public bool ExcludeFromRecents { get; set; } @@ -90,6 +94,8 @@ public ActivityAttribute () public bool RelinquishTaskIdentity { get; set; } + public Android.App.RequiredContentUriPermission RequireContentUriPermissionFromCaller { get; set; } + public bool ResizeableActivity { get; set; } public bool ResumeWhilePausing { get; set; } @@ -160,6 +166,12 @@ static ActivityAttribute () getter: self => self.Banner, setter: (self, value) => self.Banner = (string?) value ); + mapping.Add ( + member: "CanDisplayOnRemoteDevices", + attributeName: "canDisplayOnRemoteDevices", + getter: self => self.CanDisplayOnRemoteDevices, + setter: (self, value) => self.CanDisplayOnRemoteDevices = (bool) value + ); mapping.Add ( member: "ClearTaskOnLaunch", attributeName: "clearTaskOnLaunch", @@ -202,6 +214,12 @@ static ActivityAttribute () getter: self => self.Enabled, setter: (self, value) => self.Enabled = (bool) value ); + mapping.Add ( + member: "EnableOnBackInvokedCallback", + attributeName: "enableOnBackInvokedCallback", + getter: self => self.EnableOnBackInvokedCallback, + setter: (self, value) => self.EnableOnBackInvokedCallback = (bool) value + ); mapping.Add ( member: "EnableVrMode", attributeName: "enableVrMode", @@ -334,6 +352,12 @@ static ActivityAttribute () getter: self => self.RelinquishTaskIdentity, setter: (self, value) => self.RelinquishTaskIdentity = (bool) value ); + mapping.Add ( + member: "RequireContentUriPermissionFromCaller", + attributeName: "requireContentUriPermissionFromCaller", + getter: self => self.RequireContentUriPermissionFromCaller, + setter: (self, value) => self.RequireContentUriPermissionFromCaller = (Android.App.RequiredContentUriPermission) value + ); mapping.Add ( member: "ResizeableActivity", attributeName: "resizeableActivity", diff --git a/src/Xamarin.Android.NamingCustomAttributes/Android.App/ApplicationAttribute.cs b/src/Xamarin.Android.NamingCustomAttributes/Android.App/ApplicationAttribute.cs index 99e99e8bbcb..0df094b04ee 100644 --- a/src/Xamarin.Android.NamingCustomAttributes/Android.App/ApplicationAttribute.cs +++ b/src/Xamarin.Android.NamingCustomAttributes/Android.App/ApplicationAttribute.cs @@ -24,14 +24,22 @@ public ApplicationAttribute () public bool AllowClearUserData { get; set; } + public bool AllowCrossUidActivitySwitchFromBelow { get; set; } + + public bool AllowNativeHeapPointerTagging { get; set; } + public bool AllowTaskReparenting { get; set; } + public Android.Content.PM.ApplicationCategories AppCategory { get; set; } + public Type? BackupAgent { get; set; } public bool BackupInForeground { get; set; } public string? Banner { get; set; } + public string? DataExtractionRules { get; set; } + public bool Debuggable { get; set; } public string? Description { get; set; } @@ -46,10 +54,14 @@ public ApplicationAttribute () public bool FullBackupOnly { get; set; } + public Android.Content.PM.GwpAsan GwpAsanMode { get; set; } + public bool HardwareAccelerated { get; set; } public bool HasCode { get; set; } + public bool HasFragileUserData { get; set; } + public string? Icon { get; set; } public bool KillAfterRestore { get; set; } @@ -72,6 +84,8 @@ public ApplicationAttribute () public string? Process { get; set; } + public bool RequestLegacyExternalStorage { get; set; } + public string? RequiredAccountType { get; set; } public bool ResizeableActivity { get; set; } @@ -86,6 +100,8 @@ public ApplicationAttribute () public string? TaskAffinity { get; set; } + public bool TestOnly { get; set; } + public string? Theme { get; set; } public Android.Content.PM.UiOptions UiOptions { get; set; } @@ -111,12 +127,30 @@ static ApplicationAttribute () getter: self => self.AllowClearUserData, setter: (self, value) => self.AllowClearUserData = (bool) value ); + mapping.Add ( + member: "AllowCrossUidActivitySwitchFromBelow", + attributeName: "allowCrossUidActivitySwitchFromBelow", + getter: self => self.AllowCrossUidActivitySwitchFromBelow, + setter: (self, value) => self.AllowCrossUidActivitySwitchFromBelow = (bool) value + ); + mapping.Add ( + member: "AllowNativeHeapPointerTagging", + attributeName: "allowNativeHeapPointerTagging", + getter: self => self.AllowNativeHeapPointerTagging, + setter: (self, value) => self.AllowNativeHeapPointerTagging = (bool) value + ); mapping.Add ( member: "AllowTaskReparenting", attributeName: "allowTaskReparenting", getter: self => self.AllowTaskReparenting, setter: (self, value) => self.AllowTaskReparenting = (bool) value ); + mapping.Add ( + member: "AppCategory", + attributeName: "appCategory", + getter: self => self.AppCategory, + setter: (self, value) => self.AppCategory = (Android.Content.PM.ApplicationCategories) value + ); mapping.Add ( member: "BackupInForeground", attributeName: "backupInForeground", @@ -129,6 +163,12 @@ static ApplicationAttribute () getter: self => self.Banner, setter: (self, value) => self.Banner = (string?) value ); + mapping.Add ( + member: "DataExtractionRules", + attributeName: "dataExtractionRules", + getter: self => self.DataExtractionRules, + setter: (self, value) => self.DataExtractionRules = (string?) value + ); mapping.Add ( member: "Debuggable", attributeName: "debuggable", @@ -171,6 +211,12 @@ static ApplicationAttribute () getter: self => self.FullBackupOnly, setter: (self, value) => self.FullBackupOnly = (bool) value ); + mapping.Add ( + member: "GwpAsanMode", + attributeName: "gwpAsanMode", + getter: self => self.GwpAsanMode, + setter: (self, value) => self.GwpAsanMode = (Android.Content.PM.GwpAsan) value + ); mapping.Add ( member: "HardwareAccelerated", attributeName: "hardwareAccelerated", @@ -183,6 +229,12 @@ static ApplicationAttribute () getter: self => self.HasCode, setter: (self, value) => self.HasCode = (bool) value ); + mapping.Add ( + member: "HasFragileUserData", + attributeName: "hasFragileUserData", + getter: self => self.HasFragileUserData, + setter: (self, value) => self.HasFragileUserData = (bool) value + ); mapping.Add ( member: "Icon", attributeName: "icon", @@ -237,6 +289,12 @@ static ApplicationAttribute () getter: self => self.Process, setter: (self, value) => self.Process = (string?) value ); + mapping.Add ( + member: "RequestLegacyExternalStorage", + attributeName: "requestLegacyExternalStorage", + getter: self => self.RequestLegacyExternalStorage, + setter: (self, value) => self.RequestLegacyExternalStorage = (bool) value + ); mapping.Add ( member: "RequiredAccountType", attributeName: "requiredAccountType", @@ -279,6 +337,12 @@ static ApplicationAttribute () getter: self => self.TaskAffinity, setter: (self, value) => self.TaskAffinity = (string?) value ); + mapping.Add ( + member: "TestOnly", + attributeName: "testOnly", + getter: self => self.TestOnly, + setter: (self, value) => self.TestOnly = (bool) value + ); mapping.Add ( member: "Theme", attributeName: "theme", diff --git a/src/Xamarin.Android.NamingCustomAttributes/Android.App/ServiceAttribute.cs b/src/Xamarin.Android.NamingCustomAttributes/Android.App/ServiceAttribute.cs index a6bb02dc906..a603113eacf 100644 --- a/src/Xamarin.Android.NamingCustomAttributes/Android.App/ServiceAttribute.cs +++ b/src/Xamarin.Android.NamingCustomAttributes/Android.App/ServiceAttribute.cs @@ -20,6 +20,8 @@ public ServiceAttribute () { } + public string? Description { get; set; } + public bool DirectBootAware { get; set; } public bool Enabled { get; set; } @@ -47,6 +49,12 @@ public ServiceAttribute () static ServiceAttribute () { + mapping.Add ( + member: "Description", + attributeName: "description", + getter: self => self.Description, + setter: (self, value) => self.Description = (string?) value + ); mapping.Add ( member: "DirectBootAware", attributeName: "directBootAware",