112 lines
4.3 KiB
C#
112 lines
4.3 KiB
C#
#if UNITY_ANDROID
|
|
using System.Xml;
|
|
using Unity.Services.Mediation.Settings.Editor;
|
|
using UnityEditor.Android;
|
|
|
|
namespace Unity.Services.Mediation.Build.Editor
|
|
{
|
|
class AndroidManifestPostGenerateGradleProject : IPostGenerateGradleAndroidProject
|
|
{
|
|
/*
|
|
* This Utility will be used to inject Application Id (and other properties) to the AndroidManifest file.
|
|
*/
|
|
|
|
const string k_GmsApplicationIdName = "com.google.android.gms.ads.APPLICATION_ID";
|
|
|
|
const string k_AndroidManifestPath = "/src/main/AndroidManifest.xml";
|
|
|
|
const string k_AndroidURI = "http://schemas.android.com/apk/res/android";
|
|
|
|
public int callbackOrder { get; }
|
|
|
|
|
|
public void OnPostGenerateGradleAndroidProject(string path)
|
|
{
|
|
var adMobSettings = new AdMobSettings();
|
|
//If we're not including AdMob, no need to modify AndroidManifest.xml
|
|
if (string.IsNullOrEmpty(adMobSettings.InstalledVersion.value) || string.IsNullOrWhiteSpace(adMobSettings.AdMobAppIdAndroid))
|
|
return;
|
|
|
|
string manifestPath = path + k_AndroidManifestPath;
|
|
var manifestDoc = new XmlDocument();
|
|
manifestDoc.Load(manifestPath);
|
|
|
|
var manifestNode = FindFirstChild(manifestDoc, "manifest");
|
|
if (manifestNode == null)
|
|
return;
|
|
|
|
var applicationNode = FindFirstChild(manifestNode, "application");
|
|
if (applicationNode == null)
|
|
return;
|
|
|
|
FindOrCreateTagWithAttributes(manifestDoc, applicationNode, "meta-data",
|
|
"name", k_GmsApplicationIdName,
|
|
"value", adMobSettings.AdMobAppIdAndroid);
|
|
|
|
manifestDoc.Save(manifestPath);
|
|
}
|
|
|
|
XmlNode FindFirstChild(XmlNode node, string tag)
|
|
{
|
|
if (node.HasChildNodes)
|
|
{
|
|
for (int i = 0; i < node.ChildNodes.Count; ++i)
|
|
{
|
|
var child = node.ChildNodes[i];
|
|
if (child.Name == tag)
|
|
return child;
|
|
}
|
|
}
|
|
|
|
return null;
|
|
}
|
|
|
|
void FindOrCreateTagWithAttributes(XmlDocument doc, XmlNode containingNode, string tagName,
|
|
string firstAttributeName, string firstAttributeValue, string secondAttributeName, string secondAttributeValue)
|
|
{
|
|
if (containingNode.HasChildNodes)
|
|
{
|
|
for (int i = 0; i < containingNode.ChildNodes.Count; ++i)
|
|
{
|
|
var childNode = containingNode.ChildNodes[i];
|
|
if (childNode.Name == tagName)
|
|
{
|
|
var childElement = childNode as XmlElement;
|
|
if (childElement != null && childElement.HasAttributes)
|
|
{
|
|
var firstAttribute = childElement.GetAttributeNode(firstAttributeName, k_AndroidURI);
|
|
if (firstAttribute == null || firstAttribute.Value != firstAttributeValue)
|
|
continue;
|
|
|
|
var secondAttribute = childElement.GetAttributeNode(secondAttributeName, k_AndroidURI);
|
|
if (secondAttribute != null)
|
|
{
|
|
secondAttribute.Value = secondAttributeValue;
|
|
return;
|
|
}
|
|
|
|
// Create it
|
|
AppendNewAttribute(doc, childElement, secondAttributeName, secondAttributeValue);
|
|
return;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
// Didn't find it, so create it
|
|
var element = doc.CreateElement(tagName);
|
|
AppendNewAttribute(doc, element, firstAttributeName, firstAttributeValue);
|
|
AppendNewAttribute(doc, element, secondAttributeName, secondAttributeValue);
|
|
containingNode.AppendChild(element);
|
|
}
|
|
|
|
void AppendNewAttribute(XmlDocument doc, XmlElement element, string attributeName, string attributeValue)
|
|
{
|
|
var attribute = doc.CreateAttribute(attributeName, k_AndroidURI);
|
|
attribute.Value = attributeValue;
|
|
element.Attributes.Append(attribute);
|
|
}
|
|
}
|
|
}
|
|
#endif
|