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;
}
}
}