com.amanotes.gdk 0.2.68 → 0.2.70

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (54) hide show
  1. package/CHANGELOG.md +39 -0
  2. package/Editor/AmaGDKEditor.cs +78 -23
  3. package/Editor/AmaGDKExtra.cs +14 -13
  4. package/Editor/Extra/GDKAutoUpdateAdapter.cs +14 -1
  5. package/Editor/Extra/GDKSymbolDefine.cs +372 -0
  6. package/Editor/{AmaGDKManager.cs.meta → Extra/GDKSymbolDefine.cs.meta} +1 -1
  7. package/Editor/Utils/AmaGDKEditor.ExtractVersion.cs +41 -3
  8. package/Extra/AmaGDKInstaller.unitypackage +0 -0
  9. package/Extra/CheckDiskSpace.unitypackage +0 -0
  10. package/Extra/Consent.unitypackage +0 -0
  11. package/Extra/{GoogleCMP.unitypackage.meta → Consent.unitypackage.meta} +1 -1
  12. package/Extra/ForceUpdate.unitypackage +0 -0
  13. package/Extra/LegacyGDKUpdateHelper.unitypackage +0 -0
  14. package/Extra/PostProcessor.unitypackage +0 -0
  15. package/Packages/AmaGDKConfig.unitypackage +0 -0
  16. package/Packages/AmaGDKExample.unitypackage +0 -0
  17. package/Packages/AmaGDKTest.unitypackage +0 -0
  18. package/Packages/AppsFlyerAdapter.PurchaseConnector.unitypackage +0 -0
  19. package/Packages/AppsFlyerAdapter.unitypackage +0 -0
  20. package/Packages/FirebaseAnalyticsAdapter.unitypackage +0 -0
  21. package/Packages/FirebaseRemoteConfigAdapter.unitypackage +0 -0
  22. package/Packages/IronSourceAdapter.unitypackage +0 -0
  23. package/Packages/MaxAdNetworkAdapter.unitypackage +0 -0
  24. package/{Editor/Resources.meta → Packages/MaxAdNetworkAdapter.unitypackage.meta} +1 -2
  25. package/Packages/RevenueCatAdapter.unitypackage +0 -0
  26. package/Packages/SqliteAnalyticsAdapter.unitypackage +0 -0
  27. package/Runtime/Ad/AdExtension.cs +2 -0
  28. package/Runtime/Ad/AdLogic.cs +83 -70
  29. package/Runtime/Ad/AdShowContext.cs +1 -0
  30. package/Runtime/Ad/AmaGDK.Ads.cs +17 -3
  31. package/Runtime/AmaGDK.Adapters.cs +12 -5
  32. package/Runtime/AmaGDK.Analytics.cs +45 -38
  33. package/Runtime/AmaGDK.Consent.cs +259 -0
  34. package/Runtime/AmaGDK.Consent.cs.meta +11 -0
  35. package/Runtime/AmaGDK.Device.cs +4 -4
  36. package/Runtime/AmaGDK.RemoteConfig.cs +3 -1
  37. package/Runtime/AmaGDK.cs +28 -19
  38. package/Runtime/AnalyticQualityAsset.cs +16 -9
  39. package/Runtime/AudioToolkit/AmaGDK.Audio.Latency.cs +1 -3
  40. package/Runtime/AudioToolkit/AmaGDK.Audio.cs +41 -25
  41. package/Runtime/AudioToolkit/Plugins/AudioDeviceDetector.cs +13 -12
  42. package/Runtime/Core/GDKPool.cs +83 -17
  43. package/Runtime/Fps/AmaFPS.cs +0 -1
  44. package/Runtime/Fps/AmaFPSVisualizer.cs +7 -7
  45. package/Runtime/Internal/AmaGDK.Internal.AmaGUI.cs +1 -1
  46. package/Runtime/Internal/AmaGDK.Internal.cs +2 -5
  47. package/Runtime/Internal/AmaGDK.Utils.cs +32 -81
  48. package/Runtime/Internal/GDKGeoLocationcs.cs +3 -1
  49. package/Runtime/Internal/GDKServerTime.cs +13 -10
  50. package/package.json +1 -1
  51. package/Editor/AmaGDKManager.cs +0 -235
  52. package/Editor/Resources/amasdk-modules.json +0 -31
  53. package/Editor/Resources/amasdk-modules.json.meta +0 -7
  54. package/Extra/GoogleCMP.unitypackage +0 -0
package/CHANGELOG.md CHANGED
@@ -1,5 +1,44 @@
1
1
  # Changelog
2
2
 
