Space Ad Mobile 9.5.1
Space Ad Mobile makes ads easy to add into your mobile game: one unified workflow for LevelPlay, AdMob, Yandex.Ads across banners, interstitials and rewarded.
Loading...
Searching...
No Matches
AdAggregatorSelector.Install.cs
1using System;
2using System.Collections.Generic;
3using System.IO;
4using System.Linq;
5using System.Reflection;
6using UnityEditor;
7using UnityEditor.Compilation;
8using UnityEngine;
9using PackageInfo = UnityEditor.PackageManager.PackageInfo;
10
11namespace SCG.SpaceAdMobile
12{
16 public partial class AdAggregatorSelector
17 {
18 private const string PackageManagerWindowGeneralMenu = "Window/General/Package Manager";
19 private const string PackageManagerWindowLegacyMenu = "Window/Package Manager";
20 private const string ServicesWindowMenu = "Window/Services/";
21
22 private static readonly string[] packageManagerMenus =
23 {
24 PackageManagerWindowGeneralMenu,
25 PackageManagerWindowLegacyMenu
26 };
27
28 #region Install Helpers
29 private static Aggregator GetSelectedAggregator() =>
30 (adAggregatorResource ? adAggregatorResource : AdAggregatorResource.Instance)
31 .Aggregators == null ? null :
32 selectedAggregator >= adAggregatorResource.Aggregators.Length ? null :
33 adAggregatorResource.Aggregators[selectedAggregator];
34
35 private static bool IsInstallActionConfigured(Aggregator aggregator)
36 {
37 var install = aggregator?.Install;
38 if (install == null)
39 return false;
40
41 return install.InstallMode != InstallOpenMode.ExternalUrl ||
42 !string.IsNullOrWhiteSpace(install.InstallUrl);
43 }
44
45 private static void OpenInstall(Aggregator aggregator)
46 {
47 if (aggregator == null)
48 return;
49
50 var install = aggregator.Install;
51 if (install == null)
52 {
53 Debug.LogWarning($"[{nameof(AdAggregatorSelector)}] Install resource is missing for '{aggregator.Name}'.");
54 return;
55 }
56
57 if (install.InstallMode == InstallOpenMode.PackageManager)
58 {
59 if (TryOpenPackageManager(install))
60 return;
61
62 if (!string.IsNullOrWhiteSpace(install.InstallUrl))
63 {
64 Application.OpenURL(install.InstallUrl);
65 return;
66 }
67
68 Debug.LogWarning(
69 $"[{nameof(AdAggregatorSelector)}] Package Manager is unavailable and fallback URL is missing for '{aggregator.Name}'.");
70 return;
71 }
72
73 if (!string.IsNullOrWhiteSpace(install.InstallUrl))
74 {
75 Application.OpenURL(install.InstallUrl);
76 return;
77 }
78
79 Debug.LogWarning($"[{nameof(AdAggregatorSelector)}] Install URL is missing for '{aggregator.Name}'.");
80 }
81
82 private static bool TryOpenPackageManager(AggregatorInstallResource install)
83 {
84 if (install == null)
85 return false;
86
87 if (TryOpenPackageManagerByPackageId(install.InstallPackageIds))
88 return true;
89
90 var menuItems = new List<string>();
91 if (!string.IsNullOrWhiteSpace(install.PackageManagerFilter))
92 {
93 menuItems.Add(ServicesWindowMenu + install.PackageManagerFilter);
94 }
95
96 menuItems.AddRange(packageManagerMenus);
97 return menuItems
98 .Where(menuItem => !string.IsNullOrWhiteSpace(menuItem))
99 .Distinct(StringComparer.Ordinal)
100 .Any(EditorApplication.ExecuteMenuItem);
101 }
102
103 private static bool TryOpenPackageManagerByPackageId(IEnumerable<string> packageIds)
104 {
105 var enumerable = packageIds as string[] ?? packageIds.ToArray();
106 if (!HasValues(enumerable))
107 return false;
108
109 var packageManagerWindowType = FindPackageManagerWindowType();
110 if (packageManagerWindowType == null)
111 return false;
112
113 var openMethod = packageManagerWindowType.GetMethod(
114 "Open",
115 BindingFlags.Public | BindingFlags.Static,
116 null,
117 new[] { typeof(string) },
118 null);
119 if (openMethod == null)
120 return false;
121
122 foreach (var packageId in enumerable.Where(id => !string.IsNullOrWhiteSpace(id)))
123 {
124 try
125 {
126 openMethod.Invoke(null, new object[] { packageId });
127 return true;
128 }
129 catch
130 {
131 // Ignore reflection invocation errors and continue with fallbacks.
132 }
133 }
134
135 return false;
136 }
137
138 private static Type FindPackageManagerWindowType()
139 {
140 const string fullTypeName = "UnityEditor.PackageManager.UI.Window";
141
142 var type = Type.GetType($"{fullTypeName}, UnityEditor");
143 if (type != null)
144 return type;
145
146 return AppDomain.CurrentDomain.GetAssemblies()
147 .Select(assembly => assembly.GetType(fullTypeName, throwOnError: false))
148 .FirstOrDefault(foundType => foundType != null);
149 }
150
151 private static bool IsAggregatorInstalled(Aggregator aggregator)
152 {
153 var install = aggregator?.Install;
154 if (install == null)
155 return true;
156
157 var hasChecks = false;
158
159 if (HasValues(install.InstallPackageIds))
160 {
161 hasChecks = true;
162 if (install.InstallPackageIds.Any(IsPackageInstalled))
163 return true;
164 }
165
166 if (HasValues(install.InstallFolderNames))
167 {
168 hasChecks = true;
169 if (install.InstallFolderNames.Any(IsFolderInstalled))
170 return true;
171 }
172
173 if (!HasValues(install.InstallAssemblyNames)) return !hasChecks;
174 return install.InstallAssemblyNames.Any(IsAssemblyInstalled);
175 }
176
177 private static bool IsPackageInstalled(string packageId)
178 {
179 if (string.IsNullOrWhiteSpace(packageId))
180 return false;
181
182 if (IsPackageDefinedInManifest(packageId))
183 return true;
184
185 try
186 {
187 return PackageInfo.FindForAssetPath($"Packages/{packageId}") != null;
188 }
189 catch
190 {
191 return false;
192 }
193 }
194
195 private static bool IsPackageDefinedInManifest(string packageId)
196 {
197 if (string.IsNullOrWhiteSpace(packageId))
198 return false;
199
200 var manifestPath = Path.Combine(GetProjectRootPath(), "Packages", "manifest.json");
201 if (!File.Exists(manifestPath))
202 return false;
203
204 try
205 {
206 var manifest = File.ReadAllText(manifestPath);
207 return manifest.Contains($"\"{packageId}\"", StringComparison.Ordinal);
208 }
209 catch
210 {
211 return false;
212 }
213 }
214
215 private static bool IsFolderInstalled(string folderName)
216 {
217 if (string.IsNullOrWhiteSpace(folderName))
218 return false;
219
220 var normalizedFolder = folderName.Replace('\\', '/').Trim('/');
221 if (string.IsNullOrWhiteSpace(normalizedFolder))
222 return false;
223
224 var candidateAssetFolders = new[]
225 {
226 normalizedFolder,
227 $"Assets/{normalizedFolder}",
228 $"Packages/{normalizedFolder}"
229 };
230 if (candidateAssetFolders.Any(AssetDatabase.IsValidFolder))
231 return true;
232
233 var projectRoot = GetProjectRootPath();
234 var candidateDiskFolders = new[]
235 {
236 Path.Combine(projectRoot, normalizedFolder),
237 Path.Combine(projectRoot, "Assets", normalizedFolder),
238 Path.Combine(projectRoot, "Packages", normalizedFolder)
239 };
240 return candidateDiskFolders.Any(Directory.Exists);
241 }
242
243 private static bool IsAssemblyInstalled(string assemblyName)
244 {
245 if (string.IsNullOrWhiteSpace(assemblyName))
246 return false;
247
248 try
249 {
250 return CompilationPipeline.GetAssemblies().Any(assembly =>
251 string.Equals(assembly.name, assemblyName, StringComparison.OrdinalIgnoreCase));
252 }
253 catch
254 {
255 return AppDomain.CurrentDomain.GetAssemblies().Any(assembly =>
256 string.Equals(assembly.GetName().Name, assemblyName, StringComparison.OrdinalIgnoreCase));
257 }
258 }
259
260 private static bool HasValues(IEnumerable<string> values) =>
261 values != null && values.Any(value => !string.IsNullOrWhiteSpace(value));
262
263 private static string GetProjectRootPath() =>
264 Path.GetFullPath(Path.Combine(Application.dataPath, ".."));
265 #endregion
266 }
267}
Provides ad aggregator selector functionality.
InstallOpenMode
Defines the target destination for the Install action in the aggregator selector. External URL opens ...