Ejemplo n.º 1
0
    public static void PatchAndroidManifest(string sourceFile, string destinationFile = null, bool skipExistingAttributes = true, bool enableSecurity = false)
    {
        if (destinationFile == null)
        {
            destinationFile = sourceFile;
        }

        bool modifyIfFound = !skipExistingAttributes;

        try
        {
            OVRProjectConfig projectConfig = OVRProjectConfig.GetProjectConfig();

            // Load android manfiest file
            XmlDocument doc = new XmlDocument();
            doc.Load(sourceFile);

            string     androidNamepsaceURI;
            XmlElement element = (XmlElement)doc.SelectSingleNode("/manifest");
            if (element == null)
            {
                UnityEngine.Debug.LogError("Could not find manifest tag in android manifest.");
                return;
            }

            // Get android namespace URI from the manifest
            androidNamepsaceURI = element.GetAttribute("xmlns:android");
            if (string.IsNullOrEmpty(androidNamepsaceURI))
            {
                UnityEngine.Debug.LogError("Could not find Android Namespace in manifest.");
                return;
            }

            // remove launcher and leanback launcher
            AddOrRemoveTag(doc,
                           androidNamepsaceURI,
                           "/manifest/application/activity/intent-filter",
                           "category",
                           "android.intent.category.LAUNCHER",
                           required: false,
                           modifyIfFound: true); // always remove launcher
            AddOrRemoveTag(doc,
                           androidNamepsaceURI,
                           "/manifest/application/activity/intent-filter",
                           "category",
                           "android.intent.category.LEANBACK_LAUNCHER",
                           required: false,
                           modifyIfFound: true); // always remove leanback launcher
            // add info category
            AddOrRemoveTag(doc,
                           androidNamepsaceURI,
                           "/manifest/application/activity/intent-filter",
                           "category",
                           "android.intent.category.INFO",
                           required: true,
                           modifyIfFound: true); // always add info launcher

            // First add or remove headtracking flag if targeting Quest
            AddOrRemoveTag(doc,
                           androidNamepsaceURI,
                           "/manifest",
                           "uses-feature",
                           "android.hardware.vr.headtracking",
                           OVRDeviceSelector.isTargetDeviceQuest,
                           modifyIfFound,
                           "version", "1",
                           "required", OVRDeviceSelector.isTargetDeviceGearVrOrGo ? "false" : "true");

            // If Quest is the target device, add the handtracking manifest tags if needed
            // Mapping of project setting to manifest setting:
            // OVRProjectConfig.HandTrackingSupport.ControllersOnly => manifest entry not present
            // OVRProjectConfig.HandTrackingSupport.ControllersAndHands => manifest entry present and required=false
            // OVRProjectConfig.HandTrackingSupport.HandsOnly => manifest entry present and required=true
            OVRProjectConfig.HandTrackingSupport targetHandTrackingSupport = OVRProjectConfig.GetProjectConfig().handTrackingSupport;
            bool handTrackingEntryNeeded = OVRDeviceSelector.isTargetDeviceQuest && (targetHandTrackingSupport != OVRProjectConfig.HandTrackingSupport.ControllersOnly);

            AddOrRemoveTag(doc,
                           androidNamepsaceURI,
                           "/manifest",
                           "uses-feature",
                           "oculus.software.handtracking",
                           handTrackingEntryNeeded,
                           modifyIfFound,
                           "required", (targetHandTrackingSupport == OVRProjectConfig.HandTrackingSupport.HandsOnly) ? "true" : "false");
            AddOrRemoveTag(doc,
                           androidNamepsaceURI,
                           "/manifest",
                           "uses-permission",
                           "oculus.permission.handtracking",
                           handTrackingEntryNeeded,
                           modifyIfFound);

            // Add Colorspace metadata if targeting Quest
            AddOrRemoveTag(doc,
                           androidNamepsaceURI,
                           "/manifest/application",
                           "meta-data",
                           "com.oculus.application.colorspace",
                           OVRDeviceSelector.isTargetDeviceQuest && projectConfig.colorGamut != OVRProjectConfig.ColorGamut.Default,
                           modifyIfFound,
                           "value", OVRProjectConfig.ColorGamutToString(projectConfig.colorGamut));

            // Add focus aware tag if this app is targeting Quest
            AddOrRemoveTag(doc,
                           androidNamepsaceURI,
                           "/manifest/application/activity",
                           "meta-data",
                           "com.oculus.vr.focusaware",
                           OVRDeviceSelector.isTargetDeviceQuest,
                           modifyIfFound,
                           "value", projectConfig.focusAware ? "true" : "false");

            // make sure the VR Mode tag is set in the manifest
            AddOrRemoveTag(doc,
                           androidNamepsaceURI,
                           "/manifest/application",
                           "meta-data",
                           "com.samsung.android.vr.application.mode",
                           true,
                           modifyIfFound,
                           "value", "vr_only");

            // make sure android label and icon are set in the manifest
            AddOrRemoveTag(doc,
                           androidNamepsaceURI,
                           "/manifest",
                           "application",
                           null,
                           true,
                           modifyIfFound,
                           "label", "@string/app_name",
#if UNITY_2018_2_OR_NEWER
                           "icon", "@mipmap/app_icon",
#else
                           "icon", "@drawable/app_icon",
#endif
                           // Disable allowBackup in manifest and add Android NSC XML file
                           "allowBackup", projectConfig.disableBackups ? "false" : "true",
                           "networkSecurityConfig", projectConfig.enableNSCConfig && enableSecurity ? "@xml/network_sec_config" : null
                           );

            doc.Save(destinationFile);
        }
        catch (System.Exception e)
        {
            UnityEngine.Debug.LogException(e);
        }
    }