3
+ ## [0.2.70 - 2024-08-02]
4
+ - [Fix] onAdResult call multiple times
5
+ - [Dev] Show SQLite analytics in GDK Inspector
6
+ - [Dev] Reduce GC by reuse StringBuilders
7
+
8
+ ## [0.2.69 - 2024-07-26]
9
+ - [Fix] disable Max adapter
10
+ - [Dev] Update OnAdResult callback
11
+ - [Fix] Waiting for ad callback
12
+ - [Feature] AdEventTracking for Max ad network
13
+ - [Fix] Wait until the application regains focus after showing ads
14
+ - [Fix] Add OnAdReward callback for Max adapter
15
+ - [Fix] Wrong coverage report for unity 2021
16
+ - [Dev] Multiple AdAdapters is not supported
17
+ - [Fix] Do not register disabled adapter
18
+ - [Fix] add logic ad isSuccess
19
+ - [Fix] Force-close ad when OnAdClose callback is missing
20
+ - [Feature] Consent module: ATT + CMP
21
+ - [Fix] Warning in RevenueCat Adapter
22
+ - [Dev] Clean up timeout override for adapters
23
+ - [Fix] Do not init disabled Adapters
24
+ - [Dev] Remove AmaGDKManager
25
+ - [Fix] Max Mediation not show up in AmaGDK Inspector
26
+ - [Fix] iOS build process hang
27
+ - [Feature] Add Max Ad Network Adapter
28
+ - [Dev] Add option force clean up
29
+ - [Fix] Warning FPS Module
30
+ - [Dev] Config timeout for each adapter
31
+ - [Fix] GDKSymbolDefine Log methods should not require context object
32
+ - [Fix] Do not automatically reimport adapters in dev mode (for LegacyGDKUpdateHelper)
33
+ - [Dev] Add GDK Symbol Define
34
+ - Also: Option to generate a custom logger
35
+ - [Dev] Improve GDK inspector UI with tooltip & logo
36
+ - [Fix] Warnings for AutoUpdate module in dev mode
37
+ - [Fix] Do not automatically reimport adapters in dev mode
38
+ - [Dev] Display module flags in AmaGDK inspector
39
+ - [Dev] Enable AudioModule by default
40
+ - [Dev] Standardize variable names
41
+
3
42
  ## [0.2.68 - 2024-07-08]
4
43
  - [Dev] Add IronSource setting to pause game during ad
5
44
  - [Fix] Support Android API Version 24 and below
@@ -51,7 +51,9 @@ namespace Amanotes.Editor
51
51
  FIREBASE_REMOTE_CONFIG,
52
52
  APPSFLYER,
53
53
  IRONSOURCE,
54
- REVENUECAT
54
+ MAX,
55
+ REVENUECAT,
56
+ SQLITE_ANALYTICS,
55
57
  };
56
58
 
57
59
  public void OnEnable()
@@ -235,26 +237,67 @@ namespace Amanotes.Editor
235
237
  // Debug.Log($"Content of version_info.tsv copied to clipboard!\n\n{tsv}\n\n");
236
238
  // }
237
239
 
