` to the command above.
+
+## Testing
+
+You can run the tests by running the following from your shell (Linux / OSX):
+
+```shell
+./gradlew test
+```
+
+or Windows:
+
+```shell
+./gradlew.bat test
+```
+
+The following properties can be set to narrow down the tests to run or change
+the test run behavior.
+
+* `INTERACTIVE_MODE_TESTS_ENABLED` - Default to `1`. Set to `1` to enable
+ interactive mode tests, which requires GPU on the machine. Otherwise, only
+ run tests in the batch mode.
+* `INCLUDE_TEST_TYPES` - Default to empty string, which means to include every
+ type of the test. To narrow down the types of test to run, set this
+ properties with a list of case-insensitive type strings separated by comma.
+ For instance, `-PINCLUDE_TEST_TYPES="Python,NUnit"` means to include only
+ Python tests and NUnit tests. See `TestTypeEnum` in `build.gradle` for
+ available options.
+* `EXCLUDE_TEST_TYPES` - Default to empty string, which means to exclude none.
+ To add types of tests to exclude, set this properties with a list of
+ case-insensitive type strings separated by comma. For instance,
+ `-PEXCLUDE_TEST_TYPES="Python,NUnit"` means to exclude Python tests and
+ NUnit tests. See `TestTypeEnum` in `build.gradle` for available options.
+* `INCLUDE_TEST_MODULES` - Default to empty string, which means to include the
+ tests for every modules. To narrow down modules to test, set this properties
+ with a list of case-insensitive module strings separated by comma. For
+ instance, `-PINCLUDE_TEST_MODULES="Tool,AndroidResolver"` means to run tests
+ for tools and Android Resolver only. See `TestModuleEnum` in `build.gradle`
+ for available options.
+* `EXCLUDE_TEST_MODULES` - Default to empty string, which means to exclude
+ none. To add modules to exclude, set this properties with a list of
+ case-insensitive module strings separated by comma. For instance,
+ `-PEXCLUDE_TEST_MODULES="Tool,AndroidResolver"` means to run tests for any
+ modules other than tools and Android Resolver. See `TestModuleEnum` in
+ `build.gradle` for available options.
+* `EXCLUDE_TESTS` - Default to empty string, which means to exclude none. To
+ add tests to exclude, set this properties with a list of case-insensitive
+ test names separated by comma. For instance,
+ `-PEXCLUDE_TESTS="testGenGuids,testDownloadArtifacts"` means to run tests
+ except the tests with name of `testGenGuids` and `testDownloadArtifacts`.
+* `CONTINUE_ON_FAIL_FOR_TESTS_ENABLED` - Default to `1`. Set to `1` to
+ continue running the next test when the current one fails. Otherwise, the
+ build script stops whenever any test fails.
+
+For instance, by running the following command, it only runs the Unity
+integration tests that does not requires GPU, but exclude tests for Android
+Resolver module and iOS Resolver module.
+
+```shell
+./gradlew test \
+ -PINTERACTIVE_MODE_TESTS_ENABLED=0 \
+ -PINCLUDE_TEST_TYPES="Integration" \
+ -PEXCLUDE_TEST_MODULES="AndroidResolver,iOSResolver"
+```
+
+## Releasing
+
+Each time a new build of this plugin is checked into the source tree you need to
+do the following:
+
+* Bump the plugin version variable `pluginVersion` in `build.gradle`
+* Update `CHANGELOG.md` with the new version number and changes included in
+ the release.
+* Build the release using `./gradlew release` which performs the following:
+ * Updates `external-dependency-manager-*.unitypackage`
+ * Copies the unpacked plugin to the `exploded` directory.
+ * Updates template metadata files in the `plugin` directory. The GUIDs of
+ all asset metadata is modified due to the version number change. Each
+ file within the plugin is versioned to allow multiple versions of the
+ plugin to be imported into a Unity project which allows the most recent
+ version to be activated by the Version Handler component.
+* Create release commit using `./gradlew gitCreateReleaseCommit` which
+ performs `git commit -a -m "description from CHANGELOG.md"`
+* Once the release commit is merge, tag the release using `./gradlew
+ gitTagRelease` which performs the following:
+ * `git tag -a pluginVersion -m "version RELEASE"` to tag the release.
+* Update tags on remote branch using `git push --tag REMOTE HEAD:master`
diff --git a/Assets/ExternalDependencyManager/Editor/README.md.meta b/Assets/ExternalDependencyManager/Editor/README.md.meta
new file mode 100644
index 0000000..4887a04
--- /dev/null
+++ b/Assets/ExternalDependencyManager/Editor/README.md.meta
@@ -0,0 +1,12 @@
+fileFormatVersion: 2
+guid: 77919e84cef8419ab4b725fc16e83d52
+labels:
+- gvh
+- gvh_version-1.2.186
+- gvhp_exportpath-ExternalDependencyManager/Editor/README.md
+timeCreated: 1584567712
+licenseType: Pro
+TextScriptImporter:
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/ExternalDependencyManager/Editor/external-dependency-manager_version-1.2.177_manifest.txt b/Assets/ExternalDependencyManager/Editor/external-dependency-manager_version-1.2.177_manifest.txt
new file mode 100644
index 0000000..5aac0e8
--- /dev/null
+++ b/Assets/ExternalDependencyManager/Editor/external-dependency-manager_version-1.2.177_manifest.txt
@@ -0,0 +1,13 @@
+Assets/ExternalDependencyManager/Editor/1.2.177/Google.IOSResolver.dll
+Assets/ExternalDependencyManager/Editor/1.2.177/Google.IOSResolver.dll.mdb
+Assets/ExternalDependencyManager/Editor/1.2.177/Google.JarResolver.dll
+Assets/ExternalDependencyManager/Editor/1.2.177/Google.JarResolver.dll.mdb
+Assets/ExternalDependencyManager/Editor/1.2.177/Google.PackageManagerResolver.dll
+Assets/ExternalDependencyManager/Editor/1.2.177/Google.PackageManagerResolver.dll.mdb
+Assets/ExternalDependencyManager/Editor/1.2.177/Google.VersionHandlerImpl.dll
+Assets/ExternalDependencyManager/Editor/1.2.177/Google.VersionHandlerImpl.dll.mdb
+Assets/ExternalDependencyManager/Editor/CHANGELOG.md
+Assets/ExternalDependencyManager/Editor/Google.VersionHandler.dll
+Assets/ExternalDependencyManager/Editor/Google.VersionHandler.dll.mdb
+Assets/ExternalDependencyManager/Editor/LICENSE
+Assets/ExternalDependencyManager/Editor/README.md
diff --git a/Assets/ExternalDependencyManager/Editor/external-dependency-manager_version-1.2.177_manifest.txt.meta b/Assets/ExternalDependencyManager/Editor/external-dependency-manager_version-1.2.177_manifest.txt.meta
new file mode 100644
index 0000000..ebc018d
--- /dev/null
+++ b/Assets/ExternalDependencyManager/Editor/external-dependency-manager_version-1.2.177_manifest.txt.meta
@@ -0,0 +1,7 @@
+fileFormatVersion: 2
+guid: 5a60495da67554141958dc13a662ea1b
+TextScriptImporter:
+ externalObjects: {}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/ExternalDependencyManager/Editor/external-dependency-manager_version-1.2.186_manifest.txt b/Assets/ExternalDependencyManager/Editor/external-dependency-manager_version-1.2.186_manifest.txt
new file mode 100644
index 0000000..81c97ed
--- /dev/null
+++ b/Assets/ExternalDependencyManager/Editor/external-dependency-manager_version-1.2.186_manifest.txt
@@ -0,0 +1,13 @@
+Assets/ExternalDependencyManager/Editor/1.2.186/Google.IOSResolver.dll
+Assets/ExternalDependencyManager/Editor/1.2.186/Google.IOSResolver.pdb
+Assets/ExternalDependencyManager/Editor/1.2.186/Google.JarResolver.dll
+Assets/ExternalDependencyManager/Editor/1.2.186/Google.JarResolver.pdb
+Assets/ExternalDependencyManager/Editor/1.2.186/Google.PackageManagerResolver.dll
+Assets/ExternalDependencyManager/Editor/1.2.186/Google.PackageManagerResolver.pdb
+Assets/ExternalDependencyManager/Editor/1.2.186/Google.VersionHandlerImpl.dll
+Assets/ExternalDependencyManager/Editor/1.2.186/Google.VersionHandlerImpl.pdb
+Assets/ExternalDependencyManager/Editor/CHANGELOG.md
+Assets/ExternalDependencyManager/Editor/Google.VersionHandler.dll
+Assets/ExternalDependencyManager/Editor/Google.VersionHandler.pdb
+Assets/ExternalDependencyManager/Editor/LICENSE
+Assets/ExternalDependencyManager/Editor/README.md
diff --git a/Assets/ExternalDependencyManager/Editor/external-dependency-manager_version-1.2.186_manifest.txt.meta b/Assets/ExternalDependencyManager/Editor/external-dependency-manager_version-1.2.186_manifest.txt.meta
new file mode 100644
index 0000000..dca3f95
--- /dev/null
+++ b/Assets/ExternalDependencyManager/Editor/external-dependency-manager_version-1.2.186_manifest.txt.meta
@@ -0,0 +1,15 @@
+fileFormatVersion: 2
+guid: c9a3138961c74d99b7046b783112fceb
+labels:
+- gvh
+- gvh_manifest
+- gvh_version-1.2.186
+- gvhp_exportpath-ExternalDependencyManager/Editor/external-dependency-manager_version-1.2.186_manifest.txt
+- gvhp_manifestname-0External Dependency Manager
+- gvhp_manifestname-play-services-resolver
+timeCreated: 1474401009
+licenseType: Pro
+TextScriptImporter:
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/Firebase.meta b/Assets/Firebase.meta
new file mode 100644
index 0000000..6d29d43
--- /dev/null
+++ b/Assets/Firebase.meta
@@ -0,0 +1,8 @@
+fileFormatVersion: 2
+guid: 3ec08b98a0bbe0e4982efbe3ee6c33ac
+folderAsset: yes
+DefaultImporter:
+ externalObjects: {}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/Firebase/Editor.meta b/Assets/Firebase/Editor.meta
new file mode 100644
index 0000000..afe521f
--- /dev/null
+++ b/Assets/Firebase/Editor.meta
@@ -0,0 +1,8 @@
+fileFormatVersion: 2
+guid: 8e8f7d71b39131a448de54c9ec6777b9
+folderAsset: yes
+DefaultImporter:
+ externalObjects: {}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/Firebase/Editor/AnalyticsDependencies.xml b/Assets/Firebase/Editor/AnalyticsDependencies.xml
new file mode 100644
index 0000000..0c07abe
--- /dev/null
+++ b/Assets/Firebase/Editor/AnalyticsDependencies.xml
@@ -0,0 +1,20 @@
+
+
+
+
+
+
+
+
+
+
+
+
+ Assets/Firebase/m2repository
+
+
+
+
diff --git a/Assets/Firebase/Editor/AnalyticsDependencies.xml.meta b/Assets/Firebase/Editor/AnalyticsDependencies.xml.meta
new file mode 100644
index 0000000..4afd953
--- /dev/null
+++ b/Assets/Firebase/Editor/AnalyticsDependencies.xml.meta
@@ -0,0 +1,11 @@
+fileFormatVersion: 2
+guid: 1e3c2da79be842cd838a9ddd70d20fa9
+labels:
+- gvh
+- gvh_version-12.8.0
+- gvhp_exportpath-Firebase/Editor/AnalyticsDependencies.xml
+timeCreated: 1480838400
+DefaultImporter:
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/Firebase/Editor/AppDependencies.xml b/Assets/Firebase/Editor/AppDependencies.xml
new file mode 100644
index 0000000..ec1d231
--- /dev/null
+++ b/Assets/Firebase/Editor/AppDependencies.xml
@@ -0,0 +1,24 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Assets/Firebase/m2repository
+
+
+
+
diff --git a/Assets/Firebase/Editor/AppDependencies.xml.meta b/Assets/Firebase/Editor/AppDependencies.xml.meta
new file mode 100644
index 0000000..e34bfdc
--- /dev/null
+++ b/Assets/Firebase/Editor/AppDependencies.xml.meta
@@ -0,0 +1,11 @@
+fileFormatVersion: 2
+guid: 9b63af95d9364af4a3d8ce58738b6223
+labels:
+- gvh
+- gvh_version-12.8.0
+- gvhp_exportpath-Firebase/Editor/AppDependencies.xml
+timeCreated: 1480838400
+DefaultImporter:
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/Firebase/Editor/CrashlyticsDependencies.xml b/Assets/Firebase/Editor/CrashlyticsDependencies.xml
new file mode 100644
index 0000000..1b6b722
--- /dev/null
+++ b/Assets/Firebase/Editor/CrashlyticsDependencies.xml
@@ -0,0 +1,22 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Assets/Firebase/m2repository
+
+
+
+
diff --git a/Assets/Firebase/Editor/CrashlyticsDependencies.xml.meta b/Assets/Firebase/Editor/CrashlyticsDependencies.xml.meta
new file mode 100644
index 0000000..956d5df
--- /dev/null
+++ b/Assets/Firebase/Editor/CrashlyticsDependencies.xml.meta
@@ -0,0 +1,11 @@
+fileFormatVersion: 2
+guid: be690db6bda046a89e38b20ef9bfe06c
+labels:
+- gvh
+- gvh_version-12.8.0
+- gvhp_exportpath-Firebase/Editor/CrashlyticsDependencies.xml
+timeCreated: 1480838400
+DefaultImporter:
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/Firebase/Editor/Firebase.Crashlytics.Editor.dll b/Assets/Firebase/Editor/Firebase.Crashlytics.Editor.dll
new file mode 100644
index 0000000..088288a
Binary files /dev/null and b/Assets/Firebase/Editor/Firebase.Crashlytics.Editor.dll differ
diff --git a/Assets/Firebase/Editor/Firebase.Crashlytics.Editor.dll.meta b/Assets/Firebase/Editor/Firebase.Crashlytics.Editor.dll.meta
new file mode 100644
index 0000000..3ea95b5
--- /dev/null
+++ b/Assets/Firebase/Editor/Firebase.Crashlytics.Editor.dll.meta
@@ -0,0 +1,118 @@
+fileFormatVersion: 2
+guid: 3781f2218eef4d5a823dba406baa434b
+labels:
+- gvh
+- gvh_targets-editor
+- gvh_version-12.8.0
+- gvhp_exportpath-Firebase/Editor/Firebase.Crashlytics.Editor.dll
+PluginImporter:
+ externalObjects: {}
+ serializedVersion: 2
+ iconMap: {}
+ executionOrder: {}
+ defineConstraints: []
+ isPreloaded: 0
+ isOverridable: 0
+ isExplicitlyReferenced: 0
+ validateReferences: 1
+ platformData:
+ - first:
+ : Linux
+ second:
+ enabled: 0
+ settings:
+ CPU: None
+ - first:
+ : LinuxUniversal
+ second:
+ enabled: 0
+ settings:
+ CPU: None
+ - first:
+ : OSXIntel
+ second:
+ enabled: 0
+ settings:
+ CPU: None
+ - first:
+ : OSXIntel64
+ second:
+ enabled: 0
+ settings:
+ CPU: None
+ - first:
+ : Web
+ second:
+ enabled: 0
+ settings: {}
+ - first:
+ : WebStreamed
+ second:
+ enabled: 0
+ settings: {}
+ - first:
+ Android: Android
+ second:
+ enabled: 0
+ settings:
+ CPU: AnyCPU
+ - first:
+ Any:
+ second:
+ enabled: 0
+ settings: {}
+ - first:
+ Editor: Editor
+ second:
+ enabled: 1
+ settings:
+ CPU: AnyCPU
+ DefaultValueInitialized: true
+ OS: AnyOS
+ - first:
+ Standalone: Linux64
+ second:
+ enabled: 0
+ settings:
+ CPU: None
+ - first:
+ Standalone: OSXUniversal
+ second:
+ enabled: 0
+ settings:
+ CPU: None
+ - first:
+ Standalone: Win
+ second:
+ enabled: 0
+ settings:
+ CPU: None
+ - first:
+ Standalone: Win64
+ second:
+ enabled: 0
+ settings:
+ CPU: None
+ - first:
+ Windows Store Apps: WindowsStoreApps
+ second:
+ enabled: 0
+ settings:
+ CPU: AnyCPU
+ - first:
+ iPhone: iOS
+ second:
+ enabled: 0
+ settings:
+ CompileFlags:
+ FrameworkDependencies:
+ - first:
+ tvOS: tvOS
+ second:
+ enabled: 0
+ settings:
+ CompileFlags:
+ FrameworkDependencies:
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/Firebase/Editor/Firebase.Crashlytics.Editor.pdb b/Assets/Firebase/Editor/Firebase.Crashlytics.Editor.pdb
new file mode 100644
index 0000000..6061804
Binary files /dev/null and b/Assets/Firebase/Editor/Firebase.Crashlytics.Editor.pdb differ
diff --git a/Assets/Firebase/Editor/Firebase.Crashlytics.Editor.pdb.meta b/Assets/Firebase/Editor/Firebase.Crashlytics.Editor.pdb.meta
new file mode 100644
index 0000000..bd4b11a
--- /dev/null
+++ b/Assets/Firebase/Editor/Firebase.Crashlytics.Editor.pdb.meta
@@ -0,0 +1,13 @@
+fileFormatVersion: 2
+guid: 78466de0dce747f9bf1d009be141cf6f
+labels:
+- gvh
+- gvh_rename_to_disable
+- gvh_targets-editor
+- gvh_version-12.8.0
+- gvhp_exportpath-Firebase/Editor/Firebase.Crashlytics.Editor.pdb
+DefaultImporter:
+ externalObjects: {}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/Firebase/Editor/Firebase.Editor.dll b/Assets/Firebase/Editor/Firebase.Editor.dll
new file mode 100644
index 0000000..e03072c
Binary files /dev/null and b/Assets/Firebase/Editor/Firebase.Editor.dll differ
diff --git a/Assets/Firebase/Editor/Firebase.Editor.dll.meta b/Assets/Firebase/Editor/Firebase.Editor.dll.meta
new file mode 100644
index 0000000..b511518
--- /dev/null
+++ b/Assets/Firebase/Editor/Firebase.Editor.dll.meta
@@ -0,0 +1,118 @@
+fileFormatVersion: 2
+guid: 9f2edbf81053418f879076c05f816dc2
+labels:
+- gvh
+- gvh_targets-editor
+- gvh_version-12.8.0
+- gvhp_exportpath-Firebase/Editor/Firebase.Editor.dll
+PluginImporter:
+ externalObjects: {}
+ serializedVersion: 2
+ iconMap: {}
+ executionOrder: {}
+ defineConstraints: []
+ isPreloaded: 0
+ isOverridable: 0
+ isExplicitlyReferenced: 0
+ validateReferences: 1
+ platformData:
+ - first:
+ : Linux
+ second:
+ enabled: 0
+ settings:
+ CPU: None
+ - first:
+ : LinuxUniversal
+ second:
+ enabled: 0
+ settings:
+ CPU: None
+ - first:
+ : OSXIntel
+ second:
+ enabled: 0
+ settings:
+ CPU: None
+ - first:
+ : OSXIntel64
+ second:
+ enabled: 0
+ settings:
+ CPU: None
+ - first:
+ : Web
+ second:
+ enabled: 0
+ settings: {}
+ - first:
+ : WebStreamed
+ second:
+ enabled: 0
+ settings: {}
+ - first:
+ Android: Android
+ second:
+ enabled: 0
+ settings:
+ CPU: AnyCPU
+ - first:
+ Any:
+ second:
+ enabled: 0
+ settings: {}
+ - first:
+ Editor: Editor
+ second:
+ enabled: 1
+ settings:
+ CPU: AnyCPU
+ DefaultValueInitialized: true
+ OS: AnyOS
+ - first:
+ Standalone: Linux64
+ second:
+ enabled: 0
+ settings:
+ CPU: None
+ - first:
+ Standalone: OSXUniversal
+ second:
+ enabled: 0
+ settings:
+ CPU: None
+ - first:
+ Standalone: Win
+ second:
+ enabled: 0
+ settings:
+ CPU: None
+ - first:
+ Standalone: Win64
+ second:
+ enabled: 0
+ settings:
+ CPU: None
+ - first:
+ Windows Store Apps: WindowsStoreApps
+ second:
+ enabled: 0
+ settings:
+ CPU: AnyCPU
+ - first:
+ iPhone: iOS
+ second:
+ enabled: 0
+ settings:
+ CompileFlags:
+ FrameworkDependencies:
+ - first:
+ tvOS: tvOS
+ second:
+ enabled: 0
+ settings:
+ CompileFlags:
+ FrameworkDependencies:
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/Firebase/Editor/Firebase.Editor.pdb b/Assets/Firebase/Editor/Firebase.Editor.pdb
new file mode 100644
index 0000000..d90fb86
Binary files /dev/null and b/Assets/Firebase/Editor/Firebase.Editor.pdb differ
diff --git a/Assets/Firebase/Editor/Firebase.Editor.pdb.meta b/Assets/Firebase/Editor/Firebase.Editor.pdb.meta
new file mode 100644
index 0000000..b447a3d
--- /dev/null
+++ b/Assets/Firebase/Editor/Firebase.Editor.pdb.meta
@@ -0,0 +1,13 @@
+fileFormatVersion: 2
+guid: f2ceb9c446ee4196b6476d4978a416b6
+labels:
+- gvh
+- gvh_rename_to_disable
+- gvh_targets-editor
+- gvh_version-12.8.0
+- gvhp_exportpath-Firebase/Editor/Firebase.Editor.pdb
+DefaultImporter:
+ externalObjects: {}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/Firebase/Editor/Firebase.Messaging.Editor.dll b/Assets/Firebase/Editor/Firebase.Messaging.Editor.dll
new file mode 100644
index 0000000..3c4b5ba
Binary files /dev/null and b/Assets/Firebase/Editor/Firebase.Messaging.Editor.dll differ
diff --git a/Assets/Firebase/Editor/Firebase.Messaging.Editor.dll.meta b/Assets/Firebase/Editor/Firebase.Messaging.Editor.dll.meta
new file mode 100644
index 0000000..a2e42b2
--- /dev/null
+++ b/Assets/Firebase/Editor/Firebase.Messaging.Editor.dll.meta
@@ -0,0 +1,118 @@
+fileFormatVersion: 2
+guid: 9555198c219241e0b850872f8732192f
+labels:
+- gvh
+- gvh_targets-editor
+- gvh_version-12.8.0
+- gvhp_exportpath-Firebase/Editor/Firebase.Messaging.Editor.dll
+PluginImporter:
+ externalObjects: {}
+ serializedVersion: 2
+ iconMap: {}
+ executionOrder: {}
+ defineConstraints: []
+ isPreloaded: 0
+ isOverridable: 0
+ isExplicitlyReferenced: 0
+ validateReferences: 1
+ platformData:
+ - first:
+ : Linux
+ second:
+ enabled: 0
+ settings:
+ CPU: None
+ - first:
+ : LinuxUniversal
+ second:
+ enabled: 0
+ settings:
+ CPU: None
+ - first:
+ : OSXIntel
+ second:
+ enabled: 0
+ settings:
+ CPU: None
+ - first:
+ : OSXIntel64
+ second:
+ enabled: 0
+ settings:
+ CPU: None
+ - first:
+ : Web
+ second:
+ enabled: 0
+ settings: {}
+ - first:
+ : WebStreamed
+ second:
+ enabled: 0
+ settings: {}
+ - first:
+ Android: Android
+ second:
+ enabled: 0
+ settings:
+ CPU: AnyCPU
+ - first:
+ Any:
+ second:
+ enabled: 0
+ settings: {}
+ - first:
+ Editor: Editor
+ second:
+ enabled: 1
+ settings:
+ CPU: AnyCPU
+ DefaultValueInitialized: true
+ OS: AnyOS
+ - first:
+ Standalone: Linux64
+ second:
+ enabled: 0
+ settings:
+ CPU: None
+ - first:
+ Standalone: OSXUniversal
+ second:
+ enabled: 0
+ settings:
+ CPU: None
+ - first:
+ Standalone: Win
+ second:
+ enabled: 0
+ settings:
+ CPU: None
+ - first:
+ Standalone: Win64
+ second:
+ enabled: 0
+ settings:
+ CPU: None
+ - first:
+ Windows Store Apps: WindowsStoreApps
+ second:
+ enabled: 0
+ settings:
+ CPU: AnyCPU
+ - first:
+ iPhone: iOS
+ second:
+ enabled: 0
+ settings:
+ CompileFlags:
+ FrameworkDependencies:
+ - first:
+ tvOS: tvOS
+ second:
+ enabled: 0
+ settings:
+ CompileFlags:
+ FrameworkDependencies:
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/Firebase/Editor/Firebase.Messaging.Editor.pdb b/Assets/Firebase/Editor/Firebase.Messaging.Editor.pdb
new file mode 100644
index 0000000..c9eb285
Binary files /dev/null and b/Assets/Firebase/Editor/Firebase.Messaging.Editor.pdb differ
diff --git a/Assets/Firebase/Editor/Firebase.Messaging.Editor.pdb.meta b/Assets/Firebase/Editor/Firebase.Messaging.Editor.pdb.meta
new file mode 100644
index 0000000..d306767
--- /dev/null
+++ b/Assets/Firebase/Editor/Firebase.Messaging.Editor.pdb.meta
@@ -0,0 +1,13 @@
+fileFormatVersion: 2
+guid: dfa822a1009f4d90972aac668718aaaa
+labels:
+- gvh
+- gvh_rename_to_disable
+- gvh_targets-editor
+- gvh_version-12.8.0
+- gvhp_exportpath-Firebase/Editor/Firebase.Messaging.Editor.pdb
+DefaultImporter:
+ externalObjects: {}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/Firebase/Editor/FirebaseAnalytics_version-12.8.0_manifest.txt b/Assets/Firebase/Editor/FirebaseAnalytics_version-12.8.0_manifest.txt
new file mode 100644
index 0000000..671057b
--- /dev/null
+++ b/Assets/Firebase/Editor/FirebaseAnalytics_version-12.8.0_manifest.txt
@@ -0,0 +1,73 @@
+Assets/Editor Default Resources/Firebase/fb_analytics.png
+Assets/Editor Default Resources/Firebase/fb_analytics_dark.png
+Assets/Editor Default Resources/Firebase/fb_auth.png
+Assets/Editor Default Resources/Firebase/fb_auth_dark.png
+Assets/Editor Default Resources/Firebase/fb_cloud_messaging.png
+Assets/Editor Default Resources/Firebase/fb_cloud_messaging_dark.png
+Assets/Editor Default Resources/Firebase/fb_config.png
+Assets/Editor Default Resources/Firebase/fb_config_dark.png
+Assets/Editor Default Resources/Firebase/fb_crashlytics.png
+Assets/Editor Default Resources/Firebase/fb_crashlytics_dark.png
+Assets/Editor Default Resources/Firebase/fb_database.png
+Assets/Editor Default Resources/Firebase/fb_database_dark.png
+Assets/Editor Default Resources/Firebase/fb_dynamic_links.png
+Assets/Editor Default Resources/Firebase/fb_dynamic_links_dark.png
+Assets/Editor Default Resources/Firebase/fb_functions.png
+Assets/Editor Default Resources/Firebase/fb_functions_dark.png
+Assets/Editor Default Resources/Firebase/fb_invites.png
+Assets/Editor Default Resources/Firebase/fb_invites_dark.png
+Assets/Editor Default Resources/Firebase/fb_storage.png
+Assets/Editor Default Resources/Firebase/fb_storage_dark.png
+Assets/Editor Default Resources/Firebase/firebase_lockup.png
+Assets/Editor Default Resources/Firebase/firebase_lockup_dark.png
+Assets/ExternalDependencyManager/Editor/1.2.185/Google.IOSResolver.dll
+Assets/ExternalDependencyManager/Editor/1.2.185/Google.IOSResolver.pdb
+Assets/ExternalDependencyManager/Editor/1.2.185/Google.JarResolver.dll
+Assets/ExternalDependencyManager/Editor/1.2.185/Google.JarResolver.pdb
+Assets/ExternalDependencyManager/Editor/1.2.185/Google.PackageManagerResolver.dll
+Assets/ExternalDependencyManager/Editor/1.2.185/Google.PackageManagerResolver.pdb
+Assets/ExternalDependencyManager/Editor/1.2.185/Google.VersionHandlerImpl.dll
+Assets/ExternalDependencyManager/Editor/1.2.185/Google.VersionHandlerImpl.pdb
+Assets/ExternalDependencyManager/Editor/CHANGELOG.md
+Assets/ExternalDependencyManager/Editor/Google.VersionHandler.dll
+Assets/ExternalDependencyManager/Editor/Google.VersionHandler.pdb
+Assets/ExternalDependencyManager/Editor/LICENSE
+Assets/ExternalDependencyManager/Editor/README.md
+Assets/ExternalDependencyManager/Editor/external-dependency-manager_version-1.2.185_manifest.txt
+Assets/Firebase/Editor/AnalyticsDependencies.xml
+Assets/Firebase/Editor/AppDependencies.xml
+Assets/Firebase/Editor/Firebase.Editor.dll
+Assets/Firebase/Editor/Firebase.Editor.pdb
+Assets/Firebase/Editor/generate_xml_from_google_services_json.exe
+Assets/Firebase/Editor/generate_xml_from_google_services_json.py
+Assets/Firebase/Editor/network_request.exe
+Assets/Firebase/Editor/network_request.py
+Assets/Firebase/Plugins/Firebase.Analytics.dll
+Assets/Firebase/Plugins/Firebase.Analytics.pdb
+Assets/Firebase/Plugins/Firebase.App.dll
+Assets/Firebase/Plugins/Firebase.App.pdb
+Assets/Firebase/Plugins/Firebase.Platform.dll
+Assets/Firebase/Plugins/Firebase.Platform.pdb
+Assets/Firebase/Plugins/Firebase.TaskExtension.dll
+Assets/Firebase/Plugins/Firebase.TaskExtension.pdb
+Assets/Firebase/Plugins/Google.MiniJson.dll
+Assets/Firebase/Plugins/iOS/Firebase.Analytics.dll
+Assets/Firebase/Plugins/iOS/Firebase.Analytics.pdb
+Assets/Firebase/Plugins/iOS/Firebase.App.dll
+Assets/Firebase/Plugins/iOS/Firebase.App.pdb
+Assets/Firebase/Plugins/x86_64/FirebaseCppAnalytics.bundle
+Assets/Firebase/Plugins/x86_64/FirebaseCppAnalytics.dll
+Assets/Firebase/Plugins/x86_64/FirebaseCppAnalytics.so
+Assets/Firebase/Plugins/x86_64/FirebaseCppApp-12_8_0.bundle
+Assets/Firebase/Plugins/x86_64/FirebaseCppApp-12_8_0.dll
+Assets/Firebase/Plugins/x86_64/FirebaseCppApp-12_8_0.so
+Assets/Firebase/m2repository/com/google/firebase/firebase-analytics-unity/12.8.0/firebase-analytics-unity-12.8.0.pom
+Assets/Firebase/m2repository/com/google/firebase/firebase-analytics-unity/12.8.0/firebase-analytics-unity-12.8.0.srcaar
+Assets/Firebase/m2repository/com/google/firebase/firebase-analytics-unity/maven-metadata.xml
+Assets/Firebase/m2repository/com/google/firebase/firebase-app-unity/12.8.0/firebase-app-unity-12.8.0.pom
+Assets/Firebase/m2repository/com/google/firebase/firebase-app-unity/12.8.0/firebase-app-unity-12.8.0.srcaar
+Assets/Firebase/m2repository/com/google/firebase/firebase-app-unity/maven-metadata.xml
+Assets/Plugins/iOS/Firebase/libFirebaseCppAnalytics.a
+Assets/Plugins/iOS/Firebase/libFirebaseCppApp.a
+Assets/Plugins/tvOS/Firebase/libFirebaseCppAnalytics.a
+Assets/Plugins/tvOS/Firebase/libFirebaseCppApp.a
diff --git a/Assets/Firebase/Editor/FirebaseAnalytics_version-12.8.0_manifest.txt.meta b/Assets/Firebase/Editor/FirebaseAnalytics_version-12.8.0_manifest.txt.meta
new file mode 100644
index 0000000..49eada2
--- /dev/null
+++ b/Assets/Firebase/Editor/FirebaseAnalytics_version-12.8.0_manifest.txt.meta
@@ -0,0 +1,10 @@
+fileFormatVersion: 2
+guid: a4e8e6cc224a43209c603e3759695835
+labels:
+- gvh
+- gvh_manifest
+- gvh_version-12.8.0
+- gvhp_exportpath-Firebase/Editor/FirebaseAnalytics_version-12.8.0_manifest.txt
+- gvhp_manifestname-0Google Analytics
+- gvhp_manifestname-1FirebaseAnalytics
+timeCreated: 0
diff --git a/Assets/Firebase/Editor/FirebaseCrashlytics_version-12.8.0_manifest.txt b/Assets/Firebase/Editor/FirebaseCrashlytics_version-12.8.0_manifest.txt
new file mode 100644
index 0000000..ee5198b
--- /dev/null
+++ b/Assets/Firebase/Editor/FirebaseCrashlytics_version-12.8.0_manifest.txt
@@ -0,0 +1,72 @@
+Assets/Editor Default Resources/Firebase/fb_analytics.png
+Assets/Editor Default Resources/Firebase/fb_analytics_dark.png
+Assets/Editor Default Resources/Firebase/fb_auth.png
+Assets/Editor Default Resources/Firebase/fb_auth_dark.png
+Assets/Editor Default Resources/Firebase/fb_cloud_messaging.png
+Assets/Editor Default Resources/Firebase/fb_cloud_messaging_dark.png
+Assets/Editor Default Resources/Firebase/fb_config.png
+Assets/Editor Default Resources/Firebase/fb_config_dark.png
+Assets/Editor Default Resources/Firebase/fb_crashlytics.png
+Assets/Editor Default Resources/Firebase/fb_crashlytics_dark.png
+Assets/Editor Default Resources/Firebase/fb_database.png
+Assets/Editor Default Resources/Firebase/fb_database_dark.png
+Assets/Editor Default Resources/Firebase/fb_dynamic_links.png
+Assets/Editor Default Resources/Firebase/fb_dynamic_links_dark.png
+Assets/Editor Default Resources/Firebase/fb_functions.png
+Assets/Editor Default Resources/Firebase/fb_functions_dark.png
+Assets/Editor Default Resources/Firebase/fb_invites.png
+Assets/Editor Default Resources/Firebase/fb_invites_dark.png
+Assets/Editor Default Resources/Firebase/fb_storage.png
+Assets/Editor Default Resources/Firebase/fb_storage_dark.png
+Assets/Editor Default Resources/Firebase/firebase_lockup.png
+Assets/Editor Default Resources/Firebase/firebase_lockup_dark.png
+Assets/ExternalDependencyManager/Editor/1.2.185/Google.IOSResolver.dll
+Assets/ExternalDependencyManager/Editor/1.2.185/Google.IOSResolver.pdb
+Assets/ExternalDependencyManager/Editor/1.2.185/Google.JarResolver.dll
+Assets/ExternalDependencyManager/Editor/1.2.185/Google.JarResolver.pdb
+Assets/ExternalDependencyManager/Editor/1.2.185/Google.PackageManagerResolver.dll
+Assets/ExternalDependencyManager/Editor/1.2.185/Google.PackageManagerResolver.pdb
+Assets/ExternalDependencyManager/Editor/1.2.185/Google.VersionHandlerImpl.dll
+Assets/ExternalDependencyManager/Editor/1.2.185/Google.VersionHandlerImpl.pdb
+Assets/ExternalDependencyManager/Editor/CHANGELOG.md
+Assets/ExternalDependencyManager/Editor/Google.VersionHandler.dll
+Assets/ExternalDependencyManager/Editor/Google.VersionHandler.pdb
+Assets/ExternalDependencyManager/Editor/LICENSE
+Assets/ExternalDependencyManager/Editor/README.md
+Assets/ExternalDependencyManager/Editor/external-dependency-manager_version-1.2.185_manifest.txt
+Assets/Firebase/Editor/AppDependencies.xml
+Assets/Firebase/Editor/CrashlyticsDependencies.xml
+Assets/Firebase/Editor/Firebase.Crashlytics.Editor.dll
+Assets/Firebase/Editor/Firebase.Crashlytics.Editor.pdb
+Assets/Firebase/Editor/Firebase.Editor.dll
+Assets/Firebase/Editor/Firebase.Editor.pdb
+Assets/Firebase/Editor/generate_xml_from_google_services_json.exe
+Assets/Firebase/Editor/generate_xml_from_google_services_json.py
+Assets/Firebase/Editor/network_request.exe
+Assets/Firebase/Editor/network_request.py
+Assets/Firebase/Plugins/Firebase.App.dll
+Assets/Firebase/Plugins/Firebase.App.pdb
+Assets/Firebase/Plugins/Firebase.Crashlytics.dll
+Assets/Firebase/Plugins/Firebase.Crashlytics.pdb
+Assets/Firebase/Plugins/Firebase.Platform.dll
+Assets/Firebase/Plugins/Firebase.Platform.pdb
+Assets/Firebase/Plugins/Firebase.TaskExtension.dll
+Assets/Firebase/Plugins/Firebase.TaskExtension.pdb
+Assets/Firebase/Plugins/Google.MiniJson.dll
+Assets/Firebase/Plugins/iOS/Firebase.App.dll
+Assets/Firebase/Plugins/iOS/Firebase.App.pdb
+Assets/Firebase/Plugins/iOS/Firebase.Crashlytics.dll
+Assets/Firebase/Plugins/iOS/Firebase.Crashlytics.pdb
+Assets/Firebase/Plugins/x86_64/FirebaseCppApp-12_8_0.bundle
+Assets/Firebase/Plugins/x86_64/FirebaseCppApp-12_8_0.dll
+Assets/Firebase/Plugins/x86_64/FirebaseCppApp-12_8_0.so
+Assets/Firebase/m2repository/com/google/firebase/firebase-app-unity/12.8.0/firebase-app-unity-12.8.0.pom
+Assets/Firebase/m2repository/com/google/firebase/firebase-app-unity/12.8.0/firebase-app-unity-12.8.0.srcaar
+Assets/Firebase/m2repository/com/google/firebase/firebase-app-unity/maven-metadata.xml
+Assets/Firebase/m2repository/com/google/firebase/firebase-crashlytics-unity/12.8.0/firebase-crashlytics-unity-12.8.0.pom
+Assets/Firebase/m2repository/com/google/firebase/firebase-crashlytics-unity/12.8.0/firebase-crashlytics-unity-12.8.0.srcaar
+Assets/Firebase/m2repository/com/google/firebase/firebase-crashlytics-unity/maven-metadata.xml
+Assets/Plugins/iOS/Firebase/libFirebaseCppApp.a
+Assets/Plugins/iOS/Firebase/libFirebaseCppCrashlytics.a
+Assets/Plugins/tvOS/Firebase/libFirebaseCppApp.a
+Assets/Plugins/tvOS/Firebase/libFirebaseCppCrashlytics.a
diff --git a/Assets/Firebase/Editor/FirebaseCrashlytics_version-12.8.0_manifest.txt.meta b/Assets/Firebase/Editor/FirebaseCrashlytics_version-12.8.0_manifest.txt.meta
new file mode 100644
index 0000000..d491abe
--- /dev/null
+++ b/Assets/Firebase/Editor/FirebaseCrashlytics_version-12.8.0_manifest.txt.meta
@@ -0,0 +1,10 @@
+fileFormatVersion: 2
+guid: f4491847e2c04c6584a04d9f49337afe
+labels:
+- gvh
+- gvh_manifest
+- gvh_version-12.8.0
+- gvhp_exportpath-Firebase/Editor/FirebaseCrashlytics_version-12.8.0_manifest.txt
+- gvhp_manifestname-0Firebase Crashlytics
+- gvhp_manifestname-1FirebaseCrashlytics
+timeCreated: 0
diff --git a/Assets/Firebase/Editor/FirebaseMessaging_version-12.8.0_manifest.txt b/Assets/Firebase/Editor/FirebaseMessaging_version-12.8.0_manifest.txt
new file mode 100644
index 0000000..a2f8a78
--- /dev/null
+++ b/Assets/Firebase/Editor/FirebaseMessaging_version-12.8.0_manifest.txt
@@ -0,0 +1,78 @@
+Assets/Editor Default Resources/Firebase/fb_analytics.png
+Assets/Editor Default Resources/Firebase/fb_analytics_dark.png
+Assets/Editor Default Resources/Firebase/fb_auth.png
+Assets/Editor Default Resources/Firebase/fb_auth_dark.png
+Assets/Editor Default Resources/Firebase/fb_cloud_messaging.png
+Assets/Editor Default Resources/Firebase/fb_cloud_messaging_dark.png
+Assets/Editor Default Resources/Firebase/fb_config.png
+Assets/Editor Default Resources/Firebase/fb_config_dark.png
+Assets/Editor Default Resources/Firebase/fb_crashlytics.png
+Assets/Editor Default Resources/Firebase/fb_crashlytics_dark.png
+Assets/Editor Default Resources/Firebase/fb_database.png
+Assets/Editor Default Resources/Firebase/fb_database_dark.png
+Assets/Editor Default Resources/Firebase/fb_dynamic_links.png
+Assets/Editor Default Resources/Firebase/fb_dynamic_links_dark.png
+Assets/Editor Default Resources/Firebase/fb_functions.png
+Assets/Editor Default Resources/Firebase/fb_functions_dark.png
+Assets/Editor Default Resources/Firebase/fb_invites.png
+Assets/Editor Default Resources/Firebase/fb_invites_dark.png
+Assets/Editor Default Resources/Firebase/fb_storage.png
+Assets/Editor Default Resources/Firebase/fb_storage_dark.png
+Assets/Editor Default Resources/Firebase/firebase_lockup.png
+Assets/Editor Default Resources/Firebase/firebase_lockup_dark.png
+Assets/ExternalDependencyManager/Editor/1.2.185/Google.IOSResolver.dll
+Assets/ExternalDependencyManager/Editor/1.2.185/Google.IOSResolver.pdb
+Assets/ExternalDependencyManager/Editor/1.2.185/Google.JarResolver.dll
+Assets/ExternalDependencyManager/Editor/1.2.185/Google.JarResolver.pdb
+Assets/ExternalDependencyManager/Editor/1.2.185/Google.PackageManagerResolver.dll
+Assets/ExternalDependencyManager/Editor/1.2.185/Google.PackageManagerResolver.pdb
+Assets/ExternalDependencyManager/Editor/1.2.185/Google.VersionHandlerImpl.dll
+Assets/ExternalDependencyManager/Editor/1.2.185/Google.VersionHandlerImpl.pdb
+Assets/ExternalDependencyManager/Editor/CHANGELOG.md
+Assets/ExternalDependencyManager/Editor/Google.VersionHandler.dll
+Assets/ExternalDependencyManager/Editor/Google.VersionHandler.pdb
+Assets/ExternalDependencyManager/Editor/LICENSE
+Assets/ExternalDependencyManager/Editor/README.md
+Assets/ExternalDependencyManager/Editor/external-dependency-manager_version-1.2.185_manifest.txt
+Assets/Firebase/Editor/AppDependencies.xml
+Assets/Firebase/Editor/Firebase.Editor.dll
+Assets/Firebase/Editor/Firebase.Editor.pdb
+Assets/Firebase/Editor/Firebase.Messaging.Editor.dll
+Assets/Firebase/Editor/Firebase.Messaging.Editor.pdb
+Assets/Firebase/Editor/Messaging/FirebaseMessagingActivityGenerator.asmdef
+Assets/Firebase/Editor/Messaging/FirebaseMessagingActivityGenerator.cs
+Assets/Firebase/Editor/MessagingDependencies.xml
+Assets/Firebase/Editor/generate_xml_from_google_services_json.exe
+Assets/Firebase/Editor/generate_xml_from_google_services_json.py
+Assets/Firebase/Editor/network_request.exe
+Assets/Firebase/Editor/network_request.py
+Assets/Firebase/Plugins/Android/firebase-messaging-cpp.aar
+Assets/Firebase/Plugins/Firebase.App.dll
+Assets/Firebase/Plugins/Firebase.App.pdb
+Assets/Firebase/Plugins/Firebase.Messaging.dll
+Assets/Firebase/Plugins/Firebase.Messaging.pdb
+Assets/Firebase/Plugins/Firebase.Platform.dll
+Assets/Firebase/Plugins/Firebase.Platform.pdb
+Assets/Firebase/Plugins/Firebase.TaskExtension.dll
+Assets/Firebase/Plugins/Firebase.TaskExtension.pdb
+Assets/Firebase/Plugins/Google.MiniJson.dll
+Assets/Firebase/Plugins/iOS/Firebase.App.dll
+Assets/Firebase/Plugins/iOS/Firebase.App.pdb
+Assets/Firebase/Plugins/iOS/Firebase.Messaging.dll
+Assets/Firebase/Plugins/iOS/Firebase.Messaging.pdb
+Assets/Firebase/Plugins/x86_64/FirebaseCppApp-12_8_0.bundle
+Assets/Firebase/Plugins/x86_64/FirebaseCppApp-12_8_0.dll
+Assets/Firebase/Plugins/x86_64/FirebaseCppApp-12_8_0.so
+Assets/Firebase/Plugins/x86_64/FirebaseCppMessaging.bundle
+Assets/Firebase/Plugins/x86_64/FirebaseCppMessaging.dll
+Assets/Firebase/Plugins/x86_64/FirebaseCppMessaging.so
+Assets/Firebase/m2repository/com/google/firebase/firebase-app-unity/12.8.0/firebase-app-unity-12.8.0.pom
+Assets/Firebase/m2repository/com/google/firebase/firebase-app-unity/12.8.0/firebase-app-unity-12.8.0.srcaar
+Assets/Firebase/m2repository/com/google/firebase/firebase-app-unity/maven-metadata.xml
+Assets/Firebase/m2repository/com/google/firebase/firebase-messaging-unity/12.8.0/firebase-messaging-unity-12.8.0.pom
+Assets/Firebase/m2repository/com/google/firebase/firebase-messaging-unity/12.8.0/firebase-messaging-unity-12.8.0.srcaar
+Assets/Firebase/m2repository/com/google/firebase/firebase-messaging-unity/maven-metadata.xml
+Assets/Plugins/iOS/Firebase/libFirebaseCppApp.a
+Assets/Plugins/iOS/Firebase/libFirebaseCppMessaging.a
+Assets/Plugins/tvOS/Firebase/libFirebaseCppApp.a
+Assets/Plugins/tvOS/Firebase/libFirebaseCppMessaging.a
diff --git a/Assets/Firebase/Editor/FirebaseMessaging_version-12.8.0_manifest.txt.meta b/Assets/Firebase/Editor/FirebaseMessaging_version-12.8.0_manifest.txt.meta
new file mode 100644
index 0000000..809625e
--- /dev/null
+++ b/Assets/Firebase/Editor/FirebaseMessaging_version-12.8.0_manifest.txt.meta
@@ -0,0 +1,10 @@
+fileFormatVersion: 2
+guid: 523f177029b14503bb7d5806578a7c33
+labels:
+- gvh
+- gvh_manifest
+- gvh_version-12.8.0
+- gvhp_exportpath-Firebase/Editor/FirebaseMessaging_version-12.8.0_manifest.txt
+- gvhp_manifestname-0Firebase Cloud Messaging
+- gvhp_manifestname-1FirebaseMessaging
+timeCreated: 0
diff --git a/Assets/Firebase/Editor/Messaging.meta b/Assets/Firebase/Editor/Messaging.meta
new file mode 100644
index 0000000..9557866
--- /dev/null
+++ b/Assets/Firebase/Editor/Messaging.meta
@@ -0,0 +1,8 @@
+fileFormatVersion: 2
+guid: 19ed14142d00f564d83c9e631862d46f
+folderAsset: yes
+DefaultImporter:
+ externalObjects: {}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/Firebase/Editor/Messaging/FirebaseMessagingActivityGenerator.asmdef b/Assets/Firebase/Editor/Messaging/FirebaseMessagingActivityGenerator.asmdef
new file mode 100644
index 0000000..37fef88
--- /dev/null
+++ b/Assets/Firebase/Editor/Messaging/FirebaseMessagingActivityGenerator.asmdef
@@ -0,0 +1,16 @@
+{
+ "name": "FirebaseMessagingActivityGenerator",
+ "rootNamespace": "",
+ "references": [],
+ "includePlatforms": [
+ "Editor"
+ ],
+ "excludePlatforms": [],
+ "allowUnsafeCode": false,
+ "overrideReferences": false,
+ "precompiledReferences": [],
+ "autoReferenced": true,
+ "defineConstraints": [],
+ "versionDefines": [],
+ "noEngineReferences": false
+}
diff --git a/Assets/Firebase/Editor/Messaging/FirebaseMessagingActivityGenerator.asmdef.meta b/Assets/Firebase/Editor/Messaging/FirebaseMessagingActivityGenerator.asmdef.meta
new file mode 100644
index 0000000..132b92b
--- /dev/null
+++ b/Assets/Firebase/Editor/Messaging/FirebaseMessagingActivityGenerator.asmdef.meta
@@ -0,0 +1,11 @@
+fileFormatVersion: 2
+guid: 23dad9d59a474cb6a052bb9322271ae3
+labels:
+- gvh
+- gvh_version-12.8.0
+- gvhp_exportpath-Firebase/Editor/Messaging/FirebaseMessagingActivityGenerator.asmdef
+timeCreated: 1480838400
+DefaultImporter:
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/Firebase/Editor/Messaging/FirebaseMessagingActivityGenerator.cs b/Assets/Firebase/Editor/Messaging/FirebaseMessagingActivityGenerator.cs
new file mode 100644
index 0000000..133e3a1
--- /dev/null
+++ b/Assets/Firebase/Editor/Messaging/FirebaseMessagingActivityGenerator.cs
@@ -0,0 +1,198 @@
+/*
+ * Copyright 2023 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.
+ */
+using System.IO;
+using System.Linq;
+using UnityEngine;
+using UnityEditor;
+using UnityEditor.Build;
+using UnityEditor.Build.Reporting;
+
+namespace Firebase.Messaging.Editor {
+
+// Handles the generation of the MessagingUnityPlayerActivity java file.
+// Note this regenerates the file every time an Android build occurs,
+// but local changes can be preserved by using the PreserveTag below.
+// This is needed because the source code needs to be present to work across
+// different Unity versions, due to changes in mUnityPlayer.
+// It also adjusts the base class of the file based on if GameActivity is being
+// used (a new feature in Unity 2023).
+public class FirebaseMessagingActivityGenerator : IPreprocessBuildWithReport {
+ // TODO: Ideally this should use a template file, the tricky part is locating
+ // the template file when it is either in the Assets path, or the Packages path.
+ // There are some similar cases in EDM4U, so a solution might be to use that.
+ private readonly string[] ActivityClassContents = new string[]{
+"/*",
+" * This file is generated by the FirebaseMessagingActivityGenerator script.",
+" * Refer to that script for more information.",
+" */",
+"",
+"package com.google.firebase;",
+"",
+"import android.content.Intent;",
+"import android.os.Bundle;",
+"import com.google.firebase.messaging.MessageForwardingService;",
+"import com.unity3d.player.{0};",
+"",
+"/**",
+" * MessagingUnityPlayerActivity is a {0} that updates its intent when new intents",
+" * are sent to it.",
+" *",
+" * This is a workaround for a known issue that prevents Firebase Cloud Messaging from responding to",
+" * data payloads when both a data and notification payload are sent to the app while it is in the",
+" * background.",
+" */",
+"public class MessagingUnityPlayerActivity extends {0} {{",
+" // The key in the intent's extras that maps to the incoming message's message ID. Only sent by",
+" // the server, GmsCore sends EXTRA_MESSAGE_ID_KEY below. Server can't send that as it would get",
+" // stripped by the client.",
+" private static final String EXTRA_MESSAGE_ID_KEY_SERVER = \"message_id\";",
+"",
+" // An alternate key value in the intent's extras that also maps to the incoming message's message",
+" // ID. Used by upstream, and set by GmsCore.",
+" private static final String EXTRA_MESSAGE_ID_KEY = \"google.message_id\";",
+"",
+" // The key in the intent's extras that maps to the incoming message's sender value.",
+" private static final String EXTRA_FROM = \"google.message_id\";",
+"",
+" /**",
+" * Workaround for when a message is sent containing both a Data and Notification payload.",
+" *",
+" * When the app is in the background, if a message with both a data and notification payload is",
+" * received the data payload is stored on the Intent passed to onNewIntent. By default, that",
+" * intent does not get set as the Intent that started the app, so when the app comes back online",
+" * it doesn't see a new FCM message to respond to. As a workaround, we override onNewIntent so",
+" * that it sends the intent to the MessageForwardingService which forwards the message to the",
+" * FirebaseMessagingService which in turn sends the message to the application.",
+" */",
+" @Override",
+" protected void onNewIntent(Intent intent) {{",
+" super.onNewIntent(intent);",
+"",
+" // If we do not have a 'from' field this intent was not a message and should not be handled. It",
+" // probably means this intent was fired by tapping on the app icon.",
+" Bundle extras = intent.getExtras();",
+" if (extras == null) {{",
+" return;",
+" }}",
+" String from = extras.getString(EXTRA_FROM);",
+" String messageId = extras.getString(EXTRA_MESSAGE_ID_KEY);",
+" if (messageId == null) {{",
+" messageId = extras.getString(EXTRA_MESSAGE_ID_KEY_SERVER);",
+" }}",
+" if (from != null && messageId != null) {{",
+" Intent message = new Intent(this, MessageForwardingService.class);",
+" message.setAction(MessageForwardingService.ACTION_REMOTE_INTENT);",
+" message.putExtras(intent);",
+" message.setData(intent.getData());",
+" MessageForwardingService.enqueueWork(this, message);",
+" }}",
+" setIntent(intent);",
+" }}",
+"",
+" /**",
+" * Dispose of the mUnityPlayer when restarting the app.",
+" *",
+" *
This ensures that when the app starts up again it does not start with stale data.",
+" */",
+" @Override",
+" protected void onCreate(Bundle savedInstanceState) {{",
+" if (mUnityPlayer != null) {{",
+" mUnityPlayer.{1}();",
+" mUnityPlayer = null;",
+" }}",
+" super.onCreate(savedInstanceState);",
+" }}",
+"}}"
+ };
+ private readonly string BaseActivityClass = "UnityPlayerActivity";
+#if UNITY_2023_1_OR_NEWER
+ private readonly string BaseGameActivityClass = "UnityPlayerGameActivity";
+#endif
+
+#if UNITY_2023_1_OR_NEWER
+ private readonly string UnityPlayerQuitFunction = "destroy";
+#else
+ private readonly string UnityPlayerQuitFunction = "quit";
+#endif
+
+ private readonly string GeneratedFileTag = "FirebaseMessagingActivityGenerated";
+ // If this tag is present on the generated file, it will not be replaced.
+ private readonly string PreserveTag = "FirebasePreserve";
+
+ private readonly string OutputPath = Path.Combine("Plugins", "Android");
+ private readonly string OutputFilename = "MessagingUnityPlayerActivity.java";
+
+ public int callbackOrder { get { return 0; } }
+ public void OnPreprocessBuild(BuildReport report) {
+ // Only run this logic when building for Android.
+ if (EditorUserBuildSettings.activeBuildTarget != BuildTarget.Android) {
+ return;
+ }
+
+ // Determine what the contents of the generated file should be.
+ string baseClass = BaseActivityClass;
+#if UNITY_2023_1_OR_NEWER
+ // If using the new GameActivity logic, we want to generate with that base class.
+ if (PlayerSettings.Android.applicationEntry.HasFlag(AndroidApplicationEntry.GameActivity)) {
+ baseClass = BaseGameActivityClass;
+ }
+#endif
+ string fileContents = System.String.Format(System.String.Join("\n", ActivityClassContents),
+ baseClass, UnityPlayerQuitFunction);
+
+ // Check if the file has already been generated.
+ string[] oldAssetGuids = AssetDatabase.FindAssets("l:" + GeneratedFileTag);
+ if (oldAssetGuids != null && oldAssetGuids.Length > 0) {
+ if (oldAssetGuids.Length != 1) {
+ Debug.LogWarning("FirebaseMessagingActivityEditor found multiple generated files with the label: " +
+ GeneratedFileTag + " \n" +
+ "No changes will be made, but this can potentially cause problems on Android with duplicate classes.\n" +
+ "Please check for duplicate classes, and remove any unnecessary uses of the label.");
+ return;
+ }
+ string oldAssetPath = AssetDatabase.GUIDToAssetPath(oldAssetGuids[0]);
+ Object oldAsset = AssetDatabase.LoadMainAssetAtPath(oldAssetPath);
+ if (oldAsset != null) {
+ string oldAssetFullPath = Path.Combine(Application.dataPath, "..", oldAssetPath);
+ string oldFileContents = System.IO.File.ReadAllText(oldAssetFullPath);
+ // If the old file matches what we would generate, exit early.
+ if (oldFileContents == fileContents) {
+ return;
+ }
+ // If the generated file has been tagged to be preserved, don't change it.
+ string[] labelList = AssetDatabase.GetLabels(oldAsset);
+ if (labelList.Contains(PreserveTag)) {
+ return;
+ }
+ // Delete the old asset.
+ Debug.Log("Changes detected, regenerating " + oldAssetPath + "\n" +
+ "To preserve local changes to that file, add the label: " + PreserveTag);
+ AssetDatabase.DeleteAsset(oldAssetPath);
+ }
+ }
+
+ // Generate the new file.
+ string newAssetFullDirectory = Path.Combine(Application.dataPath, OutputPath);
+ System.IO.Directory.CreateDirectory(newAssetFullDirectory);
+ System.IO.File.WriteAllText(Path.Combine(newAssetFullDirectory, OutputFilename), fileContents);
+ string newAssetLocalPath = Path.Combine("Assets", OutputPath, OutputFilename);
+ AssetDatabase.ImportAsset(newAssetLocalPath);
+ Object newAsset = AssetDatabase.LoadMainAssetAtPath(newAssetLocalPath);
+ AssetDatabase.SetLabels(newAsset, new[]{GeneratedFileTag});
+ }
+}
+
+} // namespace Firebase.Messaging.Editor
diff --git a/Assets/Firebase/Editor/Messaging/FirebaseMessagingActivityGenerator.cs.meta b/Assets/Firebase/Editor/Messaging/FirebaseMessagingActivityGenerator.cs.meta
new file mode 100644
index 0000000..37fab22
--- /dev/null
+++ b/Assets/Firebase/Editor/Messaging/FirebaseMessagingActivityGenerator.cs.meta
@@ -0,0 +1,11 @@
+fileFormatVersion: 2
+guid: 38cf8316372e4943aee735c624262e05
+labels:
+- gvh
+- gvh_version-12.8.0
+- gvhp_exportpath-Firebase/Editor/Messaging/FirebaseMessagingActivityGenerator.cs
+timeCreated: 1480838400
+DefaultImporter:
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/Firebase/Editor/MessagingDependencies.xml b/Assets/Firebase/Editor/MessagingDependencies.xml
new file mode 100644
index 0000000..86d19d0
--- /dev/null
+++ b/Assets/Firebase/Editor/MessagingDependencies.xml
@@ -0,0 +1,26 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Assets/Firebase/m2repository
+
+
+
+
diff --git a/Assets/Firebase/Editor/MessagingDependencies.xml.meta b/Assets/Firebase/Editor/MessagingDependencies.xml.meta
new file mode 100644
index 0000000..5e893fb
--- /dev/null
+++ b/Assets/Firebase/Editor/MessagingDependencies.xml.meta
@@ -0,0 +1,11 @@
+fileFormatVersion: 2
+guid: 992fedef98ac42209a9d26d5bf364adf
+labels:
+- gvh
+- gvh_version-12.8.0
+- gvhp_exportpath-Firebase/Editor/MessagingDependencies.xml
+timeCreated: 1480838400
+DefaultImporter:
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/Firebase/Editor/generate_xml_from_google_services_json.exe b/Assets/Firebase/Editor/generate_xml_from_google_services_json.exe
new file mode 100644
index 0000000..2d31b04
Binary files /dev/null and b/Assets/Firebase/Editor/generate_xml_from_google_services_json.exe differ
diff --git a/Assets/Firebase/Editor/generate_xml_from_google_services_json.exe.meta b/Assets/Firebase/Editor/generate_xml_from_google_services_json.exe.meta
new file mode 100644
index 0000000..4a3249c
--- /dev/null
+++ b/Assets/Firebase/Editor/generate_xml_from_google_services_json.exe.meta
@@ -0,0 +1,11 @@
+fileFormatVersion: 2
+guid: ae88c0972b7448b5b36def1716f1d711
+labels:
+- gvh
+- gvh_version-12.8.0
+- gvhp_exportpath-Firebase/Editor/generate_xml_from_google_services_json.exe
+timeCreated: 1480838400
+DefaultImporter:
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/Firebase/Editor/generate_xml_from_google_services_json.py b/Assets/Firebase/Editor/generate_xml_from_google_services_json.py
new file mode 100644
index 0000000..789dceb
--- /dev/null
+++ b/Assets/Firebase/Editor/generate_xml_from_google_services_json.py
@@ -0,0 +1,498 @@
+#!/usr/bin/python
+
+# Copyright 2016 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.
+
+"""Stand-alone implementation of the Gradle Firebase plugin.
+
+Converts the services json file to xml:
+https://googleplex-android.googlesource.com/platform/tools/base/+/studio-master-dev/build-system/google-services/src/main/groovy/com/google/gms/googleservices
+"""
+
+__author__ = 'Wouter van Oortmerssen'
+
+import argparse
+import ctypes
+import json
+import os
+import platform
+import sys
+from xml.etree import ElementTree
+
+if platform.system().lower() == 'windows':
+ import ctypes.wintypes # pylint: disable=g-import-not-at-top
+
+# Map Python 2's unicode method to encode a string as bytes in python 3.
+try:
+ unicode('') # See whether unicode class is available (Python < 3)
+except NameError:
+ unicode = str # pylint: disable=redefined-builtin,invalid-name
+
+# Input filename if it isn't set.
+DEFAULT_INPUT_FILENAME = 'app/google-services.json'
+# Output filename if it isn't set.
+DEFAULT_OUTPUT_FILENAME = 'res/values/googleservices.xml'
+# Input filename for .plist files, if it isn't set.
+DEFAULT_PLIST_INPUT_FILENAME = 'GoogleService-Info.plist'
+# Output filename for .json files, if it isn't set.
+DEFAULT_JSON_OUTPUT_FILENAME = 'google-services-desktop.json'
+
+OAUTH_CLIENT_TYPE_ANDROID_APP = 1
+OAUTH_CLIENT_TYPE_WEB = 3
+
+
+def read_xml_value(xml_node):
+ """Utility method for reading values from the plist XML.
+
+ Args:
+ xml_node: An ElementTree node, that contains a value.
+
+ Returns:
+ The value of the node, or None, if it could not be read.
+ """
+ if xml_node.tag == 'string':
+ return xml_node.text
+ elif xml_node.tag == 'integer':
+ return int(xml_node.text)
+ elif xml_node.tag == 'real':
+ return float(xml_node.text)
+ elif xml_node.tag == 'false':
+ return 0
+ elif xml_node.tag == 'true':
+ return 1
+ else:
+ # other types of input are ignored. (data, dates, arrays, etc.)
+ return None
+
+
+def construct_plist_dictionary(xml_root):
+ """Constructs a dictionary of values based on the contents of a plist file.
+
+ Args:
+ xml_root: An ElementTree node, that represents the root of the xml file
+ that is to be parsed. (Which should be a dictionary containing
+ key-value pairs of the properties that need to be extracted.)
+
+ Returns:
+ A dictionary, containing key-value pairs for all (supported) entries in the
+ node.
+ """
+ xml_dict = xml_root.find('dict')
+
+ if xml_dict is None:
+ return None
+
+ plist_dict = {}
+ i = 0
+ while i < len(xml_dict):
+ if xml_dict[i].tag == 'key':
+ key = xml_dict[i].text
+ i += 1
+ if i < len(xml_dict):
+ value = read_xml_value(xml_dict[i])
+ if value is not None:
+ plist_dict[key] = value
+ i += 1
+
+ return plist_dict
+
+
+def update_dict_keys(key_map, input_dict):
+ """Creates a dict from input_dict with the same values but new keys.
+
+ Two dictionaries are passed to this function: the key_map that represents a
+ mapping of source keys to destination keys, and the input_dict that is the
+ dictionary that is to be duplicated, replacing any key that matches a source
+ key with a destination key. Source keys that are not present in the
+ input_dict will not have their destination key represented in the result.
+
+ In other words, if key_map is `{'old': 'new', 'foo': 'bar'}`, and input_dict
+ is `{'old': 10}`, the result will be `{'new': 10}`.
+
+ Args:
+ key_map (dict): A dictionary of strings to strings that maps source keys to
+ destination keys.
+ input_dict (dict): The dictionary of string keys to any value type, which
+ is to be duplicated, replacing source keys with the corresponding
+ destination keys from key_map.
+
+ Returns:
+ dict: A new dictionary with updated keys.
+ """
+ return {
+ new_key: input_dict[old_key]
+ for (old_key, new_key) in key_map.items()
+ if old_key in input_dict
+ }
+
+
+def construct_google_services_json(xml_dict):
+ """Constructs a google services json file from a dictionary.
+
+ Args:
+ xml_dict: A dictionary of all the key/value pairs that are needed for the
+ output json file.
+ Returns:
+ A string representing the output json file.
+ """
+
+ try:
+ json_struct = {
+ 'project_info':
+ update_dict_keys(
+ {
+ 'GCM_SENDER_ID': 'project_number',
+ 'DATABASE_URL': 'firebase_url',
+ 'PROJECT_ID': 'project_id',
+ 'STORAGE_BUCKET': 'storage_bucket'
+ }, xml_dict),
+ 'client': [{
+ 'client_info': {
+ 'mobilesdk_app_id': xml_dict['GOOGLE_APP_ID'],
+ 'android_client_info': {
+ 'package_name': xml_dict['BUNDLE_ID']
+ }
+ },
+ 'api_key': [{
+ 'current_key': xml_dict['API_KEY']
+ }],
+ 'services': {
+ 'analytics_service': {
+ 'status': xml_dict['IS_ANALYTICS_ENABLED']
+ },
+ 'appinvite_service': {
+ 'status': xml_dict['IS_APPINVITE_ENABLED']
+ }
+ }
+ },],
+ 'configuration_version':
+ '1'
+ }
+ # OAuth client is optional, but include it if present.
+ if 'CLIENT_ID' in xml_dict:
+ json_struct['client'][0]['oauth_client'] = [{
+ 'client_id': xml_dict['CLIENT_ID'],
+ }]
+ return json.dumps(json_struct, indent=2)
+ except KeyError as e:
+ sys.stderr.write('Could not find key in plist file: [%s]\n' % (e.args[0]))
+ return None
+
+
+def convert_plist_to_json(plist_string, input_filename):
+ """Converts an input plist string into a .json file and saves it.
+
+ Args:
+ plist_string: The contents of the loaded plist file.
+
+ input_filename: The file name that the plist data was read from.
+ Returns:
+ the converted string, or None if there were errors.
+ """
+
+ try:
+ root = ElementTree.fromstring(plist_string)
+ except ElementTree.ParseError:
+ sys.stderr.write('Error parsing file %s.\n'
+ 'It does not appear to be valid XML.\n' % (input_filename))
+ return None
+
+ plist_dict = construct_plist_dictionary(root)
+ if plist_dict is None:
+ sys.stderr.write('In file %s, could not locate a top-level \'dict\' '
+ 'element.\n'
+ 'File format should be plist XML, with a top-level '
+ 'dictionary containing project settings as key-value '
+ 'pairs.\n' % (input_filename))
+ return None
+
+ json_string = construct_google_services_json(plist_dict)
+ return json_string
+
+
+def gen_string(parent, name, text):
+ """Generate one element and put into the list of keeps.
+
+ Args:
+ parent: The object that will hold the string.
+ name: The name to store the string under.
+ text: The text of the string.
+ """
+ if text:
+ prev = parent.get('tools:keep', '')
+ if prev:
+ prev += ','
+ parent.set('tools:keep', prev + '@string/' + name)
+ child = ElementTree.SubElement(parent, 'string', {
+ 'name': name,
+ 'translatable': 'false'
+ })
+ child.text = text
+
+
+def indent(elem, level=0):
+ """Recurse through XML tree and add indentation.
+
+ Args:
+ elem: The element to recurse over
+ level: The current indentation level.
+ """
+ i = '\n' + level*' '
+ if elem is not None:
+ if not elem.text or not elem.text.strip():
+ elem.text = i + ' '
+ if not elem.tail or not elem.tail.strip():
+ elem.tail = i
+ for elem in elem:
+ indent(elem, level+1)
+ if not elem.tail or not elem.tail.strip():
+ elem.tail = i
+ else:
+ if level and (not elem.tail or not elem.tail.strip()):
+ elem.tail = i
+
+
+def argv_as_unicode_win32():
+ """Returns unicode command line arguments on windows.
+ """
+
+ get_command_line_w = ctypes.cdll.kernel32.GetCommandLineW
+ get_command_line_w.restype = ctypes.wintypes.LPCWSTR
+
+ # CommandLineToArgvW parses the Unicode command line
+ command_line_to_argv_w = ctypes.windll.shell32.CommandLineToArgvW
+ command_line_to_argv_w.argtypes = [
+ ctypes.wintypes.LPCWSTR,
+ ctypes.POINTER(ctypes.c_int)
+ ]
+ command_line_to_argv_w.restype = ctypes.POINTER(
+ ctypes.wintypes.LPWSTR)
+
+ argc = ctypes.c_int(0)
+ argv = command_line_to_argv_w(get_command_line_w(), argc)
+
+ # Strip the python executable from the arguments if it exists
+ # (It would be listed as the first argument on the windows command line, but
+ # not in the arguments to the python script)
+ sys_argv_len = len(sys.argv)
+ return [unicode(argv[i]) for i in
+ range(argc.value - sys_argv_len, argc.value)]
+
+
+def main():
+ parser = argparse.ArgumentParser(
+ description=((
+ 'Converts a Firebase %s into %s similar to the Gradle plugin, or '
+ 'converts a Firebase %s into a %s suitible for use on desktop apps.' %
+ (DEFAULT_INPUT_FILENAME, DEFAULT_OUTPUT_FILENAME,
+ DEFAULT_PLIST_INPUT_FILENAME, DEFAULT_JSON_OUTPUT_FILENAME))))
+ parser.add_argument('-i', help='Override input file name',
+ metavar='FILE', required=False)
+ parser.add_argument('-o', help='Override destination file name',
+ metavar='FILE', required=False)
+ parser.add_argument('-p', help=('Package ID to select within the set of '
+ 'packages in the input file. If this is '
+ 'not specified, the first package in the '
+ 'input file is selected.'))
+ parser.add_argument('-l', help=('List all package IDs referenced by the '
+ 'input file. If this is specified, '
+ 'the output file is not created.'),
+ action='store_true', default=False, required=False)
+ parser.add_argument('-f', help=('Print project fields from the input file '
+ 'in the form \'name=value\\n\' for each '
+ 'field. If this is specified, the output '
+ 'is not created.'),
+ action='store_true', default=False, required=False)
+ parser.add_argument(
+ '--plist',
+ help=(
+ 'Specifies a plist file to convert to a JSON configuration file. '
+ 'If this is enabled, the script will expect a .plist file as input, '
+ 'which it will convert into %s file. The output file is '
+ '*not* suitable for use with Firebase on Android.' %
+ (DEFAULT_JSON_OUTPUT_FILENAME)),
+ action='store_true',
+ default=False,
+ required=False)
+
+ # python 2 on Windows doesn't handle unicode arguments well, so we need to
+ # pre-process the command line arguments before trying to parse them.
+ if platform.system() == 'Windows':
+ sys.argv = argv_as_unicode_win32()
+
+ args = parser.parse_args()
+
+ if args.plist:
+ input_filename = DEFAULT_PLIST_INPUT_FILENAME
+ output_filename = DEFAULT_JSON_OUTPUT_FILENAME
+ else:
+ input_filename = DEFAULT_INPUT_FILENAME
+ output_filename = DEFAULT_OUTPUT_FILENAME
+
+ if args.i:
+ # Encode the input string (type unicode) as a normal string (type str)
+ # using the 'utf-8' encoding so that it can be worked with the same as
+ # input names from other sources (like the defaults).
+ input_filename_raw = args.i.encode('utf-8')
+ # Decode the filename to a unicode string using the 'utf-8' encoding to
+ # properly handle filepaths with unicode characters in them.
+ input_filename = input_filename_raw.decode('utf-8')
+
+ if args.o:
+ output_filename = args.o
+
+ with open(input_filename, 'r') as ifile:
+ file_string = ifile.read()
+
+ json_string = None
+ if args.plist:
+ json_string = convert_plist_to_json(file_string, input_filename)
+ if json_string is None:
+ return 1
+ jsobj = json.loads(json_string)
+ else:
+ jsobj = json.loads(file_string)
+
+ root = ElementTree.Element('resources')
+ root.set('xmlns:tools', 'http://schemas.android.com/tools')
+
+ project_info = jsobj.get('project_info')
+ if project_info:
+ gen_string(root, 'firebase_database_url', project_info.get('firebase_url'))
+ gen_string(root, 'gcm_defaultSenderId', project_info.get('project_number'))
+ gen_string(root, 'google_storage_bucket',
+ project_info.get('storage_bucket'))
+ gen_string(root, 'project_id', project_info.get('project_id'))
+
+ if args.f:
+ if not project_info:
+ sys.stderr.write('No project info found in %s.' % input_filename)
+ return 1
+ for field, value in sorted(project_info.items()):
+ sys.stdout.write('%s=%s\n' % (field, value))
+ return 0
+
+ packages = set()
+ client_list = jsobj.get('client')
+ if client_list:
+ # Search for the user specified package in the file.
+ selected_package_name = ''
+ selected_client = client_list[0]
+ find_package_name = args.p
+ for client in client_list:
+ package_name = client.get('client_info', {}).get(
+ 'android_client_info', {}).get('package_name', '')
+ if not package_name:
+ package_name = client.get('oauth_client', {}).get(
+ 'android_info', {}).get('package_name', '')
+ if package_name:
+ if not selected_package_name:
+ selected_package_name = package_name
+ selected_client = client
+ if package_name == find_package_name:
+ selected_package_name = package_name
+ selected_client = client
+ packages.add(package_name)
+
+ if args.p and selected_package_name != find_package_name:
+ sys.stderr.write('No packages found in %s which match the package '
+ 'name %s\n'
+ '\n'
+ 'Found the following:\n'
+ '%s\n' % (input_filename, find_package_name,
+ '\n'.join(packages)))
+ return 1
+
+ client_api_key = selected_client.get('api_key')
+ if client_api_key:
+ client_api_key0 = client_api_key[0]
+ gen_string(root, 'google_api_key', client_api_key0.get('current_key'))
+ gen_string(root, 'google_crash_reporting_api_key',
+ client_api_key0.get('current_key'))
+
+ client_info = selected_client.get('client_info')
+ if client_info:
+ gen_string(root, 'google_app_id', client_info.get('mobilesdk_app_id'))
+
+ # Only include the first matching OAuth client ID per type.
+ client_id_web_parsed = False
+ client_id_android_parsed = False
+
+ oauth_client_list = selected_client.get('oauth_client')
+ if oauth_client_list:
+ for oauth_client in oauth_client_list:
+ client_type = oauth_client.get('client_type')
+ client_id = oauth_client.get('client_id')
+ if not (client_type and client_id): continue
+ if (client_type == OAUTH_CLIENT_TYPE_WEB and
+ not client_id_web_parsed):
+ gen_string(root, 'default_web_client_id', client_id)
+ client_id_web_parsed = True
+ if (client_type == OAUTH_CLIENT_TYPE_ANDROID_APP and
+ not client_id_android_parsed):
+ gen_string(root, 'default_android_client_id', client_id)
+ client_id_android_parsed = True
+
+ services = selected_client.get('services')
+ if services:
+ ads_service = services.get('ads_service')
+ if ads_service:
+ gen_string(root, 'test_banner_ad_unit_id',
+ ads_service.get('test_banner_ad_unit_id'))
+ gen_string(root, 'test_interstitial_ad_unit_id',
+ ads_service.get('test_interstitial_ad_unit_id'))
+ analytics_service = services.get('analytics_service')
+ if analytics_service:
+ analytics_property = analytics_service.get('analytics_property')
+ if analytics_property:
+ gen_string(root, 'ga_trackingId',
+ analytics_property.get('tracking_id'))
+ # enable this once we have an example if this service being present
+ # in the json data:
+ maps_service_enabled = False
+ if maps_service_enabled:
+ maps_service = services.get('maps_service')
+ if maps_service:
+ maps_api_key = maps_service.get('api_key')
+ if maps_api_key:
+ for k in range(0, len(maps_api_key)):
+ # generates potentially multiple of these keys, which is
+ # the same behavior as the java plugin.
+ gen_string(root, 'google_maps_key',
+ maps_api_key[k].get('maps_api_key'))
+
+ tree = ElementTree.ElementTree(root)
+
+ indent(root)
+
+ if args.l:
+ for package in sorted(packages):
+ if package:
+ sys.stdout.write(package + '\n')
+ else:
+ path = os.path.dirname(output_filename)
+
+ if path and not os.path.exists(path):
+ os.makedirs(path)
+
+ if not args.plist:
+ tree.write(output_filename, 'utf-8', True)
+ else:
+ with open(output_filename, 'w') as ofile:
+ ofile.write(json_string)
+
+ return 0
+
+if __name__ == '__main__':
+ sys.exit(main())
diff --git a/Assets/Firebase/Editor/generate_xml_from_google_services_json.py.meta b/Assets/Firebase/Editor/generate_xml_from_google_services_json.py.meta
new file mode 100644
index 0000000..4af4016
--- /dev/null
+++ b/Assets/Firebase/Editor/generate_xml_from_google_services_json.py.meta
@@ -0,0 +1,11 @@
+fileFormatVersion: 2
+guid: 8f18ed76c0f04ce0a65736104f913ef8
+labels:
+- gvh
+- gvh_version-12.8.0
+- gvhp_exportpath-Firebase/Editor/generate_xml_from_google_services_json.py
+timeCreated: 1480838400
+DefaultImporter:
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/Firebase/Editor/network_request.exe b/Assets/Firebase/Editor/network_request.exe
new file mode 100644
index 0000000..30f5e8e
Binary files /dev/null and b/Assets/Firebase/Editor/network_request.exe differ
diff --git a/Assets/Firebase/Editor/network_request.exe.meta b/Assets/Firebase/Editor/network_request.exe.meta
new file mode 100644
index 0000000..5d1fb54
--- /dev/null
+++ b/Assets/Firebase/Editor/network_request.exe.meta
@@ -0,0 +1,11 @@
+fileFormatVersion: 2
+guid: d3cd5d0a941c4cdc8ab4b1b684b05191
+labels:
+- gvh
+- gvh_version-12.8.0
+- gvhp_exportpath-Firebase/Editor/network_request.exe
+timeCreated: 1480838400
+DefaultImporter:
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/Firebase/Editor/network_request.py b/Assets/Firebase/Editor/network_request.py
new file mode 100644
index 0000000..04f055f
--- /dev/null
+++ b/Assets/Firebase/Editor/network_request.py
@@ -0,0 +1,416 @@
+# Copyright 2019 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.
+"""Wrapper script which makes a network request.
+
+Basic Usage: network_request.py post
+ --url
+ --header (optional, support multiple)
+ --body (optional)
+ --timeout (optional)
+ --verbose (optional)
+"""
+
+import argparse
+import inspect
+import logging
+import socket
+import sys
+
+# pylint: disable=g-import-not-at-top
+# pylint: disable=g-importing-member
+try:
+ from six.moves.http_client import HTTPSConnection
+ from six.moves.http_client import HTTPConnection
+ from six.moves.http_client import HTTPException
+except ImportError:
+ from http.client import HTTPSConnection
+ from http.client import HTTPConnection
+ from http.client import HTTPException
+
+try:
+ from six.moves.urllib.parse import urlparse
+except ImportError:
+ from urllib.parse import urlparse
+# pylint: enable=g-import-not-at-top
+# pylint: enable=g-importing-member
+
+# Set up logger as soon as possible
+formatter = logging.Formatter('[%(levelname)s] %(message)s')
+
+handler = logging.StreamHandler(stream=sys.stdout)
+handler.setFormatter(formatter)
+handler.setLevel(logging.INFO)
+
+logger = logging.getLogger(__name__)
+logger.addHandler(handler)
+logger.setLevel(logging.INFO)
+
+# Custom exit codes for known issues.
+# System exit codes in python are valid from 0 - 256, so we will map some common
+# ones here to understand successes and failures.
+# Uses lower ints to not collide w/ HTTP status codes that the script may return
+EXIT_CODE_SUCCESS = 0
+EXIT_CODE_SYS_ERROR = 1
+EXIT_CODE_INVALID_REQUEST_VALUES = 2
+EXIT_CODE_GENERIC_HTTPLIB_ERROR = 3
+EXIT_CODE_HTTP_TIMEOUT = 4
+EXIT_CODE_HTTP_REDIRECT_ERROR = 5
+EXIT_CODE_HTTP_NOT_FOUND_ERROR = 6
+EXIT_CODE_HTTP_SERVER_ERROR = 7
+EXIT_CODE_HTTP_UNKNOWN_ERROR = 8
+
+MAX_EXIT_CODE = 8
+
+# All used http verbs
+POST = 'POST'
+
+
+def unwrap_kwarg_namespace(func):
+ """Transform a Namespace object from argparse into proper args and kwargs.
+
+ For a function that will be delegated to from argparse, inspect all of the
+ argments and extract them from the Namespace object.
+
+ Args:
+ func: the function that we are wrapping to modify behavior
+
+ Returns:
+ a new function that unwraps all of the arguments in a namespace and then
+ delegates to the passed function with those args.
+ """
+ # When we move to python 3, getfullargspec so that we can tell the
+ # difference between args and kwargs -- then this could be used for functions
+ # that have both args and kwargs
+ if 'getfullargspec' in dir(inspect):
+ argspec = inspect.getfullargspec(func)
+ else:
+ argspec = inspect.getargspec(func) # Python 2 compatibility.
+
+ def wrapped(argparse_namespace=None, **kwargs):
+ """Take a Namespace object and map it to kwargs.
+
+ Inspect the argspec of the passed function. Loop over all the args that
+ are present in the function and try to map them by name to arguments in the
+ namespace. For keyword arguments, we do not require that they be present
+ in the Namespace.
+
+ Args:
+ argparse_namespace: an arparse.Namespace object, the result of calling
+ argparse.ArgumentParser().parse_args()
+ **kwargs: keyword arguments that may be passed to the original function
+ Returns:
+ The return of the wrapped function from the parent.
+
+ Raises:
+ ValueError in the event that an argument is passed to the cli that is not
+ in the set of named kwargs
+ """
+ if not argparse_namespace:
+ return func(**kwargs)
+
+ reserved_namespace_keywords = ['func']
+ new_kwargs = {}
+
+ args = argspec.args or []
+ for arg_name in args:
+ passed_value = getattr(argparse_namespace, arg_name, None)
+ if passed_value is not None:
+ new_kwargs[arg_name] = passed_value
+
+ for namespace_key in vars(argparse_namespace).keys():
+ # ignore namespace keywords that have been set not passed in via cli
+ if namespace_key in reserved_namespace_keywords:
+ continue
+
+ # make sure that we haven't passed something we should be processing
+ if namespace_key not in args:
+ raise ValueError('CLI argument "{}" does not match any argument in '
+ 'function {}'.format(namespace_key, func.__name__))
+
+ return func(**new_kwargs)
+
+ wrapped.__name__ = func.__name__
+ return wrapped
+
+
+class NetworkRequest(object):
+ """A container for an network request object.
+
+ This class holds on to all of the attributes necessary for making a
+ network request via httplib.
+ """
+
+ def __init__(self, url, method, headers, body, timeout):
+ self.url = url.lower()
+ self.parsed_url = urlparse(self.url)
+ self.method = method
+ self.headers = headers
+ self.body = body
+ self.timeout = timeout
+ self.is_secure_connection = self.is_secure_connection()
+
+ def execute_request(self):
+ """"Execute the request, and get a response.
+
+ Returns:
+ an HttpResponse object from httplib
+ """
+ if self.is_secure_connection:
+ conn = HTTPSConnection(self.get_hostname(), timeout=self.timeout)
+ else:
+ conn = HTTPConnection(self.get_hostname(), timeout=self.timeout)
+
+ conn.request(self.method, self.url, self.body, self.headers)
+ response = conn.getresponse()
+ return response
+
+ def get_hostname(self):
+ """Return the hostname for the url."""
+ return self.parsed_url.netloc
+
+ def is_secure_connection(self):
+ """Checks for a secure connection of https.
+
+ Returns:
+ True if the scheme is "https"; False if "http"
+
+ Raises:
+ ValueError when the scheme does not match http or https
+ """
+ scheme = self.parsed_url.scheme
+
+ if scheme == 'http':
+ return False
+ elif scheme == 'https':
+ return True
+ else:
+ raise ValueError('The url scheme is not "http" nor "https"'
+ ': {}'.format(scheme))
+
+
+def parse_colon_delimited_options(option_args):
+ """Parses a key value from a string.
+
+ Args:
+ option_args: Key value string delimited by a color, ex: ("key:value")
+
+ Returns:
+ Return an array with the key as the first element and value as the second
+
+ Raises:
+ ValueError: If the key value option is not formatted correctly
+ """
+ options = {}
+
+ if not option_args:
+ return options
+
+ for single_arg in option_args:
+ values = single_arg.split(':')
+ if len(values) != 2:
+ raise ValueError('An option arg must be a single key/value pair '
+ 'delimited by a colon - ex: "thing_key:thing_value"')
+
+ key = values[0].strip()
+ value = values[1].strip()
+ options[key] = value
+
+ return options
+
+
+def make_request(request):
+ """Makes a synchronous network request and return the HTTP status code.
+
+ Args:
+ request: a well formulated request object
+
+ Returns:
+ The HTTP status code of the network request.
+ '1' maps to invalid request headers.
+ """
+
+ logger.info('Sending network request -')
+ logger.info('\tUrl: %s', request.url)
+ logger.debug('\tMethod: %s', request.method)
+ logger.debug('\tHeaders: %s', request.headers)
+ logger.debug('\tBody: %s', request.body)
+
+ try:
+ response = request.execute_request()
+ except socket.timeout:
+ logger.exception(
+ 'Timed out post request to %s in %d seconds for request body: %s',
+ request.url, request.timeout, request.body)
+ return EXIT_CODE_HTTP_TIMEOUT
+ except (HTTPException, socket.error):
+ logger.exception(
+ 'Encountered generic exception in posting to %s with request body %s',
+ request.url, request.body)
+ return EXIT_CODE_GENERIC_HTTPLIB_ERROR
+
+ status = response.status
+ headers = response.getheaders()
+ logger.info('Received Network response -')
+ logger.info('\tStatus code: %d', status)
+ logger.debug('\tResponse headers: %s', headers)
+
+ if status < 200 or status > 299:
+ logger.error('Request (%s) failed with status code %d\n', request.url,
+ status)
+
+ # If we wanted this script to support get, we need to
+ # figure out what mechanism we intend for capturing the response
+ return status
+
+
+@unwrap_kwarg_namespace
+def post(url=None, header=None, body=None, timeout=5, verbose=False):
+ """Sends a post request.
+
+ Args:
+ url: The url of the request
+ header: A list of headers for the request
+ body: The body for the request
+ timeout: Timeout in seconds for the request
+ verbose: Should debug logs be displayed
+
+ Returns:
+ Return an array with the key as the first element and value as the second
+ """
+
+ if verbose:
+ handler.setLevel(logging.DEBUG)
+ logger.setLevel(logging.DEBUG)
+
+ try:
+ logger.info('Parsing headers: %s', header)
+ headers = parse_colon_delimited_options(header)
+ except ValueError:
+ logging.exception('Could not parse the parameters with "--header": %s',
+ header)
+ return EXIT_CODE_INVALID_REQUEST_VALUES
+
+ try:
+ request = NetworkRequest(url, POST, headers, body, float(timeout))
+ except ValueError:
+ logger.exception('Invalid request values passed into the script.')
+ return EXIT_CODE_INVALID_REQUEST_VALUES
+
+ status = make_request(request)
+
+ # View exit code after running to get the http status code: 'echo $?'
+ return status
+
+
+def get_argsparser():
+ """Returns the argument parser.
+
+ Returns:
+ Argument parser for the script.
+ """
+
+ parser = argparse.ArgumentParser(
+ description='The script takes in the arguments of a network request. '
+ 'The network request is sent and the http status code will be'
+ 'returned as the exit code.')
+ subparsers = parser.add_subparsers(help='Commands:')
+ post_parser = subparsers.add_parser(
+ post.__name__, help='{} help'.format(post.__name__))
+ post_parser.add_argument(
+ '--url',
+ help='Request url. Ex: https://www.google.com/somePath/',
+ required=True,
+ dest='url')
+ post_parser.add_argument(
+ '--header',
+ help='Request headers as a space delimited list of key '
+ 'value pairs. Ex: "key1:value1 key2:value2"',
+ action='append',
+ required=False,
+ dest='header')
+ post_parser.add_argument(
+ '--body',
+ help='The body of the network request',
+ required=True,
+ dest='body')
+ post_parser.add_argument(
+ '--timeout',
+ help='The timeout in seconds',
+ default=10.0,
+ required=False,
+ dest='timeout')
+ post_parser.add_argument(
+ '--verbose',
+ help='Should verbose logging be outputted',
+ action='store_true',
+ default=False,
+ required=False,
+ dest='verbose')
+ post_parser.set_defaults(func=post)
+ return parser
+
+
+def map_http_status_to_exit_code(status_code):
+ """Map an http status code to the appropriate exit code.
+
+ Exit codes in python are valid from 0-256, so we want to map these to
+ predictable exit codes within range.
+
+ Args:
+ status_code: the input status code that was output from the network call
+ function
+
+ Returns:
+ One of our valid exit codes declared at the top of the file or a generic
+ unknown error code
+ """
+ if status_code <= MAX_EXIT_CODE:
+ return status_code
+
+ if status_code > 199 and status_code < 300:
+ return EXIT_CODE_SUCCESS
+
+ if status_code == 302:
+ return EXIT_CODE_HTTP_REDIRECT_ERROR
+
+ if status_code == 404:
+ return EXIT_CODE_HTTP_NOT_FOUND_ERROR
+
+ if status_code > 499:
+ return EXIT_CODE_HTTP_SERVER_ERROR
+
+ return EXIT_CODE_HTTP_UNKNOWN_ERROR
+
+
+def main():
+ """Main function to run the program.
+
+ Parse system arguments and delegate to the appropriate function.
+
+ Returns:
+ A status code - either an http status code or a custom error code
+ """
+ parser = get_argsparser()
+ subparser_action = parser.parse_args()
+ try:
+ return subparser_action.func(subparser_action)
+ except ValueError:
+ logger.exception('Invalid arguments passed.')
+ parser.print_help(sys.stderr)
+ return EXIT_CODE_INVALID_REQUEST_VALUES
+ return EXIT_CODE_GENERIC_HTTPLIB_ERROR
+
+if __name__ == '__main__':
+ exit_code = map_http_status_to_exit_code(main())
+ sys.exit(exit_code)
diff --git a/Assets/Firebase/Editor/network_request.py.meta b/Assets/Firebase/Editor/network_request.py.meta
new file mode 100644
index 0000000..c8450b3
--- /dev/null
+++ b/Assets/Firebase/Editor/network_request.py.meta
@@ -0,0 +1,11 @@
+fileFormatVersion: 2
+guid: e6e32fecbfd44fab946fa160e4861924
+labels:
+- gvh
+- gvh_version-12.8.0
+- gvhp_exportpath-Firebase/Editor/network_request.py
+timeCreated: 1480838400
+DefaultImporter:
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/Firebase/Plugins.meta b/Assets/Firebase/Plugins.meta
new file mode 100644
index 0000000..25833da
--- /dev/null
+++ b/Assets/Firebase/Plugins.meta
@@ -0,0 +1,8 @@
+fileFormatVersion: 2
+guid: 74641d9677971a54a943a4df768f2917
+folderAsset: yes
+DefaultImporter:
+ externalObjects: {}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/Firebase/Plugins/Android.meta b/Assets/Firebase/Plugins/Android.meta
new file mode 100644
index 0000000..7cca179
--- /dev/null
+++ b/Assets/Firebase/Plugins/Android.meta
@@ -0,0 +1,8 @@
+fileFormatVersion: 2
+guid: 56dcb07281839a24d96a78d39d49089c
+folderAsset: yes
+DefaultImporter:
+ externalObjects: {}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/Firebase/Plugins/Android/firebase-messaging-cpp.aar b/Assets/Firebase/Plugins/Android/firebase-messaging-cpp.aar
new file mode 100644
index 0000000..c1a8107
Binary files /dev/null and b/Assets/Firebase/Plugins/Android/firebase-messaging-cpp.aar differ
diff --git a/Assets/Firebase/Plugins/Android/firebase-messaging-cpp.aar.meta b/Assets/Firebase/Plugins/Android/firebase-messaging-cpp.aar.meta
new file mode 100644
index 0000000..8420858
--- /dev/null
+++ b/Assets/Firebase/Plugins/Android/firebase-messaging-cpp.aar.meta
@@ -0,0 +1,81 @@
+fileFormatVersion: 2
+guid: 0be2cda49adc4b61a7e9eb9bf669fdab
+labels:
+- gvh
+- gvh_version-12.8.0
+- gvhp_exportpath-Firebase/Plugins/Android/firebase-messaging-cpp.aar
+timeCreated: 1480838400
+PluginImporter:
+ serializedVersion: 1
+ iconMap: {}
+ executionOrder: {}
+ isPreloaded: 0
+ platformData:
+ Android:
+ enabled: 1
+ settings:
+ CPU: AnyCPU
+ Any:
+ enabled: 0
+ settings: {}
+ Editor:
+ enabled: 0
+ settings:
+ CPU: AnyCPU
+ DefaultValueInitialized: true
+ OS: AnyOS
+ Linux:
+ enabled: 0
+ settings:
+ CPU: None
+ Linux64:
+ enabled: 0
+ settings:
+ CPU: None
+ LinuxUniversal:
+ enabled: 0
+ settings:
+ CPU: None
+ OSXIntel:
+ enabled: 0
+ settings:
+ CPU: None
+ OSXIntel64:
+ enabled: 0
+ settings:
+ CPU: None
+ OSXUniversal:
+ enabled: 0
+ settings:
+ CPU: None
+ Web:
+ enabled: 0
+ settings: {}
+ WebStreamed:
+ enabled: 0
+ settings: {}
+ Win:
+ enabled: 0
+ settings:
+ CPU: None
+ Win64:
+ enabled: 0
+ settings:
+ CPU: None
+ WindowsStoreApps:
+ enabled: 0
+ settings:
+ CPU: AnyCPU
+ iOS:
+ enabled: 0
+ settings:
+ CompileFlags:
+ FrameworkDependencies:
+ tvOS:
+ enabled: 0
+ settings:
+ CompileFlags:
+ FrameworkDependencies:
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/Firebase/Plugins/Firebase.Analytics.dll b/Assets/Firebase/Plugins/Firebase.Analytics.dll
new file mode 100644
index 0000000..6228d2a
Binary files /dev/null and b/Assets/Firebase/Plugins/Firebase.Analytics.dll differ
diff --git a/Assets/Firebase/Plugins/Firebase.Analytics.dll.meta b/Assets/Firebase/Plugins/Firebase.Analytics.dll.meta
new file mode 100644
index 0000000..bf8d631
--- /dev/null
+++ b/Assets/Firebase/Plugins/Firebase.Analytics.dll.meta
@@ -0,0 +1,81 @@
+fileFormatVersion: 2
+guid: 816270c2a2a348e59cb9b7b096a24f50
+labels:
+- gvh
+- gvh_version-12.8.0
+- gvhp_exportpath-Firebase/Plugins/Firebase.Analytics.dll
+timeCreated: 1480838400
+PluginImporter:
+ serializedVersion: 1
+ iconMap: {}
+ executionOrder: {}
+ isPreloaded: 0
+ platformData:
+ Android:
+ enabled: 1
+ settings:
+ CPU: AnyCPU
+ Any:
+ enabled: 0
+ settings: {}
+ Editor:
+ enabled: 1
+ settings:
+ CPU: AnyCPU
+ DefaultValueInitialized: true
+ OS: AnyOS
+ Linux:
+ enabled: 1
+ settings:
+ CPU: x86
+ Linux64:
+ enabled: 1
+ settings:
+ CPU: x86_64
+ LinuxUniversal:
+ enabled: 1
+ settings:
+ CPU: AnyCPU
+ OSXIntel:
+ enabled: 1
+ settings:
+ CPU: x86
+ OSXIntel64:
+ enabled: 1
+ settings:
+ CPU: x86_64
+ OSXUniversal:
+ enabled: 1
+ settings:
+ CPU: AnyCPU
+ Web:
+ enabled: 0
+ settings: {}
+ WebStreamed:
+ enabled: 0
+ settings: {}
+ Win:
+ enabled: 1
+ settings:
+ CPU: x86
+ Win64:
+ enabled: 1
+ settings:
+ CPU: x86_64
+ WindowsStoreApps:
+ enabled: 0
+ settings:
+ CPU: AnyCPU
+ iOS:
+ enabled: 0
+ settings:
+ CompileFlags:
+ FrameworkDependencies:
+ tvOS:
+ enabled: 0
+ settings:
+ CompileFlags:
+ FrameworkDependencies:
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/Firebase/Plugins/Firebase.Analytics.pdb b/Assets/Firebase/Plugins/Firebase.Analytics.pdb
new file mode 100644
index 0000000..ee4b13e
Binary files /dev/null and b/Assets/Firebase/Plugins/Firebase.Analytics.pdb differ
diff --git a/Assets/Firebase/Plugins/Firebase.Analytics.pdb.meta b/Assets/Firebase/Plugins/Firebase.Analytics.pdb.meta
new file mode 100644
index 0000000..0d924c1
--- /dev/null
+++ b/Assets/Firebase/Plugins/Firebase.Analytics.pdb.meta
@@ -0,0 +1,81 @@
+fileFormatVersion: 2
+guid: 778e0739eb634ac6beb8b1dbac5d17f0
+labels:
+- gvh
+- gvh_version-12.8.0
+- gvhp_exportpath-Firebase/Plugins/Firebase.Analytics.pdb
+timeCreated: 1480838400
+PluginImporter:
+ serializedVersion: 1
+ iconMap: {}
+ executionOrder: {}
+ isPreloaded: 0
+ platformData:
+ Android:
+ enabled: 1
+ settings:
+ CPU: AnyCPU
+ Any:
+ enabled: 0
+ settings: {}
+ Editor:
+ enabled: 1
+ settings:
+ CPU: AnyCPU
+ DefaultValueInitialized: true
+ OS: AnyOS
+ Linux:
+ enabled: 1
+ settings:
+ CPU: x86
+ Linux64:
+ enabled: 1
+ settings:
+ CPU: x86_64
+ LinuxUniversal:
+ enabled: 1
+ settings:
+ CPU: AnyCPU
+ OSXIntel:
+ enabled: 1
+ settings:
+ CPU: x86
+ OSXIntel64:
+ enabled: 1
+ settings:
+ CPU: x86_64
+ OSXUniversal:
+ enabled: 1
+ settings:
+ CPU: AnyCPU
+ Web:
+ enabled: 0
+ settings: {}
+ WebStreamed:
+ enabled: 0
+ settings: {}
+ Win:
+ enabled: 1
+ settings:
+ CPU: x86
+ Win64:
+ enabled: 1
+ settings:
+ CPU: x86_64
+ WindowsStoreApps:
+ enabled: 0
+ settings:
+ CPU: AnyCPU
+ iOS:
+ enabled: 0
+ settings:
+ CompileFlags:
+ FrameworkDependencies:
+ tvOS:
+ enabled: 0
+ settings:
+ CompileFlags:
+ FrameworkDependencies:
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/Firebase/Plugins/Firebase.App.dll b/Assets/Firebase/Plugins/Firebase.App.dll
new file mode 100644
index 0000000..58df162
Binary files /dev/null and b/Assets/Firebase/Plugins/Firebase.App.dll differ
diff --git a/Assets/Firebase/Plugins/Firebase.App.dll.meta b/Assets/Firebase/Plugins/Firebase.App.dll.meta
new file mode 100644
index 0000000..e47da3f
--- /dev/null
+++ b/Assets/Firebase/Plugins/Firebase.App.dll.meta
@@ -0,0 +1,81 @@
+fileFormatVersion: 2
+guid: 7311924048bd457bac6d713576c952da
+labels:
+- gvh
+- gvh_version-12.8.0
+- gvhp_exportpath-Firebase/Plugins/Firebase.App.dll
+timeCreated: 1480838400
+PluginImporter:
+ serializedVersion: 1
+ iconMap: {}
+ executionOrder: {}
+ isPreloaded: 0
+ platformData:
+ Android:
+ enabled: 1
+ settings:
+ CPU: AnyCPU
+ Any:
+ enabled: 0
+ settings: {}
+ Editor:
+ enabled: 1
+ settings:
+ CPU: AnyCPU
+ DefaultValueInitialized: true
+ OS: AnyOS
+ Linux:
+ enabled: 1
+ settings:
+ CPU: x86
+ Linux64:
+ enabled: 1
+ settings:
+ CPU: x86_64
+ LinuxUniversal:
+ enabled: 1
+ settings:
+ CPU: AnyCPU
+ OSXIntel:
+ enabled: 1
+ settings:
+ CPU: x86
+ OSXIntel64:
+ enabled: 1
+ settings:
+ CPU: x86_64
+ OSXUniversal:
+ enabled: 1
+ settings:
+ CPU: AnyCPU
+ Web:
+ enabled: 0
+ settings: {}
+ WebStreamed:
+ enabled: 0
+ settings: {}
+ Win:
+ enabled: 1
+ settings:
+ CPU: x86
+ Win64:
+ enabled: 1
+ settings:
+ CPU: x86_64
+ WindowsStoreApps:
+ enabled: 0
+ settings:
+ CPU: AnyCPU
+ iOS:
+ enabled: 0
+ settings:
+ CompileFlags:
+ FrameworkDependencies:
+ tvOS:
+ enabled: 0
+ settings:
+ CompileFlags:
+ FrameworkDependencies:
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/Firebase/Plugins/Firebase.App.pdb b/Assets/Firebase/Plugins/Firebase.App.pdb
new file mode 100644
index 0000000..bfdeba9
Binary files /dev/null and b/Assets/Firebase/Plugins/Firebase.App.pdb differ
diff --git a/Assets/Firebase/Plugins/Firebase.App.pdb.meta b/Assets/Firebase/Plugins/Firebase.App.pdb.meta
new file mode 100644
index 0000000..d1fa8b8
--- /dev/null
+++ b/Assets/Firebase/Plugins/Firebase.App.pdb.meta
@@ -0,0 +1,81 @@
+fileFormatVersion: 2
+guid: 44907853a9e64be4a31076a763ae13b3
+labels:
+- gvh
+- gvh_version-12.8.0
+- gvhp_exportpath-Firebase/Plugins/Firebase.App.pdb
+timeCreated: 1480838400
+PluginImporter:
+ serializedVersion: 1
+ iconMap: {}
+ executionOrder: {}
+ isPreloaded: 0
+ platformData:
+ Android:
+ enabled: 1
+ settings:
+ CPU: AnyCPU
+ Any:
+ enabled: 0
+ settings: {}
+ Editor:
+ enabled: 1
+ settings:
+ CPU: AnyCPU
+ DefaultValueInitialized: true
+ OS: AnyOS
+ Linux:
+ enabled: 1
+ settings:
+ CPU: x86
+ Linux64:
+ enabled: 1
+ settings:
+ CPU: x86_64
+ LinuxUniversal:
+ enabled: 1
+ settings:
+ CPU: AnyCPU
+ OSXIntel:
+ enabled: 1
+ settings:
+ CPU: x86
+ OSXIntel64:
+ enabled: 1
+ settings:
+ CPU: x86_64
+ OSXUniversal:
+ enabled: 1
+ settings:
+ CPU: AnyCPU
+ Web:
+ enabled: 0
+ settings: {}
+ WebStreamed:
+ enabled: 0
+ settings: {}
+ Win:
+ enabled: 1
+ settings:
+ CPU: x86
+ Win64:
+ enabled: 1
+ settings:
+ CPU: x86_64
+ WindowsStoreApps:
+ enabled: 0
+ settings:
+ CPU: AnyCPU
+ iOS:
+ enabled: 0
+ settings:
+ CompileFlags:
+ FrameworkDependencies:
+ tvOS:
+ enabled: 0
+ settings:
+ CompileFlags:
+ FrameworkDependencies:
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/Firebase/Plugins/Firebase.Crashlytics.dll b/Assets/Firebase/Plugins/Firebase.Crashlytics.dll
new file mode 100644
index 0000000..204d673
Binary files /dev/null and b/Assets/Firebase/Plugins/Firebase.Crashlytics.dll differ
diff --git a/Assets/Firebase/Plugins/Firebase.Crashlytics.dll.meta b/Assets/Firebase/Plugins/Firebase.Crashlytics.dll.meta
new file mode 100644
index 0000000..1be1093
--- /dev/null
+++ b/Assets/Firebase/Plugins/Firebase.Crashlytics.dll.meta
@@ -0,0 +1,81 @@
+fileFormatVersion: 2
+guid: 4a712f6ef12f441e9d8b053a3c30ad55
+labels:
+- gvh
+- gvh_version-12.8.0
+- gvhp_exportpath-Firebase/Plugins/Firebase.Crashlytics.dll
+timeCreated: 1480838400
+PluginImporter:
+ serializedVersion: 1
+ iconMap: {}
+ executionOrder: {}
+ isPreloaded: 0
+ platformData:
+ Android:
+ enabled: 1
+ settings:
+ CPU: AnyCPU
+ Any:
+ enabled: 0
+ settings: {}
+ Editor:
+ enabled: 1
+ settings:
+ CPU: AnyCPU
+ DefaultValueInitialized: true
+ OS: AnyOS
+ Linux:
+ enabled: 1
+ settings:
+ CPU: x86
+ Linux64:
+ enabled: 1
+ settings:
+ CPU: x86_64
+ LinuxUniversal:
+ enabled: 1
+ settings:
+ CPU: AnyCPU
+ OSXIntel:
+ enabled: 1
+ settings:
+ CPU: x86
+ OSXIntel64:
+ enabled: 1
+ settings:
+ CPU: x86_64
+ OSXUniversal:
+ enabled: 1
+ settings:
+ CPU: AnyCPU
+ Web:
+ enabled: 0
+ settings: {}
+ WebStreamed:
+ enabled: 0
+ settings: {}
+ Win:
+ enabled: 1
+ settings:
+ CPU: x86
+ Win64:
+ enabled: 1
+ settings:
+ CPU: x86_64
+ WindowsStoreApps:
+ enabled: 0
+ settings:
+ CPU: AnyCPU
+ iOS:
+ enabled: 0
+ settings:
+ CompileFlags:
+ FrameworkDependencies:
+ tvOS:
+ enabled: 0
+ settings:
+ CompileFlags:
+ FrameworkDependencies:
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/Firebase/Plugins/Firebase.Crashlytics.pdb b/Assets/Firebase/Plugins/Firebase.Crashlytics.pdb
new file mode 100644
index 0000000..eefa1c2
Binary files /dev/null and b/Assets/Firebase/Plugins/Firebase.Crashlytics.pdb differ
diff --git a/Assets/Firebase/Plugins/Firebase.Crashlytics.pdb.meta b/Assets/Firebase/Plugins/Firebase.Crashlytics.pdb.meta
new file mode 100644
index 0000000..2efa7bb
--- /dev/null
+++ b/Assets/Firebase/Plugins/Firebase.Crashlytics.pdb.meta
@@ -0,0 +1,81 @@
+fileFormatVersion: 2
+guid: cf098bb37bd1464083da05173619936e
+labels:
+- gvh
+- gvh_version-12.8.0
+- gvhp_exportpath-Firebase/Plugins/Firebase.Crashlytics.pdb
+timeCreated: 1480838400
+PluginImporter:
+ serializedVersion: 1
+ iconMap: {}
+ executionOrder: {}
+ isPreloaded: 0
+ platformData:
+ Android:
+ enabled: 1
+ settings:
+ CPU: AnyCPU
+ Any:
+ enabled: 0
+ settings: {}
+ Editor:
+ enabled: 1
+ settings:
+ CPU: AnyCPU
+ DefaultValueInitialized: true
+ OS: AnyOS
+ Linux:
+ enabled: 1
+ settings:
+ CPU: x86
+ Linux64:
+ enabled: 1
+ settings:
+ CPU: x86_64
+ LinuxUniversal:
+ enabled: 1
+ settings:
+ CPU: AnyCPU
+ OSXIntel:
+ enabled: 1
+ settings:
+ CPU: x86
+ OSXIntel64:
+ enabled: 1
+ settings:
+ CPU: x86_64
+ OSXUniversal:
+ enabled: 1
+ settings:
+ CPU: AnyCPU
+ Web:
+ enabled: 0
+ settings: {}
+ WebStreamed:
+ enabled: 0
+ settings: {}
+ Win:
+ enabled: 1
+ settings:
+ CPU: x86
+ Win64:
+ enabled: 1
+ settings:
+ CPU: x86_64
+ WindowsStoreApps:
+ enabled: 0
+ settings:
+ CPU: AnyCPU
+ iOS:
+ enabled: 0
+ settings:
+ CompileFlags:
+ FrameworkDependencies:
+ tvOS:
+ enabled: 0
+ settings:
+ CompileFlags:
+ FrameworkDependencies:
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/Firebase/Plugins/Firebase.Messaging.dll b/Assets/Firebase/Plugins/Firebase.Messaging.dll
new file mode 100644
index 0000000..cb3295d
Binary files /dev/null and b/Assets/Firebase/Plugins/Firebase.Messaging.dll differ
diff --git a/Assets/Firebase/Plugins/Firebase.Messaging.dll.meta b/Assets/Firebase/Plugins/Firebase.Messaging.dll.meta
new file mode 100644
index 0000000..f1cca28
--- /dev/null
+++ b/Assets/Firebase/Plugins/Firebase.Messaging.dll.meta
@@ -0,0 +1,81 @@
+fileFormatVersion: 2
+guid: 0177f1334f3944ac8ca3df55e1d98660
+labels:
+- gvh
+- gvh_version-12.8.0
+- gvhp_exportpath-Firebase/Plugins/Firebase.Messaging.dll
+timeCreated: 1480838400
+PluginImporter:
+ serializedVersion: 1
+ iconMap: {}
+ executionOrder: {}
+ isPreloaded: 0
+ platformData:
+ Android:
+ enabled: 1
+ settings:
+ CPU: AnyCPU
+ Any:
+ enabled: 0
+ settings: {}
+ Editor:
+ enabled: 1
+ settings:
+ CPU: AnyCPU
+ DefaultValueInitialized: true
+ OS: AnyOS
+ Linux:
+ enabled: 1
+ settings:
+ CPU: x86
+ Linux64:
+ enabled: 1
+ settings:
+ CPU: x86_64
+ LinuxUniversal:
+ enabled: 1
+ settings:
+ CPU: AnyCPU
+ OSXIntel:
+ enabled: 1
+ settings:
+ CPU: x86
+ OSXIntel64:
+ enabled: 1
+ settings:
+ CPU: x86_64
+ OSXUniversal:
+ enabled: 1
+ settings:
+ CPU: AnyCPU
+ Web:
+ enabled: 0
+ settings: {}
+ WebStreamed:
+ enabled: 0
+ settings: {}
+ Win:
+ enabled: 1
+ settings:
+ CPU: x86
+ Win64:
+ enabled: 1
+ settings:
+ CPU: x86_64
+ WindowsStoreApps:
+ enabled: 0
+ settings:
+ CPU: AnyCPU
+ iOS:
+ enabled: 0
+ settings:
+ CompileFlags:
+ FrameworkDependencies:
+ tvOS:
+ enabled: 0
+ settings:
+ CompileFlags:
+ FrameworkDependencies:
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/Firebase/Plugins/Firebase.Messaging.pdb b/Assets/Firebase/Plugins/Firebase.Messaging.pdb
new file mode 100644
index 0000000..286eae1
Binary files /dev/null and b/Assets/Firebase/Plugins/Firebase.Messaging.pdb differ
diff --git a/Assets/Firebase/Plugins/Firebase.Messaging.pdb.meta b/Assets/Firebase/Plugins/Firebase.Messaging.pdb.meta
new file mode 100644
index 0000000..c4d55a9
--- /dev/null
+++ b/Assets/Firebase/Plugins/Firebase.Messaging.pdb.meta
@@ -0,0 +1,81 @@
+fileFormatVersion: 2
+guid: 45f91ddef5f24fee8410c18fdc5e55b6
+labels:
+- gvh
+- gvh_version-12.8.0
+- gvhp_exportpath-Firebase/Plugins/Firebase.Messaging.pdb
+timeCreated: 1480838400
+PluginImporter:
+ serializedVersion: 1
+ iconMap: {}
+ executionOrder: {}
+ isPreloaded: 0
+ platformData:
+ Android:
+ enabled: 1
+ settings:
+ CPU: AnyCPU
+ Any:
+ enabled: 0
+ settings: {}
+ Editor:
+ enabled: 1
+ settings:
+ CPU: AnyCPU
+ DefaultValueInitialized: true
+ OS: AnyOS
+ Linux:
+ enabled: 1
+ settings:
+ CPU: x86
+ Linux64:
+ enabled: 1
+ settings:
+ CPU: x86_64
+ LinuxUniversal:
+ enabled: 1
+ settings:
+ CPU: AnyCPU
+ OSXIntel:
+ enabled: 1
+ settings:
+ CPU: x86
+ OSXIntel64:
+ enabled: 1
+ settings:
+ CPU: x86_64
+ OSXUniversal:
+ enabled: 1
+ settings:
+ CPU: AnyCPU
+ Web:
+ enabled: 0
+ settings: {}
+ WebStreamed:
+ enabled: 0
+ settings: {}
+ Win:
+ enabled: 1
+ settings:
+ CPU: x86
+ Win64:
+ enabled: 1
+ settings:
+ CPU: x86_64
+ WindowsStoreApps:
+ enabled: 0
+ settings:
+ CPU: AnyCPU
+ iOS:
+ enabled: 0
+ settings:
+ CompileFlags:
+ FrameworkDependencies:
+ tvOS:
+ enabled: 0
+ settings:
+ CompileFlags:
+ FrameworkDependencies:
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/Firebase/Plugins/Firebase.Platform.dll b/Assets/Firebase/Plugins/Firebase.Platform.dll
new file mode 100644
index 0000000..5a9f083
Binary files /dev/null and b/Assets/Firebase/Plugins/Firebase.Platform.dll differ
diff --git a/Assets/Firebase/Plugins/Firebase.Platform.dll.meta b/Assets/Firebase/Plugins/Firebase.Platform.dll.meta
new file mode 100644
index 0000000..24385bd
--- /dev/null
+++ b/Assets/Firebase/Plugins/Firebase.Platform.dll.meta
@@ -0,0 +1,81 @@
+fileFormatVersion: 2
+guid: 7d3eec03d7e241a48941e038118c5e6a
+labels:
+- gvh
+- gvh_version-12.8.0
+- gvhp_exportpath-Firebase/Plugins/Firebase.Platform.dll
+timeCreated: 1480838400
+PluginImporter:
+ serializedVersion: 1
+ iconMap: {}
+ executionOrder: {}
+ isPreloaded: 0
+ platformData:
+ Android:
+ enabled: 1
+ settings:
+ CPU: AnyCPU
+ Any:
+ enabled: 0
+ settings: {}
+ Editor:
+ enabled: 1
+ settings:
+ CPU: AnyCPU
+ DefaultValueInitialized: true
+ OS: AnyOS
+ Linux:
+ enabled: 1
+ settings:
+ CPU: x86
+ Linux64:
+ enabled: 1
+ settings:
+ CPU: x86_64
+ LinuxUniversal:
+ enabled: 1
+ settings:
+ CPU: AnyCPU
+ OSXIntel:
+ enabled: 1
+ settings:
+ CPU: x86
+ OSXIntel64:
+ enabled: 1
+ settings:
+ CPU: x86_64
+ OSXUniversal:
+ enabled: 1
+ settings:
+ CPU: AnyCPU
+ Web:
+ enabled: 0
+ settings: {}
+ WebStreamed:
+ enabled: 0
+ settings: {}
+ Win:
+ enabled: 1
+ settings:
+ CPU: x86
+ Win64:
+ enabled: 1
+ settings:
+ CPU: x86_64
+ WindowsStoreApps:
+ enabled: 0
+ settings:
+ CPU: AnyCPU
+ iOS:
+ enabled: 1
+ settings:
+ CompileFlags:
+ FrameworkDependencies:
+ tvOS:
+ enabled: 1
+ settings:
+ CompileFlags:
+ FrameworkDependencies:
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/Firebase/Plugins/Firebase.Platform.pdb b/Assets/Firebase/Plugins/Firebase.Platform.pdb
new file mode 100644
index 0000000..0cf413f
Binary files /dev/null and b/Assets/Firebase/Plugins/Firebase.Platform.pdb differ
diff --git a/Assets/Firebase/Plugins/Firebase.Platform.pdb.meta b/Assets/Firebase/Plugins/Firebase.Platform.pdb.meta
new file mode 100644
index 0000000..33e86ed
--- /dev/null
+++ b/Assets/Firebase/Plugins/Firebase.Platform.pdb.meta
@@ -0,0 +1,81 @@
+fileFormatVersion: 2
+guid: af8fc0c835824578b855d4c0ed7b16ab
+labels:
+- gvh
+- gvh_version-12.8.0
+- gvhp_exportpath-Firebase/Plugins/Firebase.Platform.pdb
+timeCreated: 1480838400
+PluginImporter:
+ serializedVersion: 1
+ iconMap: {}
+ executionOrder: {}
+ isPreloaded: 0
+ platformData:
+ Android:
+ enabled: 1
+ settings:
+ CPU: AnyCPU
+ Any:
+ enabled: 0
+ settings: {}
+ Editor:
+ enabled: 1
+ settings:
+ CPU: AnyCPU
+ DefaultValueInitialized: true
+ OS: AnyOS
+ Linux:
+ enabled: 1
+ settings:
+ CPU: x86
+ Linux64:
+ enabled: 1
+ settings:
+ CPU: x86_64
+ LinuxUniversal:
+ enabled: 1
+ settings:
+ CPU: AnyCPU
+ OSXIntel:
+ enabled: 1
+ settings:
+ CPU: x86
+ OSXIntel64:
+ enabled: 1
+ settings:
+ CPU: x86_64
+ OSXUniversal:
+ enabled: 1
+ settings:
+ CPU: AnyCPU
+ Web:
+ enabled: 0
+ settings: {}
+ WebStreamed:
+ enabled: 0
+ settings: {}
+ Win:
+ enabled: 1
+ settings:
+ CPU: x86
+ Win64:
+ enabled: 1
+ settings:
+ CPU: x86_64
+ WindowsStoreApps:
+ enabled: 0
+ settings:
+ CPU: AnyCPU
+ iOS:
+ enabled: 1
+ settings:
+ CompileFlags:
+ FrameworkDependencies:
+ tvOS:
+ enabled: 1
+ settings:
+ CompileFlags:
+ FrameworkDependencies:
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/Firebase/Plugins/Firebase.TaskExtension.dll b/Assets/Firebase/Plugins/Firebase.TaskExtension.dll
new file mode 100644
index 0000000..94637a4
Binary files /dev/null and b/Assets/Firebase/Plugins/Firebase.TaskExtension.dll differ
diff --git a/Assets/Firebase/Plugins/Firebase.TaskExtension.dll.meta b/Assets/Firebase/Plugins/Firebase.TaskExtension.dll.meta
new file mode 100644
index 0000000..097f6e6
--- /dev/null
+++ b/Assets/Firebase/Plugins/Firebase.TaskExtension.dll.meta
@@ -0,0 +1,81 @@
+fileFormatVersion: 2
+guid: f5d4069c578548ba9f199b46d61bf06d
+labels:
+- gvh
+- gvh_version-12.8.0
+- gvhp_exportpath-Firebase/Plugins/Firebase.TaskExtension.dll
+timeCreated: 1480838400
+PluginImporter:
+ serializedVersion: 1
+ iconMap: {}
+ executionOrder: {}
+ isPreloaded: 0
+ platformData:
+ Android:
+ enabled: 1
+ settings:
+ CPU: AnyCPU
+ Any:
+ enabled: 0
+ settings: {}
+ Editor:
+ enabled: 1
+ settings:
+ CPU: AnyCPU
+ DefaultValueInitialized: true
+ OS: AnyOS
+ Linux:
+ enabled: 1
+ settings:
+ CPU: x86
+ Linux64:
+ enabled: 1
+ settings:
+ CPU: x86_64
+ LinuxUniversal:
+ enabled: 1
+ settings:
+ CPU: AnyCPU
+ OSXIntel:
+ enabled: 1
+ settings:
+ CPU: x86
+ OSXIntel64:
+ enabled: 1
+ settings:
+ CPU: x86_64
+ OSXUniversal:
+ enabled: 1
+ settings:
+ CPU: AnyCPU
+ Web:
+ enabled: 0
+ settings: {}
+ WebStreamed:
+ enabled: 0
+ settings: {}
+ Win:
+ enabled: 1
+ settings:
+ CPU: x86
+ Win64:
+ enabled: 1
+ settings:
+ CPU: x86_64
+ WindowsStoreApps:
+ enabled: 0
+ settings:
+ CPU: AnyCPU
+ iOS:
+ enabled: 1
+ settings:
+ CompileFlags:
+ FrameworkDependencies:
+ tvOS:
+ enabled: 1
+ settings:
+ CompileFlags:
+ FrameworkDependencies:
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/Firebase/Plugins/Firebase.TaskExtension.pdb b/Assets/Firebase/Plugins/Firebase.TaskExtension.pdb
new file mode 100644
index 0000000..deb9b06
Binary files /dev/null and b/Assets/Firebase/Plugins/Firebase.TaskExtension.pdb differ
diff --git a/Assets/Firebase/Plugins/Firebase.TaskExtension.pdb.meta b/Assets/Firebase/Plugins/Firebase.TaskExtension.pdb.meta
new file mode 100644
index 0000000..1dfb4a7
--- /dev/null
+++ b/Assets/Firebase/Plugins/Firebase.TaskExtension.pdb.meta
@@ -0,0 +1,81 @@
+fileFormatVersion: 2
+guid: 736717de9e57417d930d929ac556b287
+labels:
+- gvh
+- gvh_version-12.8.0
+- gvhp_exportpath-Firebase/Plugins/Firebase.TaskExtension.pdb
+timeCreated: 1480838400
+PluginImporter:
+ serializedVersion: 1
+ iconMap: {}
+ executionOrder: {}
+ isPreloaded: 0
+ platformData:
+ Android:
+ enabled: 1
+ settings:
+ CPU: AnyCPU
+ Any:
+ enabled: 0
+ settings: {}
+ Editor:
+ enabled: 1
+ settings:
+ CPU: AnyCPU
+ DefaultValueInitialized: true
+ OS: AnyOS
+ Linux:
+ enabled: 1
+ settings:
+ CPU: x86
+ Linux64:
+ enabled: 1
+ settings:
+ CPU: x86_64
+ LinuxUniversal:
+ enabled: 1
+ settings:
+ CPU: AnyCPU
+ OSXIntel:
+ enabled: 1
+ settings:
+ CPU: x86
+ OSXIntel64:
+ enabled: 1
+ settings:
+ CPU: x86_64
+ OSXUniversal:
+ enabled: 1
+ settings:
+ CPU: AnyCPU
+ Web:
+ enabled: 0
+ settings: {}
+ WebStreamed:
+ enabled: 0
+ settings: {}
+ Win:
+ enabled: 1
+ settings:
+ CPU: x86
+ Win64:
+ enabled: 1
+ settings:
+ CPU: x86_64
+ WindowsStoreApps:
+ enabled: 0
+ settings:
+ CPU: AnyCPU
+ iOS:
+ enabled: 1
+ settings:
+ CompileFlags:
+ FrameworkDependencies:
+ tvOS:
+ enabled: 1
+ settings:
+ CompileFlags:
+ FrameworkDependencies:
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/Firebase/Plugins/Google.MiniJson.dll b/Assets/Firebase/Plugins/Google.MiniJson.dll
new file mode 100644
index 0000000..e06aa56
Binary files /dev/null and b/Assets/Firebase/Plugins/Google.MiniJson.dll differ
diff --git a/Assets/Firebase/Plugins/Google.MiniJson.dll.meta b/Assets/Firebase/Plugins/Google.MiniJson.dll.meta
new file mode 100644
index 0000000..eb7e33a
--- /dev/null
+++ b/Assets/Firebase/Plugins/Google.MiniJson.dll.meta
@@ -0,0 +1,81 @@
+fileFormatVersion: 2
+guid: 3ebb289656f1477fa263e62d36c6e329
+labels:
+- gvh
+- gvh_version-12.8.0
+- gvhp_exportpath-Firebase/Plugins/Google.MiniJson.dll
+timeCreated: 1480838400
+PluginImporter:
+ serializedVersion: 1
+ iconMap: {}
+ executionOrder: {}
+ isPreloaded: 0
+ platformData:
+ Android:
+ enabled: 1
+ settings:
+ CPU: AnyCPU
+ Any:
+ enabled: 0
+ settings: {}
+ Editor:
+ enabled: 1
+ settings:
+ CPU: AnyCPU
+ DefaultValueInitialized: true
+ OS: AnyOS
+ Linux:
+ enabled: 1
+ settings:
+ CPU: x86
+ Linux64:
+ enabled: 1
+ settings:
+ CPU: x86_64
+ LinuxUniversal:
+ enabled: 1
+ settings:
+ CPU: AnyCPU
+ OSXIntel:
+ enabled: 1
+ settings:
+ CPU: x86
+ OSXIntel64:
+ enabled: 1
+ settings:
+ CPU: x86_64
+ OSXUniversal:
+ enabled: 1
+ settings:
+ CPU: AnyCPU
+ Web:
+ enabled: 0
+ settings: {}
+ WebStreamed:
+ enabled: 0
+ settings: {}
+ Win:
+ enabled: 1
+ settings:
+ CPU: x86
+ Win64:
+ enabled: 1
+ settings:
+ CPU: x86_64
+ WindowsStoreApps:
+ enabled: 0
+ settings:
+ CPU: AnyCPU
+ iOS:
+ enabled: 1
+ settings:
+ CompileFlags:
+ FrameworkDependencies:
+ tvOS:
+ enabled: 1
+ settings:
+ CompileFlags:
+ FrameworkDependencies:
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/Firebase/Plugins/iOS.meta b/Assets/Firebase/Plugins/iOS.meta
new file mode 100644
index 0000000..587d77f
--- /dev/null
+++ b/Assets/Firebase/Plugins/iOS.meta
@@ -0,0 +1,8 @@
+fileFormatVersion: 2
+guid: b78b51a58e165994f81fcb3ba889d64e
+folderAsset: yes
+DefaultImporter:
+ externalObjects: {}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/Firebase/Plugins/iOS/Firebase.Analytics.dll b/Assets/Firebase/Plugins/iOS/Firebase.Analytics.dll
new file mode 100644
index 0000000..ae18205
Binary files /dev/null and b/Assets/Firebase/Plugins/iOS/Firebase.Analytics.dll differ
diff --git a/Assets/Firebase/Plugins/iOS/Firebase.Analytics.dll.meta b/Assets/Firebase/Plugins/iOS/Firebase.Analytics.dll.meta
new file mode 100644
index 0000000..98f9ffb
--- /dev/null
+++ b/Assets/Firebase/Plugins/iOS/Firebase.Analytics.dll.meta
@@ -0,0 +1,81 @@
+fileFormatVersion: 2
+guid: 52718a3a80d44aacb368bcc9d62dd804
+labels:
+- gvh
+- gvh_version-12.8.0
+- gvhp_exportpath-Firebase/Plugins/iOS/Firebase.Analytics.dll
+timeCreated: 1480838400
+PluginImporter:
+ serializedVersion: 1
+ iconMap: {}
+ executionOrder: {}
+ isPreloaded: 0
+ platformData:
+ Android:
+ enabled: 0
+ settings:
+ CPU: AnyCPU
+ Any:
+ enabled: 0
+ settings: {}
+ Editor:
+ enabled: 0
+ settings:
+ CPU: AnyCPU
+ DefaultValueInitialized: true
+ OS: AnyOS
+ Linux:
+ enabled: 0
+ settings:
+ CPU: None
+ Linux64:
+ enabled: 0
+ settings:
+ CPU: None
+ LinuxUniversal:
+ enabled: 0
+ settings:
+ CPU: None
+ OSXIntel:
+ enabled: 0
+ settings:
+ CPU: None
+ OSXIntel64:
+ enabled: 0
+ settings:
+ CPU: None
+ OSXUniversal:
+ enabled: 0
+ settings:
+ CPU: None
+ Web:
+ enabled: 0
+ settings: {}
+ WebStreamed:
+ enabled: 0
+ settings: {}
+ Win:
+ enabled: 0
+ settings:
+ CPU: None
+ Win64:
+ enabled: 0
+ settings:
+ CPU: None
+ WindowsStoreApps:
+ enabled: 0
+ settings:
+ CPU: AnyCPU
+ iOS:
+ enabled: 1
+ settings:
+ CompileFlags:
+ FrameworkDependencies:
+ tvOS:
+ enabled: 1
+ settings:
+ CompileFlags:
+ FrameworkDependencies:
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/Firebase/Plugins/iOS/Firebase.Analytics.pdb b/Assets/Firebase/Plugins/iOS/Firebase.Analytics.pdb
new file mode 100644
index 0000000..0266473
Binary files /dev/null and b/Assets/Firebase/Plugins/iOS/Firebase.Analytics.pdb differ
diff --git a/Assets/Firebase/Plugins/iOS/Firebase.Analytics.pdb.meta b/Assets/Firebase/Plugins/iOS/Firebase.Analytics.pdb.meta
new file mode 100644
index 0000000..eefbe13
--- /dev/null
+++ b/Assets/Firebase/Plugins/iOS/Firebase.Analytics.pdb.meta
@@ -0,0 +1,81 @@
+fileFormatVersion: 2
+guid: e0a3fec4e6044b70added51eb3d310ee
+labels:
+- gvh
+- gvh_version-12.8.0
+- gvhp_exportpath-Firebase/Plugins/iOS/Firebase.Analytics.pdb
+timeCreated: 1480838400
+PluginImporter:
+ serializedVersion: 1
+ iconMap: {}
+ executionOrder: {}
+ isPreloaded: 0
+ platformData:
+ Android:
+ enabled: 0
+ settings:
+ CPU: AnyCPU
+ Any:
+ enabled: 0
+ settings: {}
+ Editor:
+ enabled: 0
+ settings:
+ CPU: AnyCPU
+ DefaultValueInitialized: true
+ OS: AnyOS
+ Linux:
+ enabled: 0
+ settings:
+ CPU: None
+ Linux64:
+ enabled: 0
+ settings:
+ CPU: None
+ LinuxUniversal:
+ enabled: 0
+ settings:
+ CPU: None
+ OSXIntel:
+ enabled: 0
+ settings:
+ CPU: None
+ OSXIntel64:
+ enabled: 0
+ settings:
+ CPU: None
+ OSXUniversal:
+ enabled: 0
+ settings:
+ CPU: None
+ Web:
+ enabled: 0
+ settings: {}
+ WebStreamed:
+ enabled: 0
+ settings: {}
+ Win:
+ enabled: 0
+ settings:
+ CPU: None
+ Win64:
+ enabled: 0
+ settings:
+ CPU: None
+ WindowsStoreApps:
+ enabled: 0
+ settings:
+ CPU: AnyCPU
+ iOS:
+ enabled: 1
+ settings:
+ CompileFlags:
+ FrameworkDependencies:
+ tvOS:
+ enabled: 1
+ settings:
+ CompileFlags:
+ FrameworkDependencies:
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/Firebase/Plugins/iOS/Firebase.App.dll b/Assets/Firebase/Plugins/iOS/Firebase.App.dll
new file mode 100644
index 0000000..8fec003
Binary files /dev/null and b/Assets/Firebase/Plugins/iOS/Firebase.App.dll differ
diff --git a/Assets/Firebase/Plugins/iOS/Firebase.App.dll.meta b/Assets/Firebase/Plugins/iOS/Firebase.App.dll.meta
new file mode 100644
index 0000000..51505a7
--- /dev/null
+++ b/Assets/Firebase/Plugins/iOS/Firebase.App.dll.meta
@@ -0,0 +1,81 @@
+fileFormatVersion: 2
+guid: 5f3feda1a91343759b7eb58a29b492b7
+labels:
+- gvh
+- gvh_version-12.8.0
+- gvhp_exportpath-Firebase/Plugins/iOS/Firebase.App.dll
+timeCreated: 1480838400
+PluginImporter:
+ serializedVersion: 1
+ iconMap: {}
+ executionOrder: {}
+ isPreloaded: 0
+ platformData:
+ Android:
+ enabled: 0
+ settings:
+ CPU: AnyCPU
+ Any:
+ enabled: 0
+ settings: {}
+ Editor:
+ enabled: 0
+ settings:
+ CPU: AnyCPU
+ DefaultValueInitialized: true
+ OS: AnyOS
+ Linux:
+ enabled: 0
+ settings:
+ CPU: None
+ Linux64:
+ enabled: 0
+ settings:
+ CPU: None
+ LinuxUniversal:
+ enabled: 0
+ settings:
+ CPU: None
+ OSXIntel:
+ enabled: 0
+ settings:
+ CPU: None
+ OSXIntel64:
+ enabled: 0
+ settings:
+ CPU: None
+ OSXUniversal:
+ enabled: 0
+ settings:
+ CPU: None
+ Web:
+ enabled: 0
+ settings: {}
+ WebStreamed:
+ enabled: 0
+ settings: {}
+ Win:
+ enabled: 0
+ settings:
+ CPU: None
+ Win64:
+ enabled: 0
+ settings:
+ CPU: None
+ WindowsStoreApps:
+ enabled: 0
+ settings:
+ CPU: AnyCPU
+ iOS:
+ enabled: 1
+ settings:
+ CompileFlags:
+ FrameworkDependencies:
+ tvOS:
+ enabled: 1
+ settings:
+ CompileFlags:
+ FrameworkDependencies:
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/Firebase/Plugins/iOS/Firebase.App.pdb b/Assets/Firebase/Plugins/iOS/Firebase.App.pdb
new file mode 100644
index 0000000..165d738
Binary files /dev/null and b/Assets/Firebase/Plugins/iOS/Firebase.App.pdb differ
diff --git a/Assets/Firebase/Plugins/iOS/Firebase.App.pdb.meta b/Assets/Firebase/Plugins/iOS/Firebase.App.pdb.meta
new file mode 100644
index 0000000..3122343
--- /dev/null
+++ b/Assets/Firebase/Plugins/iOS/Firebase.App.pdb.meta
@@ -0,0 +1,81 @@
+fileFormatVersion: 2
+guid: e96748f6edd2467b95622dee98523c65
+labels:
+- gvh
+- gvh_version-12.8.0
+- gvhp_exportpath-Firebase/Plugins/iOS/Firebase.App.pdb
+timeCreated: 1480838400
+PluginImporter:
+ serializedVersion: 1
+ iconMap: {}
+ executionOrder: {}
+ isPreloaded: 0
+ platformData:
+ Android:
+ enabled: 0
+ settings:
+ CPU: AnyCPU
+ Any:
+ enabled: 0
+ settings: {}
+ Editor:
+ enabled: 0
+ settings:
+ CPU: AnyCPU
+ DefaultValueInitialized: true
+ OS: AnyOS
+ Linux:
+ enabled: 0
+ settings:
+ CPU: None
+ Linux64:
+ enabled: 0
+ settings:
+ CPU: None
+ LinuxUniversal:
+ enabled: 0
+ settings:
+ CPU: None
+ OSXIntel:
+ enabled: 0
+ settings:
+ CPU: None
+ OSXIntel64:
+ enabled: 0
+ settings:
+ CPU: None
+ OSXUniversal:
+ enabled: 0
+ settings:
+ CPU: None
+ Web:
+ enabled: 0
+ settings: {}
+ WebStreamed:
+ enabled: 0
+ settings: {}
+ Win:
+ enabled: 0
+ settings:
+ CPU: None
+ Win64:
+ enabled: 0
+ settings:
+ CPU: None
+ WindowsStoreApps:
+ enabled: 0
+ settings:
+ CPU: AnyCPU
+ iOS:
+ enabled: 1
+ settings:
+ CompileFlags:
+ FrameworkDependencies:
+ tvOS:
+ enabled: 1
+ settings:
+ CompileFlags:
+ FrameworkDependencies:
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/Firebase/Plugins/iOS/Firebase.Crashlytics.dll b/Assets/Firebase/Plugins/iOS/Firebase.Crashlytics.dll
new file mode 100644
index 0000000..e08789b
Binary files /dev/null and b/Assets/Firebase/Plugins/iOS/Firebase.Crashlytics.dll differ
diff --git a/Assets/Firebase/Plugins/iOS/Firebase.Crashlytics.dll.meta b/Assets/Firebase/Plugins/iOS/Firebase.Crashlytics.dll.meta
new file mode 100644
index 0000000..3f2245b
--- /dev/null
+++ b/Assets/Firebase/Plugins/iOS/Firebase.Crashlytics.dll.meta
@@ -0,0 +1,81 @@
+fileFormatVersion: 2
+guid: 3c83c9a9845245cfbbab5a52932b5045
+labels:
+- gvh
+- gvh_version-12.8.0
+- gvhp_exportpath-Firebase/Plugins/iOS/Firebase.Crashlytics.dll
+timeCreated: 1480838400
+PluginImporter:
+ serializedVersion: 1
+ iconMap: {}
+ executionOrder: {}
+ isPreloaded: 0
+ platformData:
+ Android:
+ enabled: 0
+ settings:
+ CPU: AnyCPU
+ Any:
+ enabled: 0
+ settings: {}
+ Editor:
+ enabled: 0
+ settings:
+ CPU: AnyCPU
+ DefaultValueInitialized: true
+ OS: AnyOS
+ Linux:
+ enabled: 0
+ settings:
+ CPU: None
+ Linux64:
+ enabled: 0
+ settings:
+ CPU: None
+ LinuxUniversal:
+ enabled: 0
+ settings:
+ CPU: None
+ OSXIntel:
+ enabled: 0
+ settings:
+ CPU: None
+ OSXIntel64:
+ enabled: 0
+ settings:
+ CPU: None
+ OSXUniversal:
+ enabled: 0
+ settings:
+ CPU: None
+ Web:
+ enabled: 0
+ settings: {}
+ WebStreamed:
+ enabled: 0
+ settings: {}
+ Win:
+ enabled: 0
+ settings:
+ CPU: None
+ Win64:
+ enabled: 0
+ settings:
+ CPU: None
+ WindowsStoreApps:
+ enabled: 0
+ settings:
+ CPU: AnyCPU
+ iOS:
+ enabled: 1
+ settings:
+ CompileFlags:
+ FrameworkDependencies:
+ tvOS:
+ enabled: 1
+ settings:
+ CompileFlags:
+ FrameworkDependencies:
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/Firebase/Plugins/iOS/Firebase.Crashlytics.pdb b/Assets/Firebase/Plugins/iOS/Firebase.Crashlytics.pdb
new file mode 100644
index 0000000..b04a33d
Binary files /dev/null and b/Assets/Firebase/Plugins/iOS/Firebase.Crashlytics.pdb differ
diff --git a/Assets/Firebase/Plugins/iOS/Firebase.Crashlytics.pdb.meta b/Assets/Firebase/Plugins/iOS/Firebase.Crashlytics.pdb.meta
new file mode 100644
index 0000000..6aaf699
--- /dev/null
+++ b/Assets/Firebase/Plugins/iOS/Firebase.Crashlytics.pdb.meta
@@ -0,0 +1,81 @@
+fileFormatVersion: 2
+guid: fc067b050957416ea05be8e76ac98a69
+labels:
+- gvh
+- gvh_version-12.8.0
+- gvhp_exportpath-Firebase/Plugins/iOS/Firebase.Crashlytics.pdb
+timeCreated: 1480838400
+PluginImporter:
+ serializedVersion: 1
+ iconMap: {}
+ executionOrder: {}
+ isPreloaded: 0
+ platformData:
+ Android:
+ enabled: 0
+ settings:
+ CPU: AnyCPU
+ Any:
+ enabled: 0
+ settings: {}
+ Editor:
+ enabled: 0
+ settings:
+ CPU: AnyCPU
+ DefaultValueInitialized: true
+ OS: AnyOS
+ Linux:
+ enabled: 0
+ settings:
+ CPU: None
+ Linux64:
+ enabled: 0
+ settings:
+ CPU: None
+ LinuxUniversal:
+ enabled: 0
+ settings:
+ CPU: None
+ OSXIntel:
+ enabled: 0
+ settings:
+ CPU: None
+ OSXIntel64:
+ enabled: 0
+ settings:
+ CPU: None
+ OSXUniversal:
+ enabled: 0
+ settings:
+ CPU: None
+ Web:
+ enabled: 0
+ settings: {}
+ WebStreamed:
+ enabled: 0
+ settings: {}
+ Win:
+ enabled: 0
+ settings:
+ CPU: None
+ Win64:
+ enabled: 0
+ settings:
+ CPU: None
+ WindowsStoreApps:
+ enabled: 0
+ settings:
+ CPU: AnyCPU
+ iOS:
+ enabled: 1
+ settings:
+ CompileFlags:
+ FrameworkDependencies:
+ tvOS:
+ enabled: 1
+ settings:
+ CompileFlags:
+ FrameworkDependencies:
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/Firebase/Plugins/iOS/Firebase.Messaging.dll b/Assets/Firebase/Plugins/iOS/Firebase.Messaging.dll
new file mode 100644
index 0000000..ce9850d
Binary files /dev/null and b/Assets/Firebase/Plugins/iOS/Firebase.Messaging.dll differ
diff --git a/Assets/Firebase/Plugins/iOS/Firebase.Messaging.dll.meta b/Assets/Firebase/Plugins/iOS/Firebase.Messaging.dll.meta
new file mode 100644
index 0000000..f460951
--- /dev/null
+++ b/Assets/Firebase/Plugins/iOS/Firebase.Messaging.dll.meta
@@ -0,0 +1,81 @@
+fileFormatVersion: 2
+guid: 104bd79795964dd3a77a6fa53e729421
+labels:
+- gvh
+- gvh_version-12.8.0
+- gvhp_exportpath-Firebase/Plugins/iOS/Firebase.Messaging.dll
+timeCreated: 1480838400
+PluginImporter:
+ serializedVersion: 1
+ iconMap: {}
+ executionOrder: {}
+ isPreloaded: 0
+ platformData:
+ Android:
+ enabled: 0
+ settings:
+ CPU: AnyCPU
+ Any:
+ enabled: 0
+ settings: {}
+ Editor:
+ enabled: 0
+ settings:
+ CPU: AnyCPU
+ DefaultValueInitialized: true
+ OS: AnyOS
+ Linux:
+ enabled: 0
+ settings:
+ CPU: None
+ Linux64:
+ enabled: 0
+ settings:
+ CPU: None
+ LinuxUniversal:
+ enabled: 0
+ settings:
+ CPU: None
+ OSXIntel:
+ enabled: 0
+ settings:
+ CPU: None
+ OSXIntel64:
+ enabled: 0
+ settings:
+ CPU: None
+ OSXUniversal:
+ enabled: 0
+ settings:
+ CPU: None
+ Web:
+ enabled: 0
+ settings: {}
+ WebStreamed:
+ enabled: 0
+ settings: {}
+ Win:
+ enabled: 0
+ settings:
+ CPU: None
+ Win64:
+ enabled: 0
+ settings:
+ CPU: None
+ WindowsStoreApps:
+ enabled: 0
+ settings:
+ CPU: AnyCPU
+ iOS:
+ enabled: 1
+ settings:
+ CompileFlags:
+ FrameworkDependencies:
+ tvOS:
+ enabled: 1
+ settings:
+ CompileFlags:
+ FrameworkDependencies:
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/Firebase/Plugins/iOS/Firebase.Messaging.pdb b/Assets/Firebase/Plugins/iOS/Firebase.Messaging.pdb
new file mode 100644
index 0000000..74187b5
Binary files /dev/null and b/Assets/Firebase/Plugins/iOS/Firebase.Messaging.pdb differ
diff --git a/Assets/Firebase/Plugins/iOS/Firebase.Messaging.pdb.meta b/Assets/Firebase/Plugins/iOS/Firebase.Messaging.pdb.meta
new file mode 100644
index 0000000..5e64d57
--- /dev/null
+++ b/Assets/Firebase/Plugins/iOS/Firebase.Messaging.pdb.meta
@@ -0,0 +1,81 @@
+fileFormatVersion: 2
+guid: db52be13d765411796629c696730d984
+labels:
+- gvh
+- gvh_version-12.8.0
+- gvhp_exportpath-Firebase/Plugins/iOS/Firebase.Messaging.pdb
+timeCreated: 1480838400
+PluginImporter:
+ serializedVersion: 1
+ iconMap: {}
+ executionOrder: {}
+ isPreloaded: 0
+ platformData:
+ Android:
+ enabled: 0
+ settings:
+ CPU: AnyCPU
+ Any:
+ enabled: 0
+ settings: {}
+ Editor:
+ enabled: 0
+ settings:
+ CPU: AnyCPU
+ DefaultValueInitialized: true
+ OS: AnyOS
+ Linux:
+ enabled: 0
+ settings:
+ CPU: None
+ Linux64:
+ enabled: 0
+ settings:
+ CPU: None
+ LinuxUniversal:
+ enabled: 0
+ settings:
+ CPU: None
+ OSXIntel:
+ enabled: 0
+ settings:
+ CPU: None
+ OSXIntel64:
+ enabled: 0
+ settings:
+ CPU: None
+ OSXUniversal:
+ enabled: 0
+ settings:
+ CPU: None
+ Web:
+ enabled: 0
+ settings: {}
+ WebStreamed:
+ enabled: 0
+ settings: {}
+ Win:
+ enabled: 0
+ settings:
+ CPU: None
+ Win64:
+ enabled: 0
+ settings:
+ CPU: None
+ WindowsStoreApps:
+ enabled: 0
+ settings:
+ CPU: AnyCPU
+ iOS:
+ enabled: 1
+ settings:
+ CompileFlags:
+ FrameworkDependencies:
+ tvOS:
+ enabled: 1
+ settings:
+ CompileFlags:
+ FrameworkDependencies:
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/Firebase/Plugins/x86_64.meta b/Assets/Firebase/Plugins/x86_64.meta
new file mode 100644
index 0000000..67b60b5
--- /dev/null
+++ b/Assets/Firebase/Plugins/x86_64.meta
@@ -0,0 +1,8 @@
+fileFormatVersion: 2
+guid: 85c575d8a92a29c4cb562ecbac1c215a
+folderAsset: yes
+DefaultImporter:
+ externalObjects: {}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/Firebase/Plugins/x86_64/FirebaseCppAnalytics.bundle b/Assets/Firebase/Plugins/x86_64/FirebaseCppAnalytics.bundle
new file mode 100644
index 0000000..b8b312a
Binary files /dev/null and b/Assets/Firebase/Plugins/x86_64/FirebaseCppAnalytics.bundle differ
diff --git a/Assets/Firebase/Plugins/x86_64/FirebaseCppAnalytics.bundle.meta b/Assets/Firebase/Plugins/x86_64/FirebaseCppAnalytics.bundle.meta
new file mode 100644
index 0000000..6f28647
--- /dev/null
+++ b/Assets/Firebase/Plugins/x86_64/FirebaseCppAnalytics.bundle.meta
@@ -0,0 +1,81 @@
+fileFormatVersion: 2
+guid: 35bfcced25264151bd76b628a1dfa989
+labels:
+- gvh
+- gvh_version-12.8.0
+- gvhp_exportpath-Firebase/Plugins/x86_64/FirebaseCppAnalytics.bundle
+timeCreated: 1480838400
+PluginImporter:
+ serializedVersion: 1
+ iconMap: {}
+ executionOrder: {}
+ isPreloaded: 0
+ platformData:
+ Android:
+ enabled: 0
+ settings:
+ CPU: AnyCPU
+ Any:
+ enabled: 0
+ settings: {}
+ Editor:
+ enabled: 1
+ settings:
+ CPU: AnyCPU
+ DefaultValueInitialized: true
+ OS: AnyOS
+ Linux:
+ enabled: 0
+ settings:
+ CPU: None
+ Linux64:
+ enabled: 0
+ settings:
+ CPU: None
+ LinuxUniversal:
+ enabled: 0
+ settings:
+ CPU: None
+ OSXIntel:
+ enabled: 0
+ settings:
+ CPU: None
+ OSXIntel64:
+ enabled: 1
+ settings:
+ CPU: x86_64
+ OSXUniversal:
+ enabled: 1
+ settings:
+ CPU: AnyCPU
+ Web:
+ enabled: 0
+ settings: {}
+ WebStreamed:
+ enabled: 0
+ settings: {}
+ Win:
+ enabled: 0
+ settings:
+ CPU: None
+ Win64:
+ enabled: 0
+ settings:
+ CPU: None
+ WindowsStoreApps:
+ enabled: 0
+ settings:
+ CPU: AnyCPU
+ iOS:
+ enabled: 0
+ settings:
+ CompileFlags:
+ FrameworkDependencies:
+ tvOS:
+ enabled: 0
+ settings:
+ CompileFlags:
+ FrameworkDependencies:
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/Firebase/Plugins/x86_64/FirebaseCppAnalytics.dll b/Assets/Firebase/Plugins/x86_64/FirebaseCppAnalytics.dll
new file mode 100644
index 0000000..6de3bb9
Binary files /dev/null and b/Assets/Firebase/Plugins/x86_64/FirebaseCppAnalytics.dll differ
diff --git a/Assets/Firebase/Plugins/x86_64/FirebaseCppAnalytics.dll.meta b/Assets/Firebase/Plugins/x86_64/FirebaseCppAnalytics.dll.meta
new file mode 100644
index 0000000..97b1a78
--- /dev/null
+++ b/Assets/Firebase/Plugins/x86_64/FirebaseCppAnalytics.dll.meta
@@ -0,0 +1,81 @@
+fileFormatVersion: 2
+guid: c48626ae27ed478483ba85fd7c81c04b
+labels:
+- gvh
+- gvh_version-12.8.0
+- gvhp_exportpath-Firebase/Plugins/x86_64/FirebaseCppAnalytics.dll
+timeCreated: 1480838400
+PluginImporter:
+ serializedVersion: 1
+ iconMap: {}
+ executionOrder: {}
+ isPreloaded: 0
+ platformData:
+ Android:
+ enabled: 0
+ settings:
+ CPU: AnyCPU
+ Any:
+ enabled: 0
+ settings: {}
+ Editor:
+ enabled: 1
+ settings:
+ CPU: AnyCPU
+ DefaultValueInitialized: true
+ OS: AnyOS
+ Linux:
+ enabled: 0
+ settings:
+ CPU: None
+ Linux64:
+ enabled: 0
+ settings:
+ CPU: None
+ LinuxUniversal:
+ enabled: 0
+ settings:
+ CPU: None
+ OSXIntel:
+ enabled: 0
+ settings:
+ CPU: None
+ OSXIntel64:
+ enabled: 0
+ settings:
+ CPU: None
+ OSXUniversal:
+ enabled: 0
+ settings:
+ CPU: None
+ Web:
+ enabled: 0
+ settings: {}
+ WebStreamed:
+ enabled: 0
+ settings: {}
+ Win:
+ enabled: 0
+ settings:
+ CPU: None
+ Win64:
+ enabled: 1
+ settings:
+ CPU: x86_64
+ WindowsStoreApps:
+ enabled: 0
+ settings:
+ CPU: AnyCPU
+ iOS:
+ enabled: 0
+ settings:
+ CompileFlags:
+ FrameworkDependencies:
+ tvOS:
+ enabled: 0
+ settings:
+ CompileFlags:
+ FrameworkDependencies:
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/Firebase/Plugins/x86_64/FirebaseCppAnalytics.so b/Assets/Firebase/Plugins/x86_64/FirebaseCppAnalytics.so
new file mode 100644
index 0000000..e7f3ae4
Binary files /dev/null and b/Assets/Firebase/Plugins/x86_64/FirebaseCppAnalytics.so differ
diff --git a/Assets/Firebase/Plugins/x86_64/FirebaseCppAnalytics.so.meta b/Assets/Firebase/Plugins/x86_64/FirebaseCppAnalytics.so.meta
new file mode 100644
index 0000000..7c5f43e
--- /dev/null
+++ b/Assets/Firebase/Plugins/x86_64/FirebaseCppAnalytics.so.meta
@@ -0,0 +1,81 @@
+fileFormatVersion: 2
+guid: 590090df30d142acba7e7be939fd2988
+labels:
+- gvh
+- gvh_version-12.8.0
+- gvhp_exportpath-Firebase/Plugins/x86_64/FirebaseCppAnalytics.so
+timeCreated: 1480838400
+PluginImporter:
+ serializedVersion: 1
+ iconMap: {}
+ executionOrder: {}
+ isPreloaded: 0
+ platformData:
+ Android:
+ enabled: 0
+ settings:
+ CPU: AnyCPU
+ Any:
+ enabled: 0
+ settings: {}
+ Editor:
+ enabled: 1
+ settings:
+ CPU: AnyCPU
+ DefaultValueInitialized: true
+ OS: AnyOS
+ Linux:
+ enabled: 0
+ settings:
+ CPU: None
+ Linux64:
+ enabled: 1
+ settings:
+ CPU: x86_64
+ LinuxUniversal:
+ enabled: 1
+ settings:
+ CPU: AnyCPU
+ OSXIntel:
+ enabled: 0
+ settings:
+ CPU: None
+ OSXIntel64:
+ enabled: 0
+ settings:
+ CPU: None
+ OSXUniversal:
+ enabled: 0
+ settings:
+ CPU: None
+ Web:
+ enabled: 0
+ settings: {}
+ WebStreamed:
+ enabled: 0
+ settings: {}
+ Win:
+ enabled: 0
+ settings:
+ CPU: None
+ Win64:
+ enabled: 0
+ settings:
+ CPU: None
+ WindowsStoreApps:
+ enabled: 0
+ settings:
+ CPU: AnyCPU
+ iOS:
+ enabled: 0
+ settings:
+ CompileFlags:
+ FrameworkDependencies:
+ tvOS:
+ enabled: 0
+ settings:
+ CompileFlags:
+ FrameworkDependencies:
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/Firebase/Plugins/x86_64/FirebaseCppApp-12_8_0.bundle b/Assets/Firebase/Plugins/x86_64/FirebaseCppApp-12_8_0.bundle
new file mode 100644
index 0000000..60189d6
Binary files /dev/null and b/Assets/Firebase/Plugins/x86_64/FirebaseCppApp-12_8_0.bundle differ
diff --git a/Assets/Firebase/Plugins/x86_64/FirebaseCppApp-12_8_0.bundle.meta b/Assets/Firebase/Plugins/x86_64/FirebaseCppApp-12_8_0.bundle.meta
new file mode 100644
index 0000000..29b0c9d
--- /dev/null
+++ b/Assets/Firebase/Plugins/x86_64/FirebaseCppApp-12_8_0.bundle.meta
@@ -0,0 +1,81 @@
+fileFormatVersion: 2
+guid: db33cacaee9244768effe1c685b48760
+labels:
+- gvh
+- gvh_version-12.8.0
+- gvhp_exportpath-Firebase/Plugins/x86_64/FirebaseCppApp-12_8_0.bundle
+timeCreated: 1480838400
+PluginImporter:
+ serializedVersion: 1
+ iconMap: {}
+ executionOrder: {}
+ isPreloaded: 0
+ platformData:
+ Android:
+ enabled: 0
+ settings:
+ CPU: AnyCPU
+ Any:
+ enabled: 0
+ settings: {}
+ Editor:
+ enabled: 1
+ settings:
+ CPU: AnyCPU
+ DefaultValueInitialized: true
+ OS: AnyOS
+ Linux:
+ enabled: 0
+ settings:
+ CPU: None
+ Linux64:
+ enabled: 0
+ settings:
+ CPU: None
+ LinuxUniversal:
+ enabled: 0
+ settings:
+ CPU: None
+ OSXIntel:
+ enabled: 0
+ settings:
+ CPU: None
+ OSXIntel64:
+ enabled: 1
+ settings:
+ CPU: x86_64
+ OSXUniversal:
+ enabled: 1
+ settings:
+ CPU: AnyCPU
+ Web:
+ enabled: 0
+ settings: {}
+ WebStreamed:
+ enabled: 0
+ settings: {}
+ Win:
+ enabled: 0
+ settings:
+ CPU: None
+ Win64:
+ enabled: 0
+ settings:
+ CPU: None
+ WindowsStoreApps:
+ enabled: 0
+ settings:
+ CPU: AnyCPU
+ iOS:
+ enabled: 0
+ settings:
+ CompileFlags:
+ FrameworkDependencies:
+ tvOS:
+ enabled: 0
+ settings:
+ CompileFlags:
+ FrameworkDependencies:
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/Firebase/Plugins/x86_64/FirebaseCppApp-12_8_0.dll b/Assets/Firebase/Plugins/x86_64/FirebaseCppApp-12_8_0.dll
new file mode 100644
index 0000000..13aa0f1
Binary files /dev/null and b/Assets/Firebase/Plugins/x86_64/FirebaseCppApp-12_8_0.dll differ
diff --git a/Assets/Firebase/Plugins/x86_64/FirebaseCppApp-12_8_0.dll.meta b/Assets/Firebase/Plugins/x86_64/FirebaseCppApp-12_8_0.dll.meta
new file mode 100644
index 0000000..e50eadb
--- /dev/null
+++ b/Assets/Firebase/Plugins/x86_64/FirebaseCppApp-12_8_0.dll.meta
@@ -0,0 +1,81 @@
+fileFormatVersion: 2
+guid: 66adb52e65464b858b1fe1b6e092a9dd
+labels:
+- gvh
+- gvh_version-12.8.0
+- gvhp_exportpath-Firebase/Plugins/x86_64/FirebaseCppApp-12_8_0.dll
+timeCreated: 1480838400
+PluginImporter:
+ serializedVersion: 1
+ iconMap: {}
+ executionOrder: {}
+ isPreloaded: 0
+ platformData:
+ Android:
+ enabled: 0
+ settings:
+ CPU: AnyCPU
+ Any:
+ enabled: 0
+ settings: {}
+ Editor:
+ enabled: 1
+ settings:
+ CPU: AnyCPU
+ DefaultValueInitialized: true
+ OS: AnyOS
+ Linux:
+ enabled: 0
+ settings:
+ CPU: None
+ Linux64:
+ enabled: 0
+ settings:
+ CPU: None
+ LinuxUniversal:
+ enabled: 0
+ settings:
+ CPU: None
+ OSXIntel:
+ enabled: 0
+ settings:
+ CPU: None
+ OSXIntel64:
+ enabled: 0
+ settings:
+ CPU: None
+ OSXUniversal:
+ enabled: 0
+ settings:
+ CPU: None
+ Web:
+ enabled: 0
+ settings: {}
+ WebStreamed:
+ enabled: 0
+ settings: {}
+ Win:
+ enabled: 0
+ settings:
+ CPU: None
+ Win64:
+ enabled: 1
+ settings:
+ CPU: x86_64
+ WindowsStoreApps:
+ enabled: 0
+ settings:
+ CPU: AnyCPU
+ iOS:
+ enabled: 0
+ settings:
+ CompileFlags:
+ FrameworkDependencies:
+ tvOS:
+ enabled: 0
+ settings:
+ CompileFlags:
+ FrameworkDependencies:
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/Firebase/Plugins/x86_64/FirebaseCppApp-12_8_0.so b/Assets/Firebase/Plugins/x86_64/FirebaseCppApp-12_8_0.so
new file mode 100644
index 0000000..9275ca7
Binary files /dev/null and b/Assets/Firebase/Plugins/x86_64/FirebaseCppApp-12_8_0.so differ
diff --git a/Assets/Firebase/Plugins/x86_64/FirebaseCppApp-12_8_0.so.meta b/Assets/Firebase/Plugins/x86_64/FirebaseCppApp-12_8_0.so.meta
new file mode 100644
index 0000000..4f23471
--- /dev/null
+++ b/Assets/Firebase/Plugins/x86_64/FirebaseCppApp-12_8_0.so.meta
@@ -0,0 +1,81 @@
+fileFormatVersion: 2
+guid: 7e0dbda61aaa430fb7d0913f7f100eef
+labels:
+- gvh
+- gvh_version-12.8.0
+- gvhp_exportpath-Firebase/Plugins/x86_64/FirebaseCppApp-12_8_0.so
+timeCreated: 1480838400
+PluginImporter:
+ serializedVersion: 1
+ iconMap: {}
+ executionOrder: {}
+ isPreloaded: 0
+ platformData:
+ Android:
+ enabled: 0
+ settings:
+ CPU: AnyCPU
+ Any:
+ enabled: 0
+ settings: {}
+ Editor:
+ enabled: 1
+ settings:
+ CPU: AnyCPU
+ DefaultValueInitialized: true
+ OS: AnyOS
+ Linux:
+ enabled: 0
+ settings:
+ CPU: None
+ Linux64:
+ enabled: 1
+ settings:
+ CPU: x86_64
+ LinuxUniversal:
+ enabled: 1
+ settings:
+ CPU: AnyCPU
+ OSXIntel:
+ enabled: 0
+ settings:
+ CPU: None
+ OSXIntel64:
+ enabled: 0
+ settings:
+ CPU: None
+ OSXUniversal:
+ enabled: 0
+ settings:
+ CPU: None
+ Web:
+ enabled: 0
+ settings: {}
+ WebStreamed:
+ enabled: 0
+ settings: {}
+ Win:
+ enabled: 0
+ settings:
+ CPU: None
+ Win64:
+ enabled: 0
+ settings:
+ CPU: None
+ WindowsStoreApps:
+ enabled: 0
+ settings:
+ CPU: AnyCPU
+ iOS:
+ enabled: 0
+ settings:
+ CompileFlags:
+ FrameworkDependencies:
+ tvOS:
+ enabled: 0
+ settings:
+ CompileFlags:
+ FrameworkDependencies:
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/Firebase/Plugins/x86_64/FirebaseCppMessaging.bundle b/Assets/Firebase/Plugins/x86_64/FirebaseCppMessaging.bundle
new file mode 100644
index 0000000..c28d4d6
Binary files /dev/null and b/Assets/Firebase/Plugins/x86_64/FirebaseCppMessaging.bundle differ
diff --git a/Assets/Firebase/Plugins/x86_64/FirebaseCppMessaging.bundle.meta b/Assets/Firebase/Plugins/x86_64/FirebaseCppMessaging.bundle.meta
new file mode 100644
index 0000000..2c74bd1
--- /dev/null
+++ b/Assets/Firebase/Plugins/x86_64/FirebaseCppMessaging.bundle.meta
@@ -0,0 +1,81 @@
+fileFormatVersion: 2
+guid: 5d46f3be89af4272b9f8990f26048598
+labels:
+- gvh
+- gvh_version-12.8.0
+- gvhp_exportpath-Firebase/Plugins/x86_64/FirebaseCppMessaging.bundle
+timeCreated: 1480838400
+PluginImporter:
+ serializedVersion: 1
+ iconMap: {}
+ executionOrder: {}
+ isPreloaded: 0
+ platformData:
+ Android:
+ enabled: 0
+ settings:
+ CPU: AnyCPU
+ Any:
+ enabled: 0
+ settings: {}
+ Editor:
+ enabled: 1
+ settings:
+ CPU: AnyCPU
+ DefaultValueInitialized: true
+ OS: AnyOS
+ Linux:
+ enabled: 0
+ settings:
+ CPU: None
+ Linux64:
+ enabled: 0
+ settings:
+ CPU: None
+ LinuxUniversal:
+ enabled: 0
+ settings:
+ CPU: None
+ OSXIntel:
+ enabled: 0
+ settings:
+ CPU: None
+ OSXIntel64:
+ enabled: 1
+ settings:
+ CPU: x86_64
+ OSXUniversal:
+ enabled: 1
+ settings:
+ CPU: AnyCPU
+ Web:
+ enabled: 0
+ settings: {}
+ WebStreamed:
+ enabled: 0
+ settings: {}
+ Win:
+ enabled: 0
+ settings:
+ CPU: None
+ Win64:
+ enabled: 0
+ settings:
+ CPU: None
+ WindowsStoreApps:
+ enabled: 0
+ settings:
+ CPU: AnyCPU
+ iOS:
+ enabled: 0
+ settings:
+ CompileFlags:
+ FrameworkDependencies:
+ tvOS:
+ enabled: 0
+ settings:
+ CompileFlags:
+ FrameworkDependencies:
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/Firebase/Plugins/x86_64/FirebaseCppMessaging.dll b/Assets/Firebase/Plugins/x86_64/FirebaseCppMessaging.dll
new file mode 100644
index 0000000..1b2395b
Binary files /dev/null and b/Assets/Firebase/Plugins/x86_64/FirebaseCppMessaging.dll differ
diff --git a/Assets/Firebase/Plugins/x86_64/FirebaseCppMessaging.dll.meta b/Assets/Firebase/Plugins/x86_64/FirebaseCppMessaging.dll.meta
new file mode 100644
index 0000000..6e08f9f
--- /dev/null
+++ b/Assets/Firebase/Plugins/x86_64/FirebaseCppMessaging.dll.meta
@@ -0,0 +1,81 @@
+fileFormatVersion: 2
+guid: 25030b1944ee412881e89b8967a05294
+labels:
+- gvh
+- gvh_version-12.8.0
+- gvhp_exportpath-Firebase/Plugins/x86_64/FirebaseCppMessaging.dll
+timeCreated: 1480838400
+PluginImporter:
+ serializedVersion: 1
+ iconMap: {}
+ executionOrder: {}
+ isPreloaded: 0
+ platformData:
+ Android:
+ enabled: 0
+ settings:
+ CPU: AnyCPU
+ Any:
+ enabled: 0
+ settings: {}
+ Editor:
+ enabled: 1
+ settings:
+ CPU: AnyCPU
+ DefaultValueInitialized: true
+ OS: AnyOS
+ Linux:
+ enabled: 0
+ settings:
+ CPU: None
+ Linux64:
+ enabled: 0
+ settings:
+ CPU: None
+ LinuxUniversal:
+ enabled: 0
+ settings:
+ CPU: None
+ OSXIntel:
+ enabled: 0
+ settings:
+ CPU: None
+ OSXIntel64:
+ enabled: 0
+ settings:
+ CPU: None
+ OSXUniversal:
+ enabled: 0
+ settings:
+ CPU: None
+ Web:
+ enabled: 0
+ settings: {}
+ WebStreamed:
+ enabled: 0
+ settings: {}
+ Win:
+ enabled: 0
+ settings:
+ CPU: None
+ Win64:
+ enabled: 1
+ settings:
+ CPU: x86_64
+ WindowsStoreApps:
+ enabled: 0
+ settings:
+ CPU: AnyCPU
+ iOS:
+ enabled: 0
+ settings:
+ CompileFlags:
+ FrameworkDependencies:
+ tvOS:
+ enabled: 0
+ settings:
+ CompileFlags:
+ FrameworkDependencies:
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/Firebase/Plugins/x86_64/FirebaseCppMessaging.so b/Assets/Firebase/Plugins/x86_64/FirebaseCppMessaging.so
new file mode 100644
index 0000000..48d8889
Binary files /dev/null and b/Assets/Firebase/Plugins/x86_64/FirebaseCppMessaging.so differ
diff --git a/Assets/Firebase/Plugins/x86_64/FirebaseCppMessaging.so.meta b/Assets/Firebase/Plugins/x86_64/FirebaseCppMessaging.so.meta
new file mode 100644
index 0000000..6e6e0a5
--- /dev/null
+++ b/Assets/Firebase/Plugins/x86_64/FirebaseCppMessaging.so.meta
@@ -0,0 +1,81 @@
+fileFormatVersion: 2
+guid: 0625d28dbdd6464a9915e074cb465acf
+labels:
+- gvh
+- gvh_version-12.8.0
+- gvhp_exportpath-Firebase/Plugins/x86_64/FirebaseCppMessaging.so
+timeCreated: 1480838400
+PluginImporter:
+ serializedVersion: 1
+ iconMap: {}
+ executionOrder: {}
+ isPreloaded: 0
+ platformData:
+ Android:
+ enabled: 0
+ settings:
+ CPU: AnyCPU
+ Any:
+ enabled: 0
+ settings: {}
+ Editor:
+ enabled: 1
+ settings:
+ CPU: AnyCPU
+ DefaultValueInitialized: true
+ OS: AnyOS
+ Linux:
+ enabled: 0
+ settings:
+ CPU: None
+ Linux64:
+ enabled: 1
+ settings:
+ CPU: x86_64
+ LinuxUniversal:
+ enabled: 1
+ settings:
+ CPU: AnyCPU
+ OSXIntel:
+ enabled: 0
+ settings:
+ CPU: None
+ OSXIntel64:
+ enabled: 0
+ settings:
+ CPU: None
+ OSXUniversal:
+ enabled: 0
+ settings:
+ CPU: None
+ Web:
+ enabled: 0
+ settings: {}
+ WebStreamed:
+ enabled: 0
+ settings: {}
+ Win:
+ enabled: 0
+ settings:
+ CPU: None
+ Win64:
+ enabled: 0
+ settings:
+ CPU: None
+ WindowsStoreApps:
+ enabled: 0
+ settings:
+ CPU: AnyCPU
+ iOS:
+ enabled: 0
+ settings:
+ CompileFlags:
+ FrameworkDependencies:
+ tvOS:
+ enabled: 0
+ settings:
+ CompileFlags:
+ FrameworkDependencies:
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/Firebase/m2repository.meta b/Assets/Firebase/m2repository.meta
new file mode 100644
index 0000000..fbf0680
--- /dev/null
+++ b/Assets/Firebase/m2repository.meta
@@ -0,0 +1,8 @@
+fileFormatVersion: 2
+guid: 1cf9e5a06b484d645af49ced897aec26
+folderAsset: yes
+DefaultImporter:
+ externalObjects: {}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/Firebase/m2repository/com.meta b/Assets/Firebase/m2repository/com.meta
new file mode 100644
index 0000000..435942c
--- /dev/null
+++ b/Assets/Firebase/m2repository/com.meta
@@ -0,0 +1,8 @@
+fileFormatVersion: 2
+guid: 946c2a0cf1bc5db46bf8d34f0aa30b27
+folderAsset: yes
+DefaultImporter:
+ externalObjects: {}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/Firebase/m2repository/com/google.meta b/Assets/Firebase/m2repository/com/google.meta
new file mode 100644
index 0000000..bd26ea6
--- /dev/null
+++ b/Assets/Firebase/m2repository/com/google.meta
@@ -0,0 +1,8 @@
+fileFormatVersion: 2
+guid: 603b13f7ef5dcbb4e82488d0edb08a15
+folderAsset: yes
+DefaultImporter:
+ externalObjects: {}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/Firebase/m2repository/com/google/firebase.meta b/Assets/Firebase/m2repository/com/google/firebase.meta
new file mode 100644
index 0000000..b714619
--- /dev/null
+++ b/Assets/Firebase/m2repository/com/google/firebase.meta
@@ -0,0 +1,8 @@
+fileFormatVersion: 2
+guid: 49e471f77d9ee984c8f021d12c3ec434
+folderAsset: yes
+DefaultImporter:
+ externalObjects: {}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/Firebase/m2repository/com/google/firebase/firebase-analytics-unity.meta b/Assets/Firebase/m2repository/com/google/firebase/firebase-analytics-unity.meta
new file mode 100644
index 0000000..af5a35d
--- /dev/null
+++ b/Assets/Firebase/m2repository/com/google/firebase/firebase-analytics-unity.meta
@@ -0,0 +1,8 @@
+fileFormatVersion: 2
+guid: 017e482facc455f45a167c1346f3335c
+folderAsset: yes
+DefaultImporter:
+ externalObjects: {}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/Firebase/m2repository/com/google/firebase/firebase-analytics-unity/12.8.0.meta b/Assets/Firebase/m2repository/com/google/firebase/firebase-analytics-unity/12.8.0.meta
new file mode 100644
index 0000000..cd86344
--- /dev/null
+++ b/Assets/Firebase/m2repository/com/google/firebase/firebase-analytics-unity/12.8.0.meta
@@ -0,0 +1,8 @@
+fileFormatVersion: 2
+guid: 4af573860f3cf5341bc33823748b758a
+folderAsset: yes
+DefaultImporter:
+ externalObjects: {}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/Firebase/m2repository/com/google/firebase/firebase-analytics-unity/12.8.0/firebase-analytics-unity-12.8.0.pom b/Assets/Firebase/m2repository/com/google/firebase/firebase-analytics-unity/12.8.0/firebase-analytics-unity-12.8.0.pom
new file mode 100644
index 0000000..55594df
--- /dev/null
+++ b/Assets/Firebase/m2repository/com/google/firebase/firebase-analytics-unity/12.8.0/firebase-analytics-unity-12.8.0.pom
@@ -0,0 +1,9 @@
+
+
+ 4.0.0
+ com.google.firebase
+ firebase-analytics-unity
+ 12.8.0
+ srcaar
+
+
\ No newline at end of file
diff --git a/Assets/Firebase/m2repository/com/google/firebase/firebase-analytics-unity/12.8.0/firebase-analytics-unity-12.8.0.pom.meta b/Assets/Firebase/m2repository/com/google/firebase/firebase-analytics-unity/12.8.0/firebase-analytics-unity-12.8.0.pom.meta
new file mode 100644
index 0000000..319a55f
--- /dev/null
+++ b/Assets/Firebase/m2repository/com/google/firebase/firebase-analytics-unity/12.8.0/firebase-analytics-unity-12.8.0.pom.meta
@@ -0,0 +1,11 @@
+fileFormatVersion: 2
+guid: 487dec2845d948a3bc1e62c5156f3912
+labels:
+- gvh
+- gvh_version-12.8.0
+- gvhp_exportpath-Firebase/m2repository/com/google/firebase/firebase-analytics-unity/12.8.0/firebase-analytics-unity-12.8.0.pom
+timeCreated: 1480838400
+DefaultImporter:
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/Firebase/m2repository/com/google/firebase/firebase-analytics-unity/12.8.0/firebase-analytics-unity-12.8.0.srcaar b/Assets/Firebase/m2repository/com/google/firebase/firebase-analytics-unity/12.8.0/firebase-analytics-unity-12.8.0.srcaar
new file mode 100644
index 0000000..7ba86e6
Binary files /dev/null and b/Assets/Firebase/m2repository/com/google/firebase/firebase-analytics-unity/12.8.0/firebase-analytics-unity-12.8.0.srcaar differ
diff --git a/Assets/Firebase/m2repository/com/google/firebase/firebase-analytics-unity/12.8.0/firebase-analytics-unity-12.8.0.srcaar.meta b/Assets/Firebase/m2repository/com/google/firebase/firebase-analytics-unity/12.8.0/firebase-analytics-unity-12.8.0.srcaar.meta
new file mode 100644
index 0000000..b969003
--- /dev/null
+++ b/Assets/Firebase/m2repository/com/google/firebase/firebase-analytics-unity/12.8.0/firebase-analytics-unity-12.8.0.srcaar.meta
@@ -0,0 +1,11 @@
+fileFormatVersion: 2
+guid: 54052cbecb874f9692a8b382b61f214c
+labels:
+- gvh
+- gvh_version-12.8.0
+- gvhp_exportpath-Firebase/m2repository/com/google/firebase/firebase-analytics-unity/12.8.0/firebase-analytics-unity-12.8.0.srcaar
+timeCreated: 1480838400
+DefaultImporter:
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/Firebase/m2repository/com/google/firebase/firebase-analytics-unity/maven-metadata.xml b/Assets/Firebase/m2repository/com/google/firebase/firebase-analytics-unity/maven-metadata.xml
new file mode 100644
index 0000000..5615926
--- /dev/null
+++ b/Assets/Firebase/m2repository/com/google/firebase/firebase-analytics-unity/maven-metadata.xml
@@ -0,0 +1,9 @@
+
+ com.google.firebase
+ firebase-analytics-unity
+
+ 12.8.0
+ 12.8.0
+
+
+
diff --git a/Assets/Firebase/m2repository/com/google/firebase/firebase-analytics-unity/maven-metadata.xml.meta b/Assets/Firebase/m2repository/com/google/firebase/firebase-analytics-unity/maven-metadata.xml.meta
new file mode 100644
index 0000000..2f9d206
--- /dev/null
+++ b/Assets/Firebase/m2repository/com/google/firebase/firebase-analytics-unity/maven-metadata.xml.meta
@@ -0,0 +1,11 @@
+fileFormatVersion: 2
+guid: 291f81d8ae2745cf913a96d116f2e3f7
+labels:
+- gvh
+- gvh_version-12.8.0
+- gvhp_exportpath-Firebase/m2repository/com/google/firebase/firebase-analytics-unity/maven-metadata.xml
+timeCreated: 1480838400
+DefaultImporter:
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/Firebase/m2repository/com/google/firebase/firebase-app-unity.meta b/Assets/Firebase/m2repository/com/google/firebase/firebase-app-unity.meta
new file mode 100644
index 0000000..8071212
--- /dev/null
+++ b/Assets/Firebase/m2repository/com/google/firebase/firebase-app-unity.meta
@@ -0,0 +1,8 @@
+fileFormatVersion: 2
+guid: 582d326c3f53fda469626ce8f3a3b869
+folderAsset: yes
+DefaultImporter:
+ externalObjects: {}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/Firebase/m2repository/com/google/firebase/firebase-app-unity/12.8.0.meta b/Assets/Firebase/m2repository/com/google/firebase/firebase-app-unity/12.8.0.meta
new file mode 100644
index 0000000..741ce54
--- /dev/null
+++ b/Assets/Firebase/m2repository/com/google/firebase/firebase-app-unity/12.8.0.meta
@@ -0,0 +1,8 @@
+fileFormatVersion: 2
+guid: 9622959658a108941941f91dbce13455
+folderAsset: yes
+DefaultImporter:
+ externalObjects: {}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/Firebase/m2repository/com/google/firebase/firebase-app-unity/12.8.0/firebase-app-unity-12.8.0.pom b/Assets/Firebase/m2repository/com/google/firebase/firebase-app-unity/12.8.0/firebase-app-unity-12.8.0.pom
new file mode 100644
index 0000000..6a0a771
--- /dev/null
+++ b/Assets/Firebase/m2repository/com/google/firebase/firebase-app-unity/12.8.0/firebase-app-unity-12.8.0.pom
@@ -0,0 +1,9 @@
+
+
+ 4.0.0
+ com.google.firebase
+ firebase-app-unity
+ 12.8.0
+ srcaar
+
+
\ No newline at end of file
diff --git a/Assets/Firebase/m2repository/com/google/firebase/firebase-app-unity/12.8.0/firebase-app-unity-12.8.0.pom.meta b/Assets/Firebase/m2repository/com/google/firebase/firebase-app-unity/12.8.0/firebase-app-unity-12.8.0.pom.meta
new file mode 100644
index 0000000..df315b7
--- /dev/null
+++ b/Assets/Firebase/m2repository/com/google/firebase/firebase-app-unity/12.8.0/firebase-app-unity-12.8.0.pom.meta
@@ -0,0 +1,11 @@
+fileFormatVersion: 2
+guid: e7114db9d92c4fe5bf7c3a64c9b144fd
+labels:
+- gvh
+- gvh_version-12.8.0
+- gvhp_exportpath-Firebase/m2repository/com/google/firebase/firebase-app-unity/12.8.0/firebase-app-unity-12.8.0.pom
+timeCreated: 1480838400
+DefaultImporter:
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/Firebase/m2repository/com/google/firebase/firebase-app-unity/12.8.0/firebase-app-unity-12.8.0.srcaar b/Assets/Firebase/m2repository/com/google/firebase/firebase-app-unity/12.8.0/firebase-app-unity-12.8.0.srcaar
new file mode 100644
index 0000000..7bae5c4
Binary files /dev/null and b/Assets/Firebase/m2repository/com/google/firebase/firebase-app-unity/12.8.0/firebase-app-unity-12.8.0.srcaar differ
diff --git a/Assets/Firebase/m2repository/com/google/firebase/firebase-app-unity/12.8.0/firebase-app-unity-12.8.0.srcaar.meta b/Assets/Firebase/m2repository/com/google/firebase/firebase-app-unity/12.8.0/firebase-app-unity-12.8.0.srcaar.meta
new file mode 100644
index 0000000..a0380c9
--- /dev/null
+++ b/Assets/Firebase/m2repository/com/google/firebase/firebase-app-unity/12.8.0/firebase-app-unity-12.8.0.srcaar.meta
@@ -0,0 +1,11 @@
+fileFormatVersion: 2
+guid: dcdbd7f82aa84194ad72a68e3ce9b47d
+labels:
+- gvh
+- gvh_version-12.8.0
+- gvhp_exportpath-Firebase/m2repository/com/google/firebase/firebase-app-unity/12.8.0/firebase-app-unity-12.8.0.srcaar
+timeCreated: 1480838400
+DefaultImporter:
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/Firebase/m2repository/com/google/firebase/firebase-app-unity/maven-metadata.xml b/Assets/Firebase/m2repository/com/google/firebase/firebase-app-unity/maven-metadata.xml
new file mode 100644
index 0000000..3ec2e1c
--- /dev/null
+++ b/Assets/Firebase/m2repository/com/google/firebase/firebase-app-unity/maven-metadata.xml
@@ -0,0 +1,9 @@
+
+ com.google.firebase
+ firebase-app-unity
+
+ 12.8.0
+ 12.8.0
+
+
+
diff --git a/Assets/Firebase/m2repository/com/google/firebase/firebase-app-unity/maven-metadata.xml.meta b/Assets/Firebase/m2repository/com/google/firebase/firebase-app-unity/maven-metadata.xml.meta
new file mode 100644
index 0000000..68113e2
--- /dev/null
+++ b/Assets/Firebase/m2repository/com/google/firebase/firebase-app-unity/maven-metadata.xml.meta
@@ -0,0 +1,11 @@
+fileFormatVersion: 2
+guid: 96337775a7c941d88ea15f8026ad6f8e
+labels:
+- gvh
+- gvh_version-12.8.0
+- gvhp_exportpath-Firebase/m2repository/com/google/firebase/firebase-app-unity/maven-metadata.xml
+timeCreated: 1480838400
+DefaultImporter:
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/Firebase/m2repository/com/google/firebase/firebase-crashlytics-unity.meta b/Assets/Firebase/m2repository/com/google/firebase/firebase-crashlytics-unity.meta
new file mode 100644
index 0000000..2219470
--- /dev/null
+++ b/Assets/Firebase/m2repository/com/google/firebase/firebase-crashlytics-unity.meta
@@ -0,0 +1,8 @@
+fileFormatVersion: 2
+guid: 3842e3e163edd5e48be271ba2839dcd6
+folderAsset: yes
+DefaultImporter:
+ externalObjects: {}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/Firebase/m2repository/com/google/firebase/firebase-crashlytics-unity/12.8.0.meta b/Assets/Firebase/m2repository/com/google/firebase/firebase-crashlytics-unity/12.8.0.meta
new file mode 100644
index 0000000..50d85e9
--- /dev/null
+++ b/Assets/Firebase/m2repository/com/google/firebase/firebase-crashlytics-unity/12.8.0.meta
@@ -0,0 +1,8 @@
+fileFormatVersion: 2
+guid: f4d712409c2c945478f2edbc2d7ef21c
+folderAsset: yes
+DefaultImporter:
+ externalObjects: {}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/Firebase/m2repository/com/google/firebase/firebase-crashlytics-unity/12.8.0/firebase-crashlytics-unity-12.8.0.pom b/Assets/Firebase/m2repository/com/google/firebase/firebase-crashlytics-unity/12.8.0/firebase-crashlytics-unity-12.8.0.pom
new file mode 100644
index 0000000..737e0e8
--- /dev/null
+++ b/Assets/Firebase/m2repository/com/google/firebase/firebase-crashlytics-unity/12.8.0/firebase-crashlytics-unity-12.8.0.pom
@@ -0,0 +1,9 @@
+
+
+ 4.0.0
+ com.google.firebase
+ firebase-crashlytics-unity
+ 12.8.0
+ srcaar
+
+
\ No newline at end of file
diff --git a/Assets/Firebase/m2repository/com/google/firebase/firebase-crashlytics-unity/12.8.0/firebase-crashlytics-unity-12.8.0.pom.meta b/Assets/Firebase/m2repository/com/google/firebase/firebase-crashlytics-unity/12.8.0/firebase-crashlytics-unity-12.8.0.pom.meta
new file mode 100644
index 0000000..037b09e
--- /dev/null
+++ b/Assets/Firebase/m2repository/com/google/firebase/firebase-crashlytics-unity/12.8.0/firebase-crashlytics-unity-12.8.0.pom.meta
@@ -0,0 +1,11 @@
+fileFormatVersion: 2
+guid: 951ffca241f3498dab7f2e8a17e86c5e
+labels:
+- gvh
+- gvh_version-12.8.0
+- gvhp_exportpath-Firebase/m2repository/com/google/firebase/firebase-crashlytics-unity/12.8.0/firebase-crashlytics-unity-12.8.0.pom
+timeCreated: 1480838400
+DefaultImporter:
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/Firebase/m2repository/com/google/firebase/firebase-crashlytics-unity/12.8.0/firebase-crashlytics-unity-12.8.0.srcaar b/Assets/Firebase/m2repository/com/google/firebase/firebase-crashlytics-unity/12.8.0/firebase-crashlytics-unity-12.8.0.srcaar
new file mode 100644
index 0000000..71df1af
Binary files /dev/null and b/Assets/Firebase/m2repository/com/google/firebase/firebase-crashlytics-unity/12.8.0/firebase-crashlytics-unity-12.8.0.srcaar differ
diff --git a/Assets/Firebase/m2repository/com/google/firebase/firebase-crashlytics-unity/12.8.0/firebase-crashlytics-unity-12.8.0.srcaar.meta b/Assets/Firebase/m2repository/com/google/firebase/firebase-crashlytics-unity/12.8.0/firebase-crashlytics-unity-12.8.0.srcaar.meta
new file mode 100644
index 0000000..d5fd1a5
--- /dev/null
+++ b/Assets/Firebase/m2repository/com/google/firebase/firebase-crashlytics-unity/12.8.0/firebase-crashlytics-unity-12.8.0.srcaar.meta
@@ -0,0 +1,11 @@
+fileFormatVersion: 2
+guid: 267d8a989a0b48b5be3ba6b7c7c95716
+labels:
+- gvh
+- gvh_version-12.8.0
+- gvhp_exportpath-Firebase/m2repository/com/google/firebase/firebase-crashlytics-unity/12.8.0/firebase-crashlytics-unity-12.8.0.srcaar
+timeCreated: 1480838400
+DefaultImporter:
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/Firebase/m2repository/com/google/firebase/firebase-crashlytics-unity/maven-metadata.xml b/Assets/Firebase/m2repository/com/google/firebase/firebase-crashlytics-unity/maven-metadata.xml
new file mode 100644
index 0000000..2bc25b5
--- /dev/null
+++ b/Assets/Firebase/m2repository/com/google/firebase/firebase-crashlytics-unity/maven-metadata.xml
@@ -0,0 +1,9 @@
+
+ com.google.firebase
+ firebase-crashlytics-unity
+
+ 12.8.0
+ 12.8.0
+
+
+
diff --git a/Assets/Firebase/m2repository/com/google/firebase/firebase-crashlytics-unity/maven-metadata.xml.meta b/Assets/Firebase/m2repository/com/google/firebase/firebase-crashlytics-unity/maven-metadata.xml.meta
new file mode 100644
index 0000000..c1893a5
--- /dev/null
+++ b/Assets/Firebase/m2repository/com/google/firebase/firebase-crashlytics-unity/maven-metadata.xml.meta
@@ -0,0 +1,11 @@
+fileFormatVersion: 2
+guid: eda65244fc1b407e8948b25b31c17991
+labels:
+- gvh
+- gvh_version-12.8.0
+- gvhp_exportpath-Firebase/m2repository/com/google/firebase/firebase-crashlytics-unity/maven-metadata.xml
+timeCreated: 1480838400
+DefaultImporter:
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/Firebase/m2repository/com/google/firebase/firebase-messaging-unity.meta b/Assets/Firebase/m2repository/com/google/firebase/firebase-messaging-unity.meta
new file mode 100644
index 0000000..111b081
--- /dev/null
+++ b/Assets/Firebase/m2repository/com/google/firebase/firebase-messaging-unity.meta
@@ -0,0 +1,8 @@
+fileFormatVersion: 2
+guid: 93d8867ae32fcd044b24237cd23f39b1
+folderAsset: yes
+DefaultImporter:
+ externalObjects: {}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/Firebase/m2repository/com/google/firebase/firebase-messaging-unity/12.8.0.meta b/Assets/Firebase/m2repository/com/google/firebase/firebase-messaging-unity/12.8.0.meta
new file mode 100644
index 0000000..db01989
--- /dev/null
+++ b/Assets/Firebase/m2repository/com/google/firebase/firebase-messaging-unity/12.8.0.meta
@@ -0,0 +1,8 @@
+fileFormatVersion: 2
+guid: 2a9a16643e9b16748a01cb73e813dada
+folderAsset: yes
+DefaultImporter:
+ externalObjects: {}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/Firebase/m2repository/com/google/firebase/firebase-messaging-unity/12.8.0/firebase-messaging-unity-12.8.0.pom b/Assets/Firebase/m2repository/com/google/firebase/firebase-messaging-unity/12.8.0/firebase-messaging-unity-12.8.0.pom
new file mode 100644
index 0000000..ae1ae5f
--- /dev/null
+++ b/Assets/Firebase/m2repository/com/google/firebase/firebase-messaging-unity/12.8.0/firebase-messaging-unity-12.8.0.pom
@@ -0,0 +1,9 @@
+
+
+ 4.0.0
+ com.google.firebase
+ firebase-messaging-unity
+ 12.8.0
+ srcaar
+
+
\ No newline at end of file
diff --git a/Assets/Firebase/m2repository/com/google/firebase/firebase-messaging-unity/12.8.0/firebase-messaging-unity-12.8.0.pom.meta b/Assets/Firebase/m2repository/com/google/firebase/firebase-messaging-unity/12.8.0/firebase-messaging-unity-12.8.0.pom.meta
new file mode 100644
index 0000000..2778f64
--- /dev/null
+++ b/Assets/Firebase/m2repository/com/google/firebase/firebase-messaging-unity/12.8.0/firebase-messaging-unity-12.8.0.pom.meta
@@ -0,0 +1,11 @@
+fileFormatVersion: 2
+guid: 46b0b84f2b4245feb818749b379fc5e1
+labels:
+- gvh
+- gvh_version-12.8.0
+- gvhp_exportpath-Firebase/m2repository/com/google/firebase/firebase-messaging-unity/12.8.0/firebase-messaging-unity-12.8.0.pom
+timeCreated: 1480838400
+DefaultImporter:
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/Firebase/m2repository/com/google/firebase/firebase-messaging-unity/12.8.0/firebase-messaging-unity-12.8.0.srcaar b/Assets/Firebase/m2repository/com/google/firebase/firebase-messaging-unity/12.8.0/firebase-messaging-unity-12.8.0.srcaar
new file mode 100644
index 0000000..2d49fc8
Binary files /dev/null and b/Assets/Firebase/m2repository/com/google/firebase/firebase-messaging-unity/12.8.0/firebase-messaging-unity-12.8.0.srcaar differ
diff --git a/Assets/Firebase/m2repository/com/google/firebase/firebase-messaging-unity/12.8.0/firebase-messaging-unity-12.8.0.srcaar.meta b/Assets/Firebase/m2repository/com/google/firebase/firebase-messaging-unity/12.8.0/firebase-messaging-unity-12.8.0.srcaar.meta
new file mode 100644
index 0000000..7c17573
--- /dev/null
+++ b/Assets/Firebase/m2repository/com/google/firebase/firebase-messaging-unity/12.8.0/firebase-messaging-unity-12.8.0.srcaar.meta
@@ -0,0 +1,11 @@
+fileFormatVersion: 2
+guid: 73575eff53f94b15b607c2e2defa3d0b
+labels:
+- gvh
+- gvh_version-12.8.0
+- gvhp_exportpath-Firebase/m2repository/com/google/firebase/firebase-messaging-unity/12.8.0/firebase-messaging-unity-12.8.0.srcaar
+timeCreated: 1480838400
+DefaultImporter:
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/Firebase/m2repository/com/google/firebase/firebase-messaging-unity/maven-metadata.xml b/Assets/Firebase/m2repository/com/google/firebase/firebase-messaging-unity/maven-metadata.xml
new file mode 100644
index 0000000..48e4afe
--- /dev/null
+++ b/Assets/Firebase/m2repository/com/google/firebase/firebase-messaging-unity/maven-metadata.xml
@@ -0,0 +1,9 @@
+
+ com.google.firebase
+ firebase-messaging-unity
+
+ 12.8.0
+ 12.8.0
+
+
+
diff --git a/Assets/Firebase/m2repository/com/google/firebase/firebase-messaging-unity/maven-metadata.xml.meta b/Assets/Firebase/m2repository/com/google/firebase/firebase-messaging-unity/maven-metadata.xml.meta
new file mode 100644
index 0000000..1f05a73
--- /dev/null
+++ b/Assets/Firebase/m2repository/com/google/firebase/firebase-messaging-unity/maven-metadata.xml.meta
@@ -0,0 +1,11 @@
+fileFormatVersion: 2
+guid: f6a5eb4df3694f6dac9ddc5451ac17db
+labels:
+- gvh
+- gvh_version-12.8.0
+- gvhp_exportpath-Firebase/m2repository/com/google/firebase/firebase-messaging-unity/maven-metadata.xml
+timeCreated: 1480838400
+DefaultImporter:
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/GeneratedLocalRepo.meta b/Assets/GeneratedLocalRepo.meta
new file mode 100644
index 0000000..e913853
--- /dev/null
+++ b/Assets/GeneratedLocalRepo.meta
@@ -0,0 +1,8 @@
+fileFormatVersion: 2
+guid: ef31d9304c845a5409e16cc234aa2b27
+folderAsset: yes
+DefaultImporter:
+ externalObjects: {}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/GeneratedLocalRepo/Firebase.meta b/Assets/GeneratedLocalRepo/Firebase.meta
new file mode 100644
index 0000000..6e7c252
--- /dev/null
+++ b/Assets/GeneratedLocalRepo/Firebase.meta
@@ -0,0 +1,8 @@
+fileFormatVersion: 2
+guid: 8ad33eef1e326a046abe885dc4ad70c3
+folderAsset: yes
+DefaultImporter:
+ externalObjects: {}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/GeneratedLocalRepo/Firebase/m2repository.meta b/Assets/GeneratedLocalRepo/Firebase/m2repository.meta
new file mode 100644
index 0000000..522b99c
--- /dev/null
+++ b/Assets/GeneratedLocalRepo/Firebase/m2repository.meta
@@ -0,0 +1,8 @@
+fileFormatVersion: 2
+guid: 6e3cb11db6a63e24c9a2b519c7eb839a
+folderAsset: yes
+DefaultImporter:
+ externalObjects: {}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/GeneratedLocalRepo/Firebase/m2repository/com.meta b/Assets/GeneratedLocalRepo/Firebase/m2repository/com.meta
new file mode 100644
index 0000000..d128865
--- /dev/null
+++ b/Assets/GeneratedLocalRepo/Firebase/m2repository/com.meta
@@ -0,0 +1,8 @@
+fileFormatVersion: 2
+guid: 1d333d8717a443941914e587abd1b8a7
+folderAsset: yes
+DefaultImporter:
+ externalObjects: {}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/GeneratedLocalRepo/Firebase/m2repository/com/google.meta b/Assets/GeneratedLocalRepo/Firebase/m2repository/com/google.meta
new file mode 100644
index 0000000..2dcbe92
--- /dev/null
+++ b/Assets/GeneratedLocalRepo/Firebase/m2repository/com/google.meta
@@ -0,0 +1,8 @@
+fileFormatVersion: 2
+guid: d829867bf6b775d418c66b24abb19984
+folderAsset: yes
+DefaultImporter:
+ externalObjects: {}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/GeneratedLocalRepo/Firebase/m2repository/com/google/firebase.meta b/Assets/GeneratedLocalRepo/Firebase/m2repository/com/google/firebase.meta
new file mode 100644
index 0000000..970881a
--- /dev/null
+++ b/Assets/GeneratedLocalRepo/Firebase/m2repository/com/google/firebase.meta
@@ -0,0 +1,8 @@
+fileFormatVersion: 2
+guid: d8e811b9f66d6484a973d08d5d2ee3f2
+folderAsset: yes
+DefaultImporter:
+ externalObjects: {}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/GeneratedLocalRepo/Firebase/m2repository/com/google/firebase/firebase-analytics-unity.meta b/Assets/GeneratedLocalRepo/Firebase/m2repository/com/google/firebase/firebase-analytics-unity.meta
new file mode 100644
index 0000000..454c311
--- /dev/null
+++ b/Assets/GeneratedLocalRepo/Firebase/m2repository/com/google/firebase/firebase-analytics-unity.meta
@@ -0,0 +1,8 @@
+fileFormatVersion: 2
+guid: 9b0c5a2aedd723d4ab0fc02caf561d6b
+folderAsset: yes
+DefaultImporter:
+ externalObjects: {}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/GeneratedLocalRepo/Firebase/m2repository/com/google/firebase/firebase-analytics-unity/12.8.0.meta b/Assets/GeneratedLocalRepo/Firebase/m2repository/com/google/firebase/firebase-analytics-unity/12.8.0.meta
new file mode 100644
index 0000000..98e7c74
--- /dev/null
+++ b/Assets/GeneratedLocalRepo/Firebase/m2repository/com/google/firebase/firebase-analytics-unity/12.8.0.meta
@@ -0,0 +1,8 @@
+fileFormatVersion: 2
+guid: 44f0a95af761f9249a428d284df8d666
+folderAsset: yes
+DefaultImporter:
+ externalObjects: {}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/GeneratedLocalRepo/Firebase/m2repository/com/google/firebase/firebase-analytics-unity/12.8.0/firebase-analytics-unity-12.8.0.aar b/Assets/GeneratedLocalRepo/Firebase/m2repository/com/google/firebase/firebase-analytics-unity/12.8.0/firebase-analytics-unity-12.8.0.aar
new file mode 100644
index 0000000..7ba86e6
Binary files /dev/null and b/Assets/GeneratedLocalRepo/Firebase/m2repository/com/google/firebase/firebase-analytics-unity/12.8.0/firebase-analytics-unity-12.8.0.aar differ
diff --git a/Assets/GeneratedLocalRepo/Firebase/m2repository/com/google/firebase/firebase-analytics-unity/12.8.0/firebase-analytics-unity-12.8.0.aar.meta b/Assets/GeneratedLocalRepo/Firebase/m2repository/com/google/firebase/firebase-analytics-unity/12.8.0/firebase-analytics-unity-12.8.0.aar.meta
new file mode 100644
index 0000000..d3aa964
--- /dev/null
+++ b/Assets/GeneratedLocalRepo/Firebase/m2repository/com/google/firebase/firebase-analytics-unity/12.8.0/firebase-analytics-unity-12.8.0.aar.meta
@@ -0,0 +1,34 @@
+fileFormatVersion: 2
+guid: d329be592e4c5cc4480c2b33699a1915
+labels:
+- gpsr
+PluginImporter:
+ externalObjects: {}
+ serializedVersion: 2
+ iconMap: {}
+ executionOrder: {}
+ defineConstraints: []
+ isPreloaded: 0
+ isOverridable: 0
+ isExplicitlyReferenced: 0
+ validateReferences: 1
+ platformData:
+ - first:
+ Android: Android
+ second:
+ enabled: 0
+ settings: {}
+ - first:
+ Any:
+ second:
+ enabled: 0
+ settings: {}
+ - first:
+ Editor: Editor
+ second:
+ enabled: 0
+ settings:
+ DefaultValueInitialized: true
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/GeneratedLocalRepo/Firebase/m2repository/com/google/firebase/firebase-analytics-unity/12.8.0/firebase-analytics-unity-12.8.0.pom b/Assets/GeneratedLocalRepo/Firebase/m2repository/com/google/firebase/firebase-analytics-unity/12.8.0/firebase-analytics-unity-12.8.0.pom
new file mode 100644
index 0000000..441a75b
--- /dev/null
+++ b/Assets/GeneratedLocalRepo/Firebase/m2repository/com/google/firebase/firebase-analytics-unity/12.8.0/firebase-analytics-unity-12.8.0.pom
@@ -0,0 +1,9 @@
+
+
+ 4.0.0
+ com.google.firebase
+ firebase-analytics-unity
+ 12.8.0
+ aar
+
+
\ No newline at end of file
diff --git a/Assets/GeneratedLocalRepo/Firebase/m2repository/com/google/firebase/firebase-analytics-unity/12.8.0/firebase-analytics-unity-12.8.0.pom.meta b/Assets/GeneratedLocalRepo/Firebase/m2repository/com/google/firebase/firebase-analytics-unity/12.8.0/firebase-analytics-unity-12.8.0.pom.meta
new file mode 100644
index 0000000..3c10019
--- /dev/null
+++ b/Assets/GeneratedLocalRepo/Firebase/m2repository/com/google/firebase/firebase-analytics-unity/12.8.0/firebase-analytics-unity-12.8.0.pom.meta
@@ -0,0 +1,9 @@
+fileFormatVersion: 2
+guid: a2aa40ce243681f4d85a56aace6294c9
+labels:
+- gpsr
+DefaultImporter:
+ externalObjects: {}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/GeneratedLocalRepo/Firebase/m2repository/com/google/firebase/firebase-app-unity.meta b/Assets/GeneratedLocalRepo/Firebase/m2repository/com/google/firebase/firebase-app-unity.meta
new file mode 100644
index 0000000..0a6ae3c
--- /dev/null
+++ b/Assets/GeneratedLocalRepo/Firebase/m2repository/com/google/firebase/firebase-app-unity.meta
@@ -0,0 +1,8 @@
+fileFormatVersion: 2
+guid: 90f19498e8d9fd4418fa7d154ff9e000
+folderAsset: yes
+DefaultImporter:
+ externalObjects: {}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/GeneratedLocalRepo/Firebase/m2repository/com/google/firebase/firebase-app-unity/12.8.0.meta b/Assets/GeneratedLocalRepo/Firebase/m2repository/com/google/firebase/firebase-app-unity/12.8.0.meta
new file mode 100644
index 0000000..37a5163
--- /dev/null
+++ b/Assets/GeneratedLocalRepo/Firebase/m2repository/com/google/firebase/firebase-app-unity/12.8.0.meta
@@ -0,0 +1,8 @@
+fileFormatVersion: 2
+guid: 7d1c44b73803dad46a71faba9ef925c2
+folderAsset: yes
+DefaultImporter:
+ externalObjects: {}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/GeneratedLocalRepo/Firebase/m2repository/com/google/firebase/firebase-app-unity/12.8.0/firebase-app-unity-12.8.0.aar b/Assets/GeneratedLocalRepo/Firebase/m2repository/com/google/firebase/firebase-app-unity/12.8.0/firebase-app-unity-12.8.0.aar
new file mode 100644
index 0000000..7bae5c4
Binary files /dev/null and b/Assets/GeneratedLocalRepo/Firebase/m2repository/com/google/firebase/firebase-app-unity/12.8.0/firebase-app-unity-12.8.0.aar differ
diff --git a/Assets/GeneratedLocalRepo/Firebase/m2repository/com/google/firebase/firebase-app-unity/12.8.0/firebase-app-unity-12.8.0.aar.meta b/Assets/GeneratedLocalRepo/Firebase/m2repository/com/google/firebase/firebase-app-unity/12.8.0/firebase-app-unity-12.8.0.aar.meta
new file mode 100644
index 0000000..a2c7f9a
--- /dev/null
+++ b/Assets/GeneratedLocalRepo/Firebase/m2repository/com/google/firebase/firebase-app-unity/12.8.0/firebase-app-unity-12.8.0.aar.meta
@@ -0,0 +1,34 @@
+fileFormatVersion: 2
+guid: 24c85b4455086ca40b18125a193bb16c
+labels:
+- gpsr
+PluginImporter:
+ externalObjects: {}
+ serializedVersion: 2
+ iconMap: {}
+ executionOrder: {}
+ defineConstraints: []
+ isPreloaded: 0
+ isOverridable: 0
+ isExplicitlyReferenced: 0
+ validateReferences: 1
+ platformData:
+ - first:
+ Android: Android
+ second:
+ enabled: 0
+ settings: {}
+ - first:
+ Any:
+ second:
+ enabled: 0
+ settings: {}
+ - first:
+ Editor: Editor
+ second:
+ enabled: 0
+ settings:
+ DefaultValueInitialized: true
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/GeneratedLocalRepo/Firebase/m2repository/com/google/firebase/firebase-app-unity/12.8.0/firebase-app-unity-12.8.0.pom b/Assets/GeneratedLocalRepo/Firebase/m2repository/com/google/firebase/firebase-app-unity/12.8.0/firebase-app-unity-12.8.0.pom
new file mode 100644
index 0000000..eba6576
--- /dev/null
+++ b/Assets/GeneratedLocalRepo/Firebase/m2repository/com/google/firebase/firebase-app-unity/12.8.0/firebase-app-unity-12.8.0.pom
@@ -0,0 +1,9 @@
+
+
+ 4.0.0
+ com.google.firebase
+ firebase-app-unity
+ 12.8.0
+ aar
+
+
\ No newline at end of file
diff --git a/Assets/GeneratedLocalRepo/Firebase/m2repository/com/google/firebase/firebase-app-unity/12.8.0/firebase-app-unity-12.8.0.pom.meta b/Assets/GeneratedLocalRepo/Firebase/m2repository/com/google/firebase/firebase-app-unity/12.8.0/firebase-app-unity-12.8.0.pom.meta
new file mode 100644
index 0000000..f719b85
--- /dev/null
+++ b/Assets/GeneratedLocalRepo/Firebase/m2repository/com/google/firebase/firebase-app-unity/12.8.0/firebase-app-unity-12.8.0.pom.meta
@@ -0,0 +1,9 @@
+fileFormatVersion: 2
+guid: 054e8e14b678df3458cedd8b1896f2a0
+labels:
+- gpsr
+DefaultImporter:
+ externalObjects: {}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/GeneratedLocalRepo/Firebase/m2repository/com/google/firebase/firebase-crashlytics-unity.meta b/Assets/GeneratedLocalRepo/Firebase/m2repository/com/google/firebase/firebase-crashlytics-unity.meta
new file mode 100644
index 0000000..61365ae
--- /dev/null
+++ b/Assets/GeneratedLocalRepo/Firebase/m2repository/com/google/firebase/firebase-crashlytics-unity.meta
@@ -0,0 +1,8 @@
+fileFormatVersion: 2
+guid: 2d3fbf3eb6b9c3e4eaa65d4014cc6ebf
+folderAsset: yes
+DefaultImporter:
+ externalObjects: {}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/GeneratedLocalRepo/Firebase/m2repository/com/google/firebase/firebase-crashlytics-unity/12.8.0.meta b/Assets/GeneratedLocalRepo/Firebase/m2repository/com/google/firebase/firebase-crashlytics-unity/12.8.0.meta
new file mode 100644
index 0000000..853af85
--- /dev/null
+++ b/Assets/GeneratedLocalRepo/Firebase/m2repository/com/google/firebase/firebase-crashlytics-unity/12.8.0.meta
@@ -0,0 +1,8 @@
+fileFormatVersion: 2
+guid: 93437f1ad21bb5240bb790e22f310ef4
+folderAsset: yes
+DefaultImporter:
+ externalObjects: {}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/GeneratedLocalRepo/Firebase/m2repository/com/google/firebase/firebase-crashlytics-unity/12.8.0/firebase-crashlytics-unity-12.8.0.aar b/Assets/GeneratedLocalRepo/Firebase/m2repository/com/google/firebase/firebase-crashlytics-unity/12.8.0/firebase-crashlytics-unity-12.8.0.aar
new file mode 100644
index 0000000..71df1af
Binary files /dev/null and b/Assets/GeneratedLocalRepo/Firebase/m2repository/com/google/firebase/firebase-crashlytics-unity/12.8.0/firebase-crashlytics-unity-12.8.0.aar differ
diff --git a/Assets/GeneratedLocalRepo/Firebase/m2repository/com/google/firebase/firebase-crashlytics-unity/12.8.0/firebase-crashlytics-unity-12.8.0.aar.meta b/Assets/GeneratedLocalRepo/Firebase/m2repository/com/google/firebase/firebase-crashlytics-unity/12.8.0/firebase-crashlytics-unity-12.8.0.aar.meta
new file mode 100644
index 0000000..cb40949
--- /dev/null
+++ b/Assets/GeneratedLocalRepo/Firebase/m2repository/com/google/firebase/firebase-crashlytics-unity/12.8.0/firebase-crashlytics-unity-12.8.0.aar.meta
@@ -0,0 +1,34 @@
+fileFormatVersion: 2
+guid: f9a69ca143f5c37468611f4e763ec238
+labels:
+- gpsr
+PluginImporter:
+ externalObjects: {}
+ serializedVersion: 2
+ iconMap: {}
+ executionOrder: {}
+ defineConstraints: []
+ isPreloaded: 0
+ isOverridable: 0
+ isExplicitlyReferenced: 0
+ validateReferences: 1
+ platformData:
+ - first:
+ Android: Android
+ second:
+ enabled: 0
+ settings: {}
+ - first:
+ Any:
+ second:
+ enabled: 0
+ settings: {}
+ - first:
+ Editor: Editor
+ second:
+ enabled: 0
+ settings:
+ DefaultValueInitialized: true
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/GeneratedLocalRepo/Firebase/m2repository/com/google/firebase/firebase-crashlytics-unity/12.8.0/firebase-crashlytics-unity-12.8.0.pom b/Assets/GeneratedLocalRepo/Firebase/m2repository/com/google/firebase/firebase-crashlytics-unity/12.8.0/firebase-crashlytics-unity-12.8.0.pom
new file mode 100644
index 0000000..f69e5a5
--- /dev/null
+++ b/Assets/GeneratedLocalRepo/Firebase/m2repository/com/google/firebase/firebase-crashlytics-unity/12.8.0/firebase-crashlytics-unity-12.8.0.pom
@@ -0,0 +1,9 @@
+
+
+ 4.0.0
+ com.google.firebase
+ firebase-crashlytics-unity
+ 12.8.0
+ aar
+
+
\ No newline at end of file
diff --git a/Assets/GeneratedLocalRepo/Firebase/m2repository/com/google/firebase/firebase-crashlytics-unity/12.8.0/firebase-crashlytics-unity-12.8.0.pom.meta b/Assets/GeneratedLocalRepo/Firebase/m2repository/com/google/firebase/firebase-crashlytics-unity/12.8.0/firebase-crashlytics-unity-12.8.0.pom.meta
new file mode 100644
index 0000000..6b1a094
--- /dev/null
+++ b/Assets/GeneratedLocalRepo/Firebase/m2repository/com/google/firebase/firebase-crashlytics-unity/12.8.0/firebase-crashlytics-unity-12.8.0.pom.meta
@@ -0,0 +1,9 @@
+fileFormatVersion: 2
+guid: 94dc1b2920705cb4aae3811bb93bb310
+labels:
+- gpsr
+DefaultImporter:
+ externalObjects: {}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/GeneratedLocalRepo/Firebase/m2repository/com/google/firebase/firebase-messaging-unity.meta b/Assets/GeneratedLocalRepo/Firebase/m2repository/com/google/firebase/firebase-messaging-unity.meta
new file mode 100644
index 0000000..f352e21
--- /dev/null
+++ b/Assets/GeneratedLocalRepo/Firebase/m2repository/com/google/firebase/firebase-messaging-unity.meta
@@ -0,0 +1,8 @@
+fileFormatVersion: 2
+guid: db81791426a7d404f952d45a7f3bb6f1
+folderAsset: yes
+DefaultImporter:
+ externalObjects: {}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/GeneratedLocalRepo/Firebase/m2repository/com/google/firebase/firebase-messaging-unity/12.8.0.meta b/Assets/GeneratedLocalRepo/Firebase/m2repository/com/google/firebase/firebase-messaging-unity/12.8.0.meta
new file mode 100644
index 0000000..6f6abf0
--- /dev/null
+++ b/Assets/GeneratedLocalRepo/Firebase/m2repository/com/google/firebase/firebase-messaging-unity/12.8.0.meta
@@ -0,0 +1,8 @@
+fileFormatVersion: 2
+guid: 444271c4e2f561640b89bece9ab979fa
+folderAsset: yes
+DefaultImporter:
+ externalObjects: {}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/GeneratedLocalRepo/Firebase/m2repository/com/google/firebase/firebase-messaging-unity/12.8.0/firebase-messaging-unity-12.8.0.aar b/Assets/GeneratedLocalRepo/Firebase/m2repository/com/google/firebase/firebase-messaging-unity/12.8.0/firebase-messaging-unity-12.8.0.aar
new file mode 100644
index 0000000..2d49fc8
Binary files /dev/null and b/Assets/GeneratedLocalRepo/Firebase/m2repository/com/google/firebase/firebase-messaging-unity/12.8.0/firebase-messaging-unity-12.8.0.aar differ
diff --git a/Assets/GeneratedLocalRepo/Firebase/m2repository/com/google/firebase/firebase-messaging-unity/12.8.0/firebase-messaging-unity-12.8.0.aar.meta b/Assets/GeneratedLocalRepo/Firebase/m2repository/com/google/firebase/firebase-messaging-unity/12.8.0/firebase-messaging-unity-12.8.0.aar.meta
new file mode 100644
index 0000000..f8e808d
--- /dev/null
+++ b/Assets/GeneratedLocalRepo/Firebase/m2repository/com/google/firebase/firebase-messaging-unity/12.8.0/firebase-messaging-unity-12.8.0.aar.meta
@@ -0,0 +1,34 @@
+fileFormatVersion: 2
+guid: 35c3b6861274f844da75a0ce799697bb
+labels:
+- gpsr
+PluginImporter:
+ externalObjects: {}
+ serializedVersion: 2
+ iconMap: {}
+ executionOrder: {}
+ defineConstraints: []
+ isPreloaded: 0
+ isOverridable: 0
+ isExplicitlyReferenced: 0
+ validateReferences: 1
+ platformData:
+ - first:
+ Android: Android
+ second:
+ enabled: 0
+ settings: {}
+ - first:
+ Any:
+ second:
+ enabled: 0
+ settings: {}
+ - first:
+ Editor: Editor
+ second:
+ enabled: 0
+ settings:
+ DefaultValueInitialized: true
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/GeneratedLocalRepo/Firebase/m2repository/com/google/firebase/firebase-messaging-unity/12.8.0/firebase-messaging-unity-12.8.0.pom b/Assets/GeneratedLocalRepo/Firebase/m2repository/com/google/firebase/firebase-messaging-unity/12.8.0/firebase-messaging-unity-12.8.0.pom
new file mode 100644
index 0000000..0daa8b4
--- /dev/null
+++ b/Assets/GeneratedLocalRepo/Firebase/m2repository/com/google/firebase/firebase-messaging-unity/12.8.0/firebase-messaging-unity-12.8.0.pom
@@ -0,0 +1,9 @@
+
+
+ 4.0.0
+ com.google.firebase
+ firebase-messaging-unity
+ 12.8.0
+ aar
+
+
\ No newline at end of file
diff --git a/Assets/GeneratedLocalRepo/Firebase/m2repository/com/google/firebase/firebase-messaging-unity/12.8.0/firebase-messaging-unity-12.8.0.pom.meta b/Assets/GeneratedLocalRepo/Firebase/m2repository/com/google/firebase/firebase-messaging-unity/12.8.0/firebase-messaging-unity-12.8.0.pom.meta
new file mode 100644
index 0000000..ea9ece4
--- /dev/null
+++ b/Assets/GeneratedLocalRepo/Firebase/m2repository/com/google/firebase/firebase-messaging-unity/12.8.0/firebase-messaging-unity-12.8.0.pom.meta
@@ -0,0 +1,9 @@
+fileFormatVersion: 2
+guid: 5e2310355589f2240b1c265be20ff953
+labels:
+- gpsr
+DefaultImporter:
+ externalObjects: {}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/GoogleMobileAds.meta b/Assets/GoogleMobileAds.meta
new file mode 100644
index 0000000..c942cc9
--- /dev/null
+++ b/Assets/GoogleMobileAds.meta
@@ -0,0 +1,8 @@
+fileFormatVersion: 2
+guid: 05951c9eb5d88414e81c0c7f9c565947
+folderAsset: yes
+DefaultImporter:
+ externalObjects: {}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/GoogleMobileAds/CHANGELOG.md b/Assets/GoogleMobileAds/CHANGELOG.md
new file mode 100644
index 0000000..3c6f69c
--- /dev/null
+++ b/Assets/GoogleMobileAds/CHANGELOG.md
@@ -0,0 +1,1502 @@
+Google Mobile Ads Unity Plugin Change Log
+
+**************
+Version 10.6.0
+**************
+
+- Updated the GMA iOS SDK dependency version to 12.12.0.
+- Added proguard rules to prevent minification of public APIs of GMA Android and UMP SDK.
+
+Built and tested with:
+
+- Google Mobile Ads Android SDK 24.5.0.
+- Google Mobile Ads iOS SDK 12.12.0.
+- Google User Messaging Platform Android SDK 3.2.0
+- Google User Messaging Platform iOS SDK 3.0.0
+- External Dependency Manager for Unity 1.2.186
+
+**************
+Version 10.5.0
+**************
+
+- Add `PlacementID` field to all formats.
+- Enable loading EDM4U for Editor platform while importing.
+- Fix a crash when `MobileAds.GetPlatformVersion` is called.
+- Fix missing `link.xml` when using the UPM package ([#3951](https://github.com/googleads/googleads-mobile-unity/issues/3951)).
+- Add the latest Unity Editor LTS version flag `2021_3_56` to `AndroidBuildPreProcessor`.
+
+Built and tested with:
+
+- Google Mobile Ads Android SDK 24.5.0.
+- Google Mobile Ads iOS SDK 12.11.0.
+- Google User Messaging Platform Android SDK 3.2.0
+- Google User Messaging Platform iOS SDK 3.0.0
+- External Dependency Manager for Unity 1.2.186
+
+**************
+Version 10.4.2
+**************
+
+- Fix issue with macros in `BuildPreProcessor` for Unity Editor 2021.
+- Added `androidx.lifecycle` dependency required for AppOpenAd.
+
+Built and tested with:
+
+- Google Mobile Ads Android SDK 24.5.0.
+- Google Mobile Ads iOS SDK 12.9.0.
+- Google User Messaging Platform Android SDK 3.2.0
+- Google User Messaging Platform iOS SDK 3.0.0
+- External Dependency Manager for Unity 1.2.186
+
+**************
+Version 10.4.1
+**************
+
+- **Version 10.4.0 has been deprecated. Please update to 10.4.1 instead.**
+- Add `package` and `minSdkVersion` attribute to AndroidManifest.xml.
+
+Built and tested with:
+
+- Google Mobile Ads Android SDK 24.5.0.
+- Google Mobile Ads iOS SDK 12.9.0.
+- Google User Messaging Platform Android SDK 3.2.0
+- Google User Messaging Platform iOS SDK 3.0.0
+- External Dependency Manager for Unity 1.2.186
+
+**************
+Version 10.4.0
+**************
+
+- Updated the GMA Android SDK dependency version to 24.5.0.
+- Updated the GMA iOS SDK dependency version to 12.9.0.
+- Added Android build post processor to solve common build issues. For more information see, [Enable Gradle build post processor](https://developers.google.com/admob/unity/android).
+- Fixed [#3718](https://github.com/googleads/googleads-mobile-unity/issues/3718).
+- Updated the Android library source code location according to Unity's [Android Library](https://docs.unity3d.com/Manual/android-library-plugin-create.html) [(aka bundled) plug-in](https://docs.unity3d.com/2019.4/Documentation/Manual/PluginInspector.html) format.
+ - **Old location:** [source/android-library](https://github.com/googleads/googleads-mobile-unity/tree/main/source/android-library)
+ - **New location:** [source/plugin/Assets/Plugins/Android/GoogleMobileAdsPlugin.androidlib](https://github.com/googleads/googleads-mobile-unity/tree/main/source/plugin/Assets/Plugins/Android/GoogleMobileAdsPlugin.androidlib)
+ - This change makes the SDK more streamlined to build from source.
+- Merged the Android Manifest files into a single one located under `src/main`.
+- Fixed [#3810](https://github.com/googleads/googleads-mobile-unity/issues/3810) - crash on `AdapterResponseInfo.AdSourceName`.
+
+Built and tested with:
+
+- Google Mobile Ads Android SDK 24.5.0.
+- Google Mobile Ads iOS SDK 12.9.0.
+- Google User Messaging Platform Android SDK 3.2.0
+- Google User Messaging Platform iOS SDK 3.0.0
+- External Dependency Manager for Unity 1.2.186
+
+**************
+Version 10.3.0
+**************
+
+- Updated the GMA Android SDK dependency version to 24.4.0.
+- Updated the GMA iOS SDK dependency version to 12.6.0.
+- Fixed `RaiseAdEventsOnUnityMainThread ` by ensuring the events are always called back on Main thread even if the SDK is called on background thread.
+
+Built and tested with:
+
+- Google Mobile Ads Android SDK 24.4.0.
+- Google Mobile Ads iOS SDK 12.6.0.
+- Google User Messaging Platform Android SDK 3.2.0
+- Google User Messaging Platform iOS SDK 3.0.0
+- External Dependency Manager for Unity 1.2.186
+
+**************
+Version 10.2.0
+**************
+- Updated the GMA Android SDK dependency version to 24.3.0.
+- Updated the GMA iOS SDK dependency version to 12.5.0.
+- Run AppOpen ads in Immersive mode for Android. This will prevent the 3 button navigation from showing up when ads are shown.
+
+Built and tested with:
+- Google Mobile Ads Android SDK 24.3.0.
+- Google Mobile Ads iOS SDK 12.5.0.
+- Google User Messaging Platform Android SDK 3.2.0
+- Google User Messaging Platform iOS SDK 3.0.0
+- External Dependency Manager for Unity 1.2.186
+
+**************
+Version 10.1.0
+**************
+- Updated UMP SDK dependency on Android to 3.2.0 and on iOS to 3.0.0.
+- Updated the GMA Android SDK dependency version to 24.2.0.
+- Updated the GMA iOS SDK dependency version to 12.3.0.
+- Updated SKAdNetworkIdentifiers List on iOS to reflect latest additions.
+- Supports Preloading APIs on iOS and Android.
+- Refactored Unity Editor Banner experience to be inline with Android and iOS behavior.
+- Fixed a bug on AdRequest where setting the CustomTargeting parameter was not being propagated.
+- Run fullscreen ads in Immersive mode for Android. This will prevent the 3 button navigation from showing up when ads are shown.
+- Fixed crash on rendering Native Overlay ads due to conflict of icon and background IDs with other similarly named Resource ID's.
+
+Built and tested with:
+- Google Mobile Ads Android SDK 24.2.0.
+- Google Mobile Ads iOS SDK 12.3.0.
+- Google User Messaging Platform Android SDK 3.2.0
+- Google User Messaging Platform iOS SDK 3.0.0
+- External Dependency Manager for Unity 1.2.185
+
+**************
+Version 10.0.0
+**************
+- Updated the GMA Android SDK dependency version to 24.1.0.
+- Updated the GMA iOS SDK dependency version to 12.2.0.
+- Removed deprecated `AdFailedToLoadEventArgs` class. Use `LoadAdError` directly.
+- Removed deprecated `AdValueEventArgs` class. Use `AdValue` directly.
+- Changed the default behavior to True for OPTIMIZE_INITIALIZATION and
+OPTIMIZE_AD_LOADING flags to align with GMA Android 24.0.0.
+- Replaced `Optimize Ad Loading` and `Optimize Initialization` with
+`Disable ad loading optimization` and `Disable initialization optimzation`
+- Removed "Remove property tag from GMA Android SDK" feature from Google Mobile
+Ads Editor Settings as this tag has been removed from GMA Android SDK v.24.0.0.
+- Removed Preloading APIs for iOS as part of upgrade to newer to newer APIs.
+
+Built and tested with:
+- Google Mobile Ads Android SDK 24.1.0.
+- Google Mobile Ads iOS SDK 12.2.0.
+- Google User Messaging Platform Android SDK 3.1.0
+- Google User Messaging Platform iOS SDK 2.7.0
+- External Dependency Manager for Unity 1.2.185
+
+**************
+Version 9.6.0
+**************
+- Added ability to return correct native template view size on Android.
+- Fixed issue with Native Overlay Icon not being clickable.
+- Added `GetVersion` API to MobileAds class to be able to fetch the GMA Unity SDK Version.
+- Fire `OnUserEarnedReward` once the ad counter expires when showing Rewarded ads in Unity Editor.
+
+Built and tested with:
+- Google Mobile Ads Android SDK 23.6.0
+- Google Mobile Ads iOS SDK 11.13.0
+- Google User Messaging Platform Android SDK 3.1.0
+- Google User Messaging Platform iOS SDK 2.7.0
+- External Dependency Manager for Unity 1.2.185
+
+**************
+Version 9.5.0
+**************
+- Added `CustomTargeting` field to AdRequest.
+- Added `GetPlatformVersion` API to MobileAds class to be able to fetch the version info of the underlying GMA Android or iOS SDK.
+- Updated the GMA iOS SDK dependency version to 11.13.0.
+- Updated the GMA Android SDK dependency version to 23.6.0.
+
+Built and tested with:
+- Google Mobile Ads Android SDK 23.6.0
+- Google Mobile Ads iOS SDK 11.13.0
+- Google User Messaging Platform Android SDK 3.1.0
+- Google User Messaging Platform iOS SDK 2.7.0
+- External Dependency Manager for Unity 1.2.183
+
+**************
+Version 9.4.0
+**************
+
+- To support testing with regulated US states, added the following options to UMPDebugGeography:
+ - RegulatedUSState
+ - Other
+- Deprecated `DebugGeography.NotEEA`. Use `DebugGeography.Other` instead.
+- Updated the GMA iOS SDK dependency version to 11.12.0.
+- Updated the GMA Android SDK dependency version to 23.5.0.
+- Updated UMP SDK dependency on Android to 3.1.0 and on iOS to 2.7.0.
+
+Built and tested with:
+- Google Mobile Ads Android SDK 23.5.0
+- Google Mobile Ads iOS SDK 11.12.0
+- Google User Messaging Platform Android SDK 3.1.0
+- Google User Messaging Platform iOS SDK 2.7.0
+- External Dependency Manager for Unity 1.2.183
+
+**************
+Version 9.3.0
+**************
+- Updated the iOS GMA SDK dependency version to 11.11.0.
+
+Built and tested with:
+- Google Mobile Ads Android SDK 23.4.0
+- Google Mobile Ads iOS SDK 11.11.0
+- Google User Messaging Platform Android SDK 3.0.0
+- Google User Messaging Platform iOS SDK 2.6.0
+- External Dependency Manager for Unity 1.2.183
+
+**************
+Version 9.2.1
+**************
+- Added French language support for Settings Inspector window.
+- Fixed [#3510] by specifying the minSdkVersion in the library.
+- Updated the dependency version for Android GMA SDK to 23.4.0 and iOS GMA SDK to 11.10.0.
+- Updated iOS UMP SDK dependency to 2.6.0.
+
+Built and tested with:
+- Google Mobile Ads Android SDK 23.4.0
+- Google Mobile Ads iOS SDK 11.10.0
+- Google User Messaging Platform Android SDK 3.0.0
+- Google User Messaging Platform iOS SDK 2.6.0
+- External Dependency Manager for Unity 1.2.183
+
+**************
+Version 9.2.0
+**************
+- Added `IsCollapsible` API to `BannerView` to check if a collapsible banner was loaded.
+- Fixed [#3369] by using appropriate LayoutParams.
+- Fixed [#3455] Banner ad positioning not working on iOS.
+- Updated GoogleMobileAds iOS SDK to 11.7.0.
+
+Built and tested with:
+- Google Mobile Ads Android SDK 23.2.0
+- Google Mobile Ads iOS SDK 11.7.0
+- Google User Messaging Platform 2.2.0
+- External Dependency Manager for Unity 1.2.181
+
+**************
+Version 9.1.1
+**************
+- Updated GoogleMobileAds Android SDK to 23.2.0.
+- Updated GoogleMobileAds iOS SDK to 11.6.0.
+- Updated External Dependency Manager for Unity to 1.2.181.
+- Added the AndroidJNI dependency to the UPM package.
+
+Built and tested with:
+- Google Mobile Ads Android SDK 23.2.0
+- Google Mobile Ads iOS SDK 11.6.0
+- Google User Messaging Platform 2.2.0
+- External Dependency Manager for Unity 1.2.181
+
+**************
+Version 9.1.0
+**************
+
+- Removed the app measurement feature as Android/iOS SDKs [no longer](https://support.google.com/admob/answer/13973847) initialize App measurement.
+- Fixed [#3290] by calling static putPublisherFirstPartyIdEnabled with boolean return type.
+- Fixed [#3042] by explicitly adding gradle.projectsEvaluated for executing validate_dependencies gradle script.
+- Fixed [#2801] incorrect value for `AdapterResponseInfo.LatencyMillis` on iOS.
+- Added `GetAdUnitID` API that allows reading the ad unit id for all ad formats.
+- Enabled passing AdManagerAdRequest as part of Load API for Rewarded, Rewarded Interstitial and AppOpen formats.
+- Updated Google Mobile Ads SDK dependency to use v11.3.0 on iOS.
+
+Built and tested with:
+- Google Mobile Ads Android SDK 23.0.0
+- Google Mobile Ads iOS SDK 11.3.0
+- Google User Messaging Platform 2.2.0
+- External Dependency Manager for Unity 1.2.179
+
+**************
+Version 9.0.0
+**************
+
+- Removed `SameAppKeyEnabled` in `RequestConfiguration`. Use `PublisherFirstPartyIdEnabled` instead.
+- Removed `ServerSideVerificationOptions.Builder`. Use `ServerSideVerificationOptions` directly.
+- Removed `RequestConfiguration.Builder`. Use `RequestConfiguration` directly.
+- Removed `AdRequest.Builder`. Use `AdRequest` directly.
+- Removed `AdErrorEventArgs`. Use `AdError` directly.
+- Removed `AppOpenAd.Load` API that takes a `ScreenOrientation` parameter.
+- Made `AdValueEventArgs` Obsolete. Use `AdValue` directly.
+- Made `AdFailedToLoadEventArgs` Obsolete. Use `LoadAdError` directly.
+- Updated Google Mobile Ads SDK dependency to use v11.2.0 on iOS.
+- Updated the Android User Messaging Platform dependency version to 2.2.0.
+- Added the `NativeOverlayAd` class to fetch and display native ads using templates.
+- Using `CFPreferences` APIs for `ApplicationPreferences` instead of `NSUserDefaults` on iOS.
+
+Built and tested with:
+- Google Mobile Ads Android SDK 23.0.0
+- Google Mobile Ads iOS SDK 11.2.0
+- Google User Messaging Platform 2.2.0
+- External Dependency Manager for Unity 1.2.179
+
+**************
+Version 8.7.0
+**************
+
+- Added PublisherPrivacyPersonalizationState property accessible via RequestConfiguration.
+- Added PublisherFirstPartyIdEnabled property in RequestConfiguration.
+- Deprecated SameAppKeyEnabled in RequestConfiguration. Use PublisherFirstPartyIdEnabled instead.
+- Added ApplicationPreferences GetString and GetInt APIs.
+- Fixed [#3048] by applying accurate path for gradle scripts on Windows.
+- Updated Google Mobile Ads SDK dependency to use v22.6.0 on Android.
+- Updated Google Mobile Ads SDK dependency to use v10.14 on iOS.
+
+Built and tested with:
+- Google Mobile Ads Android SDK 22.6.0
+- Google Mobile Ads iOS SDK 10.14
+- Google User Messaging Platform 2.1.0
+- External Dependency Manager for Unity 1.2.177
+
+**************
+Version 8.6.0
+**************
+
+- Fixed [#3007] by aligning the PrivacyOptionsRequirementStatus Enum on iOS with Android Plugin.
+- Fixed [#2930] for Projects using Android Gradle Plugin less than 4.2.2.
+- Added Editor Options to toggle adding packagingOptions to gradle files to pick the first occurrence of META-INF/kotlinx_coroutines_core.version file.
+- Added Editor Options to enable removing the property tag from the Android Manifest of the GMA Android SDK. This is enabled by default for projects using Android Gradle Plugin version 4.2.1 and lower.
+- Updated Google Mobile Ads SDK dependency to use v22.5.0 on Android.
+- Updated Google Mobile Ads SDK dependency to use v10.13 on iOS.
+
+Built and tested with:
+- Google Mobile Ads Android SDK 22.5.0
+- Google Mobile Ads iOS SDK 10.13
+- Google User Messaging Platform 2.1.0
+- External Dependency Manager for Unity 1.2.177
+
+**************
+Version 8.5.3
+**************
+
+- Fixed "cannot find symbol" error when building the Android bridge project using gradle.
+- Fixed [#2930] by pinning the Google Mobile Ads SDK dependency to use v22.3.0 on Android.
+- Fixed [#2974] ConsentInformation.Update() wasn't working as expected on consecutive requests.
+
+Built and tested with:
+- Google Mobile Ads Android SDK 22.3.0
+- Google Mobile Ads iOS SDK 10.9
+- Google User Messaging Platform 2.1.0
+- External Dependency Manager for Unity 1.2.176
+
+**************
+Version 8.5.2
+**************
+
+- Fixed AndroidJavaException when using AdManagerAdRequest custom targeting.
+- Fixed [#2826] "No such proxy method" error within GoogleMobileAds.Ump.
+- Updated Google Mobile Ads SDK dependency to use v22.3.0 on Android.
+
+Built and tested with:
+- Google Mobile Ads Android SDK 22.3.0
+- Google Mobile Ads iOS SDK 10.9
+- Google User Messaging Platform 2.1.0
+- External Dependency Manager for Unity 1.2.176
+
+**************
+Version 8.5.1
+**************
+
+- Version 8.5.0 has been deprecated. Please upgrade to 8.5.1 instead.
+- Fixed [#2866] Read enum from getPrivacyOptionsRequirementStatus.
+- Removed double quotes from GoogleMobileAdsSKAdNetworkItems.xml.
+
+Built and tested with:
+- Google Mobile Ads Android SDK 22.2.0
+- Google Mobile Ads iOS SDK 10.9
+- Google User Messaging Platform 2.1.0
+- External Dependency Manager for Unity 1.2.176
+
+**************
+Version 8.5.0
+**************
+
+- Requires apps to build against Xcode 14.1 or higher.
+- This release introduces several new APIs to simplify the consent gathering
+ process.
+ - Calling `ConsentInformation.Update()` is now required before interacting
+ with other `ConsentInformation` public APIs. Before calling it, the following are returned:
+ - `ConsentStatus` returns `ConsentStatus.Unknown`
+ - `PrivacyOptionsRequirementStatus` returns
+ `PrivacyOptionsRequirementStatus.Unknown`
+ - `ConsentInformation.CanRequestAds` returns `false`.
+ - [ConsentForm](https://github.com/googleads/googleads-mobile-unity/blob/main/source/plugin/Assets/GoogleMobileAds/Ump/Api/ConsentForm.cs)
+ - Added method `LoadAndPresentIfRequired` to combine load and show calls.
+ This method is intended for the use case of showing a form if needed
+ when the app starts.
+ - Added method `ShowPrivacyOptionsForm`, to be called when users interact
+ with your app's privacy setting.
+ - [ConsentInformation](https://github.com/googleads/googleads-mobile-unity/blob/main/source/plugin/Assets/GoogleMobileAds/Ump/Api/ConsentInformation.cs)
+ - Added `CanRequestAds` property.
+ - Added `PrivacyOptionsRequirementStatus` property to indicate whether
+ privacy options are required to be shown in this session.
+- Updated the Android User Messaging Platform dependency version to 2.1.0.
+- Updated the Google Mobile Ads iOS SDK dependency version to 10.9.
+- Fixed [#2840] Check if the ad references get deallocated in the iOS
+ plugin (bridge).
+- Updated [SKAdNetwork](https://developers.google.com/admob/unity/3p-skadnetworks)
+ list with values from the July 13, 2023 update.
+
+Built and tested with:
+- Google Mobile Ads Android SDK 22.2.0
+- Google Mobile Ads iOS SDK 10.9
+- Google User Messaging Platform 2.1.0
+- External Dependency Manager for Unity 1.2.176
+
+**************
+Version 8.4.1
+**************
+
+- Fixed [#2815] Setting ApplicationPreferences on Android.
+
+Built and tested with:
+- Google Mobile Ads Android SDK 22.2.0
+- Google Mobile Ads iOS SDK 10.7
+- Google User Messaging Platform 2.0.0
+- External Dependency Manager for Unity 1.2.176
+
+**************
+Version 8.4.0
+**************
+
+- Fixed [#2757] Rewarded Interstitial events not raising on the main thread.
+- Added support for rendering Ad Manager banner ad.
+- Removed method call logs from showing up in Unity Editor Console.
+- Deprecated ScreenOrientation parameter of the AppOpenAd Load() API. Added AppOpenAd.Load() API for loading AppOpen Ads using ad unit ID, ad request and ad load callbacks.
+- Added ApplicationPreferences API to manage GMA preferences.
+- Updated Google Mobile Ads SDK dependency to use v10.7 on iOS.
+- Updated Google Mobile Ads SDK dependency to use v22.2.0 on Android.
+
+Built and tested with:
+- Google Mobile Ads Android SDK 22.2.0
+- Google Mobile Ads iOS SDK 10.7
+- Google User Messaging Platform 2.0.0
+- External Dependency Manager for Unity 1.2.176
+
+**************
+Version 8.3.0
+**************
+
+- Added support to RaiseAdEventsOnUnityMainThread for UMP callbacks.
+- Added support for Ad Manager interstitial ad.
+- Updated Google Mobile Ads SDK dependency to use v22.1.0 on Android.
+- Updated Google Mobile Ads SDK dependency to use v10.5 on iOS.
+
+Built and tested with:
+- Google Mobile Ads Android SDK 22.1.0
+- Google Mobile Ads iOS SDK 10.5
+- Google User Messaging Platform 2.0.0
+- External Dependency Manager for Unity 1.2.176
+
+**************
+Version 8.2.0
+**************
+
+- Fixed [#2646] Android Banner 'Descendant focus' crash.
+- Fixed [#2676] Raising Interstitial events on main thread.
+- Deprecated builder pattern in AdRequest, RequestConfiguration and ServerSideVerificationOptions Class. Utilize fields instead.
+- Added AdManagerAdRequest class to allow passing CustomTargeting, CategoryExclusions and PublisherProvidedId as part of AdManager requests.
+- Updated Google Mobile Ads SDK dependency to use v10.4 on iOS.
+
+Built and tested with:
+- Google Mobile Ads Android SDK 22.0.0
+- Google Mobile Ads iOS SDK 10.4
+- Google User Messaging Platform 2.0.0
+- External Dependency Manager for Unity 1.2.176
+
+**************
+Version 8.1.0
+**************
+
+- Requires apps to build against Xcode 14.0 or higher.
+- Fixed [#2611] [UMP] Exception raised when calling Update of ConsentInformation on Android
+
+Built and tested with:
+- Google Mobile Ads Android SDK 22.0.0
+- Google Mobile Ads iOS SDK 10.3
+- Google User Messaging Platform 2.0.0
+- External Dependency Manager for Unity 1.2.175
+
+**************
+Version 8.0.0
+**************
+
+Plugin:
+- Removed obsolete APIs for AppOpenAd.
+- Removed obsolete APIs for InterstitialAd.
+- Added the MobileAds.RaiseAdEventsOnUnityMainThread option for raising ad events on the Unity main thread.
+- Dropped support for `armv7` and `i386` architectures.
+- Requires minimum iOS version 11.0.
+- Fixed [#2543] NullReferenceException when UMP ConsentDebugSettings are null.
+- Fixed [#2531] Xcode 13 compile time error.
+- Fixed [#1779] Crash with custom Banner Ad Sizes on the Unity platform.
+- Fixed [#2553] Banner position in Unity Editor to reflect Android and iOS position.
+- Added support for GMA Android SDK v22.0.0. Requires using GMA Android SDK v22.0.0 or higher.
+- Added support for GMA iOS SDK v10.3. Requires using GMA iOS SDK v10.3 or higher.
+
+Built and tested with:
+- Google Mobile Ads Android SDK 22.0.0
+- Google Mobile Ads iOS SDK 10.3
+- Google User Messaging Platform 2.0.0
+- External Dependency Manager for Unity 1.2.175
+
+**************
+Version 7.4.1
+**************
+
+Plugin:
+- Added support for GMA iOS SDK v10. Requires using Google Mobile Ads iOS SDK v10.0 or higher.
+
+Built and tested with:
+- Google Mobile Ads Android SDK 21.3.0
+- Google Mobile Ads iOS SDK 10.0
+- Google User Messaging Platform 2.0.0
+- External Dependency Manager for Unity 1.2.175
+
+**************
+Version 7.4.0
+**************
+
+Plugin:
+- Added OnAdClicked and OnAdImpressionRecorded events to BannerView.
+- Updated all ad format APIs to have consistent nomenclature.
+- Added new InterstitialAd.OnAdClicked event to interstitial ads.
+- Added new InterstitialAd.Load() API for loading interstitial ads.
+- Added new InterstitialAd.CanShowAd() API for checking interstitial ad state.
+- Added new RewardedAd.OnAdClicked event to rewarded ads.
+- Added new RewardedAd.Load() API for loading rewarded ads.
+- Added new RewardedAd.CanShowAd() API for checking rewarded ad state.
+- Added new RewardedInterstitialAd.OnAdClicked event to rewarded interstitial ads.
+- Added new RewardedInterstitialAd.Load() API for loading rewarded interstitial ads.
+- Added new RewardedInterstitialAd.CanShowAd() API for checking rewarded interstitial ad state.
+- Added new AppOpenAd.OnAdClicked event to app open ads.
+- Added new AppOpenAd.Load() API for loading app open ads.
+- Added new AppOpenAd.CanShowAd() API for checking app open ad state.
+- Fixed [#2453] and [#2450] XCode build error when using iOS SDK 9.14.0 or greater.
+- Added User Messaging Platform (UMP) APIs.
+
+Built and tested with:
+- Google Mobile Ads Android SDK 21.3.0
+- Google Mobile Ads iOS SDK 9.11.0
+- Google User Messaging Platform 2.0.0
+- External Dependency Manager for Unity 1.2.175
+
+**************
+Version 7.3.1
+**************
+
+Plugin:
+- Fixed [#1799](https://github.com/googleads/googleads-mobile-unity/issues/1799) RewardedAd OnAdFailedToPresentFullScreenContent called twice.
+
+Built and tested with:
+- Google Mobile Ads Android SDK 21.3.0.
+- Google Mobile Ads iOS SDK 9.11.0
+- External Dependency Manager for Unity 1.2.171
+
+**************
+Version 7.3.0
+**************
+
+Plugin:
+- Requires using Google Mobile Ads Android SDK v21.3.0 or higher.
+- Requires using Google Mobile Ads iOS SDK v9.11.0 or higher.
+- Added response information for ad networks to the [ad response](https://developers.google.com/admob/unity/response-info).
+
+Built and tested with:
+- Google Mobile Ads Android SDK 21.3.0.
+- Google Mobile Ads iOS SDK 9.11.0
+- External Dependency Manager for Unity 1.2.171.
+
+**************
+Version 7.2.0
+**************
+
+Plugin:
+- Added settings to optimize Android initialization and ad loading thread usage.
+- Fixed issue with AppOpenAd.GetResponseInfo() not completing on Android.
+- Fixed display issue for AdInspector on the Unity Editor platform.
+
+Built and tested with:
+- Google Mobile Ads Android SDK 21.0.0.
+- Google Mobile Ads iOS SDK 9.9.0
+- External Dependency Manager for Unity 1.2.171.
+
+**************
+Version 7.1.0
+**************
+
+Plugin:
+- Added AppStateEventNotifier as a better option to OnApplicationPause for app open ads.
+
+Built and tested with:
+- Google Mobile Ads Android SDK 21.0.0.
+- Google Mobile Ads iOS SDK 9.0.0
+- External Dependency Manager for Unity 1.2.171.
+
+**************
+Version 7.0.2
+**************
+
+Plugin:
+- Added support for GMA Android SDK v21. Requires using GMA Android SDK v21.0.0 or higher.
+
+Built and tested with:
+- Google Mobile Ads Android SDK 21.0.0.
+- Google Mobile Ads iOS SDK 9.0.0
+- External Dependency Manager for Unity 1.2.171.
+
+**************
+Version 7.0.1
+**************
+
+Plugin:
+- Fixed Github issue [1943](https://github.com/googleads/googleads-mobile-unity/issues/1943) related App Id saving.
+- Fixed Github issue [2001](https://github.com/googleads/googleads-mobile-unity/issues/2001) related to Android manifest.
+- Fixed Github issue [2003](https://github.com/googleads/googleads-mobile-unity/issues/2003) related to Ad Inspector crash.
+- Added placeholder AdInspector for Unity editor.
+
+Built and tested with:
+- Google Play services 20.2.0
+- Google Mobile Ads iOS SDK 9.0.0
+- External Dependency Manager for Unity 1.2.171.
+
+**************
+Version 7.0.0
+**************
+
+Plugin:
+- Added support for GMA iOS SDK v9. Requires using GMA iOS SDK v9.0.0 or higher.
+- Fixed https://github.com/googleads/googleads-mobile-unity/issues/1620
+- Updated to use External Dependency Manager for Unity 1.2.169.
+
+Built and tested with:
+- Google Play services 20.2.0
+- Google Mobile Ads iOS SDK 9.0.0
+- External Dependency Manager for Unity 1.2.171.
+
+**************
+Version 6.1.2
+**************
+
+Plugin:
+- Fixed Github issue [1786](https://github.com/googleads/googleads-mobile-unity/issues/1786) related to GoogleMobileAdsSettings.
+- Fixed issue related to missing GADUAdNetworkExtras.h file when using some mediation adapters.
+
+Built and tested with:
+- Google Play services 20.2.0
+- Google Mobile Ads iOS SDK 8.8.0
+- External Dependency Manager for Unity 1.2.165.
+
+Known issue:
+- iOS Resolver library cannot be loaded in Unity 2021.1.11 and 2021.1.12. It can be loaded properly with Unity 2021.1.10. See https://github.com/googlesamples/unity-jar-resolver/issues/441 for more information.
+
+**************
+Version 6.1.1
+**************
+
+Plugin:
+- Added support for ad inspector.
+
+Built and tested with:
+- Google Play services 20.2.0
+- Google Mobile Ads iOS SDK 8.8.0
+- External Dependency Manager for Unity 1.2.165.
+
+Known issue:
+- iOS Resolver library cannot be loaded in Unity 2021.1.11 and 2021.1.12. It can be loaded properly with Unity 2021.1.10. See https://github.com/googlesamples/unity-jar-resolver/issues/441 for more information.
+
+
+**************
+Version 6.1.0
+**************
+
+Plugin:
+- Fixed https://github.com/googleads/googleads-mobile-unity/issues/1620
+- Added support for iOS 14+ [same app key](https://developers.google.com/admob/ios/ios14)
+- Added support for App Open ads.
+
+Built and tested with:
+- Google Play services 20.2.0
+- Google Mobile Ads iOS SDK 8.8.0
+- External Dependency Manager for Unity 1.2.165.
+
+Known issue:
+- iOS Resolver library cannot be loaded in Unity 2021.1.11 and 2021.1.12. It can be loaded properly with Unity 2021.1.10. See https://github.com/googlesamples/unity-jar-resolver/issues/441 for more information.
+
+**************
+Version 6.0.2
+**************
+
+Plugin:
+- Fixed https://github.com/googleads/googleads-mobile-unity/issues/1677 This version requires Xcode 12.4 where the previous version required Xcode 12.5.1.
+- You no longer need to enable "Link frameworks statically" for the Google Mobile Ads plugin to work.
+
+Built and tested with:
+- Google Play services 20.2.0
+- Google Mobile Ads iOS SDK 8.8.0
+- External Dependency Manager for Unity 1.2.165.
+
+Known issue:
+- iOS Resolver library cannot be loaded in Unity 2021.1.11 and 2021.1.12. It can be loaded properly with Unity 2021.1.10. See https://github.com/googlesamples/unity-jar-resolver/issues/441 for more information.
+
+**************
+Version 6.0.1
+**************
+
+Plugin:
+- Fixed https://github.com/googleads/googleads-mobile-unity/issues/1613 where build error occurs on Unity 2021.
+- Fixed https://github.com/googleads/googleads-mobile-unity/issues/1616 where iOS build contains undefined symbol.
+- Automatically added SKAdNetworkIdentifiers recommended by https://developers.google.com/admob/ios/ios14#skadnetwork into generated iOS builds. You can manage the list of SKAdNetworkIdentifier values by editing `Assets/GoogleMobileAds/Editor/GoogleMobileAdsSKAdNetworkItems.xml`.
+
+Built and tested with:
+- Google Play services 20.0.0
+- Google Mobile Ads iOS SDK 8.2.0
+- External Dependency Manager for Unity 1.2.165.
+
+Known issue:
+- iOS Resolver library cannot be loaded in Unity 2021.1.11 and 2021.1.12. It can be loaded properly with Unity 2021.1.10. See https://github.com/googlesamples/unity-jar-resolver/issues/441 for more information.
+
+**************
+Version 6.0.0
+**************
+
+Plugin:
+- Added support for GMA iOS SDK v8 and GMA Android SDK v20. Requires using GMA iOS SDK v8.0.0 or higher, and GMA Android SDK 20.0.0 or higher.
+- Removed MobileAds.Initialize(string appId).
+- Removed Birthday, Gender, TestDevices, TagForChildDirectedTreatment properties on AdRequest. TagForChildDirectedTreatment and TestDeviceIds properties are available under RequestConfiguration..
+- Removed OnAdLeavingApplication event for all formats.
+- Removed MediationAdapterClassName from all formats in favor of ResponseInfo.
+- Removed Message from AdErrorEventArgs class in favor of AdError.
+- Removed RewardBasedVideoAd in favor of RewardedAd.
+- Added support for ad load errors, please see https://developers.google.com/admob/unity/ad-load-errors for details.
+- Ad Manager integration now requires providing the app ID in the Unity Editor.
+- Changed package format to contain compiled assemblies in DLL format in place of the uncompiled code.
+- You need to enable "Link frameworks statically" in Unity Editor -> Assets -> External Dependency Manager -> iOS Resolver -> Settings, or else the GMA plugin does not work.
+
+Built and tested with:
+- Google Play services 20.0.0
+- Google Mobile Ads iOS SDK 8.2.0
+- External Dependency Manager for Unity 1.2.165.
+
+**************
+Version 5.4.0
+**************
+
+Plugin:
+- Add support for iOS14 with Googles `SKAdNetwork` identifiers automatically included in
+ `Info.plist`.
+- Added the RewardedInterstitialAd format. This feature is currently in private beta. Reach out to your account manager to request access.
+- Added mock ad views to enable developers to test ad placement and callback logic within the Unity editor.
+- Added fix for crash that occurs when attempting to show interstitial when app is closing.
+- Added fix for crash that occurs when calling `GetResponseInfo()` on iOS before ad is loaded.
+
+Built and tested with:
+- Google Play services 19.5.0
+- Google Mobile Ads iOS SDK 7.68.0
+- External Dependency Manager for Unity 1.2.161.
+
+**************
+Version 5.3.0
+**************
+
+Plugin:
+- Add InitializationStatusClient for Init callback in Unity Editor. Fixes #1394.
+- Update to Android SDK version 19.3.0
+
+Built and tested with:
+- Google Play services 19.3.0
+- Google Mobile Ads iOS SDK 7.63.0
+- External Dependency Manager for Unity 1.2.156.
+
+**************
+Version 5.2.0
+**************
+
+Plugin:
+ - Added ResponseInfo class. See
+ https://developers.google.com/admob/unity/response-info for usage details.
+ - Fixes #1307 - issue with running in Unity Editor when targeting iOS platform.
+ - Fixes #1287 - issue where a crash is caused in equality check when AdSize is
+ null.
+ - Moved GoogleMobileAdsPlugin to GoogleMobileAdsPlugin.androidlib to ensure manifest
+ is picked up when building android app in Unity 2020. Fixes issue #1310. Thanks @pipe-alt!
+ - Fix error messages for iOS plugin.
+ - Added the DisableMediationInitialization() method to MobileAds.
+ Warning: Calling this method may negatively impact your Google mediation performance.
+ This method should only be called if you include Google mediation adapters in your app, but you
+ won't use mediate through Google during a particular app session (for example, you are running
+ an A/B mediation test).
+
+Built and tested with:
+- Google Play services 19.2.0
+- Google Mobile Ads iOS SDK 7.60.0
+- External Dependency Manager for Unity 1.2.156.
+
+**************
+Version 5.1.0
+**************
+
+Plugin:
+ - Added RequestConfiguration class. See
+ https://developers.google.com/admob/unity/targeting for usage details.
+ - Fixed issue with building for IL2CPP in versions of Unity 2017 and earlier.
+ - Adding missing imports for Unity 5.6 build (Thanks @EldersJavas !).
+ - Added GoogleMobileAds assembly definition.
+ - Added thread safety to GADUObjectCache in iOS plugin.
+ - Revised project structure. If upgrading from a previous version, delete
+ your GoogleMobileAds/ folder before importing this plugin.
+
+Built and tested with:
+- Google Play services 19.1.0
+- Google Mobile Ads iOS SDK 7.58.0
+- Unity Jar Resolver 1.2.152
+
+
+**************
+Version 5.0.1
+**************
+
+Plugin:
+ - Fixed issue with externs.cpp in pre-2019 versions of Unity
+
+Built and tested with:
+- Google Play services 19.0.0
+- Google Mobile Ads iOS SDK 7.56.0
+- Unity Jar Resolver 1.2.136
+
+**************
+Version 5.0.0
+**************
+
+Plugin:
+ - Removed preprocessor directives for custom assembly support.
+ - Fixed IL2CPP build support on Android.
+ - Updated to Google Play services 19.0.0.
+ - Updated minimum Android API level to 16.
+
+Built and tested with:
+- Google Play services 19.0.0
+- Google Mobile Ads iOS SDK 7.56.0
+- Unity Jar Resolver 1.2.136
+
+**************
+Version 4.2.1
+**************
+
+Plugin:
+ - Fixed issue with using `AdSize.FullWidth` API for apps that only support landscape.
+
+Built and tested with:
+- Google Play services 18.3.0
+- Google Mobile Ads iOS SDK 7.53.1
+- Unity Jar Resolver 1.2.135
+
+**************
+Version 4.2.0
+**************
+
+Plugin:
+ - Added support for using AdSize.FullWidth with Adaptive banner APIs.
+ - Added `GetRewardItem()` API for `RewardedAd`.
+ - Fixed issue with Android implementation of `GetPortraitAnchoredAdaptiveBannerAdSizeWithWidth`.
+
+Built and tested with:
+- Google Play services 18.3.0
+- Google Mobile Ads iOS SDK 7.53.1
+- Unity Jar Resolver 1.2.135
+
+**************
+Version 4.1.0
+**************
+
+Plugin:
+ - Released Anchored Adaptive Banner APIs.
+
+Built and tested with:
+- Google Play services 18.2.0
+- Google Mobile Ads iOS SDK 7.51.0
+- Unity Jar Resolver 1.2.130
+
+**************
+Version 4.0.0
+**************
+
+Plugin:
+- Breaking change: The Android library included in this plugin is now distributed as an aar, and
+ lives at `Assets/Plugins/Android/googlemobileads-unity.aar'. If you are upgrading from a previous
+ version, remove the `Assets/Plugins/Android/GoogleMobileAdsPlugin' folder prior to importing this
+ latest version of the plugin.
+- Added proguard support on Android.
+- Update Android Google Mobile Ads SDK version to 18.2.0.
+- Fixed a bug where the AdSize.SMART_BANNER banner size did not work on Unity 2019.2+.
+- Added assertion to stop Android builds when Google Mobile Ads settings are invalid.
+
+Built and tested with:
+- Google Play services 18.2.0
+- Google Mobile Ads iOS SDK 7.50.0
+- Unity Jar Resolver 1.2.125
+
+**************
+Version 3.18.3
+**************
+
+Plugin:
+- Update JAR resolver.
+
+Built and tested with:
+- Google Play services 18.1.1
+- Google Mobile Ads iOS SDK 7.48.0
+- Unity Jar Resolver 1.2.124
+
+**************
+Version 3.18.2
+**************
+
+Plugin:
+- Update to Android release 18.1.1.
+
+Built and tested with:
+- Google Play services 18.1.1
+- Google Mobile Ads iOS SDK 7.47.0
+- Unity Jar Resolver 1.2.123
+
+**************
+Version 3.18.1
+**************
+
+Plugin:
+- Add new Initialization API.
+- Fixed Android compile error with PListProcessor.
+- Removed reflection for improved IL2CPP support.
+- Fixed iOS dependency to not use patch version.
+
+Built and tested with:
+- Google Play services 18.1.0
+- Google Mobile Ads iOS SDK 7.46.0
+- Unity Jar Resolver 1.2.122
+
+**************
+Version 3.18.0
+**************
+
+Plugin:
+- Added GoogleMobileAdsSettings editor UI for making Plist / manifest changes.
+- Fix OnRewardedAdFailedToShow callbacks.
+- Migrated android support library to androidx (JetPack) with Google Mobile Ads
+ SDK version 18.0.0.
+
+Built and tested with:
+- Google Play services 18.0.0
+- Google Mobile Ads iOS SDK 7.45.0
+- Unity Jar Resolver 1.2.119
+
+**************
+Version 3.17.0
+**************
+
+Plugin:
+- Revised Banner positioning code to use gravity instead of popup window.
+- Tested Banner positioning with notched devices supporting Google P APIs.
+- Added Rewarded Ads ServerSideVerificationOptions (thanks @halfdevil !)
+- Fixed issue with PListProcessor macro.
+- Added whitelist for apache http library (thanks @RolandSzep !)
+- Specified package for gender enum (thanks @armnotstrong !)
+- Added mediation extras for custom events (thanks SeanPONeil !)
+
+Built and tested with:
+- Google Play services 17.2.0
+- Google Mobile Ads iOS SDK 7.44.0
+- Unity Jar Resolver 1.2.111
+
+**************
+Version 3.16.0
+**************
+
+Plugin:
+- Added new RewardedAd APIs support.
+- Added PListProcessor to assist in adding the GADApplicationIdentifier
+to iOS build Info.plist.
+
+Built and tested with:
+- Google Play services 17.2.0
+- Google Mobile Ads iOS SDK 7.42.0
+- Unity Jar Resolver 1.2.102.0
+
+**************
+Version 3.15.1
+**************
+
+Plugin:
+- Fixed crash when adding mediation extras to ad request.
+
+Built and tested with:
+- Google Play services 15.0.1
+- Google Mobile Ads iOS SDK 7.32.0
+- Unity Jar Resolver 1.2.88.0
+
+**************
+Version 3.15.0
+**************
+
+Plugin:
+- Forward Android ad events on background thread through JNI interface
+to mitigate ANRs.
+
+Mediation packages:
+- Updated AppLovin Unity package to v3.0.3.
+- Updated Chartboost Unity package to v1.1.1.
+- Updated Facebook Unity package to v1.1.3.
+- Updated IronSource Unity package to v1.0.2.
+- Updated Nend Unity package to v2.0.0.
+- Updated Tapjoy Unity package to v2.0.0.
+
+Built and tested with:
+- Google Play services 15.0.1
+- Google Mobile Ads iOS SDK 7.31.0
+- Unity Jar Resolver 1.2.79.0
+
+**************
+Version 3.14.0
+**************
+
+Plugin:
+- Fixed Google Play dependencies version conflict with Firebase plugins.
+
+Mediation packages:
+- Updated AdColony Unity package to v1.2.1.
+- Updated AppLovin Unity package to v3.0.2.
+- Updated Chartboost Unity package to v1.1.0.
+- Updated Facebook Unity package to v1.1.2.
+- Updated InMobi Unity package to v2.1.0.
+- Updated IronSource Unity package to v1.0.1.
+- Updated Maio Unity package to v1.1.0.
+- Updated MoPub Unity package to v2.1.0.
+- Updated MyTarget Unity package to v2.1.0.
+- Updated Nend Unity package to v1.0.2.
+- Updated Tapjoy Unity package to v1.1.1.
+- Updated UnityAds Unity package to v1.1.3.
+
+Built and tested with:
+- Google Play services 15.0.1
+- Google Mobile Ads iOS SDK 7.31.0
+- Unity Jar Resolver 1.2.75.0
+
+**************
+Version 3.13.1
+**************
+
+Plugin:
+- Fixed issue where banner ads reposition to top of screen after a full
+screen ad is displayed.
+
+Built and tested with:
+- Google Play services 12.0.1
+- Google Mobile Ads iOS SDK 7.30.0
+- Unity Jar Resolver 1.2.64.0
+
+**************
+Version 3.13.0
+**************
+
+Plugin:
+- Added `OnAdCompleted` ad event to rewarded video ads.
+- Removed support for Native Ads Express.
+
+Mediation packages:
+- Added Chartboost mediation support package.
+- Added MoPub mediation support package.
+- Updated AppLovin Unity package to v1.2.1.
+- Updated AdColony Unity package to v1.0.1.
+- Updated myTarget Unity package to v2.0.0.
+
+Built and tested with:
+- Google Play services 12.0.1
+- Google Mobile Ads iOS SDK 7.30.0
+- Unity Jar Resolver 1.2.64.0
+
+**************
+Version 3.12.0
+**************
+
+Plugin:
+- Added `setUserId` API to rewarded video ads to identify users in
+server-to-server reward callbacks.
+- Removed functionality that forced ad events to be invoked on the
+main thread.
+
+Mediation packages:
+- Updated maio Unity package to v1.0.1.
+
+Built and tested with:
+- Google Play services 11.8.0
+- Google Mobile Ads iOS SDK 7.29.0
+- Unity Jar Resolver 1.2.61.0
+
+**************
+Version 3.11.1
+**************
+
+Plugin:
+- Fixed issue where calling GetWidthInPixels() or GetHeightInPixels() resulted
+in a null pointer exception.
+
+Mediation packages:
+- Added Facebook mediation support package.
+
+Built and tested with:
+- Google Play services 11.8.0
+- Google Mobile Ads iOS SDK 7.28.0
+- Unity Jar Resolver 1.2.61.0
+
+**************
+Version 3.11.0
+**************
+
+Plugin:
+- Updated Android ad events to be invoked on the main thread.
+- Added `MobileAds.SetiOSAppPauseOnBackground()` method to pause iOS apps when
+displaying full screen ads.
+- Fixed issue were banners repositioned incorrectly following an orientation
+change.
+
+Mediation packages:
+- Added maio mediation support package.
+- Added nend mediation support package.
+
+Built and tested with:
+- Google Play services 11.8.0
+- Google Mobile Ads iOS SDK 7.27.0
+- Unity Jar Resolver 1.2.61.0
+
+**************
+Version 3.10.0
+**************
+
+Plugin:
+- Updated Smart Banner positioning to render within safe area on iOS 11.
+- Added API to return height and width of BannerView in pixels.
+- Added SetPosition method to reposition banner ads.
+- Updated AppLovin Unity mediation package to support AppLovin initialization
+integration.
+
+Mediation packages:
+- Added InMobi mediation support package.
+- Added Tapjoy mediation support package.
+- Added Unity Ads mediation support package.
+- Added myTarget mediation support package.
+
+Built and tested with:
+- Google Play services 11.6.2
+- Google Mobile Ads iOS SDK 7.27.0
+- Unity Jar Resolver 1.2.59.0
+
+*************
+Version 3.9.0
+*************
+
+Plugin:
+- Implemented workaround for issue where ad views are rendered in incorrect
+position.
+- Resolved compatibility issues with Gradle 4.
+- Resolved comnpatilbity issues with older versions of Xcode.
+
+Mediation packages:
+- Added API for video ad volume control.
+- Added AdColony mediation support package.
+- Added AppLovin mediation support package.
+
+Built and tested with:
+- Google Play services 11.6.0
+- Google Mobile Ads iOS SDK 7.25.0
+- Unity Jar Resolver 1.2.59.0
+
+*************
+Version 3.8.0
+*************
+
+- Added support for Vungle mediation extras.
+- Updated ad views to render within safe area on iOS 11 when using predefined
+AdPosition constants.
+- Added MediationAdapterClassName() method to all ad formats.
+- Fixed issue where ad views are always rendered on the top of the screen for
+certain devices.
+
+Built and tested with:
+- Google Play services 11.4.0
+- Google Mobile Ads iOS SDK 7.24.1
+- Unity Jar Resolver 1.2.59.0
+
+*************
+Version 3.7.1
+*************
+
+- Fix issue where banner and Native Express ads fail to show after being hidden.
+
+Built and tested with:
+- Google Play services 11.4.0
+- Google Mobile Ads iOS SDK 7.24.0
+- Unity Jar Resolver 1.2.52.0
+
+*************
+Version 3.7.0
+*************
+
+- Updated dependency specification for JarResolver to use new XML format.
+- Resolved JarResolver incompatibility issues when using Firebase Unity plugins.
+
+Built and tested with:
+- Google Play services 11.2.0
+- Google Mobile Ads iOS SDK 7.23.0
+- Unity Jar Resolver 1.2.48.0
+
+*************
+Version 3.6.3
+*************
+
+- Fixed serving of live ads to iOS simulator when simulator set as test
+device.
+- Reverted addition of mediation sub-directories to Plugin folder.
+
+Built and tested with:
+- Google Play services 11.0.4
+- Google Mobile Ads iOS SDK 7.21.0
+- Unity Jar Resolver 1.2.35.0
+
+*************
+Version 3.6.2
+*************
+
+- Add mediation sub-directories to Plugin folder.
+
+Built and tested with:
+- Google Play services 11.0.4
+- Google Mobile Ads iOS SDK 7.21.0
+- Unity Jar Resolver 1.2.35.0
+
+*************
+Version 3.6.1
+*************
+
+- Updated Unity Jar Resolver.
+
+Built and tested with:
+- Google Play services 11.0.0
+- Google Mobile Ads iOS SDK 7.21.0
+- Unity Jar Resolver 1.2.32.0
+
+*************
+Version 3.6.0
+*************
+
+- Added method to initialize the GMA SDK.
+- Added FullWidth AdSize constant.
+- Fixed incompatibility with Gradle build system.
+- Updated iOS code to remove modular imports.
+
+Built and tested with:
+- Google Play services 11.0.0
+- Google Mobile Ads iOS SDK 7.21.0
+- Unity Jar Resolver 1.2.31.0
+
+*************
+Version 3.5.0
+*************
+- Fix ad views losing visibility after an activity change for certain devices
+(eg. Huaweai devices).
+
+Built and tested with:
+- Google Play services 10.2.4
+- Google Mobile Ads iOS SDK 7.20.0
+- Unity Jar Resolver 1.2.20.0
+
+*************
+Version 3.4.0
+*************
+- Fix native express and banner ad behavior where initializing and
+hidden ads create unclickable region.
+
+Built and tested with:
+- Google Play services 10.2.1
+- Google Mobile Ads iOS SDK 7.19.0
+- Unity Jar Resolver 1.2.14.0
+
+*************
+Version 3.3.0
+*************
+- Removed support for in-app purchases.
+- Fix positioning of ads in sticky-immersive mode.
+- Fix issue were ads larger than 320dp could not be rendered.
+- Fix incorrect positioning of ads in iOS for ad position BOTTOM.
+- Add rewarded video test ad units to HelloWorld sample app.
+- Suppress warnings for unused placeholder ad events.
+
+Built and tested with:
+- Google Play services 10.2.0
+- Google Mobile Ads iOS SDK 7.18.0
+- Unity Jar Resolver 1.2.12.0
+
+*************
+Version 3.2.0
+*************
+- Banner ads and native express ads display correctly on Unity 5.6.
+- Add ability to specify x, y location of ad views.
+
+Built and tested with:
+- Google Play services 10.0.1
+- Google Mobile Ads iOS SDK 7.16.0
+- Unity Jar Resolver 1.2.9.0
+
+*************
+Version 3.1.3
+*************
+- Fix incorrect invocation of events on ads failing to load.
+
+Built and tested with:
+- Google Play services 10.0.0
+- Google Mobile Ads iOS SDK 7.15.0
+- Unity Jar Resolver 1.2.6.0
+
+*************
+Version 3.1.2
+*************
+- Fix NPE when ad events are not hooked up.
+
+Built and tested with:
+- Google Play services 9.8.0
+- Google Mobile Ads iOS SDK 7.13.0
+- Unity Jar Resolver 1.2.2.0
+
+*************
+Version 3.1.1
+*************
+- Remove dependency on Android Support Library and update GMA iOS SDK
+version in `AdMobDependencies.cs`.
+
+Built and tested with:
+- Google Play services 9.6.1
+- Google Mobile Ads iOS SDK 7.13.0
+- Unity Jar Resolver 1.2.2.0
+
+*************
+Version 3.1.0
+*************
+- Integrate plugin with play-services-resolver-1.2.1.0.
+- Removal of CocoaPods integration.
+
+Built and tested with:
+- Google Play services 9.6.0
+- Google Mobile Ads iOS SDK 7.12.0
+- Unity Jar Resolver 1.2.1.0
+
+*************
+Version 3.0.7
+*************
+- Fix crash within OnAdLoaded ad event for rewarded video ads on iOS.
+
+Built and tested with:
+- Google Play services 9.4.0
+- Google Mobile Ads iOS SDK 7.11.0
+- Unity Jar Resolver 1.2
+
+*************
+Version 3.0.6
+*************
+- Add support for Native Ads express.
+- Fix compatibility issues with Android IL2CPP compilation.
+- Fix memory leak of C# client objects
+
+Built and tested with:
+- Google Play services 9.4.0
+- Google Mobile Ads iOS SDK 7.10.1
+- Unity Jar Resolver 1.2
+
+*************
+Version 3.0.5
+*************
+- Remove use of JSONUtility.
+
+Built and tested with:
+- Google Play services 9.2.0
+- Google Mobile Ads iOS SDK 7.8.1
+- Unity Jar Resolver 1.2
+
+*************
+Version 3.0.4
+*************
+- Fix Podfile compatibility with CocoaPods 1.0.0.
+- Add support for DFP custom native ad formats.
+
+Built and tested with:
+- Google Play services 9.0.0
+- Google Mobile Ads iOS SDK 7.8.1
+- Unity Jar Resolver 1.2
+
+*************
+Version 3.0.3
+*************
+- Restrict simultaneous rewarded video requests on Android.
+
+Built and tested with:
+- Google Play services 8.4.0
+- Google Mobile Ads iOS SDK 7.7.0
+
+*************
+Version 3.0.2
+*************
+- Fix compatibility issues with Google Mobile Ads iOS SDK 7.7.0
+
+Built and tested with:
+- Google Play services 8.4.0
+- Google Mobile Ads iOS SDK 7.7.0
+
+*************
+Version 3.0.1
+*************
+- Update preprocessor directives for iOS post build setup
+- Add request agent to all ad requests from plugin
+
+Built and tested with:
+- Google Play services 8.4.0
+- Google Mobile Ads iOS SDK 7.6.0
+
+*************
+Version 3.0.0
+*************
+- Add support for Custom In-App purchase flow on Android
+- Add CocoaPods integration and automated build settings for iOS projects
+- Use JarResolver plugin to resolve Google Play services client dependencies
+- Ad events for banners and interstitials refactored with new names
+
+Built and tested with:
+- Google Play services 8.4.0
+- Google Mobile Ads iOS SDK 7.6.0
+
+*************
+Version 2.3.1
+*************
+- Move IInAppBillingService into its own JAR
+
+*************
+Version 2.3.0
+*************
+- Add support for In-App Purchase house ads on Android
+
+*************
+Version 2.2.1
+*************
+- Fix for Android manifest merge issues on Unity 4.x
+- Fix for TouchCount issue on Unity 5.0
+
+***********
+Version 2.2
+***********
+- Support for Unity 5.0 & ARC
+- Additional Banner positions
+- iOS Ads SDK 7.0.0 compatibility
+
+***********
+Version 2.1
+***********
+- Support for Interstitial Ads
+- Ad events use EventHandlers
+
+***********
+Version 2.0
+***********
+- A single package with cross platform (Android/iOS) support
+- Mock ad calls when running inside Unity editor
+- Support for Banner Ads
+- Custom banner sizes
+- Banner ad events listeners
+- AdRequest targeting methods
+- A sample project to demonstrate plugin integration
+
+***********
+Version 1.2
+***********
+- Initial Android version with Google Play services support
+- Support for Banner Ads only
+
+***********
+Version 1.1
+***********
+- Initial iOS only version
+- Support for Banner Ads only
+
+***********
+Version 1.0
+***********
+- Initial version for Android (using now deprecated legacy Android SDK)
diff --git a/Assets/GoogleMobileAds/CHANGELOG.md.meta b/Assets/GoogleMobileAds/CHANGELOG.md.meta
new file mode 100644
index 0000000..f4e5d7f
--- /dev/null
+++ b/Assets/GoogleMobileAds/CHANGELOG.md.meta
@@ -0,0 +1,81 @@
+fileFormatVersion: 2
+guid: 161c4904cd2045a1bf046453a58a9d7b
+labels:
+- gvh
+- gvh_version-10.6.0
+- gvhp_exportpath-GoogleMobileAds/CHANGELOG.md
+timeCreated: 1480838400
+PluginImporter:
+ serializedVersion: 1
+ iconMap: {}
+ executionOrder: {}
+ isPreloaded: 0
+ platformData:
+ Android:
+ enabled: 0
+ settings:
+ CPU: AnyCPU
+ Any:
+ enabled: 0
+ settings: {}
+ Editor:
+ enabled: 0
+ settings:
+ CPU: AnyCPU
+ DefaultValueInitialized: true
+ OS: AnyOS
+ Linux:
+ enabled: 0
+ settings:
+ CPU: None
+ Linux64:
+ enabled: 0
+ settings:
+ CPU: None
+ LinuxUniversal:
+ enabled: 0
+ settings:
+ CPU: None
+ OSXIntel:
+ enabled: 0
+ settings:
+ CPU: None
+ OSXIntel64:
+ enabled: 0
+ settings:
+ CPU: None
+ OSXUniversal:
+ enabled: 0
+ settings:
+ CPU: None
+ Web:
+ enabled: 0
+ settings: {}
+ WebStreamed:
+ enabled: 0
+ settings: {}
+ Win:
+ enabled: 0
+ settings:
+ CPU: None
+ Win64:
+ enabled: 0
+ settings:
+ CPU: None
+ WindowsStoreApps:
+ enabled: 0
+ settings:
+ CPU: AnyCPU
+ iOS:
+ enabled: 0
+ settings:
+ CompileFlags:
+ FrameworkDependencies:
+ tvOS:
+ enabled: 0
+ settings:
+ CompileFlags:
+ FrameworkDependencies:
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/GoogleMobileAds/Editor.meta b/Assets/GoogleMobileAds/Editor.meta
new file mode 100644
index 0000000..dd81e72
--- /dev/null
+++ b/Assets/GoogleMobileAds/Editor.meta
@@ -0,0 +1,8 @@
+fileFormatVersion: 2
+guid: ad2c7d42170b57d41bbce607405135c5
+folderAsset: yes
+DefaultImporter:
+ externalObjects: {}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/GoogleMobileAds/Editor/AndroidBuildPreProcessor.cs b/Assets/GoogleMobileAds/Editor/AndroidBuildPreProcessor.cs
new file mode 100644
index 0000000..17c58cd
--- /dev/null
+++ b/Assets/GoogleMobileAds/Editor/AndroidBuildPreProcessor.cs
@@ -0,0 +1,191 @@
+#if UNITY_ANDROID
+#if UNITY_2022 || UNITY_2021_3_58 || UNITY_2021_3_57 || UNITY_2021_3_56 || UNITY_2021_3_55 || UNITY_2021_3_54 || UNITY_2021_3_53 || UNITY_2021_3_52 || UNITY_2021_3_51 || UNITY_2021_3_50 || UNITY_2021_3_49 || UNITY_2021_3_48 || UNITY_2021_3_47 || UNITY_2021_3_46 || UNITY_2021_3_45 || UNITY_2021_3_44 || UNITY_2021_3_43 || UNITY_2021_3_42 || UNITY_2021_3_41
+// 2021.3.41f1+ Gradle version 7.5.1+
+// https://docs.unity3d.com/2021.3/Documentation/Manual/android-gradle-overview.html
+#define ANDROID_GRADLE_BUILD_JETIFIER_ENTRY_ENABLED
+#endif
+
+#if UNITY_6000_0_OR_NEWER || UNITY_2023 || ANDROID_GRADLE_BUILD_JETIFIER_ENTRY_ENABLED
+#define ANDROID_GRADLE_BUILD_PRE_PROCESSOR_ENABLED
+#endif
+
+using System;
+using UnityEngine;
+using UnityEditor;
+using System.IO;
+using GooglePlayServices;
+using UnityEditor.Build;
+using UnityEditor.Build.Reporting;
+
+namespace GoogleMobileAds.Editor
+{
+ ///
+ /// This script will verify and configure your Android build settings to be compatible
+ /// with the Google Mobile Ads SDK. This includes:
+ /// - Verify the Android Google Mobile Ads app ID is set.
+ /// - Throw an exception if the Android Google Mobile Ads app ID is not set.
+ /// - Set minimum API level to 23 (the target API level may be automatically set, we should not
+ /// hardcode it).
+ /// - Enable Custom Main Gradle Template.
+ /// - Update Custom Main Gradle Template with dependencies using the Play Services Resolver.
+ /// - Enable Custom Gradle Properties Template.
+ /// - Update Custom Gradle Properties Template with the Jetifier Ignorelist.
+ ///
+ public class AndroidBuildPreProcessor : IPreprocessBuildWithReport
+ {
+ const int MinimumAPILevel = 23;
+ const string CustomGradlePropertiesTemplatesFileName = "gradleTemplate.properties";
+ const string CustomMainGradleTemplateFileName = "mainTemplate.gradle";
+ const string JetifierEntry =
+ "android.jetifier.ignorelist=annotation-experimental-1.4.0.aar";
+
+ // Set the callback order to be before EDM4U.
+ // https://github.com/googlesamples/unity-jar-resolver/blob/master/source/AndroidResolver/src/PlayServicesPreBuild.cs#L39
+ public int callbackOrder { get { return -1; } }
+
+ public void OnPreprocessBuild(BuildReport report)
+ {
+ if(!GoogleMobileAdsSettings.LoadInstance().EnableGradleBuildPreProcessor)
+ {
+ return;
+ }
+ // For more details see, https://developers.google.com/admob/unity/android
+#if ANDROID_GRADLE_BUILD_PRE_PROCESSOR_ENABLED
+ ApplyBuildSettings(report);
+#endif
+ }
+
+ private void ApplyBuildSettings(BuildReport report)
+ {
+ Debug.Log("Running Android Gradle Build Pre-Processor.");
+
+ // Set Minimum Api Level.
+ if (PlayerSettings.Android.minSdkVersion < (AndroidSdkVersions)MinimumAPILevel)
+ {
+ PlayerSettings.Android.minSdkVersion = (AndroidSdkVersions)MinimumAPILevel;
+ Debug.Log($"Set minimum API Level to: {MinimumAPILevel}.");
+ }
+ else
+ {
+ Debug.Log($"Verified Minimum API Level is >= {MinimumAPILevel}.");
+ }
+
+ // Create Assets/Plugins folder.
+ if (!AssetDatabase.IsValidFolder(Path.Combine("Assets", "Plugins")))
+ {
+ AssetDatabase.CreateFolder("Assets", "Plugins");
+ AssetDatabase.Refresh();
+ }
+
+ // Create Assets/Plugins/Android folder.
+ if (!AssetDatabase.IsValidFolder(Path.Combine("Assets", "Plugins", "Android")))
+ {
+ AssetDatabase.CreateFolder(Path.Combine("Assets", "Plugins"), "Android");
+ AssetDatabase.Refresh();
+ }
+
+ // Ensure Custom Main Gradle Template.
+ EnsureGradleFileExists(CustomMainGradleTemplateFileName);
+
+ // Ensure Custom Gradle Properties Templates.
+ EnsureGradleFileExists(CustomGradlePropertiesTemplatesFileName);
+
+ #if ANDROID_GRADLE_BUILD_JETIFIER_ENTRY_ENABLED
+ string customGradlePropertiesTemplatesFilePath = Path.Combine(
+ Application.dataPath,
+ "Plugins", "Android",
+ CustomGradlePropertiesTemplatesFileName);
+ if (File.Exists(customGradlePropertiesTemplatesFilePath))
+ {
+ var gradlePropertiesFileContent =
+ File.ReadAllText(customGradlePropertiesTemplatesFilePath);
+ if (!gradlePropertiesFileContent.Contains(JetifierEntry))
+ {
+ File.AppendAllText(
+ customGradlePropertiesTemplatesFilePath,
+ Environment.NewLine + JetifierEntry);
+ Debug.Log($"Added Jetifier Entry.");
+ }
+ else
+ {
+ Debug.Log($"Verified Jetifier Entry exists.");
+ }
+ }
+ else
+ {
+ Debug.LogError("Failed to add Jetifier Entry.");
+ }
+ #endif
+
+ Debug.Log("Resolving Android Gradle dependencies.");
+ PlayServicesResolver.ResolveSync(true);
+ Debug.Log("Android Build Pre-Processor finished.");
+ }
+
+ ///
+ /// Ensures that the given Gradle file exists.
+ ///
+ /// name of the given Gradle file.
+ private void EnsureGradleFileExists(string fileName)
+ {
+ bool foundTargetFile = false;
+ bool foundDisabledFile = false;
+
+ // Check for target file.
+ string targetPath = Path.Combine(Application.dataPath, "Plugins", "Android", fileName);
+ if (File.Exists(targetPath))
+ {
+ foundTargetFile = true;
+ }
+
+ // Check for the ".DISABLED" file.
+ string disabledPath = Path.Combine(Application.dataPath, "Plugins", "Android",
+ $"{fileName}.DISABLED");
+ if (File.Exists(disabledPath))
+ {
+ foundDisabledFile = true;
+ }
+
+ // If DISABLED and target exist, delete DISABLED.
+ if (foundTargetFile && foundDisabledFile)
+ {
+ File.Delete(disabledPath);
+ Debug.Log($"Removed disabled {fileName}.");
+ return;
+ }
+ // If DISABLED exists, move it to target.
+ if (foundDisabledFile)
+ {
+ File.Move(disabledPath, targetPath);
+ AssetDatabase.Refresh();
+ Debug.Log($"Enabled {fileName}.");
+ return;
+ }
+ // If target exists, return true.
+ if (foundTargetFile)
+ {
+ Debug.Log($"Verified {fileName}.");
+ return;
+ }
+
+ // If target does not exist, create it from source.
+ var unityGradleTemplateDirectory = Path.Combine(
+ PlayServicesResolver.AndroidPlaybackEngineDirectory,
+ "Tools",
+ "GradleTemplates");
+ string sourceFileName = Path.Combine(unityGradleTemplateDirectory, fileName);
+ if (!File.Exists(sourceFileName))
+ {
+ throw new BuildFailedException(
+ "Android Build Pre-Processor failed. "+
+ $"Unable to find source {sourceFileName}. Is your file system read-only?" +
+ "If this issue persists, contact Google Mobile Ads Support "+
+ "at https://developers.google.com/admob/support");
+ }
+ File.Copy(sourceFileName, targetPath);
+ AssetDatabase.Refresh();
+ Debug.Log($"Created {fileName}.");
+ }
+ }
+}
+#endif
diff --git a/Assets/GoogleMobileAds/Editor/AndroidBuildPreProcessor.cs.meta b/Assets/GoogleMobileAds/Editor/AndroidBuildPreProcessor.cs.meta
new file mode 100644
index 0000000..61b58c5
--- /dev/null
+++ b/Assets/GoogleMobileAds/Editor/AndroidBuildPreProcessor.cs.meta
@@ -0,0 +1,7 @@
+fileFormatVersion: 2
+guid: c0080e86890c24abba53b3f4d2daf6db
+labels:
+- gvh
+- gvh_version-10.6.0
+- gvhp_exportpath-GoogleMobileAds/Editor/AndroidBuildPreProcessor.cs
+timeCreated: 1480838400
diff --git a/Assets/GoogleMobileAds/Editor/BuildPreProcessor.cs b/Assets/GoogleMobileAds/Editor/BuildPreProcessor.cs
new file mode 100644
index 0000000..54ac86e
--- /dev/null
+++ b/Assets/GoogleMobileAds/Editor/BuildPreProcessor.cs
@@ -0,0 +1,55 @@
+using System;
+using UnityEngine;
+using UnityEditor;
+using System.IO;
+using GooglePlayServices;
+using UnityEditor.Build;
+using UnityEditor.Build.Reporting;
+
+namespace GoogleMobileAds.Editor
+{
+ ///
+ /// Pre-processor that performs common setup tasks for all platforms before a build.
+ ///
+ public class BuildPreProcessor : IPreprocessBuildWithReport
+ {
+ // Set the callback order to be before EDM4U.
+ // https://github.com/googlesamples/unity-jar-resolver/blob/master/source/AndroidResolver/src/PlayServicesPreBuild.cs#L39
+ public int callbackOrder { get { return -1; } }
+
+ private readonly static string _linkXmlAssetsPath =
+ Path.Combine(Application.dataPath, "GoogleMobileAds", "link.xml");
+
+ public void OnPreprocessBuild(BuildReport report)
+ {
+ // Unity's managed code stripping process does not inherently process `link.xml` files
+ // in UPM packages. This pre-processor copies the `link.xml` file from the UPM package
+ // to the Unity project's `Assets/GoogleMobileAds` directory if it does not exist.
+ if (!File.Exists(_linkXmlAssetsPath))
+ {
+ CopyLinkXml();
+ }
+ }
+
+ private static void CopyLinkXml()
+ {
+ if (!AssetDatabase.IsValidFolder(Path.Combine("Assets", "GoogleMobileAds")))
+ {
+ AssetDatabase.CreateFolder("Assets", "GoogleMobileAds");
+ }
+ var pathUtils = ScriptableObject.CreateInstance();
+ if (pathUtils.IsPackageRootPath())
+ {
+ string parentDirectoryPath = pathUtils.GetParentDirectoryAssetPath();
+ string linkXmlPackagePath = Path.Combine(parentDirectoryPath, "link.xml");
+ if(String.IsNullOrEmpty(linkXmlPackagePath))
+ {
+ Debug.LogWarning("link.xml not found in the package.");
+ return;
+ }
+ AssetDatabase.CopyAsset(linkXmlPackagePath, _linkXmlAssetsPath);
+ }
+ AssetDatabase.Refresh();
+ }
+ }
+}
diff --git a/Assets/GoogleMobileAds/Editor/BuildPreProcessor.cs.meta b/Assets/GoogleMobileAds/Editor/BuildPreProcessor.cs.meta
new file mode 100644
index 0000000..159958b
--- /dev/null
+++ b/Assets/GoogleMobileAds/Editor/BuildPreProcessor.cs.meta
@@ -0,0 +1,17 @@
+fileFormatVersion: 2
+guid: 79760efe9b6bb4736aa4ffd869e2ed0c
+labels:
+- gvh
+- gvh_version-10.6.0
+- gvhp_exportpath-GoogleMobileAds/Editor/BuildPreProcessor.cs
+timeCreated: 1480838400
+MonoImporter:
+ externalObjects: {}
+ serializedVersion: 2
+ defaultReferences: []
+ executionOrder: 0
+ icon:
+ instanceID: 0
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/GoogleMobileAds/Editor/EditorLocalization.cs b/Assets/GoogleMobileAds/Editor/EditorLocalization.cs
new file mode 100644
index 0000000..d3c6d29
--- /dev/null
+++ b/Assets/GoogleMobileAds/Editor/EditorLocalization.cs
@@ -0,0 +1,172 @@
+using System;
+using System.Text.RegularExpressions;
+using System.Collections.Generic;
+using System.IO;
+using UnityEngine;
+
+namespace GoogleMobileAds.Editor
+{
+ public class EditorLocalization
+ {
+ private const string LOCALIZATION_DATA_JSON_RELATIVE_PATH = "GoogleMobileAds/Editor";
+ private const string LOCALIZATION_DATA_JSON_FILENAME =
+ "gma_settings_editor_localization_data.json";
+ private const string LOCALIZATIONS_JSON_KEY = "LocalizationsByKey";
+ private const string LOCALIZATION_KEY_PREFIX = "KEY_";
+
+ private readonly Lazy _localizationData =
+ new Lazy(() => InitLocalizationDataOrThrow());
+ private EditorLocalizationData GetLocalizationData() => _localizationData.Value;
+
+ /**
+ * Gets the default language for the settings editor.
+ * We assume the default locale used belong to the list of supported cultures
+ * (https://www.csharp-examples.net/culture-names/), and that each key has a default
+ * localization provided.
+ */
+ public string GetDefaultLanguage()
+ {
+ return "en"; // English
+ }
+
+ /**
+ * Checks that a localization key exists.
+ */
+ public bool HasKey(string key)
+ {
+ return GetLocalizationData().LocalizationsByKey.ContainsKey(key);
+ }
+
+ /**
+ * Localizes a resource key based on a provided user language.
+ * Returns the key name if the key could not be localized.
+ */
+ public string ForKey(string key)
+ {
+ key = key.ToUpper();
+ // Accept both key syntaxes.
+ if (key.StartsWith(LOCALIZATION_KEY_PREFIX))
+ key = key.Replace(LOCALIZATION_KEY_PREFIX, "");
+
+ if (GetLocalizationData().LocalizationsByKey.TryGetValue(key,
+ out Dictionary localizations))
+ {
+ // Key was found. Try to localize the key with the user language (e.g., "en" or "fr").
+ // Else, use the default (fallback) language, if the localization key is missing for
+ // the chosen language (or no language was selected).
+ // The region is omitted purposely as we don't currently require this level of details.
+ string userLanguage = GoogleMobileAdsSettings.LoadInstance().UserLanguage;
+ if (localizations == null)
+ {
+ return null;
+ }
+ bool userLanguageExists = localizations.TryGetValue(userLanguage,
+ out string userLocalization);
+ bool userLocalizationIsValid = userLanguageExists &&
+ !string.IsNullOrEmpty(userLocalization);
+ return userLocalizationIsValid ? userLocalization: localizations[GetDefaultLanguage()];
+ }
+
+ // Error, key not found, no localization to return so let's fallback to the key name
+ // to provide some sort of indication in the UI.
+ Debug.LogError($"Localization key not found: {key}.");
+ return key;
+ }
+
+ /**
+ * Deserializes the localization data, encoded in json.
+ * Returns the json deserialized to a EditorLocalizationData class instance.
+ * Throws an ArgumentException if the json file cannot be deserialized.
+ */
+ private static EditorLocalizationData InitLocalizationDataOrThrow()
+ {
+ string localizationDataPath =
+ Path.Combine(Application.dataPath, LOCALIZATION_DATA_JSON_RELATIVE_PATH,
+ LOCALIZATION_DATA_JSON_FILENAME);
+ // Handle importing the localization data file via Unity Package Manager.
+ var pathUtils = ScriptableObject.CreateInstance();
+ if (pathUtils.IsPackageRootPath())
+ {
+ localizationDataPath =
+ Path.Combine(pathUtils.GetDirectoryAssetPath(), LOCALIZATION_DATA_JSON_FILENAME);
+ }
+ try
+ {
+ string json = File.ReadAllText(localizationDataPath);
+ var data = DeserializeFromJson(json);
+ if (data.LocalizationsByKey == null)
+ {
+ throw new ArgumentNullException("LocalizationsByKey");
+ }
+ return data;
+ }
+ catch (Exception)
+ {
+ throw new ArgumentException(
+ $"Exception thrown while retrieving localization data from {localizationDataPath}:" +
+ " {ex:full}");
+ }
+ }
+
+ // We would like to handle the deserialization of the JSON file referenced above but without
+ // leveraging any JSON library to avoid adding any dependency.
+ private static EditorLocalizationData DeserializeFromJson(string json)
+ {
+ var data = new EditorLocalizationData();
+ data.LocalizationsByKey = new Dictionary>();
+ // We match every field in the JSON. The order in which those matches are found is used to
+ // deserialize the localization values.
+ var regex = new Regex(@"""(?[^""]+)""");
+ var matches = regex.Matches(json);
+ var currentKeys = new List();
+ var valueProcessed = false;
+ foreach (Match match in matches)
+ {
+ var val = match.Groups["val"].Value;
+ if (val.Equals(LOCALIZATIONS_JSON_KEY))
+ {
+ currentKeys.Clear();
+ continue;
+ }
+
+ if (valueProcessed)
+ {
+ valueProcessed = false;
+ if (val.StartsWith(LOCALIZATION_KEY_PREFIX))
+ {
+ // Start a new level.
+ currentKeys.Clear();
+ }
+ else if (currentKeys.Count > 0)
+ {
+ // Go up one level by removing the latest key.
+ currentKeys.RemoveAt(currentKeys.Count - 1);
+ }
+ }
+
+ // The localization values are 2 levels deep.
+ if (currentKeys.Count < 2)
+ {
+ currentKeys.Add(val);
+ continue;
+ }
+
+ ProcessValue(data, currentKeys, val);
+ valueProcessed = true;
+ }
+
+ return data;
+ }
+
+ private static void ProcessValue(EditorLocalizationData data, List currentKeys,
+ string val)
+ {
+ if (currentKeys.Count != 2)
+ return;
+ currentKeys[0] = currentKeys[0].Replace(LOCALIZATION_KEY_PREFIX, "");
+ if (!data.LocalizationsByKey.ContainsKey(currentKeys[0]))
+ data.LocalizationsByKey[currentKeys[0]] = new Dictionary();
+ data.LocalizationsByKey[currentKeys[0]][currentKeys[1]] = val;
+ }
+ }
+}
diff --git a/Assets/GoogleMobileAds/Editor/EditorLocalization.cs.meta b/Assets/GoogleMobileAds/Editor/EditorLocalization.cs.meta
new file mode 100644
index 0000000..722729c
--- /dev/null
+++ b/Assets/GoogleMobileAds/Editor/EditorLocalization.cs.meta
@@ -0,0 +1,17 @@
+fileFormatVersion: 2
+guid: 1a843cb3b999a40ea9babd1f69e1232f
+labels:
+- gvh
+- gvh_version-10.6.0
+- gvhp_exportpath-GoogleMobileAds/Editor/EditorLocalization.cs
+timeCreated: 1480838400
+MonoImporter:
+ externalObjects: {}
+ serializedVersion: 2
+ defaultReferences: []
+ executionOrder: 0
+ icon:
+ instanceID: 0
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/GoogleMobileAds/Editor/EditorLocalizationData.cs b/Assets/GoogleMobileAds/Editor/EditorLocalizationData.cs
new file mode 100644
index 0000000..8ff2037
--- /dev/null
+++ b/Assets/GoogleMobileAds/Editor/EditorLocalizationData.cs
@@ -0,0 +1,11 @@
+using System.Collections.Generic;
+
+namespace GoogleMobileAds.Editor
+{
+ public class EditorLocalizationData
+ {
+ // First key: the localization key. Second key: the language to lookup. Value: the resulting
+ // localization.
+ public Dictionary> LocalizationsByKey { get; set; }
+ }
+}
diff --git a/Assets/GoogleMobileAds/Editor/EditorLocalizationData.cs.meta b/Assets/GoogleMobileAds/Editor/EditorLocalizationData.cs.meta
new file mode 100644
index 0000000..87ecf24
--- /dev/null
+++ b/Assets/GoogleMobileAds/Editor/EditorLocalizationData.cs.meta
@@ -0,0 +1,17 @@
+fileFormatVersion: 2
+guid: e7aaa882f59b8405d97e3042283cc034
+labels:
+- gvh
+- gvh_version-10.6.0
+- gvhp_exportpath-GoogleMobileAds/Editor/EditorLocalizationData.cs
+timeCreated: 1480838400
+MonoImporter:
+ externalObjects: {}
+ serializedVersion: 2
+ defaultReferences: []
+ executionOrder: 0
+ icon:
+ instanceID: 0
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/GoogleMobileAds/Editor/EditorPathUtils.cs b/Assets/GoogleMobileAds/Editor/EditorPathUtils.cs
new file mode 100644
index 0000000..a24498c
--- /dev/null
+++ b/Assets/GoogleMobileAds/Editor/EditorPathUtils.cs
@@ -0,0 +1,57 @@
+// Copyright (C) 2023 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.
+
+using System.IO;
+using UnityEditor;
+using UnityEngine;
+
+/*
+ * EditorPathUtils class finds and processes the AssetPath for
+ * EditorPathUtils.cs within unity asset database.
+ */
+public class EditorPathUtils : ScriptableObject
+{
+ /*
+ * Returns the asset path of EditorPathUtils.cs
+ */
+ private string GetFilePath()
+ {
+ return AssetDatabase.GetAssetPath(MonoScript.FromScriptableObject(this));
+ }
+
+ /*
+ * Returns the asset directory path of EditorPathUtils.cs
+ */
+ public string GetDirectoryAssetPath()
+ {
+ return Path.GetDirectoryName(GetFilePath());
+ }
+
+ /*
+ * Returns the parent asset directory path of EditorPathUtils.cs
+ */
+ public string GetParentDirectoryAssetPath()
+ {
+ return Path.GetDirectoryName(GetDirectoryAssetPath());
+ }
+
+ /*
+ * Returns true if GMA import is done via unity package manager,
+ * false otherwise.
+ */
+ public bool IsPackageRootPath()
+ {
+ return GetFilePath().StartsWith("Packages");
+ }
+}
diff --git a/Assets/GoogleMobileAds/Editor/EditorPathUtils.cs.meta b/Assets/GoogleMobileAds/Editor/EditorPathUtils.cs.meta
new file mode 100644
index 0000000..3a26ae7
--- /dev/null
+++ b/Assets/GoogleMobileAds/Editor/EditorPathUtils.cs.meta
@@ -0,0 +1,17 @@
+fileFormatVersion: 2
+guid: e1f0097ebfa3e416197e298c9135b6de
+labels:
+- gvh
+- gvh_version-10.6.0
+- gvhp_exportpath-GoogleMobileAds/Editor/EditorPathUtils.cs
+timeCreated: 1480838400
+MonoImporter:
+ externalObjects: {}
+ serializedVersion: 2
+ defaultReferences: []
+ executionOrder: 0
+ icon:
+ instanceID: 0
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/GoogleMobileAds/Editor/GoogleMobileAds.Editor.asmdef b/Assets/GoogleMobileAds/Editor/GoogleMobileAds.Editor.asmdef
new file mode 100644
index 0000000..9cd84ca
--- /dev/null
+++ b/Assets/GoogleMobileAds/Editor/GoogleMobileAds.Editor.asmdef
@@ -0,0 +1,20 @@
+{
+ "name": "GoogleMobileAds.Editor",
+ "references": [
+ "GoogleMobileAds",
+ "GoogleMobileAds.Core",
+ "GoogleMobileAds.Placement",
+ "GoogleMobileAds.Placement.Core"
+ ],
+ "includePlatforms": [
+ "Editor"
+ ],
+ "excludePlatforms": [],
+ "allowUnsafeCode": false,
+ "overrideReferences": false,
+ "precompiledReferences": [],
+ "autoReferenced": true,
+ "defineConstraints": [],
+ "versionDefines": [],
+ "noEngineReferences": false
+}
\ No newline at end of file
diff --git a/Assets/GoogleMobileAds/Editor/GoogleMobileAds.Editor.asmdef.meta b/Assets/GoogleMobileAds/Editor/GoogleMobileAds.Editor.asmdef.meta
new file mode 100644
index 0000000..6e38880
--- /dev/null
+++ b/Assets/GoogleMobileAds/Editor/GoogleMobileAds.Editor.asmdef.meta
@@ -0,0 +1,12 @@
+fileFormatVersion: 2
+guid: cbb42e4cfd9484f52972c8f05e1c3252
+labels:
+- gvh
+- gvh_version-10.6.0
+- gvhp_exportpath-GoogleMobileAds/Editor/GoogleMobileAds.Editor.asmdef
+timeCreated: 1480838400
+AssemblyDefinitionImporter:
+ externalObjects: {}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/GoogleMobileAds/Editor/GoogleMobileAdsDependencies.xml b/Assets/GoogleMobileAds/Editor/GoogleMobileAdsDependencies.xml
new file mode 100644
index 0000000..5eed6ed
--- /dev/null
+++ b/Assets/GoogleMobileAds/Editor/GoogleMobileAdsDependencies.xml
@@ -0,0 +1,27 @@
+
+
+
+
+ https://maven.aliyun.com/repository/google
+
+
+
+
+ https://maven.aliyun.com/repository/google
+
+
+
+
+ https://maven.aliyun.com/repository/google
+
+
+
+
+
+
+
+ https://github.com/CocoaPods/Specs
+
+
+
+
diff --git a/Assets/GoogleMobileAds/Editor/GoogleMobileAdsDependencies.xml.meta b/Assets/GoogleMobileAds/Editor/GoogleMobileAdsDependencies.xml.meta
new file mode 100644
index 0000000..6c43d9d
--- /dev/null
+++ b/Assets/GoogleMobileAds/Editor/GoogleMobileAdsDependencies.xml.meta
@@ -0,0 +1,12 @@
+fileFormatVersion: 2
+guid: 2c9357ed17521401bb7b6733145ebcd9
+labels:
+- gvh
+- gvh_version-10.6.0
+- gvhp_exportpath-GoogleMobileAds/Editor/GoogleMobileAdsDependencies.xml
+timeCreated: 1504855478
+licenseType: Pro
+TextScriptImporter:
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/GoogleMobileAds/Editor/GoogleMobileAdsSKAdNetworkItems.xml b/Assets/GoogleMobileAds/Editor/GoogleMobileAdsSKAdNetworkItems.xml
new file mode 100644
index 0000000..bbc9a89
--- /dev/null
+++ b/Assets/GoogleMobileAds/Editor/GoogleMobileAdsSKAdNetworkItems.xml
@@ -0,0 +1,55 @@
+
+
+ cstr6suwn9.skadnetwork
+
+
+ 4fzdc2evr5.skadnetwork
+ 2fnua5tdw4.skadnetwork
+ ydx93a7ass.skadnetwork
+ p78axxw29g.skadnetwork
+ v72qych5uu.skadnetwork
+ ludvb6z3bs.skadnetwork
+ cp8zw746q7.skadnetwork
+ 3sh42y64q3.skadnetwork
+ c6k4g5qg8m.skadnetwork
+ s39g8k73mm.skadnetwork
+ 3qy4746246.skadnetwork
+ f38h382jlk.skadnetwork
+ hs6bdukanm.skadnetwork
+ mlmmfzh3r3.skadnetwork
+ v4nxqhlyqp.skadnetwork
+ wzmmz9fp6w.skadnetwork
+ su67r6k2v3.skadnetwork
+ yclnxrl5pm.skadnetwork
+ t38b2kh725.skadnetwork
+ 7ug5zh24hu.skadnetwork
+ gta9lk7p23.skadnetwork
+ vutu7akeur.skadnetwork
+ y5ghdn5j9k.skadnetwork
+ v9wttpbfk9.skadnetwork
+ n38lu8286q.skadnetwork
+ 47vhws6wlr.skadnetwork
+ kbd757ywx3.skadnetwork
+ 9t245vhmpl.skadnetwork
+ a2p9lx4jpn.skadnetwork
+ 22mmun2rn5.skadnetwork
+ 44jx6755aq.skadnetwork
+ k674qkevps.skadnetwork
+ 4468km3ulz.skadnetwork
+ 2u9pt9hc89.skadnetwork
+ 8s468mfl3y.skadnetwork
+ klf5c3l5u5.skadnetwork
+ ppxm28t8ap.skadnetwork
+ kbmxgpxpgc.skadnetwork
+ uw77j35x4d.skadnetwork
+ 578prtvx9j.skadnetwork
+ 4dzt52r2t5.skadnetwork
+ tl55sbb4fm.skadnetwork
+ c3frkrj4fj.skadnetwork
+ e5fvkxwrpn.skadnetwork
+ 8c4e2ghe7u.skadnetwork
+ 3rd42ekr43.skadnetwork
+ 97r2b46745.skadnetwork
+ 3qcr597p9d.skadnetwork
+
diff --git a/Assets/GoogleMobileAds/Editor/GoogleMobileAdsSKAdNetworkItems.xml.meta b/Assets/GoogleMobileAds/Editor/GoogleMobileAdsSKAdNetworkItems.xml.meta
new file mode 100644
index 0000000..5a672b9
--- /dev/null
+++ b/Assets/GoogleMobileAds/Editor/GoogleMobileAdsSKAdNetworkItems.xml.meta
@@ -0,0 +1,12 @@
+fileFormatVersion: 2
+guid: b18ecf64be00344e7b039c69e9af56bf
+labels:
+- gvh
+- gvh_version-10.6.0
+- gvhp_exportpath-GoogleMobileAds/Editor/GoogleMobileAdsSKAdNetworkItems.xml
+timeCreated: 1480838400
+TextScriptImporter:
+ externalObjects: {}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/GoogleMobileAds/Editor/GoogleMobileAdsSettings.cs b/Assets/GoogleMobileAds/Editor/GoogleMobileAdsSettings.cs
new file mode 100644
index 0000000..3c96473
--- /dev/null
+++ b/Assets/GoogleMobileAds/Editor/GoogleMobileAdsSettings.cs
@@ -0,0 +1,115 @@
+using System;
+using System.IO;
+using UnityEditor;
+using UnityEngine;
+
+namespace GoogleMobileAds.Editor
+{
+ internal class GoogleMobileAdsSettings : ScriptableObject
+ {
+ private const string MobileAdsSettingsResDir = "Assets/GoogleMobileAds/Resources";
+
+ private const string MobileAdsSettingsFile = "GoogleMobileAdsSettings";
+
+ private const string MobileAdsSettingsFileExtension = ".asset";
+
+ internal static GoogleMobileAdsSettings LoadInstance()
+ {
+ // Read from resources.
+ var instance = Resources.Load(MobileAdsSettingsFile);
+
+ // Create instance if null.
+ if (instance == null)
+ {
+ Directory.CreateDirectory(MobileAdsSettingsResDir);
+ instance = ScriptableObject.CreateInstance();
+ string assetPath = Path.Combine(MobileAdsSettingsResDir,
+ MobileAdsSettingsFile + MobileAdsSettingsFileExtension);
+ AssetDatabase.CreateAsset(instance, assetPath);
+ AssetDatabase.SaveAssets();
+ }
+
+ return instance;
+ }
+
+ [SerializeField]
+ private string adMobAndroidAppId = string.Empty;
+
+ [SerializeField]
+ private string adMobIOSAppId = string.Empty;
+
+ [SerializeField]
+ private bool enableKotlinXCoroutinesPackagingOption = true;
+
+ [SerializeField]
+ private bool enableGradleBuildPreProcessor = true;
+
+ [SerializeField]
+ private bool disableOptimizeInitialization;
+
+ [SerializeField]
+ private bool disableOptimizeAdLoading;
+
+ [SerializeField]
+ private string userTrackingUsageDescription;
+
+ [SerializeField]
+ private string userLanguage = "en";
+
+ public string GoogleMobileAdsAndroidAppId
+ {
+ get { return adMobAndroidAppId; }
+
+ set { adMobAndroidAppId = value; }
+ }
+
+ public bool EnableGradleBuildPreProcessor
+ {
+ get { return enableGradleBuildPreProcessor; }
+
+ set { enableGradleBuildPreProcessor = value; }
+ }
+
+ public bool EnableKotlinXCoroutinesPackagingOption
+ {
+ get { return enableKotlinXCoroutinesPackagingOption; }
+
+ set { enableKotlinXCoroutinesPackagingOption = value; }
+ }
+
+ public string GoogleMobileAdsIOSAppId
+ {
+ get { return adMobIOSAppId; }
+
+ set { adMobIOSAppId = value; }
+ }
+
+ public bool DisableOptimizeInitialization
+ {
+ get { return disableOptimizeInitialization; }
+
+ set { disableOptimizeInitialization = value; }
+ }
+
+ public bool DisableOptimizeAdLoading
+ {
+ get { return disableOptimizeAdLoading; }
+
+ set { disableOptimizeAdLoading = value; }
+ }
+
+ public string UserTrackingUsageDescription
+ {
+ get { return userTrackingUsageDescription; }
+
+ set { userTrackingUsageDescription = value; }
+ }
+
+ public string UserLanguage
+ {
+ get { return userLanguage; }
+
+ set { userLanguage = value; }
+ }
+ }
+}
diff --git a/Assets/GoogleMobileAds/Editor/GoogleMobileAdsSettings.cs.meta b/Assets/GoogleMobileAds/Editor/GoogleMobileAdsSettings.cs.meta
new file mode 100644
index 0000000..21467db
--- /dev/null
+++ b/Assets/GoogleMobileAds/Editor/GoogleMobileAdsSettings.cs.meta
@@ -0,0 +1,17 @@
+fileFormatVersion: 2
+guid: a187246822bbb47529482707f3e0eff8
+labels:
+- gvh
+- gvh_version-10.6.0
+- gvhp_exportpath-GoogleMobileAds/Editor/GoogleMobileAdsSettings.cs
+timeCreated: 1480838400
+MonoImporter:
+ externalObjects: {}
+ serializedVersion: 2
+ defaultReferences: []
+ executionOrder: 0
+ icon:
+ instanceID: 0
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/GoogleMobileAds/Editor/GoogleMobileAdsSettingsEditor.cs b/Assets/GoogleMobileAds/Editor/GoogleMobileAdsSettingsEditor.cs
new file mode 100644
index 0000000..e747759
--- /dev/null
+++ b/Assets/GoogleMobileAds/Editor/GoogleMobileAdsSettingsEditor.cs
@@ -0,0 +1,164 @@
+#if UNITY_6000_0_OR_NEWER || UNITY_2023 || UNITY_2022 || UNITY_2021_3_55 || UNITY_2021_3_54 || UNITY_2021_3_53 || UNITY_2021_3_52 || UNITY_2021_3_51 || UNITY_2021_3_50 || UNITY_2021_3_49 || UNITY_2021_3_48 || UNITY_2021_3_47 || UNITY_2021_3_46 || UNITY_2021_3_45 || UNITY_2021_3_44 || UNITY_2021_3_43 || UNITY_2021_3_42 || UNITY_2021_3_41
+#define ANDROID_GRADLE_BUILD_PRE_PROCESSOR_ENABLED
+#endif
+
+using System;
+using UnityEditor;
+using UnityEngine;
+
+namespace GoogleMobileAds.Editor
+{
+ [InitializeOnLoad]
+ [CustomEditor(typeof(GoogleMobileAdsSettings))]
+ public class GoogleMobileAdsSettingsEditor : UnityEditor.Editor
+ {
+ SerializedProperty _appIdAndroid;
+ SerializedProperty _appIdiOS;
+ SerializedProperty _enableGradleBuildPreProcessor;
+ SerializedProperty _enableKotlinXCoroutinesPackagingOption;
+ SerializedProperty _disableOptimizeInitialization;
+ SerializedProperty _disableOptimizeAdLoading;
+ SerializedProperty _userLanguage;
+ SerializedProperty _userTrackingUsageDescription;
+
+ // Using an ordered list of languages is computationally expensive when trying to create an
+ // array out of them for purposes of showing a dropdown menu. Care should be taken to ensure
+ // these arrays are kept in sync.
+ string[] availableLanguages = new string[] { "English", "French"};
+ string[] languageCodes = new string[] { "en", "fr" };
+ int selectedIndex = 0;
+
+ [MenuItem("Assets/Google Mobile Ads/Settings...")]
+ public static void OpenInspector()
+ {
+ Selection.activeObject = GoogleMobileAdsSettings.LoadInstance();
+ }
+
+ public void OnEnable()
+ {
+ _appIdAndroid = serializedObject.FindProperty("adMobAndroidAppId");
+ _appIdiOS = serializedObject.FindProperty("adMobIOSAppId");
+ _enableGradleBuildPreProcessor =
+ serializedObject.FindProperty("enableGradleBuildPreProcessor");
+ _enableKotlinXCoroutinesPackagingOption =
+ serializedObject.FindProperty("enableKotlinXCoroutinesPackagingOption");
+ _disableOptimizeInitialization = serializedObject.FindProperty("disableOptimizeInitialization");
+ _disableOptimizeAdLoading = serializedObject.FindProperty("disableOptimizeAdLoading");
+ _userLanguage = serializedObject.FindProperty("userLanguage");
+ _userTrackingUsageDescription =
+ serializedObject.FindProperty("userTrackingUsageDescription");
+
+ selectedIndex = Array.IndexOf(languageCodes, _userLanguage.stringValue);
+ selectedIndex = selectedIndex >= 0 ? selectedIndex : 0;
+ }
+
+ public override void OnInspectorGUI()
+ {
+ // Make sure the Settings object has all recent changes.
+ serializedObject.Update();
+
+ var settings = (GoogleMobileAdsSettings)target;
+
+ if (settings == null)
+ {
+ UnityEngine.Debug.LogError("GoogleMobileAdsSettings is null.");
+ return;
+ }
+
+ EditorLocalization localization = new EditorLocalization();
+ EditorGUI.BeginChangeCheck();
+ selectedIndex = EditorGUILayout.Popup("Language", selectedIndex, availableLanguages);
+ if (EditorGUI.EndChangeCheck())
+ {
+ _userLanguage.stringValue = languageCodes[selectedIndex];
+ }
+
+ EditorGUIUtility.labelWidth = 60.0f;
+ EditorGUILayout.LabelField(localization.ForKey("GMA_APP_ID_LABEL"),
+ EditorStyles.boldLabel);
+ EditorGUI.indentLevel++;
+
+ EditorGUILayout.PropertyField(_appIdAndroid, new GUIContent("Android"));
+
+ EditorGUILayout.PropertyField(_appIdiOS, new GUIContent("iOS"));
+
+ EditorGUILayout.HelpBox(localization.ForKey("GMA_APP_ID_HELPBOX"), MessageType.Info);
+
+ EditorGUI.indentLevel--;
+ EditorGUILayout.Separator();
+
+ EditorGUIUtility.labelWidth = 325.0f;
+ EditorGUILayout.LabelField(localization.ForKey("ANDROID_SETTINGS_LABEL"),
+ EditorStyles.boldLabel);
+ EditorGUI.indentLevel++;
+
+ EditorGUI.BeginChangeCheck();
+
+#if ANDROID_GRADLE_BUILD_PRE_PROCESSOR_ENABLED
+ EditorGUILayout.PropertyField(
+ _enableGradleBuildPreProcessor,
+ new GUIContent(
+ localization.ForKey("ENABLE_GRADLE_BUILD_PRE_PROCESSOR_SETTING")));
+
+ if (settings.EnableGradleBuildPreProcessor)
+ {
+ EditorGUILayout.HelpBox(
+ localization.ForKey("ENABLE_GRADLE_BUILD_PRE_PROCESSOR_HELPBOX"),
+ MessageType.Info);
+ }
+#endif
+
+ EditorGUILayout.PropertyField(
+ _enableKotlinXCoroutinesPackagingOption,
+ new GUIContent(
+ localization.ForKey("ENABLE_KOTLINX_COROUTINES_PACKAGING_OPTION_SETTING")));
+
+ if (settings.EnableKotlinXCoroutinesPackagingOption)
+ {
+ EditorGUILayout.HelpBox(
+ localization.ForKey("ENABLE_KOTLINX_COROUTINES_PACKAGING_OPTION_HELPBOX"),
+ MessageType.Info);
+ }
+
+
+ EditorGUILayout.PropertyField(
+ _disableOptimizeInitialization,
+ new GUIContent(localization.ForKey("DISABLE_OPTIMIZE_INITIALIZATION_SETTING")));
+ if (settings.DisableOptimizeInitialization)
+ {
+ EditorGUILayout.HelpBox(localization.ForKey("DISABLE_OPTIMIZE_INITIALIZATION_HELPBOX"),
+ MessageType.Info);
+ }
+
+ EditorGUILayout.PropertyField(
+ _disableOptimizeAdLoading,
+ new GUIContent(localization.ForKey("DISABLE_OPTIMIZE_AD_LOADING_SETTING")));
+
+ if (settings.DisableOptimizeAdLoading)
+ {
+ EditorGUILayout.HelpBox(localization.ForKey("DISABLE_OPTIMIZE_AD_LOADING_HELPBOX"),
+ MessageType.Info);
+ }
+
+ EditorGUI.indentLevel--;
+ EditorGUILayout.Separator();
+
+ EditorGUIUtility.labelWidth = 300.0f;
+ EditorGUILayout.LabelField(localization.ForKey("UMP_SPECIFIC_SETTINGS_LABEL"),
+ EditorStyles.boldLabel);
+ EditorGUI.indentLevel++;
+
+ EditorGUILayout.PropertyField(
+ _userTrackingUsageDescription,
+ new GUIContent(localization.ForKey("USER_TRACKING_USAGE_DESCRIPTION_SETTING")));
+
+ EditorGUILayout.HelpBox(localization.ForKey("USER_TRACKING_USAGE_DESCRIPTION_HELPBOX"),
+ MessageType.Info);
+
+ EditorGUI.indentLevel--;
+ EditorGUILayout.Separator();
+
+ serializedObject.ApplyModifiedProperties();
+ }
+ }
+}
diff --git a/Assets/GoogleMobileAds/Editor/GoogleMobileAdsSettingsEditor.cs.meta b/Assets/GoogleMobileAds/Editor/GoogleMobileAdsSettingsEditor.cs.meta
new file mode 100644
index 0000000..62c0507
--- /dev/null
+++ b/Assets/GoogleMobileAds/Editor/GoogleMobileAdsSettingsEditor.cs.meta
@@ -0,0 +1,17 @@
+fileFormatVersion: 2
+guid: 8afb1338afbd34c4fac628cd6175c032
+labels:
+- gvh
+- gvh_version-10.6.0
+- gvhp_exportpath-GoogleMobileAds/Editor/GoogleMobileAdsSettingsEditor.cs
+timeCreated: 1480838400
+MonoImporter:
+ externalObjects: {}
+ serializedVersion: 2
+ defaultReferences: []
+ executionOrder: 0
+ icon:
+ instanceID: 0
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/GoogleMobileAds/Editor/GoogleUmpDependencies.xml b/Assets/GoogleMobileAds/Editor/GoogleUmpDependencies.xml
new file mode 100644
index 0000000..272f4f9
--- /dev/null
+++ b/Assets/GoogleMobileAds/Editor/GoogleUmpDependencies.xml
@@ -0,0 +1,16 @@
+
+
+
+
+ https://maven.aliyun.com/repository/google
+
+
+
+
+
+
+ https://github.com/CocoaPods/Specs
+
+
+
+
diff --git a/Assets/GoogleMobileAds/Editor/GoogleUmpDependencies.xml.meta b/Assets/GoogleMobileAds/Editor/GoogleUmpDependencies.xml.meta
new file mode 100644
index 0000000..5694d38
--- /dev/null
+++ b/Assets/GoogleMobileAds/Editor/GoogleUmpDependencies.xml.meta
@@ -0,0 +1,12 @@
+fileFormatVersion: 2
+guid: f7225ce7103aa4556994e2c2be08cd37
+labels:
+- gvh
+- gvh_version-10.6.0
+- gvhp_exportpath-GoogleMobileAds/Editor/GoogleUmpDependencies.xml
+timeCreated: 1480838400
+TextScriptImporter:
+ externalObjects: {}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/GoogleMobileAds/Editor/GradleProcessor.cs b/Assets/GoogleMobileAds/Editor/GradleProcessor.cs
new file mode 100644
index 0000000..84f0901
--- /dev/null
+++ b/Assets/GoogleMobileAds/Editor/GradleProcessor.cs
@@ -0,0 +1,99 @@
+using System;
+using System.IO;
+using UnityEditor.Android;
+
+using GoogleMobileAds.Editor;
+
+public class GradleProcessor : IPostGenerateGradleAndroidProject
+{
+ public int callbackOrder { get { return 0; } }
+
+ private const string GMA_PACKAGING_OPTIONS_LAUNCHER =
+ "apply from: '../unityLibrary/GoogleMobileAdsPlugin.androidlib/packaging_options.gradle'";
+
+ private const string GMA_PACKAGING_OPTIONS =
+ "apply from: 'GoogleMobileAdsPlugin.androidlib/packaging_options.gradle'";
+
+ private const string GMA_VALIDATE_GRADLE_DEPENDENCIES =
+ "gradle.projectsEvaluated { apply from: 'GoogleMobileAdsPlugin.androidlib/validate_dependencies.gradle' }";
+
+ public void OnPostGenerateGradleAndroidProject(string path)
+ {
+ var rootDirinfo = new DirectoryInfo(path);
+ var rootPath = rootDirinfo.Parent.FullName;
+ var gradleList = Directory.GetFiles(rootPath, "build.gradle", SearchOption.AllDirectories);
+
+ var packagingOptionsLauncher = GMA_PACKAGING_OPTIONS_LAUNCHER;
+ var packagingOptionsUnityLibrary = GMA_PACKAGING_OPTIONS;
+ var validateGradleDependencies = GMA_VALIDATE_GRADLE_DEPENDENCIES;
+
+ // Windows path requires '\\'
+#if UNITY_EDITOR_WIN
+ packagingOptionsLauncher = packagingOptionsLauncher.Replace("/","\\\\");
+ packagingOptionsUnityLibrary = packagingOptionsUnityLibrary.Replace("/","\\\\");
+ validateGradleDependencies = validateGradleDependencies.Replace("/","\\\\");
+#endif
+
+ foreach (var gradlepath in gradleList)
+ {
+ if (!gradlepath.Contains("unityLibrary/build.gradle") &&
+ !gradlepath.Contains("launcher/build.gradle") &&
+ !gradlepath.Contains("unityLibrary\\build.gradle") &&
+ !gradlepath.Contains("launcher\\build.gradle"))
+ {
+ continue;
+ }
+
+ var contents = File.ReadAllText(gradlepath);
+ // Delete existing packaging_options and then set it if enabled.
+ if (contents.Contains("packaging_options.gradle"))
+ {
+ contents = DeleteLineContainingSubstring(contents, "packaging_options.gradle");
+ }
+
+ if (!GoogleMobileAdsSettings.LoadInstance().EnableKotlinXCoroutinesPackagingOption)
+ {
+ File.WriteAllText(gradlepath, contents);
+ continue;
+ }
+
+ if (gradlepath.Contains("unityLibrary/build.gradle") || gradlepath.Contains("unityLibrary\\build.gradle"))
+ {
+ contents += Environment.NewLine + packagingOptionsUnityLibrary;
+ }
+ else if (gradlepath.Contains("launcher/build.gradle") || gradlepath.Contains("launcher\\build.gradle"))
+ {
+ contents += Environment.NewLine + packagingOptionsLauncher;
+ }
+ File.WriteAllText(gradlepath, contents);
+ }
+
+ // TODO (b/311555203) Use delete then write approach above to update this Gradle script too.
+ var unityLibraryGradle = Directory.GetFiles(rootPath, "unityLibrary/build.gradle",
+ SearchOption.TopDirectoryOnly);
+
+ foreach (var gradlePath in unityLibraryGradle)
+ {
+ var contents = File.ReadAllText(gradlePath);
+ if (contents.Contains(validateGradleDependencies))
+ {
+ contents = DeleteLineContainingSubstring(contents, validateGradleDependencies);
+ File.WriteAllText(gradlePath, contents);
+ }
+ }
+ }
+
+ private string DeleteLineContainingSubstring(string file, string substring)
+ {
+ string newFile = "";
+ var lines = file.Split(new[] { Environment.NewLine }, StringSplitOptions.None);
+ foreach (var line in lines)
+ {
+ if (!line.Contains(substring))
+ {
+ newFile += line + Environment.NewLine;
+ }
+ }
+ return newFile;
+ }
+}
diff --git a/Assets/GoogleMobileAds/Editor/GradleProcessor.cs.meta b/Assets/GoogleMobileAds/Editor/GradleProcessor.cs.meta
new file mode 100644
index 0000000..b3a3b5c
--- /dev/null
+++ b/Assets/GoogleMobileAds/Editor/GradleProcessor.cs.meta
@@ -0,0 +1,17 @@
+fileFormatVersion: 2
+guid: ee0016d28899644a9bbcb67f438d41bd
+labels:
+- gvh
+- gvh_version-10.6.0
+- gvhp_exportpath-GoogleMobileAds/Editor/GradleProcessor.cs
+timeCreated: 1480838400
+MonoImporter:
+ externalObjects: {}
+ serializedVersion: 2
+ defaultReferences: []
+ executionOrder: 0
+ icon:
+ instanceID: 0
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/GoogleMobileAds/Editor/ManifestProcessor.cs b/Assets/GoogleMobileAds/Editor/ManifestProcessor.cs
new file mode 100644
index 0000000..be3d174
--- /dev/null
+++ b/Assets/GoogleMobileAds/Editor/ManifestProcessor.cs
@@ -0,0 +1,249 @@
+// 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 MANIFEST_RELATIVE_PATH =
+ "Plugins/Android/GoogleMobileAdsPlugin.androidlib/AndroidManifest.xml";
+
+ private const string PROPERTIES_RELATIVE_PATH =
+ "Plugins/Android/GoogleMobileAdsPlugin.androidlib/project.properties";
+
+ private const string METADATA_APPLICATION_ID =
+ "com.google.android.gms.ads.APPLICATION_ID";
+
+ private const string METADATA_DELAY_APP_MEASUREMENT_INIT =
+ "com.google.android.gms.ads.DELAY_APP_MEASUREMENT_INIT";
+
+ private const string METADATA_OPTIMIZE_INITIALIZATION =
+ "com.google.android.gms.ads.flag.OPTIMIZE_INITIALIZATION";
+
+ private const string METADATA_OPTIMIZE_AD_LOADING =
+ "com.google.android.gms.ads.flag.OPTIMIZE_AD_LOADING";
+
+ // LINT.IfChange
+ private const string METADATA_UNITY_VERSION = "com.google.unity.ads.UNITY_VERSION";
+ // LINT.ThenChange(//depot/google3/javatests/com/google/android/gmscore/integ/modules/admob/tests/robolectric/src/com/google/android/gms/ads/nonagon/signals/StaticDeviceSignalSourceTest.java)
+
+ 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);
+ string propertiesPath = Path.Combine(Application.dataPath, PROPERTIES_RELATIVE_PATH);
+
+ /*
+ * Handle importing GMA via Unity Package Manager.
+ */
+ EditorPathUtils pathUtils =
+ ScriptableObject.CreateInstance();
+ if (pathUtils.IsPackageRootPath())
+ {
+ // pathUtils.GetParentDirectoryAssetPath() returns "Packages/.../GoogleMobileAds" but
+ // Plugins is at the same level of GoogleMobileAds so we go up one directory before
+ // appending MANIFEST_RELATIVE_PATH.
+ string packagesPathPrefix =
+ Path.GetDirectoryName(pathUtils.GetParentDirectoryAssetPath());
+ manifestPath = Path.Combine(packagesPathPrefix, MANIFEST_RELATIVE_PATH);
+ propertiesPath = Path.Combine(packagesPathPrefix, PROPERTIES_RELATIVE_PATH);
+ }
+
+ if (AssetDatabase.IsValidFolder("Packages/com.google.ads.mobile"))
+ {
+ manifestPath = Path.Combine("Packages/com.google.ads.mobile", MANIFEST_RELATIVE_PATH);
+ }
+
+ if (!File.Exists(manifestPath))
+ {
+ manifestPath = Path.Combine(Path.GetDirectoryName(manifestPath), "src", "main",
+ "AndroidManifest.xml");
+ }
+
+ 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.");
+ }
+
+ GoogleMobileAdsSettings instance = GoogleMobileAdsSettings.LoadInstance();
+ string appId = instance.GoogleMobileAdsAndroidAppId.Trim();
+
+ if (appId.Length == 0)
+ {
+ StopBuildWithMessage(
+ "Android Google Mobile Ads app ID is empty. Please enter a valid app ID to run ads properly.");
+ }
+
+ IEnumerable metas = elemApplication.Descendants()
+ .Where( elem => elem.Name.LocalName.Equals("meta-data"));
+
+ SetMetadataElement(elemApplication,
+ metas,
+ METADATA_APPLICATION_ID,
+ appId);
+
+ SetMetadataElement(elemApplication,
+ metas,
+ METADATA_OPTIMIZE_INITIALIZATION,
+ !instance.DisableOptimizeInitialization,
+ true);
+
+ SetMetadataElement(elemApplication,
+ metas,
+ METADATA_OPTIMIZE_AD_LOADING,
+ !instance.DisableOptimizeAdLoading,
+ true);
+
+ SetMetadataElement(elemApplication,
+ metas,
+ METADATA_UNITY_VERSION,
+ Application.unityVersion);
+
+ 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 metas, string metaName)
+ {
+ foreach (XElement elem in metas)
+ {
+ IEnumerable 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;
+ }
+
+ ///
+ /// Utility for setting a metadata element
+ ///
+ /// application element
+ /// all metadata elements
+ /// name of the element to set
+ /// value to set
+ private void SetMetadataElement(XElement elemApplication,
+ IEnumerable metas,
+ string metadataName,
+ string metadataValue)
+ {
+ XElement element = GetMetaElement(metas, metadataName);
+ if (element == null)
+ {
+ elemApplication.Add(CreateMetaElement(metadataName, metadataValue));
+ }
+ else
+ {
+ element.SetAttributeValue(ns + "value", metadataValue);
+ }
+ }
+
+ ///
+ /// Utility for setting a metadata element
+ ///
+ /// application element
+ /// all metadata elements
+ /// name of the element to set
+ /// value to set
+ /// If metadataValue is default, node will be removed.
+ private void SetMetadataElement(XElement elemApplication,
+ IEnumerable metas,
+ string metadataName,
+ bool metadataValue,
+ bool defaultValue = false)
+ {
+ XElement element = GetMetaElement(metas, metadataName);
+ if (metadataValue != defaultValue)
+ {
+ if (element == null)
+ {
+ elemApplication.Add(CreateMetaElement(metadataName, metadataValue));
+ }
+ else
+ {
+ element.SetAttributeValue(ns + "value", metadataValue);
+ }
+ }
+ else
+ {
+ if (element != null)
+ {
+ element.Remove();
+ }
+ }
+ }
+
+ 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
diff --git a/Assets/GoogleMobileAds/Editor/ManifestProcessor.cs.meta b/Assets/GoogleMobileAds/Editor/ManifestProcessor.cs.meta
new file mode 100644
index 0000000..192e277
--- /dev/null
+++ b/Assets/GoogleMobileAds/Editor/ManifestProcessor.cs.meta
@@ -0,0 +1,17 @@
+fileFormatVersion: 2
+guid: c9ee5d47594eb43a19e795c834fdc044
+labels:
+- gvh
+- gvh_version-10.6.0
+- gvhp_exportpath-GoogleMobileAds/Editor/ManifestProcessor.cs
+timeCreated: 1480838400
+MonoImporter:
+ externalObjects: {}
+ serializedVersion: 2
+ defaultReferences: []
+ executionOrder: 0
+ icon:
+ instanceID: 0
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/GoogleMobileAds/Editor/PListProcessor.cs b/Assets/GoogleMobileAds/Editor/PListProcessor.cs
new file mode 100644
index 0000000..3f71e8a
--- /dev/null
+++ b/Assets/GoogleMobileAds/Editor/PListProcessor.cs
@@ -0,0 +1,232 @@
+// 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_IPHONE || UNITY_IOS
+using System;
+using System.Collections.Generic;
+using System.IO;
+using System.Xml;
+
+using UnityEditor;
+using UnityEditor.Callbacks;
+using UnityEditor.iOS.Xcode;
+using UnityEngine;
+
+using GoogleMobileAds.Editor;
+
+public static class PListProcessor
+{
+ private const string KEY_SK_ADNETWORK_ITEMS = "SKAdNetworkItems";
+
+ private const string KEY_SK_ADNETWORK_ID = "SKAdNetworkIdentifier";
+
+ private const string SKADNETWORKS_RELATIVE_PATH = "GoogleMobileAds/Editor/GoogleMobileAdsSKAdNetworkItems.xml";
+
+ private const string SKADNETWORKS_FILE_NAME = "GoogleMobileAdsSKAdNetworkItems.xml";
+
+ [PostProcessBuild]
+ public static void OnPostProcessBuild(BuildTarget buildTarget, string path)
+ {
+ string plistPath = Path.Combine(path, "Info.plist");
+ PlistDocument plist = new PlistDocument();
+ plist.ReadFromFile(plistPath);
+
+ GoogleMobileAdsSettings instance = GoogleMobileAdsSettings.LoadInstance();
+ string appId = instance.GoogleMobileAdsIOSAppId.Trim();
+ if (appId.Length == 0)
+ {
+ NotifyBuildFailure(
+ "iOS Google Mobile Ads app ID is empty. Please enter a valid app ID to run ads properly.");
+ }
+ else
+ {
+ plist.root.SetString("GADApplicationIdentifier", appId);
+ }
+
+ string userTrackingDescription = instance.UserTrackingUsageDescription;
+ if (!string.IsNullOrEmpty(userTrackingDescription))
+ {
+ plist.root.SetString("NSUserTrackingUsageDescription", userTrackingDescription);
+ }
+
+ List skNetworkIds = ReadSKAdNetworkIdentifiersFromXML();
+ if (skNetworkIds.Count > 0)
+ {
+ AddSKAdNetworkIdentifier(plist, skNetworkIds);
+ }
+
+ string unityVersion = Application.unityVersion;
+ if (!string.IsNullOrEmpty(unityVersion))
+ {
+ plist.root.SetString("GADUUnityVersion", unityVersion);
+ }
+
+ File.WriteAllText(plistPath, plist.WriteToString());
+ }
+
+ private static PlistElementArray GetSKAdNetworkItemsArray(PlistDocument document)
+ {
+ PlistElementArray array;
+ if (document.root.values.ContainsKey(KEY_SK_ADNETWORK_ITEMS))
+ {
+ try
+ {
+ PlistElement element;
+ document.root.values.TryGetValue(KEY_SK_ADNETWORK_ITEMS, out element);
+ array = element.AsArray();
+ }
+#pragma warning disable 0168
+ catch (Exception e)
+#pragma warning restore 0168
+ {
+ // The element is not an array type.
+ array = null;
+ }
+ }
+ else
+ {
+ array = document.root.CreateArray(KEY_SK_ADNETWORK_ITEMS);
+ }
+ return array;
+ }
+
+ private static List ReadSKAdNetworkIdentifiersFromXML()
+ {
+ List skAdNetworkItems = new List();
+
+ string path = Path.Combine(Application.dataPath, SKADNETWORKS_RELATIVE_PATH);
+
+ /*
+ * Handle importing GMA via Unity Package Manager.
+ */
+ EditorPathUtils pathUtils = ScriptableObject.CreateInstance();
+ if (pathUtils.IsPackageRootPath())
+ {
+ string parentDirectoryPath = pathUtils.GetDirectoryAssetPath();
+ path = Path.Combine(parentDirectoryPath, SKADNETWORKS_FILE_NAME);
+ }
+
+ try
+ {
+ if (!File.Exists(path))
+ {
+ throw new FileNotFoundException();
+ }
+ using (FileStream fs = File.OpenRead(path))
+ {
+ XmlDocument document = new XmlDocument();
+ document.Load(fs);
+
+ XmlNode root = document.FirstChild;
+
+ XmlNodeList nodes = root.SelectNodes(KEY_SK_ADNETWORK_ID);
+ foreach (XmlNode node in nodes)
+ {
+ skAdNetworkItems.Add(node.InnerText);
+ }
+ }
+ }
+ #pragma warning disable 0168
+ catch (FileNotFoundException e)
+ #pragma warning restore 0168
+ {
+ NotifyBuildFailure("GoogleMobileAdsSKAdNetworkItems.xml not found", false);
+ }
+ catch (IOException e)
+ {
+ NotifyBuildFailure("Failed to read GoogleMobileAdsSKAdNetworkIds.xml: " + e.Message, false);
+ }
+
+ return skAdNetworkItems;
+ }
+
+ private static void AddSKAdNetworkIdentifier(PlistDocument document, List skAdNetworkIds)
+ {
+ PlistElementArray array = GetSKAdNetworkItemsArray(document);
+ if (array != null)
+ {
+ foreach (string id in skAdNetworkIds)
+ {
+ if (!ContainsSKAdNetworkIdentifier(array, id))
+ {
+ PlistElementDict added = array.AddDict();
+ added.SetString(KEY_SK_ADNETWORK_ID, id);
+ }
+ }
+ }
+ else
+ {
+ NotifyBuildFailure("SKAdNetworkItems element already exists in Info.plist, but is not an array.", false);
+ }
+ }
+
+ private static bool ContainsSKAdNetworkIdentifier(PlistElementArray skAdNetworkItemsArray, string id)
+ {
+ foreach (PlistElement elem in skAdNetworkItemsArray.values)
+ {
+ try
+ {
+ PlistElementDict elemInDict = elem.AsDict();
+ PlistElement value;
+ bool identifierExists = elemInDict.values.TryGetValue(KEY_SK_ADNETWORK_ID, out value);
+
+ if (identifierExists && value.AsString().Equals(id))
+ {
+ return true;
+ }
+ }
+#pragma warning disable 0168
+ catch (Exception e)
+#pragma warning restore 0168
+ {
+ // Do nothing
+ }
+ }
+
+ return false;
+ }
+
+ private static void NotifyBuildFailure(string message, bool showOpenSettingsButton = true)
+ {
+ string dialogTitle = "Google Mobile Ads";
+ string dialogMessage = "Error: " + message;
+
+ if (showOpenSettingsButton)
+ {
+ bool openSettings = EditorUtility.DisplayDialog(
+ dialogTitle, dialogMessage, "Open Settings", "Close");
+ if (openSettings)
+ {
+ GoogleMobileAdsSettingsEditor.OpenInspector();
+ }
+ }
+ else
+ {
+ EditorUtility.DisplayDialog(dialogTitle, dialogMessage, "Close");
+ }
+
+ ThrowBuildException("[GoogleMobileAds] " + message);
+ }
+
+ private static void ThrowBuildException(string message)
+ {
+#if UNITY_2017_1_OR_NEWER
+ throw new BuildPlayerWindow.BuildMethodException(message);
+#else
+ throw new OperationCanceledException(message);
+#endif
+ }
+}
+
+#endif
diff --git a/Assets/GoogleMobileAds/Editor/PListProcessor.cs.meta b/Assets/GoogleMobileAds/Editor/PListProcessor.cs.meta
new file mode 100644
index 0000000..9e28012
--- /dev/null
+++ b/Assets/GoogleMobileAds/Editor/PListProcessor.cs.meta
@@ -0,0 +1,17 @@
+fileFormatVersion: 2
+guid: d1d26b084dc244c8c818f67662e51f6c
+labels:
+- gvh
+- gvh_version-10.6.0
+- gvhp_exportpath-GoogleMobileAds/Editor/PListProcessor.cs
+timeCreated: 1480838400
+MonoImporter:
+ externalObjects: {}
+ serializedVersion: 2
+ defaultReferences: []
+ executionOrder: 0
+ icon:
+ instanceID: 0
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/GoogleMobileAds/Editor/Resources.meta b/Assets/GoogleMobileAds/Editor/Resources.meta
new file mode 100644
index 0000000..2b14cb5
--- /dev/null
+++ b/Assets/GoogleMobileAds/Editor/Resources.meta
@@ -0,0 +1,8 @@
+fileFormatVersion: 2
+guid: ed0572a2674df6a419597cb8b46979a6
+folderAsset: yes
+DefaultImporter:
+ externalObjects: {}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/GoogleMobileAds/Editor/Resources/PlaceholderAds.meta b/Assets/GoogleMobileAds/Editor/Resources/PlaceholderAds.meta
new file mode 100644
index 0000000..6784ece
--- /dev/null
+++ b/Assets/GoogleMobileAds/Editor/Resources/PlaceholderAds.meta
@@ -0,0 +1,8 @@
+fileFormatVersion: 2
+guid: 17f4ec0b1e0da9e47b7cd6e902fa6143
+folderAsset: yes
+DefaultImporter:
+ externalObjects: {}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/GoogleMobileAds/Editor/Resources/PlaceholderAds/AdImages.meta b/Assets/GoogleMobileAds/Editor/Resources/PlaceholderAds/AdImages.meta
new file mode 100644
index 0000000..def3f23
--- /dev/null
+++ b/Assets/GoogleMobileAds/Editor/Resources/PlaceholderAds/AdImages.meta
@@ -0,0 +1,8 @@
+fileFormatVersion: 2
+guid: 329d381b12b44f544b4ed3d6f613da8e
+folderAsset: yes
+DefaultImporter:
+ externalObjects: {}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/GoogleMobileAds/Editor/Resources/PlaceholderAds/AdImages/1024x768.png b/Assets/GoogleMobileAds/Editor/Resources/PlaceholderAds/AdImages/1024x768.png
new file mode 100644
index 0000000..2c1095b
Binary files /dev/null and b/Assets/GoogleMobileAds/Editor/Resources/PlaceholderAds/AdImages/1024x768.png differ
diff --git a/Assets/GoogleMobileAds/Editor/Resources/PlaceholderAds/AdImages/1024x768.png.meta b/Assets/GoogleMobileAds/Editor/Resources/PlaceholderAds/AdImages/1024x768.png.meta
new file mode 100644
index 0000000..2cb626c
--- /dev/null
+++ b/Assets/GoogleMobileAds/Editor/Resources/PlaceholderAds/AdImages/1024x768.png.meta
@@ -0,0 +1,103 @@
+fileFormatVersion: 2
+guid: 4c69db43dbd474a2987be5807129b4cc
+labels:
+- gvh
+- gvh_version-10.6.0
+- gvhp_exportpath-GoogleMobileAds/Editor/Resources/PlaceholderAds/AdImages/1024x768.png
+timeCreated: 1480838400
+TextureImporter:
+ internalIDToNameTable: []
+ externalObjects: {}
+ serializedVersion: 11
+ mipmaps:
+ mipMapMode: 0
+ enableMipMap: 0
+ sRGBTexture: 1
+ linearTexture: 0
+ fadeOut: 0
+ borderMipMap: 0
+ mipMapsPreserveCoverage: 0
+ alphaTestReferenceValue: 0.5
+ mipMapFadeDistanceStart: 1
+ mipMapFadeDistanceEnd: 3
+ bumpmap:
+ convertToNormalMap: 0
+ externalNormalMap: 0
+ heightScale: 0.25
+ normalMapFilter: 0
+ isReadable: 0
+ streamingMipmaps: 0
+ streamingMipmapsPriority: 0
+ grayScaleToAlpha: 0
+ generateCubemap: 6
+ cubemapConvolution: 0
+ seamlessCubemap: 0
+ textureFormat: 1
+ maxTextureSize: 2048
+ textureSettings:
+ serializedVersion: 2
+ filterMode: -1
+ aniso: -1
+ mipBias: -100
+ wrapU: 1
+ wrapV: 1
+ wrapW: 1
+ nPOTScale: 0
+ lightmap: 0
+ compressionQuality: 50
+ spriteMode: 1
+ spriteExtrude: 1
+ spriteMeshType: 1
+ alignment: 0
+ spritePivot:
+ x: 0.5
+ y: 0.5
+ spritePixelsToUnits: 100
+ spriteBorder:
+ x: 0
+ y: 0
+ z: 0
+ w: 0
+ spriteGenerateFallbackPhysicsShape: 1
+ alphaUsage: 1
+ alphaIsTransparency: 1
+ spriteTessellationDetail: -1
+ textureType: 8
+ textureShape: 1
+ singleChannelComponent: 0
+ maxTextureSizeSet: 0
+ compressionQualitySet: 0
+ textureFormatSet: 0
+ applyGammaDecoding: 0
+ platformSettings:
+ - serializedVersion: 3
+ buildTarget: DefaultTexturePlatform
+ maxTextureSize: 2048
+ resizeAlgorithm: 0
+ textureFormat: -1
+ textureCompression: 1
+ compressionQuality: 50
+ crunchedCompression: 0
+ allowsAlphaSplitting: 0
+ overridden: 0
+ androidETC2FallbackOverride: 0
+ forceMaximumCompressionQuality_BC6H_BC7: 0
+ spriteSheet:
+ serializedVersion: 2
+ sprites: []
+ outline: []
+ physicsShape: []
+ bones: []
+ spriteID: 5e97eb03825dee720800000000000000
+ internalID: 0
+ vertices: []
+ indices:
+ edges: []
+ weights: []
+ secondaryTextures: []
+ spritePackingTag:
+ pSDRemoveMatte: 0
+ pSDShowRemoveMatteOption: 0
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/GoogleMobileAds/Editor/Resources/PlaceholderAds/AdImages/300x250.png b/Assets/GoogleMobileAds/Editor/Resources/PlaceholderAds/AdImages/300x250.png
new file mode 100644
index 0000000..7ae8fb9
Binary files /dev/null and b/Assets/GoogleMobileAds/Editor/Resources/PlaceholderAds/AdImages/300x250.png differ
diff --git a/Assets/GoogleMobileAds/Editor/Resources/PlaceholderAds/AdImages/300x250.png.meta b/Assets/GoogleMobileAds/Editor/Resources/PlaceholderAds/AdImages/300x250.png.meta
new file mode 100644
index 0000000..48b92f8
--- /dev/null
+++ b/Assets/GoogleMobileAds/Editor/Resources/PlaceholderAds/AdImages/300x250.png.meta
@@ -0,0 +1,103 @@
+fileFormatVersion: 2
+guid: 898f886a39d714db5b90d2c36676c894
+labels:
+- gvh
+- gvh_version-10.6.0
+- gvhp_exportpath-GoogleMobileAds/Editor/Resources/PlaceholderAds/AdImages/300x250.png
+timeCreated: 1480838400
+TextureImporter:
+ internalIDToNameTable: []
+ externalObjects: {}
+ serializedVersion: 11
+ mipmaps:
+ mipMapMode: 0
+ enableMipMap: 0
+ sRGBTexture: 1
+ linearTexture: 0
+ fadeOut: 0
+ borderMipMap: 0
+ mipMapsPreserveCoverage: 0
+ alphaTestReferenceValue: 0.5
+ mipMapFadeDistanceStart: 1
+ mipMapFadeDistanceEnd: 3
+ bumpmap:
+ convertToNormalMap: 0
+ externalNormalMap: 0
+ heightScale: 0.25
+ normalMapFilter: 0
+ isReadable: 0
+ streamingMipmaps: 0
+ streamingMipmapsPriority: 0
+ grayScaleToAlpha: 0
+ generateCubemap: 6
+ cubemapConvolution: 0
+ seamlessCubemap: 0
+ textureFormat: 1
+ maxTextureSize: 2048
+ textureSettings:
+ serializedVersion: 2
+ filterMode: -1
+ aniso: -1
+ mipBias: -100
+ wrapU: 1
+ wrapV: 1
+ wrapW: 1
+ nPOTScale: 0
+ lightmap: 0
+ compressionQuality: 50
+ spriteMode: 1
+ spriteExtrude: 1
+ spriteMeshType: 1
+ alignment: 0
+ spritePivot:
+ x: 0.5
+ y: 0.5
+ spritePixelsToUnits: 100
+ spriteBorder:
+ x: 0
+ y: 0
+ z: 0
+ w: 0
+ spriteGenerateFallbackPhysicsShape: 1
+ alphaUsage: 1
+ alphaIsTransparency: 1
+ spriteTessellationDetail: -1
+ textureType: 8
+ textureShape: 1
+ singleChannelComponent: 0
+ maxTextureSizeSet: 0
+ compressionQualitySet: 0
+ textureFormatSet: 0
+ applyGammaDecoding: 0
+ platformSettings:
+ - serializedVersion: 3
+ buildTarget: DefaultTexturePlatform
+ maxTextureSize: 2048
+ resizeAlgorithm: 0
+ textureFormat: -1
+ textureCompression: 1
+ compressionQuality: 50
+ crunchedCompression: 0
+ allowsAlphaSplitting: 0
+ overridden: 0
+ androidETC2FallbackOverride: 0
+ forceMaximumCompressionQuality_BC6H_BC7: 0
+ spriteSheet:
+ serializedVersion: 2
+ sprites: []
+ outline: []
+ physicsShape: []
+ bones: []
+ spriteID: 5e97eb03825dee720800000000000000
+ internalID: 0
+ vertices: []
+ indices:
+ edges: []
+ weights: []
+ secondaryTextures: []
+ spritePackingTag:
+ pSDRemoveMatte: 0
+ pSDShowRemoveMatteOption: 0
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/GoogleMobileAds/Editor/Resources/PlaceholderAds/AdImages/320x100.png b/Assets/GoogleMobileAds/Editor/Resources/PlaceholderAds/AdImages/320x100.png
new file mode 100644
index 0000000..3e82893
Binary files /dev/null and b/Assets/GoogleMobileAds/Editor/Resources/PlaceholderAds/AdImages/320x100.png differ
diff --git a/Assets/GoogleMobileAds/Editor/Resources/PlaceholderAds/AdImages/320x100.png.meta b/Assets/GoogleMobileAds/Editor/Resources/PlaceholderAds/AdImages/320x100.png.meta
new file mode 100644
index 0000000..fbcfbe4
--- /dev/null
+++ b/Assets/GoogleMobileAds/Editor/Resources/PlaceholderAds/AdImages/320x100.png.meta
@@ -0,0 +1,103 @@
+fileFormatVersion: 2
+guid: 1a2723ddf964e4565a408007ab387283
+labels:
+- gvh
+- gvh_version-10.6.0
+- gvhp_exportpath-GoogleMobileAds/Editor/Resources/PlaceholderAds/AdImages/320x100.png
+timeCreated: 1480838400
+TextureImporter:
+ internalIDToNameTable: []
+ externalObjects: {}
+ serializedVersion: 11
+ mipmaps:
+ mipMapMode: 0
+ enableMipMap: 0
+ sRGBTexture: 1
+ linearTexture: 0
+ fadeOut: 0
+ borderMipMap: 0
+ mipMapsPreserveCoverage: 0
+ alphaTestReferenceValue: 0.5
+ mipMapFadeDistanceStart: 1
+ mipMapFadeDistanceEnd: 3
+ bumpmap:
+ convertToNormalMap: 0
+ externalNormalMap: 0
+ heightScale: 0.25
+ normalMapFilter: 0
+ isReadable: 0
+ streamingMipmaps: 0
+ streamingMipmapsPriority: 0
+ grayScaleToAlpha: 0
+ generateCubemap: 6
+ cubemapConvolution: 0
+ seamlessCubemap: 0
+ textureFormat: 1
+ maxTextureSize: 2048
+ textureSettings:
+ serializedVersion: 2
+ filterMode: -1
+ aniso: -1
+ mipBias: -100
+ wrapU: 1
+ wrapV: 1
+ wrapW: 1
+ nPOTScale: 0
+ lightmap: 0
+ compressionQuality: 50
+ spriteMode: 1
+ spriteExtrude: 1
+ spriteMeshType: 1
+ alignment: 0
+ spritePivot:
+ x: 0.5
+ y: 0.5
+ spritePixelsToUnits: 100
+ spriteBorder:
+ x: 0
+ y: 0
+ z: 0
+ w: 0
+ spriteGenerateFallbackPhysicsShape: 1
+ alphaUsage: 1
+ alphaIsTransparency: 1
+ spriteTessellationDetail: -1
+ textureType: 8
+ textureShape: 1
+ singleChannelComponent: 0
+ maxTextureSizeSet: 0
+ compressionQualitySet: 0
+ textureFormatSet: 0
+ applyGammaDecoding: 0
+ platformSettings:
+ - serializedVersion: 3
+ buildTarget: DefaultTexturePlatform
+ maxTextureSize: 2048
+ resizeAlgorithm: 0
+ textureFormat: -1
+ textureCompression: 1
+ compressionQuality: 50
+ crunchedCompression: 0
+ allowsAlphaSplitting: 0
+ overridden: 0
+ androidETC2FallbackOverride: 0
+ forceMaximumCompressionQuality_BC6H_BC7: 0
+ spriteSheet:
+ serializedVersion: 2
+ sprites: []
+ outline: []
+ physicsShape: []
+ bones: []
+ spriteID: 5e97eb03825dee720800000000000000
+ internalID: 0
+ vertices: []
+ indices:
+ edges: []
+ weights: []
+ secondaryTextures: []
+ spritePackingTag:
+ pSDRemoveMatte: 0
+ pSDShowRemoveMatteOption: 0
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/GoogleMobileAds/Editor/Resources/PlaceholderAds/AdImages/320x480.png b/Assets/GoogleMobileAds/Editor/Resources/PlaceholderAds/AdImages/320x480.png
new file mode 100644
index 0000000..4db4410
Binary files /dev/null and b/Assets/GoogleMobileAds/Editor/Resources/PlaceholderAds/AdImages/320x480.png differ
diff --git a/Assets/GoogleMobileAds/Editor/Resources/PlaceholderAds/AdImages/320x480.png.meta b/Assets/GoogleMobileAds/Editor/Resources/PlaceholderAds/AdImages/320x480.png.meta
new file mode 100644
index 0000000..291e030
--- /dev/null
+++ b/Assets/GoogleMobileAds/Editor/Resources/PlaceholderAds/AdImages/320x480.png.meta
@@ -0,0 +1,103 @@
+fileFormatVersion: 2
+guid: 77d9c04b43d404f44ab60d7159b279bb
+labels:
+- gvh
+- gvh_version-10.6.0
+- gvhp_exportpath-GoogleMobileAds/Editor/Resources/PlaceholderAds/AdImages/320x480.png
+timeCreated: 1480838400
+TextureImporter:
+ internalIDToNameTable: []
+ externalObjects: {}
+ serializedVersion: 11
+ mipmaps:
+ mipMapMode: 0
+ enableMipMap: 0
+ sRGBTexture: 1
+ linearTexture: 0
+ fadeOut: 0
+ borderMipMap: 0
+ mipMapsPreserveCoverage: 0
+ alphaTestReferenceValue: 0.5
+ mipMapFadeDistanceStart: 1
+ mipMapFadeDistanceEnd: 3
+ bumpmap:
+ convertToNormalMap: 0
+ externalNormalMap: 0
+ heightScale: 0.25
+ normalMapFilter: 0
+ isReadable: 0
+ streamingMipmaps: 0
+ streamingMipmapsPriority: 0
+ grayScaleToAlpha: 0
+ generateCubemap: 6
+ cubemapConvolution: 0
+ seamlessCubemap: 0
+ textureFormat: 1
+ maxTextureSize: 2048
+ textureSettings:
+ serializedVersion: 2
+ filterMode: -1
+ aniso: -1
+ mipBias: -100
+ wrapU: 1
+ wrapV: 1
+ wrapW: 1
+ nPOTScale: 0
+ lightmap: 0
+ compressionQuality: 50
+ spriteMode: 1
+ spriteExtrude: 1
+ spriteMeshType: 1
+ alignment: 0
+ spritePivot:
+ x: 0.5
+ y: 0.5
+ spritePixelsToUnits: 100
+ spriteBorder:
+ x: 0
+ y: 0
+ z: 0
+ w: 0
+ spriteGenerateFallbackPhysicsShape: 1
+ alphaUsage: 1
+ alphaIsTransparency: 1
+ spriteTessellationDetail: -1
+ textureType: 8
+ textureShape: 1
+ singleChannelComponent: 0
+ maxTextureSizeSet: 0
+ compressionQualitySet: 0
+ textureFormatSet: 0
+ applyGammaDecoding: 0
+ platformSettings:
+ - serializedVersion: 3
+ buildTarget: DefaultTexturePlatform
+ maxTextureSize: 2048
+ resizeAlgorithm: 0
+ textureFormat: -1
+ textureCompression: 1
+ compressionQuality: 50
+ crunchedCompression: 0
+ allowsAlphaSplitting: 0
+ overridden: 0
+ androidETC2FallbackOverride: 0
+ forceMaximumCompressionQuality_BC6H_BC7: 0
+ spriteSheet:
+ serializedVersion: 2
+ sprites: []
+ outline: []
+ physicsShape: []
+ bones: []
+ spriteID: 5e97eb03825dee720800000000000000
+ internalID: 0
+ vertices: []
+ indices:
+ edges: []
+ weights: []
+ secondaryTextures: []
+ spritePackingTag:
+ pSDRemoveMatte: 0
+ pSDShowRemoveMatteOption: 0
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/GoogleMobileAds/Editor/Resources/PlaceholderAds/AdImages/320x50.png b/Assets/GoogleMobileAds/Editor/Resources/PlaceholderAds/AdImages/320x50.png
new file mode 100644
index 0000000..f01e80f
Binary files /dev/null and b/Assets/GoogleMobileAds/Editor/Resources/PlaceholderAds/AdImages/320x50.png differ
diff --git a/Assets/GoogleMobileAds/Editor/Resources/PlaceholderAds/AdImages/320x50.png.meta b/Assets/GoogleMobileAds/Editor/Resources/PlaceholderAds/AdImages/320x50.png.meta
new file mode 100644
index 0000000..0aad671
--- /dev/null
+++ b/Assets/GoogleMobileAds/Editor/Resources/PlaceholderAds/AdImages/320x50.png.meta
@@ -0,0 +1,103 @@
+fileFormatVersion: 2
+guid: 5a6531d4c9c484d679a2d6f9e6fefed5
+labels:
+- gvh
+- gvh_version-10.6.0
+- gvhp_exportpath-GoogleMobileAds/Editor/Resources/PlaceholderAds/AdImages/320x50.png
+timeCreated: 1480838400
+TextureImporter:
+ internalIDToNameTable: []
+ externalObjects: {}
+ serializedVersion: 11
+ mipmaps:
+ mipMapMode: 0
+ enableMipMap: 0
+ sRGBTexture: 1
+ linearTexture: 0
+ fadeOut: 0
+ borderMipMap: 0
+ mipMapsPreserveCoverage: 0
+ alphaTestReferenceValue: 0.5
+ mipMapFadeDistanceStart: 1
+ mipMapFadeDistanceEnd: 3
+ bumpmap:
+ convertToNormalMap: 0
+ externalNormalMap: 0
+ heightScale: 0.25
+ normalMapFilter: 0
+ isReadable: 0
+ streamingMipmaps: 0
+ streamingMipmapsPriority: 0
+ grayScaleToAlpha: 0
+ generateCubemap: 6
+ cubemapConvolution: 0
+ seamlessCubemap: 0
+ textureFormat: 1
+ maxTextureSize: 2048
+ textureSettings:
+ serializedVersion: 2
+ filterMode: -1
+ aniso: -1
+ mipBias: -100
+ wrapU: 1
+ wrapV: 1
+ wrapW: 1
+ nPOTScale: 0
+ lightmap: 0
+ compressionQuality: 50
+ spriteMode: 1
+ spriteExtrude: 1
+ spriteMeshType: 1
+ alignment: 0
+ spritePivot:
+ x: 0.5
+ y: 0.5
+ spritePixelsToUnits: 100
+ spriteBorder:
+ x: 0
+ y: 0
+ z: 0
+ w: 0
+ spriteGenerateFallbackPhysicsShape: 1
+ alphaUsage: 1
+ alphaIsTransparency: 1
+ spriteTessellationDetail: -1
+ textureType: 8
+ textureShape: 1
+ singleChannelComponent: 0
+ maxTextureSizeSet: 0
+ compressionQualitySet: 0
+ textureFormatSet: 0
+ applyGammaDecoding: 0
+ platformSettings:
+ - serializedVersion: 3
+ buildTarget: DefaultTexturePlatform
+ maxTextureSize: 2048
+ resizeAlgorithm: 0
+ textureFormat: -1
+ textureCompression: 1
+ compressionQuality: 50
+ crunchedCompression: 0
+ allowsAlphaSplitting: 0
+ overridden: 0
+ androidETC2FallbackOverride: 0
+ forceMaximumCompressionQuality_BC6H_BC7: 0
+ spriteSheet:
+ serializedVersion: 2
+ sprites: []
+ outline: []
+ physicsShape: []
+ bones: []
+ spriteID: 5e97eb03825dee720800000000000000
+ internalID: 0
+ vertices: []
+ indices:
+ edges: []
+ weights: []
+ secondaryTextures: []
+ spritePackingTag:
+ pSDRemoveMatte: 0
+ pSDShowRemoveMatteOption: 0
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/GoogleMobileAds/Editor/Resources/PlaceholderAds/AdImages/468x60.png b/Assets/GoogleMobileAds/Editor/Resources/PlaceholderAds/AdImages/468x60.png
new file mode 100644
index 0000000..26ec5e0
Binary files /dev/null and b/Assets/GoogleMobileAds/Editor/Resources/PlaceholderAds/AdImages/468x60.png differ
diff --git a/Assets/GoogleMobileAds/Editor/Resources/PlaceholderAds/AdImages/468x60.png.meta b/Assets/GoogleMobileAds/Editor/Resources/PlaceholderAds/AdImages/468x60.png.meta
new file mode 100644
index 0000000..ffa7235
--- /dev/null
+++ b/Assets/GoogleMobileAds/Editor/Resources/PlaceholderAds/AdImages/468x60.png.meta
@@ -0,0 +1,103 @@
+fileFormatVersion: 2
+guid: 74358f5fb13a549aabac4a5a7ac76739
+labels:
+- gvh
+- gvh_version-10.6.0
+- gvhp_exportpath-GoogleMobileAds/Editor/Resources/PlaceholderAds/AdImages/468x60.png
+timeCreated: 1480838400
+TextureImporter:
+ internalIDToNameTable: []
+ externalObjects: {}
+ serializedVersion: 11
+ mipmaps:
+ mipMapMode: 0
+ enableMipMap: 0
+ sRGBTexture: 1
+ linearTexture: 0
+ fadeOut: 0
+ borderMipMap: 0
+ mipMapsPreserveCoverage: 0
+ alphaTestReferenceValue: 0.5
+ mipMapFadeDistanceStart: 1
+ mipMapFadeDistanceEnd: 3
+ bumpmap:
+ convertToNormalMap: 0
+ externalNormalMap: 0
+ heightScale: 0.25
+ normalMapFilter: 0
+ isReadable: 0
+ streamingMipmaps: 0
+ streamingMipmapsPriority: 0
+ grayScaleToAlpha: 0
+ generateCubemap: 6
+ cubemapConvolution: 0
+ seamlessCubemap: 0
+ textureFormat: 1
+ maxTextureSize: 2048
+ textureSettings:
+ serializedVersion: 2
+ filterMode: -1
+ aniso: -1
+ mipBias: -100
+ wrapU: 1
+ wrapV: 1
+ wrapW: 1
+ nPOTScale: 0
+ lightmap: 0
+ compressionQuality: 50
+ spriteMode: 1
+ spriteExtrude: 1
+ spriteMeshType: 1
+ alignment: 0
+ spritePivot:
+ x: 0.5
+ y: 0.5
+ spritePixelsToUnits: 100
+ spriteBorder:
+ x: 0
+ y: 0
+ z: 0
+ w: 0
+ spriteGenerateFallbackPhysicsShape: 1
+ alphaUsage: 1
+ alphaIsTransparency: 1
+ spriteTessellationDetail: -1
+ textureType: 8
+ textureShape: 1
+ singleChannelComponent: 0
+ maxTextureSizeSet: 0
+ compressionQualitySet: 0
+ textureFormatSet: 0
+ applyGammaDecoding: 0
+ platformSettings:
+ - serializedVersion: 3
+ buildTarget: DefaultTexturePlatform
+ maxTextureSize: 2048
+ resizeAlgorithm: 0
+ textureFormat: -1
+ textureCompression: 1
+ compressionQuality: 50
+ crunchedCompression: 0
+ allowsAlphaSplitting: 0
+ overridden: 0
+ androidETC2FallbackOverride: 0
+ forceMaximumCompressionQuality_BC6H_BC7: 0
+ spriteSheet:
+ serializedVersion: 2
+ sprites: []
+ outline: []
+ physicsShape: []
+ bones: []
+ spriteID: 5e97eb03825dee720800000000000000
+ internalID: 0
+ vertices: []
+ indices:
+ edges: []
+ weights: []
+ secondaryTextures: []
+ spritePackingTag:
+ pSDRemoveMatte: 0
+ pSDShowRemoveMatteOption: 0
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/GoogleMobileAds/Editor/Resources/PlaceholderAds/AdImages/480x320.png b/Assets/GoogleMobileAds/Editor/Resources/PlaceholderAds/AdImages/480x320.png
new file mode 100644
index 0000000..e07d350
Binary files /dev/null and b/Assets/GoogleMobileAds/Editor/Resources/PlaceholderAds/AdImages/480x320.png differ
diff --git a/Assets/GoogleMobileAds/Editor/Resources/PlaceholderAds/AdImages/480x320.png.meta b/Assets/GoogleMobileAds/Editor/Resources/PlaceholderAds/AdImages/480x320.png.meta
new file mode 100644
index 0000000..d99c40f
--- /dev/null
+++ b/Assets/GoogleMobileAds/Editor/Resources/PlaceholderAds/AdImages/480x320.png.meta
@@ -0,0 +1,103 @@
+fileFormatVersion: 2
+guid: d30303c99ba3f4b9b9924da34e6d742d
+labels:
+- gvh
+- gvh_version-10.6.0
+- gvhp_exportpath-GoogleMobileAds/Editor/Resources/PlaceholderAds/AdImages/480x320.png
+timeCreated: 1480838400
+TextureImporter:
+ internalIDToNameTable: []
+ externalObjects: {}
+ serializedVersion: 11
+ mipmaps:
+ mipMapMode: 0
+ enableMipMap: 0
+ sRGBTexture: 1
+ linearTexture: 0
+ fadeOut: 0
+ borderMipMap: 0
+ mipMapsPreserveCoverage: 0
+ alphaTestReferenceValue: 0.5
+ mipMapFadeDistanceStart: 1
+ mipMapFadeDistanceEnd: 3
+ bumpmap:
+ convertToNormalMap: 0
+ externalNormalMap: 0
+ heightScale: 0.25
+ normalMapFilter: 0
+ isReadable: 0
+ streamingMipmaps: 0
+ streamingMipmapsPriority: 0
+ grayScaleToAlpha: 0
+ generateCubemap: 6
+ cubemapConvolution: 0
+ seamlessCubemap: 0
+ textureFormat: 1
+ maxTextureSize: 2048
+ textureSettings:
+ serializedVersion: 2
+ filterMode: -1
+ aniso: -1
+ mipBias: -100
+ wrapU: 1
+ wrapV: 1
+ wrapW: 1
+ nPOTScale: 0
+ lightmap: 0
+ compressionQuality: 50
+ spriteMode: 1
+ spriteExtrude: 1
+ spriteMeshType: 1
+ alignment: 0
+ spritePivot:
+ x: 0.5
+ y: 0.5
+ spritePixelsToUnits: 100
+ spriteBorder:
+ x: 0
+ y: 0
+ z: 0
+ w: 0
+ spriteGenerateFallbackPhysicsShape: 1
+ alphaUsage: 1
+ alphaIsTransparency: 1
+ spriteTessellationDetail: -1
+ textureType: 8
+ textureShape: 1
+ singleChannelComponent: 0
+ maxTextureSizeSet: 0
+ compressionQualitySet: 0
+ textureFormatSet: 0
+ applyGammaDecoding: 0
+ platformSettings:
+ - serializedVersion: 3
+ buildTarget: DefaultTexturePlatform
+ maxTextureSize: 2048
+ resizeAlgorithm: 0
+ textureFormat: -1
+ textureCompression: 1
+ compressionQuality: 50
+ crunchedCompression: 0
+ allowsAlphaSplitting: 0
+ overridden: 0
+ androidETC2FallbackOverride: 0
+ forceMaximumCompressionQuality_BC6H_BC7: 0
+ spriteSheet:
+ serializedVersion: 2
+ sprites: []
+ outline: []
+ physicsShape: []
+ bones: []
+ spriteID: 5e97eb03825dee720800000000000000
+ internalID: 0
+ vertices: []
+ indices:
+ edges: []
+ weights: []
+ secondaryTextures: []
+ spritePackingTag:
+ pSDRemoveMatte: 0
+ pSDShowRemoveMatteOption: 0
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/GoogleMobileAds/Editor/Resources/PlaceholderAds/AdImages/728x90.png b/Assets/GoogleMobileAds/Editor/Resources/PlaceholderAds/AdImages/728x90.png
new file mode 100644
index 0000000..8d5a3d7
Binary files /dev/null and b/Assets/GoogleMobileAds/Editor/Resources/PlaceholderAds/AdImages/728x90.png differ
diff --git a/Assets/GoogleMobileAds/Editor/Resources/PlaceholderAds/AdImages/728x90.png.meta b/Assets/GoogleMobileAds/Editor/Resources/PlaceholderAds/AdImages/728x90.png.meta
new file mode 100644
index 0000000..3322a5a
--- /dev/null
+++ b/Assets/GoogleMobileAds/Editor/Resources/PlaceholderAds/AdImages/728x90.png.meta
@@ -0,0 +1,103 @@
+fileFormatVersion: 2
+guid: cfead63ff9d9d48e2b4ba3c2dee7cea9
+labels:
+- gvh
+- gvh_version-10.6.0
+- gvhp_exportpath-GoogleMobileAds/Editor/Resources/PlaceholderAds/AdImages/728x90.png
+timeCreated: 1480838400
+TextureImporter:
+ internalIDToNameTable: []
+ externalObjects: {}
+ serializedVersion: 11
+ mipmaps:
+ mipMapMode: 0
+ enableMipMap: 0
+ sRGBTexture: 1
+ linearTexture: 0
+ fadeOut: 0
+ borderMipMap: 0
+ mipMapsPreserveCoverage: 0
+ alphaTestReferenceValue: 0.5
+ mipMapFadeDistanceStart: 1
+ mipMapFadeDistanceEnd: 3
+ bumpmap:
+ convertToNormalMap: 0
+ externalNormalMap: 0
+ heightScale: 0.25
+ normalMapFilter: 0
+ isReadable: 0
+ streamingMipmaps: 0
+ streamingMipmapsPriority: 0
+ grayScaleToAlpha: 0
+ generateCubemap: 6
+ cubemapConvolution: 0
+ seamlessCubemap: 0
+ textureFormat: 1
+ maxTextureSize: 2048
+ textureSettings:
+ serializedVersion: 2
+ filterMode: -1
+ aniso: -1
+ mipBias: -100
+ wrapU: 1
+ wrapV: 1
+ wrapW: 1
+ nPOTScale: 0
+ lightmap: 0
+ compressionQuality: 50
+ spriteMode: 1
+ spriteExtrude: 1
+ spriteMeshType: 1
+ alignment: 0
+ spritePivot:
+ x: 0.5
+ y: 0.5
+ spritePixelsToUnits: 100
+ spriteBorder:
+ x: 0
+ y: 0
+ z: 0
+ w: 0
+ spriteGenerateFallbackPhysicsShape: 1
+ alphaUsage: 1
+ alphaIsTransparency: 1
+ spriteTessellationDetail: -1
+ textureType: 8
+ textureShape: 1
+ singleChannelComponent: 0
+ maxTextureSizeSet: 0
+ compressionQualitySet: 0
+ textureFormatSet: 0
+ applyGammaDecoding: 0
+ platformSettings:
+ - serializedVersion: 3
+ buildTarget: DefaultTexturePlatform
+ maxTextureSize: 2048
+ resizeAlgorithm: 0
+ textureFormat: -1
+ textureCompression: 1
+ compressionQuality: 50
+ crunchedCompression: 0
+ allowsAlphaSplitting: 0
+ overridden: 0
+ androidETC2FallbackOverride: 0
+ forceMaximumCompressionQuality_BC6H_BC7: 0
+ spriteSheet:
+ serializedVersion: 2
+ sprites: []
+ outline: []
+ physicsShape: []
+ bones: []
+ spriteID: 5e97eb03825dee720800000000000000
+ internalID: 0
+ vertices: []
+ indices:
+ edges: []
+ weights: []
+ secondaryTextures: []
+ spritePackingTag:
+ pSDRemoveMatte: 0
+ pSDShowRemoveMatteOption: 0
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/GoogleMobileAds/Editor/Resources/PlaceholderAds/AdImages/768x1024.png b/Assets/GoogleMobileAds/Editor/Resources/PlaceholderAds/AdImages/768x1024.png
new file mode 100644
index 0000000..d28e55c
Binary files /dev/null and b/Assets/GoogleMobileAds/Editor/Resources/PlaceholderAds/AdImages/768x1024.png differ
diff --git a/Assets/GoogleMobileAds/Editor/Resources/PlaceholderAds/AdImages/768x1024.png.meta b/Assets/GoogleMobileAds/Editor/Resources/PlaceholderAds/AdImages/768x1024.png.meta
new file mode 100644
index 0000000..5f64fbe
--- /dev/null
+++ b/Assets/GoogleMobileAds/Editor/Resources/PlaceholderAds/AdImages/768x1024.png.meta
@@ -0,0 +1,103 @@
+fileFormatVersion: 2
+guid: 8a53f9c63a5e94b14a98698a7b07365b
+labels:
+- gvh
+- gvh_version-10.6.0
+- gvhp_exportpath-GoogleMobileAds/Editor/Resources/PlaceholderAds/AdImages/768x1024.png
+timeCreated: 1480838400
+TextureImporter:
+ internalIDToNameTable: []
+ externalObjects: {}
+ serializedVersion: 11
+ mipmaps:
+ mipMapMode: 0
+ enableMipMap: 0
+ sRGBTexture: 1
+ linearTexture: 0
+ fadeOut: 0
+ borderMipMap: 0
+ mipMapsPreserveCoverage: 0
+ alphaTestReferenceValue: 0.5
+ mipMapFadeDistanceStart: 1
+ mipMapFadeDistanceEnd: 3
+ bumpmap:
+ convertToNormalMap: 0
+ externalNormalMap: 0
+ heightScale: 0.25
+ normalMapFilter: 0
+ isReadable: 0
+ streamingMipmaps: 0
+ streamingMipmapsPriority: 0
+ grayScaleToAlpha: 0
+ generateCubemap: 6
+ cubemapConvolution: 0
+ seamlessCubemap: 0
+ textureFormat: 1
+ maxTextureSize: 2048
+ textureSettings:
+ serializedVersion: 2
+ filterMode: -1
+ aniso: -1
+ mipBias: -100
+ wrapU: 1
+ wrapV: 1
+ wrapW: 1
+ nPOTScale: 0
+ lightmap: 0
+ compressionQuality: 50
+ spriteMode: 1
+ spriteExtrude: 1
+ spriteMeshType: 1
+ alignment: 0
+ spritePivot:
+ x: 0.5
+ y: 0.5
+ spritePixelsToUnits: 100
+ spriteBorder:
+ x: 0
+ y: 0
+ z: 0
+ w: 0
+ spriteGenerateFallbackPhysicsShape: 1
+ alphaUsage: 1
+ alphaIsTransparency: 1
+ spriteTessellationDetail: -1
+ textureType: 8
+ textureShape: 1
+ singleChannelComponent: 0
+ maxTextureSizeSet: 0
+ compressionQualitySet: 0
+ textureFormatSet: 0
+ applyGammaDecoding: 0
+ platformSettings:
+ - serializedVersion: 3
+ buildTarget: DefaultTexturePlatform
+ maxTextureSize: 2048
+ resizeAlgorithm: 0
+ textureFormat: -1
+ textureCompression: 1
+ compressionQuality: 50
+ crunchedCompression: 0
+ allowsAlphaSplitting: 0
+ overridden: 0
+ androidETC2FallbackOverride: 0
+ forceMaximumCompressionQuality_BC6H_BC7: 0
+ spriteSheet:
+ serializedVersion: 2
+ sprites: []
+ outline: []
+ physicsShape: []
+ bones: []
+ spriteID: 5e97eb03825dee720800000000000000
+ internalID: 0
+ vertices: []
+ indices:
+ edges: []
+ weights: []
+ secondaryTextures: []
+ spritePackingTag:
+ pSDRemoveMatte: 0
+ pSDShowRemoveMatteOption: 0
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/GoogleMobileAds/Editor/Resources/PlaceholderAds/AdImages/AdInspectorHome.png b/Assets/GoogleMobileAds/Editor/Resources/PlaceholderAds/AdImages/AdInspectorHome.png
new file mode 100644
index 0000000..9c97b5e
Binary files /dev/null and b/Assets/GoogleMobileAds/Editor/Resources/PlaceholderAds/AdImages/AdInspectorHome.png differ
diff --git a/Assets/GoogleMobileAds/Editor/Resources/PlaceholderAds/AdImages/AdInspectorHome.png.meta b/Assets/GoogleMobileAds/Editor/Resources/PlaceholderAds/AdImages/AdInspectorHome.png.meta
new file mode 100644
index 0000000..958db49
--- /dev/null
+++ b/Assets/GoogleMobileAds/Editor/Resources/PlaceholderAds/AdImages/AdInspectorHome.png.meta
@@ -0,0 +1,131 @@
+fileFormatVersion: 2
+guid: d271d6a1aed6848559ecad6252e333b1
+labels:
+- gvh
+- gvh_version-10.6.0
+- gvhp_exportpath-GoogleMobileAds/Editor/Resources/PlaceholderAds/AdImages/AdInspectorHome.png
+timeCreated: 1480838400
+TextureImporter:
+ internalIDToNameTable: []
+ externalObjects: {}
+ serializedVersion: 11
+ mipmaps:
+ mipMapMode: 0
+ enableMipMap: 0
+ sRGBTexture: 1
+ linearTexture: 0
+ fadeOut: 0
+ borderMipMap: 0
+ mipMapsPreserveCoverage: 0
+ alphaTestReferenceValue: 0.5
+ mipMapFadeDistanceStart: 1
+ mipMapFadeDistanceEnd: 3
+ bumpmap:
+ convertToNormalMap: 0
+ externalNormalMap: 0
+ heightScale: 0.25
+ normalMapFilter: 0
+ isReadable: 0
+ streamingMipmaps: 0
+ streamingMipmapsPriority: 0
+ vTOnly: 0
+ grayScaleToAlpha: 0
+ generateCubemap: 6
+ cubemapConvolution: 0
+ seamlessCubemap: 0
+ textureFormat: 1
+ maxTextureSize: 2048
+ textureSettings:
+ serializedVersion: 2
+ filterMode: 1
+ aniso: 1
+ mipBias: 0
+ wrapU: 1
+ wrapV: 1
+ wrapW: 0
+ nPOTScale: 0
+ lightmap: 0
+ compressionQuality: 50
+ spriteMode: 1
+ spriteExtrude: 1
+ spriteMeshType: 1
+ alignment: 0
+ spritePivot:
+ x: 0.5
+ y: 0.5
+ spritePixelsToUnits: 100
+ spriteBorder:
+ x: 0
+ y: 0
+ z: 0
+ w: 0
+ spriteGenerateFallbackPhysicsShape: 1
+ alphaUsage: 1
+ alphaIsTransparency: 1
+ spriteTessellationDetail: -1
+ textureType: 8
+ textureShape: 1
+ singleChannelComponent: 0
+ flipbookRows: 1
+ flipbookColumns: 1
+ maxTextureSizeSet: 0
+ compressionQualitySet: 0
+ textureFormatSet: 0
+ ignorePngGamma: 0
+ applyGammaDecoding: 1
+ platformSettings:
+ - serializedVersion: 3
+ buildTarget: DefaultTexturePlatform
+ maxTextureSize: 2048
+ resizeAlgorithm: 0
+ textureFormat: -1
+ textureCompression: 1
+ compressionQuality: 50
+ crunchedCompression: 0
+ allowsAlphaSplitting: 0
+ overridden: 0
+ androidETC2FallbackOverride: 0
+ forceMaximumCompressionQuality_BC6H_BC7: 0
+ - serializedVersion: 3
+ buildTarget: Standalone
+ maxTextureSize: 2048
+ resizeAlgorithm: 0
+ textureFormat: -1
+ textureCompression: 1
+ compressionQuality: 50
+ crunchedCompression: 0
+ allowsAlphaSplitting: 0
+ overridden: 0
+ androidETC2FallbackOverride: 0
+ forceMaximumCompressionQuality_BC6H_BC7: 0
+ - serializedVersion: 3
+ buildTarget: Android
+ maxTextureSize: 2048
+ resizeAlgorithm: 0
+ textureFormat: -1
+ textureCompression: 1
+ compressionQuality: 50
+ crunchedCompression: 0
+ allowsAlphaSplitting: 0
+ overridden: 0
+ androidETC2FallbackOverride: 0
+ forceMaximumCompressionQuality_BC6H_BC7: 0
+ spriteSheet:
+ serializedVersion: 2
+ sprites: []
+ outline: []
+ physicsShape: []
+ bones: []
+ spriteID: 5e97eb03825dee720800000000000000
+ internalID: 0
+ vertices: []
+ indices:
+ edges: []
+ weights: []
+ secondaryTextures: []
+ spritePackingTag:
+ pSDRemoveMatte: 0
+ pSDShowRemoveMatteOption: 0
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/GoogleMobileAds/Editor/Resources/PlaceholderAds/AdInspector.meta b/Assets/GoogleMobileAds/Editor/Resources/PlaceholderAds/AdInspector.meta
new file mode 100644
index 0000000..29fd2b4
--- /dev/null
+++ b/Assets/GoogleMobileAds/Editor/Resources/PlaceholderAds/AdInspector.meta
@@ -0,0 +1,8 @@
+fileFormatVersion: 2
+guid: 20f10f9bcaaef3f4d85b9f5e4db46f90
+folderAsset: yes
+DefaultImporter:
+ externalObjects: {}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/GoogleMobileAds/Editor/Resources/PlaceholderAds/AdInspector/768x1024.prefab b/Assets/GoogleMobileAds/Editor/Resources/PlaceholderAds/AdInspector/768x1024.prefab
new file mode 100644
index 0000000..7ad712a
--- /dev/null
+++ b/Assets/GoogleMobileAds/Editor/Resources/PlaceholderAds/AdInspector/768x1024.prefab
@@ -0,0 +1,504 @@
+%YAML 1.1
+%TAG !u! tag:unity3d.com,2011:
+--- !u!1 &1026234277025590
+GameObject:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ serializedVersion: 6
+ m_Component:
+ - component: {fileID: 224770140206732756}
+ - component: {fileID: 222623742081011482}
+ - component: {fileID: 114466248550890148}
+ - component: {fileID: 114214230567826922}
+ m_Layer: 5
+ m_Name: Button
+ m_TagString: Untagged
+ m_Icon: {fileID: 0}
+ m_NavMeshLayer: 0
+ m_StaticEditorFlags: 0
+ m_IsActive: 1
+--- !u!224 &224770140206732756
+RectTransform:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 1026234277025590}
+ m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
+ m_LocalPosition: {x: 0, y: 0, z: 0}
+ m_LocalScale: {x: 1, y: 1, z: 1}
+ m_ConstrainProportionsScale: 0
+ m_Children:
+ - {fileID: 224688741740444772}
+ m_Father: {fileID: 224247655386807502}
+ m_RootOrder: 0
+ m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
+ m_AnchorMin: {x: 0, y: 1}
+ m_AnchorMax: {x: 0, y: 1}
+ m_AnchoredPosition: {x: 1350, y: -100}
+ m_SizeDelta: {x: 150, y: 150}
+ m_Pivot: {x: 0.5, y: 0.5}
+--- !u!222 &222623742081011482
+CanvasRenderer:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 1026234277025590}
+ m_CullTransparentMesh: 1
+--- !u!114 &114466248550890148
+MonoBehaviour:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 1026234277025590}
+ m_Enabled: 1
+ m_EditorHideFlags: 0
+ m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3}
+ m_Name:
+ m_EditorClassIdentifier:
+ m_Material: {fileID: 0}
+ m_Color: {r: 1, g: 1, b: 1, a: 1}
+ m_RaycastTarget: 1
+ m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0}
+ m_Maskable: 1
+ m_OnCullStateChanged:
+ m_PersistentCalls:
+ m_Calls: []
+ m_Sprite: {fileID: 10905, guid: 0000000000000000f000000000000000, type: 0}
+ m_Type: 1
+ m_PreserveAspect: 0
+ m_FillCenter: 1
+ m_FillMethod: 4
+ m_FillAmount: 1
+ m_FillClockwise: 1
+ m_FillOrigin: 0
+ m_UseSpriteMesh: 0
+ m_PixelsPerUnitMultiplier: 1
+--- !u!114 &114214230567826922
+MonoBehaviour:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 1026234277025590}
+ m_Enabled: 1
+ m_EditorHideFlags: 0
+ m_Script: {fileID: 11500000, guid: 4e29b1a8efbd4b44bb3f3716e73f07ff, type: 3}
+ m_Name:
+ m_EditorClassIdentifier:
+ m_Navigation:
+ m_Mode: 3
+ m_WrapAround: 0
+ m_SelectOnUp: {fileID: 0}
+ m_SelectOnDown: {fileID: 0}
+ m_SelectOnLeft: {fileID: 0}
+ m_SelectOnRight: {fileID: 0}
+ m_Transition: 1
+ m_Colors:
+ m_NormalColor: {r: 1, g: 1, b: 1, a: 1}
+ m_HighlightedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1}
+ m_PressedColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 1}
+ m_SelectedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1}
+ m_DisabledColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 0.5019608}
+ m_ColorMultiplier: 1
+ m_FadeDuration: 0.1
+ m_SpriteState:
+ m_HighlightedSprite: {fileID: 0}
+ m_PressedSprite: {fileID: 0}
+ m_SelectedSprite: {fileID: 0}
+ m_DisabledSprite: {fileID: 0}
+ m_AnimationTriggers:
+ m_NormalTrigger: Normal
+ m_HighlightedTrigger: Highlighted
+ m_PressedTrigger: Pressed
+ m_SelectedTrigger: Highlighted
+ m_DisabledTrigger: Disabled
+ m_Interactable: 1
+ m_TargetGraphic: {fileID: 114466248550890148}
+ m_OnClick:
+ m_PersistentCalls:
+ m_Calls: []
+--- !u!1 &1168051963893118
+GameObject:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ serializedVersion: 6
+ m_Component:
+ - component: {fileID: 224349703481187764}
+ - component: {fileID: 223920107105332924}
+ - component: {fileID: 114572656286436090}
+ - component: {fileID: 114715352366433274}
+ m_Layer: 5
+ m_Name: 768x1024
+ m_TagString: Untagged
+ m_Icon: {fileID: 0}
+ m_NavMeshLayer: 0
+ m_StaticEditorFlags: 0
+ m_IsActive: 1
+--- !u!224 &224349703481187764
+RectTransform:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 1168051963893118}
+ m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
+ m_LocalPosition: {x: 0, y: 0, z: 0}
+ m_LocalScale: {x: 0, y: 0, z: 0}
+ m_ConstrainProportionsScale: 0
+ m_Children:
+ - {fileID: 224188954884660388}
+ - {fileID: 224247655386807502}
+ m_Father: {fileID: 0}
+ m_RootOrder: 0
+ m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
+ m_AnchorMin: {x: 0, y: 0}
+ m_AnchorMax: {x: 0, y: 0}
+ m_AnchoredPosition: {x: 0, y: 0}
+ m_SizeDelta: {x: 0, y: 0}
+ m_Pivot: {x: 0, y: 0}
+--- !u!223 &223920107105332924
+Canvas:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 1168051963893118}
+ m_Enabled: 1
+ serializedVersion: 3
+ m_RenderMode: 0
+ m_Camera: {fileID: 0}
+ m_PlaneDistance: 100
+ m_PixelPerfect: 0
+ m_ReceivesEvents: 1
+ m_OverrideSorting: 0
+ m_OverridePixelPerfect: 0
+ m_SortingBucketNormalizedSize: 0
+ m_AdditionalShaderChannelsFlag: 0
+ m_SortingLayerID: 0
+ m_SortingOrder: 0
+ m_TargetDisplay: 0
+--- !u!114 &114572656286436090
+MonoBehaviour:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 1168051963893118}
+ m_Enabled: 1
+ m_EditorHideFlags: 0
+ m_Script: {fileID: 11500000, guid: 0cd44c1031e13a943bb63640046fad76, type: 3}
+ m_Name:
+ m_EditorClassIdentifier:
+ m_UiScaleMode: 1
+ m_ReferencePixelsPerUnit: 100
+ m_ScaleFactor: 1
+ m_ReferenceResolution: {x: 1440, y: 2960}
+ m_ScreenMatchMode: 2
+ m_MatchWidthOrHeight: 0.5
+ m_PhysicalUnit: 3
+ m_FallbackScreenDPI: 96
+ m_DefaultSpriteDPI: 96
+ m_DynamicPixelsPerUnit: 1
+ m_PresetInfoIsWorld: 0
+--- !u!114 &114715352366433274
+MonoBehaviour:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 1168051963893118}
+ m_Enabled: 1
+ m_EditorHideFlags: 0
+ m_Script: {fileID: 11500000, guid: dc42784cf147c0c48a680349fa168899, type: 3}
+ m_Name:
+ m_EditorClassIdentifier:
+ m_IgnoreReversedGraphics: 1
+ m_BlockingObjects: 0
+ m_BlockingMask:
+ serializedVersion: 2
+ m_Bits: 4294967295
+--- !u!1 &1455544211993956
+GameObject:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ serializedVersion: 6
+ m_Component:
+ - component: {fileID: 224188954884660388}
+ - component: {fileID: 222991998422378294}
+ - component: {fileID: 114288914574884706}
+ m_Layer: 5
+ m_Name: Background
+ m_TagString: Untagged
+ m_Icon: {fileID: 0}
+ m_NavMeshLayer: 0
+ m_StaticEditorFlags: 0
+ m_IsActive: 1
+--- !u!224 &224188954884660388
+RectTransform:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 1455544211993956}
+ m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
+ m_LocalPosition: {x: 0, y: 0, z: 0}
+ m_LocalScale: {x: 1, y: 1, z: 1}
+ m_ConstrainProportionsScale: 0
+ m_Children: []
+ m_Father: {fileID: 224349703481187764}
+ m_RootOrder: 0
+ m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
+ m_AnchorMin: {x: 0, y: 0}
+ m_AnchorMax: {x: 1, y: 1}
+ m_AnchoredPosition: {x: 0, y: 0}
+ m_SizeDelta: {x: 0, y: 0}
+ m_Pivot: {x: 0.5, y: 0.5}
+--- !u!222 &222991998422378294
+CanvasRenderer:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 1455544211993956}
+ m_CullTransparentMesh: 1
+--- !u!114 &114288914574884706
+MonoBehaviour:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 1455544211993956}
+ m_Enabled: 1
+ m_EditorHideFlags: 0
+ m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3}
+ m_Name:
+ m_EditorClassIdentifier:
+ m_Material: {fileID: 0}
+ m_Color: {r: 0, g: 0, b: 0, a: 0.80784315}
+ m_RaycastTarget: 1
+ m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0}
+ m_Maskable: 1
+ m_OnCullStateChanged:
+ m_PersistentCalls:
+ m_Calls: []
+ m_Sprite: {fileID: 0}
+ m_Type: 0
+ m_PreserveAspect: 0
+ m_FillCenter: 1
+ m_FillMethod: 4
+ m_FillAmount: 1
+ m_FillClockwise: 1
+ m_FillOrigin: 0
+ m_UseSpriteMesh: 0
+ m_PixelsPerUnitMultiplier: 1
+--- !u!1 &1519554490061234
+GameObject:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ serializedVersion: 6
+ m_Component:
+ - component: {fileID: 224688741740444772}
+ - component: {fileID: 222698607200636900}
+ - component: {fileID: 114090591266759776}
+ m_Layer: 5
+ m_Name: Text
+ m_TagString: Untagged
+ m_Icon: {fileID: 0}
+ m_NavMeshLayer: 0
+ m_StaticEditorFlags: 0
+ m_IsActive: 1
+--- !u!224 &224688741740444772
+RectTransform:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 1519554490061234}
+ m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
+ m_LocalPosition: {x: 0, y: 0, z: 0}
+ m_LocalScale: {x: 1, y: 1, z: 1}
+ m_ConstrainProportionsScale: 0
+ m_Children: []
+ m_Father: {fileID: 224770140206732756}
+ m_RootOrder: 0
+ m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
+ m_AnchorMin: {x: 0, y: 0}
+ m_AnchorMax: {x: 1, y: 1}
+ m_AnchoredPosition: {x: 0, y: 0}
+ m_SizeDelta: {x: 0, y: 0}
+ m_Pivot: {x: 0.5, y: 0.5}
+--- !u!222 &222698607200636900
+CanvasRenderer:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 1519554490061234}
+ m_CullTransparentMesh: 1
+--- !u!114 &114090591266759776
+MonoBehaviour:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 1519554490061234}
+ m_Enabled: 1
+ m_EditorHideFlags: 0
+ m_Script: {fileID: 11500000, guid: 5f7201a12d95ffc409449d95f23cf332, type: 3}
+ m_Name:
+ m_EditorClassIdentifier:
+ m_Material: {fileID: 0}
+ m_Color: {r: 0.19607843, g: 0.19607843, b: 0.19607843, a: 1}
+ m_RaycastTarget: 1
+ m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0}
+ m_Maskable: 1
+ m_OnCullStateChanged:
+ m_PersistentCalls:
+ m_Calls: []
+ m_FontData:
+ m_Font: {fileID: 10102, guid: 0000000000000000e000000000000000, type: 0}
+ m_FontSize: 50
+ m_FontStyle: 1
+ m_BestFit: 0
+ m_MinSize: 0
+ m_MaxSize: 50
+ m_Alignment: 4
+ m_AlignByGeometry: 0
+ m_RichText: 1
+ m_HorizontalOverflow: 0
+ m_VerticalOverflow: 0
+ m_LineSpacing: 1
+ m_Text: X
+--- !u!1 &1919592978971710
+GameObject:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ serializedVersion: 6
+ m_Component:
+ - component: {fileID: 224247655386807502}
+ - component: {fileID: 222996861862976686}
+ - component: {fileID: 114508546300043044}
+ - component: {fileID: 114645982259750808}
+ m_Layer: 5
+ m_Name: Ad
+ m_TagString: Untagged
+ m_Icon: {fileID: 0}
+ m_NavMeshLayer: 0
+ m_StaticEditorFlags: 0
+ m_IsActive: 1
+--- !u!224 &224247655386807502
+RectTransform:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 1919592978971710}
+ m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
+ m_LocalPosition: {x: 0, y: 0, z: 0}
+ m_LocalScale: {x: 1, y: 1, z: 1}
+ m_ConstrainProportionsScale: 0
+ m_Children:
+ - {fileID: 224770140206732756}
+ m_Father: {fileID: 224349703481187764}
+ m_RootOrder: 1
+ m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
+ m_AnchorMin: {x: 0, y: 0}
+ m_AnchorMax: {x: 1, y: 1}
+ m_AnchoredPosition: {x: 0, y: 0}
+ m_SizeDelta: {x: 0, y: 0}
+ m_Pivot: {x: 0.5, y: 0.5}
+--- !u!222 &222996861862976686
+CanvasRenderer:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 1919592978971710}
+ m_CullTransparentMesh: 1
+--- !u!114 &114508546300043044
+MonoBehaviour:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 1919592978971710}
+ m_Enabled: 1
+ m_EditorHideFlags: 0
+ m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3}
+ m_Name:
+ m_EditorClassIdentifier:
+ m_Material: {fileID: 0}
+ m_Color: {r: 1, g: 1, b: 1, a: 1}
+ m_RaycastTarget: 1
+ m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0}
+ m_Maskable: 1
+ m_OnCullStateChanged:
+ m_PersistentCalls:
+ m_Calls: []
+ m_Sprite: {fileID: 21300000, guid: d271d6a1aed6848559ecad6252e333b1, type: 3}
+ m_Type: 0
+ m_PreserveAspect: 0
+ m_FillCenter: 1
+ m_FillMethod: 4
+ m_FillAmount: 1
+ m_FillClockwise: 1
+ m_FillOrigin: 0
+ m_UseSpriteMesh: 0
+ m_PixelsPerUnitMultiplier: 1
+--- !u!114 &114645982259750808
+MonoBehaviour:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 1919592978971710}
+ m_Enabled: 1
+ m_EditorHideFlags: 0
+ m_Script: {fileID: 11500000, guid: 4e29b1a8efbd4b44bb3f3716e73f07ff, type: 3}
+ m_Name:
+ m_EditorClassIdentifier:
+ m_Navigation:
+ m_Mode: 3
+ m_WrapAround: 0
+ m_SelectOnUp: {fileID: 0}
+ m_SelectOnDown: {fileID: 0}
+ m_SelectOnLeft: {fileID: 0}
+ m_SelectOnRight: {fileID: 0}
+ m_Transition: 1
+ m_Colors:
+ m_NormalColor: {r: 1, g: 1, b: 1, a: 1}
+ m_HighlightedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1}
+ m_PressedColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 1}
+ m_SelectedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1}
+ m_DisabledColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 0.5019608}
+ m_ColorMultiplier: 1
+ m_FadeDuration: 0.1
+ m_SpriteState:
+ m_HighlightedSprite: {fileID: 0}
+ m_PressedSprite: {fileID: 0}
+ m_SelectedSprite: {fileID: 0}
+ m_DisabledSprite: {fileID: 0}
+ m_AnimationTriggers:
+ m_NormalTrigger: Normal
+ m_HighlightedTrigger: Highlighted
+ m_PressedTrigger: Pressed
+ m_SelectedTrigger: Highlighted
+ m_DisabledTrigger: Disabled
+ m_Interactable: 1
+ m_TargetGraphic: {fileID: 114508546300043044}
+ m_OnClick:
+ m_PersistentCalls:
+ m_Calls: []
\ No newline at end of file
diff --git a/Assets/GoogleMobileAds/Editor/Resources/PlaceholderAds/AdInspector/768x1024.prefab.meta b/Assets/GoogleMobileAds/Editor/Resources/PlaceholderAds/AdInspector/768x1024.prefab.meta
new file mode 100644
index 0000000..c29f350
--- /dev/null
+++ b/Assets/GoogleMobileAds/Editor/Resources/PlaceholderAds/AdInspector/768x1024.prefab.meta
@@ -0,0 +1,12 @@
+fileFormatVersion: 2
+guid: d09dfea4c722a4e239e771200d3639cc
+labels:
+- gvh
+- gvh_version-10.6.0
+- gvhp_exportpath-GoogleMobileAds/Editor/Resources/PlaceholderAds/AdInspector/768x1024.prefab
+timeCreated: 1480838400
+PrefabImporter:
+ externalObjects: {}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/GoogleMobileAds/Editor/Resources/PlaceholderAds/AppOpen.meta b/Assets/GoogleMobileAds/Editor/Resources/PlaceholderAds/AppOpen.meta
new file mode 100644
index 0000000..5bddca4
--- /dev/null
+++ b/Assets/GoogleMobileAds/Editor/Resources/PlaceholderAds/AppOpen.meta
@@ -0,0 +1,8 @@
+fileFormatVersion: 2
+guid: 9c16201fd149155478130c95955794d4
+folderAsset: yes
+DefaultImporter:
+ externalObjects: {}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/GoogleMobileAds/Editor/Resources/PlaceholderAds/AppOpen/1024x768.prefab b/Assets/GoogleMobileAds/Editor/Resources/PlaceholderAds/AppOpen/1024x768.prefab
new file mode 100644
index 0000000..84a5e43
--- /dev/null
+++ b/Assets/GoogleMobileAds/Editor/Resources/PlaceholderAds/AppOpen/1024x768.prefab
@@ -0,0 +1,472 @@
+%YAML 1.1
+%TAG !u! tag:unity3d.com,2011:
+--- !u!1001 &100100000
+Prefab:
+ m_ObjectHideFlags: 1
+ serializedVersion: 2
+ m_Modification:
+ m_TransformParent: {fileID: 0}
+ m_Modifications: []
+ m_RemovedComponents: []
+ m_ParentPrefab: {fileID: 0}
+ m_RootGameObject: {fileID: 1506555509391478}
+ m_IsPrefabParent: 1
+--- !u!1 &1048958803402864
+GameObject:
+ m_ObjectHideFlags: 1
+ m_PrefabParentObject: {fileID: 0}
+ m_PrefabInternal: {fileID: 100100000}
+ serializedVersion: 5
+ m_Component:
+ - component: {fileID: 224396785236523192}
+ - component: {fileID: 222833382448378890}
+ - component: {fileID: 114429971286294426}
+ - component: {fileID: 114825474698679592}
+ m_Layer: 5
+ m_Name: Button
+ m_TagString: Untagged
+ m_Icon: {fileID: 0}
+ m_NavMeshLayer: 0
+ m_StaticEditorFlags: 0
+ m_IsActive: 1
+--- !u!1 &1086316119044956
+GameObject:
+ m_ObjectHideFlags: 0
+ m_PrefabParentObject: {fileID: 0}
+ m_PrefabInternal: {fileID: 100100000}
+ serializedVersion: 5
+ m_Component:
+ - component: {fileID: 224412111100384724}
+ - component: {fileID: 222123731056135654}
+ - component: {fileID: 114947809371510874}
+ - component: {fileID: 114962388913432892}
+ m_Layer: 5
+ m_Name: Ad
+ m_TagString: Untagged
+ m_Icon: {fileID: 0}
+ m_NavMeshLayer: 0
+ m_StaticEditorFlags: 0
+ m_IsActive: 1
+--- !u!1 &1506555509391478
+GameObject:
+ m_ObjectHideFlags: 0
+ m_PrefabParentObject: {fileID: 0}
+ m_PrefabInternal: {fileID: 100100000}
+ serializedVersion: 5
+ m_Component:
+ - component: {fileID: 224049503732257422}
+ - component: {fileID: 223443791425986802}
+ - component: {fileID: 114420769206196330}
+ - component: {fileID: 114535206133587424}
+ m_Layer: 5
+ m_Name: 1024x768
+ m_TagString: Untagged
+ m_Icon: {fileID: 0}
+ m_NavMeshLayer: 0
+ m_StaticEditorFlags: 0
+ m_IsActive: 1
+--- !u!1 &1701400232489060
+GameObject:
+ m_ObjectHideFlags: 1
+ m_PrefabParentObject: {fileID: 0}
+ m_PrefabInternal: {fileID: 100100000}
+ serializedVersion: 5
+ m_Component:
+ - component: {fileID: 224410274476360834}
+ - component: {fileID: 222763382731799498}
+ - component: {fileID: 114000294713222290}
+ m_Layer: 5
+ m_Name: Text
+ m_TagString: Untagged
+ m_Icon: {fileID: 0}
+ m_NavMeshLayer: 0
+ m_StaticEditorFlags: 0
+ m_IsActive: 1
+--- !u!1 &1761048403840336
+GameObject:
+ m_ObjectHideFlags: 0
+ m_PrefabParentObject: {fileID: 0}
+ m_PrefabInternal: {fileID: 100100000}
+ serializedVersion: 5
+ m_Component:
+ - component: {fileID: 224408585172404824}
+ - component: {fileID: 222519335633903876}
+ - component: {fileID: 114502356579168518}
+ m_Layer: 5
+ m_Name: Background
+ m_TagString: Untagged
+ m_Icon: {fileID: 0}
+ m_NavMeshLayer: 0
+ m_StaticEditorFlags: 0
+ m_IsActive: 1
+--- !u!114 &114000294713222290
+MonoBehaviour:
+ m_ObjectHideFlags: 1
+ m_PrefabParentObject: {fileID: 0}
+ m_PrefabInternal: {fileID: 100100000}
+ m_GameObject: {fileID: 1701400232489060}
+ m_Enabled: 1
+ m_EditorHideFlags: 0
+ m_Script: {fileID: 708705254, guid: f70555f144d8491a825f0804e09c671c, type: 3}
+ m_Name:
+ m_EditorClassIdentifier:
+ m_Material: {fileID: 0}
+ m_Color: {r: 0.19607843, g: 0.19607843, b: 0.19607843, a: 1}
+ m_RaycastTarget: 1
+ m_OnCullStateChanged:
+ m_PersistentCalls:
+ m_Calls: []
+ m_TypeName: UnityEngine.UI.MaskableGraphic+CullStateChangedEvent, UnityEngine.UI,
+ Version=1.0.0.0, Culture=neutral, PublicKeyToken=null
+ m_FontData:
+ m_Font: {fileID: 10102, guid: 0000000000000000e000000000000000, type: 0}
+ m_FontSize: 45
+ m_FontStyle: 1
+ m_BestFit: 0
+ m_MinSize: 0
+ m_MaxSize: 50
+ m_Alignment: 4
+ m_AlignByGeometry: 0
+ m_RichText: 1
+ m_HorizontalOverflow: 0
+ m_VerticalOverflow: 0
+ m_LineSpacing: 1
+ m_Text: Close Ad
+--- !u!114 &114420769206196330
+MonoBehaviour:
+ m_ObjectHideFlags: 1
+ m_PrefabParentObject: {fileID: 0}
+ m_PrefabInternal: {fileID: 100100000}
+ m_GameObject: {fileID: 1506555509391478}
+ m_Enabled: 1
+ m_EditorHideFlags: 0
+ m_Script: {fileID: 1980459831, guid: f70555f144d8491a825f0804e09c671c, type: 3}
+ m_Name:
+ m_EditorClassIdentifier:
+ m_UiScaleMode: 1
+ m_ReferencePixelsPerUnit: 100
+ m_ScaleFactor: 1
+ m_ReferenceResolution: {x: 2960, y: 1440}
+ m_ScreenMatchMode: 0
+ m_MatchWidthOrHeight: 1
+ m_PhysicalUnit: 3
+ m_FallbackScreenDPI: 96
+ m_DefaultSpriteDPI: 96
+ m_DynamicPixelsPerUnit: 1
+--- !u!114 &114429971286294426
+MonoBehaviour:
+ m_ObjectHideFlags: 1
+ m_PrefabParentObject: {fileID: 0}
+ m_PrefabInternal: {fileID: 100100000}
+ m_GameObject: {fileID: 1048958803402864}
+ m_Enabled: 1
+ m_EditorHideFlags: 0
+ m_Script: {fileID: -765806418, guid: f70555f144d8491a825f0804e09c671c, type: 3}
+ m_Name:
+ m_EditorClassIdentifier:
+ m_Material: {fileID: 0}
+ m_Color: {r: 1, g: 1, b: 1, a: 1}
+ m_RaycastTarget: 1
+ m_OnCullStateChanged:
+ m_PersistentCalls:
+ m_Calls: []
+ m_TypeName: UnityEngine.UI.MaskableGraphic+CullStateChangedEvent, UnityEngine.UI,
+ Version=1.0.0.0, Culture=neutral, PublicKeyToken=null
+ m_Sprite: {fileID: 10905, guid: 0000000000000000f000000000000000, type: 0}
+ m_Type: 1
+ m_PreserveAspect: 0
+ m_FillCenter: 1
+ m_FillMethod: 4
+ m_FillAmount: 1
+ m_FillClockwise: 1
+ m_FillOrigin: 0
+--- !u!114 &114502356579168518
+MonoBehaviour:
+ m_ObjectHideFlags: 1
+ m_PrefabParentObject: {fileID: 0}
+ m_PrefabInternal: {fileID: 100100000}
+ m_GameObject: {fileID: 1761048403840336}
+ m_Enabled: 1
+ m_EditorHideFlags: 0
+ m_Script: {fileID: -765806418, guid: f70555f144d8491a825f0804e09c671c, type: 3}
+ m_Name:
+ m_EditorClassIdentifier:
+ m_Material: {fileID: 0}
+ m_Color: {r: 0, g: 0, b: 0, a: 0.809}
+ m_RaycastTarget: 1
+ m_OnCullStateChanged:
+ m_PersistentCalls:
+ m_Calls: []
+ m_TypeName: UnityEngine.UI.MaskableGraphic+CullStateChangedEvent, UnityEngine.UI,
+ Version=1.0.0.0, Culture=neutral, PublicKeyToken=null
+ m_Sprite: {fileID: 0}
+ m_Type: 0
+ m_PreserveAspect: 0
+ m_FillCenter: 1
+ m_FillMethod: 4
+ m_FillAmount: 1
+ m_FillClockwise: 1
+ m_FillOrigin: 0
+--- !u!114 &114535206133587424
+MonoBehaviour:
+ m_ObjectHideFlags: 1
+ m_PrefabParentObject: {fileID: 0}
+ m_PrefabInternal: {fileID: 100100000}
+ m_GameObject: {fileID: 1506555509391478}
+ m_Enabled: 1
+ m_EditorHideFlags: 0
+ m_Script: {fileID: 1301386320, guid: f70555f144d8491a825f0804e09c671c, type: 3}
+ m_Name:
+ m_EditorClassIdentifier:
+ m_IgnoreReversedGraphics: 1
+ m_BlockingObjects: 0
+ m_BlockingMask:
+ serializedVersion: 2
+ m_Bits: 4294967295
+--- !u!114 &114825474698679592
+MonoBehaviour:
+ m_ObjectHideFlags: 1
+ m_PrefabParentObject: {fileID: 0}
+ m_PrefabInternal: {fileID: 100100000}
+ m_GameObject: {fileID: 1048958803402864}
+ m_Enabled: 1
+ m_EditorHideFlags: 0
+ m_Script: {fileID: 1392445389, guid: f70555f144d8491a825f0804e09c671c, type: 3}
+ m_Name:
+ m_EditorClassIdentifier:
+ m_Navigation:
+ m_Mode: 3
+ m_SelectOnUp: {fileID: 0}
+ m_SelectOnDown: {fileID: 0}
+ m_SelectOnLeft: {fileID: 0}
+ m_SelectOnRight: {fileID: 0}
+ m_Transition: 1
+ m_Colors:
+ m_NormalColor: {r: 1, g: 1, b: 1, a: 1}
+ m_HighlightedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1}
+ m_PressedColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 1}
+ m_DisabledColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 0.5019608}
+ m_ColorMultiplier: 1
+ m_FadeDuration: 0.1
+ m_SpriteState:
+ m_HighlightedSprite: {fileID: 0}
+ m_PressedSprite: {fileID: 0}
+ m_DisabledSprite: {fileID: 0}
+ m_AnimationTriggers:
+ m_NormalTrigger: Normal
+ m_HighlightedTrigger: Highlighted
+ m_PressedTrigger: Pressed
+ m_DisabledTrigger: Disabled
+ m_Interactable: 1
+ m_TargetGraphic: {fileID: 114429971286294426}
+ m_OnClick:
+ m_PersistentCalls:
+ m_Calls: []
+ m_TypeName: UnityEngine.UI.Button+ButtonClickedEvent, UnityEngine.UI, Version=1.0.0.0,
+ Culture=neutral, PublicKeyToken=null
+--- !u!114 &114947809371510874
+MonoBehaviour:
+ m_ObjectHideFlags: 1
+ m_PrefabParentObject: {fileID: 0}
+ m_PrefabInternal: {fileID: 100100000}
+ m_GameObject: {fileID: 1086316119044956}
+ m_Enabled: 1
+ m_EditorHideFlags: 0
+ m_Script: {fileID: -765806418, guid: f70555f144d8491a825f0804e09c671c, type: 3}
+ m_Name:
+ m_EditorClassIdentifier:
+ m_Material: {fileID: 0}
+ m_Color: {r: 1, g: 1, b: 1, a: 1}
+ m_RaycastTarget: 1
+ m_OnCullStateChanged:
+ m_PersistentCalls:
+ m_Calls: []
+ m_TypeName: UnityEngine.UI.MaskableGraphic+CullStateChangedEvent, UnityEngine.UI,
+ Version=1.0.0.0, Culture=neutral, PublicKeyToken=null
+ m_Sprite: {fileID: 21300000, guid: 4c69db43dbd474a2987be5807129b4cc, type: 3}
+ m_Type: 0
+ m_PreserveAspect: 0
+ m_FillCenter: 1
+ m_FillMethod: 4
+ m_FillAmount: 1
+ m_FillClockwise: 1
+ m_FillOrigin: 0
+--- !u!114 &114962388913432892
+MonoBehaviour:
+ m_ObjectHideFlags: 1
+ m_PrefabParentObject: {fileID: 0}
+ m_PrefabInternal: {fileID: 100100000}
+ m_GameObject: {fileID: 1086316119044956}
+ m_Enabled: 1
+ m_EditorHideFlags: 0
+ m_Script: {fileID: 1392445389, guid: f70555f144d8491a825f0804e09c671c, type: 3}
+ m_Name:
+ m_EditorClassIdentifier:
+ m_Navigation:
+ m_Mode: 3
+ m_SelectOnUp: {fileID: 0}
+ m_SelectOnDown: {fileID: 0}
+ m_SelectOnLeft: {fileID: 0}
+ m_SelectOnRight: {fileID: 0}
+ m_Transition: 1
+ m_Colors:
+ m_NormalColor: {r: 1, g: 1, b: 1, a: 1}
+ m_HighlightedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1}
+ m_PressedColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 1}
+ m_DisabledColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 0.5019608}
+ m_ColorMultiplier: 1
+ m_FadeDuration: 0.1
+ m_SpriteState:
+ m_HighlightedSprite: {fileID: 0}
+ m_PressedSprite: {fileID: 0}
+ m_DisabledSprite: {fileID: 0}
+ m_AnimationTriggers:
+ m_NormalTrigger: Normal
+ m_HighlightedTrigger: Highlighted
+ m_PressedTrigger: Pressed
+ m_DisabledTrigger: Disabled
+ m_Interactable: 1
+ m_TargetGraphic: {fileID: 114947809371510874}
+ m_OnClick:
+ m_PersistentCalls:
+ m_Calls: []
+ m_TypeName: UnityEngine.UI.Button+ButtonClickedEvent, UnityEngine.UI, Version=1.0.0.0,
+ Culture=neutral, PublicKeyToken=null
+--- !u!222 &222123731056135654
+CanvasRenderer:
+ m_ObjectHideFlags: 1
+ m_PrefabParentObject: {fileID: 0}
+ m_PrefabInternal: {fileID: 100100000}
+ m_GameObject: {fileID: 1086316119044956}
+--- !u!222 &222519335633903876
+CanvasRenderer:
+ m_ObjectHideFlags: 1
+ m_PrefabParentObject: {fileID: 0}
+ m_PrefabInternal: {fileID: 100100000}
+ m_GameObject: {fileID: 1761048403840336}
+--- !u!222 &222763382731799498
+CanvasRenderer:
+ m_ObjectHideFlags: 1
+ m_PrefabParentObject: {fileID: 0}
+ m_PrefabInternal: {fileID: 100100000}
+ m_GameObject: {fileID: 1701400232489060}
+--- !u!222 &222833382448378890
+CanvasRenderer:
+ m_ObjectHideFlags: 1
+ m_PrefabParentObject: {fileID: 0}
+ m_PrefabInternal: {fileID: 100100000}
+ m_GameObject: {fileID: 1048958803402864}
+--- !u!223 &223443791425986802
+Canvas:
+ m_ObjectHideFlags: 1
+ m_PrefabParentObject: {fileID: 0}
+ m_PrefabInternal: {fileID: 100100000}
+ m_GameObject: {fileID: 1506555509391478}
+ m_Enabled: 1
+ serializedVersion: 3
+ m_RenderMode: 0
+ m_Camera: {fileID: 0}
+ m_PlaneDistance: 100
+ m_PixelPerfect: 0
+ m_ReceivesEvents: 1
+ m_OverrideSorting: 0
+ m_OverridePixelPerfect: 0
+ m_SortingBucketNormalizedSize: 0
+ m_AdditionalShaderChannelsFlag: 0
+ m_SortingLayerID: 0
+ m_SortingOrder: 0
+ m_TargetDisplay: 0
+--- !u!224 &224049503732257422
+RectTransform:
+ m_ObjectHideFlags: 1
+ m_PrefabParentObject: {fileID: 0}
+ m_PrefabInternal: {fileID: 100100000}
+ m_GameObject: {fileID: 1506555509391478}
+ m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
+ m_LocalPosition: {x: 0, y: 0, z: 0}
+ m_LocalScale: {x: 0, y: 0, z: 0}
+ m_Children:
+ - {fileID: 224408585172404824}
+ - {fileID: 224412111100384724}
+ m_Father: {fileID: 0}
+ m_RootOrder: 0
+ m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
+ m_AnchorMin: {x: 0, y: 0}
+ m_AnchorMax: {x: 0, y: 0}
+ m_AnchoredPosition: {x: 0, y: 0}
+ m_SizeDelta: {x: 0, y: 0}
+ m_Pivot: {x: 0, y: 0}
+--- !u!224 &224396785236523192
+RectTransform:
+ m_ObjectHideFlags: 1
+ m_PrefabParentObject: {fileID: 0}
+ m_PrefabInternal: {fileID: 100100000}
+ m_GameObject: {fileID: 1048958803402864}
+ m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
+ m_LocalPosition: {x: 0, y: 0, z: 0}
+ m_LocalScale: {x: 1, y: 1, z: 1}
+ m_Children:
+ - {fileID: 224410274476360834}
+ m_Father: {fileID: 224412111100384724}
+ m_RootOrder: 0
+ m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
+ m_AnchorMin: {x: 0, y: 1}
+ m_AnchorMax: {x: 0, y: 1}
+ m_AnchoredPosition: {x: 169.8, y: -35.9}
+ m_SizeDelta: {x: 339.8, y: 71.8}
+ m_Pivot: {x: 0.5, y: 0.5}
+--- !u!224 &224408585172404824
+RectTransform:
+ m_ObjectHideFlags: 1
+ m_PrefabParentObject: {fileID: 0}
+ m_PrefabInternal: {fileID: 100100000}
+ m_GameObject: {fileID: 1761048403840336}
+ m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
+ m_LocalPosition: {x: 0, y: 0, z: 0}
+ m_LocalScale: {x: 1, y: 1, z: 1}
+ m_Children: []
+ m_Father: {fileID: 224049503732257422}
+ m_RootOrder: 0
+ m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
+ m_AnchorMin: {x: 0, y: 0}
+ m_AnchorMax: {x: 1, y: 1}
+ m_AnchoredPosition: {x: 0, y: 0}
+ m_SizeDelta: {x: 0, y: 0}
+ m_Pivot: {x: 0.5, y: 0.5}
+--- !u!224 &224410274476360834
+RectTransform:
+ m_ObjectHideFlags: 1
+ m_PrefabParentObject: {fileID: 0}
+ m_PrefabInternal: {fileID: 100100000}
+ m_GameObject: {fileID: 1701400232489060}
+ m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
+ m_LocalPosition: {x: 0, y: 0, z: 0}
+ m_LocalScale: {x: 1, y: 1, z: 1}
+ m_Children: []
+ m_Father: {fileID: 224396785236523192}
+ m_RootOrder: 0
+ m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
+ m_AnchorMin: {x: 0, y: 0}
+ m_AnchorMax: {x: 1, y: 1}
+ m_AnchoredPosition: {x: 0, y: 0}
+ m_SizeDelta: {x: 0, y: 0}
+ m_Pivot: {x: 0.5, y: 0.5}
+--- !u!224 &224412111100384724
+RectTransform:
+ m_ObjectHideFlags: 1
+ m_PrefabParentObject: {fileID: 0}
+ m_PrefabInternal: {fileID: 100100000}
+ m_GameObject: {fileID: 1086316119044956}
+ m_LocalRotation: {x: -0, y: -0, z: -0, w: 1}
+ m_LocalPosition: {x: 0, y: 0, z: 0}
+ m_LocalScale: {x: 1, y: 1, z: 1}
+ m_Children:
+ - {fileID: 224396785236523192}
+ m_Father: {fileID: 224049503732257422}
+ m_RootOrder: 1
+ m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
+ m_AnchorMin: {x: 0.5, y: 0.5}
+ m_AnchorMax: {x: 0.5, y: 0.5}
+ m_AnchoredPosition: {x: 0, y: 0}
+ m_SizeDelta: {x: 2000, y: 1436}
+ m_Pivot: {x: 0.5, y: 0.5}
diff --git a/Assets/GoogleMobileAds/Editor/Resources/PlaceholderAds/AppOpen/1024x768.prefab.meta b/Assets/GoogleMobileAds/Editor/Resources/PlaceholderAds/AppOpen/1024x768.prefab.meta
new file mode 100644
index 0000000..4cb0aff
--- /dev/null
+++ b/Assets/GoogleMobileAds/Editor/Resources/PlaceholderAds/AppOpen/1024x768.prefab.meta
@@ -0,0 +1,12 @@
+fileFormatVersion: 2
+guid: 30454d768d0994255b52eafa89dad8e2
+labels:
+- gvh
+- gvh_version-10.6.0
+- gvhp_exportpath-GoogleMobileAds/Editor/Resources/PlaceholderAds/AppOpen/1024x768.prefab
+timeCreated: 1480838400
+PrefabImporter:
+ externalObjects: {}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/GoogleMobileAds/Editor/Resources/PlaceholderAds/AppOpen/768x1024.prefab b/Assets/GoogleMobileAds/Editor/Resources/PlaceholderAds/AppOpen/768x1024.prefab
new file mode 100644
index 0000000..57e57d4
--- /dev/null
+++ b/Assets/GoogleMobileAds/Editor/Resources/PlaceholderAds/AppOpen/768x1024.prefab
@@ -0,0 +1,472 @@
+%YAML 1.1
+%TAG !u! tag:unity3d.com,2011:
+--- !u!1001 &100100000
+Prefab:
+ m_ObjectHideFlags: 1
+ serializedVersion: 2
+ m_Modification:
+ m_TransformParent: {fileID: 0}
+ m_Modifications: []
+ m_RemovedComponents: []
+ m_ParentPrefab: {fileID: 0}
+ m_RootGameObject: {fileID: 1168051963893118}
+ m_IsPrefabParent: 1
+--- !u!1 &1026234277025590
+GameObject:
+ m_ObjectHideFlags: 1
+ m_PrefabParentObject: {fileID: 0}
+ m_PrefabInternal: {fileID: 100100000}
+ serializedVersion: 5
+ m_Component:
+ - component: {fileID: 224770140206732756}
+ - component: {fileID: 222623742081011482}
+ - component: {fileID: 114466248550890148}
+ - component: {fileID: 114214230567826922}
+ m_Layer: 5
+ m_Name: Button
+ m_TagString: Untagged
+ m_Icon: {fileID: 0}
+ m_NavMeshLayer: 0
+ m_StaticEditorFlags: 0
+ m_IsActive: 1
+--- !u!1 &1168051963893118
+GameObject:
+ m_ObjectHideFlags: 0
+ m_PrefabParentObject: {fileID: 0}
+ m_PrefabInternal: {fileID: 100100000}
+ serializedVersion: 5
+ m_Component:
+ - component: {fileID: 224349703481187764}
+ - component: {fileID: 223920107105332924}
+ - component: {fileID: 114572656286436090}
+ - component: {fileID: 114715352366433274}
+ m_Layer: 5
+ m_Name: 768x1024
+ m_TagString: Untagged
+ m_Icon: {fileID: 0}
+ m_NavMeshLayer: 0
+ m_StaticEditorFlags: 0
+ m_IsActive: 1
+--- !u!1 &1455544211993956
+GameObject:
+ m_ObjectHideFlags: 0
+ m_PrefabParentObject: {fileID: 0}
+ m_PrefabInternal: {fileID: 100100000}
+ serializedVersion: 5
+ m_Component:
+ - component: {fileID: 224188954884660388}
+ - component: {fileID: 222991998422378294}
+ - component: {fileID: 114288914574884706}
+ m_Layer: 5
+ m_Name: Background
+ m_TagString: Untagged
+ m_Icon: {fileID: 0}
+ m_NavMeshLayer: 0
+ m_StaticEditorFlags: 0
+ m_IsActive: 1
+--- !u!1 &1519554490061234
+GameObject:
+ m_ObjectHideFlags: 1
+ m_PrefabParentObject: {fileID: 0}
+ m_PrefabInternal: {fileID: 100100000}
+ serializedVersion: 5
+ m_Component:
+ - component: {fileID: 224688741740444772}
+ - component: {fileID: 222698607200636900}
+ - component: {fileID: 114090591266759776}
+ m_Layer: 5
+ m_Name: Text
+ m_TagString: Untagged
+ m_Icon: {fileID: 0}
+ m_NavMeshLayer: 0
+ m_StaticEditorFlags: 0
+ m_IsActive: 1
+--- !u!1 &1919592978971710
+GameObject:
+ m_ObjectHideFlags: 0
+ m_PrefabParentObject: {fileID: 0}
+ m_PrefabInternal: {fileID: 100100000}
+ serializedVersion: 5
+ m_Component:
+ - component: {fileID: 224247655386807502}
+ - component: {fileID: 222996861862976686}
+ - component: {fileID: 114508546300043044}
+ - component: {fileID: 114645982259750808}
+ m_Layer: 5
+ m_Name: Ad
+ m_TagString: Untagged
+ m_Icon: {fileID: 0}
+ m_NavMeshLayer: 0
+ m_StaticEditorFlags: 0
+ m_IsActive: 1
+--- !u!114 &114090591266759776
+MonoBehaviour:
+ m_ObjectHideFlags: 1
+ m_PrefabParentObject: {fileID: 0}
+ m_PrefabInternal: {fileID: 100100000}
+ m_GameObject: {fileID: 1519554490061234}
+ m_Enabled: 1
+ m_EditorHideFlags: 0
+ m_Script: {fileID: 708705254, guid: f70555f144d8491a825f0804e09c671c, type: 3}
+ m_Name:
+ m_EditorClassIdentifier:
+ m_Material: {fileID: 0}
+ m_Color: {r: 0.19607843, g: 0.19607843, b: 0.19607843, a: 1}
+ m_RaycastTarget: 1
+ m_OnCullStateChanged:
+ m_PersistentCalls:
+ m_Calls: []
+ m_TypeName: UnityEngine.UI.MaskableGraphic+CullStateChangedEvent, UnityEngine.UI,
+ Version=1.0.0.0, Culture=neutral, PublicKeyToken=null
+ m_FontData:
+ m_Font: {fileID: 10102, guid: 0000000000000000e000000000000000, type: 0}
+ m_FontSize: 50
+ m_FontStyle: 1
+ m_BestFit: 0
+ m_MinSize: 0
+ m_MaxSize: 50
+ m_Alignment: 4
+ m_AlignByGeometry: 0
+ m_RichText: 1
+ m_HorizontalOverflow: 0
+ m_VerticalOverflow: 0
+ m_LineSpacing: 1
+ m_Text: Close Ad
+--- !u!114 &114214230567826922
+MonoBehaviour:
+ m_ObjectHideFlags: 1
+ m_PrefabParentObject: {fileID: 0}
+ m_PrefabInternal: {fileID: 100100000}
+ m_GameObject: {fileID: 1026234277025590}
+ m_Enabled: 1
+ m_EditorHideFlags: 0
+ m_Script: {fileID: 1392445389, guid: f70555f144d8491a825f0804e09c671c, type: 3}
+ m_Name:
+ m_EditorClassIdentifier:
+ m_Navigation:
+ m_Mode: 3
+ m_SelectOnUp: {fileID: 0}
+ m_SelectOnDown: {fileID: 0}
+ m_SelectOnLeft: {fileID: 0}
+ m_SelectOnRight: {fileID: 0}
+ m_Transition: 1
+ m_Colors:
+ m_NormalColor: {r: 1, g: 1, b: 1, a: 1}
+ m_HighlightedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1}
+ m_PressedColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 1}
+ m_DisabledColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 0.5019608}
+ m_ColorMultiplier: 1
+ m_FadeDuration: 0.1
+ m_SpriteState:
+ m_HighlightedSprite: {fileID: 0}
+ m_PressedSprite: {fileID: 0}
+ m_DisabledSprite: {fileID: 0}
+ m_AnimationTriggers:
+ m_NormalTrigger: Normal
+ m_HighlightedTrigger: Highlighted
+ m_PressedTrigger: Pressed
+ m_DisabledTrigger: Disabled
+ m_Interactable: 1
+ m_TargetGraphic: {fileID: 114466248550890148}
+ m_OnClick:
+ m_PersistentCalls:
+ m_Calls: []
+ m_TypeName: UnityEngine.UI.Button+ButtonClickedEvent, UnityEngine.UI, Version=1.0.0.0,
+ Culture=neutral, PublicKeyToken=null
+--- !u!114 &114288914574884706
+MonoBehaviour:
+ m_ObjectHideFlags: 1
+ m_PrefabParentObject: {fileID: 0}
+ m_PrefabInternal: {fileID: 100100000}
+ m_GameObject: {fileID: 1455544211993956}
+ m_Enabled: 1
+ m_EditorHideFlags: 0
+ m_Script: {fileID: -765806418, guid: f70555f144d8491a825f0804e09c671c, type: 3}
+ m_Name:
+ m_EditorClassIdentifier:
+ m_Material: {fileID: 0}
+ m_Color: {r: 0, g: 0, b: 0, a: 0.80784315}
+ m_RaycastTarget: 1
+ m_OnCullStateChanged:
+ m_PersistentCalls:
+ m_Calls: []
+ m_TypeName: UnityEngine.UI.MaskableGraphic+CullStateChangedEvent, UnityEngine.UI,
+ Version=1.0.0.0, Culture=neutral, PublicKeyToken=null
+ m_Sprite: {fileID: 0}
+ m_Type: 0
+ m_PreserveAspect: 0
+ m_FillCenter: 1
+ m_FillMethod: 4
+ m_FillAmount: 1
+ m_FillClockwise: 1
+ m_FillOrigin: 0
+--- !u!114 &114466248550890148
+MonoBehaviour:
+ m_ObjectHideFlags: 1
+ m_PrefabParentObject: {fileID: 0}
+ m_PrefabInternal: {fileID: 100100000}
+ m_GameObject: {fileID: 1026234277025590}
+ m_Enabled: 1
+ m_EditorHideFlags: 0
+ m_Script: {fileID: -765806418, guid: f70555f144d8491a825f0804e09c671c, type: 3}
+ m_Name:
+ m_EditorClassIdentifier:
+ m_Material: {fileID: 0}
+ m_Color: {r: 1, g: 1, b: 1, a: 1}
+ m_RaycastTarget: 1
+ m_OnCullStateChanged:
+ m_PersistentCalls:
+ m_Calls: []
+ m_TypeName: UnityEngine.UI.MaskableGraphic+CullStateChangedEvent, UnityEngine.UI,
+ Version=1.0.0.0, Culture=neutral, PublicKeyToken=null
+ m_Sprite: {fileID: 10905, guid: 0000000000000000f000000000000000, type: 0}
+ m_Type: 1
+ m_PreserveAspect: 0
+ m_FillCenter: 1
+ m_FillMethod: 4
+ m_FillAmount: 1
+ m_FillClockwise: 1
+ m_FillOrigin: 0
+--- !u!114 &114508546300043044
+MonoBehaviour:
+ m_ObjectHideFlags: 1
+ m_PrefabParentObject: {fileID: 0}
+ m_PrefabInternal: {fileID: 100100000}
+ m_GameObject: {fileID: 1919592978971710}
+ m_Enabled: 1
+ m_EditorHideFlags: 0
+ m_Script: {fileID: -765806418, guid: f70555f144d8491a825f0804e09c671c, type: 3}
+ m_Name:
+ m_EditorClassIdentifier:
+ m_Material: {fileID: 0}
+ m_Color: {r: 1, g: 1, b: 1, a: 1}
+ m_RaycastTarget: 1
+ m_OnCullStateChanged:
+ m_PersistentCalls:
+ m_Calls: []
+ m_TypeName: UnityEngine.UI.MaskableGraphic+CullStateChangedEvent, UnityEngine.UI,
+ Version=1.0.0.0, Culture=neutral, PublicKeyToken=null
+ m_Sprite: {fileID: 21300000, guid: 8a53f9c63a5e94b14a98698a7b07365b, type: 3}
+ m_Type: 0
+ m_PreserveAspect: 0
+ m_FillCenter: 1
+ m_FillMethod: 4
+ m_FillAmount: 1
+ m_FillClockwise: 1
+ m_FillOrigin: 0
+--- !u!114 &114572656286436090
+MonoBehaviour:
+ m_ObjectHideFlags: 1
+ m_PrefabParentObject: {fileID: 0}
+ m_PrefabInternal: {fileID: 100100000}
+ m_GameObject: {fileID: 1168051963893118}
+ m_Enabled: 1
+ m_EditorHideFlags: 0
+ m_Script: {fileID: 1980459831, guid: f70555f144d8491a825f0804e09c671c, type: 3}
+ m_Name:
+ m_EditorClassIdentifier:
+ m_UiScaleMode: 1
+ m_ReferencePixelsPerUnit: 100
+ m_ScaleFactor: 1
+ m_ReferenceResolution: {x: 1440, y: 2960}
+ m_ScreenMatchMode: 2
+ m_MatchWidthOrHeight: 0.5
+ m_PhysicalUnit: 3
+ m_FallbackScreenDPI: 96
+ m_DefaultSpriteDPI: 96
+ m_DynamicPixelsPerUnit: 1
+--- !u!114 &114645982259750808
+MonoBehaviour:
+ m_ObjectHideFlags: 1
+ m_PrefabParentObject: {fileID: 0}
+ m_PrefabInternal: {fileID: 100100000}
+ m_GameObject: {fileID: 1919592978971710}
+ m_Enabled: 1
+ m_EditorHideFlags: 0
+ m_Script: {fileID: 1392445389, guid: f70555f144d8491a825f0804e09c671c, type: 3}
+ m_Name:
+ m_EditorClassIdentifier:
+ m_Navigation:
+ m_Mode: 3
+ m_SelectOnUp: {fileID: 0}
+ m_SelectOnDown: {fileID: 0}
+ m_SelectOnLeft: {fileID: 0}
+ m_SelectOnRight: {fileID: 0}
+ m_Transition: 1
+ m_Colors:
+ m_NormalColor: {r: 1, g: 1, b: 1, a: 1}
+ m_HighlightedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1}
+ m_PressedColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 1}
+ m_DisabledColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 0.5019608}
+ m_ColorMultiplier: 1
+ m_FadeDuration: 0.1
+ m_SpriteState:
+ m_HighlightedSprite: {fileID: 0}
+ m_PressedSprite: {fileID: 0}
+ m_DisabledSprite: {fileID: 0}
+ m_AnimationTriggers:
+ m_NormalTrigger: Normal
+ m_HighlightedTrigger: Highlighted
+ m_PressedTrigger: Pressed
+ m_DisabledTrigger: Disabled
+ m_Interactable: 1
+ m_TargetGraphic: {fileID: 114508546300043044}
+ m_OnClick:
+ m_PersistentCalls:
+ m_Calls: []
+ m_TypeName: UnityEngine.UI.Button+ButtonClickedEvent, UnityEngine.UI, Version=1.0.0.0,
+ Culture=neutral, PublicKeyToken=null
+--- !u!114 &114715352366433274
+MonoBehaviour:
+ m_ObjectHideFlags: 1
+ m_PrefabParentObject: {fileID: 0}
+ m_PrefabInternal: {fileID: 100100000}
+ m_GameObject: {fileID: 1168051963893118}
+ m_Enabled: 1
+ m_EditorHideFlags: 0
+ m_Script: {fileID: 1301386320, guid: f70555f144d8491a825f0804e09c671c, type: 3}
+ m_Name:
+ m_EditorClassIdentifier:
+ m_IgnoreReversedGraphics: 1
+ m_BlockingObjects: 0
+ m_BlockingMask:
+ serializedVersion: 2
+ m_Bits: 4294967295
+--- !u!222 &222623742081011482
+CanvasRenderer:
+ m_ObjectHideFlags: 1
+ m_PrefabParentObject: {fileID: 0}
+ m_PrefabInternal: {fileID: 100100000}
+ m_GameObject: {fileID: 1026234277025590}
+--- !u!222 &222698607200636900
+CanvasRenderer:
+ m_ObjectHideFlags: 1
+ m_PrefabParentObject: {fileID: 0}
+ m_PrefabInternal: {fileID: 100100000}
+ m_GameObject: {fileID: 1519554490061234}
+--- !u!222 &222991998422378294
+CanvasRenderer:
+ m_ObjectHideFlags: 1
+ m_PrefabParentObject: {fileID: 0}
+ m_PrefabInternal: {fileID: 100100000}
+ m_GameObject: {fileID: 1455544211993956}
+--- !u!222 &222996861862976686
+CanvasRenderer:
+ m_ObjectHideFlags: 1
+ m_PrefabParentObject: {fileID: 0}
+ m_PrefabInternal: {fileID: 100100000}
+ m_GameObject: {fileID: 1919592978971710}
+--- !u!223 &223920107105332924
+Canvas:
+ m_ObjectHideFlags: 1
+ m_PrefabParentObject: {fileID: 0}
+ m_PrefabInternal: {fileID: 100100000}
+ m_GameObject: {fileID: 1168051963893118}
+ m_Enabled: 1
+ serializedVersion: 3
+ m_RenderMode: 0
+ m_Camera: {fileID: 0}
+ m_PlaneDistance: 100
+ m_PixelPerfect: 0
+ m_ReceivesEvents: 1
+ m_OverrideSorting: 0
+ m_OverridePixelPerfect: 0
+ m_SortingBucketNormalizedSize: 0
+ m_AdditionalShaderChannelsFlag: 0
+ m_SortingLayerID: 0
+ m_SortingOrder: 0
+ m_TargetDisplay: 0
+--- !u!224 &224188954884660388
+RectTransform:
+ m_ObjectHideFlags: 1
+ m_PrefabParentObject: {fileID: 0}
+ m_PrefabInternal: {fileID: 100100000}
+ m_GameObject: {fileID: 1455544211993956}
+ m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
+ m_LocalPosition: {x: 0, y: 0, z: 0}
+ m_LocalScale: {x: 1, y: 1, z: 1}
+ m_Children: []
+ m_Father: {fileID: 224349703481187764}
+ m_RootOrder: 0
+ m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
+ m_AnchorMin: {x: 0, y: 0}
+ m_AnchorMax: {x: 1, y: 1}
+ m_AnchoredPosition: {x: 0, y: 0}
+ m_SizeDelta: {x: 0, y: 0}
+ m_Pivot: {x: 0.5, y: 0.5}
+--- !u!224 &224247655386807502
+RectTransform:
+ m_ObjectHideFlags: 1
+ m_PrefabParentObject: {fileID: 0}
+ m_PrefabInternal: {fileID: 100100000}
+ m_GameObject: {fileID: 1919592978971710}
+ m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
+ m_LocalPosition: {x: 0, y: 0, z: 0}
+ m_LocalScale: {x: 1, y: 1, z: 1}
+ m_Children:
+ - {fileID: 224770140206732756}
+ m_Father: {fileID: 224349703481187764}
+ m_RootOrder: 1
+ m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
+ m_AnchorMin: {x: 0.5, y: 0.5}
+ m_AnchorMax: {x: 0.5, y: 0.5}
+ m_AnchoredPosition: {x: 0, y: 0}
+ m_SizeDelta: {x: 1436, y: 2000}
+ m_Pivot: {x: 0.5, y: 0.5}
+--- !u!224 &224349703481187764
+RectTransform:
+ m_ObjectHideFlags: 1
+ m_PrefabParentObject: {fileID: 0}
+ m_PrefabInternal: {fileID: 100100000}
+ m_GameObject: {fileID: 1168051963893118}
+ m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
+ m_LocalPosition: {x: 0, y: 0, z: 0}
+ m_LocalScale: {x: 0, y: 0, z: 0}
+ m_Children:
+ - {fileID: 224188954884660388}
+ - {fileID: 224247655386807502}
+ m_Father: {fileID: 0}
+ m_RootOrder: 0
+ m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
+ m_AnchorMin: {x: 0, y: 0}
+ m_AnchorMax: {x: 0, y: 0}
+ m_AnchoredPosition: {x: 0, y: 0}
+ m_SizeDelta: {x: 0, y: 0}
+ m_Pivot: {x: 0, y: 0}
+--- !u!224 &224688741740444772
+RectTransform:
+ m_ObjectHideFlags: 1
+ m_PrefabParentObject: {fileID: 0}
+ m_PrefabInternal: {fileID: 100100000}
+ m_GameObject: {fileID: 1519554490061234}
+ m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
+ m_LocalPosition: {x: 0, y: 0, z: 0}
+ m_LocalScale: {x: 1, y: 1, z: 1}
+ m_Children: []
+ m_Father: {fileID: 224770140206732756}
+ m_RootOrder: 0
+ m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
+ m_AnchorMin: {x: 0, y: 0}
+ m_AnchorMax: {x: 1, y: 1}
+ m_AnchoredPosition: {x: 9.1, y: -5.6}
+ m_SizeDelta: {x: 18.2, y: 11.2}
+ m_Pivot: {x: 0.5, y: 0.5}
+--- !u!224 &224770140206732756
+RectTransform:
+ m_ObjectHideFlags: 1
+ m_PrefabParentObject: {fileID: 0}
+ m_PrefabInternal: {fileID: 100100000}
+ m_GameObject: {fileID: 1026234277025590}
+ m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
+ m_LocalPosition: {x: 0, y: 0, z: 0}
+ m_LocalScale: {x: 1, y: 1, z: 1}
+ m_Children:
+ - {fileID: 224688741740444772}
+ m_Father: {fileID: 224247655386807502}
+ m_RootOrder: 0
+ m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
+ m_AnchorMin: {x: 0, y: 1}
+ m_AnchorMax: {x: 0, y: 1}
+ m_AnchoredPosition: {x: 172.1, y: -37.5}
+ m_SizeDelta: {x: 344.1, y: 75.2}
+ m_Pivot: {x: 0.5, y: 0.5}
diff --git a/Assets/GoogleMobileAds/Editor/Resources/PlaceholderAds/AppOpen/768x1024.prefab.meta b/Assets/GoogleMobileAds/Editor/Resources/PlaceholderAds/AppOpen/768x1024.prefab.meta
new file mode 100644
index 0000000..a4e2eb9
--- /dev/null
+++ b/Assets/GoogleMobileAds/Editor/Resources/PlaceholderAds/AppOpen/768x1024.prefab.meta
@@ -0,0 +1,12 @@
+fileFormatVersion: 2
+guid: 7d86e5c9e525f4fadbbea7ee54246b94
+labels:
+- gvh
+- gvh_version-10.6.0
+- gvhp_exportpath-GoogleMobileAds/Editor/Resources/PlaceholderAds/AppOpen/768x1024.prefab
+timeCreated: 1480838400
+PrefabImporter:
+ externalObjects: {}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/GoogleMobileAds/Editor/Resources/PlaceholderAds/Banners.meta b/Assets/GoogleMobileAds/Editor/Resources/PlaceholderAds/Banners.meta
new file mode 100644
index 0000000..7f196da
--- /dev/null
+++ b/Assets/GoogleMobileAds/Editor/Resources/PlaceholderAds/Banners.meta
@@ -0,0 +1,8 @@
+fileFormatVersion: 2
+guid: 83c273847e911bc42ae46dee711c7f91
+folderAsset: yes
+DefaultImporter:
+ externalObjects: {}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/GoogleMobileAds/Editor/Resources/PlaceholderAds/Banners/ADAPTIVE.prefab b/Assets/GoogleMobileAds/Editor/Resources/PlaceholderAds/Banners/ADAPTIVE.prefab
new file mode 100644
index 0000000..92974d7
--- /dev/null
+++ b/Assets/GoogleMobileAds/Editor/Resources/PlaceholderAds/Banners/ADAPTIVE.prefab
@@ -0,0 +1,292 @@
+%YAML 1.1
+%TAG !u! tag:unity3d.com,2011:
+--- !u!1001 &100100000
+Prefab:
+ m_ObjectHideFlags: 1
+ serializedVersion: 2
+ m_Modification:
+ m_TransformParent: {fileID: 0}
+ m_Modifications: []
+ m_RemovedComponents: []
+ m_ParentPrefab: {fileID: 0}
+ m_RootGameObject: {fileID: 1269133880751524}
+ m_IsPrefabParent: 1
+--- !u!1 &1269133880751524
+GameObject:
+ m_ObjectHideFlags: 0
+ m_PrefabParentObject: {fileID: 0}
+ m_PrefabInternal: {fileID: 100100000}
+ serializedVersion: 5
+ m_Component:
+ - component: {fileID: 224903529129881488}
+ - component: {fileID: 223611447948025624}
+ - component: {fileID: 114814154768417776}
+ - component: {fileID: 114782070117714080}
+ m_Layer: 5
+ m_Name: ADAPTIVE
+ m_TagString: Untagged
+ m_Icon: {fileID: 0}
+ m_NavMeshLayer: 0
+ m_StaticEditorFlags: 0
+ m_IsActive: 1
+--- !u!1 &1399486727572022
+GameObject:
+ m_ObjectHideFlags: 1
+ m_PrefabParentObject: {fileID: 0}
+ m_PrefabInternal: {fileID: 100100000}
+ serializedVersion: 5
+ m_Component:
+ - component: {fileID: 224568288566307878}
+ - component: {fileID: 222163316230224026}
+ - component: {fileID: 114350348470438990}
+ m_Layer: 5
+ m_Name: Text
+ m_TagString: Untagged
+ m_Icon: {fileID: 0}
+ m_NavMeshLayer: 0
+ m_StaticEditorFlags: 0
+ m_IsActive: 1
+--- !u!1 &1542249946006888
+GameObject:
+ m_ObjectHideFlags: 0
+ m_PrefabParentObject: {fileID: 0}
+ m_PrefabInternal: {fileID: 100100000}
+ serializedVersion: 5
+ m_Component:
+ - component: {fileID: 224920579879238496}
+ - component: {fileID: 222908399171909076}
+ - component: {fileID: 114302043590274744}
+ - component: {fileID: 114573167377799528}
+ m_Layer: 5
+ m_Name: Image
+ m_TagString: Untagged
+ m_Icon: {fileID: 0}
+ m_NavMeshLayer: 0
+ m_StaticEditorFlags: 0
+ m_IsActive: 1
+--- !u!114 &114302043590274744
+MonoBehaviour:
+ m_ObjectHideFlags: 1
+ m_PrefabParentObject: {fileID: 0}
+ m_PrefabInternal: {fileID: 100100000}
+ m_GameObject: {fileID: 1542249946006888}
+ m_Enabled: 1
+ m_EditorHideFlags: 0
+ m_Script: {fileID: -765806418, guid: f70555f144d8491a825f0804e09c671c, type: 3}
+ m_Name:
+ m_EditorClassIdentifier:
+ m_Material: {fileID: 0}
+ m_Color: {r: 1, g: 1, b: 1, a: 1}
+ m_RaycastTarget: 1
+ m_OnCullStateChanged:
+ m_PersistentCalls:
+ m_Calls: []
+ m_TypeName: UnityEngine.UI.MaskableGraphic+CullStateChangedEvent, UnityEngine.UI,
+ Version=1.0.0.0, Culture=neutral, PublicKeyToken=null
+ m_Sprite: {fileID: 0}
+ m_Type: 0
+ m_PreserveAspect: 0
+ m_FillCenter: 1
+ m_FillMethod: 4
+ m_FillAmount: 1
+ m_FillClockwise: 1
+ m_FillOrigin: 0
+--- !u!114 &114350348470438990
+MonoBehaviour:
+ m_ObjectHideFlags: 1
+ m_PrefabParentObject: {fileID: 0}
+ m_PrefabInternal: {fileID: 100100000}
+ m_GameObject: {fileID: 1399486727572022}
+ m_Enabled: 1
+ m_EditorHideFlags: 0
+ m_Script: {fileID: 708705254, guid: f70555f144d8491a825f0804e09c671c, type: 3}
+ m_Name:
+ m_EditorClassIdentifier:
+ m_Material: {fileID: 0}
+ m_Color: {r: 0.19607843, g: 0.19607843, b: 0.19607843, a: 1}
+ m_RaycastTarget: 1
+ m_OnCullStateChanged:
+ m_PersistentCalls:
+ m_Calls: []
+ m_TypeName: UnityEngine.UI.MaskableGraphic+CullStateChangedEvent, UnityEngine.UI,
+ Version=1.0.0.0, Culture=neutral, PublicKeyToken=null
+ m_FontData:
+ m_Font: {fileID: 10102, guid: 0000000000000000e000000000000000, type: 0}
+ m_FontSize: 25
+ m_FontStyle: 1
+ m_BestFit: 1
+ m_MinSize: 20
+ m_MaxSize: 40
+ m_Alignment: 4
+ m_AlignByGeometry: 0
+ m_RichText: 1
+ m_HorizontalOverflow: 0
+ m_VerticalOverflow: 0
+ m_LineSpacing: 1
+ m_Text: This is a Test Adaptive Banner
+--- !u!114 &114573167377799528
+MonoBehaviour:
+ m_ObjectHideFlags: 1
+ m_PrefabParentObject: {fileID: 0}
+ m_PrefabInternal: {fileID: 100100000}
+ m_GameObject: {fileID: 1542249946006888}
+ m_Enabled: 1
+ m_EditorHideFlags: 0
+ m_Script: {fileID: 1392445389, guid: f70555f144d8491a825f0804e09c671c, type: 3}
+ m_Name:
+ m_EditorClassIdentifier:
+ m_Navigation:
+ m_Mode: 3
+ m_SelectOnUp: {fileID: 0}
+ m_SelectOnDown: {fileID: 0}
+ m_SelectOnLeft: {fileID: 0}
+ m_SelectOnRight: {fileID: 0}
+ m_Transition: 1
+ m_Colors:
+ m_NormalColor: {r: 1, g: 1, b: 1, a: 1}
+ m_HighlightedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1}
+ m_PressedColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 1}
+ m_DisabledColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 0.5019608}
+ m_ColorMultiplier: 1
+ m_FadeDuration: 0.1
+ m_SpriteState:
+ m_HighlightedSprite: {fileID: 0}
+ m_PressedSprite: {fileID: 0}
+ m_DisabledSprite: {fileID: 0}
+ m_AnimationTriggers:
+ m_NormalTrigger: Normal
+ m_HighlightedTrigger: Highlighted
+ m_PressedTrigger: Pressed
+ m_DisabledTrigger: Disabled
+ m_Interactable: 1
+ m_TargetGraphic: {fileID: 114302043590274744}
+ m_OnClick:
+ m_PersistentCalls:
+ m_Calls: []
+ m_TypeName: UnityEngine.UI.Button+ButtonClickedEvent, UnityEngine.UI, Version=1.0.0.0,
+ Culture=neutral, PublicKeyToken=null
+--- !u!114 &114782070117714080
+MonoBehaviour:
+ m_ObjectHideFlags: 1
+ m_PrefabParentObject: {fileID: 0}
+ m_PrefabInternal: {fileID: 100100000}
+ m_GameObject: {fileID: 1269133880751524}
+ m_Enabled: 1
+ m_EditorHideFlags: 0
+ m_Script: {fileID: 1980459831, guid: f70555f144d8491a825f0804e09c671c, type: 3}
+ m_Name:
+ m_EditorClassIdentifier:
+ m_UiScaleMode: 1
+ m_ReferencePixelsPerUnit: 100
+ m_ScaleFactor: 1
+ m_ReferenceResolution: {x: 2960, y: 1440}
+ m_ScreenMatchMode: 0
+ m_MatchWidthOrHeight: 1
+ m_PhysicalUnit: 3
+ m_FallbackScreenDPI: 96
+ m_DefaultSpriteDPI: 96
+ m_DynamicPixelsPerUnit: 1
+--- !u!114 &114814154768417776
+MonoBehaviour:
+ m_ObjectHideFlags: 1
+ m_PrefabParentObject: {fileID: 0}
+ m_PrefabInternal: {fileID: 100100000}
+ m_GameObject: {fileID: 1269133880751524}
+ m_Enabled: 1
+ m_EditorHideFlags: 0
+ m_Script: {fileID: 1301386320, guid: f70555f144d8491a825f0804e09c671c, type: 3}
+ m_Name:
+ m_EditorClassIdentifier:
+ m_IgnoreReversedGraphics: 1
+ m_BlockingObjects: 0
+ m_BlockingMask:
+ serializedVersion: 2
+ m_Bits: 4294967295
+--- !u!222 &222163316230224026
+CanvasRenderer:
+ m_ObjectHideFlags: 1
+ m_PrefabParentObject: {fileID: 0}
+ m_PrefabInternal: {fileID: 100100000}
+ m_GameObject: {fileID: 1399486727572022}
+--- !u!222 &222908399171909076
+CanvasRenderer:
+ m_ObjectHideFlags: 1
+ m_PrefabParentObject: {fileID: 0}
+ m_PrefabInternal: {fileID: 100100000}
+ m_GameObject: {fileID: 1542249946006888}
+--- !u!223 &223611447948025624
+Canvas:
+ m_ObjectHideFlags: 1
+ m_PrefabParentObject: {fileID: 0}
+ m_PrefabInternal: {fileID: 100100000}
+ m_GameObject: {fileID: 1269133880751524}
+ m_Enabled: 1
+ serializedVersion: 3
+ m_RenderMode: 0
+ m_Camera: {fileID: 0}
+ m_PlaneDistance: 100
+ m_PixelPerfect: 0
+ m_ReceivesEvents: 1
+ m_OverrideSorting: 0
+ m_OverridePixelPerfect: 0
+ m_SortingBucketNormalizedSize: 0
+ m_AdditionalShaderChannelsFlag: 0
+ m_SortingLayerID: 0
+ m_SortingOrder: 0
+ m_TargetDisplay: 0
+--- !u!224 &224568288566307878
+RectTransform:
+ m_ObjectHideFlags: 1
+ m_PrefabParentObject: {fileID: 0}
+ m_PrefabInternal: {fileID: 100100000}
+ m_GameObject: {fileID: 1399486727572022}
+ m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
+ m_LocalPosition: {x: 0, y: 0, z: 0}
+ m_LocalScale: {x: 1, y: 1, z: 1}
+ m_Children: []
+ m_Father: {fileID: 224920579879238496}
+ m_RootOrder: 0
+ m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
+ m_AnchorMin: {x: 0.5, y: 0.5}
+ m_AnchorMax: {x: 0.5, y: 0.5}
+ m_AnchoredPosition: {x: 2.4, y: 0.000043869}
+ m_SizeDelta: {x: 362.7, y: 100}
+ m_Pivot: {x: 0.5, y: 0.5}
+--- !u!224 &224903529129881488
+RectTransform:
+ m_ObjectHideFlags: 1
+ m_PrefabParentObject: {fileID: 0}
+ m_PrefabInternal: {fileID: 100100000}
+ m_GameObject: {fileID: 1269133880751524}
+ m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
+ m_LocalPosition: {x: 0, y: 0, z: 0}
+ m_LocalScale: {x: 0, y: 0, z: 0}
+ m_Children:
+ - {fileID: 224920579879238496}
+ m_Father: {fileID: 0}
+ m_RootOrder: 0
+ m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
+ m_AnchorMin: {x: 0, y: 0}
+ m_AnchorMax: {x: 0, y: 0}
+ m_AnchoredPosition: {x: 0, y: 0}
+ m_SizeDelta: {x: 0, y: 0}
+ m_Pivot: {x: 0, y: 0}
+--- !u!224 &224920579879238496
+RectTransform:
+ m_ObjectHideFlags: 1
+ m_PrefabParentObject: {fileID: 0}
+ m_PrefabInternal: {fileID: 100100000}
+ m_GameObject: {fileID: 1542249946006888}
+ m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
+ m_LocalPosition: {x: 0, y: 0, z: 0}
+ m_LocalScale: {x: 1, y: 1, z: 1}
+ m_Children:
+ - {fileID: 224568288566307878}
+ m_Father: {fileID: 224903529129881488}
+ m_RootOrder: 0
+ m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
+ m_AnchorMin: {x: 0, y: 1}
+ m_AnchorMax: {x: 1, y: 1}
+ m_AnchoredPosition: {x: 0, y: -800}
+ m_SizeDelta: {x: 0, y: 100}
+ m_Pivot: {x: 0.5, y: 0.5}
diff --git a/Assets/GoogleMobileAds/Editor/Resources/PlaceholderAds/Banners/ADAPTIVE.prefab.meta b/Assets/GoogleMobileAds/Editor/Resources/PlaceholderAds/Banners/ADAPTIVE.prefab.meta
new file mode 100644
index 0000000..02fe835
--- /dev/null
+++ b/Assets/GoogleMobileAds/Editor/Resources/PlaceholderAds/Banners/ADAPTIVE.prefab.meta
@@ -0,0 +1,13 @@
+fileFormatVersion: 2
+guid: b2a3ea2f1837847d9981501e0eeca085
+labels:
+- gvh
+- gvh_version-10.6.0
+- gvhp_exportpath-GoogleMobileAds/Editor/Resources/PlaceholderAds/Banners/ADAPTIVE.prefab
+timeCreated: 1480838400
+NativeFormatImporter:
+ externalObjects: {}
+ mainObjectFileID: 100100000
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/GoogleMobileAds/Editor/Resources/PlaceholderAds/Banners/BANNER.prefab b/Assets/GoogleMobileAds/Editor/Resources/PlaceholderAds/Banners/BANNER.prefab
new file mode 100644
index 0000000..598e792
--- /dev/null
+++ b/Assets/GoogleMobileAds/Editor/Resources/PlaceholderAds/Banners/BANNER.prefab
@@ -0,0 +1,217 @@
+%YAML 1.1
+%TAG !u! tag:unity3d.com,2011:
+--- !u!1001 &100100000
+Prefab:
+ m_ObjectHideFlags: 1
+ serializedVersion: 2
+ m_Modification:
+ m_TransformParent: {fileID: 0}
+ m_Modifications: []
+ m_RemovedComponents: []
+ m_ParentPrefab: {fileID: 0}
+ m_RootGameObject: {fileID: 1922916089534430}
+ m_IsPrefabParent: 1
+--- !u!1 &1746883794458476
+GameObject:
+ m_ObjectHideFlags: 0
+ m_PrefabParentObject: {fileID: 0}
+ m_PrefabInternal: {fileID: 100100000}
+ serializedVersion: 5
+ m_Component:
+ - component: {fileID: 224102598220924924}
+ - component: {fileID: 222746751799034550}
+ - component: {fileID: 114085332113477484}
+ - component: {fileID: 114158516453251810}
+ m_Layer: 5
+ m_Name: Image
+ m_TagString: Untagged
+ m_Icon: {fileID: 0}
+ m_NavMeshLayer: 0
+ m_StaticEditorFlags: 0
+ m_IsActive: 1
+--- !u!1 &1922916089534430
+GameObject:
+ m_ObjectHideFlags: 0
+ m_PrefabParentObject: {fileID: 0}
+ m_PrefabInternal: {fileID: 100100000}
+ serializedVersion: 5
+ m_Component:
+ - component: {fileID: 224975965904302652}
+ - component: {fileID: 223151453590684250}
+ - component: {fileID: 114308861063183428}
+ - component: {fileID: 114122664426735340}
+ m_Layer: 5
+ m_Name: BANNER
+ m_TagString: Untagged
+ m_Icon: {fileID: 0}
+ m_NavMeshLayer: 0
+ m_StaticEditorFlags: 0
+ m_IsActive: 1
+--- !u!114 &114085332113477484
+MonoBehaviour:
+ m_ObjectHideFlags: 1
+ m_PrefabParentObject: {fileID: 0}
+ m_PrefabInternal: {fileID: 100100000}
+ m_GameObject: {fileID: 1746883794458476}
+ m_Enabled: 1
+ m_EditorHideFlags: 0
+ m_Script: {fileID: -765806418, guid: f70555f144d8491a825f0804e09c671c, type: 3}
+ m_Name:
+ m_EditorClassIdentifier:
+ m_Material: {fileID: 0}
+ m_Color: {r: 1, g: 1, b: 1, a: 1}
+ m_RaycastTarget: 1
+ m_OnCullStateChanged:
+ m_PersistentCalls:
+ m_Calls: []
+ m_TypeName: UnityEngine.UI.MaskableGraphic+CullStateChangedEvent, UnityEngine.UI,
+ Version=1.0.0.0, Culture=neutral, PublicKeyToken=null
+ m_Sprite: {fileID: 21300000, guid: 5a6531d4c9c484d679a2d6f9e6fefed5, type: 3}
+ m_Type: 0
+ m_PreserveAspect: 0
+ m_FillCenter: 1
+ m_FillMethod: 4
+ m_FillAmount: 1
+ m_FillClockwise: 1
+ m_FillOrigin: 0
+--- !u!114 &114122664426735340
+MonoBehaviour:
+ m_ObjectHideFlags: 1
+ m_PrefabParentObject: {fileID: 0}
+ m_PrefabInternal: {fileID: 100100000}
+ m_GameObject: {fileID: 1922916089534430}
+ m_Enabled: 1
+ m_EditorHideFlags: 0
+ m_Script: {fileID: 1980459831, guid: f70555f144d8491a825f0804e09c671c, type: 3}
+ m_Name:
+ m_EditorClassIdentifier:
+ m_UiScaleMode: 1
+ m_ReferencePixelsPerUnit: 100
+ m_ScaleFactor: 1
+ m_ReferenceResolution: {x: 1280, y: 800}
+ m_ScreenMatchMode: 0
+ m_MatchWidthOrHeight: 1
+ m_PhysicalUnit: 3
+ m_FallbackScreenDPI: 96
+ m_DefaultSpriteDPI: 96
+ m_DynamicPixelsPerUnit: 1
+--- !u!114 &114158516453251810
+MonoBehaviour:
+ m_ObjectHideFlags: 1
+ m_PrefabParentObject: {fileID: 0}
+ m_PrefabInternal: {fileID: 100100000}
+ m_GameObject: {fileID: 1746883794458476}
+ m_Enabled: 1
+ m_EditorHideFlags: 0
+ m_Script: {fileID: 1392445389, guid: f70555f144d8491a825f0804e09c671c, type: 3}
+ m_Name:
+ m_EditorClassIdentifier:
+ m_Navigation:
+ m_Mode: 3
+ m_SelectOnUp: {fileID: 0}
+ m_SelectOnDown: {fileID: 0}
+ m_SelectOnLeft: {fileID: 0}
+ m_SelectOnRight: {fileID: 0}
+ m_Transition: 1
+ m_Colors:
+ m_NormalColor: {r: 1, g: 1, b: 1, a: 1}
+ m_HighlightedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1}
+ m_PressedColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 1}
+ m_DisabledColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 0.5019608}
+ m_ColorMultiplier: 1
+ m_FadeDuration: 0.1
+ m_SpriteState:
+ m_HighlightedSprite: {fileID: 0}
+ m_PressedSprite: {fileID: 0}
+ m_DisabledSprite: {fileID: 0}
+ m_AnimationTriggers:
+ m_NormalTrigger: Normal
+ m_HighlightedTrigger: Highlighted
+ m_PressedTrigger: Pressed
+ m_DisabledTrigger: Disabled
+ m_Interactable: 1
+ m_TargetGraphic: {fileID: 114085332113477484}
+ m_OnClick:
+ m_PersistentCalls:
+ m_Calls: []
+ m_TypeName: UnityEngine.UI.Button+ButtonClickedEvent, UnityEngine.UI, Version=1.0.0.0,
+ Culture=neutral, PublicKeyToken=null
+--- !u!114 &114308861063183428
+MonoBehaviour:
+ m_ObjectHideFlags: 1
+ m_PrefabParentObject: {fileID: 0}
+ m_PrefabInternal: {fileID: 100100000}
+ m_GameObject: {fileID: 1922916089534430}
+ m_Enabled: 1
+ m_EditorHideFlags: 0
+ m_Script: {fileID: 1301386320, guid: f70555f144d8491a825f0804e09c671c, type: 3}
+ m_Name:
+ m_EditorClassIdentifier:
+ m_IgnoreReversedGraphics: 1
+ m_BlockingObjects: 0
+ m_BlockingMask:
+ serializedVersion: 2
+ m_Bits: 4294967295
+--- !u!222 &222746751799034550
+CanvasRenderer:
+ m_ObjectHideFlags: 1
+ m_PrefabParentObject: {fileID: 0}
+ m_PrefabInternal: {fileID: 100100000}
+ m_GameObject: {fileID: 1746883794458476}
+--- !u!223 &223151453590684250
+Canvas:
+ m_ObjectHideFlags: 1
+ m_PrefabParentObject: {fileID: 0}
+ m_PrefabInternal: {fileID: 100100000}
+ m_GameObject: {fileID: 1922916089534430}
+ m_Enabled: 1
+ serializedVersion: 3
+ m_RenderMode: 0
+ m_Camera: {fileID: 0}
+ m_PlaneDistance: 100
+ m_PixelPerfect: 0
+ m_ReceivesEvents: 1
+ m_OverrideSorting: 0
+ m_OverridePixelPerfect: 0
+ m_SortingBucketNormalizedSize: 0
+ m_AdditionalShaderChannelsFlag: 0
+ m_SortingLayerID: 0
+ m_SortingOrder: 0
+ m_TargetDisplay: 0
+--- !u!224 &224102598220924924
+RectTransform:
+ m_ObjectHideFlags: 1
+ m_PrefabParentObject: {fileID: 0}
+ m_PrefabInternal: {fileID: 100100000}
+ m_GameObject: {fileID: 1746883794458476}
+ m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
+ m_LocalPosition: {x: 0, y: 0, z: 0}
+ m_LocalScale: {x: 1, y: 1, z: 1}
+ m_Children: []
+ m_Father: {fileID: 224975965904302652}
+ m_RootOrder: 0
+ m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
+ m_AnchorMin: {x: 0.5, y: 1}
+ m_AnchorMax: {x: 0.5, y: 1}
+ m_AnchoredPosition: {x: 0, y: -20}
+ m_SizeDelta: {x: 260, y: 40}
+ m_Pivot: {x: 0.5, y: 0.5}
+--- !u!224 &224975965904302652
+RectTransform:
+ m_ObjectHideFlags: 1
+ m_PrefabParentObject: {fileID: 0}
+ m_PrefabInternal: {fileID: 100100000}
+ m_GameObject: {fileID: 1922916089534430}
+ m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
+ m_LocalPosition: {x: 0, y: 0, z: 0}
+ m_LocalScale: {x: 0, y: 0, z: 0}
+ m_Children:
+ - {fileID: 224102598220924924}
+ m_Father: {fileID: 0}
+ m_RootOrder: 0
+ m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
+ m_AnchorMin: {x: 0, y: 0}
+ m_AnchorMax: {x: 0, y: 0}
+ m_AnchoredPosition: {x: 0, y: 0}
+ m_SizeDelta: {x: 0, y: 0}
+ m_Pivot: {x: 0, y: 0}
diff --git a/Assets/GoogleMobileAds/Editor/Resources/PlaceholderAds/Banners/BANNER.prefab.meta b/Assets/GoogleMobileAds/Editor/Resources/PlaceholderAds/Banners/BANNER.prefab.meta
new file mode 100644
index 0000000..c9a7ca7
--- /dev/null
+++ b/Assets/GoogleMobileAds/Editor/Resources/PlaceholderAds/Banners/BANNER.prefab.meta
@@ -0,0 +1,13 @@
+fileFormatVersion: 2
+guid: b2a8ac187bcca47a286cb00c8094da36
+labels:
+- gvh
+- gvh_version-10.6.0
+- gvhp_exportpath-GoogleMobileAds/Editor/Resources/PlaceholderAds/Banners/BANNER.prefab
+timeCreated: 1480838400
+NativeFormatImporter:
+ externalObjects: {}
+ mainObjectFileID: 100100000
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/GoogleMobileAds/Editor/Resources/PlaceholderAds/Banners/CENTER.prefab b/Assets/GoogleMobileAds/Editor/Resources/PlaceholderAds/Banners/CENTER.prefab
new file mode 100644
index 0000000..97586f9
--- /dev/null
+++ b/Assets/GoogleMobileAds/Editor/Resources/PlaceholderAds/Banners/CENTER.prefab
@@ -0,0 +1,292 @@
+%YAML 1.1
+%TAG !u! tag:unity3d.com,2011:
+--- !u!1001 &100100000
+Prefab:
+ m_ObjectHideFlags: 1
+ serializedVersion: 2
+ m_Modification:
+ m_TransformParent: {fileID: 0}
+ m_Modifications: []
+ m_RemovedComponents: []
+ m_ParentPrefab: {fileID: 0}
+ m_RootGameObject: {fileID: 1416738728138556}
+ m_IsPrefabParent: 1
+--- !u!1 &1136984565866652
+GameObject:
+ m_ObjectHideFlags: 0
+ m_PrefabParentObject: {fileID: 0}
+ m_PrefabInternal: {fileID: 100100000}
+ serializedVersion: 5
+ m_Component:
+ - component: {fileID: 224716041920118618}
+ - component: {fileID: 222921256881353822}
+ - component: {fileID: 114680691601076658}
+ - component: {fileID: 114238919180307928}
+ m_Layer: 5
+ m_Name: Image
+ m_TagString: Untagged
+ m_Icon: {fileID: 0}
+ m_NavMeshLayer: 0
+ m_StaticEditorFlags: 0
+ m_IsActive: 1
+--- !u!1 &1367349203345002
+GameObject:
+ m_ObjectHideFlags: 1
+ m_PrefabParentObject: {fileID: 0}
+ m_PrefabInternal: {fileID: 100100000}
+ serializedVersion: 5
+ m_Component:
+ - component: {fileID: 224396676929103998}
+ - component: {fileID: 222812030589784238}
+ - component: {fileID: 114064202109378262}
+ m_Layer: 5
+ m_Name: Text
+ m_TagString: Untagged
+ m_Icon: {fileID: 0}
+ m_NavMeshLayer: 0
+ m_StaticEditorFlags: 0
+ m_IsActive: 1
+--- !u!1 &1416738728138556
+GameObject:
+ m_ObjectHideFlags: 0
+ m_PrefabParentObject: {fileID: 0}
+ m_PrefabInternal: {fileID: 100100000}
+ serializedVersion: 5
+ m_Component:
+ - component: {fileID: 224556414654429204}
+ - component: {fileID: 223868036777227868}
+ - component: {fileID: 114335156126952382}
+ - component: {fileID: 114348016595591796}
+ m_Layer: 5
+ m_Name: CENTER
+ m_TagString: Untagged
+ m_Icon: {fileID: 0}
+ m_NavMeshLayer: 0
+ m_StaticEditorFlags: 0
+ m_IsActive: 1
+--- !u!114 &114064202109378262
+MonoBehaviour:
+ m_ObjectHideFlags: 1
+ m_PrefabParentObject: {fileID: 0}
+ m_PrefabInternal: {fileID: 100100000}
+ m_GameObject: {fileID: 1367349203345002}
+ m_Enabled: 1
+ m_EditorHideFlags: 0
+ m_Script: {fileID: 708705254, guid: f70555f144d8491a825f0804e09c671c, type: 3}
+ m_Name:
+ m_EditorClassIdentifier:
+ m_Material: {fileID: 0}
+ m_Color: {r: 0.19607843, g: 0.19607843, b: 0.19607843, a: 1}
+ m_RaycastTarget: 1
+ m_OnCullStateChanged:
+ m_PersistentCalls:
+ m_Calls: []
+ m_TypeName: UnityEngine.UI.MaskableGraphic+CullStateChangedEvent, UnityEngine.UI,
+ Version=1.0.0.0, Culture=neutral, PublicKeyToken=null
+ m_FontData:
+ m_Font: {fileID: 10102, guid: 0000000000000000e000000000000000, type: 0}
+ m_FontSize: 25
+ m_FontStyle: 1
+ m_BestFit: 1
+ m_MinSize: 20
+ m_MaxSize: 40
+ m_Alignment: 4
+ m_AlignByGeometry: 0
+ m_RichText: 1
+ m_HorizontalOverflow: 0
+ m_VerticalOverflow: 0
+ m_LineSpacing: 1
+ m_Text: This is a Test Smart Banner
+--- !u!114 &114238919180307928
+MonoBehaviour:
+ m_ObjectHideFlags: 1
+ m_PrefabParentObject: {fileID: 0}
+ m_PrefabInternal: {fileID: 100100000}
+ m_GameObject: {fileID: 1136984565866652}
+ m_Enabled: 1
+ m_EditorHideFlags: 0
+ m_Script: {fileID: 1392445389, guid: f70555f144d8491a825f0804e09c671c, type: 3}
+ m_Name:
+ m_EditorClassIdentifier:
+ m_Navigation:
+ m_Mode: 3
+ m_SelectOnUp: {fileID: 0}
+ m_SelectOnDown: {fileID: 0}
+ m_SelectOnLeft: {fileID: 0}
+ m_SelectOnRight: {fileID: 0}
+ m_Transition: 1
+ m_Colors:
+ m_NormalColor: {r: 1, g: 1, b: 1, a: 1}
+ m_HighlightedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1}
+ m_PressedColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 1}
+ m_DisabledColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 0.5019608}
+ m_ColorMultiplier: 1
+ m_FadeDuration: 0.1
+ m_SpriteState:
+ m_HighlightedSprite: {fileID: 0}
+ m_PressedSprite: {fileID: 0}
+ m_DisabledSprite: {fileID: 0}
+ m_AnimationTriggers:
+ m_NormalTrigger: Normal
+ m_HighlightedTrigger: Highlighted
+ m_PressedTrigger: Pressed
+ m_DisabledTrigger: Disabled
+ m_Interactable: 1
+ m_TargetGraphic: {fileID: 114680691601076658}
+ m_OnClick:
+ m_PersistentCalls:
+ m_Calls: []
+ m_TypeName: UnityEngine.UI.Button+ButtonClickedEvent, UnityEngine.UI, Version=1.0.0.0,
+ Culture=neutral, PublicKeyToken=null
+--- !u!114 &114335156126952382
+MonoBehaviour:
+ m_ObjectHideFlags: 1
+ m_PrefabParentObject: {fileID: 0}
+ m_PrefabInternal: {fileID: 100100000}
+ m_GameObject: {fileID: 1416738728138556}
+ m_Enabled: 1
+ m_EditorHideFlags: 0
+ m_Script: {fileID: 1301386320, guid: f70555f144d8491a825f0804e09c671c, type: 3}
+ m_Name:
+ m_EditorClassIdentifier:
+ m_IgnoreReversedGraphics: 1
+ m_BlockingObjects: 0
+ m_BlockingMask:
+ serializedVersion: 2
+ m_Bits: 4294967295
+--- !u!114 &114348016595591796
+MonoBehaviour:
+ m_ObjectHideFlags: 1
+ m_PrefabParentObject: {fileID: 0}
+ m_PrefabInternal: {fileID: 100100000}
+ m_GameObject: {fileID: 1416738728138556}
+ m_Enabled: 1
+ m_EditorHideFlags: 0
+ m_Script: {fileID: 1980459831, guid: f70555f144d8491a825f0804e09c671c, type: 3}
+ m_Name:
+ m_EditorClassIdentifier:
+ m_UiScaleMode: 1
+ m_ReferencePixelsPerUnit: 100
+ m_ScaleFactor: 1
+ m_ReferenceResolution: {x: 2960, y: 1440}
+ m_ScreenMatchMode: 0
+ m_MatchWidthOrHeight: 1
+ m_PhysicalUnit: 3
+ m_FallbackScreenDPI: 96
+ m_DefaultSpriteDPI: 96
+ m_DynamicPixelsPerUnit: 1
+--- !u!114 &114680691601076658
+MonoBehaviour:
+ m_ObjectHideFlags: 1
+ m_PrefabParentObject: {fileID: 0}
+ m_PrefabInternal: {fileID: 100100000}
+ m_GameObject: {fileID: 1136984565866652}
+ m_Enabled: 1
+ m_EditorHideFlags: 0
+ m_Script: {fileID: -765806418, guid: f70555f144d8491a825f0804e09c671c, type: 3}
+ m_Name:
+ m_EditorClassIdentifier:
+ m_Material: {fileID: 0}
+ m_Color: {r: 1, g: 1, b: 1, a: 1}
+ m_RaycastTarget: 1
+ m_OnCullStateChanged:
+ m_PersistentCalls:
+ m_Calls: []
+ m_TypeName: UnityEngine.UI.MaskableGraphic+CullStateChangedEvent, UnityEngine.UI,
+ Version=1.0.0.0, Culture=neutral, PublicKeyToken=null
+ m_Sprite: {fileID: 0}
+ m_Type: 0
+ m_PreserveAspect: 0
+ m_FillCenter: 1
+ m_FillMethod: 4
+ m_FillAmount: 1
+ m_FillClockwise: 1
+ m_FillOrigin: 0
+--- !u!222 &222812030589784238
+CanvasRenderer:
+ m_ObjectHideFlags: 1
+ m_PrefabParentObject: {fileID: 0}
+ m_PrefabInternal: {fileID: 100100000}
+ m_GameObject: {fileID: 1367349203345002}
+--- !u!222 &222921256881353822
+CanvasRenderer:
+ m_ObjectHideFlags: 1
+ m_PrefabParentObject: {fileID: 0}
+ m_PrefabInternal: {fileID: 100100000}
+ m_GameObject: {fileID: 1136984565866652}
+--- !u!223 &223868036777227868
+Canvas:
+ m_ObjectHideFlags: 1
+ m_PrefabParentObject: {fileID: 0}
+ m_PrefabInternal: {fileID: 100100000}
+ m_GameObject: {fileID: 1416738728138556}
+ m_Enabled: 1
+ serializedVersion: 3
+ m_RenderMode: 0
+ m_Camera: {fileID: 0}
+ m_PlaneDistance: 100
+ m_PixelPerfect: 0
+ m_ReceivesEvents: 1
+ m_OverrideSorting: 0
+ m_OverridePixelPerfect: 0
+ m_SortingBucketNormalizedSize: 0
+ m_AdditionalShaderChannelsFlag: 0
+ m_SortingLayerID: 0
+ m_SortingOrder: 0
+ m_TargetDisplay: 0
+--- !u!224 &224396676929103998
+RectTransform:
+ m_ObjectHideFlags: 1
+ m_PrefabParentObject: {fileID: 0}
+ m_PrefabInternal: {fileID: 100100000}
+ m_GameObject: {fileID: 1367349203345002}
+ m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
+ m_LocalPosition: {x: 0, y: 0, z: 0}
+ m_LocalScale: {x: 1, y: 1, z: 1}
+ m_Children: []
+ m_Father: {fileID: 224716041920118618}
+ m_RootOrder: 0
+ m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
+ m_AnchorMin: {x: 0.5, y: 0.5}
+ m_AnchorMax: {x: 0.5, y: 0.5}
+ m_AnchoredPosition: {x: 2.4, y: 0.000043869}
+ m_SizeDelta: {x: 362.7, y: 100}
+ m_Pivot: {x: 0.5, y: 0.5}
+--- !u!224 &224556414654429204
+RectTransform:
+ m_ObjectHideFlags: 1
+ m_PrefabParentObject: {fileID: 0}
+ m_PrefabInternal: {fileID: 100100000}
+ m_GameObject: {fileID: 1416738728138556}
+ m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
+ m_LocalPosition: {x: 0, y: 0, z: 0}
+ m_LocalScale: {x: 0, y: 0, z: 0}
+ m_Children:
+ - {fileID: 224716041920118618}
+ m_Father: {fileID: 0}
+ m_RootOrder: 0
+ m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
+ m_AnchorMin: {x: 0, y: 0}
+ m_AnchorMax: {x: 0, y: 0}
+ m_AnchoredPosition: {x: 0, y: 0}
+ m_SizeDelta: {x: 0, y: 0}
+ m_Pivot: {x: 0, y: 0}
+--- !u!224 &224716041920118618
+RectTransform:
+ m_ObjectHideFlags: 1
+ m_PrefabParentObject: {fileID: 0}
+ m_PrefabInternal: {fileID: 100100000}
+ m_GameObject: {fileID: 1136984565866652}
+ m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
+ m_LocalPosition: {x: 0, y: 0, z: 0}
+ m_LocalScale: {x: 1, y: 1, z: 1}
+ m_Children:
+ - {fileID: 224396676929103998}
+ m_Father: {fileID: 224556414654429204}
+ m_RootOrder: 0
+ m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
+ m_AnchorMin: {x: 0, y: 0.5}
+ m_AnchorMax: {x: 1, y: 0.5}
+ m_AnchoredPosition: {x: 0, y: 0}
+ m_SizeDelta: {x: 0, y: 100}
+ m_Pivot: {x: 0.5, y: 0.5}
diff --git a/Assets/GoogleMobileAds/Editor/Resources/PlaceholderAds/Banners/CENTER.prefab.meta b/Assets/GoogleMobileAds/Editor/Resources/PlaceholderAds/Banners/CENTER.prefab.meta
new file mode 100644
index 0000000..767d184
--- /dev/null
+++ b/Assets/GoogleMobileAds/Editor/Resources/PlaceholderAds/Banners/CENTER.prefab.meta
@@ -0,0 +1,13 @@
+fileFormatVersion: 2
+guid: 452d0eeb28d68420d95c05a6712689be
+labels:
+- gvh
+- gvh_version-10.6.0
+- gvhp_exportpath-GoogleMobileAds/Editor/Resources/PlaceholderAds/Banners/CENTER.prefab
+timeCreated: 1480838400
+NativeFormatImporter:
+ externalObjects: {}
+ mainObjectFileID: 100100000
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/GoogleMobileAds/Editor/Resources/PlaceholderAds/Banners/FULL_BANNER.prefab b/Assets/GoogleMobileAds/Editor/Resources/PlaceholderAds/Banners/FULL_BANNER.prefab
new file mode 100644
index 0000000..e22051e
--- /dev/null
+++ b/Assets/GoogleMobileAds/Editor/Resources/PlaceholderAds/Banners/FULL_BANNER.prefab
@@ -0,0 +1,217 @@
+%YAML 1.1
+%TAG !u! tag:unity3d.com,2011:
+--- !u!1001 &100100000
+Prefab:
+ m_ObjectHideFlags: 1
+ serializedVersion: 2
+ m_Modification:
+ m_TransformParent: {fileID: 0}
+ m_Modifications: []
+ m_RemovedComponents: []
+ m_ParentPrefab: {fileID: 0}
+ m_RootGameObject: {fileID: 1693671887655770}
+ m_IsPrefabParent: 1
+--- !u!1 &1289376599481394
+GameObject:
+ m_ObjectHideFlags: 0
+ m_PrefabParentObject: {fileID: 0}
+ m_PrefabInternal: {fileID: 100100000}
+ serializedVersion: 5
+ m_Component:
+ - component: {fileID: 224722748174579388}
+ - component: {fileID: 222144676729818894}
+ - component: {fileID: 114315551303721412}
+ - component: {fileID: 114421075155369980}
+ m_Layer: 5
+ m_Name: Image
+ m_TagString: Untagged
+ m_Icon: {fileID: 0}
+ m_NavMeshLayer: 0
+ m_StaticEditorFlags: 0
+ m_IsActive: 1
+--- !u!1 &1693671887655770
+GameObject:
+ m_ObjectHideFlags: 0
+ m_PrefabParentObject: {fileID: 0}
+ m_PrefabInternal: {fileID: 100100000}
+ serializedVersion: 5
+ m_Component:
+ - component: {fileID: 224276549256597394}
+ - component: {fileID: 223952169128518932}
+ - component: {fileID: 114696334858063158}
+ - component: {fileID: 114239890049580038}
+ m_Layer: 5
+ m_Name: FULL_BANNER
+ m_TagString: Untagged
+ m_Icon: {fileID: 0}
+ m_NavMeshLayer: 0
+ m_StaticEditorFlags: 0
+ m_IsActive: 1
+--- !u!114 &114239890049580038
+MonoBehaviour:
+ m_ObjectHideFlags: 1
+ m_PrefabParentObject: {fileID: 0}
+ m_PrefabInternal: {fileID: 100100000}
+ m_GameObject: {fileID: 1693671887655770}
+ m_Enabled: 1
+ m_EditorHideFlags: 0
+ m_Script: {fileID: 1980459831, guid: f70555f144d8491a825f0804e09c671c, type: 3}
+ m_Name:
+ m_EditorClassIdentifier:
+ m_UiScaleMode: 1
+ m_ReferencePixelsPerUnit: 100
+ m_ScaleFactor: 1
+ m_ReferenceResolution: {x: 2690, y: 1440}
+ m_ScreenMatchMode: 0
+ m_MatchWidthOrHeight: 1
+ m_PhysicalUnit: 3
+ m_FallbackScreenDPI: 96
+ m_DefaultSpriteDPI: 96
+ m_DynamicPixelsPerUnit: 1
+--- !u!114 &114315551303721412
+MonoBehaviour:
+ m_ObjectHideFlags: 1
+ m_PrefabParentObject: {fileID: 0}
+ m_PrefabInternal: {fileID: 100100000}
+ m_GameObject: {fileID: 1289376599481394}
+ m_Enabled: 1
+ m_EditorHideFlags: 0
+ m_Script: {fileID: -765806418, guid: f70555f144d8491a825f0804e09c671c, type: 3}
+ m_Name:
+ m_EditorClassIdentifier:
+ m_Material: {fileID: 0}
+ m_Color: {r: 1, g: 1, b: 1, a: 1}
+ m_RaycastTarget: 1
+ m_OnCullStateChanged:
+ m_PersistentCalls:
+ m_Calls: []
+ m_TypeName: UnityEngine.UI.MaskableGraphic+CullStateChangedEvent, UnityEngine.UI,
+ Version=1.0.0.0, Culture=neutral, PublicKeyToken=null
+ m_Sprite: {fileID: 21300000, guid: 74358f5fb13a549aabac4a5a7ac76739, type: 3}
+ m_Type: 0
+ m_PreserveAspect: 0
+ m_FillCenter: 1
+ m_FillMethod: 4
+ m_FillAmount: 1
+ m_FillClockwise: 1
+ m_FillOrigin: 0
+--- !u!114 &114421075155369980
+MonoBehaviour:
+ m_ObjectHideFlags: 1
+ m_PrefabParentObject: {fileID: 0}
+ m_PrefabInternal: {fileID: 100100000}
+ m_GameObject: {fileID: 1289376599481394}
+ m_Enabled: 1
+ m_EditorHideFlags: 0
+ m_Script: {fileID: 1392445389, guid: f70555f144d8491a825f0804e09c671c, type: 3}
+ m_Name:
+ m_EditorClassIdentifier:
+ m_Navigation:
+ m_Mode: 3
+ m_SelectOnUp: {fileID: 0}
+ m_SelectOnDown: {fileID: 0}
+ m_SelectOnLeft: {fileID: 0}
+ m_SelectOnRight: {fileID: 0}
+ m_Transition: 1
+ m_Colors:
+ m_NormalColor: {r: 1, g: 1, b: 1, a: 1}
+ m_HighlightedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1}
+ m_PressedColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 1}
+ m_DisabledColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 0.5019608}
+ m_ColorMultiplier: 1
+ m_FadeDuration: 0.1
+ m_SpriteState:
+ m_HighlightedSprite: {fileID: 0}
+ m_PressedSprite: {fileID: 0}
+ m_DisabledSprite: {fileID: 0}
+ m_AnimationTriggers:
+ m_NormalTrigger: Normal
+ m_HighlightedTrigger: Highlighted
+ m_PressedTrigger: Pressed
+ m_DisabledTrigger: Disabled
+ m_Interactable: 1
+ m_TargetGraphic: {fileID: 114315551303721412}
+ m_OnClick:
+ m_PersistentCalls:
+ m_Calls: []
+ m_TypeName: UnityEngine.UI.Button+ButtonClickedEvent, UnityEngine.UI, Version=1.0.0.0,
+ Culture=neutral, PublicKeyToken=null
+--- !u!114 &114696334858063158
+MonoBehaviour:
+ m_ObjectHideFlags: 1
+ m_PrefabParentObject: {fileID: 0}
+ m_PrefabInternal: {fileID: 100100000}
+ m_GameObject: {fileID: 1693671887655770}
+ m_Enabled: 1
+ m_EditorHideFlags: 0
+ m_Script: {fileID: 1301386320, guid: f70555f144d8491a825f0804e09c671c, type: 3}
+ m_Name:
+ m_EditorClassIdentifier:
+ m_IgnoreReversedGraphics: 1
+ m_BlockingObjects: 0
+ m_BlockingMask:
+ serializedVersion: 2
+ m_Bits: 4294967295
+--- !u!222 &222144676729818894
+CanvasRenderer:
+ m_ObjectHideFlags: 1
+ m_PrefabParentObject: {fileID: 0}
+ m_PrefabInternal: {fileID: 100100000}
+ m_GameObject: {fileID: 1289376599481394}
+--- !u!223 &223952169128518932
+Canvas:
+ m_ObjectHideFlags: 1
+ m_PrefabParentObject: {fileID: 0}
+ m_PrefabInternal: {fileID: 100100000}
+ m_GameObject: {fileID: 1693671887655770}
+ m_Enabled: 1
+ serializedVersion: 3
+ m_RenderMode: 0
+ m_Camera: {fileID: 0}
+ m_PlaneDistance: 100
+ m_PixelPerfect: 0
+ m_ReceivesEvents: 1
+ m_OverrideSorting: 0
+ m_OverridePixelPerfect: 0
+ m_SortingBucketNormalizedSize: 0
+ m_AdditionalShaderChannelsFlag: 0
+ m_SortingLayerID: 0
+ m_SortingOrder: 0
+ m_TargetDisplay: 0
+--- !u!224 &224276549256597394
+RectTransform:
+ m_ObjectHideFlags: 1
+ m_PrefabParentObject: {fileID: 0}
+ m_PrefabInternal: {fileID: 100100000}
+ m_GameObject: {fileID: 1693671887655770}
+ m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
+ m_LocalPosition: {x: 0, y: 0, z: 0}
+ m_LocalScale: {x: 0, y: 0, z: 0}
+ m_Children:
+ - {fileID: 224722748174579388}
+ m_Father: {fileID: 0}
+ m_RootOrder: 0
+ m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
+ m_AnchorMin: {x: 0, y: 0}
+ m_AnchorMax: {x: 0, y: 0}
+ m_AnchoredPosition: {x: 0, y: 0}
+ m_SizeDelta: {x: 0, y: 0}
+ m_Pivot: {x: 0, y: 0}
+--- !u!224 &224722748174579388
+RectTransform:
+ m_ObjectHideFlags: 1
+ m_PrefabParentObject: {fileID: 0}
+ m_PrefabInternal: {fileID: 100100000}
+ m_GameObject: {fileID: 1289376599481394}
+ m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
+ m_LocalPosition: {x: 0, y: 0, z: 0}
+ m_LocalScale: {x: 1, y: 1, z: 1}
+ m_Children: []
+ m_Father: {fileID: 224276549256597394}
+ m_RootOrder: 0
+ m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
+ m_AnchorMin: {x: 0.5, y: 0.5}
+ m_AnchorMax: {x: 0.5, y: 0.5}
+ m_AnchoredPosition: {x: 0, y: 0}
+ m_SizeDelta: {x: 675, y: 85}
+ m_Pivot: {x: 0.5, y: 0.5}
diff --git a/Assets/GoogleMobileAds/Editor/Resources/PlaceholderAds/Banners/FULL_BANNER.prefab.meta b/Assets/GoogleMobileAds/Editor/Resources/PlaceholderAds/Banners/FULL_BANNER.prefab.meta
new file mode 100644
index 0000000..b98e143
--- /dev/null
+++ b/Assets/GoogleMobileAds/Editor/Resources/PlaceholderAds/Banners/FULL_BANNER.prefab.meta
@@ -0,0 +1,13 @@
+fileFormatVersion: 2
+guid: a01bd5a6d0f504aecb61dad504950abd
+labels:
+- gvh
+- gvh_version-10.6.0
+- gvhp_exportpath-GoogleMobileAds/Editor/Resources/PlaceholderAds/Banners/FULL_BANNER.prefab
+timeCreated: 1480838400
+NativeFormatImporter:
+ externalObjects: {}
+ mainObjectFileID: 100100000
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/GoogleMobileAds/Editor/Resources/PlaceholderAds/Banners/LARGE_BANNER.prefab b/Assets/GoogleMobileAds/Editor/Resources/PlaceholderAds/Banners/LARGE_BANNER.prefab
new file mode 100644
index 0000000..baa2cbd
--- /dev/null
+++ b/Assets/GoogleMobileAds/Editor/Resources/PlaceholderAds/Banners/LARGE_BANNER.prefab
@@ -0,0 +1,217 @@
+%YAML 1.1
+%TAG !u! tag:unity3d.com,2011:
+--- !u!1001 &100100000
+Prefab:
+ m_ObjectHideFlags: 1
+ serializedVersion: 2
+ m_Modification:
+ m_TransformParent: {fileID: 0}
+ m_Modifications: []
+ m_RemovedComponents: []
+ m_ParentPrefab: {fileID: 0}
+ m_RootGameObject: {fileID: 1689999242186388}
+ m_IsPrefabParent: 1
+--- !u!1 &1260121452411016
+GameObject:
+ m_ObjectHideFlags: 0
+ m_PrefabParentObject: {fileID: 0}
+ m_PrefabInternal: {fileID: 100100000}
+ serializedVersion: 5
+ m_Component:
+ - component: {fileID: 224967535306520620}
+ - component: {fileID: 222213910864577190}
+ - component: {fileID: 114252159333637556}
+ - component: {fileID: 114791891126826622}
+ m_Layer: 5
+ m_Name: Image
+ m_TagString: Untagged
+ m_Icon: {fileID: 0}
+ m_NavMeshLayer: 0
+ m_StaticEditorFlags: 0
+ m_IsActive: 1
+--- !u!1 &1689999242186388
+GameObject:
+ m_ObjectHideFlags: 0
+ m_PrefabParentObject: {fileID: 0}
+ m_PrefabInternal: {fileID: 100100000}
+ serializedVersion: 5
+ m_Component:
+ - component: {fileID: 224970415831850420}
+ - component: {fileID: 223744438911749882}
+ - component: {fileID: 114831681655494918}
+ - component: {fileID: 114428819205255628}
+ m_Layer: 5
+ m_Name: LARGE_BANNER
+ m_TagString: Untagged
+ m_Icon: {fileID: 0}
+ m_NavMeshLayer: 0
+ m_StaticEditorFlags: 0
+ m_IsActive: 1
+--- !u!114 &114252159333637556
+MonoBehaviour:
+ m_ObjectHideFlags: 1
+ m_PrefabParentObject: {fileID: 0}
+ m_PrefabInternal: {fileID: 100100000}
+ m_GameObject: {fileID: 1260121452411016}
+ m_Enabled: 1
+ m_EditorHideFlags: 0
+ m_Script: {fileID: -765806418, guid: f70555f144d8491a825f0804e09c671c, type: 3}
+ m_Name:
+ m_EditorClassIdentifier:
+ m_Material: {fileID: 0}
+ m_Color: {r: 1, g: 1, b: 1, a: 1}
+ m_RaycastTarget: 1
+ m_OnCullStateChanged:
+ m_PersistentCalls:
+ m_Calls: []
+ m_TypeName: UnityEngine.UI.MaskableGraphic+CullStateChangedEvent, UnityEngine.UI,
+ Version=1.0.0.0, Culture=neutral, PublicKeyToken=null
+ m_Sprite: {fileID: 21300000, guid: 1a2723ddf964e4565a408007ab387283, type: 3}
+ m_Type: 0
+ m_PreserveAspect: 0
+ m_FillCenter: 1
+ m_FillMethod: 4
+ m_FillAmount: 1
+ m_FillClockwise: 1
+ m_FillOrigin: 0
+--- !u!114 &114428819205255628
+MonoBehaviour:
+ m_ObjectHideFlags: 1
+ m_PrefabParentObject: {fileID: 0}
+ m_PrefabInternal: {fileID: 100100000}
+ m_GameObject: {fileID: 1689999242186388}
+ m_Enabled: 1
+ m_EditorHideFlags: 0
+ m_Script: {fileID: 1980459831, guid: f70555f144d8491a825f0804e09c671c, type: 3}
+ m_Name:
+ m_EditorClassIdentifier:
+ m_UiScaleMode: 1
+ m_ReferencePixelsPerUnit: 100
+ m_ScaleFactor: 1
+ m_ReferenceResolution: {x: 1440, y: 2960}
+ m_ScreenMatchMode: 0
+ m_MatchWidthOrHeight: 1
+ m_PhysicalUnit: 3
+ m_FallbackScreenDPI: 96
+ m_DefaultSpriteDPI: 96
+ m_DynamicPixelsPerUnit: 1
+--- !u!114 &114791891126826622
+MonoBehaviour:
+ m_ObjectHideFlags: 1
+ m_PrefabParentObject: {fileID: 0}
+ m_PrefabInternal: {fileID: 100100000}
+ m_GameObject: {fileID: 1260121452411016}
+ m_Enabled: 1
+ m_EditorHideFlags: 0
+ m_Script: {fileID: 1392445389, guid: f70555f144d8491a825f0804e09c671c, type: 3}
+ m_Name:
+ m_EditorClassIdentifier:
+ m_Navigation:
+ m_Mode: 3
+ m_SelectOnUp: {fileID: 0}
+ m_SelectOnDown: {fileID: 0}
+ m_SelectOnLeft: {fileID: 0}
+ m_SelectOnRight: {fileID: 0}
+ m_Transition: 1
+ m_Colors:
+ m_NormalColor: {r: 1, g: 1, b: 1, a: 1}
+ m_HighlightedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1}
+ m_PressedColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 1}
+ m_DisabledColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 0.5019608}
+ m_ColorMultiplier: 1
+ m_FadeDuration: 0.1
+ m_SpriteState:
+ m_HighlightedSprite: {fileID: 0}
+ m_PressedSprite: {fileID: 0}
+ m_DisabledSprite: {fileID: 0}
+ m_AnimationTriggers:
+ m_NormalTrigger: Normal
+ m_HighlightedTrigger: Highlighted
+ m_PressedTrigger: Pressed
+ m_DisabledTrigger: Disabled
+ m_Interactable: 1
+ m_TargetGraphic: {fileID: 114252159333637556}
+ m_OnClick:
+ m_PersistentCalls:
+ m_Calls: []
+ m_TypeName: UnityEngine.UI.Button+ButtonClickedEvent, UnityEngine.UI, Version=1.0.0.0,
+ Culture=neutral, PublicKeyToken=null
+--- !u!114 &114831681655494918
+MonoBehaviour:
+ m_ObjectHideFlags: 1
+ m_PrefabParentObject: {fileID: 0}
+ m_PrefabInternal: {fileID: 100100000}
+ m_GameObject: {fileID: 1689999242186388}
+ m_Enabled: 1
+ m_EditorHideFlags: 0
+ m_Script: {fileID: 1301386320, guid: f70555f144d8491a825f0804e09c671c, type: 3}
+ m_Name:
+ m_EditorClassIdentifier:
+ m_IgnoreReversedGraphics: 1
+ m_BlockingObjects: 0
+ m_BlockingMask:
+ serializedVersion: 2
+ m_Bits: 4294967295
+--- !u!222 &222213910864577190
+CanvasRenderer:
+ m_ObjectHideFlags: 1
+ m_PrefabParentObject: {fileID: 0}
+ m_PrefabInternal: {fileID: 100100000}
+ m_GameObject: {fileID: 1260121452411016}
+--- !u!223 &223744438911749882
+Canvas:
+ m_ObjectHideFlags: 1
+ m_PrefabParentObject: {fileID: 0}
+ m_PrefabInternal: {fileID: 100100000}
+ m_GameObject: {fileID: 1689999242186388}
+ m_Enabled: 1
+ serializedVersion: 3
+ m_RenderMode: 0
+ m_Camera: {fileID: 0}
+ m_PlaneDistance: 100
+ m_PixelPerfect: 0
+ m_ReceivesEvents: 1
+ m_OverrideSorting: 0
+ m_OverridePixelPerfect: 0
+ m_SortingBucketNormalizedSize: 0
+ m_AdditionalShaderChannelsFlag: 0
+ m_SortingLayerID: 0
+ m_SortingOrder: 0
+ m_TargetDisplay: 0
+--- !u!224 &224967535306520620
+RectTransform:
+ m_ObjectHideFlags: 1
+ m_PrefabParentObject: {fileID: 0}
+ m_PrefabInternal: {fileID: 100100000}
+ m_GameObject: {fileID: 1260121452411016}
+ m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
+ m_LocalPosition: {x: 0, y: 0, z: 0}
+ m_LocalScale: {x: 1, y: 1, z: 1}
+ m_Children: []
+ m_Father: {fileID: 224970415831850420}
+ m_RootOrder: 0
+ m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
+ m_AnchorMin: {x: 0.5, y: 0.5}
+ m_AnchorMax: {x: 0.5, y: 0.5}
+ m_AnchoredPosition: {x: 0, y: 0}
+ m_SizeDelta: {x: 950, y: 295}
+ m_Pivot: {x: 0.5, y: 0.5}
+--- !u!224 &224970415831850420
+RectTransform:
+ m_ObjectHideFlags: 1
+ m_PrefabParentObject: {fileID: 0}
+ m_PrefabInternal: {fileID: 100100000}
+ m_GameObject: {fileID: 1689999242186388}
+ m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
+ m_LocalPosition: {x: 0, y: 0, z: 0}
+ m_LocalScale: {x: 0, y: 0, z: 0}
+ m_Children:
+ - {fileID: 224967535306520620}
+ m_Father: {fileID: 0}
+ m_RootOrder: 0
+ m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
+ m_AnchorMin: {x: 0, y: 0}
+ m_AnchorMax: {x: 0, y: 0}
+ m_AnchoredPosition: {x: 0, y: 0}
+ m_SizeDelta: {x: 0, y: 0}
+ m_Pivot: {x: 0, y: 0}
diff --git a/Assets/GoogleMobileAds/Editor/Resources/PlaceholderAds/Banners/LARGE_BANNER.prefab.meta b/Assets/GoogleMobileAds/Editor/Resources/PlaceholderAds/Banners/LARGE_BANNER.prefab.meta
new file mode 100644
index 0000000..48f2297
--- /dev/null
+++ b/Assets/GoogleMobileAds/Editor/Resources/PlaceholderAds/Banners/LARGE_BANNER.prefab.meta
@@ -0,0 +1,13 @@
+fileFormatVersion: 2
+guid: 2758392ec5c0c413886eaf50350c125e
+labels:
+- gvh
+- gvh_version-10.6.0
+- gvhp_exportpath-GoogleMobileAds/Editor/Resources/PlaceholderAds/Banners/LARGE_BANNER.prefab
+timeCreated: 1480838400
+NativeFormatImporter:
+ externalObjects: {}
+ mainObjectFileID: 100100000
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/GoogleMobileAds/Editor/Resources/PlaceholderAds/Banners/LEADERBOARD.prefab b/Assets/GoogleMobileAds/Editor/Resources/PlaceholderAds/Banners/LEADERBOARD.prefab
new file mode 100644
index 0000000..5a586ac
--- /dev/null
+++ b/Assets/GoogleMobileAds/Editor/Resources/PlaceholderAds/Banners/LEADERBOARD.prefab
@@ -0,0 +1,217 @@
+%YAML 1.1
+%TAG !u! tag:unity3d.com,2011:
+--- !u!1001 &100100000
+Prefab:
+ m_ObjectHideFlags: 1
+ serializedVersion: 2
+ m_Modification:
+ m_TransformParent: {fileID: 0}
+ m_Modifications: []
+ m_RemovedComponents: []
+ m_ParentPrefab: {fileID: 0}
+ m_RootGameObject: {fileID: 1972469136070810}
+ m_IsPrefabParent: 1
+--- !u!1 &1183579264172830
+GameObject:
+ m_ObjectHideFlags: 0
+ m_PrefabParentObject: {fileID: 0}
+ m_PrefabInternal: {fileID: 100100000}
+ serializedVersion: 5
+ m_Component:
+ - component: {fileID: 224697483211628194}
+ - component: {fileID: 222129017442517786}
+ - component: {fileID: 114721459383001118}
+ - component: {fileID: 114677129427402038}
+ m_Layer: 5
+ m_Name: Image
+ m_TagString: Untagged
+ m_Icon: {fileID: 0}
+ m_NavMeshLayer: 0
+ m_StaticEditorFlags: 0
+ m_IsActive: 1
+--- !u!1 &1972469136070810
+GameObject:
+ m_ObjectHideFlags: 0
+ m_PrefabParentObject: {fileID: 0}
+ m_PrefabInternal: {fileID: 100100000}
+ serializedVersion: 5
+ m_Component:
+ - component: {fileID: 224006990116994490}
+ - component: {fileID: 223012850224642572}
+ - component: {fileID: 114471196217915594}
+ - component: {fileID: 114399773188946396}
+ m_Layer: 5
+ m_Name: LEADERBOARD
+ m_TagString: Untagged
+ m_Icon: {fileID: 0}
+ m_NavMeshLayer: 0
+ m_StaticEditorFlags: 0
+ m_IsActive: 1
+--- !u!114 &114399773188946396
+MonoBehaviour:
+ m_ObjectHideFlags: 1
+ m_PrefabParentObject: {fileID: 0}
+ m_PrefabInternal: {fileID: 100100000}
+ m_GameObject: {fileID: 1972469136070810}
+ m_Enabled: 1
+ m_EditorHideFlags: 0
+ m_Script: {fileID: 1980459831, guid: f70555f144d8491a825f0804e09c671c, type: 3}
+ m_Name:
+ m_EditorClassIdentifier:
+ m_UiScaleMode: 1
+ m_ReferencePixelsPerUnit: 100
+ m_ScaleFactor: 1
+ m_ReferenceResolution: {x: 2960, y: 1440}
+ m_ScreenMatchMode: 0
+ m_MatchWidthOrHeight: 1
+ m_PhysicalUnit: 3
+ m_FallbackScreenDPI: 96
+ m_DefaultSpriteDPI: 96
+ m_DynamicPixelsPerUnit: 1
+--- !u!114 &114471196217915594
+MonoBehaviour:
+ m_ObjectHideFlags: 1
+ m_PrefabParentObject: {fileID: 0}
+ m_PrefabInternal: {fileID: 100100000}
+ m_GameObject: {fileID: 1972469136070810}
+ m_Enabled: 1
+ m_EditorHideFlags: 0
+ m_Script: {fileID: 1301386320, guid: f70555f144d8491a825f0804e09c671c, type: 3}
+ m_Name:
+ m_EditorClassIdentifier:
+ m_IgnoreReversedGraphics: 1
+ m_BlockingObjects: 0
+ m_BlockingMask:
+ serializedVersion: 2
+ m_Bits: 4294967295
+--- !u!114 &114677129427402038
+MonoBehaviour:
+ m_ObjectHideFlags: 1
+ m_PrefabParentObject: {fileID: 0}
+ m_PrefabInternal: {fileID: 100100000}
+ m_GameObject: {fileID: 1183579264172830}
+ m_Enabled: 1
+ m_EditorHideFlags: 0
+ m_Script: {fileID: 1392445389, guid: f70555f144d8491a825f0804e09c671c, type: 3}
+ m_Name:
+ m_EditorClassIdentifier:
+ m_Navigation:
+ m_Mode: 3
+ m_SelectOnUp: {fileID: 0}
+ m_SelectOnDown: {fileID: 0}
+ m_SelectOnLeft: {fileID: 0}
+ m_SelectOnRight: {fileID: 0}
+ m_Transition: 1
+ m_Colors:
+ m_NormalColor: {r: 1, g: 1, b: 1, a: 1}
+ m_HighlightedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1}
+ m_PressedColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 1}
+ m_DisabledColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 0.5019608}
+ m_ColorMultiplier: 1
+ m_FadeDuration: 0.1
+ m_SpriteState:
+ m_HighlightedSprite: {fileID: 0}
+ m_PressedSprite: {fileID: 0}
+ m_DisabledSprite: {fileID: 0}
+ m_AnimationTriggers:
+ m_NormalTrigger: Normal
+ m_HighlightedTrigger: Highlighted
+ m_PressedTrigger: Pressed
+ m_DisabledTrigger: Disabled
+ m_Interactable: 1
+ m_TargetGraphic: {fileID: 114721459383001118}
+ m_OnClick:
+ m_PersistentCalls:
+ m_Calls: []
+ m_TypeName: UnityEngine.UI.Button+ButtonClickedEvent, UnityEngine.UI, Version=1.0.0.0,
+ Culture=neutral, PublicKeyToken=null
+--- !u!114 &114721459383001118
+MonoBehaviour:
+ m_ObjectHideFlags: 1
+ m_PrefabParentObject: {fileID: 0}
+ m_PrefabInternal: {fileID: 100100000}
+ m_GameObject: {fileID: 1183579264172830}
+ m_Enabled: 1
+ m_EditorHideFlags: 0
+ m_Script: {fileID: -765806418, guid: f70555f144d8491a825f0804e09c671c, type: 3}
+ m_Name:
+ m_EditorClassIdentifier:
+ m_Material: {fileID: 0}
+ m_Color: {r: 1, g: 1, b: 1, a: 1}
+ m_RaycastTarget: 1
+ m_OnCullStateChanged:
+ m_PersistentCalls:
+ m_Calls: []
+ m_TypeName: UnityEngine.UI.MaskableGraphic+CullStateChangedEvent, UnityEngine.UI,
+ Version=1.0.0.0, Culture=neutral, PublicKeyToken=null
+ m_Sprite: {fileID: 21300000, guid: cfead63ff9d9d48e2b4ba3c2dee7cea9, type: 3}
+ m_Type: 0
+ m_PreserveAspect: 0
+ m_FillCenter: 1
+ m_FillMethod: 4
+ m_FillAmount: 1
+ m_FillClockwise: 1
+ m_FillOrigin: 0
+--- !u!222 &222129017442517786
+CanvasRenderer:
+ m_ObjectHideFlags: 1
+ m_PrefabParentObject: {fileID: 0}
+ m_PrefabInternal: {fileID: 100100000}
+ m_GameObject: {fileID: 1183579264172830}
+--- !u!223 &223012850224642572
+Canvas:
+ m_ObjectHideFlags: 1
+ m_PrefabParentObject: {fileID: 0}
+ m_PrefabInternal: {fileID: 100100000}
+ m_GameObject: {fileID: 1972469136070810}
+ m_Enabled: 1
+ serializedVersion: 3
+ m_RenderMode: 0
+ m_Camera: {fileID: 0}
+ m_PlaneDistance: 100
+ m_PixelPerfect: 0
+ m_ReceivesEvents: 1
+ m_OverrideSorting: 0
+ m_OverridePixelPerfect: 0
+ m_SortingBucketNormalizedSize: 0
+ m_AdditionalShaderChannelsFlag: 0
+ m_SortingLayerID: 0
+ m_SortingOrder: 0
+ m_TargetDisplay: 0
+--- !u!224 &224006990116994490
+RectTransform:
+ m_ObjectHideFlags: 1
+ m_PrefabParentObject: {fileID: 0}
+ m_PrefabInternal: {fileID: 100100000}
+ m_GameObject: {fileID: 1972469136070810}
+ m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
+ m_LocalPosition: {x: 0, y: 0, z: 0}
+ m_LocalScale: {x: 0, y: 0, z: 0}
+ m_Children:
+ - {fileID: 224697483211628194}
+ m_Father: {fileID: 0}
+ m_RootOrder: 0
+ m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
+ m_AnchorMin: {x: 0, y: 0}
+ m_AnchorMax: {x: 0, y: 0}
+ m_AnchoredPosition: {x: 0, y: 0}
+ m_SizeDelta: {x: 0, y: 0}
+ m_Pivot: {x: 0, y: 0}
+--- !u!224 &224697483211628194
+RectTransform:
+ m_ObjectHideFlags: 1
+ m_PrefabParentObject: {fileID: 0}
+ m_PrefabInternal: {fileID: 100100000}
+ m_GameObject: {fileID: 1183579264172830}
+ m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
+ m_LocalPosition: {x: 0, y: 0, z: 0}
+ m_LocalScale: {x: 1, y: 1, z: 1}
+ m_Children: []
+ m_Father: {fileID: 224006990116994490}
+ m_RootOrder: 0
+ m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
+ m_AnchorMin: {x: 0.5, y: 0.5}
+ m_AnchorMax: {x: 0.5, y: 0.5}
+ m_AnchoredPosition: {x: 0, y: 0}
+ m_SizeDelta: {x: 1050, y: 130}
+ m_Pivot: {x: 0.5, y: 0.5}
diff --git a/Assets/GoogleMobileAds/Editor/Resources/PlaceholderAds/Banners/LEADERBOARD.prefab.meta b/Assets/GoogleMobileAds/Editor/Resources/PlaceholderAds/Banners/LEADERBOARD.prefab.meta
new file mode 100644
index 0000000..cf36ed9
--- /dev/null
+++ b/Assets/GoogleMobileAds/Editor/Resources/PlaceholderAds/Banners/LEADERBOARD.prefab.meta
@@ -0,0 +1,13 @@
+fileFormatVersion: 2
+guid: 60a76727b740d485fa446352e56931c5
+labels:
+- gvh
+- gvh_version-10.6.0
+- gvhp_exportpath-GoogleMobileAds/Editor/Resources/PlaceholderAds/Banners/LEADERBOARD.prefab
+timeCreated: 1480838400
+NativeFormatImporter:
+ externalObjects: {}
+ mainObjectFileID: 100100000
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/GoogleMobileAds/Editor/Resources/PlaceholderAds/Banners/MEDIUM_RECTANGLE.prefab b/Assets/GoogleMobileAds/Editor/Resources/PlaceholderAds/Banners/MEDIUM_RECTANGLE.prefab
new file mode 100644
index 0000000..a6edd0f
--- /dev/null
+++ b/Assets/GoogleMobileAds/Editor/Resources/PlaceholderAds/Banners/MEDIUM_RECTANGLE.prefab
@@ -0,0 +1,217 @@
+%YAML 1.1
+%TAG !u! tag:unity3d.com,2011:
+--- !u!1001 &100100000
+Prefab:
+ m_ObjectHideFlags: 1
+ serializedVersion: 2
+ m_Modification:
+ m_TransformParent: {fileID: 0}
+ m_Modifications: []
+ m_RemovedComponents: []
+ m_ParentPrefab: {fileID: 0}
+ m_RootGameObject: {fileID: 1512588571484440}
+ m_IsPrefabParent: 1
+--- !u!1 &1512588571484440
+GameObject:
+ m_ObjectHideFlags: 0
+ m_PrefabParentObject: {fileID: 0}
+ m_PrefabInternal: {fileID: 100100000}
+ serializedVersion: 5
+ m_Component:
+ - component: {fileID: 224538654718470302}
+ - component: {fileID: 223629559242470952}
+ - component: {fileID: 114983991128439442}
+ - component: {fileID: 114372880593303924}
+ m_Layer: 5
+ m_Name: MEDIUM_RECTANGLE
+ m_TagString: Untagged
+ m_Icon: {fileID: 0}
+ m_NavMeshLayer: 0
+ m_StaticEditorFlags: 0
+ m_IsActive: 1
+--- !u!1 &1995456870296158
+GameObject:
+ m_ObjectHideFlags: 0
+ m_PrefabParentObject: {fileID: 0}
+ m_PrefabInternal: {fileID: 100100000}
+ serializedVersion: 5
+ m_Component:
+ - component: {fileID: 224894678874208494}
+ - component: {fileID: 222075172098901274}
+ - component: {fileID: 114038968471933872}
+ - component: {fileID: 114975822294336148}
+ m_Layer: 5
+ m_Name: Image
+ m_TagString: Untagged
+ m_Icon: {fileID: 0}
+ m_NavMeshLayer: 0
+ m_StaticEditorFlags: 0
+ m_IsActive: 1
+--- !u!114 &114038968471933872
+MonoBehaviour:
+ m_ObjectHideFlags: 1
+ m_PrefabParentObject: {fileID: 0}
+ m_PrefabInternal: {fileID: 100100000}
+ m_GameObject: {fileID: 1995456870296158}
+ m_Enabled: 1
+ m_EditorHideFlags: 0
+ m_Script: {fileID: -765806418, guid: f70555f144d8491a825f0804e09c671c, type: 3}
+ m_Name:
+ m_EditorClassIdentifier:
+ m_Material: {fileID: 0}
+ m_Color: {r: 1, g: 1, b: 1, a: 1}
+ m_RaycastTarget: 1
+ m_OnCullStateChanged:
+ m_PersistentCalls:
+ m_Calls: []
+ m_TypeName: UnityEngine.UI.MaskableGraphic+CullStateChangedEvent, UnityEngine.UI,
+ Version=1.0.0.0, Culture=neutral, PublicKeyToken=null
+ m_Sprite: {fileID: 21300000, guid: 898f886a39d714db5b90d2c36676c894, type: 3}
+ m_Type: 0
+ m_PreserveAspect: 0
+ m_FillCenter: 1
+ m_FillMethod: 4
+ m_FillAmount: 1
+ m_FillClockwise: 1
+ m_FillOrigin: 0
+--- !u!114 &114372880593303924
+MonoBehaviour:
+ m_ObjectHideFlags: 1
+ m_PrefabParentObject: {fileID: 0}
+ m_PrefabInternal: {fileID: 100100000}
+ m_GameObject: {fileID: 1512588571484440}
+ m_Enabled: 1
+ m_EditorHideFlags: 0
+ m_Script: {fileID: 1980459831, guid: f70555f144d8491a825f0804e09c671c, type: 3}
+ m_Name:
+ m_EditorClassIdentifier:
+ m_UiScaleMode: 1
+ m_ReferencePixelsPerUnit: 100
+ m_ScaleFactor: 1
+ m_ReferenceResolution: {x: 2160, y: 1080}
+ m_ScreenMatchMode: 0
+ m_MatchWidthOrHeight: 1
+ m_PhysicalUnit: 3
+ m_FallbackScreenDPI: 96
+ m_DefaultSpriteDPI: 96
+ m_DynamicPixelsPerUnit: 1
+--- !u!114 &114975822294336148
+MonoBehaviour:
+ m_ObjectHideFlags: 1
+ m_PrefabParentObject: {fileID: 0}
+ m_PrefabInternal: {fileID: 100100000}
+ m_GameObject: {fileID: 1995456870296158}
+ m_Enabled: 1
+ m_EditorHideFlags: 0
+ m_Script: {fileID: 1392445389, guid: f70555f144d8491a825f0804e09c671c, type: 3}
+ m_Name:
+ m_EditorClassIdentifier:
+ m_Navigation:
+ m_Mode: 3
+ m_SelectOnUp: {fileID: 0}
+ m_SelectOnDown: {fileID: 0}
+ m_SelectOnLeft: {fileID: 0}
+ m_SelectOnRight: {fileID: 0}
+ m_Transition: 1
+ m_Colors:
+ m_NormalColor: {r: 1, g: 1, b: 1, a: 1}
+ m_HighlightedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1}
+ m_PressedColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 1}
+ m_DisabledColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 0.5019608}
+ m_ColorMultiplier: 1
+ m_FadeDuration: 0.1
+ m_SpriteState:
+ m_HighlightedSprite: {fileID: 0}
+ m_PressedSprite: {fileID: 0}
+ m_DisabledSprite: {fileID: 0}
+ m_AnimationTriggers:
+ m_NormalTrigger: Normal
+ m_HighlightedTrigger: Highlighted
+ m_PressedTrigger: Pressed
+ m_DisabledTrigger: Disabled
+ m_Interactable: 1
+ m_TargetGraphic: {fileID: 114038968471933872}
+ m_OnClick:
+ m_PersistentCalls:
+ m_Calls: []
+ m_TypeName: UnityEngine.UI.Button+ButtonClickedEvent, UnityEngine.UI, Version=1.0.0.0,
+ Culture=neutral, PublicKeyToken=null
+--- !u!114 &114983991128439442
+MonoBehaviour:
+ m_ObjectHideFlags: 1
+ m_PrefabParentObject: {fileID: 0}
+ m_PrefabInternal: {fileID: 100100000}
+ m_GameObject: {fileID: 1512588571484440}
+ m_Enabled: 1
+ m_EditorHideFlags: 0
+ m_Script: {fileID: 1301386320, guid: f70555f144d8491a825f0804e09c671c, type: 3}
+ m_Name:
+ m_EditorClassIdentifier:
+ m_IgnoreReversedGraphics: 1
+ m_BlockingObjects: 0
+ m_BlockingMask:
+ serializedVersion: 2
+ m_Bits: 4294967295
+--- !u!222 &222075172098901274
+CanvasRenderer:
+ m_ObjectHideFlags: 1
+ m_PrefabParentObject: {fileID: 0}
+ m_PrefabInternal: {fileID: 100100000}
+ m_GameObject: {fileID: 1995456870296158}
+--- !u!223 &223629559242470952
+Canvas:
+ m_ObjectHideFlags: 1
+ m_PrefabParentObject: {fileID: 0}
+ m_PrefabInternal: {fileID: 100100000}
+ m_GameObject: {fileID: 1512588571484440}
+ m_Enabled: 1
+ serializedVersion: 3
+ m_RenderMode: 0
+ m_Camera: {fileID: 0}
+ m_PlaneDistance: 100
+ m_PixelPerfect: 0
+ m_ReceivesEvents: 1
+ m_OverrideSorting: 0
+ m_OverridePixelPerfect: 0
+ m_SortingBucketNormalizedSize: 0
+ m_AdditionalShaderChannelsFlag: 0
+ m_SortingLayerID: 0
+ m_SortingOrder: 0
+ m_TargetDisplay: 0
+--- !u!224 &224538654718470302
+RectTransform:
+ m_ObjectHideFlags: 1
+ m_PrefabParentObject: {fileID: 0}
+ m_PrefabInternal: {fileID: 100100000}
+ m_GameObject: {fileID: 1512588571484440}
+ m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
+ m_LocalPosition: {x: 0, y: 0, z: 0}
+ m_LocalScale: {x: 0, y: 0, z: 0}
+ m_Children:
+ - {fileID: 224894678874208494}
+ m_Father: {fileID: 0}
+ m_RootOrder: 0
+ m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
+ m_AnchorMin: {x: 0, y: 0}
+ m_AnchorMax: {x: 0, y: 0}
+ m_AnchoredPosition: {x: 0, y: 0}
+ m_SizeDelta: {x: 0, y: 0}
+ m_Pivot: {x: 0, y: 0}
+--- !u!224 &224894678874208494
+RectTransform:
+ m_ObjectHideFlags: 1
+ m_PrefabParentObject: {fileID: 0}
+ m_PrefabInternal: {fileID: 100100000}
+ m_GameObject: {fileID: 1995456870296158}
+ m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
+ m_LocalPosition: {x: 0, y: 0, z: 0}
+ m_LocalScale: {x: 1, y: 1, z: 1}
+ m_Children: []
+ m_Father: {fileID: 224538654718470302}
+ m_RootOrder: 0
+ m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
+ m_AnchorMin: {x: 0.5, y: 0}
+ m_AnchorMax: {x: 0.5, y: 0}
+ m_AnchoredPosition: {x: 0, y: 135}
+ m_SizeDelta: {x: 322, y: 270}
+ m_Pivot: {x: 0.5, y: 0.5}
diff --git a/Assets/GoogleMobileAds/Editor/Resources/PlaceholderAds/Banners/MEDIUM_RECTANGLE.prefab.meta b/Assets/GoogleMobileAds/Editor/Resources/PlaceholderAds/Banners/MEDIUM_RECTANGLE.prefab.meta
new file mode 100644
index 0000000..0e00443
--- /dev/null
+++ b/Assets/GoogleMobileAds/Editor/Resources/PlaceholderAds/Banners/MEDIUM_RECTANGLE.prefab.meta
@@ -0,0 +1,13 @@
+fileFormatVersion: 2
+guid: da3156337d5ca4d529cf72f8b467823b
+labels:
+- gvh
+- gvh_version-10.6.0
+- gvhp_exportpath-GoogleMobileAds/Editor/Resources/PlaceholderAds/Banners/MEDIUM_RECTANGLE.prefab
+timeCreated: 1480838400
+NativeFormatImporter:
+ externalObjects: {}
+ mainObjectFileID: 100100000
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/GoogleMobileAds/Editor/Resources/PlaceholderAds/Banners/SMART_BANNER.prefab b/Assets/GoogleMobileAds/Editor/Resources/PlaceholderAds/Banners/SMART_BANNER.prefab
new file mode 100644
index 0000000..8221f02
--- /dev/null
+++ b/Assets/GoogleMobileAds/Editor/Resources/PlaceholderAds/Banners/SMART_BANNER.prefab
@@ -0,0 +1,292 @@
+%YAML 1.1
+%TAG !u! tag:unity3d.com,2011:
+--- !u!1001 &100100000
+Prefab:
+ m_ObjectHideFlags: 1
+ serializedVersion: 2
+ m_Modification:
+ m_TransformParent: {fileID: 0}
+ m_Modifications: []
+ m_RemovedComponents: []
+ m_ParentPrefab: {fileID: 0}
+ m_RootGameObject: {fileID: 1853606194061450}
+ m_IsPrefabParent: 1
+--- !u!1 &1343426381164082
+GameObject:
+ m_ObjectHideFlags: 0
+ m_PrefabParentObject: {fileID: 0}
+ m_PrefabInternal: {fileID: 100100000}
+ serializedVersion: 5
+ m_Component:
+ - component: {fileID: 224490741999108352}
+ - component: {fileID: 222779771472130718}
+ - component: {fileID: 114916822656868938}
+ - component: {fileID: 114959255499348754}
+ m_Layer: 5
+ m_Name: Image
+ m_TagString: Untagged
+ m_Icon: {fileID: 0}
+ m_NavMeshLayer: 0
+ m_StaticEditorFlags: 0
+ m_IsActive: 1
+--- !u!1 &1369006202624816
+GameObject:
+ m_ObjectHideFlags: 1
+ m_PrefabParentObject: {fileID: 0}
+ m_PrefabInternal: {fileID: 100100000}
+ serializedVersion: 5
+ m_Component:
+ - component: {fileID: 224233332446998570}
+ - component: {fileID: 222910655472497136}
+ - component: {fileID: 114193057462813808}
+ m_Layer: 5
+ m_Name: Text
+ m_TagString: Untagged
+ m_Icon: {fileID: 0}
+ m_NavMeshLayer: 0
+ m_StaticEditorFlags: 0
+ m_IsActive: 1
+--- !u!1 &1853606194061450
+GameObject:
+ m_ObjectHideFlags: 0
+ m_PrefabParentObject: {fileID: 0}
+ m_PrefabInternal: {fileID: 100100000}
+ serializedVersion: 5
+ m_Component:
+ - component: {fileID: 224156852809508418}
+ - component: {fileID: 223985404539061306}
+ - component: {fileID: 114034781880355044}
+ - component: {fileID: 114616652852970184}
+ m_Layer: 5
+ m_Name: SMART_BANNER
+ m_TagString: Untagged
+ m_Icon: {fileID: 0}
+ m_NavMeshLayer: 0
+ m_StaticEditorFlags: 0
+ m_IsActive: 1
+--- !u!114 &114034781880355044
+MonoBehaviour:
+ m_ObjectHideFlags: 1
+ m_PrefabParentObject: {fileID: 0}
+ m_PrefabInternal: {fileID: 100100000}
+ m_GameObject: {fileID: 1853606194061450}
+ m_Enabled: 1
+ m_EditorHideFlags: 0
+ m_Script: {fileID: 1301386320, guid: f70555f144d8491a825f0804e09c671c, type: 3}
+ m_Name:
+ m_EditorClassIdentifier:
+ m_IgnoreReversedGraphics: 1
+ m_BlockingObjects: 0
+ m_BlockingMask:
+ serializedVersion: 2
+ m_Bits: 4294967295
+--- !u!114 &114193057462813808
+MonoBehaviour:
+ m_ObjectHideFlags: 1
+ m_PrefabParentObject: {fileID: 0}
+ m_PrefabInternal: {fileID: 100100000}
+ m_GameObject: {fileID: 1369006202624816}
+ m_Enabled: 1
+ m_EditorHideFlags: 0
+ m_Script: {fileID: 708705254, guid: f70555f144d8491a825f0804e09c671c, type: 3}
+ m_Name:
+ m_EditorClassIdentifier:
+ m_Material: {fileID: 0}
+ m_Color: {r: 0.19607843, g: 0.19607843, b: 0.19607843, a: 1}
+ m_RaycastTarget: 1
+ m_OnCullStateChanged:
+ m_PersistentCalls:
+ m_Calls: []
+ m_TypeName: UnityEngine.UI.MaskableGraphic+CullStateChangedEvent, UnityEngine.UI,
+ Version=1.0.0.0, Culture=neutral, PublicKeyToken=null
+ m_FontData:
+ m_Font: {fileID: 10102, guid: 0000000000000000e000000000000000, type: 0}
+ m_FontSize: 25
+ m_FontStyle: 1
+ m_BestFit: 1
+ m_MinSize: 20
+ m_MaxSize: 40
+ m_Alignment: 4
+ m_AlignByGeometry: 0
+ m_RichText: 1
+ m_HorizontalOverflow: 0
+ m_VerticalOverflow: 0
+ m_LineSpacing: 1
+ m_Text: This is a Test Smart Banner
+--- !u!114 &114616652852970184
+MonoBehaviour:
+ m_ObjectHideFlags: 1
+ m_PrefabParentObject: {fileID: 0}
+ m_PrefabInternal: {fileID: 100100000}
+ m_GameObject: {fileID: 1853606194061450}
+ m_Enabled: 1
+ m_EditorHideFlags: 0
+ m_Script: {fileID: 1980459831, guid: f70555f144d8491a825f0804e09c671c, type: 3}
+ m_Name:
+ m_EditorClassIdentifier:
+ m_UiScaleMode: 1
+ m_ReferencePixelsPerUnit: 100
+ m_ScaleFactor: 1
+ m_ReferenceResolution: {x: 2960, y: 1440}
+ m_ScreenMatchMode: 0
+ m_MatchWidthOrHeight: 0.5
+ m_PhysicalUnit: 3
+ m_FallbackScreenDPI: 96
+ m_DefaultSpriteDPI: 96
+ m_DynamicPixelsPerUnit: 1
+--- !u!114 &114916822656868938
+MonoBehaviour:
+ m_ObjectHideFlags: 1
+ m_PrefabParentObject: {fileID: 0}
+ m_PrefabInternal: {fileID: 100100000}
+ m_GameObject: {fileID: 1343426381164082}
+ m_Enabled: 1
+ m_EditorHideFlags: 0
+ m_Script: {fileID: -765806418, guid: f70555f144d8491a825f0804e09c671c, type: 3}
+ m_Name:
+ m_EditorClassIdentifier:
+ m_Material: {fileID: 0}
+ m_Color: {r: 1, g: 1, b: 1, a: 1}
+ m_RaycastTarget: 1
+ m_OnCullStateChanged:
+ m_PersistentCalls:
+ m_Calls: []
+ m_TypeName: UnityEngine.UI.MaskableGraphic+CullStateChangedEvent, UnityEngine.UI,
+ Version=1.0.0.0, Culture=neutral, PublicKeyToken=null
+ m_Sprite: {fileID: 0}
+ m_Type: 0
+ m_PreserveAspect: 0
+ m_FillCenter: 1
+ m_FillMethod: 4
+ m_FillAmount: 1
+ m_FillClockwise: 1
+ m_FillOrigin: 0
+--- !u!114 &114959255499348754
+MonoBehaviour:
+ m_ObjectHideFlags: 1
+ m_PrefabParentObject: {fileID: 0}
+ m_PrefabInternal: {fileID: 100100000}
+ m_GameObject: {fileID: 1343426381164082}
+ m_Enabled: 1
+ m_EditorHideFlags: 0
+ m_Script: {fileID: 1392445389, guid: f70555f144d8491a825f0804e09c671c, type: 3}
+ m_Name:
+ m_EditorClassIdentifier:
+ m_Navigation:
+ m_Mode: 3
+ m_SelectOnUp: {fileID: 0}
+ m_SelectOnDown: {fileID: 0}
+ m_SelectOnLeft: {fileID: 0}
+ m_SelectOnRight: {fileID: 0}
+ m_Transition: 1
+ m_Colors:
+ m_NormalColor: {r: 1, g: 1, b: 1, a: 1}
+ m_HighlightedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1}
+ m_PressedColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 1}
+ m_DisabledColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 0.5019608}
+ m_ColorMultiplier: 1
+ m_FadeDuration: 0.1
+ m_SpriteState:
+ m_HighlightedSprite: {fileID: 0}
+ m_PressedSprite: {fileID: 0}
+ m_DisabledSprite: {fileID: 0}
+ m_AnimationTriggers:
+ m_NormalTrigger: Normal
+ m_HighlightedTrigger: Highlighted
+ m_PressedTrigger: Pressed
+ m_DisabledTrigger: Disabled
+ m_Interactable: 1
+ m_TargetGraphic: {fileID: 114916822656868938}
+ m_OnClick:
+ m_PersistentCalls:
+ m_Calls: []
+ m_TypeName: UnityEngine.UI.Button+ButtonClickedEvent, UnityEngine.UI, Version=1.0.0.0,
+ Culture=neutral, PublicKeyToken=null
+--- !u!222 &222779771472130718
+CanvasRenderer:
+ m_ObjectHideFlags: 1
+ m_PrefabParentObject: {fileID: 0}
+ m_PrefabInternal: {fileID: 100100000}
+ m_GameObject: {fileID: 1343426381164082}
+--- !u!222 &222910655472497136
+CanvasRenderer:
+ m_ObjectHideFlags: 1
+ m_PrefabParentObject: {fileID: 0}
+ m_PrefabInternal: {fileID: 100100000}
+ m_GameObject: {fileID: 1369006202624816}
+--- !u!223 &223985404539061306
+Canvas:
+ m_ObjectHideFlags: 1
+ m_PrefabParentObject: {fileID: 0}
+ m_PrefabInternal: {fileID: 100100000}
+ m_GameObject: {fileID: 1853606194061450}
+ m_Enabled: 1
+ serializedVersion: 3
+ m_RenderMode: 0
+ m_Camera: {fileID: 0}
+ m_PlaneDistance: 100
+ m_PixelPerfect: 0
+ m_ReceivesEvents: 1
+ m_OverrideSorting: 0
+ m_OverridePixelPerfect: 0
+ m_SortingBucketNormalizedSize: 0
+ m_AdditionalShaderChannelsFlag: 0
+ m_SortingLayerID: 0
+ m_SortingOrder: 0
+ m_TargetDisplay: 0
+--- !u!224 &224156852809508418
+RectTransform:
+ m_ObjectHideFlags: 1
+ m_PrefabParentObject: {fileID: 0}
+ m_PrefabInternal: {fileID: 100100000}
+ m_GameObject: {fileID: 1853606194061450}
+ m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
+ m_LocalPosition: {x: 0, y: 0, z: 0}
+ m_LocalScale: {x: 0, y: 0, z: 0}
+ m_Children:
+ - {fileID: 224490741999108352}
+ m_Father: {fileID: 0}
+ m_RootOrder: 0
+ m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
+ m_AnchorMin: {x: 0, y: 0}
+ m_AnchorMax: {x: 0, y: 0}
+ m_AnchoredPosition: {x: 0, y: 0}
+ m_SizeDelta: {x: 0, y: 0}
+ m_Pivot: {x: 0, y: 0}
+--- !u!224 &224233332446998570
+RectTransform:
+ m_ObjectHideFlags: 1
+ m_PrefabParentObject: {fileID: 0}
+ m_PrefabInternal: {fileID: 100100000}
+ m_GameObject: {fileID: 1369006202624816}
+ m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
+ m_LocalPosition: {x: 0, y: 0, z: 0}
+ m_LocalScale: {x: 1, y: 1, z: 1}
+ m_Children: []
+ m_Father: {fileID: 224490741999108352}
+ m_RootOrder: 0
+ m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
+ m_AnchorMin: {x: 0.5, y: 0.5}
+ m_AnchorMax: {x: 0.5, y: 0.5}
+ m_AnchoredPosition: {x: 2.4, y: 0.000043869}
+ m_SizeDelta: {x: 362.7, y: 100}
+ m_Pivot: {x: 0.5, y: 0.5}
+--- !u!224 &224490741999108352
+RectTransform:
+ m_ObjectHideFlags: 1
+ m_PrefabParentObject: {fileID: 0}
+ m_PrefabInternal: {fileID: 100100000}
+ m_GameObject: {fileID: 1343426381164082}
+ m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
+ m_LocalPosition: {x: 0, y: 0, z: 0}
+ m_LocalScale: {x: 1, y: 1, z: 1}
+ m_Children:
+ - {fileID: 224233332446998570}
+ m_Father: {fileID: 224156852809508418}
+ m_RootOrder: 0
+ m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
+ m_AnchorMin: {x: 0, y: 0}
+ m_AnchorMax: {x: 1, y: 0}
+ m_AnchoredPosition: {x: 0, y: 50}
+ m_SizeDelta: {x: 0, y: 100}
+ m_Pivot: {x: 0.5, y: 0.5}
diff --git a/Assets/GoogleMobileAds/Editor/Resources/PlaceholderAds/Banners/SMART_BANNER.prefab.meta b/Assets/GoogleMobileAds/Editor/Resources/PlaceholderAds/Banners/SMART_BANNER.prefab.meta
new file mode 100644
index 0000000..7049afa
--- /dev/null
+++ b/Assets/GoogleMobileAds/Editor/Resources/PlaceholderAds/Banners/SMART_BANNER.prefab.meta
@@ -0,0 +1,13 @@
+fileFormatVersion: 2
+guid: 15069cdc38e2b41f7836116419a9187c
+labels:
+- gvh
+- gvh_version-10.6.0
+- gvhp_exportpath-GoogleMobileAds/Editor/Resources/PlaceholderAds/Banners/SMART_BANNER.prefab
+timeCreated: 1480838400
+NativeFormatImporter:
+ externalObjects: {}
+ mainObjectFileID: 100100000
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/GoogleMobileAds/Editor/Resources/PlaceholderAds/Interstitials.meta b/Assets/GoogleMobileAds/Editor/Resources/PlaceholderAds/Interstitials.meta
new file mode 100644
index 0000000..ecf5838
--- /dev/null
+++ b/Assets/GoogleMobileAds/Editor/Resources/PlaceholderAds/Interstitials.meta
@@ -0,0 +1,8 @@
+fileFormatVersion: 2
+guid: d78ddcb3b0cbd14418fb7c84e547256f
+folderAsset: yes
+DefaultImporter:
+ externalObjects: {}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/GoogleMobileAds/Editor/Resources/PlaceholderAds/Interstitials/1024x768.prefab b/Assets/GoogleMobileAds/Editor/Resources/PlaceholderAds/Interstitials/1024x768.prefab
new file mode 100644
index 0000000..84a5e43
--- /dev/null
+++ b/Assets/GoogleMobileAds/Editor/Resources/PlaceholderAds/Interstitials/1024x768.prefab
@@ -0,0 +1,472 @@
+%YAML 1.1
+%TAG !u! tag:unity3d.com,2011:
+--- !u!1001 &100100000
+Prefab:
+ m_ObjectHideFlags: 1
+ serializedVersion: 2
+ m_Modification:
+ m_TransformParent: {fileID: 0}
+ m_Modifications: []
+ m_RemovedComponents: []
+ m_ParentPrefab: {fileID: 0}
+ m_RootGameObject: {fileID: 1506555509391478}
+ m_IsPrefabParent: 1
+--- !u!1 &1048958803402864
+GameObject:
+ m_ObjectHideFlags: 1
+ m_PrefabParentObject: {fileID: 0}
+ m_PrefabInternal: {fileID: 100100000}
+ serializedVersion: 5
+ m_Component:
+ - component: {fileID: 224396785236523192}
+ - component: {fileID: 222833382448378890}
+ - component: {fileID: 114429971286294426}
+ - component: {fileID: 114825474698679592}
+ m_Layer: 5
+ m_Name: Button
+ m_TagString: Untagged
+ m_Icon: {fileID: 0}
+ m_NavMeshLayer: 0
+ m_StaticEditorFlags: 0
+ m_IsActive: 1
+--- !u!1 &1086316119044956
+GameObject:
+ m_ObjectHideFlags: 0
+ m_PrefabParentObject: {fileID: 0}
+ m_PrefabInternal: {fileID: 100100000}
+ serializedVersion: 5
+ m_Component:
+ - component: {fileID: 224412111100384724}
+ - component: {fileID: 222123731056135654}
+ - component: {fileID: 114947809371510874}
+ - component: {fileID: 114962388913432892}
+ m_Layer: 5
+ m_Name: Ad
+ m_TagString: Untagged
+ m_Icon: {fileID: 0}
+ m_NavMeshLayer: 0
+ m_StaticEditorFlags: 0
+ m_IsActive: 1
+--- !u!1 &1506555509391478
+GameObject:
+ m_ObjectHideFlags: 0
+ m_PrefabParentObject: {fileID: 0}
+ m_PrefabInternal: {fileID: 100100000}
+ serializedVersion: 5
+ m_Component:
+ - component: {fileID: 224049503732257422}
+ - component: {fileID: 223443791425986802}
+ - component: {fileID: 114420769206196330}
+ - component: {fileID: 114535206133587424}
+ m_Layer: 5
+ m_Name: 1024x768
+ m_TagString: Untagged
+ m_Icon: {fileID: 0}
+ m_NavMeshLayer: 0
+ m_StaticEditorFlags: 0
+ m_IsActive: 1
+--- !u!1 &1701400232489060
+GameObject:
+ m_ObjectHideFlags: 1
+ m_PrefabParentObject: {fileID: 0}
+ m_PrefabInternal: {fileID: 100100000}
+ serializedVersion: 5
+ m_Component:
+ - component: {fileID: 224410274476360834}
+ - component: {fileID: 222763382731799498}
+ - component: {fileID: 114000294713222290}
+ m_Layer: 5
+ m_Name: Text
+ m_TagString: Untagged
+ m_Icon: {fileID: 0}
+ m_NavMeshLayer: 0
+ m_StaticEditorFlags: 0
+ m_IsActive: 1
+--- !u!1 &1761048403840336
+GameObject:
+ m_ObjectHideFlags: 0
+ m_PrefabParentObject: {fileID: 0}
+ m_PrefabInternal: {fileID: 100100000}
+ serializedVersion: 5
+ m_Component:
+ - component: {fileID: 224408585172404824}
+ - component: {fileID: 222519335633903876}
+ - component: {fileID: 114502356579168518}
+ m_Layer: 5
+ m_Name: Background
+ m_TagString: Untagged
+ m_Icon: {fileID: 0}
+ m_NavMeshLayer: 0
+ m_StaticEditorFlags: 0
+ m_IsActive: 1
+--- !u!114 &114000294713222290
+MonoBehaviour:
+ m_ObjectHideFlags: 1
+ m_PrefabParentObject: {fileID: 0}
+ m_PrefabInternal: {fileID: 100100000}
+ m_GameObject: {fileID: 1701400232489060}
+ m_Enabled: 1
+ m_EditorHideFlags: 0
+ m_Script: {fileID: 708705254, guid: f70555f144d8491a825f0804e09c671c, type: 3}
+ m_Name:
+ m_EditorClassIdentifier:
+ m_Material: {fileID: 0}
+ m_Color: {r: 0.19607843, g: 0.19607843, b: 0.19607843, a: 1}
+ m_RaycastTarget: 1
+ m_OnCullStateChanged:
+ m_PersistentCalls:
+ m_Calls: []
+ m_TypeName: UnityEngine.UI.MaskableGraphic+CullStateChangedEvent, UnityEngine.UI,
+ Version=1.0.0.0, Culture=neutral, PublicKeyToken=null
+ m_FontData:
+ m_Font: {fileID: 10102, guid: 0000000000000000e000000000000000, type: 0}
+ m_FontSize: 45
+ m_FontStyle: 1
+ m_BestFit: 0
+ m_MinSize: 0
+ m_MaxSize: 50
+ m_Alignment: 4
+ m_AlignByGeometry: 0
+ m_RichText: 1
+ m_HorizontalOverflow: 0
+ m_VerticalOverflow: 0
+ m_LineSpacing: 1
+ m_Text: Close Ad
+--- !u!114 &114420769206196330
+MonoBehaviour:
+ m_ObjectHideFlags: 1
+ m_PrefabParentObject: {fileID: 0}
+ m_PrefabInternal: {fileID: 100100000}
+ m_GameObject: {fileID: 1506555509391478}
+ m_Enabled: 1
+ m_EditorHideFlags: 0
+ m_Script: {fileID: 1980459831, guid: f70555f144d8491a825f0804e09c671c, type: 3}
+ m_Name:
+ m_EditorClassIdentifier:
+ m_UiScaleMode: 1
+ m_ReferencePixelsPerUnit: 100
+ m_ScaleFactor: 1
+ m_ReferenceResolution: {x: 2960, y: 1440}
+ m_ScreenMatchMode: 0
+ m_MatchWidthOrHeight: 1
+ m_PhysicalUnit: 3
+ m_FallbackScreenDPI: 96
+ m_DefaultSpriteDPI: 96
+ m_DynamicPixelsPerUnit: 1
+--- !u!114 &114429971286294426
+MonoBehaviour:
+ m_ObjectHideFlags: 1
+ m_PrefabParentObject: {fileID: 0}
+ m_PrefabInternal: {fileID: 100100000}
+ m_GameObject: {fileID: 1048958803402864}
+ m_Enabled: 1
+ m_EditorHideFlags: 0
+ m_Script: {fileID: -765806418, guid: f70555f144d8491a825f0804e09c671c, type: 3}
+ m_Name:
+ m_EditorClassIdentifier:
+ m_Material: {fileID: 0}
+ m_Color: {r: 1, g: 1, b: 1, a: 1}
+ m_RaycastTarget: 1
+ m_OnCullStateChanged:
+ m_PersistentCalls:
+ m_Calls: []
+ m_TypeName: UnityEngine.UI.MaskableGraphic+CullStateChangedEvent, UnityEngine.UI,
+ Version=1.0.0.0, Culture=neutral, PublicKeyToken=null
+ m_Sprite: {fileID: 10905, guid: 0000000000000000f000000000000000, type: 0}
+ m_Type: 1
+ m_PreserveAspect: 0
+ m_FillCenter: 1
+ m_FillMethod: 4
+ m_FillAmount: 1
+ m_FillClockwise: 1
+ m_FillOrigin: 0
+--- !u!114 &114502356579168518
+MonoBehaviour:
+ m_ObjectHideFlags: 1
+ m_PrefabParentObject: {fileID: 0}
+ m_PrefabInternal: {fileID: 100100000}
+ m_GameObject: {fileID: 1761048403840336}
+ m_Enabled: 1
+ m_EditorHideFlags: 0
+ m_Script: {fileID: -765806418, guid: f70555f144d8491a825f0804e09c671c, type: 3}
+ m_Name:
+ m_EditorClassIdentifier:
+ m_Material: {fileID: 0}
+ m_Color: {r: 0, g: 0, b: 0, a: 0.809}
+ m_RaycastTarget: 1
+ m_OnCullStateChanged:
+ m_PersistentCalls:
+ m_Calls: []
+ m_TypeName: UnityEngine.UI.MaskableGraphic+CullStateChangedEvent, UnityEngine.UI,
+ Version=1.0.0.0, Culture=neutral, PublicKeyToken=null
+ m_Sprite: {fileID: 0}
+ m_Type: 0
+ m_PreserveAspect: 0
+ m_FillCenter: 1
+ m_FillMethod: 4
+ m_FillAmount: 1
+ m_FillClockwise: 1
+ m_FillOrigin: 0
+--- !u!114 &114535206133587424
+MonoBehaviour:
+ m_ObjectHideFlags: 1
+ m_PrefabParentObject: {fileID: 0}
+ m_PrefabInternal: {fileID: 100100000}
+ m_GameObject: {fileID: 1506555509391478}
+ m_Enabled: 1
+ m_EditorHideFlags: 0
+ m_Script: {fileID: 1301386320, guid: f70555f144d8491a825f0804e09c671c, type: 3}
+ m_Name:
+ m_EditorClassIdentifier:
+ m_IgnoreReversedGraphics: 1
+ m_BlockingObjects: 0
+ m_BlockingMask:
+ serializedVersion: 2
+ m_Bits: 4294967295
+--- !u!114 &114825474698679592
+MonoBehaviour:
+ m_ObjectHideFlags: 1
+ m_PrefabParentObject: {fileID: 0}
+ m_PrefabInternal: {fileID: 100100000}
+ m_GameObject: {fileID: 1048958803402864}
+ m_Enabled: 1
+ m_EditorHideFlags: 0
+ m_Script: {fileID: 1392445389, guid: f70555f144d8491a825f0804e09c671c, type: 3}
+ m_Name:
+ m_EditorClassIdentifier:
+ m_Navigation:
+ m_Mode: 3
+ m_SelectOnUp: {fileID: 0}
+ m_SelectOnDown: {fileID: 0}
+ m_SelectOnLeft: {fileID: 0}
+ m_SelectOnRight: {fileID: 0}
+ m_Transition: 1
+ m_Colors:
+ m_NormalColor: {r: 1, g: 1, b: 1, a: 1}
+ m_HighlightedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1}
+ m_PressedColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 1}
+ m_DisabledColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 0.5019608}
+ m_ColorMultiplier: 1
+ m_FadeDuration: 0.1
+ m_SpriteState:
+ m_HighlightedSprite: {fileID: 0}
+ m_PressedSprite: {fileID: 0}
+ m_DisabledSprite: {fileID: 0}
+ m_AnimationTriggers:
+ m_NormalTrigger: Normal
+ m_HighlightedTrigger: Highlighted
+ m_PressedTrigger: Pressed
+ m_DisabledTrigger: Disabled
+ m_Interactable: 1
+ m_TargetGraphic: {fileID: 114429971286294426}
+ m_OnClick:
+ m_PersistentCalls:
+ m_Calls: []
+ m_TypeName: UnityEngine.UI.Button+ButtonClickedEvent, UnityEngine.UI, Version=1.0.0.0,
+ Culture=neutral, PublicKeyToken=null
+--- !u!114 &114947809371510874
+MonoBehaviour:
+ m_ObjectHideFlags: 1
+ m_PrefabParentObject: {fileID: 0}
+ m_PrefabInternal: {fileID: 100100000}
+ m_GameObject: {fileID: 1086316119044956}
+ m_Enabled: 1
+ m_EditorHideFlags: 0
+ m_Script: {fileID: -765806418, guid: f70555f144d8491a825f0804e09c671c, type: 3}
+ m_Name:
+ m_EditorClassIdentifier:
+ m_Material: {fileID: 0}
+ m_Color: {r: 1, g: 1, b: 1, a: 1}
+ m_RaycastTarget: 1
+ m_OnCullStateChanged:
+ m_PersistentCalls:
+ m_Calls: []
+ m_TypeName: UnityEngine.UI.MaskableGraphic+CullStateChangedEvent, UnityEngine.UI,
+ Version=1.0.0.0, Culture=neutral, PublicKeyToken=null
+ m_Sprite: {fileID: 21300000, guid: 4c69db43dbd474a2987be5807129b4cc, type: 3}
+ m_Type: 0
+ m_PreserveAspect: 0
+ m_FillCenter: 1
+ m_FillMethod: 4
+ m_FillAmount: 1
+ m_FillClockwise: 1
+ m_FillOrigin: 0
+--- !u!114 &114962388913432892
+MonoBehaviour:
+ m_ObjectHideFlags: 1
+ m_PrefabParentObject: {fileID: 0}
+ m_PrefabInternal: {fileID: 100100000}
+ m_GameObject: {fileID: 1086316119044956}
+ m_Enabled: 1
+ m_EditorHideFlags: 0
+ m_Script: {fileID: 1392445389, guid: f70555f144d8491a825f0804e09c671c, type: 3}
+ m_Name:
+ m_EditorClassIdentifier:
+ m_Navigation:
+ m_Mode: 3
+ m_SelectOnUp: {fileID: 0}
+ m_SelectOnDown: {fileID: 0}
+ m_SelectOnLeft: {fileID: 0}
+ m_SelectOnRight: {fileID: 0}
+ m_Transition: 1
+ m_Colors:
+ m_NormalColor: {r: 1, g: 1, b: 1, a: 1}
+ m_HighlightedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1}
+ m_PressedColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 1}
+ m_DisabledColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 0.5019608}
+ m_ColorMultiplier: 1
+ m_FadeDuration: 0.1
+ m_SpriteState:
+ m_HighlightedSprite: {fileID: 0}
+ m_PressedSprite: {fileID: 0}
+ m_DisabledSprite: {fileID: 0}
+ m_AnimationTriggers:
+ m_NormalTrigger: Normal
+ m_HighlightedTrigger: Highlighted
+ m_PressedTrigger: Pressed
+ m_DisabledTrigger: Disabled
+ m_Interactable: 1
+ m_TargetGraphic: {fileID: 114947809371510874}
+ m_OnClick:
+ m_PersistentCalls:
+ m_Calls: []
+ m_TypeName: UnityEngine.UI.Button+ButtonClickedEvent, UnityEngine.UI, Version=1.0.0.0,
+ Culture=neutral, PublicKeyToken=null
+--- !u!222 &222123731056135654
+CanvasRenderer:
+ m_ObjectHideFlags: 1
+ m_PrefabParentObject: {fileID: 0}
+ m_PrefabInternal: {fileID: 100100000}
+ m_GameObject: {fileID: 1086316119044956}
+--- !u!222 &222519335633903876
+CanvasRenderer:
+ m_ObjectHideFlags: 1
+ m_PrefabParentObject: {fileID: 0}
+ m_PrefabInternal: {fileID: 100100000}
+ m_GameObject: {fileID: 1761048403840336}
+--- !u!222 &222763382731799498
+CanvasRenderer:
+ m_ObjectHideFlags: 1
+ m_PrefabParentObject: {fileID: 0}
+ m_PrefabInternal: {fileID: 100100000}
+ m_GameObject: {fileID: 1701400232489060}
+--- !u!222 &222833382448378890
+CanvasRenderer:
+ m_ObjectHideFlags: 1
+ m_PrefabParentObject: {fileID: 0}
+ m_PrefabInternal: {fileID: 100100000}
+ m_GameObject: {fileID: 1048958803402864}
+--- !u!223 &223443791425986802
+Canvas:
+ m_ObjectHideFlags: 1
+ m_PrefabParentObject: {fileID: 0}
+ m_PrefabInternal: {fileID: 100100000}
+ m_GameObject: {fileID: 1506555509391478}
+ m_Enabled: 1
+ serializedVersion: 3
+ m_RenderMode: 0
+ m_Camera: {fileID: 0}
+ m_PlaneDistance: 100
+ m_PixelPerfect: 0
+ m_ReceivesEvents: 1
+ m_OverrideSorting: 0
+ m_OverridePixelPerfect: 0
+ m_SortingBucketNormalizedSize: 0
+ m_AdditionalShaderChannelsFlag: 0
+ m_SortingLayerID: 0
+ m_SortingOrder: 0
+ m_TargetDisplay: 0
+--- !u!224 &224049503732257422
+RectTransform:
+ m_ObjectHideFlags: 1
+ m_PrefabParentObject: {fileID: 0}
+ m_PrefabInternal: {fileID: 100100000}
+ m_GameObject: {fileID: 1506555509391478}
+ m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
+ m_LocalPosition: {x: 0, y: 0, z: 0}
+ m_LocalScale: {x: 0, y: 0, z: 0}
+ m_Children:
+ - {fileID: 224408585172404824}
+ - {fileID: 224412111100384724}
+ m_Father: {fileID: 0}
+ m_RootOrder: 0
+ m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
+ m_AnchorMin: {x: 0, y: 0}
+ m_AnchorMax: {x: 0, y: 0}
+ m_AnchoredPosition: {x: 0, y: 0}
+ m_SizeDelta: {x: 0, y: 0}
+ m_Pivot: {x: 0, y: 0}
+--- !u!224 &224396785236523192
+RectTransform:
+ m_ObjectHideFlags: 1
+ m_PrefabParentObject: {fileID: 0}
+ m_PrefabInternal: {fileID: 100100000}
+ m_GameObject: {fileID: 1048958803402864}
+ m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
+ m_LocalPosition: {x: 0, y: 0, z: 0}
+ m_LocalScale: {x: 1, y: 1, z: 1}
+ m_Children:
+ - {fileID: 224410274476360834}
+ m_Father: {fileID: 224412111100384724}
+ m_RootOrder: 0
+ m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
+ m_AnchorMin: {x: 0, y: 1}
+ m_AnchorMax: {x: 0, y: 1}
+ m_AnchoredPosition: {x: 169.8, y: -35.9}
+ m_SizeDelta: {x: 339.8, y: 71.8}
+ m_Pivot: {x: 0.5, y: 0.5}
+--- !u!224 &224408585172404824
+RectTransform:
+ m_ObjectHideFlags: 1
+ m_PrefabParentObject: {fileID: 0}
+ m_PrefabInternal: {fileID: 100100000}
+ m_GameObject: {fileID: 1761048403840336}
+ m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
+ m_LocalPosition: {x: 0, y: 0, z: 0}
+ m_LocalScale: {x: 1, y: 1, z: 1}
+ m_Children: []
+ m_Father: {fileID: 224049503732257422}
+ m_RootOrder: 0
+ m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
+ m_AnchorMin: {x: 0, y: 0}
+ m_AnchorMax: {x: 1, y: 1}
+ m_AnchoredPosition: {x: 0, y: 0}
+ m_SizeDelta: {x: 0, y: 0}
+ m_Pivot: {x: 0.5, y: 0.5}
+--- !u!224 &224410274476360834
+RectTransform:
+ m_ObjectHideFlags: 1
+ m_PrefabParentObject: {fileID: 0}
+ m_PrefabInternal: {fileID: 100100000}
+ m_GameObject: {fileID: 1701400232489060}
+ m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
+ m_LocalPosition: {x: 0, y: 0, z: 0}
+ m_LocalScale: {x: 1, y: 1, z: 1}
+ m_Children: []
+ m_Father: {fileID: 224396785236523192}
+ m_RootOrder: 0
+ m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
+ m_AnchorMin: {x: 0, y: 0}
+ m_AnchorMax: {x: 1, y: 1}
+ m_AnchoredPosition: {x: 0, y: 0}
+ m_SizeDelta: {x: 0, y: 0}
+ m_Pivot: {x: 0.5, y: 0.5}
+--- !u!224 &224412111100384724
+RectTransform:
+ m_ObjectHideFlags: 1
+ m_PrefabParentObject: {fileID: 0}
+ m_PrefabInternal: {fileID: 100100000}
+ m_GameObject: {fileID: 1086316119044956}
+ m_LocalRotation: {x: -0, y: -0, z: -0, w: 1}
+ m_LocalPosition: {x: 0, y: 0, z: 0}
+ m_LocalScale: {x: 1, y: 1, z: 1}
+ m_Children:
+ - {fileID: 224396785236523192}
+ m_Father: {fileID: 224049503732257422}
+ m_RootOrder: 1
+ m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
+ m_AnchorMin: {x: 0.5, y: 0.5}
+ m_AnchorMax: {x: 0.5, y: 0.5}
+ m_AnchoredPosition: {x: 0, y: 0}
+ m_SizeDelta: {x: 2000, y: 1436}
+ m_Pivot: {x: 0.5, y: 0.5}
diff --git a/Assets/GoogleMobileAds/Editor/Resources/PlaceholderAds/Interstitials/1024x768.prefab.meta b/Assets/GoogleMobileAds/Editor/Resources/PlaceholderAds/Interstitials/1024x768.prefab.meta
new file mode 100644
index 0000000..328ebdd
--- /dev/null
+++ b/Assets/GoogleMobileAds/Editor/Resources/PlaceholderAds/Interstitials/1024x768.prefab.meta
@@ -0,0 +1,13 @@
+fileFormatVersion: 2
+guid: 53084846ca7a14a878485a5db71fda00
+labels:
+- gvh
+- gvh_version-10.6.0
+- gvhp_exportpath-GoogleMobileAds/Editor/Resources/PlaceholderAds/Interstitials/1024x768.prefab
+timeCreated: 1480838400
+NativeFormatImporter:
+ externalObjects: {}
+ mainObjectFileID: 100100000
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/GoogleMobileAds/Editor/Resources/PlaceholderAds/Interstitials/768x1024.prefab b/Assets/GoogleMobileAds/Editor/Resources/PlaceholderAds/Interstitials/768x1024.prefab
new file mode 100644
index 0000000..57e57d4
--- /dev/null
+++ b/Assets/GoogleMobileAds/Editor/Resources/PlaceholderAds/Interstitials/768x1024.prefab
@@ -0,0 +1,472 @@
+%YAML 1.1
+%TAG !u! tag:unity3d.com,2011:
+--- !u!1001 &100100000
+Prefab:
+ m_ObjectHideFlags: 1
+ serializedVersion: 2
+ m_Modification:
+ m_TransformParent: {fileID: 0}
+ m_Modifications: []
+ m_RemovedComponents: []
+ m_ParentPrefab: {fileID: 0}
+ m_RootGameObject: {fileID: 1168051963893118}
+ m_IsPrefabParent: 1
+--- !u!1 &1026234277025590
+GameObject:
+ m_ObjectHideFlags: 1
+ m_PrefabParentObject: {fileID: 0}
+ m_PrefabInternal: {fileID: 100100000}
+ serializedVersion: 5
+ m_Component:
+ - component: {fileID: 224770140206732756}
+ - component: {fileID: 222623742081011482}
+ - component: {fileID: 114466248550890148}
+ - component: {fileID: 114214230567826922}
+ m_Layer: 5
+ m_Name: Button
+ m_TagString: Untagged
+ m_Icon: {fileID: 0}
+ m_NavMeshLayer: 0
+ m_StaticEditorFlags: 0
+ m_IsActive: 1
+--- !u!1 &1168051963893118
+GameObject:
+ m_ObjectHideFlags: 0
+ m_PrefabParentObject: {fileID: 0}
+ m_PrefabInternal: {fileID: 100100000}
+ serializedVersion: 5
+ m_Component:
+ - component: {fileID: 224349703481187764}
+ - component: {fileID: 223920107105332924}
+ - component: {fileID: 114572656286436090}
+ - component: {fileID: 114715352366433274}
+ m_Layer: 5
+ m_Name: 768x1024
+ m_TagString: Untagged
+ m_Icon: {fileID: 0}
+ m_NavMeshLayer: 0
+ m_StaticEditorFlags: 0
+ m_IsActive: 1
+--- !u!1 &1455544211993956
+GameObject:
+ m_ObjectHideFlags: 0
+ m_PrefabParentObject: {fileID: 0}
+ m_PrefabInternal: {fileID: 100100000}
+ serializedVersion: 5
+ m_Component:
+ - component: {fileID: 224188954884660388}
+ - component: {fileID: 222991998422378294}
+ - component: {fileID: 114288914574884706}
+ m_Layer: 5
+ m_Name: Background
+ m_TagString: Untagged
+ m_Icon: {fileID: 0}
+ m_NavMeshLayer: 0
+ m_StaticEditorFlags: 0
+ m_IsActive: 1
+--- !u!1 &1519554490061234
+GameObject:
+ m_ObjectHideFlags: 1
+ m_PrefabParentObject: {fileID: 0}
+ m_PrefabInternal: {fileID: 100100000}
+ serializedVersion: 5
+ m_Component:
+ - component: {fileID: 224688741740444772}
+ - component: {fileID: 222698607200636900}
+ - component: {fileID: 114090591266759776}
+ m_Layer: 5
+ m_Name: Text
+ m_TagString: Untagged
+ m_Icon: {fileID: 0}
+ m_NavMeshLayer: 0
+ m_StaticEditorFlags: 0
+ m_IsActive: 1
+--- !u!1 &1919592978971710
+GameObject:
+ m_ObjectHideFlags: 0
+ m_PrefabParentObject: {fileID: 0}
+ m_PrefabInternal: {fileID: 100100000}
+ serializedVersion: 5
+ m_Component:
+ - component: {fileID: 224247655386807502}
+ - component: {fileID: 222996861862976686}
+ - component: {fileID: 114508546300043044}
+ - component: {fileID: 114645982259750808}
+ m_Layer: 5
+ m_Name: Ad
+ m_TagString: Untagged
+ m_Icon: {fileID: 0}
+ m_NavMeshLayer: 0
+ m_StaticEditorFlags: 0
+ m_IsActive: 1
+--- !u!114 &114090591266759776
+MonoBehaviour:
+ m_ObjectHideFlags: 1
+ m_PrefabParentObject: {fileID: 0}
+ m_PrefabInternal: {fileID: 100100000}
+ m_GameObject: {fileID: 1519554490061234}
+ m_Enabled: 1
+ m_EditorHideFlags: 0
+ m_Script: {fileID: 708705254, guid: f70555f144d8491a825f0804e09c671c, type: 3}
+ m_Name:
+ m_EditorClassIdentifier:
+ m_Material: {fileID: 0}
+ m_Color: {r: 0.19607843, g: 0.19607843, b: 0.19607843, a: 1}
+ m_RaycastTarget: 1
+ m_OnCullStateChanged:
+ m_PersistentCalls:
+ m_Calls: []
+ m_TypeName: UnityEngine.UI.MaskableGraphic+CullStateChangedEvent, UnityEngine.UI,
+ Version=1.0.0.0, Culture=neutral, PublicKeyToken=null
+ m_FontData:
+ m_Font: {fileID: 10102, guid: 0000000000000000e000000000000000, type: 0}
+ m_FontSize: 50
+ m_FontStyle: 1
+ m_BestFit: 0
+ m_MinSize: 0
+ m_MaxSize: 50
+ m_Alignment: 4
+ m_AlignByGeometry: 0
+ m_RichText: 1
+ m_HorizontalOverflow: 0
+ m_VerticalOverflow: 0
+ m_LineSpacing: 1
+ m_Text: Close Ad
+--- !u!114 &114214230567826922
+MonoBehaviour:
+ m_ObjectHideFlags: 1
+ m_PrefabParentObject: {fileID: 0}
+ m_PrefabInternal: {fileID: 100100000}
+ m_GameObject: {fileID: 1026234277025590}
+ m_Enabled: 1
+ m_EditorHideFlags: 0
+ m_Script: {fileID: 1392445389, guid: f70555f144d8491a825f0804e09c671c, type: 3}
+ m_Name:
+ m_EditorClassIdentifier:
+ m_Navigation:
+ m_Mode: 3
+ m_SelectOnUp: {fileID: 0}
+ m_SelectOnDown: {fileID: 0}
+ m_SelectOnLeft: {fileID: 0}
+ m_SelectOnRight: {fileID: 0}
+ m_Transition: 1
+ m_Colors:
+ m_NormalColor: {r: 1, g: 1, b: 1, a: 1}
+ m_HighlightedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1}
+ m_PressedColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 1}
+ m_DisabledColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 0.5019608}
+ m_ColorMultiplier: 1
+ m_FadeDuration: 0.1
+ m_SpriteState:
+ m_HighlightedSprite: {fileID: 0}
+ m_PressedSprite: {fileID: 0}
+ m_DisabledSprite: {fileID: 0}
+ m_AnimationTriggers:
+ m_NormalTrigger: Normal
+ m_HighlightedTrigger: Highlighted
+ m_PressedTrigger: Pressed
+ m_DisabledTrigger: Disabled
+ m_Interactable: 1
+ m_TargetGraphic: {fileID: 114466248550890148}
+ m_OnClick:
+ m_PersistentCalls:
+ m_Calls: []
+ m_TypeName: UnityEngine.UI.Button+ButtonClickedEvent, UnityEngine.UI, Version=1.0.0.0,
+ Culture=neutral, PublicKeyToken=null
+--- !u!114 &114288914574884706
+MonoBehaviour:
+ m_ObjectHideFlags: 1
+ m_PrefabParentObject: {fileID: 0}
+ m_PrefabInternal: {fileID: 100100000}
+ m_GameObject: {fileID: 1455544211993956}
+ m_Enabled: 1
+ m_EditorHideFlags: 0
+ m_Script: {fileID: -765806418, guid: f70555f144d8491a825f0804e09c671c, type: 3}
+ m_Name:
+ m_EditorClassIdentifier:
+ m_Material: {fileID: 0}
+ m_Color: {r: 0, g: 0, b: 0, a: 0.80784315}
+ m_RaycastTarget: 1
+ m_OnCullStateChanged:
+ m_PersistentCalls:
+ m_Calls: []
+ m_TypeName: UnityEngine.UI.MaskableGraphic+CullStateChangedEvent, UnityEngine.UI,
+ Version=1.0.0.0, Culture=neutral, PublicKeyToken=null
+ m_Sprite: {fileID: 0}
+ m_Type: 0
+ m_PreserveAspect: 0
+ m_FillCenter: 1
+ m_FillMethod: 4
+ m_FillAmount: 1
+ m_FillClockwise: 1
+ m_FillOrigin: 0
+--- !u!114 &114466248550890148
+MonoBehaviour:
+ m_ObjectHideFlags: 1
+ m_PrefabParentObject: {fileID: 0}
+ m_PrefabInternal: {fileID: 100100000}
+ m_GameObject: {fileID: 1026234277025590}
+ m_Enabled: 1
+ m_EditorHideFlags: 0
+ m_Script: {fileID: -765806418, guid: f70555f144d8491a825f0804e09c671c, type: 3}
+ m_Name:
+ m_EditorClassIdentifier:
+ m_Material: {fileID: 0}
+ m_Color: {r: 1, g: 1, b: 1, a: 1}
+ m_RaycastTarget: 1
+ m_OnCullStateChanged:
+ m_PersistentCalls:
+ m_Calls: []
+ m_TypeName: UnityEngine.UI.MaskableGraphic+CullStateChangedEvent, UnityEngine.UI,
+ Version=1.0.0.0, Culture=neutral, PublicKeyToken=null
+ m_Sprite: {fileID: 10905, guid: 0000000000000000f000000000000000, type: 0}
+ m_Type: 1
+ m_PreserveAspect: 0
+ m_FillCenter: 1
+ m_FillMethod: 4
+ m_FillAmount: 1
+ m_FillClockwise: 1
+ m_FillOrigin: 0
+--- !u!114 &114508546300043044
+MonoBehaviour:
+ m_ObjectHideFlags: 1
+ m_PrefabParentObject: {fileID: 0}
+ m_PrefabInternal: {fileID: 100100000}
+ m_GameObject: {fileID: 1919592978971710}
+ m_Enabled: 1
+ m_EditorHideFlags: 0
+ m_Script: {fileID: -765806418, guid: f70555f144d8491a825f0804e09c671c, type: 3}
+ m_Name:
+ m_EditorClassIdentifier:
+ m_Material: {fileID: 0}
+ m_Color: {r: 1, g: 1, b: 1, a: 1}
+ m_RaycastTarget: 1
+ m_OnCullStateChanged:
+ m_PersistentCalls:
+ m_Calls: []
+ m_TypeName: UnityEngine.UI.MaskableGraphic+CullStateChangedEvent, UnityEngine.UI,
+ Version=1.0.0.0, Culture=neutral, PublicKeyToken=null
+ m_Sprite: {fileID: 21300000, guid: 8a53f9c63a5e94b14a98698a7b07365b, type: 3}
+ m_Type: 0
+ m_PreserveAspect: 0
+ m_FillCenter: 1
+ m_FillMethod: 4
+ m_FillAmount: 1
+ m_FillClockwise: 1
+ m_FillOrigin: 0
+--- !u!114 &114572656286436090
+MonoBehaviour:
+ m_ObjectHideFlags: 1
+ m_PrefabParentObject: {fileID: 0}
+ m_PrefabInternal: {fileID: 100100000}
+ m_GameObject: {fileID: 1168051963893118}
+ m_Enabled: 1
+ m_EditorHideFlags: 0
+ m_Script: {fileID: 1980459831, guid: f70555f144d8491a825f0804e09c671c, type: 3}
+ m_Name:
+ m_EditorClassIdentifier:
+ m_UiScaleMode: 1
+ m_ReferencePixelsPerUnit: 100
+ m_ScaleFactor: 1
+ m_ReferenceResolution: {x: 1440, y: 2960}
+ m_ScreenMatchMode: 2
+ m_MatchWidthOrHeight: 0.5
+ m_PhysicalUnit: 3
+ m_FallbackScreenDPI: 96
+ m_DefaultSpriteDPI: 96
+ m_DynamicPixelsPerUnit: 1
+--- !u!114 &114645982259750808
+MonoBehaviour:
+ m_ObjectHideFlags: 1
+ m_PrefabParentObject: {fileID: 0}
+ m_PrefabInternal: {fileID: 100100000}
+ m_GameObject: {fileID: 1919592978971710}
+ m_Enabled: 1
+ m_EditorHideFlags: 0
+ m_Script: {fileID: 1392445389, guid: f70555f144d8491a825f0804e09c671c, type: 3}
+ m_Name:
+ m_EditorClassIdentifier:
+ m_Navigation:
+ m_Mode: 3
+ m_SelectOnUp: {fileID: 0}
+ m_SelectOnDown: {fileID: 0}
+ m_SelectOnLeft: {fileID: 0}
+ m_SelectOnRight: {fileID: 0}
+ m_Transition: 1
+ m_Colors:
+ m_NormalColor: {r: 1, g: 1, b: 1, a: 1}
+ m_HighlightedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1}
+ m_PressedColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 1}
+ m_DisabledColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 0.5019608}
+ m_ColorMultiplier: 1
+ m_FadeDuration: 0.1
+ m_SpriteState:
+ m_HighlightedSprite: {fileID: 0}
+ m_PressedSprite: {fileID: 0}
+ m_DisabledSprite: {fileID: 0}
+ m_AnimationTriggers:
+ m_NormalTrigger: Normal
+ m_HighlightedTrigger: Highlighted
+ m_PressedTrigger: Pressed
+ m_DisabledTrigger: Disabled
+ m_Interactable: 1
+ m_TargetGraphic: {fileID: 114508546300043044}
+ m_OnClick:
+ m_PersistentCalls:
+ m_Calls: []
+ m_TypeName: UnityEngine.UI.Button+ButtonClickedEvent, UnityEngine.UI, Version=1.0.0.0,
+ Culture=neutral, PublicKeyToken=null
+--- !u!114 &114715352366433274
+MonoBehaviour:
+ m_ObjectHideFlags: 1
+ m_PrefabParentObject: {fileID: 0}
+ m_PrefabInternal: {fileID: 100100000}
+ m_GameObject: {fileID: 1168051963893118}
+ m_Enabled: 1
+ m_EditorHideFlags: 0
+ m_Script: {fileID: 1301386320, guid: f70555f144d8491a825f0804e09c671c, type: 3}
+ m_Name:
+ m_EditorClassIdentifier:
+ m_IgnoreReversedGraphics: 1
+ m_BlockingObjects: 0
+ m_BlockingMask:
+ serializedVersion: 2
+ m_Bits: 4294967295
+--- !u!222 &222623742081011482
+CanvasRenderer:
+ m_ObjectHideFlags: 1
+ m_PrefabParentObject: {fileID: 0}
+ m_PrefabInternal: {fileID: 100100000}
+ m_GameObject: {fileID: 1026234277025590}
+--- !u!222 &222698607200636900
+CanvasRenderer:
+ m_ObjectHideFlags: 1
+ m_PrefabParentObject: {fileID: 0}
+ m_PrefabInternal: {fileID: 100100000}
+ m_GameObject: {fileID: 1519554490061234}
+--- !u!222 &222991998422378294
+CanvasRenderer:
+ m_ObjectHideFlags: 1
+ m_PrefabParentObject: {fileID: 0}
+ m_PrefabInternal: {fileID: 100100000}
+ m_GameObject: {fileID: 1455544211993956}
+--- !u!222 &222996861862976686
+CanvasRenderer:
+ m_ObjectHideFlags: 1
+ m_PrefabParentObject: {fileID: 0}
+ m_PrefabInternal: {fileID: 100100000}
+ m_GameObject: {fileID: 1919592978971710}
+--- !u!223 &223920107105332924
+Canvas:
+ m_ObjectHideFlags: 1
+ m_PrefabParentObject: {fileID: 0}
+ m_PrefabInternal: {fileID: 100100000}
+ m_GameObject: {fileID: 1168051963893118}
+ m_Enabled: 1
+ serializedVersion: 3
+ m_RenderMode: 0
+ m_Camera: {fileID: 0}
+ m_PlaneDistance: 100
+ m_PixelPerfect: 0
+ m_ReceivesEvents: 1
+ m_OverrideSorting: 0
+ m_OverridePixelPerfect: 0
+ m_SortingBucketNormalizedSize: 0
+ m_AdditionalShaderChannelsFlag: 0
+ m_SortingLayerID: 0
+ m_SortingOrder: 0
+ m_TargetDisplay: 0
+--- !u!224 &224188954884660388
+RectTransform:
+ m_ObjectHideFlags: 1
+ m_PrefabParentObject: {fileID: 0}
+ m_PrefabInternal: {fileID: 100100000}
+ m_GameObject: {fileID: 1455544211993956}
+ m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
+ m_LocalPosition: {x: 0, y: 0, z: 0}
+ m_LocalScale: {x: 1, y: 1, z: 1}
+ m_Children: []
+ m_Father: {fileID: 224349703481187764}
+ m_RootOrder: 0
+ m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
+ m_AnchorMin: {x: 0, y: 0}
+ m_AnchorMax: {x: 1, y: 1}
+ m_AnchoredPosition: {x: 0, y: 0}
+ m_SizeDelta: {x: 0, y: 0}
+ m_Pivot: {x: 0.5, y: 0.5}
+--- !u!224 &224247655386807502
+RectTransform:
+ m_ObjectHideFlags: 1
+ m_PrefabParentObject: {fileID: 0}
+ m_PrefabInternal: {fileID: 100100000}
+ m_GameObject: {fileID: 1919592978971710}
+ m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
+ m_LocalPosition: {x: 0, y: 0, z: 0}
+ m_LocalScale: {x: 1, y: 1, z: 1}
+ m_Children:
+ - {fileID: 224770140206732756}
+ m_Father: {fileID: 224349703481187764}
+ m_RootOrder: 1
+ m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
+ m_AnchorMin: {x: 0.5, y: 0.5}
+ m_AnchorMax: {x: 0.5, y: 0.5}
+ m_AnchoredPosition: {x: 0, y: 0}
+ m_SizeDelta: {x: 1436, y: 2000}
+ m_Pivot: {x: 0.5, y: 0.5}
+--- !u!224 &224349703481187764
+RectTransform:
+ m_ObjectHideFlags: 1
+ m_PrefabParentObject: {fileID: 0}
+ m_PrefabInternal: {fileID: 100100000}
+ m_GameObject: {fileID: 1168051963893118}
+ m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
+ m_LocalPosition: {x: 0, y: 0, z: 0}
+ m_LocalScale: {x: 0, y: 0, z: 0}
+ m_Children:
+ - {fileID: 224188954884660388}
+ - {fileID: 224247655386807502}
+ m_Father: {fileID: 0}
+ m_RootOrder: 0
+ m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
+ m_AnchorMin: {x: 0, y: 0}
+ m_AnchorMax: {x: 0, y: 0}
+ m_AnchoredPosition: {x: 0, y: 0}
+ m_SizeDelta: {x: 0, y: 0}
+ m_Pivot: {x: 0, y: 0}
+--- !u!224 &224688741740444772
+RectTransform:
+ m_ObjectHideFlags: 1
+ m_PrefabParentObject: {fileID: 0}
+ m_PrefabInternal: {fileID: 100100000}
+ m_GameObject: {fileID: 1519554490061234}
+ m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
+ m_LocalPosition: {x: 0, y: 0, z: 0}
+ m_LocalScale: {x: 1, y: 1, z: 1}
+ m_Children: []
+ m_Father: {fileID: 224770140206732756}
+ m_RootOrder: 0
+ m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
+ m_AnchorMin: {x: 0, y: 0}
+ m_AnchorMax: {x: 1, y: 1}
+ m_AnchoredPosition: {x: 9.1, y: -5.6}
+ m_SizeDelta: {x: 18.2, y: 11.2}
+ m_Pivot: {x: 0.5, y: 0.5}
+--- !u!224 &224770140206732756
+RectTransform:
+ m_ObjectHideFlags: 1
+ m_PrefabParentObject: {fileID: 0}
+ m_PrefabInternal: {fileID: 100100000}
+ m_GameObject: {fileID: 1026234277025590}
+ m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
+ m_LocalPosition: {x: 0, y: 0, z: 0}
+ m_LocalScale: {x: 1, y: 1, z: 1}
+ m_Children:
+ - {fileID: 224688741740444772}
+ m_Father: {fileID: 224247655386807502}
+ m_RootOrder: 0
+ m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
+ m_AnchorMin: {x: 0, y: 1}
+ m_AnchorMax: {x: 0, y: 1}
+ m_AnchoredPosition: {x: 172.1, y: -37.5}
+ m_SizeDelta: {x: 344.1, y: 75.2}
+ m_Pivot: {x: 0.5, y: 0.5}
diff --git a/Assets/GoogleMobileAds/Editor/Resources/PlaceholderAds/Interstitials/768x1024.prefab.meta b/Assets/GoogleMobileAds/Editor/Resources/PlaceholderAds/Interstitials/768x1024.prefab.meta
new file mode 100644
index 0000000..c51b40d
--- /dev/null
+++ b/Assets/GoogleMobileAds/Editor/Resources/PlaceholderAds/Interstitials/768x1024.prefab.meta
@@ -0,0 +1,13 @@
+fileFormatVersion: 2
+guid: 9e579ef4793d34e79be6a216c0b67d78
+labels:
+- gvh
+- gvh_version-10.6.0
+- gvhp_exportpath-GoogleMobileAds/Editor/Resources/PlaceholderAds/Interstitials/768x1024.prefab
+timeCreated: 1480838400
+NativeFormatImporter:
+ externalObjects: {}
+ mainObjectFileID: 100100000
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/GoogleMobileAds/Editor/Resources/PlaceholderAds/Rewarded.meta b/Assets/GoogleMobileAds/Editor/Resources/PlaceholderAds/Rewarded.meta
new file mode 100644
index 0000000..f51a94e
--- /dev/null
+++ b/Assets/GoogleMobileAds/Editor/Resources/PlaceholderAds/Rewarded.meta
@@ -0,0 +1,8 @@
+fileFormatVersion: 2
+guid: 1301929017fd57f42a619189cfdf92a1
+folderAsset: yes
+DefaultImporter:
+ externalObjects: {}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/GoogleMobileAds/Editor/Resources/PlaceholderAds/Rewarded/1024x768.prefab b/Assets/GoogleMobileAds/Editor/Resources/PlaceholderAds/Rewarded/1024x768.prefab
new file mode 100644
index 0000000..90748af
--- /dev/null
+++ b/Assets/GoogleMobileAds/Editor/Resources/PlaceholderAds/Rewarded/1024x768.prefab
@@ -0,0 +1,547 @@
+%YAML 1.1
+%TAG !u! tag:unity3d.com,2011:
+--- !u!1001 &100100000
+Prefab:
+ m_ObjectHideFlags: 1
+ serializedVersion: 2
+ m_Modification:
+ m_TransformParent: {fileID: 0}
+ m_Modifications: []
+ m_RemovedComponents: []
+ m_ParentPrefab: {fileID: 0}
+ m_RootGameObject: {fileID: 1372156606540976}
+ m_IsPrefabParent: 1
+--- !u!1 &1128573709916514
+GameObject:
+ m_ObjectHideFlags: 1
+ m_PrefabParentObject: {fileID: 0}
+ m_PrefabInternal: {fileID: 100100000}
+ serializedVersion: 5
+ m_Component:
+ - component: {fileID: 224613362496813788}
+ - component: {fileID: 222982220858172370}
+ - component: {fileID: 114531233940747562}
+ - component: {fileID: 114252552421956380}
+ m_Layer: 5
+ m_Name: Button
+ m_TagString: Untagged
+ m_Icon: {fileID: 0}
+ m_NavMeshLayer: 0
+ m_StaticEditorFlags: 0
+ m_IsActive: 1
+--- !u!1 &1266630977519298
+GameObject:
+ m_ObjectHideFlags: 0
+ m_PrefabParentObject: {fileID: 0}
+ m_PrefabInternal: {fileID: 100100000}
+ serializedVersion: 5
+ m_Component:
+ - component: {fileID: 224230749014027406}
+ - component: {fileID: 222796572593907422}
+ - component: {fileID: 114058432909893366}
+ m_Layer: 5
+ m_Name: Background
+ m_TagString: Untagged
+ m_Icon: {fileID: 0}
+ m_NavMeshLayer: 0
+ m_StaticEditorFlags: 0
+ m_IsActive: 1
+--- !u!1 &1372156606540976
+GameObject:
+ m_ObjectHideFlags: 0
+ m_PrefabParentObject: {fileID: 0}
+ m_PrefabInternal: {fileID: 100100000}
+ serializedVersion: 5
+ m_Component:
+ - component: {fileID: 224692589100518744}
+ - component: {fileID: 223553207263892384}
+ - component: {fileID: 114758204355010086}
+ - component: {fileID: 114768781952071512}
+ m_Layer: 5
+ m_Name: 1024x768
+ m_TagString: Untagged
+ m_Icon: {fileID: 0}
+ m_NavMeshLayer: 0
+ m_StaticEditorFlags: 0
+ m_IsActive: 1
+--- !u!1 &1776151137375062
+GameObject:
+ m_ObjectHideFlags: 0
+ m_PrefabParentObject: {fileID: 0}
+ m_PrefabInternal: {fileID: 100100000}
+ serializedVersion: 5
+ m_Component:
+ - component: {fileID: 224516481964458542}
+ - component: {fileID: 222969686989629696}
+ - component: {fileID: 114818721744753168}
+ - component: {fileID: 114637091538056986}
+ m_Layer: 5
+ m_Name: Ad
+ m_TagString: Untagged
+ m_Icon: {fileID: 0}
+ m_NavMeshLayer: 0
+ m_StaticEditorFlags: 0
+ m_IsActive: 1
+--- !u!1 &1839101188223610
+GameObject:
+ m_ObjectHideFlags: 1
+ m_PrefabParentObject: {fileID: 0}
+ m_PrefabInternal: {fileID: 100100000}
+ serializedVersion: 5
+ m_Component:
+ - component: {fileID: 224920559942719848}
+ - component: {fileID: 222848794251129344}
+ - component: {fileID: 114380357142010322}
+ m_Layer: 5
+ m_Name: Text
+ m_TagString: Untagged
+ m_Icon: {fileID: 0}
+ m_NavMeshLayer: 0
+ m_StaticEditorFlags: 0
+ m_IsActive: 1
+--- !u!1 &1940818438327928
+GameObject:
+ m_ObjectHideFlags: 1
+ m_PrefabParentObject: {fileID: 0}
+ m_PrefabInternal: {fileID: 100100000}
+ serializedVersion: 5
+ m_Component:
+ - component: {fileID: 224061913340101242}
+ - component: {fileID: 222966908609815736}
+ - component: {fileID: 114332259168256334}
+ m_Layer: 5
+ m_Name: Text
+ m_TagString: Untagged
+ m_Icon: {fileID: 0}
+ m_NavMeshLayer: 0
+ m_StaticEditorFlags: 0
+ m_IsActive: 1
+--- !u!114 &114058432909893366
+MonoBehaviour:
+ m_ObjectHideFlags: 1
+ m_PrefabParentObject: {fileID: 0}
+ m_PrefabInternal: {fileID: 100100000}
+ m_GameObject: {fileID: 1266630977519298}
+ m_Enabled: 1
+ m_EditorHideFlags: 0
+ m_Script: {fileID: -765806418, guid: f70555f144d8491a825f0804e09c671c, type: 3}
+ m_Name:
+ m_EditorClassIdentifier:
+ m_Material: {fileID: 0}
+ m_Color: {r: 0, g: 0, b: 0, a: 0.80784315}
+ m_RaycastTarget: 1
+ m_OnCullStateChanged:
+ m_PersistentCalls:
+ m_Calls: []
+ m_TypeName: UnityEngine.UI.MaskableGraphic+CullStateChangedEvent, UnityEngine.UI,
+ Version=1.0.0.0, Culture=neutral, PublicKeyToken=null
+ m_Sprite: {fileID: 0}
+ m_Type: 0
+ m_PreserveAspect: 0
+ m_FillCenter: 1
+ m_FillMethod: 4
+ m_FillAmount: 1
+ m_FillClockwise: 1
+ m_FillOrigin: 0
+--- !u!114 &114252552421956380
+MonoBehaviour:
+ m_ObjectHideFlags: 1
+ m_PrefabParentObject: {fileID: 0}
+ m_PrefabInternal: {fileID: 100100000}
+ m_GameObject: {fileID: 1128573709916514}
+ m_Enabled: 1
+ m_EditorHideFlags: 0
+ m_Script: {fileID: 1392445389, guid: f70555f144d8491a825f0804e09c671c, type: 3}
+ m_Name:
+ m_EditorClassIdentifier:
+ m_Navigation:
+ m_Mode: 3
+ m_SelectOnUp: {fileID: 0}
+ m_SelectOnDown: {fileID: 0}
+ m_SelectOnLeft: {fileID: 0}
+ m_SelectOnRight: {fileID: 0}
+ m_Transition: 1
+ m_Colors:
+ m_NormalColor: {r: 1, g: 1, b: 1, a: 1}
+ m_HighlightedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1}
+ m_PressedColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 1}
+ m_DisabledColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 0.5019608}
+ m_ColorMultiplier: 1
+ m_FadeDuration: 0.1
+ m_SpriteState:
+ m_HighlightedSprite: {fileID: 0}
+ m_PressedSprite: {fileID: 0}
+ m_DisabledSprite: {fileID: 0}
+ m_AnimationTriggers:
+ m_NormalTrigger: Normal
+ m_HighlightedTrigger: Highlighted
+ m_PressedTrigger: Pressed
+ m_DisabledTrigger: Disabled
+ m_Interactable: 1
+ m_TargetGraphic: {fileID: 114531233940747562}
+ m_OnClick:
+ m_PersistentCalls:
+ m_Calls: []
+ m_TypeName: UnityEngine.UI.Button+ButtonClickedEvent, UnityEngine.UI, Version=1.0.0.0,
+ Culture=neutral, PublicKeyToken=null
+--- !u!114 &114332259168256334
+MonoBehaviour:
+ m_ObjectHideFlags: 1
+ m_PrefabParentObject: {fileID: 0}
+ m_PrefabInternal: {fileID: 100100000}
+ m_GameObject: {fileID: 1940818438327928}
+ m_Enabled: 1
+ m_EditorHideFlags: 0
+ m_Script: {fileID: 708705254, guid: f70555f144d8491a825f0804e09c671c, type: 3}
+ m_Name:
+ m_EditorClassIdentifier:
+ m_Material: {fileID: 0}
+ m_Color: {r: 0.19607843, g: 0.19607843, b: 0.19607843, a: 1}
+ m_RaycastTarget: 1
+ m_OnCullStateChanged:
+ m_PersistentCalls:
+ m_Calls: []
+ m_TypeName: UnityEngine.UI.MaskableGraphic+CullStateChangedEvent, UnityEngine.UI,
+ Version=1.0.0.0, Culture=neutral, PublicKeyToken=null
+ m_FontData:
+ m_Font: {fileID: 10102, guid: 0000000000000000e000000000000000, type: 0}
+ m_FontSize: 45
+ m_FontStyle: 1
+ m_BestFit: 0
+ m_MinSize: 0
+ m_MaxSize: 45
+ m_Alignment: 0
+ m_AlignByGeometry: 0
+ m_RichText: 1
+ m_HorizontalOverflow: 0
+ m_VerticalOverflow: 0
+ m_LineSpacing: 1
+ m_Text: 5 second(s) remaining
+--- !u!114 &114380357142010322
+MonoBehaviour:
+ m_ObjectHideFlags: 1
+ m_PrefabParentObject: {fileID: 0}
+ m_PrefabInternal: {fileID: 100100000}
+ m_GameObject: {fileID: 1839101188223610}
+ m_Enabled: 1
+ m_EditorHideFlags: 0
+ m_Script: {fileID: 708705254, guid: f70555f144d8491a825f0804e09c671c, type: 3}
+ m_Name:
+ m_EditorClassIdentifier:
+ m_Material: {fileID: 0}
+ m_Color: {r: 0.19607843, g: 0.19607843, b: 0.19607843, a: 1}
+ m_RaycastTarget: 1
+ m_OnCullStateChanged:
+ m_PersistentCalls:
+ m_Calls: []
+ m_TypeName: UnityEngine.UI.MaskableGraphic+CullStateChangedEvent, UnityEngine.UI,
+ Version=1.0.0.0, Culture=neutral, PublicKeyToken=null
+ m_FontData:
+ m_Font: {fileID: 10102, guid: 0000000000000000e000000000000000, type: 0}
+ m_FontSize: 45
+ m_FontStyle: 1
+ m_BestFit: 0
+ m_MinSize: 0
+ m_MaxSize: 50
+ m_Alignment: 4
+ m_AlignByGeometry: 0
+ m_RichText: 1
+ m_HorizontalOverflow: 0
+ m_VerticalOverflow: 0
+ m_LineSpacing: 1
+ m_Text: Close Ad
+--- !u!114 &114531233940747562
+MonoBehaviour:
+ m_ObjectHideFlags: 1
+ m_PrefabParentObject: {fileID: 0}
+ m_PrefabInternal: {fileID: 100100000}
+ m_GameObject: {fileID: 1128573709916514}
+ m_Enabled: 1
+ m_EditorHideFlags: 0
+ m_Script: {fileID: -765806418, guid: f70555f144d8491a825f0804e09c671c, type: 3}
+ m_Name:
+ m_EditorClassIdentifier:
+ m_Material: {fileID: 0}
+ m_Color: {r: 1, g: 1, b: 1, a: 1}
+ m_RaycastTarget: 1
+ m_OnCullStateChanged:
+ m_PersistentCalls:
+ m_Calls: []
+ m_TypeName: UnityEngine.UI.MaskableGraphic+CullStateChangedEvent, UnityEngine.UI,
+ Version=1.0.0.0, Culture=neutral, PublicKeyToken=null
+ m_Sprite: {fileID: 10905, guid: 0000000000000000f000000000000000, type: 0}
+ m_Type: 1
+ m_PreserveAspect: 0
+ m_FillCenter: 1
+ m_FillMethod: 4
+ m_FillAmount: 1
+ m_FillClockwise: 1
+ m_FillOrigin: 0
+--- !u!114 &114637091538056986
+MonoBehaviour:
+ m_ObjectHideFlags: 1
+ m_PrefabParentObject: {fileID: 0}
+ m_PrefabInternal: {fileID: 100100000}
+ m_GameObject: {fileID: 1776151137375062}
+ m_Enabled: 1
+ m_EditorHideFlags: 0
+ m_Script: {fileID: 1392445389, guid: f70555f144d8491a825f0804e09c671c, type: 3}
+ m_Name:
+ m_EditorClassIdentifier:
+ m_Navigation:
+ m_Mode: 3
+ m_SelectOnUp: {fileID: 0}
+ m_SelectOnDown: {fileID: 0}
+ m_SelectOnLeft: {fileID: 0}
+ m_SelectOnRight: {fileID: 0}
+ m_Transition: 1
+ m_Colors:
+ m_NormalColor: {r: 1, g: 1, b: 1, a: 1}
+ m_HighlightedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1}
+ m_PressedColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 1}
+ m_DisabledColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 0.5019608}
+ m_ColorMultiplier: 1
+ m_FadeDuration: 0.1
+ m_SpriteState:
+ m_HighlightedSprite: {fileID: 0}
+ m_PressedSprite: {fileID: 0}
+ m_DisabledSprite: {fileID: 0}
+ m_AnimationTriggers:
+ m_NormalTrigger: Normal
+ m_HighlightedTrigger: Highlighted
+ m_PressedTrigger: Pressed
+ m_DisabledTrigger: Disabled
+ m_Interactable: 1
+ m_TargetGraphic: {fileID: 114818721744753168}
+ m_OnClick:
+ m_PersistentCalls:
+ m_Calls: []
+ m_TypeName: UnityEngine.UI.Button+ButtonClickedEvent, UnityEngine.UI, Version=1.0.0.0,
+ Culture=neutral, PublicKeyToken=null
+--- !u!114 &114758204355010086
+MonoBehaviour:
+ m_ObjectHideFlags: 1
+ m_PrefabParentObject: {fileID: 0}
+ m_PrefabInternal: {fileID: 100100000}
+ m_GameObject: {fileID: 1372156606540976}
+ m_Enabled: 1
+ m_EditorHideFlags: 0
+ m_Script: {fileID: 1980459831, guid: f70555f144d8491a825f0804e09c671c, type: 3}
+ m_Name:
+ m_EditorClassIdentifier:
+ m_UiScaleMode: 1
+ m_ReferencePixelsPerUnit: 100
+ m_ScaleFactor: 1
+ m_ReferenceResolution: {x: 2960, y: 1440}
+ m_ScreenMatchMode: 0
+ m_MatchWidthOrHeight: 0.5
+ m_PhysicalUnit: 3
+ m_FallbackScreenDPI: 96
+ m_DefaultSpriteDPI: 96
+ m_DynamicPixelsPerUnit: 1
+--- !u!114 &114768781952071512
+MonoBehaviour:
+ m_ObjectHideFlags: 1
+ m_PrefabParentObject: {fileID: 0}
+ m_PrefabInternal: {fileID: 100100000}
+ m_GameObject: {fileID: 1372156606540976}
+ m_Enabled: 1
+ m_EditorHideFlags: 0
+ m_Script: {fileID: 1301386320, guid: f70555f144d8491a825f0804e09c671c, type: 3}
+ m_Name:
+ m_EditorClassIdentifier:
+ m_IgnoreReversedGraphics: 1
+ m_BlockingObjects: 0
+ m_BlockingMask:
+ serializedVersion: 2
+ m_Bits: 4294967295
+--- !u!114 &114818721744753168
+MonoBehaviour:
+ m_ObjectHideFlags: 1
+ m_PrefabParentObject: {fileID: 0}
+ m_PrefabInternal: {fileID: 100100000}
+ m_GameObject: {fileID: 1776151137375062}
+ m_Enabled: 1
+ m_EditorHideFlags: 0
+ m_Script: {fileID: -765806418, guid: f70555f144d8491a825f0804e09c671c, type: 3}
+ m_Name:
+ m_EditorClassIdentifier:
+ m_Material: {fileID: 0}
+ m_Color: {r: 1, g: 1, b: 1, a: 1}
+ m_RaycastTarget: 1
+ m_OnCullStateChanged:
+ m_PersistentCalls:
+ m_Calls: []
+ m_TypeName: UnityEngine.UI.MaskableGraphic+CullStateChangedEvent, UnityEngine.UI,
+ Version=1.0.0.0, Culture=neutral, PublicKeyToken=null
+ m_Sprite: {fileID: 21300000, guid: 4c69db43dbd474a2987be5807129b4cc, type: 3}
+ m_Type: 0
+ m_PreserveAspect: 0
+ m_FillCenter: 1
+ m_FillMethod: 4
+ m_FillAmount: 1
+ m_FillClockwise: 1
+ m_FillOrigin: 0
+--- !u!222 &222796572593907422
+CanvasRenderer:
+ m_ObjectHideFlags: 1
+ m_PrefabParentObject: {fileID: 0}
+ m_PrefabInternal: {fileID: 100100000}
+ m_GameObject: {fileID: 1266630977519298}
+--- !u!222 &222848794251129344
+CanvasRenderer:
+ m_ObjectHideFlags: 1
+ m_PrefabParentObject: {fileID: 0}
+ m_PrefabInternal: {fileID: 100100000}
+ m_GameObject: {fileID: 1839101188223610}
+--- !u!222 &222966908609815736
+CanvasRenderer:
+ m_ObjectHideFlags: 1
+ m_PrefabParentObject: {fileID: 0}
+ m_PrefabInternal: {fileID: 100100000}
+ m_GameObject: {fileID: 1940818438327928}
+--- !u!222 &222969686989629696
+CanvasRenderer:
+ m_ObjectHideFlags: 1
+ m_PrefabParentObject: {fileID: 0}
+ m_PrefabInternal: {fileID: 100100000}
+ m_GameObject: {fileID: 1776151137375062}
+--- !u!222 &222982220858172370
+CanvasRenderer:
+ m_ObjectHideFlags: 1
+ m_PrefabParentObject: {fileID: 0}
+ m_PrefabInternal: {fileID: 100100000}
+ m_GameObject: {fileID: 1128573709916514}
+--- !u!223 &223553207263892384
+Canvas:
+ m_ObjectHideFlags: 1
+ m_PrefabParentObject: {fileID: 0}
+ m_PrefabInternal: {fileID: 100100000}
+ m_GameObject: {fileID: 1372156606540976}
+ m_Enabled: 1
+ serializedVersion: 3
+ m_RenderMode: 0
+ m_Camera: {fileID: 0}
+ m_PlaneDistance: 100
+ m_PixelPerfect: 0
+ m_ReceivesEvents: 1
+ m_OverrideSorting: 0
+ m_OverridePixelPerfect: 0
+ m_SortingBucketNormalizedSize: 0
+ m_AdditionalShaderChannelsFlag: 0
+ m_SortingLayerID: 0
+ m_SortingOrder: 0
+ m_TargetDisplay: 0
+--- !u!224 &224061913340101242
+RectTransform:
+ m_ObjectHideFlags: 1
+ m_PrefabParentObject: {fileID: 0}
+ m_PrefabInternal: {fileID: 100100000}
+ m_GameObject: {fileID: 1940818438327928}
+ m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
+ m_LocalPosition: {x: 0, y: 0, z: 0}
+ m_LocalScale: {x: 1, y: 1, z: 1}
+ m_Children: []
+ m_Father: {fileID: 224516481964458542}
+ m_RootOrder: 1
+ m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
+ m_AnchorMin: {x: 0, y: 1}
+ m_AnchorMax: {x: 0, y: 1}
+ m_AnchoredPosition: {x: 290, y: -42.7}
+ m_SizeDelta: {x: 493, y: 51.4}
+ m_Pivot: {x: 0.5, y: 0.5}
+--- !u!224 &224230749014027406
+RectTransform:
+ m_ObjectHideFlags: 1
+ m_PrefabParentObject: {fileID: 0}
+ m_PrefabInternal: {fileID: 100100000}
+ m_GameObject: {fileID: 1266630977519298}
+ m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
+ m_LocalPosition: {x: 0, y: 0, z: 0}
+ m_LocalScale: {x: 1, y: 1, z: 1}
+ m_Children: []
+ m_Father: {fileID: 224692589100518744}
+ m_RootOrder: 0
+ m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
+ m_AnchorMin: {x: 0, y: 0}
+ m_AnchorMax: {x: 1, y: 1}
+ m_AnchoredPosition: {x: 0, y: 0}
+ m_SizeDelta: {x: 0, y: 0}
+ m_Pivot: {x: 0.5, y: 0.5}
+--- !u!224 &224516481964458542
+RectTransform:
+ m_ObjectHideFlags: 1
+ m_PrefabParentObject: {fileID: 0}
+ m_PrefabInternal: {fileID: 100100000}
+ m_GameObject: {fileID: 1776151137375062}
+ m_LocalRotation: {x: -0, y: -0, z: -0, w: 1}
+ m_LocalPosition: {x: 0, y: 0, z: 0}
+ m_LocalScale: {x: 1, y: 1, z: 1}
+ m_Children:
+ - {fileID: 224613362496813788}
+ - {fileID: 224061913340101242}
+ m_Father: {fileID: 224692589100518744}
+ m_RootOrder: 1
+ m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
+ m_AnchorMin: {x: 0.5, y: 0.5}
+ m_AnchorMax: {x: 0.5, y: 0.5}
+ m_AnchoredPosition: {x: 0, y: 0}
+ m_SizeDelta: {x: 2000, y: 1436}
+ m_Pivot: {x: 0.5, y: 0.5}
+--- !u!224 &224613362496813788
+RectTransform:
+ m_ObjectHideFlags: 1
+ m_PrefabParentObject: {fileID: 0}
+ m_PrefabInternal: {fileID: 100100000}
+ m_GameObject: {fileID: 1128573709916514}
+ m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
+ m_LocalPosition: {x: 0, y: 0, z: 0}
+ m_LocalScale: {x: 1, y: 1, z: 1}
+ m_Children:
+ - {fileID: 224920559942719848}
+ m_Father: {fileID: 224516481964458542}
+ m_RootOrder: 0
+ m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
+ m_AnchorMin: {x: 0, y: 1}
+ m_AnchorMax: {x: 0, y: 1}
+ m_AnchoredPosition: {x: 161.38, y: -34.2}
+ m_SizeDelta: {x: 323, y: 68.4}
+ m_Pivot: {x: 0.5, y: 0.5}
+--- !u!224 &224692589100518744
+RectTransform:
+ m_ObjectHideFlags: 1
+ m_PrefabParentObject: {fileID: 0}
+ m_PrefabInternal: {fileID: 100100000}
+ m_GameObject: {fileID: 1372156606540976}
+ m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
+ m_LocalPosition: {x: 0, y: 0, z: 0}
+ m_LocalScale: {x: 0, y: 0, z: 0}
+ m_Children:
+ - {fileID: 224230749014027406}
+ - {fileID: 224516481964458542}
+ m_Father: {fileID: 0}
+ m_RootOrder: 0
+ m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
+ m_AnchorMin: {x: 0, y: 0}
+ m_AnchorMax: {x: 0, y: 0}
+ m_AnchoredPosition: {x: 0, y: 0}
+ m_SizeDelta: {x: 0, y: 0}
+ m_Pivot: {x: 0, y: 0}
+--- !u!224 &224920559942719848
+RectTransform:
+ m_ObjectHideFlags: 1
+ m_PrefabParentObject: {fileID: 0}
+ m_PrefabInternal: {fileID: 100100000}
+ m_GameObject: {fileID: 1839101188223610}
+ m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
+ m_LocalPosition: {x: 0, y: 0, z: 0}
+ m_LocalScale: {x: 1, y: 1, z: 1}
+ m_Children: []
+ m_Father: {fileID: 224613362496813788}
+ m_RootOrder: 0
+ m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
+ m_AnchorMin: {x: 0, y: 0}
+ m_AnchorMax: {x: 1, y: 1}
+ m_AnchoredPosition: {x: 0, y: 0}
+ m_SizeDelta: {x: 0, y: 0}
+ m_Pivot: {x: 0.5, y: 0.5}
diff --git a/Assets/GoogleMobileAds/Editor/Resources/PlaceholderAds/Rewarded/1024x768.prefab.meta b/Assets/GoogleMobileAds/Editor/Resources/PlaceholderAds/Rewarded/1024x768.prefab.meta
new file mode 100644
index 0000000..156ebc1
--- /dev/null
+++ b/Assets/GoogleMobileAds/Editor/Resources/PlaceholderAds/Rewarded/1024x768.prefab.meta
@@ -0,0 +1,13 @@
+fileFormatVersion: 2
+guid: ac0a546bb4fb349229fc5824b288ec00
+labels:
+- gvh
+- gvh_version-10.6.0
+- gvhp_exportpath-GoogleMobileAds/Editor/Resources/PlaceholderAds/Rewarded/1024x768.prefab
+timeCreated: 1480838400
+NativeFormatImporter:
+ externalObjects: {}
+ mainObjectFileID: 100100000
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/GoogleMobileAds/Editor/Resources/PlaceholderAds/Rewarded/768x1024.prefab b/Assets/GoogleMobileAds/Editor/Resources/PlaceholderAds/Rewarded/768x1024.prefab
new file mode 100644
index 0000000..3435626
--- /dev/null
+++ b/Assets/GoogleMobileAds/Editor/Resources/PlaceholderAds/Rewarded/768x1024.prefab
@@ -0,0 +1,547 @@
+%YAML 1.1
+%TAG !u! tag:unity3d.com,2011:
+--- !u!1001 &100100000
+Prefab:
+ m_ObjectHideFlags: 1
+ serializedVersion: 2
+ m_Modification:
+ m_TransformParent: {fileID: 0}
+ m_Modifications: []
+ m_RemovedComponents: []
+ m_ParentPrefab: {fileID: 0}
+ m_RootGameObject: {fileID: 1632466019560500}
+ m_IsPrefabParent: 1
+--- !u!1 &1145201493799244
+GameObject:
+ m_ObjectHideFlags: 1
+ m_PrefabParentObject: {fileID: 0}
+ m_PrefabInternal: {fileID: 100100000}
+ serializedVersion: 5
+ m_Component:
+ - component: {fileID: 224859375040150520}
+ - component: {fileID: 222539723179981582}
+ - component: {fileID: 114644123904461240}
+ m_Layer: 5
+ m_Name: Text
+ m_TagString: Untagged
+ m_Icon: {fileID: 0}
+ m_NavMeshLayer: 0
+ m_StaticEditorFlags: 0
+ m_IsActive: 1
+--- !u!1 &1440340526681520
+GameObject:
+ m_ObjectHideFlags: 0
+ m_PrefabParentObject: {fileID: 0}
+ m_PrefabInternal: {fileID: 100100000}
+ serializedVersion: 5
+ m_Component:
+ - component: {fileID: 224646837243202000}
+ - component: {fileID: 222062092593612000}
+ - component: {fileID: 114435428706387640}
+ - component: {fileID: 114820238492461956}
+ m_Layer: 5
+ m_Name: Ad
+ m_TagString: Untagged
+ m_Icon: {fileID: 0}
+ m_NavMeshLayer: 0
+ m_StaticEditorFlags: 0
+ m_IsActive: 1
+--- !u!1 &1632466019560500
+GameObject:
+ m_ObjectHideFlags: 0
+ m_PrefabParentObject: {fileID: 0}
+ m_PrefabInternal: {fileID: 100100000}
+ serializedVersion: 5
+ m_Component:
+ - component: {fileID: 224858207565310680}
+ - component: {fileID: 223253263155428692}
+ - component: {fileID: 114432944070235470}
+ - component: {fileID: 114257052656689914}
+ m_Layer: 5
+ m_Name: 768x1024
+ m_TagString: Untagged
+ m_Icon: {fileID: 0}
+ m_NavMeshLayer: 0
+ m_StaticEditorFlags: 0
+ m_IsActive: 1
+--- !u!1 &1641665161670648
+GameObject:
+ m_ObjectHideFlags: 1
+ m_PrefabParentObject: {fileID: 0}
+ m_PrefabInternal: {fileID: 100100000}
+ serializedVersion: 5
+ m_Component:
+ - component: {fileID: 224559117849289246}
+ - component: {fileID: 222246365610716666}
+ - component: {fileID: 114514696656541846}
+ m_Layer: 5
+ m_Name: Text
+ m_TagString: Untagged
+ m_Icon: {fileID: 0}
+ m_NavMeshLayer: 0
+ m_StaticEditorFlags: 0
+ m_IsActive: 1
+--- !u!1 &1652198827308984
+GameObject:
+ m_ObjectHideFlags: 1
+ m_PrefabParentObject: {fileID: 0}
+ m_PrefabInternal: {fileID: 100100000}
+ serializedVersion: 5
+ m_Component:
+ - component: {fileID: 224172518945175052}
+ - component: {fileID: 222229915290430514}
+ - component: {fileID: 114777983548721902}
+ - component: {fileID: 114638760954846786}
+ m_Layer: 5
+ m_Name: Button
+ m_TagString: Untagged
+ m_Icon: {fileID: 0}
+ m_NavMeshLayer: 0
+ m_StaticEditorFlags: 0
+ m_IsActive: 1
+--- !u!1 &1728821091649996
+GameObject:
+ m_ObjectHideFlags: 0
+ m_PrefabParentObject: {fileID: 0}
+ m_PrefabInternal: {fileID: 100100000}
+ serializedVersion: 5
+ m_Component:
+ - component: {fileID: 224102788109289026}
+ - component: {fileID: 222431000284531562}
+ - component: {fileID: 114197769342207226}
+ m_Layer: 5
+ m_Name: Background
+ m_TagString: Untagged
+ m_Icon: {fileID: 0}
+ m_NavMeshLayer: 0
+ m_StaticEditorFlags: 0
+ m_IsActive: 1
+--- !u!114 &114197769342207226
+MonoBehaviour:
+ m_ObjectHideFlags: 1
+ m_PrefabParentObject: {fileID: 0}
+ m_PrefabInternal: {fileID: 100100000}
+ m_GameObject: {fileID: 1728821091649996}
+ m_Enabled: 1
+ m_EditorHideFlags: 0
+ m_Script: {fileID: -765806418, guid: f70555f144d8491a825f0804e09c671c, type: 3}
+ m_Name:
+ m_EditorClassIdentifier:
+ m_Material: {fileID: 0}
+ m_Color: {r: 0, g: 0, b: 0, a: 0.80784315}
+ m_RaycastTarget: 1
+ m_OnCullStateChanged:
+ m_PersistentCalls:
+ m_Calls: []
+ m_TypeName: UnityEngine.UI.MaskableGraphic+CullStateChangedEvent, UnityEngine.UI,
+ Version=1.0.0.0, Culture=neutral, PublicKeyToken=null
+ m_Sprite: {fileID: 0}
+ m_Type: 0
+ m_PreserveAspect: 0
+ m_FillCenter: 1
+ m_FillMethod: 4
+ m_FillAmount: 1
+ m_FillClockwise: 1
+ m_FillOrigin: 0
+--- !u!114 &114257052656689914
+MonoBehaviour:
+ m_ObjectHideFlags: 1
+ m_PrefabParentObject: {fileID: 0}
+ m_PrefabInternal: {fileID: 100100000}
+ m_GameObject: {fileID: 1632466019560500}
+ m_Enabled: 1
+ m_EditorHideFlags: 0
+ m_Script: {fileID: 1301386320, guid: f70555f144d8491a825f0804e09c671c, type: 3}
+ m_Name:
+ m_EditorClassIdentifier:
+ m_IgnoreReversedGraphics: 1
+ m_BlockingObjects: 0
+ m_BlockingMask:
+ serializedVersion: 2
+ m_Bits: 4294967295
+--- !u!114 &114432944070235470
+MonoBehaviour:
+ m_ObjectHideFlags: 1
+ m_PrefabParentObject: {fileID: 0}
+ m_PrefabInternal: {fileID: 100100000}
+ m_GameObject: {fileID: 1632466019560500}
+ m_Enabled: 1
+ m_EditorHideFlags: 0
+ m_Script: {fileID: 1980459831, guid: f70555f144d8491a825f0804e09c671c, type: 3}
+ m_Name:
+ m_EditorClassIdentifier:
+ m_UiScaleMode: 1
+ m_ReferencePixelsPerUnit: 100
+ m_ScaleFactor: 1
+ m_ReferenceResolution: {x: 1440, y: 2960}
+ m_ScreenMatchMode: 0
+ m_MatchWidthOrHeight: 0.495
+ m_PhysicalUnit: 3
+ m_FallbackScreenDPI: 96
+ m_DefaultSpriteDPI: 96
+ m_DynamicPixelsPerUnit: 1
+--- !u!114 &114435428706387640
+MonoBehaviour:
+ m_ObjectHideFlags: 1
+ m_PrefabParentObject: {fileID: 0}
+ m_PrefabInternal: {fileID: 100100000}
+ m_GameObject: {fileID: 1440340526681520}
+ m_Enabled: 1
+ m_EditorHideFlags: 0
+ m_Script: {fileID: -765806418, guid: f70555f144d8491a825f0804e09c671c, type: 3}
+ m_Name:
+ m_EditorClassIdentifier:
+ m_Material: {fileID: 0}
+ m_Color: {r: 1, g: 1, b: 1, a: 1}
+ m_RaycastTarget: 1
+ m_OnCullStateChanged:
+ m_PersistentCalls:
+ m_Calls: []
+ m_TypeName: UnityEngine.UI.MaskableGraphic+CullStateChangedEvent, UnityEngine.UI,
+ Version=1.0.0.0, Culture=neutral, PublicKeyToken=null
+ m_Sprite: {fileID: 21300000, guid: 8a53f9c63a5e94b14a98698a7b07365b, type: 3}
+ m_Type: 0
+ m_PreserveAspect: 0
+ m_FillCenter: 1
+ m_FillMethod: 4
+ m_FillAmount: 1
+ m_FillClockwise: 1
+ m_FillOrigin: 0
+--- !u!114 &114514696656541846
+MonoBehaviour:
+ m_ObjectHideFlags: 1
+ m_PrefabParentObject: {fileID: 0}
+ m_PrefabInternal: {fileID: 100100000}
+ m_GameObject: {fileID: 1641665161670648}
+ m_Enabled: 1
+ m_EditorHideFlags: 0
+ m_Script: {fileID: 708705254, guid: f70555f144d8491a825f0804e09c671c, type: 3}
+ m_Name:
+ m_EditorClassIdentifier:
+ m_Material: {fileID: 0}
+ m_Color: {r: 0.19607843, g: 0.19607843, b: 0.19607843, a: 1}
+ m_RaycastTarget: 1
+ m_OnCullStateChanged:
+ m_PersistentCalls:
+ m_Calls: []
+ m_TypeName: UnityEngine.UI.MaskableGraphic+CullStateChangedEvent, UnityEngine.UI,
+ Version=1.0.0.0, Culture=neutral, PublicKeyToken=null
+ m_FontData:
+ m_Font: {fileID: 10102, guid: 0000000000000000e000000000000000, type: 0}
+ m_FontSize: 40
+ m_FontStyle: 1
+ m_BestFit: 0
+ m_MinSize: 2
+ m_MaxSize: 40
+ m_Alignment: 4
+ m_AlignByGeometry: 0
+ m_RichText: 1
+ m_HorizontalOverflow: 0
+ m_VerticalOverflow: 0
+ m_LineSpacing: 1
+ m_Text: Close Ad
+--- !u!114 &114638760954846786
+MonoBehaviour:
+ m_ObjectHideFlags: 1
+ m_PrefabParentObject: {fileID: 0}
+ m_PrefabInternal: {fileID: 100100000}
+ m_GameObject: {fileID: 1652198827308984}
+ m_Enabled: 1
+ m_EditorHideFlags: 0
+ m_Script: {fileID: 1392445389, guid: f70555f144d8491a825f0804e09c671c, type: 3}
+ m_Name:
+ m_EditorClassIdentifier:
+ m_Navigation:
+ m_Mode: 3
+ m_SelectOnUp: {fileID: 0}
+ m_SelectOnDown: {fileID: 0}
+ m_SelectOnLeft: {fileID: 0}
+ m_SelectOnRight: {fileID: 0}
+ m_Transition: 1
+ m_Colors:
+ m_NormalColor: {r: 1, g: 1, b: 1, a: 1}
+ m_HighlightedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1}
+ m_PressedColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 1}
+ m_DisabledColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 0.5019608}
+ m_ColorMultiplier: 1
+ m_FadeDuration: 0.1
+ m_SpriteState:
+ m_HighlightedSprite: {fileID: 0}
+ m_PressedSprite: {fileID: 0}
+ m_DisabledSprite: {fileID: 0}
+ m_AnimationTriggers:
+ m_NormalTrigger: Normal
+ m_HighlightedTrigger: Highlighted
+ m_PressedTrigger: Pressed
+ m_DisabledTrigger: Disabled
+ m_Interactable: 1
+ m_TargetGraphic: {fileID: 114777983548721902}
+ m_OnClick:
+ m_PersistentCalls:
+ m_Calls: []
+ m_TypeName: UnityEngine.UI.Button+ButtonClickedEvent, UnityEngine.UI, Version=1.0.0.0,
+ Culture=neutral, PublicKeyToken=null
+--- !u!114 &114644123904461240
+MonoBehaviour:
+ m_ObjectHideFlags: 1
+ m_PrefabParentObject: {fileID: 0}
+ m_PrefabInternal: {fileID: 100100000}
+ m_GameObject: {fileID: 1145201493799244}
+ m_Enabled: 1
+ m_EditorHideFlags: 0
+ m_Script: {fileID: 708705254, guid: f70555f144d8491a825f0804e09c671c, type: 3}
+ m_Name:
+ m_EditorClassIdentifier:
+ m_Material: {fileID: 0}
+ m_Color: {r: 0.19607843, g: 0.19607843, b: 0.19607843, a: 1}
+ m_RaycastTarget: 1
+ m_OnCullStateChanged:
+ m_PersistentCalls:
+ m_Calls: []
+ m_TypeName: UnityEngine.UI.MaskableGraphic+CullStateChangedEvent, UnityEngine.UI,
+ Version=1.0.0.0, Culture=neutral, PublicKeyToken=null
+ m_FontData:
+ m_Font: {fileID: 10102, guid: 0000000000000000e000000000000000, type: 0}
+ m_FontSize: 40
+ m_FontStyle: 1
+ m_BestFit: 0
+ m_MinSize: 0
+ m_MaxSize: 40
+ m_Alignment: 0
+ m_AlignByGeometry: 0
+ m_RichText: 1
+ m_HorizontalOverflow: 0
+ m_VerticalOverflow: 0
+ m_LineSpacing: 1
+ m_Text: 5 second(s) remaining
+--- !u!114 &114777983548721902
+MonoBehaviour:
+ m_ObjectHideFlags: 1
+ m_PrefabParentObject: {fileID: 0}
+ m_PrefabInternal: {fileID: 100100000}
+ m_GameObject: {fileID: 1652198827308984}
+ m_Enabled: 1
+ m_EditorHideFlags: 0
+ m_Script: {fileID: -765806418, guid: f70555f144d8491a825f0804e09c671c, type: 3}
+ m_Name:
+ m_EditorClassIdentifier:
+ m_Material: {fileID: 0}
+ m_Color: {r: 1, g: 1, b: 1, a: 1}
+ m_RaycastTarget: 1
+ m_OnCullStateChanged:
+ m_PersistentCalls:
+ m_Calls: []
+ m_TypeName: UnityEngine.UI.MaskableGraphic+CullStateChangedEvent, UnityEngine.UI,
+ Version=1.0.0.0, Culture=neutral, PublicKeyToken=null
+ m_Sprite: {fileID: 10905, guid: 0000000000000000f000000000000000, type: 0}
+ m_Type: 1
+ m_PreserveAspect: 0
+ m_FillCenter: 1
+ m_FillMethod: 4
+ m_FillAmount: 1
+ m_FillClockwise: 1
+ m_FillOrigin: 0
+--- !u!114 &114820238492461956
+MonoBehaviour:
+ m_ObjectHideFlags: 1
+ m_PrefabParentObject: {fileID: 0}
+ m_PrefabInternal: {fileID: 100100000}
+ m_GameObject: {fileID: 1440340526681520}
+ m_Enabled: 1
+ m_EditorHideFlags: 0
+ m_Script: {fileID: 1392445389, guid: f70555f144d8491a825f0804e09c671c, type: 3}
+ m_Name:
+ m_EditorClassIdentifier:
+ m_Navigation:
+ m_Mode: 3
+ m_SelectOnUp: {fileID: 0}
+ m_SelectOnDown: {fileID: 0}
+ m_SelectOnLeft: {fileID: 0}
+ m_SelectOnRight: {fileID: 0}
+ m_Transition: 1
+ m_Colors:
+ m_NormalColor: {r: 1, g: 1, b: 1, a: 1}
+ m_HighlightedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1}
+ m_PressedColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 1}
+ m_DisabledColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 0.5019608}
+ m_ColorMultiplier: 1
+ m_FadeDuration: 0.1
+ m_SpriteState:
+ m_HighlightedSprite: {fileID: 0}
+ m_PressedSprite: {fileID: 0}
+ m_DisabledSprite: {fileID: 0}
+ m_AnimationTriggers:
+ m_NormalTrigger: Normal
+ m_HighlightedTrigger: Highlighted
+ m_PressedTrigger: Pressed
+ m_DisabledTrigger: Disabled
+ m_Interactable: 1
+ m_TargetGraphic: {fileID: 114435428706387640}
+ m_OnClick:
+ m_PersistentCalls:
+ m_Calls: []
+ m_TypeName: UnityEngine.UI.Button+ButtonClickedEvent, UnityEngine.UI, Version=1.0.0.0,
+ Culture=neutral, PublicKeyToken=null
+--- !u!222 &222062092593612000
+CanvasRenderer:
+ m_ObjectHideFlags: 1
+ m_PrefabParentObject: {fileID: 0}
+ m_PrefabInternal: {fileID: 100100000}
+ m_GameObject: {fileID: 1440340526681520}
+--- !u!222 &222229915290430514
+CanvasRenderer:
+ m_ObjectHideFlags: 1
+ m_PrefabParentObject: {fileID: 0}
+ m_PrefabInternal: {fileID: 100100000}
+ m_GameObject: {fileID: 1652198827308984}
+--- !u!222 &222246365610716666
+CanvasRenderer:
+ m_ObjectHideFlags: 1
+ m_PrefabParentObject: {fileID: 0}
+ m_PrefabInternal: {fileID: 100100000}
+ m_GameObject: {fileID: 1641665161670648}
+--- !u!222 &222431000284531562
+CanvasRenderer:
+ m_ObjectHideFlags: 1
+ m_PrefabParentObject: {fileID: 0}
+ m_PrefabInternal: {fileID: 100100000}
+ m_GameObject: {fileID: 1728821091649996}
+--- !u!222 &222539723179981582
+CanvasRenderer:
+ m_ObjectHideFlags: 1
+ m_PrefabParentObject: {fileID: 0}
+ m_PrefabInternal: {fileID: 100100000}
+ m_GameObject: {fileID: 1145201493799244}
+--- !u!223 &223253263155428692
+Canvas:
+ m_ObjectHideFlags: 1
+ m_PrefabParentObject: {fileID: 0}
+ m_PrefabInternal: {fileID: 100100000}
+ m_GameObject: {fileID: 1632466019560500}
+ m_Enabled: 1
+ serializedVersion: 3
+ m_RenderMode: 0
+ m_Camera: {fileID: 0}
+ m_PlaneDistance: 100
+ m_PixelPerfect: 0
+ m_ReceivesEvents: 1
+ m_OverrideSorting: 0
+ m_OverridePixelPerfect: 0
+ m_SortingBucketNormalizedSize: 0
+ m_AdditionalShaderChannelsFlag: 0
+ m_SortingLayerID: 0
+ m_SortingOrder: 0
+ m_TargetDisplay: 0
+--- !u!224 &224102788109289026
+RectTransform:
+ m_ObjectHideFlags: 1
+ m_PrefabParentObject: {fileID: 0}
+ m_PrefabInternal: {fileID: 100100000}
+ m_GameObject: {fileID: 1728821091649996}
+ m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
+ m_LocalPosition: {x: 0, y: 0, z: 0}
+ m_LocalScale: {x: 1, y: 1, z: 1}
+ m_Children: []
+ m_Father: {fileID: 224858207565310680}
+ m_RootOrder: 0
+ m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
+ m_AnchorMin: {x: 0, y: 0}
+ m_AnchorMax: {x: 1, y: 1}
+ m_AnchoredPosition: {x: 0, y: 0}
+ m_SizeDelta: {x: 0, y: 0}
+ m_Pivot: {x: 0.5, y: 0.5}
+--- !u!224 &224172518945175052
+RectTransform:
+ m_ObjectHideFlags: 1
+ m_PrefabParentObject: {fileID: 0}
+ m_PrefabInternal: {fileID: 100100000}
+ m_GameObject: {fileID: 1652198827308984}
+ m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
+ m_LocalPosition: {x: 0, y: 0, z: 0}
+ m_LocalScale: {x: 1, y: 1, z: 1}
+ m_Children:
+ - {fileID: 224559117849289246}
+ m_Father: {fileID: 224646837243202000}
+ m_RootOrder: 0
+ m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
+ m_AnchorMin: {x: 0, y: 1}
+ m_AnchorMax: {x: 0, y: 1}
+ m_AnchoredPosition: {x: 149.4, y: -35.1}
+ m_SizeDelta: {x: 298.7, y: 70.3}
+ m_Pivot: {x: 0.5, y: 0.5}
+--- !u!224 &224559117849289246
+RectTransform:
+ m_ObjectHideFlags: 1
+ m_PrefabParentObject: {fileID: 0}
+ m_PrefabInternal: {fileID: 100100000}
+ m_GameObject: {fileID: 1641665161670648}
+ m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
+ m_LocalPosition: {x: 0, y: 0, z: 0}
+ m_LocalScale: {x: 1, y: 1, z: 1}
+ m_Children: []
+ m_Father: {fileID: 224172518945175052}
+ m_RootOrder: 0
+ m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
+ m_AnchorMin: {x: 0, y: 0}
+ m_AnchorMax: {x: 1, y: 1}
+ m_AnchoredPosition: {x: 0, y: 0}
+ m_SizeDelta: {x: 0, y: 0}
+ m_Pivot: {x: 0.5, y: 0.5}
+--- !u!224 &224646837243202000
+RectTransform:
+ m_ObjectHideFlags: 1
+ m_PrefabParentObject: {fileID: 0}
+ m_PrefabInternal: {fileID: 100100000}
+ m_GameObject: {fileID: 1440340526681520}
+ m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
+ m_LocalPosition: {x: 0, y: 0, z: 0}
+ m_LocalScale: {x: 1, y: 1, z: 1}
+ m_Children:
+ - {fileID: 224172518945175052}
+ - {fileID: 224859375040150520}
+ m_Father: {fileID: 224858207565310680}
+ m_RootOrder: 1
+ m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
+ m_AnchorMin: {x: 0.5, y: 0.5}
+ m_AnchorMax: {x: 0.5, y: 0.5}
+ m_AnchoredPosition: {x: 0, y: 0}
+ m_SizeDelta: {x: 1436, y: 2000}
+ m_Pivot: {x: 0.5, y: 0.5}
+--- !u!224 &224858207565310680
+RectTransform:
+ m_ObjectHideFlags: 1
+ m_PrefabParentObject: {fileID: 0}
+ m_PrefabInternal: {fileID: 100100000}
+ m_GameObject: {fileID: 1632466019560500}
+ m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
+ m_LocalPosition: {x: 0, y: 0, z: 0}
+ m_LocalScale: {x: 0, y: 0, z: 0}
+ m_Children:
+ - {fileID: 224102788109289026}
+ - {fileID: 224646837243202000}
+ m_Father: {fileID: 0}
+ m_RootOrder: 0
+ m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
+ m_AnchorMin: {x: 0, y: 0}
+ m_AnchorMax: {x: 0, y: 0}
+ m_AnchoredPosition: {x: 0, y: 0}
+ m_SizeDelta: {x: 0, y: 0}
+ m_Pivot: {x: 0, y: 0}
+--- !u!224 &224859375040150520
+RectTransform:
+ m_ObjectHideFlags: 1
+ m_PrefabParentObject: {fileID: 0}
+ m_PrefabInternal: {fileID: 100100000}
+ m_GameObject: {fileID: 1145201493799244}
+ m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
+ m_LocalPosition: {x: 0, y: 0, z: 0}
+ m_LocalScale: {x: 1, y: 1, z: 1}
+ m_Children: []
+ m_Father: {fileID: 224646837243202000}
+ m_RootOrder: 1
+ m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
+ m_AnchorMin: {x: 0, y: 1}
+ m_AnchorMax: {x: 0, y: 1}
+ m_AnchoredPosition: {x: 237.9, y: -43.363}
+ m_SizeDelta: {x: 432.3, y: 53.775}
+ m_Pivot: {x: 0.5, y: 0.5}
diff --git a/Assets/GoogleMobileAds/Editor/Resources/PlaceholderAds/Rewarded/768x1024.prefab.meta b/Assets/GoogleMobileAds/Editor/Resources/PlaceholderAds/Rewarded/768x1024.prefab.meta
new file mode 100644
index 0000000..10319f0
--- /dev/null
+++ b/Assets/GoogleMobileAds/Editor/Resources/PlaceholderAds/Rewarded/768x1024.prefab.meta
@@ -0,0 +1,13 @@
+fileFormatVersion: 2
+guid: 4e3dd9a9607da46da8125b4b59a18db2
+labels:
+- gvh
+- gvh_version-10.6.0
+- gvhp_exportpath-GoogleMobileAds/Editor/Resources/PlaceholderAds/Rewarded/768x1024.prefab
+timeCreated: 1480838400
+NativeFormatImporter:
+ externalObjects: {}
+ mainObjectFileID: 100100000
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/GoogleMobileAds/Editor/Resources/Ump.meta b/Assets/GoogleMobileAds/Editor/Resources/Ump.meta
new file mode 100644
index 0000000..9622c5f
--- /dev/null
+++ b/Assets/GoogleMobileAds/Editor/Resources/Ump.meta
@@ -0,0 +1,8 @@
+fileFormatVersion: 2
+guid: 3b150aa0031b3f64da1e82b31dd2b8b1
+folderAsset: yes
+DefaultImporter:
+ externalObjects: {}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/GoogleMobileAds/Editor/Resources/Ump/ConsentForm.png b/Assets/GoogleMobileAds/Editor/Resources/Ump/ConsentForm.png
new file mode 100644
index 0000000..d819851
Binary files /dev/null and b/Assets/GoogleMobileAds/Editor/Resources/Ump/ConsentForm.png differ
diff --git a/Assets/GoogleMobileAds/Editor/Resources/Ump/ConsentForm.png.meta b/Assets/GoogleMobileAds/Editor/Resources/Ump/ConsentForm.png.meta
new file mode 100644
index 0000000..e3789c1
--- /dev/null
+++ b/Assets/GoogleMobileAds/Editor/Resources/Ump/ConsentForm.png.meta
@@ -0,0 +1,145 @@
+fileFormatVersion: 2
+guid: cb0d255b8cd434556a80e3ae50b24b9c
+labels:
+- gvh
+- gvh_version-7.2.1
+- gvhp_exportpath-GoogleMobileAds/Editor/Resources/DummyAds/AdImages/AdInspectorHome.png
+- gvhp_exportpath-GoogleMobileAds/Editor/Resources/Ump/ConsentForm.png
+TextureImporter:
+ internalIDToNameTable: []
+ externalObjects: {}
+ serializedVersion: 13
+ mipmaps:
+ mipMapMode: 0
+ enableMipMap: 0
+ sRGBTexture: 1
+ linearTexture: 0
+ fadeOut: 0
+ borderMipMap: 0
+ mipMapsPreserveCoverage: 0
+ alphaTestReferenceValue: 0.5
+ mipMapFadeDistanceStart: 1
+ mipMapFadeDistanceEnd: 3
+ bumpmap:
+ convertToNormalMap: 0
+ externalNormalMap: 0
+ heightScale: 0.25
+ normalMapFilter: 0
+ flipGreenChannel: 0
+ isReadable: 0
+ streamingMipmaps: 0
+ streamingMipmapsPriority: 0
+ vTOnly: 0
+ ignoreMipmapLimit: 0
+ grayScaleToAlpha: 0
+ generateCubemap: 6
+ cubemapConvolution: 0
+ seamlessCubemap: 0
+ textureFormat: 1
+ maxTextureSize: 2048
+ textureSettings:
+ serializedVersion: 2
+ filterMode: 1
+ aniso: 1
+ mipBias: 0
+ wrapU: 1
+ wrapV: 1
+ wrapW: 0
+ nPOTScale: 0
+ lightmap: 0
+ compressionQuality: 50
+ spriteMode: 1
+ spriteExtrude: 1
+ spriteMeshType: 1
+ alignment: 0
+ spritePivot: {x: 0.5, y: 0.5}
+ spritePixelsToUnits: 100
+ spriteBorder: {x: 0, y: 0, z: 0, w: 0}
+ spriteGenerateFallbackPhysicsShape: 1
+ alphaUsage: 1
+ alphaIsTransparency: 1
+ spriteTessellationDetail: -1
+ textureType: 8
+ textureShape: 1
+ singleChannelComponent: 0
+ flipbookRows: 1
+ flipbookColumns: 1
+ maxTextureSizeSet: 0
+ compressionQualitySet: 0
+ textureFormatSet: 0
+ ignorePngGamma: 0
+ applyGammaDecoding: 1
+ swizzle: 50462976
+ cookieLightType: 1
+ platformSettings:
+ - serializedVersion: 3
+ buildTarget: DefaultTexturePlatform
+ maxTextureSize: 2048
+ resizeAlgorithm: 0
+ textureFormat: -1
+ textureCompression: 1
+ compressionQuality: 50
+ crunchedCompression: 0
+ allowsAlphaSplitting: 0
+ overridden: 0
+ ignorePlatformSupport: 0
+ androidETC2FallbackOverride: 0
+ forceMaximumCompressionQuality_BC6H_BC7: 0
+ - serializedVersion: 3
+ buildTarget: Standalone
+ maxTextureSize: 2048
+ resizeAlgorithm: 0
+ textureFormat: -1
+ textureCompression: 1
+ compressionQuality: 50
+ crunchedCompression: 0
+ allowsAlphaSplitting: 0
+ overridden: 0
+ ignorePlatformSupport: 0
+ androidETC2FallbackOverride: 0
+ forceMaximumCompressionQuality_BC6H_BC7: 0
+ - serializedVersion: 3
+ buildTarget: Android
+ maxTextureSize: 2048
+ resizeAlgorithm: 0
+ textureFormat: -1
+ textureCompression: 1
+ compressionQuality: 50
+ crunchedCompression: 0
+ allowsAlphaSplitting: 0
+ overridden: 0
+ ignorePlatformSupport: 0
+ androidETC2FallbackOverride: 0
+ forceMaximumCompressionQuality_BC6H_BC7: 0
+ - serializedVersion: 3
+ buildTarget: iPhone
+ maxTextureSize: 2048
+ resizeAlgorithm: 0
+ textureFormat: -1
+ textureCompression: 1
+ compressionQuality: 50
+ crunchedCompression: 0
+ allowsAlphaSplitting: 0
+ overridden: 0
+ ignorePlatformSupport: 0
+ androidETC2FallbackOverride: 0
+ forceMaximumCompressionQuality_BC6H_BC7: 0
+ spriteSheet:
+ serializedVersion: 2
+ sprites: []
+ outline: []
+ physicsShape: []
+ bones: []
+ spriteID: 5e97eb03825dee720800000000000000
+ internalID: 0
+ vertices: []
+ indices:
+ edges: []
+ weights: []
+ secondaryTextures: []
+ nameFileIdTable: {}
+ mipmapLimitGroupName:
+ pSDRemoveMatte: 0
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/GoogleMobileAds/Editor/Resources/Ump/ConsentForm.prefab b/Assets/GoogleMobileAds/Editor/Resources/Ump/ConsentForm.prefab
new file mode 100644
index 0000000..3da58b4
--- /dev/null
+++ b/Assets/GoogleMobileAds/Editor/Resources/Ump/ConsentForm.prefab
@@ -0,0 +1,525 @@
+%YAML 1.1
+%TAG !u! tag:unity3d.com,2011:
+--- !u!1 &1026234277025590
+GameObject:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ serializedVersion: 6
+ m_Component:
+ - component: {fileID: 224770140206732756}
+ - component: {fileID: 222623742081011482}
+ - component: {fileID: 114466248550890148}
+ - component: {fileID: 114214230567826922}
+ - component: {fileID: 5577847591443948799}
+ m_Layer: 5
+ m_Name: Button
+ m_TagString: Untagged
+ m_Icon: {fileID: 0}
+ m_NavMeshLayer: 0
+ m_StaticEditorFlags: 0
+ m_IsActive: 1
+--- !u!224 &224770140206732756
+RectTransform:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 1026234277025590}
+ m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
+ m_LocalPosition: {x: 0, y: 0, z: 0}
+ m_LocalScale: {x: 1, y: 1, z: 1}
+ m_ConstrainProportionsScale: 0
+ m_Children:
+ - {fileID: 224688741740444772}
+ m_Father: {fileID: 224247655386807502}
+ m_RootOrder: 0
+ m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
+ m_AnchorMin: {x: 0.5, y: 0}
+ m_AnchorMax: {x: 0.5, y: 0}
+ m_AnchoredPosition: {x: 0, y: 280}
+ m_SizeDelta: {x: 800, y: 100}
+ m_Pivot: {x: 0.5, y: 0.5}
+--- !u!222 &222623742081011482
+CanvasRenderer:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 1026234277025590}
+ m_CullTransparentMesh: 1
+--- !u!114 &114466248550890148
+MonoBehaviour:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 1026234277025590}
+ m_Enabled: 1
+ m_EditorHideFlags: 0
+ m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3}
+ m_Name:
+ m_EditorClassIdentifier:
+ m_Material: {fileID: 0}
+ m_Color: {r: 0.23921569, g: 0.40784314, b: 0.76862746, a: 1}
+ m_RaycastTarget: 1
+ m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0}
+ m_Maskable: 1
+ m_OnCullStateChanged:
+ m_PersistentCalls:
+ m_Calls: []
+ m_Sprite: {fileID: 21300000, guid: f795a5541737a4c09a571dc953a23ba5, type: 3}
+ m_Type: 0
+ m_PreserveAspect: 0
+ m_FillCenter: 1
+ m_FillMethod: 4
+ m_FillAmount: 1
+ m_FillClockwise: 1
+ m_FillOrigin: 0
+ m_UseSpriteMesh: 0
+ m_PixelsPerUnitMultiplier: 1
+--- !u!114 &114214230567826922
+MonoBehaviour:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 1026234277025590}
+ m_Enabled: 1
+ m_EditorHideFlags: 0
+ m_Script: {fileID: 11500000, guid: 4e29b1a8efbd4b44bb3f3716e73f07ff, type: 3}
+ m_Name:
+ m_EditorClassIdentifier:
+ m_Navigation:
+ m_Mode: 3
+ m_WrapAround: 0
+ m_SelectOnUp: {fileID: 0}
+ m_SelectOnDown: {fileID: 0}
+ m_SelectOnLeft: {fileID: 0}
+ m_SelectOnRight: {fileID: 0}
+ m_Transition: 1
+ m_Colors:
+ m_NormalColor: {r: 1, g: 1, b: 1, a: 1}
+ m_HighlightedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1}
+ m_PressedColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 1}
+ m_SelectedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1}
+ m_DisabledColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 0.5019608}
+ m_ColorMultiplier: 1
+ m_FadeDuration: 0.1
+ m_SpriteState:
+ m_HighlightedSprite: {fileID: 0}
+ m_PressedSprite: {fileID: 0}
+ m_SelectedSprite: {fileID: 0}
+ m_DisabledSprite: {fileID: 0}
+ m_AnimationTriggers:
+ m_NormalTrigger: Normal
+ m_HighlightedTrigger: Highlighted
+ m_PressedTrigger: Pressed
+ m_SelectedTrigger: Highlighted
+ m_DisabledTrigger: Disabled
+ m_Interactable: 1
+ m_TargetGraphic: {fileID: 114466248550890148}
+ m_OnClick:
+ m_PersistentCalls:
+ m_Calls: []
+--- !u!114 &5577847591443948799
+MonoBehaviour:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 1026234277025590}
+ m_Enabled: 1
+ m_EditorHideFlags: 0
+ m_Script: {fileID: 11500000, guid: 306cc8c2b49d7114eaa3623786fc2126, type: 3}
+ m_Name:
+ m_EditorClassIdentifier:
+ m_IgnoreLayout: 0
+ m_MinWidth: 150
+ m_MinHeight: 150
+ m_PreferredWidth: -1
+ m_PreferredHeight: -1
+ m_FlexibleWidth: -1
+ m_FlexibleHeight: -1
+ m_LayoutPriority: 1
+--- !u!1 &1168051963893118
+GameObject:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ serializedVersion: 6
+ m_Component:
+ - component: {fileID: 224349703481187764}
+ - component: {fileID: 223920107105332924}
+ - component: {fileID: 114572656286436090}
+ - component: {fileID: 114715352366433274}
+ m_Layer: 5
+ m_Name: ConsentForm
+ m_TagString: Untagged
+ m_Icon: {fileID: 0}
+ m_NavMeshLayer: 0
+ m_StaticEditorFlags: 0
+ m_IsActive: 1
+--- !u!224 &224349703481187764
+RectTransform:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 1168051963893118}
+ m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
+ m_LocalPosition: {x: 0, y: 0, z: 0}
+ m_LocalScale: {x: 0, y: 0, z: 0}
+ m_ConstrainProportionsScale: 0
+ m_Children:
+ - {fileID: 224188954884660388}
+ - {fileID: 224247655386807502}
+ m_Father: {fileID: 0}
+ m_RootOrder: 0
+ m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
+ m_AnchorMin: {x: 0, y: 0}
+ m_AnchorMax: {x: 0, y: 0}
+ m_AnchoredPosition: {x: 0, y: 0}
+ m_SizeDelta: {x: 0, y: 0}
+ m_Pivot: {x: 0, y: 0}
+--- !u!223 &223920107105332924
+Canvas:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 1168051963893118}
+ m_Enabled: 1
+ serializedVersion: 3
+ m_RenderMode: 0
+ m_Camera: {fileID: 0}
+ m_PlaneDistance: 100
+ m_PixelPerfect: 0
+ m_ReceivesEvents: 1
+ m_OverrideSorting: 0
+ m_OverridePixelPerfect: 0
+ m_SortingBucketNormalizedSize: 0
+ m_AdditionalShaderChannelsFlag: 0
+ m_SortingLayerID: 0
+ m_SortingOrder: 0
+ m_TargetDisplay: 0
+--- !u!114 &114572656286436090
+MonoBehaviour:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 1168051963893118}
+ m_Enabled: 1
+ m_EditorHideFlags: 0
+ m_Script: {fileID: 11500000, guid: 0cd44c1031e13a943bb63640046fad76, type: 3}
+ m_Name:
+ m_EditorClassIdentifier:
+ m_UiScaleMode: 1
+ m_ReferencePixelsPerUnit: 100
+ m_ScaleFactor: 1
+ m_ReferenceResolution: {x: 1440, y: 2960}
+ m_ScreenMatchMode: 2
+ m_MatchWidthOrHeight: 0.5
+ m_PhysicalUnit: 3
+ m_FallbackScreenDPI: 96
+ m_DefaultSpriteDPI: 96
+ m_DynamicPixelsPerUnit: 1
+ m_PresetInfoIsWorld: 0
+--- !u!114 &114715352366433274
+MonoBehaviour:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 1168051963893118}
+ m_Enabled: 1
+ m_EditorHideFlags: 0
+ m_Script: {fileID: 11500000, guid: dc42784cf147c0c48a680349fa168899, type: 3}
+ m_Name:
+ m_EditorClassIdentifier:
+ m_IgnoreReversedGraphics: 1
+ m_BlockingObjects: 0
+ m_BlockingMask:
+ serializedVersion: 2
+ m_Bits: 4294967295
+--- !u!1 &1455544211993956
+GameObject:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ serializedVersion: 6
+ m_Component:
+ - component: {fileID: 224188954884660388}
+ - component: {fileID: 222991998422378294}
+ - component: {fileID: 114288914574884706}
+ m_Layer: 5
+ m_Name: Background
+ m_TagString: Untagged
+ m_Icon: {fileID: 0}
+ m_NavMeshLayer: 0
+ m_StaticEditorFlags: 0
+ m_IsActive: 1
+--- !u!224 &224188954884660388
+RectTransform:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 1455544211993956}
+ m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
+ m_LocalPosition: {x: 0, y: 0, z: 0}
+ m_LocalScale: {x: 1, y: 1, z: 1}
+ m_ConstrainProportionsScale: 0
+ m_Children: []
+ m_Father: {fileID: 224349703481187764}
+ m_RootOrder: 0
+ m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
+ m_AnchorMin: {x: 0, y: 0}
+ m_AnchorMax: {x: 1, y: 1}
+ m_AnchoredPosition: {x: 0, y: 0}
+ m_SizeDelta: {x: 0, y: 0}
+ m_Pivot: {x: 0.5, y: 0.5}
+--- !u!222 &222991998422378294
+CanvasRenderer:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 1455544211993956}
+ m_CullTransparentMesh: 1
+--- !u!114 &114288914574884706
+MonoBehaviour:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 1455544211993956}
+ m_Enabled: 1
+ m_EditorHideFlags: 0
+ m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3}
+ m_Name:
+ m_EditorClassIdentifier:
+ m_Material: {fileID: 0}
+ m_Color: {r: 0, g: 0, b: 0, a: 0.80784315}
+ m_RaycastTarget: 1
+ m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0}
+ m_Maskable: 1
+ m_OnCullStateChanged:
+ m_PersistentCalls:
+ m_Calls: []
+ m_Sprite: {fileID: 0}
+ m_Type: 0
+ m_PreserveAspect: 0
+ m_FillCenter: 1
+ m_FillMethod: 4
+ m_FillAmount: 1
+ m_FillClockwise: 1
+ m_FillOrigin: 0
+ m_UseSpriteMesh: 0
+ m_PixelsPerUnitMultiplier: 1
+--- !u!1 &1519554490061234
+GameObject:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ serializedVersion: 6
+ m_Component:
+ - component: {fileID: 224688741740444772}
+ - component: {fileID: 222698607200636900}
+ - component: {fileID: 114090591266759776}
+ m_Layer: 5
+ m_Name: Text
+ m_TagString: Untagged
+ m_Icon: {fileID: 0}
+ m_NavMeshLayer: 0
+ m_StaticEditorFlags: 0
+ m_IsActive: 1
+--- !u!224 &224688741740444772
+RectTransform:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 1519554490061234}
+ m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
+ m_LocalPosition: {x: 0, y: 0, z: 0}
+ m_LocalScale: {x: 1, y: 1, z: 1}
+ m_ConstrainProportionsScale: 0
+ m_Children: []
+ m_Father: {fileID: 224770140206732756}
+ m_RootOrder: 0
+ m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
+ m_AnchorMin: {x: 0, y: 0}
+ m_AnchorMax: {x: 1, y: 1}
+ m_AnchoredPosition: {x: 0, y: 0}
+ m_SizeDelta: {x: 0, y: 0}
+ m_Pivot: {x: 0.5, y: 0.5}
+--- !u!222 &222698607200636900
+CanvasRenderer:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 1519554490061234}
+ m_CullTransparentMesh: 1
+--- !u!114 &114090591266759776
+MonoBehaviour:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 1519554490061234}
+ m_Enabled: 1
+ m_EditorHideFlags: 0
+ m_Script: {fileID: 11500000, guid: 5f7201a12d95ffc409449d95f23cf332, type: 3}
+ m_Name:
+ m_EditorClassIdentifier:
+ m_Material: {fileID: 0}
+ m_Color: {r: 1, g: 1, b: 1, a: 1}
+ m_RaycastTarget: 1
+ m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0}
+ m_Maskable: 1
+ m_OnCullStateChanged:
+ m_PersistentCalls:
+ m_Calls: []
+ m_FontData:
+ m_Font: {fileID: 10102, guid: 0000000000000000e000000000000000, type: 0}
+ m_FontSize: 40
+ m_FontStyle: 1
+ m_BestFit: 0
+ m_MinSize: 0
+ m_MaxSize: 56
+ m_Alignment: 4
+ m_AlignByGeometry: 0
+ m_RichText: 1
+ m_HorizontalOverflow: 0
+ m_VerticalOverflow: 0
+ m_LineSpacing: 1
+ m_Text: Consent
+--- !u!1 &1919592978971710
+GameObject:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ serializedVersion: 6
+ m_Component:
+ - component: {fileID: 224247655386807502}
+ - component: {fileID: 222996861862976686}
+ - component: {fileID: 114508546300043044}
+ - component: {fileID: 114645982259750808}
+ m_Layer: 5
+ m_Name: Ad
+ m_TagString: Untagged
+ m_Icon: {fileID: 0}
+ m_NavMeshLayer: 0
+ m_StaticEditorFlags: 0
+ m_IsActive: 1
+--- !u!224 &224247655386807502
+RectTransform:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 1919592978971710}
+ m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
+ m_LocalPosition: {x: 0, y: 0, z: 0}
+ m_LocalScale: {x: 1, y: 1, z: 1}
+ m_ConstrainProportionsScale: 0
+ m_Children:
+ - {fileID: 224770140206732756}
+ m_Father: {fileID: 224349703481187764}
+ m_RootOrder: 1
+ m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
+ m_AnchorMin: {x: 0.5, y: 0.5}
+ m_AnchorMax: {x: 0.5, y: 0.5}
+ m_AnchoredPosition: {x: 0, y: 0}
+ m_SizeDelta: {x: 1000, y: 1650}
+ m_Pivot: {x: 0.5, y: 0.5}
+--- !u!222 &222996861862976686
+CanvasRenderer:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 1919592978971710}
+ m_CullTransparentMesh: 1
+--- !u!114 &114508546300043044
+MonoBehaviour:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 1919592978971710}
+ m_Enabled: 1
+ m_EditorHideFlags: 0
+ m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3}
+ m_Name:
+ m_EditorClassIdentifier:
+ m_Material: {fileID: 0}
+ m_Color: {r: 1, g: 1, b: 1, a: 1}
+ m_RaycastTarget: 1
+ m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0}
+ m_Maskable: 1
+ m_OnCullStateChanged:
+ m_PersistentCalls:
+ m_Calls: []
+ m_Sprite: {fileID: 21300000, guid: cb0d255b8cd434556a80e3ae50b24b9c, type: 3}
+ m_Type: 0
+ m_PreserveAspect: 0
+ m_FillCenter: 1
+ m_FillMethod: 4
+ m_FillAmount: 1
+ m_FillClockwise: 1
+ m_FillOrigin: 0
+ m_UseSpriteMesh: 0
+ m_PixelsPerUnitMultiplier: 1
+--- !u!114 &114645982259750808
+MonoBehaviour:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 1919592978971710}
+ m_Enabled: 1
+ m_EditorHideFlags: 0
+ m_Script: {fileID: 11500000, guid: 4e29b1a8efbd4b44bb3f3716e73f07ff, type: 3}
+ m_Name:
+ m_EditorClassIdentifier:
+ m_Navigation:
+ m_Mode: 3
+ m_WrapAround: 0
+ m_SelectOnUp: {fileID: 0}
+ m_SelectOnDown: {fileID: 0}
+ m_SelectOnLeft: {fileID: 0}
+ m_SelectOnRight: {fileID: 0}
+ m_Transition: 1
+ m_Colors:
+ m_NormalColor: {r: 1, g: 1, b: 1, a: 1}
+ m_HighlightedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1}
+ m_PressedColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 1}
+ m_SelectedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1}
+ m_DisabledColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 0.5019608}
+ m_ColorMultiplier: 1
+ m_FadeDuration: 0.1
+ m_SpriteState:
+ m_HighlightedSprite: {fileID: 0}
+ m_PressedSprite: {fileID: 0}
+ m_SelectedSprite: {fileID: 0}
+ m_DisabledSprite: {fileID: 0}
+ m_AnimationTriggers:
+ m_NormalTrigger: Normal
+ m_HighlightedTrigger: Highlighted
+ m_PressedTrigger: Pressed
+ m_SelectedTrigger: Highlighted
+ m_DisabledTrigger: Disabled
+ m_Interactable: 1
+ m_TargetGraphic: {fileID: 114508546300043044}
+ m_OnClick:
+ m_PersistentCalls:
+ m_Calls: []
diff --git a/Assets/GoogleMobileAds/Editor/Resources/Ump/ConsentForm.prefab.meta b/Assets/GoogleMobileAds/Editor/Resources/Ump/ConsentForm.prefab.meta
new file mode 100644
index 0000000..558f2ec
--- /dev/null
+++ b/Assets/GoogleMobileAds/Editor/Resources/Ump/ConsentForm.prefab.meta
@@ -0,0 +1,12 @@
+fileFormatVersion: 2
+guid: 32087445d9e7f4577ae9170a6b11f114
+labels:
+- gvh
+- gvh_version-7.2.1
+- gvhp_exportpath-GoogleMobileAds/Editor/Resources/DummyAds/AdInspector/768x1024.prefab
+- gvhp_exportpath-GoogleMobileAds/Editor/Resources/Ump/ConsentForm.prefab
+PrefabImporter:
+ externalObjects: {}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/GoogleMobileAds/Editor/Utils.cs b/Assets/GoogleMobileAds/Editor/Utils.cs
new file mode 100644
index 0000000..3b463f3
--- /dev/null
+++ b/Assets/GoogleMobileAds/Editor/Utils.cs
@@ -0,0 +1,91 @@
+// Copyright (C) 2023 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.
+
+using System;
+using System.Collections.Generic;
+using System.IO;
+using System.Text.RegularExpressions;
+
+namespace GoogleMobileAds.Editor
+{
+ /*
+ * Utils class that contains helper methods.
+ */
+ public static class Utils
+ {
+ internal static string GradleTemplatePath =
+ Path.Combine(AndroidPluginsDir, "baseProjectTemplate.gradle");
+
+ // Android library plugins directory that contains custom gradle templates.
+ internal const string AndroidPluginsDir = "Assets/Plugins/Android";
+
+ // Extracts an Android Gradle Plugin version number from the contents of a *.gradle file.
+ // This should work for Unity 2022.1 and below.
+ // Ex.
+ // classpath 'com.android.tools.build:gradle:4.0.1'
+ private static Regex androidGradlePluginVersionExtract_legacy =
+ new Regex(@"^\s*classpath\s+['""]com\.android\.tools\.build:gradle:([^'""]+)['""]$");
+
+ // Extracts an Android Gradle Plugin version number from the contents of a *.gradle file for
+ // Unity 2022.2+ or 2023.1+.
+ // Ex.
+ // id 'com.android.application' version '7.1.2' apply false
+ private static Regex androidGradlePluginVersionExtract =
+ new Regex(@"^\s*id\s+['""]com\.android\.application['""] version ['""]([^'""]+)['""]");
+
+ ///
+ /// Get the Android Gradle Plugin version used by the Unity project.
+ ///
+ public static string AndroidGradlePluginVersion
+ {
+ private set {}
+ get
+ {
+ if (!Directory.Exists(AndroidPluginsDir) || !File.Exists(GradleTemplatePath))
+ {
+ return DefaultAndroidGradlePlugin();
+ }
+ var gradleTemplates = Directory.GetFiles(AndroidPluginsDir, "*.gradle",
+ SearchOption.TopDirectoryOnly);
+ foreach (var path in gradleTemplates)
+ {
+ foreach (var line in File.ReadAllLines(path))
+ {
+ var match = androidGradlePluginVersionExtract_legacy.Match(line);
+ if (match != null && match.Success)
+ {
+ return match.Result("$1");
+ }
+ match = androidGradlePluginVersionExtract.Match(line);
+ if (match != null && match.Success)
+ {
+ return match.Result("$1");
+ }
+ }
+ }
+ return DefaultAndroidGradlePlugin();
+ }
+ }
+
+ // TODO(@vkini): read from default Unity baseProjectTemplate.gradle file
+ private static string DefaultAndroidGradlePlugin()
+ {
+#if UNITY_2022_3_OR_NEWER
+ return "7.1.2";
+#else
+ return "4.0.1";
+#endif
+ }
+ }
+}
\ No newline at end of file
diff --git a/Assets/GoogleMobileAds/Editor/Utils.cs.meta b/Assets/GoogleMobileAds/Editor/Utils.cs.meta
new file mode 100644
index 0000000..e37200a
--- /dev/null
+++ b/Assets/GoogleMobileAds/Editor/Utils.cs.meta
@@ -0,0 +1,17 @@
+fileFormatVersion: 2
+guid: 7d7678b2375fe4456b0ab2b506c2240c
+labels:
+- gvh
+- gvh_version-10.6.0
+- gvhp_exportpath-GoogleMobileAds/Editor/Utils.cs
+timeCreated: 1480838400
+MonoImporter:
+ externalObjects: {}
+ serializedVersion: 2
+ defaultReferences: []
+ executionOrder: 0
+ icon:
+ instanceID: 0
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/GoogleMobileAds/Editor/gma_settings_editor_localization_data.json b/Assets/GoogleMobileAds/Editor/gma_settings_editor_localization_data.json
new file mode 100644
index 0000000..762bff3
--- /dev/null
+++ b/Assets/GoogleMobileAds/Editor/gma_settings_editor_localization_data.json
@@ -0,0 +1,72 @@
+{
+ "LocalizationsByKey": {
+ "KEY_ANALYTICS_ENABLED_HELPBOX": {
+ "en": "Sends the usage statistics to Google to gather reports on the failures and to inform future improvements of the Google Mobile Ads Unity plugin.",
+ "fr": "Envoie les données d'utilisation à Google pour collecter des rapports d'erreurs et participer aux futures améliorations du plugin Google Mobile Ads Unity."
+ },
+ "KEY_ANALYTICS_ENABLED_SETTING": {
+ "en": "Send plugin usage statistics",
+ "fr": "Envoyer les données d'utilisation et de diagnostic du plugin"
+ },
+ "KEY_ANDROID_SETTINGS_LABEL": {
+ "en": "Android settings",
+ "fr": "Paramètres Android"
+ },
+ "KEY_ENABLE_GRADLE_BUILD_PRE_PROCESSOR_HELPBOX": {
+ "en": "Modifies the /Plugin/Android/ Gradle files to fix common build errors seen on older Unity versions, see https://developers.google.com/admob/unity/android",
+ "fr": "Modifie les fichiers Gradle de /Plugin/Android/ pour corriger les erreurs de compilation les plus courantes sur des versions antérieures d'Unity, voir https://developers.google.com/admob/unity/android?hl=fr"
+ },
+ "KEY_ENABLE_GRADLE_BUILD_PRE_PROCESSOR_SETTING": {
+ "en": "Enable Gradle build pre-processor",
+ "fr": "Activer le pre-processeur de compilation Gradle"
+ },
+ "KEY_ENABLE_KOTLINX_COROUTINES_PACKAGING_OPTION_HELPBOX": {
+ "en": "Adds an instruction to fix the build.gradle build error with message '2 files found with path 'META-INF/kotlinx_coroutines_core.version''. For more details, see https://developers.google.com/admob/unity/gradle",
+ "fr": "Ajoute une instruction pour corriger l'erreur de compilation de build.gradle '2 files found with path 'META-INF/kotlinx_coroutines_core.version''. Pour plus d'informations, visitez https://developers.google.com/admob/unity/gradle?hl=fr"
+ },
+ "KEY_ENABLE_KOTLINX_COROUTINES_PACKAGING_OPTION_SETTING": {
+ "en": "Enable kotlinx.coroutines packaging option",
+ "fr": "Activer l'option de packaging kotlinx.coroutines"
+ },
+ "KEY_GMA_APP_ID_HELPBOX": {
+ "en": "Google Mobile Ads App ID will look similar to this sample ID: ca-app-pub-3940256099942544~3347511713",
+ "fr": "L'ID de votre application Google Mobile Ads sera similaire à cet exemple: ca-app-pub-3940256099942544~3347511713"
+ },
+ "KEY_GMA_APP_ID_LABEL": {
+ "en": "Google Mobile Ads App ID",
+ "fr": "ID d'application Google Mobile Ads"
+ },
+ "KEY_MISC_LABEL": {
+ "en": "Misc",
+ "fr": "Divers"
+ },
+ "KEY_DISABLE_OPTIMIZE_AD_LOADING_HELPBOX": {
+ "en": "This disables using a background thread to offload Ad loading tasks",
+ "fr": "Cela désactive l'utilisation d'un thread d'arrière-plan pour décharger les tâches de chargement des publicités."
+ },
+ "KEY_DISABLE_OPTIMIZE_AD_LOADING_SETTING": {
+ "en": "Disable ad loading optimization",
+ "fr": "Désactiver l'optimisation du chargement des annonces"
+ },
+ "KEY_DISABLE_OPTIMIZE_INITIALIZATION_HELPBOX": {
+ "en": "Disable offloading initialization to a background thread.",
+ "fr": "L'initialisation ne sera pas transférée vers un thread d'arrière-plan."
+ },
+ "KEY_DISABLE_OPTIMIZE_INITIALIZATION_SETTING": {
+ "en": "Disable initialization optimization",
+ "fr": "Désactiver l'optimisation de l'initialisation"
+ },
+ "KEY_UMP_SPECIFIC_SETTINGS_LABEL": {
+ "en": "UMP-specific settings",
+ "fr": "Paramètres spécifiques UMP"
+ },
+ "KEY_USER_TRACKING_USAGE_DESCRIPTION_HELPBOX": {
+ "en": "A message that informs the user why an iOS app is requesting permission to use data for tracking the user or the device.",
+ "fr": "Un message qui informe l'utilisateur pourquoi une application iOS demande l'autorisation d'utiliser des données pour suivre l'utilisateur ou l'appareil."
+ },
+ "KEY_USER_TRACKING_USAGE_DESCRIPTION_SETTING": {
+ "en": "User Tracking Usage Description",
+ "fr": "Description de l'utilisation du suivi des utilisateurs"
+ }
+ }
+}
diff --git a/Assets/GoogleMobileAds/Editor/gma_settings_editor_localization_data.json.meta b/Assets/GoogleMobileAds/Editor/gma_settings_editor_localization_data.json.meta
new file mode 100644
index 0000000..16f0818
--- /dev/null
+++ b/Assets/GoogleMobileAds/Editor/gma_settings_editor_localization_data.json.meta
@@ -0,0 +1,12 @@
+fileFormatVersion: 2
+guid: 83a3846a658ae46219b050c8451aabfe
+labels:
+- gvh
+- gvh_version-10.6.0
+- gvhp_exportpath-GoogleMobileAds/Editor/gma_settings_editor_localization_data.json
+timeCreated: 1480838400
+TextScriptImporter:
+ externalObjects: {}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/GoogleMobileAds/GoogleMobileAds.Android.dll b/Assets/GoogleMobileAds/GoogleMobileAds.Android.dll
new file mode 100644
index 0000000..403627e
Binary files /dev/null and b/Assets/GoogleMobileAds/GoogleMobileAds.Android.dll differ
diff --git a/Assets/GoogleMobileAds/GoogleMobileAds.Android.dll.meta b/Assets/GoogleMobileAds/GoogleMobileAds.Android.dll.meta
new file mode 100644
index 0000000..8b8f67f
--- /dev/null
+++ b/Assets/GoogleMobileAds/GoogleMobileAds.Android.dll.meta
@@ -0,0 +1,81 @@
+fileFormatVersion: 2
+guid: 9daf61812a464faa90dec7f977094a88
+labels:
+- gvh
+- gvh_version-10.6.0
+- gvhp_exportpath-GoogleMobileAds/GoogleMobileAds.Android.dll
+timeCreated: 1480838400
+PluginImporter:
+ serializedVersion: 1
+ iconMap: {}
+ executionOrder: {}
+ isPreloaded: 0
+ platformData:
+ Android:
+ enabled: 1
+ settings:
+ CPU: AnyCPU
+ Any:
+ enabled: 0
+ settings: {}
+ Editor:
+ enabled: 0
+ settings:
+ CPU: AnyCPU
+ DefaultValueInitialized: true
+ OS: AnyOS
+ Linux:
+ enabled: 0
+ settings:
+ CPU: None
+ Linux64:
+ enabled: 0
+ settings:
+ CPU: None
+ LinuxUniversal:
+ enabled: 0
+ settings:
+ CPU: None
+ OSXIntel:
+ enabled: 0
+ settings:
+ CPU: None
+ OSXIntel64:
+ enabled: 0
+ settings:
+ CPU: None
+ OSXUniversal:
+ enabled: 0
+ settings:
+ CPU: None
+ Web:
+ enabled: 0
+ settings: {}
+ WebStreamed:
+ enabled: 0
+ settings: {}
+ Win:
+ enabled: 0
+ settings:
+ CPU: None
+ Win64:
+ enabled: 0
+ settings:
+ CPU: None
+ WindowsStoreApps:
+ enabled: 0
+ settings:
+ CPU: AnyCPU
+ iOS:
+ enabled: 0
+ settings:
+ CompileFlags:
+ FrameworkDependencies:
+ tvOS:
+ enabled: 0
+ settings:
+ CompileFlags:
+ FrameworkDependencies:
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/GoogleMobileAds/GoogleMobileAds.Common.dll b/Assets/GoogleMobileAds/GoogleMobileAds.Common.dll
new file mode 100644
index 0000000..f9c62d2
Binary files /dev/null and b/Assets/GoogleMobileAds/GoogleMobileAds.Common.dll differ
diff --git a/Assets/GoogleMobileAds/GoogleMobileAds.Common.dll.meta b/Assets/GoogleMobileAds/GoogleMobileAds.Common.dll.meta
new file mode 100644
index 0000000..1627342
--- /dev/null
+++ b/Assets/GoogleMobileAds/GoogleMobileAds.Common.dll.meta
@@ -0,0 +1,11 @@
+fileFormatVersion: 2
+guid: 91a5b07cc3384f86a88d7c29698e058b
+labels:
+- gvh
+- gvh_version-10.6.0
+- gvhp_exportpath-GoogleMobileAds/GoogleMobileAds.Common.dll
+timeCreated: 1480838400
+DefaultImporter:
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/GoogleMobileAds/GoogleMobileAds.Core.dll b/Assets/GoogleMobileAds/GoogleMobileAds.Core.dll
new file mode 100644
index 0000000..bdebf3a
Binary files /dev/null and b/Assets/GoogleMobileAds/GoogleMobileAds.Core.dll differ
diff --git a/Assets/GoogleMobileAds/GoogleMobileAds.Core.dll.meta b/Assets/GoogleMobileAds/GoogleMobileAds.Core.dll.meta
new file mode 100644
index 0000000..19be895
--- /dev/null
+++ b/Assets/GoogleMobileAds/GoogleMobileAds.Core.dll.meta
@@ -0,0 +1,11 @@
+fileFormatVersion: 2
+guid: 36487fa6a5984d3a80bc98eca8a2b9e6
+labels:
+- gvh
+- gvh_version-10.6.0
+- gvhp_exportpath-GoogleMobileAds/GoogleMobileAds.Core.dll
+timeCreated: 1480838400
+DefaultImporter:
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/GoogleMobileAds/GoogleMobileAds.Ump.Android.dll b/Assets/GoogleMobileAds/GoogleMobileAds.Ump.Android.dll
new file mode 100644
index 0000000..e4dd5e3
Binary files /dev/null and b/Assets/GoogleMobileAds/GoogleMobileAds.Ump.Android.dll differ
diff --git a/Assets/GoogleMobileAds/GoogleMobileAds.Ump.Android.dll.meta b/Assets/GoogleMobileAds/GoogleMobileAds.Ump.Android.dll.meta
new file mode 100644
index 0000000..4bc1392
--- /dev/null
+++ b/Assets/GoogleMobileAds/GoogleMobileAds.Ump.Android.dll.meta
@@ -0,0 +1,81 @@
+fileFormatVersion: 2
+guid: bf90317f8c2e41979b0be47e1b17c528
+labels:
+- gvh
+- gvh_version-10.6.0
+- gvhp_exportpath-GoogleMobileAds/GoogleMobileAds.Ump.Android.dll
+timeCreated: 1480838400
+PluginImporter:
+ serializedVersion: 1
+ iconMap: {}
+ executionOrder: {}
+ isPreloaded: 0
+ platformData:
+ Android:
+ enabled: 1
+ settings:
+ CPU: AnyCPU
+ Any:
+ enabled: 0
+ settings: {}
+ Editor:
+ enabled: 0
+ settings:
+ CPU: AnyCPU
+ DefaultValueInitialized: true
+ OS: AnyOS
+ Linux:
+ enabled: 0
+ settings:
+ CPU: None
+ Linux64:
+ enabled: 0
+ settings:
+ CPU: None
+ LinuxUniversal:
+ enabled: 0
+ settings:
+ CPU: None
+ OSXIntel:
+ enabled: 0
+ settings:
+ CPU: None
+ OSXIntel64:
+ enabled: 0
+ settings:
+ CPU: None
+ OSXUniversal:
+ enabled: 0
+ settings:
+ CPU: None
+ Web:
+ enabled: 0
+ settings: {}
+ WebStreamed:
+ enabled: 0
+ settings: {}
+ Win:
+ enabled: 0
+ settings:
+ CPU: None
+ Win64:
+ enabled: 0
+ settings:
+ CPU: None
+ WindowsStoreApps:
+ enabled: 0
+ settings:
+ CPU: AnyCPU
+ iOS:
+ enabled: 0
+ settings:
+ CompileFlags:
+ FrameworkDependencies:
+ tvOS:
+ enabled: 0
+ settings:
+ CompileFlags:
+ FrameworkDependencies:
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/GoogleMobileAds/GoogleMobileAds.Ump.Unity.dll b/Assets/GoogleMobileAds/GoogleMobileAds.Ump.Unity.dll
new file mode 100644
index 0000000..4222724
Binary files /dev/null and b/Assets/GoogleMobileAds/GoogleMobileAds.Ump.Unity.dll differ
diff --git a/Assets/GoogleMobileAds/GoogleMobileAds.Ump.Unity.dll.meta b/Assets/GoogleMobileAds/GoogleMobileAds.Ump.Unity.dll.meta
new file mode 100644
index 0000000..74c0c4e
--- /dev/null
+++ b/Assets/GoogleMobileAds/GoogleMobileAds.Ump.Unity.dll.meta
@@ -0,0 +1,81 @@
+fileFormatVersion: 2
+guid: a86d988d5f444cd9a999bd434cef8a51
+labels:
+- gvh
+- gvh_version-10.6.0
+- gvhp_exportpath-GoogleMobileAds/GoogleMobileAds.Ump.Unity.dll
+timeCreated: 1480838400
+PluginImporter:
+ serializedVersion: 1
+ iconMap: {}
+ executionOrder: {}
+ isPreloaded: 0
+ platformData:
+ Android:
+ enabled: 0
+ settings:
+ CPU: AnyCPU
+ Any:
+ enabled: 0
+ settings: {}
+ Editor:
+ enabled: 1
+ settings:
+ CPU: AnyCPU
+ DefaultValueInitialized: true
+ OS: AnyOS
+ Linux:
+ enabled: 0
+ settings:
+ CPU: None
+ Linux64:
+ enabled: 0
+ settings:
+ CPU: None
+ LinuxUniversal:
+ enabled: 0
+ settings:
+ CPU: None
+ OSXIntel:
+ enabled: 0
+ settings:
+ CPU: None
+ OSXIntel64:
+ enabled: 0
+ settings:
+ CPU: None
+ OSXUniversal:
+ enabled: 0
+ settings:
+ CPU: None
+ Web:
+ enabled: 0
+ settings: {}
+ WebStreamed:
+ enabled: 0
+ settings: {}
+ Win:
+ enabled: 0
+ settings:
+ CPU: None
+ Win64:
+ enabled: 0
+ settings:
+ CPU: None
+ WindowsStoreApps:
+ enabled: 0
+ settings:
+ CPU: AnyCPU
+ iOS:
+ enabled: 0
+ settings:
+ CompileFlags:
+ FrameworkDependencies:
+ tvOS:
+ enabled: 0
+ settings:
+ CompileFlags:
+ FrameworkDependencies:
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/GoogleMobileAds/GoogleMobileAds.Ump.dll b/Assets/GoogleMobileAds/GoogleMobileAds.Ump.dll
new file mode 100644
index 0000000..ce50f7f
Binary files /dev/null and b/Assets/GoogleMobileAds/GoogleMobileAds.Ump.dll differ
diff --git a/Assets/GoogleMobileAds/GoogleMobileAds.Ump.dll.meta b/Assets/GoogleMobileAds/GoogleMobileAds.Ump.dll.meta
new file mode 100644
index 0000000..28bfcc9
--- /dev/null
+++ b/Assets/GoogleMobileAds/GoogleMobileAds.Ump.dll.meta
@@ -0,0 +1,11 @@
+fileFormatVersion: 2
+guid: f84de9af142947eeb3522e42d9487838
+labels:
+- gvh
+- gvh_version-10.6.0
+- gvhp_exportpath-GoogleMobileAds/GoogleMobileAds.Ump.dll
+timeCreated: 1480838400
+DefaultImporter:
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/GoogleMobileAds/GoogleMobileAds.Ump.iOS.dll b/Assets/GoogleMobileAds/GoogleMobileAds.Ump.iOS.dll
new file mode 100644
index 0000000..4a4fb0b
Binary files /dev/null and b/Assets/GoogleMobileAds/GoogleMobileAds.Ump.iOS.dll differ
diff --git a/Assets/GoogleMobileAds/GoogleMobileAds.Ump.iOS.dll.meta b/Assets/GoogleMobileAds/GoogleMobileAds.Ump.iOS.dll.meta
new file mode 100644
index 0000000..247d88f
--- /dev/null
+++ b/Assets/GoogleMobileAds/GoogleMobileAds.Ump.iOS.dll.meta
@@ -0,0 +1,81 @@
+fileFormatVersion: 2
+guid: d18ea87e83804d1eadf467931aabe099
+labels:
+- gvh
+- gvh_version-10.6.0
+- gvhp_exportpath-GoogleMobileAds/GoogleMobileAds.Ump.iOS.dll
+timeCreated: 1480838400
+PluginImporter:
+ serializedVersion: 1
+ iconMap: {}
+ executionOrder: {}
+ isPreloaded: 0
+ platformData:
+ Android:
+ enabled: 0
+ settings:
+ CPU: AnyCPU
+ Any:
+ enabled: 0
+ settings: {}
+ Editor:
+ enabled: 0
+ settings:
+ CPU: AnyCPU
+ DefaultValueInitialized: true
+ OS: AnyOS
+ Linux:
+ enabled: 0
+ settings:
+ CPU: None
+ Linux64:
+ enabled: 0
+ settings:
+ CPU: None
+ LinuxUniversal:
+ enabled: 0
+ settings:
+ CPU: None
+ OSXIntel:
+ enabled: 0
+ settings:
+ CPU: None
+ OSXIntel64:
+ enabled: 0
+ settings:
+ CPU: None
+ OSXUniversal:
+ enabled: 0
+ settings:
+ CPU: None
+ Web:
+ enabled: 0
+ settings: {}
+ WebStreamed:
+ enabled: 0
+ settings: {}
+ Win:
+ enabled: 0
+ settings:
+ CPU: None
+ Win64:
+ enabled: 0
+ settings:
+ CPU: None
+ WindowsStoreApps:
+ enabled: 0
+ settings:
+ CPU: AnyCPU
+ iOS:
+ enabled: 1
+ settings:
+ CompileFlags:
+ FrameworkDependencies:
+ tvOS:
+ enabled: 0
+ settings:
+ CompileFlags:
+ FrameworkDependencies:
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/GoogleMobileAds/GoogleMobileAds.Unity.dll b/Assets/GoogleMobileAds/GoogleMobileAds.Unity.dll
new file mode 100644
index 0000000..d61a0ca
Binary files /dev/null and b/Assets/GoogleMobileAds/GoogleMobileAds.Unity.dll differ
diff --git a/Assets/GoogleMobileAds/GoogleMobileAds.Unity.dll.meta b/Assets/GoogleMobileAds/GoogleMobileAds.Unity.dll.meta
new file mode 100644
index 0000000..7041b7c
--- /dev/null
+++ b/Assets/GoogleMobileAds/GoogleMobileAds.Unity.dll.meta
@@ -0,0 +1,81 @@
+fileFormatVersion: 2
+guid: 3bce71ee5c7c4e0fbbb4d836c01a35a2
+labels:
+- gvh
+- gvh_version-10.6.0
+- gvhp_exportpath-GoogleMobileAds/GoogleMobileAds.Unity.dll
+timeCreated: 1480838400
+PluginImporter:
+ serializedVersion: 1
+ iconMap: {}
+ executionOrder: {}
+ isPreloaded: 0
+ platformData:
+ Android:
+ enabled: 0
+ settings:
+ CPU: AnyCPU
+ Any:
+ enabled: 0
+ settings: {}
+ Editor:
+ enabled: 1
+ settings:
+ CPU: AnyCPU
+ DefaultValueInitialized: true
+ OS: AnyOS
+ Linux:
+ enabled: 0
+ settings:
+ CPU: None
+ Linux64:
+ enabled: 0
+ settings:
+ CPU: None
+ LinuxUniversal:
+ enabled: 0
+ settings:
+ CPU: None
+ OSXIntel:
+ enabled: 0
+ settings:
+ CPU: None
+ OSXIntel64:
+ enabled: 0
+ settings:
+ CPU: None
+ OSXUniversal:
+ enabled: 0
+ settings:
+ CPU: None
+ Web:
+ enabled: 0
+ settings: {}
+ WebStreamed:
+ enabled: 0
+ settings: {}
+ Win:
+ enabled: 0
+ settings:
+ CPU: None
+ Win64:
+ enabled: 0
+ settings:
+ CPU: None
+ WindowsStoreApps:
+ enabled: 0
+ settings:
+ CPU: AnyCPU
+ iOS:
+ enabled: 0
+ settings:
+ CompileFlags:
+ FrameworkDependencies:
+ tvOS:
+ enabled: 0
+ settings:
+ CompileFlags:
+ FrameworkDependencies:
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/GoogleMobileAds/GoogleMobileAds.dll b/Assets/GoogleMobileAds/GoogleMobileAds.dll
new file mode 100644
index 0000000..bd2ef8f
Binary files /dev/null and b/Assets/GoogleMobileAds/GoogleMobileAds.dll differ
diff --git a/Assets/GoogleMobileAds/GoogleMobileAds.dll.meta b/Assets/GoogleMobileAds/GoogleMobileAds.dll.meta
new file mode 100644
index 0000000..ecf9533
--- /dev/null
+++ b/Assets/GoogleMobileAds/GoogleMobileAds.dll.meta
@@ -0,0 +1,11 @@
+fileFormatVersion: 2
+guid: b251d35e618a42e085fb4a5a888d05cd
+labels:
+- gvh
+- gvh_version-10.6.0
+- gvhp_exportpath-GoogleMobileAds/GoogleMobileAds.dll
+timeCreated: 1480838400
+DefaultImporter:
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/GoogleMobileAds/GoogleMobileAds.iOS.dll b/Assets/GoogleMobileAds/GoogleMobileAds.iOS.dll
new file mode 100644
index 0000000..53c3945
Binary files /dev/null and b/Assets/GoogleMobileAds/GoogleMobileAds.iOS.dll differ
diff --git a/Assets/GoogleMobileAds/GoogleMobileAds.iOS.dll.meta b/Assets/GoogleMobileAds/GoogleMobileAds.iOS.dll.meta
new file mode 100644
index 0000000..1b97e49
--- /dev/null
+++ b/Assets/GoogleMobileAds/GoogleMobileAds.iOS.dll.meta
@@ -0,0 +1,81 @@
+fileFormatVersion: 2
+guid: 735ca9cf259f453abac02f4573d8a420
+labels:
+- gvh
+- gvh_version-10.6.0
+- gvhp_exportpath-GoogleMobileAds/GoogleMobileAds.iOS.dll
+timeCreated: 1480838400
+PluginImporter:
+ serializedVersion: 1
+ iconMap: {}
+ executionOrder: {}
+ isPreloaded: 0
+ platformData:
+ Android:
+ enabled: 0
+ settings:
+ CPU: AnyCPU
+ Any:
+ enabled: 0
+ settings: {}
+ Editor:
+ enabled: 0
+ settings:
+ CPU: AnyCPU
+ DefaultValueInitialized: true
+ OS: AnyOS
+ Linux:
+ enabled: 0
+ settings:
+ CPU: None
+ Linux64:
+ enabled: 0
+ settings:
+ CPU: None
+ LinuxUniversal:
+ enabled: 0
+ settings:
+ CPU: None
+ OSXIntel:
+ enabled: 0
+ settings:
+ CPU: None
+ OSXIntel64:
+ enabled: 0
+ settings:
+ CPU: None
+ OSXUniversal:
+ enabled: 0
+ settings:
+ CPU: None
+ Web:
+ enabled: 0
+ settings: {}
+ WebStreamed:
+ enabled: 0
+ settings: {}
+ Win:
+ enabled: 0
+ settings:
+ CPU: None
+ Win64:
+ enabled: 0
+ settings:
+ CPU: None
+ WindowsStoreApps:
+ enabled: 0
+ settings:
+ CPU: AnyCPU
+ iOS:
+ enabled: 1
+ settings:
+ CompileFlags:
+ FrameworkDependencies:
+ tvOS:
+ enabled: 0
+ settings:
+ CompileFlags:
+ FrameworkDependencies:
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/GoogleMobileAds/GoogleMobileAds_version-10.6.0_manifest.txt b/Assets/GoogleMobileAds/GoogleMobileAds_version-10.6.0_manifest.txt
new file mode 100644
index 0000000..bcd4b7f
--- /dev/null
+++ b/Assets/GoogleMobileAds/GoogleMobileAds_version-10.6.0_manifest.txt
@@ -0,0 +1,78 @@
+Assets/ExternalDependencyManager/Editor/1.2.186/Google.IOSResolver.dll
+Assets/ExternalDependencyManager/Editor/1.2.186/Google.IOSResolver.pdb
+Assets/ExternalDependencyManager/Editor/1.2.186/Google.JarResolver.dll
+Assets/ExternalDependencyManager/Editor/1.2.186/Google.JarResolver.pdb
+Assets/ExternalDependencyManager/Editor/1.2.186/Google.PackageManagerResolver.dll
+Assets/ExternalDependencyManager/Editor/1.2.186/Google.PackageManagerResolver.pdb
+Assets/ExternalDependencyManager/Editor/1.2.186/Google.VersionHandlerImpl.dll
+Assets/ExternalDependencyManager/Editor/1.2.186/Google.VersionHandlerImpl.pdb
+Assets/ExternalDependencyManager/Editor/CHANGELOG.md
+Assets/ExternalDependencyManager/Editor/Google.VersionHandler.dll
+Assets/ExternalDependencyManager/Editor/Google.VersionHandler.pdb
+Assets/ExternalDependencyManager/Editor/LICENSE
+Assets/ExternalDependencyManager/Editor/README.md
+Assets/ExternalDependencyManager/Editor/external-dependency-manager_version-1.2.186_manifest.txt
+Assets/GoogleMobileAds/CHANGELOG.md
+Assets/GoogleMobileAds/Editor/AndroidBuildPreProcessor.cs
+Assets/GoogleMobileAds/Editor/BuildPreProcessor.cs
+Assets/GoogleMobileAds/Editor/EditorLocalization.cs
+Assets/GoogleMobileAds/Editor/EditorLocalizationData.cs
+Assets/GoogleMobileAds/Editor/EditorPathUtils.cs
+Assets/GoogleMobileAds/Editor/GoogleMobileAds.Editor.asmdef
+Assets/GoogleMobileAds/Editor/GoogleMobileAdsDependencies.xml
+Assets/GoogleMobileAds/Editor/GoogleMobileAdsSKAdNetworkItems.xml
+Assets/GoogleMobileAds/Editor/GoogleMobileAdsSettings.cs
+Assets/GoogleMobileAds/Editor/GoogleMobileAdsSettingsEditor.cs
+Assets/GoogleMobileAds/Editor/GoogleUmpDependencies.xml
+Assets/GoogleMobileAds/Editor/GradleProcessor.cs
+Assets/GoogleMobileAds/Editor/ManifestProcessor.cs
+Assets/GoogleMobileAds/Editor/PListProcessor.cs
+Assets/GoogleMobileAds/Editor/Resources/PlaceholderAds/AdImages/1024x768.png
+Assets/GoogleMobileAds/Editor/Resources/PlaceholderAds/AdImages/300x250.png
+Assets/GoogleMobileAds/Editor/Resources/PlaceholderAds/AdImages/320x100.png
+Assets/GoogleMobileAds/Editor/Resources/PlaceholderAds/AdImages/320x480.png
+Assets/GoogleMobileAds/Editor/Resources/PlaceholderAds/AdImages/320x50.png
+Assets/GoogleMobileAds/Editor/Resources/PlaceholderAds/AdImages/468x60.png
+Assets/GoogleMobileAds/Editor/Resources/PlaceholderAds/AdImages/480x320.png
+Assets/GoogleMobileAds/Editor/Resources/PlaceholderAds/AdImages/728x90.png
+Assets/GoogleMobileAds/Editor/Resources/PlaceholderAds/AdImages/768x1024.png
+Assets/GoogleMobileAds/Editor/Resources/PlaceholderAds/AdImages/AdInspectorHome.png
+Assets/GoogleMobileAds/Editor/Resources/PlaceholderAds/AdInspector/768x1024.prefab
+Assets/GoogleMobileAds/Editor/Resources/PlaceholderAds/AppOpen/1024x768.prefab
+Assets/GoogleMobileAds/Editor/Resources/PlaceholderAds/AppOpen/768x1024.prefab
+Assets/GoogleMobileAds/Editor/Resources/PlaceholderAds/Banners/ADAPTIVE.prefab
+Assets/GoogleMobileAds/Editor/Resources/PlaceholderAds/Banners/BANNER.prefab
+Assets/GoogleMobileAds/Editor/Resources/PlaceholderAds/Banners/CENTER.prefab
+Assets/GoogleMobileAds/Editor/Resources/PlaceholderAds/Banners/FULL_BANNER.prefab
+Assets/GoogleMobileAds/Editor/Resources/PlaceholderAds/Banners/LARGE_BANNER.prefab
+Assets/GoogleMobileAds/Editor/Resources/PlaceholderAds/Banners/LEADERBOARD.prefab
+Assets/GoogleMobileAds/Editor/Resources/PlaceholderAds/Banners/MEDIUM_RECTANGLE.prefab
+Assets/GoogleMobileAds/Editor/Resources/PlaceholderAds/Banners/SMART_BANNER.prefab
+Assets/GoogleMobileAds/Editor/Resources/PlaceholderAds/Interstitials/1024x768.prefab
+Assets/GoogleMobileAds/Editor/Resources/PlaceholderAds/Interstitials/768x1024.prefab
+Assets/GoogleMobileAds/Editor/Resources/PlaceholderAds/Rewarded/1024x768.prefab
+Assets/GoogleMobileAds/Editor/Resources/PlaceholderAds/Rewarded/768x1024.prefab
+Assets/GoogleMobileAds/Editor/Resources/Ump/ConsentForm.png
+Assets/GoogleMobileAds/Editor/Resources/Ump/ConsentForm.prefab
+Assets/GoogleMobileAds/Editor/Utils.cs
+Assets/GoogleMobileAds/Editor/gma_settings_editor_localization_data.json
+Assets/GoogleMobileAds/GoogleMobileAds.Android.dll
+Assets/GoogleMobileAds/GoogleMobileAds.Common.dll
+Assets/GoogleMobileAds/GoogleMobileAds.Core.dll
+Assets/GoogleMobileAds/GoogleMobileAds.Ump.Android.dll
+Assets/GoogleMobileAds/GoogleMobileAds.Ump.Unity.dll
+Assets/GoogleMobileAds/GoogleMobileAds.Ump.dll
+Assets/GoogleMobileAds/GoogleMobileAds.Ump.iOS.dll
+Assets/GoogleMobileAds/GoogleMobileAds.Unity.dll
+Assets/GoogleMobileAds/GoogleMobileAds.dll
+Assets/GoogleMobileAds/GoogleMobileAds.iOS.dll
+Assets/GoogleMobileAds/LICENSE
+Assets/GoogleMobileAds/link.xml
+Assets/Plugins/Android/GoogleMobileAdsPlugin.androidlib/AndroidManifest.xml
+Assets/Plugins/Android/GoogleMobileAdsPlugin.androidlib/packaging_options.gradle
+Assets/Plugins/Android/GoogleMobileAdsPlugin.androidlib/project.properties
+Assets/Plugins/Android/googlemobileads-unity.aar
+Assets/Plugins/iOS/GADUAdNetworkExtras.h
+Assets/Plugins/iOS/NativeTemplates/GADTMediumTemplateView.xib
+Assets/Plugins/iOS/NativeTemplates/GADTSmallTemplateView.xib
+Assets/Plugins/iOS/unity-plugin-library.a
diff --git a/Assets/GoogleMobileAds/GoogleMobileAds_version-10.6.0_manifest.txt.meta b/Assets/GoogleMobileAds/GoogleMobileAds_version-10.6.0_manifest.txt.meta
new file mode 100644
index 0000000..ce59d02
--- /dev/null
+++ b/Assets/GoogleMobileAds/GoogleMobileAds_version-10.6.0_manifest.txt.meta
@@ -0,0 +1,10 @@
+fileFormatVersion: 2
+guid: f3f62747da9144319f7849f3fc6997be
+labels:
+- gvh
+- gvh_manifest
+- gvh_version-10.6.0
+- gvhp_exportpath-GoogleMobileAds/GoogleMobileAds_version-10.6.0_manifest.txt
+- gvhp_manifestname-0Google Mobile Ads for Unity
+- gvhp_manifestname-1GoogleMobileAds
+timeCreated: 0
diff --git a/Assets/GoogleMobileAds/LICENSE b/Assets/GoogleMobileAds/LICENSE
new file mode 100644
index 0000000..b7c9ed1
--- /dev/null
+++ b/Assets/GoogleMobileAds/LICENSE
@@ -0,0 +1,202 @@
+
+ Apache License
+ Version 2.0, January 2004
+ http://www.apache.org/licenses/
+
+ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
+
+ 1. Definitions.
+
+ "License" shall mean the terms and conditions for use, reproduction,
+ and distribution as defined by Sections 1 through 9 of this document.
+
+ "Licensor" shall mean the copyright owner or entity authorized by
+ the copyright owner that is granting the License.
+
+ "Legal Entity" shall mean the union of the acting entity and all
+ other entities that control, are controlled by, or are under common
+ control with that entity. For the purposes of this definition,
+ "control" means (i) the power, direct or indirect, to cause the
+ direction or management of such entity, whether by contract or
+ otherwise, or (ii) ownership of fifty percent (50%) or more of the
+ outstanding shares, or (iii) beneficial ownership of such entity.
+
+ "You" (or "Your") shall mean an individual or Legal Entity
+ exercising permissions granted by this License.
+
+ "Source" form shall mean the preferred form for making modifications,
+ including but not limited to software source code, documentation
+ source, and configuration files.
+
+ "Object" form shall mean any form resulting from mechanical
+ transformation or translation of a Source form, including but
+ not limited to compiled object code, generated documentation,
+ and conversions to other media types.
+
+ "Work" shall mean the work of authorship, whether in Source or
+ Object form, made available under the License, as indicated by a
+ copyright notice that is included in or attached to the work
+ (an example is provided in the Appendix below).
+
+ "Derivative Works" shall mean any work, whether in Source or Object
+ form, that is based on (or derived from) the Work and for which the
+ editorial revisions, annotations, elaborations, or other modifications
+ represent, as a whole, an original work of authorship. For the purposes
+ of this License, Derivative Works shall not include works that remain
+ separable from, or merely link (or bind by name) to the interfaces of,
+ the Work and Derivative Works thereof.
+
+ "Contribution" shall mean any work of authorship, including
+ the original version of the Work and any modifications or additions
+ to that Work or Derivative Works thereof, that is intentionally
+ submitted to Licensor for inclusion in the Work by the copyright owner
+ or by an individual or Legal Entity authorized to submit on behalf of
+ the copyright owner. For the purposes of this definition, "submitted"
+ means any form of electronic, verbal, or written communication sent
+ to the Licensor or its representatives, including but not limited to
+ communication on electronic mailing lists, source code control systems,
+ and issue tracking systems that are managed by, or on behalf of, the
+ Licensor for the purpose of discussing and improving the Work, but
+ excluding communication that is conspicuously marked or otherwise
+ designated in writing by the copyright owner as "Not a Contribution."
+
+ "Contributor" shall mean Licensor and any individual or Legal Entity
+ on behalf of whom a Contribution has been received by Licensor and
+ subsequently incorporated within the Work.
+
+ 2. Grant of Copyright License. Subject to the terms and conditions of
+ this License, each Contributor hereby grants to You a perpetual,
+ worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+ copyright license to reproduce, prepare Derivative Works of,
+ publicly display, publicly perform, sublicense, and distribute the
+ Work and such Derivative Works in Source or Object form.
+
+ 3. Grant of Patent License. Subject to the terms and conditions of
+ this License, each Contributor hereby grants to You a perpetual,
+ worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+ (except as stated in this section) patent license to make, have made,
+ use, offer to sell, sell, import, and otherwise transfer the Work,
+ where such license applies only to those patent claims licensable
+ by such Contributor that are necessarily infringed by their
+ Contribution(s) alone or by combination of their Contribution(s)
+ with the Work to which such Contribution(s) was submitted. If You
+ institute patent litigation against any entity (including a
+ cross-claim or counterclaim in a lawsuit) alleging that the Work
+ or a Contribution incorporated within the Work constitutes direct
+ or contributory patent infringement, then any patent licenses
+ granted to You under this License for that Work shall terminate
+ as of the date such litigation is filed.
+
+ 4. Redistribution. You may reproduce and distribute copies of the
+ Work or Derivative Works thereof in any medium, with or without
+ modifications, and in Source or Object form, provided that You
+ meet the following conditions:
+
+ (a) You must give any other recipients of the Work or
+ Derivative Works a copy of this License; and
+
+ (b) You must cause any modified files to carry prominent notices
+ stating that You changed the files; and
+
+ (c) You must retain, in the Source form of any Derivative Works
+ that You distribute, all copyright, patent, trademark, and
+ attribution notices from the Source form of the Work,
+ excluding those notices that do not pertain to any part of
+ the Derivative Works; and
+
+ (d) If the Work includes a "NOTICE" text file as part of its
+ distribution, then any Derivative Works that You distribute must
+ include a readable copy of the attribution notices contained
+ within such NOTICE file, excluding those notices that do not
+ pertain to any part of the Derivative Works, in at least one
+ of the following places: within a NOTICE text file distributed
+ as part of the Derivative Works; within the Source form or
+ documentation, if provided along with the Derivative Works; or,
+ within a display generated by the Derivative Works, if and
+ wherever such third-party notices normally appear. The contents
+ of the NOTICE file are for informational purposes only and
+ do not modify the License. You may add Your own attribution
+ notices within Derivative Works that You distribute, alongside
+ or as an addendum to the NOTICE text from the Work, provided
+ that such additional attribution notices cannot be construed
+ as modifying the License.
+
+ You may add Your own copyright statement to Your modifications and
+ may provide additional or different license terms and conditions
+ for use, reproduction, or distribution of Your modifications, or
+ for any such Derivative Works as a whole, provided Your use,
+ reproduction, and distribution of the Work otherwise complies with
+ the conditions stated in this License.
+
+ 5. Submission of Contributions. Unless You explicitly state otherwise,
+ any Contribution intentionally submitted for inclusion in the Work
+ by You to the Licensor shall be under the terms and conditions of
+ this License, without any additional terms or conditions.
+ Notwithstanding the above, nothing herein shall supersede or modify
+ the terms of any separate license agreement you may have executed
+ with Licensor regarding such Contributions.
+
+ 6. Trademarks. This License does not grant permission to use the trade
+ names, trademarks, service marks, or product names of the Licensor,
+ except as required for reasonable and customary use in describing the
+ origin of the Work and reproducing the content of the NOTICE file.
+
+ 7. Disclaimer of Warranty. Unless required by applicable law or
+ agreed to in writing, Licensor provides the Work (and each
+ Contributor provides its Contributions) on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
+ implied, including, without limitation, any warranties or conditions
+ of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
+ PARTICULAR PURPOSE. You are solely responsible for determining the
+ appropriateness of using or redistributing the Work and assume any
+ risks associated with Your exercise of permissions under this License.
+
+ 8. Limitation of Liability. In no event and under no legal theory,
+ whether in tort (including negligence), contract, or otherwise,
+ unless required by applicable law (such as deliberate and grossly
+ negligent acts) or agreed to in writing, shall any Contributor be
+ liable to You for damages, including any direct, indirect, special,
+ incidental, or consequential damages of any character arising as a
+ result of this License or out of the use or inability to use the
+ Work (including but not limited to damages for loss of goodwill,
+ work stoppage, computer failure or malfunction, or any and all
+ other commercial damages or losses), even if such Contributor
+ has been advised of the possibility of such damages.
+
+ 9. Accepting Warranty or Additional Liability. While redistributing
+ the Work or Derivative Works thereof, You may choose to offer,
+ and charge a fee for, acceptance of support, warranty, indemnity,
+ or other liability obligations and/or rights consistent with this
+ License. However, in accepting such obligations, You may act only
+ on Your own behalf and on Your sole responsibility, not on behalf
+ of any other Contributor, and only if You agree to indemnify,
+ defend, and hold each Contributor harmless for any liability
+ incurred by, or claims asserted against, such Contributor by reason
+ of your accepting any such warranty or additional liability.
+
+ END OF TERMS AND CONDITIONS
+
+ APPENDIX: How to apply the Apache License to your work.
+
+ To apply the Apache License to your work, attach the following
+ boilerplate notice, with the fields enclosed by brackets "[]"
+ replaced with your own identifying information. (Don't include
+ the brackets!) The text should be enclosed in the appropriate
+ comment syntax for the file format. We also recommend that a
+ file or class name and description of purpose be included on the
+ same "printed page" as the copyright notice for easier
+ identification within third-party archives.
+
+ Copyright 2013 Google Inc.
+
+ 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.
diff --git a/Assets/GoogleMobileAds/LICENSE.meta b/Assets/GoogleMobileAds/LICENSE.meta
new file mode 100644
index 0000000..4e34d55
--- /dev/null
+++ b/Assets/GoogleMobileAds/LICENSE.meta
@@ -0,0 +1,81 @@
+fileFormatVersion: 2
+guid: DCED4676809D4FD080DC99CC6B32B2AB
+labels:
+- gvh
+- gvh_version-10.6.0
+- gvhp_exportpath-GoogleMobileAds/LICENSE
+timeCreated: 1480838400
+PluginImporter:
+ serializedVersion: 1
+ iconMap: {}
+ executionOrder: {}
+ isPreloaded: 0
+ platformData:
+ Android:
+ enabled: 0
+ settings:
+ CPU: AnyCPU
+ Any:
+ enabled: 0
+ settings: {}
+ Editor:
+ enabled: 0
+ settings:
+ CPU: AnyCPU
+ DefaultValueInitialized: true
+ OS: AnyOS
+ Linux:
+ enabled: 0
+ settings:
+ CPU: None
+ Linux64:
+ enabled: 0
+ settings:
+ CPU: None
+ LinuxUniversal:
+ enabled: 0
+ settings:
+ CPU: None
+ OSXIntel:
+ enabled: 0
+ settings:
+ CPU: None
+ OSXIntel64:
+ enabled: 0
+ settings:
+ CPU: None
+ OSXUniversal:
+ enabled: 0
+ settings:
+ CPU: None
+ Web:
+ enabled: 0
+ settings: {}
+ WebStreamed:
+ enabled: 0
+ settings: {}
+ Win:
+ enabled: 0
+ settings:
+ CPU: None
+ Win64:
+ enabled: 0
+ settings:
+ CPU: None
+ WindowsStoreApps:
+ enabled: 0
+ settings:
+ CPU: AnyCPU
+ iOS:
+ enabled: 0
+ settings:
+ CompileFlags:
+ FrameworkDependencies:
+ tvOS:
+ enabled: 0
+ settings:
+ CompileFlags:
+ FrameworkDependencies:
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/GoogleMobileAds/Resources.meta b/Assets/GoogleMobileAds/Resources.meta
new file mode 100644
index 0000000..3f07e72
--- /dev/null
+++ b/Assets/GoogleMobileAds/Resources.meta
@@ -0,0 +1,8 @@
+fileFormatVersion: 2
+guid: f77409e5fc90b6b4493cf25873774524
+folderAsset: yes
+DefaultImporter:
+ externalObjects: {}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/GoogleMobileAds/Resources/GoogleMobileAdsSettings.asset b/Assets/GoogleMobileAds/Resources/GoogleMobileAdsSettings.asset
new file mode 100644
index 0000000..9d33e3c
--- /dev/null
+++ b/Assets/GoogleMobileAds/Resources/GoogleMobileAdsSettings.asset
@@ -0,0 +1,22 @@
+%YAML 1.1
+%TAG !u! tag:unity3d.com,2011:
+--- !u!114 &11400000
+MonoBehaviour:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 0}
+ m_Enabled: 1
+ m_EditorHideFlags: 0
+ m_Script: {fileID: 11500000, guid: a187246822bbb47529482707f3e0eff8, type: 3}
+ m_Name: GoogleMobileAdsSettings
+ m_EditorClassIdentifier:
+ adMobAndroidAppId: ca-app-pub-3940256099942544~3347511713
+ adMobIOSAppId: ca-app-pub-3940256099942544~1458002511
+ enableKotlinXCoroutinesPackagingOption: 1
+ enableGradleBuildPreProcessor: 1
+ disableOptimizeInitialization: 0
+ disableOptimizeAdLoading: 0
+ userTrackingUsageDescription:
+ userLanguage: en
diff --git a/Assets/GoogleMobileAds/Resources/GoogleMobileAdsSettings.asset.meta b/Assets/GoogleMobileAds/Resources/GoogleMobileAdsSettings.asset.meta
new file mode 100644
index 0000000..8ac51d5
--- /dev/null
+++ b/Assets/GoogleMobileAds/Resources/GoogleMobileAdsSettings.asset.meta
@@ -0,0 +1,8 @@
+fileFormatVersion: 2
+guid: c5cf16432cb301347875a0b6fd27ab93
+NativeFormatImporter:
+ externalObjects: {}
+ mainObjectFileID: 11400000
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/GoogleMobileAds/link.xml b/Assets/GoogleMobileAds/link.xml
new file mode 100644
index 0000000..1302803
--- /dev/null
+++ b/Assets/GoogleMobileAds/link.xml
@@ -0,0 +1,18 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/Assets/GoogleMobileAds/link.xml.meta b/Assets/GoogleMobileAds/link.xml.meta
new file mode 100644
index 0000000..fdeac0e
--- /dev/null
+++ b/Assets/GoogleMobileAds/link.xml.meta
@@ -0,0 +1,11 @@
+fileFormatVersion: 2
+guid: d6461f9591d240498f49453b73a48552
+labels:
+- gvh
+- gvh_version-10.6.0
+- gvhp_exportpath-GoogleMobileAds/link.xml
+timeCreated: 1480838400
+DefaultImporter:
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/MaxSdk.meta b/Assets/MaxSdk.meta
new file mode 100644
index 0000000..3d92fd8
--- /dev/null
+++ b/Assets/MaxSdk.meta
@@ -0,0 +1,8 @@
+fileFormatVersion: 2
+guid: a7b8a38f67eb645c7bfdf21755619a75
+folderAsset: yes
+DefaultImporter:
+ externalObjects: {}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/MaxSdk/AppLovin.meta b/Assets/MaxSdk/AppLovin.meta
new file mode 100644
index 0000000..898ec82
--- /dev/null
+++ b/Assets/MaxSdk/AppLovin.meta
@@ -0,0 +1,8 @@
+fileFormatVersion: 2
+guid: b35618a52c39d44acb9a664fd126d088
+folderAsset: yes
+DefaultImporter:
+ externalObjects: {}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/MaxSdk/AppLovin/Editor.meta b/Assets/MaxSdk/AppLovin/Editor.meta
new file mode 100644
index 0000000..93849a3
--- /dev/null
+++ b/Assets/MaxSdk/AppLovin/Editor.meta
@@ -0,0 +1,8 @@
+fileFormatVersion: 2
+guid: 7748a264370f84658948d02578b0258e
+folderAsset: yes
+DefaultImporter:
+ externalObjects: {}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/MaxSdk/AppLovin/Editor/Dependencies.xml b/Assets/MaxSdk/AppLovin/Editor/Dependencies.xml
new file mode 100644
index 0000000..79409e1
--- /dev/null
+++ b/Assets/MaxSdk/AppLovin/Editor/Dependencies.xml
@@ -0,0 +1,9 @@
+
+
+
+
+
+
+
+
+
diff --git a/Assets/MaxSdk/AppLovin/Editor/Dependencies.xml.meta b/Assets/MaxSdk/AppLovin/Editor/Dependencies.xml.meta
new file mode 100644
index 0000000..3360fd3
--- /dev/null
+++ b/Assets/MaxSdk/AppLovin/Editor/Dependencies.xml.meta
@@ -0,0 +1,10 @@
+fileFormatVersion: 2
+guid: 746da98302dc0402aaa37e8f7bd97e77
+labels:
+- al_max
+- al_max_export_path-MaxSdk/AppLovin/Editor/Dependencies.xml
+TextScriptImporter:
+ externalObjects: {}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/MaxSdk/AppLovin/Plugins.meta b/Assets/MaxSdk/AppLovin/Plugins.meta
new file mode 100644
index 0000000..c6a65e5
--- /dev/null
+++ b/Assets/MaxSdk/AppLovin/Plugins.meta
@@ -0,0 +1,8 @@
+fileFormatVersion: 2
+guid: dabd6e29359984561a3e2ffdf84505ee
+folderAsset: yes
+DefaultImporter:
+ externalObjects: {}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/MaxSdk/AppLovin/Plugins/Android.meta b/Assets/MaxSdk/AppLovin/Plugins/Android.meta
new file mode 100644
index 0000000..1e4d90a
--- /dev/null
+++ b/Assets/MaxSdk/AppLovin/Plugins/Android.meta
@@ -0,0 +1,8 @@
+fileFormatVersion: 2
+guid: 256c985e22a29411eb0001b67f088f11
+folderAsset: yes
+DefaultImporter:
+ externalObjects: {}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/MaxSdk/AppLovin/Plugins/Android/applovin-max-unity-plugin.aar b/Assets/MaxSdk/AppLovin/Plugins/Android/applovin-max-unity-plugin.aar
new file mode 100644
index 0000000..d28a1eb
Binary files /dev/null and b/Assets/MaxSdk/AppLovin/Plugins/Android/applovin-max-unity-plugin.aar differ
diff --git a/Assets/MaxSdk/AppLovin/Plugins/Android/applovin-max-unity-plugin.aar.meta b/Assets/MaxSdk/AppLovin/Plugins/Android/applovin-max-unity-plugin.aar.meta
new file mode 100644
index 0000000..224076a
--- /dev/null
+++ b/Assets/MaxSdk/AppLovin/Plugins/Android/applovin-max-unity-plugin.aar.meta
@@ -0,0 +1,35 @@
+fileFormatVersion: 2
+guid: 1db980bd612824d2097f78fd779e6051
+labels:
+- al_max
+- al_max_export_path-MaxSdk/AppLovin/Plugins/Android/applovin-max-unity-plugin.aar
+PluginImporter:
+ externalObjects: {}
+ serializedVersion: 2
+ iconMap: {}
+ executionOrder: {}
+ defineConstraints: []
+ isPreloaded: 0
+ isOverridable: 0
+ isExplicitlyReferenced: 0
+ validateReferences: 1
+ platformData:
+ - first:
+ Android: Android
+ second:
+ enabled: 1
+ settings: {}
+ - first:
+ Any:
+ second:
+ enabled: 0
+ settings: {}
+ - first:
+ Editor: Editor
+ second:
+ enabled: 0
+ settings:
+ DefaultValueInitialized: true
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/MaxSdk/AppLovin/Plugins/iOS.meta b/Assets/MaxSdk/AppLovin/Plugins/iOS.meta
new file mode 100644
index 0000000..7922667
--- /dev/null
+++ b/Assets/MaxSdk/AppLovin/Plugins/iOS.meta
@@ -0,0 +1,8 @@
+fileFormatVersion: 2
+guid: 125fa3d9de30e4a089c720e502224457
+folderAsset: yes
+DefaultImporter:
+ externalObjects: {}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/MaxSdk/AppLovin/Plugins/iOS/MAUnityAdManager.h b/Assets/MaxSdk/AppLovin/Plugins/iOS/MAUnityAdManager.h
new file mode 100644
index 0000000..117c7fd
--- /dev/null
+++ b/Assets/MaxSdk/AppLovin/Plugins/iOS/MAUnityAdManager.h
@@ -0,0 +1,97 @@
+//
+// MAUnityAdManager.h
+// AppLovin MAX Unity Plugin
+//
+
+#import
+#import
+
+NS_ASSUME_NONNULL_BEGIN
+typedef const void *MAUnityRef;
+typedef void (*ALUnityBackgroundCallback)(const char* args);
+
+@interface MAUnityAdManager : NSObject
+
+- (void)initializeSdkWithConfiguration:(ALSdkInitializationConfiguration *)initConfig andCompletionHandler:(ALSdkInitializationCompletionHandler)completionHandler;
+
+- (void)createBannerWithAdUnitIdentifier:(nullable NSString *)adUnitIdentifier atPosition:(nullable NSString *)bannerPosition isAdaptive:(BOOL)isAdaptive;
+- (void)createBannerWithAdUnitIdentifier:(nullable NSString *)adUnitIdentifier x:(CGFloat)xOffset y:(CGFloat)yOffset isAdaptive:(BOOL)isAdaptive;
+- (void)loadBannerWithAdUnitIdentifier:(nullable NSString *)adUnitIdentifier;
+- (void)setBannerBackgroundColorForAdUnitIdentifier:(nullable NSString *)adUnitIdentifier hexColorCode:(nullable NSString *)hexColorCode;
+- (void)setBannerPlacement:(nullable NSString *)placement forAdUnitIdentifier:(nullable NSString *)adUnitIdentifier;
+- (void)startBannerAutoRefreshForAdUnitIdentifier:(nullable NSString *)adUnitIdentifier;
+- (void)stopBannerAutoRefreshForAdUnitIdentifier:(nullable NSString *)adUnitIdentifier;
+- (void)setBannerExtraParameterForAdUnitIdentifier:(nullable NSString *)adUnitIdentifier key:(nullable NSString *)key value:(nullable NSString *)value;
+- (void)setBannerLocalExtraParameterForAdUnitIdentifier:(nullable NSString *)adUnitIdentifier key:(nullable NSString *)key value:(nullable id)value;
+- (void)setBannerCustomData:(nullable NSString *)customData forAdUnitIdentifier:(nullable NSString *)adUnitIdentifier;
+- (void)setBannerWidth:(CGFloat)width forAdUnitIdentifier:(nullable NSString *)adUnitIdentifier;
+- (void)updateBannerPosition:(nullable NSString *)bannerPosition forAdUnitIdentifier:(nullable NSString *)adUnitIdentifier;
+- (void)updateBannerPosition:(CGFloat)xOffset y:(CGFloat)yOffset forAdUnitIdentifier:(nullable NSString *)adUnitIdentifier;
+- (void)showBannerWithAdUnitIdentifier:(nullable NSString *)adUnitIdentifier;
+- (void)destroyBannerWithAdUnitIdentifier:(nullable NSString *)adUnitIdentifier;
+- (void)hideBannerWithAdUnitIdentifier:(nullable NSString *)adUnitIdentifier;
+- (NSString *)bannerLayoutForAdUnitIdentifier:(nullable NSString *)adUnitIdentifier;
++ (CGFloat)adaptiveBannerHeightForWidth:(CGFloat)width;
+
+- (void)createMRecWithAdUnitIdentifier:(nullable NSString *)adUnitIdentifier atPosition:(nullable NSString *)mrecPosition;
+- (void)createMRecWithAdUnitIdentifier:(nullable NSString *)adUnitIdentifier x:(CGFloat)xOffset y:(CGFloat)yOffset;
+- (void)loadMRecWithAdUnitIdentifier:(nullable NSString *)adUnitIdentifier;
+- (void)setMRecPlacement:(nullable NSString *)placement forAdUnitIdentifier:(nullable NSString *)adUnitIdentifier;
+- (void)startMRecAutoRefreshForAdUnitIdentifier:(nullable NSString *)adUnitIdentifier;
+- (void)stopMRecAutoRefreshForAdUnitIdentifier:(nullable NSString *)adUnitIdentifer;
+- (void)setMRecExtraParameterForAdUnitIdentifier:(nullable NSString *)adUnitIdentifier key:(nullable NSString *)key value:(nullable NSString *)value;
+- (void)setMRecLocalExtraParameterForAdUnitIdentifier:(nullable NSString *)adUnitIdentifier key:(nullable NSString *)key value:(nullable id)value;
+- (void)setMRecCustomData:(nullable NSString *)customData forAdUnitIdentifier:(nullable NSString *)adUnitIdentifier;
+- (void)showMRecWithAdUnitIdentifier:(nullable NSString *)adUnitIdentifier;
+- (void)destroyMRecWithAdUnitIdentifier:(nullable NSString *)adUnitIdentifier;
+- (void)hideMRecWithAdUnitIdentifier:(nullable NSString *)adUnitIdentifier;
+- (void)updateMRecPosition:(nullable NSString *)mrecPosition forAdUnitIdentifier:(nullable NSString *)adUnitIdentifier;
+- (void)updateMRecPosition:(CGFloat)xOffset y:(CGFloat)yOffset forAdUnitIdentifier:(nullable NSString *)adUnitIdentifier;
+- (NSString *)mrecLayoutForAdUnitIdentifier:(nullable NSString *)adUnitIdentifier;
+
+- (void)loadInterstitialWithAdUnitIdentifier:(nullable NSString *)adUnitIdentifier;
+- (BOOL)isInterstitialReadyWithAdUnitIdentifier:(nullable NSString *)adUnitIdentifier;
+- (void)showInterstitialWithAdUnitIdentifier:(nullable NSString *)adUnitIdentifier placement:(nullable NSString *)placement customData:(nullable NSString *)customData;
+- (void)setInterstitialExtraParameterForAdUnitIdentifier:(nullable NSString *)adUnitIdentifier key:(nullable NSString *)key value:(nullable NSString *)value;
+- (void)setInterstitialLocalExtraParameterForAdUnitIdentifier:(nullable NSString *)adUnitIdentifier key:(nullable NSString *)key value:(nullable id)value;
+
+- (void)loadAppOpenAdWithAdUnitIdentifier:(nullable NSString *)adUnitIdentifier;
+- (BOOL)isAppOpenAdReadyWithAdUnitIdentifier:(nullable NSString *)adUnitIdentifier;
+- (void)showAppOpenAdWithAdUnitIdentifier:(nullable NSString *)adUnitIdentifier placement:(nullable NSString *)placement customData:(nullable NSString *)customData;
+- (void)setAppOpenAdExtraParameterForAdUnitIdentifier:(nullable NSString *)adUnitIdentifier key:(nullable NSString *)key value:(nullable NSString *)value;
+- (void)setAppOpenAdLocalExtraParameterForAdUnitIdentifier:(nullable NSString *)adUnitIdentifier key:(nullable NSString *)key value:(nullable id)value;
+
+- (void)loadRewardedAdWithAdUnitIdentifier:(nullable NSString *)adUnitIdentifier;
+- (BOOL)isRewardedAdReadyWithAdUnitIdentifier:(nullable NSString *)adUnitIdentifier;
+- (void)showRewardedAdWithAdUnitIdentifier:(nullable NSString *)adUnitIdentifier placement:(nullable NSString *)placement customData:(nullable NSString *)customData;
+- (void)setRewardedAdExtraParameterForAdUnitIdentifier:(nullable NSString *)adUnitIdentifier key:(nullable NSString *)key value:(nullable NSString *)value;
+- (void)setRewardedAdLocalExtraParameterForAdUnitIdentifier:(nullable NSString *)adUnitIdentifier key:(nullable NSString *)key value:(nullable id)value;
+
+// Event Tracking
+- (void)trackEvent:(nullable NSString *)event parameters:(nullable NSString *)parameters;
+
+// Ad Value
+- (NSString *)adValueForAdUnitIdentifier:(nullable NSString *)adUnitIdentifier withKey:(nullable NSString *)key;
+
+// User Service
+- (void)didDismissUserConsentDialog;
+
+// CMP Service
+- (void)showCMPForExistingUser;
+
+// Utils
++ (NSString *)serializeParameters:(NSDictionary *)dict;
++ (NSDictionary *)deserializeParameters:(nullable NSString *)serialized;
+
++ (void)setUnityBackgroundCallback:(ALUnityBackgroundCallback)unityBackgroundCallback;
+
+/**
+ * Creates an instance of @c MAUnityAdManager if needed and returns the singleton instance.
+ */
++ (instancetype)shared;
+
+- (instancetype)init NS_UNAVAILABLE;
+
+@end
+
+NS_ASSUME_NONNULL_END
diff --git a/Assets/MaxSdk/AppLovin/Plugins/iOS/MAUnityAdManager.h.meta b/Assets/MaxSdk/AppLovin/Plugins/iOS/MAUnityAdManager.h.meta
new file mode 100644
index 0000000..aef1db5
--- /dev/null
+++ b/Assets/MaxSdk/AppLovin/Plugins/iOS/MAUnityAdManager.h.meta
@@ -0,0 +1,115 @@
+fileFormatVersion: 2
+guid: 4209563f82b8a4f7dabf03705ab761c6
+labels:
+- al_max
+- al_max_export_path-MaxSdk/AppLovin/Plugins/iOS/MAUnityAdManager.h
+PluginImporter:
+ externalObjects: {}
+ serializedVersion: 2
+ iconMap: {}
+ executionOrder: {}
+ defineConstraints: []
+ isPreloaded: 0
+ isOverridable: 0
+ isExplicitlyReferenced: 0
+ validateReferences: 1
+ platformData:
+ - first:
+ '': Any
+ second:
+ enabled: 0
+ settings:
+ Exclude Android: 1
+ Exclude Editor: 1
+ Exclude Linux: 1
+ Exclude Linux64: 1
+ Exclude LinuxUniversal: 1
+ Exclude OSXUniversal: 1
+ Exclude Win: 1
+ Exclude Win64: 1
+ Exclude iOS: 0
+ Exclude tvOS: 1
+ - first:
+ Android: Android
+ second:
+ enabled: 0
+ settings:
+ CPU: ARMv7
+ - first:
+ Any:
+ second:
+ enabled: 0
+ settings: {}
+ - first:
+ Editor: Editor
+ second:
+ enabled: 0
+ settings:
+ CPU: AnyCPU
+ DefaultValueInitialized: true
+ OS: AnyOS
+ - first:
+ Facebook: Win
+ second:
+ enabled: 0
+ settings:
+ CPU: AnyCPU
+ - first:
+ Facebook: Win64
+ second:
+ enabled: 0
+ settings:
+ CPU: AnyCPU
+ - first:
+ Standalone: Linux
+ second:
+ enabled: 0
+ settings:
+ CPU: x86
+ - first:
+ Standalone: Linux64
+ second:
+ enabled: 0
+ settings:
+ CPU: AnyCPU
+ - first:
+ Standalone: LinuxUniversal
+ second:
+ enabled: 0
+ settings:
+ CPU: None
+ - first:
+ Standalone: OSXUniversal
+ second:
+ enabled: 0
+ settings:
+ CPU: AnyCPU
+ - first:
+ Standalone: Win
+ second:
+ enabled: 0
+ settings:
+ CPU: AnyCPU
+ - first:
+ Standalone: Win64
+ second:
+ enabled: 0
+ settings:
+ CPU: AnyCPU
+ - first:
+ iPhone: iOS
+ second:
+ enabled: 1
+ settings:
+ CompileFlags:
+ FrameworkDependencies:
+ - first:
+ tvOS: tvOS
+ second:
+ enabled: 0
+ settings:
+ CompileFlags:
+ FrameworkDependencies:
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/MaxSdk/AppLovin/Plugins/iOS/MAUnityAdManager.m b/Assets/MaxSdk/AppLovin/Plugins/iOS/MAUnityAdManager.m
new file mode 100644
index 0000000..a7bd666
--- /dev/null
+++ b/Assets/MaxSdk/AppLovin/Plugins/iOS/MAUnityAdManager.m
@@ -0,0 +1,2067 @@
+//
+// MAUnityAdManager.m
+// AppLovin MAX Unity Plugin
+//
+
+#import "MAUnityAdManager.h"
+
+#define KEY_WINDOW [UIApplication sharedApplication].keyWindow
+#define DEVICE_SPECIFIC_ADVIEW_AD_FORMAT ([[UIDevice currentDevice] userInterfaceIdiom] == UIUserInterfaceIdiomPad) ? MAAdFormat.leader : MAAdFormat.banner
+#define IS_VERTICAL_BANNER_POSITION(_POS) ( [@"center_left" isEqual: adViewPosition] || [@"center_right" isEqual: adViewPosition] )
+#define DEGREES_TO_RADIANS(angle) ((angle) / 180.0 * M_PI)
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+ extern bool max_unity_should_disable_all_logs(void); // Forward declaration
+
+ // UnityAppController.mm
+ UIViewController* UnityGetGLViewController(void);
+ UIWindow* UnityGetMainWindow(void);
+
+ // life cycle management
+ int UnityIsPaused(void);
+ void UnityPause(int pause);
+
+ void max_unity_dispatch_on_main_thread(dispatch_block_t block)
+ {
+ if ( block )
+ {
+ if ( [NSThread isMainThread] )
+ {
+ block();
+ }
+ else
+ {
+ dispatch_async(dispatch_get_main_queue(), block);
+ }
+ }
+ }
+#ifdef __cplusplus
+}
+#endif
+
+@interface MAUnityAdManager()
+
+// Parent Fields
+@property (nonatomic, weak) ALSdk *sdk;
+
+// Fullscreen Ad Fields
+@property (nonatomic, strong) NSMutableDictionary *interstitials;
+@property (nonatomic, strong) NSMutableDictionary *appOpenAds;
+@property (nonatomic, strong) NSMutableDictionary *rewardedAds;
+
+// AdView Fields
+@property (nonatomic, strong) NSMutableDictionary *adViews;
+@property (nonatomic, strong) NSMutableDictionary *adViewAdFormats;
+@property (nonatomic, strong) NSMutableDictionary *adViewPositions;
+@property (nonatomic, strong) NSMutableDictionary *adViewOffsets;
+@property (nonatomic, strong) NSMutableDictionary *adViewWidths;
+@property (nonatomic, strong) NSMutableDictionary *verticalAdViewFormats;
+@property (nonatomic, strong) NSMutableDictionary *> *adViewConstraints;
+@property (nonatomic, strong) NSMutableDictionary *> *adViewExtraParametersToSetAfterCreate;
+@property (nonatomic, strong) NSMutableDictionary *> *adViewLocalExtraParametersToSetAfterCreate;
+@property (nonatomic, strong) NSMutableDictionary *adViewCustomDataToSetAfterCreate;
+@property (nonatomic, strong) NSMutableArray *adUnitIdentifiersToShowAfterCreate;
+@property (nonatomic, strong) NSMutableSet *disabledAdaptiveBannerAdUnitIdentifiers;
+@property (nonatomic, strong) NSMutableSet *disabledAutoRefreshAdViewAdUnitIdentifiers;
+@property (nonatomic, strong) NSMutableSet *ignoreSafeAreaLandscapeAdUnitIdentifiers;
+@property (nonatomic, strong) UIView *safeAreaBackground;
+@property (nonatomic, strong, nullable) UIColor *publisherBannerBackgroundColor;
+
+@property (nonatomic, strong) NSMutableDictionary *adInfoDict;
+@property (nonatomic, strong) NSObject *adInfoDictLock;
+
+@property (nonatomic, strong) NSOperationQueue *backgroundCallbackEventsQueue;
+@property (nonatomic, assign) BOOL resumeUnityAfterApplicationBecomesActive;
+
+@end
+
+// Internal
+@interface UIColor (ALUtils)
++ (nullable UIColor *)al_colorWithHexString:(NSString *)hexString;
+@end
+
+@interface NSNumber (ALUtils)
++ (NSNumber *)al_numberWithString:(NSString *)string;
+@end
+
+@interface NSString (ALUtils)
+@property (assign, readonly, getter=al_isValidString) BOOL al_validString;
+@end
+
+@interface MAAdFormat (ALUtils)
+@property (nonatomic, assign, readonly, getter=isFullscreenAd) BOOL fullscreenAd;
+@property (nonatomic, assign, readonly, getter=isAdViewAd) BOOL adViewAd;
+@end
+
+@implementation MAUnityAdManager
+static NSString *const SDK_TAG = @"AppLovinSdk";
+static NSString *const TAG = @"MAUnityAdManager";
+static NSString *const DEFAULT_AD_VIEW_POSITION = @"top_left";
+static ALUnityBackgroundCallback backgroundCallback;
+
+#pragma mark - Initialization
+
+- (instancetype)init
+{
+ self = [super init];
+ if ( self )
+ {
+ self.interstitials = [NSMutableDictionary dictionaryWithCapacity: 2];
+ self.appOpenAds = [NSMutableDictionary dictionaryWithCapacity: 2];
+ self.rewardedAds = [NSMutableDictionary dictionaryWithCapacity: 2];
+ self.adViews = [NSMutableDictionary dictionaryWithCapacity: 2];
+ self.adViewAdFormats = [NSMutableDictionary dictionaryWithCapacity: 2];
+ self.adViewPositions = [NSMutableDictionary dictionaryWithCapacity: 2];
+ self.adViewOffsets = [NSMutableDictionary dictionaryWithCapacity: 2];
+ self.adViewWidths = [NSMutableDictionary dictionaryWithCapacity: 2];
+ self.verticalAdViewFormats = [NSMutableDictionary dictionaryWithCapacity: 2];
+ self.adViewConstraints = [NSMutableDictionary dictionaryWithCapacity: 2];
+ self.adViewExtraParametersToSetAfterCreate = [NSMutableDictionary dictionaryWithCapacity: 1];
+ self.adViewLocalExtraParametersToSetAfterCreate = [NSMutableDictionary dictionaryWithCapacity: 1];
+ self.adViewCustomDataToSetAfterCreate = [NSMutableDictionary dictionaryWithCapacity: 1];
+ self.adUnitIdentifiersToShowAfterCreate = [NSMutableArray arrayWithCapacity: 2];
+ self.disabledAdaptiveBannerAdUnitIdentifiers = [NSMutableSet setWithCapacity: 2];
+ self.disabledAutoRefreshAdViewAdUnitIdentifiers = [NSMutableSet setWithCapacity: 2];
+ self.ignoreSafeAreaLandscapeAdUnitIdentifiers = [NSMutableSet setWithCapacity: 2];
+ self.adInfoDict = [NSMutableDictionary dictionary];
+ self.adInfoDictLock = [[NSObject alloc] init];
+
+ self.backgroundCallbackEventsQueue = [[NSOperationQueue alloc] init];
+ self.backgroundCallbackEventsQueue.maxConcurrentOperationCount = 1;
+
+ max_unity_dispatch_on_main_thread(^{
+ self.safeAreaBackground = [[UIView alloc] init];
+ self.safeAreaBackground.hidden = YES;
+ self.safeAreaBackground.backgroundColor = UIColor.clearColor;
+ self.safeAreaBackground.translatesAutoresizingMaskIntoConstraints = NO;
+ self.safeAreaBackground.userInteractionEnabled = NO;
+
+ UIViewController *rootViewController = [self unityViewController];
+ [rootViewController.view addSubview: self.safeAreaBackground];
+ });
+
+ // Enable orientation change listener, so that the position can be updated for vertical banners.
+ [[NSNotificationCenter defaultCenter] addObserverForName: UIDeviceOrientationDidChangeNotification
+ object: nil
+ queue: [NSOperationQueue mainQueue]
+ usingBlock:^(NSNotification *notification) {
+
+ for ( NSString *adUnitIdentifier in self.verticalAdViewFormats )
+ {
+ [self positionAdViewForAdUnitIdentifier: adUnitIdentifier adFormat: self.verticalAdViewFormats[adUnitIdentifier]];
+ }
+ }];
+
+ [[NSNotificationCenter defaultCenter] addObserver: self
+ selector: @selector(applicationPaused:)
+ name: UIApplicationDidEnterBackgroundNotification
+ object: nil];
+
+ [[NSNotificationCenter defaultCenter] addObserver: self
+ selector: @selector(applicationResumed:)
+ name: UIApplicationDidBecomeActiveNotification
+ object: nil];
+
+ [[NSNotificationCenter defaultCenter] addObserverForName: UIApplicationDidBecomeActiveNotification
+ object: nil
+ queue: [NSOperationQueue mainQueue]
+ usingBlock:^(NSNotification *notification) {
+
+#if !IS_TEST_APP
+ if ( self.resumeUnityAfterApplicationBecomesActive && UnityIsPaused() )
+ {
+ UnityPause(NO);
+ }
+#endif
+
+ self.backgroundCallbackEventsQueue.suspended = NO;
+ }];
+ }
+ return self;
+}
+
++ (MAUnityAdManager *)shared
+{
+ static dispatch_once_t token;
+ static MAUnityAdManager *shared;
+ dispatch_once(&token, ^{
+ shared = [[MAUnityAdManager alloc] init];
+ });
+ return shared;
+}
+
++ (void)setUnityBackgroundCallback:(ALUnityBackgroundCallback)unityBackgroundCallback
+{
+ backgroundCallback = unityBackgroundCallback;
+}
+
+#pragma mark - Plugin Initialization
+
+- (void)initializeSdkWithConfiguration:(ALSdkInitializationConfiguration *)initConfig andCompletionHandler:(ALSdkInitializationCompletionHandler)completionHandler;
+{
+ self.sdk = [ALSdk shared];
+ [self.sdk initializeWithConfiguration: initConfig completionHandler:^(ALSdkConfiguration *configuration) {
+ dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
+
+ // Note: internal state should be updated first
+ completionHandler( configuration );
+
+ NSString *consentFlowUserGeographyStr = @(configuration.consentFlowUserGeography).stringValue;
+ NSString *consentDialogStateStr = @(configuration.consentDialogState).stringValue;
+ NSString *appTrackingStatus = @(configuration.appTrackingTransparencyStatus).stringValue; // Deliberately name it `appTrackingStatus` to be a bit more generic (in case Android introduces a similar concept)
+ [self forwardUnityEventWithArgs: @{@"name" : @"OnSdkInitializedEvent",
+ @"consentFlowUserGeography" : consentFlowUserGeographyStr,
+ @"consentDialogState" : consentDialogStateStr,
+ @"countryCode" : configuration.countryCode,
+ @"appTrackingStatus" : appTrackingStatus,
+ @"isSuccessfullyInitialized" : @([self.sdk isInitialized]),
+ @"isTestModeEnabled" : @([configuration isTestModeEnabled])}];
+ });
+ }];
+}
+
+#pragma mark - Banners
+
+- (void)createBannerWithAdUnitIdentifier:(nullable NSString *)adUnitIdentifier atPosition:(nullable NSString *)bannerPosition isAdaptive:(BOOL)isAdaptive
+{
+ [self createAdViewWithAdUnitIdentifier: adUnitIdentifier adFormat: [self adViewAdFormatForAdUnitIdentifier: adUnitIdentifier] atPosition: bannerPosition withOffset: CGPointZero isAdaptive: isAdaptive];
+}
+
+- (void)createBannerWithAdUnitIdentifier:(nullable NSString *)adUnitIdentifier x:(CGFloat)xOffset y:(CGFloat)yOffset isAdaptive:(BOOL)isAdaptive
+{
+ [self createAdViewWithAdUnitIdentifier: adUnitIdentifier adFormat: [self adViewAdFormatForAdUnitIdentifier: adUnitIdentifier] atPosition: DEFAULT_AD_VIEW_POSITION withOffset: CGPointMake(xOffset, yOffset) isAdaptive: isAdaptive];
+}
+
+- (void)loadBannerWithAdUnitIdentifier:(nullable NSString *)adUnitIdentifier
+{
+ [self loadAdViewWithAdUnitIdentifier: adUnitIdentifier adFormat: [self adViewAdFormatForAdUnitIdentifier: adUnitIdentifier]];
+}
+
+- (void)setBannerBackgroundColorForAdUnitIdentifier:(nullable NSString *)adUnitIdentifier hexColorCode:(nullable NSString *)hexColorCode
+{
+ [self setAdViewBackgroundColorForAdUnitIdentifier: adUnitIdentifier adFormat: [self adViewAdFormatForAdUnitIdentifier: adUnitIdentifier] hexColorCode: hexColorCode];
+}
+
+- (void)setBannerPlacement:(nullable NSString *)placement forAdUnitIdentifier:(nullable NSString *)adUnitIdentifier
+{
+ [self setAdViewPlacement: placement forAdUnitIdentifier: adUnitIdentifier adFormat: [self adViewAdFormatForAdUnitIdentifier: adUnitIdentifier]];
+}
+
+- (void)startBannerAutoRefreshForAdUnitIdentifier:(nullable NSString *)adUnitIdentifier
+{
+ [self startAdViewAutoRefreshForAdUnitIdentifier: adUnitIdentifier adFormat: [self adViewAdFormatForAdUnitIdentifier: adUnitIdentifier]];
+}
+
+- (void)stopBannerAutoRefreshForAdUnitIdentifier:(nullable NSString *)adUnitIdentifier
+{
+ [self stopAdViewAutoRefreshForAdUnitIdentifier: adUnitIdentifier adFormat: [self adViewAdFormatForAdUnitIdentifier: adUnitIdentifier]];
+}
+
+- (void)setBannerWidth:(CGFloat)width forAdUnitIdentifier:(nullable NSString *)adUnitIdentifier
+{
+ [self setAdViewWidth: width forAdUnitIdentifier: adUnitIdentifier adFormat: [self adViewAdFormatForAdUnitIdentifier: adUnitIdentifier]];
+}
+
+- (void)updateBannerPosition:(nullable NSString *)bannerPosition forAdUnitIdentifier:(nullable NSString *)adUnitIdentifier
+{
+ [self updateAdViewPosition: bannerPosition withOffset: CGPointZero forAdUnitIdentifier: adUnitIdentifier adFormat: [self adViewAdFormatForAdUnitIdentifier: adUnitIdentifier]];
+}
+
+- (void)updateBannerPosition:(CGFloat)xOffset y:(CGFloat)yOffset forAdUnitIdentifier:(nullable NSString *)adUnitIdentifier
+{
+ [self updateAdViewPosition: DEFAULT_AD_VIEW_POSITION withOffset: CGPointMake(xOffset, yOffset) forAdUnitIdentifier: adUnitIdentifier adFormat: [self adViewAdFormatForAdUnitIdentifier: adUnitIdentifier]];
+}
+
+- (void)setBannerExtraParameterForAdUnitIdentifier:(nullable NSString *)adUnitIdentifier key:(nullable NSString *)key value:(nullable NSString *)value
+{
+ [self setAdViewExtraParameterForAdUnitIdentifier: adUnitIdentifier adFormat: [self adViewAdFormatForAdUnitIdentifier: adUnitIdentifier] key: key value: value];
+}
+
+- (void)setBannerLocalExtraParameterForAdUnitIdentifier:(nullable NSString *)adUnitIdentifier key:(nullable NSString *)key value:(nullable id)value
+{
+ if ( !key )
+ {
+ [self log: @"Failed to set local extra parameter: No key specified"];
+ return;
+ }
+
+ [self setAdViewLocalExtraParameterForAdUnitIdentifier: adUnitIdentifier adFormat: [self adViewAdFormatForAdUnitIdentifier: adUnitIdentifier] key: key value: value];
+}
+
+- (void)setBannerCustomData:(nullable NSString *)customData forAdUnitIdentifier:(nullable NSString *)adUnitIdentifier
+{
+ [self setAdViewCustomData: customData forAdUnitIdentifier: adUnitIdentifier adFormat: [self adViewAdFormatForAdUnitIdentifier: adUnitIdentifier]];
+}
+
+- (void)showBannerWithAdUnitIdentifier:(nullable NSString *)adUnitIdentifier
+{
+ [self showAdViewWithAdUnitIdentifier: adUnitIdentifier adFormat: [self adViewAdFormatForAdUnitIdentifier: adUnitIdentifier]];
+}
+
+- (void)hideBannerWithAdUnitIdentifier:(nullable NSString *)adUnitIdentifier
+{
+ [self hideAdViewWithAdUnitIdentifier: adUnitIdentifier adFormat: [self adViewAdFormatForAdUnitIdentifier: adUnitIdentifier]];
+}
+
+- (NSString *)bannerLayoutForAdUnitIdentifier:(nullable NSString *)adUnitIdentifier
+{
+ return [self adViewLayoutForAdUnitIdentifier: adUnitIdentifier adFormat: [self adViewAdFormatForAdUnitIdentifier: adUnitIdentifier]];
+}
+
+- (void)destroyBannerWithAdUnitIdentifier:(nullable NSString *)adUnitIdentifier
+{
+ [self destroyAdViewWithAdUnitIdentifier: adUnitIdentifier adFormat: [self adViewAdFormatForAdUnitIdentifier: adUnitIdentifier]];
+}
+
++ (CGFloat)adaptiveBannerHeightForWidth:(CGFloat)width
+{
+ return [DEVICE_SPECIFIC_ADVIEW_AD_FORMAT adaptiveSizeForWidth: width].height;
+}
+
+#pragma mark - MRECs
+
+- (void)createMRecWithAdUnitIdentifier:(nullable NSString *)adUnitIdentifier atPosition:(nullable NSString *)mrecPosition
+{
+ [self createAdViewWithAdUnitIdentifier: adUnitIdentifier adFormat: MAAdFormat.mrec atPosition: mrecPosition withOffset: CGPointZero isAdaptive: NO];
+}
+
+- (void)createMRecWithAdUnitIdentifier:(nullable NSString *)adUnitIdentifier x:(CGFloat)xOffset y:(CGFloat)yOffset
+{
+ [self createAdViewWithAdUnitIdentifier: adUnitIdentifier adFormat: MAAdFormat.mrec atPosition: DEFAULT_AD_VIEW_POSITION withOffset: CGPointMake(xOffset, yOffset) isAdaptive: NO];
+}
+
+- (void)loadMRecWithAdUnitIdentifier:(nullable NSString *)adUnitIdentifier
+{
+ [self loadAdViewWithAdUnitIdentifier: adUnitIdentifier adFormat: MAAdFormat.mrec];
+}
+
+- (void)setMRecPlacement:(nullable NSString *)placement forAdUnitIdentifier:(nullable NSString *)adUnitIdentifier
+{
+ [self setAdViewPlacement: placement forAdUnitIdentifier: adUnitIdentifier adFormat: MAAdFormat.mrec];
+}
+
+- (void)startMRecAutoRefreshForAdUnitIdentifier:(nullable NSString *)adUnitIdentifier
+{
+ [self startAdViewAutoRefreshForAdUnitIdentifier: adUnitIdentifier adFormat: MAAdFormat.mrec];
+}
+
+- (void)stopMRecAutoRefreshForAdUnitIdentifier:(nullable NSString *)adUnitIdentifier
+{
+ [self stopAdViewAutoRefreshForAdUnitIdentifier: adUnitIdentifier adFormat: MAAdFormat.mrec];
+}
+
+- (void)updateMRecPosition:(nullable NSString *)mrecPosition forAdUnitIdentifier:(nullable NSString *)adUnitIdentifier
+{
+ [self updateAdViewPosition: mrecPosition withOffset: CGPointZero forAdUnitIdentifier: adUnitIdentifier adFormat: MAAdFormat.mrec];
+}
+
+- (void)updateMRecPosition:(CGFloat)xOffset y:(CGFloat)yOffset forAdUnitIdentifier:(nullable NSString *)adUnitIdentifier
+{
+ [self updateAdViewPosition: DEFAULT_AD_VIEW_POSITION withOffset: CGPointMake(xOffset, yOffset) forAdUnitIdentifier: adUnitIdentifier adFormat: MAAdFormat.mrec];
+}
+
+- (void)setMRecExtraParameterForAdUnitIdentifier:(nullable NSString *)adUnitIdentifier key:(nullable NSString *)key value:(nullable NSString *)value
+{
+ [self setAdViewExtraParameterForAdUnitIdentifier: adUnitIdentifier adFormat: MAAdFormat.mrec key: key value: value];
+}
+
+- (void)setMRecLocalExtraParameterForAdUnitIdentifier:(nullable NSString *)adUnitIdentifier key:(nullable NSString *)key value:(nullable id)value
+{
+ if ( !key )
+ {
+ [self log: @"Failed to set local extra parameter: No key specified"];
+ return;
+ }
+
+ [self setAdViewLocalExtraParameterForAdUnitIdentifier: adUnitIdentifier adFormat: MAAdFormat.mrec key: key value: value];
+}
+
+- (void)setMRecCustomData:(nullable NSString *)customData forAdUnitIdentifier:(nullable NSString *)adUnitIdentifier;
+{
+ [self setAdViewCustomData: customData forAdUnitIdentifier: adUnitIdentifier adFormat: MAAdFormat.mrec];
+}
+
+- (void)showMRecWithAdUnitIdentifier:(nullable NSString *)adUnitIdentifier
+{
+ [self showAdViewWithAdUnitIdentifier: adUnitIdentifier adFormat: MAAdFormat.mrec];
+}
+
+- (void)destroyMRecWithAdUnitIdentifier:(nullable NSString *)adUnitIdentifier
+{
+ [self destroyAdViewWithAdUnitIdentifier: adUnitIdentifier adFormat: MAAdFormat.mrec];
+}
+
+- (void)hideMRecWithAdUnitIdentifier:(nullable NSString *)adUnitIdentifier
+{
+ [self hideAdViewWithAdUnitIdentifier: adUnitIdentifier adFormat: MAAdFormat.mrec];
+}
+
+- (NSString *)mrecLayoutForAdUnitIdentifier:(nullable NSString *)adUnitIdentifier
+{
+ return [self adViewLayoutForAdUnitIdentifier: adUnitIdentifier adFormat: MAAdFormat.mrec];
+}
+
+#pragma mark - Interstitials
+
+- (void)loadInterstitialWithAdUnitIdentifier:(nullable NSString *)adUnitIdentifier
+{
+ MAInterstitialAd *interstitial = [self retrieveInterstitialForAdUnitIdentifier: adUnitIdentifier];
+ [interstitial loadAd];
+}
+
+- (BOOL)isInterstitialReadyWithAdUnitIdentifier:(nullable NSString *)adUnitIdentifier
+{
+ MAInterstitialAd *interstitial = [self retrieveInterstitialForAdUnitIdentifier: adUnitIdentifier];
+ return [interstitial isReady];
+}
+
+- (void)showInterstitialWithAdUnitIdentifier:(nullable NSString *)adUnitIdentifier placement:(nullable NSString *)placement customData:(nullable NSString *)customData
+{
+ MAInterstitialAd *interstitial = [self retrieveInterstitialForAdUnitIdentifier: adUnitIdentifier];
+ [interstitial showAdForPlacement: placement customData: customData];
+}
+
+- (void)setInterstitialExtraParameterForAdUnitIdentifier:(nullable NSString *)adUnitIdentifier key:(nullable NSString *)key value:(nullable NSString *)value
+{
+ MAInterstitialAd *interstitial = [self retrieveInterstitialForAdUnitIdentifier: adUnitIdentifier];
+ [interstitial setExtraParameterForKey: key value: value];
+}
+
+- (void)setInterstitialLocalExtraParameterForAdUnitIdentifier:(nullable NSString *)adUnitIdentifier key:(nullable NSString *)key value:(nullable id)value
+{
+ if ( !key )
+ {
+ [self log: @"Failed to set local extra parameter: No key specified"];
+ return;
+ }
+
+ MAInterstitialAd *interstitial = [self retrieveInterstitialForAdUnitIdentifier: adUnitIdentifier];
+ [interstitial setLocalExtraParameterForKey: key value: value];
+}
+
+#pragma mark - App Open Ads
+
+- (void)loadAppOpenAdWithAdUnitIdentifier:(nullable NSString *)adUnitIdentifier
+{
+ MAAppOpenAd *appOpenAd = [self retrieveAppOpenAdForAdUnitIdentifier: adUnitIdentifier];
+ [appOpenAd loadAd];
+}
+
+- (BOOL)isAppOpenAdReadyWithAdUnitIdentifier:(nullable NSString *)adUnitIdentifier
+{
+ MAAppOpenAd *appOpenAd = [self retrieveAppOpenAdForAdUnitIdentifier: adUnitIdentifier];
+ return [appOpenAd isReady];
+}
+
+- (void)showAppOpenAdWithAdUnitIdentifier:(nullable NSString *)adUnitIdentifier placement:(nullable NSString *)placement customData:(nullable NSString *)customData
+{
+ MAAppOpenAd *appOpenAd = [self retrieveAppOpenAdForAdUnitIdentifier: adUnitIdentifier];
+ [appOpenAd showAdForPlacement: placement customData: customData];
+}
+
+- (void)setAppOpenAdExtraParameterForAdUnitIdentifier:(nullable NSString *)adUnitIdentifier key:(nullable NSString *)key value:(nullable NSString *)value
+{
+ MAAppOpenAd *appOpenAd = [self retrieveAppOpenAdForAdUnitIdentifier: adUnitIdentifier];
+ [appOpenAd setExtraParameterForKey: key value: value];
+}
+
+- (void)setAppOpenAdLocalExtraParameterForAdUnitIdentifier:(nullable NSString *)adUnitIdentifier key:(nullable NSString *)key value:(nullable id)value
+{
+ if ( !key )
+ {
+ [self log: @"Failed to set local extra parameter: No key specified"];
+ return;
+ }
+
+ MAAppOpenAd *appOpenAd = [self retrieveAppOpenAdForAdUnitIdentifier: adUnitIdentifier];
+ [appOpenAd setLocalExtraParameterForKey: key value: value];
+}
+
+#pragma mark - Rewarded
+
+- (void)loadRewardedAdWithAdUnitIdentifier:(nullable NSString *)adUnitIdentifier
+{
+ MARewardedAd *rewardedAd = [self retrieveRewardedAdForAdUnitIdentifier: adUnitIdentifier];
+ [rewardedAd loadAd];
+}
+
+- (BOOL)isRewardedAdReadyWithAdUnitIdentifier:(nullable NSString *)adUnitIdentifier
+{
+ MARewardedAd *rewardedAd = [self retrieveRewardedAdForAdUnitIdentifier: adUnitIdentifier];
+ return [rewardedAd isReady];
+}
+
+- (void)showRewardedAdWithAdUnitIdentifier:(nullable NSString *)adUnitIdentifier placement:(nullable NSString *)placement customData:(nullable NSString *)customData
+{
+ MARewardedAd *rewardedAd = [self retrieveRewardedAdForAdUnitIdentifier: adUnitIdentifier];
+ [rewardedAd showAdForPlacement: placement customData: customData];
+}
+
+- (void)setRewardedAdExtraParameterForAdUnitIdentifier:(nullable NSString *)adUnitIdentifier key:(nullable NSString *)key value:(nullable NSString *)value
+{
+ MARewardedAd *rewardedAd = [self retrieveRewardedAdForAdUnitIdentifier: adUnitIdentifier];
+ [rewardedAd setExtraParameterForKey: key value: value];
+}
+
+- (void)setRewardedAdLocalExtraParameterForAdUnitIdentifier:(nullable NSString *)adUnitIdentifier key:(nullable NSString *)key value:(nullable id)value;
+{
+ if ( !key )
+ {
+ [self log: @"Failed to set local extra parameter: No key specified"];
+ return;
+ }
+
+ MARewardedAd *rewardedAd = [self retrieveRewardedAdForAdUnitIdentifier: adUnitIdentifier];
+ [rewardedAd setLocalExtraParameterForKey: key value: value];
+}
+
+#pragma mark - Event Tracking
+
+- (void)trackEvent:(nullable NSString *)event parameters:(nullable NSString *)parameters
+{
+ NSDictionary *deserializedParameters = [MAUnityAdManager deserializeParameters: parameters];
+ [self.sdk.eventService trackEvent: event parameters: deserializedParameters];
+}
+
+#pragma mark - Ad Info
+
+- (NSDictionary *)adInfoForAd:(MAAd *)ad
+{
+ return @{@"adUnitId" : ad.adUnitIdentifier,
+ @"adFormat" : ad.format.label,
+ @"networkName" : ad.networkName,
+ @"networkPlacement" : ad.networkPlacement,
+ @"creativeId" : ad.creativeIdentifier ?: @"",
+ @"placement" : ad.placement ?: @"",
+ @"revenue" : [@(ad.revenue) stringValue],
+ @"revenuePrecision" : ad.revenuePrecision,
+ @"waterfallInfo" : [self createAdWaterfallInfo: ad.waterfall],
+ @"latencyMillis" : [self requestLatencyMillisFromRequestLatency: ad.requestLatency],
+ @"dspName" : ad.DSPName ?: @""};
+}
+
+#pragma mark - Waterfall Information
+
+- (NSDictionary *)createAdWaterfallInfo:(MAAdWaterfallInfo *)waterfallInfo
+{
+ NSMutableDictionary *waterfallInfoDict = [NSMutableDictionary dictionary];
+ if ( !waterfallInfo ) return waterfallInfoDict;
+
+ waterfallInfoDict[@"name"] = waterfallInfo.name;
+ waterfallInfoDict[@"testName"] = waterfallInfo.testName;
+
+ NSMutableArray *> *networkResponsesArray = [NSMutableArray arrayWithCapacity: waterfallInfo.networkResponses.count];
+ for ( MANetworkResponseInfo *response in waterfallInfo.networkResponses )
+ {
+ [networkResponsesArray addObject: [self createNetworkResponseInfo: response]];
+ }
+
+ waterfallInfoDict[@"networkResponses"] = networkResponsesArray;
+ waterfallInfoDict[@"latencyMillis"] = [self requestLatencyMillisFromRequestLatency: waterfallInfo.latency];
+
+ return waterfallInfoDict;
+}
+
+- (NSDictionary *)createNetworkResponseInfo:(MANetworkResponseInfo *)response
+{
+ NSMutableDictionary *networkResponseDict = [NSMutableDictionary dictionary];
+
+ networkResponseDict[@"adLoadState"] = @(response.adLoadState).stringValue;
+
+ MAMediatedNetworkInfo *mediatedNetworkInfo = response.mediatedNetwork;
+ if ( mediatedNetworkInfo )
+ {
+ NSMutableDictionary *networkInfoObject = [NSMutableDictionary dictionary];
+ networkInfoObject[@"name"] = response.mediatedNetwork.name;
+ networkInfoObject[@"adapterClassName"] = response.mediatedNetwork.adapterClassName;
+ networkInfoObject[@"adapterVersion"] = response.mediatedNetwork.adapterVersion;
+ networkInfoObject[@"sdkVersion"] = response.mediatedNetwork.sdkVersion;
+ networkInfoObject[@"initializationStatus"] = @(response.mediatedNetwork.initializationStatus);
+
+ networkResponseDict[@"mediatedNetwork"] = networkInfoObject;
+ }
+
+ networkResponseDict[@"credentials"] = response.credentials;
+ networkResponseDict[@"isBidding"] = @([response isBidding]);
+
+ MAError *error = response.error;
+ if ( error )
+ {
+ NSMutableDictionary *errorObject = [NSMutableDictionary dictionary];
+ errorObject[@"errorMessage"] = error.message;
+ errorObject[@"adLoadFailure"] = error.adLoadFailureInfo;
+ errorObject[@"errorCode"] = @(error.code).stringValue;
+ errorObject[@"latencyMillis"] = [self requestLatencyMillisFromRequestLatency: error.requestLatency];
+
+ networkResponseDict[@"error"] = errorObject;
+ }
+
+ networkResponseDict[@"latencyMillis"] = [self requestLatencyMillisFromRequestLatency: response.latency];
+
+ return networkResponseDict;
+}
+
+#pragma mark - Ad Value
+
+- (NSString *)adValueForAdUnitIdentifier:(nullable NSString *)adUnitIdentifier withKey:(nullable NSString *)key
+{
+ if ( adUnitIdentifier == nil || adUnitIdentifier.length == 0 ) return @"";
+ if ( key == nil || key.length == 0 ) return @"";
+
+ MAAd *ad = [self adWithAdUnitIdentifier: adUnitIdentifier];
+ if ( !ad ) return @"";
+
+ return [ad adValueForKey: key];
+}
+
+#pragma mark - Ad Callbacks
+
+- (void)didLoadAd:(MAAd *)ad
+{
+ NSString *name;
+ MAAdFormat *adFormat = ad.format;
+ if ( [adFormat isAdViewAd] )
+ {
+ MAAdView *adView = [self retrieveAdViewForAdUnitIdentifier: ad.adUnitIdentifier adFormat: adFormat];
+ // An ad is now being shown, enable user interaction.
+ adView.userInteractionEnabled = YES;
+
+ if ( MAAdFormat.mrec == adFormat )
+ {
+ name = @"OnMRecAdLoadedEvent";
+ }
+ else
+ {
+ name = @"OnBannerAdLoadedEvent";
+ }
+ [self positionAdViewForAd: ad];
+
+ // Do not auto-refresh by default if the ad view is not showing yet (e.g. first load during app launch and publisher does not automatically show banner upon load success)
+ // We will resume auto-refresh in -[MAUnityAdManager showBannerWithAdUnitIdentifier:].
+ if ( adView && [adView isHidden] )
+ {
+ [adView stopAutoRefresh];
+ }
+ }
+ else if ( MAAdFormat.interstitial == adFormat )
+ {
+ name = @"OnInterstitialLoadedEvent";
+ }
+ else if ( MAAdFormat.appOpen == adFormat )
+ {
+ name = @"OnAppOpenAdLoadedEvent";
+ }
+ else if ( MAAdFormat.rewarded == adFormat )
+ {
+ name = @"OnRewardedAdLoadedEvent";
+ }
+ else
+ {
+ [self logInvalidAdFormat: adFormat];
+ return;
+ }
+
+ dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
+
+ @synchronized ( self.adInfoDictLock )
+ {
+ self.adInfoDict[ad.adUnitIdentifier] = ad;
+ }
+
+ NSDictionary *args = [self defaultAdEventParametersForName: name withAd: ad];
+ [self forwardUnityEventWithArgs: args];
+ });
+}
+
+- (void)didFailToLoadAdForAdUnitIdentifier:(NSString *)adUnitIdentifier withError:(MAError *)error
+{
+ dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
+
+ if ( !adUnitIdentifier )
+ {
+ [self log: @"adUnitIdentifier cannot be nil from %@", [NSThread callStackSymbols]];
+ return;
+ }
+
+ NSString *name;
+ if ( self.adViews[adUnitIdentifier] )
+ {
+ MAAdFormat *adFormat = self.adViewAdFormats[adUnitIdentifier];
+ if ( MAAdFormat.mrec == adFormat )
+ {
+ name = @"OnMRecAdLoadFailedEvent";
+ }
+ else
+ {
+ name = @"OnBannerAdLoadFailedEvent";
+ }
+ }
+ else if ( self.interstitials[adUnitIdentifier] )
+ {
+ name = @"OnInterstitialLoadFailedEvent";
+ }
+ else if ( self.appOpenAds[adUnitIdentifier] )
+ {
+ name = @"OnAppOpenAdLoadFailedEvent";
+ }
+ else if ( self.rewardedAds[adUnitIdentifier] )
+ {
+ name = @"OnRewardedAdLoadFailedEvent";
+ }
+ else
+ {
+ [self log: @"invalid adUnitId from %@", [NSThread callStackSymbols]];
+ return;
+ }
+
+ @synchronized ( self.adInfoDictLock )
+ {
+ [self.adInfoDict removeObjectForKey: adUnitIdentifier];
+ }
+
+ [self forwardUnityEventWithArgs: @{@"name" : name,
+ @"adUnitId" : adUnitIdentifier,
+ @"errorCode" : [@(error.code) stringValue],
+ @"errorMessage" : error.message,
+ @"waterfallInfo" : [self createAdWaterfallInfo: error.waterfall],
+ @"adLoadFailureInfo" : error.adLoadFailureInfo ?: @"",
+ @"latencyMillis" : [self requestLatencyMillisFromRequestLatency: error.requestLatency]}];
+ });
+}
+
+- (void)didClickAd:(MAAd *)ad
+{
+ dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
+
+ NSString *name;
+ MAAdFormat *adFormat = ad.format;
+ if ( MAAdFormat.banner == adFormat || MAAdFormat.leader == adFormat )
+ {
+ name = @"OnBannerAdClickedEvent";
+ }
+ else if ( MAAdFormat.mrec == adFormat )
+ {
+ name = @"OnMRecAdClickedEvent";
+ }
+ else if ( MAAdFormat.interstitial == adFormat )
+ {
+ name = @"OnInterstitialClickedEvent";
+ }
+ else if ( MAAdFormat.appOpen == adFormat )
+ {
+ name = @"OnAppOpenAdClickedEvent";
+ }
+ else if ( MAAdFormat.rewarded == adFormat )
+ {
+ name = @"OnRewardedAdClickedEvent";
+ }
+ else
+ {
+ [self logInvalidAdFormat: adFormat];
+ return;
+ }
+
+ NSDictionary *args = [self defaultAdEventParametersForName: name withAd: ad];
+ [self forwardUnityEventWithArgs: args];
+ });
+}
+
+- (void)didDisplayAd:(MAAd *)ad
+{
+ // BMLs do not support [DISPLAY] events in Unity
+ MAAdFormat *adFormat = ad.format;
+ if ( ![adFormat isFullscreenAd] ) return;
+
+#if !IS_TEST_APP
+ // UnityPause needs to be called on the main thread.
+ UnityPause(YES);
+#endif
+
+ dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
+
+ NSString *name;
+ if ( MAAdFormat.interstitial == adFormat )
+ {
+ name = @"OnInterstitialDisplayedEvent";
+ }
+ else if ( MAAdFormat.appOpen == adFormat )
+ {
+ name = @"OnAppOpenAdDisplayedEvent";
+ }
+ else // rewarded
+ {
+ name = @"OnRewardedAdDisplayedEvent";
+ }
+
+ NSDictionary *args = [self defaultAdEventParametersForName: name withAd: ad];
+ [self forwardUnityEventWithArgs: args];
+ });
+}
+
+- (void)didFailToDisplayAd:(MAAd *)ad withError:(MAError *)error
+{
+ dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
+
+ // BMLs do not support [DISPLAY] events in Unity
+ MAAdFormat *adFormat = ad.format;
+ if ( ![adFormat isFullscreenAd] ) return;
+
+ NSString *name;
+ if ( MAAdFormat.interstitial == adFormat )
+ {
+ name = @"OnInterstitialAdFailedToDisplayEvent";
+ }
+ else if ( MAAdFormat.appOpen == adFormat )
+ {
+ name = @"OnAppOpenAdFailedToDisplayEvent";
+ }
+ else // rewarded
+ {
+ name = @"OnRewardedAdFailedToDisplayEvent";
+ }
+
+ NSMutableDictionary *args = [self defaultAdEventParametersForName: name withAd: ad];
+ args[@"errorCode"] = [@(error.code) stringValue];
+ args[@"errorMessage"] = error.message;
+ args[@"mediatedNetworkErrorCode"] = [@(error.mediatedNetworkErrorCode) stringValue];
+ args[@"mediatedNetworkErrorMessage"] = error.mediatedNetworkErrorMessage;
+ args[@"waterfallInfo"] = [self createAdWaterfallInfo: error.waterfall];
+ args[@"latencyMillis"] = [self requestLatencyMillisFromRequestLatency: error.requestLatency];
+ [self forwardUnityEventWithArgs: args];
+ });
+}
+
+- (void)didHideAd:(MAAd *)ad
+{
+ // BMLs do not support [HIDDEN] events in Unity
+ MAAdFormat *adFormat = ad.format;
+ if ( ![adFormat isFullscreenAd] ) return;
+
+#if !IS_TEST_APP
+ extern bool _didResignActive;
+ if ( _didResignActive )
+ {
+ // If the application is not active, we should wait until application becomes active to resume unity.
+ self.resumeUnityAfterApplicationBecomesActive = YES;
+ }
+ else
+ {
+ // UnityPause needs to be called on the main thread.
+ UnityPause(NO);
+ }
+#endif
+
+ dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
+
+ NSString *name;
+ if ( MAAdFormat.interstitial == adFormat )
+ {
+ name = @"OnInterstitialHiddenEvent";
+ }
+ else if ( MAAdFormat.appOpen == adFormat )
+ {
+ name = @"OnAppOpenAdHiddenEvent";
+ }
+ else // rewarded
+ {
+ name = @"OnRewardedAdHiddenEvent";
+ }
+
+ NSDictionary *args = [self defaultAdEventParametersForName: name withAd: ad];
+ [self forwardUnityEventWithArgs: args];
+ });
+}
+
+- (void)didExpandAd:(MAAd *)ad
+{
+ MAAdFormat *adFormat = ad.format;
+ if ( ![adFormat isAdViewAd] )
+ {
+ [self logInvalidAdFormat: adFormat];
+ return;
+ }
+
+#if !IS_TEST_APP
+ // UnityPause needs to be called on the main thread.
+ UnityPause(YES);
+#endif
+
+ dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
+
+ NSString *name;
+ if ( MAAdFormat.mrec == adFormat )
+ {
+ name = @"OnMRecAdExpandedEvent";
+ }
+ else
+ {
+ name = @"OnBannerAdExpandedEvent";
+ }
+
+ NSDictionary *args = [self defaultAdEventParametersForName: name withAd: ad];
+ [self forwardUnityEventWithArgs: args];
+ });
+}
+
+- (void)didCollapseAd:(MAAd *)ad
+{
+ MAAdFormat *adFormat = ad.format;
+ if ( ![adFormat isAdViewAd] )
+ {
+ [self logInvalidAdFormat: adFormat];
+ return;
+ }
+
+#if !IS_TEST_APP
+ extern bool _didResignActive;
+ if ( _didResignActive )
+ {
+ // If the application is not active, we should wait until application becomes active to resume unity.
+ self.resumeUnityAfterApplicationBecomesActive = YES;
+ }
+ else
+ {
+ // UnityPause needs to be called on the main thread.
+ UnityPause(NO);
+ }
+#endif
+
+ dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
+
+ NSString *name;
+ if ( MAAdFormat.mrec == adFormat )
+ {
+ name = @"OnMRecAdCollapsedEvent";
+ }
+ else
+ {
+ name = @"OnBannerAdCollapsedEvent";
+ }
+
+ NSDictionary *args = [self defaultAdEventParametersForName: name withAd: ad];
+ [self forwardUnityEventWithArgs: args];
+ });
+}
+
+- (void)didRewardUserForAd:(MAAd *)ad withReward:(MAReward *)reward
+{
+ dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
+
+ MAAdFormat *adFormat = ad.format;
+ if ( adFormat != MAAdFormat.rewarded )
+ {
+ [self logInvalidAdFormat: adFormat];
+ return;
+ }
+
+ NSString *rewardLabel = reward ? reward.label : @"";
+ NSInteger rewardAmountInt = reward ? reward.amount : 0;
+ NSString *rewardAmount = [@(rewardAmountInt) stringValue];
+ NSString *name = @"OnRewardedAdReceivedRewardEvent";
+
+ NSMutableDictionary *args = [self defaultAdEventParametersForName: name withAd: ad];
+ args[@"rewardLabel"] = rewardLabel;
+ args[@"rewardAmount"] = rewardAmount;
+ [self forwardUnityEventWithArgs: args];
+ });
+}
+
+- (void)didPayRevenueForAd:(MAAd *)ad
+{
+ dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
+
+ NSString *name;
+ MAAdFormat *adFormat = ad.format;
+ if ( MAAdFormat.banner == adFormat || MAAdFormat.leader == adFormat )
+ {
+ name = @"OnBannerAdRevenuePaidEvent";
+ }
+ else if ( MAAdFormat.mrec == adFormat )
+ {
+ name = @"OnMRecAdRevenuePaidEvent";
+ }
+ else if ( MAAdFormat.interstitial == adFormat )
+ {
+ name = @"OnInterstitialAdRevenuePaidEvent";
+ }
+ else if ( MAAdFormat.appOpen == adFormat )
+ {
+ name = @"OnAppOpenAdRevenuePaidEvent";
+ }
+ else if ( MAAdFormat.rewarded == adFormat )
+ {
+ name = @"OnRewardedAdRevenuePaidEvent";
+ }
+ else
+ {
+ [self logInvalidAdFormat: adFormat];
+ return;
+ }
+
+ NSMutableDictionary *args = [self defaultAdEventParametersForName: name withAd: ad];
+ args[@"keepInBackground"] = @([adFormat isFullscreenAd]);
+ [self forwardUnityEventWithArgs: args];
+ });
+}
+
+- (void)didReloadExpiredAd:(MAAd *)expiredAd withNewAd:(MAAd *)newAd;
+{
+ dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
+
+ NSString *name;
+ MAAdFormat *adFormat = newAd.format;
+ if ( MAAdFormat.interstitial == adFormat )
+ {
+ name = @"OnExpiredInterstitialAdReloadedEvent";
+ }
+ else if ( MAAdFormat.appOpen == adFormat )
+ {
+ name = @"OnExpiredAppOpenAdReloadedEvent";
+ }
+ else if ( MAAdFormat.rewarded == adFormat )
+ {
+ name = @"OnExpiredRewardedAdReloadedEvent ";
+ }
+ else
+ {
+ [self logInvalidAdFormat: adFormat];
+ return;
+ }
+
+ @synchronized ( self.adInfoDictLock )
+ {
+ self.adInfoDict[newAd.adUnitIdentifier] = newAd;
+ }
+
+ NSMutableDictionary *args = [NSMutableDictionary dictionary];
+ args[@"expiredAdInfo"] = [self adInfoForAd: expiredAd];
+ args[@"newAdInfo"] = [self adInfoForAd: newAd];
+ args[@"name"] = name;
+ [self forwardUnityEventWithArgs: args];
+ });
+}
+
+- (void)didGenerateCreativeIdentifier:(NSString *)creativeIdentifier forAd:(MAAd *)ad
+{
+ dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
+
+ NSString *name;
+ MAAdFormat *adFormat = ad.format;
+ if ( MAAdFormat.banner == adFormat || MAAdFormat.leader == adFormat )
+ {
+ name = @"OnBannerAdReviewCreativeIdGeneratedEvent";
+ }
+ else if ( MAAdFormat.mrec == adFormat )
+ {
+ name = @"OnMRecAdReviewCreativeIdGeneratedEvent";
+ }
+ else if ( MAAdFormat.interstitial == adFormat )
+ {
+ name = @"OnInterstitialAdReviewCreativeIdGeneratedEvent";
+ }
+ else if ( MAAdFormat.rewarded == adFormat )
+ {
+ name = @"OnRewardedAdReviewCreativeIdGeneratedEvent";
+ }
+ else
+ {
+ [self logInvalidAdFormat: adFormat];
+ return;
+ }
+
+ NSMutableDictionary *args = [self defaultAdEventParametersForName: name withAd: ad];
+ args[@"adReviewCreativeId"] = creativeIdentifier;
+ args[@"keepInBackground"] = @([adFormat isFullscreenAd]);
+
+ // Forward the event in background for fullscreen ads so that the user gets the callback even while the ad is playing.
+ [self forwardUnityEventWithArgs: args];
+ });
+}
+
+- (NSMutableDictionary *)defaultAdEventParametersForName:(NSString *)name withAd:(MAAd *)ad
+{
+ NSMutableDictionary *args = [[self adInfoForAd: ad] mutableCopy];
+ args[@"name"] = name;
+
+ return args;
+}
+
+#pragma mark - Internal Methods
+
+- (void)createAdViewWithAdUnitIdentifier:(NSString *)adUnitIdentifier adFormat:(MAAdFormat *)adFormat atPosition:(NSString *)adViewPosition withOffset:(CGPoint)offset isAdaptive:(BOOL)isAdaptive
+{
+ max_unity_dispatch_on_main_thread(^{
+ [self log: @"Creating %@ with ad unit identifier \"%@\" and position: \"%@\"", adFormat, adUnitIdentifier, adViewPosition];
+
+ if ( self.adViews[adUnitIdentifier] )
+ {
+ [self log: @"Trying to create a %@ that was already created. This will cause the current ad to be hidden.", adFormat.label];
+ }
+
+ // Retrieve ad view from the map
+ MAAdView *adView = [self retrieveAdViewForAdUnitIdentifier: adUnitIdentifier adFormat: adFormat atPosition: adViewPosition withOffset: offset isAdaptive: isAdaptive];
+ adView.hidden = YES;
+ self.safeAreaBackground.hidden = YES;
+
+ // Position ad view immediately so if publisher sets color before ad loads, it will not be the size of the screen
+ self.adViewAdFormats[adUnitIdentifier] = adFormat;
+ [self positionAdViewForAdUnitIdentifier: adUnitIdentifier adFormat: adFormat];
+
+ NSDictionary *extraParameters = self.adViewExtraParametersToSetAfterCreate[adUnitIdentifier];
+
+ // Handle initial extra parameters if publisher sets it before creating ad view
+ if ( extraParameters )
+ {
+ for ( NSString *key in extraParameters )
+ {
+ [adView setExtraParameterForKey: key value: extraParameters[key]];
+
+ [self handleExtraParameterChangesIfNeededForAdUnitIdentifier: adUnitIdentifier
+ adFormat: adFormat
+ key: key
+ value: extraParameters[key]];
+ }
+
+ [self.adViewExtraParametersToSetAfterCreate removeObjectForKey: adUnitIdentifier];
+ }
+
+ // Handle initial local extra parameters if publisher sets it before creating ad view
+ if ( self.adViewLocalExtraParametersToSetAfterCreate[adUnitIdentifier] )
+ {
+ NSDictionary *localExtraParameters = self.adViewLocalExtraParametersToSetAfterCreate[adUnitIdentifier];
+ for ( NSString *key in localExtraParameters )
+ {
+ [adView setLocalExtraParameterForKey: key value: localExtraParameters[key]];
+ }
+
+ [self.adViewLocalExtraParametersToSetAfterCreate removeObjectForKey: adUnitIdentifier];
+ }
+
+ // Handle initial custom data if publisher sets it before creating ad view
+ if ( self.adViewCustomDataToSetAfterCreate[adUnitIdentifier] )
+ {
+ NSString *customData = self.adViewCustomDataToSetAfterCreate[adUnitIdentifier];
+ adView.customData = customData;
+
+ [self.adViewCustomDataToSetAfterCreate removeObjectForKey: adUnitIdentifier];
+ }
+
+ [adView loadAd];
+
+ // Disable auto-refresh if publisher sets it before creating the ad view.
+ if ( [self.disabledAutoRefreshAdViewAdUnitIdentifiers containsObject: adUnitIdentifier] )
+ {
+ [adView stopAutoRefresh];
+ }
+
+ // The publisher may have requested to show the banner before it was created. Now that the banner is created, show it.
+ if ( [self.adUnitIdentifiersToShowAfterCreate containsObject: adUnitIdentifier] )
+ {
+ [self showAdViewWithAdUnitIdentifier: adUnitIdentifier adFormat: adFormat];
+ [self.adUnitIdentifiersToShowAfterCreate removeObject: adUnitIdentifier];
+ }
+ });
+}
+
+- (void)loadAdViewWithAdUnitIdentifier:(NSString *)adUnitIdentifier adFormat:(MAAdFormat *)adFormat
+{
+ max_unity_dispatch_on_main_thread(^{
+ MAAdView *adView = [self retrieveAdViewForAdUnitIdentifier: adUnitIdentifier adFormat: adFormat];
+ if ( !adView )
+ {
+ [self log: @"%@ does not exist for ad unit identifier \"%@\".", adFormat.label, adUnitIdentifier];
+ return;
+ }
+
+ if ( ![self.disabledAutoRefreshAdViewAdUnitIdentifiers containsObject: adUnitIdentifier] )
+ {
+ if ( [adView isHidden] )
+ {
+ [self log: @"Auto-refresh will resume when the %@ ad is shown. You should only call LoadBanner() or LoadMRec() if you explicitly pause auto-refresh and want to manually load an ad.", adFormat.label];
+ return;
+ }
+
+ [self log: @"You must stop auto-refresh if you want to manually load %@ ads.", adFormat.label];
+ return;
+ }
+
+ [adView loadAd];
+ });
+}
+
+- (void)setAdViewBackgroundColorForAdUnitIdentifier:(NSString *)adUnitIdentifier adFormat:(MAAdFormat *)adFormat hexColorCode:(NSString *)hexColorCode
+{
+ max_unity_dispatch_on_main_thread(^{
+ [self log: @"Setting %@ with ad unit identifier \"%@\" to color: \"%@\"", adFormat, adUnitIdentifier, hexColorCode];
+
+ // In some cases, black color may get redrawn on each frame update, resulting in an undesired flicker
+ NSString *hexColorCodeToUse = [hexColorCode containsString: @"FF000000"] ? @"FF000001" : hexColorCode;
+ UIColor *convertedColor = [UIColor al_colorWithHexString: hexColorCodeToUse];
+
+ MAAdView *view = [self retrieveAdViewForAdUnitIdentifier: adUnitIdentifier adFormat: adFormat];
+ self.publisherBannerBackgroundColor = convertedColor;
+ self.safeAreaBackground.backgroundColor = view.backgroundColor = convertedColor;
+
+ // Position adView to ensure logic that depends on background color is properly run
+ [self positionAdViewForAdUnitIdentifier: adUnitIdentifier adFormat: adFormat];
+ });
+}
+
+- (void)setAdViewPlacement:(nullable NSString *)placement forAdUnitIdentifier:(NSString *)adUnitIdentifier adFormat:(MAAdFormat *)adFormat
+{
+ max_unity_dispatch_on_main_thread(^{
+ [self log: @"Setting placement \"%@\" for \"%@\" with ad unit identifier \"%@\"", placement, adFormat, adUnitIdentifier];
+
+ MAAdView *adView = [self retrieveAdViewForAdUnitIdentifier: adUnitIdentifier adFormat: adFormat];
+ adView.placement = placement;
+ });
+}
+
+- (void)startAdViewAutoRefreshForAdUnitIdentifier:(NSString *)adUnitIdentifier adFormat:(MAAdFormat *)adFormat
+{
+ max_unity_dispatch_on_main_thread(^{
+ [self log: @"Starting %@ auto refresh for ad unit identifier \"%@\"", adFormat.label, adUnitIdentifier];
+
+ [self.disabledAutoRefreshAdViewAdUnitIdentifiers removeObject: adUnitIdentifier];
+
+ MAAdView *adView = [self retrieveAdViewForAdUnitIdentifier: adUnitIdentifier adFormat: adFormat];
+ if ( !adView )
+ {
+ [self log: @"%@ does not exist for ad unit identifier %@.", adFormat.label, adUnitIdentifier];
+ return;
+ }
+
+ [adView startAutoRefresh];
+ });
+}
+
+- (void)stopAdViewAutoRefreshForAdUnitIdentifier:(NSString *)adUnitIdentifier adFormat:(MAAdFormat *)adFormat
+{
+ max_unity_dispatch_on_main_thread(^{
+ [self log: @"Stopping %@ auto refresh for ad unit identifier \"%@\"", adFormat.label, adUnitIdentifier];
+
+ [self.disabledAutoRefreshAdViewAdUnitIdentifiers addObject: adUnitIdentifier];
+
+ MAAdView *adView = [self retrieveAdViewForAdUnitIdentifier: adUnitIdentifier adFormat: adFormat];
+ if ( !adView )
+ {
+ [self log: @"%@ does not exist for ad unit identifier %@.", adFormat.label, adUnitIdentifier];
+ return;
+ }
+
+ [adView stopAutoRefresh];
+ });
+}
+
+- (void)setAdViewWidth:(CGFloat)width forAdUnitIdentifier:(NSString *)adUnitIdentifier adFormat:(MAAdFormat *)adFormat
+{
+ max_unity_dispatch_on_main_thread(^{
+ [self log: @"Setting width %f for \"%@\" with ad unit identifier \"%@\"", width, adFormat, adUnitIdentifier];
+
+ BOOL isBannerOrLeader = adFormat.isBannerOrLeaderAd;
+
+ // Banners and leaders need to be at least 320pts wide.
+ CGFloat minWidth = isBannerOrLeader ? MAAdFormat.banner.size.width : adFormat.size.width;
+ if ( width < minWidth )
+ {
+ [self log: @"The provided width: %f is smaller than the minimum required width: %f for ad format: %@. Automatically setting width to %f.", width, minWidth, adFormat, minWidth];
+ }
+
+ CGFloat widthToSet = MAX( minWidth, width );
+ self.adViewWidths[adUnitIdentifier] = @(widthToSet);
+ [self positionAdViewForAdUnitIdentifier: adUnitIdentifier adFormat: adFormat];
+ });
+}
+
+- (void)updateAdViewPosition:(NSString *)adViewPosition withOffset:(CGPoint)offset forAdUnitIdentifier:(NSString *)adUnitIdentifier adFormat:(MAAdFormat *)adFormat
+{
+ max_unity_dispatch_on_main_thread(^{
+ self.adViewPositions[adUnitIdentifier] = adViewPosition;
+ self.adViewOffsets[adUnitIdentifier] = [NSValue valueWithCGPoint: offset];
+ [self positionAdViewForAdUnitIdentifier: adUnitIdentifier adFormat: adFormat];
+ });
+}
+
+- (void)setAdViewExtraParameterForAdUnitIdentifier:(NSString *)adUnitIdentifier adFormat:(MAAdFormat *)adFormat key:(NSString *)key value:(nullable NSString *)value
+{
+ max_unity_dispatch_on_main_thread(^{
+ [self log: @"Setting %@ extra with key: \"%@\" value: \"%@\"", adFormat, key, value];
+
+ MAAdView *adView = [self retrieveAdViewForAdUnitIdentifier: adUnitIdentifier adFormat: adFormat];
+ if ( adView )
+ {
+ [adView setExtraParameterForKey: key value: value];
+ }
+ else
+ {
+ [self log: @"%@ does not exist for ad unit identifier \"%@\". Saving extra parameter to be set when it is created.", adFormat, adUnitIdentifier];
+
+ // The adView has not yet been created. Store the extra parameters, so that they can be added once the banner has been created.
+ NSMutableDictionary *extraParameters = self.adViewExtraParametersToSetAfterCreate[adUnitIdentifier];
+ if ( !extraParameters )
+ {
+ extraParameters = [NSMutableDictionary dictionaryWithCapacity: 1];
+ self.adViewExtraParametersToSetAfterCreate[adUnitIdentifier] = extraParameters;
+ }
+
+ extraParameters[key] = value;
+ }
+
+ // Certain extra parameters need to be handled immediately
+ [self handleExtraParameterChangesIfNeededForAdUnitIdentifier: adUnitIdentifier
+ adFormat: adFormat
+ key: key
+ value: value];
+ });
+}
+
+- (void)setAdViewLocalExtraParameterForAdUnitIdentifier:(NSString *)adUnitIdentifier adFormat:(MAAdFormat *)adFormat key:(NSString *)key value:(nullable id)value
+{
+ max_unity_dispatch_on_main_thread(^{
+ [self log: @"Setting %@ local extra with key: \"%@\" value: \"%@\"", adFormat, key, value];
+
+ MAAdView *adView = [self retrieveAdViewForAdUnitIdentifier: adUnitIdentifier adFormat: adFormat];
+ if ( adView )
+ {
+ [adView setLocalExtraParameterForKey: key value: value];
+ }
+ else
+ {
+ [self log: @"%@ does not exist for ad unit identifier \"%@\". Saving local extra parameter to be set when it is created.", adFormat, adUnitIdentifier];
+
+ // The adView has not yet been created. Store the loca extra parameters, so that they can be added once the adview has been created.
+ NSMutableDictionary *localExtraParameters = self.adViewLocalExtraParametersToSetAfterCreate[adUnitIdentifier];
+ if ( !localExtraParameters )
+ {
+ localExtraParameters = [NSMutableDictionary dictionaryWithCapacity: 1];
+ self.adViewLocalExtraParametersToSetAfterCreate[adUnitIdentifier] = localExtraParameters;
+ }
+
+ localExtraParameters[key] = value;
+ }
+ });
+}
+
+- (void)setAdViewCustomData:(nullable NSString *)customData forAdUnitIdentifier:(NSString *)adUnitIdentifier adFormat:(MAAdFormat *)adFormat
+{
+ max_unity_dispatch_on_main_thread(^{
+
+ MAAdView *adView = [self retrieveAdViewForAdUnitIdentifier: adUnitIdentifier adFormat: adFormat];
+ if ( adView )
+ {
+ adView.customData = customData;
+ }
+ else
+ {
+ [self log: @"%@ does not exist for ad unit identifier %@. Saving custom data to be set when it is created.", adFormat, adUnitIdentifier];
+
+ // The adView has not yet been created. Store the custom data, so that they can be added once the AdView has been created.
+ self.adViewCustomDataToSetAfterCreate[adUnitIdentifier] = customData;
+ }
+ });
+}
+
+- (void)handleExtraParameterChangesIfNeededForAdUnitIdentifier:(NSString *)adUnitIdentifier adFormat:(MAAdFormat *)adFormat key:(NSString *)key value:(nullable NSString *)value
+{
+ if ( MAAdFormat.mrec != adFormat )
+ {
+ if ( [@"force_banner" isEqualToString: key] )
+ {
+ BOOL shouldForceBanner = [NSNumber al_numberWithString: value].boolValue;
+ MAAdFormat *forcedAdFormat = shouldForceBanner ? MAAdFormat.banner : DEVICE_SPECIFIC_ADVIEW_AD_FORMAT;
+
+ self.adViewAdFormats[adUnitIdentifier] = forcedAdFormat;
+ [self positionAdViewForAdUnitIdentifier: adUnitIdentifier adFormat: forcedAdFormat];
+ }
+ else if ( [@"adaptive_banner" isEqualToString: key] )
+ {
+ [self log: @"Setting adaptive banners via extra parameters is deprecated and will be removed in a future plugin version. Use the CreateBanner(adUnitIdentifier, AdViewConfiguration) API to properly configure adaptive banners."];
+
+ BOOL shouldUseAdaptiveBanner = [NSNumber al_numberWithString: value].boolValue;
+ if ( shouldUseAdaptiveBanner )
+ {
+ [self.disabledAdaptiveBannerAdUnitIdentifiers removeObject: adUnitIdentifier];
+ }
+ else
+ {
+ [self.disabledAdaptiveBannerAdUnitIdentifiers addObject: adUnitIdentifier];
+ }
+
+ [self positionAdViewForAdUnitIdentifier: adUnitIdentifier adFormat: adFormat];
+ }
+ else if ( [@"ignore_safe_area_landscape" isEqualToString: key] && [NSNumber al_numberWithString: value].boolValue )
+ {
+ [self.ignoreSafeAreaLandscapeAdUnitIdentifiers addObject: adUnitIdentifier];
+ [self positionAdViewForAdUnitIdentifier: adUnitIdentifier adFormat: adFormat];
+ }
+ }
+
+ if ( [adFormat isAdViewAd] && [@"clips_to_bounds" isEqualToString: key] )
+ {
+ BOOL clipsToBounds = [NSNumber al_numberWithString: value].boolValue;
+ MAAdView *view = [self retrieveAdViewForAdUnitIdentifier: adUnitIdentifier adFormat: adFormat];
+ view.clipsToBounds = clipsToBounds;
+ }
+}
+
+- (void)showAdViewWithAdUnitIdentifier:(NSString *)adUnitIdentifier adFormat:(MAAdFormat *)adFormat
+{
+ max_unity_dispatch_on_main_thread(^{
+ [self log: @"Showing %@ with ad unit identifier \"%@\"", adFormat, adUnitIdentifier];
+
+ MAAdView *view = [self retrieveAdViewForAdUnitIdentifier: adUnitIdentifier adFormat: adFormat];
+ if ( !view )
+ {
+ [self log: @"%@ does not exist for ad unit identifier %@.", adFormat, adUnitIdentifier];
+
+ // The adView has not yet been created. Store the ad unit ID, so that it can be displayed once the banner has been created.
+ [self.adUnitIdentifiersToShowAfterCreate addObject: adUnitIdentifier];
+ }
+ else
+ {
+ // Check edge case where ad may be detatched from view controller
+ if ( !view.window.rootViewController )
+ {
+ [self log: @"%@ missing view controller - re-attaching to %@...", adFormat, [self unityViewController]];
+
+ UIViewController *rootViewController = [self unityViewController];
+ [rootViewController.view addSubview: view];
+
+ [self positionAdViewForAdUnitIdentifier: adUnitIdentifier adFormat: adFormat];
+ }
+ }
+
+ self.safeAreaBackground.hidden = NO;
+ view.hidden = NO;
+
+ if ( ![self.disabledAutoRefreshAdViewAdUnitIdentifiers containsObject: adUnitIdentifier] )
+ {
+ [view startAutoRefresh];
+ }
+ });
+}
+
+- (void)hideAdViewWithAdUnitIdentifier:(NSString *)adUnitIdentifier adFormat:(MAAdFormat *)adFormat
+{
+ max_unity_dispatch_on_main_thread(^{
+ [self log: @"Hiding %@ with ad unit identifier \"%@\"", adFormat, adUnitIdentifier];
+ [self.adUnitIdentifiersToShowAfterCreate removeObject: adUnitIdentifier];
+
+ MAAdView *view = [self retrieveAdViewForAdUnitIdentifier: adUnitIdentifier adFormat: adFormat];
+ view.hidden = YES;
+ self.safeAreaBackground.hidden = YES;
+
+ [view stopAutoRefresh];
+ });
+}
+
+- (NSString *)adViewLayoutForAdUnitIdentifier:(NSString *)adUnitIdentifier adFormat:(MAAdFormat *)adFormat
+{
+ [self log: @"Getting %@ position with ad unit identifier \"%@\"", adFormat, adUnitIdentifier];
+
+ MAAdView *view = [self retrieveAdViewForAdUnitIdentifier: adUnitIdentifier adFormat: adFormat];
+ if ( !view )
+ {
+ [self log: @"%@ does not exist for ad unit identifier %@", adFormat, adUnitIdentifier];
+
+ return @"";
+ }
+
+ CGRect adViewFrame = view.frame;
+ return [MAUnityAdManager serializeParameters: @{@"origin_x" : [NSString stringWithFormat: @"%f", adViewFrame.origin.x],
+ @"origin_y" : [NSString stringWithFormat: @"%f", adViewFrame.origin.y],
+ @"width" : [NSString stringWithFormat: @"%f", CGRectGetWidth(adViewFrame)],
+ @"height" : [NSString stringWithFormat: @"%f", CGRectGetHeight(adViewFrame)]}];
+}
+
+- (void)destroyAdViewWithAdUnitIdentifier:(NSString *)adUnitIdentifier adFormat:(MAAdFormat *)adFormat
+{
+ max_unity_dispatch_on_main_thread(^{
+ [self log: @"Destroying %@ with ad unit identifier \"%@\"", adFormat, adUnitIdentifier];
+
+ MAAdView *view = [self retrieveAdViewForAdUnitIdentifier: adUnitIdentifier adFormat: adFormat];
+ view.delegate = nil;
+ view.revenueDelegate = nil;
+ view.adReviewDelegate = nil;
+
+ [view removeFromSuperview];
+
+ [self.adViews removeObjectForKey: adUnitIdentifier];
+ [self.adViewAdFormats removeObjectForKey: adUnitIdentifier];
+ [self.adViewPositions removeObjectForKey: adUnitIdentifier];
+ [self.adViewOffsets removeObjectForKey: adUnitIdentifier];
+ [self.adViewWidths removeObjectForKey: adUnitIdentifier];
+ [self.verticalAdViewFormats removeObjectForKey: adUnitIdentifier];
+ [self.disabledAdaptiveBannerAdUnitIdentifiers removeObject: adUnitIdentifier];
+ });
+}
+
+- (void)logInvalidAdFormat:(MAAdFormat *)adFormat
+{
+ [self log: @"invalid ad format: %@, from %@", adFormat, [NSThread callStackSymbols]];
+}
+
+- (void)log:(NSString *)format, ...
+{
+ if (max_unity_should_disable_all_logs()) return;
+
+ va_list valist;
+ va_start(valist, format);
+ NSString *message = [[NSString alloc] initWithFormat: format arguments: valist];
+ va_end(valist);
+
+ NSLog(@"[%@] [%@] %@", SDK_TAG, TAG, message);
+}
+
++ (void)log:(NSString *)format, ...
+{
+ if (max_unity_should_disable_all_logs()) return;
+
+ va_list valist;
+ va_start(valist, format);
+ NSString *message = [[NSString alloc] initWithFormat: format arguments: valist];
+ va_end(valist);
+
+ NSLog(@"[%@] [%@] %@", SDK_TAG, TAG, message);
+}
+
+- (MAInterstitialAd *)retrieveInterstitialForAdUnitIdentifier:(NSString *)adUnitIdentifier
+{
+ MAInterstitialAd *result = self.interstitials[adUnitIdentifier];
+ if ( !result )
+ {
+ result = [[MAInterstitialAd alloc] initWithAdUnitIdentifier: adUnitIdentifier];
+ result.delegate = self;
+ result.revenueDelegate = self;
+ result.adReviewDelegate = self;
+ result.expirationDelegate = self;
+
+ self.interstitials[adUnitIdentifier] = result;
+ }
+
+ return result;
+}
+
+- (MAAppOpenAd *)retrieveAppOpenAdForAdUnitIdentifier:(NSString *)adUnitIdentifier
+{
+ MAAppOpenAd *result = self.appOpenAds[adUnitIdentifier];
+ if ( !result )
+ {
+ result = [[MAAppOpenAd alloc] initWithAdUnitIdentifier: adUnitIdentifier];
+ result.delegate = self;
+ result.revenueDelegate = self;
+ result.expirationDelegate = self;
+
+ self.appOpenAds[adUnitIdentifier] = result;
+ }
+
+ return result;
+}
+
+- (MARewardedAd *)retrieveRewardedAdForAdUnitIdentifier:(NSString *)adUnitIdentifier
+{
+ MARewardedAd *result = self.rewardedAds[adUnitIdentifier];
+ if ( !result )
+ {
+ result = [MARewardedAd sharedWithAdUnitIdentifier: adUnitIdentifier];
+ result.delegate = self;
+ result.revenueDelegate = self;
+ result.adReviewDelegate = self;
+ result.expirationDelegate = self;
+
+ self.rewardedAds[adUnitIdentifier] = result;
+ }
+
+ return result;
+}
+
+- (MAAdView *)retrieveAdViewForAdUnitIdentifier:(NSString *)adUnitIdentifier adFormat:(MAAdFormat *)adFormat
+{
+ return [self retrieveAdViewForAdUnitIdentifier: adUnitIdentifier adFormat: adFormat atPosition: nil withOffset: CGPointZero isAdaptive: YES];
+}
+
+- (MAAdView *)retrieveAdViewForAdUnitIdentifier:(NSString *)adUnitIdentifier adFormat:(MAAdFormat *)adFormat atPosition:(NSString *)adViewPosition withOffset:(CGPoint)offset isAdaptive:(BOOL)isAdaptive
+{
+ MAAdView *result = self.adViews[adUnitIdentifier];
+ if ( !result && adViewPosition )
+ {
+ MAAdViewConfiguration *config = [MAAdViewConfiguration configurationWithBuilderBlock:^(MAAdViewConfigurationBuilder *builder) {
+
+ // Set adaptive type only for banner ads. If adaptive is enabled, use ANCHORED; otherwise, fall back to NONE.
+ if ( [adFormat isBannerOrLeaderAd] )
+ {
+ if ( isAdaptive )
+ {
+ builder.adaptiveType = MAAdViewAdaptiveTypeAnchored;
+ }
+ else
+ {
+ builder.adaptiveType = MAAdViewAdaptiveTypeNone;
+ [self.disabledAdaptiveBannerAdUnitIdentifiers addObject:adUnitIdentifier];
+ }
+ }
+ }];
+
+ // There is a Unity bug where if an empty UIView is on screen with user interaction enabled, and a user interacts with it, it just passes the events to random parts of the screen.
+ result = [[MAAdView alloc] initWithAdUnitIdentifier:adUnitIdentifier adFormat:adFormat configuration:config];
+ result.userInteractionEnabled = NO;
+ result.translatesAutoresizingMaskIntoConstraints = NO;
+ result.delegate = self;
+ result.revenueDelegate = self;
+ result.adReviewDelegate = self;
+
+ self.adViews[adUnitIdentifier] = result;
+ self.adViewPositions[adUnitIdentifier] = adViewPosition;
+ self.adViewOffsets[adUnitIdentifier] = [NSValue valueWithCGPoint: offset];
+
+ UIViewController *rootViewController = [self unityViewController];
+ [rootViewController.view addSubview: result];
+
+ // Allow pubs to pause auto-refresh immediately, by default.
+ [result setExtraParameterForKey: @"allow_pause_auto_refresh_immediately" value: @"true"];
+ }
+
+ return result;
+}
+
+- (void)positionAdViewForAd:(MAAd *)ad
+{
+ [self positionAdViewForAdUnitIdentifier: ad.adUnitIdentifier adFormat: ad.format];
+}
+
+- (void)positionAdViewForAdUnitIdentifier:(NSString *)adUnitIdentifier adFormat:(MAAdFormat *)adFormat
+{
+ max_unity_dispatch_on_main_thread(^{
+ MAAdView *adView = [self retrieveAdViewForAdUnitIdentifier: adUnitIdentifier adFormat: adFormat];
+ NSString *adViewPosition = self.adViewPositions[adUnitIdentifier];
+ NSValue *adViewPositionValue = self.adViewOffsets[adUnitIdentifier];
+ CGPoint adViewOffset = [adViewPositionValue CGPointValue];
+ BOOL isAdaptiveBannerDisabled = [self.disabledAdaptiveBannerAdUnitIdentifiers containsObject: adUnitIdentifier];
+ BOOL isWidthPtsOverridden = self.adViewWidths[adUnitIdentifier] != nil;
+
+ UIView *superview = adView.superview;
+ if ( !superview ) return;
+
+ // Deactivate any previous constraints and reset rotation so that the banner can be positioned again.
+ NSArray *activeConstraints = self.adViewConstraints[adUnitIdentifier];
+ [NSLayoutConstraint deactivateConstraints: activeConstraints];
+ adView.transform = CGAffineTransformIdentity;
+ [self.verticalAdViewFormats removeObjectForKey: adUnitIdentifier];
+
+ // Ensure superview contains the safe area background.
+ if ( ![superview.subviews containsObject: self.safeAreaBackground] )
+ {
+ [self.safeAreaBackground removeFromSuperview];
+ [superview insertSubview: self.safeAreaBackground belowSubview: adView];
+ }
+
+ // Deactivate any previous constraints and reset visibility state so that the safe area background can be positioned again.
+ [NSLayoutConstraint deactivateConstraints: self.safeAreaBackground.constraints];
+ self.safeAreaBackground.hidden = adView.hidden;
+
+ //
+ // Determine ad width
+ //
+ CGFloat adViewWidth;
+
+ // Check if publisher has overridden width as points
+ if ( isWidthPtsOverridden )
+ {
+ adViewWidth = self.adViewWidths[adUnitIdentifier].floatValue;
+ }
+ // Top center / bottom center stretches full screen
+ else if ( [adViewPosition isEqual: @"top_center"] || [adViewPosition isEqual: @"bottom_center"] )
+ {
+ adViewWidth = CGRectGetWidth(KEY_WINDOW.bounds);
+ }
+ // Else use standard widths of 320, 728, or 300
+ else
+ {
+ adViewWidth = adFormat.size.width;
+ }
+
+ //
+ // Determine ad height
+ //
+ CGFloat adViewHeight;
+
+ if ( (adFormat == MAAdFormat.banner || adFormat == MAAdFormat.leader) && !isAdaptiveBannerDisabled )
+ {
+ adViewHeight = [adFormat adaptiveSizeForWidth: adViewWidth].height;
+ }
+ else
+ {
+ adViewHeight = adFormat.size.height;
+ }
+
+ CGSize adViewSize = CGSizeMake(adViewWidth, adViewHeight);
+
+ // All positions have constant height
+ NSMutableArray *constraints = [NSMutableArray arrayWithObject: [adView.heightAnchor constraintEqualToConstant: adViewSize.height]];
+
+ UILayoutGuide *layoutGuide = superview.safeAreaLayoutGuide;
+ BOOL shouldIgnoreSafeArea = [self shouldIgnoreSafeAreaForAdUnitIdentifier: adUnitIdentifier];
+ NSLayoutAnchor *topAnchor = shouldIgnoreSafeArea ? superview.topAnchor : layoutGuide.topAnchor;
+
+ if ( [adViewPosition isEqual: @"top_center"] || [adViewPosition isEqual: @"bottom_center"] )
+ {
+ // Non AdMob banners will still be of 50/90 points tall. Set the auto sizing mask such that the inner ad view is pinned to the bottom or top according to the ad view position.
+ if ( !isAdaptiveBannerDisabled )
+ {
+ adView.autoresizingMask = UIViewAutoresizingFlexibleWidth;
+
+ if ( [@"top_center" isEqual: adViewPosition] )
+ {
+ adView.autoresizingMask |= UIViewAutoresizingFlexibleBottomMargin;
+ }
+ else // bottom_center
+ {
+ adView.autoresizingMask |= UIViewAutoresizingFlexibleTopMargin;
+ }
+ }
+
+ // If publisher actually provided a banner background color
+ if ( self.publisherBannerBackgroundColor && adFormat != MAAdFormat.mrec )
+ {
+ if ( isWidthPtsOverridden )
+ {
+ [constraints addObjectsFromArray: @[[adView.widthAnchor constraintEqualToConstant: adViewWidth],
+ [adView.centerXAnchor constraintEqualToAnchor: layoutGuide.centerXAnchor],
+ [self.safeAreaBackground.widthAnchor constraintEqualToConstant: adViewWidth],
+ [self.safeAreaBackground.centerXAnchor constraintEqualToAnchor: layoutGuide.centerXAnchor]]];
+
+ if ( [adViewPosition isEqual: @"top_center"] )
+ {
+ [constraints addObjectsFromArray: @[[adView.topAnchor constraintEqualToAnchor: topAnchor],
+ [self.safeAreaBackground.topAnchor constraintEqualToAnchor: superview.topAnchor],
+ [self.safeAreaBackground.bottomAnchor constraintEqualToAnchor: adView.topAnchor]]];
+ }
+ else // bottom_center
+ {
+ [constraints addObjectsFromArray: @[[adView.bottomAnchor constraintEqualToAnchor: layoutGuide.bottomAnchor],
+ [self.safeAreaBackground.topAnchor constraintEqualToAnchor: adView.bottomAnchor],
+ [self.safeAreaBackground.bottomAnchor constraintEqualToAnchor: superview.bottomAnchor]]];
+ }
+ }
+ else
+ {
+ [constraints addObjectsFromArray: @[[adView.leftAnchor constraintEqualToAnchor: superview.leftAnchor],
+ [adView.rightAnchor constraintEqualToAnchor: superview.rightAnchor],
+ [self.safeAreaBackground.leftAnchor constraintEqualToAnchor: superview.leftAnchor],
+ [self.safeAreaBackground.rightAnchor constraintEqualToAnchor: superview.rightAnchor]]];
+
+ if ( [adViewPosition isEqual: @"top_center"] )
+ {
+ [constraints addObjectsFromArray: @[[adView.topAnchor constraintEqualToAnchor: topAnchor],
+ [self.safeAreaBackground.topAnchor constraintEqualToAnchor: superview.topAnchor],
+ [self.safeAreaBackground.bottomAnchor constraintEqualToAnchor: adView.topAnchor]]];
+ }
+ else // bottom_center
+ {
+ [constraints addObjectsFromArray: @[[adView.bottomAnchor constraintEqualToAnchor: layoutGuide.bottomAnchor],
+ [self.safeAreaBackground.topAnchor constraintEqualToAnchor: adView.bottomAnchor],
+ [self.safeAreaBackground.bottomAnchor constraintEqualToAnchor: superview.bottomAnchor]]];
+ }
+ }
+ }
+ // If pub does not have a background color set or this is not a banner
+ else
+ {
+ self.safeAreaBackground.hidden = YES;
+
+ [constraints addObjectsFromArray: @[[adView.widthAnchor constraintEqualToConstant: adViewWidth],
+ [adView.centerXAnchor constraintEqualToAnchor: layoutGuide.centerXAnchor]]];
+
+ if ( [adViewPosition isEqual: @"top_center"] )
+ {
+ [constraints addObject: [adView.topAnchor constraintEqualToAnchor: topAnchor]];
+ }
+ else // BottomCenter
+ {
+ [constraints addObject: [adView.bottomAnchor constraintEqualToAnchor: layoutGuide.bottomAnchor]];
+ }
+ }
+ }
+ // Check if the publisher wants vertical banners.
+ else if ( [adViewPosition isEqual: @"center_left"] || [adViewPosition isEqual: @"center_right"] )
+ {
+ if ( MAAdFormat.mrec == adFormat )
+ {
+ [constraints addObject: [adView.widthAnchor constraintEqualToConstant: adViewSize.width]];
+
+ if ( [adViewPosition isEqual: @"center_left"] )
+ {
+ [constraints addObjectsFromArray: @[[adView.centerYAnchor constraintEqualToAnchor: layoutGuide.centerYAnchor],
+ [adView.leftAnchor constraintEqualToAnchor: superview.leftAnchor]]];
+
+ [constraints addObjectsFromArray: @[[self.safeAreaBackground.rightAnchor constraintEqualToAnchor: layoutGuide.leftAnchor],
+ [self.safeAreaBackground.leftAnchor constraintEqualToAnchor: superview.leftAnchor]]];
+ }
+ else // center_right
+ {
+ [constraints addObjectsFromArray: @[[adView.centerYAnchor constraintEqualToAnchor: layoutGuide.centerYAnchor],
+ [adView.rightAnchor constraintEqualToAnchor: superview.rightAnchor]]];
+
+ [constraints addObjectsFromArray: @[[self.safeAreaBackground.leftAnchor constraintEqualToAnchor: layoutGuide.rightAnchor],
+ [self.safeAreaBackground.rightAnchor constraintEqualToAnchor: superview.rightAnchor]]];
+ }
+ }
+ else
+ {
+ /* Align the center of the view such that when rotated it snaps into place.
+ *
+ * +---+---+-------+
+ * | | |
+ * | | |
+ * | | |
+ * | | |
+ * | | |
+ * | | |
+ * +-------------+---+-----------+--+
+ * | | + | + | |
+ * +-------------+---+-----------+--+
+ * <+> | |
+ * |+ | |
+ * || | |
+ * || | |
+ * || | |
+ * || | |
+ * +|--+-----------+
+ * v
+ * Banner Half Height
+ */
+ self.safeAreaBackground.hidden = YES;
+
+ adView.transform = CGAffineTransformRotate(CGAffineTransformIdentity, M_PI_2);
+
+ CGFloat width;
+ // If the publiser has a background color set - set the width to the height of the screen, to span the ad across the screen after it is rotated.
+ if ( self.publisherBannerBackgroundColor )
+ {
+ if ( isWidthPtsOverridden )
+ {
+ width = adViewWidth;
+ }
+ else
+ {
+ width = CGRectGetHeight(KEY_WINDOW.bounds);
+ }
+ }
+ // Otherwise - we shouldn't span the banner the width of the realm (there might be user-interactable UI on the sides)
+ else
+ {
+ width = adViewWidth;
+ }
+ [constraints addObject: [adView.widthAnchor constraintEqualToConstant: width]];
+
+ // Set constraints such that the center of the banner aligns with the center left or right as needed. That way, once rotated, the banner snaps into place.
+ [constraints addObject: [adView.centerYAnchor constraintEqualToAnchor: superview.centerYAnchor]];
+
+ // Place the center of the banner half the height of the banner away from the side. If we align the center exactly with the left/right anchor, only half the banner will be visible.
+ CGFloat bannerHalfHeight = adViewSize.height / 2.0;
+ UIInterfaceOrientation orientation = [UIApplication sharedApplication].statusBarOrientation;
+ if ( [adViewPosition isEqual: @"center_left"] )
+ {
+ NSLayoutAnchor *anchor = ( orientation == UIInterfaceOrientationLandscapeRight ) ? layoutGuide.leftAnchor : superview.leftAnchor;
+ [constraints addObject: [adView.centerXAnchor constraintEqualToAnchor: anchor constant: bannerHalfHeight]];
+ }
+ else // CenterRight
+ {
+ NSLayoutAnchor *anchor = ( orientation == UIInterfaceOrientationLandscapeLeft ) ? layoutGuide.rightAnchor : superview.rightAnchor;
+ [constraints addObject: [adView.centerXAnchor constraintEqualToAnchor: anchor constant: -bannerHalfHeight]];
+ }
+
+ // Store the ad view with format, so that it can be updated when the orientation changes.
+ self.verticalAdViewFormats[adUnitIdentifier] = adFormat;
+
+ // If adaptive - make top flexible since we anchor with the bottom of the banner at the edge of the screen
+ if ( !isAdaptiveBannerDisabled )
+ {
+ adView.autoresizingMask = UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleTopMargin;
+ }
+ }
+ }
+ // Otherwise, publisher will likely construct his own views around the adview
+ else
+ {
+ self.safeAreaBackground.hidden = YES;
+
+ [constraints addObject: [adView.widthAnchor constraintEqualToConstant: adViewWidth]];
+
+ if ( [adViewPosition isEqual: @"top_left"] )
+ {
+ [constraints addObjectsFromArray: @[[adView.leftAnchor constraintEqualToAnchor: superview.leftAnchor constant: adViewOffset.x],
+ [adView.topAnchor constraintEqualToAnchor: topAnchor constant: adViewOffset.y]]];
+ }
+ else if ( [adViewPosition isEqual: @"top_right"] )
+ {
+ [constraints addObjectsFromArray: @[[adView.topAnchor constraintEqualToAnchor: topAnchor],
+ [adView.rightAnchor constraintEqualToAnchor: superview.rightAnchor]]];
+ }
+ else if ( [adViewPosition isEqual: @"centered"] )
+ {
+ [constraints addObjectsFromArray: @[[adView.centerXAnchor constraintEqualToAnchor: layoutGuide.centerXAnchor],
+ [adView.centerYAnchor constraintEqualToAnchor: layoutGuide.centerYAnchor]]];
+ }
+ else if ( [adViewPosition isEqual: @"bottom_left"] )
+ {
+ [constraints addObjectsFromArray: @[[adView.bottomAnchor constraintEqualToAnchor: layoutGuide.bottomAnchor],
+ [adView.leftAnchor constraintEqualToAnchor: superview.leftAnchor]]];
+ }
+ else if ( [adViewPosition isEqual: @"bottom_right"] )
+ {
+ [constraints addObjectsFromArray: @[[adView.bottomAnchor constraintEqualToAnchor: layoutGuide.bottomAnchor],
+ [adView.rightAnchor constraintEqualToAnchor: superview.rightAnchor]]];
+ }
+ }
+
+ self.adViewConstraints[adUnitIdentifier] = constraints;
+
+ [NSLayoutConstraint activateConstraints: constraints];
+ });
+}
+
+- (UIViewController *)unityViewController
+{
+ // Handle edge case where `UnityGetGLViewController()` returns nil
+ return UnityGetGLViewController() ?: UnityGetMainWindow().rootViewController ?: [KEY_WINDOW rootViewController];
+}
+
+- (void)forwardUnityEventWithArgs:(NSDictionary *)args
+{
+#if !IS_TEST_APP
+ extern bool _didResignActive;
+ // We should not call any script callbacks when application is not active. Suspend the callback queue if resign is active.
+ // We'll resume the queue once the application becomes active again.
+ self.backgroundCallbackEventsQueue.suspended = _didResignActive;
+#endif
+
+ [self.backgroundCallbackEventsQueue addOperationWithBlock:^{
+ NSString *serializedParameters = [MAUnityAdManager serializeParameters: args];
+ backgroundCallback(serializedParameters.UTF8String);
+ }];
+}
+
++ (NSString *)serializeParameters:(NSDictionary *)dict
+{
+ NSData *jsonData = [NSJSONSerialization dataWithJSONObject: dict options: 0 error: nil];
+ return [[NSString alloc] initWithData: jsonData encoding: NSUTF8StringEncoding];
+}
+
++ (NSDictionary *)deserializeParameters:(nullable NSString *)serialized
+{
+ if ( serialized.length > 0 )
+ {
+ NSError *error;
+ NSDictionary *deserialized = [NSJSONSerialization JSONObjectWithData: [serialized dataUsingEncoding:NSUTF8StringEncoding]
+ options: 0
+ error: &error];
+ if ( error )
+ {
+ [self log: @"Failed to deserialize (%@) with error %@", serialized, error];
+ return @{};
+ }
+
+ return deserialized;
+ }
+ else
+ {
+ return @{};
+ }
+}
+
+- (MAAdFormat *)adViewAdFormatForAdUnitIdentifier:(NSString *)adUnitIdentifier
+{
+ if ( self.adViewAdFormats[adUnitIdentifier] )
+ {
+ return self.adViewAdFormats[adUnitIdentifier];
+ }
+ else
+ {
+ return DEVICE_SPECIFIC_ADVIEW_AD_FORMAT;
+ }
+}
+
+- (NSString *)requestLatencyMillisFromRequestLatency:(NSTimeInterval)requestLatency
+{
+ // Convert latency from seconds to milliseconds to match Android.
+ long requestLatencyMillis = requestLatency * 1000;
+ return @(requestLatencyMillis).stringValue;
+}
+
+#pragma mark - User Service
+
+- (void)didDismissUserConsentDialog
+{
+ dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
+ [self forwardUnityEventWithArgs: @{@"name" : @"OnSdkConsentDialogDismissedEvent"}];
+ });
+}
+
+#pragma mark - CMP Service
+
+- (void)showCMPForExistingUser
+{
+ [self.sdk.cmpService showCMPForExistingUserWithCompletion:^(ALCMPError * _Nullable error) {
+
+ dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
+ NSMutableDictionary *args = [NSMutableDictionary dictionaryWithCapacity: 2];
+ args[@"name"] = @"OnCmpCompletedEvent";
+
+ if ( error )
+ {
+ args[@"error"] = @{@"code": @(error.code),
+ @"message": error.message,
+ @"cmpCode": @(error.cmpCode),
+ @"cmpMessage": error.cmpMessage,
+ @"keepInBackground": @(YES)};
+ }
+
+ [self forwardUnityEventWithArgs: args];
+ });
+ }];
+}
+
+#pragma mark - Application
+
+- (void)applicationPaused:(NSNotification *)notification
+{
+ [self notifyApplicationStateChangedEventForPauseState: YES];
+}
+
+- (void)applicationResumed:(NSNotification *)notification
+{
+ [self notifyApplicationStateChangedEventForPauseState: NO];
+}
+
+- (void)notifyApplicationStateChangedEventForPauseState:(BOOL)isPaused
+{
+ dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
+ [self forwardUnityEventWithArgs: @{@"name": @"OnApplicationStateChanged",
+ @"isPaused": @(isPaused)}];
+ });
+}
+
+- (MAAd *)adWithAdUnitIdentifier:(NSString *)adUnitIdentifier
+{
+ @synchronized ( self.adInfoDictLock )
+ {
+ return self.adInfoDict[adUnitIdentifier];
+ }
+}
+
+#pragma mark - Helper
+
+- (BOOL)shouldIgnoreSafeAreaForAdUnitIdentifier:(NSString *)adUnitIdentifier
+{
+ if ( ![self.ignoreSafeAreaLandscapeAdUnitIdentifiers containsObject: adUnitIdentifier] ) return NO;
+
+ // We should use the superview instead of layout guide if the application's orientation is landscape and the extra parameter is set
+ UIInterfaceOrientation orientation = [UIApplication sharedApplication].statusBarOrientation;
+ return orientation == UIInterfaceOrientationLandscapeRight || orientation == UIInterfaceOrientationLandscapeLeft;
+}
+
+@end
diff --git a/Assets/MaxSdk/AppLovin/Plugins/iOS/MAUnityAdManager.m.meta b/Assets/MaxSdk/AppLovin/Plugins/iOS/MAUnityAdManager.m.meta
new file mode 100644
index 0000000..8c3581e
--- /dev/null
+++ b/Assets/MaxSdk/AppLovin/Plugins/iOS/MAUnityAdManager.m.meta
@@ -0,0 +1,109 @@
+fileFormatVersion: 2
+guid: 2973e70bd2fa74984b35aea07ae9db52
+labels:
+- al_max
+- al_max_export_path-MaxSdk/AppLovin/Plugins/iOS/MAUnityAdManager.m
+PluginImporter:
+ externalObjects: {}
+ serializedVersion: 2
+ iconMap: {}
+ executionOrder: {}
+ defineConstraints: []
+ isPreloaded: 0
+ isOverridable: 0
+ isExplicitlyReferenced: 0
+ validateReferences: 1
+ platformData:
+ - first:
+ '': Any
+ second:
+ enabled: 0
+ settings:
+ Exclude Android: 1
+ Exclude Editor: 1
+ Exclude Linux: 1
+ Exclude Linux64: 1
+ Exclude LinuxUniversal: 1
+ Exclude OSXUniversal: 1
+ Exclude Win: 1
+ Exclude Win64: 1
+ Exclude iOS: 0
+ Exclude tvOS: 1
+ - first:
+ Android: Android
+ second:
+ enabled: 0
+ settings:
+ CPU: ARMv7
+ - first:
+ Any:
+ second:
+ enabled: 0
+ settings: {}
+ - first:
+ Editor: Editor
+ second:
+ enabled: 0
+ settings:
+ CPU: AnyCPU
+ DefaultValueInitialized: true
+ OS: AnyOS
+ - first:
+ Facebook: Win
+ second:
+ enabled: 0
+ settings:
+ CPU: AnyCPU
+ - first:
+ Facebook: Win64
+ second:
+ enabled: 0
+ settings:
+ CPU: AnyCPU
+ - first:
+ Standalone: Linux
+ second:
+ enabled: 0
+ settings:
+ CPU: x86
+ - first:
+ Standalone: Linux64
+ second:
+ enabled: 0
+ settings:
+ CPU: AnyCPU
+ - first:
+ Standalone: OSXUniversal
+ second:
+ enabled: 0
+ settings:
+ CPU: AnyCPU
+ - first:
+ Standalone: Win
+ second:
+ enabled: 0
+ settings:
+ CPU: AnyCPU
+ - first:
+ Standalone: Win64
+ second:
+ enabled: 0
+ settings:
+ CPU: AnyCPU
+ - first:
+ iPhone: iOS
+ second:
+ enabled: 1
+ settings:
+ CompileFlags:
+ FrameworkDependencies:
+ - first:
+ tvOS: tvOS
+ second:
+ enabled: 0
+ settings:
+ CompileFlags:
+ FrameworkDependencies:
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/MaxSdk/AppLovin/Plugins/iOS/MAUnityPlugin.mm b/Assets/MaxSdk/AppLovin/Plugins/iOS/MAUnityPlugin.mm
new file mode 100644
index 0000000..abaaa90
--- /dev/null
+++ b/Assets/MaxSdk/AppLovin/Plugins/iOS/MAUnityPlugin.mm
@@ -0,0 +1,1081 @@
+//
+// MAUnityPlugin.mm
+// AppLovin MAX Unity Plugin
+//
+
+#pragma clang diagnostic push
+#pragma clang diagnostic ignored "-Wdeprecated-declarations"
+
+#import "MAUnityAdManager.h"
+
+#define VERSION @"8.6.0"
+#define NSSTRING(_X) ( (_X != NULL) ? [NSString stringWithCString: _X encoding: NSStringEncodingConversionAllowLossy].al_stringByTrimmingWhitespace : nil)
+
+@interface NSString (ALUtils)
+@property (nonatomic, copy, readonly) NSString *al_stringByTrimmingWhitespace;
+@property (assign, readonly, getter=al_isValidString) BOOL al_validString;
+- (BOOL)al_isEqualToStringIgnoringCase:(nullable NSString *)otherString;
+@end
+
+@interface ALSdkInitializationConfigurationBuilder (ALUtils)
+- (void)setSdkKey:(NSString *)sdkKey;
+@end
+
+// When native code plugin is implemented in .mm / .cpp file, then functions
+// should be surrounded with extern "C" block to conform C function naming rules
+extern "C"
+{
+ static NSString *const TAG = @"MAUnityPlugin";
+ static NSString *const KeySdkKey = @"SdkKey";
+
+ UIView* UnityGetGLView();
+
+ static ALSdkInitializationConfigurationBuilder *_initConfigurationBuilder;
+ static ALSdk *_sdk;
+ static MAUnityAdManager *_adManager;
+
+ static bool _isSdkInitialized = false;
+ static bool _initializeSdkCalled = false;
+ static bool _disableAllLogs = false;
+
+ // Helper method to create C string copy
+ static const char * cStringCopy(NSString *string);
+ // Helper method to log errors
+ void max_unity_log_uninitialized_access_error(const char *callingMethod);
+ void max_unity_log_error(NSString *message);
+
+ ALSdk *getSdk()
+ {
+ if ( !_sdk )
+ {
+ _sdk = [ALSdk shared];
+ }
+
+ return _sdk;
+ }
+
+ MAUnityAdManager *getAdManager()
+ {
+ if ( !_adManager )
+ {
+ _adManager = [MAUnityAdManager shared];
+ }
+
+ return _adManager;
+ }
+
+ ALSdkInitializationConfigurationBuilder *getInitConfigurationBuilder()
+ {
+ if ( !_initConfigurationBuilder )
+ {
+ NSString *sdkKey = [getSdk().settings.extraParameters al_stringForKey: KeySdkKey];
+ _initConfigurationBuilder = [ALSdkInitializationConfiguration builderWithSdkKey: sdkKey];
+ }
+
+ return _initConfigurationBuilder;
+ }
+
+ bool max_unity_should_disable_all_logs()
+ {
+ return _disableAllLogs;
+ }
+
+ int getConsentStatusValue(NSNumber *consentStatus)
+ {
+ if ( consentStatus )
+ {
+ return consentStatus.intValue;
+ }
+ else
+ {
+ return -1;
+ }
+ }
+
+ id getLocalExtraParameterValue(const char *json)
+ {
+ NSData *jsonData = [NSSTRING(json) dataUsingEncoding: NSUTF8StringEncoding];
+ NSError *error;
+ NSDictionary *jsonDict = [NSJSONSerialization JSONObjectWithData: jsonData
+ options: 0
+ error: &error];
+
+ if ( error )
+ {
+ return nil;
+ }
+ else
+ {
+ return jsonDict[@"value"];
+ }
+ }
+
+ NSArray * toStringArray(char **arrayPointer, int size)
+ {
+ NSMutableArray *array = [NSMutableArray arrayWithCapacity: size];
+ for ( int i = 0; i < size; i++ )
+ {
+ NSString *element = NSSTRING(arrayPointer[i]);
+ if ( element )
+ {
+ [array addObject: element];
+ }
+ }
+
+ return array;
+ }
+
+ MASegmentCollection *getSegmentCollection(const char *collectionJson)
+ {
+ MASegmentCollectionBuilder *segmentCollectionBuilder = [MASegmentCollection builder];
+
+ NSDictionary *jsonDict = [MAUnityAdManager deserializeParameters: [NSString stringWithUTF8String: collectionJson]];
+
+ NSArray *segmentsArray = jsonDict[@"segments"];
+ for (NSDictionary *segmentDict in segmentsArray)
+ {
+ NSNumber *key = segmentDict[@"key"];
+ NSArray *valuesArray = segmentDict[@"values"];
+ NSMutableArray *values = [NSMutableArray array];
+ for (NSNumber *value in valuesArray)
+ {
+ [values addObject:value];
+ }
+
+ MASegment *segment = [[MASegment alloc] initWithKey:key values:values];
+ [segmentCollectionBuilder addSegment:segment];
+ }
+
+ return [segmentCollectionBuilder build];
+ }
+
+ void _MaxSetBackgroundCallback(ALUnityBackgroundCallback backgroundCallback)
+ {
+ [MAUnityAdManager setUnityBackgroundCallback: backgroundCallback];
+ }
+
+ void _MaxSetSdkKey(const char *sdkKey)
+ {
+ if (!sdkKey) return;
+
+ NSString *sdkKeyStr = [NSString stringWithUTF8String: sdkKey];
+ [getInitConfigurationBuilder() setSdkKey: sdkKeyStr];
+ }
+
+ void _MaxInitializeSdk(const char *serializedAdUnitIdentifiers, const char *serializedMetaData)
+ {
+ ALSdkInitializationConfigurationBuilder *initConfigurationBuilder = getInitConfigurationBuilder();
+ initConfigurationBuilder.mediationProvider = @"max";
+ initConfigurationBuilder.pluginVersion = [@"Max-Unity-" stringByAppendingString: VERSION];
+ initConfigurationBuilder.adUnitIdentifiers = [[NSString stringWithUTF8String: serializedAdUnitIdentifiers] componentsSeparatedByString: @","];
+
+ [getSdk().settings setExtraParameterForKey: @"applovin_unity_metadata" value: NSSTRING(serializedMetaData)];
+
+ ALSdkInitializationConfiguration *initConfig = [initConfigurationBuilder build];
+
+ [getAdManager() initializeSdkWithConfiguration: initConfig andCompletionHandler:^(ALSdkConfiguration *configuration) {
+ _isSdkInitialized = true;
+ }];
+
+ _initializeSdkCalled = true;
+ }
+
+ bool _MaxIsInitialized()
+ {
+ return _isSdkInitialized;
+ }
+
+ const char * _MaxGetAvailableMediatedNetworks()
+ {
+ NSArray *availableMediatedNetworks = [getSdk() availableMediatedNetworks];
+
+ // Create array of serialized network strings
+ NSMutableArray *> *serializedNetworks = [NSMutableArray arrayWithCapacity: availableMediatedNetworks.count];
+ for ( MAMediatedNetworkInfo *mediatedNetwork in availableMediatedNetworks )
+ {
+ NSDictionary *mediatedNetworkDictionary = @{@"name" : mediatedNetwork.name,
+ @"adapterClassName" : mediatedNetwork.adapterClassName,
+ @"adapterVersion" : mediatedNetwork.adapterVersion,
+ @"sdkVersion" : mediatedNetwork.sdkVersion,
+ @"initializationStatus" : @(mediatedNetwork.initializationStatus)};
+ [serializedNetworks addObject: mediatedNetworkDictionary];
+ }
+
+ NSData *jsonData = [NSJSONSerialization dataWithJSONObject: serializedNetworks options: 0 error: nil];
+ return cStringCopy([[NSString alloc] initWithData: jsonData encoding: NSUTF8StringEncoding]);
+ }
+
+ void _MaxShowMediationDebugger()
+ {
+ if ( !_initializeSdkCalled )
+ {
+ max_unity_log_error(@"Failed to show mediation debugger - please ensure the AppLovin MAX Unity Plugin has been initialized by calling 'MaxSdk.InitializeSdk();'!");
+ return;
+ }
+
+ [getSdk() showMediationDebugger];
+ }
+
+ void _MaxShowCreativeDebugger()
+ {
+ if ( !_initializeSdkCalled )
+ {
+ max_unity_log_error(@"Failed to show creative debugger - please ensure the AppLovin MAX Unity Plugin has been initialized by calling 'MaxSdk.InitializeSdk();'!");
+ return;
+ }
+
+ [getSdk() showCreativeDebugger];
+ }
+
+ void _MaxSetUserId(const char *userId)
+ {
+ getSdk().settings.userIdentifier = NSSTRING(userId);
+ }
+
+ void _MaxSetSegmentCollection(const char *collectionJson)
+ {
+ if ( _initializeSdkCalled )
+ {
+ max_unity_log_error(@"Segment collection must be set before MAX SDK is initialized");
+ return;
+ }
+
+ getInitConfigurationBuilder().segmentCollection = getSegmentCollection(collectionJson);
+ }
+
+ const char * _MaxGetSdkConfiguration()
+ {
+ if ( !_initializeSdkCalled )
+ {
+ max_unity_log_uninitialized_access_error("_MaxGetSdkConfiguration");
+ return cStringCopy(@"");
+ }
+
+ NSString *consentFlowUserGeographyStr = @(getSdk().configuration.consentFlowUserGeography).stringValue;
+ NSString *consentDialogStateStr = @(getSdk().configuration.consentDialogState).stringValue;
+ NSString *appTrackingStatus = @(getSdk().configuration.appTrackingTransparencyStatus).stringValue; // Deliberately name it `appTrackingStatus` to be a bit more generic (in case Android introduces a similar concept)
+
+ return cStringCopy([MAUnityAdManager serializeParameters: @{@"consentFlowUserGeography" : consentFlowUserGeographyStr,
+ @"consentDialogState" : consentDialogStateStr,
+ @"countryCode" : getSdk().configuration.countryCode,
+ @"appTrackingStatus" : appTrackingStatus,
+ @"isSuccessfullyInitialized" : @([getSdk() isInitialized]),
+ @"isTestModeEnabled" : @([getSdk().configuration isTestModeEnabled])}]);
+ }
+
+ void _MaxSetHasUserConsent(bool hasUserConsent)
+ {
+ [ALPrivacySettings setHasUserConsent: hasUserConsent];
+ }
+
+ bool _MaxHasUserConsent()
+ {
+ return [ALPrivacySettings hasUserConsent];
+ }
+
+ bool _MaxIsUserConsentSet()
+ {
+ return [ALPrivacySettings isUserConsentSet];
+ }
+
+ void _MaxSetDoNotSell(bool doNotSell)
+ {
+ [ALPrivacySettings setDoNotSell: doNotSell];
+ }
+
+ bool _MaxIsDoNotSell()
+ {
+ return [ALPrivacySettings isDoNotSell];
+ }
+
+ bool _MaxIsDoNotSellSet()
+ {
+ return [ALPrivacySettings isDoNotSellSet];
+ }
+
+ void _MaxCreateBanner(const char *adUnitIdentifier, const char *bannerPosition, bool isAdaptive)
+ {
+ if ( !_initializeSdkCalled )
+ {
+ max_unity_log_uninitialized_access_error("_MaxCreateBanner");
+ return;
+ }
+
+ [getAdManager() createBannerWithAdUnitIdentifier: NSSTRING(adUnitIdentifier) atPosition: NSSTRING(bannerPosition) isAdaptive: isAdaptive];
+ }
+
+ void _MaxCreateBannerXY(const char *adUnitIdentifier, const float x, const float y, bool isAdaptive)
+ {
+ if ( !_initializeSdkCalled )
+ {
+ max_unity_log_uninitialized_access_error("_MaxCreateBannerXY");
+ return;
+ }
+
+ [getAdManager() createBannerWithAdUnitIdentifier: NSSTRING(adUnitIdentifier) x: x y: y isAdaptive: isAdaptive];
+ }
+
+ void _MaxLoadBanner(const char *adUnitIdentifier)
+ {
+ if ( !_initializeSdkCalled )
+ {
+ max_unity_log_uninitialized_access_error("_MaxLoadBanner");
+ return;
+ }
+
+ [getAdManager() loadBannerWithAdUnitIdentifier: NSSTRING(adUnitIdentifier)];
+ }
+
+ void _MaxSetBannerBackgroundColor(const char *adUnitIdentifier, const char *hexColorCode)
+ {
+ if ( !_initializeSdkCalled )
+ {
+ max_unity_log_uninitialized_access_error("_MaxSetBannerBackgroundColor");
+ return;
+ }
+
+ [getAdManager() setBannerBackgroundColorForAdUnitIdentifier: NSSTRING(adUnitIdentifier) hexColorCode: NSSTRING(hexColorCode)];
+ }
+
+ void _MaxSetBannerPlacement(const char *adUnitIdentifier, const char *placement)
+ {
+ if ( !_initializeSdkCalled )
+ {
+ max_unity_log_uninitialized_access_error("_MaxSetBannerPlacement");
+ return;
+ }
+
+ [getAdManager() setBannerPlacement: NSSTRING(placement) forAdUnitIdentifier: NSSTRING(adUnitIdentifier)];
+ }
+
+ void _MaxStartBannerAutoRefresh(const char *adUnitIdentifier)
+ {
+ if ( !_initializeSdkCalled )
+ {
+ max_unity_log_uninitialized_access_error("_MaxStartBannerAutoRefresh");
+ return;
+ }
+
+ [getAdManager() startBannerAutoRefreshForAdUnitIdentifier: NSSTRING(adUnitIdentifier)];
+ }
+
+ void _MaxStopBannerAutoRefresh(const char *adUnitIdentifier)
+ {
+ if ( !_initializeSdkCalled )
+ {
+ max_unity_log_uninitialized_access_error("_MaxStopBannerAutoRefresh");
+ return;
+ }
+
+ [getAdManager() stopBannerAutoRefreshForAdUnitIdentifier: NSSTRING(adUnitIdentifier)];
+ }
+
+ void _MaxSetBannerExtraParameter(const char *adUnitIdentifier, const char *key, const char *value)
+ {
+ if ( !_initializeSdkCalled )
+ {
+ max_unity_log_uninitialized_access_error("_MaxSetBannerExtraParameter");
+ return;
+ }
+
+ [getAdManager() setBannerExtraParameterForAdUnitIdentifier: NSSTRING(adUnitIdentifier)
+ key: NSSTRING(key)
+ value: NSSTRING(value)];
+ }
+
+ void _MaxSetBannerLocalExtraParameter(const char *adUnitIdentifier, const char *key, MAUnityRef value)
+ {
+ if ( !_initializeSdkCalled )
+ {
+ max_unity_log_uninitialized_access_error("_MaxSetBannerLocalExtraParameter");
+ return;
+ }
+
+ [getAdManager() setBannerLocalExtraParameterForAdUnitIdentifier: NSSTRING(adUnitIdentifier)
+ key: NSSTRING(key)
+ value: (__bridge id) value];
+ }
+
+ void _MaxSetBannerLocalExtraParameterJSON(const char *adUnitIdentifier, const char *key, const char *json)
+ {
+ if ( !_initializeSdkCalled )
+ {
+ max_unity_log_uninitialized_access_error("_MaxSetBannerLocalExtraParameter");
+ return;
+ }
+
+ id value = getLocalExtraParameterValue(json);
+ [getAdManager() setBannerLocalExtraParameterForAdUnitIdentifier: NSSTRING(adUnitIdentifier)
+ key: NSSTRING(key)
+ value: value];
+ }
+
+ void _MaxSetBannerCustomData(const char *adUnitIdentifier, const char *customData)
+ {
+ if ( !_initializeSdkCalled )
+ {
+ max_unity_log_uninitialized_access_error("_MaxSetBannerCustomData");
+ return;
+ }
+
+ [getAdManager() setBannerCustomData: NSSTRING(customData) forAdUnitIdentifier: NSSTRING(adUnitIdentifier)];
+ }
+
+ void _MaxSetBannerWidth(const char *adUnitIdentifier, const float width)
+ {
+ if ( !_initializeSdkCalled )
+ {
+ max_unity_log_uninitialized_access_error("_MaxSetBannerWidth");
+ return;
+ }
+
+ [getAdManager() setBannerWidth: width forAdUnitIdentifier: NSSTRING(adUnitIdentifier)];
+ }
+
+ void _MaxUpdateBannerPosition(const char *adUnitIdentifier, const char *bannerPosition)
+ {
+ if ( !_initializeSdkCalled )
+ {
+ max_unity_log_uninitialized_access_error("_MaxUpdateBannerPosition");
+ return;
+ }
+
+ [getAdManager() updateBannerPosition: NSSTRING(bannerPosition) forAdUnitIdentifier: NSSTRING(adUnitIdentifier)];
+ }
+
+ void _MaxUpdateBannerPositionXY(const char *adUnitIdentifier, const float x, const float y)
+ {
+ if ( !_initializeSdkCalled )
+ {
+ max_unity_log_uninitialized_access_error("_MaxUpdateBannerPositionXY");
+ return;
+ }
+
+ [getAdManager() updateBannerPosition: x y: y forAdUnitIdentifier: NSSTRING(adUnitIdentifier)];
+ }
+
+ void _MaxShowBanner(const char *adUnitIdentifier)
+ {
+ if ( !_initializeSdkCalled )
+ {
+ max_unity_log_uninitialized_access_error("_MaxShowBanner");
+ return;
+ }
+
+ [getAdManager() showBannerWithAdUnitIdentifier: NSSTRING(adUnitIdentifier)];
+ }
+
+ void _MaxDestroyBanner(const char *adUnitIdentifier)
+ {
+ if ( !_initializeSdkCalled )
+ {
+ max_unity_log_uninitialized_access_error("_MaxDestroyBanner");
+ return;
+ }
+
+ [getAdManager() destroyBannerWithAdUnitIdentifier: NSSTRING(adUnitIdentifier)];
+ }
+
+ void _MaxHideBanner(const char *adUnitIdentifier)
+ {
+ if ( !_initializeSdkCalled )
+ {
+ max_unity_log_uninitialized_access_error("_MaxHideBanner");
+ return;
+ }
+
+ [getAdManager() hideBannerWithAdUnitIdentifier: NSSTRING(adUnitIdentifier)];
+ }
+
+ const char * _MaxGetBannerLayout(const char *adUnitIdentifier)
+ {
+ if ( !_initializeSdkCalled )
+ {
+ max_unity_log_uninitialized_access_error("_MaxGetBannerLayout");
+ return cStringCopy(@"");
+ }
+
+ return cStringCopy([getAdManager() bannerLayoutForAdUnitIdentifier: NSSTRING(adUnitIdentifier)]);
+ }
+
+ void _MaxCreateMRec(const char *adUnitIdentifier, const char *mrecPosition)
+ {
+ if ( !_initializeSdkCalled )
+ {
+ max_unity_log_uninitialized_access_error("_MaxCreateMRec");
+ return;
+ }
+
+ [getAdManager() createMRecWithAdUnitIdentifier: NSSTRING(adUnitIdentifier) atPosition: NSSTRING(mrecPosition)];
+ }
+
+ void _MaxCreateMRecXY(const char *adUnitIdentifier, const float x, const float y)
+ {
+ if ( !_initializeSdkCalled )
+ {
+ max_unity_log_uninitialized_access_error("_MaxCreateMRecXY");
+ return;
+ }
+
+ [getAdManager() createMRecWithAdUnitIdentifier: NSSTRING(adUnitIdentifier) x: x y: y];
+ }
+
+ void _MaxLoadMRec(const char *adUnitIdentifier)
+ {
+ if ( !_initializeSdkCalled )
+ {
+ max_unity_log_uninitialized_access_error("_MaxLoadMRec");
+ return;
+ }
+
+ [getAdManager() loadMRecWithAdUnitIdentifier: NSSTRING(adUnitIdentifier)];
+ }
+
+ void _MaxSetMRecPlacement(const char *adUnitIdentifier, const char *placement)
+ {
+ if ( !_initializeSdkCalled )
+ {
+ max_unity_log_uninitialized_access_error("_MaxSetMRecPlacement");
+ return;
+ }
+
+ [getAdManager() setMRecPlacement: NSSTRING(placement) forAdUnitIdentifier: NSSTRING(adUnitIdentifier)];
+ }
+
+ void _MaxStartMRecAutoRefresh(const char *adUnitIdentifier)
+ {
+ if ( !_initializeSdkCalled )
+ {
+ max_unity_log_uninitialized_access_error("_MaxStartMRecAutoRefresh");
+ return;
+ }
+
+ [getAdManager() startMRecAutoRefreshForAdUnitIdentifier: NSSTRING(adUnitIdentifier)];
+ }
+
+ void _MaxStopMRecAutoRefresh(const char *adUnitIdentifier)
+ {
+ if ( !_initializeSdkCalled )
+ {
+ max_unity_log_uninitialized_access_error("_MaxStopMRecAutoRefresh");
+ return;
+ }
+
+ [getAdManager() stopMRecAutoRefreshForAdUnitIdentifier: NSSTRING(adUnitIdentifier)];
+ }
+
+ void _MaxUpdateMRecPosition(const char *adUnitIdentifier, const char *mrecPosition)
+ {
+ if ( !_initializeSdkCalled )
+ {
+ max_unity_log_uninitialized_access_error("_MaxUpdateMRecPosition");
+ return;
+ }
+
+ [getAdManager() updateMRecPosition: NSSTRING(mrecPosition) forAdUnitIdentifier: NSSTRING(adUnitIdentifier)];
+ }
+
+ void _MaxUpdateMRecPositionXY(const char *adUnitIdentifier, const float x, const float y)
+ {
+ if ( !_initializeSdkCalled )
+ {
+ max_unity_log_uninitialized_access_error("_MaxUpdateMRecPositionXY");
+ return;
+ }
+
+ [getAdManager() updateMRecPosition: x y: y forAdUnitIdentifier: NSSTRING(adUnitIdentifier)];
+ }
+
+ void _MaxShowMRec(const char *adUnitIdentifier)
+ {
+ if ( !_initializeSdkCalled )
+ {
+ max_unity_log_uninitialized_access_error("_MaxShowMRec");
+ return;
+ }
+
+ [getAdManager() showMRecWithAdUnitIdentifier: NSSTRING(adUnitIdentifier)];
+ }
+
+ void _MaxDestroyMRec(const char *adUnitIdentifier)
+ {
+ if ( !_initializeSdkCalled )
+ {
+ max_unity_log_uninitialized_access_error("_MaxDestroyMRec");
+ return;
+ }
+
+ [getAdManager() destroyMRecWithAdUnitIdentifier: NSSTRING(adUnitIdentifier)];
+ }
+
+ void _MaxHideMRec(const char *adUnitIdentifier)
+ {
+ if ( !_initializeSdkCalled )
+ {
+ max_unity_log_uninitialized_access_error("_MaxHideMRec");
+ return;
+ }
+
+ [getAdManager() hideMRecWithAdUnitIdentifier: NSSTRING(adUnitIdentifier)];
+ }
+
+ void _MaxSetMRecExtraParameter(const char *adUnitIdentifier, const char *key, const char *value)
+ {
+ if ( !_initializeSdkCalled )
+ {
+ max_unity_log_uninitialized_access_error("_MaxSetMRecExtraParameter");
+ return;
+ }
+
+ [getAdManager() setMRecExtraParameterForAdUnitIdentifier: NSSTRING(adUnitIdentifier)
+ key: NSSTRING(key)
+ value: NSSTRING(value)];
+ }
+
+ void _MaxSetMRecLocalExtraParameter(const char *adUnitIdentifier, const char *key, MAUnityRef value)
+ {
+ if ( !_initializeSdkCalled )
+ {
+ max_unity_log_uninitialized_access_error("_MaxSetMRecLocalExtraParameter");
+ return;
+ }
+
+ [getAdManager() setMRecLocalExtraParameterForAdUnitIdentifier: NSSTRING(adUnitIdentifier)
+ key: NSSTRING(key)
+ value: (__bridge id)value];
+ }
+
+ void _MaxSetMRecLocalExtraParameterJSON(const char *adUnitIdentifier, const char *key, const char *json)
+ {
+ if ( !_initializeSdkCalled )
+ {
+ max_unity_log_uninitialized_access_error("_MaxSetMRecLocalExtraParameter");
+ return;
+ }
+
+ id value = getLocalExtraParameterValue(json);
+ [getAdManager() setMRecLocalExtraParameterForAdUnitIdentifier: NSSTRING(adUnitIdentifier)
+ key: NSSTRING(key)
+ value: value];
+ }
+
+ void _MaxSetMRecCustomData(const char *adUnitIdentifier, const char *customData)
+ {
+ if ( !_initializeSdkCalled )
+ {
+ max_unity_log_uninitialized_access_error("_MaxSetMRecCustomData");
+ return;
+ }
+
+ [getAdManager() setMRecCustomData: NSSTRING(customData) forAdUnitIdentifier: NSSTRING(adUnitIdentifier)];
+ }
+
+ const char * _MaxGetMRecLayout(const char *adUnitIdentifier)
+ {
+ if ( !_initializeSdkCalled )
+ {
+ max_unity_log_uninitialized_access_error("_MaxGetMRecLayout");
+ return cStringCopy(@"");
+ }
+
+ return cStringCopy([getAdManager() mrecLayoutForAdUnitIdentifier: NSSTRING(adUnitIdentifier)]);
+ }
+
+ void _MaxLoadInterstitial(const char *adUnitIdentifier)
+ {
+ if ( !_initializeSdkCalled )
+ {
+ max_unity_log_uninitialized_access_error("_MaxLoadInterstitial");
+ return;
+ }
+
+ [getAdManager() loadInterstitialWithAdUnitIdentifier: NSSTRING(adUnitIdentifier)];
+ }
+
+ void _MaxSetInterstitialExtraParameter(const char *adUnitIdentifier, const char *key, const char *value)
+ {
+ if ( !_initializeSdkCalled )
+ {
+ max_unity_log_uninitialized_access_error("_MaxSetInterstitialExtraParameter");
+ return;
+ }
+
+ [getAdManager() setInterstitialExtraParameterForAdUnitIdentifier: NSSTRING(adUnitIdentifier)
+ key: NSSTRING(key)
+ value: NSSTRING(value)];
+ }
+
+ void _MaxSetInterstitialLocalExtraParameter(const char *adUnitIdentifier, const char *key, MAUnityRef value)
+ {
+ if ( !_initializeSdkCalled )
+ {
+ max_unity_log_uninitialized_access_error("_MaxSetInterstitialLocalExtraParameter");
+ return;
+ }
+
+ [getAdManager() setInterstitialLocalExtraParameterForAdUnitIdentifier: NSSTRING(adUnitIdentifier)
+ key: NSSTRING(key)
+ value: (__bridge id)value];
+ }
+
+ void _MaxSetInterstitialLocalExtraParameterJSON(const char *adUnitIdentifier, const char *key, const char *json)
+ {
+ if ( !_initializeSdkCalled )
+ {
+ max_unity_log_uninitialized_access_error("_MaxSetInterstitialLocalExtraParameter");
+ return;
+ }
+
+ id value = getLocalExtraParameterValue(json);
+ [getAdManager() setInterstitialLocalExtraParameterForAdUnitIdentifier: NSSTRING(adUnitIdentifier)
+ key: NSSTRING(key)
+ value: value];
+ }
+
+ bool _MaxIsInterstitialReady(const char *adUnitIdentifier)
+ {
+ if ( !_initializeSdkCalled )
+ {
+ max_unity_log_uninitialized_access_error("_MaxIsInterstitialReady");
+ return false;
+ }
+
+ return [getAdManager() isInterstitialReadyWithAdUnitIdentifier: NSSTRING(adUnitIdentifier)];
+ }
+
+ void _MaxShowInterstitial(const char *adUnitIdentifier, const char *placement, const char *customData)
+ {
+ if ( !_initializeSdkCalled )
+ {
+ max_unity_log_uninitialized_access_error("_MaxShowInterstitial");
+ return;
+ }
+
+ [getAdManager() showInterstitialWithAdUnitIdentifier: NSSTRING(adUnitIdentifier) placement: NSSTRING(placement) customData: NSSTRING(customData)];
+ }
+
+ void _MaxLoadAppOpenAd(const char *adUnitIdentifier)
+ {
+ if ( !_initializeSdkCalled )
+ {
+ max_unity_log_uninitialized_access_error("_MaxLoadAppOpenAd");
+ return;
+ }
+
+ [getAdManager() loadAppOpenAdWithAdUnitIdentifier: NSSTRING(adUnitIdentifier)];
+ }
+
+ void _MaxSetAppOpenAdExtraParameter(const char *adUnitIdentifier, const char *key, const char *value)
+ {
+ if ( !_initializeSdkCalled )
+ {
+ max_unity_log_uninitialized_access_error("_MaxSetAppOpenAdExtraParameter");
+ return;
+ }
+
+ [getAdManager() setAppOpenAdExtraParameterForAdUnitIdentifier: NSSTRING(adUnitIdentifier)
+ key: NSSTRING(key)
+ value: NSSTRING(value)];
+ }
+
+ void _MaxSetAppOpenAdLocalExtraParameter(const char *adUnitIdentifier, const char *key, MAUnityRef value)
+ {
+ if ( !_initializeSdkCalled )
+ {
+ max_unity_log_uninitialized_access_error("_MaxSetAppOpenAdLocalExtraParameter");
+ return;
+ }
+
+ [getAdManager() setAppOpenAdLocalExtraParameterForAdUnitIdentifier: NSSTRING(adUnitIdentifier)
+ key: NSSTRING(key)
+ value: (__bridge id)value];
+ }
+
+ void _MaxSetAppOpenAdLocalExtraParameterJSON(const char *adUnitIdentifier, const char *key, const char *json)
+ {
+ if ( !_initializeSdkCalled )
+ {
+ max_unity_log_uninitialized_access_error("_MaxSetAppOpenAdLocalExtraParameter");
+ return;
+ }
+
+ id value = getLocalExtraParameterValue(json);
+ [getAdManager() setAppOpenAdLocalExtraParameterForAdUnitIdentifier: NSSTRING(adUnitIdentifier)
+ key: NSSTRING(key)
+ value: value];
+ }
+
+ bool _MaxIsAppOpenAdReady(const char *adUnitIdentifier)
+ {
+ if ( !_initializeSdkCalled )
+ {
+ max_unity_log_uninitialized_access_error("_MaxIsAppOpenAdReady");
+ return false;
+ }
+
+ return [getAdManager() isAppOpenAdReadyWithAdUnitIdentifier: NSSTRING(adUnitIdentifier)];
+ }
+
+ void _MaxShowAppOpenAd(const char *adUnitIdentifier, const char *placement, const char *customData)
+ {
+ if ( !_initializeSdkCalled )
+ {
+ max_unity_log_uninitialized_access_error("_MaxShowAppOpenAd");
+ return;
+ }
+
+ [getAdManager() showAppOpenAdWithAdUnitIdentifier: NSSTRING(adUnitIdentifier) placement: NSSTRING(placement) customData: NSSTRING(customData)];
+ }
+
+ void _MaxLoadRewardedAd(const char *adUnitIdentifier)
+ {
+ if ( !_initializeSdkCalled )
+ {
+ max_unity_log_uninitialized_access_error("_MaxLoadRewardedAd");
+ return;
+ }
+
+ [getAdManager() loadRewardedAdWithAdUnitIdentifier: NSSTRING(adUnitIdentifier)];
+ }
+
+ void _MaxSetRewardedAdExtraParameter(const char *adUnitIdentifier, const char *key, const char *value)
+ {
+ if ( !_initializeSdkCalled )
+ {
+ max_unity_log_uninitialized_access_error("_MaxSetRewardedAdExtraParameter");
+ return;
+ }
+
+ [getAdManager() setRewardedAdExtraParameterForAdUnitIdentifier: NSSTRING(adUnitIdentifier)
+ key: NSSTRING(key)
+ value: NSSTRING(value)];
+ }
+
+ void _MaxSetRewardedAdLocalExtraParameter(const char *adUnitIdentifier, const char *key, MAUnityRef value)
+ {
+ if ( !_initializeSdkCalled )
+ {
+ max_unity_log_uninitialized_access_error("_MaxSetRewardedAdLocalExtraParameter");
+ return;
+ }
+
+ [getAdManager() setRewardedAdLocalExtraParameterForAdUnitIdentifier: NSSTRING(adUnitIdentifier)
+ key: NSSTRING(key)
+ value: (__bridge id)value];
+ }
+
+ void _MaxSetRewardedAdLocalExtraParameterJSON(const char *adUnitIdentifier, const char *key, const char *json)
+ {
+ if ( !_initializeSdkCalled )
+ {
+ max_unity_log_uninitialized_access_error("_MaxSetRewardedAdLocalExtraParameter");
+ return;
+ }
+
+ id value = getLocalExtraParameterValue(json);
+ [getAdManager() setRewardedAdLocalExtraParameterForAdUnitIdentifier: NSSTRING(adUnitIdentifier)
+ key: NSSTRING(key)
+ value: value];
+ }
+
+ bool _MaxIsRewardedAdReady(const char *adUnitIdentifier)
+ {
+ if ( !_initializeSdkCalled )
+ {
+ max_unity_log_uninitialized_access_error("_MaxIsRewardedAdReady");
+ return false;
+ }
+
+ return [getAdManager() isRewardedAdReadyWithAdUnitIdentifier: NSSTRING(adUnitIdentifier)];
+ }
+
+ void _MaxShowRewardedAd(const char *adUnitIdentifier, const char *placement, const char *customData)
+ {
+ if ( !_initializeSdkCalled )
+ {
+ max_unity_log_uninitialized_access_error("_MaxShowRewardedAd");
+ return;
+ }
+
+ [getAdManager() showRewardedAdWithAdUnitIdentifier: NSSTRING(adUnitIdentifier) placement: NSSTRING(placement) customData: NSSTRING(customData)];
+ }
+
+ void _MaxTrackEvent(const char *event, const char *parameters)
+ {
+ if ( !_initializeSdkCalled )
+ {
+ max_unity_log_uninitialized_access_error("_MaxTrackEvent");
+ return;
+ }
+
+ [getAdManager() trackEvent: NSSTRING(event) parameters: NSSTRING(parameters)];
+ }
+
+ bool _MaxIsTablet()
+ {
+ return [UIDevice currentDevice].userInterfaceIdiom == UIUserInterfaceIdiomPad;
+ }
+
+ bool _MaxIsPhysicalDevice()
+ {
+ return !ALUtils.simulator;
+ }
+
+ int _MaxGetTcfVendorConsentStatus(int vendorIdentifier)
+ {
+ NSNumber *consentStatus = [ALPrivacySettings tcfVendorConsentStatusForIdentifier: vendorIdentifier];
+ return getConsentStatusValue(consentStatus);
+ }
+
+ int _MaxGetAdditionalConsentStatus(int atpIdentifier)
+ {
+ NSNumber *consentStatus = [ALPrivacySettings additionalConsentStatusForIdentifier: atpIdentifier];
+ return getConsentStatusValue(consentStatus);
+ }
+
+ int _MaxGetPurposeConsentStatus(int purposeIdentifier)
+ {
+ NSNumber *consentStatus = [ALPrivacySettings purposeConsentStatusForIdentifier: purposeIdentifier];
+ return getConsentStatusValue(consentStatus);
+ }
+
+ int _MaxGetSpecialFeatureOptInStatus(int specialFeatureIdentifier)
+ {
+ NSNumber *consentStatus = [ALPrivacySettings specialFeatureOptInStatusForIdentifier: specialFeatureIdentifier];
+ return getConsentStatusValue(consentStatus);
+ }
+
+ static const char * cStringCopy(NSString *string)
+ {
+ const char *value = string.UTF8String;
+ return value ? strdup(value) : NULL;
+ }
+
+ void _MaxSetMuted(bool muted)
+ {
+ getSdk().settings.muted = muted;
+ }
+
+ bool _MaxIsMuted()
+ {
+ return getSdk().settings.muted;
+ }
+
+ float _MaxScreenDensity()
+ {
+ return [UIScreen.mainScreen nativeScale];
+ }
+
+ const char * _MaxGetAdValue(const char *adUnitIdentifier, const char *key)
+ {
+ return cStringCopy([getAdManager() adValueForAdUnitIdentifier: NSSTRING(adUnitIdentifier) withKey: NSSTRING(key)]);
+ }
+
+ void _MaxSetVerboseLogging(bool enabled)
+ {
+ getSdk().settings.verboseLoggingEnabled = enabled;
+ }
+
+ bool _MaxIsVerboseLoggingEnabled()
+ {
+ return [getSdk().settings isVerboseLoggingEnabled];
+ }
+
+ void _MaxSetTestDeviceAdvertisingIdentifiers(char **advertisingIdentifiers, int size)
+ {
+ if ( _initializeSdkCalled )
+ {
+ max_unity_log_error(@"Test device advertising IDs must be set before MAX SDK is initialized");
+ return;
+ }
+
+ NSArray *advertisingIdentifiersArray = toStringArray(advertisingIdentifiers, size);
+ getInitConfigurationBuilder().testDeviceAdvertisingIdentifiers = advertisingIdentifiersArray;
+ }
+
+ void _MaxSetCreativeDebuggerEnabled(bool enabled)
+ {
+ getSdk().settings.creativeDebuggerEnabled = enabled;
+ }
+
+ void _MaxSetExceptionHandlerEnabled(bool enabled)
+ {
+ if ( _initializeSdkCalled )
+ {
+ max_unity_log_error(@"Exception handler must be enabled/disabled before MAX SDK is initialized");
+ return;
+ }
+
+ getInitConfigurationBuilder().exceptionHandlerEnabled = enabled;
+ }
+
+ void _MaxSetExtraParameter(const char *key, const char *value)
+ {
+ NSString *stringKey = NSSTRING(key);
+ if ( ![stringKey al_isValidString] )
+ {
+ NSString *message = [NSString stringWithFormat:@"Failed to set extra parameter for nil or empty key: %@", stringKey];
+ max_unity_log_error(message);
+ return;
+ }
+
+ NSString *stringValue = NSSTRING(value);
+ if ( [@"disable_all_logs" isEqualToString: stringKey] )
+ {
+ _disableAllLogs = [@"true" al_isEqualToStringIgnoringCase: stringValue];
+ }
+
+ ALSdkSettings *settings = getSdk().settings;
+ [settings setExtraParameterForKey: stringKey value: stringValue];
+ }
+
+ int * _MaxGetSafeAreaInsets()
+ {
+ UIEdgeInsets safeAreaInsets = UnityGetGLView().safeAreaInsets;
+ static int insets[4] = {(int) safeAreaInsets.left, (int) safeAreaInsets.top, (int) safeAreaInsets.right, (int) safeAreaInsets.bottom};
+ return insets;
+ }
+
+ void _MaxShowCmpForExistingUser()
+ {
+ if ( !_initializeSdkCalled )
+ {
+ max_unity_log_uninitialized_access_error("_MaxShowCmpForExistingUser");
+ return;
+ }
+
+ [getAdManager() showCMPForExistingUser];
+ }
+
+ bool _MaxHasSupportedCmp()
+ {
+ if ( !_initializeSdkCalled )
+ {
+ max_unity_log_uninitialized_access_error("_MaxHasSupportedCmp");
+ return false;
+ }
+
+ return [getSdk().cmpService hasSupportedCMP];
+ }
+
+ float _MaxGetAdaptiveBannerHeight(const float width)
+ {
+ return [MAUnityAdManager adaptiveBannerHeightForWidth: width];
+ }
+
+ void max_unity_log_uninitialized_access_error(const char *callingMethod)
+ {
+ NSString *message = [NSString stringWithFormat:@"Failed to execute: %s - please ensure the AppLovin MAX Unity Plugin has been initialized by calling 'MaxSdk.InitializeSdk();'!", callingMethod];
+ max_unity_log_error(message);
+ }
+
+ void max_unity_log_error(NSString *message)
+ {
+ if (_disableAllLogs) return;
+
+ NSString *logMessage = [NSString stringWithFormat: @"[%@] %@", TAG, message];
+ NSLog(@"%@", logMessage);
+ }
+}
+
+#pragma clang diagnostic pop
diff --git a/Assets/MaxSdk/AppLovin/Plugins/iOS/MAUnityPlugin.mm.meta b/Assets/MaxSdk/AppLovin/Plugins/iOS/MAUnityPlugin.mm.meta
new file mode 100644
index 0000000..5ea08ff
--- /dev/null
+++ b/Assets/MaxSdk/AppLovin/Plugins/iOS/MAUnityPlugin.mm.meta
@@ -0,0 +1,109 @@
+fileFormatVersion: 2
+guid: 7e373ed7168b243e6b706e991ab5a643
+labels:
+- al_max
+- al_max_export_path-MaxSdk/AppLovin/Plugins/iOS/MAUnityPlugin.mm
+PluginImporter:
+ externalObjects: {}
+ serializedVersion: 2
+ iconMap: {}
+ executionOrder: {}
+ defineConstraints: []
+ isPreloaded: 0
+ isOverridable: 0
+ isExplicitlyReferenced: 0
+ validateReferences: 1
+ platformData:
+ - first:
+ '': Any
+ second:
+ enabled: 0
+ settings:
+ Exclude Android: 1
+ Exclude Editor: 1
+ Exclude Linux: 1
+ Exclude Linux64: 1
+ Exclude LinuxUniversal: 1
+ Exclude OSXUniversal: 1
+ Exclude Win: 1
+ Exclude Win64: 1
+ Exclude iOS: 0
+ Exclude tvOS: 1
+ - first:
+ Android: Android
+ second:
+ enabled: 0
+ settings:
+ CPU: ARMv7
+ - first:
+ Any:
+ second:
+ enabled: 0
+ settings: {}
+ - first:
+ Editor: Editor
+ second:
+ enabled: 0
+ settings:
+ CPU: AnyCPU
+ DefaultValueInitialized: true
+ OS: AnyOS
+ - first:
+ Facebook: Win
+ second:
+ enabled: 0
+ settings:
+ CPU: AnyCPU
+ - first:
+ Facebook: Win64
+ second:
+ enabled: 0
+ settings:
+ CPU: AnyCPU
+ - first:
+ Standalone: Linux
+ second:
+ enabled: 0
+ settings:
+ CPU: x86
+ - first:
+ Standalone: Linux64
+ second:
+ enabled: 0
+ settings:
+ CPU: AnyCPU
+ - first:
+ Standalone: OSXUniversal
+ second:
+ enabled: 0
+ settings:
+ CPU: AnyCPU
+ - first:
+ Standalone: Win
+ second:
+ enabled: 0
+ settings:
+ CPU: AnyCPU
+ - first:
+ Standalone: Win64
+ second:
+ enabled: 0
+ settings:
+ CPU: AnyCPU
+ - first:
+ iPhone: iOS
+ second:
+ enabled: 1
+ settings:
+ CompileFlags:
+ FrameworkDependencies:
+ - first:
+ tvOS: tvOS
+ second:
+ enabled: 0
+ settings:
+ CompileFlags:
+ FrameworkDependencies:
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/MaxSdk/CHANGELOG.md b/Assets/MaxSdk/CHANGELOG.md
new file mode 100644
index 0000000..906f42b
--- /dev/null
+++ b/Assets/MaxSdk/CHANGELOG.md
@@ -0,0 +1,3 @@
+# AppLovin MAX Unity Plugin
+
+To get the latest changes, see the [AppLovin MAX Unity Changelog](https://support.axon.ai/en/max/unity/changelog).
diff --git a/Assets/MaxSdk/CHANGELOG.md.meta b/Assets/MaxSdk/CHANGELOG.md.meta
new file mode 100644
index 0000000..6d06bcb
--- /dev/null
+++ b/Assets/MaxSdk/CHANGELOG.md.meta
@@ -0,0 +1,10 @@
+fileFormatVersion: 2
+guid: dfb944c2e1cb479cabf023040a5942d2
+labels:
+- al_max
+- al_max_export_path-MaxSdk/CHANGELOG.md
+TextScriptImporter:
+ externalObjects: {}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/MaxSdk/Mediation.meta b/Assets/MaxSdk/Mediation.meta
new file mode 100644
index 0000000..103dd6f
--- /dev/null
+++ b/Assets/MaxSdk/Mediation.meta
@@ -0,0 +1,11 @@
+fileFormatVersion: 2
+guid: dcf2020c4018447c9b91170c0f62d799
+labels:
+- al_max
+- al_max_export_path-MaxSdk/Mediation
+folderAsset: yes
+DefaultImporter:
+ externalObjects: {}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/MaxSdk/Mediation/BidMachine.meta b/Assets/MaxSdk/Mediation/BidMachine.meta
new file mode 100644
index 0000000..03fa674
--- /dev/null
+++ b/Assets/MaxSdk/Mediation/BidMachine.meta
@@ -0,0 +1,8 @@
+fileFormatVersion: 2
+guid: f9593958d76e04a9fa0ca3653e293eea
+folderAsset: yes
+DefaultImporter:
+ externalObjects: {}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/MaxSdk/Mediation/BidMachine/Editor.meta b/Assets/MaxSdk/Mediation/BidMachine/Editor.meta
new file mode 100644
index 0000000..0f3541e
--- /dev/null
+++ b/Assets/MaxSdk/Mediation/BidMachine/Editor.meta
@@ -0,0 +1,11 @@
+fileFormatVersion: 2
+guid: 527c65004f8c84edbb4c14b8a2a04c5d
+labels:
+- al_max
+- al_max_export_path-MaxSdk/Mediation/BidMachine/Editor
+folderAsset: yes
+DefaultImporter:
+ externalObjects: {}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/MaxSdk/Mediation/BidMachine/Editor/Dependencies.xml b/Assets/MaxSdk/Mediation/BidMachine/Editor/Dependencies.xml
new file mode 100644
index 0000000..a8701e1
--- /dev/null
+++ b/Assets/MaxSdk/Mediation/BidMachine/Editor/Dependencies.xml
@@ -0,0 +1,13 @@
+
+
+
+
+
+ https://artifactory.bidmachine.io/bidmachine
+
+
+
+
+
+
+
diff --git a/Assets/MaxSdk/Mediation/BidMachine/Editor/Dependencies.xml.meta b/Assets/MaxSdk/Mediation/BidMachine/Editor/Dependencies.xml.meta
new file mode 100644
index 0000000..81f22af
--- /dev/null
+++ b/Assets/MaxSdk/Mediation/BidMachine/Editor/Dependencies.xml.meta
@@ -0,0 +1,10 @@
+fileFormatVersion: 2
+guid: 98a383532dccb495aa31190874842cbe
+labels:
+- al_max
+- al_max_export_path-MaxSdk/Mediation/BidMachine/Editor/Dependencies.xml
+TextScriptImporter:
+ externalObjects: {}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/MaxSdk/Mediation/BigoAds.meta b/Assets/MaxSdk/Mediation/BigoAds.meta
new file mode 100644
index 0000000..45d4b6d
--- /dev/null
+++ b/Assets/MaxSdk/Mediation/BigoAds.meta
@@ -0,0 +1,8 @@
+fileFormatVersion: 2
+guid: 057f3a425e2354240921c2e1b1da8f25
+folderAsset: yes
+DefaultImporter:
+ externalObjects: {}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/MaxSdk/Mediation/BigoAds/Editor.meta b/Assets/MaxSdk/Mediation/BigoAds/Editor.meta
new file mode 100644
index 0000000..39a3140
--- /dev/null
+++ b/Assets/MaxSdk/Mediation/BigoAds/Editor.meta
@@ -0,0 +1,11 @@
+fileFormatVersion: 2
+guid: 1235281c630214a8999b2185ceba6388
+labels:
+- al_max
+- al_max_export_path-MaxSdk/Mediation/BigoAds/Editor
+folderAsset: yes
+DefaultImporter:
+ externalObjects: {}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/MaxSdk/Mediation/BigoAds/Editor/Dependencies.xml b/Assets/MaxSdk/Mediation/BigoAds/Editor/Dependencies.xml
new file mode 100644
index 0000000..4d13f7e
--- /dev/null
+++ b/Assets/MaxSdk/Mediation/BigoAds/Editor/Dependencies.xml
@@ -0,0 +1,9 @@
+
+
+
+
+
+
+
+
+
diff --git a/Assets/MaxSdk/Mediation/BigoAds/Editor/Dependencies.xml.meta b/Assets/MaxSdk/Mediation/BigoAds/Editor/Dependencies.xml.meta
new file mode 100644
index 0000000..521ce00
--- /dev/null
+++ b/Assets/MaxSdk/Mediation/BigoAds/Editor/Dependencies.xml.meta
@@ -0,0 +1,10 @@
+fileFormatVersion: 2
+guid: fba397d5cac8648fea9b0fe82e201e63
+labels:
+- al_max
+- al_max_export_path-MaxSdk/Mediation/BigoAds/Editor/Dependencies.xml
+TextScriptImporter:
+ externalObjects: {}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/MaxSdk/Mediation/ByteDance.meta b/Assets/MaxSdk/Mediation/ByteDance.meta
new file mode 100644
index 0000000..8bcbd93
--- /dev/null
+++ b/Assets/MaxSdk/Mediation/ByteDance.meta
@@ -0,0 +1,8 @@
+fileFormatVersion: 2
+guid: 939bfc929854b45f78fb8e3caec1f2f8
+folderAsset: yes
+DefaultImporter:
+ externalObjects: {}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/MaxSdk/Mediation/ByteDance/Editor.meta b/Assets/MaxSdk/Mediation/ByteDance/Editor.meta
new file mode 100644
index 0000000..e54a766
--- /dev/null
+++ b/Assets/MaxSdk/Mediation/ByteDance/Editor.meta
@@ -0,0 +1,11 @@
+fileFormatVersion: 2
+guid: ef8467ffb0e4447b79a8804884a7520a
+labels:
+- al_max
+- al_max_export_path-MaxSdk/Mediation/ByteDance/Editor
+folderAsset: yes
+DefaultImporter:
+ externalObjects: {}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/MaxSdk/Mediation/ByteDance/Editor/Dependencies.xml b/Assets/MaxSdk/Mediation/ByteDance/Editor/Dependencies.xml
new file mode 100644
index 0000000..c494d2e
--- /dev/null
+++ b/Assets/MaxSdk/Mediation/ByteDance/Editor/Dependencies.xml
@@ -0,0 +1,13 @@
+
+
+
+
+
+ https://artifact.bytedance.com/repository/pangle
+
+
+
+
+
+
+
diff --git a/Assets/MaxSdk/Mediation/ByteDance/Editor/Dependencies.xml.meta b/Assets/MaxSdk/Mediation/ByteDance/Editor/Dependencies.xml.meta
new file mode 100644
index 0000000..5205233
--- /dev/null
+++ b/Assets/MaxSdk/Mediation/ByteDance/Editor/Dependencies.xml.meta
@@ -0,0 +1,10 @@
+fileFormatVersion: 2
+guid: 0828555cb1ce94702a4af6f3dce3d735
+labels:
+- al_max
+- al_max_export_path-MaxSdk/Mediation/ByteDance/Editor/Dependencies.xml
+TextScriptImporter:
+ externalObjects: {}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/MaxSdk/Mediation/Chartboost.meta b/Assets/MaxSdk/Mediation/Chartboost.meta
new file mode 100644
index 0000000..31cafe3
--- /dev/null
+++ b/Assets/MaxSdk/Mediation/Chartboost.meta
@@ -0,0 +1,8 @@
+fileFormatVersion: 2
+guid: 7f473c184d2564d5da3060bde69424aa
+folderAsset: yes
+DefaultImporter:
+ externalObjects: {}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/MaxSdk/Mediation/Chartboost/Editor.meta b/Assets/MaxSdk/Mediation/Chartboost/Editor.meta
new file mode 100644
index 0000000..38bff8d
--- /dev/null
+++ b/Assets/MaxSdk/Mediation/Chartboost/Editor.meta
@@ -0,0 +1,11 @@
+fileFormatVersion: 2
+guid: a90f13141c35746f5a2996c8ad068fe9
+labels:
+- al_max
+- al_max_export_path-MaxSdk/Mediation/Chartboost/Editor
+folderAsset: yes
+DefaultImporter:
+ externalObjects: {}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/MaxSdk/Mediation/Chartboost/Editor/Dependencies.xml b/Assets/MaxSdk/Mediation/Chartboost/Editor/Dependencies.xml
new file mode 100644
index 0000000..d3c7e14
--- /dev/null
+++ b/Assets/MaxSdk/Mediation/Chartboost/Editor/Dependencies.xml
@@ -0,0 +1,14 @@
+
+
+
+
+
+ https://cboost.jfrog.io/artifactory/chartboost-ads/
+
+
+
+
+
+
+
+
diff --git a/Assets/MaxSdk/Mediation/Chartboost/Editor/Dependencies.xml.meta b/Assets/MaxSdk/Mediation/Chartboost/Editor/Dependencies.xml.meta
new file mode 100644
index 0000000..02628eb
--- /dev/null
+++ b/Assets/MaxSdk/Mediation/Chartboost/Editor/Dependencies.xml.meta
@@ -0,0 +1,10 @@
+fileFormatVersion: 2
+guid: 93b0a4618bd884871af0981a7867bb2f
+labels:
+- al_max
+- al_max_export_path-MaxSdk/Mediation/Chartboost/Editor/Dependencies.xml
+TextScriptImporter:
+ externalObjects: {}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/MaxSdk/Mediation/Facebook.meta b/Assets/MaxSdk/Mediation/Facebook.meta
new file mode 100644
index 0000000..a2008af
--- /dev/null
+++ b/Assets/MaxSdk/Mediation/Facebook.meta
@@ -0,0 +1,8 @@
+fileFormatVersion: 2
+guid: b30ea37ccd95b42d8a51d03ab3c644fb
+folderAsset: yes
+DefaultImporter:
+ externalObjects: {}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/MaxSdk/Mediation/Facebook/Editor.meta b/Assets/MaxSdk/Mediation/Facebook/Editor.meta
new file mode 100644
index 0000000..4beff5e
--- /dev/null
+++ b/Assets/MaxSdk/Mediation/Facebook/Editor.meta
@@ -0,0 +1,11 @@
+fileFormatVersion: 2
+guid: 28880992a399a48b7abe95b66649d711
+labels:
+- al_max
+- al_max_export_path-MaxSdk/Mediation/Facebook/Editor
+folderAsset: yes
+DefaultImporter:
+ externalObjects: {}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/MaxSdk/Mediation/Facebook/Editor/Dependencies.xml b/Assets/MaxSdk/Mediation/Facebook/Editor/Dependencies.xml
new file mode 100644
index 0000000..4809d4d
--- /dev/null
+++ b/Assets/MaxSdk/Mediation/Facebook/Editor/Dependencies.xml
@@ -0,0 +1,13 @@
+
+
+
+
+
+
+
+
+
+
diff --git a/Assets/MaxSdk/Mediation/Facebook/Editor/Dependencies.xml.meta b/Assets/MaxSdk/Mediation/Facebook/Editor/Dependencies.xml.meta
new file mode 100644
index 0000000..69b5d2c
--- /dev/null
+++ b/Assets/MaxSdk/Mediation/Facebook/Editor/Dependencies.xml.meta
@@ -0,0 +1,10 @@
+fileFormatVersion: 2
+guid: aea9bdf974328420db5ae118ef0d2b87
+labels:
+- al_max
+- al_max_export_path-MaxSdk/Mediation/Facebook/Editor/Dependencies.xml
+TextScriptImporter:
+ externalObjects: {}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/MaxSdk/Mediation/Fyber.meta b/Assets/MaxSdk/Mediation/Fyber.meta
new file mode 100644
index 0000000..7924127
--- /dev/null
+++ b/Assets/MaxSdk/Mediation/Fyber.meta
@@ -0,0 +1,8 @@
+fileFormatVersion: 2
+guid: b202e2f4f19d249c79cdd63e5abe4a87
+folderAsset: yes
+DefaultImporter:
+ externalObjects: {}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/MaxSdk/Mediation/Fyber/Editor.meta b/Assets/MaxSdk/Mediation/Fyber/Editor.meta
new file mode 100644
index 0000000..315e8c8
--- /dev/null
+++ b/Assets/MaxSdk/Mediation/Fyber/Editor.meta
@@ -0,0 +1,11 @@
+fileFormatVersion: 2
+guid: e076e4ef7e2874ba69b108cc7a346c2a
+labels:
+- al_max
+- al_max_export_path-MaxSdk/Mediation/Fyber/Editor
+folderAsset: yes
+DefaultImporter:
+ externalObjects: {}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/MaxSdk/Mediation/Fyber/Editor/Dependencies.xml b/Assets/MaxSdk/Mediation/Fyber/Editor/Dependencies.xml
new file mode 100644
index 0000000..47bcf37
--- /dev/null
+++ b/Assets/MaxSdk/Mediation/Fyber/Editor/Dependencies.xml
@@ -0,0 +1,9 @@
+
+
+
+
+
+
+
+
+
diff --git a/Assets/MaxSdk/Mediation/Fyber/Editor/Dependencies.xml.meta b/Assets/MaxSdk/Mediation/Fyber/Editor/Dependencies.xml.meta
new file mode 100644
index 0000000..fd0bbbf
--- /dev/null
+++ b/Assets/MaxSdk/Mediation/Fyber/Editor/Dependencies.xml.meta
@@ -0,0 +1,10 @@
+fileFormatVersion: 2
+guid: 5e123cdc08e804dffb2c40c4fbc83caf
+labels:
+- al_max
+- al_max_export_path-MaxSdk/Mediation/Fyber/Editor/Dependencies.xml
+TextScriptImporter:
+ externalObjects: {}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/MaxSdk/Mediation/Google.meta b/Assets/MaxSdk/Mediation/Google.meta
new file mode 100644
index 0000000..469c65c
--- /dev/null
+++ b/Assets/MaxSdk/Mediation/Google.meta
@@ -0,0 +1,8 @@
+fileFormatVersion: 2
+guid: 64176641aa4214f18881c7888b2f4187
+folderAsset: yes
+DefaultImporter:
+ externalObjects: {}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/MaxSdk/Mediation/Google/Editor.meta b/Assets/MaxSdk/Mediation/Google/Editor.meta
new file mode 100644
index 0000000..ea8dd55
--- /dev/null
+++ b/Assets/MaxSdk/Mediation/Google/Editor.meta
@@ -0,0 +1,11 @@
+fileFormatVersion: 2
+guid: e8015bd045cea462c8f39c8a05867d08
+labels:
+- al_max
+- al_max_export_path-MaxSdk/Mediation/Google/Editor
+folderAsset: yes
+DefaultImporter:
+ externalObjects: {}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/MaxSdk/Mediation/Google/Editor/Dependencies.xml b/Assets/MaxSdk/Mediation/Google/Editor/Dependencies.xml
new file mode 100644
index 0000000..1cb4296
--- /dev/null
+++ b/Assets/MaxSdk/Mediation/Google/Editor/Dependencies.xml
@@ -0,0 +1,10 @@
+
+
+
+
+
+
+
+
+
+
diff --git a/Assets/MaxSdk/Mediation/Google/Editor/Dependencies.xml.meta b/Assets/MaxSdk/Mediation/Google/Editor/Dependencies.xml.meta
new file mode 100644
index 0000000..36bef72
--- /dev/null
+++ b/Assets/MaxSdk/Mediation/Google/Editor/Dependencies.xml.meta
@@ -0,0 +1,10 @@
+fileFormatVersion: 2
+guid: 053b810d3594744e38b6fd0fa378fb57
+labels:
+- al_max
+- al_max_export_path-MaxSdk/Mediation/Google/Editor/Dependencies.xml
+TextScriptImporter:
+ externalObjects: {}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/MaxSdk/Mediation/GoogleAdManager.meta b/Assets/MaxSdk/Mediation/GoogleAdManager.meta
new file mode 100644
index 0000000..adc1779
--- /dev/null
+++ b/Assets/MaxSdk/Mediation/GoogleAdManager.meta
@@ -0,0 +1,8 @@
+fileFormatVersion: 2
+guid: f75dec80f49c44ee68edd909bd32747a
+folderAsset: yes
+DefaultImporter:
+ externalObjects: {}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/MaxSdk/Mediation/GoogleAdManager/Editor.meta b/Assets/MaxSdk/Mediation/GoogleAdManager/Editor.meta
new file mode 100644
index 0000000..7b0912c
--- /dev/null
+++ b/Assets/MaxSdk/Mediation/GoogleAdManager/Editor.meta
@@ -0,0 +1,11 @@
+fileFormatVersion: 2
+guid: 3e1635bfb5b164c389d38eb1e5e6e909
+labels:
+- al_max
+- al_max_export_path-MaxSdk/Mediation/GoogleAdManager/Editor
+folderAsset: yes
+DefaultImporter:
+ externalObjects: {}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/MaxSdk/Mediation/GoogleAdManager/Editor/Dependencies.xml b/Assets/MaxSdk/Mediation/GoogleAdManager/Editor/Dependencies.xml
new file mode 100644
index 0000000..7f4a8fd
--- /dev/null
+++ b/Assets/MaxSdk/Mediation/GoogleAdManager/Editor/Dependencies.xml
@@ -0,0 +1,10 @@
+
+
+
+
+
+
+
+
+
+
diff --git a/Assets/MaxSdk/Mediation/GoogleAdManager/Editor/Dependencies.xml.meta b/Assets/MaxSdk/Mediation/GoogleAdManager/Editor/Dependencies.xml.meta
new file mode 100644
index 0000000..71b0087
--- /dev/null
+++ b/Assets/MaxSdk/Mediation/GoogleAdManager/Editor/Dependencies.xml.meta
@@ -0,0 +1,10 @@
+fileFormatVersion: 2
+guid: aebbf5e9af66e431fa6078021b2f762f
+labels:
+- al_max
+- al_max_export_path-MaxSdk/Mediation/GoogleAdManager/Editor/Dependencies.xml
+TextScriptImporter:
+ externalObjects: {}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/MaxSdk/Mediation/InMobi.meta b/Assets/MaxSdk/Mediation/InMobi.meta
new file mode 100644
index 0000000..7e215af
--- /dev/null
+++ b/Assets/MaxSdk/Mediation/InMobi.meta
@@ -0,0 +1,8 @@
+fileFormatVersion: 2
+guid: cc847e95315674385ba9f42c13733872
+folderAsset: yes
+DefaultImporter:
+ externalObjects: {}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/MaxSdk/Mediation/InMobi/Editor.meta b/Assets/MaxSdk/Mediation/InMobi/Editor.meta
new file mode 100644
index 0000000..a998cfd
--- /dev/null
+++ b/Assets/MaxSdk/Mediation/InMobi/Editor.meta
@@ -0,0 +1,11 @@
+fileFormatVersion: 2
+guid: a141703acd55a48c2a3e6e6599f90c64
+labels:
+- al_max
+- al_max_export_path-MaxSdk/Mediation/InMobi/Editor
+folderAsset: yes
+DefaultImporter:
+ externalObjects: {}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/MaxSdk/Mediation/InMobi/Editor/Dependencies.xml b/Assets/MaxSdk/Mediation/InMobi/Editor/Dependencies.xml
new file mode 100644
index 0000000..c684f3a
--- /dev/null
+++ b/Assets/MaxSdk/Mediation/InMobi/Editor/Dependencies.xml
@@ -0,0 +1,12 @@
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/Assets/MaxSdk/Mediation/InMobi/Editor/Dependencies.xml.meta b/Assets/MaxSdk/Mediation/InMobi/Editor/Dependencies.xml.meta
new file mode 100644
index 0000000..1b62e82
--- /dev/null
+++ b/Assets/MaxSdk/Mediation/InMobi/Editor/Dependencies.xml.meta
@@ -0,0 +1,10 @@
+fileFormatVersion: 2
+guid: bc66a0ef4503843ee9b1bf1b1e867367
+labels:
+- al_max
+- al_max_export_path-MaxSdk/Mediation/InMobi/Editor/Dependencies.xml
+TextScriptImporter:
+ externalObjects: {}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/MaxSdk/Mediation/IronSource.meta b/Assets/MaxSdk/Mediation/IronSource.meta
new file mode 100644
index 0000000..b11e159
--- /dev/null
+++ b/Assets/MaxSdk/Mediation/IronSource.meta
@@ -0,0 +1,8 @@
+fileFormatVersion: 2
+guid: 846f4d3ebb42d4857b6be1db0d010c0d
+folderAsset: yes
+DefaultImporter:
+ externalObjects: {}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/MaxSdk/Mediation/IronSource/Editor.meta b/Assets/MaxSdk/Mediation/IronSource/Editor.meta
new file mode 100644
index 0000000..327f5d6
--- /dev/null
+++ b/Assets/MaxSdk/Mediation/IronSource/Editor.meta
@@ -0,0 +1,11 @@
+fileFormatVersion: 2
+guid: 531d860cac61f47d19e32f526470ae43
+labels:
+- al_max
+- al_max_export_path-MaxSdk/Mediation/IronSource/Editor
+folderAsset: yes
+DefaultImporter:
+ externalObjects: {}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/MaxSdk/Mediation/IronSource/Editor/Dependencies.xml b/Assets/MaxSdk/Mediation/IronSource/Editor/Dependencies.xml
new file mode 100644
index 0000000..dd2b6cf
--- /dev/null
+++ b/Assets/MaxSdk/Mediation/IronSource/Editor/Dependencies.xml
@@ -0,0 +1,10 @@
+
+
+
+
+
+
+
+
+
+
diff --git a/Assets/MaxSdk/Mediation/IronSource/Editor/Dependencies.xml.meta b/Assets/MaxSdk/Mediation/IronSource/Editor/Dependencies.xml.meta
new file mode 100644
index 0000000..f77e6f0
--- /dev/null
+++ b/Assets/MaxSdk/Mediation/IronSource/Editor/Dependencies.xml.meta
@@ -0,0 +1,10 @@
+fileFormatVersion: 2
+guid: 19262406303f04f05b14b31b3c734d35
+labels:
+- al_max
+- al_max_export_path-MaxSdk/Mediation/IronSource/Editor/Dependencies.xml
+TextScriptImporter:
+ externalObjects: {}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/MaxSdk/Mediation/MediationAdapters.txt b/Assets/MaxSdk/Mediation/MediationAdapters.txt
new file mode 100644
index 0000000..40f94d0
--- /dev/null
+++ b/Assets/MaxSdk/Mediation/MediationAdapters.txt
@@ -0,0 +1,2 @@
+A placeholder file to make sure that the Mediation folder asset is exported with the base plugin.
+This ensures that the adapters are imported into this directory even when the plugin has been moved to a different folder.
diff --git a/Assets/MaxSdk/Mediation/MediationAdapters.txt.meta b/Assets/MaxSdk/Mediation/MediationAdapters.txt.meta
new file mode 100644
index 0000000..41fb994
--- /dev/null
+++ b/Assets/MaxSdk/Mediation/MediationAdapters.txt.meta
@@ -0,0 +1,6 @@
+fileFormatVersion: 2
+guid: 9a8f83e97729443c86120be3bb24190d
+labels:
+- al_max
+- al_max_export_path-MaxSdk/Mediation/MediationAdapters.txt
+timeCreated: 1609308536
diff --git a/Assets/MaxSdk/Mediation/Mintegral.meta b/Assets/MaxSdk/Mediation/Mintegral.meta
new file mode 100644
index 0000000..9e8f58a
--- /dev/null
+++ b/Assets/MaxSdk/Mediation/Mintegral.meta
@@ -0,0 +1,8 @@
+fileFormatVersion: 2
+guid: daa6d88ad14e64ab69057674530502e0
+folderAsset: yes
+DefaultImporter:
+ externalObjects: {}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/MaxSdk/Mediation/Mintegral/Editor.meta b/Assets/MaxSdk/Mediation/Mintegral/Editor.meta
new file mode 100644
index 0000000..d189ce0
--- /dev/null
+++ b/Assets/MaxSdk/Mediation/Mintegral/Editor.meta
@@ -0,0 +1,11 @@
+fileFormatVersion: 2
+guid: db1de4066dc4e4290b3879b34fa87de2
+labels:
+- al_max
+- al_max_export_path-MaxSdk/Mediation/Mintegral/Editor
+folderAsset: yes
+DefaultImporter:
+ externalObjects: {}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/MaxSdk/Mediation/Mintegral/Editor/Dependencies.xml b/Assets/MaxSdk/Mediation/Mintegral/Editor/Dependencies.xml
new file mode 100644
index 0000000..13442d0
--- /dev/null
+++ b/Assets/MaxSdk/Mediation/Mintegral/Editor/Dependencies.xml
@@ -0,0 +1,14 @@
+
+
+
+
+
+ https://dl-maven-android.mintegral.com/repository/mbridge_android_sdk_oversea
+
+
+
+
+
+
+
+
diff --git a/Assets/MaxSdk/Mediation/Mintegral/Editor/Dependencies.xml.meta b/Assets/MaxSdk/Mediation/Mintegral/Editor/Dependencies.xml.meta
new file mode 100644
index 0000000..415c4ab
--- /dev/null
+++ b/Assets/MaxSdk/Mediation/Mintegral/Editor/Dependencies.xml.meta
@@ -0,0 +1,10 @@
+fileFormatVersion: 2
+guid: 221b2a20a58a04f2cb4afb0779587206
+labels:
+- al_max
+- al_max_export_path-MaxSdk/Mediation/Mintegral/Editor/Dependencies.xml
+TextScriptImporter:
+ externalObjects: {}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/MaxSdk/Mediation/Moloco.meta b/Assets/MaxSdk/Mediation/Moloco.meta
new file mode 100644
index 0000000..9e0dd0f
--- /dev/null
+++ b/Assets/MaxSdk/Mediation/Moloco.meta
@@ -0,0 +1,8 @@
+fileFormatVersion: 2
+guid: 4a938c3e9196244689e2919e3bcd0c10
+folderAsset: yes
+DefaultImporter:
+ externalObjects: {}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/MaxSdk/Mediation/Moloco/Editor.meta b/Assets/MaxSdk/Mediation/Moloco/Editor.meta
new file mode 100644
index 0000000..952b969
--- /dev/null
+++ b/Assets/MaxSdk/Mediation/Moloco/Editor.meta
@@ -0,0 +1,11 @@
+fileFormatVersion: 2
+guid: 9ecadc3649c184389b90252aa2a2b448
+labels:
+- al_max
+- al_max_export_path-MaxSdk/Mediation/Moloco/Editor
+folderAsset: yes
+DefaultImporter:
+ externalObjects: {}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/MaxSdk/Mediation/Moloco/Editor/Dependencies.xml b/Assets/MaxSdk/Mediation/Moloco/Editor/Dependencies.xml
new file mode 100644
index 0000000..9472d84
--- /dev/null
+++ b/Assets/MaxSdk/Mediation/Moloco/Editor/Dependencies.xml
@@ -0,0 +1,9 @@
+
+
+
+
+
+
+
+
+
diff --git a/Assets/MaxSdk/Mediation/Moloco/Editor/Dependencies.xml.meta b/Assets/MaxSdk/Mediation/Moloco/Editor/Dependencies.xml.meta
new file mode 100644
index 0000000..e066a5f
--- /dev/null
+++ b/Assets/MaxSdk/Mediation/Moloco/Editor/Dependencies.xml.meta
@@ -0,0 +1,10 @@
+fileFormatVersion: 2
+guid: 0f5b2cb1209274ba18b234b42d2efe96
+labels:
+- al_max
+- al_max_export_path-MaxSdk/Mediation/Moloco/Editor/Dependencies.xml
+TextScriptImporter:
+ externalObjects: {}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/MaxSdk/Mediation/UnityAds.meta b/Assets/MaxSdk/Mediation/UnityAds.meta
new file mode 100644
index 0000000..fa1a5be
--- /dev/null
+++ b/Assets/MaxSdk/Mediation/UnityAds.meta
@@ -0,0 +1,8 @@
+fileFormatVersion: 2
+guid: 9be6fe1c0eabe4048b9bf1323934671b
+folderAsset: yes
+DefaultImporter:
+ externalObjects: {}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/MaxSdk/Mediation/UnityAds/Editor.meta b/Assets/MaxSdk/Mediation/UnityAds/Editor.meta
new file mode 100644
index 0000000..b66e846
--- /dev/null
+++ b/Assets/MaxSdk/Mediation/UnityAds/Editor.meta
@@ -0,0 +1,11 @@
+fileFormatVersion: 2
+guid: 30751f2dc322a40e588edfb7c978c9c0
+labels:
+- al_max
+- al_max_export_path-MaxSdk/Mediation/UnityAds/Editor
+folderAsset: yes
+DefaultImporter:
+ externalObjects: {}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/MaxSdk/Mediation/UnityAds/Editor/Dependencies.xml b/Assets/MaxSdk/Mediation/UnityAds/Editor/Dependencies.xml
new file mode 100644
index 0000000..c030dbc
--- /dev/null
+++ b/Assets/MaxSdk/Mediation/UnityAds/Editor/Dependencies.xml
@@ -0,0 +1,9 @@
+
+
+
+
+
+
+
+
+
diff --git a/Assets/MaxSdk/Mediation/UnityAds/Editor/Dependencies.xml.meta b/Assets/MaxSdk/Mediation/UnityAds/Editor/Dependencies.xml.meta
new file mode 100644
index 0000000..937df6e
--- /dev/null
+++ b/Assets/MaxSdk/Mediation/UnityAds/Editor/Dependencies.xml.meta
@@ -0,0 +1,10 @@
+fileFormatVersion: 2
+guid: 9950f1cb0da1e43efbeca604db142076
+labels:
+- al_max
+- al_max_export_path-MaxSdk/Mediation/UnityAds/Editor/Dependencies.xml
+TextScriptImporter:
+ externalObjects: {}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/MaxSdk/Mediation/Vungle.meta b/Assets/MaxSdk/Mediation/Vungle.meta
new file mode 100644
index 0000000..60f9da5
--- /dev/null
+++ b/Assets/MaxSdk/Mediation/Vungle.meta
@@ -0,0 +1,8 @@
+fileFormatVersion: 2
+guid: a0abaf97c8c4846fb86e98da7dc31004
+folderAsset: yes
+DefaultImporter:
+ externalObjects: {}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/MaxSdk/Mediation/Vungle/Editor.meta b/Assets/MaxSdk/Mediation/Vungle/Editor.meta
new file mode 100644
index 0000000..1ea75cc
--- /dev/null
+++ b/Assets/MaxSdk/Mediation/Vungle/Editor.meta
@@ -0,0 +1,11 @@
+fileFormatVersion: 2
+guid: 77b6ea05736a9458f8ef8762ee9b64bb
+labels:
+- al_max
+- al_max_export_path-MaxSdk/Mediation/Vungle/Editor
+folderAsset: yes
+DefaultImporter:
+ externalObjects: {}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/MaxSdk/Mediation/Vungle/Editor/Dependencies.xml b/Assets/MaxSdk/Mediation/Vungle/Editor/Dependencies.xml
new file mode 100644
index 0000000..c0e332c
--- /dev/null
+++ b/Assets/MaxSdk/Mediation/Vungle/Editor/Dependencies.xml
@@ -0,0 +1,9 @@
+
+
+
+
+
+
+
+
+
diff --git a/Assets/MaxSdk/Mediation/Vungle/Editor/Dependencies.xml.meta b/Assets/MaxSdk/Mediation/Vungle/Editor/Dependencies.xml.meta
new file mode 100644
index 0000000..7038186
--- /dev/null
+++ b/Assets/MaxSdk/Mediation/Vungle/Editor/Dependencies.xml.meta
@@ -0,0 +1,10 @@
+fileFormatVersion: 2
+guid: 0d8ad3a6ddc4f44fab2efe607fe14f26
+labels:
+- al_max
+- al_max_export_path-MaxSdk/Mediation/Vungle/Editor/Dependencies.xml
+TextScriptImporter:
+ externalObjects: {}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/MaxSdk/Prefabs.meta b/Assets/MaxSdk/Prefabs.meta
new file mode 100644
index 0000000..45829b7
--- /dev/null
+++ b/Assets/MaxSdk/Prefabs.meta
@@ -0,0 +1,8 @@
+fileFormatVersion: 2
+guid: b1ef42d076f894359b53ec57a427a224
+folderAsset: yes
+DefaultImporter:
+ externalObjects: {}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/MaxSdk/Prefabs/BannerBottom.prefab b/Assets/MaxSdk/Prefabs/BannerBottom.prefab
new file mode 100644
index 0000000..bba7ac6
--- /dev/null
+++ b/Assets/MaxSdk/Prefabs/BannerBottom.prefab
@@ -0,0 +1,402 @@
+%YAML 1.1
+%TAG !u! tag:unity3d.com,2011:
+--- !u!1 &3149432657757030138
+GameObject:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ serializedVersion: 6
+ m_Component:
+ - component: {fileID: 5965516886513985157}
+ - component: {fileID: 3167928293195730454}
+ - component: {fileID: 6048907697713132302}
+ m_Layer: 5
+ m_Name: Panel
+ m_TagString: Untagged
+ m_Icon: {fileID: 0}
+ m_NavMeshLayer: 0
+ m_StaticEditorFlags: 0
+ m_IsActive: 1
+--- !u!224 &5965516886513985157
+RectTransform:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 3149432657757030138}
+ m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
+ m_LocalPosition: {x: 0, y: 0, z: 0}
+ m_LocalScale: {x: 1, y: 1, z: 1}
+ m_Children:
+ - {fileID: 4118862295226300947}
+ m_Father: {fileID: 3413013686078446151}
+ m_RootOrder: 0
+ m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
+ m_AnchorMin: {x: 0, y: 0}
+ m_AnchorMax: {x: 1, y: 0}
+ m_AnchoredPosition: {x: 0, y: 84}
+ m_SizeDelta: {x: 0, y: 168}
+ m_Pivot: {x: 0.5, y: 0.5}
+--- !u!222 &3167928293195730454
+CanvasRenderer:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 3149432657757030138}
+ m_CullTransparentMesh: 0
+--- !u!114 &6048907697713132302
+MonoBehaviour:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 3149432657757030138}
+ m_Enabled: 1
+ m_EditorHideFlags: 0
+ m_Script: {fileID: -765806418, guid: f70555f144d8491a825f0804e09c671c, type: 3}
+ m_Name:
+ m_EditorClassIdentifier:
+ m_Material: {fileID: 0}
+ m_Color: {r: 0, g: 0, b: 0, a: 1}
+ m_RaycastTarget: 1
+ m_OnCullStateChanged:
+ m_PersistentCalls:
+ m_Calls: []
+ m_Sprite: {fileID: 0}
+ m_Type: 1
+ m_PreserveAspect: 0
+ m_FillCenter: 1
+ m_FillMethod: 4
+ m_FillAmount: 1
+ m_FillClockwise: 1
+ m_FillOrigin: 0
+ m_UseSpriteMesh: 0
+--- !u!1 &3829518492429360636
+GameObject:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ serializedVersion: 6
+ m_Component:
+ - component: {fileID: 4118862295226300947}
+ - component: {fileID: 5582763645243389146}
+ - component: {fileID: 1436650035481827287}
+ m_Layer: 5
+ m_Name: Panel
+ m_TagString: Untagged
+ m_Icon: {fileID: 0}
+ m_NavMeshLayer: 0
+ m_StaticEditorFlags: 0
+ m_IsActive: 1
+--- !u!224 &4118862295226300947
+RectTransform:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 3829518492429360636}
+ m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
+ m_LocalPosition: {x: 0, y: 0, z: 0}
+ m_LocalScale: {x: 1, y: 1, z: 1}
+ m_Children:
+ - {fileID: 5084927109723455527}
+ - {fileID: 8189983859356672495}
+ m_Father: {fileID: 5965516886513985157}
+ m_RootOrder: 0
+ m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
+ m_AnchorMin: {x: 0.5, y: 1}
+ m_AnchorMax: {x: 0.5, y: 1}
+ m_AnchoredPosition: {x: 0, y: -50}
+ m_SizeDelta: {x: 640, y: 100}
+ m_Pivot: {x: 0.5, y: 0.5}
+--- !u!222 &5582763645243389146
+CanvasRenderer:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 3829518492429360636}
+ m_CullTransparentMesh: 0
+--- !u!114 &1436650035481827287
+MonoBehaviour:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 3829518492429360636}
+ m_Enabled: 1
+ m_EditorHideFlags: 0
+ m_Script: {fileID: -765806418, guid: f70555f144d8491a825f0804e09c671c, type: 3}
+ m_Name:
+ m_EditorClassIdentifier:
+ m_Material: {fileID: 0}
+ m_Color: {r: 1, g: 1, b: 1, a: 1}
+ m_RaycastTarget: 1
+ m_OnCullStateChanged:
+ m_PersistentCalls:
+ m_Calls: []
+ m_Sprite: {fileID: 0}
+ m_Type: 1
+ m_PreserveAspect: 0
+ m_FillCenter: 1
+ m_FillMethod: 4
+ m_FillAmount: 1
+ m_FillClockwise: 1
+ m_FillOrigin: 0
+ m_UseSpriteMesh: 0
+--- !u!1 &4772536868390647122
+GameObject:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ serializedVersion: 6
+ m_Component:
+ - component: {fileID: 8189983859356672495}
+ - component: {fileID: 7216515036998124610}
+ - component: {fileID: 3801875349924125266}
+ m_Layer: 5
+ m_Name: InfoText
+ m_TagString: Untagged
+ m_Icon: {fileID: 0}
+ m_NavMeshLayer: 0
+ m_StaticEditorFlags: 0
+ m_IsActive: 1
+--- !u!224 &8189983859356672495
+RectTransform:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 4772536868390647122}
+ m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
+ m_LocalPosition: {x: 0, y: 0, z: 0}
+ m_LocalScale: {x: 1, y: 1, z: 1}
+ m_Children: []
+ m_Father: {fileID: 4118862295226300947}
+ m_RootOrder: 1
+ m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
+ m_AnchorMin: {x: 0, y: 0}
+ m_AnchorMax: {x: 1, y: 1}
+ m_AnchoredPosition: {x: 0, y: 3}
+ m_SizeDelta: {x: 0, y: -6}
+ m_Pivot: {x: 0.5, y: 0.5}
+--- !u!222 &7216515036998124610
+CanvasRenderer:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 4772536868390647122}
+ m_CullTransparentMesh: 0
+--- !u!114 &3801875349924125266
+MonoBehaviour:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 4772536868390647122}
+ m_Enabled: 1
+ m_EditorHideFlags: 0
+ m_Script: {fileID: 708705254, guid: f70555f144d8491a825f0804e09c671c, type: 3}
+ m_Name:
+ m_EditorClassIdentifier:
+ m_Material: {fileID: 0}
+ m_Color: {r: 0.29411766, g: 0.29411766, b: 0.29411766, a: 1}
+ m_RaycastTarget: 1
+ m_OnCullStateChanged:
+ m_PersistentCalls:
+ m_Calls: []
+ m_FontData:
+ m_Font: {fileID: 10102, guid: 0000000000000000e000000000000000, type: 0}
+ m_FontSize: 18
+ m_FontStyle: 0
+ m_BestFit: 0
+ m_MinSize: 1
+ m_MaxSize: 40
+ m_Alignment: 7
+ m_AlignByGeometry: 0
+ m_RichText: 1
+ m_HorizontalOverflow: 0
+ m_VerticalOverflow: 0
+ m_LineSpacing: 1
+ m_Text: Actual banner size may vary on mobile devices
+--- !u!1 &7742712311334970126
+GameObject:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ serializedVersion: 6
+ m_Component:
+ - component: {fileID: 3413013686078446151}
+ - component: {fileID: 2511819091764556577}
+ - component: {fileID: 2638196187645015298}
+ - component: {fileID: 633018877563332563}
+ m_Layer: 5
+ m_Name: BannerBottom
+ m_TagString: Untagged
+ m_Icon: {fileID: 0}
+ m_NavMeshLayer: 0
+ m_StaticEditorFlags: 0
+ m_IsActive: 1
+--- !u!224 &3413013686078446151
+RectTransform:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 7742712311334970126}
+ m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
+ m_LocalPosition: {x: 0, y: 0, z: 0}
+ m_LocalScale: {x: 0, y: 0, z: 0}
+ m_Children:
+ - {fileID: 5965516886513985157}
+ m_Father: {fileID: 0}
+ m_RootOrder: 0
+ m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
+ m_AnchorMin: {x: 0, y: 0}
+ m_AnchorMax: {x: 0, y: 0}
+ m_AnchoredPosition: {x: 0, y: 0}
+ m_SizeDelta: {x: 0, y: 0}
+ m_Pivot: {x: 0, y: 0}
+--- !u!223 &2511819091764556577
+Canvas:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 7742712311334970126}
+ m_Enabled: 1
+ serializedVersion: 3
+ m_RenderMode: 0
+ m_Camera: {fileID: 0}
+ m_PlaneDistance: 100
+ m_PixelPerfect: 0
+ m_ReceivesEvents: 1
+ m_OverrideSorting: 0
+ m_OverridePixelPerfect: 0
+ m_SortingBucketNormalizedSize: 0
+ m_AdditionalShaderChannelsFlag: 0
+ m_SortingLayerID: 0
+ m_SortingOrder: 500
+ m_TargetDisplay: 0
+--- !u!114 &2638196187645015298
+MonoBehaviour:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 7742712311334970126}
+ m_Enabled: 1
+ m_EditorHideFlags: 0
+ m_Script: {fileID: 1980459831, guid: f70555f144d8491a825f0804e09c671c, type: 3}
+ m_Name:
+ m_EditorClassIdentifier:
+ m_UiScaleMode: 0
+ m_ReferencePixelsPerUnit: 100
+ m_ScaleFactor: 1
+ m_ReferenceResolution: {x: 800, y: 600}
+ m_ScreenMatchMode: 0
+ m_MatchWidthOrHeight: 0
+ m_PhysicalUnit: 3
+ m_FallbackScreenDPI: 96
+ m_DefaultSpriteDPI: 96
+ m_DynamicPixelsPerUnit: 1
+--- !u!114 &633018877563332563
+MonoBehaviour:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 7742712311334970126}
+ m_Enabled: 1
+ m_EditorHideFlags: 0
+ m_Script: {fileID: 1301386320, guid: f70555f144d8491a825f0804e09c671c, type: 3}
+ m_Name:
+ m_EditorClassIdentifier:
+ m_IgnoreReversedGraphics: 1
+ m_BlockingObjects: 0
+ m_BlockingMask:
+ serializedVersion: 2
+ m_Bits: 4294967295
+--- !u!1 &8436952342056443077
+GameObject:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ serializedVersion: 6
+ m_Component:
+ - component: {fileID: 5084927109723455527}
+ - component: {fileID: 7267203896389005665}
+ - component: {fileID: 5500603550844857255}
+ m_Layer: 5
+ m_Name: Text
+ m_TagString: Untagged
+ m_Icon: {fileID: 0}
+ m_NavMeshLayer: 0
+ m_StaticEditorFlags: 0
+ m_IsActive: 1
+--- !u!224 &5084927109723455527
+RectTransform:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 8436952342056443077}
+ m_LocalRotation: {x: -0, y: -0, z: -0, w: 1}
+ m_LocalPosition: {x: 0, y: 0, z: 0}
+ m_LocalScale: {x: 1, y: 1, z: 1}
+ m_Children: []
+ m_Father: {fileID: 4118862295226300947}
+ m_RootOrder: 0
+ m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
+ m_AnchorMin: {x: 0, y: 0}
+ m_AnchorMax: {x: 1, y: 1}
+ m_AnchoredPosition: {x: 0, y: -4}
+ m_SizeDelta: {x: 0, y: -8}
+ m_Pivot: {x: 0.5, y: 0.5}
+--- !u!222 &7267203896389005665
+CanvasRenderer:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 8436952342056443077}
+ m_CullTransparentMesh: 0
+--- !u!114 &5500603550844857255
+MonoBehaviour:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 8436952342056443077}
+ m_Enabled: 1
+ m_EditorHideFlags: 0
+ m_Script: {fileID: 708705254, guid: f70555f144d8491a825f0804e09c671c, type: 3}
+ m_Name:
+ m_EditorClassIdentifier:
+ m_Material: {fileID: 0}
+ m_Color: {r: 0.19607843, g: 0.19607843, b: 0.19607843, a: 1}
+ m_RaycastTarget: 1
+ m_OnCullStateChanged:
+ m_PersistentCalls:
+ m_Calls: []
+ m_FontData:
+ m_Font: {fileID: 10102, guid: 0000000000000000e000000000000000, type: 0}
+ m_FontSize: 26
+ m_FontStyle: 0
+ m_BestFit: 0
+ m_MinSize: 0
+ m_MaxSize: 71
+ m_Alignment: 1
+ m_AlignByGeometry: 0
+ m_RichText: 1
+ m_HorizontalOverflow: 0
+ m_VerticalOverflow: 0
+ m_LineSpacing: 1
+ m_Text: MAX Banner Ad
diff --git a/Assets/MaxSdk/Prefabs/BannerBottom.prefab.meta b/Assets/MaxSdk/Prefabs/BannerBottom.prefab.meta
new file mode 100644
index 0000000..153cfcf
--- /dev/null
+++ b/Assets/MaxSdk/Prefabs/BannerBottom.prefab.meta
@@ -0,0 +1,10 @@
+fileFormatVersion: 2
+guid: 54c062c0526b148efa2ea2e9489b3aa0
+labels:
+- al_max
+- al_max_export_path-MaxSdk/Prefabs/BannerBottom.prefab
+PrefabImporter:
+ externalObjects: {}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/MaxSdk/Prefabs/BannerTop.prefab b/Assets/MaxSdk/Prefabs/BannerTop.prefab
new file mode 100644
index 0000000..25d5f49
--- /dev/null
+++ b/Assets/MaxSdk/Prefabs/BannerTop.prefab
@@ -0,0 +1,402 @@
+%YAML 1.1
+%TAG !u! tag:unity3d.com,2011:
+--- !u!1 &3149432657757030138
+GameObject:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ serializedVersion: 6
+ m_Component:
+ - component: {fileID: 5965516886513985157}
+ - component: {fileID: 3167928293195730454}
+ - component: {fileID: 6048907697713132302}
+ m_Layer: 5
+ m_Name: Panel
+ m_TagString: Untagged
+ m_Icon: {fileID: 0}
+ m_NavMeshLayer: 0
+ m_StaticEditorFlags: 0
+ m_IsActive: 1
+--- !u!224 &5965516886513985157
+RectTransform:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 3149432657757030138}
+ m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
+ m_LocalPosition: {x: 0, y: 0, z: 0}
+ m_LocalScale: {x: 1, y: 1, z: 1}
+ m_Children:
+ - {fileID: 4118862295226300947}
+ m_Father: {fileID: 3413013686078446151}
+ m_RootOrder: 0
+ m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
+ m_AnchorMin: {x: 0, y: 1}
+ m_AnchorMax: {x: 1, y: 1}
+ m_AnchoredPosition: {x: 0, y: -50}
+ m_SizeDelta: {x: 0, y: 100}
+ m_Pivot: {x: 0.5, y: 0.5}
+--- !u!222 &3167928293195730454
+CanvasRenderer:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 3149432657757030138}
+ m_CullTransparentMesh: 0
+--- !u!114 &6048907697713132302
+MonoBehaviour:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 3149432657757030138}
+ m_Enabled: 1
+ m_EditorHideFlags: 0
+ m_Script: {fileID: -765806418, guid: f70555f144d8491a825f0804e09c671c, type: 3}
+ m_Name:
+ m_EditorClassIdentifier:
+ m_Material: {fileID: 0}
+ m_Color: {r: 0, g: 0, b: 0, a: 1}
+ m_RaycastTarget: 1
+ m_OnCullStateChanged:
+ m_PersistentCalls:
+ m_Calls: []
+ m_Sprite: {fileID: 0}
+ m_Type: 1
+ m_PreserveAspect: 0
+ m_FillCenter: 1
+ m_FillMethod: 4
+ m_FillAmount: 1
+ m_FillClockwise: 1
+ m_FillOrigin: 0
+ m_UseSpriteMesh: 0
+--- !u!1 &3829518492429360636
+GameObject:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ serializedVersion: 6
+ m_Component:
+ - component: {fileID: 4118862295226300947}
+ - component: {fileID: 5582763645243389146}
+ - component: {fileID: 1436650035481827287}
+ m_Layer: 5
+ m_Name: Panel
+ m_TagString: Untagged
+ m_Icon: {fileID: 0}
+ m_NavMeshLayer: 0
+ m_StaticEditorFlags: 0
+ m_IsActive: 1
+--- !u!224 &4118862295226300947
+RectTransform:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 3829518492429360636}
+ m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
+ m_LocalPosition: {x: 0, y: 0, z: 0}
+ m_LocalScale: {x: 1, y: 1, z: 1}
+ m_Children:
+ - {fileID: 5084927109723455527}
+ - {fileID: 7429934296583149777}
+ m_Father: {fileID: 5965516886513985157}
+ m_RootOrder: 0
+ m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
+ m_AnchorMin: {x: 0.5, y: 0}
+ m_AnchorMax: {x: 0.5, y: 1}
+ m_AnchoredPosition: {x: 0, y: 0}
+ m_SizeDelta: {x: 640, y: 0}
+ m_Pivot: {x: 0.5, y: 0.5}
+--- !u!222 &5582763645243389146
+CanvasRenderer:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 3829518492429360636}
+ m_CullTransparentMesh: 0
+--- !u!114 &1436650035481827287
+MonoBehaviour:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 3829518492429360636}
+ m_Enabled: 1
+ m_EditorHideFlags: 0
+ m_Script: {fileID: -765806418, guid: f70555f144d8491a825f0804e09c671c, type: 3}
+ m_Name:
+ m_EditorClassIdentifier:
+ m_Material: {fileID: 0}
+ m_Color: {r: 1, g: 1, b: 1, a: 1}
+ m_RaycastTarget: 1
+ m_OnCullStateChanged:
+ m_PersistentCalls:
+ m_Calls: []
+ m_Sprite: {fileID: 0}
+ m_Type: 1
+ m_PreserveAspect: 0
+ m_FillCenter: 1
+ m_FillMethod: 4
+ m_FillAmount: 1
+ m_FillClockwise: 1
+ m_FillOrigin: 0
+ m_UseSpriteMesh: 0
+--- !u!1 &5625059666589051168
+GameObject:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ serializedVersion: 6
+ m_Component:
+ - component: {fileID: 7429934296583149777}
+ - component: {fileID: 6576623406533516677}
+ - component: {fileID: 5405475098690228567}
+ m_Layer: 5
+ m_Name: InfoText
+ m_TagString: Untagged
+ m_Icon: {fileID: 0}
+ m_NavMeshLayer: 0
+ m_StaticEditorFlags: 0
+ m_IsActive: 1
+--- !u!224 &7429934296583149777
+RectTransform:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 5625059666589051168}
+ m_LocalRotation: {x: -0, y: -0, z: -0, w: 1}
+ m_LocalPosition: {x: 0, y: 0, z: 0}
+ m_LocalScale: {x: 1, y: 1, z: 1}
+ m_Children: []
+ m_Father: {fileID: 4118862295226300947}
+ m_RootOrder: 1
+ m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
+ m_AnchorMin: {x: 0, y: 0}
+ m_AnchorMax: {x: 1, y: 1}
+ m_AnchoredPosition: {x: 0, y: 3}
+ m_SizeDelta: {x: 0, y: -6}
+ m_Pivot: {x: 0.5, y: 0.5}
+--- !u!222 &6576623406533516677
+CanvasRenderer:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 5625059666589051168}
+ m_CullTransparentMesh: 0
+--- !u!114 &5405475098690228567
+MonoBehaviour:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 5625059666589051168}
+ m_Enabled: 1
+ m_EditorHideFlags: 0
+ m_Script: {fileID: 708705254, guid: f70555f144d8491a825f0804e09c671c, type: 3}
+ m_Name:
+ m_EditorClassIdentifier:
+ m_Material: {fileID: 0}
+ m_Color: {r: 0.29411766, g: 0.29411766, b: 0.29411766, a: 1}
+ m_RaycastTarget: 1
+ m_OnCullStateChanged:
+ m_PersistentCalls:
+ m_Calls: []
+ m_FontData:
+ m_Font: {fileID: 10102, guid: 0000000000000000e000000000000000, type: 0}
+ m_FontSize: 18
+ m_FontStyle: 0
+ m_BestFit: 0
+ m_MinSize: 1
+ m_MaxSize: 40
+ m_Alignment: 7
+ m_AlignByGeometry: 0
+ m_RichText: 1
+ m_HorizontalOverflow: 0
+ m_VerticalOverflow: 0
+ m_LineSpacing: 1
+ m_Text: Actual banner size may vary on mobile devices
+--- !u!1 &7742712311334970126
+GameObject:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ serializedVersion: 6
+ m_Component:
+ - component: {fileID: 3413013686078446151}
+ - component: {fileID: 2511819091764556577}
+ - component: {fileID: 2638196187645015298}
+ - component: {fileID: 633018877563332563}
+ m_Layer: 5
+ m_Name: BannerTop
+ m_TagString: Untagged
+ m_Icon: {fileID: 0}
+ m_NavMeshLayer: 0
+ m_StaticEditorFlags: 0
+ m_IsActive: 1
+--- !u!224 &3413013686078446151
+RectTransform:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 7742712311334970126}
+ m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
+ m_LocalPosition: {x: 0, y: 0, z: 0}
+ m_LocalScale: {x: 0, y: 0, z: 0}
+ m_Children:
+ - {fileID: 5965516886513985157}
+ m_Father: {fileID: 0}
+ m_RootOrder: 0
+ m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
+ m_AnchorMin: {x: 0, y: 0}
+ m_AnchorMax: {x: 0, y: 0}
+ m_AnchoredPosition: {x: 0, y: 0}
+ m_SizeDelta: {x: 0, y: 0}
+ m_Pivot: {x: 0, y: 0}
+--- !u!223 &2511819091764556577
+Canvas:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 7742712311334970126}
+ m_Enabled: 1
+ serializedVersion: 3
+ m_RenderMode: 0
+ m_Camera: {fileID: 0}
+ m_PlaneDistance: 100
+ m_PixelPerfect: 0
+ m_ReceivesEvents: 1
+ m_OverrideSorting: 0
+ m_OverridePixelPerfect: 0
+ m_SortingBucketNormalizedSize: 0
+ m_AdditionalShaderChannelsFlag: 0
+ m_SortingLayerID: 0
+ m_SortingOrder: 500
+ m_TargetDisplay: 0
+--- !u!114 &2638196187645015298
+MonoBehaviour:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 7742712311334970126}
+ m_Enabled: 1
+ m_EditorHideFlags: 0
+ m_Script: {fileID: 1980459831, guid: f70555f144d8491a825f0804e09c671c, type: 3}
+ m_Name:
+ m_EditorClassIdentifier:
+ m_UiScaleMode: 0
+ m_ReferencePixelsPerUnit: 100
+ m_ScaleFactor: 1
+ m_ReferenceResolution: {x: 800, y: 600}
+ m_ScreenMatchMode: 0
+ m_MatchWidthOrHeight: 0
+ m_PhysicalUnit: 3
+ m_FallbackScreenDPI: 96
+ m_DefaultSpriteDPI: 96
+ m_DynamicPixelsPerUnit: 1
+--- !u!114 &633018877563332563
+MonoBehaviour:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 7742712311334970126}
+ m_Enabled: 1
+ m_EditorHideFlags: 0
+ m_Script: {fileID: 1301386320, guid: f70555f144d8491a825f0804e09c671c, type: 3}
+ m_Name:
+ m_EditorClassIdentifier:
+ m_IgnoreReversedGraphics: 1
+ m_BlockingObjects: 0
+ m_BlockingMask:
+ serializedVersion: 2
+ m_Bits: 4294967295
+--- !u!1 &8436952342056443077
+GameObject:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ serializedVersion: 6
+ m_Component:
+ - component: {fileID: 5084927109723455527}
+ - component: {fileID: 7267203896389005665}
+ - component: {fileID: 5500603550844857255}
+ m_Layer: 5
+ m_Name: Text
+ m_TagString: Untagged
+ m_Icon: {fileID: 0}
+ m_NavMeshLayer: 0
+ m_StaticEditorFlags: 0
+ m_IsActive: 1
+--- !u!224 &5084927109723455527
+RectTransform:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 8436952342056443077}
+ m_LocalRotation: {x: -0, y: -0, z: -0, w: 1}
+ m_LocalPosition: {x: 0, y: 0, z: 0}
+ m_LocalScale: {x: 1, y: 1, z: 1}
+ m_Children: []
+ m_Father: {fileID: 4118862295226300947}
+ m_RootOrder: 0
+ m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
+ m_AnchorMin: {x: 0, y: 0}
+ m_AnchorMax: {x: 1, y: 1}
+ m_AnchoredPosition: {x: 0, y: -4}
+ m_SizeDelta: {x: 0, y: -8}
+ m_Pivot: {x: 0.5, y: 0.5}
+--- !u!222 &7267203896389005665
+CanvasRenderer:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 8436952342056443077}
+ m_CullTransparentMesh: 0
+--- !u!114 &5500603550844857255
+MonoBehaviour:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 8436952342056443077}
+ m_Enabled: 1
+ m_EditorHideFlags: 0
+ m_Script: {fileID: 708705254, guid: f70555f144d8491a825f0804e09c671c, type: 3}
+ m_Name:
+ m_EditorClassIdentifier:
+ m_Material: {fileID: 0}
+ m_Color: {r: 0.19607843, g: 0.19607843, b: 0.19607843, a: 1}
+ m_RaycastTarget: 1
+ m_OnCullStateChanged:
+ m_PersistentCalls:
+ m_Calls: []
+ m_FontData:
+ m_Font: {fileID: 10102, guid: 0000000000000000e000000000000000, type: 0}
+ m_FontSize: 26
+ m_FontStyle: 0
+ m_BestFit: 0
+ m_MinSize: 0
+ m_MaxSize: 71
+ m_Alignment: 1
+ m_AlignByGeometry: 0
+ m_RichText: 1
+ m_HorizontalOverflow: 0
+ m_VerticalOverflow: 0
+ m_LineSpacing: 1
+ m_Text: MAX Banner Ad
diff --git a/Assets/MaxSdk/Prefabs/BannerTop.prefab.meta b/Assets/MaxSdk/Prefabs/BannerTop.prefab.meta
new file mode 100644
index 0000000..52ef464
--- /dev/null
+++ b/Assets/MaxSdk/Prefabs/BannerTop.prefab.meta
@@ -0,0 +1,10 @@
+fileFormatVersion: 2
+guid: 6521750c87fd14f709d09a1e38ffde47
+labels:
+- al_max
+- al_max_export_path-MaxSdk/Prefabs/BannerTop.prefab
+PrefabImporter:
+ externalObjects: {}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/MaxSdk/Prefabs/Interstitial.prefab b/Assets/MaxSdk/Prefabs/Interstitial.prefab
new file mode 100644
index 0000000..10c7c7b
--- /dev/null
+++ b/Assets/MaxSdk/Prefabs/Interstitial.prefab
@@ -0,0 +1,523 @@
+%YAML 1.1
+%TAG !u! tag:unity3d.com,2011:
+--- !u!1 &3149432657757030138
+GameObject:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ serializedVersion: 6
+ m_Component:
+ - component: {fileID: 5965516886513985157}
+ - component: {fileID: 3167928293195730454}
+ - component: {fileID: 6048907697713132302}
+ m_Layer: 5
+ m_Name: Panel
+ m_TagString: Untagged
+ m_Icon: {fileID: 0}
+ m_NavMeshLayer: 0
+ m_StaticEditorFlags: 0
+ m_IsActive: 1
+--- !u!224 &5965516886513985157
+RectTransform:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 3149432657757030138}
+ m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
+ m_LocalPosition: {x: 0, y: 0, z: 0}
+ m_LocalScale: {x: 1, y: 1, z: 1}
+ m_Children:
+ - {fileID: 5084927109723455527}
+ - {fileID: 8681486192829137138}
+ m_Father: {fileID: 3413013686078446151}
+ m_RootOrder: 0
+ m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
+ m_AnchorMin: {x: 0, y: 0}
+ m_AnchorMax: {x: 1, y: 1}
+ m_AnchoredPosition: {x: 0, y: 0}
+ m_SizeDelta: {x: 0, y: 0}
+ m_Pivot: {x: 0.5, y: 0.5}
+--- !u!222 &3167928293195730454
+CanvasRenderer:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 3149432657757030138}
+ m_CullTransparentMesh: 0
+--- !u!114 &6048907697713132302
+MonoBehaviour:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 3149432657757030138}
+ m_Enabled: 1
+ m_EditorHideFlags: 0
+ m_Script: {fileID: -765806418, guid: f70555f144d8491a825f0804e09c671c, type: 3}
+ m_Name:
+ m_EditorClassIdentifier:
+ m_Material: {fileID: 0}
+ m_Color: {r: 0.88235295, g: 0.88235295, b: 0.88235295, a: 1}
+ m_RaycastTarget: 1
+ m_OnCullStateChanged:
+ m_PersistentCalls:
+ m_Calls: []
+ m_Sprite: {fileID: 0}
+ m_Type: 1
+ m_PreserveAspect: 0
+ m_FillCenter: 1
+ m_FillMethod: 4
+ m_FillAmount: 1
+ m_FillClockwise: 1
+ m_FillOrigin: 0
+ m_UseSpriteMesh: 0
+--- !u!1 &5668641863723001099
+GameObject:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ serializedVersion: 6
+ m_Component:
+ - component: {fileID: 8681486192829137138}
+ - component: {fileID: 8217482188885705039}
+ - component: {fileID: 3177344817093501532}
+ - component: {fileID: 4415703054918645549}
+ m_Layer: 5
+ m_Name: MaxInterstitialCloseButton
+ m_TagString: Untagged
+ m_Icon: {fileID: 0}
+ m_NavMeshLayer: 0
+ m_StaticEditorFlags: 0
+ m_IsActive: 1
+--- !u!224 &8681486192829137138
+RectTransform:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 5668641863723001099}
+ m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
+ m_LocalPosition: {x: 0, y: 0, z: 0}
+ m_LocalScale: {x: 1, y: 1, z: 1}
+ m_Children:
+ - {fileID: 763654547095120985}
+ m_Father: {fileID: 5965516886513985157}
+ m_RootOrder: 1
+ m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
+ m_AnchorMin: {x: 1, y: 1}
+ m_AnchorMax: {x: 1, y: 1}
+ m_AnchoredPosition: {x: -200, y: -100}
+ m_SizeDelta: {x: 250, y: 100}
+ m_Pivot: {x: 0.5, y: 0.5}
+--- !u!222 &8217482188885705039
+CanvasRenderer:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 5668641863723001099}
+ m_CullTransparentMesh: 0
+--- !u!114 &3177344817093501532
+MonoBehaviour:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 5668641863723001099}
+ m_Enabled: 1
+ m_EditorHideFlags: 0
+ m_Script: {fileID: -765806418, guid: f70555f144d8491a825f0804e09c671c, type: 3}
+ m_Name:
+ m_EditorClassIdentifier:
+ m_Material: {fileID: 0}
+ m_Color: {r: 1, g: 1, b: 1, a: 1}
+ m_RaycastTarget: 1
+ m_OnCullStateChanged:
+ m_PersistentCalls:
+ m_Calls: []
+ m_Sprite: {fileID: 10905, guid: 0000000000000000f000000000000000, type: 0}
+ m_Type: 1
+ m_PreserveAspect: 0
+ m_FillCenter: 1
+ m_FillMethod: 4
+ m_FillAmount: 1
+ m_FillClockwise: 1
+ m_FillOrigin: 0
+ m_UseSpriteMesh: 0
+--- !u!114 &4415703054918645549
+MonoBehaviour:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 5668641863723001099}
+ m_Enabled: 1
+ m_EditorHideFlags: 0
+ m_Script: {fileID: 1392445389, guid: f70555f144d8491a825f0804e09c671c, type: 3}
+ m_Name:
+ m_EditorClassIdentifier:
+ m_Navigation:
+ m_Mode: 3
+ m_SelectOnUp: {fileID: 0}
+ m_SelectOnDown: {fileID: 0}
+ m_SelectOnLeft: {fileID: 0}
+ m_SelectOnRight: {fileID: 0}
+ m_Transition: 1
+ m_Colors:
+ m_NormalColor: {r: 1, g: 1, b: 1, a: 1}
+ m_HighlightedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1}
+ m_PressedColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 1}
+ m_DisabledColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 0.5019608}
+ m_ColorMultiplier: 1
+ m_FadeDuration: 0.1
+ m_SpriteState:
+ m_HighlightedSprite: {fileID: 0}
+ m_PressedSprite: {fileID: 0}
+ m_DisabledSprite: {fileID: 0}
+ m_AnimationTriggers:
+ m_NormalTrigger: Normal
+ m_HighlightedTrigger: Highlighted
+ m_PressedTrigger: Pressed
+ m_DisabledTrigger: Disabled
+ m_Interactable: 1
+ m_TargetGraphic: {fileID: 3177344817093501532}
+ m_OnClick:
+ m_PersistentCalls:
+ m_Calls: []
+--- !u!1 &6155160063690407013
+GameObject:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ serializedVersion: 6
+ m_Component:
+ - component: {fileID: 1672649117655046507}
+ - component: {fileID: 2484422763836779945}
+ - component: {fileID: 1332063313327512547}
+ - component: {fileID: 9160434328933334999}
+ m_Layer: 5
+ m_Name: EventSystem
+ m_TagString: Untagged
+ m_Icon: {fileID: 0}
+ m_NavMeshLayer: 0
+ m_StaticEditorFlags: 0
+ m_IsActive: 1
+--- !u!4 &1672649117655046507
+Transform:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 6155160063690407013}
+ m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
+ m_LocalPosition: {x: 0, y: 0, z: 0}
+ m_LocalScale: {x: 1, y: 1, z: 1}
+ m_Children: []
+ m_Father: {fileID: 3413013686078446151}
+ m_RootOrder: 1
+ m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
+--- !u!114 &2484422763836779945
+MonoBehaviour:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 6155160063690407013}
+ m_Enabled: 0
+ m_EditorHideFlags: 0
+ m_Script: {fileID: -619905303, guid: f70555f144d8491a825f0804e09c671c, type: 3}
+ m_Name:
+ m_EditorClassIdentifier:
+ m_FirstSelected: {fileID: 0}
+ m_sendNavigationEvents: 1
+ m_DragThreshold: 10
+--- !u!114 &1332063313327512547
+MonoBehaviour:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 6155160063690407013}
+ m_Enabled: 1
+ m_EditorHideFlags: 0
+ m_Script: {fileID: 1077351063, guid: f70555f144d8491a825f0804e09c671c, type: 3}
+ m_Name:
+ m_EditorClassIdentifier:
+ m_HorizontalAxis: Horizontal
+ m_VerticalAxis: Vertical
+ m_SubmitButton: Submit
+ m_CancelButton: Cancel
+ m_InputActionsPerSecond: 10
+ m_RepeatDelay: 0.5
+ m_ForceModuleActive: 0
+--- !u!114 &9160434328933334999
+MonoBehaviour:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 6155160063690407013}
+ m_Enabled: 1
+ m_EditorHideFlags: 0
+ m_Script: {fileID: 11500000, guid: e0acf281ba86b4929a6942ecd998395b, type: 3}
+ m_Name:
+ m_EditorClassIdentifier:
+--- !u!1 &6462551400748024402
+GameObject:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ serializedVersion: 6
+ m_Component:
+ - component: {fileID: 763654547095120985}
+ - component: {fileID: 6719360953530842803}
+ - component: {fileID: 4616290306121202327}
+ m_Layer: 5
+ m_Name: Text
+ m_TagString: Untagged
+ m_Icon: {fileID: 0}
+ m_NavMeshLayer: 0
+ m_StaticEditorFlags: 0
+ m_IsActive: 1
+--- !u!224 &763654547095120985
+RectTransform:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 6462551400748024402}
+ m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
+ m_LocalPosition: {x: 0, y: 0, z: 0}
+ m_LocalScale: {x: 1, y: 1, z: 1}
+ m_Children: []
+ m_Father: {fileID: 8681486192829137138}
+ m_RootOrder: 0
+ m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
+ m_AnchorMin: {x: 0, y: 0}
+ m_AnchorMax: {x: 1, y: 1}
+ m_AnchoredPosition: {x: 0, y: 0}
+ m_SizeDelta: {x: 0, y: 0}
+ m_Pivot: {x: 0.5, y: 0.5}
+--- !u!222 &6719360953530842803
+CanvasRenderer:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 6462551400748024402}
+ m_CullTransparentMesh: 0
+--- !u!114 &4616290306121202327
+MonoBehaviour:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 6462551400748024402}
+ m_Enabled: 1
+ m_EditorHideFlags: 0
+ m_Script: {fileID: 708705254, guid: f70555f144d8491a825f0804e09c671c, type: 3}
+ m_Name:
+ m_EditorClassIdentifier:
+ m_Material: {fileID: 0}
+ m_Color: {r: 0.19607843, g: 0.19607843, b: 0.19607843, a: 1}
+ m_RaycastTarget: 1
+ m_OnCullStateChanged:
+ m_PersistentCalls:
+ m_Calls: []
+ m_FontData:
+ m_Font: {fileID: 10102, guid: 0000000000000000e000000000000000, type: 0}
+ m_FontSize: 40
+ m_FontStyle: 0
+ m_BestFit: 0
+ m_MinSize: 4
+ m_MaxSize: 47
+ m_Alignment: 4
+ m_AlignByGeometry: 0
+ m_RichText: 1
+ m_HorizontalOverflow: 0
+ m_VerticalOverflow: 0
+ m_LineSpacing: 1
+ m_Text: Close
+--- !u!1 &7742712311334970126
+GameObject:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ serializedVersion: 6
+ m_Component:
+ - component: {fileID: 3413013686078446151}
+ - component: {fileID: 2511819091764556577}
+ - component: {fileID: 2638196187645015298}
+ - component: {fileID: 633018877563332563}
+ m_Layer: 5
+ m_Name: Interstitial
+ m_TagString: Untagged
+ m_Icon: {fileID: 0}
+ m_NavMeshLayer: 0
+ m_StaticEditorFlags: 0
+ m_IsActive: 1
+--- !u!224 &3413013686078446151
+RectTransform:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 7742712311334970126}
+ m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
+ m_LocalPosition: {x: 0, y: 0, z: 0}
+ m_LocalScale: {x: 0, y: 0, z: 0}
+ m_Children:
+ - {fileID: 5965516886513985157}
+ - {fileID: 1672649117655046507}
+ m_Father: {fileID: 0}
+ m_RootOrder: 0
+ m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
+ m_AnchorMin: {x: 0, y: 0}
+ m_AnchorMax: {x: 0, y: 0}
+ m_AnchoredPosition: {x: 0, y: 0}
+ m_SizeDelta: {x: 0, y: 0}
+ m_Pivot: {x: 0, y: 0}
+--- !u!223 &2511819091764556577
+Canvas:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 7742712311334970126}
+ m_Enabled: 1
+ serializedVersion: 3
+ m_RenderMode: 0
+ m_Camera: {fileID: 0}
+ m_PlaneDistance: 100
+ m_PixelPerfect: 0
+ m_ReceivesEvents: 1
+ m_OverrideSorting: 0
+ m_OverridePixelPerfect: 0
+ m_SortingBucketNormalizedSize: 0
+ m_AdditionalShaderChannelsFlag: 0
+ m_SortingLayerID: 0
+ m_SortingOrder: 999
+ m_TargetDisplay: 0
+--- !u!114 &2638196187645015298
+MonoBehaviour:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 7742712311334970126}
+ m_Enabled: 1
+ m_EditorHideFlags: 0
+ m_Script: {fileID: 1980459831, guid: f70555f144d8491a825f0804e09c671c, type: 3}
+ m_Name:
+ m_EditorClassIdentifier:
+ m_UiScaleMode: 0
+ m_ReferencePixelsPerUnit: 100
+ m_ScaleFactor: 1
+ m_ReferenceResolution: {x: 800, y: 600}
+ m_ScreenMatchMode: 0
+ m_MatchWidthOrHeight: 0
+ m_PhysicalUnit: 3
+ m_FallbackScreenDPI: 96
+ m_DefaultSpriteDPI: 96
+ m_DynamicPixelsPerUnit: 1
+--- !u!114 &633018877563332563
+MonoBehaviour:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 7742712311334970126}
+ m_Enabled: 1
+ m_EditorHideFlags: 0
+ m_Script: {fileID: 1301386320, guid: f70555f144d8491a825f0804e09c671c, type: 3}
+ m_Name:
+ m_EditorClassIdentifier:
+ m_IgnoreReversedGraphics: 1
+ m_BlockingObjects: 0
+ m_BlockingMask:
+ serializedVersion: 2
+ m_Bits: 4294967295
+--- !u!1 &8436952342056443077
+GameObject:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ serializedVersion: 6
+ m_Component:
+ - component: {fileID: 5084927109723455527}
+ - component: {fileID: 7267203896389005665}
+ - component: {fileID: 5500603550844857255}
+ m_Layer: 5
+ m_Name: MaxInterstitialTitle
+ m_TagString: Untagged
+ m_Icon: {fileID: 0}
+ m_NavMeshLayer: 0
+ m_StaticEditorFlags: 0
+ m_IsActive: 1
+--- !u!224 &5084927109723455527
+RectTransform:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 8436952342056443077}
+ m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
+ m_LocalPosition: {x: 0, y: 0, z: 0}
+ m_LocalScale: {x: 1, y: 1, z: 1}
+ m_Children: []
+ m_Father: {fileID: 5965516886513985157}
+ m_RootOrder: 0
+ m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
+ m_AnchorMin: {x: 0, y: 0.5}
+ m_AnchorMax: {x: 1, y: 0.5}
+ m_AnchoredPosition: {x: 0, y: 0}
+ m_SizeDelta: {x: 0, y: 300}
+ m_Pivot: {x: 0.5, y: 0.5}
+--- !u!222 &7267203896389005665
+CanvasRenderer:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 8436952342056443077}
+ m_CullTransparentMesh: 0
+--- !u!114 &5500603550844857255
+MonoBehaviour:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 8436952342056443077}
+ m_Enabled: 1
+ m_EditorHideFlags: 0
+ m_Script: {fileID: 708705254, guid: f70555f144d8491a825f0804e09c671c, type: 3}
+ m_Name:
+ m_EditorClassIdentifier:
+ m_Material: {fileID: 0}
+ m_Color: {r: 0.19607843, g: 0.19607843, b: 0.19607843, a: 1}
+ m_RaycastTarget: 1
+ m_OnCullStateChanged:
+ m_PersistentCalls:
+ m_Calls: []
+ m_FontData:
+ m_Font: {fileID: 10102, guid: 0000000000000000e000000000000000, type: 0}
+ m_FontSize: 50
+ m_FontStyle: 0
+ m_BestFit: 0
+ m_MinSize: 0
+ m_MaxSize: 71
+ m_Alignment: 4
+ m_AlignByGeometry: 0
+ m_RichText: 1
+ m_HorizontalOverflow: 0
+ m_VerticalOverflow: 0
+ m_LineSpacing: 1
+ m_Text: MAX Interstitial Ad
diff --git a/Assets/MaxSdk/Prefabs/Interstitial.prefab.meta b/Assets/MaxSdk/Prefabs/Interstitial.prefab.meta
new file mode 100644
index 0000000..4fa240b
--- /dev/null
+++ b/Assets/MaxSdk/Prefabs/Interstitial.prefab.meta
@@ -0,0 +1,10 @@
+fileFormatVersion: 2
+guid: 3fc0c2627ce8a4490b8e319326f8a535
+labels:
+- al_max
+- al_max_export_path-MaxSdk/Prefabs/Interstitial.prefab
+PrefabImporter:
+ externalObjects: {}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/MaxSdk/Prefabs/Rewarded.prefab b/Assets/MaxSdk/Prefabs/Rewarded.prefab
new file mode 100644
index 0000000..dd3457e
--- /dev/null
+++ b/Assets/MaxSdk/Prefabs/Rewarded.prefab
@@ -0,0 +1,795 @@
+%YAML 1.1
+%TAG !u! tag:unity3d.com,2011:
+--- !u!1 &288832541099509301
+GameObject:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ serializedVersion: 6
+ m_Component:
+ - component: {fileID: 6736833388881778366}
+ - component: {fileID: 738723989743429661}
+ - component: {fileID: 3366016410383180441}
+ m_Layer: 5
+ m_Name: Text
+ m_TagString: Untagged
+ m_Icon: {fileID: 0}
+ m_NavMeshLayer: 0
+ m_StaticEditorFlags: 0
+ m_IsActive: 1
+--- !u!224 &6736833388881778366
+RectTransform:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 288832541099509301}
+ m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
+ m_LocalPosition: {x: 0, y: 0, z: 0}
+ m_LocalScale: {x: 1, y: 1, z: 1}
+ m_Children: []
+ m_Father: {fileID: 2219183527695013266}
+ m_RootOrder: 0
+ m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
+ m_AnchorMin: {x: 0, y: 0}
+ m_AnchorMax: {x: 1, y: 1}
+ m_AnchoredPosition: {x: 0, y: 0}
+ m_SizeDelta: {x: 0, y: 0}
+ m_Pivot: {x: 0.5, y: 0.5}
+--- !u!222 &738723989743429661
+CanvasRenderer:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 288832541099509301}
+ m_CullTransparentMesh: 0
+--- !u!114 &3366016410383180441
+MonoBehaviour:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 288832541099509301}
+ m_Enabled: 1
+ m_EditorHideFlags: 0
+ m_Script: {fileID: 708705254, guid: f70555f144d8491a825f0804e09c671c, type: 3}
+ m_Name:
+ m_EditorClassIdentifier:
+ m_Material: {fileID: 0}
+ m_Color: {r: 0.19607843, g: 0.19607843, b: 0.19607843, a: 1}
+ m_RaycastTarget: 1
+ m_OnCullStateChanged:
+ m_PersistentCalls:
+ m_Calls: []
+ m_FontData:
+ m_Font: {fileID: 10102, guid: 0000000000000000e000000000000000, type: 0}
+ m_FontSize: 35
+ m_FontStyle: 0
+ m_BestFit: 0
+ m_MinSize: 3
+ m_MaxSize: 48
+ m_Alignment: 4
+ m_AlignByGeometry: 0
+ m_RichText: 1
+ m_HorizontalOverflow: 0
+ m_VerticalOverflow: 0
+ m_LineSpacing: 1
+ m_Text: 'Grant Reward
+
+ (5 coins)'
+--- !u!1 &2620135977249264498
+GameObject:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ serializedVersion: 6
+ m_Component:
+ - component: {fileID: 3035265698078104281}
+ - component: {fileID: 7277178523579209441}
+ - component: {fileID: 8085319417655039649}
+ m_Layer: 5
+ m_Name: MaxRewardStatus
+ m_TagString: Untagged
+ m_Icon: {fileID: 0}
+ m_NavMeshLayer: 0
+ m_StaticEditorFlags: 0
+ m_IsActive: 1
+--- !u!224 &3035265698078104281
+RectTransform:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 2620135977249264498}
+ m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
+ m_LocalPosition: {x: 0, y: 0, z: 0}
+ m_LocalScale: {x: 1, y: 1, z: 1}
+ m_Children: []
+ m_Father: {fileID: 3413013686078446151}
+ m_RootOrder: 1
+ m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
+ m_AnchorMin: {x: 0, y: 0.5}
+ m_AnchorMax: {x: 1, y: 0.5}
+ m_AnchoredPosition: {x: 0, y: -250}
+ m_SizeDelta: {x: 0, y: 200}
+ m_Pivot: {x: 0.5, y: 0.5}
+--- !u!222 &7277178523579209441
+CanvasRenderer:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 2620135977249264498}
+ m_CullTransparentMesh: 0
+--- !u!114 &8085319417655039649
+MonoBehaviour:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 2620135977249264498}
+ m_Enabled: 1
+ m_EditorHideFlags: 0
+ m_Script: {fileID: 708705254, guid: f70555f144d8491a825f0804e09c671c, type: 3}
+ m_Name:
+ m_EditorClassIdentifier:
+ m_Material: {fileID: 0}
+ m_Color: {r: 0.19607843, g: 0.19607843, b: 0.19607843, a: 1}
+ m_RaycastTarget: 1
+ m_OnCullStateChanged:
+ m_PersistentCalls:
+ m_Calls: []
+ m_FontData:
+ m_Font: {fileID: 10102, guid: 0000000000000000e000000000000000, type: 0}
+ m_FontSize: 40
+ m_FontStyle: 0
+ m_BestFit: 0
+ m_MinSize: 10
+ m_MaxSize: 69
+ m_Alignment: 4
+ m_AlignByGeometry: 0
+ m_RichText: 1
+ m_HorizontalOverflow: 0
+ m_VerticalOverflow: 0
+ m_LineSpacing: 1
+ m_Text: Reward not yet granted.
+--- !u!1 &3096027301306273604
+GameObject:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ serializedVersion: 6
+ m_Component:
+ - component: {fileID: 2219183527695013266}
+ - component: {fileID: 3687429596110321440}
+ - component: {fileID: 3757577222601629632}
+ - component: {fileID: 87227930114769318}
+ m_Layer: 5
+ m_Name: MaxRewardButton
+ m_TagString: Untagged
+ m_Icon: {fileID: 0}
+ m_NavMeshLayer: 0
+ m_StaticEditorFlags: 0
+ m_IsActive: 1
+--- !u!224 &2219183527695013266
+RectTransform:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 3096027301306273604}
+ m_LocalRotation: {x: -0, y: -0, z: -0, w: 1}
+ m_LocalPosition: {x: 0, y: 0, z: 0}
+ m_LocalScale: {x: 1, y: 1, z: 1}
+ m_Children:
+ - {fileID: 6736833388881778366}
+ m_Father: {fileID: 3413013686078446151}
+ m_RootOrder: 2
+ m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
+ m_AnchorMin: {x: 0.5, y: 0.5}
+ m_AnchorMax: {x: 0.5, y: 0.5}
+ m_AnchoredPosition: {x: 0, y: -150}
+ m_SizeDelta: {x: 300, y: 100}
+ m_Pivot: {x: 0.5, y: 0.5}
+--- !u!222 &3687429596110321440
+CanvasRenderer:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 3096027301306273604}
+ m_CullTransparentMesh: 0
+--- !u!114 &3757577222601629632
+MonoBehaviour:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 3096027301306273604}
+ m_Enabled: 1
+ m_EditorHideFlags: 0
+ m_Script: {fileID: -765806418, guid: f70555f144d8491a825f0804e09c671c, type: 3}
+ m_Name:
+ m_EditorClassIdentifier:
+ m_Material: {fileID: 0}
+ m_Color: {r: 1, g: 1, b: 1, a: 1}
+ m_RaycastTarget: 1
+ m_OnCullStateChanged:
+ m_PersistentCalls:
+ m_Calls: []
+ m_Sprite: {fileID: 10905, guid: 0000000000000000f000000000000000, type: 0}
+ m_Type: 1
+ m_PreserveAspect: 0
+ m_FillCenter: 1
+ m_FillMethod: 4
+ m_FillAmount: 1
+ m_FillClockwise: 1
+ m_FillOrigin: 0
+ m_UseSpriteMesh: 0
+--- !u!114 &87227930114769318
+MonoBehaviour:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 3096027301306273604}
+ m_Enabled: 1
+ m_EditorHideFlags: 0
+ m_Script: {fileID: 1392445389, guid: f70555f144d8491a825f0804e09c671c, type: 3}
+ m_Name:
+ m_EditorClassIdentifier:
+ m_Navigation:
+ m_Mode: 3
+ m_SelectOnUp: {fileID: 0}
+ m_SelectOnDown: {fileID: 0}
+ m_SelectOnLeft: {fileID: 0}
+ m_SelectOnRight: {fileID: 0}
+ m_Transition: 1
+ m_Colors:
+ m_NormalColor: {r: 1, g: 1, b: 1, a: 1}
+ m_HighlightedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1}
+ m_PressedColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 1}
+ m_DisabledColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 0.5019608}
+ m_ColorMultiplier: 1
+ m_FadeDuration: 0.1
+ m_SpriteState:
+ m_HighlightedSprite: {fileID: 0}
+ m_PressedSprite: {fileID: 0}
+ m_DisabledSprite: {fileID: 0}
+ m_AnimationTriggers:
+ m_NormalTrigger: Normal
+ m_HighlightedTrigger: Highlighted
+ m_PressedTrigger: Pressed
+ m_DisabledTrigger: Disabled
+ m_Interactable: 1
+ m_TargetGraphic: {fileID: 3757577222601629632}
+ m_OnClick:
+ m_PersistentCalls:
+ m_Calls: []
+--- !u!1 &3149432657757030138
+GameObject:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ serializedVersion: 6
+ m_Component:
+ - component: {fileID: 5965516886513985157}
+ - component: {fileID: 3167928293195730454}
+ - component: {fileID: 6048907697713132302}
+ m_Layer: 5
+ m_Name: Panel
+ m_TagString: Untagged
+ m_Icon: {fileID: 0}
+ m_NavMeshLayer: 0
+ m_StaticEditorFlags: 0
+ m_IsActive: 1
+--- !u!224 &5965516886513985157
+RectTransform:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 3149432657757030138}
+ m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
+ m_LocalPosition: {x: 0, y: 0, z: 0}
+ m_LocalScale: {x: 1, y: 1, z: 1}
+ m_Children:
+ - {fileID: 5084927109723455527}
+ - {fileID: 8681486192829137138}
+ m_Father: {fileID: 3413013686078446151}
+ m_RootOrder: 0
+ m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
+ m_AnchorMin: {x: 0, y: 0}
+ m_AnchorMax: {x: 1, y: 1}
+ m_AnchoredPosition: {x: 0, y: 0}
+ m_SizeDelta: {x: 0, y: 0}
+ m_Pivot: {x: 0.5, y: 0.5}
+--- !u!222 &3167928293195730454
+CanvasRenderer:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 3149432657757030138}
+ m_CullTransparentMesh: 0
+--- !u!114 &6048907697713132302
+MonoBehaviour:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 3149432657757030138}
+ m_Enabled: 1
+ m_EditorHideFlags: 0
+ m_Script: {fileID: -765806418, guid: f70555f144d8491a825f0804e09c671c, type: 3}
+ m_Name:
+ m_EditorClassIdentifier:
+ m_Material: {fileID: 0}
+ m_Color: {r: 0.88235295, g: 0.88235295, b: 0.88235295, a: 1}
+ m_RaycastTarget: 1
+ m_OnCullStateChanged:
+ m_PersistentCalls:
+ m_Calls: []
+ m_Sprite: {fileID: 0}
+ m_Type: 1
+ m_PreserveAspect: 0
+ m_FillCenter: 1
+ m_FillMethod: 4
+ m_FillAmount: 1
+ m_FillClockwise: 1
+ m_FillOrigin: 0
+ m_UseSpriteMesh: 0
+--- !u!1 &4010021198786516228
+GameObject:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ serializedVersion: 6
+ m_Component:
+ - component: {fileID: 3074011789293951898}
+ - component: {fileID: 301935380126337495}
+ - component: {fileID: 535359239537776472}
+ - component: {fileID: 1463999766055390634}
+ m_Layer: 5
+ m_Name: EventSystem
+ m_TagString: Untagged
+ m_Icon: {fileID: 0}
+ m_NavMeshLayer: 0
+ m_StaticEditorFlags: 0
+ m_IsActive: 1
+--- !u!4 &3074011789293951898
+Transform:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 4010021198786516228}
+ m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
+ m_LocalPosition: {x: 0, y: 0, z: 0}
+ m_LocalScale: {x: 1, y: 1, z: 1}
+ m_Children: []
+ m_Father: {fileID: 3413013686078446151}
+ m_RootOrder: 3
+ m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
+--- !u!114 &301935380126337495
+MonoBehaviour:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 4010021198786516228}
+ m_Enabled: 0
+ m_EditorHideFlags: 0
+ m_Script: {fileID: -619905303, guid: f70555f144d8491a825f0804e09c671c, type: 3}
+ m_Name:
+ m_EditorClassIdentifier:
+ m_FirstSelected: {fileID: 0}
+ m_sendNavigationEvents: 1
+ m_DragThreshold: 10
+--- !u!114 &535359239537776472
+MonoBehaviour:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 4010021198786516228}
+ m_Enabled: 1
+ m_EditorHideFlags: 0
+ m_Script: {fileID: 1077351063, guid: f70555f144d8491a825f0804e09c671c, type: 3}
+ m_Name:
+ m_EditorClassIdentifier:
+ m_HorizontalAxis: Horizontal
+ m_VerticalAxis: Vertical
+ m_SubmitButton: Submit
+ m_CancelButton: Cancel
+ m_InputActionsPerSecond: 10
+ m_RepeatDelay: 0.5
+ m_ForceModuleActive: 0
+--- !u!114 &1463999766055390634
+MonoBehaviour:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 4010021198786516228}
+ m_Enabled: 1
+ m_EditorHideFlags: 0
+ m_Script: {fileID: 11500000, guid: e0acf281ba86b4929a6942ecd998395b, type: 3}
+ m_Name:
+ m_EditorClassIdentifier:
+--- !u!1 &5668641863723001099
+GameObject:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ serializedVersion: 6
+ m_Component:
+ - component: {fileID: 8681486192829137138}
+ - component: {fileID: 8217482188885705039}
+ - component: {fileID: 3177344817093501532}
+ - component: {fileID: 4415703054918645549}
+ m_Layer: 5
+ m_Name: MaxRewardedCloseButton
+ m_TagString: Untagged
+ m_Icon: {fileID: 0}
+ m_NavMeshLayer: 0
+ m_StaticEditorFlags: 0
+ m_IsActive: 1
+--- !u!224 &8681486192829137138
+RectTransform:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 5668641863723001099}
+ m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
+ m_LocalPosition: {x: 0, y: 0, z: 0}
+ m_LocalScale: {x: 1, y: 1, z: 1}
+ m_Children:
+ - {fileID: 763654547095120985}
+ m_Father: {fileID: 5965516886513985157}
+ m_RootOrder: 1
+ m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
+ m_AnchorMin: {x: 1, y: 1}
+ m_AnchorMax: {x: 1, y: 1}
+ m_AnchoredPosition: {x: -200, y: -100}
+ m_SizeDelta: {x: 250, y: 100}
+ m_Pivot: {x: 0.5, y: 0.5}
+--- !u!222 &8217482188885705039
+CanvasRenderer:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 5668641863723001099}
+ m_CullTransparentMesh: 0
+--- !u!114 &3177344817093501532
+MonoBehaviour:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 5668641863723001099}
+ m_Enabled: 1
+ m_EditorHideFlags: 0
+ m_Script: {fileID: -765806418, guid: f70555f144d8491a825f0804e09c671c, type: 3}
+ m_Name:
+ m_EditorClassIdentifier:
+ m_Material: {fileID: 0}
+ m_Color: {r: 1, g: 1, b: 1, a: 1}
+ m_RaycastTarget: 1
+ m_OnCullStateChanged:
+ m_PersistentCalls:
+ m_Calls: []
+ m_Sprite: {fileID: 10905, guid: 0000000000000000f000000000000000, type: 0}
+ m_Type: 1
+ m_PreserveAspect: 0
+ m_FillCenter: 1
+ m_FillMethod: 4
+ m_FillAmount: 1
+ m_FillClockwise: 1
+ m_FillOrigin: 0
+ m_UseSpriteMesh: 0
+--- !u!114 &4415703054918645549
+MonoBehaviour:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 5668641863723001099}
+ m_Enabled: 1
+ m_EditorHideFlags: 0
+ m_Script: {fileID: 1392445389, guid: f70555f144d8491a825f0804e09c671c, type: 3}
+ m_Name:
+ m_EditorClassIdentifier:
+ m_Navigation:
+ m_Mode: 3
+ m_SelectOnUp: {fileID: 0}
+ m_SelectOnDown: {fileID: 0}
+ m_SelectOnLeft: {fileID: 0}
+ m_SelectOnRight: {fileID: 0}
+ m_Transition: 1
+ m_Colors:
+ m_NormalColor: {r: 1, g: 1, b: 1, a: 1}
+ m_HighlightedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1}
+ m_PressedColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 1}
+ m_DisabledColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 0.5019608}
+ m_ColorMultiplier: 1
+ m_FadeDuration: 0.1
+ m_SpriteState:
+ m_HighlightedSprite: {fileID: 0}
+ m_PressedSprite: {fileID: 0}
+ m_DisabledSprite: {fileID: 0}
+ m_AnimationTriggers:
+ m_NormalTrigger: Normal
+ m_HighlightedTrigger: Highlighted
+ m_PressedTrigger: Pressed
+ m_DisabledTrigger: Disabled
+ m_Interactable: 1
+ m_TargetGraphic: {fileID: 3177344817093501532}
+ m_OnClick:
+ m_PersistentCalls:
+ m_Calls: []
+--- !u!1 &6462551400748024402
+GameObject:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ serializedVersion: 6
+ m_Component:
+ - component: {fileID: 763654547095120985}
+ - component: {fileID: 6719360953530842803}
+ - component: {fileID: 4616290306121202327}
+ m_Layer: 5
+ m_Name: Text
+ m_TagString: Untagged
+ m_Icon: {fileID: 0}
+ m_NavMeshLayer: 0
+ m_StaticEditorFlags: 0
+ m_IsActive: 1
+--- !u!224 &763654547095120985
+RectTransform:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 6462551400748024402}
+ m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
+ m_LocalPosition: {x: 0, y: 0, z: 0}
+ m_LocalScale: {x: 1, y: 1, z: 1}
+ m_Children: []
+ m_Father: {fileID: 8681486192829137138}
+ m_RootOrder: 0
+ m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
+ m_AnchorMin: {x: 0, y: 0}
+ m_AnchorMax: {x: 1, y: 1}
+ m_AnchoredPosition: {x: 0, y: 0}
+ m_SizeDelta: {x: 0, y: 0}
+ m_Pivot: {x: 0.5, y: 0.5}
+--- !u!222 &6719360953530842803
+CanvasRenderer:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 6462551400748024402}
+ m_CullTransparentMesh: 0
+--- !u!114 &4616290306121202327
+MonoBehaviour:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 6462551400748024402}
+ m_Enabled: 1
+ m_EditorHideFlags: 0
+ m_Script: {fileID: 708705254, guid: f70555f144d8491a825f0804e09c671c, type: 3}
+ m_Name:
+ m_EditorClassIdentifier:
+ m_Material: {fileID: 0}
+ m_Color: {r: 0.19607843, g: 0.19607843, b: 0.19607843, a: 1}
+ m_RaycastTarget: 1
+ m_OnCullStateChanged:
+ m_PersistentCalls:
+ m_Calls: []
+ m_FontData:
+ m_Font: {fileID: 10102, guid: 0000000000000000e000000000000000, type: 0}
+ m_FontSize: 40
+ m_FontStyle: 0
+ m_BestFit: 0
+ m_MinSize: 4
+ m_MaxSize: 47
+ m_Alignment: 4
+ m_AlignByGeometry: 0
+ m_RichText: 1
+ m_HorizontalOverflow: 0
+ m_VerticalOverflow: 0
+ m_LineSpacing: 1
+ m_Text: Close
+--- !u!1 &7742712311334970126
+GameObject:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ serializedVersion: 6
+ m_Component:
+ - component: {fileID: 3413013686078446151}
+ - component: {fileID: 2511819091764556577}
+ - component: {fileID: 2638196187645015298}
+ - component: {fileID: 633018877563332563}
+ m_Layer: 5
+ m_Name: Rewarded
+ m_TagString: Untagged
+ m_Icon: {fileID: 0}
+ m_NavMeshLayer: 0
+ m_StaticEditorFlags: 0
+ m_IsActive: 1
+--- !u!224 &3413013686078446151
+RectTransform:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 7742712311334970126}
+ m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
+ m_LocalPosition: {x: 0, y: 0, z: 0}
+ m_LocalScale: {x: 0, y: 0, z: 0}
+ m_Children:
+ - {fileID: 5965516886513985157}
+ - {fileID: 3035265698078104281}
+ - {fileID: 2219183527695013266}
+ - {fileID: 3074011789293951898}
+ m_Father: {fileID: 0}
+ m_RootOrder: 0
+ m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
+ m_AnchorMin: {x: 0, y: 0}
+ m_AnchorMax: {x: 0, y: 0}
+ m_AnchoredPosition: {x: 0, y: 0}
+ m_SizeDelta: {x: 0, y: 0}
+ m_Pivot: {x: 0, y: 0}
+--- !u!223 &2511819091764556577
+Canvas:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 7742712311334970126}
+ m_Enabled: 1
+ serializedVersion: 3
+ m_RenderMode: 0
+ m_Camera: {fileID: 0}
+ m_PlaneDistance: 100
+ m_PixelPerfect: 0
+ m_ReceivesEvents: 1
+ m_OverrideSorting: 0
+ m_OverridePixelPerfect: 0
+ m_SortingBucketNormalizedSize: 0
+ m_AdditionalShaderChannelsFlag: 0
+ m_SortingLayerID: 0
+ m_SortingOrder: 999
+ m_TargetDisplay: 0
+--- !u!114 &2638196187645015298
+MonoBehaviour:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 7742712311334970126}
+ m_Enabled: 1
+ m_EditorHideFlags: 0
+ m_Script: {fileID: 1980459831, guid: f70555f144d8491a825f0804e09c671c, type: 3}
+ m_Name:
+ m_EditorClassIdentifier:
+ m_UiScaleMode: 0
+ m_ReferencePixelsPerUnit: 100
+ m_ScaleFactor: 1
+ m_ReferenceResolution: {x: 800, y: 600}
+ m_ScreenMatchMode: 0
+ m_MatchWidthOrHeight: 0
+ m_PhysicalUnit: 3
+ m_FallbackScreenDPI: 96
+ m_DefaultSpriteDPI: 96
+ m_DynamicPixelsPerUnit: 1
+--- !u!114 &633018877563332563
+MonoBehaviour:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 7742712311334970126}
+ m_Enabled: 1
+ m_EditorHideFlags: 0
+ m_Script: {fileID: 1301386320, guid: f70555f144d8491a825f0804e09c671c, type: 3}
+ m_Name:
+ m_EditorClassIdentifier:
+ m_IgnoreReversedGraphics: 1
+ m_BlockingObjects: 0
+ m_BlockingMask:
+ serializedVersion: 2
+ m_Bits: 4294967295
+--- !u!1 &8436952342056443077
+GameObject:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ serializedVersion: 6
+ m_Component:
+ - component: {fileID: 5084927109723455527}
+ - component: {fileID: 7267203896389005665}
+ - component: {fileID: 5500603550844857255}
+ m_Layer: 5
+ m_Name: MaxRewardTitle
+ m_TagString: Untagged
+ m_Icon: {fileID: 0}
+ m_NavMeshLayer: 0
+ m_StaticEditorFlags: 0
+ m_IsActive: 1
+--- !u!224 &5084927109723455527
+RectTransform:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 8436952342056443077}
+ m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
+ m_LocalPosition: {x: 0, y: 0, z: 0}
+ m_LocalScale: {x: 1, y: 1, z: 1}
+ m_Children: []
+ m_Father: {fileID: 5965516886513985157}
+ m_RootOrder: 0
+ m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
+ m_AnchorMin: {x: 0, y: 0.5}
+ m_AnchorMax: {x: 1, y: 0.5}
+ m_AnchoredPosition: {x: 0, y: 0}
+ m_SizeDelta: {x: 0, y: 300}
+ m_Pivot: {x: 0.5, y: 0.5}
+--- !u!222 &7267203896389005665
+CanvasRenderer:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 8436952342056443077}
+ m_CullTransparentMesh: 0
+--- !u!114 &5500603550844857255
+MonoBehaviour:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 8436952342056443077}
+ m_Enabled: 1
+ m_EditorHideFlags: 0
+ m_Script: {fileID: 708705254, guid: f70555f144d8491a825f0804e09c671c, type: 3}
+ m_Name:
+ m_EditorClassIdentifier:
+ m_Material: {fileID: 0}
+ m_Color: {r: 0.19607843, g: 0.19607843, b: 0.19607843, a: 1}
+ m_RaycastTarget: 1
+ m_OnCullStateChanged:
+ m_PersistentCalls:
+ m_Calls: []
+ m_FontData:
+ m_Font: {fileID: 10102, guid: 0000000000000000e000000000000000, type: 0}
+ m_FontSize: 50
+ m_FontStyle: 0
+ m_BestFit: 0
+ m_MinSize: 0
+ m_MaxSize: 71
+ m_Alignment: 4
+ m_AlignByGeometry: 0
+ m_RichText: 1
+ m_HorizontalOverflow: 0
+ m_VerticalOverflow: 0
+ m_LineSpacing: 1
+ m_Text: MAX Rewarded Ad
diff --git a/Assets/MaxSdk/Prefabs/Rewarded.prefab.meta b/Assets/MaxSdk/Prefabs/Rewarded.prefab.meta
new file mode 100644
index 0000000..214bea1
--- /dev/null
+++ b/Assets/MaxSdk/Prefabs/Rewarded.prefab.meta
@@ -0,0 +1,10 @@
+fileFormatVersion: 2
+guid: a28c1544d6f094d5eafc8da2343c9119
+labels:
+- al_max
+- al_max_export_path-MaxSdk/Prefabs/Rewarded.prefab
+PrefabImporter:
+ externalObjects: {}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/MaxSdk/Resources.meta b/Assets/MaxSdk/Resources.meta
new file mode 100644
index 0000000..03c0c4c
--- /dev/null
+++ b/Assets/MaxSdk/Resources.meta
@@ -0,0 +1,8 @@
+fileFormatVersion: 2
+guid: ebb4a8564e8074807876237c023d7ef7
+folderAsset: yes
+DefaultImporter:
+ externalObjects: {}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/MaxSdk/Resources/AppLovinSettings.asset b/Assets/MaxSdk/Resources/AppLovinSettings.asset
new file mode 100644
index 0000000..2fbbbe3
--- /dev/null
+++ b/Assets/MaxSdk/Resources/AppLovinSettings.asset
@@ -0,0 +1,20 @@
+%YAML 1.1
+%TAG !u! tag:unity3d.com,2011:
+--- !u!114 &11400000
+MonoBehaviour:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 0}
+ m_Enabled: 1
+ m_EditorHideFlags: 0
+ m_Script: {fileID: 11500000, guid: ebc0ba1b5ef6b4a6b9dd53d7eadfea16, type: 3}
+ m_Name: AppLovinSettings
+ m_EditorClassIdentifier:
+ qualityServiceEnabled: 1
+ sdkKey: LHx_tPFslZpTTiIPABmS24T7Ev1QEVOUVOzirpkxLUuTwJTVZGCKAk9L3Tm3FwuM5LxHK3q1EIbAemJB5sNpX2
+ customGradleVersionUrl:
+ customGradleToolsVersion:
+ adMobAndroidAppId:
+ adMobIosAppId: ca-app-pub-8182098075176784~7136447773
diff --git a/Assets/MaxSdk/Resources/AppLovinSettings.asset.meta b/Assets/MaxSdk/Resources/AppLovinSettings.asset.meta
new file mode 100644
index 0000000..0b1b24a
--- /dev/null
+++ b/Assets/MaxSdk/Resources/AppLovinSettings.asset.meta
@@ -0,0 +1,8 @@
+fileFormatVersion: 2
+guid: 95645d8e09bd1744589b1ef54dc41982
+NativeFormatImporter:
+ externalObjects: {}
+ mainObjectFileID: 0
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/MaxSdk/Resources/Images.meta b/Assets/MaxSdk/Resources/Images.meta
new file mode 100644
index 0000000..16aa852
--- /dev/null
+++ b/Assets/MaxSdk/Resources/Images.meta
@@ -0,0 +1,8 @@
+fileFormatVersion: 2
+guid: 62530839001924aff89b18c462d7c991
+folderAsset: yes
+DefaultImporter:
+ externalObjects: {}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/MaxSdk/Resources/Images/error_icon.png b/Assets/MaxSdk/Resources/Images/error_icon.png
new file mode 100644
index 0000000..1651950
Binary files /dev/null and b/Assets/MaxSdk/Resources/Images/error_icon.png differ
diff --git a/Assets/MaxSdk/Resources/Images/error_icon.png.meta b/Assets/MaxSdk/Resources/Images/error_icon.png.meta
new file mode 100644
index 0000000..9d58299
--- /dev/null
+++ b/Assets/MaxSdk/Resources/Images/error_icon.png.meta
@@ -0,0 +1,94 @@
+fileFormatVersion: 2
+guid: 572fee4574afa4f6dbf2846e0c152fe8
+labels:
+- al_max
+- al_max_export_path-MaxSdk/Resources/Images/error_icon.png
+TextureImporter:
+ internalIDToNameTable: []
+ externalObjects: {}
+ serializedVersion: 10
+ mipmaps:
+ mipMapMode: 0
+ enableMipMap: 1
+ sRGBTexture: 1
+ linearTexture: 0
+ fadeOut: 0
+ borderMipMap: 0
+ mipMapsPreserveCoverage: 0
+ alphaTestReferenceValue: 0.5
+ mipMapFadeDistanceStart: 1
+ mipMapFadeDistanceEnd: 3
+ bumpmap:
+ convertToNormalMap: 0
+ externalNormalMap: 0
+ heightScale: 0.25
+ normalMapFilter: 0
+ isReadable: 0
+ streamingMipmaps: 0
+ streamingMipmapsPriority: 0
+ grayScaleToAlpha: 0
+ generateCubemap: 6
+ cubemapConvolution: 0
+ seamlessCubemap: 0
+ textureFormat: 1
+ maxTextureSize: 2048
+ textureSettings:
+ serializedVersion: 2
+ filterMode: -1
+ aniso: -1
+ mipBias: -100
+ wrapU: -1
+ wrapV: -1
+ wrapW: -1
+ nPOTScale: 1
+ lightmap: 0
+ compressionQuality: 50
+ spriteMode: 0
+ spriteExtrude: 1
+ spriteMeshType: 1
+ alignment: 0
+ spritePivot: {x: 0.5, y: 0.5}
+ spritePixelsToUnits: 100
+ spriteBorder: {x: 0, y: 0, z: 0, w: 0}
+ spriteGenerateFallbackPhysicsShape: 1
+ alphaUsage: 1
+ alphaIsTransparency: 0
+ spriteTessellationDetail: -1
+ textureType: 0
+ textureShape: 1
+ singleChannelComponent: 0
+ maxTextureSizeSet: 0
+ compressionQualitySet: 0
+ textureFormatSet: 0
+ platformSettings:
+ - serializedVersion: 3
+ buildTarget: DefaultTexturePlatform
+ maxTextureSize: 2048
+ resizeAlgorithm: 0
+ textureFormat: -1
+ textureCompression: 1
+ compressionQuality: 50
+ crunchedCompression: 0
+ allowsAlphaSplitting: 0
+ overridden: 0
+ androidETC2FallbackOverride: 0
+ forceMaximumCompressionQuality_BC6H_BC7: 0
+ spriteSheet:
+ serializedVersion: 2
+ sprites: []
+ outline: []
+ physicsShape: []
+ bones: []
+ spriteID:
+ internalID: 0
+ vertices: []
+ indices:
+ edges: []
+ weights: []
+ secondaryTextures: []
+ spritePackingTag:
+ pSDRemoveMatte: 0
+ pSDShowRemoveMatteOption: 0
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/MaxSdk/Resources/Images/info_icon.png b/Assets/MaxSdk/Resources/Images/info_icon.png
new file mode 100644
index 0000000..a0b19e8
Binary files /dev/null and b/Assets/MaxSdk/Resources/Images/info_icon.png differ
diff --git a/Assets/MaxSdk/Resources/Images/info_icon.png.meta b/Assets/MaxSdk/Resources/Images/info_icon.png.meta
new file mode 100644
index 0000000..273c8fb
--- /dev/null
+++ b/Assets/MaxSdk/Resources/Images/info_icon.png.meta
@@ -0,0 +1,95 @@
+fileFormatVersion: 2
+guid: 036a0d1eebcb7467ba676e6cb67c7872
+labels:
+- al_max
+- al_max_export_path-MaxSdk/Resources/Images/info_icon.png
+TextureImporter:
+ internalIDToNameTable: []
+ externalObjects: {}
+ serializedVersion: 11
+ mipmaps:
+ mipMapMode: 0
+ enableMipMap: 1
+ sRGBTexture: 1
+ linearTexture: 0
+ fadeOut: 0
+ borderMipMap: 0
+ mipMapsPreserveCoverage: 0
+ alphaTestReferenceValue: 0.5
+ mipMapFadeDistanceStart: 1
+ mipMapFadeDistanceEnd: 3
+ bumpmap:
+ convertToNormalMap: 0
+ externalNormalMap: 0
+ heightScale: 0.25
+ normalMapFilter: 0
+ isReadable: 0
+ streamingMipmaps: 0
+ streamingMipmapsPriority: 0
+ grayScaleToAlpha: 0
+ generateCubemap: 6
+ cubemapConvolution: 0
+ seamlessCubemap: 0
+ textureFormat: 1
+ maxTextureSize: 2048
+ textureSettings:
+ serializedVersion: 2
+ filterMode: 1
+ aniso: 1
+ mipBias: 0
+ wrapU: 0
+ wrapV: 0
+ wrapW: 0
+ nPOTScale: 1
+ lightmap: 0
+ compressionQuality: 50
+ spriteMode: 0
+ spriteExtrude: 1
+ spriteMeshType: 1
+ alignment: 0
+ spritePivot: {x: 0.5, y: 0.5}
+ spritePixelsToUnits: 100
+ spriteBorder: {x: 0, y: 0, z: 0, w: 0}
+ spriteGenerateFallbackPhysicsShape: 1
+ alphaUsage: 1
+ alphaIsTransparency: 0
+ spriteTessellationDetail: -1
+ textureType: 0
+ textureShape: 1
+ singleChannelComponent: 0
+ maxTextureSizeSet: 0
+ compressionQualitySet: 0
+ textureFormatSet: 0
+ applyGammaDecoding: 0
+ platformSettings:
+ - serializedVersion: 3
+ buildTarget: DefaultTexturePlatform
+ maxTextureSize: 2048
+ resizeAlgorithm: 0
+ textureFormat: -1
+ textureCompression: 1
+ compressionQuality: 50
+ crunchedCompression: 0
+ allowsAlphaSplitting: 0
+ overridden: 0
+ androidETC2FallbackOverride: 0
+ forceMaximumCompressionQuality_BC6H_BC7: 0
+ spriteSheet:
+ serializedVersion: 2
+ sprites: []
+ outline: []
+ physicsShape: []
+ bones: []
+ spriteID:
+ internalID: 0
+ vertices: []
+ indices:
+ edges: []
+ weights: []
+ secondaryTextures: []
+ spritePackingTag:
+ pSDRemoveMatte: 0
+ pSDShowRemoveMatteOption: 0
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/MaxSdk/Resources/Images/uninstall_icon.png b/Assets/MaxSdk/Resources/Images/uninstall_icon.png
new file mode 100644
index 0000000..3b55354
Binary files /dev/null and b/Assets/MaxSdk/Resources/Images/uninstall_icon.png differ
diff --git a/Assets/MaxSdk/Resources/Images/uninstall_icon.png.meta b/Assets/MaxSdk/Resources/Images/uninstall_icon.png.meta
new file mode 100644
index 0000000..0f39816
--- /dev/null
+++ b/Assets/MaxSdk/Resources/Images/uninstall_icon.png.meta
@@ -0,0 +1,94 @@
+fileFormatVersion: 2
+guid: d24994f48fdd0430692e3d49279cd782
+labels:
+- al_max
+- al_max_export_path-MaxSdk/Resources/Images/uninstall_icon.png
+TextureImporter:
+ internalIDToNameTable: []
+ externalObjects: {}
+ serializedVersion: 10
+ mipmaps:
+ mipMapMode: 0
+ enableMipMap: 1
+ sRGBTexture: 1
+ linearTexture: 0
+ fadeOut: 0
+ borderMipMap: 0
+ mipMapsPreserveCoverage: 0
+ alphaTestReferenceValue: 0.5
+ mipMapFadeDistanceStart: 1
+ mipMapFadeDistanceEnd: 3
+ bumpmap:
+ convertToNormalMap: 0
+ externalNormalMap: 0
+ heightScale: 0.25
+ normalMapFilter: 0
+ isReadable: 0
+ streamingMipmaps: 0
+ streamingMipmapsPriority: 0
+ grayScaleToAlpha: 0
+ generateCubemap: 6
+ cubemapConvolution: 0
+ seamlessCubemap: 0
+ textureFormat: 1
+ maxTextureSize: 2048
+ textureSettings:
+ serializedVersion: 2
+ filterMode: -1
+ aniso: -1
+ mipBias: -100
+ wrapU: -1
+ wrapV: -1
+ wrapW: -1
+ nPOTScale: 1
+ lightmap: 0
+ compressionQuality: 50
+ spriteMode: 0
+ spriteExtrude: 1
+ spriteMeshType: 1
+ alignment: 0
+ spritePivot: {x: 0.5, y: 0.5}
+ spritePixelsToUnits: 100
+ spriteBorder: {x: 0, y: 0, z: 0, w: 0}
+ spriteGenerateFallbackPhysicsShape: 1
+ alphaUsage: 1
+ alphaIsTransparency: 0
+ spriteTessellationDetail: -1
+ textureType: 0
+ textureShape: 1
+ singleChannelComponent: 0
+ maxTextureSizeSet: 0
+ compressionQualitySet: 0
+ textureFormatSet: 0
+ platformSettings:
+ - serializedVersion: 3
+ buildTarget: DefaultTexturePlatform
+ maxTextureSize: 2048
+ resizeAlgorithm: 0
+ textureFormat: -1
+ textureCompression: 1
+ compressionQuality: 50
+ crunchedCompression: 0
+ allowsAlphaSplitting: 0
+ overridden: 0
+ androidETC2FallbackOverride: 0
+ forceMaximumCompressionQuality_BC6H_BC7: 0
+ spriteSheet:
+ serializedVersion: 2
+ sprites: []
+ outline: []
+ physicsShape: []
+ bones: []
+ spriteID:
+ internalID: 0
+ vertices: []
+ indices:
+ edges: []
+ weights: []
+ secondaryTextures: []
+ spritePackingTag:
+ pSDRemoveMatte: 0
+ pSDShowRemoveMatteOption: 0
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/MaxSdk/Resources/Images/warning_icon.png b/Assets/MaxSdk/Resources/Images/warning_icon.png
new file mode 100644
index 0000000..cc9660e
Binary files /dev/null and b/Assets/MaxSdk/Resources/Images/warning_icon.png differ
diff --git a/Assets/MaxSdk/Resources/Images/warning_icon.png.meta b/Assets/MaxSdk/Resources/Images/warning_icon.png.meta
new file mode 100644
index 0000000..ee4941c
--- /dev/null
+++ b/Assets/MaxSdk/Resources/Images/warning_icon.png.meta
@@ -0,0 +1,91 @@
+fileFormatVersion: 2
+guid: b504c956e7ed744b6b0e7f014e1cac5a
+labels:
+- al_max
+- al_max_export_path-MaxSdk/Resources/Images/warning_icon.png
+TextureImporter:
+ fileIDToRecycleName: {}
+ externalObjects: {}
+ serializedVersion: 9
+ mipmaps:
+ mipMapMode: 0
+ enableMipMap: 1
+ sRGBTexture: 1
+ linearTexture: 0
+ fadeOut: 0
+ borderMipMap: 0
+ mipMapsPreserveCoverage: 0
+ alphaTestReferenceValue: 0.5
+ mipMapFadeDistanceStart: 1
+ mipMapFadeDistanceEnd: 3
+ bumpmap:
+ convertToNormalMap: 0
+ externalNormalMap: 0
+ heightScale: 0.25
+ normalMapFilter: 0
+ isReadable: 0
+ streamingMipmaps: 0
+ streamingMipmapsPriority: 0
+ grayScaleToAlpha: 0
+ generateCubemap: 6
+ cubemapConvolution: 0
+ seamlessCubemap: 0
+ textureFormat: 1
+ maxTextureSize: 2048
+ textureSettings:
+ serializedVersion: 2
+ filterMode: -1
+ aniso: -1
+ mipBias: -100
+ wrapU: -1
+ wrapV: -1
+ wrapW: -1
+ nPOTScale: 1
+ lightmap: 0
+ compressionQuality: 50
+ spriteMode: 0
+ spriteExtrude: 1
+ spriteMeshType: 1
+ alignment: 0
+ spritePivot: {x: 0.5, y: 0.5}
+ spritePixelsToUnits: 100
+ spriteBorder: {x: 0, y: 0, z: 0, w: 0}
+ spriteGenerateFallbackPhysicsShape: 1
+ alphaUsage: 1
+ alphaIsTransparency: 0
+ spriteTessellationDetail: -1
+ textureType: 0
+ textureShape: 1
+ singleChannelComponent: 0
+ maxTextureSizeSet: 0
+ compressionQualitySet: 0
+ textureFormatSet: 0
+ platformSettings:
+ - serializedVersion: 2
+ buildTarget: DefaultTexturePlatform
+ maxTextureSize: 2048
+ resizeAlgorithm: 0
+ textureFormat: -1
+ textureCompression: 1
+ compressionQuality: 50
+ crunchedCompression: 0
+ allowsAlphaSplitting: 0
+ overridden: 0
+ androidETC2FallbackOverride: 0
+ spriteSheet:
+ serializedVersion: 2
+ sprites: []
+ outline: []
+ physicsShape: []
+ bones: []
+ spriteID:
+ vertices: []
+ indices:
+ edges: []
+ weights: []
+ spritePackingTag:
+ pSDRemoveMatte: 0
+ pSDShowRemoveMatteOption: 0
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/MaxSdk/Scripts.meta b/Assets/MaxSdk/Scripts.meta
new file mode 100644
index 0000000..db94d67
--- /dev/null
+++ b/Assets/MaxSdk/Scripts.meta
@@ -0,0 +1,8 @@
+fileFormatVersion: 2
+guid: b54f71ab59d7b492da373a6ae2e68337
+folderAsset: yes
+DefaultImporter:
+ externalObjects: {}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/MaxSdk/Scripts/IntegrationManager.meta b/Assets/MaxSdk/Scripts/IntegrationManager.meta
new file mode 100644
index 0000000..39f65cc
--- /dev/null
+++ b/Assets/MaxSdk/Scripts/IntegrationManager.meta
@@ -0,0 +1,11 @@
+fileFormatVersion: 2
+guid: e01816bc45c944d03afb95d035caf0e1
+labels:
+- al_max
+- al_max_export_path-MaxSdk/Scripts/IntegrationManager
+folderAsset: yes
+DefaultImporter:
+ externalObjects: {}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/MaxSdk/Scripts/IntegrationManager/Editor.meta b/Assets/MaxSdk/Scripts/IntegrationManager/Editor.meta
new file mode 100644
index 0000000..1d8400a
--- /dev/null
+++ b/Assets/MaxSdk/Scripts/IntegrationManager/Editor.meta
@@ -0,0 +1,11 @@
+fileFormatVersion: 2
+guid: 0da229e279400497786c39933fe02e52
+labels:
+- al_max
+- al_max_export_path-MaxSdk/Scripts/IntegrationManager/Editor
+folderAsset: yes
+DefaultImporter:
+ externalObjects: {}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/MaxSdk/Scripts/IntegrationManager/Editor/AppLovinAutoUpdater.cs b/Assets/MaxSdk/Scripts/IntegrationManager/Editor/AppLovinAutoUpdater.cs
new file mode 100644
index 0000000..922518e
--- /dev/null
+++ b/Assets/MaxSdk/Scripts/IntegrationManager/Editor/AppLovinAutoUpdater.cs
@@ -0,0 +1,171 @@
+//
+// AppLovinAutoUpdater.cs
+// AppLovin MAX Unity Plugin
+//
+// Created by Santosh Bagadi on 1/27/20.
+// Copyright © 2020 AppLovin. All rights reserved.
+//
+
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using UnityEditor;
+
+namespace AppLovinMax.Scripts.IntegrationManager.Editor
+{
+ ///
+ /// Handles auto updates for AppLovin MAX plugin.
+ ///
+ public static class AppLovinAutoUpdater
+ {
+ public const string KeyAutoUpdateEnabled = "com.applovin.auto_update_enabled";
+ private const string KeyLastUpdateCheckTime = "com.applovin.last_update_check_time_v2"; // Updated to v2 to force adapter version checks in plugin version 3.1.10.
+ private static readonly DateTime EpochTime = new DateTime(1970, 1, 1, 0, 0, 0, DateTimeKind.Utc);
+ private static readonly int SecondsInADay = (int) TimeSpan.FromDays(1).TotalSeconds;
+
+ // TODO: Make this list dynamic.
+ public static readonly Dictionary MinAdapterVersions = new Dictionary()
+ {
+ {"ADMOB_NETWORK", "android_23.3.0.1_ios_11.9.0.1"},
+ {"BIDMACHINE_NETWORK", "android_3.0.1.1_ios_3.0.0.0.1"},
+ {"CHARTBOOST_NETWORK", "android_9.7.0.3_ios_9.7.0.2"},
+ {"FACEBOOK_MEDIATE", "android_6.17.0.1_ios_6.15.2.1"},
+ {"FYBER_NETWORK", "android_8.3.1.1_ios_8.3.2.1"},
+ {"GOOGLE_AD_MANAGER_NETWORK", "android_23.3.0.1_ios_11.9.0.1"},
+ {"HYPRMX_NETWORK", "android_6.4.2.1_ios_6.4.1.0.1"},
+ {"INMOBI_NETWORK", "android_10.7.7.1_ios_10.7.5.1"},
+ {"IRONSOURCE_NETWORK", "android_8.3.0.0.2_ios_8.3.0.0.1"},
+ {"LINE_NETWORK", "android_2024.8.27.1_ios_2.8.20240827.1"},
+ {"MINTEGRAL_NETWORK", "android_16.8.51.1_ios_7.7.2.0.1"},
+ {"MOBILEFUSE_NETWORK", "android_1.7.6.1_ios_1.7.6.1"},
+ {"MOLOCO_NETWORK", "android_3.1.0.1_ios_3.1.3.1"},
+ {"MYTARGET_NETWORK", "android_5.22.1.1_ios_5.21.7.1"},
+ {"PUBMATIC_NETWORK", "android_3.9.0.2_ios_3.9.0.2"},
+ {"SMAATO_NETWORK", "android_22.7.0.1_ios_22.8.4.1"},
+ {"TIKTOK_NETWORK", "android_6.2.0.5.2_ios_6.2.0.7.2"},
+ {"UNITY_NETWORK", "android_4.12.2.1_ios_4.12.2.1"},
+ {"VERVE_NETWORK", "android_3.0.4.1_ios_3.0.4.1"},
+ {"VUNGLE_NETWORK", "android_7.4.1.1_ios_7.4.1.1"},
+ {"YANDEX_NETWORK", "android_7.4.0.1_ios_2.18.0.1"},
+ };
+
+ ///
+ /// Checks if a new version of the plugin is available and prompts the user to update if one is available.
+ ///
+ public static void Update()
+ {
+ var now = (int) (DateTime.UtcNow - EpochTime).TotalSeconds;
+ if (EditorPrefs.HasKey(KeyLastUpdateCheckTime))
+ {
+ var elapsedTime = now - EditorPrefs.GetInt(KeyLastUpdateCheckTime);
+
+ // Check if we have checked for a new version in the last 24 hrs and skip update if we have.
+ if (elapsedTime < SecondsInADay) return;
+ }
+
+ // Update last checked time.
+ EditorPrefs.SetInt(KeyLastUpdateCheckTime, now);
+
+ // Load the plugin data
+ AppLovinEditorCoroutine.StartCoroutine(AppLovinIntegrationManager.Instance.LoadPluginData(data =>
+ {
+ if (data == null) return;
+
+ ShowPluginUpdateDialogIfNeeded(data);
+ ShowNetworkAdaptersUpdateDialogIfNeeded(data.MediatedNetworks);
+ ShowGoogleNetworkAdaptersUpdateDialogIfNeeded(data.MediatedNetworks);
+ }));
+ }
+
+ private static void ShowPluginUpdateDialogIfNeeded(PluginData data)
+ {
+ // Check if publisher has disabled auto update.
+ if (!EditorPrefs.GetBool(KeyAutoUpdateEnabled, true)) return;
+
+ // Check if the current and latest version are the same or if the publisher is on a newer version (on beta). If so, skip update.
+ var comparison = data.AppLovinMax.CurrentToLatestVersionComparisonResult;
+ if (comparison == MaxSdkUtils.VersionComparisonResult.Equal || comparison == MaxSdkUtils.VersionComparisonResult.Greater) return;
+
+ // A new version of the plugin is available. Show a dialog to the publisher.
+ var option = EditorUtility.DisplayDialogComplex(
+ "AppLovin MAX Plugin Update",
+ "A new version of AppLovin MAX plugin is available for download. Update now?",
+ "Download",
+ "Not Now",
+ "Don't Ask Again");
+
+ if (option == 0) // Download
+ {
+ MaxSdkLogger.UserDebug("Downloading plugin...");
+ AppLovinEditorCoroutine.StartCoroutine(AppLovinIntegrationManager.Instance.DownloadPlugin(data.AppLovinMax));
+ }
+ else if (option == 1) // Not Now
+ {
+ // Do nothing
+ MaxSdkLogger.UserDebug("Update postponed.");
+ }
+ else if (option == 2) // Don't Ask Again
+ {
+ MaxSdkLogger.UserDebug("Auto Update disabled. You can enable it again from the AppLovin Integration Manager");
+ EditorPrefs.SetBool(KeyAutoUpdateEnabled, false);
+ }
+ }
+
+ private static void ShowNetworkAdaptersUpdateDialogIfNeeded(Network[] networks)
+ {
+ var networksToUpdate = networks.Where(network => network.RequiresUpdate).ToList();
+
+ // If all networks are above the required version, do nothing.
+ if (networksToUpdate.Count <= 0) return;
+
+ // We found a few adapters that are not compatible with the current SDK, show alert.
+ var message = "The following network adapters are not compatible with the current version of AppLovin MAX Plugin:\n";
+ foreach (var networkName in networksToUpdate)
+ {
+ message += "\n- ";
+ message += networkName.DisplayName + " (Requires " + MinAdapterVersions[networkName.Name] + " or newer)";
+ }
+
+ message += "\n\nPlease update them to the latest versions to avoid any issues.";
+
+ AppLovinIntegrationManager.ShowBuildFailureDialog(message);
+ }
+
+ private static void ShowGoogleNetworkAdaptersUpdateDialogIfNeeded(Network[] networks)
+ {
+ // AdMob and GAM use the same SDKs so their adapters should use the same underlying SDK version.
+ var googleNetwork = networks.FirstOrDefault(network => network.Name.Equals("ADMOB_NETWORK"));
+ var googleAdManagerNetwork = networks.FirstOrDefault(network => network.Name.Equals("GOOGLE_AD_MANAGER_NETWORK"));
+
+ // If both AdMob and GAM are not integrated, do nothing.
+ if (googleNetwork == null || string.IsNullOrEmpty(googleNetwork.CurrentVersions.Unity) ||
+ googleAdManagerNetwork == null || string.IsNullOrEmpty(googleAdManagerNetwork.CurrentVersions.Unity)) return;
+
+ var isAndroidVersionCompatible = GoogleNetworkAdaptersCompatible(googleNetwork.CurrentVersions.Android, googleAdManagerNetwork.CurrentVersions.Android, "19.8.0.0");
+ var isIosVersionCompatible = GoogleNetworkAdaptersCompatible(googleNetwork.CurrentVersions.Ios, googleAdManagerNetwork.CurrentVersions.Ios, "8.0.0.0");
+
+ if (isAndroidVersionCompatible && isIosVersionCompatible) return;
+
+ var message = "You may see unexpected errors if you use different versions of the AdMob and Google Ad Manager adapter SDKs. " +
+ "AdMob and Google Ad Manager share the same SDKs.\n\n" +
+ "You can be sure that you are using the same SDK for both if the first three numbers in each adapter version match.";
+
+ AppLovinIntegrationManager.ShowBuildFailureDialog(message);
+ }
+
+ private static bool GoogleNetworkAdaptersCompatible(string googleVersion, string googleAdManagerVersion, string breakingVersion)
+ {
+ var googleResult = MaxSdkUtils.CompareVersions(googleVersion, breakingVersion);
+ var googleAdManagerResult = MaxSdkUtils.CompareVersions(googleAdManagerVersion, breakingVersion);
+
+ // If one is less than the breaking version and the other is not, they are not compatible.
+ if (googleResult == MaxSdkUtils.VersionComparisonResult.Lesser &&
+ googleAdManagerResult != MaxSdkUtils.VersionComparisonResult.Lesser) return false;
+
+ if (googleAdManagerResult == MaxSdkUtils.VersionComparisonResult.Lesser &&
+ googleResult != MaxSdkUtils.VersionComparisonResult.Lesser) return false;
+
+ return true;
+ }
+ }
+}
diff --git a/Assets/MaxSdk/Scripts/IntegrationManager/Editor/AppLovinAutoUpdater.cs.meta b/Assets/MaxSdk/Scripts/IntegrationManager/Editor/AppLovinAutoUpdater.cs.meta
new file mode 100644
index 0000000..0070e74
--- /dev/null
+++ b/Assets/MaxSdk/Scripts/IntegrationManager/Editor/AppLovinAutoUpdater.cs.meta
@@ -0,0 +1,14 @@
+fileFormatVersion: 2
+guid: 8bcdd5226273242c5bd9ec79568202e6
+labels:
+- al_max
+- al_max_export_path-MaxSdk/Scripts/IntegrationManager/Editor/AppLovinAutoUpdater.cs
+MonoImporter:
+ externalObjects: {}
+ serializedVersion: 2
+ defaultReferences: []
+ executionOrder: 0
+ icon: {instanceID: 0}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/MaxSdk/Scripts/IntegrationManager/Editor/AppLovinCommandLine.cs b/Assets/MaxSdk/Scripts/IntegrationManager/Editor/AppLovinCommandLine.cs
new file mode 100644
index 0000000..28cb496
--- /dev/null
+++ b/Assets/MaxSdk/Scripts/IntegrationManager/Editor/AppLovinCommandLine.cs
@@ -0,0 +1,94 @@
+//
+// AppLovinBuildPostProcessor.cs
+// AppLovin MAX Unity Plugin
+//
+// Created by Santosh Bagadi on 10/30/19.
+// Copyright © 2019 AppLovin. All rights reserved.
+//
+
+#if UNITY_IOS || UNITY_IPHONE
+
+using System.Diagnostics;
+using System.IO;
+
+namespace AppLovinMax.Scripts.IntegrationManager.Editor
+{
+ ///
+ /// A helper class to run command line tools.
+ ///
+ /// TODO: Currently only supports shell (Linux). Add support for Windows machines.
+ ///
+ public static class AppLovinCommandLine
+ {
+ ///
+ /// Result obtained by running a command line command.
+ ///
+ public class Result
+ {
+ ///
+ /// Standard output stream from command line.
+ ///
+ public string StandardOutput;
+
+ ///
+ /// Standard error stream from command line.
+ ///
+ public string StandardError;
+
+ ///
+ /// Exit code returned from command line.
+ ///
+ public int ExitCode;
+
+ ///
+ /// The description of the result that can be used for error logging.
+ ///
+ public string Message;
+ }
+
+ ///
+ /// Runs a command line tool using the provided and .
+ ///
+ /// The tool path to run
+ /// The arguments to be passed to the command line tool
+ /// The directory from which to run this command.
+ ///
+ public static Result Run(string toolPath, string arguments, string workingDirectory)
+ {
+ var stdoutFileName = Path.GetTempFileName();
+ var stderrFileName = Path.GetTempFileName();
+
+ var process = new Process();
+ process.StartInfo.UseShellExecute = true;
+ process.StartInfo.CreateNoWindow = false;
+ process.StartInfo.RedirectStandardInput = false;
+ process.StartInfo.RedirectStandardOutput = false;
+ process.StartInfo.RedirectStandardError = false;
+
+ process.StartInfo.WorkingDirectory = workingDirectory;
+ process.StartInfo.FileName = "bash";
+ process.StartInfo.Arguments = string.Format("-l -c '\"{0}\" {1} 1> {2} 2> {3}'", toolPath, arguments, stdoutFileName, stderrFileName);
+ process.Start();
+
+ process.WaitForExit();
+
+ var stdout = File.ReadAllText(stdoutFileName);
+ var stderr = File.ReadAllText(stderrFileName);
+
+ File.Delete(stdoutFileName);
+ File.Delete(stderrFileName);
+
+ var result = new Result();
+ result.StandardOutput = stdout;
+ result.StandardError = stderr;
+ result.ExitCode = process.ExitCode;
+
+ var messagePrefix = result.ExitCode == 0 ? "Command executed successfully" : "Failed to run command";
+ result.Message = string.Format("{0}: '{1} {2}'\nstdout: {3}\nstderr: {4}\nExit code: {5}", messagePrefix, toolPath, arguments, stdout, stderr, process.ExitCode);
+
+ return result;
+ }
+ }
+}
+
+#endif
diff --git a/Assets/MaxSdk/Scripts/IntegrationManager/Editor/AppLovinCommandLine.cs.meta b/Assets/MaxSdk/Scripts/IntegrationManager/Editor/AppLovinCommandLine.cs.meta
new file mode 100644
index 0000000..2c3ff20
--- /dev/null
+++ b/Assets/MaxSdk/Scripts/IntegrationManager/Editor/AppLovinCommandLine.cs.meta
@@ -0,0 +1,14 @@
+fileFormatVersion: 2
+guid: 2d0aa55f9a7d2440f871dfb256372a33
+labels:
+- al_max
+- al_max_export_path-MaxSdk/Scripts/IntegrationManager/Editor/AppLovinCommandLine.cs
+MonoImporter:
+ externalObjects: {}
+ serializedVersion: 2
+ defaultReferences: []
+ executionOrder: 0
+ icon: {instanceID: 0}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/MaxSdk/Scripts/IntegrationManager/Editor/AppLovinEditorCoroutine.cs b/Assets/MaxSdk/Scripts/IntegrationManager/Editor/AppLovinEditorCoroutine.cs
new file mode 100644
index 0000000..f5be939
--- /dev/null
+++ b/Assets/MaxSdk/Scripts/IntegrationManager/Editor/AppLovinEditorCoroutine.cs
@@ -0,0 +1,91 @@
+//
+// AppLovinEditorCoroutine.cs
+// AppLovin MAX Unity Plugin
+//
+// Created by Santosh Bagadi on 7/25/19.
+// Copyright © 2019 AppLovin. All rights reserved.
+//
+
+using System.Collections;
+using System.Collections.Generic;
+using UnityEditor;
+
+namespace AppLovinMax.Scripts.IntegrationManager.Editor
+{
+ ///
+ /// A coroutine that can update based on editor application update.
+ ///
+ public class AppLovinEditorCoroutine
+ {
+ ///
+ /// Keeps track of the coroutine currently running.
+ ///
+ private IEnumerator enumerator;
+
+ ///
+ /// Keeps track of coroutines that have yielded to the current enumerator.
+ ///
+ private readonly List history = new List();
+
+ private AppLovinEditorCoroutine(IEnumerator enumerator)
+ {
+ this.enumerator = enumerator;
+ }
+
+ ///
+ /// Creates and starts a coroutine.
+ ///
+ /// The coroutine to be started
+ /// The coroutine that has been started.
+ public static AppLovinEditorCoroutine StartCoroutine(IEnumerator enumerator)
+ {
+ var coroutine = new AppLovinEditorCoroutine(enumerator);
+ coroutine.Start();
+ return coroutine;
+ }
+
+ private void Start()
+ {
+ EditorApplication.update += OnEditorUpdate;
+ }
+
+ ///
+ /// Stops the coroutine.
+ ///
+ public void Stop()
+ {
+ if (EditorApplication.update == null) return;
+
+ EditorApplication.update -= OnEditorUpdate;
+ }
+
+ private void OnEditorUpdate()
+ {
+ if (enumerator.MoveNext())
+ {
+ // If there is a coroutine to yield for inside the coroutine, add the initial one to history and continue the second one
+ if (enumerator.Current is IEnumerator)
+ {
+ history.Add(enumerator);
+ enumerator = (IEnumerator) enumerator.Current;
+ }
+ }
+ else
+ {
+ // Current coroutine has ended, check if we have more coroutines in history to be run.
+ if (history.Count == 0)
+ {
+ // No more coroutines to run, stop updating.
+ Stop();
+ }
+ // Step out and finish the code in the coroutine that yielded to it
+ else
+ {
+ var index = history.Count - 1;
+ enumerator = history[index];
+ history.RemoveAt(index);
+ }
+ }
+ }
+ }
+}
diff --git a/Assets/MaxSdk/Scripts/IntegrationManager/Editor/AppLovinEditorCoroutine.cs.meta b/Assets/MaxSdk/Scripts/IntegrationManager/Editor/AppLovinEditorCoroutine.cs.meta
new file mode 100644
index 0000000..c622bab
--- /dev/null
+++ b/Assets/MaxSdk/Scripts/IntegrationManager/Editor/AppLovinEditorCoroutine.cs.meta
@@ -0,0 +1,14 @@
+fileFormatVersion: 2
+guid: 95747c688378548eeb92aeb528ac96ff
+labels:
+- al_max
+- al_max_export_path-MaxSdk/Scripts/IntegrationManager/Editor/AppLovinEditorCoroutine.cs
+MonoImporter:
+ externalObjects: {}
+ serializedVersion: 2
+ defaultReferences: []
+ executionOrder: 0
+ icon: {instanceID: 0}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/MaxSdk/Scripts/IntegrationManager/Editor/AppLovinInitialize.cs b/Assets/MaxSdk/Scripts/IntegrationManager/Editor/AppLovinInitialize.cs
new file mode 100644
index 0000000..7c1cdc8
--- /dev/null
+++ b/Assets/MaxSdk/Scripts/IntegrationManager/Editor/AppLovinInitialize.cs
@@ -0,0 +1,146 @@
+//
+// MaxInitialization.cs
+// AppLovin MAX Unity Plugin
+//
+// Created by Thomas So on 5/24/19.
+// Copyright © 2019 AppLovin. All rights reserved.
+//
+
+using System.Collections.Generic;
+using System.IO;
+using UnityEditor;
+
+namespace AppLovinMax.Scripts.IntegrationManager.Editor
+{
+ [InitializeOnLoad]
+ public class AppLovinInitialize
+ {
+ private static readonly List ObsoleteNetworks = new List
+ {
+ "AdColony",
+ "Criteo",
+ "Nend",
+ "Snap",
+ "Tapjoy",
+ "VerizonAds",
+ "VoodooAds"
+ };
+
+ private static readonly List ObsoleteFileExportPathsToDelete = new List
+ {
+ // The `MaxSdk/Scripts/Editor` folder contents have been moved into `MaxSdk/Scripts/IntegrationManager/Editor`.
+ "MaxSdk/Scripts/Editor",
+ "MaxSdk/Scripts/Editor.meta",
+
+ // The `EventSystemChecker` has been renamed to `MaxEventSystemChecker`.
+ "MaxSdk/Scripts/EventSystemChecker.cs",
+ "MaxSdk/Scripts/EventSystemChecker.cs.meta",
+
+ // Google AdMob adapter pre/post process scripts. The logic has been migrated to the main plugin.
+ "MaxSdk/Mediation/Google/Editor/MaxGoogleInitialize.cs",
+ "MaxSdk/Mediation/Google/Editor/MaxGoogleInitialize.cs.meta",
+ "MaxSdk/Mediation/Google/Editor/MaxMediationGoogleUtils.cs",
+ "MaxSdk/Mediation/Google/Editor/MaxMediationGoogleUtils.cs.meta",
+ "MaxSdk/Mediation/Google/Editor/PostProcessor.cs",
+ "MaxSdk/Mediation/Google/Editor/PostProcessor.cs.meta",
+ "MaxSdk/Mediation/Google/Editor/PreProcessor.cs",
+ "MaxSdk/Mediation/Google/Editor/PreProcessor.cs.meta",
+ "MaxSdk/Mediation/Google/Editor/MaxSdk.Mediation.Google.Editor.asmdef",
+ "MaxSdk/Mediation/Google/MaxSdk.Mediation.Google.Editor.asmdef.meta",
+ "Plugins/Android/MaxMediationGoogle.androidlib",
+ "Plugins/Android/MaxMediationGoogle.androidlib.meta",
+
+ // Google Ad Manager adapter pre/post process scripts. The logic has been migrated to the main plugin.
+ "MaxSdk/Mediation/GoogleAdManager/Editor/MaxGoogleAdManagerInitialize.cs",
+ "MaxSdk/Mediation/GoogleAdManager/Editor/MaxGoogleAdManagerInitialize.cs.meta",
+ "MaxSdk/Mediation/GoogleAdManager/Editor/PostProcessor.cs",
+ "MaxSdk/Mediation/GoogleAdManager/Editor/PostProcessor.cs.meta",
+ "MaxSdk/Mediation/GoogleAdManager/Editor/MaxSdk.Mediation.GoogleAdManager.Editor.asmdef",
+ "MaxSdk/Mediation/GoogleAdManager/Editor/MaxSdk.Mediation.GoogleAdManager.Editor.asmdef.meta",
+ "Plugins/Android/MaxMediationGoogleAdManager.androidlib",
+ "Plugins/Android/MaxMediationGoogleAdManager.androidlib.meta",
+
+ // The `VariableService` has been removed.
+ "MaxSdk/Scripts/MaxVariableServiceAndroid.cs",
+ "MaxSdk/Scripts/MaxVariableServiceAndroid.cs.meta",
+ "MaxSdk/Scripts/MaxVariableServiceiOS.cs",
+ "MaxSdk/Scripts/MaxVariableServiceiOS.cs.meta",
+ "MaxSdk/Scripts/MaxVariableServiceUnityEditor.cs",
+ "MaxSdk/Scripts/MaxVariableServiceUnityEditor.cs.meta",
+
+ // The `MaxSdk/Scripts/Editor` folder contents have been moved into `MaxSdk/Scripts/IntegrationManager/Editor`.
+ "MaxSdk/Version.md",
+ "MaxSdk/Version.md.meta",
+
+ // The alert_icon.png has been renamed to error_icon.png.
+ "MaxSdk/Resources/Images/alert_icon.png",
+ "MaxSdk/Resources/Images/alert_icon.png.meta",
+
+ // `TargetingData` has been removed and we no longer set `UserSegment` through the Unity Plugin.
+ "MaxSdk/Scripts/MaxUserSegment.cs",
+ "MaxSdk/Scripts/MaxUserSegment.cs.meta",
+ "MaxSdk/Scripts/MaxTargetingData.cs",
+ "MaxSdk/Scripts/MaxTargetingData.cs.meta"
+ };
+
+ static AppLovinInitialize()
+ {
+ // Don't run obsolete file cleanup logic when entering play mode.
+ if (EditorApplication.isPlayingOrWillChangePlaymode) return;
+
+#if UNITY_IOS
+ // Check that the publisher is targeting iOS 9.0+
+ if (!PlayerSettings.iOS.targetOSVersionString.StartsWith("9.") && !PlayerSettings.iOS.targetOSVersionString.StartsWith("1"))
+ {
+ MaxSdkLogger.UserError("Detected iOS project version less than iOS 9 - The AppLovin MAX SDK WILL NOT WORK ON < iOS9!!!");
+ }
+#endif
+
+ var isPluginInPackageManager = AppLovinIntegrationManager.IsPluginInPackageManager;
+ if (!isPluginInPackageManager)
+ {
+ var changesMade = false;
+ foreach (var obsoleteFileExportPathToDelete in ObsoleteFileExportPathsToDelete)
+ {
+ var pathToDelete = MaxSdkUtils.GetAssetPathForExportPath(obsoleteFileExportPathToDelete);
+ if (CheckExistence(pathToDelete))
+ {
+ MaxSdkLogger.UserDebug("Deleting obsolete file '" + pathToDelete + "' that is no longer needed.");
+ FileUtil.DeleteFileOrDirectory(pathToDelete);
+ changesMade = true;
+ }
+ }
+
+ var pluginParentDir = AppLovinIntegrationManager.PluginParentDirectory;
+ // Check if any obsolete networks are installed
+ foreach (var obsoleteNetwork in ObsoleteNetworks)
+ {
+ var networkDir = Path.Combine(pluginParentDir, "MaxSdk/Mediation/" + obsoleteNetwork);
+ if (CheckExistence(networkDir))
+ {
+ MaxSdkLogger.UserDebug("Deleting obsolete network " + obsoleteNetwork + " from path " + networkDir + "...");
+ FileUtil.DeleteFileOrDirectory(networkDir);
+ FileUtil.DeleteFileOrDirectory(networkDir + ".meta");
+ changesMade = true;
+ }
+ }
+
+ // Refresh UI
+ if (changesMade)
+ {
+ AssetDatabase.Refresh();
+ MaxSdkLogger.UserDebug("Obsolete networks and files removed.");
+ }
+ }
+
+ AppLovinAutoUpdater.Update();
+ }
+
+ private static bool CheckExistence(string location)
+ {
+ return File.Exists(location) ||
+ Directory.Exists(location) ||
+ (location.EndsWith("/*") && Directory.Exists(Path.GetDirectoryName(location)));
+ }
+ }
+}
diff --git a/Assets/MaxSdk/Scripts/IntegrationManager/Editor/AppLovinInitialize.cs.meta b/Assets/MaxSdk/Scripts/IntegrationManager/Editor/AppLovinInitialize.cs.meta
new file mode 100644
index 0000000..fb8a55c
--- /dev/null
+++ b/Assets/MaxSdk/Scripts/IntegrationManager/Editor/AppLovinInitialize.cs.meta
@@ -0,0 +1,14 @@
+fileFormatVersion: 2
+guid: 6b7dce7fe193a4058bc51d9f4d3a2aed
+labels:
+- al_max
+- al_max_export_path-MaxSdk/Scripts/IntegrationManager/Editor/AppLovinInitialize.cs
+MonoImporter:
+ externalObjects: {}
+ serializedVersion: 2
+ defaultReferences: []
+ executionOrder: 0
+ icon: {instanceID: 0}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/MaxSdk/Scripts/IntegrationManager/Editor/AppLovinIntegrationManager.cs b/Assets/MaxSdk/Scripts/IntegrationManager/Editor/AppLovinIntegrationManager.cs
new file mode 100644
index 0000000..38c3be3
--- /dev/null
+++ b/Assets/MaxSdk/Scripts/IntegrationManager/Editor/AppLovinIntegrationManager.cs
@@ -0,0 +1,514 @@
+//
+// MaxIntegrationManager.cs
+// AppLovin MAX Unity Plugin
+//
+// Created by Santosh Bagadi on 6/1/19.
+// Copyright © 2019 AppLovin. All rights reserved.
+//
+
+using System;
+using System.Collections;
+using System.IO;
+using AppLovinMax.Internal;
+using UnityEditor;
+using UnityEngine;
+using UnityEngine.Networking;
+
+namespace AppLovinMax.Scripts.IntegrationManager.Editor
+{
+ [Serializable]
+ public class PluginData
+ {
+ // ReSharper disable InconsistentNaming - Consistent with JSON data.
+ public Network AppLovinMax;
+ public Network[] MediatedNetworks;
+ public Network[] PartnerMicroSdks;
+ public DynamicLibraryToEmbed[] ThirdPartyDynamicLibrariesToEmbed;
+ public Alert[] Alerts;
+ }
+
+ [Serializable]
+ public class Network
+ {
+ //
+ // Sample network data:
+ //
+ // {
+ // "Name": "adcolony",
+ // "DisplayName": "AdColony",
+ // "DownloadUrl": "https://bintray.com/applovin/Unity-Mediation-Packages/download_file?file_path=AppLovin-AdColony-Adapters-Android-3.3.10.1-iOS-3.3.7.2.unitypackage",
+ // "PluginFileName": "AppLovin-AdColony-Adapters-Android-3.3.10.1-iOS-3.3.7.2.unitypackage",
+ // "DependenciesFilePath": "MaxSdk/Mediation/AdColony/Editor/Dependencies.xml",
+ // "LatestVersions" : {
+ // "Unity": "android_3.3.10.1_ios_3.3.7.2",
+ // "Android": "3.3.10.1",
+ // "Ios": "3.3.7.2"
+ // }
+ // }
+ //
+
+ // ReSharper disable InconsistentNaming - Consistent with JSON data.
+ public string Name;
+ public string DisplayName;
+ public string DownloadUrl;
+ public string DependenciesFilePath;
+ public PackageInfo[] Packages;
+ public string[] PluginFilePaths;
+ public Versions LatestVersions;
+ public DynamicLibraryToEmbed[] DynamicLibrariesToEmbed;
+
+ [NonSerialized] public Versions CurrentVersions;
+ [NonSerialized] public MaxSdkUtils.VersionComparisonResult CurrentToLatestVersionComparisonResult = MaxSdkUtils.VersionComparisonResult.Lesser;
+ [NonSerialized] public bool RequiresUpdate;
+ [NonSerialized] public bool IsCurrentlyInstalling;
+ }
+
+ [Serializable]
+ public class DynamicLibraryToEmbed
+ {
+ // ReSharper disable InconsistentNaming - Consistent with JSON data.
+ public string PodName;
+ public string[] FrameworkNames;
+
+ // Min and max versions are inclusive, so if the adapter is the min or max version, the xcframework will get embedded.
+ public string MinVersion;
+ public string MaxVersion;
+
+ public DynamicLibraryToEmbed(string podName, string[] frameworkNames, string minVersion, string maxVersion)
+ {
+ PodName = podName;
+ FrameworkNames = frameworkNames;
+ MinVersion = minVersion;
+ MaxVersion = maxVersion;
+ }
+ }
+
+ public enum Severity
+ {
+ Info,
+ Warning,
+ Error
+ }
+
+ [Serializable]
+ public class Alert
+ {
+ public string SeverityType;
+ public string Title;
+ public string Message;
+ public string Url;
+
+ public Severity Severity;
+
+ public void InitializeSeverityEnum()
+ {
+ switch (SeverityType)
+ {
+ case "INFO":
+ Severity = Severity.Info;
+ break;
+ case "WARNING":
+ Severity = Severity.Warning;
+ break;
+ case "ERROR":
+ Severity = Severity.Error;
+ break;
+ default:
+ MaxSdkLogger.E(string.Format("Alert <{0}> has unsupported severity type <{1}>.", Title, SeverityType));
+ Severity = Severity.Info;
+ break;
+ }
+ }
+ }
+
+ ///
+ /// A helper data class used to get current versions from Dependency.xml files.
+ ///
+ [Serializable]
+ public class Versions
+ {
+ // ReSharper disable InconsistentNaming - Consistent with JSON data.
+ public string Unity;
+ public string Android;
+ public string Ios;
+
+ public override bool Equals(object value)
+ {
+ var versions = value as Versions;
+
+ return versions != null
+ && Unity.Equals(versions.Unity)
+ && (Android == null || Android.Equals(versions.Android))
+ && (Ios == null || Ios.Equals(versions.Ios));
+ }
+
+ public bool HasEqualSdkVersions(Versions versions)
+ {
+ return versions != null
+ && AdapterSdkVersion(Android).Equals(AdapterSdkVersion(versions.Android))
+ && AdapterSdkVersion(Ios).Equals(AdapterSdkVersion(versions.Ios));
+ }
+
+ public override int GetHashCode()
+ {
+ return new {unity = Unity, android = Android, ios = Ios}.GetHashCode();
+ }
+
+ private static string AdapterSdkVersion(string adapterVersion)
+ {
+ if (string.IsNullOrEmpty(adapterVersion)) return "";
+
+ var index = adapterVersion.LastIndexOf(".", StringComparison.Ordinal);
+ return index > 0 ? adapterVersion.Substring(0, index) : adapterVersion;
+ }
+ }
+
+ ///
+ /// A manager class for MAX integration manager window.
+ ///
+ public class AppLovinIntegrationManager
+ {
+ ///
+ /// Delegate to be called when a plugin package's import is started.
+ ///
+ internal delegate void ImportPackageStartedCallback(Network network);
+
+ ///
+ /// Delegate to be called when a plugin package is finished importing.
+ ///
+ /// The network data for which the package is imported.
+ internal delegate void ImportPackageCompletedCallback(Network network);
+
+ private static readonly AppLovinIntegrationManager instance = new AppLovinIntegrationManager();
+
+ internal static readonly string GradleTemplatePath = Path.Combine("Assets/Plugins/Android", "mainTemplate.gradle");
+ private const string MaxSdkAssetExportPath = "MaxSdk/Scripts/MaxSdk.cs";
+ private const string MaxSdkMediationExportPath = "MaxSdk/Mediation";
+
+ private const string PluginDataEndpoint = "https://unity.applovin.com/max/1.0/integration_manager_info?plugin_version={0}";
+
+ private static string externalDependencyManagerVersion;
+
+ internal static ImportPackageStartedCallback OnImportPackageStartedCallback;
+ internal static ImportPackageCompletedCallback OnImportPackageCompletedCallback;
+
+ private MaxWebRequest maxWebRequest;
+ private Network importingNetwork;
+
+ ///
+ /// An Instance of the Integration manager.
+ ///
+ public static AppLovinIntegrationManager Instance
+ {
+ get { return instance; }
+ }
+
+ ///
+ /// The parent directory path where the MaxSdk plugin directory is placed.
+ ///
+ public static string PluginParentDirectory
+ {
+ get
+ {
+ // Search for the asset with the export path label.
+ // Paths are normalized using AltDirectorySeparatorChar (/) to ensure compatibility across platforms (in case of migrating a project from Windows to Mac or vice versa).
+ var maxSdkScriptAssetPath = MaxSdkUtils.GetAssetPathForExportPath(MaxSdkAssetExportPath);
+
+ // maxSdkScriptAssetPath will always have AltDirectorySeparatorChar (/) as the path separator. Convert to platform specific path.
+ return maxSdkScriptAssetPath.Replace(MaxSdkAssetExportPath, "")
+ .Replace(Path.AltDirectorySeparatorChar, Path.DirectorySeparatorChar);
+ }
+ }
+
+ public static string MediationDirectory
+ {
+ get
+ {
+ var mediationAssetPath = MaxSdkUtils.GetAssetPathForExportPath(MaxSdkMediationExportPath);
+ return mediationAssetPath.Replace(Path.AltDirectorySeparatorChar, Path.DirectorySeparatorChar);
+ }
+ }
+
+ ///
+ /// Whether or not the plugin is in the Unity Package Manager.
+ ///
+ public static bool IsPluginInPackageManager
+ {
+ get { return PluginParentDirectory.StartsWith("Packages"); }
+ }
+
+ ///
+ /// Whether or not gradle build system is enabled.
+ ///
+ public static bool GradleBuildEnabled
+ {
+ get { return GetEditorUserBuildSetting("androidBuildSystem", "").ToString().Equals("Gradle"); }
+ }
+
+ ///
+ /// Whether or not Gradle template is enabled.
+ ///
+ public static bool GradleTemplateEnabled
+ {
+ get { return GradleBuildEnabled && File.Exists(GradleTemplatePath); }
+ }
+
+ ///
+ /// Whether or not the Quality Service settings can be processed which requires Gradle template enabled or Unity IDE newer than version 2018_2.
+ ///
+ public static bool CanProcessAndroidQualityServiceSettings
+ {
+ get { return GradleTemplateEnabled || GradleBuildEnabled; }
+ }
+
+ ///
+ /// The External Dependency Manager version obtained dynamically.
+ ///
+ public static string ExternalDependencyManagerVersion
+ {
+ get
+ {
+ if (MaxSdkUtils.IsValidString(externalDependencyManagerVersion)) return externalDependencyManagerVersion;
+
+ try
+ {
+ var versionHandlerVersionNumberType = Type.GetType("Google.VersionHandlerVersionNumber, Google.VersionHandlerImpl");
+ externalDependencyManagerVersion = versionHandlerVersionNumberType.GetProperty("Value").GetValue(null, null).ToString();
+ }
+#pragma warning disable 0168
+ catch (Exception ignored)
+#pragma warning restore 0168
+ {
+ externalDependencyManagerVersion = "Failed to get version.";
+ }
+
+ return externalDependencyManagerVersion;
+ }
+ }
+
+ private AppLovinIntegrationManager()
+ {
+ AssetDatabase.importPackageStarted += packageName =>
+ {
+ if (!IsImportingNetwork(packageName)) return;
+
+ CallImportPackageStartedCallback(importingNetwork);
+ };
+
+ // Add asset import callbacks.
+ AssetDatabase.importPackageCompleted += packageName =>
+ {
+ if (!IsImportingNetwork(packageName)) return;
+
+ AssetDatabase.Refresh();
+
+ CallImportPackageCompletedCallback(importingNetwork);
+ importingNetwork = null;
+ };
+
+ AssetDatabase.importPackageCancelled += packageName =>
+ {
+ if (!IsImportingNetwork(packageName)) return;
+
+ importingNetwork = null;
+ };
+
+ AssetDatabase.importPackageFailed += (packageName, errorMessage) =>
+ {
+ if (!IsImportingNetwork(packageName)) return;
+
+ MaxSdkLogger.UserError(errorMessage);
+ importingNetwork = null;
+ };
+ }
+
+ static AppLovinIntegrationManager() { }
+
+ public static PluginData LoadPluginDataSync()
+ {
+ var url = string.Format(PluginDataEndpoint, MaxSdk.Version);
+ var webRequestConfig = new WebRequestConfig()
+ {
+ EndPoint = url,
+ };
+
+ var maxWebRequest = new MaxWebRequest(webRequestConfig);
+ var webResponse = maxWebRequest.SendSync();
+
+ return CreatePluginDataFromWebResponse(webResponse);
+ }
+
+ ///
+ /// Loads the plugin data to be display by integration manager window.
+ ///
+ /// Callback to be called once the plugin data download completes.
+ public IEnumerator LoadPluginData(Action callback)
+ {
+ var url = string.Format(PluginDataEndpoint, MaxSdk.Version);
+ var webRequestConfig = new WebRequestConfig()
+ {
+ EndPoint = url,
+ };
+
+ maxWebRequest = new MaxWebRequest(webRequestConfig);
+ yield return maxWebRequest.Send(webResponse =>
+ {
+ var pluginData = CreatePluginDataFromWebResponse(webResponse);
+ callback(pluginData);
+ });
+ }
+
+ private static PluginData CreatePluginDataFromWebResponse(WebResponse webResponse)
+ {
+ if (!webResponse.IsSuccess)
+ {
+ MaxSdkLogger.E("Failed to load plugin data. Please check your internet connection.");
+ return null;
+ }
+
+ PluginData pluginData;
+ try
+ {
+ pluginData = JsonUtility.FromJson(webResponse.ResponseMessage);
+ AppLovinPackageManager.PluginData = pluginData;
+ }
+ catch (Exception exception)
+ {
+ Console.WriteLine(exception);
+ pluginData = null;
+ }
+
+ if (pluginData == null) return null;
+
+ // Get current version of the plugin
+ var appLovinMax = pluginData.AppLovinMax;
+ AppLovinPackageManager.UpdateCurrentVersions(appLovinMax);
+
+ // Get current versions for all the mediation networks.
+ foreach (var network in pluginData.MediatedNetworks)
+ {
+ AppLovinPackageManager.UpdateCurrentVersions(network);
+ }
+
+ if (pluginData.PartnerMicroSdks != null)
+ {
+ foreach (var partnerMicroSdk in pluginData.PartnerMicroSdks)
+ {
+ AppLovinPackageManager.UpdateCurrentVersions(partnerMicroSdk);
+ }
+ }
+
+ if (pluginData.Alerts == null) return pluginData;
+
+ // Initiate Severity enums from the raw strings in the response
+ foreach (var alert in pluginData.Alerts)
+ {
+ alert.InitializeSeverityEnum();
+ }
+
+ return pluginData;
+ }
+
+ ///
+ /// Downloads the plugin file for a given network.
+ ///
+ /// Network for which to download the current version.
+ /// Whether or not to show the import window when downloading. Defaults to true .
+ ///
+ public IEnumerator DownloadPlugin(Network network, bool showImport = true)
+ {
+ var path = Path.Combine(Application.temporaryCachePath, GetPluginFileName(network)); // TODO: Maybe delete plugin file after finishing import.
+ var webRequestConfig = new WebRequestConfig()
+ {
+ DownloadHandler = new DownloadHandlerFile(path),
+ EndPoint = network.DownloadUrl
+ };
+
+ maxWebRequest = new MaxWebRequest(webRequestConfig);
+ yield return maxWebRequest.Send(webResponse =>
+ {
+ if (webResponse.IsSuccess)
+ {
+ importingNetwork = network;
+ AssetDatabase.ImportPackage(path, showImport);
+ }
+ else
+ {
+ MaxSdkLogger.UserError("Failed to download plugin package: " + webResponse.ErrorMessage);
+ }
+ });
+ }
+
+ ///
+ /// Cancels the plugin download if one is in progress.
+ ///
+ public void CancelDownload()
+ {
+ if (maxWebRequest == null) return;
+
+ maxWebRequest.Abort();
+ }
+
+ ///
+ /// Shows a dialog to the user with the given message and logs the error message to console.
+ ///
+ /// The failure message to be shown to the user.
+ public static void ShowBuildFailureDialog(string message)
+ {
+ var openIntegrationManager = EditorUtility.DisplayDialog("AppLovin MAX", message, "Open Integration Manager", "Dismiss");
+ if (openIntegrationManager)
+ {
+ AppLovinIntegrationManagerWindow.ShowManager();
+ }
+
+ MaxSdkLogger.UserError(message);
+ }
+
+ #region Utility Methods
+
+ ///
+ /// Checks whether or not the given package name is the currently importing package.
+ ///
+ /// The name of the package that needs to be checked.
+ /// true if the importing package matches the given package name.
+ private bool IsImportingNetwork(string packageName)
+ {
+ // Note: The pluginName doesn't have the '.unitypackage' extension included in its name but the pluginFileName does. So using Contains instead of Equals.
+ return importingNetwork != null && GetPluginFileName(importingNetwork).Contains(packageName);
+ }
+
+ private static void CallImportPackageStartedCallback(Network network)
+ {
+ if (OnImportPackageStartedCallback == null) return;
+
+ OnImportPackageStartedCallback(network);
+ }
+
+ private static void CallImportPackageCompletedCallback(Network network)
+ {
+ if (OnImportPackageCompletedCallback == null) return;
+
+ OnImportPackageCompletedCallback(network);
+ }
+
+ private static object GetEditorUserBuildSetting(string name, object defaultValue)
+ {
+ var editorUserBuildSettingsType = typeof(EditorUserBuildSettings);
+ var property = editorUserBuildSettingsType.GetProperty(name);
+ if (property != null)
+ {
+ var value = property.GetValue(null, null);
+ if (value != null) return value;
+ }
+
+ return defaultValue;
+ }
+
+ private static string GetPluginFileName(Network network)
+ {
+ return network.Name.ToLowerInvariant() + "_" + network.LatestVersions.Unity + ".unitypackage";
+ }
+
+ #endregion
+ }
+}
diff --git a/Assets/MaxSdk/Scripts/IntegrationManager/Editor/AppLovinIntegrationManager.cs.meta b/Assets/MaxSdk/Scripts/IntegrationManager/Editor/AppLovinIntegrationManager.cs.meta
new file mode 100644
index 0000000..e9e3603
--- /dev/null
+++ b/Assets/MaxSdk/Scripts/IntegrationManager/Editor/AppLovinIntegrationManager.cs.meta
@@ -0,0 +1,14 @@
+fileFormatVersion: 2
+guid: c5b874c1e65274159bcc0dc15d9458cc
+labels:
+- al_max
+- al_max_export_path-MaxSdk/Scripts/IntegrationManager/Editor/AppLovinIntegrationManager.cs
+MonoImporter:
+ externalObjects: {}
+ serializedVersion: 2
+ defaultReferences: []
+ executionOrder: 0
+ icon: {instanceID: 0}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/MaxSdk/Scripts/IntegrationManager/Editor/AppLovinIntegrationManagerUtils.cs b/Assets/MaxSdk/Scripts/IntegrationManager/Editor/AppLovinIntegrationManagerUtils.cs
new file mode 100644
index 0000000..6f50f25
--- /dev/null
+++ b/Assets/MaxSdk/Scripts/IntegrationManager/Editor/AppLovinIntegrationManagerUtils.cs
@@ -0,0 +1,80 @@
+using System;
+using System.Linq;
+using UnityEngine;
+
+namespace AppLovinMax.Scripts.IntegrationManager.Editor
+{
+ public static class AppLovinIntegrationManagerUtils
+ {
+ ///
+ /// Compares AppLovin MAX Unity mediation adapter plugin versions. Returns , ,
+ /// or as the first version is less than, equal to, or greater than the second.
+ ///
+ /// If a version for a specific platform is only present in one of the provided versions, the one that contains it is considered newer.
+ ///
+ /// The first version to be compared.
+ /// The second version to be compared.
+ ///
+ /// if versionA is less than versionB.
+ /// if versionA and versionB are equal.
+ /// if versionA is greater than versionB.
+ ///
+ internal static MaxSdkUtils.VersionComparisonResult CompareUnityMediationVersions(string versionA, string versionB)
+ {
+ if (versionA.Equals(versionB)) return MaxSdkUtils.VersionComparisonResult.Equal;
+
+ // Unity version would be of format: android_w.x.y.z_ios_a.b.c.d
+ // For Android only versions it would be: android_w.x.y.z
+ // For iOS only version it would be: ios_a.b.c.d
+
+ // After splitting into their respective components, the versions would be at the odd indices.
+ var versionAComponents = versionA.Split('_').ToList();
+ var versionBComponents = versionB.Split('_').ToList();
+
+ var androidComparison = MaxSdkUtils.VersionComparisonResult.Equal;
+ if (versionA.Contains("android") && versionB.Contains("android"))
+ {
+ var androidVersionA = versionAComponents[1];
+ var androidVersionB = versionBComponents[1];
+ androidComparison = MaxSdkUtils.CompareVersions(androidVersionA, androidVersionB);
+
+ // Remove the Android version component so that iOS versions can be processed.
+ versionAComponents.RemoveRange(0, 2);
+ versionBComponents.RemoveRange(0, 2);
+ }
+ else if (versionA.Contains("android"))
+ {
+ androidComparison = MaxSdkUtils.VersionComparisonResult.Greater;
+
+ // Remove the Android version component so that iOS versions can be processed.
+ versionAComponents.RemoveRange(0, 2);
+ }
+ else if (versionB.Contains("android"))
+ {
+ androidComparison = MaxSdkUtils.VersionComparisonResult.Lesser;
+
+ // Remove the Android version component so that iOS version can be processed.
+ versionBComponents.RemoveRange(0, 2);
+ }
+
+ var iosComparison = MaxSdkUtils.VersionComparisonResult.Equal;
+ if (versionA.Contains("ios") && versionB.Contains("ios"))
+ {
+ var iosVersionA = versionAComponents[1];
+ var iosVersionB = versionBComponents[1];
+ iosComparison = MaxSdkUtils.CompareVersions(iosVersionA, iosVersionB);
+ }
+ else if (versionA.Contains("ios"))
+ {
+ iosComparison = MaxSdkUtils.VersionComparisonResult.Greater;
+ }
+ else if (versionB.Contains("ios"))
+ {
+ iosComparison = MaxSdkUtils.VersionComparisonResult.Lesser;
+ }
+
+ // If either one of the Android or iOS version is greater, the entire version should be greater.
+ return (androidComparison == MaxSdkUtils.VersionComparisonResult.Greater || iosComparison == MaxSdkUtils.VersionComparisonResult.Greater) ? MaxSdkUtils.VersionComparisonResult.Greater : MaxSdkUtils.VersionComparisonResult.Lesser;
+ }
+ }
+}
diff --git a/Assets/MaxSdk/Scripts/IntegrationManager/Editor/AppLovinIntegrationManagerUtils.cs.meta b/Assets/MaxSdk/Scripts/IntegrationManager/Editor/AppLovinIntegrationManagerUtils.cs.meta
new file mode 100644
index 0000000..9efcdd9
--- /dev/null
+++ b/Assets/MaxSdk/Scripts/IntegrationManager/Editor/AppLovinIntegrationManagerUtils.cs.meta
@@ -0,0 +1,14 @@
+fileFormatVersion: 2
+guid: 96efb4dba39eb48d2a60afab69786e6a
+labels:
+- al_max
+- al_max_export_path-MaxSdk/Scripts/IntegrationManager/Editor/AppLovinIntegrationManagerUtils.cs
+MonoImporter:
+ externalObjects: {}
+ serializedVersion: 2
+ defaultReferences: []
+ executionOrder: 0
+ icon: {instanceID: 0}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/MaxSdk/Scripts/IntegrationManager/Editor/AppLovinIntegrationManagerWindow.cs b/Assets/MaxSdk/Scripts/IntegrationManager/Editor/AppLovinIntegrationManagerWindow.cs
new file mode 100644
index 0000000..4ec2c08
--- /dev/null
+++ b/Assets/MaxSdk/Scripts/IntegrationManager/Editor/AppLovinIntegrationManagerWindow.cs
@@ -0,0 +1,1194 @@
+//
+// MaxIntegrationManager.cs
+// AppLovin MAX Unity Plugin
+//
+// Created by Santosh Bagadi on 5/27/19.
+// Copyright © 2019 AppLovin. All rights reserved.
+//
+
+using System;
+using System.Collections;
+using System.IO;
+using System.Linq;
+using UnityEditor;
+using UnityEngine;
+
+namespace AppLovinMax.Scripts.IntegrationManager.Editor
+{
+ public class AppLovinIntegrationManagerWindow : EditorWindow
+ {
+ private const string WindowTitle = "AppLovin Integration Manager";
+
+ private const string AppLovinSdkKeyLink = "https://dash.applovin.com/o/account#keys";
+
+ private const string UserTrackingUsageDescriptionDocsLink = "https://developer.apple.com/documentation/bundleresources/information_property_list/nsusertrackingusagedescription";
+ private const string DocumentationTermsAndPrivacyPolicyFlow = "https://support.axon.ai/en/max/unity/overview/terms-and-privacy-policy-flow";
+ private const string DocumentationAdaptersLink = "https://support.axon.ai/en/max/unity/preparing-mediated-networks";
+ private const string DocumentationNote = "Please ensure that integration instructions (e.g. permissions, ATS settings, etc) specific to each network are implemented as well. Click the link below for more info:";
+ private const string UninstallIconExportPath = "MaxSdk/Resources/Images/uninstall_icon.png";
+ private const string InfoIconExportPath = "MaxSdk/Resources/Images/info_icon.png";
+ private const string WarningIconExportPath = "MaxSdk/Resources/Images/warning_icon.png";
+ private const string ErrorIconExportPath = "MaxSdk/Resources/Images/error_icon.png";
+
+ private const string QualityServiceRequiresGradleBuildErrorMsg = "AppLovin Quality Service integration via AppLovin Integration Manager requires Custom Gradle Template enabled or Unity 2018.2 or higher.\n" +
+ "If you would like to continue using your existing setup, please add Quality Service Plugin to your build.gradle manually.";
+
+ private const string CustomGradleVersionTooltip = "To set the version to 6.9.3, set the field to: https://services.gradle.org/distributions/gradle-6.9.3-bin.zip";
+ private const string CustomGradleToolsVersionTooltip = "To set the version to 4.2.0, set the field to: 4.2.0";
+
+ private const string KeyShowAlerts = "com.applovin.show_alerts";
+ private const string KeyShowMicroSdkPartners = "com.applovin.show_micro_sdk_partners";
+ private const string KeyShowMediatedNetworks = "com.applovin.show_mediated_networks";
+ private const string KeyShowSdkSettings = "com.applovin.show_sdk_settings";
+ private const string KeyShowPrivacySettings = "com.applovin.show_privacy_settings";
+ private const string KeyShowOtherSettings = "com.applovin.show_other_settings";
+
+ private const string ExpandButtonText = "+";
+ private const string CollapseButtonText = "-";
+
+ private const string ExternalDependencyManagerPath = "Assets/ExternalDependencyManager";
+
+ private readonly string[] debugUserGeographies = new string[2] {"Not Set", "GDPR"};
+
+ private Vector2 scrollPosition;
+ private static readonly Vector2 WindowMinSize = new Vector2(750, 750);
+ private const float ActionFieldWidth = 70f;
+ private const float UpgradeAllButtonWidth = 80f;
+ private const float NetworkFieldMinWidth = 100f;
+ private const float VersionFieldMinWidth = 190f;
+ private const float PrivacySettingLabelWidth = 250f;
+ private const float NetworkFieldWidthPercentage = 0.22f;
+ private const float VersionFieldWidthPercentage = 0.36f; // There are two version fields. Each take 40% of the width, network field takes the remaining 20%.
+ private static float previousWindowWidth = WindowMinSize.x;
+ private static GUILayoutOption networkWidthOption = GUILayout.Width(NetworkFieldMinWidth);
+ private static GUILayoutOption versionWidthOption = GUILayout.Width(VersionFieldMinWidth);
+
+ private static GUILayoutOption privacySettingFieldWidthOption = GUILayout.Width(400);
+ private static readonly GUILayoutOption FieldWidth = GUILayout.Width(ActionFieldWidth);
+ private static readonly GUILayoutOption UpgradeAllButtonFieldWidth = GUILayout.Width(UpgradeAllButtonWidth);
+ private static readonly GUILayoutOption CollapseButtonWidthOption = GUILayout.Width(20f);
+
+ private static readonly Color DarkModeTextColor = new Color(0.29f, 0.6f, 0.8f);
+
+ private GUIStyle titleLabelStyle;
+ private GUIStyle headerLabelStyle;
+ private GUIStyle environmentValueStyle;
+ private GUIStyle wrapTextLabelStyle;
+ private GUIStyle linkLabelStyle;
+ private GUIStyle iconStyle;
+
+ private PluginData pluginData;
+ private bool pluginDataLoadFailed;
+ private bool shouldShowGoogleWarning;
+ private bool networkButtonsEnabled = true;
+
+ private AppLovinEditorCoroutine loadDataCoroutine;
+ private Texture2D uninstallIcon;
+ private Texture2D infoIcon;
+ private Texture2D warningIcon;
+ private Texture2D errorIcon;
+
+ public static void ShowManager()
+ {
+ var manager = GetWindow(utility: true, title: WindowTitle, focus: true);
+ manager.minSize = WindowMinSize;
+ }
+
+ #region Editor Window Lifecyle Methods
+
+ private void Awake()
+ {
+ titleLabelStyle = new GUIStyle(EditorStyles.label)
+ {
+ fontSize = 14,
+ fontStyle = FontStyle.Bold,
+ fixedHeight = 20
+ };
+
+ headerLabelStyle = new GUIStyle(EditorStyles.label)
+ {
+ fontSize = 12,
+ fontStyle = FontStyle.Bold,
+ fixedHeight = 18
+ };
+
+ environmentValueStyle = new GUIStyle(EditorStyles.label)
+ {
+ alignment = TextAnchor.MiddleRight
+ };
+
+ linkLabelStyle = new GUIStyle(EditorStyles.label)
+ {
+ wordWrap = true,
+ normal = {textColor = EditorGUIUtility.isProSkin ? DarkModeTextColor : Color.blue}
+ };
+
+ wrapTextLabelStyle = new GUIStyle(EditorStyles.label)
+ {
+ wordWrap = true
+ };
+
+ iconStyle = new GUIStyle(EditorStyles.miniButton)
+ {
+ fixedWidth = 18,
+ fixedHeight = 18,
+ padding = new RectOffset(1, 1, 1, 1)
+ };
+
+ // Load uninstall icon texture.
+ var uninstallIconData = File.ReadAllBytes(MaxSdkUtils.GetAssetPathForExportPath(UninstallIconExportPath));
+ // 1. Set the initial size to 1, as Unity 6000 no longer supports a width or height of 0.
+ // 2. The image will be automatically resized once the image asset is loaded.
+ // 3. Set mipChain to false, else the texture has a weird blurry effect.
+ uninstallIcon = new Texture2D(1, 1, TextureFormat.RGBA32, false);
+ uninstallIcon.LoadImage(uninstallIconData);
+
+ // Load info icon texture.
+ var infoIconData = File.ReadAllBytes(MaxSdkUtils.GetAssetPathForExportPath(InfoIconExportPath));
+ infoIcon = new Texture2D(1, 1, TextureFormat.RGBA32, false);
+ infoIcon.LoadImage(infoIconData);
+
+ // Load warning icon texture.
+ var warningIconData = File.ReadAllBytes(MaxSdkUtils.GetAssetPathForExportPath(WarningIconExportPath));
+ warningIcon = new Texture2D(1, 1, TextureFormat.RGBA32, false);
+ warningIcon.LoadImage(warningIconData);
+
+ // Load error icon texture.
+ var errorIconData = File.ReadAllBytes(MaxSdkUtils.GetAssetPathForExportPath(ErrorIconExportPath));
+ errorIcon = new Texture2D(1, 1, TextureFormat.RGBA32, false);
+ errorIcon.LoadImage(errorIconData);
+ }
+
+ private void OnEnable()
+ {
+ // Script reloads can cause AppLovinSettings.Instance to be null for one frame,
+ // so we load the Integration Manager on the following frame
+ if (AppLovinSettings.Instance == null)
+ {
+ AppLovinEditorCoroutine.StartCoroutine(WaitForNextFrameForEnable());
+ }
+ else
+ {
+ OnWindowEnabled();
+ }
+ }
+
+ private IEnumerator WaitForNextFrameForEnable()
+ {
+ yield return new WaitForEndOfFrame();
+ OnWindowEnabled();
+ }
+
+ private void OnWindowEnabled()
+ {
+ // Plugin downloaded and imported. Update current versions for the imported package.
+ AppLovinIntegrationManager.OnImportPackageStartedCallback = OnImportPackageStarted;
+ AppLovinIntegrationManager.OnImportPackageCompletedCallback = OnImportPackageCompleted;
+
+ Load();
+ }
+
+ private void OnDisable()
+ {
+ if (loadDataCoroutine != null)
+ {
+ loadDataCoroutine.Stop();
+ loadDataCoroutine = null;
+ }
+
+ AppLovinIntegrationManager.Instance.CancelDownload();
+ EditorUtility.ClearProgressBar();
+
+ // Saves the AppLovinSettings object if it has been changed.
+ AssetDatabase.SaveAssets();
+ }
+
+ private void OnGUI()
+ {
+ // OnGUI is called on each frame draw, so we don't want to do any unnecessary calculation if we can avoid it. So only calculate it when the width actually changed.
+ if (Math.Abs(previousWindowWidth - position.width) > 1)
+ {
+ previousWindowWidth = position.width;
+ CalculateFieldWidth();
+ }
+
+ using (var scrollView = new EditorGUILayout.ScrollViewScope(scrollPosition, false, false))
+ {
+ scrollPosition = scrollView.scrollPosition;
+
+ GUILayout.Space(5);
+
+ // Draw AppLovin MAX plugin details
+ EditorGUILayout.LabelField("AppLovin MAX Plugin Details", titleLabelStyle);
+ DrawPluginDetails();
+
+ // Draw alerts
+ if (pluginData != null && pluginData.Alerts != null && pluginData.Alerts.Length > 0)
+ {
+ EditorGUILayout.BeginHorizontal();
+ var showAlertDetails = DrawExpandCollapseButton(KeyShowAlerts);
+ EditorGUILayout.LabelField("Alerts", titleLabelStyle, GUILayout.Width(45));
+ DrawAlertCount();
+ GUILayout.FlexibleSpace();
+ EditorGUILayout.EndHorizontal();
+ if (showAlertDetails)
+ {
+ DrawAlerts();
+ }
+ }
+
+ // Draw Micro SDK Partners
+ if (pluginData != null && !MaxSdkUtils.IsNullOrEmpty(pluginData.PartnerMicroSdks))
+ {
+ DrawCollapsibleSection(KeyShowMicroSdkPartners, "AppLovin Micro SDK Partners", DrawPartnerMicroSdks);
+ }
+
+ // Draw mediated networks);
+ EditorGUILayout.BeginHorizontal();
+ var showDetails = DrawExpandCollapseButton(KeyShowMediatedNetworks);
+ EditorGUILayout.LabelField("Mediated Networks", titleLabelStyle);
+ GUILayout.FlexibleSpace();
+ DrawUpgradeAllButton();
+ EditorGUILayout.EndHorizontal();
+ if (showDetails)
+ {
+ DrawMediatedNetworks();
+ }
+
+ if (!AppLovinIntegrationManager.IsPluginInPackageManager)
+ {
+ EditorGUILayout.LabelField("Unity Package Manager Migration", titleLabelStyle);
+ DrawPluginMigrationHelper();
+ }
+
+ // Draw AppLovin Quality Service settings
+ DrawCollapsibleSection(KeyShowSdkSettings, "SDK Settings", DrawQualityServiceSettings);
+
+ DrawCollapsibleSection(KeyShowPrivacySettings, "Privacy Settings", DrawPrivacySettings);
+
+ DrawCollapsibleSection(KeyShowOtherSettings, "Other Settings", DrawOtherSettings);
+
+ // Draw Unity environment details
+ EditorGUILayout.LabelField("Unity Environment Details", titleLabelStyle);
+ DrawUnityEnvironmentDetails();
+
+ // Draw documentation notes
+ EditorGUILayout.LabelField(new GUIContent(DocumentationNote), wrapTextLabelStyle);
+ if (GUILayout.Button(new GUIContent(DocumentationAdaptersLink), linkLabelStyle))
+ {
+ Application.OpenURL(DocumentationAdaptersLink);
+ }
+ }
+
+ if (GUI.changed)
+ {
+ AppLovinSettings.Instance.SaveAsync();
+ AppLovinInternalSettings.Instance.Save();
+ }
+ }
+
+ #endregion
+
+ #region UI Methods
+
+ ///
+ /// Shows failure or loading screen based on whether or not plugin data failed to load.
+ ///
+ private void DrawEmptyPluginData()
+ {
+ GUILayout.Space(5);
+
+ // Plugin data failed to load. Show error and retry button.
+ if (pluginDataLoadFailed)
+ {
+ GUILayout.Space(10);
+ GUILayout.BeginHorizontal();
+ GUILayout.Space(5);
+ EditorGUILayout.LabelField("Failed to load plugin data. Please click retry or restart the integration manager.", titleLabelStyle);
+ if (GUILayout.Button("Retry", FieldWidth))
+ {
+ pluginDataLoadFailed = false;
+ Load();
+ }
+
+ GUILayout.Space(5);
+ GUILayout.EndHorizontal();
+ GUILayout.Space(10);
+ }
+ // Still loading, show loading label.
+ else
+ {
+ GUILayout.Space(10);
+ GUILayout.BeginHorizontal();
+ GUILayout.FlexibleSpace();
+ EditorGUILayout.LabelField("Loading data...", titleLabelStyle);
+ GUILayout.FlexibleSpace();
+ GUILayout.EndHorizontal();
+ GUILayout.Space(10);
+ }
+
+ GUILayout.Space(5);
+ }
+
+ ///
+ /// Draws AppLovin MAX plugin details.
+ ///
+ private void DrawPluginDetails()
+ {
+ GUILayout.BeginHorizontal();
+ GUILayout.Space(10);
+ using (new EditorGUILayout.VerticalScope("box"))
+ {
+ // Draw plugin version details
+ DrawHeaders("Platform", false);
+
+ // Immediately after downloading and importing a plugin the entire IDE reloads and current versions can be null in that case. Will just show loading text in that case.
+ if (pluginData == null || pluginData.AppLovinMax.CurrentVersions == null)
+ {
+ DrawEmptyPluginData();
+ }
+ else
+ {
+ var appLovinMax = pluginData.AppLovinMax;
+ // Check if a newer version is available to enable the upgrade button.
+ var upgradeButtonEnabled = appLovinMax.CurrentToLatestVersionComparisonResult == MaxSdkUtils.VersionComparisonResult.Lesser;
+ DrawPluginDetailRow("Unity 3D", appLovinMax.CurrentVersions.Unity, appLovinMax.LatestVersions.Unity);
+ DrawPluginDetailRow("Android", appLovinMax.CurrentVersions.Android, appLovinMax.LatestVersions.Android);
+ DrawPluginDetailRow("iOS", appLovinMax.CurrentVersions.Ios, appLovinMax.LatestVersions.Ios);
+
+ // BeginHorizontal combined with FlexibleSpace makes sure that the button is centered horizontally.
+ GUILayout.BeginHorizontal();
+ GUILayout.FlexibleSpace();
+
+ var action = appLovinMax.IsCurrentlyInstalling ? "Installing..." : "Upgrade";
+
+ GUI.enabled = upgradeButtonEnabled && !appLovinMax.IsCurrentlyInstalling;
+ if (GUILayout.Button(new GUIContent(action), FieldWidth))
+ {
+ // Only show "Installing..." if the plugin is in the Assets folder
+ // Manifest edits don't trigger import callbacks, and UPM resolution locks the UI anyway.
+ appLovinMax.IsCurrentlyInstalling = !AppLovinIntegrationManager.IsPluginInPackageManager;
+ AppLovinEditorCoroutine.StartCoroutine(AppLovinPackageManager.AddNetwork(pluginData.AppLovinMax, true));
+ }
+
+ GUI.enabled = true;
+ GUILayout.Space(5);
+ GUILayout.EndHorizontal();
+
+ GUILayout.Space(5);
+ }
+ }
+
+ GUILayout.Space(5);
+ GUILayout.EndHorizontal();
+ }
+
+ ///
+ /// Draw the number of each alert type next to the alert section header.
+ ///
+ private void DrawAlertCount()
+ {
+ if (pluginData == null) return;
+
+ var infoAlertsCount = pluginData.Alerts.Count(alert => alert.Severity == Severity.Info);
+ var warningAlertsCount = pluginData.Alerts.Count(alert => alert.Severity == Severity.Warning);
+ var errorAlertsCount = pluginData.Alerts.Count(alert => alert.Severity == Severity.Error);
+
+ GUILayout.Label(infoIcon, GUILayout.Width(20), GUILayout.Height(20));
+ EditorGUILayout.LabelField(AlertCountToString(infoAlertsCount), GUILayout.Width(20));
+ GUILayout.Label(warningIcon, GUILayout.Width(20), GUILayout.Height(20));
+ EditorGUILayout.LabelField(AlertCountToString(warningAlertsCount), GUILayout.Width(20));
+ GUILayout.Label(errorIcon, GUILayout.Width(20), GUILayout.Height(20));
+ EditorGUILayout.LabelField(AlertCountToString(errorAlertsCount), GUILayout.Width(20));
+ }
+
+ ///
+ /// Draw the list of alerts grouped by severity.
+ ///
+ private void DrawAlerts()
+ {
+ GUILayout.BeginHorizontal();
+ GUILayout.Space(10);
+ using (new EditorGUILayout.VerticalScope("box"))
+ {
+ DrawAlertsOfType(Severity.Error);
+ DrawAlertsOfType(Severity.Warning);
+ DrawAlertsOfType(Severity.Info);
+ }
+
+ GUILayout.Space(5);
+ GUILayout.EndHorizontal();
+ }
+
+ private void DrawAlertsOfType(Severity severity)
+ {
+ var alertsOfType = pluginData.Alerts.Where(alert => alert.Severity == severity).ToList();
+ foreach (var alert in alertsOfType)
+ {
+ DrawAlert(alert);
+ }
+ }
+
+ ///
+ /// Draw a single alert.
+ ///
+ private void DrawAlert(Alert alert)
+ {
+ using (new EditorGUILayout.HorizontalScope())
+ {
+ using (new EditorGUILayout.VerticalScope(GUILayout.Width(20)))
+ {
+ GUILayout.Space(2);
+ GUILayout.Label(GetSeverityIcon(alert.Severity), GUILayout.Width(20), GUILayout.Height(20));
+ }
+
+ using (new EditorGUILayout.VerticalScope())
+ {
+ GUILayout.Label(alert.Title, headerLabelStyle);
+ EditorGUILayout.LabelField(alert.Message, wrapTextLabelStyle);
+ if (MaxSdkUtils.IsValidString(alert.Url))
+ {
+ if (GUILayout.Button(new GUIContent(alert.Url), linkLabelStyle))
+ {
+ Application.OpenURL(alert.Url);
+ }
+ }
+
+ GUILayout.Space(2);
+ }
+ }
+
+ GUILayout.Space(10);
+ }
+
+ ///
+ /// Draws the headers for a table.
+ ///
+ private void DrawHeaders(string firstColumnTitle, bool drawAction)
+ {
+ using (new EditorGUILayout.HorizontalScope())
+ {
+ GUILayout.Space(5);
+ EditorGUILayout.LabelField(firstColumnTitle, headerLabelStyle, networkWidthOption);
+ EditorGUILayout.LabelField("Current Version", headerLabelStyle, versionWidthOption);
+ GUILayout.Space(3);
+ EditorGUILayout.LabelField("Latest Version", headerLabelStyle, versionWidthOption);
+ GUILayout.Space(3);
+ if (drawAction)
+ {
+ GUILayout.FlexibleSpace();
+ GUILayout.Button("Actions", headerLabelStyle, FieldWidth);
+ GUILayout.Space(5);
+ }
+ }
+
+ GUILayout.Space(4);
+ }
+
+ ///
+ /// Draws the platform specific version details for AppLovin MAX plugin.
+ ///
+ private void DrawPluginDetailRow(string platform, string currentVersion, string latestVersion)
+ {
+ using (new EditorGUILayout.HorizontalScope())
+ {
+ GUILayout.Space(5);
+ EditorGUILayout.LabelField(new GUIContent(platform), networkWidthOption);
+ EditorGUILayout.LabelField(new GUIContent(currentVersion), versionWidthOption);
+ GUILayout.Space(3);
+ EditorGUILayout.LabelField(new GUIContent(latestVersion), versionWidthOption);
+ GUILayout.Space(3);
+ }
+
+ GUILayout.Space(4);
+ }
+
+ ///
+ /// Draws mediated network details table.
+ ///
+ private void DrawMediatedNetworks()
+ {
+ GUILayout.BeginHorizontal();
+ GUILayout.Space(10);
+ using (new EditorGUILayout.VerticalScope("box"))
+ {
+ DrawHeaders("Network", true);
+
+ // Immediately after downloading and importing a plugin the entire IDE reloads and current versions can be null in that case. Will just show loading text in that case.
+ if (pluginData == null || pluginData.AppLovinMax.CurrentVersions == null)
+ {
+ DrawEmptyPluginData();
+ }
+ else
+ {
+ var networks = pluginData.MediatedNetworks;
+ foreach (var network in networks)
+ {
+ DrawNetworkDetailRow(network);
+ }
+
+ GUILayout.Space(10);
+ }
+ }
+
+ GUILayout.Space(5);
+ GUILayout.EndHorizontal();
+ }
+
+ private void DrawPartnerMicroSdks()
+ {
+ if (pluginData == null) return;
+
+ GUILayout.BeginHorizontal();
+ GUILayout.Space(10);
+ using (new EditorGUILayout.VerticalScope("box"))
+ {
+ DrawHeaders("Network", true);
+
+ var partnerMicroSdks = pluginData.PartnerMicroSdks;
+ foreach (var partnerMicroSdk in partnerMicroSdks)
+ {
+ DrawNetworkDetailRow(partnerMicroSdk);
+ }
+
+ GUILayout.Space(10);
+ }
+
+ GUILayout.Space(5);
+ GUILayout.EndHorizontal();
+ }
+
+ ///
+ /// Draws the network specific details for a given network.
+ ///
+ private void DrawNetworkDetailRow(Network network)
+ {
+ string action;
+ var currentVersion = network.CurrentVersions != null ? network.CurrentVersions.Unity : "";
+ var latestVersion = network.LatestVersions.Unity;
+ bool isActionEnabled;
+ bool isInstalled;
+ if (string.IsNullOrEmpty(currentVersion))
+ {
+ action = "Install";
+ currentVersion = "Not Installed";
+ isActionEnabled = true;
+ isInstalled = false;
+ }
+ else
+ {
+ isInstalled = true;
+
+ var comparison = network.CurrentToLatestVersionComparisonResult;
+ // A newer version is available
+ if (comparison == MaxSdkUtils.VersionComparisonResult.Lesser)
+ {
+ action = "Upgrade";
+ isActionEnabled = true;
+ }
+ // Current installed version is newer than latest version from DB (beta version)
+ else if (comparison == MaxSdkUtils.VersionComparisonResult.Greater)
+ {
+ action = "Installed";
+ isActionEnabled = false;
+ }
+ // Already on the latest version
+ else
+ {
+ action = "Installed";
+ isActionEnabled = false;
+ }
+ }
+
+ GUILayout.Space(4);
+ using (new EditorGUILayout.HorizontalScope(GUILayout.ExpandHeight(false)))
+ {
+ GUILayout.Space(5);
+ EditorGUILayout.LabelField(new GUIContent(network.DisplayName), networkWidthOption);
+ EditorGUILayout.LabelField(new GUIContent(currentVersion), versionWidthOption);
+ GUILayout.Space(3);
+ EditorGUILayout.LabelField(new GUIContent(latestVersion), versionWidthOption);
+ GUILayout.Space(3);
+ GUILayout.FlexibleSpace();
+
+ if (network.RequiresUpdate)
+ {
+ GUILayout.Label(new GUIContent {image = errorIcon, tooltip = "Adapter not compatible, please update to the latest version."}, iconStyle);
+ }
+ else if ((network.Name.Equals("ADMOB_NETWORK") || network.Name.Equals("GOOGLE_AD_MANAGER_NETWORK")) && shouldShowGoogleWarning)
+ {
+ GUILayout.Label(new GUIContent {image = warningIcon, tooltip = "You may see unexpected errors if you use different versions of the AdMob and Google Ad Manager adapter SDKs."}, iconStyle);
+ }
+
+ if (network.IsCurrentlyInstalling)
+ {
+ action = "Installing...";
+ }
+
+ GUI.enabled = networkButtonsEnabled && isActionEnabled && !network.IsCurrentlyInstalling;
+ if (GUILayout.Button(new GUIContent(action), FieldWidth))
+ {
+ // Only show "Installing..." if the plugin is in the Assets folder
+ // Manifest edits don't trigger import callbacks, and UPM resolution locks the UI anyway.
+ network.IsCurrentlyInstalling = !AppLovinIntegrationManager.IsPluginInPackageManager;
+ AppLovinEditorCoroutine.StartCoroutine(AppLovinPackageManager.AddNetwork(network, true));
+ }
+
+ GUI.enabled = true;
+ GUILayout.Space(2);
+
+ GUI.enabled = networkButtonsEnabled && isInstalled;
+ if (GUILayout.Button(new GUIContent {image = uninstallIcon, tooltip = "Uninstall"}, iconStyle))
+ {
+ AppLovinPackageManager.RemoveNetwork(network);
+ AppLovinPackageManager.UpdateCurrentVersions(network);
+ UpdateShouldShowGoogleWarningIfNeeded();
+ }
+
+ GUI.enabled = true;
+ GUILayout.Space(5);
+ }
+
+ if (isInstalled)
+ {
+ DrawGoogleAppIdTextBoxIfNeeded(network);
+ }
+ }
+
+ private void DrawGoogleAppIdTextBoxIfNeeded(Network network)
+ {
+ // Custom integration for AdMob where the user can enter the Android and iOS App IDs.
+ if (network.Name.Equals("ADMOB_NETWORK"))
+ {
+ // Show only one set of text boxes if both ADMOB and GAM are installed
+ if (AppLovinPackageManager.IsAdapterInstalled(pluginData, "GOOGLE_AD_MANAGER_NETWORK")) return;
+
+ DrawGoogleAppIdTextBox();
+ }
+ // Custom integration for GAM where the user can enter the Android and iOS App IDs.
+ else if (network.Name.Equals("GOOGLE_AD_MANAGER_NETWORK"))
+ {
+ DrawGoogleAppIdTextBox();
+ }
+ }
+
+ ///
+ /// Draws the text box for GAM or ADMOB to input the App ID
+ ///
+ private void DrawGoogleAppIdTextBox()
+ {
+ GUILayout.BeginHorizontal();
+ GUILayout.Space(20);
+ using (new EditorGUILayout.VerticalScope("box"))
+ {
+ GUILayout.Space(2);
+ AppLovinSettings.Instance.AdMobAndroidAppId = DrawTextField("App ID (Android)", AppLovinSettings.Instance.AdMobAndroidAppId, networkWidthOption);
+ AppLovinSettings.Instance.AdMobIosAppId = DrawTextField("App ID (iOS)", AppLovinSettings.Instance.AdMobIosAppId, networkWidthOption);
+ }
+
+ GUILayout.EndHorizontal();
+ }
+
+ ///
+ /// Draws the upgrade all button
+ ///
+ private void DrawUpgradeAllButton()
+ {
+ GUI.enabled = NetworksRequireUpgrade();
+ if (GUILayout.Button(new GUIContent("Upgrade All"), UpgradeAllButtonFieldWidth))
+ {
+ AppLovinEditorCoroutine.StartCoroutine(UpgradeAllNetworks());
+ }
+
+ GUI.enabled = true;
+ GUILayout.Space(10);
+ }
+
+ private void DrawPluginMigrationHelper()
+ {
+ GUILayout.BeginHorizontal();
+ GUILayout.Space(10);
+ using (new EditorGUILayout.VerticalScope("box"))
+ {
+ GUILayout.Space(5);
+ GUILayout.BeginHorizontal();
+ GUILayout.Space(4);
+ EditorGUILayout.LabelField(new GUIContent("This will migrate the AppLovin MAX Unity Plugin and adapters to the Unity Package Manager."), wrapTextLabelStyle);
+ GUILayout.Space(4);
+ GUILayout.EndHorizontal();
+
+ GUI.enabled = true;
+ GUILayout.Space(3);
+ GUILayout.FlexibleSpace();
+
+ GUILayout.BeginHorizontal();
+ GUILayout.Space(10);
+ var migrationText = "Upgrade All Adapters and Migrate to UPM";
+ if (GUILayout.Button(new GUIContent(migrationText)))
+ {
+ if (EditorUtility.DisplayDialog("Migrate to UPM?",
+ "Are you sure you want to migrate the SDK and adapters to UPM? This action will move both the MAX SDK and its adapters.", "Yes", "No"))
+ {
+ var deleteExternalDependencyManager = false;
+ if (Directory.Exists(ExternalDependencyManagerPath))
+ {
+ deleteExternalDependencyManager = EditorUtility.DisplayDialog("External Dependency Manager Detected",
+ "Our plugin includes the External Dependency Manager via the Unity Package Manager. Would you like us to automatically remove the existing External Dependency Manager folder, or would you prefer to manage it manually?", "Remove Automatically", "Manage Manually");
+ }
+
+ AppLovinPluginMigrationHelper.MigrateToUnityPackageManager(pluginData, deleteExternalDependencyManager);
+ }
+ }
+
+ GUILayout.Space(10);
+ GUILayout.EndHorizontal();
+
+ GUILayout.Space(5);
+ EditorGUILayout.HelpBox("Ensure all changes are committed before migration.", MessageType.Warning);
+ }
+
+ GUILayout.Space(5);
+ GUILayout.EndHorizontal();
+ }
+
+ private void DrawQualityServiceSettings()
+ {
+ GUILayout.BeginHorizontal();
+ GUILayout.Space(10);
+ using (new EditorGUILayout.VerticalScope("box"))
+ {
+ GUILayout.Space(4);
+ if (!AppLovinIntegrationManager.CanProcessAndroidQualityServiceSettings)
+ {
+ GUILayout.Space(4);
+ GUILayout.BeginHorizontal();
+ GUILayout.Space(4);
+ EditorGUILayout.HelpBox(QualityServiceRequiresGradleBuildErrorMsg, MessageType.Warning);
+ GUILayout.Space(4);
+ GUILayout.EndHorizontal();
+
+ GUILayout.Space(4);
+ }
+
+ AppLovinSettings.Instance.SdkKey = DrawTextField("AppLovin SDK Key", AppLovinSettings.Instance.SdkKey, GUILayout.Width(PrivacySettingLabelWidth), privacySettingFieldWidthOption);
+ GUILayout.BeginHorizontal();
+ GUILayout.Space(4);
+ GUILayout.Button("You can find your SDK key here: ", wrapTextLabelStyle, GUILayout.Width(185)); // Setting a fixed width since Unity adds arbitrary padding at the end leaving a space between link and text.
+ if (GUILayout.Button(new GUIContent(AppLovinSdkKeyLink), linkLabelStyle))
+ {
+ Application.OpenURL(AppLovinSdkKeyLink);
+ }
+
+ GUILayout.FlexibleSpace();
+ GUILayout.EndHorizontal();
+
+ GUILayout.Space(4);
+ GUILayout.BeginHorizontal();
+ GUILayout.Space(4);
+ AppLovinSettings.Instance.QualityServiceEnabled = GUILayout.Toggle(AppLovinSettings.Instance.QualityServiceEnabled, " Enable MAX Ad Review");
+ GUILayout.EndHorizontal();
+ GUILayout.Space(4);
+
+ GUILayout.Space(4);
+ }
+
+ GUILayout.Space(5);
+ GUILayout.EndHorizontal();
+ }
+
+ private string DrawTextField(string fieldTitle, string text, GUILayoutOption labelWidth, GUILayoutOption textFieldWidthOption = null, bool isTextFieldEditable = true, string tooltip = "")
+ {
+ GUILayout.BeginHorizontal();
+ GUILayout.Space(4);
+ var guiContent = MaxSdkUtils.IsValidString(tooltip) ? new GUIContent(fieldTitle, tooltip) : new GUIContent(fieldTitle);
+ EditorGUILayout.LabelField(guiContent, labelWidth);
+ GUILayout.Space(4);
+ if (isTextFieldEditable)
+ {
+ text = (textFieldWidthOption == null) ? GUILayout.TextField(text) : GUILayout.TextField(text, textFieldWidthOption);
+ }
+ else
+ {
+ if (textFieldWidthOption == null)
+ {
+ GUILayout.Label(text);
+ }
+ else
+ {
+ GUILayout.Label(text, textFieldWidthOption);
+ }
+ }
+
+ GUILayout.Space(4);
+ GUILayout.EndHorizontal();
+ GUILayout.Space(4);
+
+ return text;
+ }
+
+ private void DrawPrivacySettings()
+ {
+ GUILayout.BeginHorizontal();
+ GUILayout.Space(10);
+ using (new EditorGUILayout.VerticalScope("box"))
+ {
+ DrawConsentFlowSettings();
+ }
+
+ GUILayout.Space(5);
+ GUILayout.EndHorizontal();
+ }
+
+ private void DrawConsentFlowSettings()
+ {
+ GUILayout.BeginHorizontal();
+ GUILayout.Space(4);
+ AppLovinInternalSettings.Instance.ConsentFlowEnabled = GUILayout.Toggle(AppLovinInternalSettings.Instance.ConsentFlowEnabled, " Enable MAX Terms and Privacy Policy Flow");
+ GUILayout.EndHorizontal();
+ GUILayout.Space(6);
+ GUILayout.Space(4);
+ EditorGUILayout.HelpBox("This flow automatically includes Google UMP.", MessageType.Info);
+
+ GUI.enabled = true;
+
+ if (!AppLovinInternalSettings.Instance.ConsentFlowEnabled) return;
+
+ GUILayout.Space(6);
+ GUILayout.BeginHorizontal();
+ GUILayout.Space(4);
+ EditorGUILayout.LabelField("Click the link below to access the guide on creating the GDPR form within AdMob's dashboard.");
+ GUILayout.Space(4);
+ GUILayout.EndHorizontal();
+ GUILayout.BeginHorizontal();
+ GUILayout.Space(4);
+ if (GUILayout.Button(new GUIContent(DocumentationTermsAndPrivacyPolicyFlow), linkLabelStyle))
+ {
+ Application.OpenURL(DocumentationTermsAndPrivacyPolicyFlow);
+ }
+
+ GUILayout.Space(4);
+ GUILayout.EndHorizontal();
+
+ GUILayout.Space(8);
+
+ AppLovinInternalSettings.Instance.ConsentFlowPrivacyPolicyUrl = DrawTextField("Privacy Policy URL", AppLovinInternalSettings.Instance.ConsentFlowPrivacyPolicyUrl, GUILayout.Width(PrivacySettingLabelWidth), privacySettingFieldWidthOption);
+ AppLovinInternalSettings.Instance.ConsentFlowTermsOfServiceUrl = DrawTextField("Terms of Service URL (optional)", AppLovinInternalSettings.Instance.ConsentFlowTermsOfServiceUrl, GUILayout.Width(PrivacySettingLabelWidth), privacySettingFieldWidthOption);
+
+ GUILayout.Space(4);
+ GUILayout.BeginHorizontal();
+ GUILayout.Space(4);
+ AppLovinInternalSettings.Instance.ShouldShowTermsAndPrivacyPolicyAlertInGDPR = GUILayout.Toggle(AppLovinInternalSettings.Instance.ShouldShowTermsAndPrivacyPolicyAlertInGDPR, " Show Terms and Privacy Policy Flow when in GDPR Regions");
+ GUILayout.EndHorizontal();
+
+ GUILayout.Space(4);
+ GUILayout.BeginHorizontal();
+ GUILayout.Space(4);
+ EditorGUILayout.LabelField("iOS specific settings:", headerLabelStyle);
+ GUILayout.EndHorizontal();
+
+ var isEditableTextField = AppLovinInternalSettings.Instance.OverrideDefaultUserTrackingUsageDescriptions;
+
+ GUILayout.BeginHorizontal();
+ GUILayout.Space(4);
+ AppLovinInternalSettings.Instance.OverrideDefaultUserTrackingUsageDescriptions = GUILayout.Toggle(AppLovinInternalSettings.Instance.OverrideDefaultUserTrackingUsageDescriptions, " Override Default User Tracking Usage Description");
+ GUILayout.EndHorizontal();
+ GUILayout.Space(4);
+
+ GUILayout.Space(4);
+ AppLovinInternalSettings.Instance.UserTrackingUsageDescriptionEn = DrawTextField("User Tracking Usage Description", AppLovinInternalSettings.Instance.UserTrackingUsageDescriptionEn, GUILayout.Width(PrivacySettingLabelWidth), privacySettingFieldWidthOption, isEditableTextField);
+
+ GUILayout.BeginHorizontal();
+ GUILayout.Space(4);
+ AppLovinInternalSettings.Instance.UserTrackingUsageLocalizationEnabled = GUILayout.Toggle(AppLovinInternalSettings.Instance.UserTrackingUsageLocalizationEnabled, " Localize User Tracking Usage Description");
+ GUILayout.EndHorizontal();
+ GUILayout.Space(4);
+
+ if (AppLovinInternalSettings.Instance.UserTrackingUsageLocalizationEnabled)
+ {
+ AppLovinInternalSettings.Instance.UserTrackingUsageDescriptionZhHans = DrawTextField("Chinese, Simplified (zh-Hans)", AppLovinInternalSettings.Instance.UserTrackingUsageDescriptionZhHans, GUILayout.Width(PrivacySettingLabelWidth), privacySettingFieldWidthOption, isEditableTextField);
+ AppLovinInternalSettings.Instance.UserTrackingUsageDescriptionZhHant = DrawTextField("Chinese, Traditional (zh-Hant)", AppLovinInternalSettings.Instance.UserTrackingUsageDescriptionZhHant, GUILayout.Width(PrivacySettingLabelWidth), privacySettingFieldWidthOption, isEditableTextField);
+ AppLovinInternalSettings.Instance.UserTrackingUsageDescriptionFr = DrawTextField("French (fr)", AppLovinInternalSettings.Instance.UserTrackingUsageDescriptionFr, GUILayout.Width(PrivacySettingLabelWidth), privacySettingFieldWidthOption, isEditableTextField);
+ AppLovinInternalSettings.Instance.UserTrackingUsageDescriptionDe = DrawTextField("German (de)", AppLovinInternalSettings.Instance.UserTrackingUsageDescriptionDe, GUILayout.Width(PrivacySettingLabelWidth), privacySettingFieldWidthOption, isEditableTextField);
+ AppLovinInternalSettings.Instance.UserTrackingUsageDescriptionJa = DrawTextField("Japanese (ja)", AppLovinInternalSettings.Instance.UserTrackingUsageDescriptionJa, GUILayout.Width(PrivacySettingLabelWidth), privacySettingFieldWidthOption, isEditableTextField);
+ AppLovinInternalSettings.Instance.UserTrackingUsageDescriptionKo = DrawTextField("Korean (ko)", AppLovinInternalSettings.Instance.UserTrackingUsageDescriptionKo, GUILayout.Width(PrivacySettingLabelWidth), privacySettingFieldWidthOption, isEditableTextField);
+ AppLovinInternalSettings.Instance.UserTrackingUsageDescriptionEs = DrawTextField("Spanish (es)", AppLovinInternalSettings.Instance.UserTrackingUsageDescriptionEs, GUILayout.Width(PrivacySettingLabelWidth), privacySettingFieldWidthOption, isEditableTextField);
+
+ GUILayout.Space(4);
+ GUILayout.BeginHorizontal();
+ GUILayout.Space(4);
+ EditorGUILayout.HelpBox("If you have your own implementation of InfoPlist.strings localization implementation, please use that instead. Using both at the same time may cause conflicts.", MessageType.Info);
+ GUILayout.Space(4);
+ GUILayout.EndHorizontal();
+ }
+
+ GUILayout.Space(4);
+ GUILayout.BeginHorizontal();
+ GUILayout.Space(4);
+ GUILayout.Button("Click the link below for more information about User Tracking Usage Description: ", wrapTextLabelStyle);
+ GUILayout.Space(4);
+ GUILayout.EndHorizontal();
+ GUILayout.BeginHorizontal();
+ GUILayout.Space(4);
+ if (GUILayout.Button(new GUIContent(UserTrackingUsageDescriptionDocsLink), linkLabelStyle))
+ {
+ Application.OpenURL(UserTrackingUsageDescriptionDocsLink);
+ }
+
+ GUILayout.Space(4);
+ GUILayout.EndHorizontal();
+ GUILayout.Space(8);
+
+ GUILayout.BeginHorizontal();
+ GUILayout.Space(4);
+ EditorGUILayout.LabelField("Testing:", headerLabelStyle);
+ GUILayout.EndHorizontal();
+
+ GUILayout.BeginHorizontal();
+ GUILayout.Space(4);
+ EditorGUILayout.LabelField("Debug User Geography");
+ AppLovinInternalSettings.Instance.DebugUserGeography = (MaxSdkBase.ConsentFlowUserGeography) EditorGUILayout.Popup((int) AppLovinInternalSettings.Instance.DebugUserGeography, debugUserGeographies, privacySettingFieldWidthOption);
+ GUILayout.Space(4);
+ GUILayout.EndHorizontal();
+
+ EditorGUILayout.HelpBox("Debug User Geography is only enabled in debug mode", MessageType.Info);
+ }
+
+ private void DrawOtherSettings()
+ {
+ GUILayout.BeginHorizontal();
+ GUILayout.Space(10);
+ using (new EditorGUILayout.VerticalScope("box"))
+ {
+ GUILayout.Space(5);
+ var autoUpdateEnabled = DrawOtherSettingsToggle(EditorPrefs.GetBool(AppLovinAutoUpdater.KeyAutoUpdateEnabled, true), " Enable Auto Update", "Checks for AppLovin MAX plugin updates and notifies you when an update is available.");
+ EditorPrefs.SetBool(AppLovinAutoUpdater.KeyAutoUpdateEnabled, autoUpdateEnabled);
+ GUILayout.Space(5);
+ var verboseLoggingEnabled = DrawOtherSettingsToggle(EditorPrefs.GetBool(MaxSdkLogger.KeyVerboseLoggingEnabled, false), " Enable Verbose Logging");
+ EditorPrefs.SetBool(MaxSdkLogger.KeyVerboseLoggingEnabled, verboseLoggingEnabled);
+ GUILayout.Space(5);
+ AppLovinSettings.Instance.CustomGradleVersionUrl = DrawTextField("Custom Gradle Version URL", AppLovinSettings.Instance.CustomGradleVersionUrl, GUILayout.Width(PrivacySettingLabelWidth), privacySettingFieldWidthOption, tooltip: CustomGradleVersionTooltip);
+ AppLovinSettings.Instance.CustomGradleToolsVersion = DrawTextField("Custom Gradle Tools Version", AppLovinSettings.Instance.CustomGradleToolsVersion, GUILayout.Width(PrivacySettingLabelWidth), privacySettingFieldWidthOption, tooltip: CustomGradleToolsVersionTooltip);
+ EditorGUILayout.HelpBox("This will overwrite the gradle build tools version in your base gradle template.", MessageType.Info);
+ }
+
+ GUILayout.Space(5);
+ GUILayout.EndHorizontal();
+ }
+
+ private bool DrawOtherSettingsToggle(bool value, string text, string tooltip = "")
+ {
+ using (new EditorGUILayout.HorizontalScope())
+ {
+ GUILayout.Space(4);
+ var content = MaxSdkUtils.IsValidString(tooltip) ? new GUIContent(text, tooltip) : new GUIContent(text);
+ var toggleValue = GUILayout.Toggle(value, content);
+ GUILayout.Space(4);
+
+ return toggleValue;
+ }
+ }
+
+ private void DrawUnityEnvironmentDetails()
+ {
+ GUILayout.BeginHorizontal();
+ GUILayout.Space(10);
+ using (new EditorGUILayout.VerticalScope("box"))
+ {
+ DrawUnityEnvironmentDetailRow("Unity Version", Application.unityVersion);
+ GUILayout.Space(5);
+ DrawUnityEnvironmentDetailRow("Platform", Application.platform.ToString());
+ GUILayout.Space(5);
+ DrawUnityEnvironmentDetailRow("External Dependency Manager Version", AppLovinIntegrationManager.ExternalDependencyManagerVersion);
+ GUILayout.Space(5);
+ DrawUnityEnvironmentDetailRow("Gradle Template Enabled", AppLovinIntegrationManager.GradleTemplateEnabled.ToString());
+ }
+
+ GUILayout.Space(5);
+ GUILayout.EndHorizontal();
+ }
+
+ private void DrawUnityEnvironmentDetailRow(string key, string value)
+ {
+ using (new EditorGUILayout.HorizontalScope())
+ {
+ GUILayout.Space(5);
+ EditorGUILayout.LabelField(key, GUILayout.Width(250));
+ GUILayout.FlexibleSpace();
+ EditorGUILayout.LabelField(value, environmentValueStyle);
+ GUILayout.Space(5);
+ }
+ }
+
+ private void DrawCollapsibleSection(string keyShowDetails, string label, Action drawContent)
+ {
+ EditorGUILayout.BeginHorizontal();
+ var showDetails = DrawExpandCollapseButton(keyShowDetails);
+
+ EditorGUILayout.LabelField(label, titleLabelStyle);
+ GUILayout.FlexibleSpace();
+ EditorGUILayout.EndHorizontal();
+ if (showDetails)
+ {
+ drawContent();
+ }
+ }
+
+ private bool DrawExpandCollapseButton(string keyShowDetails)
+ {
+ var showDetails = EditorPrefs.GetBool(keyShowDetails, true);
+ var buttonText = showDetails ? CollapseButtonText : ExpandButtonText;
+ if (GUILayout.Button(buttonText, CollapseButtonWidthOption))
+ {
+ EditorPrefs.SetBool(keyShowDetails, !showDetails);
+ }
+
+ return showDetails;
+ }
+
+ ///
+ /// Calculates the fields width based on the width of the window.
+ ///
+ private void CalculateFieldWidth()
+ {
+ var currentWidth = position.width;
+ var availableWidth = currentWidth - ActionFieldWidth - 80; // NOTE: Magic number alert. This is the sum of all the spacing the fields and other UI elements.
+ var networkLabelWidth = Math.Max(NetworkFieldMinWidth, availableWidth * NetworkFieldWidthPercentage);
+ networkWidthOption = GUILayout.Width(networkLabelWidth);
+
+ var versionLabelWidth = Math.Max(VersionFieldMinWidth, availableWidth * VersionFieldWidthPercentage);
+ versionWidthOption = GUILayout.Width(versionLabelWidth);
+
+ const int textFieldOtherUiElementsWidth = 55; // NOTE: Magic number alert. This is the sum of all the spacing the fields and other UI elements.
+ var availableUserDescriptionTextFieldWidth = currentWidth - PrivacySettingLabelWidth - textFieldOtherUiElementsWidth;
+ privacySettingFieldWidthOption = GUILayout.Width(availableUserDescriptionTextFieldWidth);
+ }
+
+ #endregion
+
+ #region Utility Methods
+
+ ///
+ /// Loads the plugin data to be displayed by this window.
+ ///
+ private void Load()
+ {
+ loadDataCoroutine = AppLovinEditorCoroutine.StartCoroutine(AppLovinIntegrationManager.Instance.LoadPluginData(data =>
+ {
+ if (data == null)
+ {
+ pluginDataLoadFailed = true;
+ }
+ else
+ {
+ pluginData = data;
+ pluginDataLoadFailed = false;
+
+ UpdateShouldShowGoogleWarningIfNeeded();
+ }
+
+ CalculateFieldWidth();
+ Repaint();
+ }));
+ }
+
+ private void OnImportPackageStarted(Network network)
+ {
+ network.IsCurrentlyInstalling = false;
+ }
+
+ private void OnImportPackageCompleted(Network network)
+ {
+ AppLovinPackageManager.UpdateCurrentVersions(network);
+
+ UpdateShouldShowGoogleWarningIfNeeded();
+ }
+
+ private void UpdateShouldShowGoogleWarningIfNeeded()
+ {
+ if (pluginData == null)
+ {
+ shouldShowGoogleWarning = false;
+ return;
+ }
+
+ var networks = pluginData.MediatedNetworks;
+ var googleNetwork = networks.FirstOrDefault(foundNetwork => foundNetwork.Name.Equals("ADMOB_NETWORK"));
+ var googleAdManagerNetwork = networks.FirstOrDefault(foundNetwork => foundNetwork.Name.Equals("GOOGLE_AD_MANAGER_NETWORK"));
+
+ if (googleNetwork != null && googleAdManagerNetwork != null &&
+ MaxSdkUtils.IsValidString(googleNetwork.CurrentVersions.Unity) && MaxSdkUtils.IsValidString(googleAdManagerNetwork.CurrentVersions.Unity) &&
+ !googleNetwork.CurrentVersions.HasEqualSdkVersions(googleAdManagerNetwork.CurrentVersions))
+ {
+ shouldShowGoogleWarning = true;
+ }
+ else
+ {
+ shouldShowGoogleWarning = false;
+ }
+ }
+
+ ///
+ /// Upgrades all outdated networks
+ ///
+ private IEnumerator UpgradeAllNetworks()
+ {
+ networkButtonsEnabled = false;
+ EditorApplication.LockReloadAssemblies();
+ var networks = pluginData.MediatedNetworks;
+ foreach (var network in networks)
+ {
+ var comparison = network.CurrentToLatestVersionComparisonResult;
+ // A newer version is available
+ if (MaxSdkUtils.IsValidString(network.CurrentVersions.Unity) && comparison == MaxSdkUtils.VersionComparisonResult.Lesser)
+ {
+ yield return AppLovinPackageManager.AddNetwork(network, false);
+ }
+ }
+
+ EditorApplication.UnlockReloadAssemblies();
+ networkButtonsEnabled = true;
+
+ // The pluginData becomes stale after the networks have been updated, and we should re-load it.
+ Load();
+ }
+
+ ///
+ /// Returns whether any network adapter needs to be upgraded
+ ///
+ private bool NetworksRequireUpgrade()
+ {
+ if (pluginData == null || pluginData.AppLovinMax.CurrentVersions == null) return false;
+
+ var networks = pluginData.MediatedNetworks;
+ return networks.Any(network => MaxSdkUtils.IsValidString(network.CurrentVersions.Unity) && network.CurrentToLatestVersionComparisonResult == MaxSdkUtils.VersionComparisonResult.Lesser);
+ }
+
+ ///
+ /// Takes in an int representing the count of an alert and returns it as a string or "9+" if greater than 9.
+ ///
+ private string AlertCountToString(int count)
+ {
+ return count > 9 ? "9+" : count.ToString();
+ }
+
+ ///
+ /// Returns the icon for the given severity type.
+ ///
+ private Texture2D GetSeverityIcon(Severity severity)
+ {
+ switch (severity)
+ {
+ case Severity.Info:
+ return infoIcon;
+ case Severity.Warning:
+ return warningIcon;
+ case Severity.Error:
+ return errorIcon;
+ default:
+ return infoIcon;
+ }
+ }
+
+ #endregion
+ }
+}
diff --git a/Assets/MaxSdk/Scripts/IntegrationManager/Editor/AppLovinIntegrationManagerWindow.cs.meta b/Assets/MaxSdk/Scripts/IntegrationManager/Editor/AppLovinIntegrationManagerWindow.cs.meta
new file mode 100644
index 0000000..d7996fd
--- /dev/null
+++ b/Assets/MaxSdk/Scripts/IntegrationManager/Editor/AppLovinIntegrationManagerWindow.cs.meta
@@ -0,0 +1,14 @@
+fileFormatVersion: 2
+guid: 84c61b4c05e114cec91df447d1b585f8
+labels:
+- al_max
+- al_max_export_path-MaxSdk/Scripts/IntegrationManager/Editor/AppLovinIntegrationManagerWindow.cs
+MonoImporter:
+ externalObjects: {}
+ serializedVersion: 2
+ defaultReferences: []
+ executionOrder: 0
+ icon: {instanceID: 0}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/MaxSdk/Scripts/IntegrationManager/Editor/AppLovinInternalSettings.cs b/Assets/MaxSdk/Scripts/IntegrationManager/Editor/AppLovinInternalSettings.cs
new file mode 100644
index 0000000..2ee24b9
--- /dev/null
+++ b/Assets/MaxSdk/Scripts/IntegrationManager/Editor/AppLovinInternalSettings.cs
@@ -0,0 +1,307 @@
+//
+// AppLovinInternalSettings.cs
+// AppLovin User Engagement Unity Plugin
+//
+// Created by Santosh Bagadi on 9/15/22.
+// Copyright © 2022 AppLovin. All rights reserved.
+//
+
+using System;
+using System.Collections.Generic;
+using System.IO;
+using UnityEngine;
+
+namespace AppLovinMax.Scripts.IntegrationManager.Editor
+{
+ ///
+ /// A representing the AppLovin internal settings that can be set in the Integration Manager Window.
+ ///
+ /// The scriptable object asset is saved under ProjectSettings as AppLovinInternalSettings.json .
+ ///
+ public class AppLovinInternalSettings : ScriptableObject
+ {
+ private static AppLovinInternalSettings instance;
+
+ private const string DefaultUserTrackingDescriptionEn = "This uses device info for more personalized ads and content";
+ private const string DefaultUserTrackingDescriptionDe = "Dies benutzt Gerätinformationen für relevantere Werbeinhalte";
+ private const string DefaultUserTrackingDescriptionEs = "Esto utiliza la información del dispositivo para anuncios y contenido más personalizados";
+ private const string DefaultUserTrackingDescriptionFr = "Cela permet d'utiliser les informations du téléphone pour afficher des contenus publicitaires plus pertinents.";
+ private const string DefaultUserTrackingDescriptionJa = "これはユーザーデータをもとに、より関連性の高い広告コンテンツをお客様に提供します";
+ private const string DefaultUserTrackingDescriptionKo = "보다 개인화된 광고 및 콘텐츠를 위해 기기 정보를 사용합니다.";
+ private const string DefaultUserTrackingDescriptionZhHans = "我们使用设备信息来提供个性化的广告和内容。";
+ private const string DefaultUserTrackingDescriptionZhHant = "我們使用設備信息來提供個性化的廣告和內容。";
+
+ [SerializeField] private bool consentFlowEnabled;
+ [SerializeField] private string consentFlowPrivacyPolicyUrl = string.Empty;
+ [SerializeField] private string consentFlowTermsOfServiceUrl = string.Empty;
+ [SerializeField] private bool shouldShowTermsAndPrivacyPolicyAlertInGDPR;
+ [SerializeField] private bool overrideDefaultUserTrackingUsageDescriptions;
+ [SerializeField] private MaxSdkBase.ConsentFlowUserGeography debugUserGeography;
+ [SerializeField] private string userTrackingUsageDescriptionEn = string.Empty;
+ [SerializeField] private bool userTrackingUsageLocalizationEnabled;
+ [SerializeField] private string userTrackingUsageDescriptionDe = string.Empty;
+ [SerializeField] private string userTrackingUsageDescriptionEs = string.Empty;
+ [SerializeField] private string userTrackingUsageDescriptionFr = string.Empty;
+ [SerializeField] private string userTrackingUsageDescriptionJa = string.Empty;
+ [SerializeField] private string userTrackingUsageDescriptionKo = string.Empty;
+ [SerializeField] private string userTrackingUsageDescriptionZhHans = string.Empty;
+ [SerializeField] private string userTrackingUsageDescriptionZhHant = string.Empty;
+
+ private const string SettingsFilePath = "ProjectSettings/AppLovinInternalSettings.json";
+
+ public static AppLovinInternalSettings Instance
+ {
+ get
+ {
+ if (instance != null) return instance;
+
+ instance = CreateInstance();
+
+ var projectRootPath = Path.GetDirectoryName(Application.dataPath);
+ var settingsFilePath = Path.Combine(projectRootPath, SettingsFilePath);
+ if (!File.Exists(settingsFilePath))
+ {
+ instance.Save();
+ return instance;
+ }
+
+ var settingsJson = File.ReadAllText(settingsFilePath);
+ if (string.IsNullOrEmpty(settingsJson))
+ {
+ instance.Save();
+ return instance;
+ }
+
+ JsonUtility.FromJsonOverwrite(settingsJson, instance);
+ return instance;
+ }
+ }
+
+ public void Save()
+ {
+ var settingsJson = JsonUtility.ToJson(instance);
+ try
+ {
+ var projectRootPath = Path.GetDirectoryName(Application.dataPath);
+ var settingsFilePath = Path.Combine(projectRootPath, SettingsFilePath);
+ File.WriteAllText(settingsFilePath, settingsJson);
+ }
+ catch (Exception exception)
+ {
+ MaxSdkLogger.UserError("Failed to save internal settings.");
+ Console.WriteLine(exception);
+ }
+ }
+
+ ///
+ /// Whether or not AppLovin Consent Flow is enabled.
+ ///
+ public bool ConsentFlowEnabled
+ {
+ get { return consentFlowEnabled; }
+ set
+ {
+ var previousValue = consentFlowEnabled;
+ consentFlowEnabled = value;
+
+ if (value)
+ {
+ // If the value didn't change, we don't need to update anything.
+ if (previousValue) return;
+
+ UserTrackingUsageDescriptionEn = DefaultUserTrackingDescriptionEn;
+ UserTrackingUsageLocalizationEnabled = true;
+ }
+ else
+ {
+ ConsentFlowPrivacyPolicyUrl = string.Empty;
+ ConsentFlowTermsOfServiceUrl = string.Empty;
+ UserTrackingUsageDescriptionEn = string.Empty;
+ UserTrackingUsageLocalizationEnabled = false;
+ OverrideDefaultUserTrackingUsageDescriptions = false;
+ }
+ }
+ }
+
+ ///
+ /// A URL pointing to the Privacy Policy for the app to be shown when prompting the user for consent.
+ ///
+ public string ConsentFlowPrivacyPolicyUrl
+ {
+ get { return consentFlowPrivacyPolicyUrl; }
+ set { consentFlowPrivacyPolicyUrl = value; }
+ }
+
+ ///
+ /// An optional URL pointing to the Terms of Service for the app to be shown when prompting the user for consent.
+ ///
+ public string ConsentFlowTermsOfServiceUrl
+ {
+ get { return consentFlowTermsOfServiceUrl; }
+ set { consentFlowTermsOfServiceUrl = value; }
+ }
+
+ ///
+ /// Whether or not to show the Terms and Privacy Policy alert in GDPR regions prior to presenting the CMP prompt.
+ ///
+ public bool ShouldShowTermsAndPrivacyPolicyAlertInGDPR
+ {
+ get { return shouldShowTermsAndPrivacyPolicyAlertInGDPR; }
+ set { shouldShowTermsAndPrivacyPolicyAlertInGDPR = value; }
+ }
+
+ ///
+ /// A User Tracking Usage Description in English to be shown to users when requesting permission to use data for tracking.
+ /// For more information see Apple's documentation .
+ ///
+ public string UserTrackingUsageDescriptionEn
+ {
+ get { return userTrackingUsageDescriptionEn; }
+ set { userTrackingUsageDescriptionEn = value; }
+ }
+
+ ///
+ /// An optional string to set debug user geography
+ ///
+ public MaxSdkBase.ConsentFlowUserGeography DebugUserGeography
+ {
+ get { return debugUserGeography; }
+ set { debugUserGeography = value; }
+ }
+
+ public bool OverrideDefaultUserTrackingUsageDescriptions
+ {
+ get { return overrideDefaultUserTrackingUsageDescriptions; }
+ set
+ {
+ var previousValue = overrideDefaultUserTrackingUsageDescriptions;
+ overrideDefaultUserTrackingUsageDescriptions = value;
+
+ if (!value)
+ {
+ if (!previousValue) return;
+
+ UserTrackingUsageDescriptionEn = DefaultUserTrackingDescriptionEn;
+ UserTrackingUsageDescriptionDe = DefaultUserTrackingDescriptionDe;
+ UserTrackingUsageDescriptionEs = DefaultUserTrackingDescriptionEs;
+ UserTrackingUsageDescriptionFr = DefaultUserTrackingDescriptionFr;
+ UserTrackingUsageDescriptionJa = DefaultUserTrackingDescriptionJa;
+ UserTrackingUsageDescriptionKo = DefaultUserTrackingDescriptionKo;
+ UserTrackingUsageDescriptionZhHans = DefaultUserTrackingDescriptionZhHans;
+ UserTrackingUsageDescriptionZhHant = DefaultUserTrackingDescriptionZhHant;
+ }
+ }
+ }
+
+ ///
+ /// Whether or not to localize User Tracking Usage Description.
+ /// For more information see Apple's documentation: https://developer.apple.com/documentation/bundleresources/information_property_list/nsusertrackingusagedescription
+ ///
+ public bool UserTrackingUsageLocalizationEnabled
+ {
+ get { return userTrackingUsageLocalizationEnabled; }
+ set
+ {
+ var previousValue = userTrackingUsageLocalizationEnabled;
+ userTrackingUsageLocalizationEnabled = value;
+
+ if (value)
+ {
+ // If the value didn't change, don't do anything
+ if (previousValue) return;
+
+ // Don't set the default values if they are being overriden.
+ if (OverrideDefaultUserTrackingUsageDescriptions) return;
+
+ UserTrackingUsageDescriptionDe = DefaultUserTrackingDescriptionDe;
+ UserTrackingUsageDescriptionEs = DefaultUserTrackingDescriptionEs;
+ UserTrackingUsageDescriptionFr = DefaultUserTrackingDescriptionFr;
+ UserTrackingUsageDescriptionJa = DefaultUserTrackingDescriptionJa;
+ UserTrackingUsageDescriptionKo = DefaultUserTrackingDescriptionKo;
+ UserTrackingUsageDescriptionZhHans = DefaultUserTrackingDescriptionZhHans;
+ UserTrackingUsageDescriptionZhHant = DefaultUserTrackingDescriptionZhHant;
+ }
+ else
+ {
+ UserTrackingUsageDescriptionDe = string.Empty;
+ UserTrackingUsageDescriptionEs = string.Empty;
+ UserTrackingUsageDescriptionFr = string.Empty;
+ UserTrackingUsageDescriptionJa = string.Empty;
+ UserTrackingUsageDescriptionKo = string.Empty;
+ UserTrackingUsageDescriptionZhHans = string.Empty;
+ UserTrackingUsageDescriptionZhHant = string.Empty;
+ }
+ }
+ }
+
+ ///
+ /// A User Tracking Usage Description in German to be shown to users when requesting permission to use data for tracking.
+ /// For more information see Apple's documentation: https://developer.apple.com/documentation/bundleresources/information_property_list/nsusertrackingusagedescription
+ ///
+ public string UserTrackingUsageDescriptionDe
+ {
+ get { return userTrackingUsageDescriptionDe; }
+ set { userTrackingUsageDescriptionDe = value; }
+ }
+
+ ///
+ /// A User Tracking Usage Description in Spanish to be shown to users when requesting permission to use data for tracking.
+ /// For more information see Apple's documentation: https://developer.apple.com/documentation/bundleresources/information_property_list/nsusertrackingusagedescription
+ ///
+ public string UserTrackingUsageDescriptionEs
+ {
+ get { return userTrackingUsageDescriptionEs; }
+ set { userTrackingUsageDescriptionEs = value; }
+ }
+
+ ///
+ /// A User Tracking Usage Description in French to be shown to users when requesting permission to use data for tracking.
+ /// For more information see Apple's documentation: https://developer.apple.com/documentation/bundleresources/information_property_list/nsusertrackingusagedescription
+ ///
+ public string UserTrackingUsageDescriptionFr
+ {
+ get { return userTrackingUsageDescriptionFr; }
+ set { userTrackingUsageDescriptionFr = value; }
+ }
+
+ ///
+ /// A User Tracking Usage Description in Japanese to be shown to users when requesting permission to use data for tracking.
+ /// For more information see Apple's documentation: https://developer.apple.com/documentation/bundleresources/information_property_list/nsusertrackingusagedescription
+ ///
+ public string UserTrackingUsageDescriptionJa
+ {
+ get { return userTrackingUsageDescriptionJa; }
+ set { userTrackingUsageDescriptionJa = value; }
+ }
+
+ ///
+ /// A User Tracking Usage Description in Korean to be shown to users when requesting permission to use data for tracking.
+ /// For more information see Apple's documentation: https://developer.apple.com/documentation/bundleresources/information_property_list/nsusertrackingusagedescription
+ ///
+ public string UserTrackingUsageDescriptionKo
+ {
+ get { return userTrackingUsageDescriptionKo; }
+ set { userTrackingUsageDescriptionKo = value; }
+ }
+
+ ///
+ /// A User Tracking Usage Description in Chinese (Simplified) to be shown to users when requesting permission to use data for tracking.
+ /// For more information see Apple's documentation: https://developer.apple.com/documentation/bundleresources/information_property_list/nsusertrackingusagedescription
+ ///
+ public string UserTrackingUsageDescriptionZhHans
+ {
+ get { return userTrackingUsageDescriptionZhHans; }
+ set { userTrackingUsageDescriptionZhHans = value; }
+ }
+
+ ///
+ /// A User Tracking Usage Description in Chinese (Traditional) to be shown to users when requesting permission to use data for tracking.
+ /// For more information see Apple's documentation: https://developer.apple.com/documentation/bundleresources/information_property_list/nsusertrackingusagedescription
+ ///
+ public string UserTrackingUsageDescriptionZhHant
+ {
+ get { return userTrackingUsageDescriptionZhHant; }
+ set { userTrackingUsageDescriptionZhHant = value; }
+ }
+ }
+}
diff --git a/Assets/MaxSdk/Scripts/IntegrationManager/Editor/AppLovinInternalSettings.cs.meta b/Assets/MaxSdk/Scripts/IntegrationManager/Editor/AppLovinInternalSettings.cs.meta
new file mode 100644
index 0000000..a863905
--- /dev/null
+++ b/Assets/MaxSdk/Scripts/IntegrationManager/Editor/AppLovinInternalSettings.cs.meta
@@ -0,0 +1,14 @@
+fileFormatVersion: 2
+guid: 65c51e21887ae42c2839962fb9585e9f
+labels:
+- al_max
+- al_max_export_path-MaxSdk/Scripts/IntegrationManager/Editor/AppLovinInternalSettings.cs
+MonoImporter:
+ externalObjects: {}
+ serializedVersion: 2
+ defaultReferences: []
+ executionOrder: 0
+ icon: {instanceID: 0}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/MaxSdk/Scripts/IntegrationManager/Editor/AppLovinMenuItems.cs b/Assets/MaxSdk/Scripts/IntegrationManager/Editor/AppLovinMenuItems.cs
new file mode 100644
index 0000000..debdfd2
--- /dev/null
+++ b/Assets/MaxSdk/Scripts/IntegrationManager/Editor/AppLovinMenuItems.cs
@@ -0,0 +1,60 @@
+//
+// MaxMenuItems.cs
+// AppLovin MAX Unity Plugin
+//
+// Created by Santosh Bagadi on 5/27/19.
+// Copyright © 2019 AppLovin. All rights reserved.
+//
+
+using UnityEditor;
+using UnityEngine;
+
+namespace AppLovinMax.Scripts.IntegrationManager.Editor
+{
+ public static class AppLovinMenuItems
+ {
+ /**
+ * The special characters at the end represent a shortcut for this action.
+ *
+ * % - ctrl on Windows, cmd on macOS
+ * # - shift
+ * & - alt
+ *
+ * So, (shift + cmd/ctrl + i) will launch the integration manager
+ */
+ [MenuItem("AppLovin/Integration Manager %#i")]
+ private static void IntegrationManager()
+ {
+ ShowIntegrationManager();
+ }
+
+ [MenuItem("AppLovin/Documentation")]
+ private static void Documentation()
+ {
+ Application.OpenURL("https://support.axon.ai/en/max/unity/overview/integration");
+ }
+
+ [MenuItem("AppLovin/Contact Us")]
+ private static void ContactUs()
+ {
+ Application.OpenURL("https://www.applovin.com/contact/");
+ }
+
+ [MenuItem("AppLovin/About")]
+ private static void About()
+ {
+ Application.OpenURL("https://www.applovin.com/about/");
+ }
+
+ [MenuItem("Assets/AppLovin Integration Manager")]
+ private static void AssetsIntegrationManager()
+ {
+ ShowIntegrationManager();
+ }
+
+ private static void ShowIntegrationManager()
+ {
+ AppLovinIntegrationManagerWindow.ShowManager();
+ }
+ }
+}
diff --git a/Assets/MaxSdk/Scripts/IntegrationManager/Editor/AppLovinMenuItems.cs.meta b/Assets/MaxSdk/Scripts/IntegrationManager/Editor/AppLovinMenuItems.cs.meta
new file mode 100644
index 0000000..30fb834
--- /dev/null
+++ b/Assets/MaxSdk/Scripts/IntegrationManager/Editor/AppLovinMenuItems.cs.meta
@@ -0,0 +1,14 @@
+fileFormatVersion: 2
+guid: 02c2d277874f649d18a59d382420bf65
+labels:
+- al_max
+- al_max_export_path-MaxSdk/Scripts/IntegrationManager/Editor/AppLovinMenuItems.cs
+MonoImporter:
+ externalObjects: {}
+ serializedVersion: 2
+ defaultReferences: []
+ executionOrder: 0
+ icon: {instanceID: 0}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/MaxSdk/Scripts/IntegrationManager/Editor/AppLovinPackageManager.cs b/Assets/MaxSdk/Scripts/IntegrationManager/Editor/AppLovinPackageManager.cs
new file mode 100644
index 0000000..0945743
--- /dev/null
+++ b/Assets/MaxSdk/Scripts/IntegrationManager/Editor/AppLovinPackageManager.cs
@@ -0,0 +1,614 @@
+using System;
+using System.Collections;
+using System.Collections.Generic;
+using System.IO;
+using System.Linq;
+#if !UNITY_2020_1_OR_NEWER
+using System.Reflection;
+#endif
+using System.Xml.Linq;
+using UnityEditor;
+using UnityEditor.PackageManager;
+using UnityEngine;
+
+namespace AppLovinMax.Scripts.IntegrationManager.Editor
+{
+ [Serializable]
+ public class PackageInfo
+ {
+ // ReSharper disable InconsistentNaming - For JSON Deserialization
+ public string Name;
+ public string Version;
+ }
+
+ public interface IPackageManagerClient
+ {
+ IEnumerator AddNetwork(Network network, bool showImport);
+ void RemoveNetwork(Network network);
+ }
+
+ public static class AppLovinPackageManager
+ {
+ private const string AppLovinMediationAmazonAdapterDependenciesPath = "Amazon/Scripts/Mediations/AppLovinMediation/Editor/Dependencies.xml";
+
+ private static readonly IPackageManagerClient _upmPackageManager = new AppLovinUpmPackageManager();
+ private static readonly IPackageManagerClient _assetsPackageManager = new AppLovinAssetsPackageManager();
+
+ private static IPackageManagerClient PackageManagerClient
+ {
+ get
+ {
+ return AppLovinIntegrationManager.IsPluginInPackageManager ? _upmPackageManager : _assetsPackageManager;
+ }
+ }
+
+ internal static PluginData PluginData { get; set; }
+
+ ///
+ /// Checks whether or not an adapter with the given version or newer exists.
+ ///
+ /// The name of the network (the root adapter folder name in "MaxSdk/Mediation/" folder.
+ /// The min iOS adapter version to check for. Can be null if we want to check for any version.
+ /// The min android adapter version to check for. Can be null if we want to check for any version.
+ /// true if an adapter with the min version is installed.
+ internal static bool IsAdapterInstalled(string adapterName, string iosVersion = null, string androidVersion = null)
+ {
+ var dependencyFilePathList = GetAssetPathListForExportPath("MaxSdk/Mediation/" + adapterName + "/Editor/Dependencies.xml");
+ if (dependencyFilePathList.Count <= 0) return false;
+
+ var currentVersion = GetCurrentVersions(dependencyFilePathList);
+ if (iosVersion != null)
+ {
+ var iosVersionComparison = MaxSdkUtils.CompareVersions(currentVersion.Ios, iosVersion);
+ if (iosVersionComparison == MaxSdkUtils.VersionComparisonResult.Lesser)
+ {
+ return false;
+ }
+ }
+
+ if (androidVersion != null)
+ {
+ var androidVersionComparison = MaxSdkUtils.CompareVersions(currentVersion.Android, androidVersion);
+ if (androidVersionComparison == MaxSdkUtils.VersionComparisonResult.Lesser)
+ {
+ return false;
+ }
+ }
+
+ return true;
+ }
+
+ ///
+ /// Checks whether an adapter is installed using the plugin data.
+ ///
+ /// The plugin data to check for the adapter
+ /// The name of the network.
+ /// Whether an adapter is installed in the plugin data
+ internal static bool IsAdapterInstalled(PluginData pluginData, string adapterName)
+ {
+ var network = pluginData.MediatedNetworks.Where(mediatedNetwork => mediatedNetwork.Name.Equals(adapterName)).ToList().FirstOrDefault();
+ var networkVersion = network != null ? network.CurrentVersions : null;
+ var currentVersion = networkVersion != null ? networkVersion.Unity : "";
+
+ return MaxSdkUtils.IsValidString(currentVersion);
+ }
+
+ ///
+ /// Gets the mediation networks that are currently installed in the project. If using UPM, checks
+ /// for networks in Packages folder and Mediation folder in case a custom adapter was added to the project.
+ ///
+ /// A list of the installed mediation network names.
+ internal static List GetInstalledMediationNetworks()
+ {
+ var installedNetworks = new List();
+ var installedNetworksInAssets = AppLovinAssetsPackageManager.GetInstalledMediationNetworks();
+ installedNetworks.AddRange(installedNetworksInAssets);
+
+ var installedNetworksInPackages = AppLovinUpmPackageManager.GetInstalledMediationNetworks();
+ installedNetworks.AddRange(installedNetworksInPackages);
+
+ if (IsAmazonAppLovinAdapterInstalled())
+ {
+ installedNetworks.Add("AmazonAdMarketplace");
+ }
+
+ return installedNetworks;
+ }
+
+ ///
+ /// Adds a network to the project.
+ ///
+ /// The network to add.
+ /// Whether to show the import window (only for non UPM)
+ internal static IEnumerator AddNetwork(Network network, bool showImport)
+ {
+ yield return PackageManagerClient.AddNetwork(network, showImport);
+
+ AppLovinEditorCoroutine.StartCoroutine(RefreshAssetsAtEndOfFrame(network));
+ }
+
+ ///
+ /// Removes a network from the project.
+ ///
+ /// The network to remove.
+ internal static void RemoveNetwork(Network network)
+ {
+ PackageManagerClient.RemoveNetwork(network);
+
+ AppLovinEditorCoroutine.StartCoroutine(RefreshAssetsAtEndOfFrame(network));
+ }
+
+ #region Utility
+
+ ///
+ /// Gets the list of all asset paths for a given MAX plugin export path.
+ ///
+ /// The actual exported path of the asset.
+ /// The exported path of the MAX plugin asset or an empty list if the asset is not found.
+ private static List GetAssetPathListForExportPath(string exportPath)
+ {
+ var assetLabelToFind = "l:al_max_export_path-" + MaxSdkUtils.NormalizeToUnityPath(exportPath);
+ var assetGuids = AssetDatabase.FindAssets(assetLabelToFind);
+
+ var assetPaths = new List();
+ foreach (var assetGuid in assetGuids)
+ {
+ assetPaths.Add(AssetDatabase.GUIDToAssetPath(assetGuid));
+ }
+
+ return assetPaths.Count <= 0 ? new List() : assetPaths;
+ }
+
+ ///
+ /// Updates the CurrentVersion fields for a given network data object.
+ ///
+ /// Network for which to update the current versions.
+ internal static void UpdateCurrentVersions(Network network)
+ {
+ var assetPaths = GetAssetPathListForExportPath(network.DependenciesFilePath);
+ if (HasDuplicateAdapters(assetPaths))
+ {
+ ShowDeleteDuplicateAdapterPrompt(network);
+ }
+
+ var currentVersions = GetCurrentVersions(assetPaths);
+ network.CurrentVersions = currentVersions;
+
+ // If AppLovin mediation plugin, get the version from MaxSdk and the latest and current version comparison.
+ if (network.Name.Equals("APPLOVIN_NETWORK"))
+ {
+ network.CurrentVersions.Unity = MaxSdk.Version;
+
+ var unityVersionComparison = MaxSdkUtils.CompareVersions(network.CurrentVersions.Unity, network.LatestVersions.Unity);
+ var androidVersionComparison = MaxSdkUtils.CompareVersions(network.CurrentVersions.Android, network.LatestVersions.Android);
+ var iosVersionComparison = MaxSdkUtils.CompareVersions(network.CurrentVersions.Ios, network.LatestVersions.Ios);
+
+ // Overall version is same if all the current and latest (from db) versions are same.
+ if (unityVersionComparison == MaxSdkUtils.VersionComparisonResult.Equal &&
+ androidVersionComparison == MaxSdkUtils.VersionComparisonResult.Equal &&
+ iosVersionComparison == MaxSdkUtils.VersionComparisonResult.Equal)
+ {
+ network.CurrentToLatestVersionComparisonResult = MaxSdkUtils.VersionComparisonResult.Equal;
+ }
+ // One of the installed versions is newer than the latest versions which means that the publisher is on a beta version.
+ else if (unityVersionComparison == MaxSdkUtils.VersionComparisonResult.Greater ||
+ androidVersionComparison == MaxSdkUtils.VersionComparisonResult.Greater ||
+ iosVersionComparison == MaxSdkUtils.VersionComparisonResult.Greater)
+ {
+ network.CurrentToLatestVersionComparisonResult = MaxSdkUtils.VersionComparisonResult.Greater;
+ }
+ // We have a new version available if all Android, iOS and Unity has a newer version available in db.
+ else
+ {
+ network.CurrentToLatestVersionComparisonResult = MaxSdkUtils.VersionComparisonResult.Lesser;
+ }
+ }
+ // For all other mediation adapters, get the version comparison using their Unity versions.
+ else
+ {
+ // If adapter is indeed installed, compare the current (installed) and the latest (from db) versions, so that we can determine if the publisher is on an older, current or a newer version of the adapter.
+ // If the publisher is on a newer version of the adapter than the db version, that means they are on a beta version.
+ if (MaxSdkUtils.IsValidString(currentVersions.Unity))
+ {
+ network.CurrentToLatestVersionComparisonResult = AppLovinIntegrationManagerUtils.CompareUnityMediationVersions(currentVersions.Unity, network.LatestVersions.Unity);
+ }
+
+ if (MaxSdkUtils.IsValidString(network.CurrentVersions.Unity) && AppLovinAutoUpdater.MinAdapterVersions.ContainsKey(network.Name))
+ {
+ var comparisonResult = AppLovinIntegrationManagerUtils.CompareUnityMediationVersions(network.CurrentVersions.Unity, AppLovinAutoUpdater.MinAdapterVersions[network.Name]);
+ // Requires update if current version is lower than the min required version.
+ network.RequiresUpdate = comparisonResult < 0;
+ }
+ else
+ {
+ // Reset value so that the Integration manager can hide the alert icon once adapter is updated.
+ network.RequiresUpdate = false;
+ }
+ }
+ }
+
+ ///
+ /// Checks whether a network has duplicate adapters installed in both the Assets folder and via UPM.
+ ///
+ /// The list of paths to the dependencies.xml files
+ /// True if there are adapters in both the Assets folder and installed via UPM
+ private static bool HasDuplicateAdapters(List dependencyPaths)
+ {
+ var inPackagesFolder = dependencyPaths.Any(path => path.Contains("Packages"));
+ var inAssetsFolder = dependencyPaths.Any(path => path.Contains("Assets"));
+
+ return inPackagesFolder && inAssetsFolder;
+ }
+
+ ///
+ /// Displays a prompt informing the user that duplicate adapters were detected
+ /// and allows them to choose which version to keep.
+ ///
+ /// The network that has duplicate adapters installed.
+ private static void ShowDeleteDuplicateAdapterPrompt(Network network)
+ {
+ var keepAssetsAdapter = EditorUtility.DisplayDialog("Duplicate Adapters Detected",
+ "The " + network.DisplayName + " adapter is installed in both the Assets folder and via UPM. Please choose which version to keep.",
+ "Keep Assets Folder Version",
+ "Keep UPM Version");
+ DeleteDuplicateAdapter(network, keepAssetsAdapter);
+ }
+
+ ///
+ /// Removes a duplicate adapter by either deleting it from the Assets folder
+ /// or uninstalling it from the Unity Package Manager (UPM).
+ ///
+ /// The network for which the duplicate adapter is being removed.
+ /// If true , retains the adapter in the Assets folder and removes the UPM version;
+ /// otherwise, deletes the adapter from the Assets folder.
+ internal static void DeleteDuplicateAdapter(Network network, bool keepAssetsAdapter)
+ {
+ // Skip duplicate removal logic for our plugin.
+ if (network.Name.Equals("APPLOVIN_NETWORK")) return;
+
+ if (keepAssetsAdapter)
+ {
+ var appLovinManifest = AppLovinUpmManifest.Load();
+ AppLovinUpmPackageManager.RemovePackages(network, appLovinManifest);
+ appLovinManifest.Save();
+ }
+ else
+ {
+ foreach (var pluginFilePath in network.PluginFilePaths)
+ {
+ var filePath = Path.Combine(AppLovinIntegrationManager.MediationDirectory, pluginFilePath.Replace("MaxSdk/Mediation/", ""));
+ FileUtil.DeleteFileOrDirectory(filePath);
+ FileUtil.DeleteFileOrDirectory(filePath + ".meta");
+ }
+ }
+
+ AppLovinUpmPackageManager.ResolvePackageManager();
+ }
+
+ ///
+ /// Gets the current versions for a given network's dependency file paths. UPM will have multiple paths
+ /// for each network - one each for iOS and Android.
+ ///
+ /// A list of dependency file paths to extract current versions from.
+ /// Current versions of a given network's dependency files.
+ private static Versions GetCurrentVersions(List dependencyPaths)
+ {
+ var currentVersions = new Versions();
+ foreach (var dependencyPath in dependencyPaths)
+ {
+ GetCurrentVersion(currentVersions, dependencyPath);
+ }
+
+ if (currentVersions.Android != null && currentVersions.Ios != null)
+ {
+ currentVersions.Unity = "android_" + currentVersions.Android + "_ios_" + currentVersions.Ios;
+ }
+ else if (currentVersions.Android != null)
+ {
+ currentVersions.Unity = "android_" + currentVersions.Android;
+ }
+ else if (currentVersions.Ios != null)
+ {
+ currentVersions.Unity = "ios_" + currentVersions.Ios;
+ }
+
+ return currentVersions;
+ }
+
+ ///
+ /// Extracts the current version of a network from its dependency.xml file.
+ ///
+ /// The Versions object we are using.
+ /// The path to the dependency.xml file.
+ private static void GetCurrentVersion(Versions currentVersions, string dependencyPath)
+ {
+ XDocument dependency;
+ try
+ {
+ dependency = XDocument.Load(dependencyPath);
+ }
+#pragma warning disable 0168
+ catch (IOException exception)
+#pragma warning restore 0168
+ {
+ // Couldn't find the dependencies file. The plugin is not installed.
+ return;
+ }
+
+ //
+ //
+ //
+ //
+ //
+ //
+ //
+ //
+ string androidVersion = null;
+ string iosVersion = null;
+ var dependenciesElement = dependency.Element("dependencies");
+ if (dependenciesElement != null)
+ {
+ var androidPackages = dependenciesElement.Element("androidPackages");
+ if (androidPackages != null)
+ {
+ var adapterPackage = androidPackages.Descendants().FirstOrDefault(element => element.Name.LocalName.Equals("androidPackage")
+ && element.FirstAttribute.Name.LocalName.Equals("spec")
+ && element.FirstAttribute.Value.StartsWith("com.applovin"));
+ if (adapterPackage != null)
+ {
+ androidVersion = adapterPackage.FirstAttribute.Value.Split(':').Last();
+ // Hack alert: Some Android versions might have square brackets to force a specific version. Remove them if they are detected.
+ if (androidVersion.StartsWith("["))
+ {
+ androidVersion = androidVersion.Trim('[', ']');
+ }
+ }
+ }
+
+ var iosPods = dependenciesElement.Element("iosPods");
+ if (iosPods != null)
+ {
+ var adapterPod = iosPods.Descendants().FirstOrDefault(element => element.Name.LocalName.Equals("iosPod")
+ && element.FirstAttribute.Name.LocalName.Equals("name")
+ && element.FirstAttribute.Value.StartsWith("AppLovin"));
+ if (adapterPod != null)
+ {
+ iosVersion = adapterPod.Attributes().First(attribute => attribute.Name.LocalName.Equals("version")).Value;
+ }
+ }
+ }
+
+ if (androidVersion != null)
+ {
+ currentVersions.Android = androidVersion;
+ }
+
+ if (iosVersion != null)
+ {
+ currentVersions.Ios = iosVersion;
+ }
+ }
+
+ ///
+ /// Check for the Amazon AppLovin adapter in the project.
+ ///
+ /// Whether the AppLovin Adapter is installed through the Amazon SDK.
+ private static bool IsAmazonAppLovinAdapterInstalled()
+ {
+ string[] dependenciesFiles = AssetDatabase.FindAssets("t:TextAsset Dependencies", new[] {"Assets"})
+ .Select(AssetDatabase.GUIDToAssetPath)
+ .ToArray();
+
+ // Use regex to search for Amazon and then AppLovin in the file paths of the dependencies.xml files.
+ return dependenciesFiles.Any(filePath => filePath.Contains(AppLovinMediationAmazonAdapterDependenciesPath));
+ }
+
+ ///
+ /// Refresh assets and update current versions after a slight delay to allow for Client.Resolve to finish.
+ ///
+ /// The network that was just installed/removed.
+ private static IEnumerator RefreshAssetsAtEndOfFrame(Network network)
+ {
+ yield return new WaitForEndOfFrame();
+ UpdateCurrentVersions(network);
+ AssetDatabase.Refresh();
+ }
+
+ #endregion
+ }
+
+ public class AppLovinUpmPackageManager : IPackageManagerClient
+ {
+ public const string PackageNamePrefixAppLovin = "com.applovin.mediation.ads";
+ private const string PackageNamePrefixNetwork = "com.applovin.mediation.adapters";
+ private const string PackageNamePrefixDsp = "com.applovin.mediation.dsp";
+
+ private const float TimeoutFetchPackageCollectionSeconds = 10f;
+
+#if !UNITY_2020_1_OR_NEWER
+ private static Type packageManagerClientType;
+ private static MethodInfo packageManagerResolveMethod;
+#endif
+
+ public static List GetInstalledMediationNetworks()
+ {
+ // Return empty list if we failed to get the package list
+ var packageCollection = GetPackageCollectionSync(TimeoutFetchPackageCollectionSeconds);
+ if (packageCollection == null)
+ {
+ return new List();
+ }
+
+ return packageCollection.Where(package => package.name.StartsWith(PackageNamePrefixNetwork) || package.name.StartsWith(PackageNamePrefixDsp))
+ .SelectMany(package => package.keywords)
+ .Where(keyword => keyword.StartsWith("dir:"))
+ .Select(keyword => keyword.Replace("dir:", ""))
+ .Distinct()
+ .ToList();
+ }
+
+ public IEnumerator AddNetwork(Network network, bool showImport)
+ {
+ var appLovinManifest = AppLovinUpmManifest.Load();
+ AddPackages(network, appLovinManifest);
+ appLovinManifest.Save();
+
+ // Remove any versions of the adapter in the Assets folder
+ AppLovinPackageManager.DeleteDuplicateAdapter(network, false);
+ ResolvePackageManager();
+
+ yield break;
+ }
+
+ public void RemoveNetwork(Network network)
+ {
+ var appLovinManifest = AppLovinUpmManifest.Load();
+ RemovePackages(network, appLovinManifest);
+ appLovinManifest.Save();
+ ResolvePackageManager();
+ }
+
+ ///
+ /// Adds a network's packages to the package manager removes any beta version that exists
+ ///
+ /// The network to add.
+ /// The AppLovinUpmManifest instance to edit
+ internal static void AddPackages(Network network, AppLovinUpmManifest appLovinManifest)
+ {
+ foreach (var packageInfo in network.Packages)
+ {
+ appLovinManifest.AddPackageDependency(packageInfo.Name, packageInfo.Version);
+ RemoveBetaPackage(packageInfo.Name, appLovinManifest);
+ }
+ }
+
+ ///
+ /// Removes a network's packages from the package manager
+ ///
+ /// The network to add.
+ /// The AppLovinUpmManifest instance to edit
+ internal static void RemovePackages(Network network, AppLovinUpmManifest appLovinManifest)
+ {
+ foreach (var packageInfo in network.Packages)
+ {
+ appLovinManifest.RemovePackageDependency(packageInfo.Name);
+ RemoveBetaPackage(packageInfo.Name, appLovinManifest);
+ }
+ }
+
+ ///
+ /// Removes the beta version of a package name
+ ///
+ /// The name of the package to remove a beta for
+ /// The AppLovinUpmManifest instance to edit
+ private static void RemoveBetaPackage(string packageName, AppLovinUpmManifest appLovinManifest)
+ {
+ var prefix = "";
+ if (packageName.Contains(PackageNamePrefixNetwork))
+ {
+ prefix = PackageNamePrefixNetwork;
+ }
+ else if (packageName.Contains(PackageNamePrefixDsp))
+ {
+ prefix = PackageNamePrefixDsp;
+ }
+ else if (packageName.Contains(PackageNamePrefixAppLovin))
+ {
+ prefix = PackageNamePrefixAppLovin;
+ }
+ else
+ {
+ return;
+ }
+
+ var betaPackageName = packageName.Replace(prefix, prefix + ".beta");
+ appLovinManifest.RemovePackageDependency(betaPackageName);
+ }
+
+ ///
+ /// Resolves the Unity Package Manager so any changes made to the manifest.json file are reflected in the Unity Editor.
+ ///
+ internal static void ResolvePackageManager()
+ {
+#if UNITY_2020_1_OR_NEWER
+ Client.Resolve();
+#else
+ packageManagerClientType = packageManagerClientType ?? typeof(Client);
+ if (packageManagerClientType != null)
+ {
+ packageManagerResolveMethod = packageManagerResolveMethod ?? packageManagerClientType.GetMethod("Resolve", BindingFlags.NonPublic | BindingFlags.Static);
+ }
+
+ if (packageManagerResolveMethod != null)
+ {
+ packageManagerResolveMethod.Invoke(null, null);
+ }
+#endif
+ }
+
+ ///
+ /// Gets the PackageCollection from the Unity Package Manager synchronously.
+ ///
+ /// How long to wait before exiting with a timeout error
+ ///
+ private static PackageCollection GetPackageCollectionSync(float timeoutSeconds = -1)
+ {
+ var request = Client.List();
+
+ // Just wait till the request is complete
+ var now = DateTime.Now;
+ while (!request.IsCompleted)
+ {
+ // Wait indefinitely if there is no timeout set.
+ if (timeoutSeconds < 0) continue;
+
+ var delta = DateTime.Now - now;
+ if (delta.TotalSeconds > timeoutSeconds)
+ {
+ MaxSdkLogger.UserError("Failed to list UPM packages: Timeout");
+ break;
+ }
+ }
+
+ if (!request.IsCompleted)
+ {
+ return null;
+ }
+
+ if (request.Status >= StatusCode.Failure)
+ {
+ MaxSdkLogger.UserError("Failed to list packages: " + request.Error.message);
+ return null;
+ }
+
+ return (request.Status == StatusCode.Success) ? request.Result : null;
+ }
+ }
+
+ public class AppLovinAssetsPackageManager : IPackageManagerClient
+ {
+ public static List GetInstalledMediationNetworks()
+ {
+ var maxMediationDirectory = AppLovinIntegrationManager.MediationDirectory;
+ if (!Directory.Exists(maxMediationDirectory)) return new List();
+
+ var mediationNetworkDirectories = Directory.GetDirectories(maxMediationDirectory);
+ return mediationNetworkDirectories.Select(Path.GetFileName).ToList();
+ }
+
+ public IEnumerator AddNetwork(Network network, bool showImport)
+ {
+ yield return AppLovinIntegrationManager.Instance.DownloadPlugin(network, showImport);
+ }
+
+ public void RemoveNetwork(Network network)
+ {
+ foreach (var pluginFilePath in network.PluginFilePaths)
+ {
+ var filePath = Path.Combine(AppLovinIntegrationManager.PluginParentDirectory, pluginFilePath);
+ FileUtil.DeleteFileOrDirectory(filePath);
+ FileUtil.DeleteFileOrDirectory(filePath + ".meta");
+ }
+ }
+ }
+}
diff --git a/Assets/MaxSdk/Scripts/IntegrationManager/Editor/AppLovinPackageManager.cs.meta b/Assets/MaxSdk/Scripts/IntegrationManager/Editor/AppLovinPackageManager.cs.meta
new file mode 100644
index 0000000..5a508fa
--- /dev/null
+++ b/Assets/MaxSdk/Scripts/IntegrationManager/Editor/AppLovinPackageManager.cs.meta
@@ -0,0 +1,14 @@
+fileFormatVersion: 2
+guid: 69faa9dfd9aac483daa24261a3e11206
+labels:
+- al_max
+- al_max_export_path-MaxSdk/Scripts/IntegrationManager/Editor/AppLovinPackageManager.cs
+MonoImporter:
+ externalObjects: {}
+ serializedVersion: 2
+ defaultReferences: []
+ executionOrder: 0
+ icon: {instanceID: 0}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/MaxSdk/Scripts/IntegrationManager/Editor/AppLovinPluginMigrationHelper.cs b/Assets/MaxSdk/Scripts/IntegrationManager/Editor/AppLovinPluginMigrationHelper.cs
new file mode 100644
index 0000000..e240323
--- /dev/null
+++ b/Assets/MaxSdk/Scripts/IntegrationManager/Editor/AppLovinPluginMigrationHelper.cs
@@ -0,0 +1,166 @@
+using System.Collections.Generic;
+using System.IO;
+using System.Linq;
+using UnityEditor;
+using UnityEngine;
+
+namespace AppLovinMax.Scripts.IntegrationManager.Editor
+{
+ ///
+ /// Moves our SDK Unity Plugin from under the Assets folder to the Unity Package Manager.
+ ///
+ public static class AppLovinPluginMigrationHelper
+ {
+ private const string ApplovinRegistryName = "AppLovin MAX Unity";
+ private const string ApplovinRegistryUrl = "https://unity.packages.applovin.com/";
+ private static readonly List AppLovinRegistryScopes = new List() {"com.applovin.mediation.ads", "com.applovin.mediation.adapters", "com.applovin.mediation.dsp"};
+
+ private const string OpenUpmRegistryName = "package.openupm.com";
+ private const string OpenUpmRegistryUrl = "https://package.openupm.com";
+ private static readonly List OpenUpmRegistryScopes = new List() {"com.google.external-dependency-manager"};
+
+ private static List betaNetworkPluginFilePaths = new List();
+
+ ///
+ /// Attempts to move the Unity plugin to UPM by adding the AppLovin scoped registry and dependencies to the manifest.
+ ///
+ /// The Unity Plugin data for our sdk and mediation adapters.
+ /// Whether to delete the EDM folder under "Assets"
+ internal static void MigrateToUnityPackageManager(PluginData pluginData, bool deleteExternalDependencyManager)
+ {
+ MaxSdkLogger.UserDebug("Moving AppLovin Unity Plugin to package manager");
+
+ if (deleteExternalDependencyManager)
+ {
+ DeleteExternalDependencyManager();
+ }
+
+ var appLovinManifest = AppLovinUpmManifest.Load();
+
+ MigrateAdapters(pluginData, appLovinManifest);
+ MigratePlugin(pluginData, appLovinManifest);
+
+ appLovinManifest.Save();
+ AppLovinUpmPackageManager.ResolvePackageManager();
+ DeletePluginFiles();
+ }
+
+ ///
+ /// Add all currently installed networks to the manifest.
+ ///
+ internal static void MigrateAdapters(PluginData pluginData, AppLovinUpmManifest appLovinManifest)
+ {
+ var allNetworks = pluginData.MediatedNetworks.Concat(pluginData.PartnerMicroSdks).ToArray();
+ betaNetworkPluginFilePaths.Clear();
+
+ // Add every currently installed network and separate it by android and iOS.
+ foreach (var network in allNetworks)
+ {
+ var currentVersion = network.CurrentVersions != null ? network.CurrentVersions.Unity : "";
+ if (string.IsNullOrEmpty(currentVersion)) continue;
+
+ if (currentVersion.Contains("beta"))
+ {
+ betaNetworkPluginFilePaths.AddRange(network.PluginFilePaths);
+ continue;
+ }
+
+ AppLovinUpmPackageManager.AddPackages(network, appLovinManifest);
+ }
+ }
+
+ ///
+ /// Add the AppLovin scoped registry to the manifest if it doesn't exist. Otherwise update it.
+ ///
+ private static void MigratePlugin(PluginData pluginData, AppLovinUpmManifest appLovinManifest)
+ {
+ appLovinManifest.AddOrUpdateRegistry(ApplovinRegistryName, ApplovinRegistryUrl, AppLovinRegistryScopes);
+ appLovinManifest.AddOrUpdateRegistry(OpenUpmRegistryName, OpenUpmRegistryUrl, OpenUpmRegistryScopes);
+
+ var appLovinVersion = pluginData.AppLovinMax.LatestVersions.Unity;
+ appLovinManifest.AddPackageDependency(AppLovinUpmPackageManager.PackageNamePrefixAppLovin, appLovinVersion);
+ }
+
+ #region Utility
+
+ ///
+ /// Delete the external dependency manager folder from the project.
+ ///
+ private static void DeleteExternalDependencyManager()
+ {
+ var externalDependencyManagerPath = Path.Combine(Application.dataPath, "ExternalDependencyManager");
+ FileUtil.DeleteFileOrDirectory(externalDependencyManagerPath);
+ FileUtil.DeleteFileOrDirectory(externalDependencyManagerPath + ".meta");
+ }
+
+ ///
+ /// Deletes all the files in the plugin directory except the AppLovinSettings.asset file.
+ ///
+ private static void DeletePluginFiles()
+ {
+ if (AppLovinIntegrationManager.IsPluginInPackageManager) return;
+
+ var pluginPath = Path.Combine(AppLovinIntegrationManager.PluginParentDirectory, "MaxSdk");
+ var appLovinSettingsPath = Path.Combine(pluginPath, "Resources/AppLovinSettings.asset");
+
+ var appLovinResourcesDirectory = Path.Combine(pluginPath, "Resources");
+ var appLovinSettingsTempPath = Path.Combine(Path.GetTempPath(), "AppLovinSettings.asset");
+ var appLovinMediationTempPath = Path.Combine(Path.GetTempPath(), "Mediation");
+
+ // Ensure there aren't any errors when moving the files due to the directories/files already existing.
+ FileUtil.DeleteFileOrDirectory(appLovinSettingsTempPath);
+ FileUtil.DeleteFileOrDirectory(appLovinMediationTempPath);
+
+ var mediationAssetsDir = Path.Combine(AppLovinIntegrationManager.PluginParentDirectory, "MaxSdk/Mediation");
+
+ // Move the AppLovinSettings.asset file and any beta adapters to a temporary directory.
+ File.Move(appLovinSettingsPath, appLovinSettingsTempPath);
+ var adapterSaved = MoveBetaAdaptersIfNeeded(mediationAssetsDir, appLovinMediationTempPath);
+
+ // Move the meta file if the adapter was saved to save the asset labels
+ if (adapterSaved)
+ {
+ File.Move(mediationAssetsDir, appLovinMediationTempPath + ".meta");
+ }
+
+ // Delete the plugin directory and then move the AppLovinSettings.asset and beta adapters back.
+ FileUtil.DeleteFileOrDirectory(pluginPath);
+ Directory.CreateDirectory(appLovinResourcesDirectory);
+ File.Move(appLovinSettingsTempPath, appLovinSettingsPath);
+ MoveBetaAdaptersIfNeeded(appLovinMediationTempPath, mediationAssetsDir);
+ if (adapterSaved)
+ {
+ File.Move(appLovinMediationTempPath + ".meta", mediationAssetsDir);
+ }
+
+ FileUtil.DeleteFileOrDirectory(appLovinMediationTempPath);
+ }
+
+ ///
+ /// Moves the beta adapters from a source mediation directory to a destination mediation directory.
+ ///
+ /// The directory containing the beta adapters to be moved.
+ /// The target directory where the beta adapters should be moved.
+ private static bool MoveBetaAdaptersIfNeeded(string sourceMediationDirectory, string destinationMediationDirectory)
+ {
+ if (betaNetworkPluginFilePaths.Count == 0 || !Directory.Exists(sourceMediationDirectory)) return false;
+
+ var movedAdapter = false;
+ Directory.CreateDirectory(destinationMediationDirectory);
+ foreach (var pluginFilePath in betaNetworkPluginFilePaths)
+ {
+ var sourceDirectory = Path.Combine(sourceMediationDirectory, Path.GetFileName(pluginFilePath));
+ var destinationDirectory = Path.Combine(destinationMediationDirectory, Path.GetFileName(pluginFilePath));
+ if (Directory.Exists(sourceDirectory))
+ {
+ Directory.Move(sourceDirectory, destinationDirectory);
+ movedAdapter = true;
+ }
+ }
+
+ return movedAdapter;
+ }
+
+ #endregion
+ }
+}
diff --git a/Assets/MaxSdk/Scripts/IntegrationManager/Editor/AppLovinPluginMigrationHelper.cs.meta b/Assets/MaxSdk/Scripts/IntegrationManager/Editor/AppLovinPluginMigrationHelper.cs.meta
new file mode 100644
index 0000000..dc78f48
--- /dev/null
+++ b/Assets/MaxSdk/Scripts/IntegrationManager/Editor/AppLovinPluginMigrationHelper.cs.meta
@@ -0,0 +1,14 @@
+fileFormatVersion: 2
+guid: 11288612632de49b99708cdee436692c
+labels:
+- al_max
+- al_max_export_path-MaxSdk/Scripts/IntegrationManager/Editor/AppLovinPluginMigrationHelper.cs
+MonoImporter:
+ externalObjects: {}
+ serializedVersion: 2
+ defaultReferences: []
+ executionOrder: 0
+ icon: {instanceID: 0}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/MaxSdk/Scripts/IntegrationManager/Editor/AppLovinPostProcessAndroid.cs b/Assets/MaxSdk/Scripts/IntegrationManager/Editor/AppLovinPostProcessAndroid.cs
new file mode 100644
index 0000000..ae86796
--- /dev/null
+++ b/Assets/MaxSdk/Scripts/IntegrationManager/Editor/AppLovinPostProcessAndroid.cs
@@ -0,0 +1,482 @@
+//
+// MaxPostProcessBuildAndroid.cs
+// AppLovin MAX Unity Plugin
+//
+// Created by Santosh Bagadi on 4/10/20.
+// Copyright © 2020 AppLovin. All rights reserved.
+//
+
+#if UNITY_ANDROID
+using System;
+using System.Collections.Generic;
+using System.IO;
+using System.Linq;
+using System.Text.RegularExpressions;
+using System.Xml.Linq;
+using AppLovinMax.ThirdParty.MiniJson;
+using UnityEditor;
+using UnityEditor.Android;
+
+namespace AppLovinMax.Scripts.IntegrationManager.Editor
+{
+ ///
+ /// A post processor used to update the Android project once it is generated.
+ ///
+ public class AppLovinPostProcessAndroid : IPostGenerateGradleAndroidProject
+ {
+ private const string PropertyAndroidX = "android.useAndroidX";
+ private const string PropertyJetifier = "android.enableJetifier";
+ private const string EnableProperty = "=true";
+ private const string PropertyDexingArtifactTransform = "android.enableDexingArtifactTransform";
+ private const string DisableProperty = "=false";
+
+ private const string KeyMetaDataAppLovinVerboseLoggingOn = "applovin.sdk.verbose_logging";
+ private const string KeyMetaDataGoogleApplicationId = "com.google.android.gms.ads.APPLICATION_ID";
+ private const string KeyMetaDataGoogleOptimizeInitialization = "com.google.android.gms.ads.flag.OPTIMIZE_INITIALIZATION";
+ private const string KeyMetaDataGoogleOptimizeAdLoading = "com.google.android.gms.ads.flag.OPTIMIZE_AD_LOADING";
+
+ private const string KeyMetaDataMobileFuseAutoInit = "com.mobilefuse.sdk.disable_auto_init";
+ private const string KeyMetaDataMyTargetAutoInit = "com.my.target.autoInitMode";
+
+ private const string KeyMetaDataAppLovinSdkKey = "applovin.sdk.key";
+
+ private const string AppLovinSettingsFileName = "applovin_settings.json";
+
+ private const string KeySdkKey = "sdk_key";
+ private const string KeyConsentFlowSettings = "consent_flow_settings";
+ private const string KeyConsentFlowEnabled = "consent_flow_enabled";
+ private const string KeyConsentFlowTermsOfService = "consent_flow_terms_of_service";
+ private const string KeyConsentFlowPrivacyPolicy = "consent_flow_privacy_policy";
+ private const string KeyConsentFlowShowTermsAndPrivacyPolicyAlertInGDPR = "consent_flow_show_terms_and_privacy_policy_alert_in_gdpr";
+ private const string KeyConsentFlowDebugUserGeography = "consent_flow_debug_user_geography";
+
+ private const string KeyRenderOutsideSafeArea = "render_outside_safe_area";
+
+#if UNITY_2022_3_OR_NEWER
+ // To match "'com.android.library' version '7.3.1'" line in build.gradle
+ private static readonly Regex TokenGradleVersionLibrary = new Regex(".*id ['\"]com\\.android\\.library['\"] version");
+ private static readonly Regex TokenGradleVersion = new Regex(".*id ['\"]com\\.android\\.application['\"] version");
+#else
+ // To match "classpath 'com.android.tools.build:gradle:4.0.1'" line in build.gradle
+ private static readonly Regex TokenGradleVersion = new Regex(".*classpath ['\"]com\\.android\\.tools\\.build:gradle:.*");
+#endif
+
+ // To match "distributionUrl=..." in gradle-wrapper.properties file
+ private static readonly Regex TokenDistributionUrl = new Regex(".*distributionUrl.*");
+
+ private static readonly XNamespace AndroidNamespace = "http://schemas.android.com/apk/res/android";
+
+ public void OnPostGenerateGradleAndroidProject(string path)
+ {
+ var rootGradleBuildFilePath = Path.Combine(path, "../build.gradle");
+ var gradlePropertiesPath = Path.Combine(path, "../gradle.properties");
+ var gradleWrapperPropertiesPath = Path.Combine(path, "../gradle/wrapper/gradle-wrapper.properties");
+
+ UpdateGradleVersionsIfNeeded(gradleWrapperPropertiesPath, rootGradleBuildFilePath);
+
+ var gradlePropertiesUpdated = new List();
+
+ // If the gradle properties file already exists, make sure to add any previous properties.
+ if (File.Exists(gradlePropertiesPath))
+ {
+ var lines = File.ReadAllLines(gradlePropertiesPath);
+
+ // Add all properties except AndroidX, Jetifier, and DexingArtifactTransform since they may already exist. We will re-add them below.
+ gradlePropertiesUpdated.AddRange(lines.Where(line => !line.Contains(PropertyAndroidX) && !line.Contains(PropertyJetifier) && !line.Contains(PropertyDexingArtifactTransform)));
+ }
+
+ // Enable AndroidX and Jetifier properties
+ gradlePropertiesUpdated.Add(PropertyAndroidX + EnableProperty);
+ gradlePropertiesUpdated.Add(PropertyJetifier + EnableProperty);
+
+ // `DexingArtifactTransform` has been removed in Gradle 8+ which is the default Gradle version for Unity 6.
+#if !UNITY_6000_0_OR_NEWER
+ // Disable dexing using artifact transform (it causes issues for ExoPlayer with Gradle plugin 3.5.0+)
+ gradlePropertiesUpdated.Add(PropertyDexingArtifactTransform + DisableProperty);
+#endif
+
+ try
+ {
+ File.WriteAllText(gradlePropertiesPath, string.Join("\n", gradlePropertiesUpdated.ToArray()) + "\n");
+ }
+ catch (Exception exception)
+ {
+ MaxSdkLogger.UserError("Failed to enable AndroidX and Jetifier. gradle.properties file write failed.");
+ Console.WriteLine(exception);
+ }
+
+ ProcessAndroidManifest(path);
+ AddSdkSettings(path);
+ }
+
+ public int callbackOrder
+ {
+ get { return AppLovinPreProcess.CallbackOrder; }
+ }
+
+ private static void ProcessAndroidManifest(string path)
+ {
+ var manifestPath = Path.Combine(path, "src/main/AndroidManifest.xml");
+ XDocument manifest;
+ try
+ {
+ manifest = XDocument.Load(manifestPath);
+ }
+#pragma warning disable 0168
+ catch (IOException exception)
+#pragma warning restore 0168
+ {
+ MaxSdkLogger.UserWarning("[AppLovin MAX] AndroidManifest.xml is missing.");
+ return;
+ }
+
+ // Get the `manifest` element.
+ var elementManifest = manifest.Element("manifest");
+ if (elementManifest == null)
+ {
+ MaxSdkLogger.UserWarning("[AppLovin MAX] AndroidManifest.xml is invalid.");
+ return;
+ }
+
+ var elementApplication = elementManifest.Element("application");
+ if (elementApplication == null)
+ {
+ MaxSdkLogger.UserWarning("[AppLovin MAX] AndroidManifest.xml is invalid.");
+ return;
+ }
+
+ var metaDataElements = elementApplication.Descendants().Where(element => element.Name.LocalName.Equals("meta-data"));
+
+ EnableVerboseLoggingIfNeeded(elementApplication);
+ AddGoogleApplicationIdIfNeeded(elementApplication, metaDataElements);
+ AddGoogleOptimizationFlagsIfNeeded(elementApplication, metaDataElements);
+ DisableAutoInitIfNeeded(elementApplication, metaDataElements);
+ RemoveSdkKeyIfNeeded(metaDataElements);
+
+ // Save the updated manifest file.
+ manifest.Save(manifestPath);
+ }
+
+ private static void EnableVerboseLoggingIfNeeded(XElement elementApplication)
+ {
+ var enabled = EditorPrefs.GetBool(MaxSdkLogger.KeyVerboseLoggingEnabled, false);
+
+ var descendants = elementApplication.Descendants();
+ var verboseLoggingMetaData = descendants.FirstOrDefault(descendant => descendant.FirstAttribute != null &&
+ descendant.FirstAttribute.Name.LocalName.Equals("name") &&
+ descendant.FirstAttribute.Value.Equals(KeyMetaDataAppLovinVerboseLoggingOn) &&
+ descendant.LastAttribute != null &&
+ descendant.LastAttribute.Name.LocalName.Equals("value"));
+
+ // check if applovin.sdk.verbose_logging meta data exists.
+ if (verboseLoggingMetaData != null)
+ {
+ if (enabled)
+ {
+ // update applovin.sdk.verbose_logging meta data value.
+ verboseLoggingMetaData.LastAttribute.Value = enabled.ToString();
+ }
+ else
+ {
+ // remove applovin.sdk.verbose_logging meta data.
+ verboseLoggingMetaData.Remove();
+ }
+ }
+ else
+ {
+ if (enabled)
+ {
+ // add applovin.sdk.verbose_logging meta data if it does not exist.
+ var metaData = CreateMetaDataElement(KeyMetaDataAppLovinVerboseLoggingOn, enabled.ToString());
+ elementApplication.Add(metaData);
+ }
+ }
+ }
+
+ private static void AddGoogleApplicationIdIfNeeded(XElement elementApplication, IEnumerable metaDataElements)
+ {
+ if (!AppLovinPackageManager.IsAdapterInstalled("Google") && !AppLovinPackageManager.IsAdapterInstalled("GoogleAdManager")) return;
+
+ var googleApplicationIdMetaData = GetMetaDataElement(metaDataElements, KeyMetaDataGoogleApplicationId);
+ var appId = AppLovinSettings.Instance.AdMobAndroidAppId;
+ // Log error if the App ID is not set.
+ if (string.IsNullOrEmpty(appId) || !appId.StartsWith("ca-app-pub-"))
+ {
+ MaxSdkLogger.UserError("Google App ID is not set. Please enter a valid app ID within the AppLovin Integration Manager window.");
+ return;
+ }
+
+ // Check if the Google App ID meta data already exists. Update if it already exists.
+ if (googleApplicationIdMetaData != null)
+ {
+ googleApplicationIdMetaData.SetAttributeValue(AndroidNamespace + "value", appId);
+ }
+ // Meta data doesn't exist, add it.
+ else
+ {
+ elementApplication.Add(CreateMetaDataElement(KeyMetaDataGoogleApplicationId, appId));
+ }
+ }
+
+ private static void AddGoogleOptimizationFlagsIfNeeded(XElement elementApplication, IEnumerable metaDataElements)
+ {
+ if (!AppLovinPackageManager.IsAdapterInstalled("Google") && !AppLovinPackageManager.IsAdapterInstalled("GoogleAdManager")) return;
+
+ var googleOptimizeInitializationMetaData = GetMetaDataElement(metaDataElements, KeyMetaDataGoogleOptimizeInitialization);
+ // If meta data doesn't exist, add it
+ if (googleOptimizeInitializationMetaData == null)
+ {
+ elementApplication.Add(CreateMetaDataElement(KeyMetaDataGoogleOptimizeInitialization, true));
+ }
+
+ var googleOptimizeAdLoadingMetaData = GetMetaDataElement(metaDataElements, KeyMetaDataGoogleOptimizeAdLoading);
+ // If meta data doesn't exist, add it
+ if (googleOptimizeAdLoadingMetaData == null)
+ {
+ elementApplication.Add(CreateMetaDataElement(KeyMetaDataGoogleOptimizeAdLoading, true));
+ }
+ }
+
+ private static void DisableAutoInitIfNeeded(XElement elementApplication, IEnumerable metaDataElements)
+ {
+ if (AppLovinPackageManager.IsAdapterInstalled("MobileFuse"))
+ {
+ var mobileFuseMetaData = GetMetaDataElement(metaDataElements, KeyMetaDataMobileFuseAutoInit);
+ // If MobileFuse meta data doesn't exist, add it
+ if (mobileFuseMetaData == null)
+ {
+ elementApplication.Add(CreateMetaDataElement(KeyMetaDataMobileFuseAutoInit, true));
+ }
+ }
+
+ if (AppLovinPackageManager.IsAdapterInstalled("MyTarget"))
+ {
+ var myTargetMetaData = GetMetaDataElement(metaDataElements, KeyMetaDataMyTargetAutoInit);
+ // If MyTarget meta data doesn't exist, add it
+ if (myTargetMetaData == null)
+ {
+ elementApplication.Add(CreateMetaDataElement(KeyMetaDataMyTargetAutoInit, 0));
+ }
+ }
+ }
+
+ private static void RemoveSdkKeyIfNeeded(IEnumerable metaDataElements)
+ {
+ var sdkKeyMetaData = GetMetaDataElement(metaDataElements, KeyMetaDataAppLovinSdkKey);
+ if (sdkKeyMetaData == null) return;
+
+ sdkKeyMetaData.Remove();
+ }
+
+ private static void UpdateGradleVersionsIfNeeded(string gradleWrapperPropertiesPath, string rootGradleBuildFilePath)
+ {
+ var customGradleVersionUrl = AppLovinSettings.Instance.CustomGradleVersionUrl;
+ var customGradleToolsVersion = AppLovinSettings.Instance.CustomGradleToolsVersion;
+
+ if (MaxSdkUtils.IsValidString(customGradleVersionUrl))
+ {
+ var newDistributionUrl = string.Format("distributionUrl={0}", customGradleVersionUrl);
+ if (ReplaceStringInFile(gradleWrapperPropertiesPath, TokenDistributionUrl, newDistributionUrl))
+ {
+ MaxSdkLogger.D("Distribution url set to " + newDistributionUrl);
+ }
+ else
+ {
+ MaxSdkLogger.E("Failed to set distribution URL");
+ }
+ }
+
+ if (MaxSdkUtils.IsValidString(customGradleToolsVersion))
+ {
+#if UNITY_2022_3_OR_NEWER
+ // Unity 2022.3+ requires Gradle Plugin version 7.1.2+.
+ if (MaxSdkUtils.CompareVersions(customGradleToolsVersion, "7.1.2") == MaxSdkUtils.VersionComparisonResult.Lesser)
+ {
+ MaxSdkLogger.E("Failed to set gradle plugin version. Unity 2022.3+ requires gradle plugin version 7.1.2+");
+ return;
+ }
+
+ var newGradleVersionLibraryLine = AppLovinProcessGradleBuildFile.GetFormattedBuildScriptLine(string.Format("id 'com.android.library' version '{0}' apply false", customGradleToolsVersion));
+ if (ReplaceStringInFile(rootGradleBuildFilePath, TokenGradleVersionLibrary, newGradleVersionLibraryLine))
+ {
+ MaxSdkLogger.D("Gradle library version set to " + newGradleVersionLibraryLine);
+ }
+ else
+ {
+ MaxSdkLogger.E("Failed to set gradle library version");
+ }
+
+ var newGradleVersionLine = AppLovinProcessGradleBuildFile.GetFormattedBuildScriptLine(string.Format("id 'com.android.application' version '{0}' apply false", customGradleToolsVersion));
+#else
+ var newGradleVersionLine = AppLovinProcessGradleBuildFile.GetFormattedBuildScriptLine(string.Format("classpath 'com.android.tools.build:gradle:{0}'", customGradleToolsVersion));
+#endif
+ if (ReplaceStringInFile(rootGradleBuildFilePath, TokenGradleVersion, newGradleVersionLine))
+ {
+ MaxSdkLogger.D("Gradle version set to " + newGradleVersionLine);
+ }
+ else
+ {
+ MaxSdkLogger.E("Failed to set gradle plugin version");
+ }
+ }
+ }
+
+ private static void AddSdkSettings(string path)
+ {
+ var appLovinSdkSettings = new Dictionary();
+ var rawResourceDirectory = Path.Combine(path, "src/main/res/raw");
+
+ // Add the SDK key to the SDK settings.
+ appLovinSdkSettings[KeySdkKey] = AppLovinSettings.Instance.SdkKey;
+ appLovinSdkSettings[KeyRenderOutsideSafeArea] = PlayerSettings.Android.renderOutsideSafeArea;
+
+ // Add the Terms and Privacy Policy flow settings if needed.
+ EnableConsentFlowIfNeeded(rawResourceDirectory, appLovinSdkSettings);
+
+ WriteAppLovinSettings(rawResourceDirectory, appLovinSdkSettings);
+ }
+
+ private static void EnableConsentFlowIfNeeded(string rawResourceDirectory, Dictionary applovinSdkSettings)
+ {
+ // Check if consent flow is enabled. No need to create the applovin_consent_flow_settings.json if consent flow is disabled.
+ var consentFlowEnabled = AppLovinInternalSettings.Instance.ConsentFlowEnabled;
+ if (!consentFlowEnabled)
+ {
+ RemoveAppLovinSettingsRawResourceFileIfNeeded(rawResourceDirectory);
+ return;
+ }
+
+ var privacyPolicyUrl = AppLovinInternalSettings.Instance.ConsentFlowPrivacyPolicyUrl;
+ if (string.IsNullOrEmpty(privacyPolicyUrl))
+ {
+ AppLovinIntegrationManager.ShowBuildFailureDialog("You cannot use the AppLovin SDK's consent flow without defining a Privacy Policy URL in the AppLovin Integration Manager.");
+
+ // No need to update the applovin_consent_flow_settings.json here. Default consent flow state will be determined on the SDK side.
+ return;
+ }
+
+ var consentFlowSettings = new Dictionary();
+ consentFlowSettings[KeyConsentFlowEnabled] = consentFlowEnabled;
+ consentFlowSettings[KeyConsentFlowPrivacyPolicy] = privacyPolicyUrl;
+
+ var termsOfServiceUrl = AppLovinInternalSettings.Instance.ConsentFlowTermsOfServiceUrl;
+ if (MaxSdkUtils.IsValidString(termsOfServiceUrl))
+ {
+ consentFlowSettings[KeyConsentFlowTermsOfService] = termsOfServiceUrl;
+ }
+
+ consentFlowSettings[KeyConsentFlowShowTermsAndPrivacyPolicyAlertInGDPR] = AppLovinInternalSettings.Instance.ShouldShowTermsAndPrivacyPolicyAlertInGDPR;
+
+ var debugUserGeography = AppLovinInternalSettings.Instance.DebugUserGeography;
+ if (debugUserGeography == MaxSdkBase.ConsentFlowUserGeography.Gdpr)
+ {
+ consentFlowSettings[KeyConsentFlowDebugUserGeography] = "gdpr";
+ }
+
+ applovinSdkSettings[KeyConsentFlowSettings] = consentFlowSettings;
+ }
+
+ private static void WriteAppLovinSettingsRawResourceFile(string applovinSdkSettingsJson, string rawResourceDirectory)
+ {
+ if (!Directory.Exists(rawResourceDirectory))
+ {
+ Directory.CreateDirectory(rawResourceDirectory);
+ }
+
+ var consentFlowSettingsFilePath = Path.Combine(rawResourceDirectory, AppLovinSettingsFileName);
+ try
+ {
+ File.WriteAllText(consentFlowSettingsFilePath, applovinSdkSettingsJson + "\n");
+ }
+ catch (Exception exception)
+ {
+ MaxSdkLogger.UserError("applovin_settings.json file write failed due to: " + exception.Message);
+ Console.WriteLine(exception);
+ }
+ }
+
+ ///
+ /// Removes the applovin_settings json file from the build if it exists.
+ ///
+ /// The raw resource directory that holds the json file
+ private static void RemoveAppLovinSettingsRawResourceFileIfNeeded(string rawResourceDirectory)
+ {
+ var consentFlowSettingsFilePath = Path.Combine(rawResourceDirectory, AppLovinSettingsFileName);
+ if (!File.Exists(consentFlowSettingsFilePath)) return;
+
+ try
+ {
+ File.Delete(consentFlowSettingsFilePath);
+ }
+ catch (Exception exception)
+ {
+ MaxSdkLogger.UserError("Deleting applovin_settings.json failed due to: " + exception.Message);
+ Console.WriteLine(exception);
+ }
+ }
+
+ private static void WriteAppLovinSettings(string rawResourceDirectory, Dictionary applovinSdkSettings)
+ {
+ var applovinSdkSettingsJson = Json.Serialize(applovinSdkSettings);
+ WriteAppLovinSettingsRawResourceFile(applovinSdkSettingsJson, rawResourceDirectory);
+ }
+
+ ///
+ /// Creates and returns a meta-data element with the given name and value.
+ ///
+ private static XElement CreateMetaDataElement(string name, object value)
+ {
+ var metaData = new XElement("meta-data");
+ metaData.Add(new XAttribute(AndroidNamespace + "name", name));
+ metaData.Add(new XAttribute(AndroidNamespace + "value", value));
+
+ return metaData;
+ }
+
+ ///
+ /// Looks through all the given meta-data elements to check if the required one exists. Returns null if it doesn't exist.
+ ///
+ private static XElement GetMetaDataElement(IEnumerable metaDataElements, string metaDataName)
+ {
+ foreach (var metaDataElement in metaDataElements)
+ {
+ var attributes = metaDataElement.Attributes();
+ if (attributes.Any(attribute => attribute.Name.Namespace.Equals(AndroidNamespace)
+ && attribute.Name.LocalName.Equals("name")
+ && attribute.Value.Equals(metaDataName)))
+ {
+ return metaDataElement;
+ }
+ }
+
+ return null;
+ }
+
+ ///
+ /// Finds the first line that contains regexToMatch and replaces the whole line with replacement
+ ///
+ /// Path to the file you want to replace a line in
+ /// Regex to search for in the line you want to replace
+ /// String that you want as the new line
+ /// Returns whether the string was successfully replaced or not
+ private static bool ReplaceStringInFile(string path, Regex regexToMatch, string replacement)
+ {
+ if (!File.Exists(path)) return false;
+
+ var lines = File.ReadAllLines(path);
+ for (var i = 0; i < lines.Length; i++)
+ {
+ if (regexToMatch.IsMatch(lines[i]))
+ {
+ lines[i] = replacement;
+ File.WriteAllLines(path, lines);
+ return true;
+ }
+ }
+
+ return false;
+ }
+ }
+}
+
+#endif
diff --git a/Assets/MaxSdk/Scripts/IntegrationManager/Editor/AppLovinPostProcessAndroid.cs.meta b/Assets/MaxSdk/Scripts/IntegrationManager/Editor/AppLovinPostProcessAndroid.cs.meta
new file mode 100644
index 0000000..2877140
--- /dev/null
+++ b/Assets/MaxSdk/Scripts/IntegrationManager/Editor/AppLovinPostProcessAndroid.cs.meta
@@ -0,0 +1,14 @@
+fileFormatVersion: 2
+guid: c01ea79d0cb2a43c093e2fd07201df9e
+labels:
+- al_max
+- al_max_export_path-MaxSdk/Scripts/IntegrationManager/Editor/AppLovinPostProcessAndroid.cs
+MonoImporter:
+ externalObjects: {}
+ serializedVersion: 2
+ defaultReferences: []
+ executionOrder: 0
+ icon: {instanceID: 0}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/MaxSdk/Scripts/IntegrationManager/Editor/AppLovinPostProcessAndroidGradle.cs b/Assets/MaxSdk/Scripts/IntegrationManager/Editor/AppLovinPostProcessAndroidGradle.cs
new file mode 100644
index 0000000..e56f255
--- /dev/null
+++ b/Assets/MaxSdk/Scripts/IntegrationManager/Editor/AppLovinPostProcessAndroidGradle.cs
@@ -0,0 +1,51 @@
+//
+// AppLovinBuildPostProcessor.cs
+// AppLovin MAX Unity Plugin
+//
+// Created by Santosh Bagadi on 8/29/19.
+// Copyright © 2019 AppLovin. All rights reserved.
+//
+
+#if UNITY_ANDROID
+
+using System.IO;
+using UnityEditor.Android;
+
+namespace AppLovinMax.Scripts.IntegrationManager.Editor
+{
+ ///
+ /// Adds Quality Service plugin to the Gradle project once the project has been exported. See for more details.
+ ///
+ public class AppLovinPostProcessGradleProject : AppLovinProcessGradleBuildFile, IPostGenerateGradleAndroidProject
+ {
+ public void OnPostGenerateGradleAndroidProject(string path)
+ {
+ if (!AppLovinSettings.Instance.QualityServiceEnabled) return;
+
+ var failedToAddPlugin = !AddQualityServiceToRootGradleFile(path);
+ if (failedToAddPlugin)
+ {
+ MaxSdkLogger.UserWarning("Failed to add AppLovin Quality Service plugin to the gradle project.");
+ return;
+ }
+
+ // The plugin needs to be added to the application module (named launcher)
+ var applicationGradleBuildFilePath = Path.Combine(path, "../launcher/build.gradle");
+
+ if (!File.Exists(applicationGradleBuildFilePath))
+ {
+ MaxSdkLogger.UserWarning("Couldn't find build.gradle file. Failed to add AppLovin Quality Service plugin to the gradle project.");
+ return;
+ }
+
+ AddAppLovinQualityServicePlugin(applicationGradleBuildFilePath);
+ }
+
+ public int callbackOrder
+ {
+ get { return CallbackOrder; }
+ }
+ }
+}
+
+#endif
diff --git a/Assets/MaxSdk/Scripts/IntegrationManager/Editor/AppLovinPostProcessAndroidGradle.cs.meta b/Assets/MaxSdk/Scripts/IntegrationManager/Editor/AppLovinPostProcessAndroidGradle.cs.meta
new file mode 100644
index 0000000..c167f0c
--- /dev/null
+++ b/Assets/MaxSdk/Scripts/IntegrationManager/Editor/AppLovinPostProcessAndroidGradle.cs.meta
@@ -0,0 +1,14 @@
+fileFormatVersion: 2
+guid: f75e54e2eb78f427ca8643c97684387b
+labels:
+- al_max
+- al_max_export_path-MaxSdk/Scripts/IntegrationManager/Editor/AppLovinPostProcessAndroidGradle.cs
+MonoImporter:
+ externalObjects: {}
+ serializedVersion: 2
+ defaultReferences: []
+ executionOrder: 0
+ icon: {instanceID: 0}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/MaxSdk/Scripts/IntegrationManager/Editor/AppLovinPostProcessiOS.cs b/Assets/MaxSdk/Scripts/IntegrationManager/Editor/AppLovinPostProcessiOS.cs
new file mode 100644
index 0000000..094feb8
--- /dev/null
+++ b/Assets/MaxSdk/Scripts/IntegrationManager/Editor/AppLovinPostProcessiOS.cs
@@ -0,0 +1,692 @@
+//
+// MaxIntegrationManager.cs
+// AppLovin MAX Unity Plugin
+//
+// Created by Santosh Bagadi on 8/29/19.
+// Copyright © 2019 AppLovin. All rights reserved.
+//
+
+#if UNITY_IOS || UNITY_IPHONE
+using System;
+using System.Collections.Generic;
+using System.IO;
+using System.Linq;
+using System.Text.RegularExpressions;
+using AppLovinMax.Internal;
+using UnityEditor;
+using UnityEditor.Callbacks;
+using UnityEditor.iOS.Xcode.Extensions;
+using UnityEditor.iOS.Xcode;
+using UnityEngine;
+using UnityEngine.Networking;
+
+namespace AppLovinMax.Scripts.IntegrationManager.Editor
+{
+ [Serializable]
+ public class SkAdNetworkData
+ {
+ [SerializeField] public string[] SkAdNetworkIds;
+ }
+
+ public class AppLovinPostProcessiOS
+ {
+ private const string OutputFileName = "AppLovinQualityServiceSetup.rb";
+
+ // Use a priority of 90 to have AppLovin embed frameworks after Pods are installed (EDM finishes installing Pods at priority 60) and before Firebase Crashlytics runs their scripts (at priority 100).
+ private const int AppLovinEmbedFrameworksPriority = 90;
+
+ private const string TargetUnityIphonePodfileLine = "target 'Unity-iPhone' do";
+ private const string UseFrameworksPodfileLine = "use_frameworks!";
+ private const string UseFrameworksDynamicPodfileLine = "use_frameworks! :linkage => :dynamic";
+ private const string UseFrameworksStaticPodfileLine = "use_frameworks! :linkage => :static";
+
+ private const string ResourcesDirectoryName = "Resources";
+ private const string AppLovinMaxResourcesDirectoryName = "AppLovinMAXResources";
+ private const string AppLovinAdvertisingAttributionEndpoint = "https://postbacks-app.com";
+
+ private const string AppLovinSettingsPlistFileName = "AppLovin-Settings.plist";
+
+ private const string KeySdkKey = "SdkKey";
+
+ private const string AppLovinVerboseLoggingOnKey = "AppLovinVerboseLoggingOn";
+
+ private const string KeyConsentFlowInfo = "ConsentFlowInfo";
+ private const string KeyConsentFlowEnabled = "ConsentFlowEnabled";
+ private const string KeyConsentFlowTermsOfService = "ConsentFlowTermsOfService";
+ private const string KeyConsentFlowPrivacyPolicy = "ConsentFlowPrivacyPolicy";
+ private const string KeyConsentFlowShowTermsAndPrivacyPolicyAlertInGDPR = "ConsentFlowShowTermsAndPrivacyPolicyAlertInGDPR";
+ private const string KeyConsentFlowDebugUserGeography = "ConsentFlowDebugUserGeography";
+
+ private const string KeyAppLovinSdkKeyToRemove = "AppLovinSdkKey";
+
+ private static readonly Regex PodfilePodLineRegex = new Regex("pod \'([^\']*)\'");
+
+ ///
+ /// Adds AppLovin Quality Service to the iOS project once the project has been exported.
+ ///
+ /// 1. Downloads the Quality Service ruby script.
+ /// 2. Runs the script using Ruby which integrates AppLovin Quality Service to the project.
+ ///
+ [PostProcessBuild(AppLovinPreProcess.CallbackOrder)] // We want to run Quality Service script last.
+ public static void OnPostProcessBuild(BuildTarget buildTarget, string buildPath)
+ {
+ if (!AppLovinSettings.Instance.QualityServiceEnabled) return;
+
+ var sdkKey = AppLovinSettings.Instance.SdkKey;
+ if (string.IsNullOrEmpty(sdkKey))
+ {
+ MaxSdkLogger.UserError("Failed to install AppLovin Quality Service plugin. SDK Key is empty. Please enter the AppLovin SDK Key in the Integration Manager.");
+ return;
+ }
+
+ var outputFilePath = Path.Combine(buildPath, OutputFileName);
+
+ // Check if Quality Service is already installed.
+ if (File.Exists(outputFilePath) && Directory.Exists(Path.Combine(buildPath, "AppLovinQualityService")))
+ {
+ // TODO: Check if there is a way to validate if the SDK key matches the script. Else the pub can't use append when/if they change the SDK Key.
+ return;
+ }
+
+ var webRequestConfig = new WebRequestConfig()
+ {
+ DownloadHandler = new DownloadHandlerFile(outputFilePath),
+ JsonString = string.Format("{{\"sdk_key\" : \"{0}\"}}", sdkKey),
+ EndPoint = "https://api2.safedk.com/v1/build/ios_setup2",
+ RequestType = WebRequestType.Post,
+ };
+
+ webRequestConfig.Headers.Add("Content-Type", "application/json");
+
+ var maxWebRequest = new MaxWebRequest(webRequestConfig);
+
+ var webResponse = maxWebRequest.SendSync();
+ if (!webResponse.IsSuccess)
+ {
+ MaxSdkLogger.UserError("AppLovin Quality Service installation failed. Failed to download script with error: " + webResponse.ErrorMessage);
+ return;
+ }
+
+ // Check if Ruby is installed
+ var rubyVersion = AppLovinCommandLine.Run("ruby", "--version", buildPath);
+ if (rubyVersion.ExitCode != 0)
+ {
+ MaxSdkLogger.UserError("AppLovin Quality Service installation requires Ruby. Please install Ruby, export it to your system PATH and re-export the project.");
+ return;
+ }
+
+ // Ruby is installed, run `ruby AppLovinQualityServiceSetup.rb`
+ var result = AppLovinCommandLine.Run("ruby", OutputFileName, buildPath);
+
+ // Check if we have an error.
+ if (result.ExitCode != 0) MaxSdkLogger.UserError("Failed to set up AppLovin Quality Service");
+
+ MaxSdkLogger.UserDebug(result.Message);
+ }
+
+ [PostProcessBuild(AppLovinEmbedFrameworksPriority)]
+ public static void MaxPostProcessPbxProject(BuildTarget buildTarget, string buildPath)
+ {
+ var projectPath = PBXProject.GetPBXProjectPath(buildPath);
+ var project = new PBXProject();
+ project.ReadFromFile(projectPath);
+
+ var unityMainTargetGuid = project.GetUnityMainTargetGuid();
+ var unityFrameworkTargetGuid = project.GetUnityFrameworkTargetGuid();
+
+ EmbedDynamicLibrariesIfNeeded(buildPath, project, unityMainTargetGuid);
+
+ LocalizeUserTrackingDescriptionIfNeeded(AppLovinInternalSettings.Instance.UserTrackingUsageDescriptionDe, "de", buildPath, project, unityMainTargetGuid);
+ LocalizeUserTrackingDescriptionIfNeeded(AppLovinInternalSettings.Instance.UserTrackingUsageDescriptionEn, "en", buildPath, project, unityMainTargetGuid);
+ LocalizeUserTrackingDescriptionIfNeeded(AppLovinInternalSettings.Instance.UserTrackingUsageDescriptionEs, "es", buildPath, project, unityMainTargetGuid);
+ LocalizeUserTrackingDescriptionIfNeeded(AppLovinInternalSettings.Instance.UserTrackingUsageDescriptionFr, "fr", buildPath, project, unityMainTargetGuid);
+ LocalizeUserTrackingDescriptionIfNeeded(AppLovinInternalSettings.Instance.UserTrackingUsageDescriptionJa, "ja", buildPath, project, unityMainTargetGuid);
+ LocalizeUserTrackingDescriptionIfNeeded(AppLovinInternalSettings.Instance.UserTrackingUsageDescriptionKo, "ko", buildPath, project, unityMainTargetGuid);
+ LocalizeUserTrackingDescriptionIfNeeded(AppLovinInternalSettings.Instance.UserTrackingUsageDescriptionZhHans, "zh-Hans", buildPath, project, unityMainTargetGuid);
+ LocalizeUserTrackingDescriptionIfNeeded(AppLovinInternalSettings.Instance.UserTrackingUsageDescriptionZhHant, "zh-Hant", buildPath, project, unityMainTargetGuid);
+
+ AddSwiftSupport(buildPath, project, unityFrameworkTargetGuid, unityMainTargetGuid);
+ AddYandexSettingsIfNeeded(project, unityMainTargetGuid);
+
+ project.WriteToFile(projectPath);
+ }
+
+ private static void EmbedDynamicLibrariesIfNeeded(string buildPath, PBXProject project, string targetGuid)
+ {
+ // Check that the Pods directory exists (it might not if a publisher is building with Generate Podfile setting disabled in EDM).
+ var podsDirectory = Path.Combine(buildPath, "Pods");
+ if (!Directory.Exists(podsDirectory) || !ShouldEmbedDynamicLibraries(buildPath)) return;
+
+ var dynamicLibraryPathsToEmbed = GetDynamicLibraryPathsToEmbed(podsDirectory, buildPath);
+ if (dynamicLibraryPathsToEmbed == null || dynamicLibraryPathsToEmbed.Count == 0) return;
+
+ foreach (var dynamicLibraryPath in dynamicLibraryPathsToEmbed)
+ {
+ var fileGuid = project.AddFile(dynamicLibraryPath, dynamicLibraryPath);
+ project.AddFileToEmbedFrameworks(targetGuid, fileGuid);
+ }
+ }
+
+ ///
+ /// |-----------------------------------------------------------------------------------------------------------------------------------------------------|
+ /// | embed | use_frameworks! (:linkage => :dynamic) | use_frameworks! :linkage => :static | `use_frameworks!` line not present |
+ /// |---------------------------|------------------------------------------|---------------------------------------|--------------------------------------|
+ /// | Unity-iPhone present | Do not embed dynamic libraries | Embed dynamic libraries | Do not embed dynamic libraries |
+ /// | Unity-iPhone not present | Embed dynamic libraries | Embed dynamic libraries | Embed dynamic libraries |
+ /// |-----------------------------------------------------------------------------------------------------------------------------------------------------|
+ ///
+ /// An iOS build path
+ /// Whether or not the dynamic libraries should be embedded.
+ private static bool ShouldEmbedDynamicLibraries(string buildPath)
+ {
+ var podfilePath = Path.Combine(buildPath, "Podfile");
+ if (!File.Exists(podfilePath)) return false;
+
+ // If the Podfile doesn't have a `Unity-iPhone` target, we should embed the dynamic libraries.
+ var lines = File.ReadAllLines(podfilePath);
+ var containsUnityIphoneTarget = lines.Any(line => line.Contains(TargetUnityIphonePodfileLine));
+ if (!containsUnityIphoneTarget) return true;
+
+ // If the Podfile does not have a `use_frameworks! :linkage => static` line, we should not embed the dynamic libraries.
+ var useFrameworksStaticLineIndex = Array.FindIndex(lines, line => line.Contains(UseFrameworksStaticPodfileLine));
+ if (useFrameworksStaticLineIndex == -1) return false;
+
+ // If more than one of the `use_frameworks!` lines are present, CocoaPods will use the last one.
+ var useFrameworksLineIndex = Array.FindIndex(lines, line => line.Trim() == UseFrameworksPodfileLine); // Check for exact line to avoid matching `use_frameworks! :linkage => static/dynamic`
+ var useFrameworksDynamicLineIndex = Array.FindIndex(lines, line => line.Contains(UseFrameworksDynamicPodfileLine));
+
+ // Check if `use_frameworks! :linkage => :static` is the last line of the three. If it is, we should embed the dynamic libraries.
+ return useFrameworksLineIndex < useFrameworksStaticLineIndex && useFrameworksDynamicLineIndex < useFrameworksStaticLineIndex;
+ }
+
+ private static List GetDynamicLibraryPathsToEmbed(string podsDirectory, string buildPath)
+ {
+ var podfilePath = Path.Combine(buildPath, "Podfile");
+ var dynamicLibraryFrameworksToEmbed = GetDynamicLibraryFrameworksToEmbed(podfilePath);
+
+ return GetDynamicLibraryPathsInProjectToEmbed(podsDirectory, dynamicLibraryFrameworksToEmbed);
+ }
+
+ private static List GetDynamicLibraryFrameworksToEmbed(string podfilePath)
+ {
+ var dynamicLibrariesToEmbed = GetDynamicLibrariesToEmbed();
+
+ var podsInUnityIphoneTarget = GetPodNamesInUnityIphoneTarget(podfilePath);
+ var dynamicLibrariesToIgnore = dynamicLibrariesToEmbed.Where(dynamicLibraryToEmbed => podsInUnityIphoneTarget.Contains(dynamicLibraryToEmbed.PodName)).ToList();
+
+ // Determine frameworks to embed based on the dynamic libraries to embed and ignore
+ var dynamicLibraryFrameworksToIgnore = dynamicLibrariesToIgnore.SelectMany(library => library.FrameworkNames).Distinct().ToList();
+ return dynamicLibrariesToEmbed.SelectMany(library => library.FrameworkNames).Except(dynamicLibraryFrameworksToIgnore).Distinct().ToList();
+ }
+
+ private static List GetDynamicLibrariesToEmbed()
+ {
+ var pluginData = AppLovinIntegrationManager.LoadPluginDataSync();
+ if (pluginData == null)
+ {
+ MaxSdkLogger.E("Failed to load plugin data. Dynamic libraries will not be embedded.");
+ return null;
+ }
+
+ // Get the dynamic libraries to embed for each network
+ var librariesToAdd = pluginData.MediatedNetworks
+ .Where(network => network.DynamicLibrariesToEmbed != null)
+ .SelectMany(network => network.DynamicLibrariesToEmbed
+ .Where(libraryToEmbed => IsRequiredNetworkVersionInstalled(libraryToEmbed, network)))
+ .ToList();
+
+ // Get the dynamic libraries to embed for AppLovin MAX
+ if (pluginData.AppLovinMax.DynamicLibrariesToEmbed != null)
+ {
+ librariesToAdd.AddRange(pluginData.AppLovinMax.DynamicLibrariesToEmbed);
+ }
+
+ // Get the dynamic libraries to embed for third parties
+ if (pluginData.ThirdPartyDynamicLibrariesToEmbed != null)
+ {
+ // TODO: Add version check for third party dynamic libraries.
+ librariesToAdd.AddRange(pluginData.ThirdPartyDynamicLibrariesToEmbed);
+ }
+
+ return librariesToAdd;
+ }
+
+ private static List GetPodNamesInUnityIphoneTarget(string podfilePath)
+ {
+ var lines = File.ReadAllLines(podfilePath);
+ var podNamesInUnityIphone = new List();
+
+ var insideUnityIphoneTarget = false;
+ foreach (var line in lines)
+ {
+ // Loop until we find the `target 'Unity-iPhone'` line
+ if (insideUnityIphoneTarget)
+ {
+ if (line.Trim() == "end") break;
+
+ if (PodfilePodLineRegex.IsMatch(line))
+ {
+ var podName = PodfilePodLineRegex.Match(line).Groups[1].Value;
+ podNamesInUnityIphone.Add(podName);
+ }
+ }
+ else if (line.Contains(TargetUnityIphonePodfileLine))
+ {
+ insideUnityIphoneTarget = true;
+ }
+ }
+
+ return podNamesInUnityIphone;
+ }
+
+ private static bool IsRequiredNetworkVersionInstalled(DynamicLibraryToEmbed libraryToEmbed, Network network)
+ {
+ var currentIosVersion = network.CurrentVersions.Ios;
+ if (string.IsNullOrEmpty(currentIosVersion)) return false;
+
+ var minIosVersion = libraryToEmbed.MinVersion;
+ var maxIosVersion = libraryToEmbed.MaxVersion;
+
+ var greaterThanOrEqualToMinVersion = string.IsNullOrEmpty(minIosVersion) || MaxSdkUtils.CompareVersions(currentIosVersion, minIosVersion) != MaxSdkUtils.VersionComparisonResult.Lesser;
+ var lessThanOrEqualToMaxVersion = string.IsNullOrEmpty(maxIosVersion) || MaxSdkUtils.CompareVersions(currentIosVersion, maxIosVersion) != MaxSdkUtils.VersionComparisonResult.Greater;
+
+ return greaterThanOrEqualToMinVersion && lessThanOrEqualToMaxVersion;
+ }
+
+ private static List GetDynamicLibraryPathsInProjectToEmbed(string podsDirectory, List dynamicLibrariesToEmbed)
+ {
+ var dynamicLibraryPathsPresentInProject = new List();
+ foreach (var dynamicLibraryToSearch in dynamicLibrariesToEmbed)
+ {
+ // both .framework and .xcframework are directories, not files
+ var directories = Directory.GetDirectories(podsDirectory, dynamicLibraryToSearch, SearchOption.AllDirectories);
+ if (directories.Length <= 0) continue;
+
+ var dynamicLibraryAbsolutePath = directories[0];
+ var relativePath = GetDynamicLibraryRelativePath(dynamicLibraryAbsolutePath);
+ dynamicLibraryPathsPresentInProject.Add(relativePath);
+ }
+
+ return dynamicLibraryPathsPresentInProject;
+ }
+
+ private static string GetDynamicLibraryRelativePath(string dynamicLibraryAbsolutePath)
+ {
+ var index = dynamicLibraryAbsolutePath.LastIndexOf("Pods", StringComparison.Ordinal);
+ return dynamicLibraryAbsolutePath.Substring(index);
+ }
+
+ private static void LocalizeUserTrackingDescriptionIfNeeded(string localizedUserTrackingDescription, string localeCode, string buildPath, PBXProject project, string targetGuid)
+ {
+ var resourcesDirectoryPath = Path.Combine(buildPath, AppLovinMaxResourcesDirectoryName);
+ var localeSpecificDirectoryName = localeCode + ".lproj";
+ var localeSpecificDirectoryPath = Path.Combine(resourcesDirectoryPath, localeSpecificDirectoryName);
+ var infoPlistStringsFilePath = Path.Combine(localeSpecificDirectoryPath, "InfoPlist.strings");
+
+ // Check if localization has been disabled between builds, and remove them as needed.
+ if (ShouldRemoveLocalization(localizedUserTrackingDescription))
+ {
+ if (!File.Exists(infoPlistStringsFilePath)) return;
+
+ File.Delete(infoPlistStringsFilePath);
+ return;
+ }
+
+ // Log an error if we detect a localization file for this language in the `Resources` directory
+ var legacyResourcedDirectoryPath = Path.Combine(buildPath, ResourcesDirectoryName);
+ var localeSpecificLegacyDirectoryPath = Path.Combine(legacyResourcedDirectoryPath, localeSpecificDirectoryName);
+ if (Directory.Exists(localeSpecificLegacyDirectoryPath))
+ {
+ MaxSdkLogger.UserError("Detected existing localization resource for \"" + localeCode + "\" locale. Skipping localization for User Tracking Usage Description. Please disable localization in AppLovin Integration manager and add the localizations to your existing resource.");
+ return;
+ }
+
+ // Create intermediate directories as needed.
+ if (!Directory.Exists(resourcesDirectoryPath))
+ {
+ Directory.CreateDirectory(resourcesDirectoryPath);
+ }
+
+ if (!Directory.Exists(localeSpecificDirectoryPath))
+ {
+ Directory.CreateDirectory(localeSpecificDirectoryPath);
+ }
+
+ var localizedDescriptionLine = "\"NSUserTrackingUsageDescription\" = \"" + localizedUserTrackingDescription + "\";\n";
+ // File already exists, update it in case the value changed between builds.
+ if (File.Exists(infoPlistStringsFilePath))
+ {
+ var output = new List();
+ var lines = File.ReadAllLines(infoPlistStringsFilePath);
+ var keyUpdated = false;
+ foreach (var line in lines)
+ {
+ if (line.Contains("NSUserTrackingUsageDescription"))
+ {
+ output.Add(localizedDescriptionLine);
+ keyUpdated = true;
+ }
+ else
+ {
+ output.Add(line);
+ }
+ }
+
+ if (!keyUpdated)
+ {
+ output.Add(localizedDescriptionLine);
+ }
+
+ File.WriteAllText(infoPlistStringsFilePath, string.Join("\n", output.ToArray()) + "\n");
+ }
+ // File doesn't exist, create one.
+ else
+ {
+ File.WriteAllText(infoPlistStringsFilePath, "/* Localized versions of Info.plist keys - Generated by AL MAX plugin */\n" + localizedDescriptionLine);
+ }
+
+ var localeSpecificDirectoryRelativePath = Path.Combine(AppLovinMaxResourcesDirectoryName, localeSpecificDirectoryName);
+ var guid = project.AddFolderReference(localeSpecificDirectoryRelativePath, localeSpecificDirectoryRelativePath);
+ project.AddFileToBuild(targetGuid, guid);
+ }
+
+ private static bool ShouldRemoveLocalization(string localizedUserTrackingDescription)
+ {
+ if (string.IsNullOrEmpty(localizedUserTrackingDescription)) return true;
+
+ var internalSettings = AppLovinInternalSettings.Instance;
+ return !internalSettings.ConsentFlowEnabled || !internalSettings.UserTrackingUsageLocalizationEnabled;
+ }
+
+ private static void AddSwiftSupport(string buildPath, PBXProject project, string unityFrameworkTargetGuid, string unityMainTargetGuid)
+ {
+ var swiftFileRelativePath = "Classes/MAXSwiftSupport.swift";
+ var swiftFilePath = Path.Combine(buildPath, swiftFileRelativePath);
+
+ // Add Swift file
+ CreateSwiftFile(swiftFilePath);
+ var swiftFileGuid = project.AddFile(swiftFileRelativePath, swiftFileRelativePath);
+ project.AddFileToBuild(unityFrameworkTargetGuid, swiftFileGuid);
+
+ // Add Swift version property if needed
+ var swiftVersion = project.GetBuildPropertyForAnyConfig(unityFrameworkTargetGuid, "SWIFT_VERSION");
+ if (string.IsNullOrEmpty(swiftVersion))
+ {
+ project.SetBuildProperty(unityFrameworkTargetGuid, "SWIFT_VERSION", "5.0");
+ }
+
+ // Some publishers may configure these settings in their own post-processing scripts.
+ // Only set them if they haven't already been defined to avoid overwriting publisher-defined values.
+ var enableModules = project.GetBuildPropertyForAnyConfig(unityFrameworkTargetGuid, "CLANG_ENABLE_MODULES");
+ if (string.IsNullOrEmpty(enableModules))
+ {
+ project.SetBuildProperty(unityFrameworkTargetGuid, "CLANG_ENABLE_MODULES", "YES");
+ }
+
+ var alwaysEmbedSwiftLibraries = project.GetBuildPropertyForAnyConfig(unityMainTargetGuid, "ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES");
+ if (string.IsNullOrEmpty(alwaysEmbedSwiftLibraries))
+ {
+ project.SetBuildProperty(unityMainTargetGuid, "ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES", "YES");
+ }
+ }
+
+ private static void CreateSwiftFile(string swiftFilePath)
+ {
+ if (File.Exists(swiftFilePath)) return;
+
+ // Create a file to write to.
+ using (var writer = File.CreateText(swiftFilePath))
+ {
+ writer.WriteLine("//\n// MAXSwiftSupport.swift\n//");
+ writer.WriteLine("\nimport Foundation\n");
+ writer.WriteLine("// This file ensures the project includes Swift support.");
+ writer.WriteLine("// It is automatically generated by the MAX Unity Plugin.");
+ writer.Close();
+ }
+ }
+
+ [PostProcessBuild(AppLovinPreProcess.CallbackOrder)]
+ public static void MaxPostProcessPlist(BuildTarget buildTarget, string path)
+ {
+ var plistPath = Path.Combine(path, "Info.plist");
+ var plist = new PlistDocument();
+ plist.ReadFromFile(plistPath);
+
+ RemoveAttributionReportEndpointIfNeeded(plist);
+
+ EnableVerboseLoggingIfNeeded(plist);
+ AddGoogleApplicationIdIfNeeded(plist);
+
+ AddSdkSettings(plist, path);
+ AddSkAdNetworksInfoIfNeeded(plist);
+ RemoveSdkKeyIfNeeded(plist);
+
+ plist.WriteToFile(plistPath);
+ }
+
+ private static void RemoveAttributionReportEndpointIfNeeded(PlistDocument plist)
+ {
+ PlistElement attributionReportEndPoint;
+ plist.root.values.TryGetValue("NSAdvertisingAttributionReportEndpoint", out attributionReportEndPoint);
+
+ // We no longer support this feature. Check if we had previously set the attribution endpoint and un-set it.
+ if (attributionReportEndPoint == null || !AppLovinAdvertisingAttributionEndpoint.Equals(attributionReportEndPoint.AsString())) return;
+
+ MaxSdkLogger.UserWarning("Global SKAdNetwork postback forwarding is no longer supported by AppLovin. Removing AppLovin Advertising Attribution Endpoint from Info.plist.");
+ plist.root.values.Remove("NSAdvertisingAttributionReportEndpoint");
+ }
+
+ private static void EnableVerboseLoggingIfNeeded(PlistDocument plist)
+ {
+ if (!EditorPrefs.HasKey(MaxSdkLogger.KeyVerboseLoggingEnabled)) return;
+
+ var enabled = EditorPrefs.GetBool(MaxSdkLogger.KeyVerboseLoggingEnabled);
+ if (enabled)
+ {
+ plist.root.SetBoolean(AppLovinVerboseLoggingOnKey, true);
+ }
+ else
+ {
+ plist.root.values.Remove(AppLovinVerboseLoggingOnKey);
+ }
+ }
+
+ private static void AddGoogleApplicationIdIfNeeded(PlistDocument plist)
+ {
+ if (!AppLovinPackageManager.IsAdapterInstalled("Google") && !AppLovinPackageManager.IsAdapterInstalled("GoogleAdManager")) return;
+
+ const string googleApplicationIdentifier = "GADApplicationIdentifier";
+ var appId = AppLovinSettings.Instance.AdMobIosAppId;
+ // Log error if the App ID is not set.
+ if (string.IsNullOrEmpty(appId) || !appId.StartsWith("ca-app-pub-"))
+ {
+ MaxSdkLogger.UserError("[AppLovin MAX] Google App ID is not set. Please enter a valid app ID within the AppLovin Integration Manager window.");
+ return;
+ }
+
+ plist.root.SetString(googleApplicationIdentifier, appId);
+ }
+
+ private static void AddYandexSettingsIfNeeded(PBXProject project, string unityMainTargetGuid)
+ {
+ if (!AppLovinPackageManager.IsAdapterInstalled("Yandex")) return;
+
+ if (MaxSdkUtils.CompareVersions(PlayerSettings.iOS.targetOSVersionString, "12.0") == MaxSdkUtils.VersionComparisonResult.Lesser)
+ {
+ MaxSdkLogger.UserWarning("Your iOS target version is under the minimum required version by Yandex. Please update it to 12.0 or newer in your ProjectSettings and rebuild your project.");
+ return;
+ }
+
+ project.SetBuildProperty(unityMainTargetGuid, "GENERATE_INFOPLIST_FILE", "NO");
+ }
+
+ private static void AddSdkSettings(PlistDocument infoPlist, string buildPath)
+ {
+ var sdkSettingsPlistPath = Path.Combine(buildPath, AppLovinSettingsPlistFileName);
+ var sdkSettingsPlist = new PlistDocument();
+ if (File.Exists(sdkSettingsPlistPath))
+ {
+ sdkSettingsPlist.ReadFromFile(sdkSettingsPlistPath);
+ }
+
+ // Add the SDK key to the SDK settings plist.
+ sdkSettingsPlist.root.SetString(KeySdkKey, AppLovinSettings.Instance.SdkKey);
+
+ // Add consent flow settings if needed.
+ EnableConsentFlowIfNeeded(sdkSettingsPlist, infoPlist);
+
+ sdkSettingsPlist.WriteToFile(sdkSettingsPlistPath);
+
+ var projectPath = PBXProject.GetPBXProjectPath(buildPath);
+ var project = new PBXProject();
+ project.ReadFromFile(projectPath);
+
+ var unityMainTargetGuid = project.GetUnityMainTargetGuid();
+
+ var guid = project.AddFile(AppLovinSettingsPlistFileName, AppLovinSettingsPlistFileName);
+ project.AddFileToBuild(unityMainTargetGuid, guid);
+ project.WriteToFile(projectPath);
+ }
+
+ private static void EnableConsentFlowIfNeeded(PlistDocument applovinSettingsPlist, PlistDocument infoPlist)
+ {
+ var consentFlowEnabled = AppLovinInternalSettings.Instance.ConsentFlowEnabled;
+ if (!consentFlowEnabled) return;
+
+ var userTrackingUsageDescription = AppLovinInternalSettings.Instance.UserTrackingUsageDescriptionEn;
+ var privacyPolicyUrl = AppLovinInternalSettings.Instance.ConsentFlowPrivacyPolicyUrl;
+ if (string.IsNullOrEmpty(userTrackingUsageDescription) || string.IsNullOrEmpty(privacyPolicyUrl))
+ {
+ AppLovinIntegrationManager.ShowBuildFailureDialog("You cannot use the AppLovin SDK's consent flow without defining a Privacy Policy URL and the `User Tracking Usage Description` in the AppLovin Integration Manager. \n\n" +
+ "Both values must be included to enable the SDK's consent flow.");
+
+ // No need to update the info.plist here. Default consent flow state will be determined on the SDK side.
+ return;
+ }
+
+ var consentFlowInfoRoot = applovinSettingsPlist.root.CreateDict(KeyConsentFlowInfo);
+ consentFlowInfoRoot.SetBoolean(KeyConsentFlowEnabled, consentFlowEnabled);
+ consentFlowInfoRoot.SetString(KeyConsentFlowPrivacyPolicy, privacyPolicyUrl);
+
+ var termsOfServiceUrl = AppLovinInternalSettings.Instance.ConsentFlowTermsOfServiceUrl;
+ if (MaxSdkUtils.IsValidString(termsOfServiceUrl))
+ {
+ consentFlowInfoRoot.SetString(KeyConsentFlowTermsOfService, termsOfServiceUrl);
+ }
+
+ var shouldShowTermsAndPrivacyPolicyAlertInGdpr = AppLovinInternalSettings.Instance.ShouldShowTermsAndPrivacyPolicyAlertInGDPR;
+ consentFlowInfoRoot.SetBoolean(KeyConsentFlowShowTermsAndPrivacyPolicyAlertInGDPR, shouldShowTermsAndPrivacyPolicyAlertInGdpr);
+
+ var debugUserGeography = AppLovinInternalSettings.Instance.DebugUserGeography;
+ if (debugUserGeography == MaxSdkBase.ConsentFlowUserGeography.Gdpr)
+ {
+ consentFlowInfoRoot.SetString(KeyConsentFlowDebugUserGeography, "gdpr");
+ }
+
+ infoPlist.root.SetString("NSUserTrackingUsageDescription", userTrackingUsageDescription);
+ }
+
+ private static void AddSkAdNetworksInfoIfNeeded(PlistDocument plist)
+ {
+ var skAdNetworkData = GetSkAdNetworkData();
+ var skAdNetworkIds = skAdNetworkData.SkAdNetworkIds;
+ // Check if we have a valid list of SKAdNetworkIds that need to be added.
+ if (skAdNetworkIds == null || skAdNetworkIds.Length < 1) return;
+
+ //
+ // Add the SKAdNetworkItems to the plist. It should look like following:
+ //
+ // SKAdNetworkItems
+ //
+ //
+ // SKAdNetworkIdentifier
+ // ABC123XYZ.skadnetwork
+ //
+ //
+ // SKAdNetworkIdentifier
+ // 123QWE456.skadnetwork
+ //
+ //
+ // SKAdNetworkIdentifier
+ // 987XYZ123.skadnetwork
+ //
+ //
+ //
+ PlistElement skAdNetworkItems;
+ plist.root.values.TryGetValue("SKAdNetworkItems", out skAdNetworkItems);
+ var existingSkAdNetworkIds = new HashSet();
+ // Check if SKAdNetworkItems array is already in the Plist document and collect all the IDs that are already present.
+ if (skAdNetworkItems != null && skAdNetworkItems.GetType() == typeof(PlistElementArray))
+ {
+ var plistElementDictionaries = skAdNetworkItems.AsArray().values.Where(plistElement => plistElement.GetType() == typeof(PlistElementDict));
+ foreach (var plistElement in plistElementDictionaries)
+ {
+ PlistElement existingId;
+ plistElement.AsDict().values.TryGetValue("SKAdNetworkIdentifier", out existingId);
+ if (existingId == null || existingId.GetType() != typeof(PlistElementString) || string.IsNullOrEmpty(existingId.AsString())) continue;
+
+ existingSkAdNetworkIds.Add(existingId.AsString());
+ }
+ }
+ // Else, create an array of SKAdNetworkItems into which we will add our IDs.
+ else
+ {
+ skAdNetworkItems = plist.root.CreateArray("SKAdNetworkItems");
+ }
+
+ foreach (var skAdNetworkId in skAdNetworkIds)
+ {
+ // Skip adding IDs that are already in the array.
+ if (existingSkAdNetworkIds.Contains(skAdNetworkId)) continue;
+
+ var skAdNetworkItemDict = skAdNetworkItems.AsArray().AddDict();
+ skAdNetworkItemDict.SetString("SKAdNetworkIdentifier", skAdNetworkId);
+ }
+ }
+
+ private static SkAdNetworkData GetSkAdNetworkData()
+ {
+ // Get the list of installed ad networks to be passed up
+ var installedNetworks = AppLovinPackageManager.GetInstalledMediationNetworks();
+ var uriBuilder = new UriBuilder("https://unity.applovin.com/max/1.0/skadnetwork_ids");
+ var adNetworks = string.Join(",", installedNetworks.ToArray());
+ if (MaxSdkUtils.IsValidString(adNetworks))
+ {
+ uriBuilder.Query += string.Format("ad_networks={0}", adNetworks);
+ }
+
+ var webRequestConfig = new WebRequestConfig()
+ {
+ EndPoint = uriBuilder.ToString()
+ };
+
+ var maxWebRequest = new MaxWebRequest(webRequestConfig);
+ var webResponse = maxWebRequest.SendSync();
+
+ if (!webResponse.IsSuccess)
+ {
+ MaxSdkLogger.UserError("Failed to retrieve SKAdNetwork IDs with error: " + webResponse.ErrorMessage);
+ return new SkAdNetworkData();
+ }
+
+ try
+ {
+ return JsonUtility.FromJson(webResponse.ResponseMessage);
+ }
+ catch (Exception exception)
+ {
+ MaxSdkLogger.UserError("Failed to parse data '" + webResponse.ResponseMessage + "' with exception: " + exception);
+ return new SkAdNetworkData();
+ }
+ }
+
+ private static void RemoveSdkKeyIfNeeded(PlistDocument plist)
+ {
+ if (!plist.root.values.ContainsKey(KeyAppLovinSdkKeyToRemove)) return;
+
+ plist.root.values.Remove(KeyAppLovinSdkKeyToRemove);
+ }
+ }
+}
+
+#endif
diff --git a/Assets/MaxSdk/Scripts/IntegrationManager/Editor/AppLovinPostProcessiOS.cs.meta b/Assets/MaxSdk/Scripts/IntegrationManager/Editor/AppLovinPostProcessiOS.cs.meta
new file mode 100644
index 0000000..8182708
--- /dev/null
+++ b/Assets/MaxSdk/Scripts/IntegrationManager/Editor/AppLovinPostProcessiOS.cs.meta
@@ -0,0 +1,14 @@
+fileFormatVersion: 2
+guid: d5d209f90444f4a90830b48b5f3f3ff4
+labels:
+- al_max
+- al_max_export_path-MaxSdk/Scripts/IntegrationManager/Editor/AppLovinPostProcessiOS.cs
+MonoImporter:
+ externalObjects: {}
+ serializedVersion: 2
+ defaultReferences: []
+ executionOrder: 0
+ icon: {instanceID: 0}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/MaxSdk/Scripts/IntegrationManager/Editor/AppLovinPreProcess.cs b/Assets/MaxSdk/Scripts/IntegrationManager/Editor/AppLovinPreProcess.cs
new file mode 100644
index 0000000..3ed102a
--- /dev/null
+++ b/Assets/MaxSdk/Scripts/IntegrationManager/Editor/AppLovinPreProcess.cs
@@ -0,0 +1,182 @@
+//
+// AppLovinPreProcess.cs
+// AppLovin MAX Unity Plugin
+//
+// Created by Jonathan Liu on 10/19/2023.
+// Copyright © 2023 AppLovin. All rights reserved.
+//
+
+using System;
+using System.IO;
+using System.Linq;
+using System.Xml;
+using System.Xml.Linq;
+
+namespace AppLovinMax.Scripts.IntegrationManager.Editor
+{
+ public abstract class AppLovinPreProcess
+ {
+ // Use a slightly lower value than max value so pubs have the option to run a post process script after ours.
+ internal const int CallbackOrder = int.MaxValue - 10;
+ private const string AppLovinDependenciesFileExportPath = "MaxSdk/AppLovin/Editor/Dependencies.xml";
+ private const string ElementNameDependencies = "dependencies";
+
+ private static readonly XmlWriterSettings DependenciesFileXmlWriterSettings = new XmlWriterSettings
+ {
+ Indent = true,
+ IndentChars = " ",
+ NewLineChars = "\n",
+ NewLineHandling = NewLineHandling.Replace
+ };
+
+ protected static string AppLovinDependenciesFilePath
+ {
+ get { return AppLovinIntegrationManager.IsPluginInPackageManager ? Path.Combine("Assets", AppLovinDependenciesFileExportPath) : MaxSdkUtils.GetAssetPathForExportPath(AppLovinDependenciesFileExportPath); }
+ }
+
+ ///
+ /// Gets the AppLovin Dependencies.xml file. If `createIfNotExists` is true, a new file will be created if one does not exist.
+ ///
+ /// The path to the AppLovin Dependencies.xml file
+ /// Whether to create a new Dependencies.xml file if one does not exist
+ ///
+ protected static XDocument GetAppLovinDependenciesFile(string path, bool createIfNotExists = false)
+ {
+ try
+ {
+ if (File.Exists(path))
+ {
+ return XDocument.Load(path);
+ }
+
+ if (createIfNotExists)
+ {
+ return new XDocument(new XDeclaration("1.0", "utf-8", "yes"),
+ new XElement(ElementNameDependencies));
+ }
+ }
+ catch (Exception exception)
+ {
+ MaxSdkLogger.E("Unable to load Dependencies file due to exception: " + exception.Message);
+ }
+
+ return null;
+ }
+
+ ///
+ /// Updates a dependency if it exists, otherwise adds a new dependency.
+ ///
+ /// The dependencies document we are writing to
+ /// The parent tag that we want to search for the dependency. For example, to add a new dependency to Android, pass in "androidPackages"
+ /// The element we are looking to update/add. For example, to add a new dependency to Android, pass in "androidPackage"
+ /// The attribute name we want in the dependency. For example, to add something to the spec attribute, pass in "spec"
+ /// The attribute value prefix we are looking to replace. For example, "com.google.android.ump:user-messaging-platform"
+ /// The new dependency we want to add.
+ protected static void AddOrUpdateDependency(
+ XDocument dependenciesDocument,
+ string parentTag,
+ string elementTag,
+ string matchAttribute,
+ string matchValuePrefix,
+ XElement newDependency)
+ {
+ var parentElement = dependenciesDocument.Root.Element(parentTag);
+ if (parentElement == null)
+ {
+ parentElement = new XElement(parentTag);
+ dependenciesDocument.Root.Add(parentElement);
+ }
+
+ // Check if a dependency exists that matches the attributes name and value
+ var existingElement = parentElement.Elements(elementTag)
+ .FirstOrDefault(element =>
+ {
+ var attr = element.Attribute(matchAttribute);
+ return attr != null && attr.Value.StartsWith(matchValuePrefix, StringComparison.OrdinalIgnoreCase);
+ });
+
+ if (existingElement != null)
+ {
+ foreach (var attr in newDependency.Attributes())
+ {
+ existingElement.SetAttributeValue(attr.Name, attr.Value);
+ }
+ }
+ else
+ {
+ parentElement.Add(newDependency);
+ }
+ }
+
+ ///
+ /// Removes a dependency from an xml file.
+ ///
+ /// The xml file to remove a dependency from
+ /// The parent tag that we want to search for the dependency to remove. For example: "androidPackages"
+ /// The element we are looking to remove. For example: "androidPackage"
+ /// The attribute name we want to remove. For example: "spec"
+ /// The attribute value prefix we are looking to replace. For example: "com.google.android.ump:user-messaging-platform"
+ /// True if the dependency was removed successfully, otherwise return false.
+ protected static bool RemoveDependency(
+ XDocument doc,
+ string parentTag,
+ string elementTag,
+ string matchAttribute,
+ string matchValuePrefix)
+ {
+ var root = doc.Root;
+ if (root == null) return false;
+
+ var parentElement = root.Element(parentTag);
+ if (parentElement == null) return false;
+
+ XElement toRemove = null;
+ foreach (var e in parentElement.Elements(elementTag))
+ {
+ var attr = e.Attribute(matchAttribute);
+ if (attr != null && attr.Value.StartsWith(matchValuePrefix))
+ {
+ toRemove = e;
+ break;
+ }
+ }
+
+ if (toRemove == null) return false;
+
+ toRemove.Remove();
+ return true;
+ }
+
+ ///
+ /// Saves an xml file.
+ ///
+ /// The document to save
+ /// The path to the document to save
+ /// Returns true if the file was saved successfully
+ protected static bool SaveDependenciesFile(XDocument doc, string path)
+ {
+ try
+ {
+ // Ensure directory exists before saving the file
+ var directory = Path.GetDirectoryName(path);
+ if (MaxSdkUtils.IsValidString(directory))
+ {
+ // Does nothing if directory already exists
+ Directory.CreateDirectory(directory);
+ }
+
+ using (var xmlWriter = XmlWriter.Create(path, DependenciesFileXmlWriterSettings))
+ {
+ doc.Save(xmlWriter);
+ return true;
+ }
+ }
+ catch (Exception exception)
+ {
+ MaxSdkLogger.E("Unable to save Dependencies file due to exception: " + exception.Message);
+ }
+
+ return false;
+ }
+ }
+}
diff --git a/Assets/MaxSdk/Scripts/IntegrationManager/Editor/AppLovinPreProcess.cs.meta b/Assets/MaxSdk/Scripts/IntegrationManager/Editor/AppLovinPreProcess.cs.meta
new file mode 100644
index 0000000..f5e00db
--- /dev/null
+++ b/Assets/MaxSdk/Scripts/IntegrationManager/Editor/AppLovinPreProcess.cs.meta
@@ -0,0 +1,14 @@
+fileFormatVersion: 2
+guid: 0e6254f24e89548b3a7644fa7bf25f9d
+labels:
+- al_max
+- al_max_export_path-MaxSdk/Scripts/IntegrationManager/Editor/AppLovinPreProcess.cs
+MonoImporter:
+ externalObjects: {}
+ serializedVersion: 2
+ defaultReferences: []
+ executionOrder: 0
+ icon: {instanceID: 0}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/MaxSdk/Scripts/IntegrationManager/Editor/AppLovinPreProcessAndroid.cs b/Assets/MaxSdk/Scripts/IntegrationManager/Editor/AppLovinPreProcessAndroid.cs
new file mode 100644
index 0000000..2df7e0a
--- /dev/null
+++ b/Assets/MaxSdk/Scripts/IntegrationManager/Editor/AppLovinPreProcessAndroid.cs
@@ -0,0 +1,111 @@
+//
+// AppLovinBuildPreProcessor.cs
+// AppLovin MAX Unity Plugin
+//
+// Created by Santosh Bagadi on 8/27/19.
+// Copyright © 2019 AppLovin. All rights reserved.
+//
+
+#if UNITY_ANDROID
+
+using System.Xml.Linq;
+using UnityEditor.Build;
+using UnityEditor.Build.Reporting;
+
+namespace AppLovinMax.Scripts.IntegrationManager.Editor
+{
+ ///
+ /// Adds the AppLovin Quality Service plugin to the gradle template file. See for more details.
+ ///
+ public class AppLovinPreProcessAndroid : AppLovinProcessGradleBuildFile, IPreprocessBuildWithReport
+ {
+ private const string ElementNameAndroidPackages = "androidPackages";
+ private const string ElementNameAndroidPackage = "androidPackage";
+ private const string AttributeNameSpec = "spec";
+ private const string UmpDependencyPackage = "com.google.android.ump:user-messaging-platform:";
+ private const string UmpDependencyVersion = "4.0.0";
+
+ public void OnPreprocessBuild(BuildReport report)
+ {
+ PreprocessAppLovinQualityServicePlugin();
+ AddGoogleCmpDependencyIfNeeded();
+ }
+
+ private static void PreprocessAppLovinQualityServicePlugin()
+ {
+ // We can only process gradle template file here. If it is not available, we will try again in post build on Unity IDEs newer than 2018_2 (see AppLovinPostProcessGradleProject).
+ if (!AppLovinIntegrationManager.GradleTemplateEnabled) return;
+
+ // The publisher could be migrating from older Unity versions to 2019_3 or newer.
+ // If so, we should delete the plugin from the template. The plugin will be added to the project's application module in the post processing script (AppLovinPostProcessGradleProject).
+ RemoveAppLovinQualityServiceOrSafeDkPlugin(AppLovinIntegrationManager.GradleTemplatePath);
+ }
+
+ private static void AddGoogleCmpDependencyIfNeeded()
+ {
+ if (AppLovinInternalSettings.Instance.ConsentFlowEnabled)
+ {
+ var umpPackage = new XElement(ElementNameAndroidPackage,
+ new XAttribute(AttributeNameSpec, UmpDependencyPackage + UmpDependencyVersion));
+ var success = AddOrUpdateAndroidDependency(UmpDependencyPackage, umpPackage );
+ if (!success)
+ {
+ MaxSdkLogger.UserWarning("Google CMP will not function. Unable to add user-messaging-platform dependency.");
+ }
+ }
+ else
+ {
+ RemoveAndroidDependency(UmpDependencyPackage);
+ }
+ }
+
+ ///
+ /// Adds or updates an Android dependency in the AppLovin Dependencies.xml file.
+ ///
+ /// The package that we are trying to update
+ /// The new dependency to add if it doesn't exist
+ /// Returns true if the file was successfully edited
+ private static bool AddOrUpdateAndroidDependency(string package, XElement newDependency)
+ {
+ var dependenciesFilePath = AppLovinDependenciesFilePath;
+ var dependenciesDocument = GetAppLovinDependenciesFile(dependenciesFilePath, AppLovinIntegrationManager.IsPluginInPackageManager);
+ if (dependenciesDocument == null) return false;
+
+ AddOrUpdateDependency(dependenciesDocument,
+ ElementNameAndroidPackages,
+ ElementNameAndroidPackage,
+ AttributeNameSpec,
+ package,
+ newDependency);
+ return SaveDependenciesFile(dependenciesDocument, dependenciesFilePath);
+ }
+
+ ///
+ /// Removed an android dependency from the AppLovin Dependencies.xml file.
+ ///
+ /// The package to remove
+ private static void RemoveAndroidDependency(string package)
+ {
+ var dependenciesFilePath = AppLovinDependenciesFilePath;
+ var dependenciesDocument = GetAppLovinDependenciesFile(dependenciesFilePath);
+ if (dependenciesDocument == null) return;
+
+ var removed = RemoveDependency(dependenciesDocument,
+ ElementNameAndroidPackages,
+ ElementNameAndroidPackage,
+ AttributeNameSpec,
+ package);
+
+ if (!removed) return;
+
+ SaveDependenciesFile(dependenciesDocument, dependenciesFilePath);
+ }
+
+ public int callbackOrder
+ {
+ get { return CallbackOrder; }
+ }
+ }
+}
+
+#endif
diff --git a/Assets/MaxSdk/Scripts/IntegrationManager/Editor/AppLovinPreProcessAndroid.cs.meta b/Assets/MaxSdk/Scripts/IntegrationManager/Editor/AppLovinPreProcessAndroid.cs.meta
new file mode 100644
index 0000000..4dd79e8
--- /dev/null
+++ b/Assets/MaxSdk/Scripts/IntegrationManager/Editor/AppLovinPreProcessAndroid.cs.meta
@@ -0,0 +1,14 @@
+fileFormatVersion: 2
+guid: 8ccaf444d0d4f4cadb5debe7c41b20c4
+labels:
+- al_max
+- al_max_export_path-MaxSdk/Scripts/IntegrationManager/Editor/AppLovinPreProcessAndroid.cs
+MonoImporter:
+ externalObjects: {}
+ serializedVersion: 2
+ defaultReferences: []
+ executionOrder: 0
+ icon: {instanceID: 0}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/MaxSdk/Scripts/IntegrationManager/Editor/AppLovinPreProcessiOS.cs b/Assets/MaxSdk/Scripts/IntegrationManager/Editor/AppLovinPreProcessiOS.cs
new file mode 100644
index 0000000..19729a1
--- /dev/null
+++ b/Assets/MaxSdk/Scripts/IntegrationManager/Editor/AppLovinPreProcessiOS.cs
@@ -0,0 +1,99 @@
+//
+// AppLovinBuildPreProcessiOS.cs
+// AppLovin MAX Unity Plugin
+//
+// Created by Jonathan Liu on 10/17/2023.
+// Copyright © 2023 AppLovin. All rights reserved.
+//
+
+#if UNITY_IOS
+
+using System.Xml.Linq;
+using UnityEditor.Build;
+using UnityEditor.Build.Reporting;
+
+namespace AppLovinMax.Scripts.IntegrationManager.Editor
+{
+ public class AppLovinPreProcessiOS : AppLovinPreProcess, IPreprocessBuildWithReport
+ {
+ public void OnPreprocessBuild(BuildReport report)
+ {
+ AddGoogleCmpDependencyIfNeeded();
+ }
+
+ private const string ElementNameIosPods = "iosPods";
+ private const string ElementNameIosPod = "iosPod";
+ private const string AttributeNameName = "name";
+ private const string AttributeNameVersion = "version";
+ private const string UmpDependencyPod = "GoogleUserMessagingPlatform";
+ private const string UmpDependencyVersion = "~> 3.1";
+
+ private static void AddGoogleCmpDependencyIfNeeded()
+ {
+ if (AppLovinInternalSettings.Instance.ConsentFlowEnabled)
+ {
+ var umpDependency = new XElement(ElementNameIosPod,
+ new XAttribute(AttributeNameName, UmpDependencyPod),
+ new XAttribute(AttributeNameVersion, UmpDependencyVersion));
+ var success = AddOrUpdateIosDependency(UmpDependencyPod, umpDependency);
+ if (!success)
+ {
+ MaxSdkLogger.UserWarning("Google CMP will not function. Unable to add GoogleUserMessagingPlatform dependency.");
+ }
+ }
+ else
+ {
+ RemoveIosDependency(UmpDependencyPod);
+ }
+ }
+
+ ///
+ /// Adds or updates an iOS pod in the AppLovin Dependencies.xml file.
+ ///
+ /// The pod that we are trying to update
+ /// The new dependency to add if it doesn't exist
+ /// Returns true if the file was successfully edited
+ private static bool AddOrUpdateIosDependency(string pod, XElement newDependency)
+ {
+ var dependenciesFilePath = AppLovinDependenciesFilePath;
+ var dependenciesDocument = GetAppLovinDependenciesFile(dependenciesFilePath, AppLovinIntegrationManager.IsPluginInPackageManager);
+ if (dependenciesDocument == null) return false;
+
+ AddOrUpdateDependency(dependenciesDocument,
+ ElementNameIosPods,
+ ElementNameIosPod,
+ AttributeNameName,
+ pod,
+ newDependency);
+ return SaveDependenciesFile(dependenciesDocument, dependenciesFilePath);
+ }
+
+ ///
+ /// Removed an iOS pod from the AppLovin Dependencies.xml file.
+ ///
+ /// The pod to remove
+ private static void RemoveIosDependency(string pod)
+ {
+ var dependenciesFilePath = AppLovinDependenciesFilePath;
+ var dependenciesDocument = GetAppLovinDependenciesFile(dependenciesFilePath);
+ if (dependenciesDocument == null) return;
+
+ var removed = RemoveDependency(dependenciesDocument,
+ ElementNameIosPods,
+ ElementNameIosPod,
+ AttributeNameName,
+ pod);
+
+ if (!removed) return;
+
+ SaveDependenciesFile(dependenciesDocument, dependenciesFilePath);
+ }
+
+ public int callbackOrder
+ {
+ get { return CallbackOrder; }
+ }
+ }
+}
+
+#endif
diff --git a/Assets/MaxSdk/Scripts/IntegrationManager/Editor/AppLovinPreProcessiOS.cs.meta b/Assets/MaxSdk/Scripts/IntegrationManager/Editor/AppLovinPreProcessiOS.cs.meta
new file mode 100644
index 0000000..33bdffb
--- /dev/null
+++ b/Assets/MaxSdk/Scripts/IntegrationManager/Editor/AppLovinPreProcessiOS.cs.meta
@@ -0,0 +1,14 @@
+fileFormatVersion: 2
+guid: ee45537a5833240d7afcfac4a38df1b9
+labels:
+- al_max
+- al_max_export_path-MaxSdk/Scripts/IntegrationManager/Editor/AppLovinPreProcessiOS.cs
+MonoImporter:
+ externalObjects: {}
+ serializedVersion: 2
+ defaultReferences: []
+ executionOrder: 0
+ icon: {instanceID: 0}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/MaxSdk/Scripts/IntegrationManager/Editor/AppLovinProcessGradleBuildFile.cs b/Assets/MaxSdk/Scripts/IntegrationManager/Editor/AppLovinProcessGradleBuildFile.cs
new file mode 100644
index 0000000..88bd668
--- /dev/null
+++ b/Assets/MaxSdk/Scripts/IntegrationManager/Editor/AppLovinProcessGradleBuildFile.cs
@@ -0,0 +1,658 @@
+// AppLovin MAX Unity Plugin
+//
+// Created by Santosh Bagadi on 9/3/19.
+// Copyright © 2019 AppLovin. All rights reserved.
+//
+
+#if UNITY_ANDROID
+
+using System;
+using System.Collections.Generic;
+using System.IO;
+using System.Linq;
+using System.Text.RegularExpressions;
+using AppLovinMax.Internal;
+using UnityEngine;
+using UnityEngine.PlayerLoop;
+
+namespace AppLovinMax.Scripts.IntegrationManager.Editor
+{
+ [Serializable]
+ public class AppLovinQualityServiceData
+ {
+ // ReSharper disable once InconsistentNaming - Need to keep name for response data
+ public string api_key;
+ }
+
+ ///
+ /// Adds or updates the AppLovin Quality Service plugin to the provided build.gradle file.
+ /// If the gradle file already has the plugin, the API key is updated.
+ ///
+ public abstract class AppLovinProcessGradleBuildFile : AppLovinPreProcess
+ {
+ private static readonly Regex TokenBuildScriptRepositories = new Regex(".*repositories.*");
+ private static readonly Regex TokenBuildScriptDependencies = new Regex(".*classpath \'com.android.tools.build:gradle.*");
+ private static readonly Regex TokenApplicationPlugin = new Regex(".*apply plugin: \'com.android.application\'.*");
+ private static readonly Regex TokenApiKey = new Regex(".*apiKey.*");
+ private static readonly Regex TokenAppLovinPlugin = new Regex(".*apply plugin:.+?(?=applovin-quality-service).*");
+
+ private const string PluginsMatcher = "plugins";
+ private const string PluginManagementMatcher = "pluginManagement";
+ private const string QualityServicePluginRoot = " id 'com.applovin.quality' version '+' apply false // NOTE: Requires version 4.8.3+ for Gradle version 7.2+";
+
+ private const string BuildScriptMatcher = "buildscript";
+ private const string QualityServiceMavenRepo = "maven { url 'https://artifacts.applovin.com/android'; content { includeGroupByRegex 'com.applovin.*' } }";
+ private const string QualityServiceDependencyClassPath = "classpath 'com.applovin.quality:AppLovinQualityServiceGradlePlugin:+'";
+ private const string QualityServiceApplyPlugin = "apply plugin: 'applovin-quality-service'";
+ private const string QualityServicePlugin = "applovin {";
+ private const string QualityServiceApiKey = " apiKey '{0}'";
+ private const string QualityServiceBintrayMavenRepo = "https://applovin.bintray.com/Quality-Service";
+ private const string QualityServiceNoRegexMavenRepo = "maven { url 'https://artifacts.applovin.com/android' }";
+
+ // Legacy plugin detection variables
+ private const string QualityServiceDependencyClassPathV3 = "classpath 'com.applovin.quality:AppLovinQualityServiceGradlePlugin:3.+'";
+ private static readonly Regex TokenSafeDkLegacyApplyPlugin = new Regex(".*apply plugin:.+?(?=safedk).*");
+ private const string SafeDkLegacyPlugin = "safedk {";
+ private const string SafeDkLegacyMavenRepo = "http://download.safedk.com";
+ private const string SafeDkLegacyDependencyClassPath = "com.safedk:SafeDKGradlePlugin:";
+
+ ///
+ /// Adds the Quality Service plugin to the root gradle file.
+ ///
+ /// The path to the unityLibrary's module.
+ /// True if the plugin was added successfully, otherwise return false
+ protected static bool AddQualityServiceToRootGradleFile(string path)
+ {
+ var rootGradleBuildFilePath = Path.Combine(path, "../build.gradle");
+ var shouldAddQualityServiceToDependencies = ShouldAddQualityServiceToDependencies(rootGradleBuildFilePath);
+
+ if (shouldAddQualityServiceToDependencies)
+ {
+ // Add the Quality Service Plugin to the dependencies block in the root build.gradle file
+ return AddQualityServiceBuildScriptLines(rootGradleBuildFilePath);
+ }
+
+ // Add the Quality Service Plugin to the plugin block in the root build.gradle file
+ var rootSettingsGradleFilePath = Path.Combine(path, "../settings.gradle");
+ var qualityServiceAdded = AddPluginToRootGradleBuildFile(rootGradleBuildFilePath);
+ var appLovinRepositoryAdded = AddAppLovinRepository(rootSettingsGradleFilePath);
+ return qualityServiceAdded && appLovinRepositoryAdded;
+ }
+
+ ///
+ /// Determines whether the AppLovin Quality Service plugin should be added to the
+ /// dependencies block in the root build.gradle file or to the plugins block.
+ ///
+ /// Gradle's required structure for including plugins varies by version:
+ /// - Older versions of Gradle require the plugin to be added to the dependencies block.
+ /// Example:
+ /// dependencies {
+ /// classpath 'com.android.tools.build:gradle:4.0.1'
+ /// classpath 'com.applovin.quality:AppLovinQualityServiceGradlePlugin:+'
+ /// }
+ ///
+ /// - Newer versions of gradle require the plugin to be added to the plugins block.
+ /// Example:
+ /// plugins {
+ /// id 'com.android.application' version '7.4.2' apply false
+ /// id 'com.android.library' version '7.4.2' apply false
+ /// id 'com.applovin.quality' version '+' apply false
+ /// }
+ ///
+ /// Since Unity projects may use custom Gradle versions depending on the Unity version or
+ /// user modifications, this check ensures proper integration of the AppLovin plugin.
+ ///
+ /// The path to project's root build.gradle file.
+ /// true if the file contains a `dependencies` block, indicating an older Gradle version
+ private static bool ShouldAddQualityServiceToDependencies(string rootGradleBuildFile)
+ {
+ var lines = File.ReadAllLines(rootGradleBuildFile).ToList();
+ return lines.Any(line => TokenBuildScriptDependencies.IsMatch(line));
+ }
+
+ ///
+ /// Updates the provided Gradle script to add Quality Service plugin.
+ ///
+ /// The gradle file to update.
+ protected static void AddAppLovinQualityServicePlugin(string applicationGradleBuildFilePath)
+ {
+ if (!AppLovinSettings.Instance.QualityServiceEnabled) return;
+
+ var sdkKey = AppLovinSettings.Instance.SdkKey;
+ if (string.IsNullOrEmpty(sdkKey))
+ {
+ MaxSdkLogger.UserError("Failed to install AppLovin Quality Service plugin. SDK Key is empty. Please enter the AppLovin SDK Key in the Integration Manager.");
+ return;
+ }
+
+ // Retrieve the API Key using the SDK Key.
+ var qualityServiceData = RetrieveQualityServiceData(sdkKey);
+ var apiKey = qualityServiceData.api_key;
+ if (string.IsNullOrEmpty(apiKey))
+ {
+ MaxSdkLogger.UserError("Failed to install AppLovin Quality Service plugin. API Key is empty.");
+ return;
+ }
+
+ // Generate the updated Gradle file that needs to be written.
+ var lines = File.ReadAllLines(applicationGradleBuildFilePath).ToList();
+ var sanitizedLines = RemoveLegacySafeDkPlugin(lines);
+ var outputLines = GenerateUpdatedBuildFileLines(
+ sanitizedLines,
+ apiKey,
+ false // The buildscript closure related lines will to be added to the root build.gradle file.
+ );
+ // outputLines can be null if we couldn't add the plugin.
+ if (outputLines == null) return;
+
+ try
+ {
+ File.WriteAllText(applicationGradleBuildFilePath, string.Join("\n", outputLines.ToArray()) + "\n");
+ }
+ catch (Exception exception)
+ {
+ MaxSdkLogger.UserError("Failed to install AppLovin Quality Service plugin. Gradle file write failed.");
+ Console.WriteLine(exception);
+ }
+ }
+
+ ///
+ /// Adds AppLovin Quality Service plugin DSL element to the project's root build.gradle file.
+ /// Sample build.gradle file after adding quality service:
+ /// plugins {
+ /// id 'com.android.application' version '7.4.2' apply false
+ /// id 'com.android.library' version '7.4.2' apply false
+ /// id 'com.applovin.quality' version '+' apply false
+ /// }
+ /// tasks.register('clean', Delete) {
+ /// delete rootProject.layout.buildDirectory
+ /// }
+ ///
+ ///
+ /// The path to project's root build.gradle file.
+ /// true when the plugin was added successfully.
+ private static bool AddPluginToRootGradleBuildFile(string rootGradleBuildFile)
+ {
+ var lines = File.ReadAllLines(rootGradleBuildFile).ToList();
+
+ // Check if the plugin is already added to the file.
+ var pluginAdded = lines.Any(line => line.Contains(QualityServicePluginRoot));
+ if (pluginAdded) return true;
+
+ var outputLines = new List();
+ var insidePluginsClosure = false;
+ foreach (var line in lines)
+ {
+ if (line.Contains(PluginsMatcher))
+ {
+ insidePluginsClosure = true;
+ }
+
+ if (!pluginAdded && insidePluginsClosure && line.Contains("}"))
+ {
+ outputLines.Add(QualityServicePluginRoot);
+ pluginAdded = true;
+ insidePluginsClosure = false;
+ }
+
+ outputLines.Add(line);
+ }
+
+ if (!pluginAdded) return false;
+
+ try
+ {
+ File.WriteAllText(rootGradleBuildFile, string.Join("\n", outputLines.ToArray()) + "\n");
+ }
+ catch (Exception exception)
+ {
+ MaxSdkLogger.UserError("Failed to install AppLovin Quality Service plugin. Root Gradle file write failed.");
+ Console.WriteLine(exception);
+ return false;
+ }
+
+ return true;
+ }
+
+ ///
+ /// Adds the AppLovin maven repository to the project's settings.gradle file.
+ /// Sample settings.gradle file after adding AppLovin Repository:
+ /// pluginManagement {
+ /// repositories {
+ /// maven { url 'https://artifacts.applovin.com/android'; content { includeGroupByRegex 'com.applovin.*' } }
+ ///
+ /// gradlePluginPortal()
+ /// google()
+ /// mavenCentral()
+ /// }
+ /// }
+ /// ...
+ ///
+ ///
+ /// The path to the project's settings.gradle file.
+ /// true if the repository was added successfully.
+ private static bool AddAppLovinRepository(string settingsGradleFile)
+ {
+ var lines = File.ReadLines(settingsGradleFile).ToList();
+ var outputLines = new List();
+ var mavenRepoAdded = false;
+ var pluginManagementClosureDepth = 0;
+ var insidePluginManagementClosure = false;
+ var pluginManagementMatched = false;
+ foreach (var line in lines)
+ {
+ outputLines.Add(line);
+
+ if (!pluginManagementMatched && line.Contains(PluginManagementMatcher))
+ {
+ pluginManagementMatched = true;
+ insidePluginManagementClosure = true;
+ }
+
+ if (insidePluginManagementClosure)
+ {
+ if (line.Contains("{"))
+ {
+ pluginManagementClosureDepth++;
+ }
+
+ if (line.Contains("}"))
+ {
+ pluginManagementClosureDepth--;
+ }
+
+ if (pluginManagementClosureDepth == 0)
+ {
+ insidePluginManagementClosure = false;
+ }
+ }
+
+ if (insidePluginManagementClosure)
+ {
+ if (!mavenRepoAdded && TokenBuildScriptRepositories.IsMatch(line))
+ {
+ outputLines.Add(GetFormattedBuildScriptLine(QualityServiceMavenRepo));
+ mavenRepoAdded = true;
+ }
+ }
+ }
+
+ if (!mavenRepoAdded) return false;
+
+ try
+ {
+ File.WriteAllText(settingsGradleFile, string.Join("\n", outputLines.ToArray()) + "\n");
+ }
+ catch (Exception exception)
+ {
+ MaxSdkLogger.UserError("Failed to install AppLovin Quality Service plugin. Setting Gradle file write failed.");
+ Console.WriteLine(exception);
+ return false;
+ }
+
+ return true;
+ }
+
+ ///
+ /// Adds the necessary AppLovin Quality Service dependency and maven repo lines to the provided root build.gradle file.
+ /// Sample build.gradle file after adding quality service:
+ /// allprojects {
+ /// buildscript {
+ /// repositories {
+ /// maven { url 'https://artifacts.applovin.com/android'; content { includeGroupByRegex 'com.applovin.*' } }
+ /// google()
+ /// jcenter()
+ /// }
+ ///
+ /// dependencies {
+ /// classpath 'com.android.tools.build:gradle:4.0.1'
+ /// classpath 'com.applovin.quality:AppLovinQualityServiceGradlePlugin:+'
+ /// }
+ /// ...
+ ///
+ ///
+ /// The root build.gradle file path
+ /// true if the build script lines were applied correctly.
+ private static bool AddQualityServiceBuildScriptLines(string rootGradleBuildFile)
+ {
+ var lines = File.ReadAllLines(rootGradleBuildFile).ToList();
+ var outputLines = GenerateUpdatedBuildFileLines(lines, null, true);
+
+ // outputLines will be null if we couldn't add the build script lines.
+ if (outputLines == null) return false;
+
+ try
+ {
+ File.WriteAllText(rootGradleBuildFile, string.Join("\n", outputLines.ToArray()) + "\n");
+ }
+ catch (Exception exception)
+ {
+ MaxSdkLogger.UserError("Failed to install AppLovin Quality Service plugin. Root Gradle file write failed.");
+ Console.WriteLine(exception);
+ return false;
+ }
+
+ return true;
+ }
+
+ ///
+ /// Removes the AppLovin Quality Service Plugin or Legacy SafeDK plugin from the given gradle template file if either of them are present.
+ ///
+ /// The gradle template file from which to remove the plugin from
+ protected static void RemoveAppLovinQualityServiceOrSafeDkPlugin(string gradleTemplateFile)
+ {
+ var lines = File.ReadAllLines(gradleTemplateFile).ToList();
+ lines = RemoveLegacySafeDkPlugin(lines);
+ lines = RemoveAppLovinQualityServicePlugin(lines);
+
+ try
+ {
+ File.WriteAllText(gradleTemplateFile, string.Join("\n", lines.ToArray()) + "\n");
+ }
+ catch (Exception exception)
+ {
+ MaxSdkLogger.UserError("Failed to remove AppLovin Quality Service Plugin from mainTemplate.gradle. Please remove the Quality Service plugin from the mainTemplate.gradle manually.");
+ Console.WriteLine(exception);
+ }
+ }
+
+ private static AppLovinQualityServiceData RetrieveQualityServiceData(string sdkKey)
+ {
+ var webRequestConfig = new WebRequestConfig()
+ {
+ JsonString = string.Format("{{\"sdk_key\" : \"{0}\"}}", sdkKey),
+ EndPoint = "https://api2.safedk.com/v1/build/cred",
+ RequestType = WebRequestType.Post,
+ };
+
+ webRequestConfig.Headers.Add("Content-Type", "application/json");
+
+ var maxWebRequest = new MaxWebRequest(webRequestConfig);
+ var webResponse = maxWebRequest.SendSync();
+
+ if (!webResponse.IsSuccess)
+ {
+ MaxSdkLogger.UserError("Failed to retrieve API Key for SDK Key: " + sdkKey + "with error: " + webResponse.ErrorMessage);
+ return new AppLovinQualityServiceData();
+ }
+
+ try
+ {
+ return JsonUtility.FromJson(webResponse.ResponseMessage);
+ }
+ catch (Exception exception)
+ {
+ MaxSdkLogger.UserError("Failed to parse API Key." + exception);
+ return new AppLovinQualityServiceData();
+ }
+ }
+
+ private static List RemoveLegacySafeDkPlugin(List lines)
+ {
+ return RemovePlugin(lines, SafeDkLegacyPlugin, SafeDkLegacyMavenRepo, SafeDkLegacyDependencyClassPath, TokenSafeDkLegacyApplyPlugin);
+ }
+
+ private static List RemoveAppLovinQualityServicePlugin(List lines)
+ {
+ return RemovePlugin(lines, QualityServicePlugin, QualityServiceMavenRepo, QualityServiceDependencyClassPath, TokenAppLovinPlugin);
+ }
+
+ private static List RemovePlugin(List lines, string pluginLine, string mavenRepo, string dependencyClassPath, Regex applyPluginToken)
+ {
+ var sanitizedLines = new List();
+ var legacyRepoRemoved = false;
+ var legacyDependencyClassPathRemoved = false;
+ var legacyPluginRemoved = false;
+ var legacyPluginMatched = false;
+ var insideLegacySafeDkClosure = false;
+ foreach (var line in lines)
+ {
+ if (!legacyPluginMatched && line.Contains(pluginLine))
+ {
+ legacyPluginMatched = true;
+ insideLegacySafeDkClosure = true;
+ }
+
+ if (insideLegacySafeDkClosure && line.Contains("}"))
+ {
+ insideLegacySafeDkClosure = false;
+ continue;
+ }
+
+ if (insideLegacySafeDkClosure)
+ {
+ continue;
+ }
+
+ if (!legacyRepoRemoved && line.Contains(mavenRepo))
+ {
+ legacyRepoRemoved = true;
+ continue;
+ }
+
+ if (!legacyDependencyClassPathRemoved && line.Contains(dependencyClassPath))
+ {
+ legacyDependencyClassPathRemoved = true;
+ continue;
+ }
+
+ if (!legacyPluginRemoved && applyPluginToken.IsMatch(line))
+ {
+ legacyPluginRemoved = true;
+ continue;
+ }
+
+ sanitizedLines.Add(line);
+ }
+
+ return sanitizedLines;
+ }
+
+ private static List GenerateUpdatedBuildFileLines(List lines, string apiKey, bool addBuildScriptLines)
+ {
+ // Check if the plugin exists, if so, update the SDK Key.
+ var pluginExists = lines.Any(line => TokenAppLovinPlugin.IsMatch(line));
+ return pluginExists ? UpdateExistingPlugin(lines, apiKey) : AddPluginAndBuildScript(lines, apiKey, addBuildScriptLines);
+ }
+
+ private static List UpdateExistingPlugin(List lines, string apiKey)
+ {
+ // A sample of the template file.
+ // ...
+ // allprojects {
+ // repositories {**ARTIFACTORYREPOSITORY**
+ // google()
+ // jcenter()
+ // flatDir {
+ // dirs 'libs'
+ // }
+ // }
+ // }
+ //
+ // apply plugin: 'com.android.application'
+ // **APPLY_PLUGINS**
+ //
+ // dependencies {
+ // implementation fileTree(dir: 'libs', include: ['*.jar'])
+ // **DEPS**}
+ // ...
+ var outputLines = new List();
+ var pluginMatched = false;
+ var insideAppLovinClosure = false;
+ var updatedApiKey = false;
+ var mavenRepoUpdated = false;
+ var dependencyClassPathUpdated = false;
+ foreach (var line in lines)
+ {
+ // Bintray maven repo is no longer being used. Update to s3 maven repo with regex check
+ if (!mavenRepoUpdated && (line.Contains(QualityServiceBintrayMavenRepo) || line.Contains(QualityServiceNoRegexMavenRepo)))
+ {
+ outputLines.Add(GetFormattedBuildScriptLine(QualityServiceMavenRepo));
+ mavenRepoUpdated = true;
+ continue;
+ }
+
+ // We no longer use version specific dependency class path. Just use + for version to always pull the latest.
+ if (!dependencyClassPathUpdated && line.Contains(QualityServiceDependencyClassPathV3))
+ {
+ outputLines.Add(GetFormattedBuildScriptLine(QualityServiceDependencyClassPath));
+ dependencyClassPathUpdated = true;
+ continue;
+ }
+
+ if (!pluginMatched && line.Contains(QualityServicePlugin))
+ {
+ insideAppLovinClosure = true;
+ pluginMatched = true;
+ }
+
+ if (insideAppLovinClosure && line.Contains("}"))
+ {
+ insideAppLovinClosure = false;
+ }
+
+ // Update the API key.
+ if (insideAppLovinClosure && !updatedApiKey && TokenApiKey.IsMatch(line))
+ {
+ outputLines.Add(string.Format(QualityServiceApiKey, apiKey));
+ updatedApiKey = true;
+ }
+ // Keep adding the line until we find and update the plugin.
+ else
+ {
+ outputLines.Add(line);
+ }
+ }
+
+ return outputLines;
+ }
+
+ private static List AddPluginAndBuildScript(List lines, string apiKey, bool addBuildScriptLines)
+ {
+ var shouldAddPlugin = MaxSdkUtils.IsValidString(apiKey);
+ if (shouldAddPlugin)
+ {
+ lines = AddPlugin(lines, apiKey);
+ if (lines == null) return null;
+ }
+
+ if (!addBuildScriptLines) return lines;
+
+ lines = AddBuildScript(lines);
+ return lines;
+ }
+
+ private static List AddBuildScript(List lines)
+ {
+ var outputLines = new List();
+ var buildScriptClosureDepth = 0;
+ var insideBuildScriptClosure = false;
+ var buildScriptMatched = false;
+ var qualityServiceRepositoryAdded = false;
+ var qualityServiceDependencyClassPathAdded = false;
+ foreach (var line in lines)
+ {
+ // Add the line to the output lines.
+ outputLines.Add(line);
+
+ if (!buildScriptMatched && line.Contains(BuildScriptMatcher))
+ {
+ buildScriptMatched = true;
+ insideBuildScriptClosure = true;
+ }
+
+ // Match the parenthesis to track if we are still inside the buildscript closure.
+ if (insideBuildScriptClosure)
+ {
+ if (line.Contains("{"))
+ {
+ buildScriptClosureDepth++;
+ }
+
+ if (line.Contains("}"))
+ {
+ buildScriptClosureDepth--;
+ }
+
+ if (buildScriptClosureDepth == 0)
+ {
+ insideBuildScriptClosure = false;
+
+ // There may be multiple buildscript closures and we need to keep looking until we added both the repository and classpath.
+ buildScriptMatched = qualityServiceRepositoryAdded && qualityServiceDependencyClassPathAdded;
+ }
+ }
+
+ if (insideBuildScriptClosure)
+ {
+ // Add the build script dependency repositories.
+ if (!qualityServiceRepositoryAdded && TokenBuildScriptRepositories.IsMatch(line))
+ {
+ outputLines.Add(GetFormattedBuildScriptLine(QualityServiceMavenRepo));
+ qualityServiceRepositoryAdded = true;
+ }
+ // Add the build script dependencies.
+ else if (!qualityServiceDependencyClassPathAdded && TokenBuildScriptDependencies.IsMatch(line))
+ {
+ outputLines.Add(GetFormattedBuildScriptLine(QualityServiceDependencyClassPath));
+ qualityServiceDependencyClassPathAdded = true;
+ }
+ }
+ }
+
+ if (!qualityServiceRepositoryAdded || !qualityServiceDependencyClassPathAdded)
+ {
+ return null;
+ }
+
+ return outputLines;
+ }
+
+ private static List AddPlugin(List lines, string apiKey)
+ {
+ var outputLines = new List();
+ var qualityServicePluginAdded = false;
+ foreach (var line in lines)
+ {
+ outputLines.Add(line);
+
+ // Add the plugin.
+ if (qualityServicePluginAdded || !TokenApplicationPlugin.IsMatch(line)) continue;
+
+ outputLines.Add(QualityServiceApplyPlugin);
+ outputLines.AddRange(GenerateAppLovinPluginClosure(apiKey));
+ qualityServicePluginAdded = true;
+ }
+
+ return qualityServicePluginAdded ? outputLines : null;
+ }
+
+ public static string GetFormattedBuildScriptLine(string buildScriptLine)
+ {
+#if UNITY_2022_2_OR_NEWER
+ return " "
+#else
+ return " "
+#endif
+ + buildScriptLine;
+ }
+
+ private static IEnumerable GenerateAppLovinPluginClosure(string apiKey)
+ {
+ // applovin {
+ // // NOTE: DO NOT CHANGE - this is NOT your AppLovin MAX SDK key - this is a derived key.
+ // apiKey "456...a1b"
+ // }
+ var linesToInject = new List(5);
+ linesToInject.Add("");
+ linesToInject.Add("applovin {");
+ linesToInject.Add(" // NOTE: DO NOT CHANGE - this is NOT your AppLovin MAX SDK key - this is a derived key.");
+ linesToInject.Add(string.Format(QualityServiceApiKey, apiKey));
+ linesToInject.Add("}");
+
+ return linesToInject;
+ }
+ }
+}
+
+#endif
diff --git a/Assets/MaxSdk/Scripts/IntegrationManager/Editor/AppLovinProcessGradleBuildFile.cs.meta b/Assets/MaxSdk/Scripts/IntegrationManager/Editor/AppLovinProcessGradleBuildFile.cs.meta
new file mode 100644
index 0000000..5e49844
--- /dev/null
+++ b/Assets/MaxSdk/Scripts/IntegrationManager/Editor/AppLovinProcessGradleBuildFile.cs.meta
@@ -0,0 +1,14 @@
+fileFormatVersion: 2
+guid: 732b7510bc9c94aafb3fd3b8c0dc5d2d
+labels:
+- al_max
+- al_max_export_path-MaxSdk/Scripts/IntegrationManager/Editor/AppLovinProcessGradleBuildFile.cs
+MonoImporter:
+ externalObjects: {}
+ serializedVersion: 2
+ defaultReferences: []
+ executionOrder: 0
+ icon: {instanceID: 0}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/MaxSdk/Scripts/IntegrationManager/Editor/AppLovinSettings.cs b/Assets/MaxSdk/Scripts/IntegrationManager/Editor/AppLovinSettings.cs
new file mode 100644
index 0000000..6a56a22
--- /dev/null
+++ b/Assets/MaxSdk/Scripts/IntegrationManager/Editor/AppLovinSettings.cs
@@ -0,0 +1,159 @@
+//
+// AppLovinSettings.cs
+// AppLovin MAX Unity Plugin
+//
+// Created by Santosh Bagadi on 1/27/20.
+// Copyright © 2019 AppLovin. All rights reserved.
+//
+
+using AppLovinMax.Scripts.IntegrationManager.Editor;
+using System.IO;
+using UnityEditor;
+using UnityEngine;
+using UnityEngine.Serialization;
+
+///
+/// A representing the AppLovin Settings that can be set in the Integration Manager Window.
+///
+/// The scriptable object asset is created with the name AppLovinSettings.asset and is placed under the directory Assets/MaxSdk/Resources .
+///
+/// NOTE: Not name spacing this class since it is reflected upon by the Google adapter and will break compatibility.
+///
+public class AppLovinSettings : ScriptableObject
+{
+ private const string SettingsExportPath = "MaxSdk/Resources/AppLovinSettings.asset";
+
+ private static AppLovinSettings instance;
+
+ [SerializeField] private bool qualityServiceEnabled = true;
+ [SerializeField] private string sdkKey;
+
+ [SerializeField] private string customGradleVersionUrl;
+ [SerializeField] private string customGradleToolsVersion;
+
+ [SerializeField] private string adMobAndroidAppId = string.Empty;
+ [SerializeField] private string adMobIosAppId = string.Empty;
+
+ ///
+ /// An instance of AppLovin Setting.
+ ///
+ public static AppLovinSettings Instance
+ {
+ get
+ {
+ if (instance == null)
+ {
+ // Check for an existing AppLovinSettings somewhere in the project
+ var guids = AssetDatabase.FindAssets("AppLovinSettings t:ScriptableObject");
+ if (guids.Length > 1)
+ {
+ MaxSdkLogger.UserWarning("Multiple AppLovinSettings found. This may cause unexpected results.");
+ }
+
+ if (guids.Length != 0)
+ {
+ var path = AssetDatabase.GUIDToAssetPath(guids[0]);
+ instance = AssetDatabase.LoadAssetAtPath(path);
+ return instance;
+ }
+
+ string settingsFilePath;
+ // The settings file should be under the Assets/ folder so that it can be version controlled and cannot be overriden when updating.
+ // If the plugin is outside the Assets folder or if there is no existing AppLovinSettings asset, create the settings asset at the default location.
+ if (AppLovinIntegrationManager.IsPluginInPackageManager)
+ {
+ // Note: Can't use absolute path when calling `CreateAsset`. Should use path relative to Assets/ directory.
+ settingsFilePath = MaxSdkUtils.NormalizeToUnityPath(Path.Combine("Assets", SettingsExportPath));
+
+ var maxSdkDir = MaxSdkUtils.NormalizeToUnityPath(Path.Combine(Application.dataPath, "MaxSdk"));
+ if (!Directory.Exists(maxSdkDir))
+ {
+ Directory.CreateDirectory(maxSdkDir);
+ }
+ }
+ else
+ {
+ settingsFilePath = MaxSdkUtils.NormalizeToUnityPath(Path.Combine(AppLovinIntegrationManager.PluginParentDirectory, SettingsExportPath));
+ }
+
+ var settingsDir = Path.GetDirectoryName(settingsFilePath);
+ if (!Directory.Exists(settingsDir))
+ {
+ Directory.CreateDirectory(settingsDir);
+ }
+
+ // On script reload AssetDatabase.FindAssets() can fail and will overwrite AppLovinSettings without this check
+ if (!File.Exists(settingsFilePath))
+ {
+ instance = CreateInstance();
+ AssetDatabase.CreateAsset(instance, settingsFilePath);
+ MaxSdkLogger.D("Creating new AppLovinSettings asset at path: " + settingsFilePath);
+ }
+ }
+
+ return instance;
+ }
+ }
+
+ ///
+ /// Whether or not to install Quality Service plugin.
+ ///
+ public bool QualityServiceEnabled
+ {
+ get { return Instance.qualityServiceEnabled; }
+ set { Instance.qualityServiceEnabled = value; }
+ }
+
+ ///
+ /// AppLovin SDK Key.
+ ///
+ public string SdkKey
+ {
+ get { return Instance.sdkKey; }
+ set { Instance.sdkKey = value; }
+ }
+
+ ///
+ /// A URL to set the distributionUrl in the gradle-wrapper.properties file (ex: https\://services.gradle.org/distributions/gradle-6.9.3-bin.zip)
+ ///
+ public string CustomGradleVersionUrl
+ {
+ get { return Instance.customGradleVersionUrl; }
+ set { Instance.customGradleVersionUrl = value; }
+ }
+
+ ///
+ /// A string to set the custom gradle tools version (ex: com.android.tools.build:gradle:4.2.0)
+ ///
+ public string CustomGradleToolsVersion
+ {
+ get { return Instance.customGradleToolsVersion; }
+ set { Instance.customGradleToolsVersion = value; }
+ }
+
+ ///
+ /// AdMob Android App ID.
+ ///
+ public string AdMobAndroidAppId
+ {
+ get { return Instance.adMobAndroidAppId; }
+ set { Instance.adMobAndroidAppId = value; }
+ }
+
+ ///
+ /// AdMob iOS App ID.
+ ///
+ public string AdMobIosAppId
+ {
+ get { return Instance.adMobIosAppId; }
+ set { Instance.adMobIosAppId = value; }
+ }
+
+ ///
+ /// Saves the instance of the settings.
+ ///
+ public void SaveAsync()
+ {
+ EditorUtility.SetDirty(instance);
+ }
+}
diff --git a/Assets/MaxSdk/Scripts/IntegrationManager/Editor/AppLovinSettings.cs.meta b/Assets/MaxSdk/Scripts/IntegrationManager/Editor/AppLovinSettings.cs.meta
new file mode 100644
index 0000000..7e40d73
--- /dev/null
+++ b/Assets/MaxSdk/Scripts/IntegrationManager/Editor/AppLovinSettings.cs.meta
@@ -0,0 +1,14 @@
+fileFormatVersion: 2
+guid: ebc0ba1b5ef6b4a6b9dd53d7eadfea16
+labels:
+- al_max
+- al_max_export_path-MaxSdk/Scripts/IntegrationManager/Editor/AppLovinSettings.cs
+MonoImporter:
+ externalObjects: {}
+ serializedVersion: 2
+ defaultReferences: []
+ executionOrder: 0
+ icon: {instanceID: 0}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/MaxSdk/Scripts/IntegrationManager/Editor/AppLovinUpmManifest.cs b/Assets/MaxSdk/Scripts/IntegrationManager/Editor/AppLovinUpmManifest.cs
new file mode 100644
index 0000000..8a55ae9
--- /dev/null
+++ b/Assets/MaxSdk/Scripts/IntegrationManager/Editor/AppLovinUpmManifest.cs
@@ -0,0 +1,190 @@
+using System;
+using System.Collections.Generic;
+using System.IO;
+using System.Linq;
+using AppLovinMax.ThirdParty.MiniJson;
+
+namespace AppLovinMax.Scripts.IntegrationManager.Editor
+{
+ public class AppLovinUpmManifest
+ {
+ private const string KeyUrl = "url";
+ private const string KeyName = "name";
+ private const string KeyScopes = "scopes";
+ private const string KeyScopedRegistry = "scopedRegistries";
+
+ private Dictionary manifest;
+
+ private static string ManifestPath
+ {
+ get { return Path.Combine(Directory.GetCurrentDirectory(), "Packages/manifest.json"); }
+ }
+
+ // Private constructor to enforce the use of the Load() method
+ private AppLovinUpmManifest() { }
+
+ ///
+ /// Creates a new instance of AppLovinUpmManifest and loads the manifest.json file.
+ ///
+ /// An instance of AppLovinUpmManifest
+ public static AppLovinUpmManifest Load()
+ {
+ return new AppLovinUpmManifest { manifest = GetManifest() };
+ }
+
+ ///
+ /// Adds or updates a scoped registry in the manifest.
+ ///
+ /// The name of the registry
+ /// The url of the registry
+ /// The scopes of the registry
+ public void AddOrUpdateRegistry(string name, string url, List scopes)
+ {
+ var registry = GetRegistry(name);
+ if (registry == null)
+ {
+ var registries = GetRegistries();
+ if (registries == null) return;
+
+ registries.Add(new Dictionary
+ {
+ {KeyName, name},
+ {KeyUrl, url},
+ {KeyScopes, scopes}
+ });
+
+ return;
+ }
+
+ UpdateRegistry(registry, scopes);
+ }
+
+ ///
+ /// Saves the manifest by serializing it back to JSON and writing to file.
+ ///
+ public void Save()
+ {
+ var content = Json.Serialize(manifest, true);
+ File.WriteAllText(ManifestPath, content);
+ }
+
+ ///
+ /// Adds a dependency to the manifest.
+ ///
+ /// The name of the package to add
+ /// The version of the package to add
+ public void AddPackageDependency(string packageName, string version)
+ {
+ var manifestDependencies = GetDependencies();
+ manifestDependencies[packageName] = version;
+ }
+
+ ///
+ /// Removes a dependency from the manifest.
+ ///
+ /// The name of the package to remove
+ public void RemovePackageDependency(string packageName)
+ {
+ var manifestDependencies = GetDependencies();
+ manifestDependencies.Remove(packageName);
+ }
+
+ #region Utility
+
+ ///
+ /// Returns the manifest.json file as a dictionary.
+ ///
+ private static Dictionary GetManifest()
+ {
+ if (!File.Exists(ManifestPath))
+ {
+ throw new Exception("Manifest not Found!");
+ }
+
+ var manifestJson = File.ReadAllText(ManifestPath);
+ if (string.IsNullOrEmpty(manifestJson))
+ {
+ throw new Exception("Manifest is empty!");
+ }
+
+ var deserializedManifest = Json.Deserialize(manifestJson) as Dictionary;
+ if (deserializedManifest == null)
+ {
+ throw new Exception("Failed to deserialize manifest");
+ }
+
+ return deserializedManifest;
+ }
+
+ ///
+ /// Gets the manifest's dependencies section.
+ ///
+ /// The dependencies section of the manifest.
+ private Dictionary GetDependencies()
+ {
+ var dependencies = manifest["dependencies"] as Dictionary;
+ if (dependencies == null)
+ {
+ throw new Exception("No dependencies found in manifest.");
+ }
+
+ return dependencies;
+ }
+
+ ///
+ /// Gets the manifest's registries section. Creates a new registries section if one does not exist.
+ ///
+ /// The registries section of the manifest.
+ private List GetRegistries()
+ {
+ EnsureScopedRegistryExists();
+ return manifest[KeyScopedRegistry] as List;
+ }
+
+ ///
+ /// Gets a scoped registry with the given name.
+ ///
+ /// The name of the registry
+ /// Returns the registry, or null if it can't be found
+ private Dictionary GetRegistry(string name)
+ {
+ var registries = GetRegistries();
+ if (registries == null) return null;
+
+ return registries
+ .OfType>()
+ .FirstOrDefault(registry => MaxSdkUtils.GetStringFromDictionary(registry, KeyName).Equals(name));
+ }
+
+ ///
+ /// Creates the section for scoped registries in the manifest.json file if it doesn't exist.
+ ///
+ private void EnsureScopedRegistryExists()
+ {
+ if (manifest.ContainsKey(KeyScopedRegistry)) return;
+
+ manifest.Add(KeyScopedRegistry, new List());
+ }
+
+ ///
+ /// Updates a registry to make sure it contains the new scopes.
+ ///
+ /// The registry to update
+ /// The scopes we want added to the registry
+ private static void UpdateRegistry(Dictionary registry, List newScopes)
+ {
+ var scopes = MaxSdkUtils.GetListFromDictionary(registry, KeyScopes);
+ if (scopes == null)
+ {
+ registry[KeyScopes] = new List(newScopes);
+ return;
+ }
+
+ // Only add scopes that are not already in the list
+ var uniqueNewScopes = newScopes.Where(scope => !scopes.Contains(scope)).ToList();
+ scopes.AddRange(uniqueNewScopes);
+ }
+
+ #endregion
+ }
+}
diff --git a/Assets/MaxSdk/Scripts/IntegrationManager/Editor/AppLovinUpmManifest.cs.meta b/Assets/MaxSdk/Scripts/IntegrationManager/Editor/AppLovinUpmManifest.cs.meta
new file mode 100644
index 0000000..3970bba
--- /dev/null
+++ b/Assets/MaxSdk/Scripts/IntegrationManager/Editor/AppLovinUpmManifest.cs.meta
@@ -0,0 +1,15 @@
+fileFormatVersion: 2
+guid: 40e2ad4a252104688b8627f82e806b2e
+labels:
+- al_max
+- al_max_export_path-MaxSdk/Scripts/AppLovinUpmManifest.cs
+- al_max_export_path-MaxSdk/Scripts/IntegrationManager/Editor/AppLovinUpmManifest.cs
+MonoImporter:
+ externalObjects: {}
+ serializedVersion: 2
+ defaultReferences: []
+ executionOrder: 0
+ icon: {instanceID: 0}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/MaxSdk/Scripts/IntegrationManager/Editor/MaxSdk.IntegrationManager.Editor.asmdef b/Assets/MaxSdk/Scripts/IntegrationManager/Editor/MaxSdk.IntegrationManager.Editor.asmdef
new file mode 100644
index 0000000..1cc80b7
--- /dev/null
+++ b/Assets/MaxSdk/Scripts/IntegrationManager/Editor/MaxSdk.IntegrationManager.Editor.asmdef
@@ -0,0 +1,10 @@
+{
+ "name": "MaxSdk.Scripts.IntegrationManager.Editor",
+ "references": [
+ "MaxSdk.Scripts"
+ ],
+ "includePlatforms": [
+ "Editor"
+ ],
+ "excludePlatforms": []
+}
diff --git a/Assets/MaxSdk/Scripts/IntegrationManager/Editor/MaxSdk.IntegrationManager.Editor.asmdef.meta b/Assets/MaxSdk/Scripts/IntegrationManager/Editor/MaxSdk.IntegrationManager.Editor.asmdef.meta
new file mode 100644
index 0000000..272b872
--- /dev/null
+++ b/Assets/MaxSdk/Scripts/IntegrationManager/Editor/MaxSdk.IntegrationManager.Editor.asmdef.meta
@@ -0,0 +1,6 @@
+fileFormatVersion: 2
+guid: a10a05a8449c42519fd80f2b8b580de3
+labels:
+- al_max
+- al_max_export_path-MaxSdk/Scripts/IntegrationManager/Editor/MaxSdk.IntegrationManager.Editor.asmdef
+timeCreated: 1591749873
diff --git a/Assets/MaxSdk/Scripts/MaxCmpService.cs b/Assets/MaxSdk/Scripts/MaxCmpService.cs
new file mode 100644
index 0000000..e492a73
--- /dev/null
+++ b/Assets/MaxSdk/Scripts/MaxCmpService.cs
@@ -0,0 +1,170 @@
+//
+// MaxCmpService.cs
+// AppLovin User Engagement Unity Plugin
+//
+// Created by Santosh Bagadi on 10/1/23.
+// Copyright © 2023 AppLovin. All rights reserved.
+//
+
+using System;
+using System.Collections.Generic;
+
+#if UNITY_EDITOR
+#elif UNITY_ANDROID
+using UnityEngine;
+#elif UNITY_IOS
+using System.Runtime.InteropServices;
+#endif
+
+///
+/// This class provides direct APIs for interfacing with the Google-certified CMP installed, if any.
+///
+public class MaxCmpService
+{
+ private static readonly MaxCmpService _instance = new MaxCmpService();
+
+ private MaxCmpService() { }
+
+ private static Action _onCompletedAction;
+
+#if UNITY_EDITOR
+#elif UNITY_ANDROID
+ private static readonly AndroidJavaClass MaxUnityPluginClass = new AndroidJavaClass("com.applovin.mediation.unity.MaxUnityPlugin");
+#elif UNITY_IOS
+ [DllImport("__Internal")]
+ private static extern void _MaxShowCmpForExistingUser();
+
+ [DllImport("__Internal")]
+ private static extern bool _MaxHasSupportedCmp();
+#endif
+
+ internal static MaxCmpService Instance
+ {
+ get { return _instance; }
+ }
+
+ ///
+ /// Shows the CMP flow to an existing user.
+ /// Note that the user's current consent will be reset before the CMP alert is shown.
+ ///
+ /// Called when the CMP flow finishes showing.
+ public void ShowCmpForExistingUser(Action onCompletedAction)
+ {
+ _onCompletedAction = onCompletedAction;
+
+#if UNITY_EDITOR
+ var errorProps = new Dictionary
+ {
+ {"code", (int) MaxCmpError.ErrorCode.FormUnavailable},
+ {"message", "CMP is not supported in Unity editor"}
+ };
+
+ NotifyCompletedIfNeeded(errorProps);
+#elif UNITY_ANDROID
+ MaxUnityPluginClass.CallStatic("showCmpForExistingUser");
+#elif UNITY_IOS
+ _MaxShowCmpForExistingUser();
+#endif
+ }
+
+ ///
+ /// Returns true if a supported CMP SDK is detected.
+ ///
+ public bool HasSupportedCmp
+ {
+ get
+ {
+#if UNITY_EDITOR
+ return false;
+#elif UNITY_ANDROID
+ return MaxUnityPluginClass.CallStatic("hasSupportedCmp");
+#elif UNITY_IOS
+ return _MaxHasSupportedCmp();
+#else
+ return false;
+#endif
+ }
+ }
+
+ internal static void NotifyCompletedIfNeeded(Dictionary errorProps)
+ {
+ if (_onCompletedAction == null) return;
+
+ var error = (errorProps == null) ? null : MaxCmpError.Create(errorProps);
+ _onCompletedAction(error);
+ }
+}
+
+public class MaxCmpError
+{
+ public enum ErrorCode
+ {
+ ///
+ /// Indicates that an unspecified error has occurred.
+ ///
+ Unspecified = -1,
+
+ ///
+ /// Indicates that the CMP has not been integrated correctly.
+ ///
+ IntegrationError = 1,
+
+ ///
+ /// Indicates that the CMP form is unavailable.
+ ///
+ FormUnavailable = 2,
+
+ ///
+ /// Indicates that the CMP form is not required.
+ ///
+ FormNotRequired = 3
+ }
+
+ public static MaxCmpError Create(IDictionary error)
+ {
+ return new MaxCmpError()
+ {
+ Code = GetCode(MaxSdkUtils.GetIntFromDictionary(error, "code")),
+ Message = MaxSdkUtils.GetStringFromDictionary(error, "message"),
+ CmpCode = MaxSdkUtils.GetIntFromDictionary(error, "cmpCode", -1),
+ CmpMessage = MaxSdkUtils.GetStringFromDictionary(error, "cmpMessage")
+ };
+ }
+
+ private static ErrorCode GetCode(int code)
+ {
+ switch (code)
+ {
+ case 1:
+ return ErrorCode.IntegrationError;
+ case 2:
+ return ErrorCode.FormUnavailable;
+ case 3:
+ return ErrorCode.FormNotRequired;
+ default:
+ return ErrorCode.Unspecified;
+ }
+ }
+
+ private MaxCmpError() { }
+
+ ///
+ /// The error code for this error.
+ ///
+ public ErrorCode Code { get; private set; }
+
+ ///
+ /// The error message for this error.
+ ///
+ public string Message { get; private set; }
+
+ ///
+ /// The error code returned by the CMP.
+ ///
+ public int CmpCode { get; private set; }
+
+ ///
+ /// The error message returned by the CMP.
+ ///
+ public string CmpMessage { get; private set; }
+}
diff --git a/Assets/MaxSdk/Scripts/MaxCmpService.cs.meta b/Assets/MaxSdk/Scripts/MaxCmpService.cs.meta
new file mode 100644
index 0000000..598fc90
--- /dev/null
+++ b/Assets/MaxSdk/Scripts/MaxCmpService.cs.meta
@@ -0,0 +1,14 @@
+fileFormatVersion: 2
+guid: f2e895983b04846af81b59189de0310c
+labels:
+- al_max
+- al_max_export_path-MaxSdk/Scripts/MaxCmpService.cs
+MonoImporter:
+ externalObjects: {}
+ serializedVersion: 2
+ defaultReferences: []
+ executionOrder: 0
+ icon: {instanceID: 0}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/MaxSdk/Scripts/MaxEventExecutor.cs b/Assets/MaxSdk/Scripts/MaxEventExecutor.cs
new file mode 100644
index 0000000..4d22dc2
--- /dev/null
+++ b/Assets/MaxSdk/Scripts/MaxEventExecutor.cs
@@ -0,0 +1,108 @@
+//
+// MaxEventExecutor.cs
+// Max Unity Plugin
+//
+// Created by Jonathan Liu on 1/22/2024.
+// Copyright © 2024 AppLovin. All rights reserved.
+//
+
+using System;
+using System.Collections.Generic;
+using UnityEngine;
+using UnityEngine.Events;
+
+namespace AppLovinMax.Internal
+{
+ public class MaxEventExecutor : MonoBehaviour
+ {
+ private static MaxEventExecutor _instance;
+ private static readonly List AdEventsQueue = new List();
+
+ private static volatile bool _adEventsQueueEmpty = true;
+
+ struct MaxAction
+ {
+ public readonly Action ActionToExecute;
+ public readonly string EventName;
+
+ public MaxAction(Action actionToExecute, string nameOfEvent)
+ {
+ ActionToExecute = actionToExecute;
+ EventName = nameOfEvent;
+ }
+ }
+
+ public static void InitializeIfNeeded()
+ {
+ if (_instance != null) return;
+
+ var executor = new GameObject("MaxEventExecutor");
+ executor.hideFlags = HideFlags.HideAndDontSave;
+ DontDestroyOnLoad(executor);
+ _instance = executor.AddComponent();
+ }
+
+ #region Public API
+
+#if UNITY_EDITOR || !(UNITY_ANDROID || UNITY_IPHONE || UNITY_IOS)
+ public static MaxEventExecutor Instance
+ {
+ get
+ {
+ InitializeIfNeeded();
+ return _instance;
+ }
+ }
+#endif
+
+ public static void ExecuteOnMainThread(Action action, string eventName)
+ {
+ lock (AdEventsQueue)
+ {
+ AdEventsQueue.Add(new MaxAction(action, eventName));
+ _adEventsQueueEmpty = false;
+ }
+ }
+
+ public static void InvokeOnMainThread(UnityEvent unityEvent, string eventName)
+ {
+ ExecuteOnMainThread(() => unityEvent.Invoke(), eventName);
+ }
+
+ #endregion
+
+ public void Update()
+ {
+ if (_adEventsQueueEmpty) return;
+
+ var actionsToExecute = new List();
+ lock (AdEventsQueue)
+ {
+ actionsToExecute.AddRange(AdEventsQueue);
+ AdEventsQueue.Clear();
+ _adEventsQueueEmpty = true;
+ }
+
+ foreach (var maxAction in actionsToExecute)
+ {
+ if (maxAction.ActionToExecute.Target != null)
+ {
+ try
+ {
+ maxAction.ActionToExecute.Invoke();
+ }
+ catch (Exception exception)
+ {
+ MaxSdkLogger.UserError("Caught exception in publisher event: " + maxAction.EventName + ", exception: " + exception);
+ MaxSdkLogger.LogException(exception);
+ }
+ }
+ }
+ }
+
+ public void Disable()
+ {
+ _instance = null;
+ }
+ }
+}
diff --git a/Assets/MaxSdk/Scripts/MaxEventExecutor.cs.meta b/Assets/MaxSdk/Scripts/MaxEventExecutor.cs.meta
new file mode 100644
index 0000000..18ba126
--- /dev/null
+++ b/Assets/MaxSdk/Scripts/MaxEventExecutor.cs.meta
@@ -0,0 +1,14 @@
+fileFormatVersion: 2
+guid: 4715dd62632564dc4810a4dc98243f4a
+labels:
+- al_max
+- al_max_export_path-MaxSdk/Scripts/MaxEventExecutor.cs
+MonoImporter:
+ externalObjects: {}
+ serializedVersion: 2
+ defaultReferences: []
+ executionOrder: 0
+ icon: {instanceID: 0}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/MaxSdk/Scripts/MaxEventSystemChecker.cs b/Assets/MaxSdk/Scripts/MaxEventSystemChecker.cs
new file mode 100644
index 0000000..c15563b
--- /dev/null
+++ b/Assets/MaxSdk/Scripts/MaxEventSystemChecker.cs
@@ -0,0 +1,37 @@
+//
+// EventSystemChecker.cs
+// AppLovin MAX Unity Plugin
+//
+// Created by Jonathan Liu on 10/23/2022.
+// Copyright © 2022 AppLovin. All rights reserved.
+//
+
+#if UNITY_EDITOR
+using UnityEngine;
+using UnityEngine.EventSystems;
+
+namespace AppLovinMax.Scripts
+{
+ ///
+ /// A script to check and enable event system as needed for the AppLovin MAX ad prefabs.
+ ///
+ [RequireComponent(typeof(EventSystem))]
+ public class MaxEventSystemChecker : MonoBehaviour
+ {
+ private void Awake()
+ {
+ // Enable the EventSystem if there is no other EventSystem in the scene
+ var eventSystem = GetComponent();
+ var currentSystem = EventSystem.current;
+ if (currentSystem == null || currentSystem == eventSystem)
+ {
+ eventSystem.enabled = true;
+ }
+ else
+ {
+ eventSystem.enabled = false;
+ }
+ }
+ }
+}
+#endif
diff --git a/Assets/MaxSdk/Scripts/MaxEventSystemChecker.cs.meta b/Assets/MaxSdk/Scripts/MaxEventSystemChecker.cs.meta
new file mode 100644
index 0000000..12874b6
--- /dev/null
+++ b/Assets/MaxSdk/Scripts/MaxEventSystemChecker.cs.meta
@@ -0,0 +1,14 @@
+fileFormatVersion: 2
+guid: e0acf281ba86b4929a6942ecd998395b
+labels:
+- al_max
+- al_max_export_path-MaxSdk/Scripts/MaxEventSystemChecker.cs
+MonoImporter:
+ externalObjects: {}
+ serializedVersion: 2
+ defaultReferences: []
+ executionOrder: 0
+ icon: {instanceID: 0}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/MaxSdk/Scripts/MaxEvents.cs b/Assets/MaxSdk/Scripts/MaxEvents.cs
new file mode 100644
index 0000000..b0a9ad6
--- /dev/null
+++ b/Assets/MaxSdk/Scripts/MaxEvents.cs
@@ -0,0 +1,21 @@
+/**
+ * Class containing pre-defined constants to use with AppLovin event tracking APIs.
+ */
+public static class MaxEvents
+{
+ /**
+ * Nested class representing pre-defined AppLovin events to be fired with AppLovin event tracking APIs.
+ */
+ public class AppLovin
+ {
+ public const string UserLoggedIn = "login";
+ public const string UserCreatedAccount = "registration";
+ public const string UserCompletedTutorial = "tutorial";
+ public const string UserCompletedLevel = "level";
+ public const string UserCompletedAchievement = "achievement";
+ public const string UserSpentVirtualCurrency = "vcpurchase";
+ public const string UserCompletedInAppPurchase = "iap";
+ public const string UserSentInvitation = "invite";
+ public const string UserSharedLink = "share";
+ }
+}
\ No newline at end of file
diff --git a/Assets/MaxSdk/Scripts/MaxEvents.cs.meta b/Assets/MaxSdk/Scripts/MaxEvents.cs.meta
new file mode 100644
index 0000000..bfb6ad5
--- /dev/null
+++ b/Assets/MaxSdk/Scripts/MaxEvents.cs.meta
@@ -0,0 +1,14 @@
+fileFormatVersion: 2
+guid: 67ec2f620c6b0405ba16ea2c032dc9a2
+labels:
+- al_max
+- al_max_export_path-MaxSdk/Scripts/MaxEvents.cs
+MonoImporter:
+ externalObjects: {}
+ serializedVersion: 2
+ defaultReferences: []
+ executionOrder: 0
+ icon: {instanceID: 0}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/MaxSdk/Scripts/MaxSdk.Scripts.asmdef b/Assets/MaxSdk/Scripts/MaxSdk.Scripts.asmdef
new file mode 100644
index 0000000..99e1d22
--- /dev/null
+++ b/Assets/MaxSdk/Scripts/MaxSdk.Scripts.asmdef
@@ -0,0 +1,6 @@
+ {
+ "name": "MaxSdk.Scripts",
+ "references": [],
+ "includePlatforms": [],
+ "excludePlatforms": []
+}
diff --git a/Assets/MaxSdk/Scripts/MaxSdk.Scripts.asmdef.meta b/Assets/MaxSdk/Scripts/MaxSdk.Scripts.asmdef.meta
new file mode 100644
index 0000000..b55da72
--- /dev/null
+++ b/Assets/MaxSdk/Scripts/MaxSdk.Scripts.asmdef.meta
@@ -0,0 +1,10 @@
+fileFormatVersion: 2
+guid: a4cfc1a18fa3a469b96d885db522f42e
+labels:
+- al_max
+- al_max_export_path-MaxSdk/Scripts/MaxSdk.Scripts.asmdef
+AssemblyDefinitionImporter:
+ externalObjects: {}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/MaxSdk/Scripts/MaxSdk.cs b/Assets/MaxSdk/Scripts/MaxSdk.cs
new file mode 100644
index 0000000..c8cb9f2
--- /dev/null
+++ b/Assets/MaxSdk/Scripts/MaxSdk.cs
@@ -0,0 +1,26 @@
+//
+// AppLovin MAX Unity Plugin C# Wrapper
+//
+
+public class MaxSdk :
+#if UNITY_EDITOR
+ // Check for Unity Editor first since the editor also responds to the currently selected platform.
+ MaxSdkUnityEditor
+#elif UNITY_ANDROID
+ MaxSdkAndroid
+#elif UNITY_IPHONE || UNITY_IOS
+ MaxSdkiOS
+#else
+ MaxSdkUnityEditor
+#endif
+{
+ private const string _version = "8.6.0";
+
+ ///
+ /// Returns the current plugin version.
+ ///
+ public static string Version
+ {
+ get { return _version; }
+ }
+}
diff --git a/Assets/MaxSdk/Scripts/MaxSdk.cs.meta b/Assets/MaxSdk/Scripts/MaxSdk.cs.meta
new file mode 100644
index 0000000..c1c32f4
--- /dev/null
+++ b/Assets/MaxSdk/Scripts/MaxSdk.cs.meta
@@ -0,0 +1,14 @@
+fileFormatVersion: 2
+guid: 2fc7aa576843c44e68c7ab14b475bb82
+labels:
+- al_max
+- al_max_export_path-MaxSdk/Scripts/MaxSdk.cs
+MonoImporter:
+ externalObjects: {}
+ serializedVersion: 2
+ defaultReferences: []
+ executionOrder: 0
+ icon: {instanceID: 0}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/MaxSdk/Scripts/MaxSdkAndroid.cs b/Assets/MaxSdk/Scripts/MaxSdkAndroid.cs
new file mode 100644
index 0000000..1b45c0b
--- /dev/null
+++ b/Assets/MaxSdk/Scripts/MaxSdkAndroid.cs
@@ -0,0 +1,986 @@
+using System;
+using System.Collections.Generic;
+using UnityEngine;
+using AppLovinMax.ThirdParty.MiniJson;
+
+#if UNITY_ANDROID
+///
+/// Android AppLovin MAX Unity Plugin implementation
+///
+public class MaxSdkAndroid : MaxSdkBase
+{
+ private static readonly AndroidJavaClass MaxUnityPluginClass =
+ new AndroidJavaClass("com.applovin.mediation.unity.MaxUnityPlugin");
+
+ private static readonly BackgroundCallbackProxy BackgroundCallback = new BackgroundCallbackProxy();
+
+ static MaxSdkAndroid()
+ {
+ InitializeEventExecutor();
+
+ MaxUnityPluginClass.CallStatic("setBackgroundCallback", BackgroundCallback);
+ }
+
+ #region Initialization
+
+ ///
+ /// Initialize the default instance of AppLovin SDK.
+ ///
+ /// Please make sure that application's Android manifest or Info.plist includes the AppLovin SDK key.
+ ///
+ /// OPTIONAL: Set the MAX ad unit ids to be used for this instance of the SDK. 3rd-party SDKs will be initialized with the credentials configured for these ad unit ids.
+ /// This should only be used if you have different sets of ad unit ids / credentials for the same package name.
+ ///
+ public static void InitializeSdk(string[] adUnitIds = null)
+ {
+ var serializedAdUnitIds = (adUnitIds != null) ? string.Join(",", adUnitIds) : "";
+ MaxUnityPluginClass.CallStatic("initializeSdk", serializedAdUnitIds, GenerateMetaData());
+ }
+
+ ///
+ /// Check if the SDK has been initialized
+ ///
+ /// True if SDK has been initialized
+ public static bool IsInitialized()
+ {
+ return MaxUnityPluginClass.CallStatic("isInitialized");
+ }
+
+ #endregion
+
+ #region User Info
+
+ ///
+ /// Set an identifier for the current user. This identifier will be tied to SDK events and our optional S2S postbacks.
+ ///
+ /// If you're using reward validation, you can optionally set an identifier to be included with currency validation postbacks.
+ /// For example, a username or email. We'll include this in the postback when we ping your currency endpoint from our server.
+ ///
+ ///
+ /// The user identifier to be set. Must not be null.
+ public static void SetUserId(string userId)
+ {
+ MaxUnityPluginClass.CallStatic("setUserId", userId);
+ }
+
+ ///
+ /// Set the .
+ ///
+ /// The segment collection to be set. Must not be {@code null}
+ public static void SetSegmentCollection(MaxSegmentCollection segmentCollection)
+ {
+ MaxUnityPluginClass.CallStatic("setSegmentCollection", JsonUtility.ToJson(segmentCollection));
+ }
+
+ #endregion
+
+ #region MAX
+
+ ///
+ /// Returns the list of available mediation networks.
+ ///
+ /// Please call this method after the SDK has initialized.
+ ///
+ public static List GetAvailableMediatedNetworks()
+ {
+ var serializedNetworks = MaxUnityPluginClass.CallStatic("getAvailableMediatedNetworks");
+ return MaxSdkUtils.PropsStringsToList(serializedNetworks);
+ }
+
+ ///
+ /// Present the mediation debugger UI.
+ /// This debugger tool provides the status of your integration for each third-party ad network.
+ ///
+ /// Please call this method after the SDK has initialized.
+ ///
+ public static void ShowMediationDebugger()
+ {
+ MaxUnityPluginClass.CallStatic("showMediationDebugger");
+ }
+
+ ///
+ /// Present the creative debugger UI.
+ /// This debugger tool provides information for recently displayed ads.
+ ///
+ /// Please call this method after the SDK has initialized.
+ ///
+ public static void ShowCreativeDebugger()
+ {
+ MaxUnityPluginClass.CallStatic("showCreativeDebugger");
+ }
+
+ ///
+ /// Returns the arbitrary ad value for a given ad unit identifier with key. Returns null if no ad is loaded.
+ ///
+ /// Ad unit identifier for which to get the ad value for. Must not be null.
+ /// Ad value key. Must not be null.
+ /// Arbitrary ad value for a given key, or null if no ad is loaded.
+ public static string GetAdValue(string adUnitIdentifier, string key)
+ {
+ var value = MaxUnityPluginClass.CallStatic("getAdValue", adUnitIdentifier, key);
+
+ if (string.IsNullOrEmpty(value)) return null;
+
+ return value;
+ }
+
+ #endregion
+
+ #region Privacy
+
+ ///
+ /// Get the SDK configuration for this user.
+ ///
+ /// Note: This method should be called only after SDK has been initialized.
+ ///
+ public static SdkConfiguration GetSdkConfiguration()
+ {
+ var sdkConfigurationStr = MaxUnityPluginClass.CallStatic("getSdkConfiguration");
+ var sdkConfigurationDict = Json.Deserialize(sdkConfigurationStr) as Dictionary;
+ return SdkConfiguration.Create(sdkConfigurationDict);
+ }
+
+ ///
+ /// Set whether or not user has provided consent for information sharing with AppLovin and other providers.
+ ///
+ /// true if the user has provided consent for information sharing with AppLovin. false by default.
+ public static void SetHasUserConsent(bool hasUserConsent)
+ {
+ MaxUnityPluginClass.CallStatic("setHasUserConsent", hasUserConsent);
+ }
+
+ ///
+ /// Check if user has provided consent for information sharing with AppLovin and other providers.
+ ///
+ /// true if user has provided consent for information sharing. false if the user declined to share information or the consent value has not been set. See IsUserConsentSet .
+ public static bool HasUserConsent()
+ {
+ return MaxUnityPluginClass.CallStatic("hasUserConsent");
+ }
+
+ ///
+ /// Check if user has set consent for information sharing.
+ ///
+ /// true if user has set a value of consent for information sharing.
+ public static bool IsUserConsentSet()
+ {
+ return MaxUnityPluginClass.CallStatic("isUserConsentSet");
+ }
+
+ ///
+ /// Set whether or not user has opted out of the sale of their personal information.
+ ///
+ /// true if the user has opted out of the sale of their personal information.
+ public static void SetDoNotSell(bool doNotSell)
+ {
+ MaxUnityPluginClass.CallStatic("setDoNotSell", doNotSell);
+ }
+
+ ///
+ /// Check if the user has opted out of the sale of their personal information.
+ ///
+ /// true if the user has opted out of the sale of their personal information. false if the user opted in to the sell of their personal information or the value has not been set. See IsDoNotSellSet .
+ public static bool IsDoNotSell()
+ {
+ return MaxUnityPluginClass.CallStatic("isDoNotSell");
+ }
+
+ ///
+ /// Check if the user has set the option to sell their personal information.
+ ///
+ /// true if user has chosen an option to sell their personal information.
+ public static bool IsDoNotSellSet()
+ {
+ return MaxUnityPluginClass.CallStatic("isDoNotSellSet");
+ }
+
+ #endregion
+
+ #region Banners
+
+ ///
+ /// Create a new banner.
+ ///
+ /// Ad unit identifier of the banner to create. Must not be null.
+ /// The configuration for the banner
+ public static void CreateBanner(string adUnitIdentifier, AdViewConfiguration configuration)
+ {
+ ValidateAdUnitIdentifier(adUnitIdentifier, "create banner");
+ if (configuration.UseCoordinates)
+ {
+ MaxUnityPluginClass.CallStatic("createBanner", adUnitIdentifier, configuration.XCoordinate, configuration.YCoordinate, configuration.IsAdaptive);
+ }
+ else
+ {
+ MaxUnityPluginClass.CallStatic("createBanner", adUnitIdentifier, configuration.Position.ToSnakeCaseString(), configuration.IsAdaptive);
+ }
+ }
+
+ ///
+ /// Load a new banner ad.
+ /// NOTE: The method loads the first banner ad and initiates an automated banner refresh process.
+ /// You only need to call this method if you pause banner refresh.
+ ///
+ /// Ad unit identifier of the banner to load. Must not be null.
+ public static void LoadBanner(string adUnitIdentifier)
+ {
+ ValidateAdUnitIdentifier(adUnitIdentifier, "load banner");
+ MaxUnityPluginClass.CallStatic("loadBanner", adUnitIdentifier);
+ }
+
+ ///
+ /// Set the banner placement for an ad unit identifier to tie the future ad events to.
+ ///
+ /// Ad unit identifier of the banner to set the placement for. Must not be null.
+ /// Placement to set
+ public static void SetBannerPlacement(string adUnitIdentifier, string placement)
+ {
+ ValidateAdUnitIdentifier(adUnitIdentifier, "set banner placement");
+ MaxUnityPluginClass.CallStatic("setBannerPlacement", adUnitIdentifier, placement);
+ }
+
+ ///
+ /// Starts or resumes auto-refreshing of the banner for the given ad unit identifier.
+ ///
+ /// Ad unit identifier of the banner for which to start auto-refresh. Must not be null.
+ public static void StartBannerAutoRefresh(string adUnitIdentifier)
+ {
+ ValidateAdUnitIdentifier(adUnitIdentifier, "start banner auto-refresh");
+ MaxUnityPluginClass.CallStatic("startBannerAutoRefresh", adUnitIdentifier);
+ }
+
+ ///
+ /// Pauses auto-refreshing of the banner for the given ad unit identifier.
+ ///
+ /// Ad unit identifier of the banner for which to stop auto-refresh. Must not be null.
+ public static void StopBannerAutoRefresh(string adUnitIdentifier)
+ {
+ ValidateAdUnitIdentifier(adUnitIdentifier, "stop banner auto-refresh");
+ MaxUnityPluginClass.CallStatic("stopBannerAutoRefresh", adUnitIdentifier);
+ }
+
+ ///
+ /// Updates the position of the banner to the new position provided.
+ ///
+ /// The ad unit identifier of the banner for which to update the position. Must not be null.
+ /// A new position for the banner. Must not be null.
+ public static void UpdateBannerPosition(string adUnitIdentifier, AdViewPosition bannerPosition)
+ {
+ ValidateAdUnitIdentifier(adUnitIdentifier, "update banner position");
+ MaxUnityPluginClass.CallStatic("updateBannerPosition", adUnitIdentifier, bannerPosition.ToSnakeCaseString());
+ }
+
+ ///
+ /// Updates the position of the banner to the new coordinates provided.
+ ///
+ /// The ad unit identifier of the banner for which to update the position. Must not be null.
+ /// The X coordinate (horizontal position) of the banner relative to the top left corner of the screen.
+ /// The Y coordinate (vertical position) of the banner relative to the top left corner of the screen.
+ ///
+ /// The banner is placed within the safe area of the screen. You can use this to get the absolute position of the banner on screen.
+ ///
+ public static void UpdateBannerPosition(string adUnitIdentifier, float x, float y)
+ {
+ ValidateAdUnitIdentifier(adUnitIdentifier, "update banner position");
+ MaxUnityPluginClass.CallStatic("updateBannerPosition", adUnitIdentifier, x, y);
+ }
+
+ ///
+ /// Overrides the width of the banner in dp.
+ ///
+ /// The ad unit identifier of the banner for which to override the width for. Must not be null.
+ /// The desired width of the banner in dp
+ public static void SetBannerWidth(string adUnitIdentifier, float width)
+ {
+ ValidateAdUnitIdentifier(adUnitIdentifier, "set banner width");
+ MaxUnityPluginClass.CallStatic("setBannerWidth", adUnitIdentifier, width);
+ }
+
+ ///
+ /// Show banner at a position determined by the 'CreateBanner' call.
+ ///
+ /// Ad unit identifier of the banner to show. Must not be null.
+ public static void ShowBanner(string adUnitIdentifier)
+ {
+ ValidateAdUnitIdentifier(adUnitIdentifier, "show banner");
+ MaxUnityPluginClass.CallStatic("showBanner", adUnitIdentifier);
+ }
+
+ ///
+ /// Remove banner from the ad view and destroy it.
+ ///
+ /// Ad unit identifier of the banner to destroy. Must not be null.
+ public static void DestroyBanner(string adUnitIdentifier)
+ {
+ ValidateAdUnitIdentifier(adUnitIdentifier, "destroy banner");
+ MaxUnityPluginClass.CallStatic("destroyBanner", adUnitIdentifier);
+ }
+
+ ///
+ /// Hide banner.
+ ///
+ /// Ad unit identifier of the banner to hide. Must not be null.
+ public static void HideBanner(string adUnitIdentifier)
+ {
+ ValidateAdUnitIdentifier(adUnitIdentifier, "hide banner");
+ MaxUnityPluginClass.CallStatic("hideBanner", adUnitIdentifier);
+ }
+
+ ///
+ /// Set non-transparent background color for banners to be fully functional.
+ ///
+ /// Ad unit identifier of the banner to set background color for. Must not be null.
+ /// A background color to set for the ad. Must not be null.
+ public static void SetBannerBackgroundColor(string adUnitIdentifier, Color color)
+ {
+ ValidateAdUnitIdentifier(adUnitIdentifier, "set background color");
+ MaxUnityPluginClass.CallStatic("setBannerBackgroundColor", adUnitIdentifier, MaxSdkUtils.ParseColor(color));
+ }
+
+ ///
+ /// Set an extra parameter for the banner ad.
+ ///
+ /// Ad unit identifier of the banner to set the extra parameter for. Must not be null.
+ /// The key for the extra parameter. Must not be null.
+ /// The value for the extra parameter.
+ public static void SetBannerExtraParameter(string adUnitIdentifier, string key, string value)
+ {
+ ValidateAdUnitIdentifier(adUnitIdentifier, "set banner extra parameter");
+ MaxUnityPluginClass.CallStatic("setBannerExtraParameter", adUnitIdentifier, key, value);
+ }
+
+ ///
+ /// Set a local extra parameter for the banner ad.
+ ///
+ /// Ad unit identifier of the banner to set the local extra parameter for. Must not be null.
+ /// The key for the local extra parameter. Must not be null.
+ /// The value for the extra parameter. Accepts the following types: , null , IList , IDictionary , string , primitive types
+ public static void SetBannerLocalExtraParameter(string adUnitIdentifier, string key, object value)
+ {
+ ValidateAdUnitIdentifier(adUnitIdentifier, "set banner local extra parameter");
+
+ if (value == null || value is AndroidJavaObject)
+ {
+ MaxUnityPluginClass.CallStatic("setBannerLocalExtraParameter", adUnitIdentifier, key, (AndroidJavaObject) value);
+ }
+ else
+ {
+ MaxUnityPluginClass.CallStatic("setBannerLocalExtraParameterJson", adUnitIdentifier, key, SerializeLocalExtraParameterValue(value));
+ }
+ }
+
+ ///
+ /// The custom data to tie the showing banner ad to, for ILRD and rewarded postbacks via the {CUSTOM_DATA} macro. Maximum size is 8KB.
+ ///
+ /// Banner ad unit identifier of the banner to set the custom data for. Must not be null.
+ /// The custom data to be set.
+ public static void SetBannerCustomData(string adUnitIdentifier, string customData)
+ {
+ ValidateAdUnitIdentifier(adUnitIdentifier, "set banner custom data");
+ MaxUnityPluginClass.CallStatic("setBannerCustomData", adUnitIdentifier, customData);
+ }
+
+ ///
+ /// The banner position on the screen. When setting the banner position via or ,
+ /// the banner is placed within the safe area of the screen. This returns the absolute position of the banner on screen.
+ ///
+ /// Ad unit identifier of the banner for which to get the position on screen. Must not be null.
+ /// A representing the banner position on screen.
+ public static Rect GetBannerLayout(string adUnitIdentifier)
+ {
+ ValidateAdUnitIdentifier(adUnitIdentifier, "get banner layout");
+ var positionRect = MaxUnityPluginClass.CallStatic("getBannerLayout", adUnitIdentifier);
+ return GetRectFromString(positionRect);
+ }
+
+ #endregion
+
+ #region MRECs
+
+ ///
+ /// Create a new MREC.
+ ///
+ /// Ad unit identifier of the MREC to create. Must not be null.
+ /// The configuration for the MREC.
+ public static void CreateMRec(string adUnitIdentifier, AdViewConfiguration configuration)
+ {
+ ValidateAdUnitIdentifier(adUnitIdentifier, "create MREC");
+ if (configuration.UseCoordinates)
+ {
+ MaxUnityPluginClass.CallStatic("createMRec", adUnitIdentifier, configuration.XCoordinate, configuration.YCoordinate);
+ }
+ else
+ {
+ MaxUnityPluginClass.CallStatic("createMRec", adUnitIdentifier, configuration.Position.ToSnakeCaseString());
+ }
+ }
+
+ ///
+ /// Load a new MREC ad.
+ /// NOTE: The method loads the first MREC ad and initiates an automated MREC refresh process.
+ /// You only need to call this method if you pause MREC refresh.
+ ///
+ /// Ad unit identifier of the MREC to load. Must not be null.
+ public static void LoadMRec(string adUnitIdentifier)
+ {
+ ValidateAdUnitIdentifier(adUnitIdentifier, "load MREC");
+ MaxUnityPluginClass.CallStatic("loadMRec", adUnitIdentifier);
+ }
+
+ ///
+ /// Set the MREC placement for an ad unit identifier to tie the future ad events to.
+ ///
+ /// Ad unit identifier of the MREC to set the placement for. Must not be null.
+ /// Placement to set
+ public static void SetMRecPlacement(string adUnitIdentifier, string placement)
+ {
+ ValidateAdUnitIdentifier(adUnitIdentifier, "set MREC placement");
+ MaxUnityPluginClass.CallStatic("setMRecPlacement", adUnitIdentifier, placement);
+ }
+
+ ///
+ /// Starts or resumes auto-refreshing of the MREC for the given ad unit identifier.
+ ///
+ /// Ad unit identifier of the MREC for which to start auto-refresh. Must not be null.
+ public static void StartMRecAutoRefresh(string adUnitIdentifier)
+ {
+ ValidateAdUnitIdentifier(adUnitIdentifier, "start MREC auto-refresh");
+ MaxUnityPluginClass.CallStatic("startMRecAutoRefresh", adUnitIdentifier);
+ }
+
+ ///
+ /// Pauses auto-refreshing of the MREC for the given ad unit identifier.
+ ///
+ /// Ad unit identifier of the MREC for which to stop auto-refresh. Must not be null.
+ public static void StopMRecAutoRefresh(string adUnitIdentifier)
+ {
+ ValidateAdUnitIdentifier(adUnitIdentifier, "stop MREC auto-refresh");
+ MaxUnityPluginClass.CallStatic("stopMRecAutoRefresh", adUnitIdentifier);
+ }
+
+ ///
+ /// Updates the position of the MREC to the new position provided.
+ ///
+ /// The ad unit identifier of the MREC for which to update the position. Must not be null.
+ /// A new position for the MREC. Must not be null.
+ public static void UpdateMRecPosition(string adUnitIdentifier, AdViewPosition mrecPosition)
+ {
+ ValidateAdUnitIdentifier(adUnitIdentifier, "update MREC position");
+ MaxUnityPluginClass.CallStatic("updateMRecPosition", adUnitIdentifier, mrecPosition.ToSnakeCaseString());
+ }
+
+ ///
+ /// Updates the position of the MREC to the new coordinates provided.
+ ///
+ /// The ad unit identifier of the MREC for which to update the position. Must not be null.
+ /// The X coordinate (horizontal position) of the MREC relative to the top left corner of the screen.
+ /// The Y coordinate (vertical position) of the MREC relative to the top left corner of the screen.
+ ///
+ /// The MREC is placed within the safe area of the screen. You can use this to get the absolute position Rect of the MREC on screen.
+ ///
+ public static void UpdateMRecPosition(string adUnitIdentifier, float x, float y)
+ {
+ ValidateAdUnitIdentifier(adUnitIdentifier, "update MREC position");
+ MaxUnityPluginClass.CallStatic("updateMRecPosition", adUnitIdentifier, x, y);
+ }
+
+ ///
+ /// Show MREC at a position determined by the 'CreateMRec' call.
+ ///
+ /// Ad unit identifier of the MREC to show. Must not be null.
+ public static void ShowMRec(string adUnitIdentifier)
+ {
+ ValidateAdUnitIdentifier(adUnitIdentifier, "show MREC");
+ MaxUnityPluginClass.CallStatic("showMRec", adUnitIdentifier);
+ }
+
+ ///
+ /// Remove MREC from the ad view and destroy it.
+ ///
+ /// Ad unit identifier of the MREC to destroy. Must not be null.
+ public static void DestroyMRec(string adUnitIdentifier)
+ {
+ ValidateAdUnitIdentifier(adUnitIdentifier, "destroy MREC");
+ MaxUnityPluginClass.CallStatic("destroyMRec", adUnitIdentifier);
+ }
+
+ ///
+ /// Hide MREC.
+ ///
+ /// Ad unit identifier of the MREC to hide. Must not be null.
+ public static void HideMRec(string adUnitIdentifier)
+ {
+ ValidateAdUnitIdentifier(adUnitIdentifier, "hide MREC");
+ MaxUnityPluginClass.CallStatic("hideMRec", adUnitIdentifier);
+ }
+
+ ///
+ /// Set an extra parameter for the MREC ad.
+ ///
+ /// Ad unit identifier of the MREC to set the extra parameter for. Must not be null.
+ /// The key for the extra parameter. Must not be null.
+ /// The value for the extra parameter.
+ public static void SetMRecExtraParameter(string adUnitIdentifier, string key, string value)
+ {
+ ValidateAdUnitIdentifier(adUnitIdentifier, "set MREC extra parameter");
+ MaxUnityPluginClass.CallStatic("setMRecExtraParameter", adUnitIdentifier, key, value);
+ }
+
+ ///
+ /// Set a local extra parameter for the MREC ad.
+ ///
+ /// Ad unit identifier of the MREC to set the local extra parameter for. Must not be null.
+ /// The key for the local extra parameter. Must not be null.
+ /// The value for the extra parameter. Accepts the following types: , null , IList , IDictionary , string , primitive types
+ public static void SetMRecLocalExtraParameter(string adUnitIdentifier, string key, object value)
+ {
+ ValidateAdUnitIdentifier(adUnitIdentifier, "set MREC local extra parameter");
+
+ if (value == null || value is AndroidJavaObject)
+ {
+ MaxUnityPluginClass.CallStatic("setMRecLocalExtraParameter", adUnitIdentifier, key, (AndroidJavaObject) value);
+ }
+ else
+ {
+ MaxUnityPluginClass.CallStatic("setMRecLocalExtraParameterJson", adUnitIdentifier, key, SerializeLocalExtraParameterValue(value));
+ }
+ }
+
+ ///
+ /// The custom data to tie the showing MREC ad to, for ILRD and rewarded postbacks via the {CUSTOM_DATA} macro. Maximum size is 8KB.
+ ///
+ /// MREC Ad unit identifier of the banner to set the custom data for. Must not be null.
+ /// The custom data to be set.
+ public static void SetMRecCustomData(string adUnitIdentifier, string customData)
+ {
+ ValidateAdUnitIdentifier(adUnitIdentifier, "set MREC custom data");
+ MaxUnityPluginClass.CallStatic("setMRecCustomData", adUnitIdentifier, customData);
+ }
+
+ ///
+ /// The MREC position on the screen. When setting the banner position via or ,
+ /// the banner is placed within the safe area of the screen. This returns the absolute position of the MREC on screen.
+ ///
+ /// Ad unit identifier of the MREC for which to get the position on screen. Must not be null.
+ /// A representing the banner position on screen.
+ public static Rect GetMRecLayout(string adUnitIdentifier)
+ {
+ ValidateAdUnitIdentifier(adUnitIdentifier, "get MREC layout");
+ var positionRect = MaxUnityPluginClass.CallStatic("getMRecLayout", adUnitIdentifier);
+ return GetRectFromString(positionRect);
+ }
+
+ #endregion
+
+ #region Interstitials
+
+ ///
+ /// Start loading an interstitial.
+ ///
+ /// Ad unit identifier of the interstitial to load. Must not be null.
+ public static void LoadInterstitial(string adUnitIdentifier)
+ {
+ ValidateAdUnitIdentifier(adUnitIdentifier, "load interstitial");
+ MaxUnityPluginClass.CallStatic("loadInterstitial", adUnitIdentifier);
+ }
+
+ ///
+ /// Check if interstitial ad is loaded and ready to be displayed.
+ ///
+ /// Ad unit identifier of the interstitial to load. Must not be null.
+ /// True if the ad is ready to be displayed
+ public static bool IsInterstitialReady(string adUnitIdentifier)
+ {
+ ValidateAdUnitIdentifier(adUnitIdentifier, "check interstitial loaded");
+ return MaxUnityPluginClass.CallStatic("isInterstitialReady", adUnitIdentifier);
+ }
+
+ ///
+ /// Present loaded interstitial for a given placement to tie ad events to. Note: if the interstitial is not ready to be displayed nothing will happen.
+ ///
+ /// Ad unit identifier of the interstitial to load. Must not be null.
+ /// The placement to tie the showing ad's events to
+ /// The custom data to tie the showing ad's events to. Maximum size is 8KB.
+ public static void ShowInterstitial(string adUnitIdentifier, string placement = null, string customData = null)
+ {
+ ValidateAdUnitIdentifier(adUnitIdentifier, "show interstitial");
+
+ if (IsInterstitialReady(adUnitIdentifier))
+ {
+ MaxUnityPluginClass.CallStatic("showInterstitial", adUnitIdentifier, placement, customData);
+ }
+ else
+ {
+ MaxSdkLogger.UserWarning("Not showing MAX Ads interstitial: ad not ready");
+ }
+ }
+
+ ///
+ /// Set an extra parameter for the ad.
+ ///
+ /// Ad unit identifier of the interstitial to set the extra parameter for. Must not be null.
+ /// The key for the extra parameter. Must not be null.
+ /// The value for the extra parameter.
+ public static void SetInterstitialExtraParameter(string adUnitIdentifier, string key, string value)
+ {
+ ValidateAdUnitIdentifier(adUnitIdentifier, "set interstitial extra parameter");
+ MaxUnityPluginClass.CallStatic("setInterstitialExtraParameter", adUnitIdentifier, key, value);
+ }
+
+ ///
+ /// Set a local extra parameter for the ad.
+ ///
+ /// Ad unit identifier of the interstitial to set the local extra parameter for. Must not be null.
+ /// The key for the local extra parameter. Must not be null.
+ /// The value for the extra parameter. Accepts the following types: , null , IList , IDictionary , string , primitive types
+ public static void SetInterstitialLocalExtraParameter(string adUnitIdentifier, string key, object value)
+ {
+ ValidateAdUnitIdentifier(adUnitIdentifier, "set interstitial local extra parameter");
+
+ if (value == null || value is AndroidJavaObject)
+ {
+ MaxUnityPluginClass.CallStatic("setInterstitialLocalExtraParameter", adUnitIdentifier, key, (AndroidJavaObject) value);
+ }
+ else
+ {
+ MaxUnityPluginClass.CallStatic("setInterstitialLocalExtraParameterJson", adUnitIdentifier, key, SerializeLocalExtraParameterValue(value));
+ }
+ }
+
+ #endregion
+
+ #region App Open
+
+ ///
+ /// Start loading an app open ad.
+ ///
+ /// Ad unit identifier of the app open ad to load. Must not be null.
+ public static void LoadAppOpenAd(string adUnitIdentifier)
+ {
+ ValidateAdUnitIdentifier(adUnitIdentifier, "load app open ad");
+ MaxUnityPluginClass.CallStatic("loadAppOpenAd", adUnitIdentifier);
+ }
+
+ ///
+ /// Check if app open ad ad is loaded and ready to be displayed.
+ ///
+ /// Ad unit identifier of the app open ad to load. Must not be null.
+ /// True if the ad is ready to be displayed
+ public static bool IsAppOpenAdReady(string adUnitIdentifier)
+ {
+ ValidateAdUnitIdentifier(adUnitIdentifier, "check app open ad loaded");
+ return MaxUnityPluginClass.CallStatic("isAppOpenAdReady", adUnitIdentifier);
+ }
+
+ ///
+ /// Present loaded app open ad for a given placement to tie ad events to. Note: if the app open ad is not ready to be displayed nothing will happen.
+ ///
+ /// Ad unit identifier of the app open ad to load. Must not be null.
+ /// The placement to tie the showing ad's events to
+ /// The custom data to tie the showing ad's events to. Maximum size is 8KB.
+ public static void ShowAppOpenAd(string adUnitIdentifier, string placement = null, string customData = null)
+ {
+ ValidateAdUnitIdentifier(adUnitIdentifier, "show app open ad");
+
+ if (IsAppOpenAdReady(adUnitIdentifier))
+ {
+ MaxUnityPluginClass.CallStatic("showAppOpenAd", adUnitIdentifier, placement, customData);
+ }
+ else
+ {
+ MaxSdkLogger.UserWarning("Not showing MAX Ads app open ad: ad not ready");
+ }
+ }
+
+ ///
+ /// Set an extra parameter for the ad.
+ ///
+ /// Ad unit identifier of the app open ad to set the extra parameter for. Must not be null.
+ /// The key for the extra parameter. Must not be null.
+ /// The value for the extra parameter.
+ public static void SetAppOpenAdExtraParameter(string adUnitIdentifier, string key, string value)
+ {
+ ValidateAdUnitIdentifier(adUnitIdentifier, "set app open ad extra parameter");
+ MaxUnityPluginClass.CallStatic("setAppOpenAdExtraParameter", adUnitIdentifier, key, value);
+ }
+
+ ///
+ /// Set a local extra parameter for the ad.
+ ///
+ /// Ad unit identifier of the app open ad to set the local extra parameter for. Must not be null.
+ /// The key for the local extra parameter. Must not be null.
+ /// The value for the extra parameter. Accepts the following types: , null , IList , IDictionary , string , primitive types
+ public static void SetAppOpenAdLocalExtraParameter(string adUnitIdentifier, string key, object value)
+ {
+ ValidateAdUnitIdentifier(adUnitIdentifier, "set app open ad local extra parameter");
+
+ if (value == null || value is AndroidJavaObject)
+ {
+ MaxUnityPluginClass.CallStatic("setAppOpenAdLocalExtraParameter", adUnitIdentifier, key, (AndroidJavaObject) value);
+ }
+ else
+ {
+ MaxUnityPluginClass.CallStatic("setAppOpenAdLocalExtraParameterJson", adUnitIdentifier, key, SerializeLocalExtraParameterValue(value));
+ }
+ }
+
+ #endregion
+
+ #region Rewarded
+
+ ///
+ /// Start loading an rewarded ad.
+ ///
+ /// Ad unit identifier of the rewarded ad to load. Must not be null.
+ public static void LoadRewardedAd(string adUnitIdentifier)
+ {
+ ValidateAdUnitIdentifier(adUnitIdentifier, "load rewarded ad");
+ MaxUnityPluginClass.CallStatic("loadRewardedAd", adUnitIdentifier);
+ }
+
+ ///
+ /// Check if rewarded ad ad is loaded and ready to be displayed.
+ ///
+ /// Ad unit identifier of the rewarded ad to load. Must not be null.
+ /// True if the ad is ready to be displayed
+ public static bool IsRewardedAdReady(string adUnitIdentifier)
+ {
+ ValidateAdUnitIdentifier(adUnitIdentifier, "check rewarded ad loaded");
+ return MaxUnityPluginClass.CallStatic("isRewardedAdReady", adUnitIdentifier);
+ }
+
+ /// ready to be
+ /// Present loaded rewarded ad for a given placement to tie ad events to. Note: if the rewarded ad is not ready to be displayed nothing will happen.
+ ///
+ /// Ad unit identifier of the interstitial to load. Must not be null.
+ /// The placement to tie the showing ad's events to
+ /// The custom data to tie the showing ad's events to. Maximum size is 8KB.
+ public static void ShowRewardedAd(string adUnitIdentifier, string placement = null, string customData = null)
+ {
+ ValidateAdUnitIdentifier(adUnitIdentifier, "show rewarded ad");
+
+ if (IsRewardedAdReady(adUnitIdentifier))
+ {
+ MaxUnityPluginClass.CallStatic("showRewardedAd", adUnitIdentifier, placement, customData);
+ }
+ else
+ {
+ MaxSdkLogger.UserWarning("Not showing MAX Ads rewarded ad: ad not ready");
+ }
+ }
+
+ ///
+ /// Set an extra parameter for the ad.
+ ///
+ /// Ad unit identifier of the rewarded to set the extra parameter for. Must not be null.
+ /// The key for the extra parameter. Must not be null.
+ /// The value for the extra parameter.
+ public static void SetRewardedAdExtraParameter(string adUnitIdentifier, string key, string value)
+ {
+ ValidateAdUnitIdentifier(adUnitIdentifier, "set rewarded ad extra parameter");
+ MaxUnityPluginClass.CallStatic("setRewardedAdExtraParameter", adUnitIdentifier, key, value);
+ }
+
+ ///
+ /// Set a local extra parameter for the ad.
+ ///
+ /// Ad unit identifier of the rewarded to set the local extra parameter for. Must not be null.
+ /// The key for the local extra parameter. Must not be null.
+ /// The value for the extra parameter. Accepts the following types: , null , IList , IDictionary , string , primitive types
+ public static void SetRewardedAdLocalExtraParameter(string adUnitIdentifier, string key, object value)
+ {
+ ValidateAdUnitIdentifier(adUnitIdentifier, "set rewarded ad local extra parameter");
+
+ if (value == null || value is AndroidJavaObject)
+ {
+ MaxUnityPluginClass.CallStatic("setRewardedAdLocalExtraParameter", adUnitIdentifier, key, (AndroidJavaObject) value);
+ }
+ else
+ {
+ MaxUnityPluginClass.CallStatic("setRewardedAdLocalExtraParameterJson", adUnitIdentifier, key, SerializeLocalExtraParameterValue(value));
+ }
+ }
+
+ #endregion
+
+ #region Event Tracking
+
+ ///
+ /// Track an event using AppLovin.
+ ///
+ /// An event from the list of pre-defined events may be found in MaxEvents.cs as part of the AppLovin SDK framework. Must not be null.
+ /// A dictionary containing key-value pairs further describing this event.
+ public static void TrackEvent(string name, IDictionary parameters = null)
+ {
+ // Convert null to "{}" to avoid Unity sending the literal "null" to Android.
+ var jsonString = ( parameters == null ) ? EmptyJson : Json.Serialize(parameters);
+ MaxUnityPluginClass.CallStatic("trackEvent", name, jsonString);
+ }
+
+ #endregion
+
+ #region Settings
+
+ ///
+ /// Set whether to begin video ads in a muted state or not.
+ ///
+ /// Please call this method after the SDK has initialized.
+ ///
+ /// true if video ads should being in muted state.
+ public static void SetMuted(bool muted)
+ {
+ MaxUnityPluginClass.CallStatic("setMuted", muted);
+ }
+
+ ///
+ /// Whether video ads begin in a muted state or not. Defaults to false .
+ ///
+ /// Note: Returns false if the SDK is not initialized.
+ ///
+ /// true if video ads begin in muted state.
+ public static bool IsMuted()
+ {
+ return MaxUnityPluginClass.CallStatic("isMuted");
+ }
+
+ ///
+ /// Toggle verbose logging of AppLovin SDK. If enabled AppLovin messages will appear in standard application log accessible via logcat. All log messages will have "AppLovinSdk" tag.
+ ///
+ /// true if verbose logging should be enabled.
+ public static void SetVerboseLogging(bool enabled)
+ {
+ MaxUnityPluginClass.CallStatic("setVerboseLogging", enabled);
+ }
+
+ ///
+ /// Whether or not verbose logging is enabled.
+ ///
+ /// true if verbose logging is enabled.
+ public static bool IsVerboseLoggingEnabled()
+ {
+ return MaxUnityPluginClass.CallStatic("isVerboseLoggingEnabled");
+ }
+
+ ///
+ /// Whether the creative debugger will be displayed on fullscreen ads after flipping the device screen down twice. Defaults to true.
+ ///
+ /// true if the creative debugger should be enabled.
+ public static void SetCreativeDebuggerEnabled(bool enabled)
+ {
+ MaxUnityPluginClass.CallStatic("setCreativeDebuggerEnabled", enabled);
+ }
+
+ ///
+ /// Enable devices to receive test ads, by passing in the advertising identifier (IDFA/GAID) of each test device.
+ /// Refer to AppLovin logs for the IDFA/GAID of your current device.
+ ///
+ /// String list of advertising identifiers from devices to receive test ads.
+ public static void SetTestDeviceAdvertisingIdentifiers(string[] advertisingIdentifiers)
+ {
+ if (IsInitialized())
+ {
+ MaxSdkLogger.UserError("Test Device Advertising Identifiers must be set before SDK initialization.");
+ return;
+ }
+
+ // Wrap the string array in an object array, so the compiler does not split into multiple strings.
+ object[] arguments = {advertisingIdentifiers};
+ MaxUnityPluginClass.CallStatic("setTestDeviceAdvertisingIds", arguments);
+ }
+
+ ///
+ /// Whether or not the native AppLovin SDKs listen to exceptions. Defaults to true .
+ ///
+ /// true if the native AppLovin SDKs should not listen to exceptions.
+ public static void SetExceptionHandlerEnabled(bool enabled)
+ {
+ MaxUnityPluginClass.CallStatic("setExceptionHandlerEnabled", enabled);
+ }
+
+ ///
+ /// Set an extra parameter to pass to the AppLovin server.
+ ///
+ /// The key for the extra parameter. Must not be null.
+ /// The value for the extra parameter. May be null.
+ public static void SetExtraParameter(string key, string value)
+ {
+ HandleExtraParameter(key, value);
+
+ MaxUnityPluginClass.CallStatic("setExtraParameter", key, value);
+ }
+
+ ///
+ /// Get the native insets in pixels for the safe area.
+ /// These insets are used to position ads within the safe area of the screen.
+ ///
+ public static SafeAreaInsets GetSafeAreaInsets()
+ {
+ // Use an int array instead of json serialization for performance
+ var insets = MaxUnityPluginClass.CallStatic("getSafeAreaInsets");
+
+ // Convert from points to pixels
+ var screenDensity = MaxSdkUtils.GetScreenDensity();
+ for (var i = 0; i < insets.Length; i++)
+ {
+ insets[i] *= (int) screenDensity;
+ }
+
+ return new SafeAreaInsets(insets);
+ }
+
+ #endregion
+
+ #region Obsolete
+
+ [Obsolete("This API has been deprecated and will be removed in a future release. Please use CreateBanner(string adUnitIdentifier, AdViewConfiguration configuration) instead.")]
+ public static void CreateBanner(string adUnitIdentifier, BannerPosition bannerPosition)
+ {
+ // AdViewPosition and BannerPosition share identical enum values, so casting is safe
+ CreateBanner(adUnitIdentifier, new AdViewConfiguration((AdViewPosition) bannerPosition));
+ }
+
+ [Obsolete("This API has been deprecated and will be removed in a future release. Please use CreateBanner(string adUnitIdentifier, AdViewConfiguration configuration) instead.")]
+ public static void CreateBanner(string adUnitIdentifier, float x, float y)
+ {
+ CreateBanner(adUnitIdentifier, new AdViewConfiguration(x, y));
+ }
+
+ [Obsolete("This API has been deprecated and will be removed in a future release. Please use UpdateBannerPosition(string adUnitIdentifier, AdViewPosition bannerPosition) instead.")]
+ public static void UpdateBannerPosition(string adUnitIdentifier, BannerPosition bannerPosition)
+ {
+ // AdViewPosition and BannerPosition share identical enum values, so casting is safe
+ UpdateBannerPosition(adUnitIdentifier, (AdViewPosition) bannerPosition);
+ }
+
+ [Obsolete("This API has been deprecated and will be removed in a future release. Please use CreateMRec(string adUnitIdentifier, AdViewConfiguration configuration) instead.")]
+ public static void CreateMRec(string adUnitIdentifier, AdViewPosition mrecPosition)
+ {
+ CreateMRec(adUnitIdentifier, new AdViewConfiguration(mrecPosition));
+ }
+
+ [Obsolete("This API has been deprecated and will be removed in a future release. Please use CreateMRec(string adUnitIdentifier, AdViewConfiguration configuration) instead.")]
+ public static void CreateMRec(string adUnitIdentifier, float x, float y)
+ {
+ CreateMRec(adUnitIdentifier, new AdViewConfiguration(x, y));
+ }
+
+ [Obsolete("This API has been deprecated and will be removed in a future release. Please set your SDK key in the AppLovin Integration Manager.")]
+ public static void SetSdkKey(string sdkKey)
+ {
+ MaxUnityPluginClass.CallStatic("setSdkKey", sdkKey);
+ MaxSdkLogger.UserWarning("MaxSdk.SetSdkKey() has been deprecated and will be removed in a future release. Please set your SDK key in the AppLovin Integration Manager.");
+ }
+
+ #endregion
+
+ internal class BackgroundCallbackProxy : AndroidJavaProxy
+ {
+ public BackgroundCallbackProxy() : base("com.applovin.mediation.unity.MaxUnityAdManager$BackgroundCallback") { }
+
+ public void onEvent(string propsStr)
+ {
+ HandleBackgroundCallback(propsStr);
+ }
+ }
+}
+#endif
diff --git a/Assets/MaxSdk/Scripts/MaxSdkAndroid.cs.meta b/Assets/MaxSdk/Scripts/MaxSdkAndroid.cs.meta
new file mode 100644
index 0000000..2cf5448
--- /dev/null
+++ b/Assets/MaxSdk/Scripts/MaxSdkAndroid.cs.meta
@@ -0,0 +1,14 @@
+fileFormatVersion: 2
+guid: 10335fad6bfef47b8819a411aa591dc8
+labels:
+- al_max
+- al_max_export_path-MaxSdk/Scripts/MaxSdkAndroid.cs
+MonoImporter:
+ externalObjects: {}
+ serializedVersion: 2
+ defaultReferences: []
+ executionOrder: 0
+ icon: {instanceID: 0}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/MaxSdk/Scripts/MaxSdkBase.cs b/Assets/MaxSdk/Scripts/MaxSdkBase.cs
new file mode 100644
index 0000000..2c50ee3
--- /dev/null
+++ b/Assets/MaxSdk/Scripts/MaxSdkBase.cs
@@ -0,0 +1,835 @@
+using System;
+using System.Collections;
+using System.Collections.Generic;
+using System.Globalization;
+using System.Linq;
+using System.Text;
+using AppLovinMax.ThirdParty.MiniJson;
+using AppLovinMax.Internal;
+using UnityEngine;
+
+#if UNITY_IOS && !UNITY_EDITOR
+using System.Runtime.InteropServices;
+#endif
+
+public abstract class MaxSdkBase
+{
+ protected const string EmptyJson = "{}";
+
+ ///
+ /// This enum represents the user's geography used to determine the type of consent flow shown to the user.
+ ///
+ public enum ConsentFlowUserGeography
+ {
+ ///
+ /// User's geography is unknown.
+ ///
+ Unknown,
+
+ ///
+ /// The user is in GDPR region.
+ ///
+ Gdpr,
+
+ ///
+ /// The user is in a non-GDPR region.
+ ///
+ Other
+ }
+
+#if UNITY_EDITOR || UNITY_IPHONE || UNITY_IOS
+ ///
+ /// App tracking status values. Primarily used in conjunction with iOS14's AppTrackingTransparency.framework.
+ ///
+ public enum AppTrackingStatus
+ {
+ ///
+ /// Device is on < iOS14, AppTrackingTransparency.framework is not available.
+ ///
+ Unavailable,
+
+ ///
+ /// The value returned if a user has not yet received an authorization request to authorize access to app-related data that can be used for tracking the user or the device.
+ ///
+ NotDetermined,
+
+ ///
+ /// The value returned if authorization to access app-related data that can be used for tracking the user or the device is restricted.
+ ///
+ Restricted,
+
+ ///
+ /// The value returned if the user denies authorization to access app-related data that can be used for tracking the user or the device.
+ ///
+ Denied,
+
+ ///
+ /// The value returned if the user authorizes access to app-related data that can be used for tracking the user or the device.
+ ///
+ Authorized,
+ }
+#endif
+
+ ///
+ /// An enum describing the adapter's initialization status.
+ ///
+ public enum InitializationStatus
+ {
+ ///
+ /// The adapter is not initialized. Note: networks need to be enabled for an ad unit id to be initialized.
+ ///
+ NotInitialized = -4,
+
+ ///
+ /// The 3rd-party SDK does not have an initialization callback with status.
+ ///
+ DoesNotApply = -3,
+
+ ///
+ /// The 3rd-party SDK is currently initializing.
+ ///
+ Initializing = -2,
+
+ ///
+ /// The 3rd-party SDK explicitly initialized, but without a status.
+ ///
+ InitializedUnknown = -1,
+
+ ///
+ /// The 3rd-party SDK initialization failed.
+ ///
+ InitializedFailure = 0,
+
+ ///
+ /// The 3rd-party SDK initialization was successful.
+ ///
+ InitializedSuccess = 1
+ }
+
+ public enum AdViewPosition
+ {
+ TopLeft,
+ TopCenter,
+ TopRight,
+ Centered,
+ CenterLeft,
+ CenterRight,
+ BottomLeft,
+ BottomCenter,
+ BottomRight
+ }
+
+ public class AdViewConfiguration
+ {
+ ///
+ /// The position of the ad.
+ ///
+ public AdViewPosition Position { get; private set; }
+
+ ///
+ /// The horizontal (X) position of the banner, relative to the top-left corner of the screen's safe area.
+ ///
+ public float XCoordinate { get; private set; }
+
+ ///
+ /// The vertical (Y) position of the banner, relative to the top-left corner of the screen's safe area.
+ ///
+ public float YCoordinate { get; private set; }
+
+ ///
+ /// Whether to use adaptive banners. Has no effect on MREC ads.
+ ///
+ public bool IsAdaptive { get; set; }
+
+ internal bool UseCoordinates { get; private set; }
+
+ ///
+ /// Creates an AdViewConfiguration with the given AdViewPosition.
+ ///
+ /// The position of the ad. Must not be null.
+ public AdViewConfiguration(AdViewPosition position)
+ {
+ Position = position;
+ IsAdaptive = true;
+ UseCoordinates = false;
+ }
+
+ ///
+ /// Creates an AdViewConfiguration with the given x and y coordinates.
+ ///
+ /// The horizontal (X) position of the banner, relative to the top-left corner of the screen's safe area.
+ /// The vertical (Y) position of the banner, relative to the top-left corner of the screen's safe area.
+ public AdViewConfiguration(float x, float y)
+ {
+ XCoordinate = x;
+ YCoordinate = y;
+ IsAdaptive = true;
+ UseCoordinates = true;
+ }
+ }
+
+ public class SdkConfiguration
+ {
+ ///
+ /// Whether or not the SDK has been initialized successfully.
+ ///
+ public bool IsSuccessfullyInitialized { get; private set; }
+
+ ///
+ /// Get the country code for this user.
+ ///
+ public string CountryCode { get; private set; }
+
+#if UNITY_EDITOR || UNITY_IPHONE || UNITY_IOS
+ ///
+ /// App tracking status values. Primarily used in conjunction with iOS14's AppTrackingTransparency.framework.
+ ///
+ public AppTrackingStatus AppTrackingStatus { get; private set; }
+#endif
+
+ public bool IsTestModeEnabled { get; private set; }
+
+ ///
+ /// Get the user's geography used to determine the type of consent flow shown to the user.
+ /// If no such determination could be made, will be returned.
+ ///
+ public ConsentFlowUserGeography ConsentFlowUserGeography { get; private set; }
+
+ [Obsolete("This API has been deprecated and will be removed in a future release.")]
+ public ConsentDialogState ConsentDialogState { get; private set; }
+
+#if UNITY_EDITOR || !(UNITY_ANDROID || UNITY_IPHONE || UNITY_IOS)
+ public static SdkConfiguration CreateEmpty()
+ {
+ var sdkConfiguration = new SdkConfiguration();
+ sdkConfiguration.IsSuccessfullyInitialized = true;
+#pragma warning disable 0618
+ sdkConfiguration.ConsentDialogState = ConsentDialogState.Unknown;
+#pragma warning restore 0618
+#if UNITY_EDITOR
+ sdkConfiguration.AppTrackingStatus = AppTrackingStatus.Authorized;
+#endif
+ sdkConfiguration.CountryCode = TryGetCountryCode();
+ sdkConfiguration.IsTestModeEnabled = false;
+
+ return sdkConfiguration;
+ }
+
+ private static string TryGetCountryCode()
+ {
+ try
+ {
+ return RegionInfo.CurrentRegion.TwoLetterISORegionName;
+ }
+#pragma warning disable 0168
+ catch (Exception ignored)
+#pragma warning restore 0168
+ {
+ // Ignored
+ }
+
+ return "US";
+ }
+#endif
+
+ public static SdkConfiguration Create(IDictionary eventProps)
+ {
+ var sdkConfiguration = new SdkConfiguration();
+
+ sdkConfiguration.IsSuccessfullyInitialized = MaxSdkUtils.GetBoolFromDictionary(eventProps, "isSuccessfullyInitialized");
+ sdkConfiguration.CountryCode = MaxSdkUtils.GetStringFromDictionary(eventProps, "countryCode", "");
+ sdkConfiguration.IsTestModeEnabled = MaxSdkUtils.GetBoolFromDictionary(eventProps, "isTestModeEnabled");
+
+ var consentFlowUserGeographyStr = MaxSdkUtils.GetStringFromDictionary(eventProps, "consentFlowUserGeography", "");
+ if ("1".Equals(consentFlowUserGeographyStr))
+ {
+ sdkConfiguration.ConsentFlowUserGeography = ConsentFlowUserGeography.Gdpr;
+ }
+ else if ("2".Equals(consentFlowUserGeographyStr))
+ {
+ sdkConfiguration.ConsentFlowUserGeography = ConsentFlowUserGeography.Other;
+ }
+ else
+ {
+ sdkConfiguration.ConsentFlowUserGeography = ConsentFlowUserGeography.Unknown;
+ }
+
+#pragma warning disable 0618
+ var consentDialogStateStr = MaxSdkUtils.GetStringFromDictionary(eventProps, "consentDialogState", "");
+ if ("1".Equals(consentDialogStateStr))
+ {
+ sdkConfiguration.ConsentDialogState = ConsentDialogState.Applies;
+ }
+ else if ("2".Equals(consentDialogStateStr))
+ {
+ sdkConfiguration.ConsentDialogState = ConsentDialogState.DoesNotApply;
+ }
+ else
+ {
+ sdkConfiguration.ConsentDialogState = ConsentDialogState.Unknown;
+ }
+#pragma warning restore 0618
+
+#if UNITY_IPHONE || UNITY_IOS
+ var appTrackingStatusStr = MaxSdkUtils.GetStringFromDictionary(eventProps, "appTrackingStatus", "-1");
+ if ("-1".Equals(appTrackingStatusStr))
+ {
+ sdkConfiguration.AppTrackingStatus = AppTrackingStatus.Unavailable;
+ }
+ else if ("0".Equals(appTrackingStatusStr))
+ {
+ sdkConfiguration.AppTrackingStatus = AppTrackingStatus.NotDetermined;
+ }
+ else if ("1".Equals(appTrackingStatusStr))
+ {
+ sdkConfiguration.AppTrackingStatus = AppTrackingStatus.Restricted;
+ }
+ else if ("2".Equals(appTrackingStatusStr))
+ {
+ sdkConfiguration.AppTrackingStatus = AppTrackingStatus.Denied;
+ }
+ else // "3" is authorized
+ {
+ sdkConfiguration.AppTrackingStatus = AppTrackingStatus.Authorized;
+ }
+#endif
+
+ return sdkConfiguration;
+ }
+ }
+
+ public struct Reward
+ {
+ public string Label;
+ public int Amount;
+
+ public override string ToString()
+ {
+ return "Reward: " + Amount + " " + Label;
+ }
+
+ public bool IsValid()
+ {
+ return !string.IsNullOrEmpty(Label) && Amount > 0;
+ }
+ }
+
+ /**
+ * This enum contains various error codes that the SDK can return when a MAX ad fails to load or display.
+ */
+ public enum ErrorCode
+ {
+ ///
+ /// This error code represents an error that could not be categorized into one of the other defined errors. See the message field in the error object for more details.
+ ///
+ Unspecified = -1,
+
+ ///
+ /// This error code indicates that MAX returned no eligible ads from any mediated networks for this app/device.
+ ///
+ NoFill = 204,
+
+ ///
+ /// This error code indicates that MAX returned eligible ads from mediated networks, but all ads failed to load. See the adLoadFailureInfo field in the error object for more details.
+ ///
+ AdLoadFailed = -5001,
+
+ ///
+ /// This error code represents an error that was encountered when showing an ad.
+ ///
+ AdDisplayFailed = -4205,
+
+ ///
+ /// This error code indicates that the ad request failed due to a generic network error. See the message field in the error object for more details.
+ ///
+ NetworkError = -1000,
+
+ ///
+ /// This error code indicates that the ad request timed out due to a slow internet connection.
+ ///
+ NetworkTimeout = -1001,
+
+ ///
+ /// This error code indicates that the ad request failed because the device is not connected to the internet.
+ ///
+ NoNetwork = -1009,
+
+ ///
+ /// This error code indicates that you attempted to show a fullscreen ad while another fullscreen ad is still showing.
+ ///
+ FullscreenAdAlreadyShowing = -23,
+
+ ///
+ /// This error code indicates you are attempting to show a fullscreen ad before the one has been loaded.
+ ///
+ FullscreenAdNotReady = -24,
+
+#if UNITY_IOS || UNITY_IPHONE
+ ///
+ /// This error code indicates you attempted to present a fullscreen ad from an invalid view controller.
+ ///
+ FullscreenAdInvalidViewController = -25,
+#endif
+
+ ///
+ /// This error code indicates you are attempting to load a fullscreen ad while another fullscreen ad is already loading.
+ ///
+ FullscreenAdAlreadyLoading = -26,
+
+ ///
+ /// This error code indicates you are attempting to load a fullscreen ad while another fullscreen ad is still showing.
+ ///
+ FullscreenAdLoadWhileShowing = -27,
+
+#if UNITY_ANDROID
+ ///
+ /// This error code indicates that the SDK failed to display an ad because the user has the "Don't Keep Activities" developer setting enabled.
+ ///
+ DontKeepActivitiesEnabled = -5602,
+#endif
+
+ ///
+ /// This error code indicates that the SDK failed to load an ad because the publisher provided an invalid ad unit identifier.
+ /// Possible reasons for an invalid ad unit identifier:
+ /// 1. Ad unit identifier is malformed or does not exist
+ /// 2. Ad unit is disabled
+ /// 3. Ad unit is not associated with the current app's package name
+ /// 4. Ad unit was created within the last 30-60 minutes
+ ///
+ InvalidAdUnitId = -5603
+ }
+
+ /**
+ * This enum contains possible states of an ad in the waterfall the adapter response info could represent.
+ */
+ public enum MaxAdLoadState
+ {
+ ///
+ /// The AppLovin Max SDK did not attempt to load an ad from this network in the waterfall because an ad higher
+ /// in the waterfall loaded successfully.
+ ///
+ AdLoadNotAttempted,
+
+ ///
+ /// An ad successfully loaded from this network.
+ ///
+ AdLoaded,
+
+ ///
+ /// An ad failed to load from this network.
+ ///
+ FailedToLoad
+ }
+
+ public class AdInfo
+ {
+ public string AdUnitIdentifier { get; private set; }
+ public string AdFormat { get; private set; }
+ public string NetworkName { get; private set; }
+ public string NetworkPlacement { get; private set; }
+ public string Placement { get; private set; }
+ public string CreativeIdentifier { get; private set; }
+ public double Revenue { get; private set; }
+ public string RevenuePrecision { get; private set; }
+ public WaterfallInfo WaterfallInfo { get; private set; }
+ public long LatencyMillis { get; private set; }
+ public string DspName { get; private set; }
+
+ public AdInfo(IDictionary adInfoDictionary)
+ {
+ AdUnitIdentifier = MaxSdkUtils.GetStringFromDictionary(adInfoDictionary, "adUnitId");
+ AdFormat = MaxSdkUtils.GetStringFromDictionary(adInfoDictionary, "adFormat");
+ NetworkName = MaxSdkUtils.GetStringFromDictionary(adInfoDictionary, "networkName");
+ NetworkPlacement = MaxSdkUtils.GetStringFromDictionary(adInfoDictionary, "networkPlacement");
+ CreativeIdentifier = MaxSdkUtils.GetStringFromDictionary(adInfoDictionary, "creativeId");
+ Placement = MaxSdkUtils.GetStringFromDictionary(adInfoDictionary, "placement");
+ Revenue = MaxSdkUtils.GetDoubleFromDictionary(adInfoDictionary, "revenue", -1);
+ RevenuePrecision = MaxSdkUtils.GetStringFromDictionary(adInfoDictionary, "revenuePrecision");
+ WaterfallInfo = new WaterfallInfo(MaxSdkUtils.GetDictionaryFromDictionary(adInfoDictionary, "waterfallInfo", new Dictionary()));
+ LatencyMillis = MaxSdkUtils.GetLongFromDictionary(adInfoDictionary, "latencyMillis");
+ DspName = MaxSdkUtils.GetStringFromDictionary(adInfoDictionary, "dspName");
+ }
+
+ public override string ToString()
+ {
+ return "[AdInfo adUnitIdentifier: " + AdUnitIdentifier +
+ ", adFormat: " + AdFormat +
+ ", networkName: " + NetworkName +
+ ", networkPlacement: " + NetworkPlacement +
+ ", creativeIdentifier: " + CreativeIdentifier +
+ ", placement: " + Placement +
+ ", revenue: " + Revenue +
+ ", revenuePrecision: " + RevenuePrecision +
+ ", latency: " + LatencyMillis +
+ ", dspName: " + DspName + "]";
+ }
+ }
+
+ ///
+ /// Returns information about the ad response in a waterfall.
+ ///
+ public class WaterfallInfo
+ {
+ public String Name { get; private set; }
+ public String TestName { get; private set; }
+ public List NetworkResponses { get; private set; }
+ public long LatencyMillis { get; private set; }
+
+ public WaterfallInfo(IDictionary waterfallInfoDict)
+ {
+ Name = MaxSdkUtils.GetStringFromDictionary(waterfallInfoDict, "name");
+ TestName = MaxSdkUtils.GetStringFromDictionary(waterfallInfoDict, "testName");
+
+ var networkResponsesList = MaxSdkUtils.GetListFromDictionary(waterfallInfoDict, "networkResponses", new List());
+ NetworkResponses = new List();
+ foreach (var networkResponseObject in networkResponsesList)
+ {
+ var networkResponseDict = networkResponseObject as Dictionary;
+ if (networkResponseDict == null) continue;
+
+ var networkResponse = new NetworkResponseInfo(networkResponseDict);
+ NetworkResponses.Add(networkResponse);
+ }
+
+ LatencyMillis = MaxSdkUtils.GetLongFromDictionary(waterfallInfoDict, "latencyMillis");
+ }
+
+ public override string ToString()
+ {
+ return "[MediatedNetworkInfo: name = " + Name +
+ ", testName = " + TestName +
+ ", latency = " + LatencyMillis +
+ ", networkResponse = " + string.Join(", ", NetworkResponses.Select(networkResponseInfo => networkResponseInfo.ToString()).ToArray()) + "]";
+ }
+ }
+
+ public class NetworkResponseInfo
+ {
+ public MaxAdLoadState AdLoadState { get; private set; }
+ public MediatedNetworkInfo MediatedNetwork { get; private set; }
+ public Dictionary Credentials { get; private set; }
+ public bool IsBidding { get; private set; }
+ public long LatencyMillis { get; private set; }
+ public ErrorInfo Error { get; private set; }
+
+ public NetworkResponseInfo(IDictionary networkResponseInfoDict)
+ {
+ var mediatedNetworkInfoDict = MaxSdkUtils.GetDictionaryFromDictionary(networkResponseInfoDict, "mediatedNetwork");
+ MediatedNetwork = mediatedNetworkInfoDict != null ? new MediatedNetworkInfo(mediatedNetworkInfoDict) : null;
+
+ Credentials = MaxSdkUtils.GetDictionaryFromDictionary(networkResponseInfoDict, "credentials", new Dictionary());
+ IsBidding = MaxSdkUtils.GetBoolFromDictionary(networkResponseInfoDict, "isBidding");
+ LatencyMillis = MaxSdkUtils.GetLongFromDictionary(networkResponseInfoDict, "latencyMillis");
+ AdLoadState = (MaxAdLoadState) MaxSdkUtils.GetIntFromDictionary(networkResponseInfoDict, "adLoadState");
+
+ var errorInfoDict = MaxSdkUtils.GetDictionaryFromDictionary(networkResponseInfoDict, "error");
+ Error = errorInfoDict != null ? new ErrorInfo(errorInfoDict) : null;
+ }
+
+ public override string ToString()
+ {
+ var stringBuilder = new StringBuilder("[NetworkResponseInfo: adLoadState = ").Append(AdLoadState);
+ stringBuilder.Append(", mediatedNetwork = ").Append(MediatedNetwork);
+ stringBuilder.Append(", credentials = ").Append(string.Join(", ", Credentials.Select(keyValuePair => keyValuePair.ToString()).ToArray()));
+
+ switch (AdLoadState)
+ {
+ case MaxAdLoadState.FailedToLoad:
+ stringBuilder.Append(", error = ").Append(Error);
+ break;
+ case MaxAdLoadState.AdLoaded:
+ stringBuilder.Append(", latency = ").Append(LatencyMillis);
+ break;
+ }
+
+ return stringBuilder.Append("]").ToString();
+ }
+ }
+
+ public class MediatedNetworkInfo
+ {
+ public string Name { get; private set; }
+ public string AdapterClassName { get; private set; }
+ public string AdapterVersion { get; private set; }
+ public string SdkVersion { get; private set; }
+ public InitializationStatus InitializationStatus { get; private set; }
+
+ public MediatedNetworkInfo(IDictionary mediatedNetworkDictionary)
+ {
+ // NOTE: Unity Editor creates empty string
+ Name = MaxSdkUtils.GetStringFromDictionary(mediatedNetworkDictionary, "name", "");
+ AdapterClassName = MaxSdkUtils.GetStringFromDictionary(mediatedNetworkDictionary, "adapterClassName", "");
+ AdapterVersion = MaxSdkUtils.GetStringFromDictionary(mediatedNetworkDictionary, "adapterVersion", "");
+ SdkVersion = MaxSdkUtils.GetStringFromDictionary(mediatedNetworkDictionary, "sdkVersion", "");
+ var initializationStatusInt = MaxSdkUtils.GetIntFromDictionary(mediatedNetworkDictionary, "initializationStatus", (int) InitializationStatus.NotInitialized);
+ InitializationStatus = InitializationStatusFromCode(initializationStatusInt);
+ }
+
+ public override string ToString()
+ {
+ return "[MediatedNetworkInfo name: " + Name +
+ ", adapterClassName: " + AdapterClassName +
+ ", adapterVersion: " + AdapterVersion +
+ ", sdkVersion: " + SdkVersion +
+ ", initializationStatus: " + InitializationStatus + "]";
+ }
+
+ private static InitializationStatus InitializationStatusFromCode(int code)
+ {
+ if (Enum.IsDefined(typeof(InitializationStatus), code))
+ {
+ return (InitializationStatus) code;
+ }
+ else
+ {
+ return InitializationStatus.NotInitialized;
+ }
+ }
+ }
+
+ public class ErrorInfo
+ {
+ public ErrorCode Code { get; private set; }
+ public string Message { get; private set; }
+ public int MediatedNetworkErrorCode { get; private set; }
+ public string MediatedNetworkErrorMessage { get; private set; }
+ public string AdLoadFailureInfo { get; private set; }
+ public WaterfallInfo WaterfallInfo { get; private set; }
+ public long LatencyMillis { get; private set; }
+
+ public ErrorInfo(IDictionary errorInfoDictionary)
+ {
+ Code = (ErrorCode) MaxSdkUtils.GetIntFromDictionary(errorInfoDictionary, "errorCode", -1);
+ Message = MaxSdkUtils.GetStringFromDictionary(errorInfoDictionary, "errorMessage", "");
+ MediatedNetworkErrorCode = MaxSdkUtils.GetIntFromDictionary(errorInfoDictionary, "mediatedNetworkErrorCode", (int) ErrorCode.Unspecified);
+ MediatedNetworkErrorMessage = MaxSdkUtils.GetStringFromDictionary(errorInfoDictionary, "mediatedNetworkErrorMessage", "");
+ AdLoadFailureInfo = MaxSdkUtils.GetStringFromDictionary(errorInfoDictionary, "adLoadFailureInfo", "");
+ WaterfallInfo = new WaterfallInfo(MaxSdkUtils.GetDictionaryFromDictionary(errorInfoDictionary, "waterfallInfo", new Dictionary()));
+ LatencyMillis = MaxSdkUtils.GetLongFromDictionary(errorInfoDictionary, "latencyMillis");
+ }
+
+ public override string ToString()
+ {
+ var stringbuilder = new StringBuilder("[ErrorInfo code: ").Append(Code);
+ stringbuilder.Append(", message: ").Append(Message);
+
+ if (Code == ErrorCode.AdDisplayFailed)
+ {
+ stringbuilder.Append(", mediatedNetworkCode: ").Append(MediatedNetworkErrorCode);
+ stringbuilder.Append(", mediatedNetworkMessage: ").Append(MediatedNetworkErrorMessage);
+ }
+
+ stringbuilder.Append(", latency: ").Append(LatencyMillis);
+ return stringbuilder.Append(", adLoadFailureInfo: ").Append(AdLoadFailureInfo).Append("]").ToString();
+ }
+ }
+
+ ///
+ /// Inset values for the safe area on the screen used to render banner ads.
+ ///
+ public class SafeAreaInsets
+ {
+ public int Left { get; private set; }
+ public int Top { get; private set; }
+ public int Right { get; private set; }
+ public int Bottom { get; private set; }
+
+ ///
+ /// Creates a new instance of .
+ ///
+ /// An integer array with insets values in the order of left, top, right, and bottom
+ internal SafeAreaInsets(int[] insets)
+ {
+ Left = insets[0];
+ Top = insets[1];
+ Right = insets[2];
+ Bottom = insets[3];
+ }
+
+ public override string ToString()
+ {
+ return "[SafeAreaInsets: Left: " + Left +
+ ", Top: " + Top +
+ ", Right: " + Right +
+ ", Bottom: " + Bottom + "]";
+ }
+ }
+
+ ///
+ /// Determines whether ad events raised by the AppLovin's Unity plugin should be invoked on the Unity main thread.
+ ///
+ public static bool? InvokeEventsOnUnityMainThread { get; set; }
+
+ ///
+ /// The CMP service, which provides direct APIs for interfacing with the Google-certified CMP installed, if any.
+ ///
+ public static MaxCmpService CmpService
+ {
+ get { return MaxCmpService.Instance; }
+ }
+
+ internal static bool DisableAllLogs
+ {
+ get; private set;
+ }
+
+ protected static void ValidateAdUnitIdentifier(string adUnitIdentifier, string debugPurpose)
+ {
+ if (string.IsNullOrEmpty(adUnitIdentifier))
+ {
+ MaxSdkLogger.UserError("No MAX Ads Ad Unit ID specified for: " + debugPurpose);
+ }
+ }
+
+ // Allocate the MaxEventExecutor singleton which handles pushing callbacks from the background to the main thread.
+ protected static void InitializeEventExecutor()
+ {
+ MaxEventExecutor.InitializeIfNeeded();
+ }
+
+ ///
+ /// Generates serialized Unity meta data to be passed to the SDK.
+ ///
+ /// Serialized Unity meta data.
+ protected static string GenerateMetaData()
+ {
+ var metaData = new Dictionary(2);
+ metaData.Add("UnityVersion", Application.unityVersion);
+
+ return Json.Serialize(metaData);
+ }
+
+ ///
+ /// Parses the prop string provided to a .
+ ///
+ /// A prop string representing a Rect
+ /// A the prop string represents.
+ protected static Rect GetRectFromString(string rectPropString)
+ {
+ var rectDict = Json.Deserialize(rectPropString) as Dictionary;
+ var originX = MaxSdkUtils.GetFloatFromDictionary(rectDict, "origin_x", 0);
+ var originY = MaxSdkUtils.GetFloatFromDictionary(rectDict, "origin_y", 0);
+ var width = MaxSdkUtils.GetFloatFromDictionary(rectDict, "width", 0);
+ var height = MaxSdkUtils.GetFloatFromDictionary(rectDict, "height", 0);
+
+ return new Rect(originX, originY, width, height);
+ }
+
+ protected static void HandleExtraParameter(string key, string value)
+ {
+ bool disableAllLogs;
+ if ("disable_all_logs".Equals(key) && bool.TryParse(value, out disableAllLogs))
+ {
+ DisableAllLogs = disableAllLogs;
+ }
+ }
+
+ ///
+ /// Handles forwarding callbacks from native to C#.
+ ///
+ /// A prop string with the event data
+ protected static void HandleBackgroundCallback(string propsStr)
+ {
+ try
+ {
+ MaxSdkCallbacks.ForwardEvent(propsStr);
+ }
+ catch (Exception exception)
+ {
+ var eventProps = Json.Deserialize(propsStr) as Dictionary;
+ if (eventProps == null) return;
+
+ var eventName = MaxSdkUtils.GetStringFromDictionary(eventProps, "name", "");
+ MaxSdkLogger.UserError("Unable to notify ad delegate due to an error in the publisher callback '" + eventName + "' due to exception: " + exception.Message);
+ MaxSdkLogger.LogException(exception);
+ }
+ }
+
+ protected static string SerializeLocalExtraParameterValue(object value)
+ {
+ if (!(value.GetType().IsPrimitive || value is string || value is IList || value is IDictionary))
+ {
+ MaxSdkLogger.UserError("Local extra parameters must be an IList, IDictionary, string, or a primitive type");
+ return "";
+ }
+
+ Dictionary data = new Dictionary
+ {
+ {"value", value}
+ };
+
+ return Json.Serialize(data);
+ }
+
+ #region Obsolete
+
+ [Obsolete("This API has been deprecated and will be removed in a future release. Please use AdViewPosition instead.")]
+ public enum BannerPosition
+ {
+ TopLeft,
+ TopCenter,
+ TopRight,
+ Centered,
+ CenterLeft,
+ CenterRight,
+ BottomLeft,
+ BottomCenter,
+ BottomRight
+ }
+
+ [Obsolete("This API has been deprecated and will be removed in a future release.")]
+ public enum ConsentDialogState
+ {
+ Unknown,
+ Applies,
+ DoesNotApply
+ }
+
+ #endregion
+}
+
+///
+/// An extension class for and enums.
+///
+internal static class AdPositionExtenstion
+{
+ public static string ToSnakeCaseString(this MaxSdkBase.AdViewPosition position)
+ {
+ if (position == MaxSdkBase.AdViewPosition.TopLeft)
+ {
+ return "top_left";
+ }
+ else if (position == MaxSdkBase.AdViewPosition.TopCenter)
+ {
+ return "top_center";
+ }
+ else if (position == MaxSdkBase.AdViewPosition.TopRight)
+ {
+ return "top_right";
+ }
+ else if (position == MaxSdkBase.AdViewPosition.Centered)
+ {
+ return "centered";
+ }
+ else if (position == MaxSdkBase.AdViewPosition.CenterLeft)
+ {
+ return "center_left";
+ }
+ else if (position == MaxSdkBase.AdViewPosition.CenterRight)
+ {
+ return "center_right";
+ }
+ else if (position == MaxSdkBase.AdViewPosition.BottomLeft)
+ {
+ return "bottom_left";
+ }
+ else if (position == MaxSdkBase.AdViewPosition.BottomCenter)
+ {
+ return "bottom_center";
+ }
+ else // position == MaxSdkBase.AdViewPosition.BottomRight
+ {
+ return "bottom_right";
+ }
+ }
+}
diff --git a/Assets/MaxSdk/Scripts/MaxSdkBase.cs.meta b/Assets/MaxSdk/Scripts/MaxSdkBase.cs.meta
new file mode 100644
index 0000000..f27f769
--- /dev/null
+++ b/Assets/MaxSdk/Scripts/MaxSdkBase.cs.meta
@@ -0,0 +1,14 @@
+fileFormatVersion: 2
+guid: 893e4e55a7e394274957f1034f7afc45
+labels:
+- al_max
+- al_max_export_path-MaxSdk/Scripts/MaxSdkBase.cs
+MonoImporter:
+ externalObjects: {}
+ serializedVersion: 2
+ defaultReferences: []
+ executionOrder: 0
+ icon: {instanceID: 0}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/MaxSdk/Scripts/MaxSdkCallbacks.cs b/Assets/MaxSdk/Scripts/MaxSdkCallbacks.cs
new file mode 100644
index 0000000..f5834f0
--- /dev/null
+++ b/Assets/MaxSdk/Scripts/MaxSdkCallbacks.cs
@@ -0,0 +1,1139 @@
+// ReSharper disable RedundantArgumentDefaultValue
+
+using System;
+using System.Collections.Generic;
+using System.Text.RegularExpressions;
+using UnityEngine;
+using AppLovinMax.ThirdParty.MiniJson;
+using AppLovinMax.Internal;
+
+///
+/// This is is a global Unity object that is used to forward callbacks from native iOS / Android Max code to the application.
+///
+public static class MaxSdkCallbacks
+{
+ ///
+ /// Fired when the SDK has finished initializing
+ ///
+ private static Action onSdkInitializedEvent;
+ public static event Action OnSdkInitializedEvent
+ {
+ add
+ {
+ LogSubscribedToEvent("OnSdkInitializedEvent");
+ onSdkInitializedEvent += value;
+ }
+ remove
+ {
+ LogUnsubscribedToEvent("OnSdkInitializedEvent");
+ onSdkInitializedEvent -= value;
+ }
+ }
+
+ ///
+ /// Fired when the application is paused or resumed.
+ ///
+ private static Action onApplicationStateChangedEvent;
+ public static event Action OnApplicationStateChangedEvent
+ {
+ add
+ {
+ LogSubscribedToEvent("OnApplicationStateChangedEvent");
+ onApplicationStateChangedEvent += value;
+ }
+ remove
+ {
+ LogUnsubscribedToEvent("OnApplicationStateChangedEvent");
+ onApplicationStateChangedEvent -= value;
+ }
+ }
+
+ public static class Interstitial
+ {
+ internal static Action onAdLoadedEvent;
+ public static event Action OnAdLoadedEvent
+ {
+ add
+ {
+ LogSubscribedToEvent("OnInterstitialAdLoadedEvent");
+ onAdLoadedEvent += value;
+ }
+ remove
+ {
+ LogUnsubscribedToEvent("OnInterstitialAdLoadedEvent");
+ onAdLoadedEvent -= value;
+ }
+ }
+
+ internal static Action onAdLoadFailedEvent;
+ public static event Action OnAdLoadFailedEvent
+ {
+ add
+ {
+ LogSubscribedToEvent("OnInterstitialAdLoadFailedEvent");
+ onAdLoadFailedEvent += value;
+ }
+ remove
+ {
+ LogUnsubscribedToEvent("OnInterstitialAdLoadFailedEvent");
+ onAdLoadFailedEvent -= value;
+ }
+ }
+
+ ///
+ /// Fired when an interstitial ad is displayed (may not be received by Unity until the interstitial ad closes).
+ ///
+ internal static Action onAdDisplayedEvent;
+ public static event Action OnAdDisplayedEvent
+ {
+ add
+ {
+ LogSubscribedToEvent("OnInterstitialAdDisplayedEvent");
+ onAdDisplayedEvent += value;
+ }
+ remove
+ {
+ LogUnsubscribedToEvent("OnInterstitialAdDisplayedEvent");
+ onAdDisplayedEvent -= value;
+ }
+ }
+
+ internal static Action onAdDisplayFailedEvent;
+ public static event Action OnAdDisplayFailedEvent
+ {
+ add
+ {
+ LogSubscribedToEvent("OnInterstitialAdDisplayFailedEvent");
+ onAdDisplayFailedEvent += value;
+ }
+ remove
+ {
+ LogUnsubscribedToEvent("OnInterstitialAdDisplayFailedEvent");
+ onAdDisplayFailedEvent -= value;
+ }
+ }
+
+ internal static Action onAdClickedEvent;
+ public static event Action OnAdClickedEvent
+ {
+ add
+ {
+ LogSubscribedToEvent("OnInterstitialAdClickedEvent");
+ onAdClickedEvent += value;
+ }
+ remove
+ {
+ LogUnsubscribedToEvent("OnInterstitialAdClickedEvent");
+ onAdClickedEvent -= value;
+ }
+ }
+
+ ///
+ /// Fired when an interstitial ad impression was validated and revenue will be paid.
+ /// Executed on a background thread to avoid any delays in execution.
+ ///
+ internal static Action onAdRevenuePaidEvent;
+ public static event Action OnAdRevenuePaidEvent
+ {
+ add
+ {
+ LogSubscribedToEvent("OnInterstitialAdRevenuePaidEvent");
+ onAdRevenuePaidEvent += value;
+ }
+ remove
+ {
+ LogUnsubscribedToEvent("OnInterstitialAdRevenuePaidEvent");
+ onAdRevenuePaidEvent -= value;
+ }
+ }
+
+ ///
+ /// Fired when an expired interstitial ad is reloaded.
+ ///
+ internal static Action onExpiredAdReloadedEvent;
+ public static event Action OnExpiredAdReloadedEvent
+ {
+ add
+ {
+ LogSubscribedToEvent("OnExpiredInterstitialAdReloadedEvent");
+ onExpiredAdReloadedEvent += value;
+ }
+ remove
+ {
+ LogUnsubscribedToEvent("OnExpiredInterstitialAdReloadedEvent");
+ onExpiredAdReloadedEvent -= value;
+ }
+ }
+
+ ///
+ /// Fired when an Ad Review Creative ID has been generated.
+ /// The parameters returned are the adUnitIdentifier, adReviewCreativeId, and adInfo in that respective order.
+ /// Executed on a background thread to avoid any delays in execution.
+ ///
+ internal static Action onAdReviewCreativeIdGeneratedEvent;
+ public static event Action OnAdReviewCreativeIdGeneratedEvent
+ {
+ add
+ {
+ LogSubscribedToEvent("OnInterstitialAdReviewCreativeIdGeneratedEvent");
+ onAdReviewCreativeIdGeneratedEvent += value;
+ }
+ remove
+ {
+ LogUnsubscribedToEvent("OnInterstitialAdReviewCreativeIdGeneratedEvent");
+ onAdReviewCreativeIdGeneratedEvent -= value;
+ }
+ }
+
+ internal static Action