2022-01-06 06:51:09 +03:00

165 lines
5.2 KiB
C#

// Copyright (C) 2020 Google LLC
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
#if UNITY_ANDROID
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Xml.Linq;
using UnityEditor;
using UnityEditor.Build;
#if UNITY_2018_1_OR_NEWER
using UnityEditor.Build.Reporting;
#endif
using UnityEngine;
using GoogleMobileAds.Editor;
#if UNITY_2018_1_OR_NEWER
public class ManifestProcessor : IPreprocessBuildWithReport
#else
public class ManifestProcessor : IPreprocessBuild
#endif
{
private const string META_APPLICATION_ID = "com.google.android.gms.ads.APPLICATION_ID";
private const string MANIFEST_RELATIVE_PATH = "Plugins/Android/GoogleMobileAdsPlugin.androidlib/AndroidManifest.xml";
private const string META_DELAY_APP_MEASUREMENT_INIT =
"com.google.android.gms.ads.DELAY_APP_MEASUREMENT_INIT";
private XNamespace ns = "http://schemas.android.com/apk/res/android";
public int callbackOrder { get { return 0; } }
#if UNITY_2018_1_OR_NEWER
public void OnPreprocessBuild(BuildReport report)
#else
public void OnPreprocessBuild(BuildTarget target, string path)
#endif
{
string manifestPath = Path.Combine(
Application.dataPath, MANIFEST_RELATIVE_PATH);
if (AssetDatabase.IsValidFolder("Packages/com.google.ads.mobile"))
{
manifestPath = Path.Combine("Packages/com.google.ads.mobile", MANIFEST_RELATIVE_PATH);
}
XDocument manifest = null;
try
{
manifest = XDocument.Load(manifestPath);
}
#pragma warning disable 0168
catch (IOException e)
#pragma warning restore 0168
{
StopBuildWithMessage("AndroidManifest.xml is missing. Try re-importing the plugin.");
}
XElement elemManifest = manifest.Element("manifest");
if (elemManifest == null)
{
StopBuildWithMessage("AndroidManifest.xml is not valid. Try re-importing the plugin.");
}
XElement elemApplication = elemManifest.Element("application");
if (elemApplication == null)
{
StopBuildWithMessage("AndroidManifest.xml is not valid. Try re-importing the plugin.");
}
IEnumerable<XElement> metas = elemApplication.Descendants()
.Where( elem => elem.Name.LocalName.Equals("meta-data"));
XElement elemGMAEnabled = GetMetaElement(metas, META_APPLICATION_ID);
string appId = GoogleMobileAdsSettings.Instance.GoogleMobileAdsAndroidAppId;
if (appId.Length == 0)
{
StopBuildWithMessage(
"Android Google Mobile Ads app ID is empty. Please enter a valid app ID to run ads properly.");
}
if (elemGMAEnabled == null)
{
elemApplication.Add(CreateMetaElement(META_APPLICATION_ID, appId));
}
else
{
elemGMAEnabled.SetAttributeValue(ns + "value", appId);
}
XElement elemDelayAppMeasurementInit =
GetMetaElement(metas, META_DELAY_APP_MEASUREMENT_INIT);
if (GoogleMobileAdsSettings.Instance.DelayAppMeasurementInit)
{
if (elemDelayAppMeasurementInit == null)
{
elemApplication.Add(CreateMetaElement(META_DELAY_APP_MEASUREMENT_INIT, true));
}
else
{
elemDelayAppMeasurementInit.SetAttributeValue(ns + "value", true);
}
}
else
{
if (elemDelayAppMeasurementInit != null)
{
elemDelayAppMeasurementInit.Remove();
}
}
elemManifest.Save(manifestPath);
}
private XElement CreateMetaElement(string name, object value)
{
return new XElement("meta-data",
new XAttribute(ns + "name", name), new XAttribute(ns + "value", value));
}
private XElement GetMetaElement(IEnumerable<XElement> metas, string metaName)
{
foreach (XElement elem in metas)
{
IEnumerable<XAttribute> attrs = elem.Attributes();
foreach (XAttribute attr in attrs)
{
if (attr.Name.Namespace.Equals(ns)
&& attr.Name.LocalName.Equals("name") && attr.Value.Equals(metaName))
{
return elem;
}
}
}
return null;
}
private void StopBuildWithMessage(string message)
{
string prefix = "[GoogleMobileAds] ";
#if UNITY_2017_1_OR_NEWER
throw new BuildPlayerWindow.BuildMethodException(prefix + message);
#else
throw new OperationCanceledException(prefix + message);
#endif
}
}
#endif