240
+ void ShowAmaGDKContext()
241
+ {
242
+ var menu = new GenericMenu();
243
+ menu.AddDisabledItem(new GUIContent("AmaGDK"));
244
+ menu.AddSeparator("");
245
+ menu.AddItem(new GUIContent("Auto Init"), sdk.autoInit, () =>
246
+ {
247
+ sdk.autoInit = !sdk.autoInit;
248
+ EditorUtility.SetDirty(sdk);
249
+ });
250
+ menu.AddItem(new GUIContent("Clear Cache"), false, () =>
251
+ {
252
+ GDKFileUtils.ClearCacheData();
253
+ });
254
+ menu.AddSeparator("");
255
+ menu.AddItem(new GUIContent("Change Log"), false, () =>
256
+ {
257
+ Application.OpenURL("https://amagdk.notion.site/Change-Log-6dfd4b67d64f496bbd9eb04ccb4ef95a");
258
+ });
259
+ menu.AddItem(new GUIContent("Documentation"), false, () =>
260
+ {
261
+ Application.OpenURL("https://amagdk.notion.site/Ama-GDK-a73596617ab247b6a43c8f12a1581415?pvs=4");
262
+ });
263
+ menu.ShowAsContext();
264
+ UnityEvent.current.Use();
265
+ }
266
+
267
+ private static GUIContent hamburgerIcon;
268
+ private static readonly Lazy<Texture2D> logo = new Lazy<Texture2D>(() =>
269
+ {
270
+ const string logoBase64 =
271
+ "iVBORw0KGgoAAAANSUhEUgAAAEAAAABACAYAAAHdbkFIAAAAAXNSR0IArs4c6QAAALhlWElmTU0AKgAAAAgABQESAAMAAAABAAEAAAEaAAUAAAABAAAASgEbAAUAAAABAAAAUgEyAAIAAAAUAAAAWodpAAQAAAABAAAAbgAAAAAAAABIAAAAAQAAAEgAAAABMjAyNDowNzoxMCAxMjoyOTowMQAABJAEAAIAAAAUAAAApKABAAMAAAABAAEAAKACAAQAAAABAAAAQKADAAQAAAABAAAAQAAAAAAyMDI0OjA3OjEwIDEyOjA3OjQ4APsHu7YAAAAJcEhZcwAACxMAAAsTAQCanBgAAAlZaVRYdFhNTDpjb20uYWRvYmUueG1wAAAAAAA8eDp4bXBtZXRhIHhtbG5zOng9ImFkb2JlOm5zOm1ldGEvIiB4OnhtcHRrPSJYTVAgQ29yZSA2LjAuMCI+CiAgIDxyZGY6UkRGIHhtbG5zOnJkZj0iaHR0cDovL3d3dy53My5vcmcvMTk5OS8wMi8yMi1yZGYtc3ludGF4LW5zIyI+CiAgICAgIDxyZGY6RGVzY3JpcHRpb24gcmRmOmFib3V0PSIiCiAgICAgICAgICAgIHhtbG5zOmRjPSJodHRwOi8vcHVybC5vcmcvZGMvZWxlbWVudHMvMS4xLyIKICAgICAgICAgICAgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIgogICAgICAgICAgICB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIKICAgICAgICAgICAgeG1sbnM6c3RFdnQ9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZUV2ZW50IyIKICAgICAgICAgICAgeG1sbnM6cGhvdG9zaG9wPSJodHRwOi8vbnMuYWRvYmUuY29tL3Bob3Rvc2hvcC8xLjAvIgogICAgICAgICAgICB4bWxuczp0aWZmPSJodHRwOi8vbnMuYWRvYmUuY29tL3RpZmYvMS4wLyI+CiAgICAgICAgIDxkYzpmb3JtYXQ+aW1hZ2UvcG5nPC9kYzpmb3JtYXQ+CiAgICAgICAgIDx4bXA6TW9kaWZ5RGF0ZT4yMDI0LTA3LTEwVDEyOjI5OjAxKzA3OjAwPC94bXA6TW9kaWZ5RGF0ZT4KICAgICAgICAgPHhtcDpDcmVhdGVEYXRlPjIwMjQtMDctMTBUMTI6MDc6NDgrMDc6MDA8L3htcDpDcmVhdGVEYXRlPgogICAgICAgICA8eG1wOk1ldGFkYXRhRGF0ZT4yMDI0LTA3LTEwVDEyOjI5OjAxKzA3OjAwPC94bXA6TWV0YWRhdGFEYXRlPgogICAgICAgICA8eG1wTU06SGlzdG9yeT4KICAgICAgICAgICAgPHJkZjpTZXE+CiAgICAgICAgICAgICAgIDxyZGY6bGkgcmRmOnBhcnNlVHlwZT0iUmVzb3VyY2UiPgogICAgICAgICAgICAgICAgICA8c3RFdnQ6c29mdHdhcmVBZ2VudD5BZG9iZSBQaG90b3Nob3AgMjIuNCAoTWFjaW50b3NoKTwvc3RFdnQ6c29mdHdhcmVBZ2VudD4KICAgICAgICAgICAgICAgICAgPHN0RXZ0OmNoYW5nZWQ+Lzwvc3RFdnQ6Y2hhbmdlZD4KICAgICAgICAgICAgICAgICAgPHN0RXZ0OndoZW4+MjAyNC0wNy0xMFQxMjoxOTowOCswNzowMDwvc3RFdnQ6d2hlbj4KICAgICAgICAgICAgICAgICAgPHN0RXZ0Omluc3RhbmNlSUQ+eG1wLmlpZDpiM2Y2ZDQ5My1iYTI4LTQwZGQtODUxMC0yNzJlYzYyMjM3Nzg8L3N0RXZ0Omluc3RhbmNlSUQ+CiAgICAgICAgICAgICAgICAgIDxzdEV2dDphY3Rpb24+c2F2ZWQ8L3N0RXZ0OmFjdGlvbj4KICAgICAgICAgICAgICAgPC9yZGY6bGk+CiAgICAgICAgICAgICAgIDxyZGY6bGkgcmRmOnBhcnNlVHlwZT0iUmVzb3VyY2UiPgogICAgICAgICAgICAgICAgICA8c3RFdnQ6c29mdHdhcmVBZ2VudD5BZG9iZSBQaG90b3Nob3AgMjIuNCAoTWFjaW50b3NoKTwvc3RFdnQ6c29mdHdhcmVBZ2VudD4KICAgICAgICAgICAgICAgICAgPHN0RXZ0OmNoYW5nZWQ+Lzwvc3RFdnQ6Y2hhbmdlZD4KICAgICAgICAgICAgICAgICAgPHN0RXZ0OndoZW4+MjAyNC0wNy0xMFQxMjoyOTowMSswNzowMDwvc3RFdnQ6d2hlbj4KICAgICAgICAgICAgICAgICAgPHN0RXZ0Omluc3RhbmNlSUQ+eG1wLmlpZDo0ZjFkOWU5NS1hZjdjLTQzZDQtYTczYS1kODZhMTI4MDI3YjE8L3N0RXZ0Omluc3RhbmNlSUQ+CiAgICAgICAgICAgICAgICAgIDxzdEV2dDphY3Rpb24+c2F2ZWQ8L3N0RXZ0OmFjdGlvbj4KICAgICAgICAgICAgICAgPC9yZGY6bGk+CiAgICAgICAgICAgIDwvcmRmOlNlcT4KICAgICAgICAgPC94bXBNTTpIaXN0b3J5PgogICAgICAgICA8eG1wTU06T3JpZ2luYWxEb2N1bWVudElEPnhtcC5kaWQ6YjNmNmQ0OTMtYmEyOC00MGRkLTg1MTAtMjcyZWM2MjIzNzc4PC94bXBNTTpPcmlnaW5hbERvY3VtZW50SUQ+CiAgICAgICAgIDx4bXBNTTpEb2N1bWVudElEPnhtcC5kaWQ6YjNmNmQ0OTMtYmEyOC00MGRkLTg1MTAtMjcyZWM2MjIzNzc4PC94bXBNTTpEb2N1bWVudElEPgogICAgICAgICA8eG1wTU06SW5zdGFuY2VJRD54bXAuaWlkOjRmMWQ5ZTk1LWFmN2MtNDNkNC1hNzNhLWQ4NmExMjgwMjdiMTwveG1wTU06SW5zdGFuY2VJRD4KICAgICAgICAgPHBob3Rvc2hvcDpJQ0NQcm9maWxlPnNSR0IgSUVDNjE5NjYtMi4xPC9waG90b3Nob3A6SUNDUHJvZmlsZT4KICAgICAgICAgPHBob3Rvc2hvcDpDb2xvck1vZGU+MzwvcGhvdG9zaG9wOkNvbG9yTW9kZT4KICAgICAgICAgPHRpZmY6T3JpZW50YXRpb24+MTwvdGlmZjpPcmllbnRhdGlvbj4KICAgICAgICAgPHRpZmY6WFJlc29sdXRpb24+NzI8L3RpZmY6WFJlc29sdXRpb24+CiAgICAgICAgIDx0aWZmOllSZXNvbHV0aW9uPjcyPC90aWZmOllSZXNvbHV0aW9uPgogICAgICA8L3JkZjpEZXNjcmlwdGlvbj4KICAgPC9yZGY6UkRGPgo8L3g6eG1wbWV0YT4KFOd9IgAAF2JJREFUeAHtOwl0lcXVd+Zb3paXlxASAQElgEDC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";
272
+ var tex = new Texture2D(2, 2, TextureFormat.RGBA32, false, true);
273
+ tex.LoadImage(Convert.FromBase64String(logoBase64), true);
274
+ return tex;
275
+ });
276
+
277
+ [NonSerialized] private static GUIContent bannerTitle;
278
+
238
279
  void DrawGUI_AmaGDKBanner()
