using System; using System.Collections.Generic; using System.Linq; using UnityEditor; using UnityEditor.Android; using UnityEditor.XR.Management; using UnityEngine.XR.Management; namespace Unity.XR.Management.AndroidManifest.Editor { /// /// Class that receives the build event when building an Android Gradle project, /// so the manifest element processing can be executed. /// internal class AndroidManifestBuildEventReceiver : IPostGenerateGradleAndroidProject { public int callbackOrder => 1; public void OnPostGenerateGradleAndroidProject(string gradleProjectPath) { var processor = CreateManifestProcessor(gradleProjectPath); var manifestProviders = GetManifestProviders(); processor.ProcessManifestRequirements(manifestProviders); } private AndroidManifestProcessor CreateManifestProcessor(string gradleProjectPath) { #if UNITY_2021_1_OR_NEWER var xrManagementPackagePath = EditorUtilities.GetPackagePath("com.unity.xr.management"); var processor = new AndroidManifestProcessor(gradleProjectPath, xrManagementPackagePath, GetXRManagerSettings()); #if UNITY_2023_1_OR_NEWER processor.UseActivityAppEntry = PlayerSettings.Android.applicationEntry.HasFlag(AndroidApplicationEntry.Activity); processor.UseGameActivityAppEntry = PlayerSettings.Android.applicationEntry.HasFlag(AndroidApplicationEntry.GameActivity); #endif return processor; #else return new AndroidManifestProcessor(gradleProjectPath, GetXRManagerSettings()); #endif } /// /// Finds all implementation of in the assemblies, /// and creates instances for each type into a single collection. /// /// collection of instances. All contained objects are unique. private List GetManifestProviders() { return TypeCache .GetTypesDerivedFrom() .Where(type => !type.IsInterface && !type.IsAbstract && !type.IsNestedPrivate) .Select(providerType => Activator.CreateInstance(providerType)) // Instantiate providers .OfType() .Distinct() .ToList(); } private XRManagerSettings GetXRManagerSettings() { if (XRGeneralSettingsPerBuildTarget.XRGeneralSettingsForBuildTarget(BuildTargetGroup.Android)) { return XRGeneralSettingsPerBuildTarget.XRGeneralSettingsForBuildTarget(BuildTargetGroup.Android).AssignedSettings; } return null; } } }