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