239
280
  {
240
- AmaGUI.SectionLabel($"<b>AmaGDK</b> <size=12><color=gray>v{AmaGDK.VERSION}</color></size>");
281
+ bannerTitle ??= new GUIContent()
282
+ {
283
+ image = logo.Value,
284
+ text = $"<b>AmaGDK</b> <size=12><color=gray>v{AmaGDK.VERSION}</color></size>"
285
+ };
286
+ AmaGUI.SectionLabel(bannerTitle);
241
287
  var rect = GUILayoutUtility.GetLastRect();
242
- if (UnityEvent.current.isMouse && UnityEvent.current.button == 1 && rect.Contains(UnityEvent.current.mousePosition))
288
+ var btnRect = rect;
289
+
290
+ // btnRect.x = 4f;
291
+ // btnRect.width = 24f; //btnRect.xMax -
292
+ // btnRect.yMin = btnRect.yMax - 32f;
293
+
294
+ btnRect.xMin = btnRect.xMax - 24f;
295
+ btnRect.yMin = btnRect.yMax - 32f;
296
+
297
+ if (hamburgerIcon == null) hamburgerIcon = EditorGUIUtility.IconContent("d__Menu@2X");
298
+ if (GUI.Button(btnRect, hamburgerIcon.image, EditorStyles.label))
243
299
  {
244
- var menu = new GenericMenu();
245
- menu.AddDisabledItem(new GUIContent("AmaGDK"));
246
- menu.AddSeparator("");
247
- menu.AddItem(new GUIContent("Auto Init"), sdk.autoInit, () =>
248
- {
249
- sdk.autoInit = !sdk.autoInit;
250
- EditorUtility.SetDirty(sdk);
251
- });
252
- menu.AddItem(new GUIContent("Clear Cache"), false, () =>
253
- {
254
- GDKFileUtils.ClearCacheData();
255
- });
256
- menu.ShowAsContext();
257
- UnityEvent.current.Use();
300
+ ShowAmaGDKContext();
258
301
  }
259
302
  }
260
303
 
@@ -306,8 +349,10 @@ namespace Amanotes.Editor
306
349
 
307
350
  configSO = new SerializedObject(configAsset);
308
351
  configSO.Update();
309
- DrawProperty(configSO, "common");
310
- EditorGUILayout.ObjectField("Config", configAsset, typeof(ScriptableObject), false);
352
+ DrawProperty(configSO, "common", true);
353
+ DrawProperty(configSO, "enableAudioModule", false);
354
+ DrawProperty(configSO, "enableServerTime", false);
355
+ DrawProperty(configSO, "enableGeoLocation", false);
311
356
  GUILayout.Space(8f);
312
357
  for (var i = 0; i < allAdapters.Count; i++)
313
358
  {
@@ -318,6 +363,7 @@ namespace Amanotes.Editor
318
363
 
319
364
  AmaGUI.Foldout("Adapters", ref showAdapterInstaller, DrawGUI_AdapterList);
320
365
  AmaGUI.Foldout("Extras", ref showExtra, DrawGUI_ExtraList);
366
+ EditorGUILayout.ObjectField("Config", configAsset, typeof(ScriptableObject), false);
321
367
  Profiler.EndSample();
322
368
  }
323
369
 
@@ -401,7 +447,7 @@ namespace Amanotes.Editor
401
447
 
402
448
  }, () =>
403
449
  {
404
- if (icon != null)
450
+ if (icon != null && adapter != null && adapter.enabled)
405
451
  {
406
452
  Rect rect = GUILayoutUtility.GetRect(6f, 6f, 16f, 16f);
407
453
  rect.xMin -= 10f;
@@ -487,7 +533,7 @@ namespace Amanotes.Editor
487
533
  EditorGUI.BeginDisabledGroup(!adapter.enabled);
488
534
  EditorGUIUtility.labelWidth += 70;
489
535
  {
490
- DrawProperty(configSO, adapterId);
536
+ DrawProperty(configSO, adapterId, true);
491
537
  GUILayout.Space(8f);
492
538
 
493
539
  if (adapterId == IRONSOURCE)
@@ -515,11 +561,20 @@ namespace Amanotes.Editor
515
561
  EditorGUI.EndDisabledGroup();
516
562
  }
517
563
 
518
- private static void DrawProperty(SerializedObject so, string propertyField)
564
+ private static void DrawProperty(SerializedObject so, string propertyField, bool childrenOnly)
519
565
  {
520
566
  SerializedProperty property = so.FindProperty(propertyField);
521
- if (property == null) return;
567
+ if (property == null)
568
+ {
569
+ EditorGUILayout.HelpBox($"Property not found <{propertyField}>!", MessageType.Warning);
570
+ return;
571
+ }
522
572
 
573
+ if (!childrenOnly)
574
+ {
575
+ EditorGUILayout.PropertyField(property);
576
+ }
577
+
523
578
  string basePath = property.propertyPath;
524
579
  var first = true;
525
580
  while (property.NextVisible(first))
@@ -7,20 +7,21 @@ namespace Amanotes.Editor
7
7
  {
8
8
  public static Dictionary<string, object> GetThirdPartyVersions()
9
9
  {
10
- Dictionary<string, object> dicThirdParty = new Dictionary<string, object>();
11
- List<GDKModule> listModule = VersionHelper.LoadLocalModuleInfo();
12
- foreach (var module in listModule)
10
+ var dicThirdParty = new Dictionary<string, object>
13
11
  {
14
- VersionHelper.UpdateListVersions(module);
15
- dicThirdParty.Add(module.id, ExtractVersion.ThirdParty(module.id));
16
- }
17
-
18
- dicThirdParty["Firebase"] = AmaGDKExtra.FirebaseVersion();
19
- dicThirdParty["AmaGDK"] = AmaGDK.VERSION;
20
- dicThirdParty["AdQuality"] = ExtractVersion.IronSourceAdQuality();
21
- dicThirdParty["AdRevenue"] = ExtractVersion.AppsFlyerAdRevenue();
22
- dicThirdParty["ACM"] = ExtractVersion.Acm();
23
- dicThirdParty["FacebookSDK"] = ExtractVersion.Facebook();
12
+ ["FirebaseAnalytics"] = ExtractVersion.FirebaseAnalytics(),
13
+ ["FirebaseRemoteConfig"] = ExtractVersion.FirebaseRemoteConfig(),
14
+ ["AppsFlyer"] = ExtractVersion.AppsFlyer(),
15
+ ["IronSource"] = ExtractVersion.IronSource(),
16
+ ["Max"] = ExtractVersion.Max(),
17
+ ["RevenueCat"] = ExtractVersion.RevenueCat(),
18
+ ["Firebase"] = AmaGDKExtra.FirebaseVersion(),
19
+ ["AmaGDK"] = AmaGDK.VERSION,
20
+ ["AdQuality"] = ExtractVersion.IronSourceAdQuality(),
21
+ ["AdRevenue"] = ExtractVersion.AppsFlyerAdRevenue(),
22
+ ["ACM"] = ExtractVersion.Acm(),
23
+ ["FacebookSDK"] = ExtractVersion.Facebook()
24
+ };
24
25
 
25
26
  return dicThirdParty;
26
27
  }
@@ -23,11 +23,23 @@ namespace Amanotes.Editor
23
23
  // Extra packages
24
24
  { "DiskSpacePopup", $"{Res.EXTRA_PATH}CheckDiskSpace.unitypackage" },
25
25
  { "ForceUpdatePopup", $"{Res.EXTRA_PATH}ForceUpdate.unitypackage" },
26
- { "GoogleCMPSupport", $"{Res.EXTRA_PATH}GoogleCMP.unitypackage" },
26
+ { "Consent.ATTSupport", $"{Res.EXTRA_PATH}Consent.unitypackage" },
27
+ { "Consent.GoogleCMPSupport", $"{Res.EXTRA_PATH}Consent.unitypackage" },
27
28
  { "AndroidPostProcessor", $"{Res.EXTRA_PATH}PostProcessor.unitypackage" }
28
29
  };
29
30
 
30
31
  private static void OnPostprocessAllAssets(string[] importedAssets, string[] deletedAssets, string[] movedAssets, string[] movedFromAssetPaths)
32
+ {
33
+ #if AMAGDK_DEV
34
+ return;
35
+ #endif
36
+
37
+ #pragma warning disable CS0162
38
+ CheckImportedAssets(importedAssets);
39
+ #pragma warning restore CS0162
40
+ }
41
+
42
+ private static void CheckImportedAssets(string[] importedAssets)
31
43
  {
32
44
  if (importedAssets.Length == 0) return;
33
45
  // Debug.LogWarning($"importedAssets: {string.Join("\n", importedAssets)}");
@@ -53,6 +65,7 @@ namespace Amanotes.Editor
53
65
  continue;
54
66
  }
55
67
 
68
+ if (packages.Contains(kvp.Value)) continue;
56
69
  packages.Add(kvp.Value);
57
70
  }
58
71
 
@@ -0,0 +1,372 @@
1
+ using System;
2
+ using System.Collections.Generic;
3
+ using System.IO;
4
+ using System.Linq;
5
+ using UnityEngine;
6
+ using UnityEditor;
7
+ using UnityEngine.Serialization;
8
+ using UnityObject = UnityEngine.Object;
9
+
10
+ namespace Amanotes.Core
11
+ {
12
+ [CreateAssetMenu(fileName = "GDKSymbolDefine", menuName = "Ama GDK/GDK Symbol Define", order = 100)]
13
+ internal partial class GDKSymbolDefine : ScriptableObject
14
+ {
15
+ private static readonly string cscRspFilePath = "Assets/csc.rsp";
16
+ public List<SymbolInfo> symbols = new List<SymbolInfo>();
17
+ public LoggerConfig loggerConfig = new LoggerConfig();
18
+
19
+
20
+ [ContextMenu("Read")]
21
+ public void Read()
22
+ {
23
+ if (!File.Exists(cscRspFilePath)) return;
24
+
25
+ var enabledSymbols = new HashSet<string>(ReadCSC());
26
+ AddSymbol(enabledSymbols, true);
27
+ SetEnableSymbols(enabledSymbols, true);
28
+ }
29
+
30
+ private void Write()
31
+ {
32
+ var list = symbols
33
+ .Union(this.loggerConfig.tags)
34
+ .Where(item=>item.enabled)
35
+ .Select(item => item.name)
36
+ .Distinct()
37
+ .ToArray();
38
+
39
+ string content = list.Length > 0 ? $"-define:{string.Join(";", list)}" : string.Empty;
40
+ File.WriteAllText(cscRspFilePath, content);
41
+ AssetDatabase.Refresh();
42
+ }
43
+
44
+ [ContextMenu("Apply")]
45
+ public void Apply()
46
+ {
47
+ Write();
48
+ loggerConfig.GenerateLogger();
49
+
50
+ #if UNITY_EDITOR
51
+ EditorUtility.SetDirty((this));
52
+ AssetDatabase.Refresh();
53
+ #endif
54
+ }
55
+
56
+ private void SetEnableSymbols(HashSet<string> enabledSymbols, bool enabled)
57
+ {
58
+ for (var i = 0; i < symbols.Count; i++)
59
+ {
60
+ symbols[i].enabled = enabledSymbols.Contains(symbols[i].name);
61
+ }
62
+
63
+ for (var i = 0; i < loggerConfig.tags.Count; i++)
64
+ {
65
+ loggerConfig.tags[i].enabled = enabledSymbols.Contains(loggerConfig.tags[i].name);
66
+ }
67
+ }
68
+
69
+ private void AddSymbol(IEnumerable<string> newSymbols, bool enabled)
70
+ {
71
+ var dict = symbols
72
+ .Union(loggerConfig.tags)
73
+ .Distinct()
74
+ .ToDictionary(item => item.name);
75
+
76
+ foreach (string symbol in newSymbols)
77
+ {
78
+ if (dict.TryGetValue(symbol, out var info)) continue;
79
+ info = new SymbolInfo() { name = symbol, enabled = enabled };
80
+ symbols.Add(info);
81
+ }
82
+
83
+ #if UNITY_EDITOR
84
+ EditorUtility.SetDirty(this);
85
+ #endif
86
+ }
87
+
88
+ private List<string> ReadCSC()
89
+ {
90
+ var result = new List<string>();
91
+ if (!File.Exists(cscRspFilePath)) return result;
92
+ string[] rspLines = File.ReadAllLines(cscRspFilePath);
93
+
94
+ foreach (string line in rspLines)
95
+ {
96
+ string line2 = line.Trim();
97
+ if (!line2.StartsWith("-define:")) continue;
98
+
99
+ // Extract existing symbols from -define:
100
+ result.AddRange(line2.Substring(8).Split(';'));
101
+ }
102
+
103
+ return result;
104
+ }
105
+ }
106
+
107
+ internal partial class GDKSymbolDefine
108
+ {
109
+ [Serializable] internal class SymbolInfo
110
+ {
111
+ [FormerlySerializedAs("symbol")] public string name;
112
+ public bool enabled;
113
+ }
114
+
115
+ [Serializable] internal class LoggerConfig
116
+ {
117
+ public bool enabled;
118
+ public bool forceCleanUp;
119
+ public UnityObject codeGenerateFolder;
120
+ public string codeGeneratePath
121
+ {
122
+ get
123
+ {
124
+ string path = AssetDatabase.GetAssetPath(codeGenerateFolder);
125
+ if (AssetDatabase.IsValidFolder(path)) return path;
126
+
127
+ var defaultPath = "Assets/AmaGDK/LogV2";
128
+ var asset = AssetDatabase.LoadAssetAtPath<UnityObject>(defaultPath);
129
+ if (asset != null) codeGenerateFolder = asset;
130
+ return defaultPath;
131
+ }
132
+ }
133
+ public string className = "LogV2";
134
+
135
+ [HideInInspector][SerializeField] private string classTemplate = $@"using Debug = UnityEngine.Debug;
136
+ using UnityObject = UnityEngine.Object;
137
+
138
+ public partial class $$CLASS_NAME$$
139
+ {{
140
+ private static void Log(string tag, string message, UnityObject context)
141
+ {{
142
+ Debug.Log($""[{{tag}}] {{message}}"", context);
143
+ }}
144
+
145
+ private static void LogWarning(string tag, string message, UnityObject context)
146
+ {{
147
+ Debug.LogWarning($""[{{tag}}] {{message}}"", context);
148
+ }}
149
+
150
+ private static void LogError(string tag, string message, UnityObject context)
151
+ {{
152
+ Debug.LogError($""[{{tag}}] {{message}}"", context);
153
+ }}
154
+ }}";
155
+
156
+ public List<SymbolInfo> tags = new List<SymbolInfo>();
157
+
158
+ public void GenerateLogger()
159
+ {
160
+ if (!enabled) return;
161
+
162
+ bool hasFolder = Directory.Exists(codeGeneratePath);
163
+ if (hasFolder)
164
+ {
165
+ if (forceCleanUp)
166
+ {
167
+ Directory.Delete(codeGeneratePath, true);
168
+ hasFolder = false;
169
+ }
170
+ }
171
+
172
+ if (!hasFolder) Directory.CreateDirectory(codeGeneratePath);
173
+
174
+ // Generate main logger class
175
+ string filePath = Path.Combine(codeGeneratePath, $"{className}.cs");
176
+ string classContent;
177
+
178
+ if (!File.Exists(filePath))
179
+ {
180
+ classContent = classTemplate.Replace("$$CLASS_NAME$$", className);
181
+ File.WriteAllText(filePath, classContent);
182
+ AssetDatabase.ImportAsset(filePath);
183
+ }
184
+
185
+ // Generate derived logger classes
186
+ for (var i = 0; i < tags.Count; i++)
187
+ {
188
+ string tag = tags[i].name;
189
+ classContent = GenerateTagClassContent(tag);
190
+ filePath = Path.Combine(codeGeneratePath, $"{className}.{tag}.cs");
191
+ File.WriteAllText(filePath, classContent);
192
+ AssetDatabase.ImportAsset(filePath);
193
+ }
194
+ }
195
+
196
+ private string GenerateTagClassContent(string tag)
197
+ {
198
+ return $@"using System.Diagnostics;
199
+ using UnityObject = UnityEngine.Object;
200
+
201
+ public partial class {className}
202
+ {{
203
+ public static class {tag}
204
+ {{
205
+ [Conditional(nameof({tag}))]
206
+ public static void Log(string message, UnityObject context = null) => {className}.Log(nameof({tag}), message, context);
207
+
208
+ [Conditional(nameof({tag}))]
209
+ public static void LogWarning(string message, UnityObject context = null) => {className}.LogWarning(nameof({tag}),message, context);
210
+
211
+ [Conditional(nameof({tag}))]
212
+ public static void LogError(string message, UnityObject context = null) => {className}.LogError(nameof({tag}), message, context);
213
+ }}
214
+ }}";
215
+ }
216
+ }
217
+ }
218
+
219
+
220
+ // INSPECTOR
221
+
222
+ [CustomPropertyDrawer(typeof(GDKSymbolDefine.SymbolInfo))]
223
+ internal class SymbolInfoDrawer : PropertyDrawer
224
+ {
225
+ public override void OnGUI(Rect position, SerializedProperty property, GUIContent label)
226
+ {
227
+ // Begin property drawing
228
+ EditorGUI.BeginProperty(position, label, property);
229
+
230
+ // Calculate rects
231
+ var toggleRect = new Rect(position.x, position.y, 20, position.height);
232
+ var labelRect = new Rect(position.x + 25, position.y, position.width - 25, position.height);
233
+
234
+ // Draw fields
235
+ SerializedProperty symbolProperty = property.FindPropertyRelative("name");
236
+ SerializedProperty enabledProperty = property.FindPropertyRelative("enabled");
237
+
238
+ // Draw the enabled toggle
239
+ enabledProperty.boolValue = EditorGUI.Toggle(toggleRect, enabledProperty.boolValue);
240
+
241
+ // Draw the symbol name field
242
+ symbolProperty.stringValue = EditorGUI.TextField(labelRect, symbolProperty.stringValue, EditorStyles.label);
243
+
244
+ // End property drawing
245
+ EditorGUI.EndProperty();
246
+ }
247
+ }
248
+
249
+ [CustomEditor(typeof(GDKSymbolDefine))]
250
+ public class GDKSymbolDefineEditor : UnityEditor.Editor
251
+ {
252
+ private SerializedProperty symbolsProp;
253
+ private SerializedProperty loggerConfigProp;
254
+ private int selectedTab = 0;
255
+ private GDKSymbolDefine define;
256
+
257
+
258
+ private readonly GUIContent[] tabTitles = new GUIContent[]
259
+ {
260
+ new GUIContent("Symbols"),
261
+ new GUIContent("Logger Config")
262
+ };
263
+
264
+ private void OnEnable()
265
+ {
266
+ define = (GDKSymbolDefine)target;
267
+ symbolsProp = serializedObject.FindProperty("symbols");
268
+ loggerConfigProp = serializedObject.FindProperty("loggerConfig");
269
+ }
270
+
271
+ public override void OnInspectorGUI()
272
+ {
273
+ if (Application.isPlaying || EditorApplication.isPlayingOrWillChangePlaymode)
274
+ {
275
+ EditorGUILayout.HelpBox("Disabled in play mode!", MessageType.Info);
276
+ Repaint();
277
+ return;
278
+ }
279
+
280
+ if (EditorApplication.isUpdating)
281
+ {
282
+ EditorGUILayout.HelpBox("Please wait for Unity Editor to finish importing!", MessageType.Info);
283
+ Repaint();
284
+ return;
285
+ }
286
+
287
+ if (EditorApplication.isCompiling)
288
+ {
289
+ EditorGUILayout.HelpBox("Please wait for Unity Editor to finish compiling!", MessageType.Info);
290
+ Repaint();
291
+ return;
292
+ }
293
+
294
+ if (define == null) return;
295
+
296
+ serializedObject.Update();
297
+ selectedTab = GUILayout.Toolbar(selectedTab, tabTitles, GUILayout.Height(32f));
298
+
299
+ switch (selectedTab)
300
+ {
301
+ case 0:
302
+ DrawSymbolsTab();
303
+ break;
304
+ case 1:
305
+ DrawLoggerConfigTab();
306
+ break;
307
+ default:
308
+ DrawSymbolsTab();
309
+ break;
310
+ }
311
+
312
+ GUILayout.Space(24f);
313
+ if (GUILayout.Button("Apply", GUILayout.Height(30f)))
314
+ {
315
+ define.Apply();
316
+ Repaint();
317
+ }
318
+
319
+ serializedObject.ApplyModifiedProperties();
320
+ }
321
+
322
+ private void DrawSymbolsTab()
323
+ {
324
+ EditorGUILayout.PropertyField(symbolsProp, new GUIContent("DEFINE SYMBOLS"), true);
325
+ if (define.loggerConfig.enabled)
326
+ {
327
+ EditorGUILayout.PropertyField(loggerConfigProp.FindPropertyRelative("tags"), new GUIContent("LOGGER TAGS"), true);
328
+ }
329
+ }
330
+
331
+ private static bool showTemplate = false;
332
+ private void DrawLoggerConfigTab()
333
+ {
334
+ // EditorGUILayout.PropertyField(loggerConfigProp, GUIContent.none, true);
335
+ DrawProperty(serializedObject, "loggerConfig", true);
336
+ showTemplate = GUILayout.Toggle(showTemplate, "Logger class template", EditorStyles.foldout);
337
+ if (showTemplate)
338
+ {
339
+ var prop = serializedObject
340
+ .FindProperty("loggerConfig")
341
+ .FindPropertyRelative("classTemplate");
342
+ EditorGUILayout.PropertyField(prop, GUIContent.none, false, GUILayout.Height(16 * 20));
343
+ }
344
+ }
345
+
346
+ private static void DrawProperty(SerializedObject so, string propertyField, bool childrenOnly)
347
+ {
348
+ SerializedProperty property = so.FindProperty(propertyField);
349
+ if (property == null)
350
+ {
351
+ EditorGUILayout.HelpBox($"Property not found <{propertyField}>!", MessageType.Warning);
352
+ return;
353
+ }
354
+
355
+ if (!childrenOnly)
356
+ {
357
+ EditorGUILayout.PropertyField(property);
358
+ }
359
+
360
+ string basePath = property.propertyPath;
361
+ var first = true;
362
+ while (property.NextVisible(first))
363
+ {
364
+ first = false;
365
+ if (!property.propertyPath.Contains(basePath)) break;
366
+ EditorGUILayout.PropertyField(property);
367
+ }
368
+
369
+ so.ApplyModifiedProperties();
370
+ }
371
+ }
372
+ }
@@ -1,5 +1,5 @@
1
1
  fileFormatVersion: 2
2
- guid: 44c77ba58d5d742d68829b3d5b04a3bf
2
+ guid: ac69671f3a58f434a83023380f963e8b
3
3
  MonoImporter:
4
4
  externalObjects: {}
5
5
  serializedVersion: 2