From 84deb507e41c366e229f103921a05b776ee56caf Mon Sep 17 00:00:00 2001 From: juncong lee Date: Sun, 4 Jan 2026 18:20:54 +0800 Subject: [PATCH] =?UTF-8?q?=E5=88=A0=E9=99=A4bigo/efsdk/kwaisdk/maxsdk?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Assets/BigoAds.meta | 8 - Assets/BigoAds/Scripts.meta | 8 - Assets/BigoAds/Scripts/Api.meta | 8 - Assets/BigoAds/Scripts/Api/BigoAdConfig.cs | 115 - .../BigoAds/Scripts/Api/BigoAdConfig.cs.meta | 11 - Assets/BigoAds/Scripts/Api/BigoAdSdk.cs | 107 - Assets/BigoAds/Scripts/Api/BigoAdSdk.cs.meta | 11 - Assets/BigoAds/Scripts/Api/BigoBannerAd.cs | 30 - .../BigoAds/Scripts/Api/BigoBannerAd.cs.meta | 11 - .../BigoAds/Scripts/Api/BigoBannerRequest.cs | 22 - .../Scripts/Api/BigoBannerRequest.cs.meta | 11 - .../BigoAds/Scripts/Api/BigoInterstitialAd.cs | 11 - .../Scripts/Api/BigoInterstitialAd.cs.meta | 11 - .../Scripts/Api/BigoInterstitialRequest.cs | 10 - .../Api/BigoInterstitialRequest.cs.meta | 11 - Assets/BigoAds/Scripts/Api/BigoNativeAd.cs | 26 - .../BigoAds/Scripts/Api/BigoNativeAd.cs.meta | 11 - .../BigoAds/Scripts/Api/BigoNativeRequest.cs | 10 - .../Scripts/Api/BigoNativeRequest.cs.meta | 11 - Assets/BigoAds/Scripts/Api/BigoPopupAd.cs | 11 - .../BigoAds/Scripts/Api/BigoPopupAd.cs.meta | 11 - .../BigoAds/Scripts/Api/BigoPopupRequest.cs | 10 - .../Scripts/Api/BigoPopupRequest.cs.meta | 11 - Assets/BigoAds/Scripts/Api/BigoRequest.cs | 47 - .../BigoAds/Scripts/Api/BigoRequest.cs.meta | 11 - Assets/BigoAds/Scripts/Api/BigoRewardedAd.cs | 29 - .../Scripts/Api/BigoRewardedAd.cs.meta | 11 - .../Scripts/Api/BigoRewardedRequest.cs | 10 - .../Scripts/Api/BigoRewardedRequest.cs.meta | 11 - Assets/BigoAds/Scripts/Api/BigoSplashAd.cs | 11 - .../BigoAds/Scripts/Api/BigoSplashAd.cs.meta | 11 - .../BigoAds/Scripts/Api/BigoSplashRequest.cs | 10 - .../Scripts/Api/BigoSplashRequest.cs.meta | 11 - Assets/BigoAds/Scripts/Api/Constant.meta | 8 - .../Scripts/Api/Constant/BGAdGender.cs | 10 - .../Scripts/Api/Constant/BGAdGender.cs.meta | 11 - .../Scripts/Api/Constant/BGAdLossReason.cs | 13 - .../Api/Constant/BGAdLossReason.cs.meta | 11 - .../Scripts/Api/Constant/BigoBannerSize.cs | 23 - .../Api/Constant/BigoBannerSize.cs.meta | 11 - .../Scripts/Api/Constant/BigoPosition.cs | 12 - .../Scripts/Api/Constant/BigoPosition.cs.meta | 11 - .../Scripts/Api/Constant/ConsentOptions.cs | 13 - .../Api/Constant/ConsentOptions.cs.meta | 11 - Assets/BigoAds/Scripts/Common.meta | 8 - Assets/BigoAds/Scripts/Common/BigoBaseAd.cs | 218 -- .../BigoAds/Scripts/Common/BigoBaseAd.cs.meta | 11 - .../BigoAds/Scripts/Common/BigoDispatcher.cs | 86 - .../Scripts/Common/BigoDispatcher.cs.meta | 11 - Assets/BigoAds/Scripts/Common/IBannerAd.cs | 10 - .../BigoAds/Scripts/Common/IBannerAd.cs.meta | 11 - Assets/BigoAds/Scripts/Common/IBigoAd.cs | 22 - Assets/BigoAds/Scripts/Common/IBigoAd.cs.meta | 11 - .../BigoAds/Scripts/Common/IClientBidding.cs | 16 - .../Scripts/Common/IClientBidding.cs.meta | 11 - .../BigoAds/Scripts/Common/IClientFactory.cs | 13 - .../Scripts/Common/IClientFactory.cs.meta | 11 - .../BigoAds/Scripts/Common/IInterstitialAd.cs | 8 - .../Scripts/Common/IInterstitialAd.cs.meta | 11 - Assets/BigoAds/Scripts/Common/INativeAd.cs | 10 - .../BigoAds/Scripts/Common/INativeAd.cs.meta | 11 - Assets/BigoAds/Scripts/Common/IPopupAd.cs | 8 - .../BigoAds/Scripts/Common/IPopupAd.cs.meta | 11 - Assets/BigoAds/Scripts/Common/IRewardedAd.cs | 10 - .../Scripts/Common/IRewardedAd.cs.meta | 11 - Assets/BigoAds/Scripts/Common/ISDK.cs | 40 - Assets/BigoAds/Scripts/Common/ISDK.cs.meta | 11 - Assets/BigoAds/Scripts/Common/ISplashAd.cs | 8 - .../BigoAds/Scripts/Common/ISplashAd.cs.meta | 11 - Assets/BigoAds/Scripts/Platforms.meta | 8 - Assets/BigoAds/Scripts/Platforms/Android.meta | 8 - .../Scripts/Platforms/Android/AdHelper.cs | 99 - .../Platforms/Android/AdHelper.cs.meta | 11 - .../Scripts/Platforms/Android/AdHelper.java | 106 - .../Platforms/Android/AdHelper.java.meta | 32 - .../Android/AdInteractionCallback.cs | 53 - .../Android/AdInteractionCallback.cs.meta | 11 - .../Platforms/Android/AdLoadCallback.cs | 33 - .../Platforms/Android/AdLoadCallback.cs.meta | 11 - .../Platforms/Android/AndroidBannerAd.cs | 147 -- .../Platforms/Android/AndroidBannerAd.cs.meta | 11 - .../Platforms/Android/AndroidClientFactory.cs | 49 - .../Android/AndroidClientFactory.cs.meta | 11 - .../Android/AndroidInterstitialAd.cs | 124 - .../Android/AndroidInterstitialAd.cs.meta | 11 - .../Platforms/Android/AndroidNativeAd.cs | 133 -- .../Platforms/Android/AndroidNativeAd.cs.meta | 11 - .../Platforms/Android/AndroidPlatformTool.cs | 101 - .../Android/AndroidPlatformTool.cs.meta | 11 - .../Platforms/Android/AndroidPopupAd.cs | 124 - .../Platforms/Android/AndroidPopupAd.cs.meta | 11 - .../Platforms/Android/AndroidRewardedAd.cs | 125 - .../Android/AndroidRewardedAd.cs.meta | 11 - .../Platforms/Android/AndroidSplashAd.cs | 124 - .../Platforms/Android/AndroidSplashAd.cs.meta | 11 - .../Platforms/Android/BigoSdkClient.cs | 99 - .../Platforms/Android/BigoSdkClient.cs.meta | 11 - .../Android/RewardedAdInteractionCallback.cs | 27 - .../RewardedAdInteractionCallback.cs.meta | 11 - .../Android/SplashAdInteractionCallback.cs | 29 - .../SplashAdInteractionCallback.cs.meta | 11 - Assets/BigoAds/Scripts/Platforms/iOS.meta | 8 - .../Scripts/Platforms/iOS/Adapter.meta | 8 - .../Scripts/Platforms/iOS/Adapter/BigoAd.meta | 8 - .../Platforms/iOS/Adapter/BigoAd/Banner.meta | 8 - .../BigoAd/Banner/BigoUnityBannerAd.cs | 112 - .../BigoAd/Banner/BigoUnityBannerAd.cs.meta | 11 - .../Adapter/BigoAd/Banner/BigoUnityBannerAd.h | 24 - .../BigoAd/Banner/BigoUnityBannerAd.h.meta | 27 - .../BigoAd/Banner/BigoUnityBannerAd.mm | 133 -- .../BigoAd/Banner/BigoUnityBannerAd.mm.meta | 37 - .../iOS/Adapter/BigoAd/BigoIOSBaseAd.cs | 265 --- .../iOS/Adapter/BigoAd/BigoIOSBaseAd.cs.meta | 11 - .../iOS/Adapter/BigoAd/BigoIOSBaseAd.mm | 109 - .../iOS/Adapter/BigoAd/BigoIOSBaseAd.mm.meta | 37 - .../BigoAd/BigoUnityAdHandlerManager.h | 22 - .../BigoAd/BigoUnityAdHandlerManager.h.meta | 27 - .../BigoAd/BigoUnityAdHandlerManager.m | 70 - .../BigoAd/BigoUnityAdHandlerManager.m.meta | 37 - .../Adapter/BigoAd/BigoUnityBaseAdHandler.h | 62 - .../BigoAd/BigoUnityBaseAdHandler.h.meta | 27 - .../Adapter/BigoAd/BigoUnityBaseAdHandler.mm | 170 -- .../BigoAd/BigoUnityBaseAdHandler.mm.meta | 37 - .../iOS/Adapter/BigoAd/BigoUnityConfig.cs | 44 - .../Adapter/BigoAd/BigoUnityConfig.cs.meta | 11 - .../iOS/Adapter/BigoAd/BigoUnityConfig.mm | 30 - .../Adapter/BigoAd/BigoUnityConfig.mm.meta | 37 - .../iOS/Adapter/BigoAd/BigoUnitySdk.cs | 105 - .../iOS/Adapter/BigoAd/BigoUnitySdk.cs.meta | 11 - .../iOS/Adapter/BigoAd/BigoUnitySdk.mm | 58 - .../iOS/Adapter/BigoAd/BigoUnitySdk.mm.meta | 37 - .../iOS/Adapter/BigoAd/BigoUnityTools.cs | 22 - .../iOS/Adapter/BigoAd/BigoUnityTools.cs.meta | 11 - .../iOS/Adapter/BigoAd/Interstitial.meta | 8 - .../Interstitial/BigoUnityInterstitialAd.cs | 17 - .../BigoUnityInterstitialAd.cs.meta | 11 - .../Interstitial/BigoUnityInterstitialAd.h | 17 - .../BigoUnityInterstitialAd.h.meta | 27 - .../Interstitial/BigoUnityInterstitialAd.mm | 67 - .../BigoUnityInterstitialAd.mm.meta | 37 - .../Platforms/iOS/Adapter/BigoAd/Native.meta | 8 - .../BigoAd/Native/BigoUnityNativeAd.cs | 84 - .../BigoAd/Native/BigoUnityNativeAd.cs.meta | 11 - .../Adapter/BigoAd/Native/BigoUnityNativeAd.h | 21 - .../BigoAd/Native/BigoUnityNativeAd.h.meta | 27 - .../BigoAd/Native/BigoUnityNativeAd.mm | 102 - .../BigoAd/Native/BigoUnityNativeAd.mm.meta | 37 - .../BigoAd/Native/BigoUnityNativeCustomView.h | 17 - .../Native/BigoUnityNativeCustomView.h.meta | 27 - .../BigoAd/Native/BigoUnityNativeCustomView.m | 72 - .../Native/BigoUnityNativeCustomView.m.meta | 37 - .../Platforms/iOS/Adapter/BigoAd/Popup.meta | 8 - .../Adapter/BigoAd/Popup/BigoUnityPopupAd.cs | 17 - .../BigoAd/Popup/BigoUnityPopupAd.cs.meta | 11 - .../Adapter/BigoAd/Popup/BigoUnityPopupAd.h | 17 - .../BigoAd/Popup/BigoUnityPopupAd.h.meta | 27 - .../Adapter/BigoAd/Popup/BigoUnityPopupAd.mm | 29 - .../BigoAd/Popup/BigoUnityPopupAd.mm.meta | 37 - .../iOS/Adapter/BigoAd/Rewarded.meta | 8 - .../BigoAd/Rewarded/BigoUnityRewardedAd.cs | 63 - .../Rewarded/BigoUnityRewardedAd.cs.meta | 11 - .../BigoAd/Rewarded/BigoUnityRewardedAd.h | 18 - .../Rewarded/BigoUnityRewardedAd.h.meta | 27 - .../BigoAd/Rewarded/BigoUnityRewardedAd.mm | 69 - .../Rewarded/BigoUnityRewardedAd.mm.meta | 37 - .../Platforms/iOS/Adapter/BigoAd/Splash.meta | 8 - .../BigoAd/Splash/BGSplashAdViewController.h | 24 - .../Splash/BGSplashAdViewController.h.meta | 27 - .../BigoAd/Splash/BGSplashAdViewController.m | 71 - .../Splash/BGSplashAdViewController.m.meta | 37 - .../BigoAd/Splash/BigoUnitySplashAd.cs | 17 - .../BigoAd/Splash/BigoUnitySplashAd.cs.meta | 11 - .../Adapter/BigoAd/Splash/BigoUnitySplashAd.h | 17 - .../BigoAd/Splash/BigoUnitySplashAd.h.meta | 27 - .../BigoAd/Splash/BigoUnitySplashAd.mm | 71 - .../BigoAd/Splash/BigoUnitySplashAd.mm.meta | 37 - .../iOS/Adapter/BigoUnityAdapterTools.h | 6 - .../iOS/Adapter/BigoUnityAdapterTools.h.meta | 27 - .../iOS/Adapter/BigoUnityAdapterTools.mm | 43 - .../iOS/Adapter/BigoUnityAdapterTools.mm.meta | 37 - .../Scripts/Platforms/iOS/IOSClientFactory.cs | 46 - .../Platforms/iOS/IOSClientFactory.cs.meta | 11 - Assets/BigoSDK.meta | 8 - Assets/BigoSDK/Editor.meta | 8 - Assets/BigoSDK/Editor/Dependencies.xml | 13 - Assets/BigoSDK/Editor/Dependencies.xml.meta | 7 - Assets/EFSDK.meta | 8 - Assets/EFSDK/Android.meta | 3 - Assets/EFSDK/Android/res.meta | 3 - Assets/EFSDK/Android/res/drawable-xxhdpi.meta | 3 - .../res/drawable-xxhdpi/_sdk_icon_1024.png | Bin 286361 -> 0 bytes .../drawable-xxhdpi/_sdk_icon_1024.png.meta | 127 - .../res/drawable-xxhdpi/_sdk_notice_1.png | Bin 9675 -> 0 bytes .../drawable-xxhdpi/_sdk_notice_1.png.meta | 127 - .../drawable-xxhdpi/_sdk_notice_1_txt_bg.png | Bin 3440 -> 0 bytes .../_sdk_notice_1_txt_bg.png.meta | 127 - .../res/drawable-xxhdpi/_sdk_notice_2.png | Bin 9622 -> 0 bytes .../drawable-xxhdpi/_sdk_notice_2.png.meta | 127 - .../drawable-xxhdpi/_sdk_notice_2_txt_bg.png | Bin 3440 -> 0 bytes .../_sdk_notice_2_txt_bg.png.meta | 127 - .../res/drawable-xxhdpi/_sdk_notice_3.png | Bin 11820 -> 0 bytes .../drawable-xxhdpi/_sdk_notice_3.png.meta | 127 - .../drawable-xxhdpi/_sdk_notice_3_txt_bg.png | Bin 3440 -> 0 bytes .../_sdk_notice_3_txt_bg.png.meta | 127 - .../res/drawable-xxhdpi/_sdk_notice_4.png | Bin 11663 -> 0 bytes .../drawable-xxhdpi/_sdk_notice_4.png.meta | 127 - .../drawable-xxhdpi/_sdk_notice_4_txt_bg.png | Bin 3440 -> 0 bytes .../_sdk_notice_4_txt_bg.png.meta | 127 - .../drawable-xxhdpi/_sdk_push_big_pic_en.png | Bin 21937 -> 0 bytes .../_sdk_push_big_pic_en.png.meta | 127 - .../drawable-xxhdpi/_sdk_push_big_pic_es.png | Bin 22116 -> 0 bytes .../_sdk_push_big_pic_es.png.meta | 127 - .../res/drawable-xxhdpi/_sdk_toast_bg.png | Bin 91096 -> 0 bytes .../drawable-xxhdpi/_sdk_toast_bg.png.meta | 127 - .../_sdk_widget_big_pic_bg.9.png | Bin 30875 -> 0 bytes .../_sdk_widget_big_pic_bg.9.png.meta | 127 - .../_sdk_widget_big_pic_bx.png | Bin 28683 -> 0 bytes .../_sdk_widget_big_pic_bx.png.meta | 127 - .../res/drawable-xxhdpi/_sdk_widget_bx.png | Bin 9134 -> 0 bytes .../drawable-xxhdpi/_sdk_widget_bx.png.meta | 127 - .../drawable-xxhdpi/_sdk_widget_dollor.png | Bin 10540 -> 0 bytes .../_sdk_widget_dollor.png.meta | 127 - Assets/EFSDK/AutoSetEFSdk.cs | 33 - Assets/EFSDK/AutoSetEFSdk.cs.meta | 3 - Assets/EFSDK/EFSdk.cs | 541 ----- Assets/EFSDK/EFSdk.cs.meta | 11 - Assets/EFSDK/EFSdkAndroid.cs | 96 - Assets/EFSDK/EFSdkAndroid.cs.meta | 3 - Assets/EFSDK/Editor.meta | 3 - Assets/EFSDK/Editor/AndroidResAarBuilder.cs | 237 -- .../EFSDK/Editor/AndroidResAarBuilder.cs.meta | 3 - Assets/EFSDK/Editor/Dependencies.xml | 13 - Assets/EFSDK/Editor/Dependencies.xml.meta | 3 - .../EFSDK/Editor/DynamicApplicationClass.cs | 185 -- .../Editor/DynamicApplicationClass.cs.meta | 3 - Assets/EFSDK/Editor/SDKEditorNetworkTool.cs | 65 - .../EFSDK/Editor/SDKEditorNetworkTool.cs.meta | 3 - Assets/EFSDK/Editor/SDKTool.cs | 300 --- Assets/EFSDK/Editor/SDKTool.cs.meta | 3 - Assets/KwaiAds.meta | 8 - Assets/KwaiAds/Scripts.meta | 8 - Assets/KwaiAds/Scripts/Api.meta | 8 - Assets/KwaiAds/Scripts/Api/Constants.cs | 17 - Assets/KwaiAds/Scripts/Api/Constants.cs.meta | 11 - .../KwaiAds/Scripts/Api/InitResultCallback.cs | 10 - .../Scripts/Api/InitResultCallback.cs.meta | 11 - Assets/KwaiAds/Scripts/Api/Interstitial.meta | 8 - .../Interstitial/IInterstitialAdController.cs | 10 - .../IInterstitialAdController.cs.meta | 11 - .../Interstitial/IInterstitialAdListener.cs | 7 - .../IInterstitialAdListener.cs.meta | 11 - .../IInterstitialAdLoadListener.cs | 7 - .../IInterstitialAdLoadListener.cs.meta | 11 - .../Interstitial/KwaiInterstitialAdRequest.cs | 9 - .../KwaiInterstitialAdRequest.cs.meta | 11 - Assets/KwaiAds/Scripts/Api/KwaiAdConfig.cs | 90 - .../KwaiAds/Scripts/Api/KwaiAdConfig.cs.meta | 11 - Assets/KwaiAds/Scripts/Api/KwaiAdsSdk.cs | 53 - Assets/KwaiAds/Scripts/Api/KwaiAdsSdk.cs.meta | 11 - Assets/KwaiAds/Scripts/Api/KwaiRequest.cs | 25 - .../KwaiAds/Scripts/Api/KwaiRequest.cs.meta | 11 - Assets/KwaiAds/Scripts/Api/Reward.meta | 8 - .../Scripts/Api/Reward/IRewardAdController.cs | 10 - .../Api/Reward/IRewardAdController.cs.meta | 11 - .../Scripts/Api/Reward/IRewardAdListener.cs | 9 - .../Api/Reward/IRewardAdListener.cs.meta | 11 - .../Api/Reward/IRewardAdLoadListener.cs | 8 - .../Api/Reward/IRewardAdLoadListener.cs.meta | 11 - .../Scripts/Api/Reward/KwaiRewardAdRequest.cs | 9 - .../Api/Reward/KwaiRewardAdRequest.cs.meta | 11 - Assets/KwaiAds/Scripts/Common.meta | 8 - Assets/KwaiAds/Scripts/Common/IAdListener.cs | 15 - .../Scripts/Common/IAdListener.cs.meta | 11 - .../KwaiAds/Scripts/Common/IAdLoadListener.cs | 11 - .../Scripts/Common/IAdLoadListener.cs.meta | 11 - .../KwaiAds/Scripts/Common/IClientBidding.cs | 9 - .../Scripts/Common/IClientBidding.cs.meta | 11 - .../KwaiAds/Scripts/Common/IClientFactory.cs | 7 - .../Scripts/Common/IClientFactory.cs.meta | 11 - .../Scripts/Common/IKwaiAdController.cs | 16 - .../Scripts/Common/IKwaiAdController.cs.meta | 11 - Assets/KwaiAds/Scripts/Common/ISDK.cs | 15 - Assets/KwaiAds/Scripts/Common/ISDK.cs.meta | 11 - Assets/KwaiAds/Scripts/Platform.meta | 8 - Assets/KwaiAds/Scripts/Platform/Android.meta | 8 - .../Platform/Android/AndroidClientFactory.cs | 14 - .../Android/AndroidClientFactory.cs.meta | 11 - .../Platform/Android/AndroidPlatformTool.cs | 22 - .../Android/AndroidPlatformTool.cs.meta | 11 - .../Scripts/Platform/Android/KwaiAdSDKInit.cs | 169 -- .../Platform/Android/KwaiAdSDKInit.cs.meta | 11 - .../Android/KwaiInterstitialAdController.cs | 241 -- .../KwaiInterstitialAdController.cs.meta | 11 - .../Android/KwaiRewardAdController.cs | 249 -- .../Android/KwaiRewardAdController.cs.meta | 11 - .../Scripts/Platform/Android/KwaiSdkClient.cs | 27 - .../Platform/Android/KwaiSdkClient.cs.meta | 11 - Assets/MaxSdk.meta | 8 - Assets/MaxSdk/AppLovin.meta | 8 - Assets/MaxSdk/AppLovin/Editor.meta | 8 - .../MaxSdk/AppLovin/Editor/Dependencies.xml | 9 - .../AppLovin/Editor/Dependencies.xml.meta | 10 - Assets/MaxSdk/AppLovin/Plugins.meta | 8 - Assets/MaxSdk/AppLovin/Plugins/Android.meta | 8 - .../Android/applovin-max-unity-plugin.aar | Bin 42483 -> 0 bytes .../applovin-max-unity-plugin.aar.meta | 35 - Assets/MaxSdk/AppLovin/Plugins/iOS.meta | 8 - .../AppLovin/Plugins/iOS/MAUnityAdManager.h | 97 - .../Plugins/iOS/MAUnityAdManager.h.meta | 115 - .../AppLovin/Plugins/iOS/MAUnityAdManager.m | 2067 ----------------- .../Plugins/iOS/MAUnityAdManager.m.meta | 109 - .../AppLovin/Plugins/iOS/MAUnityPlugin.mm | 1081 --------- .../Plugins/iOS/MAUnityPlugin.mm.meta | 109 - Assets/MaxSdk/CHANGELOG.md | 3 - Assets/MaxSdk/CHANGELOG.md.meta | 10 - Assets/MaxSdk/Mediation.meta | 11 - Assets/MaxSdk/Mediation/BigoAds.meta | 8 - Assets/MaxSdk/Mediation/BigoAds/Editor.meta | 11 - .../Mediation/BigoAds/Editor/Dependencies.xml | 9 - .../BigoAds/Editor/Dependencies.xml.meta | 10 - Assets/MaxSdk/Mediation/ByteDance.meta | 8 - Assets/MaxSdk/Mediation/ByteDance/Editor.meta | 11 - .../ByteDance/Editor/Dependencies.xml | 13 - .../ByteDance/Editor/Dependencies.xml.meta | 10 - Assets/MaxSdk/Mediation/Fyber.meta | 8 - Assets/MaxSdk/Mediation/Fyber/Editor.meta | 11 - .../Mediation/Fyber/Editor/Dependencies.xml | 9 - .../Fyber/Editor/Dependencies.xml.meta | 10 - Assets/MaxSdk/Mediation/Google.meta | 8 - Assets/MaxSdk/Mediation/Google/Editor.meta | 11 - .../Mediation/Google/Editor/Dependencies.xml | 10 - .../Google/Editor/Dependencies.xml.meta | 10 - Assets/MaxSdk/Mediation/GoogleAdManager.meta | 8 - .../Mediation/GoogleAdManager/Editor.meta | 11 - .../GoogleAdManager/Editor/Dependencies.xml | 10 - .../Editor/Dependencies.xml.meta | 10 - Assets/MaxSdk/Mediation/MediationAdapters.txt | 2 - .../Mediation/MediationAdapters.txt.meta | 6 - Assets/MaxSdk/Mediation/Mintegral.meta | 8 - Assets/MaxSdk/Mediation/Mintegral/Editor.meta | 11 - .../Mintegral/Editor/Dependencies.xml | 14 - .../Mintegral/Editor/Dependencies.xml.meta | 10 - Assets/MaxSdk/Mediation/Moloco.meta | 8 - Assets/MaxSdk/Mediation/Moloco/Editor.meta | 11 - .../Mediation/Moloco/Editor/Dependencies.xml | 9 - .../Moloco/Editor/Dependencies.xml.meta | 10 - Assets/MaxSdk/Mediation/UnityAds.meta | 8 - Assets/MaxSdk/Mediation/UnityAds/Editor.meta | 11 - .../UnityAds/Editor/Dependencies.xml | 9 - .../UnityAds/Editor/Dependencies.xml.meta | 10 - Assets/MaxSdk/Mediation/Vungle.meta | 8 - Assets/MaxSdk/Mediation/Vungle/Editor.meta | 11 - .../Mediation/Vungle/Editor/Dependencies.xml | 9 - .../Vungle/Editor/Dependencies.xml.meta | 10 - Assets/MaxSdk/Prefabs.meta | 8 - Assets/MaxSdk/Prefabs/BannerBottom.prefab | 402 ---- .../MaxSdk/Prefabs/BannerBottom.prefab.meta | 10 - Assets/MaxSdk/Prefabs/BannerTop.prefab | 402 ---- Assets/MaxSdk/Prefabs/BannerTop.prefab.meta | 10 - Assets/MaxSdk/Prefabs/Interstitial.prefab | 523 ----- .../MaxSdk/Prefabs/Interstitial.prefab.meta | 10 - Assets/MaxSdk/Prefabs/Rewarded.prefab | 795 ------- Assets/MaxSdk/Prefabs/Rewarded.prefab.meta | 10 - Assets/MaxSdk/Resources.meta | 8 - .../MaxSdk/Resources/AppLovinSettings.asset | 20 - .../Resources/AppLovinSettings.asset.meta | 8 - Assets/MaxSdk/Resources/Images.meta | 8 - Assets/MaxSdk/Resources/Images/alert_icon.png | Bin 1154 -> 0 bytes .../Resources/Images/alert_icon.png.meta | 94 - .../Resources/Images/uninstall_icon.png | Bin 159 -> 0 bytes .../Resources/Images/uninstall_icon.png.meta | 94 - .../MaxSdk/Resources/Images/warning_icon.png | Bin 959 -> 0 bytes .../Resources/Images/warning_icon.png.meta | 91 - Assets/MaxSdk/Scripts.meta | 8 - Assets/MaxSdk/Scripts/IntegrationManager.meta | 11 - .../Scripts/IntegrationManager/Editor.meta | 11 - .../Editor/AppLovinAutoUpdater.cs | 172 -- .../Editor/AppLovinAutoUpdater.cs.meta | 14 - .../Editor/AppLovinCommandLine.cs | 94 - .../Editor/AppLovinCommandLine.cs.meta | 14 - .../Editor/AppLovinEditorCoroutine.cs | 91 - .../Editor/AppLovinEditorCoroutine.cs.meta | 14 - .../Editor/AppLovinInitialize.cs | 138 -- .../Editor/AppLovinInitialize.cs.meta | 14 - .../Editor/AppLovinIntegrationManager.cs | 473 ---- .../Editor/AppLovinIntegrationManager.cs.meta | 14 - .../Editor/AppLovinIntegrationManagerUtils.cs | 80 - .../AppLovinIntegrationManagerUtils.cs.meta | 14 - .../AppLovinIntegrationManagerWindow.cs | 1075 --------- .../AppLovinIntegrationManagerWindow.cs.meta | 14 - .../Editor/AppLovinInternalSettings.cs | 307 --- .../Editor/AppLovinInternalSettings.cs.meta | 14 - .../Editor/AppLovinMenuItems.cs | 60 - .../Editor/AppLovinMenuItems.cs.meta | 14 - .../Editor/AppLovinPackageManager.cs | 626 ----- .../Editor/AppLovinPackageManager.cs.meta | 14 - .../Editor/AppLovinPluginMigrationHelper.cs | 168 -- .../AppLovinPluginMigrationHelper.cs.meta | 14 - .../Editor/AppLovinPostProcessAndroid.cs | 497 ---- .../Editor/AppLovinPostProcessAndroid.cs.meta | 14 - .../AppLovinPostProcessAndroidGradle.cs | 78 - .../AppLovinPostProcessAndroidGradle.cs.meta | 14 - .../Editor/AppLovinPostProcessiOS.cs | 731 ------ .../Editor/AppLovinPostProcessiOS.cs.meta | 14 - .../Editor/AppLovinPreProcess.cs | 182 -- .../Editor/AppLovinPreProcess.cs.meta | 14 - .../Editor/AppLovinPreProcessAndroid.cs | 115 - .../Editor/AppLovinPreProcessAndroid.cs.meta | 14 - .../Editor/AppLovinPreProcessiOS.cs | 99 - .../Editor/AppLovinPreProcessiOS.cs.meta | 14 - .../Editor/AppLovinProcessGradleBuildFile.cs | 634 ----- .../AppLovinProcessGradleBuildFile.cs.meta | 14 - .../Editor/AppLovinSettings.cs | 160 -- .../Editor/AppLovinSettings.cs.meta | 14 - .../Editor/AppLovinUpmManifest.cs | 192 -- .../Editor/AppLovinUpmManifest.cs.meta | 15 - .../MaxSdk.IntegrationManager.Editor.asmdef | 10 - ...xSdk.IntegrationManager.Editor.asmdef.meta | 6 - Assets/MaxSdk/Scripts/MaxCmpService.cs | 170 -- Assets/MaxSdk/Scripts/MaxCmpService.cs.meta | 14 - Assets/MaxSdk/Scripts/MaxEventExecutor.cs | 108 - .../MaxSdk/Scripts/MaxEventExecutor.cs.meta | 14 - .../MaxSdk/Scripts/MaxEventSystemChecker.cs | 37 - .../Scripts/MaxEventSystemChecker.cs.meta | 14 - Assets/MaxSdk/Scripts/MaxEvents.cs | 21 - Assets/MaxSdk/Scripts/MaxEvents.cs.meta | 14 - Assets/MaxSdk/Scripts/MaxSdk.Scripts.asmdef | 6 - .../MaxSdk/Scripts/MaxSdk.Scripts.asmdef.meta | 10 - Assets/MaxSdk/Scripts/MaxSdk.cs | 26 - Assets/MaxSdk/Scripts/MaxSdk.cs.meta | 14 - Assets/MaxSdk/Scripts/MaxSdkAndroid.cs | 984 -------- Assets/MaxSdk/Scripts/MaxSdkAndroid.cs.meta | 14 - Assets/MaxSdk/Scripts/MaxSdkBase.cs | 833 ------- Assets/MaxSdk/Scripts/MaxSdkBase.cs.meta | 14 - Assets/MaxSdk/Scripts/MaxSdkCallbacks.cs | 1139 --------- Assets/MaxSdk/Scripts/MaxSdkCallbacks.cs.meta | 14 - Assets/MaxSdk/Scripts/MaxSdkLogger.cs | 84 - Assets/MaxSdk/Scripts/MaxSdkLogger.cs.meta | 14 - Assets/MaxSdk/Scripts/MaxSdkUnityEditor.cs | 1240 ---------- .../MaxSdk/Scripts/MaxSdkUnityEditor.cs.meta | 14 - Assets/MaxSdk/Scripts/MaxSdkUtils.cs | 605 ----- Assets/MaxSdk/Scripts/MaxSdkUtils.cs.meta | 14 - Assets/MaxSdk/Scripts/MaxSdkiOS.cs | 1230 ---------- Assets/MaxSdk/Scripts/MaxSdkiOS.cs.meta | 14 - Assets/MaxSdk/Scripts/MaxSegmentCollection.cs | 91 - .../Scripts/MaxSegmentCollection.cs.meta | 14 - Assets/MaxSdk/Scripts/MaxTargetingData.cs | 1 - .../MaxSdk/Scripts/MaxTargetingData.cs.meta | 14 - Assets/MaxSdk/Scripts/MaxUserSegment.cs | 1 - Assets/MaxSdk/Scripts/MaxUserSegment.cs.meta | 14 - .../MaxSdk/Scripts/MaxUserServiceAndroid.cs | 1 - .../Scripts/MaxUserServiceAndroid.cs.meta | 14 - .../Scripts/MaxUserServiceUnityEditor.cs | 1 - .../Scripts/MaxUserServiceUnityEditor.cs.meta | 14 - Assets/MaxSdk/Scripts/MaxUserServiceiOS.cs | 1 - .../MaxSdk/Scripts/MaxUserServiceiOS.cs.meta | 14 - Assets/MaxSdk/Scripts/ThirdParty.meta | 11 - Assets/MaxSdk/Scripts/ThirdParty/MiniJSON.cs | 683 ------ .../Scripts/ThirdParty/MiniJSON.cs.meta | 14 - .../AdmobAdsManager/AdmobAdsManager.cs | 24 +- .../AdmobAdsManager/AdmobNativeAdManager.cs | 1 - .../SDKManager/AdsSDKManager/AdsSDKManager.cs | 322 +-- .../AdsSDKManager/BigoAdsManager.meta | 8 - .../BigoAdsManager/BigoAdsManager.cs | 285 --- .../BigoAdsManager/BigoAdsManager.cs.meta | 11 - .../BigoInterstitialAdManager.cs | 198 -- .../BigoInterstitialAdManager.cs.meta | 2 - .../BigoAdsManager/BigoRewardedAdManager.cs | 207 -- .../BigoRewardedAdManager.cs.meta | 11 - .../AdsSDKManager/KwaiAdsManager.meta | 8 - .../AdsSDKManager/KwaiAdsManager/Data.meta | 8 - .../Data/KwaiAdsConfigParser.cs | 101 - .../Data/KwaiAdsConfigParser.cs.meta | 11 - .../KwaiAdsManager/KwaiAdsManager.cs | 310 --- .../KwaiAdsManager/KwaiAdsManager.cs.meta | 11 - .../KwaiAdsManager/KwaiFloorIvManager.cs | 282 --- .../KwaiAdsManager/KwaiFloorIvManager.cs.meta | 11 - .../KwaiAdsManager/KwaiFloorRvManager.cs | 278 --- .../KwaiAdsManager/KwaiFloorRvManager.cs.meta | 11 - .../KwaiAdsManager/Listener.meta | 8 - .../Listener/InitResultCallbackImpl.cs | 19 - .../Listener/InitResultCallbackImpl.cs.meta | 3 - .../KwaiAdsManager/Listener/Inter.meta | 8 - .../KwaiAdsManager/Listener/Inter/Floor.meta | 8 - .../Inter/Floor/FloorInterAdListener.cs | 67 - .../Inter/Floor/FloorInterAdListener.cs.meta | 11 - .../Inter/Floor/FloorInterAdLoadListener.cs | 51 - .../Floor/FloorInterAdLoadListener.cs.meta | 11 - .../Listener/Inter/Standard.meta | 8 - .../Inter/Standard/InterstitialAdListener.cs | 55 - .../Standard/InterstitialAdListener.cs.meta | 3 - .../Standard/InterstitialAdLoadListener.cs | 45 - .../InterstitialAdLoadListener.cs.meta | 3 - .../KwaiAdsManager/Listener/Reward.meta | 8 - .../KwaiAdsManager/Listener/Reward/Floor.meta | 8 - .../Reward/Floor/FloorRewardAdListener.cs | 76 - .../Floor/FloorRewardAdListener.cs.meta | 11 - .../Reward/Floor/FloorRewardAdLoadListener.cs | 48 - .../Floor/FloorRewardAdLoadListener.cs.meta | 11 - .../Listener/Reward/Standard.meta | 8 - .../Reward/Standard/RewardAdListener.cs | 63 - .../Reward/Standard/RewardAdListener.cs.meta | 3 - .../Reward/Standard/RewardAdLoadListener.cs | 44 - .../Standard/RewardAdLoadListener.cs.meta | 3 - .../AdsSDKManager/MaxAdsManager.meta | 8 - .../MaxAdsManager/MaxAdsManager.cs | 453 ---- .../MaxAdsManager/MaxAdsManager.cs.meta | 11 - .../TpnAdsManager/TpnAdsManager.cs | 18 +- .../AdsSDKManager/Utils/AdConfigParser.cs | 8 +- Assets/Script/SDKManager/EFSdkManager.meta | 3 - .../SDKManager/EFSdkManager/EFSdkManager.cs | 131 -- .../EFSdkManager/EFSdkManager.cs.meta | 3 - .../FireBaseRemoteConfigManager.cs | 10 +- Assets/Script/SDKManager/RushSDKManager.cs | 433 ---- .../TransferManager/TransferAndroidClass.cs | 4 +- Assets/{EFSDK => Script/Utils}/WLoom.cs | 2 +- Assets/{EFSDK => Script/Utils}/WLoom.cs.meta | 0 517 files changed, 39 insertions(+), 35207 deletions(-) delete mode 100644 Assets/BigoAds.meta delete mode 100644 Assets/BigoAds/Scripts.meta delete mode 100644 Assets/BigoAds/Scripts/Api.meta delete mode 100644 Assets/BigoAds/Scripts/Api/BigoAdConfig.cs delete mode 100644 Assets/BigoAds/Scripts/Api/BigoAdConfig.cs.meta delete mode 100644 Assets/BigoAds/Scripts/Api/BigoAdSdk.cs delete mode 100644 Assets/BigoAds/Scripts/Api/BigoAdSdk.cs.meta delete mode 100644 Assets/BigoAds/Scripts/Api/BigoBannerAd.cs delete mode 100644 Assets/BigoAds/Scripts/Api/BigoBannerAd.cs.meta delete mode 100644 Assets/BigoAds/Scripts/Api/BigoBannerRequest.cs delete mode 100644 Assets/BigoAds/Scripts/Api/BigoBannerRequest.cs.meta delete mode 100644 Assets/BigoAds/Scripts/Api/BigoInterstitialAd.cs delete mode 100644 Assets/BigoAds/Scripts/Api/BigoInterstitialAd.cs.meta delete mode 100644 Assets/BigoAds/Scripts/Api/BigoInterstitialRequest.cs delete mode 100644 Assets/BigoAds/Scripts/Api/BigoInterstitialRequest.cs.meta delete mode 100644 Assets/BigoAds/Scripts/Api/BigoNativeAd.cs delete mode 100644 Assets/BigoAds/Scripts/Api/BigoNativeAd.cs.meta delete mode 100644 Assets/BigoAds/Scripts/Api/BigoNativeRequest.cs delete mode 100644 Assets/BigoAds/Scripts/Api/BigoNativeRequest.cs.meta delete mode 100644 Assets/BigoAds/Scripts/Api/BigoPopupAd.cs delete mode 100644 Assets/BigoAds/Scripts/Api/BigoPopupAd.cs.meta delete mode 100644 Assets/BigoAds/Scripts/Api/BigoPopupRequest.cs delete mode 100644 Assets/BigoAds/Scripts/Api/BigoPopupRequest.cs.meta delete mode 100644 Assets/BigoAds/Scripts/Api/BigoRequest.cs delete mode 100644 Assets/BigoAds/Scripts/Api/BigoRequest.cs.meta delete mode 100644 Assets/BigoAds/Scripts/Api/BigoRewardedAd.cs delete mode 100644 Assets/BigoAds/Scripts/Api/BigoRewardedAd.cs.meta delete mode 100644 Assets/BigoAds/Scripts/Api/BigoRewardedRequest.cs delete mode 100644 Assets/BigoAds/Scripts/Api/BigoRewardedRequest.cs.meta delete mode 100644 Assets/BigoAds/Scripts/Api/BigoSplashAd.cs delete mode 100644 Assets/BigoAds/Scripts/Api/BigoSplashAd.cs.meta delete mode 100644 Assets/BigoAds/Scripts/Api/BigoSplashRequest.cs delete mode 100644 Assets/BigoAds/Scripts/Api/BigoSplashRequest.cs.meta delete mode 100644 Assets/BigoAds/Scripts/Api/Constant.meta delete mode 100644 Assets/BigoAds/Scripts/Api/Constant/BGAdGender.cs delete mode 100644 Assets/BigoAds/Scripts/Api/Constant/BGAdGender.cs.meta delete mode 100644 Assets/BigoAds/Scripts/Api/Constant/BGAdLossReason.cs delete mode 100644 Assets/BigoAds/Scripts/Api/Constant/BGAdLossReason.cs.meta delete mode 100644 Assets/BigoAds/Scripts/Api/Constant/BigoBannerSize.cs delete mode 100644 Assets/BigoAds/Scripts/Api/Constant/BigoBannerSize.cs.meta delete mode 100644 Assets/BigoAds/Scripts/Api/Constant/BigoPosition.cs delete mode 100644 Assets/BigoAds/Scripts/Api/Constant/BigoPosition.cs.meta delete mode 100644 Assets/BigoAds/Scripts/Api/Constant/ConsentOptions.cs delete mode 100644 Assets/BigoAds/Scripts/Api/Constant/ConsentOptions.cs.meta delete mode 100644 Assets/BigoAds/Scripts/Common.meta delete mode 100644 Assets/BigoAds/Scripts/Common/BigoBaseAd.cs delete mode 100644 Assets/BigoAds/Scripts/Common/BigoBaseAd.cs.meta delete mode 100644 Assets/BigoAds/Scripts/Common/BigoDispatcher.cs delete mode 100644 Assets/BigoAds/Scripts/Common/BigoDispatcher.cs.meta delete mode 100644 Assets/BigoAds/Scripts/Common/IBannerAd.cs delete mode 100644 Assets/BigoAds/Scripts/Common/IBannerAd.cs.meta delete mode 100644 Assets/BigoAds/Scripts/Common/IBigoAd.cs delete mode 100644 Assets/BigoAds/Scripts/Common/IBigoAd.cs.meta delete mode 100644 Assets/BigoAds/Scripts/Common/IClientBidding.cs delete mode 100644 Assets/BigoAds/Scripts/Common/IClientBidding.cs.meta delete mode 100644 Assets/BigoAds/Scripts/Common/IClientFactory.cs delete mode 100644 Assets/BigoAds/Scripts/Common/IClientFactory.cs.meta delete mode 100644 Assets/BigoAds/Scripts/Common/IInterstitialAd.cs delete mode 100644 Assets/BigoAds/Scripts/Common/IInterstitialAd.cs.meta delete mode 100644 Assets/BigoAds/Scripts/Common/INativeAd.cs delete mode 100644 Assets/BigoAds/Scripts/Common/INativeAd.cs.meta delete mode 100644 Assets/BigoAds/Scripts/Common/IPopupAd.cs delete mode 100644 Assets/BigoAds/Scripts/Common/IPopupAd.cs.meta delete mode 100644 Assets/BigoAds/Scripts/Common/IRewardedAd.cs delete mode 100644 Assets/BigoAds/Scripts/Common/IRewardedAd.cs.meta delete mode 100644 Assets/BigoAds/Scripts/Common/ISDK.cs delete mode 100644 Assets/BigoAds/Scripts/Common/ISDK.cs.meta delete mode 100644 Assets/BigoAds/Scripts/Common/ISplashAd.cs delete mode 100644 Assets/BigoAds/Scripts/Common/ISplashAd.cs.meta delete mode 100644 Assets/BigoAds/Scripts/Platforms.meta delete mode 100644 Assets/BigoAds/Scripts/Platforms/Android.meta delete mode 100644 Assets/BigoAds/Scripts/Platforms/Android/AdHelper.cs delete mode 100644 Assets/BigoAds/Scripts/Platforms/Android/AdHelper.cs.meta delete mode 100755 Assets/BigoAds/Scripts/Platforms/Android/AdHelper.java delete mode 100644 Assets/BigoAds/Scripts/Platforms/Android/AdHelper.java.meta delete mode 100644 Assets/BigoAds/Scripts/Platforms/Android/AdInteractionCallback.cs delete mode 100644 Assets/BigoAds/Scripts/Platforms/Android/AdInteractionCallback.cs.meta delete mode 100644 Assets/BigoAds/Scripts/Platforms/Android/AdLoadCallback.cs delete mode 100644 Assets/BigoAds/Scripts/Platforms/Android/AdLoadCallback.cs.meta delete mode 100644 Assets/BigoAds/Scripts/Platforms/Android/AndroidBannerAd.cs delete mode 100644 Assets/BigoAds/Scripts/Platforms/Android/AndroidBannerAd.cs.meta delete mode 100644 Assets/BigoAds/Scripts/Platforms/Android/AndroidClientFactory.cs delete mode 100644 Assets/BigoAds/Scripts/Platforms/Android/AndroidClientFactory.cs.meta delete mode 100644 Assets/BigoAds/Scripts/Platforms/Android/AndroidInterstitialAd.cs delete mode 100644 Assets/BigoAds/Scripts/Platforms/Android/AndroidInterstitialAd.cs.meta delete mode 100644 Assets/BigoAds/Scripts/Platforms/Android/AndroidNativeAd.cs delete mode 100644 Assets/BigoAds/Scripts/Platforms/Android/AndroidNativeAd.cs.meta delete mode 100644 Assets/BigoAds/Scripts/Platforms/Android/AndroidPlatformTool.cs delete mode 100644 Assets/BigoAds/Scripts/Platforms/Android/AndroidPlatformTool.cs.meta delete mode 100644 Assets/BigoAds/Scripts/Platforms/Android/AndroidPopupAd.cs delete mode 100644 Assets/BigoAds/Scripts/Platforms/Android/AndroidPopupAd.cs.meta delete mode 100644 Assets/BigoAds/Scripts/Platforms/Android/AndroidRewardedAd.cs delete mode 100644 Assets/BigoAds/Scripts/Platforms/Android/AndroidRewardedAd.cs.meta delete mode 100644 Assets/BigoAds/Scripts/Platforms/Android/AndroidSplashAd.cs delete mode 100644 Assets/BigoAds/Scripts/Platforms/Android/AndroidSplashAd.cs.meta delete mode 100644 Assets/BigoAds/Scripts/Platforms/Android/BigoSdkClient.cs delete mode 100644 Assets/BigoAds/Scripts/Platforms/Android/BigoSdkClient.cs.meta delete mode 100644 Assets/BigoAds/Scripts/Platforms/Android/RewardedAdInteractionCallback.cs delete mode 100644 Assets/BigoAds/Scripts/Platforms/Android/RewardedAdInteractionCallback.cs.meta delete mode 100644 Assets/BigoAds/Scripts/Platforms/Android/SplashAdInteractionCallback.cs delete mode 100644 Assets/BigoAds/Scripts/Platforms/Android/SplashAdInteractionCallback.cs.meta delete mode 100644 Assets/BigoAds/Scripts/Platforms/iOS.meta delete mode 100644 Assets/BigoAds/Scripts/Platforms/iOS/Adapter.meta delete mode 100644 Assets/BigoAds/Scripts/Platforms/iOS/Adapter/BigoAd.meta delete mode 100644 Assets/BigoAds/Scripts/Platforms/iOS/Adapter/BigoAd/Banner.meta delete mode 100644 Assets/BigoAds/Scripts/Platforms/iOS/Adapter/BigoAd/Banner/BigoUnityBannerAd.cs delete mode 100644 Assets/BigoAds/Scripts/Platforms/iOS/Adapter/BigoAd/Banner/BigoUnityBannerAd.cs.meta delete mode 100644 Assets/BigoAds/Scripts/Platforms/iOS/Adapter/BigoAd/Banner/BigoUnityBannerAd.h delete mode 100644 Assets/BigoAds/Scripts/Platforms/iOS/Adapter/BigoAd/Banner/BigoUnityBannerAd.h.meta delete mode 100644 Assets/BigoAds/Scripts/Platforms/iOS/Adapter/BigoAd/Banner/BigoUnityBannerAd.mm delete mode 100644 Assets/BigoAds/Scripts/Platforms/iOS/Adapter/BigoAd/Banner/BigoUnityBannerAd.mm.meta delete mode 100644 Assets/BigoAds/Scripts/Platforms/iOS/Adapter/BigoAd/BigoIOSBaseAd.cs delete mode 100644 Assets/BigoAds/Scripts/Platforms/iOS/Adapter/BigoAd/BigoIOSBaseAd.cs.meta delete mode 100644 Assets/BigoAds/Scripts/Platforms/iOS/Adapter/BigoAd/BigoIOSBaseAd.mm delete mode 100644 Assets/BigoAds/Scripts/Platforms/iOS/Adapter/BigoAd/BigoIOSBaseAd.mm.meta delete mode 100644 Assets/BigoAds/Scripts/Platforms/iOS/Adapter/BigoAd/BigoUnityAdHandlerManager.h delete mode 100644 Assets/BigoAds/Scripts/Platforms/iOS/Adapter/BigoAd/BigoUnityAdHandlerManager.h.meta delete mode 100644 Assets/BigoAds/Scripts/Platforms/iOS/Adapter/BigoAd/BigoUnityAdHandlerManager.m delete mode 100644 Assets/BigoAds/Scripts/Platforms/iOS/Adapter/BigoAd/BigoUnityAdHandlerManager.m.meta delete mode 100644 Assets/BigoAds/Scripts/Platforms/iOS/Adapter/BigoAd/BigoUnityBaseAdHandler.h delete mode 100644 Assets/BigoAds/Scripts/Platforms/iOS/Adapter/BigoAd/BigoUnityBaseAdHandler.h.meta delete mode 100644 Assets/BigoAds/Scripts/Platforms/iOS/Adapter/BigoAd/BigoUnityBaseAdHandler.mm delete mode 100644 Assets/BigoAds/Scripts/Platforms/iOS/Adapter/BigoAd/BigoUnityBaseAdHandler.mm.meta delete mode 100644 Assets/BigoAds/Scripts/Platforms/iOS/Adapter/BigoAd/BigoUnityConfig.cs delete mode 100644 Assets/BigoAds/Scripts/Platforms/iOS/Adapter/BigoAd/BigoUnityConfig.cs.meta delete mode 100644 Assets/BigoAds/Scripts/Platforms/iOS/Adapter/BigoAd/BigoUnityConfig.mm delete mode 100644 Assets/BigoAds/Scripts/Platforms/iOS/Adapter/BigoAd/BigoUnityConfig.mm.meta delete mode 100644 Assets/BigoAds/Scripts/Platforms/iOS/Adapter/BigoAd/BigoUnitySdk.cs delete mode 100644 Assets/BigoAds/Scripts/Platforms/iOS/Adapter/BigoAd/BigoUnitySdk.cs.meta delete mode 100644 Assets/BigoAds/Scripts/Platforms/iOS/Adapter/BigoAd/BigoUnitySdk.mm delete mode 100644 Assets/BigoAds/Scripts/Platforms/iOS/Adapter/BigoAd/BigoUnitySdk.mm.meta delete mode 100644 Assets/BigoAds/Scripts/Platforms/iOS/Adapter/BigoAd/BigoUnityTools.cs delete mode 100644 Assets/BigoAds/Scripts/Platforms/iOS/Adapter/BigoAd/BigoUnityTools.cs.meta delete mode 100644 Assets/BigoAds/Scripts/Platforms/iOS/Adapter/BigoAd/Interstitial.meta delete mode 100644 Assets/BigoAds/Scripts/Platforms/iOS/Adapter/BigoAd/Interstitial/BigoUnityInterstitialAd.cs delete mode 100644 Assets/BigoAds/Scripts/Platforms/iOS/Adapter/BigoAd/Interstitial/BigoUnityInterstitialAd.cs.meta delete mode 100644 Assets/BigoAds/Scripts/Platforms/iOS/Adapter/BigoAd/Interstitial/BigoUnityInterstitialAd.h delete mode 100644 Assets/BigoAds/Scripts/Platforms/iOS/Adapter/BigoAd/Interstitial/BigoUnityInterstitialAd.h.meta delete mode 100644 Assets/BigoAds/Scripts/Platforms/iOS/Adapter/BigoAd/Interstitial/BigoUnityInterstitialAd.mm delete mode 100644 Assets/BigoAds/Scripts/Platforms/iOS/Adapter/BigoAd/Interstitial/BigoUnityInterstitialAd.mm.meta delete mode 100644 Assets/BigoAds/Scripts/Platforms/iOS/Adapter/BigoAd/Native.meta delete mode 100644 Assets/BigoAds/Scripts/Platforms/iOS/Adapter/BigoAd/Native/BigoUnityNativeAd.cs delete mode 100644 Assets/BigoAds/Scripts/Platforms/iOS/Adapter/BigoAd/Native/BigoUnityNativeAd.cs.meta delete mode 100644 Assets/BigoAds/Scripts/Platforms/iOS/Adapter/BigoAd/Native/BigoUnityNativeAd.h delete mode 100644 Assets/BigoAds/Scripts/Platforms/iOS/Adapter/BigoAd/Native/BigoUnityNativeAd.h.meta delete mode 100644 Assets/BigoAds/Scripts/Platforms/iOS/Adapter/BigoAd/Native/BigoUnityNativeAd.mm delete mode 100644 Assets/BigoAds/Scripts/Platforms/iOS/Adapter/BigoAd/Native/BigoUnityNativeAd.mm.meta delete mode 100644 Assets/BigoAds/Scripts/Platforms/iOS/Adapter/BigoAd/Native/BigoUnityNativeCustomView.h delete mode 100644 Assets/BigoAds/Scripts/Platforms/iOS/Adapter/BigoAd/Native/BigoUnityNativeCustomView.h.meta delete mode 100644 Assets/BigoAds/Scripts/Platforms/iOS/Adapter/BigoAd/Native/BigoUnityNativeCustomView.m delete mode 100644 Assets/BigoAds/Scripts/Platforms/iOS/Adapter/BigoAd/Native/BigoUnityNativeCustomView.m.meta delete mode 100644 Assets/BigoAds/Scripts/Platforms/iOS/Adapter/BigoAd/Popup.meta delete mode 100644 Assets/BigoAds/Scripts/Platforms/iOS/Adapter/BigoAd/Popup/BigoUnityPopupAd.cs delete mode 100644 Assets/BigoAds/Scripts/Platforms/iOS/Adapter/BigoAd/Popup/BigoUnityPopupAd.cs.meta delete mode 100644 Assets/BigoAds/Scripts/Platforms/iOS/Adapter/BigoAd/Popup/BigoUnityPopupAd.h delete mode 100644 Assets/BigoAds/Scripts/Platforms/iOS/Adapter/BigoAd/Popup/BigoUnityPopupAd.h.meta delete mode 100644 Assets/BigoAds/Scripts/Platforms/iOS/Adapter/BigoAd/Popup/BigoUnityPopupAd.mm delete mode 100644 Assets/BigoAds/Scripts/Platforms/iOS/Adapter/BigoAd/Popup/BigoUnityPopupAd.mm.meta delete mode 100644 Assets/BigoAds/Scripts/Platforms/iOS/Adapter/BigoAd/Rewarded.meta delete mode 100644 Assets/BigoAds/Scripts/Platforms/iOS/Adapter/BigoAd/Rewarded/BigoUnityRewardedAd.cs delete mode 100644 Assets/BigoAds/Scripts/Platforms/iOS/Adapter/BigoAd/Rewarded/BigoUnityRewardedAd.cs.meta delete mode 100644 Assets/BigoAds/Scripts/Platforms/iOS/Adapter/BigoAd/Rewarded/BigoUnityRewardedAd.h delete mode 100644 Assets/BigoAds/Scripts/Platforms/iOS/Adapter/BigoAd/Rewarded/BigoUnityRewardedAd.h.meta delete mode 100644 Assets/BigoAds/Scripts/Platforms/iOS/Adapter/BigoAd/Rewarded/BigoUnityRewardedAd.mm delete mode 100644 Assets/BigoAds/Scripts/Platforms/iOS/Adapter/BigoAd/Rewarded/BigoUnityRewardedAd.mm.meta delete mode 100644 Assets/BigoAds/Scripts/Platforms/iOS/Adapter/BigoAd/Splash.meta delete mode 100644 Assets/BigoAds/Scripts/Platforms/iOS/Adapter/BigoAd/Splash/BGSplashAdViewController.h delete mode 100644 Assets/BigoAds/Scripts/Platforms/iOS/Adapter/BigoAd/Splash/BGSplashAdViewController.h.meta delete mode 100644 Assets/BigoAds/Scripts/Platforms/iOS/Adapter/BigoAd/Splash/BGSplashAdViewController.m delete mode 100644 Assets/BigoAds/Scripts/Platforms/iOS/Adapter/BigoAd/Splash/BGSplashAdViewController.m.meta delete mode 100644 Assets/BigoAds/Scripts/Platforms/iOS/Adapter/BigoAd/Splash/BigoUnitySplashAd.cs delete mode 100644 Assets/BigoAds/Scripts/Platforms/iOS/Adapter/BigoAd/Splash/BigoUnitySplashAd.cs.meta delete mode 100644 Assets/BigoAds/Scripts/Platforms/iOS/Adapter/BigoAd/Splash/BigoUnitySplashAd.h delete mode 100644 Assets/BigoAds/Scripts/Platforms/iOS/Adapter/BigoAd/Splash/BigoUnitySplashAd.h.meta delete mode 100644 Assets/BigoAds/Scripts/Platforms/iOS/Adapter/BigoAd/Splash/BigoUnitySplashAd.mm delete mode 100644 Assets/BigoAds/Scripts/Platforms/iOS/Adapter/BigoAd/Splash/BigoUnitySplashAd.mm.meta delete mode 100644 Assets/BigoAds/Scripts/Platforms/iOS/Adapter/BigoUnityAdapterTools.h delete mode 100644 Assets/BigoAds/Scripts/Platforms/iOS/Adapter/BigoUnityAdapterTools.h.meta delete mode 100644 Assets/BigoAds/Scripts/Platforms/iOS/Adapter/BigoUnityAdapterTools.mm delete mode 100644 Assets/BigoAds/Scripts/Platforms/iOS/Adapter/BigoUnityAdapterTools.mm.meta delete mode 100644 Assets/BigoAds/Scripts/Platforms/iOS/IOSClientFactory.cs delete mode 100644 Assets/BigoAds/Scripts/Platforms/iOS/IOSClientFactory.cs.meta delete mode 100644 Assets/BigoSDK.meta delete mode 100644 Assets/BigoSDK/Editor.meta delete mode 100644 Assets/BigoSDK/Editor/Dependencies.xml delete mode 100644 Assets/BigoSDK/Editor/Dependencies.xml.meta delete mode 100644 Assets/EFSDK.meta delete mode 100755 Assets/EFSDK/Android.meta delete mode 100755 Assets/EFSDK/Android/res.meta delete mode 100644 Assets/EFSDK/Android/res/drawable-xxhdpi.meta delete mode 100644 Assets/EFSDK/Android/res/drawable-xxhdpi/_sdk_icon_1024.png delete mode 100644 Assets/EFSDK/Android/res/drawable-xxhdpi/_sdk_icon_1024.png.meta delete mode 100644 Assets/EFSDK/Android/res/drawable-xxhdpi/_sdk_notice_1.png delete mode 100644 Assets/EFSDK/Android/res/drawable-xxhdpi/_sdk_notice_1.png.meta delete mode 100644 Assets/EFSDK/Android/res/drawable-xxhdpi/_sdk_notice_1_txt_bg.png delete mode 100644 Assets/EFSDK/Android/res/drawable-xxhdpi/_sdk_notice_1_txt_bg.png.meta delete mode 100644 Assets/EFSDK/Android/res/drawable-xxhdpi/_sdk_notice_2.png delete mode 100644 Assets/EFSDK/Android/res/drawable-xxhdpi/_sdk_notice_2.png.meta delete mode 100644 Assets/EFSDK/Android/res/drawable-xxhdpi/_sdk_notice_2_txt_bg.png delete mode 100644 Assets/EFSDK/Android/res/drawable-xxhdpi/_sdk_notice_2_txt_bg.png.meta delete mode 100644 Assets/EFSDK/Android/res/drawable-xxhdpi/_sdk_notice_3.png delete mode 100644 Assets/EFSDK/Android/res/drawable-xxhdpi/_sdk_notice_3.png.meta delete mode 100644 Assets/EFSDK/Android/res/drawable-xxhdpi/_sdk_notice_3_txt_bg.png delete mode 100644 Assets/EFSDK/Android/res/drawable-xxhdpi/_sdk_notice_3_txt_bg.png.meta delete mode 100644 Assets/EFSDK/Android/res/drawable-xxhdpi/_sdk_notice_4.png delete mode 100644 Assets/EFSDK/Android/res/drawable-xxhdpi/_sdk_notice_4.png.meta delete mode 100644 Assets/EFSDK/Android/res/drawable-xxhdpi/_sdk_notice_4_txt_bg.png delete mode 100644 Assets/EFSDK/Android/res/drawable-xxhdpi/_sdk_notice_4_txt_bg.png.meta delete mode 100644 Assets/EFSDK/Android/res/drawable-xxhdpi/_sdk_push_big_pic_en.png delete mode 100644 Assets/EFSDK/Android/res/drawable-xxhdpi/_sdk_push_big_pic_en.png.meta delete mode 100644 Assets/EFSDK/Android/res/drawable-xxhdpi/_sdk_push_big_pic_es.png delete mode 100644 Assets/EFSDK/Android/res/drawable-xxhdpi/_sdk_push_big_pic_es.png.meta delete mode 100644 Assets/EFSDK/Android/res/drawable-xxhdpi/_sdk_toast_bg.png delete mode 100644 Assets/EFSDK/Android/res/drawable-xxhdpi/_sdk_toast_bg.png.meta delete mode 100644 Assets/EFSDK/Android/res/drawable-xxhdpi/_sdk_widget_big_pic_bg.9.png delete mode 100644 Assets/EFSDK/Android/res/drawable-xxhdpi/_sdk_widget_big_pic_bg.9.png.meta delete mode 100644 Assets/EFSDK/Android/res/drawable-xxhdpi/_sdk_widget_big_pic_bx.png delete mode 100644 Assets/EFSDK/Android/res/drawable-xxhdpi/_sdk_widget_big_pic_bx.png.meta delete mode 100644 Assets/EFSDK/Android/res/drawable-xxhdpi/_sdk_widget_bx.png delete mode 100644 Assets/EFSDK/Android/res/drawable-xxhdpi/_sdk_widget_bx.png.meta delete mode 100644 Assets/EFSDK/Android/res/drawable-xxhdpi/_sdk_widget_dollor.png delete mode 100644 Assets/EFSDK/Android/res/drawable-xxhdpi/_sdk_widget_dollor.png.meta delete mode 100755 Assets/EFSDK/AutoSetEFSdk.cs delete mode 100755 Assets/EFSDK/AutoSetEFSdk.cs.meta delete mode 100755 Assets/EFSDK/EFSdk.cs delete mode 100755 Assets/EFSDK/EFSdk.cs.meta delete mode 100755 Assets/EFSDK/EFSdkAndroid.cs delete mode 100755 Assets/EFSDK/EFSdkAndroid.cs.meta delete mode 100644 Assets/EFSDK/Editor.meta delete mode 100755 Assets/EFSDK/Editor/AndroidResAarBuilder.cs delete mode 100755 Assets/EFSDK/Editor/AndroidResAarBuilder.cs.meta delete mode 100644 Assets/EFSDK/Editor/Dependencies.xml delete mode 100644 Assets/EFSDK/Editor/Dependencies.xml.meta delete mode 100644 Assets/EFSDK/Editor/DynamicApplicationClass.cs delete mode 100644 Assets/EFSDK/Editor/DynamicApplicationClass.cs.meta delete mode 100755 Assets/EFSDK/Editor/SDKEditorNetworkTool.cs delete mode 100755 Assets/EFSDK/Editor/SDKEditorNetworkTool.cs.meta delete mode 100755 Assets/EFSDK/Editor/SDKTool.cs delete mode 100755 Assets/EFSDK/Editor/SDKTool.cs.meta delete mode 100644 Assets/KwaiAds.meta delete mode 100644 Assets/KwaiAds/Scripts.meta delete mode 100644 Assets/KwaiAds/Scripts/Api.meta delete mode 100644 Assets/KwaiAds/Scripts/Api/Constants.cs delete mode 100644 Assets/KwaiAds/Scripts/Api/Constants.cs.meta delete mode 100644 Assets/KwaiAds/Scripts/Api/InitResultCallback.cs delete mode 100644 Assets/KwaiAds/Scripts/Api/InitResultCallback.cs.meta delete mode 100644 Assets/KwaiAds/Scripts/Api/Interstitial.meta delete mode 100644 Assets/KwaiAds/Scripts/Api/Interstitial/IInterstitialAdController.cs delete mode 100644 Assets/KwaiAds/Scripts/Api/Interstitial/IInterstitialAdController.cs.meta delete mode 100644 Assets/KwaiAds/Scripts/Api/Interstitial/IInterstitialAdListener.cs delete mode 100644 Assets/KwaiAds/Scripts/Api/Interstitial/IInterstitialAdListener.cs.meta delete mode 100644 Assets/KwaiAds/Scripts/Api/Interstitial/IInterstitialAdLoadListener.cs delete mode 100644 Assets/KwaiAds/Scripts/Api/Interstitial/IInterstitialAdLoadListener.cs.meta delete mode 100644 Assets/KwaiAds/Scripts/Api/Interstitial/KwaiInterstitialAdRequest.cs delete mode 100644 Assets/KwaiAds/Scripts/Api/Interstitial/KwaiInterstitialAdRequest.cs.meta delete mode 100644 Assets/KwaiAds/Scripts/Api/KwaiAdConfig.cs delete mode 100644 Assets/KwaiAds/Scripts/Api/KwaiAdConfig.cs.meta delete mode 100644 Assets/KwaiAds/Scripts/Api/KwaiAdsSdk.cs delete mode 100644 Assets/KwaiAds/Scripts/Api/KwaiAdsSdk.cs.meta delete mode 100644 Assets/KwaiAds/Scripts/Api/KwaiRequest.cs delete mode 100644 Assets/KwaiAds/Scripts/Api/KwaiRequest.cs.meta delete mode 100644 Assets/KwaiAds/Scripts/Api/Reward.meta delete mode 100644 Assets/KwaiAds/Scripts/Api/Reward/IRewardAdController.cs delete mode 100644 Assets/KwaiAds/Scripts/Api/Reward/IRewardAdController.cs.meta delete mode 100644 Assets/KwaiAds/Scripts/Api/Reward/IRewardAdListener.cs delete mode 100644 Assets/KwaiAds/Scripts/Api/Reward/IRewardAdListener.cs.meta delete mode 100644 Assets/KwaiAds/Scripts/Api/Reward/IRewardAdLoadListener.cs delete mode 100644 Assets/KwaiAds/Scripts/Api/Reward/IRewardAdLoadListener.cs.meta delete mode 100644 Assets/KwaiAds/Scripts/Api/Reward/KwaiRewardAdRequest.cs delete mode 100644 Assets/KwaiAds/Scripts/Api/Reward/KwaiRewardAdRequest.cs.meta delete mode 100644 Assets/KwaiAds/Scripts/Common.meta delete mode 100644 Assets/KwaiAds/Scripts/Common/IAdListener.cs delete mode 100644 Assets/KwaiAds/Scripts/Common/IAdListener.cs.meta delete mode 100644 Assets/KwaiAds/Scripts/Common/IAdLoadListener.cs delete mode 100644 Assets/KwaiAds/Scripts/Common/IAdLoadListener.cs.meta delete mode 100644 Assets/KwaiAds/Scripts/Common/IClientBidding.cs delete mode 100644 Assets/KwaiAds/Scripts/Common/IClientBidding.cs.meta delete mode 100644 Assets/KwaiAds/Scripts/Common/IClientFactory.cs delete mode 100644 Assets/KwaiAds/Scripts/Common/IClientFactory.cs.meta delete mode 100644 Assets/KwaiAds/Scripts/Common/IKwaiAdController.cs delete mode 100644 Assets/KwaiAds/Scripts/Common/IKwaiAdController.cs.meta delete mode 100644 Assets/KwaiAds/Scripts/Common/ISDK.cs delete mode 100644 Assets/KwaiAds/Scripts/Common/ISDK.cs.meta delete mode 100644 Assets/KwaiAds/Scripts/Platform.meta delete mode 100644 Assets/KwaiAds/Scripts/Platform/Android.meta delete mode 100644 Assets/KwaiAds/Scripts/Platform/Android/AndroidClientFactory.cs delete mode 100644 Assets/KwaiAds/Scripts/Platform/Android/AndroidClientFactory.cs.meta delete mode 100644 Assets/KwaiAds/Scripts/Platform/Android/AndroidPlatformTool.cs delete mode 100644 Assets/KwaiAds/Scripts/Platform/Android/AndroidPlatformTool.cs.meta delete mode 100644 Assets/KwaiAds/Scripts/Platform/Android/KwaiAdSDKInit.cs delete mode 100644 Assets/KwaiAds/Scripts/Platform/Android/KwaiAdSDKInit.cs.meta delete mode 100644 Assets/KwaiAds/Scripts/Platform/Android/KwaiInterstitialAdController.cs delete mode 100644 Assets/KwaiAds/Scripts/Platform/Android/KwaiInterstitialAdController.cs.meta delete mode 100644 Assets/KwaiAds/Scripts/Platform/Android/KwaiRewardAdController.cs delete mode 100644 Assets/KwaiAds/Scripts/Platform/Android/KwaiRewardAdController.cs.meta delete mode 100644 Assets/KwaiAds/Scripts/Platform/Android/KwaiSdkClient.cs delete mode 100644 Assets/KwaiAds/Scripts/Platform/Android/KwaiSdkClient.cs.meta delete mode 100644 Assets/MaxSdk.meta delete mode 100644 Assets/MaxSdk/AppLovin.meta delete mode 100644 Assets/MaxSdk/AppLovin/Editor.meta delete mode 100644 Assets/MaxSdk/AppLovin/Editor/Dependencies.xml delete mode 100644 Assets/MaxSdk/AppLovin/Editor/Dependencies.xml.meta delete mode 100644 Assets/MaxSdk/AppLovin/Plugins.meta delete mode 100644 Assets/MaxSdk/AppLovin/Plugins/Android.meta delete mode 100644 Assets/MaxSdk/AppLovin/Plugins/Android/applovin-max-unity-plugin.aar delete mode 100644 Assets/MaxSdk/AppLovin/Plugins/Android/applovin-max-unity-plugin.aar.meta delete mode 100644 Assets/MaxSdk/AppLovin/Plugins/iOS.meta delete mode 100644 Assets/MaxSdk/AppLovin/Plugins/iOS/MAUnityAdManager.h delete mode 100644 Assets/MaxSdk/AppLovin/Plugins/iOS/MAUnityAdManager.h.meta delete mode 100644 Assets/MaxSdk/AppLovin/Plugins/iOS/MAUnityAdManager.m delete mode 100644 Assets/MaxSdk/AppLovin/Plugins/iOS/MAUnityAdManager.m.meta delete mode 100644 Assets/MaxSdk/AppLovin/Plugins/iOS/MAUnityPlugin.mm delete mode 100644 Assets/MaxSdk/AppLovin/Plugins/iOS/MAUnityPlugin.mm.meta delete mode 100644 Assets/MaxSdk/CHANGELOG.md delete mode 100644 Assets/MaxSdk/CHANGELOG.md.meta delete mode 100644 Assets/MaxSdk/Mediation.meta delete mode 100644 Assets/MaxSdk/Mediation/BigoAds.meta delete mode 100644 Assets/MaxSdk/Mediation/BigoAds/Editor.meta delete mode 100644 Assets/MaxSdk/Mediation/BigoAds/Editor/Dependencies.xml delete mode 100644 Assets/MaxSdk/Mediation/BigoAds/Editor/Dependencies.xml.meta delete mode 100644 Assets/MaxSdk/Mediation/ByteDance.meta delete mode 100644 Assets/MaxSdk/Mediation/ByteDance/Editor.meta delete mode 100644 Assets/MaxSdk/Mediation/ByteDance/Editor/Dependencies.xml delete mode 100644 Assets/MaxSdk/Mediation/ByteDance/Editor/Dependencies.xml.meta delete mode 100644 Assets/MaxSdk/Mediation/Fyber.meta delete mode 100644 Assets/MaxSdk/Mediation/Fyber/Editor.meta delete mode 100644 Assets/MaxSdk/Mediation/Fyber/Editor/Dependencies.xml delete mode 100644 Assets/MaxSdk/Mediation/Fyber/Editor/Dependencies.xml.meta delete mode 100644 Assets/MaxSdk/Mediation/Google.meta delete mode 100644 Assets/MaxSdk/Mediation/Google/Editor.meta delete mode 100644 Assets/MaxSdk/Mediation/Google/Editor/Dependencies.xml delete mode 100644 Assets/MaxSdk/Mediation/Google/Editor/Dependencies.xml.meta delete mode 100644 Assets/MaxSdk/Mediation/GoogleAdManager.meta delete mode 100644 Assets/MaxSdk/Mediation/GoogleAdManager/Editor.meta delete mode 100644 Assets/MaxSdk/Mediation/GoogleAdManager/Editor/Dependencies.xml delete mode 100644 Assets/MaxSdk/Mediation/GoogleAdManager/Editor/Dependencies.xml.meta delete mode 100644 Assets/MaxSdk/Mediation/MediationAdapters.txt delete mode 100644 Assets/MaxSdk/Mediation/MediationAdapters.txt.meta delete mode 100644 Assets/MaxSdk/Mediation/Mintegral.meta delete mode 100644 Assets/MaxSdk/Mediation/Mintegral/Editor.meta delete mode 100644 Assets/MaxSdk/Mediation/Mintegral/Editor/Dependencies.xml delete mode 100644 Assets/MaxSdk/Mediation/Mintegral/Editor/Dependencies.xml.meta delete mode 100644 Assets/MaxSdk/Mediation/Moloco.meta delete mode 100644 Assets/MaxSdk/Mediation/Moloco/Editor.meta delete mode 100644 Assets/MaxSdk/Mediation/Moloco/Editor/Dependencies.xml delete mode 100644 Assets/MaxSdk/Mediation/Moloco/Editor/Dependencies.xml.meta delete mode 100644 Assets/MaxSdk/Mediation/UnityAds.meta delete mode 100644 Assets/MaxSdk/Mediation/UnityAds/Editor.meta delete mode 100644 Assets/MaxSdk/Mediation/UnityAds/Editor/Dependencies.xml delete mode 100644 Assets/MaxSdk/Mediation/UnityAds/Editor/Dependencies.xml.meta delete mode 100644 Assets/MaxSdk/Mediation/Vungle.meta delete mode 100644 Assets/MaxSdk/Mediation/Vungle/Editor.meta delete mode 100644 Assets/MaxSdk/Mediation/Vungle/Editor/Dependencies.xml delete mode 100644 Assets/MaxSdk/Mediation/Vungle/Editor/Dependencies.xml.meta delete mode 100644 Assets/MaxSdk/Prefabs.meta delete mode 100644 Assets/MaxSdk/Prefabs/BannerBottom.prefab delete mode 100644 Assets/MaxSdk/Prefabs/BannerBottom.prefab.meta delete mode 100644 Assets/MaxSdk/Prefabs/BannerTop.prefab delete mode 100644 Assets/MaxSdk/Prefabs/BannerTop.prefab.meta delete mode 100644 Assets/MaxSdk/Prefabs/Interstitial.prefab delete mode 100644 Assets/MaxSdk/Prefabs/Interstitial.prefab.meta delete mode 100644 Assets/MaxSdk/Prefabs/Rewarded.prefab delete mode 100644 Assets/MaxSdk/Prefabs/Rewarded.prefab.meta delete mode 100644 Assets/MaxSdk/Resources.meta delete mode 100644 Assets/MaxSdk/Resources/AppLovinSettings.asset delete mode 100644 Assets/MaxSdk/Resources/AppLovinSettings.asset.meta delete mode 100644 Assets/MaxSdk/Resources/Images.meta delete mode 100644 Assets/MaxSdk/Resources/Images/alert_icon.png delete mode 100644 Assets/MaxSdk/Resources/Images/alert_icon.png.meta delete mode 100755 Assets/MaxSdk/Resources/Images/uninstall_icon.png delete mode 100644 Assets/MaxSdk/Resources/Images/uninstall_icon.png.meta delete mode 100644 Assets/MaxSdk/Resources/Images/warning_icon.png delete mode 100644 Assets/MaxSdk/Resources/Images/warning_icon.png.meta delete mode 100644 Assets/MaxSdk/Scripts.meta delete mode 100644 Assets/MaxSdk/Scripts/IntegrationManager.meta delete mode 100644 Assets/MaxSdk/Scripts/IntegrationManager/Editor.meta delete mode 100644 Assets/MaxSdk/Scripts/IntegrationManager/Editor/AppLovinAutoUpdater.cs delete mode 100644 Assets/MaxSdk/Scripts/IntegrationManager/Editor/AppLovinAutoUpdater.cs.meta delete mode 100644 Assets/MaxSdk/Scripts/IntegrationManager/Editor/AppLovinCommandLine.cs delete mode 100644 Assets/MaxSdk/Scripts/IntegrationManager/Editor/AppLovinCommandLine.cs.meta delete mode 100644 Assets/MaxSdk/Scripts/IntegrationManager/Editor/AppLovinEditorCoroutine.cs delete mode 100644 Assets/MaxSdk/Scripts/IntegrationManager/Editor/AppLovinEditorCoroutine.cs.meta delete mode 100644 Assets/MaxSdk/Scripts/IntegrationManager/Editor/AppLovinInitialize.cs delete mode 100644 Assets/MaxSdk/Scripts/IntegrationManager/Editor/AppLovinInitialize.cs.meta delete mode 100644 Assets/MaxSdk/Scripts/IntegrationManager/Editor/AppLovinIntegrationManager.cs delete mode 100644 Assets/MaxSdk/Scripts/IntegrationManager/Editor/AppLovinIntegrationManager.cs.meta delete mode 100644 Assets/MaxSdk/Scripts/IntegrationManager/Editor/AppLovinIntegrationManagerUtils.cs delete mode 100644 Assets/MaxSdk/Scripts/IntegrationManager/Editor/AppLovinIntegrationManagerUtils.cs.meta delete mode 100644 Assets/MaxSdk/Scripts/IntegrationManager/Editor/AppLovinIntegrationManagerWindow.cs delete mode 100644 Assets/MaxSdk/Scripts/IntegrationManager/Editor/AppLovinIntegrationManagerWindow.cs.meta delete mode 100644 Assets/MaxSdk/Scripts/IntegrationManager/Editor/AppLovinInternalSettings.cs delete mode 100644 Assets/MaxSdk/Scripts/IntegrationManager/Editor/AppLovinInternalSettings.cs.meta delete mode 100644 Assets/MaxSdk/Scripts/IntegrationManager/Editor/AppLovinMenuItems.cs delete mode 100644 Assets/MaxSdk/Scripts/IntegrationManager/Editor/AppLovinMenuItems.cs.meta delete mode 100644 Assets/MaxSdk/Scripts/IntegrationManager/Editor/AppLovinPackageManager.cs delete mode 100644 Assets/MaxSdk/Scripts/IntegrationManager/Editor/AppLovinPackageManager.cs.meta delete mode 100644 Assets/MaxSdk/Scripts/IntegrationManager/Editor/AppLovinPluginMigrationHelper.cs delete mode 100644 Assets/MaxSdk/Scripts/IntegrationManager/Editor/AppLovinPluginMigrationHelper.cs.meta delete mode 100644 Assets/MaxSdk/Scripts/IntegrationManager/Editor/AppLovinPostProcessAndroid.cs delete mode 100644 Assets/MaxSdk/Scripts/IntegrationManager/Editor/AppLovinPostProcessAndroid.cs.meta delete mode 100644 Assets/MaxSdk/Scripts/IntegrationManager/Editor/AppLovinPostProcessAndroidGradle.cs delete mode 100644 Assets/MaxSdk/Scripts/IntegrationManager/Editor/AppLovinPostProcessAndroidGradle.cs.meta delete mode 100644 Assets/MaxSdk/Scripts/IntegrationManager/Editor/AppLovinPostProcessiOS.cs delete mode 100644 Assets/MaxSdk/Scripts/IntegrationManager/Editor/AppLovinPostProcessiOS.cs.meta delete mode 100644 Assets/MaxSdk/Scripts/IntegrationManager/Editor/AppLovinPreProcess.cs delete mode 100644 Assets/MaxSdk/Scripts/IntegrationManager/Editor/AppLovinPreProcess.cs.meta delete mode 100644 Assets/MaxSdk/Scripts/IntegrationManager/Editor/AppLovinPreProcessAndroid.cs delete mode 100644 Assets/MaxSdk/Scripts/IntegrationManager/Editor/AppLovinPreProcessAndroid.cs.meta delete mode 100644 Assets/MaxSdk/Scripts/IntegrationManager/Editor/AppLovinPreProcessiOS.cs delete mode 100644 Assets/MaxSdk/Scripts/IntegrationManager/Editor/AppLovinPreProcessiOS.cs.meta delete mode 100644 Assets/MaxSdk/Scripts/IntegrationManager/Editor/AppLovinProcessGradleBuildFile.cs delete mode 100644 Assets/MaxSdk/Scripts/IntegrationManager/Editor/AppLovinProcessGradleBuildFile.cs.meta delete mode 100644 Assets/MaxSdk/Scripts/IntegrationManager/Editor/AppLovinSettings.cs delete mode 100644 Assets/MaxSdk/Scripts/IntegrationManager/Editor/AppLovinSettings.cs.meta delete mode 100644 Assets/MaxSdk/Scripts/IntegrationManager/Editor/AppLovinUpmManifest.cs delete mode 100644 Assets/MaxSdk/Scripts/IntegrationManager/Editor/AppLovinUpmManifest.cs.meta delete mode 100644 Assets/MaxSdk/Scripts/IntegrationManager/Editor/MaxSdk.IntegrationManager.Editor.asmdef delete mode 100644 Assets/MaxSdk/Scripts/IntegrationManager/Editor/MaxSdk.IntegrationManager.Editor.asmdef.meta delete mode 100644 Assets/MaxSdk/Scripts/MaxCmpService.cs delete mode 100644 Assets/MaxSdk/Scripts/MaxCmpService.cs.meta delete mode 100644 Assets/MaxSdk/Scripts/MaxEventExecutor.cs delete mode 100644 Assets/MaxSdk/Scripts/MaxEventExecutor.cs.meta delete mode 100644 Assets/MaxSdk/Scripts/MaxEventSystemChecker.cs delete mode 100644 Assets/MaxSdk/Scripts/MaxEventSystemChecker.cs.meta delete mode 100644 Assets/MaxSdk/Scripts/MaxEvents.cs delete mode 100644 Assets/MaxSdk/Scripts/MaxEvents.cs.meta delete mode 100644 Assets/MaxSdk/Scripts/MaxSdk.Scripts.asmdef delete mode 100644 Assets/MaxSdk/Scripts/MaxSdk.Scripts.asmdef.meta delete mode 100644 Assets/MaxSdk/Scripts/MaxSdk.cs delete mode 100644 Assets/MaxSdk/Scripts/MaxSdk.cs.meta delete mode 100644 Assets/MaxSdk/Scripts/MaxSdkAndroid.cs delete mode 100644 Assets/MaxSdk/Scripts/MaxSdkAndroid.cs.meta delete mode 100644 Assets/MaxSdk/Scripts/MaxSdkBase.cs delete mode 100644 Assets/MaxSdk/Scripts/MaxSdkBase.cs.meta delete mode 100644 Assets/MaxSdk/Scripts/MaxSdkCallbacks.cs delete mode 100644 Assets/MaxSdk/Scripts/MaxSdkCallbacks.cs.meta delete mode 100644 Assets/MaxSdk/Scripts/MaxSdkLogger.cs delete mode 100644 Assets/MaxSdk/Scripts/MaxSdkLogger.cs.meta delete mode 100644 Assets/MaxSdk/Scripts/MaxSdkUnityEditor.cs delete mode 100644 Assets/MaxSdk/Scripts/MaxSdkUnityEditor.cs.meta delete mode 100644 Assets/MaxSdk/Scripts/MaxSdkUtils.cs delete mode 100644 Assets/MaxSdk/Scripts/MaxSdkUtils.cs.meta delete mode 100644 Assets/MaxSdk/Scripts/MaxSdkiOS.cs delete mode 100644 Assets/MaxSdk/Scripts/MaxSdkiOS.cs.meta delete mode 100644 Assets/MaxSdk/Scripts/MaxSegmentCollection.cs delete mode 100644 Assets/MaxSdk/Scripts/MaxSegmentCollection.cs.meta delete mode 100644 Assets/MaxSdk/Scripts/MaxTargetingData.cs delete mode 100644 Assets/MaxSdk/Scripts/MaxTargetingData.cs.meta delete mode 100644 Assets/MaxSdk/Scripts/MaxUserSegment.cs delete mode 100644 Assets/MaxSdk/Scripts/MaxUserSegment.cs.meta delete mode 100644 Assets/MaxSdk/Scripts/MaxUserServiceAndroid.cs delete mode 100644 Assets/MaxSdk/Scripts/MaxUserServiceAndroid.cs.meta delete mode 100644 Assets/MaxSdk/Scripts/MaxUserServiceUnityEditor.cs delete mode 100644 Assets/MaxSdk/Scripts/MaxUserServiceUnityEditor.cs.meta delete mode 100644 Assets/MaxSdk/Scripts/MaxUserServiceiOS.cs delete mode 100644 Assets/MaxSdk/Scripts/MaxUserServiceiOS.cs.meta delete mode 100644 Assets/MaxSdk/Scripts/ThirdParty.meta delete mode 100644 Assets/MaxSdk/Scripts/ThirdParty/MiniJSON.cs delete mode 100644 Assets/MaxSdk/Scripts/ThirdParty/MiniJSON.cs.meta delete mode 100644 Assets/Script/SDKManager/AdsSDKManager/BigoAdsManager.meta delete mode 100644 Assets/Script/SDKManager/AdsSDKManager/BigoAdsManager/BigoAdsManager.cs delete mode 100644 Assets/Script/SDKManager/AdsSDKManager/BigoAdsManager/BigoAdsManager.cs.meta delete mode 100644 Assets/Script/SDKManager/AdsSDKManager/BigoAdsManager/BigoInterstitialAdManager.cs delete mode 100644 Assets/Script/SDKManager/AdsSDKManager/BigoAdsManager/BigoInterstitialAdManager.cs.meta delete mode 100644 Assets/Script/SDKManager/AdsSDKManager/BigoAdsManager/BigoRewardedAdManager.cs delete mode 100644 Assets/Script/SDKManager/AdsSDKManager/BigoAdsManager/BigoRewardedAdManager.cs.meta delete mode 100644 Assets/Script/SDKManager/AdsSDKManager/KwaiAdsManager.meta delete mode 100644 Assets/Script/SDKManager/AdsSDKManager/KwaiAdsManager/Data.meta delete mode 100644 Assets/Script/SDKManager/AdsSDKManager/KwaiAdsManager/Data/KwaiAdsConfigParser.cs delete mode 100644 Assets/Script/SDKManager/AdsSDKManager/KwaiAdsManager/Data/KwaiAdsConfigParser.cs.meta delete mode 100644 Assets/Script/SDKManager/AdsSDKManager/KwaiAdsManager/KwaiAdsManager.cs delete mode 100644 Assets/Script/SDKManager/AdsSDKManager/KwaiAdsManager/KwaiAdsManager.cs.meta delete mode 100644 Assets/Script/SDKManager/AdsSDKManager/KwaiAdsManager/KwaiFloorIvManager.cs delete mode 100644 Assets/Script/SDKManager/AdsSDKManager/KwaiAdsManager/KwaiFloorIvManager.cs.meta delete mode 100644 Assets/Script/SDKManager/AdsSDKManager/KwaiAdsManager/KwaiFloorRvManager.cs delete mode 100644 Assets/Script/SDKManager/AdsSDKManager/KwaiAdsManager/KwaiFloorRvManager.cs.meta delete mode 100644 Assets/Script/SDKManager/AdsSDKManager/KwaiAdsManager/Listener.meta delete mode 100644 Assets/Script/SDKManager/AdsSDKManager/KwaiAdsManager/Listener/InitResultCallbackImpl.cs delete mode 100644 Assets/Script/SDKManager/AdsSDKManager/KwaiAdsManager/Listener/InitResultCallbackImpl.cs.meta delete mode 100644 Assets/Script/SDKManager/AdsSDKManager/KwaiAdsManager/Listener/Inter.meta delete mode 100644 Assets/Script/SDKManager/AdsSDKManager/KwaiAdsManager/Listener/Inter/Floor.meta delete mode 100644 Assets/Script/SDKManager/AdsSDKManager/KwaiAdsManager/Listener/Inter/Floor/FloorInterAdListener.cs delete mode 100644 Assets/Script/SDKManager/AdsSDKManager/KwaiAdsManager/Listener/Inter/Floor/FloorInterAdListener.cs.meta delete mode 100644 Assets/Script/SDKManager/AdsSDKManager/KwaiAdsManager/Listener/Inter/Floor/FloorInterAdLoadListener.cs delete mode 100644 Assets/Script/SDKManager/AdsSDKManager/KwaiAdsManager/Listener/Inter/Floor/FloorInterAdLoadListener.cs.meta delete mode 100644 Assets/Script/SDKManager/AdsSDKManager/KwaiAdsManager/Listener/Inter/Standard.meta delete mode 100644 Assets/Script/SDKManager/AdsSDKManager/KwaiAdsManager/Listener/Inter/Standard/InterstitialAdListener.cs delete mode 100644 Assets/Script/SDKManager/AdsSDKManager/KwaiAdsManager/Listener/Inter/Standard/InterstitialAdListener.cs.meta delete mode 100644 Assets/Script/SDKManager/AdsSDKManager/KwaiAdsManager/Listener/Inter/Standard/InterstitialAdLoadListener.cs delete mode 100644 Assets/Script/SDKManager/AdsSDKManager/KwaiAdsManager/Listener/Inter/Standard/InterstitialAdLoadListener.cs.meta delete mode 100644 Assets/Script/SDKManager/AdsSDKManager/KwaiAdsManager/Listener/Reward.meta delete mode 100644 Assets/Script/SDKManager/AdsSDKManager/KwaiAdsManager/Listener/Reward/Floor.meta delete mode 100644 Assets/Script/SDKManager/AdsSDKManager/KwaiAdsManager/Listener/Reward/Floor/FloorRewardAdListener.cs delete mode 100644 Assets/Script/SDKManager/AdsSDKManager/KwaiAdsManager/Listener/Reward/Floor/FloorRewardAdListener.cs.meta delete mode 100644 Assets/Script/SDKManager/AdsSDKManager/KwaiAdsManager/Listener/Reward/Floor/FloorRewardAdLoadListener.cs delete mode 100644 Assets/Script/SDKManager/AdsSDKManager/KwaiAdsManager/Listener/Reward/Floor/FloorRewardAdLoadListener.cs.meta delete mode 100644 Assets/Script/SDKManager/AdsSDKManager/KwaiAdsManager/Listener/Reward/Standard.meta delete mode 100644 Assets/Script/SDKManager/AdsSDKManager/KwaiAdsManager/Listener/Reward/Standard/RewardAdListener.cs delete mode 100644 Assets/Script/SDKManager/AdsSDKManager/KwaiAdsManager/Listener/Reward/Standard/RewardAdListener.cs.meta delete mode 100644 Assets/Script/SDKManager/AdsSDKManager/KwaiAdsManager/Listener/Reward/Standard/RewardAdLoadListener.cs delete mode 100644 Assets/Script/SDKManager/AdsSDKManager/KwaiAdsManager/Listener/Reward/Standard/RewardAdLoadListener.cs.meta delete mode 100644 Assets/Script/SDKManager/AdsSDKManager/MaxAdsManager.meta delete mode 100644 Assets/Script/SDKManager/AdsSDKManager/MaxAdsManager/MaxAdsManager.cs delete mode 100644 Assets/Script/SDKManager/AdsSDKManager/MaxAdsManager/MaxAdsManager.cs.meta delete mode 100644 Assets/Script/SDKManager/EFSdkManager.meta delete mode 100644 Assets/Script/SDKManager/EFSdkManager/EFSdkManager.cs delete mode 100644 Assets/Script/SDKManager/EFSdkManager/EFSdkManager.cs.meta rename Assets/{EFSDK => Script/Utils}/WLoom.cs (99%) rename Assets/{EFSDK => Script/Utils}/WLoom.cs.meta (100%) diff --git a/Assets/BigoAds.meta b/Assets/BigoAds.meta deleted file mode 100644 index c4a3cd5..0000000 --- a/Assets/BigoAds.meta +++ /dev/null @@ -1,8 +0,0 @@ -fileFormatVersion: 2 -guid: bd0ef81b1482347b38905fab4f30e583 -folderAsset: yes -DefaultImporter: - externalObjects: {} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Assets/BigoAds/Scripts.meta b/Assets/BigoAds/Scripts.meta deleted file mode 100644 index dc11939..0000000 --- a/Assets/BigoAds/Scripts.meta +++ /dev/null @@ -1,8 +0,0 @@ -fileFormatVersion: 2 -guid: 467aa0b9eadf04b22b5b3713a1b07bea -folderAsset: yes -DefaultImporter: - externalObjects: {} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Assets/BigoAds/Scripts/Api.meta b/Assets/BigoAds/Scripts/Api.meta deleted file mode 100644 index 15c0daf..0000000 --- a/Assets/BigoAds/Scripts/Api.meta +++ /dev/null @@ -1,8 +0,0 @@ -fileFormatVersion: 2 -guid: 1dd438e36fdc745aaa018eac5d3b182c -folderAsset: yes -DefaultImporter: - externalObjects: {} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Assets/BigoAds/Scripts/Api/BigoAdConfig.cs b/Assets/BigoAds/Scripts/Api/BigoAdConfig.cs deleted file mode 100644 index 82e0447..0000000 --- a/Assets/BigoAds/Scripts/Api/BigoAdConfig.cs +++ /dev/null @@ -1,115 +0,0 @@ -using System; -using System.Collections.Generic; -using BigoAds.Scripts.Api.Constant; -using System.Collections.Generic; - -namespace BigoAds.Scripts.Api -{ - public class BigoAdConfig - { - public const string EXTRA_KEY_HOST_RULES = "host_rules"; - - /// - /// the unique identifier of the App - /// - internal string AppId { get; } - - /// - /// Custom set the debugLog to print debug Log. - /// debugLog NO: close debug log, YES: open debug log. - /// - internal bool DebugLog { get; } - - /// - /// Channels for publishing media applications - /// - internal string Channel { get; } - - internal int Age { get; } - - internal int Gender { get; } - - internal long ActivatedTime { get; } - - internal Dictionary ExtraDictionary { get; } - - private BigoAdConfig(BigoAdConfig.Builder builder) - { - AppId = builder.AppId; - DebugLog = builder.DebugLog; - Channel = builder.Channel; - Age = builder.Age; - Gender = (int)builder.Gender; - ActivatedTime = builder.ActivatedTime; - ExtraDictionary = builder.ExtraDictionary; - } - - public class Builder - { - internal string AppId; - - internal bool DebugLog; - - internal string Channel; - - internal int Age; - - internal BGAdGender Gender; - - internal long ActivatedTime; - - internal Dictionary ExtraDictionary = new Dictionary(); - - public Builder SetAppId(string appid) - { - this.AppId = appid; - return this; - } - - public Builder SetDebugLog(bool debugLog) - { - this.DebugLog = debugLog; - return this; - } - - public Builder SetChannel(string channel) - { - this.Channel = channel; - return this; - } - - public Builder SetAge(int age) - { - this.Age = age; - return this; - } - - public Builder SetGender(BGAdGender gender) - { - this.Gender = gender; - return this; - } - - public Builder SetActivatedTime(long activatedTime) - { - this.ActivatedTime = activatedTime; - return this; - } - - ///Only works on Android - public Builder SetExtra(string key, string extra) - { - if (key != null && extra != null) - { - this.ExtraDictionary.Add(key, extra); - } - return this; - } - - public BigoAdConfig Build() - { - return new BigoAdConfig(this); - } - } - } -} \ No newline at end of file diff --git a/Assets/BigoAds/Scripts/Api/BigoAdConfig.cs.meta b/Assets/BigoAds/Scripts/Api/BigoAdConfig.cs.meta deleted file mode 100644 index b457ea0..0000000 --- a/Assets/BigoAds/Scripts/Api/BigoAdConfig.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: b18497a84c58a49f385b63be54aff0cb -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Assets/BigoAds/Scripts/Api/BigoAdSdk.cs b/Assets/BigoAds/Scripts/Api/BigoAdSdk.cs deleted file mode 100644 index a630cc7..0000000 --- a/Assets/BigoAds/Scripts/Api/BigoAdSdk.cs +++ /dev/null @@ -1,107 +0,0 @@ -using BigoAds.Scripts.Common; -using BigoAds.Scripts.Api.Constant; -using System; - -namespace BigoAds.Scripts.Api -{ - public static class BigoAdSdk - { - private static IClientFactory _clientFactory; - - private static ISDK _sdk; - - internal static ISDK SDK - { - get - { - if (_sdk == null) - { - _sdk = GetClientFactory().BuildSDKClient(); - } - - return _sdk; - } - } - - internal static IClientFactory GetClientFactory() - { - if (_clientFactory != null) - { - return _clientFactory; - } - - _clientFactory = -#if UNITY_ANDROID - new BigoAds.Scripts.Platforms.Android.AndroidClientFactory(); -#elif UNITY_IOS - new BigoAds.Scripts.Platforms.iOS.IOSClientFactory(); -#else - null; - throw new PlatformNotSupportedException(); -#endif - return _clientFactory; - } - - public delegate void InitResultDelegate(); - - public static event InitResultDelegate OnInitFinish; - - /// Starts the Bigo SDK - /// @warning Call this method as early as possible to reduce ad request fail. - /// @param config SDK configuration - /// @param callback Callback for starting the Bigo SDK - /// //// - public static void Initialize(BigoAdConfig config) - { - if (IsInitSuccess()) - { - OnInitFinish?.Invoke(); - return; - } - - SDK.Init(config, (() => { OnInitFinish?.Invoke(); })); - } - - //// - /// The SDK initialization state - //// - public static bool IsInitSuccess() - { - return SDK.IsInitSuccess(); - } - - /////// - /// Bigo SDK version - /// //// - public static string GetSDKVersion() - { - return SDK.GetSDKVersion(); - } - - /////// - /// Bigo SDK version name - /// //// - public static string GetSDKVersionName() - { - return SDK.GetSDKVersionName(); - } - - /////// - /// Bigo SDK set user consent - /// //// - public static void SetUserConsent(ConsentOptions option, bool consent) - { - SDK.SetUserConsent(option, consent); - } - - /////// - /// Only works on Android - /// Bigo SDK set user consent - /// //// - public static void AddExtraHost(string country, string host) - { - SDK.AddExtraHost(country, host); - } - - } -} diff --git a/Assets/BigoAds/Scripts/Api/BigoAdSdk.cs.meta b/Assets/BigoAds/Scripts/Api/BigoAdSdk.cs.meta deleted file mode 100644 index 4672ff6..0000000 --- a/Assets/BigoAds/Scripts/Api/BigoAdSdk.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: e5ad9c8c265954d4e8f4f03312b5fa42 -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Assets/BigoAds/Scripts/Api/BigoBannerAd.cs b/Assets/BigoAds/Scripts/Api/BigoBannerAd.cs deleted file mode 100644 index 598d5bb..0000000 --- a/Assets/BigoAds/Scripts/Api/BigoBannerAd.cs +++ /dev/null @@ -1,30 +0,0 @@ -using BigoAds.Scripts.Api.Constant; -using BigoAds.Scripts.Common; -using UnityEngine; - -namespace BigoAds.Scripts.Api -{ - public class BigoBannerAd : BigoBaseAd - { - private readonly IBannerAd _bannerAdClient; - - - /// - /// create a banner ad - /// - /// - public BigoBannerAd(string slotId) : base(slotId, BigoAdSdk.GetClientFactory().BuildBannerAdClient()) - { - _bannerAdClient = (IBannerAd) ADClient; - } - - /// - /// set position for banner - /// - /// - public void SetPosition(BigoPosition position) - { - _bannerAdClient?.SetPosition(position); - } - } -} \ No newline at end of file diff --git a/Assets/BigoAds/Scripts/Api/BigoBannerAd.cs.meta b/Assets/BigoAds/Scripts/Api/BigoBannerAd.cs.meta deleted file mode 100644 index c20e587..0000000 --- a/Assets/BigoAds/Scripts/Api/BigoBannerAd.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: 5136d466cbb6c461f92fbd90b6fa157d -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Assets/BigoAds/Scripts/Api/BigoBannerRequest.cs b/Assets/BigoAds/Scripts/Api/BigoBannerRequest.cs deleted file mode 100644 index a40d433..0000000 --- a/Assets/BigoAds/Scripts/Api/BigoBannerRequest.cs +++ /dev/null @@ -1,22 +0,0 @@ -using System; -using BigoAds.Scripts.Api.Constant; -using UnityEngine; - -namespace BigoAds.Scripts.Api -{ - [Serializable] - public class BigoBannerRequest : BigoRequest - { - [SerializeField()] - private BigoBannerSize size; - public BigoBannerSize Size => size; - - public BigoPosition Position { get; } - - public BigoBannerRequest(BigoBannerSize size, BigoPosition position = BigoPosition.Bottom) - { - this.size = size; - this.Position = position; - } - } -} \ No newline at end of file diff --git a/Assets/BigoAds/Scripts/Api/BigoBannerRequest.cs.meta b/Assets/BigoAds/Scripts/Api/BigoBannerRequest.cs.meta deleted file mode 100644 index b1bc7ba..0000000 --- a/Assets/BigoAds/Scripts/Api/BigoBannerRequest.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: 159c6164853954739adbca1ae7592df7 -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Assets/BigoAds/Scripts/Api/BigoInterstitialAd.cs b/Assets/BigoAds/Scripts/Api/BigoInterstitialAd.cs deleted file mode 100644 index aadc6ff..0000000 --- a/Assets/BigoAds/Scripts/Api/BigoInterstitialAd.cs +++ /dev/null @@ -1,11 +0,0 @@ -using BigoAds.Scripts.Common; - -namespace BigoAds.Scripts.Api -{ - public class BigoInterstitialAd : BigoBaseAd - { - public BigoInterstitialAd(string slotId) : base(slotId, BigoAdSdk.GetClientFactory().BuildInterstitialAdClient()) - { - } - } -} \ No newline at end of file diff --git a/Assets/BigoAds/Scripts/Api/BigoInterstitialAd.cs.meta b/Assets/BigoAds/Scripts/Api/BigoInterstitialAd.cs.meta deleted file mode 100644 index ef2cffe..0000000 --- a/Assets/BigoAds/Scripts/Api/BigoInterstitialAd.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: 1323eae1e03094d8281b23f5527a53db -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Assets/BigoAds/Scripts/Api/BigoInterstitialRequest.cs b/Assets/BigoAds/Scripts/Api/BigoInterstitialRequest.cs deleted file mode 100644 index 29fd866..0000000 --- a/Assets/BigoAds/Scripts/Api/BigoInterstitialRequest.cs +++ /dev/null @@ -1,10 +0,0 @@ -using System; - -namespace BigoAds.Scripts.Api -{ - [Serializable] - - public class BigoInterstitialRequest : BigoRequest - { - } -} \ No newline at end of file diff --git a/Assets/BigoAds/Scripts/Api/BigoInterstitialRequest.cs.meta b/Assets/BigoAds/Scripts/Api/BigoInterstitialRequest.cs.meta deleted file mode 100644 index dab3ed2..0000000 --- a/Assets/BigoAds/Scripts/Api/BigoInterstitialRequest.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: 1947fd630823b4858af6c3a471497f70 -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Assets/BigoAds/Scripts/Api/BigoNativeAd.cs b/Assets/BigoAds/Scripts/Api/BigoNativeAd.cs deleted file mode 100644 index d47b55b..0000000 --- a/Assets/BigoAds/Scripts/Api/BigoNativeAd.cs +++ /dev/null @@ -1,26 +0,0 @@ -using BigoAds.Scripts.Api.Constant; -using BigoAds.Scripts.Common; -using UnityEngine; - -namespace BigoAds.Scripts.Api -{ - public class BigoNativeAd : BigoBaseAd - { - private readonly INativeAd _NativeAdClient; - - public BigoNativeAd(string slotId) : base(slotId, BigoAdSdk.GetClientFactory().BuildNativeAdClient()) - { - _NativeAdClient = (INativeAd) ADClient; - } - - /// - /// set position for native - /// - /// - public void SetPosition(BigoPosition position) - { - _NativeAdClient?.SetPosition(position); - } - - } -} \ No newline at end of file diff --git a/Assets/BigoAds/Scripts/Api/BigoNativeAd.cs.meta b/Assets/BigoAds/Scripts/Api/BigoNativeAd.cs.meta deleted file mode 100644 index 8660675..0000000 --- a/Assets/BigoAds/Scripts/Api/BigoNativeAd.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: 1742d1ee2ff5e4d508ae81524cb94ade -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Assets/BigoAds/Scripts/Api/BigoNativeRequest.cs b/Assets/BigoAds/Scripts/Api/BigoNativeRequest.cs deleted file mode 100644 index fb99270..0000000 --- a/Assets/BigoAds/Scripts/Api/BigoNativeRequest.cs +++ /dev/null @@ -1,10 +0,0 @@ -using System; - -namespace BigoAds.Scripts.Api -{ - [Serializable] - public class BigoNativeRequest : BigoRequest - { - - } -} \ No newline at end of file diff --git a/Assets/BigoAds/Scripts/Api/BigoNativeRequest.cs.meta b/Assets/BigoAds/Scripts/Api/BigoNativeRequest.cs.meta deleted file mode 100644 index 304ad89..0000000 --- a/Assets/BigoAds/Scripts/Api/BigoNativeRequest.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: 033c30386f5714bddb5dd41d7524979e -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Assets/BigoAds/Scripts/Api/BigoPopupAd.cs b/Assets/BigoAds/Scripts/Api/BigoPopupAd.cs deleted file mode 100644 index 80a872b..0000000 --- a/Assets/BigoAds/Scripts/Api/BigoPopupAd.cs +++ /dev/null @@ -1,11 +0,0 @@ -using BigoAds.Scripts.Common; - -namespace BigoAds.Scripts.Api -{ - public class BigoPopupAd : BigoBaseAd - { - public BigoPopupAd(string slotId) : base(slotId, BigoAdSdk.GetClientFactory().BuildPopupAdClient()) - { - } - } -} \ No newline at end of file diff --git a/Assets/BigoAds/Scripts/Api/BigoPopupAd.cs.meta b/Assets/BigoAds/Scripts/Api/BigoPopupAd.cs.meta deleted file mode 100644 index ad93110..0000000 --- a/Assets/BigoAds/Scripts/Api/BigoPopupAd.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: 2be0a8fe9e5aa4bea8970a47e617a076 -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Assets/BigoAds/Scripts/Api/BigoPopupRequest.cs b/Assets/BigoAds/Scripts/Api/BigoPopupRequest.cs deleted file mode 100644 index c30c437..0000000 --- a/Assets/BigoAds/Scripts/Api/BigoPopupRequest.cs +++ /dev/null @@ -1,10 +0,0 @@ -using System; - -namespace BigoAds.Scripts.Api -{ - [Serializable] - - public class BigoPopupRequest : BigoRequest - { - } -} \ No newline at end of file diff --git a/Assets/BigoAds/Scripts/Api/BigoPopupRequest.cs.meta b/Assets/BigoAds/Scripts/Api/BigoPopupRequest.cs.meta deleted file mode 100644 index 9b9e2ea..0000000 --- a/Assets/BigoAds/Scripts/Api/BigoPopupRequest.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: 580aad20fbde543bab37a5e878c682cb -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Assets/BigoAds/Scripts/Api/BigoRequest.cs b/Assets/BigoAds/Scripts/Api/BigoRequest.cs deleted file mode 100644 index fe217ba..0000000 --- a/Assets/BigoAds/Scripts/Api/BigoRequest.cs +++ /dev/null @@ -1,47 +0,0 @@ -using System; -using UnityEngine; -using BigoAds.Scripts.Api.Constant; - -namespace BigoAds.Scripts.Api -{ - [Serializable] - public class BigoRequest - { - [SerializeField] private string extraInfo; - [SerializeField] private int age; - [SerializeField] private BGAdGender gender; - [SerializeField] private long activatedTime; - - public string ExtraInfoJson - { - get => extraInfo; - set => extraInfo = value; - } - - /// Only works on Android - public int Age - { - get => age; - set => age = value; - } - - /// Only works on Android - public BGAdGender Gender - { - get => gender; - set => gender = value; - } - - /// Only works on Android - public long ActivatedTime - { - get => activatedTime; - set => activatedTime = value; - } - - public string ToJson() - { - return JsonUtility.ToJson(this); - } - } -} \ No newline at end of file diff --git a/Assets/BigoAds/Scripts/Api/BigoRequest.cs.meta b/Assets/BigoAds/Scripts/Api/BigoRequest.cs.meta deleted file mode 100644 index b054061..0000000 --- a/Assets/BigoAds/Scripts/Api/BigoRequest.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: 2707ffe474e6443d6a5260876d5b1370 -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Assets/BigoAds/Scripts/Api/BigoRewardedAd.cs b/Assets/BigoAds/Scripts/Api/BigoRewardedAd.cs deleted file mode 100644 index 8d594b2..0000000 --- a/Assets/BigoAds/Scripts/Api/BigoRewardedAd.cs +++ /dev/null @@ -1,29 +0,0 @@ -using System; -using BigoAds.Scripts.Common; - -namespace BigoAds.Scripts.Api -{ - public class BigoRewardedAd : BigoBaseAd - { - public event Action OnUserEarnedReward; - - public BigoRewardedAd(string slotId) : base(slotId, BigoAdSdk.GetClientFactory().BuildRewardedAdClient()) - { - var rewardedAdClient = (IRewardedAd) ADClient; - rewardedAdClient.OnUserEarnedReward += InvokeOnUserEarnedReward; - } - - - private void InvokeOnUserEarnedReward() - { - if (CallbackOnMainThread) - { - BigoDispatcher.PostTask((() => { OnUserEarnedReward?.Invoke(); })); - } - else - { - OnUserEarnedReward?.Invoke(); - } - } - } -} \ No newline at end of file diff --git a/Assets/BigoAds/Scripts/Api/BigoRewardedAd.cs.meta b/Assets/BigoAds/Scripts/Api/BigoRewardedAd.cs.meta deleted file mode 100644 index 95f6da4..0000000 --- a/Assets/BigoAds/Scripts/Api/BigoRewardedAd.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: 2f745c8797b25430685a5a08b34f0d9f -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Assets/BigoAds/Scripts/Api/BigoRewardedRequest.cs b/Assets/BigoAds/Scripts/Api/BigoRewardedRequest.cs deleted file mode 100644 index 9b36137..0000000 --- a/Assets/BigoAds/Scripts/Api/BigoRewardedRequest.cs +++ /dev/null @@ -1,10 +0,0 @@ -using System; - -namespace BigoAds.Scripts.Api -{ - [Serializable] - - public class BigoRewardedRequest : BigoRequest - { - } -} \ No newline at end of file diff --git a/Assets/BigoAds/Scripts/Api/BigoRewardedRequest.cs.meta b/Assets/BigoAds/Scripts/Api/BigoRewardedRequest.cs.meta deleted file mode 100644 index 2c3f5c6..0000000 --- a/Assets/BigoAds/Scripts/Api/BigoRewardedRequest.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: 38f4a763a1fc9429ca87c62eed4b4645 -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Assets/BigoAds/Scripts/Api/BigoSplashAd.cs b/Assets/BigoAds/Scripts/Api/BigoSplashAd.cs deleted file mode 100644 index 14dac42..0000000 --- a/Assets/BigoAds/Scripts/Api/BigoSplashAd.cs +++ /dev/null @@ -1,11 +0,0 @@ -using BigoAds.Scripts.Common; - -namespace BigoAds.Scripts.Api -{ - public class BigoSplashAd : BigoBaseAd - { - public BigoSplashAd(string slotId) : base(slotId, BigoAdSdk.GetClientFactory().BuildSplashAdClient()) - { - } - } -} \ No newline at end of file diff --git a/Assets/BigoAds/Scripts/Api/BigoSplashAd.cs.meta b/Assets/BigoAds/Scripts/Api/BigoSplashAd.cs.meta deleted file mode 100644 index 24bf412..0000000 --- a/Assets/BigoAds/Scripts/Api/BigoSplashAd.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: 61b62ca232d2e42788e61f33d7784209 -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Assets/BigoAds/Scripts/Api/BigoSplashRequest.cs b/Assets/BigoAds/Scripts/Api/BigoSplashRequest.cs deleted file mode 100644 index e6d9239..0000000 --- a/Assets/BigoAds/Scripts/Api/BigoSplashRequest.cs +++ /dev/null @@ -1,10 +0,0 @@ -using System; - -namespace BigoAds.Scripts.Api -{ - [Serializable] - - public class BigoSplashRequest : BigoRequest - { - } -} \ No newline at end of file diff --git a/Assets/BigoAds/Scripts/Api/BigoSplashRequest.cs.meta b/Assets/BigoAds/Scripts/Api/BigoSplashRequest.cs.meta deleted file mode 100644 index 54ba905..0000000 --- a/Assets/BigoAds/Scripts/Api/BigoSplashRequest.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: afdf808922a744419b5db1fdd4ca18b9 -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Assets/BigoAds/Scripts/Api/Constant.meta b/Assets/BigoAds/Scripts/Api/Constant.meta deleted file mode 100644 index df5fa74..0000000 --- a/Assets/BigoAds/Scripts/Api/Constant.meta +++ /dev/null @@ -1,8 +0,0 @@ -fileFormatVersion: 2 -guid: 0762cd7e46c3c43e5a32b1558643eb74 -folderAsset: yes -DefaultImporter: - externalObjects: {} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Assets/BigoAds/Scripts/Api/Constant/BGAdGender.cs b/Assets/BigoAds/Scripts/Api/Constant/BGAdGender.cs deleted file mode 100644 index 462edff..0000000 --- a/Assets/BigoAds/Scripts/Api/Constant/BGAdGender.cs +++ /dev/null @@ -1,10 +0,0 @@ -using System; -namespace BigoAds.Scripts.Api.Constant -{ - [Serializable] - public enum BGAdGender - { - Female = 1, - Male = 2 - } -} \ No newline at end of file diff --git a/Assets/BigoAds/Scripts/Api/Constant/BGAdGender.cs.meta b/Assets/BigoAds/Scripts/Api/Constant/BGAdGender.cs.meta deleted file mode 100644 index f517742..0000000 --- a/Assets/BigoAds/Scripts/Api/Constant/BGAdGender.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: 2784802c5b5b34470a0500118ccb7f55 -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Assets/BigoAds/Scripts/Api/Constant/BGAdLossReason.cs b/Assets/BigoAds/Scripts/Api/Constant/BGAdLossReason.cs deleted file mode 100644 index 1e8b77e..0000000 --- a/Assets/BigoAds/Scripts/Api/Constant/BGAdLossReason.cs +++ /dev/null @@ -1,13 +0,0 @@ -using System; - -namespace BigoAds.Scripts.Api.Constant -{ - [Serializable] - public enum BGAdLossReason - { - InternalError = 1, - Timeout = 2, - LowerThanFloorPrice = 100, - LowerThanHighestPrice = 101 - } -} \ No newline at end of file diff --git a/Assets/BigoAds/Scripts/Api/Constant/BGAdLossReason.cs.meta b/Assets/BigoAds/Scripts/Api/Constant/BGAdLossReason.cs.meta deleted file mode 100644 index c16d048..0000000 --- a/Assets/BigoAds/Scripts/Api/Constant/BGAdLossReason.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: 303b2e25e09c44797a167b642310a319 -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Assets/BigoAds/Scripts/Api/Constant/BigoBannerSize.cs b/Assets/BigoAds/Scripts/Api/Constant/BigoBannerSize.cs deleted file mode 100644 index 0d26ace..0000000 --- a/Assets/BigoAds/Scripts/Api/Constant/BigoBannerSize.cs +++ /dev/null @@ -1,23 +0,0 @@ -using System; -using UnityEngine; - -namespace BigoAds.Scripts.Api.Constant -{ - [Serializable] - public struct BigoBannerSize - { - public static readonly BigoBannerSize BANNER_W_320_H_50 = new BigoBannerSize(320,50); - public static readonly BigoBannerSize BANNER_W_300_H_250 = new BigoBannerSize(300,250); - - [SerializeField] private int width; - [SerializeField] private int height; - public int Width => width; - public int Height => height; - - public BigoBannerSize(int width, int height) - { - this.width = width; - this.height = height; - } - } -} \ No newline at end of file diff --git a/Assets/BigoAds/Scripts/Api/Constant/BigoBannerSize.cs.meta b/Assets/BigoAds/Scripts/Api/Constant/BigoBannerSize.cs.meta deleted file mode 100644 index 2a3dff5..0000000 --- a/Assets/BigoAds/Scripts/Api/Constant/BigoBannerSize.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: 4a4411a50cfc94717b30325ceed3d52f -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Assets/BigoAds/Scripts/Api/Constant/BigoPosition.cs b/Assets/BigoAds/Scripts/Api/Constant/BigoPosition.cs deleted file mode 100644 index 44a6cdb..0000000 --- a/Assets/BigoAds/Scripts/Api/Constant/BigoPosition.cs +++ /dev/null @@ -1,12 +0,0 @@ -using System; - -namespace BigoAds.Scripts.Api.Constant -{ - [Serializable] - public enum BigoPosition - { - Top = 0, - Middle = 1, - Bottom = 2 - } -} \ No newline at end of file diff --git a/Assets/BigoAds/Scripts/Api/Constant/BigoPosition.cs.meta b/Assets/BigoAds/Scripts/Api/Constant/BigoPosition.cs.meta deleted file mode 100644 index 409da19..0000000 --- a/Assets/BigoAds/Scripts/Api/Constant/BigoPosition.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: 6511065ffc7f44235bacb3ee16a87f5a -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Assets/BigoAds/Scripts/Api/Constant/ConsentOptions.cs b/Assets/BigoAds/Scripts/Api/Constant/ConsentOptions.cs deleted file mode 100644 index 5b49a5e..0000000 --- a/Assets/BigoAds/Scripts/Api/Constant/ConsentOptions.cs +++ /dev/null @@ -1,13 +0,0 @@ -using System; - -namespace BigoAds.Scripts.Api.Constant -{ - [Serializable] - public enum ConsentOptions - { - GDPR, - CCPA, - LGPD, - COPPA - } -} \ No newline at end of file diff --git a/Assets/BigoAds/Scripts/Api/Constant/ConsentOptions.cs.meta b/Assets/BigoAds/Scripts/Api/Constant/ConsentOptions.cs.meta deleted file mode 100644 index c1ae974..0000000 --- a/Assets/BigoAds/Scripts/Api/Constant/ConsentOptions.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: 7867ac15c426649a6aa633a772d54879 -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Assets/BigoAds/Scripts/Common.meta b/Assets/BigoAds/Scripts/Common.meta deleted file mode 100644 index f8e8c89..0000000 --- a/Assets/BigoAds/Scripts/Common.meta +++ /dev/null @@ -1,8 +0,0 @@ -fileFormatVersion: 2 -guid: 8b4db2c2875384f11b89eb7dec28b823 -folderAsset: yes -DefaultImporter: - externalObjects: {} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Assets/BigoAds/Scripts/Common/BigoBaseAd.cs b/Assets/BigoAds/Scripts/Common/BigoBaseAd.cs deleted file mode 100644 index 955822c..0000000 --- a/Assets/BigoAds/Scripts/Common/BigoBaseAd.cs +++ /dev/null @@ -1,218 +0,0 @@ -using System; -using BigoAds.Scripts.Api; -using BigoAds.Scripts.Api.Constant; - -namespace BigoAds.Scripts.Common -{ - public class BigoBaseAd where T : BigoRequest - { - /// - /// event for load ad success - /// - public event Action OnLoad; - - /// - /// load ad failed with error code and error message - /// - public event Action OnLoadFailed; - - /// - /// event for ad impression - /// - public event Action OnAdShowed; - - /// - /// event for ad be clicked - /// - public event Action OnAdClicked; - - /// - /// event for ad be closed - /// - public event Action OnAdDismissed; - - /// - /// event for ad error - /// - public event Action OnAdError; - - private readonly string _slotId; - - private bool _isAdLoaded; - - protected readonly IBigoAd ADClient; - - public bool CallbackOnMainThread { get; set; } = true; - - private BigoAdBid _bid; - - protected BigoBaseAd(string id, IBigoAd adClient) - { - _slotId = id; - ADClient = adClient; - InitEvent(ADClient); - } - - private void InitEvent(IBigoAd adClient) - { - adClient.OnLoad += InvokeOnLoad; - adClient.OnLoadFailed += InvokeOnLoadFailed; - - adClient.OnAdShowed += InvokeOnAdShowed; - adClient.OnAdClicked += InvokeOnAdClicked; - adClient.OnAdDismissed += InvokeOnAdDismissed; - adClient.OnAdError += InvokeOnAdError; - } - - public void Load(T request) - { - if (_isAdLoaded) - { - InvokeOnLoad(); - } - if (string.IsNullOrEmpty(_slotId)) - { - InvokeOnLoadFailed(-1, "slotId must be not null"); - return; - } - - if (!BigoAdSdk.IsInitSuccess()) - { - InvokeOnLoadFailed(-1, "sdk has not init"); - return; - } - ADClient?.Load(_slotId, request); - } - - public virtual void Show() - { - _isAdLoaded = false; - ADClient?.Show(); - } - - public void DestroyAd() - { - ADClient?.Destroy(); - } - - public bool IsLoaded() - { - return _isAdLoaded; - } - - public bool IsExpired() - { - return ADClient == null ? false : ADClient.IsExpired(); - } - - public string GetExtraInfo(String key) - { - return ADClient == null ? "" : ADClient.GetExtraInfo(key); - } - - private void InvokeOnLoad() - { - OnLoad?.Invoke(); - _isAdLoaded = true; - } - - protected void InvokeOnLoadFailed(int errorCode, string errorMessage) - { - if (CallbackOnMainThread) - { - BigoDispatcher.PostTask((() => { OnLoadFailed?.Invoke(errorCode, errorMessage); })); - } - else - { - OnLoadFailed?.Invoke(errorCode, errorMessage); - } - } - - - private void InvokeOnAdShowed() - { - if (CallbackOnMainThread) - { - BigoDispatcher.PostTask((() => { OnAdShowed?.Invoke(); })); - } - else - { - OnAdShowed?.Invoke(); - } - } - - private void InvokeOnAdClicked() - { - if (CallbackOnMainThread) - { - BigoDispatcher.PostTask((() => { OnAdClicked?.Invoke(); })); - } - else - { - OnAdClicked?.Invoke(); - } - } - - private void InvokeOnAdDismissed() - { - if (CallbackOnMainThread) - { - BigoDispatcher.PostTask((() => { OnAdDismissed?.Invoke(); })); - } - else - { - OnAdDismissed?.Invoke(); - } - } - - private void InvokeOnAdError(int errorCode, string errorMessage) - { - if (CallbackOnMainThread) - { - BigoDispatcher.PostTask((() => { OnAdError?.Invoke(errorCode, errorMessage); })); - } - else - { - OnAdError?.Invoke(errorCode, errorMessage); - } - } - - public BigoAdBid GetBid() - { - if (ADClient == null) return null; - if (!ADClient.IsClientBidding()) return null; - if (_bid == null) - { - _bid = new BigoAdBid(ADClient); - } - return _bid; - } - - public class BigoAdBid : IClientBidding - { - protected readonly IBigoAd _ADClient; - - public BigoAdBid(IBigoAd ADClient) - { - _ADClient = ADClient; - } - /// get price - public double getPrice() - { - return _ADClient == null ? 0 : _ADClient.getPrice(); - } - - ///notify win - public void notifyWin(double secPrice, string secBidder) - { - _ADClient?.notifyWin(secPrice, secBidder); - } - - ///notify loss - public void notifyLoss(double firstPrice, string firstBidder, BGAdLossReason lossReason) - { - _ADClient?.notifyLoss(firstPrice, firstBidder, lossReason); - } - } - } -} \ No newline at end of file diff --git a/Assets/BigoAds/Scripts/Common/BigoBaseAd.cs.meta b/Assets/BigoAds/Scripts/Common/BigoBaseAd.cs.meta deleted file mode 100644 index f0dae98..0000000 --- a/Assets/BigoAds/Scripts/Common/BigoBaseAd.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: 8554386bfcec3403cb6fab89c7a35f31 -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Assets/BigoAds/Scripts/Common/BigoDispatcher.cs b/Assets/BigoAds/Scripts/Common/BigoDispatcher.cs deleted file mode 100644 index 18f0d61..0000000 --- a/Assets/BigoAds/Scripts/Common/BigoDispatcher.cs +++ /dev/null @@ -1,86 +0,0 @@ -namespace BigoAds.Scripts.Common -{ - using System; - using System.Collections.Generic; - using UnityEngine; - - /// - /// The unity thread dispatcher. - /// - [DisallowMultipleComponent] - internal sealed class BigoDispatcher : MonoBehaviour - { - private static bool _instanceCreated; - - // The thread safe task queue. - private static readonly List PostTasks = new List(); - - // The executing buffer. - private static readonly List Executing = new List(); - - static BigoDispatcher() - { - CreateInstance(); - } - - /// - /// Work thread post a task to the main thread. - /// - public static void PostTask(Action task) - { - lock (PostTasks) - { - PostTasks.Add(task); - } - } - - /// - /// Start to run this dispatcher. - /// - [RuntimeInitializeOnLoadMethod] - private static void CreateInstance() - { - if (_instanceCreated || !Application.isPlaying) return; - var go = new GameObject( - "BigoDispatcher", typeof(BigoDispatcher)); - DontDestroyOnLoad(go); - _instanceCreated = true; - } - - private void OnDestroy() - { - lock (PostTasks) - { - PostTasks.Clear(); - } - - Executing.Clear(); - } - - private void Update() - { - lock (PostTasks) - { - if (PostTasks.Count > 0) - { - Executing.AddRange(PostTasks); - PostTasks.Clear(); - } - } - - foreach (var task in Executing) - { - try - { - task(); - } - catch (Exception e) - { - Debug.LogError(e.Message, this); - } - } - - Executing.Clear(); - } - } -} \ No newline at end of file diff --git a/Assets/BigoAds/Scripts/Common/BigoDispatcher.cs.meta b/Assets/BigoAds/Scripts/Common/BigoDispatcher.cs.meta deleted file mode 100644 index 95d2986..0000000 --- a/Assets/BigoAds/Scripts/Common/BigoDispatcher.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: 2d1af23e5ee93476382ea747bb4b6985 -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Assets/BigoAds/Scripts/Common/IBannerAd.cs b/Assets/BigoAds/Scripts/Common/IBannerAd.cs deleted file mode 100644 index b47ae5d..0000000 --- a/Assets/BigoAds/Scripts/Common/IBannerAd.cs +++ /dev/null @@ -1,10 +0,0 @@ -using BigoAds.Scripts.Api; -using BigoAds.Scripts.Api.Constant; - -namespace BigoAds.Scripts.Common -{ - public interface IBannerAd : IBigoAd - { - void SetPosition(BigoPosition position); - } -} \ No newline at end of file diff --git a/Assets/BigoAds/Scripts/Common/IBannerAd.cs.meta b/Assets/BigoAds/Scripts/Common/IBannerAd.cs.meta deleted file mode 100644 index 07400ff..0000000 --- a/Assets/BigoAds/Scripts/Common/IBannerAd.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: 9632da3a0b8674b539385af7fec47c33 -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Assets/BigoAds/Scripts/Common/IBigoAd.cs b/Assets/BigoAds/Scripts/Common/IBigoAd.cs deleted file mode 100644 index 8bebc72..0000000 --- a/Assets/BigoAds/Scripts/Common/IBigoAd.cs +++ /dev/null @@ -1,22 +0,0 @@ -using System; -using BigoAds.Scripts.Api; - -namespace BigoAds.Scripts.Common -{ - public interface IBigoAd : IClientBidding where T : BigoRequest - { - event Action OnLoad; - event Action OnLoadFailed; - event Action OnAdShowed; - event Action OnAdClicked; - event Action OnAdDismissed; - event Action OnAdError; - void Load(string slotId, T request); - bool IsLoaded(); - bool IsExpired(); - void Show(); - void Destroy(); - bool IsClientBidding(); - string GetExtraInfo(String key); - } -} \ No newline at end of file diff --git a/Assets/BigoAds/Scripts/Common/IBigoAd.cs.meta b/Assets/BigoAds/Scripts/Common/IBigoAd.cs.meta deleted file mode 100644 index aedaab2..0000000 --- a/Assets/BigoAds/Scripts/Common/IBigoAd.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: ac3c835ae5b8f421192fb72d32c9c6c1 -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Assets/BigoAds/Scripts/Common/IClientBidding.cs b/Assets/BigoAds/Scripts/Common/IClientBidding.cs deleted file mode 100644 index 941cb45..0000000 --- a/Assets/BigoAds/Scripts/Common/IClientBidding.cs +++ /dev/null @@ -1,16 +0,0 @@ -using BigoAds.Scripts.Api.Constant; - -namespace BigoAds.Scripts.Common -{ - public interface IClientBidding - { - /// get price - double getPrice(); - - ///notify win - void notifyWin(double secPrice, string secBidder); - - ///notify loss - void notifyLoss(double firstPrice, string firstBidder, BGAdLossReason lossReason); - } -} \ No newline at end of file diff --git a/Assets/BigoAds/Scripts/Common/IClientBidding.cs.meta b/Assets/BigoAds/Scripts/Common/IClientBidding.cs.meta deleted file mode 100644 index d02114a..0000000 --- a/Assets/BigoAds/Scripts/Common/IClientBidding.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: be474d5a8f44740eeac370fd98153d15 -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Assets/BigoAds/Scripts/Common/IClientFactory.cs b/Assets/BigoAds/Scripts/Common/IClientFactory.cs deleted file mode 100644 index 9dd9700..0000000 --- a/Assets/BigoAds/Scripts/Common/IClientFactory.cs +++ /dev/null @@ -1,13 +0,0 @@ -namespace BigoAds.Scripts.Common -{ - public interface IClientFactory - { - ISDK BuildSDKClient(); - IBannerAd BuildBannerAdClient(); - INativeAd BuildNativeAdClient(); - IInterstitialAd BuildInterstitialAdClient(); - IPopupAd BuildPopupAdClient(); - ISplashAd BuildSplashAdClient(); - IRewardedAd BuildRewardedAdClient(); - } -} \ No newline at end of file diff --git a/Assets/BigoAds/Scripts/Common/IClientFactory.cs.meta b/Assets/BigoAds/Scripts/Common/IClientFactory.cs.meta deleted file mode 100644 index 4061cfb..0000000 --- a/Assets/BigoAds/Scripts/Common/IClientFactory.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: b2cb5f6ac1b7f463db75ac0bfa7d7fbe -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Assets/BigoAds/Scripts/Common/IInterstitialAd.cs b/Assets/BigoAds/Scripts/Common/IInterstitialAd.cs deleted file mode 100644 index 7678caf..0000000 --- a/Assets/BigoAds/Scripts/Common/IInterstitialAd.cs +++ /dev/null @@ -1,8 +0,0 @@ -using BigoAds.Scripts.Api; - -namespace BigoAds.Scripts.Common -{ - public interface IInterstitialAd : IBigoAd - { - } -} \ No newline at end of file diff --git a/Assets/BigoAds/Scripts/Common/IInterstitialAd.cs.meta b/Assets/BigoAds/Scripts/Common/IInterstitialAd.cs.meta deleted file mode 100644 index 4b86fca..0000000 --- a/Assets/BigoAds/Scripts/Common/IInterstitialAd.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: 2d31ee1df8a074b81a5575e9a7735b2a -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Assets/BigoAds/Scripts/Common/INativeAd.cs b/Assets/BigoAds/Scripts/Common/INativeAd.cs deleted file mode 100644 index 530387d..0000000 --- a/Assets/BigoAds/Scripts/Common/INativeAd.cs +++ /dev/null @@ -1,10 +0,0 @@ -using BigoAds.Scripts.Api; -using BigoAds.Scripts.Api.Constant; - -namespace BigoAds.Scripts.Common -{ - public interface INativeAd : IBigoAd - { - void SetPosition(BigoPosition position); - } -} \ No newline at end of file diff --git a/Assets/BigoAds/Scripts/Common/INativeAd.cs.meta b/Assets/BigoAds/Scripts/Common/INativeAd.cs.meta deleted file mode 100644 index 2c2e818..0000000 --- a/Assets/BigoAds/Scripts/Common/INativeAd.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: eef5c6b4f590c4ceaac635a2992576ef -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Assets/BigoAds/Scripts/Common/IPopupAd.cs b/Assets/BigoAds/Scripts/Common/IPopupAd.cs deleted file mode 100644 index 9cf8489..0000000 --- a/Assets/BigoAds/Scripts/Common/IPopupAd.cs +++ /dev/null @@ -1,8 +0,0 @@ -using BigoAds.Scripts.Api; - -namespace BigoAds.Scripts.Common -{ - public interface IPopupAd : IBigoAd - { - } -} \ No newline at end of file diff --git a/Assets/BigoAds/Scripts/Common/IPopupAd.cs.meta b/Assets/BigoAds/Scripts/Common/IPopupAd.cs.meta deleted file mode 100644 index f0866ad..0000000 --- a/Assets/BigoAds/Scripts/Common/IPopupAd.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: 9e767b9004c4f4ca19baa6f54c409c5d -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Assets/BigoAds/Scripts/Common/IRewardedAd.cs b/Assets/BigoAds/Scripts/Common/IRewardedAd.cs deleted file mode 100644 index 2b549ab..0000000 --- a/Assets/BigoAds/Scripts/Common/IRewardedAd.cs +++ /dev/null @@ -1,10 +0,0 @@ -using System; -using BigoAds.Scripts.Api; - -namespace BigoAds.Scripts.Common -{ - public interface IRewardedAd : IBigoAd - { - event Action OnUserEarnedReward; - } -} \ No newline at end of file diff --git a/Assets/BigoAds/Scripts/Common/IRewardedAd.cs.meta b/Assets/BigoAds/Scripts/Common/IRewardedAd.cs.meta deleted file mode 100644 index a705be0..0000000 --- a/Assets/BigoAds/Scripts/Common/IRewardedAd.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: 0b3baa8d362724d19997664f34f4320d -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Assets/BigoAds/Scripts/Common/ISDK.cs b/Assets/BigoAds/Scripts/Common/ISDK.cs deleted file mode 100644 index 67113a0..0000000 --- a/Assets/BigoAds/Scripts/Common/ISDK.cs +++ /dev/null @@ -1,40 +0,0 @@ -using BigoAds.Scripts.Api; -using BigoAds.Scripts.Api.Constant; - -namespace BigoAds.Scripts.Common -{ - public interface ISDK - { - /// - /// Starts the Bigo SDK - /// - void Init(BigoAdConfig config, BigoAdSdk.InitResultDelegate initResultDelegate); - - //// - /// The SDK initialization state - //// - bool IsInitSuccess(); - - /////// - /// Bigo SDK version - /// //// - string GetSDKVersion(); - - - /////// - /// Bigo SDK version name - /// //// - string GetSDKVersionName(); - - /////// - /// Bigo SDK set user consent - /// //// - void SetUserConsent(ConsentOptions option, bool consent); - - /////// - /// Only works on Android - /// Bigo SDK set user consent - /// //// - void AddExtraHost(string country, string host); - } -} \ No newline at end of file diff --git a/Assets/BigoAds/Scripts/Common/ISDK.cs.meta b/Assets/BigoAds/Scripts/Common/ISDK.cs.meta deleted file mode 100644 index 5b97bc8..0000000 --- a/Assets/BigoAds/Scripts/Common/ISDK.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: 00ad18b48fa1047ee98bd415dd127f65 -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Assets/BigoAds/Scripts/Common/ISplashAd.cs b/Assets/BigoAds/Scripts/Common/ISplashAd.cs deleted file mode 100644 index 3cf05a6..0000000 --- a/Assets/BigoAds/Scripts/Common/ISplashAd.cs +++ /dev/null @@ -1,8 +0,0 @@ -using BigoAds.Scripts.Api; - -namespace BigoAds.Scripts.Common -{ - public interface ISplashAd:IBigoAd - { - } -} \ No newline at end of file diff --git a/Assets/BigoAds/Scripts/Common/ISplashAd.cs.meta b/Assets/BigoAds/Scripts/Common/ISplashAd.cs.meta deleted file mode 100644 index 6aa7ff1..0000000 --- a/Assets/BigoAds/Scripts/Common/ISplashAd.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: e1105e67678354e71850311744a989c3 -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Assets/BigoAds/Scripts/Platforms.meta b/Assets/BigoAds/Scripts/Platforms.meta deleted file mode 100644 index 842ddfd..0000000 --- a/Assets/BigoAds/Scripts/Platforms.meta +++ /dev/null @@ -1,8 +0,0 @@ -fileFormatVersion: 2 -guid: f730f3e43d10941928ac676ed88c7ee4 -folderAsset: yes -DefaultImporter: - externalObjects: {} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Assets/BigoAds/Scripts/Platforms/Android.meta b/Assets/BigoAds/Scripts/Platforms/Android.meta deleted file mode 100644 index 9103522..0000000 --- a/Assets/BigoAds/Scripts/Platforms/Android.meta +++ /dev/null @@ -1,8 +0,0 @@ -fileFormatVersion: 2 -guid: e595ff25130d84811aae9bbe30751d78 -folderAsset: yes -DefaultImporter: - externalObjects: {} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Assets/BigoAds/Scripts/Platforms/Android/AdHelper.cs b/Assets/BigoAds/Scripts/Platforms/Android/AdHelper.cs deleted file mode 100644 index 89fef60..0000000 --- a/Assets/BigoAds/Scripts/Platforms/Android/AdHelper.cs +++ /dev/null @@ -1,99 +0,0 @@ -using UnityEngine; -using BigoAds.Scripts.Api; -using BigoAds.Scripts.Common; -using BigoAds.Scripts.Api.Constant; - -public class AdHelper -{ - public static void ShowBannerAd(AndroidJavaObject bannerAd) - { - ShowBannerAd(bannerAd, BigoPosition.Bottom); - } - - public static void ShowBannerAd(AndroidJavaObject bannerAd, BigoPosition position) - { - if (bannerAd == null) return; - var adView = bannerAd.Call("adView"); - SetViewPosition(adView, position); - } - - public static void ShowNativeAd(AndroidJavaObject nativeAd) - { - ShowNativeAd(nativeAd, BigoPosition.Bottom); - } - - public static void RemoveAdView() - { - var unityPlayer = new AndroidJavaClass("com.unity3d.player.UnityPlayer"); - var activity = unityPlayer.GetStatic("currentActivity"); - new AndroidJavaClass("sg.bigo.ads.AdHelper").CallStatic("removeAdView", activity); - } - - public static void ShowNativeAd(AndroidJavaObject nativeAd, BigoPosition position) - { - if (nativeAd == null) return; - var unityPlayer = new AndroidJavaClass("com.unity3d.player.UnityPlayer"); - var activity = unityPlayer.GetStatic("currentActivity"); - var adView = new AndroidJavaClass("sg.bigo.ads.AdHelper").CallStatic("renderNativeAdView", activity, nativeAd, "layout_bigo_native_ad"); - SetViewPosition(adView, position); - } - - public static void SetViewPosition(AndroidJavaObject adView, BigoPosition position) - { - var unityPlayer = new AndroidJavaClass("com.unity3d.player.UnityPlayer"); - var activity = unityPlayer.GetStatic("currentActivity"); - int positionInt; - switch (position) - { - case BigoPosition.Top: - positionInt = 48; - break; - case BigoPosition.Middle: - positionInt = 16; - break; - case BigoPosition.Bottom: - default: - positionInt = 80; - break; - } - new AndroidJavaClass("sg.bigo.ads.AdHelper").CallStatic("addAdView", activity, adView, positionInt); - } - - - public abstract class Task : AndroidJavaProxy - { - public Task() : base("java.lang.Runnable") - { - } - - public abstract void run(); - } - - public static void DestroyAd(AndroidJavaObject ad) - { - if (ad != null) { - PostToAndroidMainThread(new DestryAdTask(ad)); - } - } - - private class DestryAdTask : Task - { - public AndroidJavaObject Ad; - - public DestryAdTask(AndroidJavaObject ad) - { - this.Ad = ad; - } - - public override void run() - { - Ad.Call("destroy"); - AdHelper.RemoveAdView(); - } - } - - public static void PostToAndroidMainThread(Task task) - { - new AndroidJavaClass("sg.bigo.ads.AdHelper").CallStatic("postToAndroidMainThread", task); - } -} \ No newline at end of file diff --git a/Assets/BigoAds/Scripts/Platforms/Android/AdHelper.cs.meta b/Assets/BigoAds/Scripts/Platforms/Android/AdHelper.cs.meta deleted file mode 100644 index a1fed7c..0000000 --- a/Assets/BigoAds/Scripts/Platforms/Android/AdHelper.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: c7b17fadc228c48b6900058970865c98 -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Assets/BigoAds/Scripts/Platforms/Android/AdHelper.java b/Assets/BigoAds/Scripts/Platforms/Android/AdHelper.java deleted file mode 100755 index 6900850..0000000 --- a/Assets/BigoAds/Scripts/Platforms/Android/AdHelper.java +++ /dev/null @@ -1,106 +0,0 @@ -package sg.bigo.ads; - -import android.app.Activity; -import android.content.Context; -import android.os.Handler; -import android.os.Looper; -import android.util.Log; -import android.view.Gravity; -import android.view.LayoutInflater; -import android.view.View; -import android.view.ViewGroup; -import android.widget.Button; -import android.widget.FrameLayout; -import android.widget.ImageView; -import android.widget.TextView; - -import java.util.ArrayList; -import java.util.List; - -import sg.bigo.ads.api.AdOptionsView; -import sg.bigo.ads.api.AdTag; -import sg.bigo.ads.api.MediaView; -import sg.bigo.ads.api.NativeAd; - -public class AdHelper { - - public static void postToAndroidMainThread(Runnable runnable) { - new Handler(Looper.getMainLooper()).post(runnable); - } - - public static void addAdView(Activity activity, View adView, int position) { - if (adView == null) return; - ViewGroup contentView = activity.findViewById(android.R.id.content); - String tag = "ad_container"; - ViewGroup adContainer = contentView.findViewWithTag(tag); - if (adContainer == null) { - adContainer = new FrameLayout(activity); - adContainer.setTag(tag); - } - contentView.removeView(adContainer); - FrameLayout.LayoutParams layoutParams = new FrameLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT, position); - contentView.addView(adContainer, layoutParams); - adContainer.removeAllViews(); - adContainer.addView(adView); - } - - public static void removeAdView(Activity activity) - { - ViewGroup contentView = activity.findViewById(android.R.id.content); - String tag = "ad_container"; - ViewGroup adContainer = contentView.findViewWithTag(tag); - if (adContainer == null) return; - adContainer.removeAllViews(); - } - - public static int getLayoutIdByResName(Activity activity, String resName) { - return activity.getResources().getIdentifier(resName, "layout", activity.getPackageName()); - } - - public static int getDrawableIdByResName(Activity activity, String resName) { - return activity.getResources().getIdentifier(resName, "drawable", activity.getPackageName()); - } - - public static View renderNativeAdView(Activity activity, NativeAd nativeAd, String layoutResName) { - int layoutId = getLayoutIdByResName(activity, layoutResName); - if (layoutId <= 0) { - Log.w("BigoAds-Unity", "Invalid res name: " + layoutResName); - return null; - } - View view = LayoutInflater.from(activity).inflate(layoutId, null, false); - if (!(view instanceof ViewGroup)) { - return view; - } - ViewGroup nativeView = (ViewGroup) view; - TextView titleView = findViewByIdName(nativeView, "native_title"); - TextView descriptionView = findViewByIdName(nativeView, "native_description"); - TextView warningView = findViewByIdName(nativeView, "native_warning"); - Button ctaButton = findViewByIdName(nativeView, "native_cta"); - MediaView mediaView = findViewByIdName(nativeView, "native_media_view"); - ImageView iconView = findViewByIdName(nativeView, "native_icon_view"); - AdOptionsView optionsView = findViewByIdName(nativeView, "native_option_view"); - - titleView.setTag(AdTag.TITLE); - descriptionView.setTag(AdTag.DESCRIPTION); - warningView.setTag(AdTag.WARNING); - ctaButton.setTag(AdTag.CALL_TO_ACTION); - - titleView.setText(nativeAd.getTitle()); - descriptionView.setText(nativeAd.getDescription()); - warningView.setText(nativeAd.getWarning()); - ctaButton.setText(nativeAd.getCallToAction()); - - List clickableViews = new ArrayList<>(); - clickableViews.add(titleView); - clickableViews.add(descriptionView); - clickableViews.add(ctaButton); - nativeAd.registerViewForInteraction(nativeView, mediaView, iconView, optionsView, clickableViews); - return nativeView; - } - - private static T findViewByIdName(ViewGroup parent, String name) { - Context context = parent.getContext(); - int id = context.getResources().getIdentifier(name, "id", context.getPackageName()); - return parent.findViewById(id); - } -} diff --git a/Assets/BigoAds/Scripts/Platforms/Android/AdHelper.java.meta b/Assets/BigoAds/Scripts/Platforms/Android/AdHelper.java.meta deleted file mode 100644 index ab4bd1d..0000000 --- a/Assets/BigoAds/Scripts/Platforms/Android/AdHelper.java.meta +++ /dev/null @@ -1,32 +0,0 @@ -fileFormatVersion: 2 -guid: 0edf95022edcd4f9d8919629603eb5e1 -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/BigoAds/Scripts/Platforms/Android/AdInteractionCallback.cs b/Assets/BigoAds/Scripts/Platforms/Android/AdInteractionCallback.cs deleted file mode 100644 index 3735717..0000000 --- a/Assets/BigoAds/Scripts/Platforms/Android/AdInteractionCallback.cs +++ /dev/null @@ -1,53 +0,0 @@ -#if UNITY_ANDROID - -using System; -using UnityEngine; - -namespace BigoAds.Scripts.Platforms.Android -{ - public class AdInteractionCallback : AndroidJavaProxy - { - private readonly Action OnAdShowed; - protected readonly Action OnAdDismissed; - private readonly Action OnAdClicked; - private readonly Action OnAdError; - private const string ListenerName = AndroidPlatformTool.ClassPackage + ".api.AdInteractionListener"; - - public AdInteractionCallback(Action onAdShowed, Action onAdClicked, Action onAdDismissed, Action onAdError, - string listenerName = ListenerName) : base(listenerName) - { - OnAdShowed = onAdShowed; - OnAdDismissed = onAdDismissed; - OnAdClicked = onAdClicked; - OnAdError = onAdError; - } - - public void onAdImpression() - { - OnAdShowed?.Invoke(); - } - - public void onAdClosed() - { - OnAdDismissed?.Invoke(); - } - - public void onAdClicked() - { - OnAdClicked?.Invoke(); - } - - public void onAdError(AndroidJavaObject error) - { - var code = error.Call("getCode"); - var message = error.Call("getMessage"); - OnAdError?.Invoke(code, message); - } - - public void onAdOpened() - { - - } - } -} -#endif \ No newline at end of file diff --git a/Assets/BigoAds/Scripts/Platforms/Android/AdInteractionCallback.cs.meta b/Assets/BigoAds/Scripts/Platforms/Android/AdInteractionCallback.cs.meta deleted file mode 100644 index 9524d94..0000000 --- a/Assets/BigoAds/Scripts/Platforms/Android/AdInteractionCallback.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: eeaf0303131624578b3997f9db6cb014 -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Assets/BigoAds/Scripts/Platforms/Android/AdLoadCallback.cs b/Assets/BigoAds/Scripts/Platforms/Android/AdLoadCallback.cs deleted file mode 100644 index 96565b4..0000000 --- a/Assets/BigoAds/Scripts/Platforms/Android/AdLoadCallback.cs +++ /dev/null @@ -1,33 +0,0 @@ -#if UNITY_ANDROID -using System; -using UnityEngine; - -namespace BigoAds.Scripts.Platforms.Android -{ - public class AdLoadCallback : AndroidJavaProxy - { - private readonly Action onLoad; - private readonly Action onLoadFailed; - - public AdLoadCallback(Action onLoad, Action onLoadFailed) : base( - AndroidPlatformTool.ClassPackage + ".api.AdLoadListener") - { - this.onLoad = onLoad; - this.onLoadFailed = onLoadFailed; - } - - public void onError(AndroidJavaObject error) - { - var code = error.Call("getCode"); - var message = error.Call("getMessage"); - onLoadFailed?.Invoke(code, message); - } - - public void onAdLoaded(AndroidJavaObject ad) - { - onLoad?.Invoke(ad); - } - } - -} -#endif \ No newline at end of file diff --git a/Assets/BigoAds/Scripts/Platforms/Android/AdLoadCallback.cs.meta b/Assets/BigoAds/Scripts/Platforms/Android/AdLoadCallback.cs.meta deleted file mode 100644 index 0fb8eef..0000000 --- a/Assets/BigoAds/Scripts/Platforms/Android/AdLoadCallback.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: b4d06d46018574b7bae1c9dc60ef6122 -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Assets/BigoAds/Scripts/Platforms/Android/AndroidBannerAd.cs b/Assets/BigoAds/Scripts/Platforms/Android/AndroidBannerAd.cs deleted file mode 100644 index d541307..0000000 --- a/Assets/BigoAds/Scripts/Platforms/Android/AndroidBannerAd.cs +++ /dev/null @@ -1,147 +0,0 @@ -#if UNITY_ANDROID -using System; -using BigoAds.Scripts.Api; -using BigoAds.Scripts.Api.Constant; -using BigoAds.Scripts.Common; -using UnityEngine; - -namespace BigoAds.Scripts.Platforms.Android -{ - class AndroidBannerAd : IBannerAd - { - private const string BannerAdLoaderClassName = AndroidPlatformTool.ClassPackage + ".api.BannerAdLoader$Builder"; - private const string BannerAdRequestClassName = AndroidPlatformTool.ClassPackage + ".api.BannerAdRequest$Builder"; - private const string BannerSizeClassName = AndroidPlatformTool.ClassPackage + ".api.AdSize"; - private const string BannerBuildMethod = "build"; - private const string BannerAdLoaderBuildMethod = "withAdLoadListener"; - private const string BannerAdLoaderExtMethod = "withExt"; - - - private AndroidJavaObject BannerAd; - - public event Action OnLoad; - public event Action OnLoadFailed; - public event Action OnAdShowed; - public event Action OnAdClicked; - public event Action OnAdDismissed; - public event Action OnAdError; - - public AndroidBannerAd() - { - OnAdLoad += ((ad) => - { - BannerAd = ad; - OnLoad?.Invoke(); - }); - } - - private event Action OnAdLoad; - - public void Load(string slotId, BigoBannerRequest request) - { - if (request == null) - { - return; - } - var bannerLoaderBuilder = new AndroidJavaObject(BannerAdLoaderClassName); - bannerLoaderBuilder?.Call(BannerAdLoaderExtMethod, request.ExtraInfoJson); - bannerLoaderBuilder?.Call(BannerAdLoaderBuildMethod, new AdLoadCallback(OnAdLoad, OnLoadFailed)); - var bannerLoader = bannerLoaderBuilder?.Call(BannerBuildMethod); - - var bannerRequestBuilder = new AndroidJavaObject(BannerAdRequestClassName); - bannerRequestBuilder?.Call("withSlotId", slotId); - bannerRequestBuilder?.Call("withAge", request.Age); - bannerRequestBuilder?.Call("withGender", (int)(request.Gender)); - bannerRequestBuilder?.Call("withActivatedTime", request.ActivatedTime); - - var bannerSize = new AndroidJavaClass(BannerSizeClassName).GetStatic("BANNER"); - int width = request.Size.Width; - int height = request.Size.Height; - if (width == 300 && height == 250) { - bannerSize = new AndroidJavaClass(BannerSizeClassName).GetStatic("MEDIUM_RECTANGLE"); - } - AndroidJavaClass arrayClass = new AndroidJavaClass("java.lang.reflect.Array"); - AndroidJavaObject arrayObject = arrayClass.CallStatic("newInstance", new AndroidJavaClass(BannerSizeClassName), 1); - arrayClass.CallStatic("set", arrayObject, 0, bannerSize); - - bannerRequestBuilder?.Call("withAdSizes", arrayObject); - - var bannerRequest = bannerRequestBuilder?.Call(BannerBuildMethod); - - bannerLoader?.Call("loadAd", bannerRequest); - } - - public bool IsLoaded() - { - return BannerAd != null; - } - - public void Show() - { - BannerAd?.Call("setAdInteractionListener", new AdInteractionCallback(OnAdShowed, OnAdClicked, OnAdDismissed, OnAdError)); - AndroidPlatformTool.CallMethodOnMainThread(() => - { - AdHelper.ShowBannerAd(BannerAd); - }); - } - - public void Destroy() - { - //post to main - AdHelper.DestroyAd(BannerAd); - } - - public bool IsExpired() - { - - return BannerAd != null && BannerAd.Call("isExpired"); - } - - public void SetPosition(BigoPosition position) - { - AndroidPlatformTool.CallMethodOnMainThread(() => - { - AdHelper.ShowBannerAd(BannerAd, position); - }); - } - - public bool IsClientBidding() - { - if (BannerAd == null) return false; - AndroidJavaObject bid = BannerAd.Call("getBid"); - return bid != null; - } - - public string GetExtraInfo(string key) - { - if (BannerAd == null) return ""; - return BannerAd.Call("getExtraInfo", key); - } - - /// get price - public double getPrice() - { - if (BannerAd == null) return 0; - AndroidJavaObject bid = BannerAd.Call("getBid"); - return bid == null ? 0 : bid.Call("getPrice"); - } - - ///notify win - public void notifyWin(double secPrice, string secBidder) - { - if (BannerAd == null) return; - var secPriceDouble = new AndroidJavaClass("java.lang.Double").CallStatic ("valueOf", secPrice); - BannerAd.Call("getBid")?.Call("notifyWin", secPriceDouble, secBidder); - } - - ///notify loss - public void notifyLoss(double firstPrice, string firstBidder, BGAdLossReason lossReason) - { - if (BannerAd == null) return; - var firstPriceDouble = new AndroidJavaClass("java.lang.Double").CallStatic ("valueOf", firstPrice); - BannerAd.Call("getBid")?.Call("notifyLoss", firstPriceDouble, firstBidder, (int)lossReason); - } - - } -} -#endif \ No newline at end of file diff --git a/Assets/BigoAds/Scripts/Platforms/Android/AndroidBannerAd.cs.meta b/Assets/BigoAds/Scripts/Platforms/Android/AndroidBannerAd.cs.meta deleted file mode 100644 index 133fd1f..0000000 --- a/Assets/BigoAds/Scripts/Platforms/Android/AndroidBannerAd.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: 46ee6aacd6a2546ce8e23dd89e5d27d4 -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Assets/BigoAds/Scripts/Platforms/Android/AndroidClientFactory.cs b/Assets/BigoAds/Scripts/Platforms/Android/AndroidClientFactory.cs deleted file mode 100644 index 45d6f26..0000000 --- a/Assets/BigoAds/Scripts/Platforms/Android/AndroidClientFactory.cs +++ /dev/null @@ -1,49 +0,0 @@ -#if UNITY_ANDROID - -using BigoAds.Scripts.Common; - -namespace BigoAds.Scripts.Platforms.Android -{ - class AndroidClientFactory : IClientFactory - { - /// - /// - /// - /// - public ISDK BuildSDKClient() - { - return new BigoSdkClient(); - } - - public IBannerAd BuildBannerAdClient() - { - return new AndroidBannerAd(); - } - - public INativeAd BuildNativeAdClient() - { - return new AndroidNativeAd(); - } - - public IInterstitialAd BuildInterstitialAdClient() - { - return new AndroidInterstitialAd(); - } - - public IPopupAd BuildPopupAdClient() - { - return new AndroidPopupAd(); - } - - public ISplashAd BuildSplashAdClient() - { - return new AndroidSplashAd(); - } - - public IRewardedAd BuildRewardedAdClient() - { - return new AndroidRewardedAd(); - } - } -} -#endif \ No newline at end of file diff --git a/Assets/BigoAds/Scripts/Platforms/Android/AndroidClientFactory.cs.meta b/Assets/BigoAds/Scripts/Platforms/Android/AndroidClientFactory.cs.meta deleted file mode 100644 index 8e800fb..0000000 --- a/Assets/BigoAds/Scripts/Platforms/Android/AndroidClientFactory.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: 1809d4d3a8b034fa88284da804f66a71 -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Assets/BigoAds/Scripts/Platforms/Android/AndroidInterstitialAd.cs b/Assets/BigoAds/Scripts/Platforms/Android/AndroidInterstitialAd.cs deleted file mode 100644 index 0beed80..0000000 --- a/Assets/BigoAds/Scripts/Platforms/Android/AndroidInterstitialAd.cs +++ /dev/null @@ -1,124 +0,0 @@ -#if UNITY_ANDROID -using System; -using BigoAds.Scripts.Api; -using BigoAds.Scripts.Api.Constant; -using BigoAds.Scripts.Common; -using UnityEngine; - -namespace BigoAds.Scripts.Platforms.Android -{ - class AndroidInterstitialAd : IInterstitialAd - { - private const string InterstitialAdLoaderClassName = AndroidPlatformTool.ClassPackage + ".api.InterstitialAdLoader$Builder"; - private const string InterstitialAdRequestClassName = AndroidPlatformTool.ClassPackage + ".api.InterstitialAdRequest$Builder"; - private const string InterstitialBuildMethod = "build"; - private const string InterstitialAdLoaderBuildMethod = "withAdLoadListener"; - private const string InterstitialAdLoaderExtMethod = "withExt"; - - private AndroidJavaObject InterstitialAd; - - public event Action OnLoad; - public event Action OnLoadFailed; - public event Action OnAdShowed; - public event Action OnAdClicked; - public event Action OnAdDismissed; - public event Action OnAdError; - - public AndroidInterstitialAd() - { - OnAdLoad += ((ad) => - { - InterstitialAd = ad; - OnLoad?.Invoke(); - }); - } - - private event Action OnAdLoad; - - public void Load(string slotId, BigoInterstitialRequest request) - { - if (request == null) - { - return; - } - var InterstitialLoaderBuilder = new AndroidJavaObject(InterstitialAdLoaderClassName); - InterstitialLoaderBuilder?.Call(InterstitialAdLoaderExtMethod, request.ExtraInfoJson); - InterstitialLoaderBuilder?.Call(InterstitialAdLoaderBuildMethod, new AdLoadCallback(OnAdLoad, OnLoadFailed)); - var InterstitialLoader = InterstitialLoaderBuilder?.Call(InterstitialBuildMethod); - - var InterstitialRequestBuilder = new AndroidJavaObject(InterstitialAdRequestClassName); - InterstitialRequestBuilder?.Call("withSlotId", slotId); - InterstitialRequestBuilder?.Call("withAge", request.Age); - InterstitialRequestBuilder?.Call("withGender", (int)(request.Gender)); - InterstitialRequestBuilder?.Call("withActivatedTime", request.ActivatedTime); - - var InterstitialRequest = InterstitialRequestBuilder?.Call(InterstitialBuildMethod); - - InterstitialLoader?.Call("loadAd", InterstitialRequest); - } - - public bool IsLoaded() - { - return InterstitialAd != null; - } - - public void Show() - { - InterstitialAd?.Call("setAdInteractionListener", new AdInteractionCallback(OnAdShowed, OnAdClicked, OnAdDismissed, OnAdError)); - AndroidPlatformTool.CallMethodOnMainThread(() => - { - InterstitialAd?.Call("show"); - }); - - } - - public void Destroy() - { - //post to main - AdHelper.DestroyAd(InterstitialAd); - } - - public bool IsExpired() - { - return InterstitialAd != null && InterstitialAd.Call("isExpired"); - } - - public bool IsClientBidding() - { - if (InterstitialAd == null) return false; - AndroidJavaObject bid = InterstitialAd.Call("getBid"); - return bid != null; - } - - public string GetExtraInfo(string key) - { - if (InterstitialAd == null) return ""; - return InterstitialAd.Call("getExtraInfo", key); - } - - /// get price - public double getPrice() - { - if (InterstitialAd == null) return 0; - AndroidJavaObject bid = InterstitialAd.Call("getBid"); - return bid == null ? 0 : bid.Call("getPrice"); - } - - ///notify win - public void notifyWin(double secPrice, string secBidder) - { - if (InterstitialAd == null) return; - var secPriceDouble = new AndroidJavaClass("java.lang.Double").CallStatic ("valueOf", secPrice); - InterstitialAd.Call("getBid")?.Call("notifyWin", secPriceDouble, secBidder); - } - - ///notify loss - public void notifyLoss(double firstPrice, string firstBidder, BGAdLossReason lossReason) - { - if (InterstitialAd == null) return; - var firstPriceDouble = new AndroidJavaClass("java.lang.Double").CallStatic ("valueOf", firstPrice); - InterstitialAd.Call("getBid")?.Call("notifyLoss", firstPriceDouble, firstBidder, (int)lossReason); - } - } -} -#endif \ No newline at end of file diff --git a/Assets/BigoAds/Scripts/Platforms/Android/AndroidInterstitialAd.cs.meta b/Assets/BigoAds/Scripts/Platforms/Android/AndroidInterstitialAd.cs.meta deleted file mode 100644 index 2218096..0000000 --- a/Assets/BigoAds/Scripts/Platforms/Android/AndroidInterstitialAd.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: 087385bbddf0541e5be511be304caee8 -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Assets/BigoAds/Scripts/Platforms/Android/AndroidNativeAd.cs b/Assets/BigoAds/Scripts/Platforms/Android/AndroidNativeAd.cs deleted file mode 100644 index 9cbd5a7..0000000 --- a/Assets/BigoAds/Scripts/Platforms/Android/AndroidNativeAd.cs +++ /dev/null @@ -1,133 +0,0 @@ -#if UNITY_ANDROID -using System; -using BigoAds.Scripts.Api; -using BigoAds.Scripts.Api.Constant; -using BigoAds.Scripts.Common; -using UnityEngine; - -namespace BigoAds.Scripts.Platforms.Android -{ - class AndroidNativeAd : INativeAd - { - private const string NativeAdLoaderClassName = AndroidPlatformTool.ClassPackage + ".api.NativeAdLoader$Builder"; - private const string NativeAdRequestClassName = AndroidPlatformTool.ClassPackage + ".api.NativeAdRequest$Builder"; - private const string NativeBuildMethod = "build"; - private const string NativeAdLoaderBuildMethod = "withAdLoadListener"; - private const string NativeAdLoaderExtMethod = "withExt"; - - private AndroidJavaObject NativeAd; - - public event Action OnLoad; - public event Action OnLoadFailed; - public event Action OnAdShowed; - public event Action OnAdClicked; - public event Action OnAdDismissed; - public event Action OnAdError; - - public AndroidNativeAd() - { - OnAdLoad += ((ad) => - { - NativeAd = ad; - OnLoad?.Invoke(); - }); - } - - private event Action OnAdLoad; - - public void Load(string slotId, BigoNativeRequest request) - { - if (request == null) - { - return; - } - var nativeLoaderBuilder = new AndroidJavaObject(NativeAdLoaderClassName); - nativeLoaderBuilder?.Call(NativeAdLoaderExtMethod, request.ExtraInfoJson); - nativeLoaderBuilder?.Call(NativeAdLoaderBuildMethod, new AdLoadCallback(OnAdLoad, OnLoadFailed)); - var nativeLoader = nativeLoaderBuilder?.Call(NativeBuildMethod); - - var nativeRequestBuilder = new AndroidJavaObject(NativeAdRequestClassName); - nativeRequestBuilder?.Call("withSlotId", slotId); - nativeRequestBuilder?.Call("withAge", request.Age); - nativeRequestBuilder?.Call("withGender", (int)(request.Gender)); - nativeRequestBuilder?.Call("withActivatedTime", request.ActivatedTime); - - var nativeRequest = nativeRequestBuilder?.Call(NativeBuildMethod); - - nativeLoader?.Call("loadAd", nativeRequest); - } - - public bool IsLoaded() - { - return NativeAd != null; - } - - public void Show() - { - NativeAd?.Call("setAdInteractionListener", new AdInteractionCallback(OnAdShowed, OnAdClicked, OnAdDismissed, OnAdError)); - - AndroidPlatformTool.CallMethodOnMainThread(() => - { - AdHelper.ShowNativeAd(NativeAd); - }); - - } - - public void Destroy() - { - AdHelper.DestroyAd(NativeAd); - } - - public bool IsExpired() - { - - return NativeAd != null && NativeAd.Call("isExpired"); - } - - public void SetPosition(BigoPosition position) - { - AndroidPlatformTool.CallMethodOnMainThread(() => - { - AdHelper.ShowNativeAd(NativeAd, position); - }); - } - - public bool IsClientBidding() - { - if (NativeAd == null) return false; - AndroidJavaObject bid = NativeAd.Call("getBid"); - return bid != null; - } - - public string GetExtraInfo(string key) - { - if (NativeAd == null) return ""; - return NativeAd.Call("getExtraInfo", key); - } - - /// get price - public double getPrice() - { - if (NativeAd == null) return 0; - AndroidJavaObject bid = NativeAd.Call("getBid"); - return bid == null ? 0 : bid.Call("getPrice"); - } - - ///notify win - public void notifyWin(double secPrice, string secBidder) - { - if (NativeAd == null) return; - var secPriceDouble = new AndroidJavaClass("java.lang.Double").CallStatic ("valueOf", secPrice); - NativeAd.Call("getBid")?.Call("notifyWin", secPriceDouble, secBidder); - } - - ///notify loss - public void notifyLoss(double firstPrice, string firstBidder, BGAdLossReason lossReason) - { - if (NativeAd == null) return; - var firstPriceDouble = new AndroidJavaClass("java.lang.Double").CallStatic ("valueOf", firstPrice); - NativeAd.Call("getBid")?.Call("notifyLoss", firstPriceDouble, firstBidder, (int)lossReason); - } - } -} -#endif \ No newline at end of file diff --git a/Assets/BigoAds/Scripts/Platforms/Android/AndroidNativeAd.cs.meta b/Assets/BigoAds/Scripts/Platforms/Android/AndroidNativeAd.cs.meta deleted file mode 100644 index 0369f2d..0000000 --- a/Assets/BigoAds/Scripts/Platforms/Android/AndroidNativeAd.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: 04dd9e8545a394cc0b0bd15cfe325045 -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Assets/BigoAds/Scripts/Platforms/Android/AndroidPlatformTool.cs b/Assets/BigoAds/Scripts/Platforms/Android/AndroidPlatformTool.cs deleted file mode 100644 index 208fcbb..0000000 --- a/Assets/BigoAds/Scripts/Platforms/Android/AndroidPlatformTool.cs +++ /dev/null @@ -1,101 +0,0 @@ -#if UNITY_ANDROID - -using System; -using System.Collections.Generic; -using System.Text; -using BigoAds.Scripts.Api; -using BigoAds.Scripts.Api.Constant; -using UnityEngine; - -namespace BigoAds.Scripts.Platforms.Android -{ - internal static class AndroidPlatformTool - { - public const string ClassPackage = "sg.bigo.ads"; - private const string UnityPlayerClassName = "com.unity3d.player.UnityPlayer"; - private const string CurrentActivityMethod = "currentActivity"; - private const string ResourceUtilClassName = ClassPackage + ".ResourceUtil"; - private const string AdConfigClassName = ClassPackage + ".api.AdConfig$Builder"; - - public static AndroidJavaObject GetGameActivity() - { - return new AndroidJavaClass(UnityPlayerClassName).GetStatic(CurrentActivityMethod); - } - - public static AndroidJavaObject GetBigoConfig(BigoAdConfig config) - { - var builder = new AndroidJavaObject(AdConfigClassName); - if (config != null) - { - void CallNativeFunction(string methodName, T arg) - { - builder.Call(methodName, arg); - } - - if (!string.IsNullOrEmpty(config.AppId)) - { - CallNativeFunction("setAppId", config.AppId); - } - - if (config.DebugLog) //default value is false - { - Debug.Log("set debug true"); - CallNativeFunction("setDebug", true); - } - - if (!string.IsNullOrEmpty(config.Channel)) - { - CallNativeFunction("setChannel", config.Channel); - } - - if (config.Age > 0) - { - CallNativeFunction("setAge", config.Age); - } - - if (config.Gender > 0) - { - CallNativeFunction("setGender", config.Gender); - } - - if (config.ActivatedTime > 0) - { - CallNativeFunction("setActivatedTime", config.ActivatedTime); - } - - foreach (KeyValuePair item in config.ExtraDictionary) - { - Debug.Log($"bigo sdk config extra:" + item.Key + "=" + item.Value); - builder.Call("addExtra", item.Key, item.Value); - } - } - - return builder.Call("build"); - } - - public static AndroidJavaObject GetAdRequest(BigoRequest request) - { - switch (request) - { - case BigoBannerRequest _: - break; - case BigoNativeRequest _: - break; - case BigoSplashRequest _: - break; - case BigoInterstitialRequest _: - break; - case BigoRewardedRequest _: - break; - } - - return null; - } - - public static void CallMethodOnMainThread(Action task) - { - GetGameActivity()?.Call("runOnUiThread", new AndroidJavaRunnable(task)); - } - } -} -#endif \ No newline at end of file diff --git a/Assets/BigoAds/Scripts/Platforms/Android/AndroidPlatformTool.cs.meta b/Assets/BigoAds/Scripts/Platforms/Android/AndroidPlatformTool.cs.meta deleted file mode 100644 index f643aef..0000000 --- a/Assets/BigoAds/Scripts/Platforms/Android/AndroidPlatformTool.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: ec73d6fa8edaa4c619d96f6db2789dd1 -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Assets/BigoAds/Scripts/Platforms/Android/AndroidPopupAd.cs b/Assets/BigoAds/Scripts/Platforms/Android/AndroidPopupAd.cs deleted file mode 100644 index 81382d7..0000000 --- a/Assets/BigoAds/Scripts/Platforms/Android/AndroidPopupAd.cs +++ /dev/null @@ -1,124 +0,0 @@ -#if UNITY_ANDROID -using System; -using BigoAds.Scripts.Api; -using BigoAds.Scripts.Api.Constant; -using BigoAds.Scripts.Common; -using UnityEngine; - -namespace BigoAds.Scripts.Platforms.Android -{ - class AndroidPopupAd : IPopupAd - { - private const string PopupAdLoaderClassName = AndroidPlatformTool.ClassPackage + ".api.popup.PopupAdLoader$Builder"; - private const string PopupAdRequestClassName = AndroidPlatformTool.ClassPackage + ".api.popup.PopupAdRequest$Builder"; - private const string PopupBuildMethod = "build"; - private const string PopupAdLoaderBuildMethod = "withAdLoadListener"; - private const string PopupAdLoaderExtMethod = "withExt"; - - private AndroidJavaObject PopupAd; - - public event Action OnLoad; - public event Action OnLoadFailed; - public event Action OnAdShowed; - public event Action OnAdClicked; - public event Action OnAdDismissed; - public event Action OnAdError; - - public AndroidPopupAd() - { - OnAdLoad += ((ad) => - { - PopupAd = ad; - OnLoad?.Invoke(); - }); - } - - private event Action OnAdLoad; - - public void Load(string slotId, BigoPopupRequest request) - { - if (request == null) - { - return; - } - var PopupLoaderBuilder = new AndroidJavaObject(PopupAdLoaderClassName); - PopupLoaderBuilder?.Call(PopupAdLoaderExtMethod, request.ExtraInfoJson); - PopupLoaderBuilder?.Call(PopupAdLoaderBuildMethod, new AdLoadCallback(OnAdLoad, OnLoadFailed)); - var PopupLoader = PopupLoaderBuilder?.Call(PopupBuildMethod); - - var PopupRequestBuilder = new AndroidJavaObject(PopupAdRequestClassName); - PopupRequestBuilder?.Call("withSlotId", slotId); - PopupRequestBuilder?.Call("withAge", request.Age); - PopupRequestBuilder?.Call("withGender", (int)(request.Gender)); - PopupRequestBuilder?.Call("withActivatedTime", request.ActivatedTime); - - var PopupRequest = PopupRequestBuilder?.Call(PopupBuildMethod); - - PopupLoader?.Call("loadAd", PopupRequest); - } - - public bool IsLoaded() - { - return PopupAd != null; - } - - public void Show() - { - PopupAd?.Call("setAdInteractionListener", new AdInteractionCallback(OnAdShowed, OnAdClicked, OnAdDismissed, OnAdError)); - AndroidPlatformTool.CallMethodOnMainThread(() => - { - PopupAd?.Call("show"); - }); - - } - - public void Destroy() - { - //post to main - AdHelper.DestroyAd(PopupAd); - } - - public bool IsExpired() - { - return PopupAd != null && PopupAd.Call("isExpired"); - } - - public bool IsClientBidding() - { - if (PopupAd == null) return false; - AndroidJavaObject bid = PopupAd.Call("getBid"); - return bid != null; - } - - public string GetExtraInfo(string key) - { - if (PopupAd == null) return ""; - return PopupAd.Call("getExtraInfo", key); - } - - /// get price - public double getPrice() - { - if (PopupAd == null) return 0; - AndroidJavaObject bid = PopupAd.Call("getBid"); - return bid == null ? 0 : bid.Call("getPrice"); - } - - ///notify win - public void notifyWin(double secPrice, string secBidder) - { - if (PopupAd == null) return; - var secPriceDouble = new AndroidJavaClass("java.lang.Double").CallStatic ("valueOf", secPrice); - PopupAd.Call("getBid")?.Call("notifyWin", secPriceDouble, secBidder); - } - - ///notify loss - public void notifyLoss(double firstPrice, string firstBidder, BGAdLossReason lossReason) - { - if (PopupAd == null) return; - var firstPriceDouble = new AndroidJavaClass("java.lang.Double").CallStatic ("valueOf", firstPrice); - PopupAd.Call("getBid")?.Call("notifyLoss", firstPriceDouble, firstBidder, (int)lossReason); - } - } -} -#endif \ No newline at end of file diff --git a/Assets/BigoAds/Scripts/Platforms/Android/AndroidPopupAd.cs.meta b/Assets/BigoAds/Scripts/Platforms/Android/AndroidPopupAd.cs.meta deleted file mode 100644 index 595df40..0000000 --- a/Assets/BigoAds/Scripts/Platforms/Android/AndroidPopupAd.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: 34628c2993e174780bc5786dff90c900 -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Assets/BigoAds/Scripts/Platforms/Android/AndroidRewardedAd.cs b/Assets/BigoAds/Scripts/Platforms/Android/AndroidRewardedAd.cs deleted file mode 100644 index 3e2f204..0000000 --- a/Assets/BigoAds/Scripts/Platforms/Android/AndroidRewardedAd.cs +++ /dev/null @@ -1,125 +0,0 @@ -#if UNITY_ANDROID -using System; -using BigoAds.Scripts.Api; -using BigoAds.Scripts.Api.Constant; -using BigoAds.Scripts.Common; -using UnityEngine; - -namespace BigoAds.Scripts.Platforms.Android -{ - class AndroidRewardedAd : IRewardedAd - { - private const string RewardedAdLoaderClassName = AndroidPlatformTool.ClassPackage + ".api.RewardVideoAdLoader$Builder"; - private const string RewardedAdRequestClassName = AndroidPlatformTool.ClassPackage + ".api.RewardVideoAdRequest$Builder"; - private const string RewardedAdBuildMethod = "build"; - private const string RewardedAdLoaderBuildMethod = "withAdLoadListener"; - private const string RewardedAdLoaderExtMethod = "withExt"; - - private AndroidJavaObject RewardedAd; - - public event Action OnLoad; - public event Action OnLoadFailed; - public event Action OnAdShowed; - public event Action OnAdClicked; - public event Action OnAdDismissed; - public event Action OnAdError; - public event Action OnUserEarnedReward; - - public AndroidRewardedAd() - { - OnAdLoad += ((ad) => - { - RewardedAd = ad; - OnLoad?.Invoke(); - }); - } - - private event Action OnAdLoad; - - public void Load(string slotId, BigoRewardedRequest request) - { - if (request == null) - { - return; - } - var rewardedAdLoaderBuilder = new AndroidJavaObject(RewardedAdLoaderClassName); - rewardedAdLoaderBuilder?.Call(RewardedAdLoaderExtMethod, request.ExtraInfoJson); - rewardedAdLoaderBuilder?.Call(RewardedAdLoaderBuildMethod, new AdLoadCallback(OnAdLoad, OnLoadFailed)); - var rewardedAdLoader = rewardedAdLoaderBuilder?.Call(RewardedAdBuildMethod); - - var rewardedAdRequestBuilder = new AndroidJavaObject(RewardedAdRequestClassName); - rewardedAdRequestBuilder?.Call("withSlotId", slotId); - rewardedAdRequestBuilder?.Call("withAge", request.Age); - rewardedAdRequestBuilder?.Call("withGender", (int)(request.Gender)); - rewardedAdRequestBuilder?.Call("withActivatedTime", request.ActivatedTime); - - var RewardedAdRequest = rewardedAdRequestBuilder?.Call(RewardedAdBuildMethod); - - rewardedAdLoader?.Call("loadAd", RewardedAdRequest); - } - - public bool IsLoaded() - { - return RewardedAd != null; - } - - public void Show() - { - RewardedAd?.Call("setAdInteractionListener", new RewardedAdInteractionCallback(OnAdShowed, OnAdClicked, OnAdDismissed, OnAdError, OnUserEarnedReward)); - AndroidPlatformTool.CallMethodOnMainThread(() => - { - RewardedAd?.Call("show"); - }); - - } - - public void Destroy() - { - //post to main - AdHelper.DestroyAd(RewardedAd); - } - - public bool IsExpired() - { - return RewardedAd != null && RewardedAd.Call("isExpired"); - } - - public bool IsClientBidding() - { - if (RewardedAd == null) return false; - AndroidJavaObject bid = RewardedAd.Call("getBid"); - return bid != null; - } - - public string GetExtraInfo(string key) - { - if (RewardedAd == null) return ""; - return RewardedAd.Call("getExtraInfo", key); - } - - /// get price - public double getPrice() - { - if (RewardedAd == null) return 0; - AndroidJavaObject bid = RewardedAd.Call("getBid"); - return bid == null ? 0 : bid.Call("getPrice"); - } - - ///notify win - public void notifyWin(double secPrice, string secBidder) - { - if (RewardedAd == null) return; - var secPriceDouble = new AndroidJavaClass("java.lang.Double").CallStatic ("valueOf", secPrice); - RewardedAd.Call("getBid")?.Call("notifyWin", secPriceDouble, secBidder); - } - - ///notify loss - public void notifyLoss(double firstPrice, string firstBidder, BGAdLossReason lossReason) - { - if (RewardedAd == null) return; - var firstPriceDouble = new AndroidJavaClass("java.lang.Double").CallStatic ("valueOf", firstPrice); - RewardedAd.Call("getBid")?.Call("notifyLoss", firstPriceDouble, firstBidder, (int)lossReason); - } - } -} -#endif \ No newline at end of file diff --git a/Assets/BigoAds/Scripts/Platforms/Android/AndroidRewardedAd.cs.meta b/Assets/BigoAds/Scripts/Platforms/Android/AndroidRewardedAd.cs.meta deleted file mode 100644 index d075733..0000000 --- a/Assets/BigoAds/Scripts/Platforms/Android/AndroidRewardedAd.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: 6bca6ddceb592449c9606175e8f5f77e -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Assets/BigoAds/Scripts/Platforms/Android/AndroidSplashAd.cs b/Assets/BigoAds/Scripts/Platforms/Android/AndroidSplashAd.cs deleted file mode 100644 index ae9afce..0000000 --- a/Assets/BigoAds/Scripts/Platforms/Android/AndroidSplashAd.cs +++ /dev/null @@ -1,124 +0,0 @@ -#if UNITY_ANDROID -using System; -using BigoAds.Scripts.Api; -using BigoAds.Scripts.Api.Constant; -using BigoAds.Scripts.Common; -using UnityEngine; - -namespace BigoAds.Scripts.Platforms.Android -{ - class AndroidSplashAd : ISplashAd - { - private const string SplashAdLoaderClassName = AndroidPlatformTool.ClassPackage + ".api.SplashAdLoader$Builder"; - private const string SplashAdRequestClassName = AndroidPlatformTool.ClassPackage + ".api.SplashAdRequest$Builder"; - private const string SplashBuildMethod = "build"; - private const string SplashAdLoaderBuildMethod = "withAdLoadListener"; - private const string SplashAdLoaderExtMethod = "withExt"; - - private AndroidJavaObject SplashAd; - - public event Action OnLoad; - public event Action OnLoadFailed; - public event Action OnAdShowed; - public event Action OnAdClicked; - public event Action OnAdDismissed; - public event Action OnAdError; - - public AndroidSplashAd() - { - OnAdLoad += ((ad) => - { - SplashAd = ad; - OnLoad?.Invoke(); - }); - } - - private event Action OnAdLoad; - - public void Load(string slotId, BigoSplashRequest request) - { - if (request == null) - { - return; - } - var SplashLoaderBuilder = new AndroidJavaObject(SplashAdLoaderClassName); - SplashLoaderBuilder?.Call(SplashAdLoaderExtMethod, request.ExtraInfoJson); - SplashLoaderBuilder?.Call(SplashAdLoaderBuildMethod, new AdLoadCallback(OnAdLoad, OnLoadFailed)); - var SplashLoader = SplashLoaderBuilder?.Call(SplashBuildMethod); - - var SplashRequestBuilder = new AndroidJavaObject(SplashAdRequestClassName); - SplashRequestBuilder?.Call("withSlotId", slotId); - SplashRequestBuilder?.Call("withAge", request.Age); - SplashRequestBuilder?.Call("withGender", (int)(request.Gender)); - SplashRequestBuilder?.Call("withActivatedTime", request.ActivatedTime); - - var SplashRequest = SplashRequestBuilder?.Call(SplashBuildMethod); - - SplashLoader?.Call("loadAd", SplashRequest); - } - - public bool IsLoaded() - { - return SplashAd != null; - } - - public void Show() - { - SplashAd?.Call("setAdInteractionListener", new SplashAdInteractionCallback(OnAdShowed, OnAdClicked, OnAdDismissed, OnAdError)); - AndroidPlatformTool.CallMethodOnMainThread(() => - { - SplashAd?.Call("show"); - }); - - } - - public void Destroy() - { - //post to main - AdHelper.DestroyAd(SplashAd); - } - - public bool IsExpired() - { - return SplashAd != null && SplashAd.Call("isExpired"); - } - - public bool IsClientBidding() - { - if (SplashAd == null) return false; - AndroidJavaObject bid = SplashAd.Call("getBid"); - return bid != null; - } - - public string GetExtraInfo(string key) - { - if (SplashAd == null) return ""; - return SplashAd.Call("getExtraInfo", key); - } - - /// get price - public double getPrice() - { - if (SplashAd == null) return 0; - AndroidJavaObject bid = SplashAd.Call("getBid"); - return bid == null ? 0 : bid.Call("getPrice"); - } - - ///notify win - public void notifyWin(double secPrice, string secBidder) - { - if (SplashAd == null) return; - var secPriceDouble = new AndroidJavaClass("java.lang.Double").CallStatic ("valueOf", secPrice); - SplashAd.Call("getBid")?.Call("notifyWin", secPriceDouble, secBidder); - } - - ///notify loss - public void notifyLoss(double firstPrice, string firstBidder, BGAdLossReason lossReason) - { - if (SplashAd == null) return; - var firstPriceDouble = new AndroidJavaClass("java.lang.Double").CallStatic ("valueOf", firstPrice); - SplashAd.Call("getBid")?.Call("notifyLoss", firstPriceDouble, firstBidder, (int)lossReason); - } - } -} -#endif \ No newline at end of file diff --git a/Assets/BigoAds/Scripts/Platforms/Android/AndroidSplashAd.cs.meta b/Assets/BigoAds/Scripts/Platforms/Android/AndroidSplashAd.cs.meta deleted file mode 100644 index 23d0ec2..0000000 --- a/Assets/BigoAds/Scripts/Platforms/Android/AndroidSplashAd.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: cdf1866c87531416d8159aae83c6e470 -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Assets/BigoAds/Scripts/Platforms/Android/BigoSdkClient.cs b/Assets/BigoAds/Scripts/Platforms/Android/BigoSdkClient.cs deleted file mode 100644 index 98acbc9..0000000 --- a/Assets/BigoAds/Scripts/Platforms/Android/BigoSdkClient.cs +++ /dev/null @@ -1,99 +0,0 @@ -#if UNITY_ANDROID - -using BigoAds.Scripts.Api; -using BigoAds.Scripts.Common; -using UnityEngine; -using BigoAds.Scripts.Api.Constant; - -namespace BigoAds.Scripts.Platforms.Android -{ - class BigoSdkClient : ISDK - { - private const string SDKClientClassName = AndroidPlatformTool.ClassPackage + ".BigoAdSdk"; - private const string InitMethod = "initialize"; - private const string InitSuccessMethod = "isInitialized"; - private const string SDKVersionMethod = "getSDKVersion"; - private const string InitListenerInterfaceName = AndroidPlatformTool.ClassPackage + ".BigoAdSdk$InitListener"; - private const string ConsentOptionsClassName = AndroidPlatformTool.ClassPackage + ".ConsentOptions"; - - - public void Init(BigoAdConfig config, BigoAdSdk.InitResultDelegate initResultDelegate) - { - InvokeNativeMethod(InitMethod, AndroidPlatformTool.GetGameActivity(), - AndroidPlatformTool.GetBigoConfig(config), - new InitCallBack(initResultDelegate)); - } - - public bool IsInitSuccess() - { - return InvokeNativeMethod(InitSuccessMethod); - } - - public string GetSDKVersion() - { - return InvokeNativeMethod("getSDKVersion"); - } - - public string GetSDKVersionName() - { - return InvokeNativeMethod("getSDKVersionName"); - } - - public void SetUserConsent(ConsentOptions option, bool consent) - { - var clazz = new AndroidJavaClass(ConsentOptionsClassName); - AndroidJavaObject obj = null; - switch (option) - { - case ConsentOptions.GDPR: - obj = clazz.GetStatic("GDPR"); - break; - case ConsentOptions.CCPA: - obj = clazz.GetStatic("CCPA"); - break; - case ConsentOptions.LGPD: - obj = clazz.GetStatic("LGPD"); - break; - case ConsentOptions.COPPA: - obj = clazz.GetStatic("COPPA"); - break; - default: - break; - } - - InvokeNativeMethod("setUserConsent", AndroidPlatformTool.GetGameActivity(), obj, consent); - } - - public void AddExtraHost(string country, string host) - { - InvokeNativeMethod("addExtraHost", country, host); - } - - - private static void InvokeNativeMethod(string methodName, params object[] args) - { - new AndroidJavaClass(SDKClientClassName).CallStatic(methodName, args); - } - - private static T InvokeNativeMethod(string methodName, params object[] args) - { - return new AndroidJavaClass(SDKClientClassName).CallStatic(methodName, args); - } - - private class InitCallBack : AndroidJavaProxy - { - private event BigoAdSdk.InitResultDelegate InitListener; - - public InitCallBack(BigoAdSdk.InitResultDelegate initResultDelegate) : base(InitListenerInterfaceName) - { - this.InitListener = initResultDelegate; - } - - public void onInitialized() - { - InitListener?.Invoke(); - } - } - } -} -#endif \ No newline at end of file diff --git a/Assets/BigoAds/Scripts/Platforms/Android/BigoSdkClient.cs.meta b/Assets/BigoAds/Scripts/Platforms/Android/BigoSdkClient.cs.meta deleted file mode 100644 index aa9e2ee..0000000 --- a/Assets/BigoAds/Scripts/Platforms/Android/BigoSdkClient.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: a768d78eefdf84ba4bcbfa8077fe6a62 -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Assets/BigoAds/Scripts/Platforms/Android/RewardedAdInteractionCallback.cs b/Assets/BigoAds/Scripts/Platforms/Android/RewardedAdInteractionCallback.cs deleted file mode 100644 index 6774e3e..0000000 --- a/Assets/BigoAds/Scripts/Platforms/Android/RewardedAdInteractionCallback.cs +++ /dev/null @@ -1,27 +0,0 @@ -#if UNITY_ANDROID -using System; -using BigoAds.Scripts.Common; -using UnityEngine; - -namespace BigoAds.Scripts.Platforms.Android -{ - public class RewardedAdInteractionCallback : AdInteractionCallback - { - private event Action OnUserEarnedReward; - - private const string ListenerName = AndroidPlatformTool.ClassPackage + ".api.RewardAdInteractionListener"; - - public RewardedAdInteractionCallback(Action onAdShowed, Action onAdClicked, Action onAdDismissed, Action onAdError, - Action userEarnedReward) : base( - onAdShowed, onAdClicked, onAdDismissed, onAdError, ListenerName) - { - OnUserEarnedReward = userEarnedReward; - } - - public void onAdRewarded() - { - OnUserEarnedReward?.Invoke(); - } - } -} -#endif \ No newline at end of file diff --git a/Assets/BigoAds/Scripts/Platforms/Android/RewardedAdInteractionCallback.cs.meta b/Assets/BigoAds/Scripts/Platforms/Android/RewardedAdInteractionCallback.cs.meta deleted file mode 100644 index 6645f1d..0000000 --- a/Assets/BigoAds/Scripts/Platforms/Android/RewardedAdInteractionCallback.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: 679833dea127f43cebbb043ff2a1c2f2 -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Assets/BigoAds/Scripts/Platforms/Android/SplashAdInteractionCallback.cs b/Assets/BigoAds/Scripts/Platforms/Android/SplashAdInteractionCallback.cs deleted file mode 100644 index 854829d..0000000 --- a/Assets/BigoAds/Scripts/Platforms/Android/SplashAdInteractionCallback.cs +++ /dev/null @@ -1,29 +0,0 @@ -#if UNITY_ANDROID -using System; -using BigoAds.Scripts.Common; -using UnityEngine; - -namespace BigoAds.Scripts.Platforms.Android -{ - public class SplashAdInteractionCallback : AdInteractionCallback - { - private const string ListenerName = AndroidPlatformTool.ClassPackage + ".api.SplashAdInteractionListener"; - - public SplashAdInteractionCallback(Action onAdShowed, Action onAdClicked, Action onAdDismissed, Action onAdError) : base( - onAdShowed, onAdClicked, onAdDismissed, onAdError, ListenerName) - { - - } - - public void onAdSkipped() - { - - } - - public void onAdFinished() - { - - } - } -} -#endif \ No newline at end of file diff --git a/Assets/BigoAds/Scripts/Platforms/Android/SplashAdInteractionCallback.cs.meta b/Assets/BigoAds/Scripts/Platforms/Android/SplashAdInteractionCallback.cs.meta deleted file mode 100644 index 8e4456f..0000000 --- a/Assets/BigoAds/Scripts/Platforms/Android/SplashAdInteractionCallback.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: 02f23872f0193427487d67e2373c8e41 -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Assets/BigoAds/Scripts/Platforms/iOS.meta b/Assets/BigoAds/Scripts/Platforms/iOS.meta deleted file mode 100644 index d66d3ec..0000000 --- a/Assets/BigoAds/Scripts/Platforms/iOS.meta +++ /dev/null @@ -1,8 +0,0 @@ -fileFormatVersion: 2 -guid: cc250d638e6404797a830f56c2b7e40e -folderAsset: yes -DefaultImporter: - externalObjects: {} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Assets/BigoAds/Scripts/Platforms/iOS/Adapter.meta b/Assets/BigoAds/Scripts/Platforms/iOS/Adapter.meta deleted file mode 100644 index 0abfc3e..0000000 --- a/Assets/BigoAds/Scripts/Platforms/iOS/Adapter.meta +++ /dev/null @@ -1,8 +0,0 @@ -fileFormatVersion: 2 -guid: e1921a1c99c3c47ae95c0103939e6ffa -folderAsset: yes -DefaultImporter: - externalObjects: {} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Assets/BigoAds/Scripts/Platforms/iOS/Adapter/BigoAd.meta b/Assets/BigoAds/Scripts/Platforms/iOS/Adapter/BigoAd.meta deleted file mode 100644 index 1935887..0000000 --- a/Assets/BigoAds/Scripts/Platforms/iOS/Adapter/BigoAd.meta +++ /dev/null @@ -1,8 +0,0 @@ -fileFormatVersion: 2 -guid: 7eed132e5c97a47718143d7e692cafda -folderAsset: yes -DefaultImporter: - externalObjects: {} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Assets/BigoAds/Scripts/Platforms/iOS/Adapter/BigoAd/Banner.meta b/Assets/BigoAds/Scripts/Platforms/iOS/Adapter/BigoAd/Banner.meta deleted file mode 100644 index 3b590a4..0000000 --- a/Assets/BigoAds/Scripts/Platforms/iOS/Adapter/BigoAd/Banner.meta +++ /dev/null @@ -1,8 +0,0 @@ -fileFormatVersion: 2 -guid: aaf596d8ee1bd409e831a2c8c6919580 -folderAsset: yes -DefaultImporter: - externalObjects: {} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Assets/BigoAds/Scripts/Platforms/iOS/Adapter/BigoAd/Banner/BigoUnityBannerAd.cs b/Assets/BigoAds/Scripts/Platforms/iOS/Adapter/BigoAd/Banner/BigoUnityBannerAd.cs deleted file mode 100644 index 3fb5612..0000000 --- a/Assets/BigoAds/Scripts/Platforms/iOS/Adapter/BigoAd/Banner/BigoUnityBannerAd.cs +++ /dev/null @@ -1,112 +0,0 @@ -#if UNITY_IOS -using System; -using System.Threading; -using BigoAds.Scripts.Api; -using BigoAds.Scripts.Api.Constant; -using BigoAds.Scripts.Common; -using UnityEngine; - -namespace BigoAds.Scripts.Platforms.iOS.Adapter.BigoAd -{ - using System; - using BigoAds.Scripts.Api; - using BigoAds.Scripts.Common; - using BigoAds.Scripts.Platforms.iOS; - using System.Runtime.InteropServices; - public class BigoUnityBannerAd: BigoIOSBaseAd, IBannerAd - { - private BigoBannerRequest bannerRequest; - //TODO:线程问题需要考虑下 - public void Load(string slotId, BigoBannerRequest request) - { - bannerRequest = request; - adType = 2; - this.unityAdPtr = (IntPtr)GCHandle.Alloc (this); - IntPtr ptr = this.unityAdPtr; - - int width = request.Size.Width; - int height = request.Size.Height; - - int x = CalculateMiddleX(width); - int y = CalculatePositionY(request.Position,height); - - LOGWithMessage(System.Reflection.MethodBase.GetCurrentMethod()?.Name,$"calculate-origin:{x},{y}-size:{width},{height}"); - BigoIOS_loadBannerAdData(ptr, - slotId, - request.ToJson(), - x, - y, - width, - height, - cs_adDidLoadCallback, - cs_adLoadFailCallBack, - cs_adDidShowCallback, - cs_adDidClickCallback, - cs_adDidDismissCallback, - cs_adDidErrorCallBack - ); - LOGWithMessage(System.Reflection.MethodBase.GetCurrentMethod()?.Name,$"request.position:{request.Position},slotId:{slotId}"); - } - - private int CalculatePositionY(BigoPosition position, int bannerHeight) - { - int screenHeight = BigoIOS_getScreenHeight(); - float y = BigoIOS_getScreenSafeTop(); - if (position == BigoPosition.Middle) - { - y = (float)((screenHeight - bannerHeight) * 0.5); - } - else if (position == BigoPosition.Bottom) - { - y = (float)(screenHeight - bannerHeight - BigoIOS_getScreenSafeBottom()); - } - LOGWithMessage(System.Reflection.MethodBase.GetCurrentMethod()?.Name,$"position:{position},screenHeight:{screenHeight}-y:{y}"); - return (int)y; - } - - private int CalculateMiddleX(int bannerWidth) - { - int screenWidth = BigoIOS_getScreenWidth(); - int x = (int)((screenWidth - bannerWidth) * 0.5); - LOGWithMessage(System.Reflection.MethodBase.GetCurrentMethod()?.Name,$"screenWidth:{screenWidth}-x:{x}"); - return x; - } - - public void SetPosition(BigoPosition position) - { - int x = CalculateMiddleX(bannerRequest.Size.Width); - int y = CalculatePositionY(position, bannerRequest.Size.Height); - BigoIOS_SetBannerAdPosition(unityAdPtr,x,y); - LOGWithMessage(System.Reflection.MethodBase.GetCurrentMethod()?.Name,$"position-{position}"); - } - //MARK: c# - oc - [DllImport("__Internal")] - static extern void BigoIOS_loadBannerAdData(IntPtr unityAdPtr, - string slotId, - string requestJson, - int x, - int y, - int width, - int height, - adDidLoadCallback_delegate successCallback, - adLoadFailCallBack_delegate failCallback, - adDidShowCallback_delegate showCallback, - adDidClickCallback_delegate clickCallback, - adDidDismissCallback_delegate dismissCallback, - adDidErrorCallback_delegate adErrorCallback - ); - - [DllImport("__Internal")] - static extern void BigoIOS_SetBannerAdPosition(IntPtr unityAdPtr, int x, int y); - - [DllImport("__Internal")] - static extern int BigoIOS_getScreenWidth(); - [DllImport("__Internal")] - static extern int BigoIOS_getScreenHeight(); - [DllImport("__Internal")] - static extern int BigoIOS_getScreenSafeTop(); - [DllImport("__Internal")] - static extern int BigoIOS_getScreenSafeBottom(); - } -} -#endif \ No newline at end of file diff --git a/Assets/BigoAds/Scripts/Platforms/iOS/Adapter/BigoAd/Banner/BigoUnityBannerAd.cs.meta b/Assets/BigoAds/Scripts/Platforms/iOS/Adapter/BigoAd/Banner/BigoUnityBannerAd.cs.meta deleted file mode 100644 index 2928e7d..0000000 --- a/Assets/BigoAds/Scripts/Platforms/iOS/Adapter/BigoAd/Banner/BigoUnityBannerAd.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: 1f3106d1522ac4b95a8f73c101387f8a -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Assets/BigoAds/Scripts/Platforms/iOS/Adapter/BigoAd/Banner/BigoUnityBannerAd.h b/Assets/BigoAds/Scripts/Platforms/iOS/Adapter/BigoAd/Banner/BigoUnityBannerAd.h deleted file mode 100644 index 006c016..0000000 --- a/Assets/BigoAds/Scripts/Platforms/iOS/Adapter/BigoAd/Banner/BigoUnityBannerAd.h +++ /dev/null @@ -1,24 +0,0 @@ -#import "BigoUnityBaseAdHandler.h" - -extern "C" { - - //load banner Ad - void BigoIOS_loadBannerAdData(UnityAd unityAd, - const char *slotId, - const char *requestJson, - int x, - int y, - int width, - int height, - AdDidLoadCallback successCallback, - AdLoadFailCallBack failCallback, - AdDidShowCallback showCallback, - AdDidClickCallback clickCallback, - AdDidDismissCallback dismissCallback, - AdDidErrorCallback adErrorCallback - ); - //show banner ad - void BigoIOS_showBannerAd(UnityAd unityAd); - void BigoIOS_SetBannerAdPosition(UnityAd unityAd,int x, int y); - void BigoIOS_removeBannerView(UnityAd unityAd); -} diff --git a/Assets/BigoAds/Scripts/Platforms/iOS/Adapter/BigoAd/Banner/BigoUnityBannerAd.h.meta b/Assets/BigoAds/Scripts/Platforms/iOS/Adapter/BigoAd/Banner/BigoUnityBannerAd.h.meta deleted file mode 100644 index d82d603..0000000 --- a/Assets/BigoAds/Scripts/Platforms/iOS/Adapter/BigoAd/Banner/BigoUnityBannerAd.h.meta +++ /dev/null @@ -1,27 +0,0 @@ -fileFormatVersion: 2 -guid: a86c122698a834a0e868b3d38d576442 -PluginImporter: - externalObjects: {} - serializedVersion: 2 - iconMap: {} - executionOrder: {} - defineConstraints: [] - isPreloaded: 0 - isOverridable: 0 - isExplicitlyReferenced: 0 - validateReferences: 1 - platformData: - - first: - Any: - second: - enabled: 1 - settings: {} - - first: - Editor: Editor - second: - enabled: 0 - settings: - DefaultValueInitialized: true - userData: - assetBundleName: - assetBundleVariant: diff --git a/Assets/BigoAds/Scripts/Platforms/iOS/Adapter/BigoAd/Banner/BigoUnityBannerAd.mm b/Assets/BigoAds/Scripts/Platforms/iOS/Adapter/BigoAd/Banner/BigoUnityBannerAd.mm deleted file mode 100644 index a2ff068..0000000 --- a/Assets/BigoAds/Scripts/Platforms/iOS/Adapter/BigoAd/Banner/BigoUnityBannerAd.mm +++ /dev/null @@ -1,133 +0,0 @@ -#import -#import "UnityAppController.h" -#import "BigoUnityBaseAdHandler.h" -#import "BigoUnityAdapterTools.h" -#import "BigoUnityAdHandlerManager.h" - -extern "C"{ - - -int BigoIOS_getScreenWidth () { - __block int width = 0; - BigoIOS_dispatchSyncMainQueue(^{ - UIViewController *vc = GetAppController().rootViewController; - width = (int)vc.view.frame.size.width; - }); - return width; -} - -int BigoIOS_getScreenHeight () { - __block int height = 0; - BigoIOS_dispatchSyncMainQueue(^{ - UIViewController *vc = GetAppController().rootViewController; - height = (int)vc.view.frame.size.height; - }); - return height; -} - -int BigoIOS_getScreenSafeBottom() { - __block int bottom = 0; - BigoIOS_dispatchSyncMainQueue(^{ - UIViewController *vc = GetAppController().rootViewController; - bottom = (int)vc.view.safeAreaInsets.bottom; - }); - return bottom; -} - -int BigoIOS_getScreenSafeTop() { - __block int top = 0; - BigoIOS_dispatchSyncMainQueue(^{ - UIViewController *vc = GetAppController().rootViewController; - top = (int)vc.view.safeAreaInsets.top; - }); - return top; -} - -//load Banner ad -void BigoIOS_loadBannerAdData(UnityAd unityAd, - const char *slotId, - const char *requestJson, - int x, - int y, - int width, - int height, - AdDidLoadCallback successCallback, - AdLoadFailCallBack failCallback, - AdDidShowCallback showCallback, - AdDidClickCallback clickCallback, - AdDidDismissCallback dismissCallback, - AdDidErrorCallback adErrorCallback - ) { - BigoIOS_dispatchSyncMainQueue(^{ - BigoAdSize *size = BigoAdSize.BANNER; - if (width == 300 && height == 250) { - size = BigoAdSize.MEDIUM_RECTANGLE; - } - NSDictionary *requestDict = BigoIOS_requestJsonObjectFromJsonString(requestJson); - BigoUnityBannerAdHandler *adHandler = [[BigoUnityBannerAdHandler alloc] init]; - BigoBannerAdRequest *request = [[BigoBannerAdRequest alloc] initWithSlotId:BigoIOS_transformNSStringForm(slotId) adSizes:@[size]]; - request.age = [requestDict[@"age"] intValue]; - request.gender = (BigoAdGender)[requestDict[@"gender"] intValue]; - request.activatedTime = [requestDict[@"activatedTime"] longLongValue]; - BigoBannerAdLoader *adLoader = [[BigoBannerAdLoader alloc] initWithBannerAdLoaderDelegate:adHandler]; - adLoader.ext = requestDict[@"extraInfo"]; - adHandler.adLoader = adLoader; - adHandler.unityAd = unityAd; - adHandler.showCallback = showCallback; - adHandler.clickCallback = clickCallback; - adHandler.dismissCallback = dismissCallback; - adHandler.adErrorCallback = adErrorCallback; - adHandler.successCallback = successCallback; - adHandler.failCallback = failCallback; - NSString *unityAdKey = [BigoUnityAdHandlerManager createKeyUnityAd:unityAd]; - [BigoUnityAdHandlerManager saveAdHandler:adHandler withKey:unityAdKey]; - [adLoader loadAd:request]; - }); - -} - -BigoUnityBannerAdHandler* BigoIOS_getBannerAdHandler(UnityAd unityAd) { - if (!unityAd) return nil; - NSString *unityAdKey = [BigoUnityAdHandlerManager createKeyUnityAd:unityAd]; - BigoUnityBannerAdHandler *handler = (BigoUnityBannerAdHandler*)[BigoUnityAdHandlerManager handlerWithKey:unityAdKey]; - if (!handler || ![handler isMemberOfClass:[BigoUnityBannerAdHandler class]]) { - return nil; - } - return handler; -} - -void BigoIOS_showBannerAd(UnityAd unityAd) { - BigoUnityBannerAdHandler *handler = BigoIOS_getBannerAdHandler(unityAd); - if (!handler) return; - BigoIOS_dispatchSyncMainQueue(^{ - UIViewController *vc = GetAppController().rootViewController; - BigoBannerAd *ad = (BigoBannerAd *)handler.ad; - [vc.view addSubview:ad.adView]; - }); -} - -void BigoIOS_SetBannerAdPosition(UnityAd unityAd,int x, int y) { - BigoUnityBannerAdHandler *handler = BigoIOS_getBannerAdHandler(unityAd); - if (!handler) return; - - BigoIOS_dispatchSyncMainQueue(^{ - BigoBannerAd *ad = (BigoBannerAd *)handler.ad; - CGRect frame = ad.adView.frame; - frame.origin.x = x; - frame.origin.y = y; - ad.adView.frame = frame; - }); -} - -void BigoIOS_removeBannerView(UnityAd unityAd) { - BigoUnityBannerAdHandler *handler = BigoIOS_getBannerAdHandler(unityAd); - if (!handler) return; - - BigoIOS_dispatchSyncMainQueue(^{ - BigoBannerAd *ad = (BigoBannerAd *)handler.ad; - [ad.adView removeFromSuperview]; - }); -} - -} - diff --git a/Assets/BigoAds/Scripts/Platforms/iOS/Adapter/BigoAd/Banner/BigoUnityBannerAd.mm.meta b/Assets/BigoAds/Scripts/Platforms/iOS/Adapter/BigoAd/Banner/BigoUnityBannerAd.mm.meta deleted file mode 100644 index 7b0acc0..0000000 --- a/Assets/BigoAds/Scripts/Platforms/iOS/Adapter/BigoAd/Banner/BigoUnityBannerAd.mm.meta +++ /dev/null @@ -1,37 +0,0 @@ -fileFormatVersion: 2 -guid: fd1772b6ab58f4e74ac7e89d3fd471c3 -PluginImporter: - externalObjects: {} - serializedVersion: 2 - iconMap: {} - executionOrder: {} - defineConstraints: [] - isPreloaded: 0 - isOverridable: 0 - isExplicitlyReferenced: 0 - validateReferences: 1 - platformData: - - first: - Any: - second: - enabled: 0 - settings: {} - - first: - Editor: Editor - second: - enabled: 0 - settings: - DefaultValueInitialized: true - - first: - iPhone: iOS - second: - enabled: 1 - settings: {} - - first: - tvOS: tvOS - second: - enabled: 1 - settings: {} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Assets/BigoAds/Scripts/Platforms/iOS/Adapter/BigoAd/BigoIOSBaseAd.cs b/Assets/BigoAds/Scripts/Platforms/iOS/Adapter/BigoAd/BigoIOSBaseAd.cs deleted file mode 100644 index 5ff22cc..0000000 --- a/Assets/BigoAds/Scripts/Platforms/iOS/Adapter/BigoAd/BigoIOSBaseAd.cs +++ /dev/null @@ -1,265 +0,0 @@ -#if UNITY_IOS - -using System.Collections.Generic; -using AOT; -using UnityEngine; -using BigoAds.Scripts.Api.Constant; - -namespace BigoAds.Scripts.Platforms.iOS.Adapter.BigoAd -{ - using System; - using BigoAds.Scripts.Api; - using BigoAds.Scripts.Common; - using BigoAds.Scripts.Platforms.iOS; - using System.Runtime.InteropServices; - public class BigoIOSBaseAd : IBigoAd - { - public event Action OnLoad; - public event Action OnLoadFailed; - public event Action OnAdShowed; - public event Action OnAdClicked; - public event Action OnAdDismissed; - public event Action OnAdError; - public void Load(string slotId, BigoRequest request) - { - - } - - protected void LoadAdData(string slotId, BigoRequest request) { - this.unityAdPtr = (IntPtr)GCHandle.Alloc (this); - IntPtr ptr = this.unityAdPtr; - - BigoIOS_loadAdData(adType, - ptr, - slotId, - request.ToJson(), - cs_adDidLoadCallback, - cs_adLoadFailCallBack, - cs_adDidShowCallback, - cs_adDidClickCallback, - cs_adDidDismissCallback, - cs_adDidErrorCallBack - ); - LOGWithMessage(System.Reflection.MethodBase.GetCurrentMethod()?.Name,$"slotId:{slotId},request{request}"); - } - - public bool IsLoaded() - { - return bigoAdLoaded; - } - - public virtual void Show() - { - LOGWithMessage("Show"); - BigoIOS_showAd(adType,this.unityAdPtr); - } - - public virtual bool IsExpired() - { - return BigoIOS_IsExpired(unityAdPtr); - } - - public void Destroy() - { - BigoIOS_destroyAd(adType,unityAdPtr); - if (unityAdPtr != IntPtr.Zero) - { - GCHandle unityAdhandle = (GCHandle)this.unityAdPtr; - unityAdhandle.Free(); - } - unityAdPtr = IntPtr.Zero; - LOGWithMessage(System.Reflection.MethodBase.GetCurrentMethod()?.Name,$"unityPtr:{unityAdPtr}"); - } - - public bool IsClientBidding() - { - return BigoIOS_IsClientBidding(unityAdPtr); - } - - public string GetExtraInfo(String key) - { - //todo - return ""; - } - - /// get price - public double getPrice() - { - return BigoIOS_GetPrice(unityAdPtr); - } - - ///notify win - public void notifyWin(double secPrice, string secBidder) - { - BigoIOS_NotifyWin(unityAdPtr, secPrice, secBidder); - } - - ///notify loss - public void notifyLoss(double firstPrice, string firstBidder, BGAdLossReason lossReason) - { - BigoIOS_NotifyLoss(unityAdPtr, firstPrice, firstBidder, (int)lossReason); - } - - protected void LOGWithMessage(string method) - { - LOGWithMessage(method,string.Empty); - } - protected void LOGWithMessage(string method,string msg) - { - //native = 1, banner = 2, interstitial = 3, rewarded = 4, appOpen = 5 - int adtype = adType; - string adTypeString = "unknown"; - if (adtype == 1) - { - adTypeString = "native"; - } - else if (adtype == 2) - { - adTypeString = "banner"; - } - else if (adtype == 3) - { - adTypeString = "interstitial"; - } - else if (adtype == 4) - { - adTypeString = "rewarded"; - } - else if (adtype == 5) - { - adTypeString = "appOpen"; - } - - //System.Reflection.MethodBase.GetCurrentMethod()?.Name - Type classType = this.GetType(); - string className = $"{adTypeString}-{classType.Name}"; - BigoUnityTools.LOGWithMessage(className,method,msg); - } - - protected static BigoIOSBaseAd GetUnityAd(IntPtr unityAdPtr) - { - GCHandle handle = (GCHandle) unityAdPtr; - BigoIOSBaseAd unityAd = handle.Target as BigoIOSBaseAd; - // handle.Free (); - return unityAd; - } - - protected int adType = 0; - private bool bigoAdLoaded = false; - protected IntPtr unityAdPtr = IntPtr.Zero; - //MARK: c --> oc - [DllImport("__Internal")] - static extern void BigoIOS_loadAdData(int adType, - IntPtr unityAdPtr, - string slotId, - string requestJson, - adDidLoadCallback_delegate successCallback, - adLoadFailCallBack_delegate failCallback, - adDidShowCallback_delegate showCallback, - adDidClickCallback_delegate clickCallback, - adDidDismissCallback_delegate dismissCallback, - adDidErrorCallback_delegate adErrorCallback); - [DllImport("__Internal")] - static extern void BigoIOS_showAd(int adType,IntPtr unityAdPtr); - - [DllImport("__Internal")] - static extern void BigoIOS_destroyAd(int adType, IntPtr unityAdPtr); - - [DllImport("__Internal")] - static extern bool BigoIOS_IsExpired(IntPtr unityAdPtr); - - [DllImport("__Internal")] - static extern bool BigoIOS_IsClientBidding(IntPtr unityAdPtr); - - [DllImport("__Internal")] - static extern double BigoIOS_GetPrice(IntPtr unityAdPtr); - - [DllImport("__Internal")] - static extern void BigoIOS_NotifyWin(IntPtr unityAdPtr, double secPrice, string secBidder); - - [DllImport("__Internal")] - static extern void BigoIOS_NotifyLoss(IntPtr unityAdPtr, double firstPrice, string firstBidder, int lossReason); - - //callback method - protected delegate void adDidLoadCallback_delegate(IntPtr unityAdPtr); - protected delegate void adLoadFailCallBack_delegate(IntPtr unityAdPtr, int code, string msg); - - protected delegate void adDidShowCallback_delegate(IntPtr unityAdPtr); - protected delegate void adDidClickCallback_delegate(IntPtr unityAdPtr); - protected delegate void adDidDismissCallback_delegate(IntPtr unityAdPtr); - protected delegate void adDidErrorCallback_delegate(IntPtr unityAdPtr, int code, string msg); - - [MonoPInvokeCallback(typeof(adDidLoadCallback_delegate))] - protected static void cs_adDidLoadCallback(IntPtr unityAdPtr) - { - BigoIOSBaseAd unityAd = BigoIOSBaseAd.GetUnityAd(unityAdPtr); - if (unityAd == null) - { - return; - } - unityAd.bigoAdLoaded = true; - unityAd.OnLoad?.Invoke(); - unityAd.LOGWithMessage("cs_adDidLoad"); - } - - [MonoPInvokeCallback(typeof(adLoadFailCallBack_delegate))] - protected static void cs_adLoadFailCallBack(IntPtr unityAdPtr, int code, string msg) - { - - BigoIOSBaseAd unityAd = BigoIOSBaseAd.GetUnityAd(unityAdPtr); - if (unityAd.OnLoadFailed != null) - { - unityAd.OnLoadFailed(code, msg); - } - unityAd.LOGWithMessage("cs_adLoadFail",$"code:{code},msg:{msg}"); - } - - [MonoPInvokeCallback(typeof(adDidShowCallback_delegate))] - protected static void cs_adDidShowCallback(IntPtr unityAdPtr) - { - BigoIOSBaseAd unityAd = BigoIOSBaseAd.GetUnityAd(unityAdPtr); - if (unityAd == null) - { - return; - } - unityAd.OnAdShowed?.Invoke(); - unityAd.LOGWithMessage($"cs_show"); - } - - [MonoPInvokeCallback(typeof(adDidClickCallback_delegate))] - protected static void cs_adDidClickCallback(IntPtr unityAdPtr) - { - BigoIOSBaseAd unityAd = BigoIOSBaseAd.GetUnityAd(unityAdPtr); - if (unityAd == null) - { - return; - } - unityAd.OnAdClicked?.Invoke(); - unityAd.LOGWithMessage("cs_click"); - } - - [MonoPInvokeCallback(typeof(adDidDismissCallback_delegate))] - protected static void cs_adDidDismissCallback(IntPtr unityAdPtr) - { - BigoIOSBaseAd unityAd = BigoIOSBaseAd.GetUnityAd(unityAdPtr); - if (unityAd == null) - { - return; - } - unityAd.OnAdDismissed?.Invoke(); - unityAd.LOGWithMessage("cs_dismiss"); - } - - [MonoPInvokeCallback(typeof(adDidErrorCallback_delegate))] - protected static void cs_adDidErrorCallBack(IntPtr unityAdPtr, int code, string msg) - { - BigoIOSBaseAd unityAd = BigoIOSBaseAd.GetUnityAd(unityAdPtr); - if (unityAd.OnAdError != null) - { - unityAd.OnAdError(code, msg); - } - unityAd.LOGWithMessage("cs_aderror",$"code:{code},msg:{msg}"); - } - } -} -#endif \ No newline at end of file diff --git a/Assets/BigoAds/Scripts/Platforms/iOS/Adapter/BigoAd/BigoIOSBaseAd.cs.meta b/Assets/BigoAds/Scripts/Platforms/iOS/Adapter/BigoAd/BigoIOSBaseAd.cs.meta deleted file mode 100644 index 68b37d0..0000000 --- a/Assets/BigoAds/Scripts/Platforms/iOS/Adapter/BigoAd/BigoIOSBaseAd.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: 9b8d512f4ea0948bb8110a2eee062858 -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Assets/BigoAds/Scripts/Platforms/iOS/Adapter/BigoAd/BigoIOSBaseAd.mm b/Assets/BigoAds/Scripts/Platforms/iOS/Adapter/BigoAd/BigoIOSBaseAd.mm deleted file mode 100644 index 43f18d4..0000000 --- a/Assets/BigoAds/Scripts/Platforms/iOS/Adapter/BigoAd/BigoIOSBaseAd.mm +++ /dev/null @@ -1,109 +0,0 @@ -#import -#import "BigoUnityBaseAdHandler.h" -#import "BigoUnityAdHandlerManager.h" -#import "BigoUnityBannerAd.h" -#import "BigoUnityInterstitialAd.h" -#import "BigoUnityRewardedAd.h" -#import "BigoUnitySplashAd.h" -#import "BigoUnityNativeAd.h" -#import "BigoUnityAdapterTools.h" -#import "BigoUnityPopupAd.h" - -extern "C" { -enum BigoIOSAdType { - native = 1, banner = 2, interstitial = 3, rewarded = 4, splash = 5, popup = 6 -}; -void BigoIOS_loadAdData(int adType, - UnityAd unityAd, - const char *slotId, - const char *requestJson, - AdDidLoadCallback successCallback, - AdLoadFailCallBack failCallback, - AdDidShowCallback showCallback, - AdDidClickCallback clickCallback, - AdDidDismissCallback dismissCallback, - AdDidErrorCallback adErrorCallback) { - if (adType == rewarded || adType == banner) {//custom load - return; - } - - if (adType == interstitial) { - BigoIOS_loadInterstitialAdData(unityAd, slotId, requestJson, successCallback, failCallback, showCallback, clickCallback, dismissCallback, adErrorCallback); - } - else if (adType == splash) { - BigoIOS_loadSplashAdData(unityAd, slotId, requestJson, successCallback, failCallback, showCallback, clickCallback, dismissCallback, adErrorCallback); - } - else if (adType == native) { - BigoIOS_loadNativeAdData(unityAd, slotId, requestJson, successCallback, failCallback, showCallback, clickCallback, dismissCallback, adErrorCallback); - } else if (adType == popup) { - BigoIOS_loadPopupAdData(unityAd, slotId, requestJson, successCallback, failCallback, showCallback, clickCallback, dismissCallback, adErrorCallback); - } - -} -void BigoIOS_showAd(int adType, UnityAd unityAd) { - if (adType == interstitial) { - BigoIOS_showInterstitialAd(unityAd); - } - else if (adType == splash) { - BigoIOS_showSplashAd(unityAd); - } - else if (adType == rewarded) { - BigoIOS_showRewardedAd(unityAd); - } - else if (adType == banner) { - BigoIOS_showBannerAd(unityAd); - } - else if (adType == native) { - BigoIOS_showNativeAd(unityAd); - } -} - -void BigoIOS_destroyAd(int adType, UnityAd unityAd) { - if (adType == banner) { - BigoIOS_removeBannerView(unityAd); - } - else if (adType == native) { - BigoIOS_removeNativeView(unityAd); - } - NSString *unityAdKey = [BigoUnityAdHandlerManager createKeyUnityAd:unityAd]; - [BigoUnityAdHandlerManager removeAdHandlerWithKey:unityAdKey]; -} - -BOOL BigoIOS_IsExpired(UnityAd unityAd) { - NSString *unityAdKey = [BigoUnityAdHandlerManager createKeyUnityAd:unityAd]; - BigoUnityBaseAdHandler *handler = (BigoUnityBaseAdHandler*)[BigoUnityAdHandlerManager handlerWithKey:unityAdKey]; - BigoAd *ad = (BigoAd *)(handler.ad); - return ad.isExpired; -} - -BOOL BigoIOS_IsClientBidding(UnityAd unityAd) { - NSString *unityAdKey = [BigoUnityAdHandlerManager createKeyUnityAd:unityAd]; - BigoUnityBaseAdHandler *handler = (BigoUnityBaseAdHandler*)[BigoUnityAdHandlerManager handlerWithKey:unityAdKey]; - BigoAd *ad = (BigoAd *)(handler.ad); - return ad.getBid != nil; -} - -CGFloat BigoIOS_GetPrice(UnityAd unityAd) { - NSString *unityAdKey = [BigoUnityAdHandlerManager createKeyUnityAd:unityAd]; - BigoUnityBaseAdHandler *handler = (BigoUnityBaseAdHandler*)[BigoUnityAdHandlerManager handlerWithKey:unityAdKey]; - BigoAd *ad = (BigoAd *)(handler.ad); - return ad.getBid.getPrice; -} - -void BigoIOS_NotifyWin(UnityAd unityAd, CGFloat secPrice, const char* secBidder) { - NSString *secBidderString = BigoIOS_transformNSStringForm(secBidder); - NSString *unityAdKey = [BigoUnityAdHandlerManager createKeyUnityAd:unityAd]; - BigoUnityBaseAdHandler *handler = (BigoUnityBaseAdHandler*)[BigoUnityAdHandlerManager handlerWithKey:unityAdKey]; - BigoAd *ad = (BigoAd *)(handler.ad); - [ad.getBid notifyWinWithSecPrice:secPrice secBidder:secBidderString]; -} - -void BigoIOS_NotifyLoss(UnityAd unityAd, CGFloat firstPrice , const char* firstBidder, int lossReason) { - NSString *firstBidderString = BigoIOS_transformNSStringForm(firstBidder); - NSString *unityAdKey = [BigoUnityAdHandlerManager createKeyUnityAd:unityAd]; - BigoUnityBaseAdHandler *handler = (BigoUnityBaseAdHandler*)[BigoUnityAdHandlerManager handlerWithKey:unityAdKey]; - BigoAd *ad = (BigoAd *)(handler.ad); - [ad.getBid notifyLossWithFirstPrice:firstPrice firstBidder:firstBidderString lossReason:(BGAdLossReasonType)lossReason]; -} - -} diff --git a/Assets/BigoAds/Scripts/Platforms/iOS/Adapter/BigoAd/BigoIOSBaseAd.mm.meta b/Assets/BigoAds/Scripts/Platforms/iOS/Adapter/BigoAd/BigoIOSBaseAd.mm.meta deleted file mode 100644 index 00a8018..0000000 --- a/Assets/BigoAds/Scripts/Platforms/iOS/Adapter/BigoAd/BigoIOSBaseAd.mm.meta +++ /dev/null @@ -1,37 +0,0 @@ -fileFormatVersion: 2 -guid: 75401cc01b4054f97931486033a4c690 -PluginImporter: - externalObjects: {} - serializedVersion: 2 - iconMap: {} - executionOrder: {} - defineConstraints: [] - isPreloaded: 0 - isOverridable: 0 - isExplicitlyReferenced: 0 - validateReferences: 1 - platformData: - - first: - Any: - second: - enabled: 0 - settings: {} - - first: - Editor: Editor - second: - enabled: 0 - settings: - DefaultValueInitialized: true - - first: - iPhone: iOS - second: - enabled: 1 - settings: {} - - first: - tvOS: tvOS - second: - enabled: 1 - settings: {} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Assets/BigoAds/Scripts/Platforms/iOS/Adapter/BigoAd/BigoUnityAdHandlerManager.h b/Assets/BigoAds/Scripts/Platforms/iOS/Adapter/BigoAd/BigoUnityAdHandlerManager.h deleted file mode 100644 index acf3ece..0000000 --- a/Assets/BigoAds/Scripts/Platforms/iOS/Adapter/BigoAd/BigoUnityAdHandlerManager.h +++ /dev/null @@ -1,22 +0,0 @@ - -#import -#import "BigoUnityBaseAdHandler.h" - -NS_ASSUME_NONNULL_BEGIN - -@interface BigoUnityAdHandlerManager : NSObject - -+ (void)saveAdHandler:(BigoUnityBaseAdHandler *)adhandler withKey:(NSString *)key; - -+ (void)removeAdHandlerWithKey:(NSString *)key; - -+ (NSString *)createKeyUnityAd:(UnityAd)unityAd; - -+ (nullable BigoUnityBaseAdHandler *)handlerWithKey:(NSString *)key; - -+ (void)printList; - - -@end - -NS_ASSUME_NONNULL_END diff --git a/Assets/BigoAds/Scripts/Platforms/iOS/Adapter/BigoAd/BigoUnityAdHandlerManager.h.meta b/Assets/BigoAds/Scripts/Platforms/iOS/Adapter/BigoAd/BigoUnityAdHandlerManager.h.meta deleted file mode 100644 index 4aa61d9..0000000 --- a/Assets/BigoAds/Scripts/Platforms/iOS/Adapter/BigoAd/BigoUnityAdHandlerManager.h.meta +++ /dev/null @@ -1,27 +0,0 @@ -fileFormatVersion: 2 -guid: f39924fa7a4d144ee93ad3242f4c5e9f -PluginImporter: - externalObjects: {} - serializedVersion: 2 - iconMap: {} - executionOrder: {} - defineConstraints: [] - isPreloaded: 0 - isOverridable: 0 - isExplicitlyReferenced: 0 - validateReferences: 1 - platformData: - - first: - Any: - second: - enabled: 1 - settings: {} - - first: - Editor: Editor - second: - enabled: 0 - settings: - DefaultValueInitialized: true - userData: - assetBundleName: - assetBundleVariant: diff --git a/Assets/BigoAds/Scripts/Platforms/iOS/Adapter/BigoAd/BigoUnityAdHandlerManager.m b/Assets/BigoAds/Scripts/Platforms/iOS/Adapter/BigoAd/BigoUnityAdHandlerManager.m deleted file mode 100644 index 2abc066..0000000 --- a/Assets/BigoAds/Scripts/Platforms/iOS/Adapter/BigoAd/BigoUnityAdHandlerManager.m +++ /dev/null @@ -1,70 +0,0 @@ -#import "BigoUnityAdHandlerManager.h" - -@interface BigoUnityAdHandlerManager() - -@property (nonatomic, strong) dispatch_semaphore_t semaphore; -@property (nonatomic, strong) NSMutableDictionary *dictionary; - -@end - -@implementation BigoUnityAdHandlerManager - -+ (instancetype)sharedInstance { - static BigoUnityAdHandlerManager *manager = nil; - static dispatch_once_t onceToken; - dispatch_once(&onceToken, ^{ - manager = [[BigoUnityAdHandlerManager alloc] init]; - }); - return manager; -} - -- (instancetype)init -{ - self = [super init]; - if (self) { - self.dictionary = [NSMutableDictionary new]; - self.semaphore = dispatch_semaphore_create(1); - } - return self; -} - -+ (void)saveAdHandler:(BigoUnityBaseAdHandler *)adhandler withKey:(NSString *)key { - if (!adhandler || key.length == 0) { - return; - } - BigoUnityAdHandlerManager *manager = [BigoUnityAdHandlerManager sharedInstance]; - dispatch_semaphore_wait(manager.semaphore, DISPATCH_TIME_FOREVER); - [manager.dictionary setObject:adhandler forKey:key]; - dispatch_semaphore_signal(manager.semaphore); -} - -+ (void)removeAdHandlerWithKey:(NSString *)key { - if (key.length == 0) { - return; - } - BigoUnityAdHandlerManager *manager = [BigoUnityAdHandlerManager sharedInstance]; - dispatch_semaphore_wait(manager.semaphore, DISPATCH_TIME_FOREVER); - [manager.dictionary removeObjectForKey:key]; - dispatch_semaphore_signal(manager.semaphore); -} - -+ (NSString *)createKeyUnityAd:(UnityAd)unityAd { - return [NSString stringWithFormat:@"%p",unityAd]; -} - -+ (nullable BigoUnityBaseAdHandler *)handlerWithKey:(NSString *)key { - if (key.length == 0) { - return nil; - } - BigoUnityAdHandlerManager *manager = [BigoUnityAdHandlerManager sharedInstance]; - dispatch_semaphore_wait(manager.semaphore, DISPATCH_TIME_FOREVER); - BigoUnityBaseAdHandler *handler = [manager.dictionary objectForKey:key]; - dispatch_semaphore_signal(manager.semaphore); - return handler; -} - -+ (void)printList { - NSLog(@"bigo-ios-list:%@",[BigoUnityAdHandlerManager sharedInstance].dictionary); -} - -@end diff --git a/Assets/BigoAds/Scripts/Platforms/iOS/Adapter/BigoAd/BigoUnityAdHandlerManager.m.meta b/Assets/BigoAds/Scripts/Platforms/iOS/Adapter/BigoAd/BigoUnityAdHandlerManager.m.meta deleted file mode 100644 index dcae4b1..0000000 --- a/Assets/BigoAds/Scripts/Platforms/iOS/Adapter/BigoAd/BigoUnityAdHandlerManager.m.meta +++ /dev/null @@ -1,37 +0,0 @@ -fileFormatVersion: 2 -guid: 053a4c32bd9344bcd9a22f2e0c87f777 -PluginImporter: - externalObjects: {} - serializedVersion: 2 - iconMap: {} - executionOrder: {} - defineConstraints: [] - isPreloaded: 0 - isOverridable: 0 - isExplicitlyReferenced: 0 - validateReferences: 1 - platformData: - - first: - Any: - second: - enabled: 0 - settings: {} - - first: - Editor: Editor - second: - enabled: 0 - settings: - DefaultValueInitialized: true - - first: - iPhone: iOS - second: - enabled: 1 - settings: {} - - first: - tvOS: tvOS - second: - enabled: 1 - settings: {} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Assets/BigoAds/Scripts/Platforms/iOS/Adapter/BigoAd/BigoUnityBaseAdHandler.h b/Assets/BigoAds/Scripts/Platforms/iOS/Adapter/BigoAd/BigoUnityBaseAdHandler.h deleted file mode 100644 index f703364..0000000 --- a/Assets/BigoAds/Scripts/Platforms/iOS/Adapter/BigoAd/BigoUnityBaseAdHandler.h +++ /dev/null @@ -1,62 +0,0 @@ - -#import -#import -#import - -typedef void* UnityAd;//unity ad -typedef void* BigoAdSdkAd;//bigo ad -//int - -//callback of ad load -typedef void(*AdDidLoadCallback)(UnityAd unityAd); -typedef void (*AdLoadFailCallBack)(UnityAd unityAd, int code, const char *msg); - -//callback of ad event -typedef void(*AdDidShowCallback)(UnityAd unityAd); -typedef void(*AdDidClickCallback)(UnityAd unityAd); -typedef void(*AdDidDismissCallback)(UnityAd unityAd); -typedef void (*AdDidErrorCallback)(UnityAd unityAd, int code, const char *msg); - -typedef void (*AdDidEarnRewardCallback)(UnityAd unityA); - -@interface BigoUnityBaseAdHandler : NSObject - -@property (nonatomic, assign) UnityAd unityAd; -@property (nonatomic, strong) BigoAd *ad; - -@property (nonatomic, assign) AdDidShowCallback showCallback; -@property (nonatomic, assign) AdDidClickCallback clickCallback; -@property (nonatomic, assign) AdDidDismissCallback dismissCallback; -@property (nonatomic, assign) AdDidErrorCallback adErrorCallback; - -//强持有AdLoader -@property (nonatomic, strong) BigoAdLoader *adLoader; -@property (nonatomic, assign) AdDidLoadCallback successCallback; -@property (nonatomic, assign) AdLoadFailCallBack failCallback; - -@end - -@interface BigoUnityBannerAdHandler : BigoUnityBaseAdHandler - -@end - - -@interface BigoUnityInterstitialAdHandler : BigoUnityBaseAdHandler - -@end - -@interface BigoUnityRewardedAdHandler : BigoUnityBaseAdHandler - -@property (nonatomic, assign) AdDidEarnRewardCallback earnCallback; - -@end - -@interface BigoUnitySplashAdHandler : BigoUnityBaseAdHandler - -@end - -@interface BigoUnityNativeAdHandler : BigoUnityBaseAdHandler - -@property (nonatomic, strong) UIView *nativeView; - -@end diff --git a/Assets/BigoAds/Scripts/Platforms/iOS/Adapter/BigoAd/BigoUnityBaseAdHandler.h.meta b/Assets/BigoAds/Scripts/Platforms/iOS/Adapter/BigoAd/BigoUnityBaseAdHandler.h.meta deleted file mode 100644 index 7c85306..0000000 --- a/Assets/BigoAds/Scripts/Platforms/iOS/Adapter/BigoAd/BigoUnityBaseAdHandler.h.meta +++ /dev/null @@ -1,27 +0,0 @@ -fileFormatVersion: 2 -guid: 0f898c08506444b2cae9b6fb32656a61 -PluginImporter: - externalObjects: {} - serializedVersion: 2 - iconMap: {} - executionOrder: {} - defineConstraints: [] - isPreloaded: 0 - isOverridable: 0 - isExplicitlyReferenced: 0 - validateReferences: 1 - platformData: - - first: - Any: - second: - enabled: 1 - settings: {} - - first: - Editor: Editor - second: - enabled: 0 - settings: - DefaultValueInitialized: true - userData: - assetBundleName: - assetBundleVariant: diff --git a/Assets/BigoAds/Scripts/Platforms/iOS/Adapter/BigoAd/BigoUnityBaseAdHandler.mm b/Assets/BigoAds/Scripts/Platforms/iOS/Adapter/BigoAd/BigoUnityBaseAdHandler.mm deleted file mode 100644 index d6c46ad..0000000 --- a/Assets/BigoAds/Scripts/Platforms/iOS/Adapter/BigoAd/BigoUnityBaseAdHandler.mm +++ /dev/null @@ -1,170 +0,0 @@ - -#import "BigoUnityBaseAdHandler.h" -#import "BigoUnityAdHandlerManager.h" - -@implementation BigoUnityBaseAdHandler - -//广告异常 -- (void)onAd:(BigoAd *)ad error:(BigoAdError *)error { - -} - -//广告展示 -- (void)onAdImpression:(BigoAd *)ad { - if (self.showCallback) { - self.showCallback(self.unityAd); - } -} - -//广告点击 -- (void)onAdClicked:(BigoAd *)ad { - if (self.clickCallback) { - self.clickCallback(self.unityAd); - } -} - -//广告打开 -- (void)onAdOpened:(BigoAd *)ad { - -} - -//广告关闭 -- (void)onAdClosed:(BigoAd *)ad { - if (self.dismissCallback) { - self.dismissCallback(self.unityAd); - } - NSString *unityAdKey = [BigoUnityAdHandlerManager createKeyUnityAd:self.unityAd]; - [BigoUnityAdHandlerManager removeAdHandlerWithKey:unityAdKey]; -} - -- (void)dealloc { - NSLog(@"BigoAd-iOS-[BigoUnityBaseAdHandler]-[dealloc]"); -} - -@end - -@implementation BigoUnityBannerAdHandler - - -#pragma mark - BigoBannerAdLoaderDelegate -- (void)onBannerAdLoaded:(BigoBannerAd *)ad { - [ad setAdInteractionDelegate:self]; - self.ad = ad; - if (self.successCallback) { - self.successCallback(self.unityAd); - } -} - - -- (void)onBannerAdLoadError:(BigoAdError *)error { - if (self.failCallback) { - self.failCallback(self.unityAd, error.errorCode, error.errorMsg.UTF8String); - } -} - -@end - -@implementation BigoUnityInterstitialAdHandler - -#pragma mark - BigoInterstitialAdLoaderDelegate -- (void)onInterstitialAdLoaded:(BigoInterstitialAd *)ad { - [ad setAdInteractionDelegate:self]; - self.ad = ad; - if (self.successCallback) { - self.successCallback(self.unityAd); - } -} - -- (void)onInterstitialAdLoadError:(BigoAdError *)error { - if (self.failCallback) { - self.failCallback(self.unityAd, error.errorCode, error.errorMsg.UTF8String); - } -} - -@end - -@implementation BigoUnityRewardedAdHandler - -#pragma mark - BigoRewardVideoAdLoaderDelegate -- (void)onRewardVideoAdLoaded:(BigoRewardVideoAd *)ad { - [ad setRewardVideoAdInteractionDelegate:self]; - self.ad = ad; - if (self.successCallback) { - self.successCallback(self.unityAd); - } -} - - -- (void)onRewardVideoAdLoadError:(BigoAdError *)error { - if (self.failCallback) { - self.failCallback(self.unityAd, error.errorCode, error.errorMsg.UTF8String); - } -} - -#pragma mark - BigoRewardVideoAdInteractionDelegate -//激励视频激励回调 -- (void)onAdRewarded:(BigoRewardVideoAd *)ad { - if (self.earnCallback) { - self.earnCallback(self.unityAd); - } -} -@end - -@implementation BigoUnitySplashAdHandler - -#pragma mark - BigoSplashAdLoaderDelegate -- (void)onSplashAdLoaded:(BigoSplashAd *)ad { - [ad setSplashAdInteractionDelegate:self]; - self.ad = ad; - if (self.successCallback) { - self.successCallback(self.unityAd); - } -} - - -- (void)onSplashAdLoadError:(BigoAdError *)error { - if (self.failCallback) { - self.failCallback(self.unityAd, error.errorCode, error.errorMsg.UTF8String); - } -} - -#pragma mark - BigoSplashAdInteractionDelegate - -/** - * 广告可跳过回调,通常是由用户点击了右上角 SKIP 按钮所触发 - */ -- (void)onAdSkipped:(BigoAd *)ad { - if (self.dismissCallback) { - self.dismissCallback(self.unityAd); - } -} - -/** - * 广告倒计时结束回调 - */ -- (void)onAdFinished:(BigoAd *)ad { - if (self.dismissCallback) { - self.dismissCallback(self.unityAd); - } -} - -@end - -@implementation BigoUnityNativeAdHandler - -#pragma mark - BigoNativeAdLoaderDelegate -- (void)onNativeAdLoaded:(BigoNativeAd *)ad { - [ad setAdInteractionDelegate:self]; - self.ad = ad; - if (self.successCallback) { - self.successCallback(self.unityAd); - } -} - -- (void)onNativeAdLoadError:(BigoAdError *)error { - if (self.failCallback) { - self.failCallback(self.unityAd, error.errorCode, error.errorMsg.UTF8String); - } -} - - @end \ No newline at end of file diff --git a/Assets/BigoAds/Scripts/Platforms/iOS/Adapter/BigoAd/BigoUnityBaseAdHandler.mm.meta b/Assets/BigoAds/Scripts/Platforms/iOS/Adapter/BigoAd/BigoUnityBaseAdHandler.mm.meta deleted file mode 100644 index 94c261f..0000000 --- a/Assets/BigoAds/Scripts/Platforms/iOS/Adapter/BigoAd/BigoUnityBaseAdHandler.mm.meta +++ /dev/null @@ -1,37 +0,0 @@ -fileFormatVersion: 2 -guid: 956299e395371425abfa788d6f80bad9 -PluginImporter: - externalObjects: {} - serializedVersion: 2 - iconMap: {} - executionOrder: {} - defineConstraints: [] - isPreloaded: 0 - isOverridable: 0 - isExplicitlyReferenced: 0 - validateReferences: 1 - platformData: - - first: - Any: - second: - enabled: 0 - settings: {} - - first: - Editor: Editor - second: - enabled: 0 - settings: - DefaultValueInitialized: true - - first: - iPhone: iOS - second: - enabled: 1 - settings: {} - - first: - tvOS: tvOS - second: - enabled: 1 - settings: {} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Assets/BigoAds/Scripts/Platforms/iOS/Adapter/BigoAd/BigoUnityConfig.cs b/Assets/BigoAds/Scripts/Platforms/iOS/Adapter/BigoAd/BigoUnityConfig.cs deleted file mode 100644 index 2dcae70..0000000 --- a/Assets/BigoAds/Scripts/Platforms/iOS/Adapter/BigoAd/BigoUnityConfig.cs +++ /dev/null @@ -1,44 +0,0 @@ -#if UNITY_IOS -using System; -using System.Collections.Generic; -using System.Linq; -using System.Runtime.InteropServices; -using System.Text; -using BigoAds.Scripts.Api; -using UnityEngine; - -namespace BigoAds.Scripts.Platforms.iOS.Adapter.BigoAd -{ - class BigoUnityConfig - { - private IntPtr _config; - internal void Init(BigoAdConfig config) - { - _config = BigoIOS_config(config.AppId); - BigoIOS_configSetInfo(_config, config.DebugLog, config.Age, config.Gender, config.ActivatedTime); - // set extra - foreach (KeyValuePair item in config.ExtraDictionary) - { - BigoIOS_configSetExtra(_config, item.Key, item.Value); - } - - } - - public IntPtr getInternalConfig() - { - return _config; - } - - //c# - > oc - [DllImport("__Internal")] - private static extern IntPtr BigoIOS_config(string appID); - - [DllImport(dllName: "__Internal")] - private static extern void BigoIOS_configSetInfo(IntPtr configPt, bool debugLog, int age, int gender, long activatedTime); - - [DllImport(dllName: "__Internal")] - private static extern void BigoIOS_configSetExtra(IntPtr configPt, string key, string extra); - - } -} -#endif \ No newline at end of file diff --git a/Assets/BigoAds/Scripts/Platforms/iOS/Adapter/BigoAd/BigoUnityConfig.cs.meta b/Assets/BigoAds/Scripts/Platforms/iOS/Adapter/BigoAd/BigoUnityConfig.cs.meta deleted file mode 100644 index 7bcbb35..0000000 --- a/Assets/BigoAds/Scripts/Platforms/iOS/Adapter/BigoAd/BigoUnityConfig.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: dd95f8f9cd401477c8b11db40da15a59 -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Assets/BigoAds/Scripts/Platforms/iOS/Adapter/BigoAd/BigoUnityConfig.mm b/Assets/BigoAds/Scripts/Platforms/iOS/Adapter/BigoAd/BigoUnityConfig.mm deleted file mode 100644 index a48bef4..0000000 --- a/Assets/BigoAds/Scripts/Platforms/iOS/Adapter/BigoAd/BigoUnityConfig.mm +++ /dev/null @@ -1,30 +0,0 @@ -#import -#import -#import "BigoUnityAdapterTools.h" - -extern "C" { - -BigoAdConfig* BigoIOS_config(const char* appID) { - NSString *appId = BigoIOS_transformNSStringForm(appID); - return [[BigoAdConfig alloc] initWithAppId:appId]; -} -BigoAdConfig* BigoIOS_GetConfig(void* __nullable config) { - BigoAdConfig *bigoConfig = config ? (__bridge BigoAdConfig*)config : nil; - return bigoConfig; -} - -void BigoIOS_configSetExtra(void* __nullable config, const char* key, const char* extra) { - BigoAdConfig *bigoConfig = BigoIOS_GetConfig(config); - NSString *keyString = BigoIOS_transformNSStringForm(key); - NSString *extraString = BigoIOS_transformNSStringForm(extra); - [bigoConfig addExtraWithKey:keyString extra:extraString]; -} - -void BigoIOS_configSetInfo(void* config, bool debugLog, int age, int gender, long activatedTime) { - BigoIOS_GetConfig(config).testMode = debugLog; - BigoIOS_GetConfig(config).age = age; - BigoIOS_GetConfig(config).gender = (BigoAdGender)gender; - BigoIOS_GetConfig(config).activatedTime = activatedTime; -} - -} diff --git a/Assets/BigoAds/Scripts/Platforms/iOS/Adapter/BigoAd/BigoUnityConfig.mm.meta b/Assets/BigoAds/Scripts/Platforms/iOS/Adapter/BigoAd/BigoUnityConfig.mm.meta deleted file mode 100644 index f9b5fbb..0000000 --- a/Assets/BigoAds/Scripts/Platforms/iOS/Adapter/BigoAd/BigoUnityConfig.mm.meta +++ /dev/null @@ -1,37 +0,0 @@ -fileFormatVersion: 2 -guid: d89226cd1e10648008bd21184cd89fe0 -PluginImporter: - externalObjects: {} - serializedVersion: 2 - iconMap: {} - executionOrder: {} - defineConstraints: [] - isPreloaded: 0 - isOverridable: 0 - isExplicitlyReferenced: 0 - validateReferences: 1 - platformData: - - first: - Any: - second: - enabled: 0 - settings: {} - - first: - Editor: Editor - second: - enabled: 0 - settings: - DefaultValueInitialized: true - - first: - iPhone: iOS - second: - enabled: 1 - settings: {} - - first: - tvOS: tvOS - second: - enabled: 1 - settings: {} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Assets/BigoAds/Scripts/Platforms/iOS/Adapter/BigoAd/BigoUnitySdk.cs b/Assets/BigoAds/Scripts/Platforms/iOS/Adapter/BigoAd/BigoUnitySdk.cs deleted file mode 100644 index 0db3486..0000000 --- a/Assets/BigoAds/Scripts/Platforms/iOS/Adapter/BigoAd/BigoUnitySdk.cs +++ /dev/null @@ -1,105 +0,0 @@ -#if UNITY_IOS -using AOT; -using UnityEngine; -using BigoAds.Scripts.Api.Constant; - -namespace BigoAds.Scripts.Platforms.iOS.Adapter.BigoAd -{ - using System; - using BigoAds.Scripts.Api; - using BigoAds.Scripts.Common; - using BigoAds.Scripts.Platforms.iOS; - using System.Runtime.InteropServices; - - class BigoUnitySdk : ISDK - { - private BigoAdSdk.InitResultDelegate resultDelegate; - - public void Init(BigoAdConfig config, BigoAdSdk.InitResultDelegate initResultDelegate) - { - BigoUnityConfig unityConfig = new BigoUnityConfig(); - unityConfig.Init(config); - resultDelegate = initResultDelegate; - IntPtr ptr = (IntPtr)GCHandle.Alloc(this); - BigoIOS_initSDK(ptr, unityConfig.getInternalConfig(), cs_successCallback); - } - - public bool IsInitSuccess() - { - return BigoIOS_sdkInitializationState(); - } - - public string GetSDKVersion() - { - return BigoIOS_sdkVersion(); - } - - public string GetSDKVersionName() - { - return BigoIOS_sdkVersionName(); - } - - public void SetUserConsent(ConsentOptions option, bool consent) - { - if (option == ConsentOptions.GDPR) { - BigoIOS_setConsentGDPR(consent); - } else if (option == ConsentOptions.CCPA) { - BigoIOS_setConsentCCPA(consent); - } else if (option == ConsentOptions.LGPD) { - BigoIOS_setConsentLGPD(consent); - } else if (option == ConsentOptions.COPPA) { - BigoIOS_setConsentCOPPA(consent); - } - } - - public void AddExtraHost(string country, string host) - { - BigoIOS_addExtraHost(country, host); - } - - [DllImport("__Internal")] - static extern void BigoIOS_initSDK(IntPtr unitySDK, IntPtr config, SuccessCallbackDelegate successCallback); - - [DllImport("__Internal")] - static extern bool BigoIOS_sdkInitializationState(); - - [DllImport("__Internal")] - static extern string BigoIOS_sdkVersion(); - - [DllImport("__Internal")] - static extern string BigoIOS_sdkVersionName(); - - [DllImport("__Internal")] - static extern void BigoIOS_setConsentGDPR(bool consent); - - [DllImport("__Internal")] - static extern void BigoIOS_setConsentCCPA(bool consent); - - [DllImport("__Internal")] - static extern void BigoIOS_setConsentLGPD(bool consent); - - [DllImport("__Internal")] - static extern void BigoIOS_setConsentCOPPA(bool consent); - - [DllImport("__Internal")] - static extern void BigoIOS_addExtraHost(string country, string host); - - private delegate void SuccessCallbackDelegate(IntPtr unitySDK); - - [MonoPInvokeCallback(typeof(SuccessCallbackDelegate))] - private static void cs_successCallback(IntPtr unitySDK) - { - BigoUnitySdk sdk = GetUnitySdk(unitySDK); - sdk.resultDelegate(); - } - - private static BigoUnitySdk GetUnitySdk(IntPtr unitySdkPtr) - { - GCHandle handle = (GCHandle) unitySdkPtr; - BigoUnitySdk unitysdk = handle.Target as BigoUnitySdk; - return unitysdk; - } - } -} - -#endif \ No newline at end of file diff --git a/Assets/BigoAds/Scripts/Platforms/iOS/Adapter/BigoAd/BigoUnitySdk.cs.meta b/Assets/BigoAds/Scripts/Platforms/iOS/Adapter/BigoAd/BigoUnitySdk.cs.meta deleted file mode 100644 index b71493a..0000000 --- a/Assets/BigoAds/Scripts/Platforms/iOS/Adapter/BigoAd/BigoUnitySdk.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: 0119df06271854e9497b8cab7cc3ef1b -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Assets/BigoAds/Scripts/Platforms/iOS/Adapter/BigoAd/BigoUnitySdk.mm b/Assets/BigoAds/Scripts/Platforms/iOS/Adapter/BigoAd/BigoUnitySdk.mm deleted file mode 100644 index e416a88..0000000 --- a/Assets/BigoAds/Scripts/Platforms/iOS/Adapter/BigoAd/BigoUnitySdk.mm +++ /dev/null @@ -1,58 +0,0 @@ - -#import -#import "BigoUnityAdapterTools.h" - -char* MakeStringCopy(const char* string) { - if (string == NULL) return NULL; - char* res = (char*)malloc(strlen(string) + 1); - strcpy(res, string); - return res; -} - -extern "C" { - - typedef void (*BigoSDKInitSuccessCallBack)(void* unitySDK); - - void BigoIOS_initSDK(void* unitySDK, void* config, BigoSDKInitSuccessCallBack successCallback) { - BigoAdConfig *adConfig = config ? (__bridge BigoAdConfig*)config : nil; - [[BigoAdSdk sharedInstance] initializeSdkWithAdConfig:adConfig completion:^{ - successCallback(unitySDK); - }]; - } - - BOOL BigoIOS_sdkInitializationState() { - return [[BigoAdSdk sharedInstance] isInitialized]; - } - - const char* BigoIOS_sdkVersion() { - NSString *version = [[BigoAdSdk sharedInstance] getSDKVersion]; - return MakeStringCopy([version UTF8String]); - } - - const char* BigoIOS_sdkVersionName() { - NSString *versionName = [[BigoAdSdk sharedInstance] getSDKVersionName]; - return MakeStringCopy([versionName UTF8String]); - } - - void BigoIOS_setConsentGDPR(bool consent) { - [BigoAdSdk setUserConsentWithOption:BigoConsentOptionsGDPR consent:consent]; - } - - void BigoIOS_setConsentCCPA(bool consent) { - [BigoAdSdk setUserConsentWithOption:BigoConsentOptionsCCPA consent:consent]; - } - - void BigoIOS_setConsentCOPPA(bool consent) { - [BigoAdSdk setUserConsentWithOption:BigoConsentOptionsCOPPA consent:consent]; - } - - void BigoIOS_setConsentLGPD(bool consent) { - [BigoAdSdk setUserConsentWithOption:BigoConsentOptionsLGPD consent:consent]; - } - - void BigoIOS_addExtraHost(const char* country, const char* host) { - NSString *countryString = BigoIOS_transformNSStringForm(country); - NSString *hostString = BigoIOS_transformNSStringForm(host); - [BigoAdSdk addExtraHostWithCountry:countryString host:hostString]; - } -} diff --git a/Assets/BigoAds/Scripts/Platforms/iOS/Adapter/BigoAd/BigoUnitySdk.mm.meta b/Assets/BigoAds/Scripts/Platforms/iOS/Adapter/BigoAd/BigoUnitySdk.mm.meta deleted file mode 100644 index 69f7ba3..0000000 --- a/Assets/BigoAds/Scripts/Platforms/iOS/Adapter/BigoAd/BigoUnitySdk.mm.meta +++ /dev/null @@ -1,37 +0,0 @@ -fileFormatVersion: 2 -guid: 2a926ae7c93f34a81ad8c0dca79dbe9f -PluginImporter: - externalObjects: {} - serializedVersion: 2 - iconMap: {} - executionOrder: {} - defineConstraints: [] - isPreloaded: 0 - isOverridable: 0 - isExplicitlyReferenced: 0 - validateReferences: 1 - platformData: - - first: - Any: - second: - enabled: 0 - settings: {} - - first: - Editor: Editor - second: - enabled: 0 - settings: - DefaultValueInitialized: true - - first: - iPhone: iOS - second: - enabled: 1 - settings: {} - - first: - tvOS: tvOS - second: - enabled: 1 - settings: {} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Assets/BigoAds/Scripts/Platforms/iOS/Adapter/BigoAd/BigoUnityTools.cs b/Assets/BigoAds/Scripts/Platforms/iOS/Adapter/BigoAd/BigoUnityTools.cs deleted file mode 100644 index 584ffe2..0000000 --- a/Assets/BigoAds/Scripts/Platforms/iOS/Adapter/BigoAd/BigoUnityTools.cs +++ /dev/null @@ -1,22 +0,0 @@ -#if UNITY_IOS -using System.Collections.Generic; -using UnityEngine; - -namespace BigoAds.Scripts.Platforms.iOS.Adapter.BigoAd -{ - public class BigoUnityTools - { - private static int mainThreadID = System.Threading.Thread.CurrentThread.ManagedThreadId; - - internal static bool isMainThread() - { - return System.Threading.Thread.CurrentThread.ManagedThreadId == mainThreadID; - } - - internal static void LOGWithMessage(string className,string methodName,string msg) - { - Debug.Log($"BigoAds-iOS-[{className}]-[{methodName}]-{msg}"); - } - } -} -#endif \ No newline at end of file diff --git a/Assets/BigoAds/Scripts/Platforms/iOS/Adapter/BigoAd/BigoUnityTools.cs.meta b/Assets/BigoAds/Scripts/Platforms/iOS/Adapter/BigoAd/BigoUnityTools.cs.meta deleted file mode 100644 index 71bc64c..0000000 --- a/Assets/BigoAds/Scripts/Platforms/iOS/Adapter/BigoAd/BigoUnityTools.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: a2171856213534228be217d8b18397ee -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Assets/BigoAds/Scripts/Platforms/iOS/Adapter/BigoAd/Interstitial.meta b/Assets/BigoAds/Scripts/Platforms/iOS/Adapter/BigoAd/Interstitial.meta deleted file mode 100644 index 80d9b73..0000000 --- a/Assets/BigoAds/Scripts/Platforms/iOS/Adapter/BigoAd/Interstitial.meta +++ /dev/null @@ -1,8 +0,0 @@ -fileFormatVersion: 2 -guid: 3d154fcfff71f4a50bbcb02fe73c8a63 -folderAsset: yes -DefaultImporter: - externalObjects: {} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Assets/BigoAds/Scripts/Platforms/iOS/Adapter/BigoAd/Interstitial/BigoUnityInterstitialAd.cs b/Assets/BigoAds/Scripts/Platforms/iOS/Adapter/BigoAd/Interstitial/BigoUnityInterstitialAd.cs deleted file mode 100644 index eb1f860..0000000 --- a/Assets/BigoAds/Scripts/Platforms/iOS/Adapter/BigoAd/Interstitial/BigoUnityInterstitialAd.cs +++ /dev/null @@ -1,17 +0,0 @@ -#if UNITY_IOS -using BigoAds.Scripts.Api; -using BigoAds.Scripts.Common; - -namespace BigoAds.Scripts.Platforms.iOS.Adapter.BigoAd -{ - - class BigoUnityinterstitialAd : BigoIOSBaseAd, IInterstitialAd - { - public void Load(string slotId, BigoInterstitialRequest request) - { - adType = 3; - LoadAdData(slotId,request); - } - } -} -#endif diff --git a/Assets/BigoAds/Scripts/Platforms/iOS/Adapter/BigoAd/Interstitial/BigoUnityInterstitialAd.cs.meta b/Assets/BigoAds/Scripts/Platforms/iOS/Adapter/BigoAd/Interstitial/BigoUnityInterstitialAd.cs.meta deleted file mode 100644 index 8887e68..0000000 --- a/Assets/BigoAds/Scripts/Platforms/iOS/Adapter/BigoAd/Interstitial/BigoUnityInterstitialAd.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: 439e9f1b2a72c4d52bbba125c8625121 -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Assets/BigoAds/Scripts/Platforms/iOS/Adapter/BigoAd/Interstitial/BigoUnityInterstitialAd.h b/Assets/BigoAds/Scripts/Platforms/iOS/Adapter/BigoAd/Interstitial/BigoUnityInterstitialAd.h deleted file mode 100644 index a6152f3..0000000 --- a/Assets/BigoAds/Scripts/Platforms/iOS/Adapter/BigoAd/Interstitial/BigoUnityInterstitialAd.h +++ /dev/null @@ -1,17 +0,0 @@ -#import "BigoUnityBaseAdHandler.h" - -extern "C" { - - //load appOpen Ad - void BigoIOS_loadInterstitialAdData(UnityAd unityAd, - const char *slotId, - const char *requestJson, - AdDidLoadCallback successCallback, - AdLoadFailCallBack failCallback, - AdDidShowCallback showCallback, - AdDidClickCallback clickCallback, - AdDidDismissCallback dismissCallback, - AdDidErrorCallback adErrorCallback); - //show open ad - void BigoIOS_showInterstitialAd(UnityAd unityAd); -} diff --git a/Assets/BigoAds/Scripts/Platforms/iOS/Adapter/BigoAd/Interstitial/BigoUnityInterstitialAd.h.meta b/Assets/BigoAds/Scripts/Platforms/iOS/Adapter/BigoAd/Interstitial/BigoUnityInterstitialAd.h.meta deleted file mode 100644 index 220ea50..0000000 --- a/Assets/BigoAds/Scripts/Platforms/iOS/Adapter/BigoAd/Interstitial/BigoUnityInterstitialAd.h.meta +++ /dev/null @@ -1,27 +0,0 @@ -fileFormatVersion: 2 -guid: 09b930587afa743ca93ec5ae2d427b8a -PluginImporter: - externalObjects: {} - serializedVersion: 2 - iconMap: {} - executionOrder: {} - defineConstraints: [] - isPreloaded: 0 - isOverridable: 0 - isExplicitlyReferenced: 0 - validateReferences: 1 - platformData: - - first: - Any: - second: - enabled: 1 - settings: {} - - first: - Editor: Editor - second: - enabled: 0 - settings: - DefaultValueInitialized: true - userData: - assetBundleName: - assetBundleVariant: diff --git a/Assets/BigoAds/Scripts/Platforms/iOS/Adapter/BigoAd/Interstitial/BigoUnityInterstitialAd.mm b/Assets/BigoAds/Scripts/Platforms/iOS/Adapter/BigoAd/Interstitial/BigoUnityInterstitialAd.mm deleted file mode 100644 index 9ae2677..0000000 --- a/Assets/BigoAds/Scripts/Platforms/iOS/Adapter/BigoAd/Interstitial/BigoUnityInterstitialAd.mm +++ /dev/null @@ -1,67 +0,0 @@ -#import -#import "UnityAppController.h" -#import "BigoUnityBaseAdHandler.h" -#import "BigoUnityAdapterTools.h" -#import "BigoUnityAdHandlerManager.h" - -extern "C"{ - -//load interstitial ad -void BigoIOS_loadInterstitialAdData(UnityAd unityAd, - const char *slotId, - const char *requestJson, - AdDidLoadCallback successCallback, - AdLoadFailCallBack failCallback, - AdDidShowCallback showCallback, - AdDidClickCallback clickCallback, - AdDidDismissCallback dismissCallback, - AdDidErrorCallback adErrorCallback - ) { - BigoIOS_dispatchSyncMainQueue(^{ - - BigoUnityInterstitialAdHandler *adHandler = [[BigoUnityInterstitialAdHandler alloc] init]; - BigoInterstitialAdRequest *request = [[BigoInterstitialAdRequest alloc] initWithSlotId:BigoIOS_transformNSStringForm(slotId)]; - NSDictionary *requestDict = BigoIOS_requestJsonObjectFromJsonString(requestJson); - request.age = [requestDict[@"age"] intValue]; - request.gender = (BigoAdGender)[requestDict[@"gender"] intValue]; - request.activatedTime = [requestDict[@"activatedTime"] longLongValue]; - BigoInterstitialAdLoader *adLoader = [[BigoInterstitialAdLoader alloc] initWithInterstitialAdLoaderDelegate:adHandler]; - adLoader.ext = requestDict[@"extraInfo"]; - adHandler.adLoader = adLoader; - adHandler.unityAd = unityAd; - adHandler.showCallback = showCallback; - adHandler.clickCallback = clickCallback; - adHandler.dismissCallback = dismissCallback; - adHandler.adErrorCallback = adErrorCallback; - adHandler.successCallback = successCallback; - adHandler.failCallback = failCallback; - NSString *unityAdKey = [BigoUnityAdHandlerManager createKeyUnityAd:unityAd]; - [BigoUnityAdHandlerManager saveAdHandler:adHandler withKey:unityAdKey]; - [adLoader loadAd:request]; - }); - -} - -BigoUnityInterstitialAdHandler* BigoIOS_getInterstitialAdHandler(UnityAd unityAd) { - if (!unityAd) return nil; - NSString *unityAdKey = [BigoUnityAdHandlerManager createKeyUnityAd:unityAd]; - BigoUnityInterstitialAdHandler *handler = (BigoUnityInterstitialAdHandler*)[BigoUnityAdHandlerManager handlerWithKey:unityAdKey]; - if (!handler || ![handler isMemberOfClass:[BigoUnityInterstitialAdHandler class]]) { - return nil; - } - return handler; -} - -void BigoIOS_showInterstitialAd(UnityAd unityAd) { - BigoUnityInterstitialAdHandler *handler = BigoIOS_getInterstitialAdHandler(unityAd); - if (!handler) return; - - BigoIOS_dispatchSyncMainQueue(^{ - UIViewController *vc = GetAppController().rootViewController; - BigoInterstitialAd *ad = (BigoInterstitialAd *)handler.ad; - [ad show:vc]; - }); -} - -} - diff --git a/Assets/BigoAds/Scripts/Platforms/iOS/Adapter/BigoAd/Interstitial/BigoUnityInterstitialAd.mm.meta b/Assets/BigoAds/Scripts/Platforms/iOS/Adapter/BigoAd/Interstitial/BigoUnityInterstitialAd.mm.meta deleted file mode 100644 index 793758a..0000000 --- a/Assets/BigoAds/Scripts/Platforms/iOS/Adapter/BigoAd/Interstitial/BigoUnityInterstitialAd.mm.meta +++ /dev/null @@ -1,37 +0,0 @@ -fileFormatVersion: 2 -guid: 0ed50328a865a41e6a0c4c862dfc3a20 -PluginImporter: - externalObjects: {} - serializedVersion: 2 - iconMap: {} - executionOrder: {} - defineConstraints: [] - isPreloaded: 0 - isOverridable: 0 - isExplicitlyReferenced: 0 - validateReferences: 1 - platformData: - - first: - Any: - second: - enabled: 0 - settings: {} - - first: - Editor: Editor - second: - enabled: 0 - settings: - DefaultValueInitialized: true - - first: - iPhone: iOS - second: - enabled: 1 - settings: {} - - first: - tvOS: tvOS - second: - enabled: 1 - settings: {} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Assets/BigoAds/Scripts/Platforms/iOS/Adapter/BigoAd/Native.meta b/Assets/BigoAds/Scripts/Platforms/iOS/Adapter/BigoAd/Native.meta deleted file mode 100644 index 0c6a97d..0000000 --- a/Assets/BigoAds/Scripts/Platforms/iOS/Adapter/BigoAd/Native.meta +++ /dev/null @@ -1,8 +0,0 @@ -fileFormatVersion: 2 -guid: 91d71cd2823ff4f758ffc2f9340dd36a -folderAsset: yes -DefaultImporter: - externalObjects: {} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Assets/BigoAds/Scripts/Platforms/iOS/Adapter/BigoAd/Native/BigoUnityNativeAd.cs b/Assets/BigoAds/Scripts/Platforms/iOS/Adapter/BigoAd/Native/BigoUnityNativeAd.cs deleted file mode 100644 index d4ee571..0000000 --- a/Assets/BigoAds/Scripts/Platforms/iOS/Adapter/BigoAd/Native/BigoUnityNativeAd.cs +++ /dev/null @@ -1,84 +0,0 @@ -#if UNITY_IOS -using System; -using System.Threading; -using BigoAds.Scripts.Api; -using BigoAds.Scripts.Api.Constant; -using BigoAds.Scripts.Common; -using UnityEngine; - -namespace BigoAds.Scripts.Platforms.iOS.Adapter.BigoAd -{ - using System; - using BigoAds.Scripts.Api; - using BigoAds.Scripts.Common; - using BigoAds.Scripts.Platforms.iOS; - using System.Runtime.InteropServices; - public class BigoUnityNativeAd : BigoIOSBaseAd, INativeAd - { - public void Load(string slotId, BigoNativeRequest request) - { - adType = 1; - LoadAdData(slotId,request); - } - - private int CalculatePositionY(BigoPosition position, int nativeHeight) - { - int screenHeight = BigoIOS_getScreenHeight(); - float y = BigoIOS_getScreenSafeTop(); - if (position == BigoPosition.Middle) - { - y = (float)((screenHeight - nativeHeight) * 0.5); - } - else if (position == BigoPosition.Bottom) - { - y = (float)(screenHeight - nativeHeight - BigoIOS_getScreenSafeBottom()); - } - LOGWithMessage(System.Reflection.MethodBase.GetCurrentMethod()?.Name,$"position:{position},screenHeight:{screenHeight}-y:{y}"); - return (int)y; - } - - private int CalculateMiddleX(int nativeWidth) - { - int screenWidth = BigoIOS_getScreenWidth(); - int x = (int)((screenWidth - nativeWidth) * 0.5); - LOGWithMessage(System.Reflection.MethodBase.GetCurrentMethod()?.Name,$"screenWidth:{screenWidth}-x:{x}"); - return x; - } - - public void SetPosition(BigoPosition position) - { - int x = 0; - int y = CalculatePositionY(position, 300); //dafault 300 - BigoIOS_SetNativeAdPosition(unityAdPtr,x,y); - LOGWithMessage(System.Reflection.MethodBase.GetCurrentMethod()?.Name,$"position-{position}"); - } - //MARK: c# - oc - [DllImport("__Internal")] - static extern void BigoIOS_loadNativeAdData(IntPtr unityAdPtr, - string slotId, - string requestJson, - int x, - int y, - int width, - int height, - adDidLoadCallback_delegate successCallback, - adLoadFailCallBack_delegate failCallback, - adDidShowCallback_delegate showCallback, - adDidClickCallback_delegate clickCallback, - adDidDismissCallback_delegate dismissCallback - ); - - [DllImport("__Internal")] - static extern void BigoIOS_SetNativeAdPosition(IntPtr unityAdPtr, int x, int y); - - [DllImport("__Internal")] - static extern int BigoIOS_getScreenWidth(); - [DllImport("__Internal")] - static extern int BigoIOS_getScreenHeight(); - [DllImport("__Internal")] - static extern int BigoIOS_getScreenSafeTop(); - [DllImport("__Internal")] - static extern int BigoIOS_getScreenSafeBottom(); - } -} -#endif \ No newline at end of file diff --git a/Assets/BigoAds/Scripts/Platforms/iOS/Adapter/BigoAd/Native/BigoUnityNativeAd.cs.meta b/Assets/BigoAds/Scripts/Platforms/iOS/Adapter/BigoAd/Native/BigoUnityNativeAd.cs.meta deleted file mode 100644 index 772f5dd..0000000 --- a/Assets/BigoAds/Scripts/Platforms/iOS/Adapter/BigoAd/Native/BigoUnityNativeAd.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: 2826ac57d309146a69194c7d0ba5764b -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Assets/BigoAds/Scripts/Platforms/iOS/Adapter/BigoAd/Native/BigoUnityNativeAd.h b/Assets/BigoAds/Scripts/Platforms/iOS/Adapter/BigoAd/Native/BigoUnityNativeAd.h deleted file mode 100644 index 1b150d9..0000000 --- a/Assets/BigoAds/Scripts/Platforms/iOS/Adapter/BigoAd/Native/BigoUnityNativeAd.h +++ /dev/null @@ -1,21 +0,0 @@ -#import "BigoUnityBaseAdHandler.h" - -extern "C" { - - //load Native ad - void BigoIOS_loadNativeAdData(UnityAd unityAd, - const char *slotId, - const char *requestJson, - AdDidLoadCallback successCallback, - AdLoadFailCallBack failCallback, - AdDidShowCallback showCallback, - AdDidClickCallback clickCallback, - AdDidDismissCallback dismissCallback, - AdDidErrorCallback adErrorCallback - ); - - void BigoIOS_SetNativeAdPosition(UnityAd unityAd,int x, int y); - void BigoIOS_showNativeAd(UnityAd unityAd); - void BigoIOS_removeNativeView(UnityAd unityAd); - -} diff --git a/Assets/BigoAds/Scripts/Platforms/iOS/Adapter/BigoAd/Native/BigoUnityNativeAd.h.meta b/Assets/BigoAds/Scripts/Platforms/iOS/Adapter/BigoAd/Native/BigoUnityNativeAd.h.meta deleted file mode 100644 index fba7f26..0000000 --- a/Assets/BigoAds/Scripts/Platforms/iOS/Adapter/BigoAd/Native/BigoUnityNativeAd.h.meta +++ /dev/null @@ -1,27 +0,0 @@ -fileFormatVersion: 2 -guid: 7e57a1c9615984eaa8fcabfd30911db3 -PluginImporter: - externalObjects: {} - serializedVersion: 2 - iconMap: {} - executionOrder: {} - defineConstraints: [] - isPreloaded: 0 - isOverridable: 0 - isExplicitlyReferenced: 0 - validateReferences: 1 - platformData: - - first: - Any: - second: - enabled: 1 - settings: {} - - first: - Editor: Editor - second: - enabled: 0 - settings: - DefaultValueInitialized: true - userData: - assetBundleName: - assetBundleVariant: diff --git a/Assets/BigoAds/Scripts/Platforms/iOS/Adapter/BigoAd/Native/BigoUnityNativeAd.mm b/Assets/BigoAds/Scripts/Platforms/iOS/Adapter/BigoAd/Native/BigoUnityNativeAd.mm deleted file mode 100644 index 3b58da9..0000000 --- a/Assets/BigoAds/Scripts/Platforms/iOS/Adapter/BigoAd/Native/BigoUnityNativeAd.mm +++ /dev/null @@ -1,102 +0,0 @@ -#import -#import "UnityAppController.h" -#import "BigoUnityBaseAdHandler.h" -#import "BigoUnityAdapterTools.h" -#import "BigoUnityAdHandlerManager.h" -#import "BigoUnityNativeCustomView.h" - -extern "C"{ - -//load interstitial ad -void BigoIOS_loadNativeAdData(UnityAd unityAd, - const char *slotId, - const char *requestJson, - AdDidLoadCallback successCallback, - AdLoadFailCallBack failCallback, - AdDidShowCallback showCallback, - AdDidClickCallback clickCallback, - AdDidDismissCallback dismissCallback, - AdDidErrorCallback adErrorCallback - ) { - BigoIOS_dispatchSyncMainQueue(^{ - - UIViewController *vc = GetAppController().rootViewController; - BigoUnityNativeCustomView *nativeView = [[BigoUnityNativeCustomView alloc] initWithFrame:CGRectMake(0, 0, vc.view.frame.size.width, 300)]; - NSDictionary *requestDict = BigoIOS_requestJsonObjectFromJsonString(requestJson); - BigoUnityNativeAdHandler *adHandler = [[BigoUnityNativeAdHandler alloc] init]; - BigoNativeAdRequest *request = [[BigoNativeAdRequest alloc] initWithSlotId:BigoIOS_transformNSStringForm(slotId)]; - request.age = [requestDict[@"age"] intValue]; - request.gender = (BigoAdGender)[requestDict[@"gender"] intValue]; - request.activatedTime = [requestDict[@"activatedTime"] longLongValue]; - BigoNativeAdLoader *adLoader = [[BigoNativeAdLoader alloc] initWithNativeAdLoaderDelegate:adHandler]; - adLoader.ext = requestDict[@"extraInfo"]; - adHandler.nativeView = nativeView; - adHandler.adLoader = adLoader; - adHandler.unityAd = unityAd; - adHandler.showCallback = showCallback; - adHandler.clickCallback = clickCallback; - adHandler.dismissCallback = dismissCallback; - adHandler.adErrorCallback = adErrorCallback; - adHandler.successCallback = successCallback; - adHandler.failCallback = failCallback; - NSString *unityAdKey = [BigoUnityAdHandlerManager createKeyUnityAd:unityAd]; - [BigoUnityAdHandlerManager saveAdHandler:adHandler withKey:unityAdKey]; - [adLoader loadAd:request]; - }); - -} - -BigoUnityNativeAdHandler* BigoIOS_getNativeAdHandler(UnityAd unityAd) { - if (!unityAd) return nil; - NSString *unityAdKey = [BigoUnityAdHandlerManager createKeyUnityAd:unityAd]; - BigoUnityNativeAdHandler *handler = (BigoUnityNativeAdHandler*)[BigoUnityAdHandlerManager handlerWithKey:unityAdKey]; - if (!handler || ![handler isMemberOfClass:[BigoUnityNativeAdHandler class]]) { - return nil; - } - return handler; -} - -void BigoIOS_showNativeAd(UnityAd unityAd) { - BigoUnityNativeAdHandler *handler = BigoIOS_getNativeAdHandler(unityAd); - if (!handler) return; - BigoIOS_dispatchSyncMainQueue(^{ - UIViewController *vc = GetAppController().rootViewController; - BigoNativeAd *ad = (BigoNativeAd *)handler.ad; - //render - BigoUnityNativeCustomView *nativeView = (BigoUnityNativeCustomView *)handler.nativeView; - [ad registerViewForInteraction:nativeView mediaView:nativeView.mediaView adIconView:nativeView.adIconView adOptionsView:nativeView.adOptionsView clickableViews:nativeView.clickAbleViews]; - [nativeView refreshNativeView:ad]; - - CGFloat screenHeight = [UIScreen mainScreen].bounds.size.height; - CGRect frame = nativeView.frame; - frame.origin.y = screenHeight - frame.size.height; - nativeView.frame = frame; - - [vc.view addSubview:handler.nativeView]; - - }); -} - -void BigoIOS_SetNativeAdPosition(UnityAd unityAd,int x, int y) { - BigoUnityNativeAdHandler *handler = BigoIOS_getNativeAdHandler(unityAd); - if (!handler) return; - - BigoIOS_dispatchSyncMainQueue(^{ - CGRect frame = handler.nativeView.frame; - frame.origin.x = x; - frame.origin.y = y; - handler.nativeView.frame = frame; - }); -} - -void BigoIOS_removeNativeView(UnityAd unityAd) { - BigoUnityNativeAdHandler *handler = BigoIOS_getNativeAdHandler(unityAd); - if (!handler) return; - - BigoIOS_dispatchSyncMainQueue(^{ - [handler.nativeView removeFromSuperview]; - }); -} - -} - diff --git a/Assets/BigoAds/Scripts/Platforms/iOS/Adapter/BigoAd/Native/BigoUnityNativeAd.mm.meta b/Assets/BigoAds/Scripts/Platforms/iOS/Adapter/BigoAd/Native/BigoUnityNativeAd.mm.meta deleted file mode 100644 index 1609c82..0000000 --- a/Assets/BigoAds/Scripts/Platforms/iOS/Adapter/BigoAd/Native/BigoUnityNativeAd.mm.meta +++ /dev/null @@ -1,37 +0,0 @@ -fileFormatVersion: 2 -guid: 6e061b29b36eb4be7a56af7098092fb3 -PluginImporter: - externalObjects: {} - serializedVersion: 2 - iconMap: {} - executionOrder: {} - defineConstraints: [] - isPreloaded: 0 - isOverridable: 0 - isExplicitlyReferenced: 0 - validateReferences: 1 - platformData: - - first: - Any: - second: - enabled: 0 - settings: {} - - first: - Editor: Editor - second: - enabled: 0 - settings: - DefaultValueInitialized: true - - first: - iPhone: iOS - second: - enabled: 1 - settings: {} - - first: - tvOS: tvOS - second: - enabled: 1 - settings: {} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Assets/BigoAds/Scripts/Platforms/iOS/Adapter/BigoAd/Native/BigoUnityNativeCustomView.h b/Assets/BigoAds/Scripts/Platforms/iOS/Adapter/BigoAd/Native/BigoUnityNativeCustomView.h deleted file mode 100644 index ffbdb68..0000000 --- a/Assets/BigoAds/Scripts/Platforms/iOS/Adapter/BigoAd/Native/BigoUnityNativeCustomView.h +++ /dev/null @@ -1,17 +0,0 @@ -#import -#import - -@interface BigoUnityNativeCustomView : UIView - -@property (nonatomic, strong) BigoAdMediaView *mediaView; -@property (nonatomic, strong) UIImageView *adIconView; -@property (nonatomic, strong) BigoAdOptionsView *adOptionsView; -@property (nonatomic, strong) UILabel *titleLabel; -@property (nonatomic, strong) UILabel *detailLabel; -@property (nonatomic, strong) UIButton *cta; - -- (NSArray *)clickAbleViews; - -- (void)refreshNativeView:(BigoNativeAd *)nativeAd; - -@end diff --git a/Assets/BigoAds/Scripts/Platforms/iOS/Adapter/BigoAd/Native/BigoUnityNativeCustomView.h.meta b/Assets/BigoAds/Scripts/Platforms/iOS/Adapter/BigoAd/Native/BigoUnityNativeCustomView.h.meta deleted file mode 100644 index 10dea82..0000000 --- a/Assets/BigoAds/Scripts/Platforms/iOS/Adapter/BigoAd/Native/BigoUnityNativeCustomView.h.meta +++ /dev/null @@ -1,27 +0,0 @@ -fileFormatVersion: 2 -guid: 1d74138abaf434fd38dce6301cac1107 -PluginImporter: - externalObjects: {} - serializedVersion: 2 - iconMap: {} - executionOrder: {} - defineConstraints: [] - isPreloaded: 0 - isOverridable: 0 - isExplicitlyReferenced: 0 - validateReferences: 1 - platformData: - - first: - Any: - second: - enabled: 1 - settings: {} - - first: - Editor: Editor - second: - enabled: 0 - settings: - DefaultValueInitialized: true - userData: - assetBundleName: - assetBundleVariant: diff --git a/Assets/BigoAds/Scripts/Platforms/iOS/Adapter/BigoAd/Native/BigoUnityNativeCustomView.m b/Assets/BigoAds/Scripts/Platforms/iOS/Adapter/BigoAd/Native/BigoUnityNativeCustomView.m deleted file mode 100644 index 87accfe..0000000 --- a/Assets/BigoAds/Scripts/Platforms/iOS/Adapter/BigoAd/Native/BigoUnityNativeCustomView.m +++ /dev/null @@ -1,72 +0,0 @@ - -#import "BigoUnityNativeCustomView.h" - -@implementation BigoUnityNativeCustomView - -- (instancetype)initWithFrame:(CGRect)frame { - - if (self = [super initWithFrame:frame]) { - - self.backgroundColor = UIColor.whiteColor; - - self.mediaView = [BigoAdMediaView new]; - self.mediaView.bigoNativeAdViewTag = BigoNativeAdViewTagMedia; - self.mediaView.frame = CGRectMake(0, 50, CGRectGetWidth(self.bounds) , CGRectGetHeight(self.bounds) - 100); - - self.adIconView = [UIImageView new]; - self.adIconView.bigoNativeAdViewTag = BigoNativeAdViewTagIcon; - self.adIconView.frame = CGRectMake(0, 0, 50, 50); - - self.cta = [UIButton new]; - self.cta.bigoNativeAdViewTag = BigoNativeAdViewTagCallToAction; - self.cta.titleLabel.textColor = [UIColor colorWithRed:0 green:0 blue:255 alpha:255]; - self.cta.bigoNativeAdViewTag = BigoNativeAdViewTagCallToAction; - [self.cta setBackgroundColor:[UIColor grayColor]]; - - self.adOptionsView = [BigoAdOptionsView new]; - self.adOptionsView.bigoNativeAdViewTag = BigoNativeAdViewTagOption; - self.adOptionsView.frame = CGRectMake(CGRectGetWidth(self.bounds) - 20, 0, 20, 20); - - [self addSubview:self.mediaView]; - [self addSubview:self.adOptionsView]; - [self addSubview:self.adIconView]; - [self addSubview:self.cta]; - - self.titleLabel = UILabel.new; - self.titleLabel.textColor = UIColor.blackColor; - self.titleLabel.bigoNativeAdViewTag = BigoNativeAdViewTagTitle; - self.titleLabel.font = [UIFont systemFontOfSize:18]; - [self addSubview:self.titleLabel]; - - self.detailLabel = UILabel.new; - self.detailLabel.textColor = UIColor.lightGrayColor; - self.detailLabel.bigoNativeAdViewTag = BigoNativeAdViewTagDescription; - self.detailLabel.font = [UIFont systemFontOfSize:18]; - [self addSubview:self.detailLabel]; - - self.titleLabel.frame = CGRectMake(65, 5, CGRectGetWidth(self.bounds)-95, 20); - self.detailLabel.frame = CGRectMake(65, 30, CGRectGetWidth(self.bounds)-95, 20); - - self.cta.frame = CGRectMake(CGRectGetWidth(self.bounds)-100, 250, 100, 50); - - - } - return self; -} - -- (NSArray *)clickAbleViews { - return @[self.adIconView, self.titleLabel, self.detailLabel, self.cta]; -} - -- (void)refreshNativeView:(BigoNativeAd *)nativeAd { - self.titleLabel.text = nativeAd.title; - self.detailLabel.text = nativeAd.adDescription; - NSString *ctaTitle = nativeAd.callToAction.length > 0 ? nativeAd.callToAction : @"Install"; - [self.cta setTitle:ctaTitle forState:UIControlStateNormal]; - //设置按钮选择状态下的标题 - [self.cta setTitle:ctaTitle forState:UIControlStateSelected]; - //设置按钮高亮状态下的标题 - [self.cta setTitle:ctaTitle forState:UIControlStateHighlighted]; -} - -@end diff --git a/Assets/BigoAds/Scripts/Platforms/iOS/Adapter/BigoAd/Native/BigoUnityNativeCustomView.m.meta b/Assets/BigoAds/Scripts/Platforms/iOS/Adapter/BigoAd/Native/BigoUnityNativeCustomView.m.meta deleted file mode 100644 index 0fe8a60..0000000 --- a/Assets/BigoAds/Scripts/Platforms/iOS/Adapter/BigoAd/Native/BigoUnityNativeCustomView.m.meta +++ /dev/null @@ -1,37 +0,0 @@ -fileFormatVersion: 2 -guid: d9e95ef6076f8408a98e195f9786007a -PluginImporter: - externalObjects: {} - serializedVersion: 2 - iconMap: {} - executionOrder: {} - defineConstraints: [] - isPreloaded: 0 - isOverridable: 0 - isExplicitlyReferenced: 0 - validateReferences: 1 - platformData: - - first: - Any: - second: - enabled: 0 - settings: {} - - first: - Editor: Editor - second: - enabled: 0 - settings: - DefaultValueInitialized: true - - first: - iPhone: iOS - second: - enabled: 1 - settings: {} - - first: - tvOS: tvOS - second: - enabled: 1 - settings: {} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Assets/BigoAds/Scripts/Platforms/iOS/Adapter/BigoAd/Popup.meta b/Assets/BigoAds/Scripts/Platforms/iOS/Adapter/BigoAd/Popup.meta deleted file mode 100644 index 1be8634..0000000 --- a/Assets/BigoAds/Scripts/Platforms/iOS/Adapter/BigoAd/Popup.meta +++ /dev/null @@ -1,8 +0,0 @@ -fileFormatVersion: 2 -guid: 24e19875a9807479e8e67ede8568a37d -folderAsset: yes -DefaultImporter: - externalObjects: {} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Assets/BigoAds/Scripts/Platforms/iOS/Adapter/BigoAd/Popup/BigoUnityPopupAd.cs b/Assets/BigoAds/Scripts/Platforms/iOS/Adapter/BigoAd/Popup/BigoUnityPopupAd.cs deleted file mode 100644 index dcca3b9..0000000 --- a/Assets/BigoAds/Scripts/Platforms/iOS/Adapter/BigoAd/Popup/BigoUnityPopupAd.cs +++ /dev/null @@ -1,17 +0,0 @@ -#if UNITY_IOS -using BigoAds.Scripts.Api; -using BigoAds.Scripts.Common; - -namespace BigoAds.Scripts.Platforms.iOS.Adapter.BigoAd -{ - - class BigoUnitypopupAd : BigoIOSBaseAd, IPopupAd - { - public void Load(string slotId, BigoPopupRequest request) - { - adType = 6; - LoadAdData(slotId,request); - } - } -} -#endif diff --git a/Assets/BigoAds/Scripts/Platforms/iOS/Adapter/BigoAd/Popup/BigoUnityPopupAd.cs.meta b/Assets/BigoAds/Scripts/Platforms/iOS/Adapter/BigoAd/Popup/BigoUnityPopupAd.cs.meta deleted file mode 100644 index b015e0d..0000000 --- a/Assets/BigoAds/Scripts/Platforms/iOS/Adapter/BigoAd/Popup/BigoUnityPopupAd.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: 6db3f7d6fb1a84a6eb484a3a8de4498a -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Assets/BigoAds/Scripts/Platforms/iOS/Adapter/BigoAd/Popup/BigoUnityPopupAd.h b/Assets/BigoAds/Scripts/Platforms/iOS/Adapter/BigoAd/Popup/BigoUnityPopupAd.h deleted file mode 100644 index ed0d768..0000000 --- a/Assets/BigoAds/Scripts/Platforms/iOS/Adapter/BigoAd/Popup/BigoUnityPopupAd.h +++ /dev/null @@ -1,17 +0,0 @@ -#import "BigoUnityBaseAdHandler.h" - -extern "C" { - - //load appOpen Ad - void BigoIOS_loadPopupAdData(UnityAd unityAd, - const char *slotId, - const char *requestJson, - AdDidLoadCallback successCallback, - AdLoadFailCallBack failCallback, - AdDidShowCallback showCallback, - AdDidClickCallback clickCallback, - AdDidDismissCallback dismissCallback, - AdDidErrorCallback adErrorCallback); - //show open ad - void BigoIOS_showPopupAd(UnityAd unityAd); -} diff --git a/Assets/BigoAds/Scripts/Platforms/iOS/Adapter/BigoAd/Popup/BigoUnityPopupAd.h.meta b/Assets/BigoAds/Scripts/Platforms/iOS/Adapter/BigoAd/Popup/BigoUnityPopupAd.h.meta deleted file mode 100644 index d0d26d0..0000000 --- a/Assets/BigoAds/Scripts/Platforms/iOS/Adapter/BigoAd/Popup/BigoUnityPopupAd.h.meta +++ /dev/null @@ -1,27 +0,0 @@ -fileFormatVersion: 2 -guid: 60f143a983fcf474f9c68938033d595e -PluginImporter: - externalObjects: {} - serializedVersion: 2 - iconMap: {} - executionOrder: {} - defineConstraints: [] - isPreloaded: 0 - isOverridable: 0 - isExplicitlyReferenced: 0 - validateReferences: 1 - platformData: - - first: - Any: - second: - enabled: 1 - settings: {} - - first: - Editor: Editor - second: - enabled: 0 - settings: - DefaultValueInitialized: true - userData: - assetBundleName: - assetBundleVariant: diff --git a/Assets/BigoAds/Scripts/Platforms/iOS/Adapter/BigoAd/Popup/BigoUnityPopupAd.mm b/Assets/BigoAds/Scripts/Platforms/iOS/Adapter/BigoAd/Popup/BigoUnityPopupAd.mm deleted file mode 100644 index 83ce26a..0000000 --- a/Assets/BigoAds/Scripts/Platforms/iOS/Adapter/BigoAd/Popup/BigoUnityPopupAd.mm +++ /dev/null @@ -1,29 +0,0 @@ -#import -#import "UnityAppController.h" -#import "BigoUnityBaseAdHandler.h" -#import "BigoUnityAdapterTools.h" -#import "BigoUnityAdHandlerManager.h" - -extern "C"{ - -//load popup ad -void BigoIOS_loadPopupAdData(UnityAd unityAd, - const char *slotId, - const char *requestJson, - AdDidLoadCallback successCallback, - AdLoadFailCallBack failCallback, - AdDidShowCallback showCallback, - AdDidClickCallback clickCallback, - AdDidDismissCallback dismissCallback, - AdDidErrorCallback adErrorCallback - ) { - - -} - -void BigoIOS_showPopupAd(UnityAd unityAd) { - -} - -} - diff --git a/Assets/BigoAds/Scripts/Platforms/iOS/Adapter/BigoAd/Popup/BigoUnityPopupAd.mm.meta b/Assets/BigoAds/Scripts/Platforms/iOS/Adapter/BigoAd/Popup/BigoUnityPopupAd.mm.meta deleted file mode 100644 index 3e2fce7..0000000 --- a/Assets/BigoAds/Scripts/Platforms/iOS/Adapter/BigoAd/Popup/BigoUnityPopupAd.mm.meta +++ /dev/null @@ -1,37 +0,0 @@ -fileFormatVersion: 2 -guid: 1216b7bb5404a4e478138d98a4ceabc8 -PluginImporter: - externalObjects: {} - serializedVersion: 2 - iconMap: {} - executionOrder: {} - defineConstraints: [] - isPreloaded: 0 - isOverridable: 0 - isExplicitlyReferenced: 0 - validateReferences: 1 - platformData: - - first: - Any: - second: - enabled: 0 - settings: {} - - first: - Editor: Editor - second: - enabled: 0 - settings: - DefaultValueInitialized: true - - first: - iPhone: iOS - second: - enabled: 1 - settings: {} - - first: - tvOS: tvOS - second: - enabled: 1 - settings: {} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Assets/BigoAds/Scripts/Platforms/iOS/Adapter/BigoAd/Rewarded.meta b/Assets/BigoAds/Scripts/Platforms/iOS/Adapter/BigoAd/Rewarded.meta deleted file mode 100644 index 83e47cd..0000000 --- a/Assets/BigoAds/Scripts/Platforms/iOS/Adapter/BigoAd/Rewarded.meta +++ /dev/null @@ -1,8 +0,0 @@ -fileFormatVersion: 2 -guid: fc24c03453ca84472831cbe13d0cd70d -folderAsset: yes -DefaultImporter: - externalObjects: {} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Assets/BigoAds/Scripts/Platforms/iOS/Adapter/BigoAd/Rewarded/BigoUnityRewardedAd.cs b/Assets/BigoAds/Scripts/Platforms/iOS/Adapter/BigoAd/Rewarded/BigoUnityRewardedAd.cs deleted file mode 100644 index 42bcde8..0000000 --- a/Assets/BigoAds/Scripts/Platforms/iOS/Adapter/BigoAd/Rewarded/BigoUnityRewardedAd.cs +++ /dev/null @@ -1,63 +0,0 @@ -#if UNITY_IOS -using System.Collections.Generic; -using AOT; -using UnityEngine; - -namespace BigoAds.Scripts.Platforms.iOS.Adapter.BigoAd -{ - using System; - using BigoAds.Scripts.Api; - using BigoAds.Scripts.Common; - using BigoAds.Scripts.Platforms.iOS; - using System.Runtime.InteropServices; - class BigoUnityRewardedAd : BigoIOSBaseAd, IRewardedAd - { - public event Action OnUserEarnedReward; - - public void Load(string slotId, BigoRewardedRequest request) - { - adType = 4; - this.unityAdPtr = (IntPtr)GCHandle.Alloc (this); - IntPtr ptr = this.unityAdPtr; - - BigoIOS_loadRewardedAdData(ptr, - slotId, - request.ToJson(), - cs_adDidLoadCallback, - cs_adLoadFailCallBack, - cs_adDidShowCallback, - cs_adDidClickCallback, - cs_adDidDismissCallback, - cs_adDidErrorCallBack, - cs_adDidEarnRewardCallback); - LOGWithMessage(System.Reflection.MethodBase.GetCurrentMethod()?.Name,$"slotId:{slotId},request{request}"); - } - - // c-> oc - [DllImport("__Internal")] - static extern void BigoIOS_loadRewardedAdData(IntPtr unityAd, - string slotId, - string requestJson, - adDidLoadCallback_delegate successCallback, - adLoadFailCallBack_delegate failCallback, - adDidShowCallback_delegate showCallback, - adDidClickCallback_delegate clickCallback, - adDidDismissCallback_delegate dismissCallback, - adDidErrorCallback_delegate adErrorCallback, - adDidEarnRewardCallback_delegate earnCallback); - - private delegate void adDidEarnRewardCallback_delegate(IntPtr unityAdPtr); - - [MonoPInvokeCallback(typeof(adDidEarnRewardCallback_delegate))] - private static void cs_adDidEarnRewardCallback(IntPtr unityAdPtr) - { - BigoUnityRewardedAd unityAd = BigoIOSBaseAd.GetUnityAd(unityAdPtr) as BigoUnityRewardedAd; - if (unityAd == null) - { - return; - } - unityAd.OnUserEarnedReward?.Invoke(); - } - } -} -#endif diff --git a/Assets/BigoAds/Scripts/Platforms/iOS/Adapter/BigoAd/Rewarded/BigoUnityRewardedAd.cs.meta b/Assets/BigoAds/Scripts/Platforms/iOS/Adapter/BigoAd/Rewarded/BigoUnityRewardedAd.cs.meta deleted file mode 100644 index cdab5d2..0000000 --- a/Assets/BigoAds/Scripts/Platforms/iOS/Adapter/BigoAd/Rewarded/BigoUnityRewardedAd.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: 63ac6f7f8298c4f2585c4847b19ae90d -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Assets/BigoAds/Scripts/Platforms/iOS/Adapter/BigoAd/Rewarded/BigoUnityRewardedAd.h b/Assets/BigoAds/Scripts/Platforms/iOS/Adapter/BigoAd/Rewarded/BigoUnityRewardedAd.h deleted file mode 100644 index efe9083..0000000 --- a/Assets/BigoAds/Scripts/Platforms/iOS/Adapter/BigoAd/Rewarded/BigoUnityRewardedAd.h +++ /dev/null @@ -1,18 +0,0 @@ -#import "BigoUnityBaseAdHandler.h" - -extern "C" { - - //load Rewarded Ad - void BigoIOS_loadRewardedAdData(UnityAd unityAd, - const char *slotId, - const char *requestJson, - AdDidLoadCallback successCallback, - AdLoadFailCallBack failCallback, - AdDidShowCallback showCallback, - AdDidClickCallback clickCallback, - AdDidDismissCallback dismissCallback, - AdDidErrorCallback adErrorCallback, - AdDidEarnRewardCallback earnCallback); - //show open ad - void BigoIOS_showRewardedAd(UnityAd unityAd); -} diff --git a/Assets/BigoAds/Scripts/Platforms/iOS/Adapter/BigoAd/Rewarded/BigoUnityRewardedAd.h.meta b/Assets/BigoAds/Scripts/Platforms/iOS/Adapter/BigoAd/Rewarded/BigoUnityRewardedAd.h.meta deleted file mode 100644 index 1963bd9..0000000 --- a/Assets/BigoAds/Scripts/Platforms/iOS/Adapter/BigoAd/Rewarded/BigoUnityRewardedAd.h.meta +++ /dev/null @@ -1,27 +0,0 @@ -fileFormatVersion: 2 -guid: 780f30ce3796b4a89a92aa7e746d76bd -PluginImporter: - externalObjects: {} - serializedVersion: 2 - iconMap: {} - executionOrder: {} - defineConstraints: [] - isPreloaded: 0 - isOverridable: 0 - isExplicitlyReferenced: 0 - validateReferences: 1 - platformData: - - first: - Any: - second: - enabled: 1 - settings: {} - - first: - Editor: Editor - second: - enabled: 0 - settings: - DefaultValueInitialized: true - userData: - assetBundleName: - assetBundleVariant: diff --git a/Assets/BigoAds/Scripts/Platforms/iOS/Adapter/BigoAd/Rewarded/BigoUnityRewardedAd.mm b/Assets/BigoAds/Scripts/Platforms/iOS/Adapter/BigoAd/Rewarded/BigoUnityRewardedAd.mm deleted file mode 100644 index 339e78b..0000000 --- a/Assets/BigoAds/Scripts/Platforms/iOS/Adapter/BigoAd/Rewarded/BigoUnityRewardedAd.mm +++ /dev/null @@ -1,69 +0,0 @@ -#import -#import "UnityAppController.h" -#import "BigoUnityBaseAdHandler.h" -#import "BigoUnityAdapterTools.h" -#import "BigoUnityAdHandlerManager.h" - -extern "C"{ - -//load rewarded ad -void BigoIOS_loadRewardedAdData(UnityAd unityAd, - const char *slotId, - const char *requestJson, - AdDidLoadCallback successCallback, - AdLoadFailCallBack failCallback, - AdDidShowCallback showCallback, - AdDidClickCallback clickCallback, - AdDidDismissCallback dismissCallback, - AdDidErrorCallback adErrorCallback, - AdDidEarnRewardCallback earnCallback - ) { - BigoIOS_dispatchSyncMainQueue(^{ - - BigoUnityRewardedAdHandler *adHandler = [[BigoUnityRewardedAdHandler alloc] init]; - BigoRewardVideoAdRequest *request = [[BigoRewardVideoAdRequest alloc] initWithSlotId:BigoIOS_transformNSStringForm(slotId)]; - NSDictionary *requestDict = BigoIOS_requestJsonObjectFromJsonString(requestJson); - request.age = [requestDict[@"age"] intValue]; - request.gender = (BigoAdGender)[requestDict[@"gender"] intValue]; - request.activatedTime = [requestDict[@"activatedTime"] longLongValue]; - BigoRewardVideoAdLoader *adLoader = [[BigoRewardVideoAdLoader alloc] initWithRewardVideoAdLoaderDelegate:adHandler]; - adLoader.ext = requestDict[@"extraInfo"]; - adHandler.adLoader = adLoader; - adHandler.unityAd = unityAd; - adHandler.showCallback = showCallback; - adHandler.clickCallback = clickCallback; - adHandler.dismissCallback = dismissCallback; - adHandler.adErrorCallback = adErrorCallback; - adHandler.successCallback = successCallback; - adHandler.failCallback = failCallback; - adHandler.earnCallback = earnCallback; - NSString *unityAdKey = [BigoUnityAdHandlerManager createKeyUnityAd:unityAd]; - [BigoUnityAdHandlerManager saveAdHandler:adHandler withKey:unityAdKey]; - [adLoader loadAd:request]; - }); - -} - -BigoUnityRewardedAdHandler* BigoIOS_getRewardedAdHandler(UnityAd unityAd) { - if (!unityAd) return nil; - NSString *unityAdKey = [BigoUnityAdHandlerManager createKeyUnityAd:unityAd]; - BigoUnityRewardedAdHandler *handler = (BigoUnityRewardedAdHandler*)[BigoUnityAdHandlerManager handlerWithKey:unityAdKey]; - if (!handler || ![handler isMemberOfClass:[BigoUnityRewardedAdHandler class]]) { - return nil; - } - return handler; -} - -void BigoIOS_showRewardedAd(UnityAd unityAd) { - BigoUnityRewardedAdHandler *handler = BigoIOS_getRewardedAdHandler(unityAd); - if (!handler) return; - - BigoIOS_dispatchSyncMainQueue(^{ - UIViewController *vc = GetAppController().rootViewController; - BigoRewardVideoAd *ad = (BigoRewardVideoAd *)handler.ad; - [ad show:vc]; - }); -} - -} - diff --git a/Assets/BigoAds/Scripts/Platforms/iOS/Adapter/BigoAd/Rewarded/BigoUnityRewardedAd.mm.meta b/Assets/BigoAds/Scripts/Platforms/iOS/Adapter/BigoAd/Rewarded/BigoUnityRewardedAd.mm.meta deleted file mode 100644 index 71a5f96..0000000 --- a/Assets/BigoAds/Scripts/Platforms/iOS/Adapter/BigoAd/Rewarded/BigoUnityRewardedAd.mm.meta +++ /dev/null @@ -1,37 +0,0 @@ -fileFormatVersion: 2 -guid: d8fabace3a5bc43d1909e6d2e3d11b76 -PluginImporter: - externalObjects: {} - serializedVersion: 2 - iconMap: {} - executionOrder: {} - defineConstraints: [] - isPreloaded: 0 - isOverridable: 0 - isExplicitlyReferenced: 0 - validateReferences: 1 - platformData: - - first: - Any: - second: - enabled: 0 - settings: {} - - first: - Editor: Editor - second: - enabled: 0 - settings: - DefaultValueInitialized: true - - first: - iPhone: iOS - second: - enabled: 1 - settings: {} - - first: - tvOS: tvOS - second: - enabled: 1 - settings: {} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Assets/BigoAds/Scripts/Platforms/iOS/Adapter/BigoAd/Splash.meta b/Assets/BigoAds/Scripts/Platforms/iOS/Adapter/BigoAd/Splash.meta deleted file mode 100644 index 2dca882..0000000 --- a/Assets/BigoAds/Scripts/Platforms/iOS/Adapter/BigoAd/Splash.meta +++ /dev/null @@ -1,8 +0,0 @@ -fileFormatVersion: 2 -guid: 7f81b17e4602f4d049f2f1679dd986df -folderAsset: yes -DefaultImporter: - externalObjects: {} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Assets/BigoAds/Scripts/Platforms/iOS/Adapter/BigoAd/Splash/BGSplashAdViewController.h b/Assets/BigoAds/Scripts/Platforms/iOS/Adapter/BigoAd/Splash/BGSplashAdViewController.h deleted file mode 100644 index 0dd0477..0000000 --- a/Assets/BigoAds/Scripts/Platforms/iOS/Adapter/BigoAd/Splash/BGSplashAdViewController.h +++ /dev/null @@ -1,24 +0,0 @@ -// -// BGSplashAdViewController.h -// demo -// -// Created by cai on 2022/5/23. -// - -#import -#import -#import "BigoUnityBaseAdHandler.h" - -NS_ASSUME_NONNULL_BEGIN - -@interface BGSplashAdViewController : UIViewController - -@property (nonatomic, strong) UIViewController *rootVC; - -@property (nonatomic, strong) BigoSplashAd *ad; - -@property (nonatomic, weak) BigoUnitySplashAdHandler *adHandle; - -@end - -NS_ASSUME_NONNULL_END diff --git a/Assets/BigoAds/Scripts/Platforms/iOS/Adapter/BigoAd/Splash/BGSplashAdViewController.h.meta b/Assets/BigoAds/Scripts/Platforms/iOS/Adapter/BigoAd/Splash/BGSplashAdViewController.h.meta deleted file mode 100644 index 6a06c0e..0000000 --- a/Assets/BigoAds/Scripts/Platforms/iOS/Adapter/BigoAd/Splash/BGSplashAdViewController.h.meta +++ /dev/null @@ -1,27 +0,0 @@ -fileFormatVersion: 2 -guid: fb04cd43cee464aaca615d708992dd8c -PluginImporter: - externalObjects: {} - serializedVersion: 2 - iconMap: {} - executionOrder: {} - defineConstraints: [] - isPreloaded: 0 - isOverridable: 0 - isExplicitlyReferenced: 0 - validateReferences: 1 - platformData: - - first: - Any: - second: - enabled: 1 - settings: {} - - first: - Editor: Editor - second: - enabled: 0 - settings: - DefaultValueInitialized: true - userData: - assetBundleName: - assetBundleVariant: diff --git a/Assets/BigoAds/Scripts/Platforms/iOS/Adapter/BigoAd/Splash/BGSplashAdViewController.m b/Assets/BigoAds/Scripts/Platforms/iOS/Adapter/BigoAd/Splash/BGSplashAdViewController.m deleted file mode 100644 index 2ab13ff..0000000 --- a/Assets/BigoAds/Scripts/Platforms/iOS/Adapter/BigoAd/Splash/BGSplashAdViewController.m +++ /dev/null @@ -1,71 +0,0 @@ -// -// BGSplashAdViewController.m -// demo -// -// Created by cai on 2022/5/23. -// - -#import "BGSplashAdViewController.h" - -@interface BGSplashAdViewController () - -@end - -@implementation BGSplashAdViewController - -- (void)viewDidLoad { - [super viewDidLoad]; - self.view.backgroundColor = [UIColor whiteColor]; - - [self.ad setSplashAdInteractionDelegate:self]; - [self.ad showInAdContainer:self.view]; -} - -- (void)dismissSplashController:(BigoAd *)ad { - [self.adHandle onAdClosed:ad]; - [[UIApplication sharedApplication].keyWindow setRootViewController:self.rootVC]; -} - -/** - * 广告可跳过回调,通常是由用户点击了右上角 SKIP 按钮所触发 - */ -- (void)onAdSkipped:(BigoAd *)ad { - [self dismissSplashController:ad]; -} - -/** - * 广告倒计时结束回调 - */ -- (void)onAdFinished:(BigoAd *)ad { - -} - -- (void)onAd:(BigoAd *)ad error:(BigoAdError *)error { - [self dismissSplashController:ad]; -} - -//广告展示 -- (void)onAdImpression:(BigoAd *)ad { - [self.adHandle onAdImpression:ad]; -} - -//广告点击 -- (void)onAdClicked:(BigoAd *)ad { - [self.adHandle onAdClicked:ad]; -} - -- (void)viewWillAppear:(BOOL)animated { - [super viewWillAppear:animated]; - [self.navigationController setNavigationBarHidden:YES animated:animated]; -} - -- (void)viewWillDisappear:(BOOL)animated { - [super viewWillDisappear:animated]; - [self.navigationController setNavigationBarHidden:NO animated:animated]; -} - -- (BOOL)prefersStatusBarHidden { - return YES; -} - -@end diff --git a/Assets/BigoAds/Scripts/Platforms/iOS/Adapter/BigoAd/Splash/BGSplashAdViewController.m.meta b/Assets/BigoAds/Scripts/Platforms/iOS/Adapter/BigoAd/Splash/BGSplashAdViewController.m.meta deleted file mode 100644 index 21558bd..0000000 --- a/Assets/BigoAds/Scripts/Platforms/iOS/Adapter/BigoAd/Splash/BGSplashAdViewController.m.meta +++ /dev/null @@ -1,37 +0,0 @@ -fileFormatVersion: 2 -guid: 39e7476be840e4443b46b46741933efe -PluginImporter: - externalObjects: {} - serializedVersion: 2 - iconMap: {} - executionOrder: {} - defineConstraints: [] - isPreloaded: 0 - isOverridable: 0 - isExplicitlyReferenced: 0 - validateReferences: 1 - platformData: - - first: - Any: - second: - enabled: 0 - settings: {} - - first: - Editor: Editor - second: - enabled: 0 - settings: - DefaultValueInitialized: true - - first: - iPhone: iOS - second: - enabled: 1 - settings: {} - - first: - tvOS: tvOS - second: - enabled: 1 - settings: {} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Assets/BigoAds/Scripts/Platforms/iOS/Adapter/BigoAd/Splash/BigoUnitySplashAd.cs b/Assets/BigoAds/Scripts/Platforms/iOS/Adapter/BigoAd/Splash/BigoUnitySplashAd.cs deleted file mode 100644 index 3d524cf..0000000 --- a/Assets/BigoAds/Scripts/Platforms/iOS/Adapter/BigoAd/Splash/BigoUnitySplashAd.cs +++ /dev/null @@ -1,17 +0,0 @@ -#if UNITY_IOS -using BigoAds.Scripts.Api; -using BigoAds.Scripts.Common; - -namespace BigoAds.Scripts.Platforms.iOS.Adapter.BigoAd -{ - - class BigoUnitySplashAd : BigoIOSBaseAd, ISplashAd - { - public void Load(string slotId, BigoSplashRequest request) - { - adType = 5; - LoadAdData(slotId,request); - } - } -} -#endif diff --git a/Assets/BigoAds/Scripts/Platforms/iOS/Adapter/BigoAd/Splash/BigoUnitySplashAd.cs.meta b/Assets/BigoAds/Scripts/Platforms/iOS/Adapter/BigoAd/Splash/BigoUnitySplashAd.cs.meta deleted file mode 100644 index f7fd32d..0000000 --- a/Assets/BigoAds/Scripts/Platforms/iOS/Adapter/BigoAd/Splash/BigoUnitySplashAd.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: 75707b903f9fd4fdaa3146b0ec0fad6b -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Assets/BigoAds/Scripts/Platforms/iOS/Adapter/BigoAd/Splash/BigoUnitySplashAd.h b/Assets/BigoAds/Scripts/Platforms/iOS/Adapter/BigoAd/Splash/BigoUnitySplashAd.h deleted file mode 100644 index f2a616a..0000000 --- a/Assets/BigoAds/Scripts/Platforms/iOS/Adapter/BigoAd/Splash/BigoUnitySplashAd.h +++ /dev/null @@ -1,17 +0,0 @@ -#import "BigoUnityBaseAdHandler.h" - -extern "C" { - - //load appOpen Ad - void BigoIOS_loadSplashAdData(UnityAd unityAd, - const char *slotId, - const char *requestJson, - AdDidLoadCallback successCallback, - AdLoadFailCallBack failCallback, - AdDidShowCallback showCallback, - AdDidClickCallback clickCallback, - AdDidDismissCallback dismissCallback, - AdDidErrorCallback adErrorCallback); - //show open ad - void BigoIOS_showSplashAd(UnityAd unityAd); -} diff --git a/Assets/BigoAds/Scripts/Platforms/iOS/Adapter/BigoAd/Splash/BigoUnitySplashAd.h.meta b/Assets/BigoAds/Scripts/Platforms/iOS/Adapter/BigoAd/Splash/BigoUnitySplashAd.h.meta deleted file mode 100644 index 265c352..0000000 --- a/Assets/BigoAds/Scripts/Platforms/iOS/Adapter/BigoAd/Splash/BigoUnitySplashAd.h.meta +++ /dev/null @@ -1,27 +0,0 @@ -fileFormatVersion: 2 -guid: b558ab701b1ae4f74a9bf6908be239c4 -PluginImporter: - externalObjects: {} - serializedVersion: 2 - iconMap: {} - executionOrder: {} - defineConstraints: [] - isPreloaded: 0 - isOverridable: 0 - isExplicitlyReferenced: 0 - validateReferences: 1 - platformData: - - first: - Any: - second: - enabled: 1 - settings: {} - - first: - Editor: Editor - second: - enabled: 0 - settings: - DefaultValueInitialized: true - userData: - assetBundleName: - assetBundleVariant: diff --git a/Assets/BigoAds/Scripts/Platforms/iOS/Adapter/BigoAd/Splash/BigoUnitySplashAd.mm b/Assets/BigoAds/Scripts/Platforms/iOS/Adapter/BigoAd/Splash/BigoUnitySplashAd.mm deleted file mode 100644 index 4024579..0000000 --- a/Assets/BigoAds/Scripts/Platforms/iOS/Adapter/BigoAd/Splash/BigoUnitySplashAd.mm +++ /dev/null @@ -1,71 +0,0 @@ -#import -#import "UnityAppController.h" -#import "BigoUnityBaseAdHandler.h" -#import "BigoUnityAdapterTools.h" -#import "BigoUnityAdHandlerManager.h" -#import "BGSplashAdViewController.h" - -extern "C"{ - -//load splash ad -void BigoIOS_loadSplashAdData(UnityAd unityAd, - const char *slotId, - const char *requestJson, - AdDidLoadCallback successCallback, - AdLoadFailCallBack failCallback, - AdDidShowCallback showCallback, - AdDidClickCallback clickCallback, - AdDidDismissCallback dismissCallback, - AdDidErrorCallback adErrorCallback - ) { - BigoIOS_dispatchSyncMainQueue(^{ - - BigoUnitySplashAdHandler *adHandler = [[BigoUnitySplashAdHandler alloc] init]; - BigoSplashAdRequest *request = [[BigoSplashAdRequest alloc] initWithSlotId:BigoIOS_transformNSStringForm(slotId)]; - NSDictionary *requestDict = BigoIOS_requestJsonObjectFromJsonString(requestJson); - request.age = [requestDict[@"age"] intValue]; - request.gender = (BigoAdGender)[requestDict[@"gender"] intValue]; - request.activatedTime = [requestDict[@"activatedTime"] longLongValue]; - BigoSplashAdLoader *adLoader = [[BigoSplashAdLoader alloc] initWithSplashAdLoaderDelegate:adHandler]; - adLoader.ext = requestDict[@"extraInfo"]; - adHandler.adLoader = adLoader; - adHandler.unityAd = unityAd; - adHandler.showCallback = showCallback; - adHandler.clickCallback = clickCallback; - adHandler.dismissCallback = dismissCallback; - adHandler.adErrorCallback = adErrorCallback; - adHandler.successCallback = successCallback; - adHandler.failCallback = failCallback; - NSString *unityAdKey = [BigoUnityAdHandlerManager createKeyUnityAd:unityAd]; - [BigoUnityAdHandlerManager saveAdHandler:adHandler withKey:unityAdKey]; - [adLoader loadAd:request]; - }); - -} - -BigoUnitySplashAdHandler* BigoIOS_getSplashAdHandler(UnityAd unityAd) { - if (!unityAd) return nil; - NSString *unityAdKey = [BigoUnityAdHandlerManager createKeyUnityAd:unityAd]; - BigoUnitySplashAdHandler *handler = (BigoUnitySplashAdHandler*)[BigoUnityAdHandlerManager handlerWithKey:unityAdKey]; - if (!handler || ![handler isMemberOfClass:[BigoUnitySplashAdHandler class]]) { - return nil; - } - return handler; -} - -void BigoIOS_showSplashAd(UnityAd unityAd) { - BigoUnitySplashAdHandler *handler = BigoIOS_getSplashAdHandler(unityAd); - if (!handler) return; - - BigoIOS_dispatchSyncMainQueue(^{ - BGSplashAdViewController *vc = [BGSplashAdViewController new]; - BigoSplashAd *ad = (BigoSplashAd *)handler.ad; - vc.ad = ad; - vc.adHandle = handler; - vc.rootVC = [UIApplication sharedApplication].keyWindow.rootViewController; - [[UIApplication sharedApplication].keyWindow setRootViewController:vc]; - }); -} - -} - diff --git a/Assets/BigoAds/Scripts/Platforms/iOS/Adapter/BigoAd/Splash/BigoUnitySplashAd.mm.meta b/Assets/BigoAds/Scripts/Platforms/iOS/Adapter/BigoAd/Splash/BigoUnitySplashAd.mm.meta deleted file mode 100644 index fad9286..0000000 --- a/Assets/BigoAds/Scripts/Platforms/iOS/Adapter/BigoAd/Splash/BigoUnitySplashAd.mm.meta +++ /dev/null @@ -1,37 +0,0 @@ -fileFormatVersion: 2 -guid: 8235e7e5bc3aa4161911cbb121a01ed6 -PluginImporter: - externalObjects: {} - serializedVersion: 2 - iconMap: {} - executionOrder: {} - defineConstraints: [] - isPreloaded: 0 - isOverridable: 0 - isExplicitlyReferenced: 0 - validateReferences: 1 - platformData: - - first: - Any: - second: - enabled: 0 - settings: {} - - first: - Editor: Editor - second: - enabled: 0 - settings: - DefaultValueInitialized: true - - first: - iPhone: iOS - second: - enabled: 1 - settings: {} - - first: - tvOS: tvOS - second: - enabled: 1 - settings: {} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Assets/BigoAds/Scripts/Platforms/iOS/Adapter/BigoUnityAdapterTools.h b/Assets/BigoAds/Scripts/Platforms/iOS/Adapter/BigoUnityAdapterTools.h deleted file mode 100644 index d78de0d..0000000 --- a/Assets/BigoAds/Scripts/Platforms/iOS/Adapter/BigoUnityAdapterTools.h +++ /dev/null @@ -1,6 +0,0 @@ -extern "C" { - NSString* BigoIOS_transformNSStringForm(const char * string); - void BigoIOS_dispatchSyncMainQueue(void (^block)(void)); - NSDictionary* BigoIOS_jsonObjectFromJsonString(NSString *jsonString); - NSDictionary* BigoIOS_requestJsonObjectFromJsonString(const char * json); -} diff --git a/Assets/BigoAds/Scripts/Platforms/iOS/Adapter/BigoUnityAdapterTools.h.meta b/Assets/BigoAds/Scripts/Platforms/iOS/Adapter/BigoUnityAdapterTools.h.meta deleted file mode 100644 index a39f59f..0000000 --- a/Assets/BigoAds/Scripts/Platforms/iOS/Adapter/BigoUnityAdapterTools.h.meta +++ /dev/null @@ -1,27 +0,0 @@ -fileFormatVersion: 2 -guid: b79d02d93f49840b7ad17017bcb5f3fe -PluginImporter: - externalObjects: {} - serializedVersion: 2 - iconMap: {} - executionOrder: {} - defineConstraints: [] - isPreloaded: 0 - isOverridable: 0 - isExplicitlyReferenced: 0 - validateReferences: 1 - platformData: - - first: - Any: - second: - enabled: 1 - settings: {} - - first: - Editor: Editor - second: - enabled: 0 - settings: - DefaultValueInitialized: true - userData: - assetBundleName: - assetBundleVariant: diff --git a/Assets/BigoAds/Scripts/Platforms/iOS/Adapter/BigoUnityAdapterTools.mm b/Assets/BigoAds/Scripts/Platforms/iOS/Adapter/BigoUnityAdapterTools.mm deleted file mode 100644 index 36c107a..0000000 --- a/Assets/BigoAds/Scripts/Platforms/iOS/Adapter/BigoUnityAdapterTools.mm +++ /dev/null @@ -1,43 +0,0 @@ -#import - -extern "C" { -//字符串转化工具 -NSString* BigoIOS_transformNSStringForm(const char * string) -{ - if (!string) - { - string = ""; - } - return [NSString stringWithUTF8String:string]; -} - -void BigoIOS_dispatchSyncMainQueue(void (^block)(void)) { - if (!block) return; - if ([[NSThread currentThread] isMainThread]){ - block(); - return; - } - dispatch_sync(dispatch_get_main_queue(), ^{ block(); }); -} - -NSDictionary* BigoIOS_jsonObjectFromJsonString(NSString *jsonString) { - if (jsonString.length == 0) { - return [[NSDictionary alloc] init]; - } - NSData *data = [jsonString dataUsingEncoding:NSUTF8StringEncoding]; - NSError *error = nil; - id obj = [NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingMutableContainers error:&error]; - if (error || ![obj isKindOfClass:[NSDictionary class]]) { - return [[NSDictionary alloc] init]; - } - return obj; -} - -NSDictionary* BigoIOS_requestJsonObjectFromJsonString(const char * json) { - NSString *string = BigoIOS_transformNSStringForm(json); - return BigoIOS_jsonObjectFromJsonString(string); -} - - - -} diff --git a/Assets/BigoAds/Scripts/Platforms/iOS/Adapter/BigoUnityAdapterTools.mm.meta b/Assets/BigoAds/Scripts/Platforms/iOS/Adapter/BigoUnityAdapterTools.mm.meta deleted file mode 100644 index d1965c5..0000000 --- a/Assets/BigoAds/Scripts/Platforms/iOS/Adapter/BigoUnityAdapterTools.mm.meta +++ /dev/null @@ -1,37 +0,0 @@ -fileFormatVersion: 2 -guid: 486cb19aab9734f3182b6ff6dc3d23b4 -PluginImporter: - externalObjects: {} - serializedVersion: 2 - iconMap: {} - executionOrder: {} - defineConstraints: [] - isPreloaded: 0 - isOverridable: 0 - isExplicitlyReferenced: 0 - validateReferences: 1 - platformData: - - first: - Any: - second: - enabled: 0 - settings: {} - - first: - Editor: Editor - second: - enabled: 0 - settings: - DefaultValueInitialized: true - - first: - iPhone: iOS - second: - enabled: 1 - settings: {} - - first: - tvOS: tvOS - second: - enabled: 1 - settings: {} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Assets/BigoAds/Scripts/Platforms/iOS/IOSClientFactory.cs b/Assets/BigoAds/Scripts/Platforms/iOS/IOSClientFactory.cs deleted file mode 100644 index 8f03a0a..0000000 --- a/Assets/BigoAds/Scripts/Platforms/iOS/IOSClientFactory.cs +++ /dev/null @@ -1,46 +0,0 @@ -#if UNITY_IOS -using BigoAds.Scripts.Common; -using BigoAds.Scripts.Platforms.iOS; -using BigoAds.Scripts.Platforms.iOS.Adapter.BigoAd; - -namespace BigoAds.Scripts.Platforms.iOS -{ - class IOSClientFactory : IClientFactory - { - - public ISDK BuildSDKClient() - { - return new BigoUnitySdk(); - } - - public IBannerAd BuildBannerAdClient() - { - return new BigoUnityBannerAd(); - } - - public INativeAd BuildNativeAdClient() - { - return new BigoUnityNativeAd(); - } - - public IInterstitialAd BuildInterstitialAdClient() - { - return new BigoUnityinterstitialAd(); - } - - public ISplashAd BuildSplashAdClient() - { - return new BigoUnitySplashAd(); - } - - public IRewardedAd BuildRewardedAdClient() - { - return new BigoUnityRewardedAd(); - } - public IPopupAd BuildPopupAdClient() - { - return new BigoUnitypopupAd(); - } - } -} -#endif \ No newline at end of file diff --git a/Assets/BigoAds/Scripts/Platforms/iOS/IOSClientFactory.cs.meta b/Assets/BigoAds/Scripts/Platforms/iOS/IOSClientFactory.cs.meta deleted file mode 100644 index 3c9b051..0000000 --- a/Assets/BigoAds/Scripts/Platforms/iOS/IOSClientFactory.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: 19b9b3ee98a034640a2530047c2a4d7a -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Assets/BigoSDK.meta b/Assets/BigoSDK.meta deleted file mode 100644 index ba780c9..0000000 --- a/Assets/BigoSDK.meta +++ /dev/null @@ -1,8 +0,0 @@ -fileFormatVersion: 2 -guid: 2154e3fcfcb7f460db1c13464bb1355f -folderAsset: yes -DefaultImporter: - externalObjects: {} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Assets/BigoSDK/Editor.meta b/Assets/BigoSDK/Editor.meta deleted file mode 100644 index 39c97da..0000000 --- a/Assets/BigoSDK/Editor.meta +++ /dev/null @@ -1,8 +0,0 @@ -fileFormatVersion: 2 -guid: ec31bab3b8560467a9ec89b7934596bd -folderAsset: yes -DefaultImporter: - externalObjects: {} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Assets/BigoSDK/Editor/Dependencies.xml b/Assets/BigoSDK/Editor/Dependencies.xml deleted file mode 100644 index 4627456..0000000 --- a/Assets/BigoSDK/Editor/Dependencies.xml +++ /dev/null @@ -1,13 +0,0 @@ - - - - - - - - - https://repo1.maven.org/maven2/ - - - - diff --git a/Assets/BigoSDK/Editor/Dependencies.xml.meta b/Assets/BigoSDK/Editor/Dependencies.xml.meta deleted file mode 100644 index f60ea08..0000000 --- a/Assets/BigoSDK/Editor/Dependencies.xml.meta +++ /dev/null @@ -1,7 +0,0 @@ -fileFormatVersion: 2 -guid: 1b669f66367be4697b7819f165f9842b -TextScriptImporter: - externalObjects: {} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Assets/EFSDK.meta b/Assets/EFSDK.meta deleted file mode 100644 index 55b5bec..0000000 --- a/Assets/EFSDK.meta +++ /dev/null @@ -1,8 +0,0 @@ -fileFormatVersion: 2 -guid: 6aee787c9d4ba4cce841a8bee8c9c726 -folderAsset: yes -DefaultImporter: - externalObjects: {} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Assets/EFSDK/Android.meta b/Assets/EFSDK/Android.meta deleted file mode 100755 index a3881df..0000000 --- a/Assets/EFSDK/Android.meta +++ /dev/null @@ -1,3 +0,0 @@ -fileFormatVersion: 2 -guid: fa22f34439f14c8cbaa5fae4c4dc402b -timeCreated: 1742203865 \ No newline at end of file diff --git a/Assets/EFSDK/Android/res.meta b/Assets/EFSDK/Android/res.meta deleted file mode 100755 index 9bc542b..0000000 --- a/Assets/EFSDK/Android/res.meta +++ /dev/null @@ -1,3 +0,0 @@ -fileFormatVersion: 2 -guid: f322db129aac4ea1aa9919e8c8f92a08 -timeCreated: 1756693458 \ No newline at end of file diff --git a/Assets/EFSDK/Android/res/drawable-xxhdpi.meta b/Assets/EFSDK/Android/res/drawable-xxhdpi.meta deleted file mode 100644 index 5a19b78..0000000 --- a/Assets/EFSDK/Android/res/drawable-xxhdpi.meta +++ /dev/null @@ -1,3 +0,0 @@ -fileFormatVersion: 2 -guid: 8af1d23b4bce430aa8bfb3e1b6b3b291 -timeCreated: 1756693481 \ No newline at end of file diff --git a/Assets/EFSDK/Android/res/drawable-xxhdpi/_sdk_icon_1024.png b/Assets/EFSDK/Android/res/drawable-xxhdpi/_sdk_icon_1024.png deleted file mode 100644 index 72889b2f1b32df681648a7507676c52d41144972..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 286361 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�}q|v5s&{934VayOjiZ&amJF5jhK-4 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

Zzg^i{^sZO)B`DIp5X=b)A8}izwS;Bo`W$ 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%0A1t*k~GWb*yji^Jmh;AjFE{B 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%0AKxuGzpF) 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�h1qWC8K-N`JEpoAv&3&nGn;UfnW&H14%Jr!P~Mf`TLbA9pps zt`++X+Th8v7&WRbtPiu0T>40{I@99?;f0?t!gni-7J7lMw zA`BAEmpsWsB3A7SslQdQ74NOr2hk5fHnS8hNgLRha2IX_VJddPu$=2IG76gjDiE1d zguFEk4;eg6c|FfVm=lUUdmQ;YyN)}mvRXx06m8B65ujUVx4mWe`x7$-eHpD-3u+7d$t;XGu98--aagFav=*f%Y@1UYZ zcMW8okj3|{SI6U_<`W6>%n+m`Y5>D|3vbYjnH`q_uVSYR{#yVeUgFoTcZCO^z%k>I zdffKtb8H7IQe~bp9Q0Ht2l^hA(@ua^K;j4~`V@Nn-ccI;#9|o7gmawi%OtieLGP?3 z_&P&x{w-Z@VGr(CeNj^sowm#{m=|62iDw*QIwcYv>?j}5*WX<`q-dh}y%GK~)QM@g zboxQKG?baI;sqV6)zao|wrRlDu7Effg&&Dj-XT|@2&|RvkY|Dg0}EQhY+;;f$6dw( z7LuSk{c6e+$fN(N`owwtVPwJg74eKvTnh36G;9S<3v>Zzu;-Fs?(;8fPxd(SNxf#z z&bg|NrA2Qr?gyKWG}z{|j{R;v;}$;Bjec7VNPfF@u`+!_T7Z@SWuh}nU%3b(l14#Q#NRAHX|WwnoGVzQ(6qxh$+SE_eMH$gFz z!J~E?hkUv-W(vx>iOx`a<>(e>8BjPiaAGN_$b?HMXRd*cEh_I#=M*~bLg5N$@R4mX z`^ONs-hsbKq$xoB?+~J*ZipR(HPsKM!0rl~*a9I#y}S-`SQ29vdco-K>+`*e+x5gb zSwPDGauMhTmS-krMKygJFjsI{#*unHVIIWu$T-WGwpniT!M(@o#r(gMndk*Q;N^V5 z5ITUE4u*hJSfu&u@E?+8lO@Z;D^kW)&jE>l3#S~3)5j76?LH+Ant-G}YZS`Aj8R%K zUQry<9;3hu{0KCMZ-Fj68B80yXCkpsW}Zvl+hviyIY{eCU&3}$7fF1MZK!M_dEBj%%G#-Y?B6Xa4mWB{KN0D`@z*LNFNEwG`Q>i}amKo_?_-<^ zZuJy$?~fBEJs9@tH`x*mEvg?_^B;wfLXZ$2{vdY_ED)JdARZuvv6@{g+9E8KnKm{Ghs{dr@aDp>M>odG5cyr?b7A&f#JnUUB0*<>4H9&dI*LbIFA*N^%Hc zkbl+DswGm_F_;d?HO#^G@%^X!_U^lphuu4e^|Mt(F`U7gtRy|Q79KPg`mFrTIJVzQ zh&i+0_vD;%mz5dbU_wb$uJcv^i$_N;uXjvO^!q?msy|c$-R4#(%%@M`ar<$jGx!=U zKq0E}Hn1Ft5us<7WdJwIjI zS$MJIus#9y_o`QRT*=4soyF6;_x+61wp|Qf5d^+Jf4&jAc*qP6gyrC7{Qli*Bmzsp zQ`z3m&ESvULfbiEi*DuL8-KCg*4&^7&o9^?HVvVR%f9dU)X?Z)j@PKIh+y{+*5lwI zCK)9oZ`o0EOUCcSG?-dehpLdk{%G0KjbWE%-7w@VlZam6Wh2dwS73X`PmtB3?7dq$ zCk7$dGq6)VB}dW3fS%4dyo3pW3JUYDeH*Wb`RZc-Xu@};sSJ2D4(|<3ZWZTXlt_l$ zTLrZ4)blV+-r>+kP>jolW#L8e>-Vo#iq@F!FI%;9Vzcd1tB5s*%*WWtSzw_GLX~=Q{nCM0 z>Zs6mE`bNOOU+WRd>8M`Lf-eHf7l}bN}wiDIN9vF%L)%|=E3o6NNm>i zjdzaWlg1vW!Rryl+K6PISXvSp!dhOW8A7s!as8Hpaa(qW0s|4-j+L49Mz1ZOuEhfi zh({o#B_cR%(jMzPc4Dv48q-@V!;!qs3IMkyTEzZO&vQR$4VNVgYhNn!jv_SH5{@#e zz(!Z557bDv*cS zzHOVK^PE01<2T6?#Ieiab5kxz`eX2kEi2y0&MRL+%)`;cugT0yY6Wj_g+b#j6gU

=>mt8n*T~uMZi_sw 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
pzN3IDDD{eby-Ti`#L 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 LNkvXXu0mjfOKrh? diff --git a/Assets/EFSDK/Android/res/drawable-xxhdpi/_sdk_icon_1024.png.meta b/Assets/EFSDK/Android/res/drawable-xxhdpi/_sdk_icon_1024.png.meta deleted file mode 100644 index bf71aab..0000000 --- a/Assets/EFSDK/Android/res/drawable-xxhdpi/_sdk_icon_1024.png.meta +++ /dev/null @@ -1,127 +0,0 @@ -fileFormatVersion: 2 -guid: 22d4b822110d1bd43932b2b737f61dce -TextureImporter: - internalIDToNameTable: [] - externalObjects: {} - serializedVersion: 13 - 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 - 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: 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 - flipbookRows: 1 - flipbookColumns: 1 - maxTextureSizeSet: 0 - compressionQualitySet: 0 - textureFormatSet: 0 - ignorePngGamma: 0 - applyGammaDecoding: 0 - swizzle: 50462976 - cookieLightType: 0 - 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 - spriteSheet: - serializedVersion: 2 - sprites: [] - outline: [] - physicsShape: [] - bones: [] - spriteID: - internalID: 0 - vertices: [] - indices: - edges: [] - weights: [] - secondaryTextures: [] - nameFileIdTable: {} - mipmapLimitGroupName: - pSDRemoveMatte: 0 - userData: - assetBundleName: - assetBundleVariant: diff --git a/Assets/EFSDK/Android/res/drawable-xxhdpi/_sdk_notice_1.png b/Assets/EFSDK/Android/res/drawable-xxhdpi/_sdk_notice_1.png deleted file mode 100644 index 8e98b9016896fee165db18f417e9ff6a443f3674..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 9675 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 N002ovPDHLkV1lo6JOTg! diff --git a/Assets/EFSDK/Android/res/drawable-xxhdpi/_sdk_notice_1.png.meta b/Assets/EFSDK/Android/res/drawable-xxhdpi/_sdk_notice_1.png.meta deleted file mode 100644 index 10b727d..0000000 --- a/Assets/EFSDK/Android/res/drawable-xxhdpi/_sdk_notice_1.png.meta +++ /dev/null @@ -1,127 +0,0 @@ -fileFormatVersion: 2 -guid: 63a7e60d370bb1c48a1138e45315d8aa -TextureImporter: - internalIDToNameTable: [] - externalObjects: {} - serializedVersion: 13 - 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 - 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: 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 - flipbookRows: 1 - flipbookColumns: 1 - maxTextureSizeSet: 0 - compressionQualitySet: 0 - textureFormatSet: 0 - ignorePngGamma: 0 - applyGammaDecoding: 0 - swizzle: 50462976 - cookieLightType: 0 - 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 - spriteSheet: - serializedVersion: 2 - sprites: [] - outline: [] - physicsShape: [] - bones: [] - spriteID: - internalID: 0 - vertices: [] - indices: - edges: [] - weights: [] - secondaryTextures: [] - nameFileIdTable: {} - mipmapLimitGroupName: - pSDRemoveMatte: 0 - userData: - assetBundleName: - assetBundleVariant: diff --git a/Assets/EFSDK/Android/res/drawable-xxhdpi/_sdk_notice_1_txt_bg.png b/Assets/EFSDK/Android/res/drawable-xxhdpi/_sdk_notice_1_txt_bg.png deleted file mode 100644 index 20bd84f2812927fd579a6b52ed6cf9b45dc99311..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3440 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 M07*qoM6N<$f~l=4K>z>% diff --git a/Assets/EFSDK/Android/res/drawable-xxhdpi/_sdk_notice_2.png.meta b/Assets/EFSDK/Android/res/drawable-xxhdpi/_sdk_notice_2.png.meta deleted file mode 100644 index 531e8a0..0000000 --- a/Assets/EFSDK/Android/res/drawable-xxhdpi/_sdk_notice_2.png.meta +++ /dev/null @@ -1,127 +0,0 @@ -fileFormatVersion: 2 -guid: 9cb4efb8034485741852541144c5a7a0 -TextureImporter: - internalIDToNameTable: [] - externalObjects: {} - serializedVersion: 13 - 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 - 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: 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 - flipbookRows: 1 - flipbookColumns: 1 - maxTextureSizeSet: 0 - compressionQualitySet: 0 - textureFormatSet: 0 - ignorePngGamma: 0 - applyGammaDecoding: 0 - swizzle: 50462976 - cookieLightType: 0 - 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 - spriteSheet: - serializedVersion: 2 - sprites: [] - outline: [] - physicsShape: [] - bones: [] - spriteID: - internalID: 0 - vertices: [] - indices: - edges: [] - weights: [] - secondaryTextures: [] - nameFileIdTable: {} - mipmapLimitGroupName: - pSDRemoveMatte: 0 - userData: - assetBundleName: - assetBundleVariant: diff --git a/Assets/EFSDK/Android/res/drawable-xxhdpi/_sdk_notice_2_txt_bg.png b/Assets/EFSDK/Android/res/drawable-xxhdpi/_sdk_notice_2_txt_bg.png deleted file mode 100644 index 20bd84f2812927fd579a6b52ed6cf9b45dc99311..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3440 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 Sq}DJ10000RJAbds)Bpn%{ZdwBZ1ONa2 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 Z{sIhD0MO0|d5-`9002ovPDHLkV1gV!H`@RJ diff --git a/Assets/EFSDK/Android/res/drawable-xxhdpi/_sdk_notice_4.png.meta b/Assets/EFSDK/Android/res/drawable-xxhdpi/_sdk_notice_4.png.meta deleted file mode 100644 index ac4ebc2..0000000 --- a/Assets/EFSDK/Android/res/drawable-xxhdpi/_sdk_notice_4.png.meta +++ /dev/null @@ -1,127 +0,0 @@ -fileFormatVersion: 2 -guid: 9cfb6b46fea6c7845999842064fef0dd -TextureImporter: - internalIDToNameTable: [] - externalObjects: {} - serializedVersion: 13 - 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 - 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: 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 - flipbookRows: 1 - flipbookColumns: 1 - maxTextureSizeSet: 0 - compressionQualitySet: 0 - textureFormatSet: 0 - ignorePngGamma: 0 - applyGammaDecoding: 0 - swizzle: 50462976 - cookieLightType: 0 - 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 - spriteSheet: - serializedVersion: 2 - sprites: [] - outline: [] - physicsShape: [] - bones: [] - spriteID: - internalID: 0 - vertices: [] - indices: - edges: [] - weights: [] - secondaryTextures: [] - nameFileIdTable: {} - mipmapLimitGroupName: - pSDRemoveMatte: 0 - userData: - assetBundleName: - assetBundleVariant: diff --git a/Assets/EFSDK/Android/res/drawable-xxhdpi/_sdk_notice_4_txt_bg.png b/Assets/EFSDK/Android/res/drawable-xxhdpi/_sdk_notice_4_txt_bg.png deleted file mode 100644 index 20bd84f2812927fd579a6b52ed6cf9b45dc99311..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3440 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 Sq}DJ10000_GHUWxw)$es`hq6fe=5>Fg7!Lk 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 diff --git a/Assets/EFSDK/Android/res/drawable-xxhdpi/_sdk_push_big_pic_es.png.meta b/Assets/EFSDK/Android/res/drawable-xxhdpi/_sdk_push_big_pic_es.png.meta deleted file mode 100644 index 4f7c2b8..0000000 --- a/Assets/EFSDK/Android/res/drawable-xxhdpi/_sdk_push_big_pic_es.png.meta +++ /dev/null @@ -1,127 +0,0 @@ -fileFormatVersion: 2 -guid: 10def9eb660635b468ed7fc2277a4e6f -TextureImporter: - internalIDToNameTable: [] - externalObjects: {} - serializedVersion: 13 - 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 - 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: 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 - flipbookRows: 1 - flipbookColumns: 1 - maxTextureSizeSet: 0 - compressionQualitySet: 0 - textureFormatSet: 0 - ignorePngGamma: 0 - applyGammaDecoding: 0 - swizzle: 50462976 - cookieLightType: 0 - 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 - spriteSheet: - serializedVersion: 2 - sprites: [] - outline: [] - physicsShape: [] - bones: [] - spriteID: - internalID: 0 - vertices: [] - indices: - edges: [] - weights: [] - secondaryTextures: [] - nameFileIdTable: {} - mipmapLimitGroupName: - pSDRemoveMatte: 0 - userData: - assetBundleName: - assetBundleVariant: diff --git a/Assets/EFSDK/Android/res/drawable-xxhdpi/_sdk_toast_bg.png b/Assets/EFSDK/Android/res/drawable-xxhdpi/_sdk_toast_bg.png deleted file mode 100644 index 81c0bf1d899cc862135be26749e3378964d20d9d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 91096 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 KMNUMnLSTYkCiyx5 diff --git a/Assets/EFSDK/Android/res/drawable-xxhdpi/_sdk_toast_bg.png.meta b/Assets/EFSDK/Android/res/drawable-xxhdpi/_sdk_toast_bg.png.meta deleted file mode 100644 index 1b59afc..0000000 --- a/Assets/EFSDK/Android/res/drawable-xxhdpi/_sdk_toast_bg.png.meta +++ /dev/null @@ -1,127 +0,0 @@ -fileFormatVersion: 2 -guid: f2d7efc9e85a47e98bae42a19e1d52a3 -TextureImporter: - internalIDToNameTable: [] - externalObjects: {} - serializedVersion: 13 - 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 - 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: 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 - flipbookRows: 1 - flipbookColumns: 1 - maxTextureSizeSet: 0 - compressionQualitySet: 0 - textureFormatSet: 0 - ignorePngGamma: 0 - applyGammaDecoding: 0 - swizzle: 50462976 - cookieLightType: 0 - 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 - spriteSheet: - serializedVersion: 2 - sprites: [] - outline: [] - physicsShape: [] - bones: [] - spriteID: - internalID: 0 - vertices: [] - indices: - edges: [] - weights: [] - secondaryTextures: [] - nameFileIdTable: {} - mipmapLimitGroupName: - pSDRemoveMatte: 0 - userData: - assetBundleName: - assetBundleVariant: diff --git a/Assets/EFSDK/Android/res/drawable-xxhdpi/_sdk_widget_big_pic_bg.9.png b/Assets/EFSDK/Android/res/drawable-xxhdpi/_sdk_widget_big_pic_bg.9.png deleted file mode 100644 index 0843785ab39bb2c8e41c05b82a19076297d5cc31..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 30875 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 diff --git a/Assets/EFSDK/Android/res/drawable-xxhdpi/_sdk_widget_big_pic_bg.9.png.meta b/Assets/EFSDK/Android/res/drawable-xxhdpi/_sdk_widget_big_pic_bg.9.png.meta deleted file mode 100644 index 2a5ca80..0000000 --- a/Assets/EFSDK/Android/res/drawable-xxhdpi/_sdk_widget_big_pic_bg.9.png.meta +++ /dev/null @@ -1,127 +0,0 @@ -fileFormatVersion: 2 -guid: a8d31fbeeee87204e88e6c444284262e -TextureImporter: - internalIDToNameTable: [] - externalObjects: {} - serializedVersion: 13 - 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 - 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: 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 - flipbookRows: 1 - flipbookColumns: 1 - maxTextureSizeSet: 0 - compressionQualitySet: 0 - textureFormatSet: 0 - ignorePngGamma: 0 - applyGammaDecoding: 0 - swizzle: 50462976 - cookieLightType: 0 - 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 - spriteSheet: - serializedVersion: 2 - sprites: [] - outline: [] - physicsShape: [] - bones: [] - spriteID: - internalID: 0 - vertices: [] - indices: - edges: [] - weights: [] - secondaryTextures: [] - nameFileIdTable: {} - mipmapLimitGroupName: - pSDRemoveMatte: 0 - userData: - assetBundleName: - assetBundleVariant: diff --git a/Assets/EFSDK/Android/res/drawable-xxhdpi/_sdk_widget_big_pic_bx.png b/Assets/EFSDK/Android/res/drawable-xxhdpi/_sdk_widget_big_pic_bx.png deleted file mode 100644 index 632e110768f8b48bbc1823758f3db837cad2babf..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 28683 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 z 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
F52QGJM%sNQS&!OC1U# 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 - if (communicationComponent == null) - { - Debug.LogError("Failed to add EFSdkAndroid component to the GameObject."); - } - Object.DontDestroyOnLoad(communicationObject); - } - else - { - Debug.LogError("Failed to create the EFSdkAndroid GameObject."); - } - } - catch (System.Exception e) - { - Debug.LogError($"An error occurred while setting up the communication object: {e.Message}"); - } - } - } -} \ No newline at end of file diff --git a/Assets/EFSDK/AutoSetEFSdk.cs.meta b/Assets/EFSDK/AutoSetEFSdk.cs.meta deleted file mode 100755 index 5e19232..0000000 --- a/Assets/EFSDK/AutoSetEFSdk.cs.meta +++ /dev/null @@ -1,3 +0,0 @@ -fileFormatVersion: 2 -guid: 9937d38cb2014e1e94087f6216eacd62 -timeCreated: 1742202739 \ No newline at end of file diff --git a/Assets/EFSDK/EFSdk.cs b/Assets/EFSDK/EFSdk.cs deleted file mode 100755 index 1a66ea4..0000000 --- a/Assets/EFSDK/EFSdk.cs +++ /dev/null @@ -1,541 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Security.Cryptography; -using System.Text; -using UnityEngine; - -namespace EFSDK -{ - /// - /// TKG Native SDK Android platform interface call - /// - public class EFSdk - { - private static EFSdk _mEfSdk; - - private static string Unity_SDK_Ver = "0.0.17"; - // 保持变量名不变 - private static string mappingInfo = ""; - - public static EFSdk get() - { - if (_mEfSdk == null) - { - _mEfSdk = new EFSdk(); - } - - return _mEfSdk; - } - - - private AndroidJavaObject jo; - - public EFSdk() - { - Debug.Log($"GetNewSDKClass():{GetNewSDKClass()}"); - Debug.Log($"initSDK():{GenerateAndroidName("initSDK")}"); - - // java interface class - using (AndroidJavaClass jc = new AndroidJavaClass(GetNewSDKClass())) - { - jo = jc.GetStatic("INSTANCE"); - } - } - - private static string oriSDKPName = "com.earn.push"; - private static string oriSDK = "_SDK"; - - private static string GetNewSDKClass() - { - return GetSDKPackage() + GenerateAndroidName(oriSDK); - } - - private static string GetSDKPackage() - { - string[] parts = oriSDKPName.Split('.'); - string[] parts2 = new string[parts.Length]; - for (int i = 0; i < parts.Length; i++) - { - parts2[i] = GenerateAndroidName(parts[i]); - } - - string newPName = ""; - for (int i = 0; i < parts2.Length; i++) - { - newPName += parts2[i] + "."; - } - - return newPName; - } - - private static string GenerateAndroidName(string oriString) - { - string md5Str = GetFirstEightWithUnderscore(GetMD5Hash(Application.identifier + oriString)); - return md5Str; - } - - public static string GetMD5Hash(string input) - { - using (var md5 = MD5.Create()) - { - var inputBytes = Encoding.ASCII.GetBytes(input); - var hashBytes = md5.ComputeHash(inputBytes); - - var builder = new StringBuilder(); - foreach (var t in hashBytes) - { - builder.Append(t.ToString("x2")); // Convert byte to hexadecimal string - } - - return builder.ToString(); - } - } - - static string GetFirstEightWithUnderscore(string str) - { - if (string.IsNullOrEmpty(str)) return str; - string sub = str.Length <= 8 ? str : str.Substring(0, 8); - if (char.IsDigit(sub[0])) - { - sub = "a" + sub; - } - - return sub; - } - - private T SDKCall(string _method, params object[] _param) - { - try - { - string newMethod = GenerateAndroidName(_method); - Debug.Log($"SDKCall newMethod:{newMethod}"); - return jo.Call(newMethod, _param); - } - catch (Exception e) - { - Debug.LogError(e); - } - - return default(T); - } - - private void SDKCall(string _method, params object[] _param) - { - try - { - string newMethod = GenerateAndroidName(_method); - Debug.Log($"SDKCall newMethod:{newMethod}"); - jo.Call(newMethod, _param); - } - catch (Exception e) - { - Debug.LogError(e); - } - } - - public enum ActionType - { - SDK_INIT_Succ, //GAM页面加载成功 - H5_Load_Succ, //H5页面加载成功 - ON_RESUME, //游戏可见时回调, - // CAN_GOBACK, //游戏可见时回调, - } - - public Action ActionCallback; - public Action> ActionSDKEventCallback; - public Action HdH5ImpressionAction; - public Action mCanGobackAction; - public Action mReqNotifyPermissionAction; - public Action mReqFloatPermissionAction; - - /// - /// 在Init方法之后调用这个方法,设置SDK上报事件回调, 将SDK传过来的事件上报到Firebase,数数等 - /// - /// - /// 事件ID,事件属性 - /// - public void SetSDKEventCallback(Action> eventKeyDict) - { - ActionSDKEventCallback = eventKeyDict; - } - - /// - /// 互动广告展示回调,此时可以计算上报互动广告展示次数和收益 - /// - /// string 是互动广告的url - public void SetHdH5ImpressionCallback(Action callback) - { - HdH5ImpressionAction = callback; - } - - - /// - /// 初始化 - /// - /// ActionType 回调类型 ; string msg - public void Init(Action actionCallbvack) - { - ActionCallback = actionCallbvack; - SDKInit(); - } - - private void SDKInit() - { - SDKCall("initSDK", mappingInfo); - ActionCallback?.Invoke(ActionType.SDK_INIT_Succ, string.Empty); - } - - /// - /// 当游戏进程启动之后,可以接收响应的时候(一般在游戏内事件上报相关内容初始化完毕调用即可,参数传true),调用这个方法通知SDK, - /// SDK收到通知后会开始将SDK侧的事件回传给游戏,作事件上报 - /// - /// 传 true - public void SetGameActive(bool active) - { - SDKCall("onGameActive", active); - } - - /// - /// 展示WebView - /// - /// 标签id - /// 网址 - /// - /// - public void ShowWebView(int id, string url, RectTransform pRect, Camera pCam = null) - { - Vector3[] tWorldCorners = new Vector3[4]; - pRect.GetWorldCorners(tWorldCorners); - Vector2 tTopLeft = RectTransformUtility.WorldToScreenPoint(pCam, tWorldCorners[1]); - Vector2 tBottomRight = RectTransformUtility.WorldToScreenPoint(pCam, tWorldCorners[3]); - int tWidth = (int)Mathf.Abs(tBottomRight.x - tTopLeft.x); - int tHeight = (int)Mathf.Abs(tBottomRight.y - tTopLeft.y); - SDKCall("showWebViewToActivity", id, url, (int)tTopLeft.x, (int)(Screen.height - tTopLeft.y), tWidth, - tHeight); - } - - /// - /// 移除所有原生View, 回到游戏时调用 - /// - /// - public void RemoveAll() - { - SDKCall("removeAll"); - } - - /// - /// 刷新当前页面 - /// - /// - public void Refresh() - { - SDKCall("refresh"); - } - - /// - /// 回上一页 - /// - /// - public void GoBack() - { - SDKCall("goBack"); - } - - /// - /// 回首页 - /// - /// - public void GoHome() - { - SDKCall("goHome"); - } - - - /// - /// - /// - /// 消息文案 - /// 消息文本颜色,十六进制字符串 - public void ShowToast(string message,string textColor = "#FFFFFF") - { - SDKCall("showToast", message,textColor); - } - - /// - /// 判断当前网页是否还能返回上一页, true:可以返回,此时页面不在首页 false: 不能返回了,当前页面就在首页 - /// - public void CanGoback(Action canGobackAction) - { - mCanGobackAction = canGobackAction; - SDKCall("canGoback"); - } - - #region 推送通知 - - /// - /// 启用v2版本常驻通知样式 - /// - /// rue:启用v2版本常驻通知样式,false:禁用 (禁用将使用V1版本常驻通知样式) - public void EnablePersistentStyleV2(bool enable) - { - SDKCall("enablePersistentStyleV2", enable); - } - - /// - /// 设置v2版本常驻通知的文案 - /// - /// 图标 1 文案 - /// 图标 2 文案 - /// 图标 3 文案 - /// 图标 4 文案 - public void SetPersistentStyleV2Text(string text1, string text2, string text3, string text4) - { - SDKCall("setPersistentStyleV2Text", text1, text2, text3, text4); - } - - /// - /// 满足条件:未领取 R$0.1 的 买量用户, 调用这个方法 - /// - public void SubscribeUnclaimed01() - { - SDKCall("subscribeUnclaimed01"); - } - - /// - /// 不满足条件:未领取 R$0.1 的 买量用户, 调用这个方法 - /// - public void UnSubscribeUnclaimed01() - { - SDKCall("unSubscribeUnclaimed01"); - } - - /// - // 满足条件: 在排队中 且 当日R$1 未领取 的买量用户, 调用这个方法 - /// - public void SubscribePending1() - { - SDKCall("subscribePending1"); - } - - /// - /// 不满足条件: 在排队中 且 当日R$1 未领取 的买量用户, 调用这个方法 - /// - public void UnSubscribePending1() - { - SDKCall("unSubscribePending1"); - } - - /// - /// 订阅Firebase推送主题 - /// - /// 主题名称 - public void SubscribeToTopic(string topic) - { - SDKCall("subscribeToTopic", topic); - } - - /// - /// 取消订阅Firebase推送主题 - /// - /// 主题名称 - public void UnSubscribeToTopic(string topic) - { - SDKCall("UnSubscribeToTopic", topic); - } - - - /// - /// 向SDK上报当前金币总数,每次金币变化都要调用一次 - /// - /// - public void SendTotalGold2SDK(int totalGold) - { - SDKCall("setGoldNum", totalGold.ToString()); - } - - /// - /// 向SDK上报当前要提现的现金额,每次变化都要调用一次 - /// - /// - public void SendCashNum2SDK(double cashNum) - { - SDKCall("setCashNum", cashNum.ToString("0.00")); - } - - /// - /// 向SDK上报 游戏名字(当前语言的),每次语言变化都上报 - /// - /// - public void SetGameName(string gameName) - { - SDKCall("setGameName", gameName); - } - - - /// - /// 设置当前游戏语言是否是 西班牙语 - /// - /// - /// 西班牙语传 true, 其他的都传 false - public void SetCurrLang(bool isEs) - { - SDKCall("setCurrLang", isEs); - } - - /// - /// 获取当前是否有通知权限 - /// - public bool HasNotifyPermission() - { - return SDKCall("hasNotifyPermission"); - } - - /// - /// 请求获取通知权限 - /// - public void ReqNotifyPermission() - { - SDKCall("reqNotifyPermission"); - } - - /// - /// 请求获取通知权限 - /// 授权弹窗关闭回调 bool:表示用户是否允许了权限 true:有权限 false:无权限 - /// - public void ReqNotifyPermission(Action action) - { - mReqNotifyPermissionAction = action; - SDKCall("reqNotifyPermission"); - } - - /// - /// 设置推送开关, SDK默认关闭通知 - /// - /// - public void SetPushSwitch(bool isOpen) - { - SDKCall("pushSwitch", isOpen); - } - - /// - /// 消息类通知弹出间隔设置为60秒(在线参数控制)-Key: messagenotif Value:60 - /// - /// - public void SetPushMessagenotif(int timeSeconds) - { - SDKCall("setPushMessagenotif", timeSeconds); - } - - /// - /// 持续性通知在进入游戏时弹出的时间间隔设置为300秒(在线参数控制 )-Key:persistentnotif Value:300 - /// - /// - public void SetPushPersistentnotif(int timeSeconds) - { - SDKCall("setPushPersistentnotif", timeSeconds); - } - - - /// - /// 每次回调游戏的onResume的时候都调用一次,获取游戏要跳转的页面 - /// - /// - /// 0 不需要进行任何跳转 - /// 1 进行游戏主页 - /// 2 进入游戏的金币提现界面 - /// 3 进入对应小游戏1界面 - /// 4 进入对应小游戏2界面 - /// - public int GetJumpPage() - { - return SDKCall("getJumpPage"); - } - - #endregion - - #region 小组件 - - public enum WidgetType - { - Widget3X2 = 1, - Widget5X1 = 2, - } - - /// - /// 获取指定类型的小组件是否已添加到桌面 - /// - /// - /// - public bool IsWidgetAdded(WidgetType type) - { - return SDKCall("isWidgetAdded", (int)type); - } - - public Action actionRequestAddWidgetResult = null; - - /// - /// 将指定类型的小组件添加到桌面(小组件采用默认样式) - /// - /// - /// 小组件添加结果回调 - /// - public void RequestAddWidget(WidgetType type, Action action) - { - actionRequestAddWidgetResult = action; - SDKCall("requestAddWidget", (int)type); - } - - /// - /// 请求将Widget3X2添加到桌面,并自定义文案 - /// - /// 标题1文案 - /// 标题2文案 - /// 进度条上的文案 - /// 按钮的文案 - /// 小组件添加结果回调 - public void RequestAddWidget3x2(string title1, string title2, string progressStr, string buttonStr, - Action action) - { - actionRequestAddWidgetResult = action; - SDKCall("requestAddWidget3x2", title1, title2, progressStr, buttonStr); - } - - /// - /// 请求将 Widget5X1 添加到桌面,并自定义文案 - /// - /// 内容文案 - /// 小组件添加结果回调 - /// 文案文字十六进制颜色值,如: #FFFFFF - public void RequestAddWidget5x1(string content, Action action, string contentTextColor = "#FFFFFF") - { - actionRequestAddWidgetResult = action; - SDKCall("requestAddWidget5x1", content, contentTextColor); - } - - #endregion - - #region 悬浮窗 - - /// - /// 判断是否有悬浮窗权限 - /// - /// - public bool HasFloatWindowPermission() - { - return SDKCall("hasFloatWindowPermission"); - } - - /// - /// 申请悬浮窗权限 - /// - /// 申请权限的位置 - /// bool 是否被授予权限 - public void RequestFloatWindowPermission(String position,Action callback) - { - mReqFloatPermissionAction = callback; - SDKCall("requestFloatWindowPermission",position); - } - - #endregion - } -} \ No newline at end of file diff --git a/Assets/EFSDK/EFSdk.cs.meta b/Assets/EFSDK/EFSdk.cs.meta deleted file mode 100755 index 8d8c165..0000000 --- a/Assets/EFSDK/EFSdk.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: 3cf9c70ade0a42e08c9ea06733912dd2 -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Assets/EFSDK/EFSdkAndroid.cs b/Assets/EFSDK/EFSdkAndroid.cs deleted file mode 100755 index 48d8a23..0000000 --- a/Assets/EFSDK/EFSdkAndroid.cs +++ /dev/null @@ -1,96 +0,0 @@ -using System.Collections.Generic; - -namespace EFSDK -{ - using UnityEngine; - - public class EFSdkAndroid : MonoBehaviour - { - private string H5_Load_Succ = "H5_Load_Succ"; - private string On_Resume = "onResume"; - private string Can_Goback = "canGoback"; - private string reqNotifyPermission = "reqNotifyPermission"; - private string REQUEST_ADD_WIDGET_RESULT = "requestAddWidgetResult"; - private string REQUEST_FLOAT_WINDOW_PERMISSION = "requestFloatWindowPermission"; - - public void OnReceiverAnd(string message) - { - WLoom.QueueOnMainThread(_ => - { - Debug.Log("Received message from Android: " + message); - if (message.Contains(On_Resume)) - { - EFSdk.get().ActionCallback?.Invoke(EFSdk.ActionType.ON_RESUME, message); - } - if (message.Contains(Can_Goback)) - { - EFSdk.get().mCanGobackAction?.Invoke(bool.Parse(message.Split('#')[1])); - } - - if (message.Contains(H5_Load_Succ)) - { - //GAM页面加载成功 Gam_Load_Succ@id - string[] parts = message.Split('@'); - EFSdk.get().ActionCallback?.Invoke(EFSdk.ActionType.H5_Load_Succ, parts[1]); - } - - if (message.StartsWith(reqNotifyPermission)) - { - string[] flag = message.Split('#'); - EFSdk.get().mReqNotifyPermissionAction?.Invoke(flag[1].Equals("1")); - } - - if (message.StartsWith(REQUEST_ADD_WIDGET_RESULT)) - { - string[] flag = message.Split('#'); - EFSdk.get().actionRequestAddWidgetResult?.Invoke(flag[2].Equals("true")); - } - if (message.StartsWith(REQUEST_FLOAT_WINDOW_PERMISSION)) - { - string[] flag = message.Split('#'); - EFSdk.get().mReqFloatPermissionAction?.Invoke(flag[1].Equals("true")); - } - - if (message.StartsWith("Event#")) - { - string[] eventKeys = message.Split('#'); - if (eventKeys.Length > 0) - { - if (message.Contains("hd_h5_impression")) - { - //互动广告展示 - string url = eventKeys[2]; - EFSdk.get().HdH5ImpressionAction?.Invoke(url); - } - else if (eventKeys.Length == 2) - { - // 只有一个事件key - string eventKey = eventKeys[1]; - EFSdk.get().ActionSDKEventCallback?.Invoke(eventKey, null); - } - else if (eventKeys.Length == 3) - { - // key-value事件 - string eventKey = eventKeys[1]; - string value = eventKeys[2]; - } - else - { - //多属性事件 - string eventKey = eventKeys[1]; - Dictionary attrs = new Dictionary(); - for (int i = 2; i < eventKeys.Length - 1; i += 2) - { - string key = eventKeys[i]; - string value = eventKeys[i + 1]; - attrs[key] = value; - } - - EFSdk.get().ActionSDKEventCallback?.Invoke(eventKey, attrs); - } - } - } - }, ""); - } - } -} \ No newline at end of file diff --git a/Assets/EFSDK/EFSdkAndroid.cs.meta b/Assets/EFSDK/EFSdkAndroid.cs.meta deleted file mode 100755 index c8b9b28..0000000 --- a/Assets/EFSDK/EFSdkAndroid.cs.meta +++ /dev/null @@ -1,3 +0,0 @@ -fileFormatVersion: 2 -guid: 40a70c7c94e6494d947902b87c809b30 -timeCreated: 1742202547 \ No newline at end of file diff --git a/Assets/EFSDK/Editor.meta b/Assets/EFSDK/Editor.meta deleted file mode 100644 index 9e42853..0000000 --- a/Assets/EFSDK/Editor.meta +++ /dev/null @@ -1,3 +0,0 @@ -fileFormatVersion: 2 -guid: e4d0b212325940748840950d8c400f9f -timeCreated: 1756628120 \ No newline at end of file diff --git a/Assets/EFSDK/Editor/AndroidResAarBuilder.cs b/Assets/EFSDK/Editor/AndroidResAarBuilder.cs deleted file mode 100755 index 8cca933..0000000 --- a/Assets/EFSDK/Editor/AndroidResAarBuilder.cs +++ /dev/null @@ -1,237 +0,0 @@ -using UnityEngine; -using UnityEditor; -using System.IO; -using System.Collections.Generic; -using System.Security.Cryptography; -using System.Text; -using IOCompression = System.IO.Compression; - -namespace EFSDK -{ - public class AndroidResAarBuilder - { - private static readonly string ResDir = "Assets/EFSDK/Android"; - private static readonly string OutputDir = "Assets/Plugins/Android"; - private static readonly string TempDir = "Temp/AndroidResAar"; - private static readonly string EFSdk_FILE = "Assets/EFSDK/EFSdk.cs"; - - [MenuItem("EFSDK/!!提示:不需要悬浮窗功能的不要构建带悬浮窗的SDK!!")] - public static void Tips() - { - Debug.Log($"不需要悬浮窗功能的不要构建带悬浮窗的SDK"); - } - - [MenuItem("EFSDK/构建当前包名的推送SDK(小组件)")] - public static void BuildPushSdk() - { - Debug.Log($"构建当前包名的推送SDK(小组件) 当前包名: {Application.identifier}"); - string result = SDKEditorNetworkTool.HttpGetText( - $"http://v4.9ms.co:58080/generic-webhook-trigger/invoke?token=pushsdk&target_package_name={Application.identifier}&branch_name=dev-widget"); - Debug.Log($"{result}\n成功发起推送SDK构建请求,请稍等3分钟之后,重新打包即可"); - } - [MenuItem("EFSDK/构建当前包名的推送SDK(小组件+悬浮窗)")] - public static void BuildPushSdkWf() - { - Debug.Log($"构建当前包名的推送SDK(小组件+悬浮窗) 当前包名: {Application.identifier}"); - string result = SDKEditorNetworkTool.HttpGetText( - $"http://v4.9ms.co:58080/generic-webhook-trigger/invoke?token=pushsdk&target_package_name={Application.identifier}&branch_name=dev-alert-window"); - Debug.Log($"{result}\n成功发起推送SDK构建请求,请稍等3分钟之后,重新打包即可"); - } - - [MenuItem("EFSDK/Build Android Res AAR")] - public static void BuildAAR() - { - if (!Directory.Exists(ResDir)) - { - Debug.LogError($"Res folder not found: {ResDir}"); - return; - } - - // 清理临时目录 - if (Directory.Exists(TempDir)) Directory.Delete(TempDir, true); - Directory.CreateDirectory(TempDir); - - // 复制资源并重命名 - CopyAndRenameFiles(ResDir, TempDir, out Dictionary mapping); - string manifestPath = Path.Combine(TempDir, "AndroidManifest.xml"); - File.WriteAllText(manifestPath, - @$" - -"); - - // 打包 AAR - string aarPath = Path.Combine(OutputDir, "efsdk_res.aar"); - if (!Directory.Exists(OutputDir)) Directory.CreateDirectory(OutputDir); - if (File.Exists(aarPath)) File.Delete(aarPath); - - IOCompression.ZipFile.CreateFromDirectory(TempDir, aarPath, IOCompression.CompressionLevel.Optimal, false); - Debug.Log($"✅ AAR built:"+aarPath); - - // 生成压缩 JSON (key 只保留文件名) - Dictionary simpleMapping = new Dictionary(); - foreach (var kv in mapping) - { - string fileName = Path.GetFileName(kv.Key); - simpleMapping[fileName] = kv.Value; - } - - string mappingJson = GenerateMappingJson(mapping); - // 更新 mappingInfo - // UpdateMappingInEFSdk_LineByLine(mappingJson); - // 映射文件 - string mappingPath = Path.Combine(TempDir, "res_mapping.json"); - File.WriteAllText(mappingPath, mappingJson); - Debug.Log($"✅ AAR 资源文件构建成功! mappingJson:"+mappingJson); - - // 清理临时目录 - Directory.Delete(TempDir, true); - AssetDatabase.Refresh(); - } - - private static void CopyAndRenameFiles(string srcDir, string dstDir, out Dictionary mapping) - { - mapping = new Dictionary(); - - foreach (var filePath in Directory.GetFiles(srcDir, "*", SearchOption.AllDirectories)) - { - if (filePath.EndsWith(".meta")) continue; - - // 相对于源目录的路径 - string relativePath = filePath.Substring(srcDir.Length + 1).Replace("\\", "/"); - - // 获取文件夹路径 - string relativeDir = Path.GetDirectoryName(relativePath).Replace("\\", "/"); - - // 生成随机文件名 - string newName = GenerateRandomAndroidName(filePath); - - // 保存映射关系 (相对路径 + 原始文件名 -> 随机名) - string key = Path.GetFileNameWithoutExtension(relativePath); // 可以保留目录信息 - string value = string.IsNullOrEmpty(relativeDir) ? newName : $"{relativeDir}/{newName}"; - string fileNameWithoutExt = Path.GetFileNameWithoutExtension(value); - // mapping[key] = fileNameWithoutExt; - mapping.Add(key, fileNameWithoutExt); - // 目标路径 - string dstPath = Path.Combine(dstDir, value.Replace("/", Path.DirectorySeparatorChar.ToString())); - - // 确保目录存在 - string dstFolder = Path.GetDirectoryName(dstPath); - if (!Directory.Exists(dstFolder)) Directory.CreateDirectory(dstFolder); - - // 复制文件 - File.Copy(filePath, dstPath); - } - - Debug.Log("✅ Files copied and renamed (directory structure preserved)"); - } - - private static string GenerateMappingJson(Dictionary mapping) - { - var items = new List(); - foreach (var kv in mapping) - { - items.Add(new MappingItem { key = kv.Key, value = kv.Value }); - } - - MappingListWrapper wrapper = new MappingListWrapper { items = items }; - return JsonUtility.ToJson(wrapper, false); - } - - [System.Serializable] - private class MappingItem - { - public string key; - public string value; - } - - [System.Serializable] - private class MappingListWrapper - { - public List items; - } - - private static string GenerateRandomAndroidName(string filePath) - { - string ext = Path.GetExtension(filePath); - string oriFileName = Path.GetFileNameWithoutExtension(filePath); - if (filePath.EndsWith(".9.png")) - { - ext = ".9.png"; - oriFileName = Path.GetFileName(filePath).Replace(".9.png",""); - } - string md5Str = GetFirstEightWithUnderscore(GetMD5Hash(Application.identifier + oriFileName + oriFileName)); - - Debug.Log($"原名:{oriFileName} 后缀:{ext} 生成文件名:{md5Str + ext}"); - return md5Str + ext; - } - - static string GetFirstEightWithUnderscore(string str) - { - if (string.IsNullOrEmpty(str)) return str; - string sub = str.Length <= 8 ? str : str.Substring(0, 8); - if (char.IsDigit(sub[0])) - { - sub = "a" + sub; - } - - return sub; - } - - public static string GetMD5Hash(string input) - { - using (var md5 = MD5.Create()) - { - var inputBytes = Encoding.ASCII.GetBytes(input); - var hashBytes = md5.ComputeHash(inputBytes); - - var builder = new StringBuilder(); - foreach (var t in hashBytes) - { - builder.Append(t.ToString("x2")); // Convert byte to hexadecimal string - } - - return builder.ToString(); - } - } - - private static void UpdateMappingInEFSdk_LineByLine(string mappingJson) - { - if (!File.Exists(EFSdk_FILE)) - { - Debug.LogError($"EFSdk.cs not found: {EFSdk_FILE}"); - return; - } - - string[] lines = File.ReadAllLines(EFSdk_FILE); - bool updated = false; - for (int i = 0; i < lines.Length; i++) - { - if (lines[i].Contains("mappingInfo")) - { - lines[i] = $" private static string mappingInfo = @\"{mappingJson.Replace("\"", "\"\"")}\";"; - updated = true; - break; // 找到第一行就替换,防止重复 - } - } - - if (!updated) - { - // 如果没有找到 mappingInfo 行,则在 _mEfSdk 后插入 - for (int i = 0; i < lines.Length; i++) - { - if (lines[i].Contains("private static EFSdk _mEfSdk")) - { - lines[i] += - $"\n private static string mappingInfo = @\"{mappingJson.Replace("\"", "\"\"")}\";"; - updated = true; - break; - } - } - } - - File.WriteAllLines(EFSdk_FILE, lines); - Debug.Log("✅ mappingInfo updated in EFSdk.cs (line-by-line)"); - } - } -} \ No newline at end of file diff --git a/Assets/EFSDK/Editor/AndroidResAarBuilder.cs.meta b/Assets/EFSDK/Editor/AndroidResAarBuilder.cs.meta deleted file mode 100755 index fa219a9..0000000 --- a/Assets/EFSDK/Editor/AndroidResAarBuilder.cs.meta +++ /dev/null @@ -1,3 +0,0 @@ -fileFormatVersion: 2 -guid: ff87df6ca3d9445e98929bb62fb10a15 -timeCreated: 1756694090 \ No newline at end of file diff --git a/Assets/EFSDK/Editor/Dependencies.xml b/Assets/EFSDK/Editor/Dependencies.xml deleted file mode 100644 index a93bead..0000000 --- a/Assets/EFSDK/Editor/Dependencies.xml +++ /dev/null @@ -1,13 +0,0 @@ - - - - - https://repo.dgtverse.cn/repository/maven-public/ - https://android-sdk.is.com/ - https://dl-maven-android.mintegral.com/repository/mbridge_android_sdk_oversea - https://artifact.bytedance.com/repository/pangle/ - - - - - \ No newline at end of file diff --git a/Assets/EFSDK/Editor/Dependencies.xml.meta b/Assets/EFSDK/Editor/Dependencies.xml.meta deleted file mode 100644 index 97b4abc..0000000 --- a/Assets/EFSDK/Editor/Dependencies.xml.meta +++ /dev/null @@ -1,3 +0,0 @@ -fileFormatVersion: 2 -guid: 61484455ad49448f839552619a42625a -timeCreated: 1756628147 \ No newline at end of file diff --git a/Assets/EFSDK/Editor/DynamicApplicationClass.cs b/Assets/EFSDK/Editor/DynamicApplicationClass.cs deleted file mode 100644 index 4d30904..0000000 --- a/Assets/EFSDK/Editor/DynamicApplicationClass.cs +++ /dev/null @@ -1,185 +0,0 @@ -using System.Collections.Generic; -using System.IO; -using EFSDK; -using Unity.Plastic.Newtonsoft.Json.Linq; -using UnityEditor.Android; -using UnityEngine; - -public class DynamicApplicationClass : IPostGenerateGradleAndroidProject -{ - public int callbackOrder - { - get { return int.MaxValue; } - } - - private string GetRootPath(string path) - { - return Path.Combine(path, "..", ""); - } - - public void OnPostGenerateGradleAndroidProject(string path) - { - AndroidResAarBuilder.BuildAAR(); - var androidManifest = new SDKTool.AndroidManifest(SDKTool.GetManifestPath(path)); - androidManifest.SetStartingActivityAttribute("hardwareAccelerated", "true"); - androidManifest.Save(); - SetGradleConstraints(path); - FixedAddressValueTypeAttribute(path); - // 仅测试使用 - // ParseConfigFile(path); - } - - private static void SetGradleConstraints(string path) - { - string gradlePath = Path.Combine(path, "../unityLibrary", "build.gradle"); - - if (!File.Exists(gradlePath)) - { - Debug.LogError("未找到unityLibrary模块的build.gradle文件: " + gradlePath); - } - - // var content = " implementation \"androidx.datastore:datastore:1.0.0\"\n constraints {\n implementation(\"androidx.datastore:datastore\") {\n version {\n strictly \"1.0.0\"\n }\n because \"1.0.0版本,避免高版本兼容性问题\"\n }\n }"; - var buildGradleOutLines = new List(); - foreach (var line in File.ReadLines(gradlePath)) - { - if (line.Trim().Contains("com.earn.money:sdk")) - { - Debug.Log("找到com.earn.money:sdk"); - - buildGradleOutLines.Add($" implementation ('com.earn.money:{Application.identifier}:{SDKTool.GetSDKVersion()}')"); - } - else - { - buildGradleOutLines.Add(line); - } - } - - File.WriteAllText(gradlePath, string.Join("\n", buildGradleOutLines.ToArray()) + "\n"); - } - - - private static void FixedAddressValueTypeAttribute(string path) - { - string launcherBuildGradlePath = Path.Combine(path, "../launcher", "build.gradle"); - string content = - " configurations.all {\n resolutionStrategy {\n force \"androidx.appcompat:appcompat:1.6.1\"\n force \"androidx.core:core:1.12.0\"\n }\n }"; - var launcherBuildGradleOutLines = new List(); - foreach (var line in File.ReadLines(launcherBuildGradlePath)) - { - launcherBuildGradleOutLines.Add(line); - if (line.Trim().StartsWith("defaultConfig")) - { - launcherBuildGradleOutLines.Add(content); - } - } - - File.WriteAllText(launcherBuildGradlePath, string.Join("\n", launcherBuildGradleOutLines.ToArray()) + "\n"); - } - - - - private void ParseConfigFile(string path) - { - Dictionary jsonDict = ParseToSimpleDictionary(); - if (jsonDict == null || jsonDict.Count == 0) - { - throw new System.Exception("配置文件中未解析到google-services.json"); - } - - // 获取launcher模块的build.gradle路径 - string gradlePath = Path.Combine(path, "../launcher", "build.gradle"); - - if (!File.Exists(gradlePath)) - { - Debug.LogError("未找到launcher模块的build.gradle文件: " + gradlePath); - } - // 读取文件内容 - string newResValue = $"\n resValue \"string\", \"game_services_project_id\", \"{jsonDict["project_id"]}\"" + - $"\n resValue \"string\", \"project_id\", \"{jsonDict["project_id"]}\"" + - $"\n resValue \"string\", \"google_project_id\", \"{jsonDict["project_id"]}\"" + - $"\n resValue \"string\", \"google_package_name\", \"{jsonDict["package_name"]}\"" + - $"\n resValue \"string\", \"gcm_defaultSenderId\", \"{jsonDict["project_number"]}\"" + - $"\n resValue \"string\", \"google_api_key\", \"{jsonDict["current_key"]}\"" + - $"\n resValue \"string\", \"google_app_id\", \"{jsonDict["mobilesdk_app_id"]}\"" + - $"\n resValue \"string\", \"google_crash_reporting_api_key\", \"{jsonDict["current_key"]}\"" + - $"\n resValue \"string\", \"google_storage_bucket\", \"{jsonDict["storage_bucket"]}\""; - Debug.Log($"DSSdk newResValue: {newResValue}"); - string launcherBuildGradlePath = Path.Combine(path, "../launcher", "build.gradle"); - var launcherBuildGradleOutLines = new List(); - foreach (var line in File.ReadLines(launcherBuildGradlePath)) - { - launcherBuildGradleOutLines.Add(line); - if (line.Trim().StartsWith("defaultConfig")) - { - launcherBuildGradleOutLines.Add(newResValue); - } - } - - File.WriteAllText(launcherBuildGradlePath, string.Join("\n", launcherBuildGradleOutLines.ToArray()) + "\n"); - - } - - public Dictionary ParseToSimpleDictionary() - { - Dictionary simpleDict = new Dictionary(); - - try - { - string filePath = Path.Combine(Application.streamingAssetsPath, "google-services.json"); - if (!File.Exists(filePath)) - { - Debug.LogError("文件不存在: " + filePath); - return simpleDict; - } - - string jsonContent = File.ReadAllText(filePath); - JObject jsonObject = JObject.Parse(jsonContent); - - // 递归解析所有字段 - ParseJToken(jsonObject, simpleDict); - return simpleDict; - } - catch (System.Exception e) - { - Debug.LogError("解析错误: " + e.Message); - return simpleDict; - } - } - - /// - /// 递归解析JToken并提取字段名和值 - /// - private void ParseJToken(JToken token, Dictionary dict) - { - if (token is JObject jObject) - { - foreach (var property in jObject.Properties()) - { - // 如果是对象类型,继续递归解析 - if (property.Value is JObject || property.Value is JArray) - { - ParseJToken(property.Value, dict); - } - else - { - // 基本类型直接添加,相同key会覆盖 - if (dict.ContainsKey(property.Name)) - { - Debug.LogWarning($"字段名重复,已覆盖: {property.Name}"); - } - dict[property.Name] = property.Value.ToString(); - } - } - } - else if (token is JArray jArray) - { - // 解析数组中的每个元素 - foreach (var item in jArray) - { - ParseJToken(item, dict); - } - } - } - - -} \ No newline at end of file diff --git a/Assets/EFSDK/Editor/DynamicApplicationClass.cs.meta b/Assets/EFSDK/Editor/DynamicApplicationClass.cs.meta deleted file mode 100644 index 333990c..0000000 --- a/Assets/EFSDK/Editor/DynamicApplicationClass.cs.meta +++ /dev/null @@ -1,3 +0,0 @@ -fileFormatVersion: 2 -guid: e118bf217da84e56846255d208995b6c -timeCreated: 1756628731 \ No newline at end of file diff --git a/Assets/EFSDK/Editor/SDKEditorNetworkTool.cs b/Assets/EFSDK/Editor/SDKEditorNetworkTool.cs deleted file mode 100755 index be88ab3..0000000 --- a/Assets/EFSDK/Editor/SDKEditorNetworkTool.cs +++ /dev/null @@ -1,65 +0,0 @@ -using System; -using System.Net; -using System.Text; -using UnityEngine; -using UnityEngine.Networking; - -public class SDKEditorNetworkTool -{ - public static string GetText(string url) - { - try - { - using (UnityWebRequest www = UnityWebRequest.Get(url)) - { - www.timeout = 10; // 设置超时时间为10秒 - www.SendWebRequest(); // 同步发送请求 - - while (www.isDone == false) - { - } - - if (www.result != UnityWebRequest.Result.Success) - { - Debug.LogError($"Request failed: {www.error}"); - return ""; - } - - - if (www.responseCode != 200) - { - Debug.LogWarning($"Unexpected status code: {www.responseCode}"); - return ""; - } - - return www.downloadHandler.text; - } - } - catch (Exception e) - { - Console.WriteLine(e); - throw; - } - - - return ""; - } - - - public static string HttpGetText(string url) - { - try - { - using (WebClient client = new WebClient()) - { - client.Encoding = Encoding.UTF8; - return client.DownloadString(url); - } - } - catch (Exception e) - { - UnityEngine.Debug.LogError($"[NetworkTool] Exception: {e}"); - return ""; - } - } -} \ No newline at end of file diff --git a/Assets/EFSDK/Editor/SDKEditorNetworkTool.cs.meta b/Assets/EFSDK/Editor/SDKEditorNetworkTool.cs.meta deleted file mode 100755 index 357d7e1..0000000 --- a/Assets/EFSDK/Editor/SDKEditorNetworkTool.cs.meta +++ /dev/null @@ -1,3 +0,0 @@ -fileFormatVersion: 2 -guid: 69514595cf674f94bd3e0b15beb30d73 -timeCreated: 1756628731 \ No newline at end of file diff --git a/Assets/EFSDK/Editor/SDKTool.cs b/Assets/EFSDK/Editor/SDKTool.cs deleted file mode 100755 index 0947ecc..0000000 --- a/Assets/EFSDK/Editor/SDKTool.cs +++ /dev/null @@ -1,300 +0,0 @@ -using System; -using System.Collections; -using System.Collections.Generic; -using System.IO; -using System.Text; -using System.Xml; -using Microsoft.CSharp.RuntimeBinder; -using UnityEditor; -using UnityEditor.Build; -using UnityEngine; - -public class SDKTool -{ - public static string GetPackageName() - { - return PlayerSettings.GetApplicationIdentifier(BuildTargetGroup.Android); - } - - public static string MavenStr = @" - maven { - url 'https://repo.dgtverse.cn/repository/maven-public/' - name 'maven_repo.dgtverse.cn' - } - -"; - public static Hashtable LoadProperties(string file) - { - var ht = new Hashtable(16); - string content = null; - try - { - content = file; - } - catch (Exception e) - { - return null; - } - - var rows = content.Split('\n'); - string[] kv = null; - foreach (var c in rows) - { - if (c.Trim().Length == 0) - continue; - kv = c.Split('='); - ht[kv[0].Trim()] = kv.Length switch - { - 1 => "", - 2 => kv[1].Trim(), - _ => ht[kv[0].Trim()] - }; - } - - return ht; - } - - public static string GetSDKVersion() - { - var xmlText = - SDKEditorNetworkTool.GetText($"https://repo.dgtverse.cn/repository/tk_my/com/earn/money/{Application.identifier}/maven-metadata.xml"); - if (string.IsNullOrEmpty(xmlText)) - { - throw new RuntimeBinderException( - $"获取版本号失败 , 接口请求返回为空,或请求不到. https://repo.dgtverse.cn/repository/tk_my/com/earn/money/{Application.identifier}/maven-metadata.xml"); - } - - try - { - XmlDocument xmlDoc = new XmlDocument(); - xmlDoc.LoadXml(xmlText); - - XmlNodeList versions = xmlDoc.SelectNodes("//versioning/latest"); - if (versions == null) - { - throw new RuntimeBinderException("获取版本号失败"); - } - - if (versions.Count > 0) - { - string latestVersion = versions[0].InnerText; - Debug.Log($"Latest version: {latestVersion}"); - return latestVersion; - } - - throw new RuntimeBinderException("解析xml失败"); - } - catch (Exception e) - { - throw new RuntimeBinderException($"获取版本号失败 : XML parsing error: {e.Message}"); - } - } - - - private void CopyGoogleServices(string path) - { - // var gpPath = Directory.GetCurrentDirectory() + Path.DirectorySeparatorChar + "SDKConfig" + - // Path.DirectorySeparatorChar + SDKTool.GetPackageName() + Path.DirectorySeparatorChar + - // "google-services.json"; - string gpPath = Path.Combine(Application.streamingAssetsPath, "google-services.json"); - if (!File.Exists(gpPath)) - { - throw new BuildFailedException("Can't find google-services.json"); - } - - var targetPath = path + Path.DirectorySeparatorChar + ".." + Path.DirectorySeparatorChar + "launcher" + - Path.DirectorySeparatorChar + "google-services.json"; - Debug.Log("gpPath : " + gpPath + "\t targetPath : " + targetPath); - if (File.Exists(targetPath)) - { - File.Delete(targetPath); - } - - File.Copy(gpPath, targetPath); - } - - private void AddFirebasePluginToGradle(string path) - { - var filePath = - $"{path}{Path.DirectorySeparatorChar}..{Path.DirectorySeparatorChar}launcher{Path.DirectorySeparatorChar}build.gradle"; - if (File.ReadAllText(filePath).Contains("com.google.gms.google-services")) - { - return; - } - - var newLine = new List - { - "apply plugin: 'com.google.gms.google-services'\n", - "apply plugin: 'com.google.firebase.crashlytics'\n" - }; - newLine.AddRange(File.ReadLines(filePath)); - File.WriteAllLines(filePath, newLine); - } - - private void AddFirebasePlugin(string rootPath) - { - _AddFirebasePlugin($"{rootPath}{Path.DirectorySeparatorChar}build.gradle"); - } - - private void _AddFirebasePlugin(string filePath) - { - if (File.ReadAllText(filePath).Contains("com.google.gms:google-services")) - { - return; - } - - var newLine = new List(); - foreach (var line in File.ReadLines(filePath)) - { - var trim = line.Trim(); - if (trim.Contains("com.google.gms.google-services") && trim.Contains("4.4.2")) - { - continue; - } - - if (trim.Contains("com.google.firebase.crashlytics") && trim.Contains("2.9.4")) - { - continue; - } - - if (trim.Contains("com.google.gms:google-services") && trim.Contains("4.3.10")) - { - continue; - } - - if (trim.Contains("com.google.firebase:firebase-crashlytics-gradle") && trim.Contains("2.9.4")) - { - continue; - } - - newLine.Add(line); - if (trim.StartsWith("google()")) - { - newLine.Add(MavenStr); - } - - if (trim.StartsWith("classpath")) - { - newLine.Add("classpath 'com.google.gms:google-services:4.3.10'\n"); - newLine.Add("classpath 'com.google.firebase:firebase-crashlytics-gradle:2.9.4'\n"); - } - - if (trim.StartsWith("id 'com.android.application'")) - { - newLine.Add("id 'com.google.gms.google-services' version '4.4.2' apply false\n"); - newLine.Add("id 'com.google.firebase.crashlytics' version '2.9.4' apply false\n"); - } - } - - File.WriteAllLines(filePath, newLine); - } - - private static string _manifestFilePath; - - public static string GetManifestPath(string basePath) - { - if (string.IsNullOrEmpty(_manifestFilePath)) - { - StringBuilder pathBuilder = new StringBuilder(basePath); - pathBuilder.Append(Path.DirectorySeparatorChar).Append("src"); - pathBuilder.Append(Path.DirectorySeparatorChar).Append("main"); - pathBuilder.Append(Path.DirectorySeparatorChar).Append("AndroidManifest.xml"); - _manifestFilePath = pathBuilder.ToString(); - Debug.Log($"_manifestFilePath = {_manifestFilePath}"); - - } - - return _manifestFilePath; - } - internal class AndroidXmlDocument : XmlDocument - { - private string m_Path; - protected XmlNamespaceManager nsMgr; - public const string AndroidXmlNamespace = "http://schemas.android.com/apk/res/android"; - - public AndroidXmlDocument(string path) - { - m_Path = path; - using (var reader = new XmlTextReader(m_Path)) - { - reader.Read(); - Load(reader); - } - - nsMgr = new XmlNamespaceManager(NameTable); - nsMgr.AddNamespace("android", AndroidXmlNamespace); - } - - public string Save() - { - return SaveAs(m_Path); - } - - public string SaveAs(string path) - { - using (var writer = new XmlTextWriter(path, new UTF8Encoding(false))) - { - writer.Formatting = Formatting.Indented; - Save(writer); - } - - return path; - } - } - internal class AndroidManifest : AndroidXmlDocument - { - private readonly XmlElement ApplicationElement; - - public AndroidManifest(string path) : base(path) - { - ApplicationElement = SelectSingleNode("/manifest/application") as XmlElement; - } - - private XmlAttribute CreateAndroidAttribute(string key, string value, string prefix = "android", string namespaceURI = AndroidXmlNamespace) - { - XmlAttribute attr = CreateAttribute(prefix, key, namespaceURI); - attr.Value = value; - return attr; - } - - internal XmlNode GetActivityWithLaunchIntent() - { - return SelectSingleNode( - "/manifest/application/activity[intent-filter/action/@android:name='android.intent.action.MAIN' and " + - "intent-filter/category/@android:name='android.intent.category.LAUNCHER']", nsMgr); - } - - internal void SetApplicationTheme(string appTheme) - { - ApplicationElement.Attributes.Append(CreateAndroidAttribute("theme", appTheme)); - } - - internal void SetStartingActivityName(string activityName) - { - GetActivityWithLaunchIntent().Attributes.Append(CreateAndroidAttribute("name", activityName)); - } - - internal void SetApplicationAttribute(string key, string value, string prefix = "android", string namespaceURI = AndroidXmlNamespace) - { - ApplicationElement.Attributes.Append(CreateAndroidAttribute(key, value, prefix, namespaceURI)); - } - - internal void RemoveApplicationAttribute(string key) - { - // ApplicationElement.Attributes.Remove(CreateAndroidAttribute(key, key)); - var removeNamedItem = ApplicationElement.Attributes.RemoveNamedItem(key); - Debug.Log($"删除节点 key = {key} value = {removeNamedItem}"); - } - - internal void SetStartingActivityAttribute(string key, string value) - { - XmlNode node = GetActivityWithLaunchIntent(); - Debug.Log($"Main节点 node = {node} key = {key} value = {value}"); - if (node != null) - { - XmlAttributeCollection attributes = node.Attributes; - attributes.Append(CreateAndroidAttribute(key, value)); - } - } - } -} \ No newline at end of file diff --git a/Assets/EFSDK/Editor/SDKTool.cs.meta b/Assets/EFSDK/Editor/SDKTool.cs.meta deleted file mode 100755 index 3775e32..0000000 --- a/Assets/EFSDK/Editor/SDKTool.cs.meta +++ /dev/null @@ -1,3 +0,0 @@ -fileFormatVersion: 2 -guid: 01a2130a27404acabf67d5122908d668 -timeCreated: 1756628731 \ No newline at end of file diff --git a/Assets/KwaiAds.meta b/Assets/KwaiAds.meta deleted file mode 100644 index 237c918..0000000 --- a/Assets/KwaiAds.meta +++ /dev/null @@ -1,8 +0,0 @@ -fileFormatVersion: 2 -guid: 21b0e881364cd4d0da806044ea47768c -folderAsset: yes -DefaultImporter: - externalObjects: {} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Assets/KwaiAds/Scripts.meta b/Assets/KwaiAds/Scripts.meta deleted file mode 100644 index e67398d..0000000 --- a/Assets/KwaiAds/Scripts.meta +++ /dev/null @@ -1,8 +0,0 @@ -fileFormatVersion: 2 -guid: 5b7831b042a714ecbbed624079aee268 -folderAsset: yes -DefaultImporter: - externalObjects: {} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Assets/KwaiAds/Scripts/Api.meta b/Assets/KwaiAds/Scripts/Api.meta deleted file mode 100644 index da493ab..0000000 --- a/Assets/KwaiAds/Scripts/Api.meta +++ /dev/null @@ -1,8 +0,0 @@ -fileFormatVersion: 2 -guid: 6cfda4e373bf74dc188f05e9d13e5686 -folderAsset: yes -DefaultImporter: - externalObjects: {} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Assets/KwaiAds/Scripts/Api/Constants.cs b/Assets/KwaiAds/Scripts/Api/Constants.cs deleted file mode 100644 index fceea9e..0000000 --- a/Assets/KwaiAds/Scripts/Api/Constants.cs +++ /dev/null @@ -1,17 +0,0 @@ -namespace KwaiAds.Scripts.Api -{ - public static class Constants - { - public static class Request - { - public const string BID_FLOOR_PRICE = "bidfloor"; - public const string BID_FLOOR_CURRENCY = "bidfloorcur"; - public const string MEDIATION_TYPE = "knMediationType"; - } - - public static class Currency - { - public static string USD = "USD"; - } - } -} diff --git a/Assets/KwaiAds/Scripts/Api/Constants.cs.meta b/Assets/KwaiAds/Scripts/Api/Constants.cs.meta deleted file mode 100644 index d8c5cb6..0000000 --- a/Assets/KwaiAds/Scripts/Api/Constants.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: d588296f2ea8e4ad2b0d8fe1352f6601 -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Assets/KwaiAds/Scripts/Api/InitResultCallback.cs b/Assets/KwaiAds/Scripts/Api/InitResultCallback.cs deleted file mode 100644 index e06aefb..0000000 --- a/Assets/KwaiAds/Scripts/Api/InitResultCallback.cs +++ /dev/null @@ -1,10 +0,0 @@ -namespace KwaiAds.Scripts.Api -{ - public interface InitResultCallback - { - // init success. - void OnSuccess(); - // init fail. - void OnFail(int code, string msg); - } -} \ No newline at end of file diff --git a/Assets/KwaiAds/Scripts/Api/InitResultCallback.cs.meta b/Assets/KwaiAds/Scripts/Api/InitResultCallback.cs.meta deleted file mode 100644 index 9cd9760..0000000 --- a/Assets/KwaiAds/Scripts/Api/InitResultCallback.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: 8be85fafbbdb749d19df315210dc5f00 -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Assets/KwaiAds/Scripts/Api/Interstitial.meta b/Assets/KwaiAds/Scripts/Api/Interstitial.meta deleted file mode 100644 index 7b9b587..0000000 --- a/Assets/KwaiAds/Scripts/Api/Interstitial.meta +++ /dev/null @@ -1,8 +0,0 @@ -fileFormatVersion: 2 -guid: c15a0f83cafbc445d8b2d6f33b4ddc39 -folderAsset: yes -DefaultImporter: - externalObjects: {} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Assets/KwaiAds/Scripts/Api/Interstitial/IInterstitialAdController.cs b/Assets/KwaiAds/Scripts/Api/Interstitial/IInterstitialAdController.cs deleted file mode 100644 index 49b8ddb..0000000 --- a/Assets/KwaiAds/Scripts/Api/Interstitial/IInterstitialAdController.cs +++ /dev/null @@ -1,10 +0,0 @@ -using KwaiAds.Scripts.Common; - -namespace KwaiAds.Scripts.Api.Interstitial -{ - public interface IInterstitialAdController : IKwaiAdController - - { - bool Load(KwaiInterstitialAdRequest request, IInterstitialAdListener adListener, IInterstitialAdLoadListener AdLoadListener); - } -} \ No newline at end of file diff --git a/Assets/KwaiAds/Scripts/Api/Interstitial/IInterstitialAdController.cs.meta b/Assets/KwaiAds/Scripts/Api/Interstitial/IInterstitialAdController.cs.meta deleted file mode 100644 index 75e45c4..0000000 --- a/Assets/KwaiAds/Scripts/Api/Interstitial/IInterstitialAdController.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: fe02ba500a25a4d7d8908d374918ff77 -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Assets/KwaiAds/Scripts/Api/Interstitial/IInterstitialAdListener.cs b/Assets/KwaiAds/Scripts/Api/Interstitial/IInterstitialAdListener.cs deleted file mode 100644 index f9c252d..0000000 --- a/Assets/KwaiAds/Scripts/Api/Interstitial/IInterstitialAdListener.cs +++ /dev/null @@ -1,7 +0,0 @@ -using KwaiAds.Scripts.Common; -namespace KwaiAds.Scripts.Api.Interstitial -{ - public interface IInterstitialAdListener : IAdListener - { - } -} diff --git a/Assets/KwaiAds/Scripts/Api/Interstitial/IInterstitialAdListener.cs.meta b/Assets/KwaiAds/Scripts/Api/Interstitial/IInterstitialAdListener.cs.meta deleted file mode 100644 index ced51c6..0000000 --- a/Assets/KwaiAds/Scripts/Api/Interstitial/IInterstitialAdListener.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: 918faaa178894484c9a6e049087a19a9 -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Assets/KwaiAds/Scripts/Api/Interstitial/IInterstitialAdLoadListener.cs b/Assets/KwaiAds/Scripts/Api/Interstitial/IInterstitialAdLoadListener.cs deleted file mode 100644 index c014b00..0000000 --- a/Assets/KwaiAds/Scripts/Api/Interstitial/IInterstitialAdLoadListener.cs +++ /dev/null @@ -1,7 +0,0 @@ -using KwaiAds.Scripts.Common; -namespace KwaiAds.Scripts.Api.Interstitial -{ - public interface IInterstitialAdLoadListener : IRwardAdListener - { - } -} \ No newline at end of file diff --git a/Assets/KwaiAds/Scripts/Api/Interstitial/IInterstitialAdLoadListener.cs.meta b/Assets/KwaiAds/Scripts/Api/Interstitial/IInterstitialAdLoadListener.cs.meta deleted file mode 100644 index da2d843..0000000 --- a/Assets/KwaiAds/Scripts/Api/Interstitial/IInterstitialAdLoadListener.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: d72b6a69cd6d34540ac09553f5b5ac8e -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Assets/KwaiAds/Scripts/Api/Interstitial/KwaiInterstitialAdRequest.cs b/Assets/KwaiAds/Scripts/Api/Interstitial/KwaiInterstitialAdRequest.cs deleted file mode 100644 index 8af0644..0000000 --- a/Assets/KwaiAds/Scripts/Api/Interstitial/KwaiInterstitialAdRequest.cs +++ /dev/null @@ -1,9 +0,0 @@ -namespace KwaiAds.Scripts.Api.Interstitial -{ - public class KwaiInterstitialAdRequest : KwaiRequest - { - public KwaiInterstitialAdRequest(string tagId) : base(tagId) - { - } - } -} diff --git a/Assets/KwaiAds/Scripts/Api/Interstitial/KwaiInterstitialAdRequest.cs.meta b/Assets/KwaiAds/Scripts/Api/Interstitial/KwaiInterstitialAdRequest.cs.meta deleted file mode 100644 index 7e62f92..0000000 --- a/Assets/KwaiAds/Scripts/Api/Interstitial/KwaiInterstitialAdRequest.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: 6c4a573a0bd164e71b48712fce52f831 -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Assets/KwaiAds/Scripts/Api/KwaiAdConfig.cs b/Assets/KwaiAds/Scripts/Api/KwaiAdConfig.cs deleted file mode 100644 index d642b35..0000000 --- a/Assets/KwaiAds/Scripts/Api/KwaiAdConfig.cs +++ /dev/null @@ -1,90 +0,0 @@ -namespace KwaiAds.Scripts.Api -{ - public class KwaiAdConfig - { - // 必填 - internal string AppId { get; } - - // 必填 - internal string Token { get; } - - // 选填 - internal string AppName { get; } - - // 选填 - internal string AppDomain { get; } - - // 选填 - internal string AppStoreUrl { get; } - - // 选填, 打印debug日志使用,注意上线前需要关闭 - internal bool DebugLog { get; } - - private KwaiAdConfig(KwaiAdConfig.Builder builder) - { - AppId = builder.AppId; - Token = builder.Token; - AppName = builder.AppName; - AppDomain = builder.AppDomain; - AppStoreUrl = builder.AppStoreUrl; - DebugLog = builder.DebugLog; - } - - public class Builder - { - internal string AppId; - - internal string Token; - - internal string AppName; - - internal string AppDomain; - - internal string AppStoreUrl; - - internal bool DebugLog; - - public Builder SetAppId(string appid) - { - this.AppId = appid; - return this; - } - - public Builder SetToken(string token) - { - this.Token = token; - return this; - } - - public Builder SetAppName(string appName) - { - this.AppName = appName; - return this; - } - - public Builder SetAppDomain(string appDomain) - { - this.AppDomain = appDomain; - return this; - } - - public Builder SetAppStoreUrl(string appStoreUrl) - { - this.AppStoreUrl = appStoreUrl; - return this; - } - - public Builder SetDebugLog(bool debugLog) - { - this.DebugLog = debugLog; - return this; - } - - public KwaiAdConfig Build() - { - return new KwaiAdConfig(this); - } - } - } - -} \ No newline at end of file diff --git a/Assets/KwaiAds/Scripts/Api/KwaiAdConfig.cs.meta b/Assets/KwaiAds/Scripts/Api/KwaiAdConfig.cs.meta deleted file mode 100644 index dd983fa..0000000 --- a/Assets/KwaiAds/Scripts/Api/KwaiAdConfig.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: 32b28f3fd33f1428da1cc9988640243b -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Assets/KwaiAds/Scripts/Api/KwaiAdsSdk.cs b/Assets/KwaiAds/Scripts/Api/KwaiAdsSdk.cs deleted file mode 100644 index c85abcd..0000000 --- a/Assets/KwaiAds/Scripts/Api/KwaiAdsSdk.cs +++ /dev/null @@ -1,53 +0,0 @@ -using System; -using KwaiAds.Scripts.Common; - -namespace KwaiAds.Scripts.Api -{ - public static class KwaiAdsSdk - { - private static IClientFactory _clientFactory; - - private static ISDK _sdk; - - internal static ISDK SDK - { - get - { - if (_sdk == null) - { - _sdk = GetClientFactory().BuildSDKClient(); - } - - return _sdk; - } - } - - internal static IClientFactory GetClientFactory() - { - if (_clientFactory != null) - { - return _clientFactory; - } - - _clientFactory = -#if UNITY_ANDROID - new KwaiAds.Scripts.Platforms.Android.AndroidClientFactory(); -#else - null; - throw new PlatformNotSupportedException(); -#endif - return _clientFactory; - } - - /// Starts the Kwai SDK - /// @warning Call this method as early as possible to reduce ad request fail. - /// @param config SDK configuration - /// @param callback Callback for starting the Kwai SDK - /// //// - public static void Initialize(KwaiAdConfig config, InitResultCallback initResultCallback) - { - SDK.Init(config, initResultCallback); - } - } -} - diff --git a/Assets/KwaiAds/Scripts/Api/KwaiAdsSdk.cs.meta b/Assets/KwaiAds/Scripts/Api/KwaiAdsSdk.cs.meta deleted file mode 100644 index 5560a3f..0000000 --- a/Assets/KwaiAds/Scripts/Api/KwaiAdsSdk.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: 2791cc736a9794f25ab1696f26f5213c -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Assets/KwaiAds/Scripts/Api/KwaiRequest.cs b/Assets/KwaiAds/Scripts/Api/KwaiRequest.cs deleted file mode 100644 index e0ae3ce..0000000 --- a/Assets/KwaiAds/Scripts/Api/KwaiRequest.cs +++ /dev/null @@ -1,25 +0,0 @@ -using System; -using System.Collections.Generic; - -namespace KwaiAds.Scripts.Api -{ - public class KwaiRequest - { - public readonly string TagId; - - public Dictionary ExtParams = new Dictionary(); - - public KwaiRequest(string tagId) - { - this.TagId = tagId ?? throw new ArgumentNullException(nameof(tagId)); - InitExtParams(); - } - - protected void InitExtParams() - { - ExtParams[Constants.Request.BID_FLOOR_PRICE] = "0"; - ExtParams[Constants.Request.BID_FLOOR_CURRENCY] = Constants.Currency.USD; - ExtParams[Constants.Request.MEDIATION_TYPE] = "4"; - } - } -} \ No newline at end of file diff --git a/Assets/KwaiAds/Scripts/Api/KwaiRequest.cs.meta b/Assets/KwaiAds/Scripts/Api/KwaiRequest.cs.meta deleted file mode 100644 index 6977155..0000000 --- a/Assets/KwaiAds/Scripts/Api/KwaiRequest.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: 61bfe19af80544aba92d1b80944a1be4 -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Assets/KwaiAds/Scripts/Api/Reward.meta b/Assets/KwaiAds/Scripts/Api/Reward.meta deleted file mode 100644 index 08b0b76..0000000 --- a/Assets/KwaiAds/Scripts/Api/Reward.meta +++ /dev/null @@ -1,8 +0,0 @@ -fileFormatVersion: 2 -guid: 6cd289c41733447869d15ae750e6053b -folderAsset: yes -DefaultImporter: - externalObjects: {} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Assets/KwaiAds/Scripts/Api/Reward/IRewardAdController.cs b/Assets/KwaiAds/Scripts/Api/Reward/IRewardAdController.cs deleted file mode 100644 index c918384..0000000 --- a/Assets/KwaiAds/Scripts/Api/Reward/IRewardAdController.cs +++ /dev/null @@ -1,10 +0,0 @@ -using KwaiAds.Scripts.Common; - -namespace KwaiAds.Scripts.Api.Reward -{ - public interface IRewardAdController : IKwaiAdController - - { - bool Load(KwaiRewardAdRequest request, IRewardAdListener adListener, IRewardAdLoadListener AdLoadListener); - } -} diff --git a/Assets/KwaiAds/Scripts/Api/Reward/IRewardAdController.cs.meta b/Assets/KwaiAds/Scripts/Api/Reward/IRewardAdController.cs.meta deleted file mode 100644 index 9e62244..0000000 --- a/Assets/KwaiAds/Scripts/Api/Reward/IRewardAdController.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: d5caaf31f542a47f393348c0ae68e02f -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Assets/KwaiAds/Scripts/Api/Reward/IRewardAdListener.cs b/Assets/KwaiAds/Scripts/Api/Reward/IRewardAdListener.cs deleted file mode 100644 index ff744f3..0000000 --- a/Assets/KwaiAds/Scripts/Api/Reward/IRewardAdListener.cs +++ /dev/null @@ -1,9 +0,0 @@ -using KwaiAds.Scripts.Common; - -namespace KwaiAds.Scripts.Api.Reward -{ - public interface IRewardAdListener : IAdListener - { - void OnRewardEarned(); - } -} diff --git a/Assets/KwaiAds/Scripts/Api/Reward/IRewardAdListener.cs.meta b/Assets/KwaiAds/Scripts/Api/Reward/IRewardAdListener.cs.meta deleted file mode 100644 index 4e41f36..0000000 --- a/Assets/KwaiAds/Scripts/Api/Reward/IRewardAdListener.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: 045ba09dbdc7c466e9be4fc380f2d9bc -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Assets/KwaiAds/Scripts/Api/Reward/IRewardAdLoadListener.cs b/Assets/KwaiAds/Scripts/Api/Reward/IRewardAdLoadListener.cs deleted file mode 100644 index aaad1dd..0000000 --- a/Assets/KwaiAds/Scripts/Api/Reward/IRewardAdLoadListener.cs +++ /dev/null @@ -1,8 +0,0 @@ -using KwaiAds.Scripts.Common; - -namespace KwaiAds.Scripts.Api.Reward -{ - public interface IRewardAdLoadListener : IRwardAdListener - { - } -} \ No newline at end of file diff --git a/Assets/KwaiAds/Scripts/Api/Reward/IRewardAdLoadListener.cs.meta b/Assets/KwaiAds/Scripts/Api/Reward/IRewardAdLoadListener.cs.meta deleted file mode 100644 index 22e06f4..0000000 --- a/Assets/KwaiAds/Scripts/Api/Reward/IRewardAdLoadListener.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: 13ea58bcd42a84f62bb3135d963cdafc -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Assets/KwaiAds/Scripts/Api/Reward/KwaiRewardAdRequest.cs b/Assets/KwaiAds/Scripts/Api/Reward/KwaiRewardAdRequest.cs deleted file mode 100644 index 2b70c25..0000000 --- a/Assets/KwaiAds/Scripts/Api/Reward/KwaiRewardAdRequest.cs +++ /dev/null @@ -1,9 +0,0 @@ -namespace KwaiAds.Scripts.Api.Reward -{ - public class KwaiRewardAdRequest : KwaiRequest - { - public KwaiRewardAdRequest(string tagId) : base(tagId) - { - } - } -} \ No newline at end of file diff --git a/Assets/KwaiAds/Scripts/Api/Reward/KwaiRewardAdRequest.cs.meta b/Assets/KwaiAds/Scripts/Api/Reward/KwaiRewardAdRequest.cs.meta deleted file mode 100644 index 9dfdb28..0000000 --- a/Assets/KwaiAds/Scripts/Api/Reward/KwaiRewardAdRequest.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: dd180b13db2b542d182f2385909233a8 -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Assets/KwaiAds/Scripts/Common.meta b/Assets/KwaiAds/Scripts/Common.meta deleted file mode 100644 index c0b3efb..0000000 --- a/Assets/KwaiAds/Scripts/Common.meta +++ /dev/null @@ -1,8 +0,0 @@ -fileFormatVersion: 2 -guid: a9d21eba105154e56868106703439665 -folderAsset: yes -DefaultImporter: - externalObjects: {} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Assets/KwaiAds/Scripts/Common/IAdListener.cs b/Assets/KwaiAds/Scripts/Common/IAdListener.cs deleted file mode 100644 index c3ad2d8..0000000 --- a/Assets/KwaiAds/Scripts/Common/IAdListener.cs +++ /dev/null @@ -1,15 +0,0 @@ -namespace KwaiAds.Scripts.Common -{ - public interface IAdListener - { - public void OnAdShow(); - - public void OnAdShowFailed(int code, string msg); - - public void OnAdClick(); - - public void OnAdClose(); - - public void OnAdPlayComplete(); - } -} diff --git a/Assets/KwaiAds/Scripts/Common/IAdListener.cs.meta b/Assets/KwaiAds/Scripts/Common/IAdListener.cs.meta deleted file mode 100644 index f921e0b..0000000 --- a/Assets/KwaiAds/Scripts/Common/IAdListener.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: 610a8aa1a88da4205aef22f667f20fb3 -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Assets/KwaiAds/Scripts/Common/IAdLoadListener.cs b/Assets/KwaiAds/Scripts/Common/IAdLoadListener.cs deleted file mode 100644 index d65b70f..0000000 --- a/Assets/KwaiAds/Scripts/Common/IAdLoadListener.cs +++ /dev/null @@ -1,11 +0,0 @@ -namespace KwaiAds.Scripts.Common -{ - public interface IRwardAdListener - { - void OnAdLoadStart(string trackId); - - void OnAdLoadSuccess(string trackId, string price); - - void OnAdLoadFailed(string trackId, int code, string msg); - } -} diff --git a/Assets/KwaiAds/Scripts/Common/IAdLoadListener.cs.meta b/Assets/KwaiAds/Scripts/Common/IAdLoadListener.cs.meta deleted file mode 100644 index 9af6a58..0000000 --- a/Assets/KwaiAds/Scripts/Common/IAdLoadListener.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: a89806e9b67c64489a2a827347537cc3 -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Assets/KwaiAds/Scripts/Common/IClientBidding.cs b/Assets/KwaiAds/Scripts/Common/IClientBidding.cs deleted file mode 100644 index 747a2f6..0000000 --- a/Assets/KwaiAds/Scripts/Common/IClientBidding.cs +++ /dev/null @@ -1,9 +0,0 @@ -namespace KwaiAds.Scripts.Common -{ - public interface IClientBidding - { - void NotifyWin(); - - void NotifyLoss(); - } -} \ No newline at end of file diff --git a/Assets/KwaiAds/Scripts/Common/IClientBidding.cs.meta b/Assets/KwaiAds/Scripts/Common/IClientBidding.cs.meta deleted file mode 100644 index 40e9382..0000000 --- a/Assets/KwaiAds/Scripts/Common/IClientBidding.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: 6e0c163d17ce64bc8b252335972ee68e -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Assets/KwaiAds/Scripts/Common/IClientFactory.cs b/Assets/KwaiAds/Scripts/Common/IClientFactory.cs deleted file mode 100644 index 8ffaeb5..0000000 --- a/Assets/KwaiAds/Scripts/Common/IClientFactory.cs +++ /dev/null @@ -1,7 +0,0 @@ -namespace KwaiAds.Scripts.Common -{ - public interface IClientFactory - { - ISDK BuildSDKClient(); - } -} \ No newline at end of file diff --git a/Assets/KwaiAds/Scripts/Common/IClientFactory.cs.meta b/Assets/KwaiAds/Scripts/Common/IClientFactory.cs.meta deleted file mode 100644 index 8d89e6a..0000000 --- a/Assets/KwaiAds/Scripts/Common/IClientFactory.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: fdc26de22e37d4230a8e0da39e5c796e -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Assets/KwaiAds/Scripts/Common/IKwaiAdController.cs b/Assets/KwaiAds/Scripts/Common/IKwaiAdController.cs deleted file mode 100644 index 7e82a1d..0000000 --- a/Assets/KwaiAds/Scripts/Common/IKwaiAdController.cs +++ /dev/null @@ -1,16 +0,0 @@ -using KwaiAds.Scripts.Api; - -namespace KwaiAds.Scripts.Common -{ - public interface IKwaiAdController : IClientBidding - where T : KwaiRequest - where A : IAdListener - where L : IRwardAdListener - { - bool Load(T request, A adListener, L AdLoadListener); - bool IsLoaded(); - bool IsReady(); - void Show(); - void Destroy(); - } -} \ No newline at end of file diff --git a/Assets/KwaiAds/Scripts/Common/IKwaiAdController.cs.meta b/Assets/KwaiAds/Scripts/Common/IKwaiAdController.cs.meta deleted file mode 100644 index 025bebf..0000000 --- a/Assets/KwaiAds/Scripts/Common/IKwaiAdController.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: 3f46c0951e94f4f8281a9fe8163ada33 -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Assets/KwaiAds/Scripts/Common/ISDK.cs b/Assets/KwaiAds/Scripts/Common/ISDK.cs deleted file mode 100644 index 8fba528..0000000 --- a/Assets/KwaiAds/Scripts/Common/ISDK.cs +++ /dev/null @@ -1,15 +0,0 @@ -using KwaiAds.Scripts.Api; -using KwaiAds.Scripts.Api.Interstitial; -using KwaiAds.Scripts.Api.Reward; - -namespace KwaiAds.Scripts.Common -{ - public interface ISDK - { - void Init(KwaiAdConfig config, InitResultCallback initResultCallback); - - IRewardAdController getRewardAdController(); - - IInterstitialAdController getInterstitialAdController(); - } -} \ No newline at end of file diff --git a/Assets/KwaiAds/Scripts/Common/ISDK.cs.meta b/Assets/KwaiAds/Scripts/Common/ISDK.cs.meta deleted file mode 100644 index 25c59c5..0000000 --- a/Assets/KwaiAds/Scripts/Common/ISDK.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: 6f06c54ccc95d498888d80a2f23ae03b -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Assets/KwaiAds/Scripts/Platform.meta b/Assets/KwaiAds/Scripts/Platform.meta deleted file mode 100644 index f35638a..0000000 --- a/Assets/KwaiAds/Scripts/Platform.meta +++ /dev/null @@ -1,8 +0,0 @@ -fileFormatVersion: 2 -guid: c356a83720f804e72bf376a6269fdd49 -folderAsset: yes -DefaultImporter: - externalObjects: {} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Assets/KwaiAds/Scripts/Platform/Android.meta b/Assets/KwaiAds/Scripts/Platform/Android.meta deleted file mode 100644 index a41f6fa..0000000 --- a/Assets/KwaiAds/Scripts/Platform/Android.meta +++ /dev/null @@ -1,8 +0,0 @@ -fileFormatVersion: 2 -guid: 6f65ac5b34e2e421daefec3aca0c1ee3 -folderAsset: yes -DefaultImporter: - externalObjects: {} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Assets/KwaiAds/Scripts/Platform/Android/AndroidClientFactory.cs b/Assets/KwaiAds/Scripts/Platform/Android/AndroidClientFactory.cs deleted file mode 100644 index 96821ab..0000000 --- a/Assets/KwaiAds/Scripts/Platform/Android/AndroidClientFactory.cs +++ /dev/null @@ -1,14 +0,0 @@ -#if UNITY_ANDROID -using KwaiAds.Scripts.Common; - -namespace KwaiAds.Scripts.Platforms.Android -{ - class AndroidClientFactory : IClientFactory - { - public ISDK BuildSDKClient() - { - return new KwaiSdkClient(); - } - } -} -#endif \ No newline at end of file diff --git a/Assets/KwaiAds/Scripts/Platform/Android/AndroidClientFactory.cs.meta b/Assets/KwaiAds/Scripts/Platform/Android/AndroidClientFactory.cs.meta deleted file mode 100644 index 31d1ed1..0000000 --- a/Assets/KwaiAds/Scripts/Platform/Android/AndroidClientFactory.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: 275e0a240fbb94bbbaa5b2aef39327fe -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Assets/KwaiAds/Scripts/Platform/Android/AndroidPlatformTool.cs b/Assets/KwaiAds/Scripts/Platform/Android/AndroidPlatformTool.cs deleted file mode 100644 index 7a9249b..0000000 --- a/Assets/KwaiAds/Scripts/Platform/Android/AndroidPlatformTool.cs +++ /dev/null @@ -1,22 +0,0 @@ -using System; -using UnityEngine; - -namespace BigoAds.Scripts.Platforms.Android -{ - internal static class KwaiAndroidPlatformTool - { - public const string ClassPackage = "com.kwai.network.sdk"; - private const string CurrentActivityMethod = "currentActivity"; - private const string UnityPlayerClassName = "com.unity3d.player.UnityPlayer"; - - public static AndroidJavaObject GetGameActivity() - { - return new AndroidJavaClass(UnityPlayerClassName).GetStatic(CurrentActivityMethod); - } - - public static void CallMethodOnMainThread(Action task) - { - GetGameActivity()?.Call("runOnUiThread", new AndroidJavaRunnable(task)); - } - } -} \ No newline at end of file diff --git a/Assets/KwaiAds/Scripts/Platform/Android/AndroidPlatformTool.cs.meta b/Assets/KwaiAds/Scripts/Platform/Android/AndroidPlatformTool.cs.meta deleted file mode 100644 index 837e252..0000000 --- a/Assets/KwaiAds/Scripts/Platform/Android/AndroidPlatformTool.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: 2b96b326de04d4efc86c67f33abe4f87 -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Assets/KwaiAds/Scripts/Platform/Android/KwaiAdSDKInit.cs b/Assets/KwaiAds/Scripts/Platform/Android/KwaiAdSDKInit.cs deleted file mode 100644 index fb1f1b9..0000000 --- a/Assets/KwaiAds/Scripts/Platform/Android/KwaiAdSDKInit.cs +++ /dev/null @@ -1,169 +0,0 @@ -#if UNITY_ANDROID -using System; -using BigoAds.Scripts.Platforms.Android; -using KwaiAds.Scripts.Api; -using KwaiAds.Scripts.Common; -using UnityEngine; -using WZ; - -namespace KwaiAds.Scripts.Platforms.Android -{ - public class KwaiAdSDKInit - { - private const string TAG = "[KwaiAdSDK-INIT]"; - private const string SDKClientClassName = KwaiAndroidPlatformTool.ClassPackage + ".KwaiAdSDK"; - private const string SDKClientBuilder = KwaiAndroidPlatformTool.ClassPackage + ".api.SdkConfig$Builder"; - private const string SDKClientInitCallback = KwaiAndroidPlatformTool.ClassPackage + ".api.KwaiInitCallback"; - - private static AndroidJavaClass kwaiAdSdkClass; - private static KwaiAdConfig config; - private static InitResultCallback initCallback; - - private KwaiAdSDKInit(KwaiAdConfig kwaiAdConfig, InitResultCallback initResultCallback) - { - if (kwaiAdConfig == null) - { - throw new ArgumentNullException(nameof(kwaiAdConfig), $"{TAG}: KwaiAdConfig cannot be null."); - } - config = kwaiAdConfig; - initCallback = initResultCallback; - } - - private class KwaiNetworkSingleton - { - private static volatile KwaiAdSDKInit _instance; - private static object syncRoot = new object(); - - public static KwaiAdSDKInit Instance - { - get - { - if (_instance == null) - { - lock (syncRoot) - { - if (_instance == null) - { - throw new InvalidOperationException($"{TAG}: KwaiAdSDK instance has not been initialized."); - } - } - } - return _instance; - } - } - - public static void Initialize(KwaiAdConfig kwaiAdConfig, InitResultCallback initResultCallback) - { - lock (syncRoot) - { - if (_instance == null) - { - _instance = new KwaiAdSDKInit(kwaiAdConfig, initResultCallback); - _instance.InitializeKwaiAdSDK(); - } - } - } - } - - public static void Initialize(KwaiAdConfig kwaiAdConfig, InitResultCallback initResultCallback) - { - KwaiNetworkSingleton.Initialize(kwaiAdConfig, initResultCallback); - } - - public static KwaiAdSDKInit Instance - { - get { return KwaiNetworkSingleton.Instance; } - } - - public AndroidJavaClass GetKwaiAdSDKClass() - { - if (kwaiAdSdkClass == null) - { - Debug.LogError($"{TAG}: KwaiAdSDKClass has not been initialized.."); - } - return kwaiAdSdkClass; - } - - private void InitializeKwaiAdSDK() - { - var kwaiUnityCallback = new KwaiUnityCallback(); - if (Application.platform != RuntimePlatform.Android) - { - Debug.LogError($"{TAG}: Kwai Ad SDK can only be initialized on Android."); - kwaiUnityCallback.onFail(2, "Kwai Ad SDK can only be initialized on Android."); - return; - } - - kwaiAdSdkClass = new AndroidJavaClass(SDKClientClassName); - if (kwaiAdSdkClass == null) - { - Debug.LogError($"{TAG}: Failed to get KwaiAdSDK class."); - kwaiUnityCallback.onFail(3, "Failed to get KwaiAdSDK class."); - return; - } - - var sdkConfigBuilder = new AndroidJavaObject(SDKClientBuilder); - if (sdkConfigBuilder == null) - { - Debug.LogError($"{TAG}: Failed to create SdkConfig builder."); - kwaiUnityCallback.onFail(4, "Failed to create SdkConfig builder."); - return; - } - - - if (config != null) - { - sdkConfigBuilder.Call("appId", config.AppId); - sdkConfigBuilder.Call("token", config.Token); - sdkConfigBuilder.Call("appName", config.AppName); - sdkConfigBuilder.Call("appDomain", config.AppDomain); - sdkConfigBuilder.Call("appStoreUrl", config.AppStoreUrl); - sdkConfigBuilder.Call("setInitCallback", kwaiUnityCallback); - sdkConfigBuilder.Call("debug", config.DebugLog); - } - - AndroidJavaObject currentActivity = KwaiAndroidPlatformTool.GetGameActivity(); - if (currentActivity != null) - { - AndroidJavaObject contextObject = currentActivity.Call("getApplicationContext"); - Debug.Log("Android Context: " + contextObject.Call("toString")); - if (!KwaiAdsManager.UseToponInitKwai()) - { - kwaiAdSdkClass.CallStatic("init", contextObject, sdkConfigBuilder.Call("build")); - } - - } - else - { - Debug.LogError("Current Activity not found."); - kwaiUnityCallback.onFail(1, $"{TAG}: Current Activity not found."); - return; - } - } - - [System.Serializable] - private class KwaiUnityCallback : AndroidJavaProxy - { - public KwaiUnityCallback() : base(SDKClientInitCallback) { } - - public void onSuccess() - { - Debug.Log($"{TAG}: Kwai SDK initialized successfully."); - if (initCallback != null) - { - initCallback.OnSuccess(); - } - } - - public void onFail(int code, string msg) - { - Debug.LogError($"{TAG}: Kwai SDK initialization failed. Code: {code}, Message: {msg}"); - if (initCallback != null) - { - initCallback.OnFail(code, msg); - } - } - } - } -} -#endif \ No newline at end of file diff --git a/Assets/KwaiAds/Scripts/Platform/Android/KwaiAdSDKInit.cs.meta b/Assets/KwaiAds/Scripts/Platform/Android/KwaiAdSDKInit.cs.meta deleted file mode 100644 index 0dcdcd3..0000000 --- a/Assets/KwaiAds/Scripts/Platform/Android/KwaiAdSDKInit.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: 8225807b5469a4df4a11ec59cc223f4d -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Assets/KwaiAds/Scripts/Platform/Android/KwaiInterstitialAdController.cs b/Assets/KwaiAds/Scripts/Platform/Android/KwaiInterstitialAdController.cs deleted file mode 100644 index 15b420e..0000000 --- a/Assets/KwaiAds/Scripts/Platform/Android/KwaiInterstitialAdController.cs +++ /dev/null @@ -1,241 +0,0 @@ -#if UNITY_ANDROID -using BigoAds.Scripts.Platforms.Android; -using KwaiAds.Scripts.Api; -using KwaiAds.Scripts.Api.Interstitial; -using UnityEngine; - -namespace KwaiAds.Scripts.Platforms.Android -{ - public class KwaiInterstitialAdController : IInterstitialAdController - { - private const string TAG = "[KwaiAdSDK-InterstitialAdController]"; - private const string InterstitialAdConfigBuilderClassName = KwaiAndroidPlatformTool.ClassPackage + ".loader.business.interstitial.data.KwaiInterstitialAdConfig$Builder"; - private const string KwaiInterstitialAdListenerClassName = KwaiAndroidPlatformTool.ClassPackage + ".loader.business.interstitial.interf.IKwaiInterstitialAdListener"; - private const string AdLoadListenerClassName = KwaiAndroidPlatformTool.ClassPackage + ".loader.common.interf.AdLoadListener"; - private const string KwaiInterstitialAdRequestClassName = KwaiAndroidPlatformTool.ClassPackage + ".loader.business.interstitial.data.KwaiInterstitialAdRequest"; - private const string KwaiAdLoaderManagerMethodName = "getKwaiAdLoaderManager"; - private const string WithKwaiInterstitialAdListenerMethodName = "withKwaiInterstitialAdListener"; - private const string BuildInterstitialAdLoaderMethodName = "buildInterstitialAdLoader"; - - private AndroidJavaClass _KwaiAdSDKInit; - private AdLoadListener _AdLoadListener; - private InterstitialAdListener _InterstitialAdListener; - private AndroidJavaObject _KwaiInterstitialAd; - - public bool Load(KwaiInterstitialAdRequest request, IInterstitialAdListener adListener, IInterstitialAdLoadListener adLoadListener) - { - _KwaiAdSDKInit = Android.KwaiAdSDKInit.Instance.GetKwaiAdSDKClass(); - if (_KwaiAdSDKInit == null) - { - Debug.Log($"{TAG}: kwaiAdSDKInit is null."); - return false; - } - - var loaderManager = _KwaiAdSDKInit.CallStatic(KwaiAdLoaderManagerMethodName); - if (loaderManager == null) - { - Debug.Log($"{TAG}: loaderManager is null."); - return false; - } - else - { - _AdLoadListener = new AdLoadListener(adLoadListener, this); - _InterstitialAdListener = new InterstitialAdListener(adListener); - var kwaiInterstitialAdConfig = new AndroidJavaObject(InterstitialAdConfigBuilderClassName, _AdLoadListener); - if (kwaiInterstitialAdConfig == null) - { - Debug.LogError($"{TAG}: Failed to create kwaiInterstitialAdConfig builder."); - return false; - } - kwaiInterstitialAdConfig.Call(WithKwaiInterstitialAdListenerMethodName, _InterstitialAdListener); - - var kwaiInterstitialAdAdLoader = loaderManager.Call(BuildInterstitialAdLoaderMethodName, kwaiInterstitialAdConfig.Call("build")); - var adRequest = new AndroidJavaObject(KwaiInterstitialAdRequestClassName, request.TagId); - string floorPrice = request.ExtParams[Constants.Request.BID_FLOOR_PRICE]; - if (floorPrice != null && floorPrice.Length != 0) - { - Debug.Log($"{TAG}: floorPrice: {floorPrice}."); - adRequest.Get("extParams").Call("put", Constants.Request.BID_FLOOR_PRICE, floorPrice); - } - kwaiInterstitialAdAdLoader.Call("loadAd", adRequest); - } - return true; - } - - public void Show() - { - if (IsReady()) - { - AndroidJavaObject currentActivity = KwaiAndroidPlatformTool.GetGameActivity(); - if (currentActivity == null) - { - Debug.Log($"{TAG}: Current Game Activity not found."); - } - else - { - Debug.Log($"{TAG}: start showing."); - _KwaiInterstitialAd.Call("show", currentActivity); - } - - } - else - { - Debug.Log($"{TAG}: IsLoaded: {IsLoaded()}, IsReady: {IsReady()}."); - } - } - - public void Destroy() - { - if (_AdLoadListener != null) - { - _AdLoadListener.Destory(); - _AdLoadListener = null; - } - - if (_InterstitialAdListener != null) - { - _InterstitialAdListener.Destory(); - } - - _KwaiInterstitialAd = null; - } - - public bool IsLoaded() - { - return _KwaiInterstitialAd != null; - } - - public bool IsReady() - { - return IsLoaded() && _KwaiInterstitialAd.Call("isReady"); - } - - public void NotifyLoss() - { - if (_KwaiInterstitialAd != null) - { - _KwaiInterstitialAd.Call("getBidController", "sendBidLose"); - } - } - - public void NotifyWin() - { - if (_KwaiInterstitialAd != null) - { - _KwaiInterstitialAd.Call("getBidController", "sendBidWin"); - } - } - - private class AdLoadListener : AndroidJavaProxy - { - private IInterstitialAdLoadListener _InterstitialAdLoadListener; - private KwaiInterstitialAdController _KwaiInterstitialAdController; - public AdLoadListener(IInterstitialAdLoadListener interstitialAdLoadListener, KwaiInterstitialAdController kwaiInterstitialAdController) : base(AdLoadListenerClassName) - { - this._InterstitialAdLoadListener = interstitialAdLoadListener; - this._KwaiInterstitialAdController = kwaiInterstitialAdController; - } - - public void onAdLoadStart(string trackId) - { - Debug.Log($"{TAG}: onAdLoadStart"); - if (_InterstitialAdLoadListener != null) - { - _InterstitialAdLoadListener.OnAdLoadStart(trackId); - } - } - - public void onAdLoadSuccess(string trackId, AndroidJavaObject kwaiInterstitialAd) - { - if (string.IsNullOrEmpty(trackId) || kwaiInterstitialAd == null || _InterstitialAdLoadListener == null) return; - _KwaiInterstitialAdController._KwaiInterstitialAd = kwaiInterstitialAd; - string price = kwaiInterstitialAd.Call("getPrice"); - Debug.Log($"{TAG}: onAdLoaded: {kwaiInterstitialAd.Call("getPrice")}"); - if (_InterstitialAdLoadListener != null) - { - _InterstitialAdLoadListener.OnAdLoadSuccess(trackId, price); - } - } - - public void onAdLoadFailed(string trackId, AndroidJavaObject kwaiError) - { - int code = kwaiError.Call("getCode"); - string msg = kwaiError.Call("getMsg"); - Debug.LogError($"{TAG}: onAdLoadFailed code = {code} msg = {msg}"); - if (_InterstitialAdLoadListener != null) - { - _InterstitialAdLoadListener.OnAdLoadFailed(trackId, code, msg); - } - } - - public void Destory() - { - _InterstitialAdLoadListener = null; - _KwaiInterstitialAdController = null; - } - } - - private class InterstitialAdListener : AndroidJavaProxy - { - private IInterstitialAdListener _InterstitialAdListener; - - public InterstitialAdListener(IInterstitialAdListener interstitialAdListener) : base(KwaiInterstitialAdListenerClassName) - { - _InterstitialAdListener = interstitialAdListener; - } - - public void onAdShow() - { - Debug.Log($"{TAG}: onAdShow"); - if (_InterstitialAdListener != null) - { - _InterstitialAdListener.OnAdShow(); - } - } - - public void onAdShowFailed(AndroidJavaObject error) - { - int code = error.Call("getCode"); - string msg = error.Call("getMsg"); - Debug.LogError($"{TAG}: onAdShowFailed code = {code} msg = {msg}"); - if (_InterstitialAdListener != null) - { - _InterstitialAdListener.OnAdShowFailed(code, msg); - } - } - - public void onAdClick() - { - Debug.Log($"{TAG}: onAdClick"); - if (_InterstitialAdListener != null) - { - _InterstitialAdListener.OnAdClick(); - } - } - - public void onAdClose() - { - Debug.Log($"{TAG}: onAdClose"); - if (_InterstitialAdListener != null) - { - _InterstitialAdListener.OnAdClose(); - } - } - - public void onAdPlayComplete() - { - Debug.Log($"{TAG}: onAdPlayComplete"); - if (_InterstitialAdListener != null) - { - _InterstitialAdListener.OnAdPlayComplete(); - } - } - - public void Destory() - { - _InterstitialAdListener = null; - } - } - } -} -#endif \ No newline at end of file diff --git a/Assets/KwaiAds/Scripts/Platform/Android/KwaiInterstitialAdController.cs.meta b/Assets/KwaiAds/Scripts/Platform/Android/KwaiInterstitialAdController.cs.meta deleted file mode 100644 index c7e4bd3..0000000 --- a/Assets/KwaiAds/Scripts/Platform/Android/KwaiInterstitialAdController.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: 0981c7bc6c3f9404e8effcfa265e2632 -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Assets/KwaiAds/Scripts/Platform/Android/KwaiRewardAdController.cs b/Assets/KwaiAds/Scripts/Platform/Android/KwaiRewardAdController.cs deleted file mode 100644 index 4b09ac0..0000000 --- a/Assets/KwaiAds/Scripts/Platform/Android/KwaiRewardAdController.cs +++ /dev/null @@ -1,249 +0,0 @@ -#if UNITY_ANDROID -using BigoAds.Scripts.Platforms.Android; -using KwaiAds.Scripts.Api; -using KwaiAds.Scripts.Api.Reward; -using UnityEngine; - -namespace KwaiAds.Scripts.Platforms.Android -{ - public class KwaiRewardAdController : IRewardAdController - { - private const string TAG = "[KwaiAdSDK-RewardAdController]"; - private const string RewardedAdConfigBuilderClassName = KwaiAndroidPlatformTool.ClassPackage + ".loader.business.reward.data.KwaiRewardAdConfig$Builder"; - private const string KwaiRewardAdListenerClassName = KwaiAndroidPlatformTool.ClassPackage + ".loader.business.reward.interf.IKwaiRewardAdListener"; - private const string AdLoadListenerClassName = KwaiAndroidPlatformTool.ClassPackage + ".loader.common.interf.AdLoadListener"; - private const string KwaiRewardAdRequestClassName = KwaiAndroidPlatformTool.ClassPackage + ".loader.business.reward.data.KwaiRewardAdRequest"; - private const string KwaiAdLoaderManagerMethodName = "getKwaiAdLoaderManager"; - private const string WithKwaiRewardAdListenerMethodName = "withKwaiRewardAdListener"; - private const string BuildRewardAdLoaderMethodName = "buildRewardAdLoader"; - - private AndroidJavaClass _KwaiAdSDKInit; - private AdLoadListener _AdLoadListener; - private RewardAdListener _RewardAdListener; - private AndroidJavaObject _KwaiRewardAd; - - public bool Load(KwaiRewardAdRequest request, IRewardAdListener rewardAdListener, IRewardAdLoadListener rewardAdLoadListener) - { - _KwaiAdSDKInit = Android.KwaiAdSDKInit.Instance.GetKwaiAdSDKClass(); - if (_KwaiAdSDKInit == null) - { - Debug.Log($"{TAG}: kwaiAdSDKInit is null."); - return false; - } - - var loaderManager = _KwaiAdSDKInit.CallStatic(KwaiAdLoaderManagerMethodName); - if (loaderManager == null) - { - Debug.Log($"{TAG}: loaderManager is null."); - return false; - } - else - { - _AdLoadListener = new AdLoadListener(rewardAdLoadListener, this); - _RewardAdListener = new RewardAdListener(rewardAdListener); - var kwaiRewardAdConfig = new AndroidJavaObject(RewardedAdConfigBuilderClassName, _AdLoadListener); - if (kwaiRewardAdConfig == null) - { - Debug.LogError($"{TAG}:Failed to create kwaiRewardAdConfig builder."); - return false; - } - kwaiRewardAdConfig.Call(WithKwaiRewardAdListenerMethodName, _RewardAdListener); - - var kwaiRewardAdAdLoader = loaderManager.Call(BuildRewardAdLoaderMethodName, kwaiRewardAdConfig.Call("build")); - var adRequest = new AndroidJavaObject(KwaiRewardAdRequestClassName, request.TagId); - string floorPrice = request.ExtParams[Constants.Request.BID_FLOOR_PRICE]; - if (floorPrice != null && floorPrice.Length != 0) - { - Debug.Log($"{TAG}: floorPrice: {floorPrice}."); - adRequest.Get("extParams").Call("put", Constants.Request.BID_FLOOR_PRICE, floorPrice); - } - kwaiRewardAdAdLoader.Call("loadAd", adRequest); - } - return true; - } - - public void Show() - { - if (IsReady()) - { - AndroidJavaObject currentActivity = KwaiAndroidPlatformTool.GetGameActivity(); - if (currentActivity == null) - { - Debug.Log($"{TAG}: Current Game Activity not found."); - } - else - { - Debug.Log($"{TAG}: start showing."); - _KwaiRewardAd.Call("show", currentActivity); - } - - } - else - { - Debug.Log($"{TAG}: IsLoaded: {IsLoaded()}, IsReady: {IsReady()}."); - } - } - - public void Destroy() - { - if (_AdLoadListener != null) - { - _AdLoadListener.Destory(); - _AdLoadListener = null; - } - - if (_RewardAdListener != null) - { - _RewardAdListener.Destory(); - } - - _KwaiRewardAd = null; - } - - public bool IsLoaded() - { - return _KwaiRewardAd != null; - } - - public bool IsReady() - { - return IsLoaded() && _KwaiRewardAd.Call("isReady"); - } - - public void NotifyLoss() - { - if (_KwaiRewardAd != null) - { - _KwaiRewardAd.Call("getBidController", "sendBidLose"); - } - } - - public void NotifyWin() - { - if (_KwaiRewardAd != null) - { - _KwaiRewardAd.Call("getBidController", "sendBidWin"); - } - } - - private class AdLoadListener : AndroidJavaProxy - { - private IRewardAdLoadListener _RewardAdLoadListener; - private KwaiRewardAdController _KwaiRewardAdController; - public AdLoadListener(IRewardAdLoadListener rewardAdListener, KwaiRewardAdController kwaiRewardAdController) : base(AdLoadListenerClassName) - { - this._RewardAdLoadListener = rewardAdListener; - this._KwaiRewardAdController = kwaiRewardAdController; - } - - public void onAdLoadStart(string trackId) - { - Debug.Log($"{TAG}: onAdLoadStart"); - if (_RewardAdLoadListener != null) - { - _RewardAdLoadListener.OnAdLoadStart(trackId); - } - } - - public void onAdLoadSuccess(string trackId, AndroidJavaObject kwaiRewardAd) - { - if (string.IsNullOrEmpty(trackId) || kwaiRewardAd == null || _KwaiRewardAdController == null) return; - _KwaiRewardAdController._KwaiRewardAd = kwaiRewardAd; - string price = kwaiRewardAd.Call("getPrice"); - Debug.Log($"{TAG}: onAdLoaded: {kwaiRewardAd.Call("getPrice")}"); - if (_RewardAdLoadListener != null) - { - _RewardAdLoadListener.OnAdLoadSuccess(trackId, price); - } - } - - public void onAdLoadFailed(string trackId, AndroidJavaObject kwaiError) - { - int code = kwaiError.Call("getCode"); - string msg = kwaiError.Call("getMsg"); - Debug.LogError($"{TAG}: onAdLoadFailed code = {code} msg = {msg}"); - if (_RewardAdLoadListener != null) - { - _RewardAdLoadListener.OnAdLoadFailed(trackId, code, msg); - } - } - - public void Destory() - { - _RewardAdLoadListener = null; - _KwaiRewardAdController = null; - } - } - - private class RewardAdListener : AndroidJavaProxy - { - private IRewardAdListener _RewardAdListener; - - public RewardAdListener(IRewardAdListener rewardAdListener) : base(KwaiRewardAdListenerClassName) { - _RewardAdListener = rewardAdListener; - } - - public void onAdShow() - { - Debug.Log($"{TAG}: onAdShow"); - if (_RewardAdListener != null) - { - _RewardAdListener.OnAdShow(); - } - } - - public void onAdShowFailed(AndroidJavaObject error) - { - int code = error.Call("getCode"); - string msg = error.Call("getMsg"); - Debug.LogError($"{TAG}: onAdShowFailed code = {code} msg = {msg}"); - if (_RewardAdListener != null) - { - _RewardAdListener.OnAdShowFailed(code, msg); - } - } - - public void onAdClick() - { - Debug.Log($"{TAG}: onAdClick"); - if (_RewardAdListener != null) - { - _RewardAdListener.OnAdClick(); - } - } - - public void onAdPlayComplete() - { - Debug.Log($"{TAG}: onAdPlayComplete"); - if (_RewardAdListener != null) - { - _RewardAdListener.OnAdPlayComplete(); - } - } - - public void onRewardEarned() - { - Debug.Log($"{TAG}: onRewarded"); - if (_RewardAdListener != null) - { - _RewardAdListener.OnRewardEarned(); - } - } - - public void onAdClose() - { - Debug.Log($"{TAG}: onAdClose"); - if (_RewardAdListener != null) - { - _RewardAdListener.OnAdClose(); - } - } - - public void Destory() - { - _RewardAdListener = null; - } - } - } -} -#endif \ No newline at end of file diff --git a/Assets/KwaiAds/Scripts/Platform/Android/KwaiRewardAdController.cs.meta b/Assets/KwaiAds/Scripts/Platform/Android/KwaiRewardAdController.cs.meta deleted file mode 100644 index 0e96584..0000000 --- a/Assets/KwaiAds/Scripts/Platform/Android/KwaiRewardAdController.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: ac60b4b82a68d4feb811961ea98ad413 -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Assets/KwaiAds/Scripts/Platform/Android/KwaiSdkClient.cs b/Assets/KwaiAds/Scripts/Platform/Android/KwaiSdkClient.cs deleted file mode 100644 index 1ee4d17..0000000 --- a/Assets/KwaiAds/Scripts/Platform/Android/KwaiSdkClient.cs +++ /dev/null @@ -1,27 +0,0 @@ -#if UNITY_ANDROID -using KwaiAds.Scripts.Api; -using KwaiAds.Scripts.Api.Interstitial; -using KwaiAds.Scripts.Api.Reward; -using KwaiAds.Scripts.Common; - -namespace KwaiAds.Scripts.Platforms.Android -{ - public class KwaiSdkClient: ISDK - { - public void Init(KwaiAdConfig config, InitResultCallback initResultCallback) - { - KwaiAdSDKInit.Initialize(config, initResultCallback); - } - - public IRewardAdController getRewardAdController() - { - return new KwaiRewardAdController(); - } - - public IInterstitialAdController getInterstitialAdController() - { - return new KwaiInterstitialAdController(); - } - } -} -#endif \ No newline at end of file diff --git a/Assets/KwaiAds/Scripts/Platform/Android/KwaiSdkClient.cs.meta b/Assets/KwaiAds/Scripts/Platform/Android/KwaiSdkClient.cs.meta deleted file mode 100644 index 133e3b2..0000000 --- a/Assets/KwaiAds/Scripts/Platform/Android/KwaiSdkClient.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: 440ab8edeedf747c48701c4009831273 -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Assets/MaxSdk.meta b/Assets/MaxSdk.meta deleted file mode 100644 index 112b305..0000000 --- a/Assets/MaxSdk.meta +++ /dev/null @@ -1,8 +0,0 @@ -fileFormatVersion: 2 -guid: 2d216a0b84c904a88a10298f917ba2cd -folderAsset: yes -DefaultImporter: - externalObjects: {} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Assets/MaxSdk/AppLovin.meta b/Assets/MaxSdk/AppLovin.meta deleted file mode 100644 index 2129078..0000000 --- a/Assets/MaxSdk/AppLovin.meta +++ /dev/null @@ -1,8 +0,0 @@ -fileFormatVersion: 2 -guid: 79c57f6056b814a999d4ffd4d2946e01 -folderAsset: yes -DefaultImporter: - externalObjects: {} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Assets/MaxSdk/AppLovin/Editor.meta b/Assets/MaxSdk/AppLovin/Editor.meta deleted file mode 100644 index 68829d8..0000000 --- a/Assets/MaxSdk/AppLovin/Editor.meta +++ /dev/null @@ -1,8 +0,0 @@ -fileFormatVersion: 2 -guid: 231b46ea1453e421ca13827c9289af31 -folderAsset: yes -DefaultImporter: - externalObjects: {} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Assets/MaxSdk/AppLovin/Editor/Dependencies.xml b/Assets/MaxSdk/AppLovin/Editor/Dependencies.xml deleted file mode 100644 index 6afe371..0000000 --- a/Assets/MaxSdk/AppLovin/Editor/Dependencies.xml +++ /dev/null @@ -1,9 +0,0 @@ - - - - - - - - - diff --git a/Assets/MaxSdk/AppLovin/Editor/Dependencies.xml.meta b/Assets/MaxSdk/AppLovin/Editor/Dependencies.xml.meta deleted file mode 100644 index 3360fd3..0000000 --- a/Assets/MaxSdk/AppLovin/Editor/Dependencies.xml.meta +++ /dev/null @@ -1,10 +0,0 @@ -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 deleted file mode 100644 index f556718..0000000 --- a/Assets/MaxSdk/AppLovin/Plugins.meta +++ /dev/null @@ -1,8 +0,0 @@ -fileFormatVersion: 2 -guid: 08b49ba194f43487398896a722dc111a -folderAsset: yes -DefaultImporter: - externalObjects: {} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Assets/MaxSdk/AppLovin/Plugins/Android.meta b/Assets/MaxSdk/AppLovin/Plugins/Android.meta deleted file mode 100644 index d2cbee9..0000000 --- a/Assets/MaxSdk/AppLovin/Plugins/Android.meta +++ /dev/null @@ -1,8 +0,0 @@ -fileFormatVersion: 2 -guid: 4054ff186f3d14e4ba68a803fd7b933e -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 deleted file mode 100644 index ef1e929edeab25a33d861e12743f78789368952f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 42483 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≦a$FikX8;{p$*z;L;zFc9U5Oo+j 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 P{6|&(aQ(RA|J?l#{U -#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 deleted file mode 100644 index aef1db5..0000000 --- a/Assets/MaxSdk/AppLovin/Plugins/iOS/MAUnityAdManager.h.meta +++ /dev/null @@ -1,115 +0,0 @@ -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 deleted file mode 100644 index a7bd666..0000000 --- a/Assets/MaxSdk/AppLovin/Plugins/iOS/MAUnityAdManager.m +++ /dev/null @@ -1,2067 +0,0 @@ -// -// 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 deleted file mode 100644 index 8c3581e..0000000 --- a/Assets/MaxSdk/AppLovin/Plugins/iOS/MAUnityAdManager.m.meta +++ /dev/null @@ -1,109 +0,0 @@ -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 deleted file mode 100644 index f31184a..0000000 --- a/Assets/MaxSdk/AppLovin/Plugins/iOS/MAUnityPlugin.mm +++ /dev/null @@ -1,1081 +0,0 @@ -// -// MAUnityPlugin.mm -// AppLovin MAX Unity Plugin -// - -#pragma clang diagnostic push -#pragma clang diagnostic ignored "-Wdeprecated-declarations" - -#import "MAUnityAdManager.h" - -#define VERSION @"8.3.1" -#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 deleted file mode 100644 index 5ea08ff..0000000 --- a/Assets/MaxSdk/AppLovin/Plugins/iOS/MAUnityPlugin.mm.meta +++ /dev/null @@ -1,109 +0,0 @@ -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 deleted file mode 100644 index 6153543..0000000 --- a/Assets/MaxSdk/CHANGELOG.md +++ /dev/null @@ -1,3 +0,0 @@ -# AppLovin MAX Unity Plugin - -To get the latest changes, see the [AppLovin MAX Unity Changelog](https://developers.applovin.com/en/max/unity/changelog). diff --git a/Assets/MaxSdk/CHANGELOG.md.meta b/Assets/MaxSdk/CHANGELOG.md.meta deleted file mode 100644 index 6d06bcb..0000000 --- a/Assets/MaxSdk/CHANGELOG.md.meta +++ /dev/null @@ -1,10 +0,0 @@ -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 deleted file mode 100644 index 103dd6f..0000000 --- a/Assets/MaxSdk/Mediation.meta +++ /dev/null @@ -1,11 +0,0 @@ -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/BigoAds.meta b/Assets/MaxSdk/Mediation/BigoAds.meta deleted file mode 100644 index c290a4a..0000000 --- a/Assets/MaxSdk/Mediation/BigoAds.meta +++ /dev/null @@ -1,8 +0,0 @@ -fileFormatVersion: 2 -guid: 8e54ef9b3c383471cbff279efe591702 -folderAsset: yes -DefaultImporter: - externalObjects: {} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Assets/MaxSdk/Mediation/BigoAds/Editor.meta b/Assets/MaxSdk/Mediation/BigoAds/Editor.meta deleted file mode 100644 index 39a3140..0000000 --- a/Assets/MaxSdk/Mediation/BigoAds/Editor.meta +++ /dev/null @@ -1,11 +0,0 @@ -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 deleted file mode 100644 index 8ede496..0000000 --- a/Assets/MaxSdk/Mediation/BigoAds/Editor/Dependencies.xml +++ /dev/null @@ -1,9 +0,0 @@ - - - - - - - - - diff --git a/Assets/MaxSdk/Mediation/BigoAds/Editor/Dependencies.xml.meta b/Assets/MaxSdk/Mediation/BigoAds/Editor/Dependencies.xml.meta deleted file mode 100644 index 521ce00..0000000 --- a/Assets/MaxSdk/Mediation/BigoAds/Editor/Dependencies.xml.meta +++ /dev/null @@ -1,10 +0,0 @@ -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 deleted file mode 100644 index 3243df3..0000000 --- a/Assets/MaxSdk/Mediation/ByteDance.meta +++ /dev/null @@ -1,8 +0,0 @@ -fileFormatVersion: 2 -guid: 43e300dce912446d9b55a6b6d605f863 -folderAsset: yes -DefaultImporter: - externalObjects: {} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Assets/MaxSdk/Mediation/ByteDance/Editor.meta b/Assets/MaxSdk/Mediation/ByteDance/Editor.meta deleted file mode 100644 index e54a766..0000000 --- a/Assets/MaxSdk/Mediation/ByteDance/Editor.meta +++ /dev/null @@ -1,11 +0,0 @@ -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 deleted file mode 100644 index 0a07212..0000000 --- a/Assets/MaxSdk/Mediation/ByteDance/Editor/Dependencies.xml +++ /dev/null @@ -1,13 +0,0 @@ - - - - - - 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 deleted file mode 100644 index 5205233..0000000 --- a/Assets/MaxSdk/Mediation/ByteDance/Editor/Dependencies.xml.meta +++ /dev/null @@ -1,10 +0,0 @@ -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/Fyber.meta b/Assets/MaxSdk/Mediation/Fyber.meta deleted file mode 100644 index 913c132..0000000 --- a/Assets/MaxSdk/Mediation/Fyber.meta +++ /dev/null @@ -1,8 +0,0 @@ -fileFormatVersion: 2 -guid: 61a57c7ea96624f62b6d255abbeea40e -folderAsset: yes -DefaultImporter: - externalObjects: {} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Assets/MaxSdk/Mediation/Fyber/Editor.meta b/Assets/MaxSdk/Mediation/Fyber/Editor.meta deleted file mode 100644 index 315e8c8..0000000 --- a/Assets/MaxSdk/Mediation/Fyber/Editor.meta +++ /dev/null @@ -1,11 +0,0 @@ -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 deleted file mode 100644 index 36e6e27..0000000 --- a/Assets/MaxSdk/Mediation/Fyber/Editor/Dependencies.xml +++ /dev/null @@ -1,9 +0,0 @@ - - - - - - - - - diff --git a/Assets/MaxSdk/Mediation/Fyber/Editor/Dependencies.xml.meta b/Assets/MaxSdk/Mediation/Fyber/Editor/Dependencies.xml.meta deleted file mode 100644 index fd0bbbf..0000000 --- a/Assets/MaxSdk/Mediation/Fyber/Editor/Dependencies.xml.meta +++ /dev/null @@ -1,10 +0,0 @@ -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 deleted file mode 100644 index acc0fab..0000000 --- a/Assets/MaxSdk/Mediation/Google.meta +++ /dev/null @@ -1,8 +0,0 @@ -fileFormatVersion: 2 -guid: 7ed9d3af4a4af44bbae8b9b358d2ab9a -folderAsset: yes -DefaultImporter: - externalObjects: {} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Assets/MaxSdk/Mediation/Google/Editor.meta b/Assets/MaxSdk/Mediation/Google/Editor.meta deleted file mode 100644 index ea8dd55..0000000 --- a/Assets/MaxSdk/Mediation/Google/Editor.meta +++ /dev/null @@ -1,11 +0,0 @@ -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 deleted file mode 100644 index 63452cc..0000000 --- a/Assets/MaxSdk/Mediation/Google/Editor/Dependencies.xml +++ /dev/null @@ -1,10 +0,0 @@ - - - - - - - - - - diff --git a/Assets/MaxSdk/Mediation/Google/Editor/Dependencies.xml.meta b/Assets/MaxSdk/Mediation/Google/Editor/Dependencies.xml.meta deleted file mode 100644 index 36bef72..0000000 --- a/Assets/MaxSdk/Mediation/Google/Editor/Dependencies.xml.meta +++ /dev/null @@ -1,10 +0,0 @@ -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 deleted file mode 100644 index b893864..0000000 --- a/Assets/MaxSdk/Mediation/GoogleAdManager.meta +++ /dev/null @@ -1,8 +0,0 @@ -fileFormatVersion: 2 -guid: cbf2880cd0e904084bbdb125e06e3ec8 -folderAsset: yes -DefaultImporter: - externalObjects: {} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Assets/MaxSdk/Mediation/GoogleAdManager/Editor.meta b/Assets/MaxSdk/Mediation/GoogleAdManager/Editor.meta deleted file mode 100644 index 7b0912c..0000000 --- a/Assets/MaxSdk/Mediation/GoogleAdManager/Editor.meta +++ /dev/null @@ -1,11 +0,0 @@ -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 deleted file mode 100644 index 7e46e08..0000000 --- a/Assets/MaxSdk/Mediation/GoogleAdManager/Editor/Dependencies.xml +++ /dev/null @@ -1,10 +0,0 @@ - - - - - - - - - - diff --git a/Assets/MaxSdk/Mediation/GoogleAdManager/Editor/Dependencies.xml.meta b/Assets/MaxSdk/Mediation/GoogleAdManager/Editor/Dependencies.xml.meta deleted file mode 100644 index 71b0087..0000000 --- a/Assets/MaxSdk/Mediation/GoogleAdManager/Editor/Dependencies.xml.meta +++ /dev/null @@ -1,10 +0,0 @@ -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/MediationAdapters.txt b/Assets/MaxSdk/Mediation/MediationAdapters.txt deleted file mode 100644 index 40f94d0..0000000 --- a/Assets/MaxSdk/Mediation/MediationAdapters.txt +++ /dev/null @@ -1,2 +0,0 @@ -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 deleted file mode 100644 index 41fb994..0000000 --- a/Assets/MaxSdk/Mediation/MediationAdapters.txt.meta +++ /dev/null @@ -1,6 +0,0 @@ -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 deleted file mode 100644 index ba7f671..0000000 --- a/Assets/MaxSdk/Mediation/Mintegral.meta +++ /dev/null @@ -1,8 +0,0 @@ -fileFormatVersion: 2 -guid: 2b675df2ca27e4ee6a573411e6023520 -folderAsset: yes -DefaultImporter: - externalObjects: {} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Assets/MaxSdk/Mediation/Mintegral/Editor.meta b/Assets/MaxSdk/Mediation/Mintegral/Editor.meta deleted file mode 100644 index d189ce0..0000000 --- a/Assets/MaxSdk/Mediation/Mintegral/Editor.meta +++ /dev/null @@ -1,11 +0,0 @@ -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 deleted file mode 100644 index dd8b881..0000000 --- a/Assets/MaxSdk/Mediation/Mintegral/Editor/Dependencies.xml +++ /dev/null @@ -1,14 +0,0 @@ - - - - - - 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 deleted file mode 100644 index 415c4ab..0000000 --- a/Assets/MaxSdk/Mediation/Mintegral/Editor/Dependencies.xml.meta +++ /dev/null @@ -1,10 +0,0 @@ -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 deleted file mode 100644 index 1c7f239..0000000 --- a/Assets/MaxSdk/Mediation/Moloco.meta +++ /dev/null @@ -1,8 +0,0 @@ -fileFormatVersion: 2 -guid: 25d39f128833749aaa3c51b44fb57f07 -folderAsset: yes -DefaultImporter: - externalObjects: {} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Assets/MaxSdk/Mediation/Moloco/Editor.meta b/Assets/MaxSdk/Mediation/Moloco/Editor.meta deleted file mode 100644 index 952b969..0000000 --- a/Assets/MaxSdk/Mediation/Moloco/Editor.meta +++ /dev/null @@ -1,11 +0,0 @@ -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 deleted file mode 100644 index 168927f..0000000 --- a/Assets/MaxSdk/Mediation/Moloco/Editor/Dependencies.xml +++ /dev/null @@ -1,9 +0,0 @@ - - - - - - - - - diff --git a/Assets/MaxSdk/Mediation/Moloco/Editor/Dependencies.xml.meta b/Assets/MaxSdk/Mediation/Moloco/Editor/Dependencies.xml.meta deleted file mode 100644 index e066a5f..0000000 --- a/Assets/MaxSdk/Mediation/Moloco/Editor/Dependencies.xml.meta +++ /dev/null @@ -1,10 +0,0 @@ -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 deleted file mode 100644 index cdd0aaf..0000000 --- a/Assets/MaxSdk/Mediation/UnityAds.meta +++ /dev/null @@ -1,8 +0,0 @@ -fileFormatVersion: 2 -guid: b740f89702a474b0ca129c951f48b682 -folderAsset: yes -DefaultImporter: - externalObjects: {} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Assets/MaxSdk/Mediation/UnityAds/Editor.meta b/Assets/MaxSdk/Mediation/UnityAds/Editor.meta deleted file mode 100644 index b66e846..0000000 --- a/Assets/MaxSdk/Mediation/UnityAds/Editor.meta +++ /dev/null @@ -1,11 +0,0 @@ -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 deleted file mode 100644 index 993a288..0000000 --- a/Assets/MaxSdk/Mediation/UnityAds/Editor/Dependencies.xml +++ /dev/null @@ -1,9 +0,0 @@ - - - - - - - - - diff --git a/Assets/MaxSdk/Mediation/UnityAds/Editor/Dependencies.xml.meta b/Assets/MaxSdk/Mediation/UnityAds/Editor/Dependencies.xml.meta deleted file mode 100644 index 937df6e..0000000 --- a/Assets/MaxSdk/Mediation/UnityAds/Editor/Dependencies.xml.meta +++ /dev/null @@ -1,10 +0,0 @@ -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 deleted file mode 100644 index f5d09b9..0000000 --- a/Assets/MaxSdk/Mediation/Vungle.meta +++ /dev/null @@ -1,8 +0,0 @@ -fileFormatVersion: 2 -guid: 3abedb062e5ab47939dc811a59a7aeaf -folderAsset: yes -DefaultImporter: - externalObjects: {} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Assets/MaxSdk/Mediation/Vungle/Editor.meta b/Assets/MaxSdk/Mediation/Vungle/Editor.meta deleted file mode 100644 index 1ea75cc..0000000 --- a/Assets/MaxSdk/Mediation/Vungle/Editor.meta +++ /dev/null @@ -1,11 +0,0 @@ -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 deleted file mode 100644 index 4bb990d..0000000 --- a/Assets/MaxSdk/Mediation/Vungle/Editor/Dependencies.xml +++ /dev/null @@ -1,9 +0,0 @@ - - - - - - - - - diff --git a/Assets/MaxSdk/Mediation/Vungle/Editor/Dependencies.xml.meta b/Assets/MaxSdk/Mediation/Vungle/Editor/Dependencies.xml.meta deleted file mode 100644 index 7038186..0000000 --- a/Assets/MaxSdk/Mediation/Vungle/Editor/Dependencies.xml.meta +++ /dev/null @@ -1,10 +0,0 @@ -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 deleted file mode 100644 index 901c9e9..0000000 --- a/Assets/MaxSdk/Prefabs.meta +++ /dev/null @@ -1,8 +0,0 @@ -fileFormatVersion: 2 -guid: 672665b4fb8ab47bf83309f9ad3f523d -folderAsset: yes -DefaultImporter: - externalObjects: {} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Assets/MaxSdk/Prefabs/BannerBottom.prefab b/Assets/MaxSdk/Prefabs/BannerBottom.prefab deleted file mode 100644 index bba7ac6..0000000 --- a/Assets/MaxSdk/Prefabs/BannerBottom.prefab +++ /dev/null @@ -1,402 +0,0 @@ -%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 deleted file mode 100644 index 153cfcf..0000000 --- a/Assets/MaxSdk/Prefabs/BannerBottom.prefab.meta +++ /dev/null @@ -1,10 +0,0 @@ -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 deleted file mode 100644 index 25d5f49..0000000 --- a/Assets/MaxSdk/Prefabs/BannerTop.prefab +++ /dev/null @@ -1,402 +0,0 @@ -%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 deleted file mode 100644 index 52ef464..0000000 --- a/Assets/MaxSdk/Prefabs/BannerTop.prefab.meta +++ /dev/null @@ -1,10 +0,0 @@ -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 deleted file mode 100644 index 10c7c7b..0000000 --- a/Assets/MaxSdk/Prefabs/Interstitial.prefab +++ /dev/null @@ -1,523 +0,0 @@ -%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 deleted file mode 100644 index 4fa240b..0000000 --- a/Assets/MaxSdk/Prefabs/Interstitial.prefab.meta +++ /dev/null @@ -1,10 +0,0 @@ -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 deleted file mode 100644 index dd3457e..0000000 --- a/Assets/MaxSdk/Prefabs/Rewarded.prefab +++ /dev/null @@ -1,795 +0,0 @@ -%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 deleted file mode 100644 index 214bea1..0000000 --- a/Assets/MaxSdk/Prefabs/Rewarded.prefab.meta +++ /dev/null @@ -1,10 +0,0 @@ -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 deleted file mode 100644 index 37eb399..0000000 --- a/Assets/MaxSdk/Resources.meta +++ /dev/null @@ -1,8 +0,0 @@ -fileFormatVersion: 2 -guid: cbca9b52b4ef44acea8d9a60d020e2ac -folderAsset: yes -DefaultImporter: - externalObjects: {} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Assets/MaxSdk/Resources/AppLovinSettings.asset b/Assets/MaxSdk/Resources/AppLovinSettings.asset deleted file mode 100644 index 6f40b36..0000000 --- a/Assets/MaxSdk/Resources/AppLovinSettings.asset +++ /dev/null @@ -1,20 +0,0 @@ -%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: - customGradleVersionUrl: - customGradleToolsVersion: - adMobAndroidAppId: - adMobIosAppId: diff --git a/Assets/MaxSdk/Resources/AppLovinSettings.asset.meta b/Assets/MaxSdk/Resources/AppLovinSettings.asset.meta deleted file mode 100644 index d343332..0000000 --- a/Assets/MaxSdk/Resources/AppLovinSettings.asset.meta +++ /dev/null @@ -1,8 +0,0 @@ -fileFormatVersion: 2 -guid: 510c93902e94f4592985c4ca8f5501ca -NativeFormatImporter: - externalObjects: {} - mainObjectFileID: 11400000 - userData: - assetBundleName: - assetBundleVariant: diff --git a/Assets/MaxSdk/Resources/Images.meta b/Assets/MaxSdk/Resources/Images.meta deleted file mode 100644 index df7ef8e..0000000 --- a/Assets/MaxSdk/Resources/Images.meta +++ /dev/null @@ -1,8 +0,0 @@ -fileFormatVersion: 2 -guid: 2176a004bd57f4a939538db9ed19bffc -folderAsset: yes -DefaultImporter: - externalObjects: {} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Assets/MaxSdk/Resources/Images/alert_icon.png b/Assets/MaxSdk/Resources/Images/alert_icon.png deleted file mode 100644 index 16519508598871e52f379050d7075a4aff309327..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1154 zcmeAS@N?(olHy`uVBq!ia0vp^1|ZDA1|-9oezpTCmUKs7M+SzC{oH>NS%G|oWRD45dJguM!v-tY$DUh!@P+6=(yLU`z6LcLCBs@Y8vBJ&@uo z@Q5sCVBk9f!i-b3`J@>bnBzTN978hhy`6c`|8juL@%{VP-R?MeIDntc;3Jc_*$WSG zTjxD1#BFsXE*^2wWAXUI-g8mny_>s=${dBj4+}c0jQ%jDnMOZ%5#w_U_kPX)$zAL8O-&9QpEobK zvFN8F^L7T7IW{Z|vl-NwH`Qzpz8v;S&Y}P4I^oa447z+r%Mb1GI^Ypf%-g%~0EGDo4E2_C=)s)SYo(^v^$+n9F7|>>evu?f2}s z&O77cvclifx$W%<=tYwS6{F3PO?=x>I$ zvwpMcm}kCwXO=v{Nxa~~xP7X;YR15M@%7e~qD(I~^D->jaedLWoVBK_*b^2U&i41Nf97|a zVawJ@Rx3hw%>3&%JNv~6?Y`?m5B49@Ik4+`Q0R}nza5UobTp0S0S zc8_Xg^WJdzY)O!2IHS4Vb**s7u22>Y=Hj^OC`G~09iciI5)&2aoD!#L)D)}B~JUHh_*wHr&0u1J870;A4$(lMjE;`@& zfQ!!LpNWO%=ESI63YzwmwPNpz^f=xhe-l@`?tL1fH0ktO!Ots}e`1K3)V4~rcJ;Z| z9;eqk(my$DvYtC{?X_cNM&|b~8uC1t%Kk4u+9a*$ym_7+oHME8nbONG&yJbB7Ic>>`^TV_uBge}XWIqL zf2t*}5hW>!C8<`)MX5lF!N|bKK-bVf*T^Wuz|hLX(8|N&PEETh{4m<&t;uc GLK6TeaNqp^ diff --git a/Assets/MaxSdk/Resources/Images/alert_icon.png.meta b/Assets/MaxSdk/Resources/Images/alert_icon.png.meta deleted file mode 100644 index 634d290..0000000 --- a/Assets/MaxSdk/Resources/Images/alert_icon.png.meta +++ /dev/null @@ -1,94 +0,0 @@ -fileFormatVersion: 2 -guid: 572fee4574afa4f6dbf2846e0c152fe8 -labels: -- al_max -- al_max_export_path-MaxSdk/Resources/Images/alert_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/uninstall_icon.png b/Assets/MaxSdk/Resources/Images/uninstall_icon.png deleted file mode 100755 index 3b55354103e9a1717b1056e56871a667a98d106b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 159 zcmeAS@N?(olHy`uVBq!ia0vp^2_VeG3?%1&o4*=JaR&H=xB_ViXik240LWr03GxeO z$X`8g<3}LR+0(@_q=GS7fw_liWvIgjmTng@k0jM)7LTNS%G|oWRD45dJguM!v-tY$DUh!@P+6=(yLU`z6LcLCBs@Y8vBJ&@uo z@Q5r1(g|SvA=~LZ0|V1RPZ!6KjC*gVpUoC_lxdrP(`4&0lT_d+t_+ABB_LE;hGkN#|ah@PEPoRu6AGE-s}gTTz>i1sp+Zmfie#!R^ws z>`m5_t8P5E*nRW+_jA&1l?RU>KQ6ITWbsY$Ip!-BeQGN-eK$P$Aja`U%(5t9(tWiO zonSVZc25PSmi^^MiC)J&n7GYqWj_es*u3*gu!W4w%m>|hy2_j-2NridWGu55O-q9PtC{%DT#=}A_BPU9de8TAmO^$hr^VF=Qzy5Y6waM> zt1S5==R${$?+5m&t*^Ux_3Xmr>5*3#uGVdI=-AD5n3-qY+M?*`>!z`6l4Nt8$j`A$ zwEk1}-Xjlhl!ooe%Jy_vV|@3}2Zn_WN0W7L#n}gJ=(PNB>g@KGCudGr=B_5R3u^wGuVawhZoI=!VfGSt zj(62J8+iF`YW_~yn`^Gnq|(5+o~>b@ee9j=)s06j4=woErL!Z@LojnT<7p+%k}P8e zN6m_BV$8s>WIC5ABgep*e)r1xX*@bhIhAHyv#pU-ocVXklG8I9yJlr{O?$n3QzPqa zyUyR2og_V#?3dT=(v)5iDC~PN=x@j_CX*GN%L3NT_u_;ye0eplxCColJ>SL`4V21= zvX{Q+24sb5+;y8Byl#GHmHw5#+^NPqN;{wCJ>F83{;=||@0#obuD&L&hkr$0b~vcU z7IWj}$xbbmVer+%bBsJbJ>bj^ZyG)%u$xvP|<#GS!&ZFRm-ZR zIjJi=4mkLlw7&lJ^6}%xi|6mp__9IhU+COsV5(Lvag8WRNi0dVN-jzTQVd20Muxfu zCb~xEAx6el#->)r#@Yr3Rt5&{g7sD?8glbfGSez?YcTUU-Uigb;OXk;vd$@?2>{z) BiL?L! diff --git a/Assets/MaxSdk/Resources/Images/warning_icon.png.meta b/Assets/MaxSdk/Resources/Images/warning_icon.png.meta deleted file mode 100644 index ee4941c..0000000 --- a/Assets/MaxSdk/Resources/Images/warning_icon.png.meta +++ /dev/null @@ -1,91 +0,0 @@ -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 deleted file mode 100644 index db8b9af..0000000 --- a/Assets/MaxSdk/Scripts.meta +++ /dev/null @@ -1,8 +0,0 @@ -fileFormatVersion: 2 -guid: 7a185e76ddff641299882a658e18cbd2 -folderAsset: yes -DefaultImporter: - externalObjects: {} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Assets/MaxSdk/Scripts/IntegrationManager.meta b/Assets/MaxSdk/Scripts/IntegrationManager.meta deleted file mode 100644 index 39f65cc..0000000 --- a/Assets/MaxSdk/Scripts/IntegrationManager.meta +++ /dev/null @@ -1,11 +0,0 @@ -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 deleted file mode 100644 index 1d8400a..0000000 --- a/Assets/MaxSdk/Scripts/IntegrationManager/Editor.meta +++ /dev/null @@ -1,11 +0,0 @@ -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 deleted file mode 100644 index d4cdb00..0000000 --- a/Assets/MaxSdk/Scripts/IntegrationManager/Editor/AppLovinAutoUpdater.cs +++ /dev/null @@ -1,172 +0,0 @@ -// -// 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..."); - AppLovinIntegrationManager.OnDownloadPluginProgressCallback = AppLovinIntegrationManagerWindow.OnDownloadPluginProgress; - 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 deleted file mode 100644 index 0070e74..0000000 --- a/Assets/MaxSdk/Scripts/IntegrationManager/Editor/AppLovinAutoUpdater.cs.meta +++ /dev/null @@ -1,14 +0,0 @@ -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 deleted file mode 100644 index 28cb496..0000000 --- a/Assets/MaxSdk/Scripts/IntegrationManager/Editor/AppLovinCommandLine.cs +++ /dev/null @@ -1,94 +0,0 @@ -// -// 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 deleted file mode 100644 index 2c3ff20..0000000 --- a/Assets/MaxSdk/Scripts/IntegrationManager/Editor/AppLovinCommandLine.cs.meta +++ /dev/null @@ -1,14 +0,0 @@ -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 deleted file mode 100644 index f5be939..0000000 --- a/Assets/MaxSdk/Scripts/IntegrationManager/Editor/AppLovinEditorCoroutine.cs +++ /dev/null @@ -1,91 +0,0 @@ -// -// 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 deleted file mode 100644 index c622bab..0000000 --- a/Assets/MaxSdk/Scripts/IntegrationManager/Editor/AppLovinEditorCoroutine.cs.meta +++ /dev/null @@ -1,14 +0,0 @@ -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 deleted file mode 100644 index 45ce4d4..0000000 --- a/Assets/MaxSdk/Scripts/IntegrationManager/Editor/AppLovinInitialize.cs +++ /dev/null @@ -1,138 +0,0 @@ -// -// 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", - - // TODO: Add MaxTargetingData and MaxUserSegment when the plugin has enough traction. - }; - - 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 deleted file mode 100644 index fb8a55c..0000000 --- a/Assets/MaxSdk/Scripts/IntegrationManager/Editor/AppLovinInitialize.cs.meta +++ /dev/null @@ -1,14 +0,0 @@ -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 deleted file mode 100644 index f40580f..0000000 --- a/Assets/MaxSdk/Scripts/IntegrationManager/Editor/AppLovinIntegrationManager.cs +++ /dev/null @@ -1,473 +0,0 @@ -// -// 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 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; - } - - [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; - } - - [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; - } - } - - /// - /// 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 downloading a plugin with the progress percentage. - /// - /// The name of the plugin being downloaded. - /// Percentage downloaded. - /// Whether or not the download is complete. - public delegate void DownloadPluginProgressCallback(string pluginName, float progress, bool done); - - /// - /// Delegate to be called when a plugin package is imported. - /// - /// The network data for which the package is imported. - public 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 static readonly string PluginDataEndpoint = "https://unity.applovin.com/max/1.0/integration_manager_info?plugin_version={0}"; - - private static string _externalDependencyManagerVersion; - - public static DownloadPluginProgressCallback OnDownloadPluginProgressCallback; - public static ImportPackageCompletedCallback OnImportPackageCompletedCallback; - - private UnityWebRequest webRequest; - 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 default exported path first, In most cases, we should be able to find the asset. - // In some cases where we don't, use the platform specific export path to search for the asset (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() - { - // Add asset import callbacks. - AssetDatabase.importPackageCompleted += packageName => - { - if (!IsImportingNetwork(packageName)) return; - - AssetDatabase.Refresh(); - - CallImportPackageCompletedCallback(importingNetwork); - importingNetwork = null; - }; - - AssetDatabase.importPackageCancelled += packageName => - { - if (!IsImportingNetwork(packageName)) return; - - MaxSdkLogger.UserDebug("Package import cancelled."); - 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); - using (var unityWebRequest = UnityWebRequest.Get(url)) - { - var operation = unityWebRequest.SendWebRequest(); - - // Just wait till www is done - while (!operation.isDone) { } - - return CreatePluginDataFromWebResponse(unityWebRequest); - } - } - - /// - /// 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); - using (var unityWebRequest = UnityWebRequest.Get(url)) - { - var operation = unityWebRequest.SendWebRequest(); - - while (!operation.isDone) yield return new WaitForSeconds(0.1f); // Just wait till www is done. Our coroutine is pretty rudimentary. - - var pluginData = CreatePluginDataFromWebResponse(unityWebRequest); - - callback(pluginData); - } - } - - private static PluginData CreatePluginDataFromWebResponse(UnityWebRequest unityWebRequest) - { -#if UNITY_2020_1_OR_NEWER - if (unityWebRequest.result != UnityWebRequest.Result.Success) -#else - if (unityWebRequest.isNetworkError || unityWebRequest.isHttpError) -#endif - { - MaxSdkLogger.E("Failed to load plugin data. Please check your internet connection."); - return null; - } - - PluginData pluginData; - try - { - pluginData = JsonUtility.FromJson(unityWebRequest.downloadHandler.text); - 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); - } - - foreach (var partnerMicroSdk in pluginData.PartnerMicroSdks) - { - AppLovinPackageManager.UpdateCurrentVersions(partnerMicroSdk); - } - - 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 downloadHandler = new DownloadHandlerFile(path); - webRequest = new UnityWebRequest(network.DownloadUrl) - { - method = UnityWebRequest.kHttpVerbGET, - downloadHandler = downloadHandler - }; - - var operation = webRequest.SendWebRequest(); - while (!operation.isDone) - { - yield return new WaitForSeconds(0.1f); // Just wait till webRequest is completed. Our coroutine is pretty rudimentary. - CallDownloadPluginProgressCallback(network.DisplayName, operation.progress, operation.isDone); - } - -#if UNITY_2020_1_OR_NEWER - if (webRequest.result != UnityWebRequest.Result.Success) -#else - if (webRequest.isNetworkError || webRequest.isHttpError) -#endif - { - MaxSdkLogger.UserError(webRequest.error); - } - else - { - importingNetwork = network; - AssetDatabase.ImportPackage(path, showImport); - } - - webRequest.Dispose(); - webRequest = null; - } - - /// - /// Cancels the plugin download if one is in progress. - /// - public void CancelDownload() - { - if (webRequest == null) return; - - webRequest.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 CallDownloadPluginProgressCallback(string pluginName, float progress, bool isDone) - { - if (OnDownloadPluginProgressCallback == null) return; - - OnDownloadPluginProgressCallback(pluginName, progress, isDone); - } - - 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 deleted file mode 100644 index e9e3603..0000000 --- a/Assets/MaxSdk/Scripts/IntegrationManager/Editor/AppLovinIntegrationManager.cs.meta +++ /dev/null @@ -1,14 +0,0 @@ -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 deleted file mode 100644 index 6f50f25..0000000 --- a/Assets/MaxSdk/Scripts/IntegrationManager/Editor/AppLovinIntegrationManagerUtils.cs +++ /dev/null @@ -1,80 +0,0 @@ -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 deleted file mode 100644 index 9efcdd9..0000000 --- a/Assets/MaxSdk/Scripts/IntegrationManager/Editor/AppLovinIntegrationManagerUtils.cs.meta +++ /dev/null @@ -1,14 +0,0 @@ -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 deleted file mode 100644 index ca72614..0000000 --- a/Assets/MaxSdk/Scripts/IntegrationManager/Editor/AppLovinIntegrationManagerWindow.cs +++ /dev/null @@ -1,1075 +0,0 @@ -// -// 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://developers.applovin.com/en/unity/overview/terms-and-privacy-policy-flow"; - private const string DocumentationAdaptersLink = "https://developers.applovin.com/en/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 AlertIconExportPath = "MaxSdk/Resources/Images/alert_icon.png"; - private const string WarningIconExportPath = "MaxSdk/Resources/Images/warning_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 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 = 60f; - 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 alertIcon; - private Texture2D warningIcon; - - 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 alert icon texture. - var alertIconData = File.ReadAllBytes(MaxSdkUtils.GetAssetPathForExportPath(AlertIconExportPath)); - alertIcon = new Texture2D(1, 1, TextureFormat.RGBA32, false); - alertIcon.LoadImage(alertIconData); - - // Load warning icon texture. - var warningIconData = File.ReadAllBytes(MaxSdkUtils.GetAssetPathForExportPath(WarningIconExportPath)); - warningIcon = new Texture2D(1, 1, TextureFormat.RGBA32, false); - warningIcon.LoadImage(warningIconData); - } - - 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() - { - AppLovinIntegrationManager.OnDownloadPluginProgressCallback = OnDownloadPluginProgress; - - // Plugin downloaded and imported. Update current versions for the imported package. - 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(); - - if (pluginData != null && pluginData.PartnerMicroSdks != null) - { - DrawCollapsableSection(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 UNITY_2019_2_OR_NEWER - if (!AppLovinIntegrationManager.IsPluginInPackageManager) - { - EditorGUILayout.LabelField("Unity Package Manager Migration", titleLabelStyle); - DrawPluginMigrationHelper(); - } -#endif - - // Draw AppLovin Quality Service settings - DrawCollapsableSection(KeyShowSdkSettings, "SDK Settings", DrawQualityServiceSettings); - - DrawCollapsableSection(KeyShowPrivacySettings, "Privacy Settings", DrawPrivacySettings); - - DrawCollapsableSection(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(); - - GUI.enabled = upgradeButtonEnabled; - if (GUILayout.Button(new GUIContent("Upgrade"), FieldWidth)) - { - AppLovinEditorCoroutine.StartCoroutine(AppLovinPackageManager.AddNetwork(pluginData.AppLovinMax, true)); - } - - GUI.enabled = true; - GUILayout.Space(5); - GUILayout.EndHorizontal(); - - GUILayout.Space(5); - } - } - - GUILayout.Space(5); - GUILayout.EndHorizontal(); - } - - /// - /// 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 = alertIcon, 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); - } - - GUI.enabled = networkButtonsEnabled && isActionEnabled; - if (GUILayout.Button(new GUIContent(action), FieldWidth)) - { - 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)) - { - EditorUtility.DisplayProgressBar("Integration Manager", "Deleting " + network.Name + "...", 0.5f); - AppLovinPackageManager.RemoveNetwork(network); - EditorUtility.ClearProgressBar(); - } - - 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); - } - -#if UNITY_2019_2_OR_NEWER - 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(); - } -#endif - - 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 DrawCollapsableSection(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(); - })); - } - - /// - /// Callback method that will be called with progress updates when the plugin is being downloaded. - /// - public static void OnDownloadPluginProgress(string pluginName, float progress, bool done) - { - // Download is complete. Clear progress bar. - if (done) - { - EditorUtility.ClearProgressBar(); - } - // Download is in progress, update progress bar. - else - { - if (EditorUtility.DisplayCancelableProgressBar(WindowTitle, string.Format("Downloading {0} plugin...", pluginName), progress)) - { - AppLovinIntegrationManager.Instance.CancelDownload(); - EditorUtility.ClearProgressBar(); - } - } - } - - 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); - } - - #endregion - } -} diff --git a/Assets/MaxSdk/Scripts/IntegrationManager/Editor/AppLovinIntegrationManagerWindow.cs.meta b/Assets/MaxSdk/Scripts/IntegrationManager/Editor/AppLovinIntegrationManagerWindow.cs.meta deleted file mode 100644 index d7996fd..0000000 --- a/Assets/MaxSdk/Scripts/IntegrationManager/Editor/AppLovinIntegrationManagerWindow.cs.meta +++ /dev/null @@ -1,14 +0,0 @@ -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 deleted file mode 100644 index 6bcd4dd..0000000 --- a/Assets/MaxSdk/Scripts/IntegrationManager/Editor/AppLovinInternalSettings.cs +++ /dev/null @@ -1,307 +0,0 @@ -// -// AppLovinInternalSettigns.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 deleted file mode 100644 index a863905..0000000 --- a/Assets/MaxSdk/Scripts/IntegrationManager/Editor/AppLovinInternalSettings.cs.meta +++ /dev/null @@ -1,14 +0,0 @@ -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 deleted file mode 100644 index 568ed4f..0000000 --- a/Assets/MaxSdk/Scripts/IntegrationManager/Editor/AppLovinMenuItems.cs +++ /dev/null @@ -1,60 +0,0 @@ -// -// 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://developers.applovin.com/en/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 deleted file mode 100644 index 30fb834..0000000 --- a/Assets/MaxSdk/Scripts/IntegrationManager/Editor/AppLovinMenuItems.cs.meta +++ /dev/null @@ -1,14 +0,0 @@ -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 deleted file mode 100644 index 0b2247c..0000000 --- a/Assets/MaxSdk/Scripts/IntegrationManager/Editor/AppLovinPackageManager.cs +++ /dev/null @@ -1,626 +0,0 @@ -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"; - -#if UNITY_2019_2_OR_NEWER - private static readonly IPackageManagerClient _upmPackageManager = new AppLovinUpmPackageManager(); -#endif - private static readonly IPackageManagerClient _assetsPackageManager = new AppLovinAssetsPackageManager(); - - private static IPackageManagerClient PackageManagerClient - { - get - { -#if UNITY_2019_2_OR_NEWER - return AppLovinIntegrationManager.IsPluginInPackageManager ? _upmPackageManager : _assetsPackageManager; -#else - return _assetsPackageManager; -#endif - } - } - - 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); - -#if UNITY_2019_2_OR_NEWER - var installedNetworksInPackages = AppLovinUpmPackageManager.GetInstalledMediationNetworks(); - installedNetworks.AddRange(installedNetworksInPackages); -#endif - - 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-" + exportPath.Replace(Path.DirectorySeparatorChar, Path.AltDirectorySeparatorChar); - 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 UNITY_2019_2_OR_NEWER - if (HasDuplicateAdapters(assetPaths)) - { - ShowDeleteDuplicateAdapterPrompt(network); - } -#endif - - 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; - } - } - } - -#if UNITY_2019_2_OR_NEWER - /// - /// 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) - { - 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(); - } -#endif - - /// - /// 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 - } - -#if UNITY_2019_2_OR_NEWER - 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; - } - } - -#endif - - 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 deleted file mode 100644 index 5a508fa..0000000 --- a/Assets/MaxSdk/Scripts/IntegrationManager/Editor/AppLovinPackageManager.cs.meta +++ /dev/null @@ -1,14 +0,0 @@ -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 deleted file mode 100644 index 287b1bb..0000000 --- a/Assets/MaxSdk/Scripts/IntegrationManager/Editor/AppLovinPluginMigrationHelper.cs +++ /dev/null @@ -1,168 +0,0 @@ -using System.Collections.Generic; -using System.IO; -using System.Linq; -using UnityEditor; -using UnityEngine; - -#if UNITY_2019_2_OR_NEWER -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 - } -} -#endif diff --git a/Assets/MaxSdk/Scripts/IntegrationManager/Editor/AppLovinPluginMigrationHelper.cs.meta b/Assets/MaxSdk/Scripts/IntegrationManager/Editor/AppLovinPluginMigrationHelper.cs.meta deleted file mode 100644 index dc78f48..0000000 --- a/Assets/MaxSdk/Scripts/IntegrationManager/Editor/AppLovinPluginMigrationHelper.cs.meta +++ /dev/null @@ -1,14 +0,0 @@ -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 deleted file mode 100644 index 31ad202..0000000 --- a/Assets/MaxSdk/Scripts/IntegrationManager/Editor/AppLovinPostProcessAndroid.cs +++ /dev/null @@ -1,497 +0,0 @@ -// -// 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 - { -#if UNITY_2019_3_OR_NEWER - private const string PropertyAndroidX = "android.useAndroidX"; - private const string PropertyJetifier = "android.enableJetifier"; - private const string EnableProperty = "=true"; -#endif - private const string PropertyDexingArtifactTransform = "android.enableDexingArtifactTransform"; - private const string DisableProperty = "=true"; - - 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) - { -#if UNITY_2019_3_OR_NEWER - var rootGradleBuildFilePath = Path.Combine(path, "../build.gradle"); - var gradlePropertiesPath = Path.Combine(path, "../gradle.properties"); - var gradleWrapperPropertiesPath = Path.Combine(path, "../gradle/wrapper/gradle-wrapper.properties"); -#else - var rootGradleBuildFilePath = Path.Combine(path, "build.gradle"); - var gradlePropertiesPath = Path.Combine(path, "gradle.properties"); - var gradleWrapperPropertiesPath = Path.Combine(path, "gradle/wrapper/gradle-wrapper.properties"); -#endif - - 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); - -#if UNITY_2019_3_OR_NEWER - // 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))); -#else - // Add all properties except DexingArtifactTransform since it may already exist. We will re-add it below. - gradlePropertiesUpdated.AddRange(lines.Where(line => !line.Contains(PropertyDexingArtifactTransform))); -#endif - } - -#if UNITY_2019_3_OR_NEWER - // Enable AndroidX and Jetifier properties - gradlePropertiesUpdated.Add(PropertyAndroidX + EnableProperty); - gradlePropertiesUpdated.Add(PropertyJetifier + EnableProperty); -#endif - - // `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 deleted file mode 100644 index 2877140..0000000 --- a/Assets/MaxSdk/Scripts/IntegrationManager/Editor/AppLovinPostProcessAndroid.cs.meta +++ /dev/null @@ -1,14 +0,0 @@ -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 deleted file mode 100644 index eaf241f..0000000 --- a/Assets/MaxSdk/Scripts/IntegrationManager/Editor/AppLovinPostProcessAndroidGradle.cs +++ /dev/null @@ -1,78 +0,0 @@ -// -// 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; - -#if UNITY_2019_3_OR_NEWER - // On Unity 2019.3+, the path returned is the path to the unityLibrary's module. - // The AppLovin Quality Service buildscript closure related lines need to be added to the root build.gradle file. - var rootGradleBuildFilePath = Path.Combine(path, "../build.gradle"); - var shouldAddQualityServiceToDependencies = ShouldAddQualityServiceToDependencies(rootGradleBuildFilePath); - - var failedToAddPlugin = false; - if (shouldAddQualityServiceToDependencies) - { - // Add the Quality Service Plugin to the dependencies block in the root build.gradle file - var buildScriptChangesAdded = AddQualityServiceBuildScriptLines(rootGradleBuildFilePath); - failedToAddPlugin = !buildScriptChangesAdded; - } - else - { - // 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); - failedToAddPlugin = !(qualityServiceAdded && appLovinRepositoryAdded); - } - - 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"); -#else - // If Gradle template is enabled, we would have already updated the plugin. - if (AppLovinIntegrationManager.GradleTemplateEnabled) return; - - var applicationGradleBuildFilePath = Path.Combine(path, "build.gradle"); -#endif - - 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 deleted file mode 100644 index c167f0c..0000000 --- a/Assets/MaxSdk/Scripts/IntegrationManager/Editor/AppLovinPostProcessAndroidGradle.cs.meta +++ /dev/null @@ -1,14 +0,0 @@ -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 deleted file mode 100644 index 3b71a29..0000000 --- a/Assets/MaxSdk/Scripts/IntegrationManager/Editor/AppLovinPostProcessiOS.cs +++ /dev/null @@ -1,731 +0,0 @@ -// -// 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.Diagnostics; -using System.IO; -using System.Linq; -using System.Text; -using System.Text.RegularExpressions; -using UnityEditor; -using UnityEditor.Callbacks; -#if UNITY_2019_3_OR_NEWER -using UnityEditor.iOS.Xcode.Extensions; -#endif -using UnityEditor.iOS.Xcode; -using UnityEditor.PackageManager; -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"; - -#if !UNITY_2019_3_OR_NEWER - private const string UnityMainTargetName = "Unity-iPhone"; -#endif - // 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; - } - - // Download the ruby script needed to install Quality Service - var downloadHandler = new DownloadHandlerFile(outputFilePath); - var postJson = string.Format("{{\"sdk_key\" : \"{0}\"}}", sdkKey); - var bodyRaw = Encoding.UTF8.GetBytes(postJson); - var uploadHandler = new UploadHandlerRaw(bodyRaw); - uploadHandler.contentType = "application/json"; - - using (var unityWebRequest = new UnityWebRequest("https://api2.safedk.com/v1/build/ios_setup2")) - { - unityWebRequest.method = UnityWebRequest.kHttpVerbPOST; - unityWebRequest.downloadHandler = downloadHandler; - unityWebRequest.uploadHandler = uploadHandler; - var operation = unityWebRequest.SendWebRequest(); - - // Wait for the download to complete or the request to timeout. - while (!operation.isDone) { } - -#if UNITY_2020_1_OR_NEWER - if (unityWebRequest.result != UnityWebRequest.Result.Success) -#else - if (unityWebRequest.isNetworkError || unityWebRequest.isHttpError) -#endif - { - MaxSdkLogger.UserError("AppLovin Quality Service installation failed. Failed to download script with error: " + unityWebRequest.error); - 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); - -#if UNITY_2019_3_OR_NEWER - var unityMainTargetGuid = project.GetUnityMainTargetGuid(); - var unityFrameworkTargetGuid = project.GetUnityFrameworkTargetGuid(); -#else - var unityMainTargetGuid = project.TargetGuidByName(UnityMainTargetName); - var unityFrameworkTargetGuid = project.TargetGuidByName(UnityMainTargetName); -#endif - 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; - -#if UNITY_2019_3_OR_NEWER - foreach (var dynamicLibraryPath in dynamicLibraryPathsToEmbed) - { - var fileGuid = project.AddFile(dynamicLibraryPath, dynamicLibraryPath); - project.AddFileToEmbedFrameworks(targetGuid, fileGuid); - } -#else - string runpathSearchPaths; - runpathSearchPaths = project.GetBuildPropertyForAnyConfig(targetGuid, "LD_RUNPATH_SEARCH_PATHS"); - runpathSearchPaths += string.IsNullOrEmpty(runpathSearchPaths) ? "" : " "; - - // Check if runtime search paths already contains the required search paths for dynamic libraries. - if (runpathSearchPaths.Contains("@executable_path/Frameworks")) return; - - runpathSearchPaths += "@executable_path/Frameworks"; - project.SetBuildProperty(targetGuid, "LD_RUNPATH_SEARCH_PATHS", runpathSearchPaths); -#endif - } - - /// - /// |-----------------------------------------------------------------------------------------------------------------------------------------------------| - /// | 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); - -#if UNITY_2019_3_OR_NEWER - var unityMainTargetGuid = project.GetUnityMainTargetGuid(); -#else - var unityMainTargetGuid = project.TargetGuidByName(UnityMainTargetName); -#endif - - 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); - } - - using (var unityWebRequest = UnityWebRequest.Get(uriBuilder.ToString())) - { - var operation = unityWebRequest.SendWebRequest(); - // Wait for the download to complete or the request to timeout. - while (!operation.isDone) { } - -#if UNITY_2020_1_OR_NEWER - if (unityWebRequest.result != UnityWebRequest.Result.Success) -#else - if (unityWebRequest.isNetworkError || unityWebRequest.isHttpError) -#endif - { - MaxSdkLogger.UserError("Failed to retrieve SKAdNetwork IDs with error: " + unityWebRequest.error); - return new SkAdNetworkData(); - } - - try - { - return JsonUtility.FromJson(unityWebRequest.downloadHandler.text); - } - catch (Exception exception) - { - MaxSdkLogger.UserError("Failed to parse data '" + unityWebRequest.downloadHandler.text + "' 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 deleted file mode 100644 index 8182708..0000000 --- a/Assets/MaxSdk/Scripts/IntegrationManager/Editor/AppLovinPostProcessiOS.cs.meta +++ /dev/null @@ -1,14 +0,0 @@ -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 deleted file mode 100644 index 3ed102a..0000000 --- a/Assets/MaxSdk/Scripts/IntegrationManager/Editor/AppLovinPreProcess.cs +++ /dev/null @@ -1,182 +0,0 @@ -// -// 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 deleted file mode 100644 index f5e00db..0000000 --- a/Assets/MaxSdk/Scripts/IntegrationManager/Editor/AppLovinPreProcess.cs.meta +++ /dev/null @@ -1,14 +0,0 @@ -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 deleted file mode 100644 index 209a4bf..0000000 --- a/Assets/MaxSdk/Scripts/IntegrationManager/Editor/AppLovinPreProcessAndroid.cs +++ /dev/null @@ -1,115 +0,0 @@ -// -// 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 = "2.1.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; - -#if UNITY_2019_3_OR_NEWER - // 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); -#else - AddAppLovinQualityServicePlugin(AppLovinIntegrationManager.GradleTemplatePath); -#endif - } - - 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 deleted file mode 100644 index 4dd79e8..0000000 --- a/Assets/MaxSdk/Scripts/IntegrationManager/Editor/AppLovinPreProcessAndroid.cs.meta +++ /dev/null @@ -1,14 +0,0 @@ -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 deleted file mode 100644 index e99ea7b..0000000 --- a/Assets/MaxSdk/Scripts/IntegrationManager/Editor/AppLovinPreProcessiOS.cs +++ /dev/null @@ -1,99 +0,0 @@ -// -// 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 = "~> 2.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 deleted file mode 100644 index 33bdffb..0000000 --- a/Assets/MaxSdk/Scripts/IntegrationManager/Editor/AppLovinPreProcessiOS.cs.meta +++ /dev/null @@ -1,14 +0,0 @@ -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 deleted file mode 100644 index aa7eab6..0000000 --- a/Assets/MaxSdk/Scripts/IntegrationManager/Editor/AppLovinProcessGradleBuildFile.cs +++ /dev/null @@ -1,634 +0,0 @@ -// AppLovin MAX Unity Plugin -// -// Created by Santosh Bagadi on 9/3/19. -// Copyright © 2019 AppLovin. All rights reserved. -// - -#if UNITY_ANDROID - -using System.Text; -using System; -using System.Collections.Generic; -using System.IO; -using System.Linq; -using System.Text.RegularExpressions; -using UnityEditorInternal; -using UnityEngine; -using UnityEngine.Networking; -using Debug = UnityEngine.Debug; - -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:"; - - /// - /// 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 - protected 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, -#if UNITY_2019_3_OR_NEWER - false // On Unity 2019.3+, the buildscript closure related lines will to be added to the root build.gradle file. -#else - true -#endif - ); - // 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. - protected 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. - protected 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; - } - -#if UNITY_2019_3_OR_NEWER - /// - /// 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. - protected 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); - } - } -#endif - - private static AppLovinQualityServiceData RetrieveQualityServiceData(string sdkKey) - { - var postJson = string.Format("{{\"sdk_key\" : \"{0}\"}}", sdkKey); - var bodyRaw = Encoding.UTF8.GetBytes(postJson); - // Upload handler is automatically disposed when UnityWebRequest is disposed - var uploadHandler = new UploadHandlerRaw(bodyRaw); - uploadHandler.contentType = "application/json"; - - using (var unityWebRequest = new UnityWebRequest("https://api2.safedk.com/v1/build/cred")) - { - unityWebRequest.method = UnityWebRequest.kHttpVerbPOST; - unityWebRequest.uploadHandler = uploadHandler; - unityWebRequest.downloadHandler = new DownloadHandlerBuffer(); - - var operation = unityWebRequest.SendWebRequest(); - - // Wait for the download to complete or the request to timeout. - while (!operation.isDone) { } - -#if UNITY_2020_1_OR_NEWER - if (unityWebRequest.result != UnityWebRequest.Result.Success) -#else - if (unityWebRequest.isNetworkError || unityWebRequest.isHttpError) -#endif - { - MaxSdkLogger.UserError("Failed to retrieve API Key for SDK Key: " + sdkKey + "with error: " + unityWebRequest.error); - return new AppLovinQualityServiceData(); - } - - try - { - return JsonUtility.FromJson(unityWebRequest.downloadHandler.text); - } - 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) - { - var addPlugin = MaxSdkUtils.IsValidString(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(); - // Check if the plugin exists, if so, update the SDK Key. - var pluginExists = lines.Any(line => TokenAppLovinPlugin.IsMatch(line)); - if (pluginExists) - { - 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); - } - } - } - // Plugin hasn't been added yet, add it. - else - { - var buildScriptClosureDepth = 0; - var insideBuildScriptClosure = false; - var buildScriptMatched = false; - var qualityServiceRepositoryAdded = false; - var qualityServiceDependencyClassPathAdded = false; - var qualityServicePluginAdded = false; - foreach (var line in lines) - { - // Add the line to the output lines. - outputLines.Add(line); - - // Check if we need to add the build script lines and add them. - if (addBuildScriptLines) - { - 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; - } - } - } - - // Check if we need to add the plugin and add it. - if (addPlugin) - { - // Add the plugin. - if (!qualityServicePluginAdded && TokenApplicationPlugin.IsMatch(line)) - { - outputLines.Add(QualityServiceApplyPlugin); - outputLines.AddRange(GenerateAppLovinPluginClosure(apiKey)); - qualityServicePluginAdded = true; - } - } - } - - if ((addBuildScriptLines && (!qualityServiceRepositoryAdded || !qualityServiceDependencyClassPathAdded)) || (addPlugin && !qualityServicePluginAdded)) - { - return null; - } - } - - return outputLines; - } - - public static string GetFormattedBuildScriptLine(string buildScriptLine) - { -#if UNITY_2022_2_OR_NEWER - return " " -#elif UNITY_2019_3_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 deleted file mode 100644 index 5e49844..0000000 --- a/Assets/MaxSdk/Scripts/IntegrationManager/Editor/AppLovinProcessGradleBuildFile.cs.meta +++ /dev/null @@ -1,14 +0,0 @@ -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 deleted file mode 100644 index e34f0ba..0000000 --- a/Assets/MaxSdk/Scripts/IntegrationManager/Editor/AppLovinSettings.cs +++ /dev/null @@ -1,160 +0,0 @@ -// -// 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; - } - - // If there is no existing AppLovinSettings asset, create one in the default location - 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, create the settings asset at the default location. - if (AppLovinIntegrationManager.IsPluginInPackageManager) - { - // Note: Can't use absolute path when calling `CreateAsset`. Should use relative path to Assets/ directory. - settingsFilePath = Path.Combine("Assets", SettingsExportPath); - - var maxSdkDir = Path.Combine(Application.dataPath, "MaxSdk"); - if (!Directory.Exists(maxSdkDir)) - { - Directory.CreateDirectory(maxSdkDir); - } - } - else - { - settingsFilePath = 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 deleted file mode 100644 index 7e40d73..0000000 --- a/Assets/MaxSdk/Scripts/IntegrationManager/Editor/AppLovinSettings.cs.meta +++ /dev/null @@ -1,14 +0,0 @@ -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 deleted file mode 100644 index 38aab79..0000000 --- a/Assets/MaxSdk/Scripts/IntegrationManager/Editor/AppLovinUpmManifest.cs +++ /dev/null @@ -1,192 +0,0 @@ -#if UNITY_2019_2_OR_NEWER -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 - } -} -#endif diff --git a/Assets/MaxSdk/Scripts/IntegrationManager/Editor/AppLovinUpmManifest.cs.meta b/Assets/MaxSdk/Scripts/IntegrationManager/Editor/AppLovinUpmManifest.cs.meta deleted file mode 100644 index 3970bba..0000000 --- a/Assets/MaxSdk/Scripts/IntegrationManager/Editor/AppLovinUpmManifest.cs.meta +++ /dev/null @@ -1,15 +0,0 @@ -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 deleted file mode 100644 index 1cc80b7..0000000 --- a/Assets/MaxSdk/Scripts/IntegrationManager/Editor/MaxSdk.IntegrationManager.Editor.asmdef +++ /dev/null @@ -1,10 +0,0 @@ -{ - "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 deleted file mode 100644 index 272b872..0000000 --- a/Assets/MaxSdk/Scripts/IntegrationManager/Editor/MaxSdk.IntegrationManager.Editor.asmdef.meta +++ /dev/null @@ -1,6 +0,0 @@ -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 deleted file mode 100644 index e492a73..0000000 --- a/Assets/MaxSdk/Scripts/MaxCmpService.cs +++ /dev/null @@ -1,170 +0,0 @@ -// -// 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 deleted file mode 100644 index 598fc90..0000000 --- a/Assets/MaxSdk/Scripts/MaxCmpService.cs.meta +++ /dev/null @@ -1,14 +0,0 @@ -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 deleted file mode 100644 index 4d22dc2..0000000 --- a/Assets/MaxSdk/Scripts/MaxEventExecutor.cs +++ /dev/null @@ -1,108 +0,0 @@ -// -// 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 deleted file mode 100644 index 18ba126..0000000 --- a/Assets/MaxSdk/Scripts/MaxEventExecutor.cs.meta +++ /dev/null @@ -1,14 +0,0 @@ -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 deleted file mode 100644 index c15563b..0000000 --- a/Assets/MaxSdk/Scripts/MaxEventSystemChecker.cs +++ /dev/null @@ -1,37 +0,0 @@ -// -// 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 deleted file mode 100644 index 12874b6..0000000 --- a/Assets/MaxSdk/Scripts/MaxEventSystemChecker.cs.meta +++ /dev/null @@ -1,14 +0,0 @@ -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 deleted file mode 100644 index b0a9ad6..0000000 --- a/Assets/MaxSdk/Scripts/MaxEvents.cs +++ /dev/null @@ -1,21 +0,0 @@ -/** - * 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 deleted file mode 100644 index bfb6ad5..0000000 --- a/Assets/MaxSdk/Scripts/MaxEvents.cs.meta +++ /dev/null @@ -1,14 +0,0 @@ -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 deleted file mode 100644 index 99e1d22..0000000 --- a/Assets/MaxSdk/Scripts/MaxSdk.Scripts.asmdef +++ /dev/null @@ -1,6 +0,0 @@ - { - "name": "MaxSdk.Scripts", - "references": [], - "includePlatforms": [], - "excludePlatforms": [] -} diff --git a/Assets/MaxSdk/Scripts/MaxSdk.Scripts.asmdef.meta b/Assets/MaxSdk/Scripts/MaxSdk.Scripts.asmdef.meta deleted file mode 100644 index b55da72..0000000 --- a/Assets/MaxSdk/Scripts/MaxSdk.Scripts.asmdef.meta +++ /dev/null @@ -1,10 +0,0 @@ -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 deleted file mode 100644 index 837b7fb..0000000 --- a/Assets/MaxSdk/Scripts/MaxSdk.cs +++ /dev/null @@ -1,26 +0,0 @@ -// -// 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.3.1"; - - /// - /// 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 deleted file mode 100644 index c1c32f4..0000000 --- a/Assets/MaxSdk/Scripts/MaxSdk.cs.meta +++ /dev/null @@ -1,14 +0,0 @@ -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 deleted file mode 100644 index 4834a8e..0000000 --- a/Assets/MaxSdk/Scripts/MaxSdkAndroid.cs +++ /dev/null @@ -1,984 +0,0 @@ -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) - { - MaxUnityPluginClass.CallStatic("trackEvent", name, Json.Serialize(parameters)); - } - - #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 deleted file mode 100644 index 2cf5448..0000000 --- a/Assets/MaxSdk/Scripts/MaxSdkAndroid.cs.meta +++ /dev/null @@ -1,14 +0,0 @@ -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 deleted file mode 100644 index 998b09e..0000000 --- a/Assets/MaxSdk/Scripts/MaxSdkBase.cs +++ /dev/null @@ -1,833 +0,0 @@ -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 -{ - /// - /// 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 deleted file mode 100644 index f27f769..0000000 --- a/Assets/MaxSdk/Scripts/MaxSdkBase.cs.meta +++ /dev/null @@ -1,14 +0,0 @@ -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 deleted file mode 100644 index bae9268..0000000 --- a/Assets/MaxSdk/Scripts/MaxSdkCallbacks.cs +++ /dev/null @@ -1,1139 +0,0 @@ -// 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 onAdHiddenEvent; - public static event Action OnAdHiddenEvent - { - add - { - LogSubscribedToEvent("OnInterstitialAdHiddenEvent"); - onAdHiddenEvent += value; - } - remove - { - LogUnsubscribedToEvent("OnInterstitialAdHiddenEvent"); - onAdHiddenEvent -= value; - } - } - } - - public static class AppOpen - { - internal static Action onAdLoadedEvent; - public static event Action OnAdLoadedEvent - { - add - { - LogSubscribedToEvent("OnAppOpenAdLoadedEvent"); - onAdLoadedEvent += value; - } - remove - { - LogUnsubscribedToEvent("OnAppOpenAdLoadedEvent"); - onAdLoadedEvent -= value; - } - } - - internal static Action onAdLoadFailedEvent; - public static event Action OnAdLoadFailedEvent - { - add - { - LogSubscribedToEvent("OnAppOpenAdLoadFailedEvent"); - onAdLoadFailedEvent += value; - } - remove - { - LogUnsubscribedToEvent("OnAppOpenAdLoadFailedEvent"); - onAdLoadFailedEvent -= value; - } - } - - /// - /// Fired when an app open ad is displayed (may not be received by Unity until the app open ad closes). - /// - internal static Action onAdDisplayedEvent; - public static event Action OnAdDisplayedEvent - { - add - { - LogSubscribedToEvent("OnAppOpenAdDisplayedEvent"); - onAdDisplayedEvent += value; - } - remove - { - LogUnsubscribedToEvent("OnAppOpenAdDisplayedEvent"); - onAdDisplayedEvent -= value; - } - } - - internal static Action onAdDisplayFailedEvent; - public static event Action OnAdDisplayFailedEvent - { - add - { - LogSubscribedToEvent("OnAppOpenAdDisplayFailedEvent"); - onAdDisplayFailedEvent += value; - } - remove - { - LogUnsubscribedToEvent("OnAppOpenAdDisplayFailedEvent"); - onAdDisplayFailedEvent -= value; - } - } - - internal static Action onAdClickedEvent; - public static event Action OnAdClickedEvent - { - add - { - LogSubscribedToEvent("OnAppOpenAdClickedEvent"); - onAdClickedEvent += value; - } - remove - { - LogUnsubscribedToEvent("OnAppOpenAdClickedEvent"); - onAdClickedEvent -= value; - } - } - - /// - /// Fired when an app open 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("OnAppOpenAdRevenuePaidEvent"); - onAdRevenuePaidEvent += value; - } - remove - { - LogUnsubscribedToEvent("OnAppOpenAdRevenuePaidEvent"); - onAdRevenuePaidEvent -= value; - } - } - - /// - /// Fired when an expired app open ad is reloaded. - /// - internal static Action onExpiredAdReloadedEvent; - public static event Action OnExpiredAdReloadedEvent - { - add - { - LogSubscribedToEvent("OnExpiredAppOpenAdReloadedEvent"); - onExpiredAdReloadedEvent += value; - } - remove - { - LogUnsubscribedToEvent("OnExpiredAppOpenAdReloadedEvent"); - onExpiredAdReloadedEvent -= value; - } - } - - internal static Action onAdHiddenEvent; - public static event Action OnAdHiddenEvent - { - add - { - LogSubscribedToEvent("OnAppOpenAdHiddenEvent"); - onAdHiddenEvent += value; - } - remove - { - LogUnsubscribedToEvent("OnAppOpenAdHiddenEvent"); - onAdHiddenEvent -= value; - } - } - } - public static class Rewarded - { - internal static Action onAdLoadedEvent; - public static event Action OnAdLoadedEvent - { - add - { - LogSubscribedToEvent("OnRewardedAdLoadedEvent"); - onAdLoadedEvent += value; - } - remove - { - LogUnsubscribedToEvent("OnRewardedAdLoadedEvent"); - onAdLoadedEvent -= value; - } - } - - internal static Action onAdLoadFailedEvent; - public static event Action OnAdLoadFailedEvent - { - add - { - LogSubscribedToEvent("OnRewardedAdLoadFailedEvent"); - onAdLoadFailedEvent += value; - } - remove - { - LogUnsubscribedToEvent("OnRewardedAdLoadFailedEvent"); - onAdLoadFailedEvent -= value; - } - } - - /// - ///Fired when a rewarded ad is displayed (may not be received by Unity until the rewarded ad closes). - /// - internal static Action onAdDisplayedEvent; - public static event Action OnAdDisplayedEvent - { - add - { - LogSubscribedToEvent("OnRewardedAdDisplayedEvent"); - onAdDisplayedEvent += value; - } - remove - { - LogUnsubscribedToEvent("OnRewardedAdDisplayedEvent"); - onAdDisplayedEvent -= value; - } - } - - internal static Action onAdDisplayFailedEvent; - public static event Action OnAdDisplayFailedEvent - { - add - { - LogSubscribedToEvent("OnRewardedAdDisplayFailedEvent"); - onAdDisplayFailedEvent += value; - } - remove - { - LogUnsubscribedToEvent("OnRewardedAdDisplayFailedEvent"); - onAdDisplayFailedEvent -= value; - } - } - - internal static Action onAdClickedEvent; - public static event Action OnAdClickedEvent - { - add - { - LogSubscribedToEvent("OnRewardedAdClickedEvent"); - onAdClickedEvent += value; - } - remove - { - LogUnsubscribedToEvent("OnRewardedAdClickedEvent"); - onAdClickedEvent -= value; - } - } - - /// - /// Fired when a rewarded 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("OnRewardedAdRevenuePaidEvent"); - onAdRevenuePaidEvent += value; - } - remove - { - LogUnsubscribedToEvent("OnRewardedAdRevenuePaidEvent"); - onAdRevenuePaidEvent -= value; - } - } - - /// - /// Fired when an expired rewarded ad is reloaded. - /// - internal static Action onExpiredAdReloadedEvent; - public static event Action OnExpiredAdReloadedEvent - { - add - { - LogSubscribedToEvent("OnExpiredRewardedAdReloadedEvent"); - onExpiredAdReloadedEvent += value; - } - remove - { - LogUnsubscribedToEvent("OnExpiredRewardedAdReloadedEvent"); - onExpiredAdReloadedEvent -= value; - } - } - - /// - /// Fired when an Ad Review Creative ID has been generated. - /// - internal static Action onAdReviewCreativeIdGeneratedEvent; - public static event Action OnAdReviewCreativeIdGeneratedEvent - { - add - { - LogSubscribedToEvent("OnRewardedAdReviewCreativeIdGeneratedEvent"); - onAdReviewCreativeIdGeneratedEvent += value; - } - remove - { - LogUnsubscribedToEvent("OnRewardedAdReviewCreativeIdGeneratedEvent"); - onAdReviewCreativeIdGeneratedEvent -= value; - } - } - - internal static Action onAdReceivedRewardEvent; - public static event Action OnAdReceivedRewardEvent - { - add - { - LogSubscribedToEvent("OnRewardedAdReceivedRewardEvent"); - onAdReceivedRewardEvent += value; - } - remove - { - LogUnsubscribedToEvent("OnRewardedAdReceivedRewardEvent"); - onAdReceivedRewardEvent -= value; - } - } - - internal static Action onAdHiddenEvent; - public static event Action OnAdHiddenEvent - { - add - { - LogSubscribedToEvent("OnRewardedAdHiddenEvent"); - onAdHiddenEvent += value; - } - remove - { - LogUnsubscribedToEvent("OnRewardedAdHiddenEvent"); - onAdHiddenEvent -= value; - } - } - } - public static class Banner - { - internal static Action onAdLoadedEvent; - public static event Action OnAdLoadedEvent - { - add - { - LogSubscribedToEvent("OnBannerAdLoadedEvent"); - onAdLoadedEvent += value; - } - remove - { - LogUnsubscribedToEvent("OnBannerAdLoadedEvent"); - onAdLoadedEvent -= value; - } - } - - internal static Action onAdLoadFailedEvent; - public static event Action OnAdLoadFailedEvent - { - add - { - LogSubscribedToEvent("OnBannerAdLoadFailedEvent"); - onAdLoadFailedEvent += value; - } - remove - { - LogUnsubscribedToEvent("OnBannerAdLoadFailedEvent"); - onAdLoadFailedEvent -= value; - } - } - - internal static Action onAdClickedEvent; - public static event Action OnAdClickedEvent - { - add - { - LogSubscribedToEvent("OnBannerAdClickedEvent"); - onAdClickedEvent += value; - } - remove - { - LogUnsubscribedToEvent("OnBannerAdClickedEvent"); - onAdClickedEvent -= value; - } - } - - internal static Action onAdRevenuePaidEvent; - public static event Action OnAdRevenuePaidEvent - { - add - { - LogSubscribedToEvent("OnBannerAdRevenuePaidEvent"); - onAdRevenuePaidEvent += value; - } - remove - { - LogUnsubscribedToEvent("OnBannerAdRevenuePaidEvent"); - onAdRevenuePaidEvent -= value; - } - } - - internal static Action onAdReviewCreativeIdGeneratedEvent; - public static event Action OnAdReviewCreativeIdGeneratedEvent - { - add - { - LogSubscribedToEvent("OnBannerAdReviewCreativeIdGeneratedEvent"); - onAdReviewCreativeIdGeneratedEvent += value; - } - remove - { - LogUnsubscribedToEvent("OnBannerAdReviewCreativeIdGeneratedEvent"); - onAdReviewCreativeIdGeneratedEvent -= value; - } - } - - internal static Action onAdExpandedEvent; - public static event Action OnAdExpandedEvent - { - add - { - LogSubscribedToEvent("OnBannerAdExpandedEvent"); - onAdExpandedEvent += value; - } - remove - { - LogUnsubscribedToEvent("OnBannerAdExpandedEvent"); - onAdExpandedEvent -= value; - } - } - - internal static Action onAdCollapsedEvent; - public static event Action OnAdCollapsedEvent - { - add - { - LogSubscribedToEvent("OnBannerAdCollapsedEvent"); - onAdCollapsedEvent += value; - } - remove - { - LogUnsubscribedToEvent("OnBannerAdCollapsedEvent"); - onAdCollapsedEvent -= value; - } - } - } - - public static class MRec - { - internal static Action onAdLoadedEvent; - public static event Action OnAdLoadedEvent - { - add - { - LogSubscribedToEvent("OnMRecAdLoadedEvent"); - onAdLoadedEvent += value; - } - remove - { - LogUnsubscribedToEvent("OnMRecAdLoadedEvent"); - onAdLoadedEvent -= value; - } - } - - internal static Action onAdLoadFailedEvent; - public static event Action OnAdLoadFailedEvent - { - add - { - LogSubscribedToEvent("OnMRecAdLoadFailedEvent"); - onAdLoadFailedEvent += value; - } - remove - { - LogUnsubscribedToEvent("OnMRecAdLoadFailedEvent"); - onAdLoadFailedEvent -= value; - } - } - - internal static Action onAdClickedEvent; - public static event Action OnAdClickedEvent - { - add - { - LogSubscribedToEvent("OnMRecAdClickedEvent"); - onAdClickedEvent += value; - } - remove - { - LogUnsubscribedToEvent("OnMRecAdClickedEvent"); - onAdClickedEvent -= value; - } - } - - internal static Action onAdRevenuePaidEvent; - public static event Action OnAdRevenuePaidEvent - { - add - { - LogSubscribedToEvent("OnMRecAdRevenuePaidEvent"); - onAdRevenuePaidEvent += value; - } - remove - { - LogUnsubscribedToEvent("OnMRecAdRevenuePaidEvent"); - onAdRevenuePaidEvent -= value; - } - } - - /// - /// Fired when an Ad Review Creative ID has been generated. - /// - internal static Action onAdReviewCreativeIdGeneratedEvent; - public static event Action OnAdReviewCreativeIdGeneratedEvent - { - add - { - LogSubscribedToEvent("OnMRecAdReviewCreativeIdGeneratedEvent"); - onAdReviewCreativeIdGeneratedEvent += value; - } - remove - { - LogUnsubscribedToEvent("OnMRecAdReviewCreativeIdGeneratedEvent"); - onAdReviewCreativeIdGeneratedEvent -= value; - } - } - - internal static Action onAdExpandedEvent; - public static event Action OnAdExpandedEvent - { - add - { - LogSubscribedToEvent("OnMRecAdExpandedEvent"); - onAdExpandedEvent += value; - } - remove - { - LogUnsubscribedToEvent("OnMRecAdExpandedEvent"); - onAdExpandedEvent -= value; - } - } - - internal static Action onAdCollapsedEvent; - public static event Action OnAdCollapsedEvent - { - add - { - LogSubscribedToEvent("OnMRecAdCollapsedEvent"); - onAdCollapsedEvent += value; - } - remove - { - LogUnsubscribedToEvent("OnMRecAdCollapsedEvent"); - onAdCollapsedEvent -= value; - } - } - } - - public static void ForwardEvent(string eventPropsStr) - { - var eventProps = Json.Deserialize(eventPropsStr) as Dictionary; - if (eventProps == null) - { - MaxSdkLogger.E("Failed to forward event due to invalid event data"); - return; - } - - var keepInBackground = MaxSdkUtils.GetBoolFromDictionary(eventProps, "keepInBackground", false); - var eventName = MaxSdkUtils.GetStringFromDictionary(eventProps, "name", ""); - if (eventName == "OnInitialCallbackEvent") - { - MaxSdkLogger.D("Initial background callback."); - } - else if (eventName == "OnSdkInitializedEvent") - { - var sdkConfiguration = MaxSdkBase.SdkConfiguration.Create(eventProps); - InvokeEvent(onSdkInitializedEvent, sdkConfiguration, eventName, keepInBackground); - } - else if (eventName == "OnCmpCompletedEvent") - { - var errorProps = MaxSdkUtils.GetDictionaryFromDictionary(eventProps, "error"); - MaxCmpService.NotifyCompletedIfNeeded(errorProps); - } - else if (eventName == "OnApplicationStateChanged") - { - var isPaused = MaxSdkUtils.GetBoolFromDictionary(eventProps, "isPaused"); - InvokeEvent(onApplicationStateChangedEvent, isPaused, eventName, keepInBackground); - } - // Ad Events - else - { - var isExpiredAdReloadedEvent = Regex.IsMatch(eventName, @"^OnExpired\w+AdReloadedEvent$"); - var adInfoEventProps = isExpiredAdReloadedEvent ? MaxSdkUtils.GetDictionaryFromDictionary(eventProps, "newAdInfo") : eventProps; - var adInfo = new MaxSdkBase.AdInfo(adInfoEventProps); - var adUnitIdentifier = MaxSdkUtils.GetStringFromDictionary(adInfoEventProps, "adUnitId", ""); - - // Expired ad reloaded callbacks pass down multiple adInfo objects - if (isExpiredAdReloadedEvent) - { - var expiredAdInfo = new MaxSdkBase.AdInfo(MaxSdkUtils.GetDictionaryFromDictionary(eventProps, "expiredAdInfo")); - if (eventName == "OnExpiredInterstitialAdReloadedEvent") - { - InvokeEvent(Interstitial.onExpiredAdReloadedEvent, adUnitIdentifier, expiredAdInfo, adInfo, eventName, keepInBackground); - } - else if (eventName == "OnExpiredAppOpenAdReloadedEvent") - { - InvokeEvent(AppOpen.onExpiredAdReloadedEvent, adUnitIdentifier, expiredAdInfo, adInfo, eventName, keepInBackground); - } - else if (eventName == "OnExpiredRewardedAdReloadedEvent") - { - InvokeEvent(Rewarded.onExpiredAdReloadedEvent, adUnitIdentifier, expiredAdInfo, adInfo, eventName, keepInBackground); - } - else - { - MaxSdkLogger.UserWarning("Unknown MAX Ads event fired: " + eventName); - } - } - else if (eventName == "OnBannerAdLoadedEvent") - { - InvokeEvent(Banner.onAdLoadedEvent, adUnitIdentifier, adInfo, eventName, keepInBackground); - } - else if (eventName == "OnBannerAdLoadFailedEvent") - { - var errorInfo = new MaxSdkBase.ErrorInfo(eventProps); - InvokeEvent(Banner.onAdLoadFailedEvent, adUnitIdentifier, errorInfo, eventName, keepInBackground); - } - else if (eventName == "OnBannerAdClickedEvent") - { - InvokeEvent(Banner.onAdClickedEvent, adUnitIdentifier, adInfo, eventName, keepInBackground); - } - else if (eventName == "OnBannerAdRevenuePaidEvent") - { - InvokeEvent(Banner.onAdRevenuePaidEvent, adUnitIdentifier, adInfo, eventName, keepInBackground); - } - else if (eventName == "OnBannerAdReviewCreativeIdGeneratedEvent") - { - var adReviewCreativeId = MaxSdkUtils.GetStringFromDictionary(eventProps, "adReviewCreativeId", ""); - InvokeEvent(Banner.onAdReviewCreativeIdGeneratedEvent, adUnitIdentifier, adReviewCreativeId, adInfo, eventName, keepInBackground); - } - else if (eventName == "OnBannerAdExpandedEvent") - { - InvokeEvent(Banner.onAdExpandedEvent, adUnitIdentifier, adInfo, eventName, keepInBackground); - } - else if (eventName == "OnBannerAdCollapsedEvent") - { - InvokeEvent(Banner.onAdCollapsedEvent, adUnitIdentifier, adInfo, eventName, keepInBackground); - } - else if (eventName == "OnMRecAdLoadedEvent") - { - InvokeEvent(MRec.onAdLoadedEvent, adUnitIdentifier, adInfo, eventName, keepInBackground); - } - else if (eventName == "OnMRecAdLoadFailedEvent") - { - var errorInfo = new MaxSdkBase.ErrorInfo(eventProps); - InvokeEvent(MRec.onAdLoadFailedEvent, adUnitIdentifier, errorInfo, eventName, keepInBackground); - } - else if (eventName == "OnMRecAdClickedEvent") - { - InvokeEvent(MRec.onAdClickedEvent, adUnitIdentifier, adInfo, eventName, keepInBackground); - } - else if (eventName == "OnMRecAdRevenuePaidEvent") - { - InvokeEvent(MRec.onAdRevenuePaidEvent, adUnitIdentifier, adInfo, eventName, keepInBackground); - } - else if (eventName == "OnMRecAdReviewCreativeIdGeneratedEvent") - { - var adReviewCreativeId = MaxSdkUtils.GetStringFromDictionary(eventProps, "adReviewCreativeId", ""); - InvokeEvent(MRec.onAdReviewCreativeIdGeneratedEvent, adUnitIdentifier, adReviewCreativeId, adInfo, eventName, keepInBackground); - } - else if (eventName == "OnMRecAdExpandedEvent") - { - InvokeEvent(MRec.onAdExpandedEvent, adUnitIdentifier, adInfo, eventName, keepInBackground); - } - else if (eventName == "OnMRecAdCollapsedEvent") - { - InvokeEvent(MRec.onAdCollapsedEvent, adUnitIdentifier, adInfo, eventName, keepInBackground); - } - else if (eventName == "OnInterstitialLoadedEvent") - { - InvokeEvent(Interstitial.onAdLoadedEvent, adUnitIdentifier, adInfo, eventName, keepInBackground); - } - else if (eventName == "OnInterstitialLoadFailedEvent") - { - var errorInfo = new MaxSdkBase.ErrorInfo(eventProps); - InvokeEvent(Interstitial.onAdLoadFailedEvent, adUnitIdentifier, errorInfo, eventName, keepInBackground); - } - else if (eventName == "OnInterstitialHiddenEvent") - { - InvokeEvent(Interstitial.onAdHiddenEvent, adUnitIdentifier, adInfo, eventName, keepInBackground); - } - else if (eventName == "OnInterstitialDisplayedEvent") - { - InvokeEvent(Interstitial.onAdDisplayedEvent, adUnitIdentifier, adInfo, eventName, keepInBackground); - } - else if (eventName == "OnInterstitialAdFailedToDisplayEvent") - { - var errorInfo = new MaxSdkBase.ErrorInfo(eventProps); - InvokeEvent(Interstitial.onAdDisplayFailedEvent, adUnitIdentifier, errorInfo, adInfo, eventName, keepInBackground); - } - else if (eventName == "OnInterstitialClickedEvent") - { - InvokeEvent(Interstitial.onAdClickedEvent, adUnitIdentifier, adInfo, eventName, keepInBackground); - } - else if (eventName == "OnInterstitialAdRevenuePaidEvent") - { - InvokeEvent(Interstitial.onAdRevenuePaidEvent, adUnitIdentifier, adInfo, eventName, keepInBackground); - } - else if (eventName == "OnInterstitialAdReviewCreativeIdGeneratedEvent") - { - var adReviewCreativeId = MaxSdkUtils.GetStringFromDictionary(eventProps, "adReviewCreativeId", ""); - InvokeEvent(Interstitial.onAdReviewCreativeIdGeneratedEvent, adUnitIdentifier, adReviewCreativeId, adInfo, eventName, keepInBackground); - } - else if (eventName == "OnAppOpenAdLoadedEvent") - { - InvokeEvent(AppOpen.onAdLoadedEvent, adUnitIdentifier, adInfo, eventName, keepInBackground); - } - else if (eventName == "OnAppOpenAdLoadFailedEvent") - { - var errorInfo = new MaxSdkBase.ErrorInfo(eventProps); - InvokeEvent(AppOpen.onAdLoadFailedEvent, adUnitIdentifier, errorInfo, eventName, keepInBackground); - } - else if (eventName == "OnAppOpenAdHiddenEvent") - { - InvokeEvent(AppOpen.onAdHiddenEvent, adUnitIdentifier, adInfo, eventName, keepInBackground); - } - else if (eventName == "OnAppOpenAdDisplayedEvent") - { - InvokeEvent(AppOpen.onAdDisplayedEvent, adUnitIdentifier, adInfo, eventName, keepInBackground); - } - else if (eventName == "OnAppOpenAdFailedToDisplayEvent") - { - var errorInfo = new MaxSdkBase.ErrorInfo(eventProps); - InvokeEvent(AppOpen.onAdDisplayFailedEvent, adUnitIdentifier, errorInfo, adInfo, eventName, keepInBackground); - } - else if (eventName == "OnAppOpenAdClickedEvent") - { - InvokeEvent(AppOpen.onAdClickedEvent, adUnitIdentifier, adInfo, eventName, keepInBackground); - } - else if (eventName == "OnAppOpenAdRevenuePaidEvent") - { - InvokeEvent(AppOpen.onAdRevenuePaidEvent, adUnitIdentifier, adInfo, eventName, keepInBackground); - } - else if (eventName == "OnRewardedAdLoadedEvent") - { - InvokeEvent(Rewarded.onAdLoadedEvent, adUnitIdentifier, adInfo, eventName, keepInBackground); - } - else if (eventName == "OnRewardedAdLoadFailedEvent") - { - var errorInfo = new MaxSdkBase.ErrorInfo(eventProps); - InvokeEvent(Rewarded.onAdLoadFailedEvent, adUnitIdentifier, errorInfo, eventName, keepInBackground); - } - else if (eventName == "OnRewardedAdDisplayedEvent") - { - InvokeEvent(Rewarded.onAdDisplayedEvent, adUnitIdentifier, adInfo, eventName, keepInBackground); - } - else if (eventName == "OnRewardedAdHiddenEvent") - { - InvokeEvent(Rewarded.onAdHiddenEvent, adUnitIdentifier, adInfo, eventName, keepInBackground); - } - else if (eventName == "OnRewardedAdClickedEvent") - { - InvokeEvent(Rewarded.onAdClickedEvent, adUnitIdentifier, adInfo, eventName, keepInBackground); - } - else if (eventName == "OnRewardedAdRevenuePaidEvent") - { - InvokeEvent(Rewarded.onAdRevenuePaidEvent, adUnitIdentifier, adInfo, eventName, keepInBackground); - } - else if (eventName == "OnRewardedAdReviewCreativeIdGeneratedEvent") - { - var adReviewCreativeId = MaxSdkUtils.GetStringFromDictionary(eventProps, "adReviewCreativeId", ""); - InvokeEvent(Rewarded.onAdReviewCreativeIdGeneratedEvent, adUnitIdentifier, adReviewCreativeId, adInfo, eventName, keepInBackground); - } - else if (eventName == "OnRewardedAdFailedToDisplayEvent") - { - var errorInfo = new MaxSdkBase.ErrorInfo(eventProps); - InvokeEvent(Rewarded.onAdDisplayFailedEvent, adUnitIdentifier, errorInfo, adInfo, eventName, keepInBackground); - } - else if (eventName == "OnRewardedAdReceivedRewardEvent") - { - var reward = new MaxSdkBase.Reward - { - Label = MaxSdkUtils.GetStringFromDictionary(eventProps, "rewardLabel", ""), - Amount = MaxSdkUtils.GetIntFromDictionary(eventProps, "rewardAmount", 0) - }; - - InvokeEvent(Rewarded.onAdReceivedRewardEvent, adUnitIdentifier, reward, adInfo, eventName, keepInBackground); - } - else - { - MaxSdkLogger.UserWarning("Unknown MAX Ads event fired: " + eventName); - } - } - } - -#if UNITY_EDITOR - public static void EmitSdkInitializedEvent() - { - if (onSdkInitializedEvent == null) return; - - onSdkInitializedEvent(MaxSdkBase.SdkConfiguration.CreateEmpty()); - } -#endif - - private static void InvokeEvent(Action evt, string eventName, bool keepInBackground) - { - if (!CanInvokeEvent(evt)) return; - - MaxSdkLogger.UserDebug("Invoking event: " + eventName); - if (ShouldInvokeInBackground(keepInBackground)) - { - try - { - evt(); - } - catch (Exception exception) - { - MaxSdkLogger.UserError("Caught exception in publisher event: " + eventName + ", exception: " + exception); - MaxSdkLogger.LogException(exception); - } - } - else - { - MaxEventExecutor.ExecuteOnMainThread(evt, eventName); - } - } - - private static void InvokeEvent(Action evt, T param, string eventName, bool keepInBackground) - { - if (!CanInvokeEvent(evt)) return; - - MaxSdkLogger.UserDebug("Invoking event: " + eventName + ". Param: " + param); - if (ShouldInvokeInBackground(keepInBackground)) - { - try - { - evt(param); - } - catch (Exception exception) - { - MaxSdkLogger.UserError("Caught exception in publisher event: " + eventName + ", exception: " + exception); - MaxSdkLogger.LogException(exception); - } - } - else - { - MaxEventExecutor.ExecuteOnMainThread(() => evt(param), eventName); - } - } - - private static void InvokeEvent(Action evt, T1 param1, T2 param2, string eventName, bool keepInBackground) - { - if (!CanInvokeEvent(evt)) return; - - MaxSdkLogger.UserDebug("Invoking event: " + eventName + ". Params: " + param1 + ", " + param2); - if (ShouldInvokeInBackground(keepInBackground)) - { - try - { - evt(param1, param2); - } - catch (Exception exception) - { - MaxSdkLogger.UserError("Caught exception in publisher event: " + eventName + ", exception: " + exception); - MaxSdkLogger.LogException(exception); - } - } - else - { - MaxEventExecutor.ExecuteOnMainThread(() => evt(param1, param2), eventName); - } - } - - private static void InvokeEvent(Action evt, T1 param1, T2 param2, T3 param3, string eventName, bool keepInBackground) - { - if (!CanInvokeEvent(evt)) return; - - MaxSdkLogger.UserDebug("Invoking event: " + eventName + ". Params: " + param1 + ", " + param2 + ", " + param3); - if (ShouldInvokeInBackground(keepInBackground)) - { - try - { - evt(param1, param2, param3); - } - catch (Exception exception) - { - MaxSdkLogger.UserError("Caught exception in publisher event: " + eventName + ", exception: " + exception); - MaxSdkLogger.LogException(exception); - } - } - else - { - MaxEventExecutor.ExecuteOnMainThread(() => evt(param1, param2, param3), eventName); - } - } - - private static bool CanInvokeEvent(Delegate evt) - { - if (evt == null) return false; - - // Check that publisher is not over-subscribing - if (evt.GetInvocationList().Length > 5) - { - MaxSdkLogger.UserWarning("Ads Event (" + evt + ") has over 5 subscribers. Please make sure you are properly un-subscribing to actions!!!"); - } - - return true; - } - - private static bool ShouldInvokeInBackground(bool keepInBackground) - { - return MaxSdkBase.InvokeEventsOnUnityMainThread == null ? keepInBackground : !MaxSdkBase.InvokeEventsOnUnityMainThread.Value; - } - - private static void LogSubscribedToEvent(string eventName) - { - MaxSdkLogger.D("Listener has been added to callback: " + eventName); - } - - private static void LogUnsubscribedToEvent(string eventName) - { - MaxSdkLogger.D("Listener has been removed from callback: " + eventName); - } - -#if UNITY_EDITOR && UNITY_2019_2_OR_NEWER - /// - /// Resets static event handlers so they still get reset even if Domain Reloading is disabled - /// - [RuntimeInitializeOnLoadMethod(RuntimeInitializeLoadType.SubsystemRegistration)] - private static void ResetOnDomainReload() - { - onSdkInitializedEvent = null; - - Interstitial.onAdLoadedEvent = null; - Interstitial.onAdLoadFailedEvent = null; - Interstitial.onAdDisplayedEvent = null; - Interstitial.onAdDisplayFailedEvent = null; - Interstitial.onAdClickedEvent = null; - Interstitial.onAdRevenuePaidEvent = null; - Interstitial.onAdReviewCreativeIdGeneratedEvent = null; - Interstitial.onAdHiddenEvent = null; - - AppOpen.onAdLoadedEvent = null; - AppOpen.onAdLoadFailedEvent = null; - AppOpen.onAdDisplayedEvent = null; - AppOpen.onAdDisplayFailedEvent = null; - AppOpen.onAdClickedEvent = null; - AppOpen.onAdRevenuePaidEvent = null; - AppOpen.onAdHiddenEvent = null; - - Rewarded.onAdLoadedEvent = null; - Rewarded.onAdLoadFailedEvent = null; - Rewarded.onAdDisplayedEvent = null; - Rewarded.onAdDisplayFailedEvent = null; - Rewarded.onAdClickedEvent = null; - Rewarded.onAdRevenuePaidEvent = null; - Rewarded.onAdReviewCreativeIdGeneratedEvent = null; - Rewarded.onAdReceivedRewardEvent = null; - Rewarded.onAdHiddenEvent = null; - - Banner.onAdLoadedEvent = null; - Banner.onAdLoadFailedEvent = null; - Banner.onAdClickedEvent = null; - Banner.onAdRevenuePaidEvent = null; - Banner.onAdReviewCreativeIdGeneratedEvent = null; - Banner.onAdExpandedEvent = null; - Banner.onAdCollapsedEvent = null; - - MRec.onAdLoadedEvent = null; - MRec.onAdLoadFailedEvent = null; - MRec.onAdClickedEvent = null; - MRec.onAdRevenuePaidEvent = null; - MRec.onAdReviewCreativeIdGeneratedEvent = null; - MRec.onAdExpandedEvent = null; - MRec.onAdCollapsedEvent = null; - - } -#endif -} diff --git a/Assets/MaxSdk/Scripts/MaxSdkCallbacks.cs.meta b/Assets/MaxSdk/Scripts/MaxSdkCallbacks.cs.meta deleted file mode 100644 index dd08049..0000000 --- a/Assets/MaxSdk/Scripts/MaxSdkCallbacks.cs.meta +++ /dev/null @@ -1,14 +0,0 @@ -fileFormatVersion: 2 -guid: 4dc129a60049645f7a492a0a658a6c22 -labels: -- al_max -- al_max_export_path-MaxSdk/Scripts/MaxSdkCallbacks.cs -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Assets/MaxSdk/Scripts/MaxSdkLogger.cs b/Assets/MaxSdk/Scripts/MaxSdkLogger.cs deleted file mode 100644 index 9acac25..0000000 --- a/Assets/MaxSdk/Scripts/MaxSdkLogger.cs +++ /dev/null @@ -1,84 +0,0 @@ -using System; -using UnityEngine; - -public class MaxSdkLogger -{ - private const string SdkTag = "AppLovin MAX"; - public const string KeyVerboseLoggingEnabled = "com.applovin.verbose_logging_enabled"; - - /// - /// Log debug messages. - /// - public static void UserDebug(string message) - { - if (MaxSdk.DisableAllLogs) return; - - Debug.Log("Debug [" + SdkTag + "] " + message); - } - - /// - /// Log debug messages when verbose logging is enabled. - /// - /// Verbose logging can be enabled by calling or via the Integration Manager for build time logs. - /// - public static void D(string message) - { - if (MaxSdk.DisableAllLogs && !MaxSdk.IsVerboseLoggingEnabled()) return; - - Debug.Log("Debug [" + SdkTag + "] " + message); - } - - /// - /// Log warning messages. - /// - public static void UserWarning(string message) - { - if (MaxSdk.DisableAllLogs) return; - - Debug.LogWarning("Warning [" + SdkTag + "] " + message); - } - - /// - /// Log warning messages when verbose logging is enabled. - /// - /// Verbose logging can be enabled by calling or via the Integration Manager for build time logs. - /// - public static void W(string message) - { - if (MaxSdk.DisableAllLogs && !MaxSdk.IsVerboseLoggingEnabled()) return; - - Debug.LogWarning("Warning [" + SdkTag + "] " + message); - } - - /// - /// Log error messages. - /// - public static void UserError(string message) - { - if (MaxSdk.DisableAllLogs) return; - - Debug.LogError("Error [" + SdkTag + "] " + message); - } - - /// - /// Log error messages when verbose logging is enabled. - /// - /// Verbose logging can be enabled by calling or via the Integration Manager for build time logs. - /// - public static void E(string message) - { - if (MaxSdk.DisableAllLogs && !MaxSdk.IsVerboseLoggingEnabled()) return; - - Debug.LogError("Error [" + SdkTag + "] " + message); - } - - /// - /// Log exceptions. - /// - public static void LogException(Exception exception) - { - if (MaxSdk.DisableAllLogs) return; - - Debug.LogException(exception); - } -} diff --git a/Assets/MaxSdk/Scripts/MaxSdkLogger.cs.meta b/Assets/MaxSdk/Scripts/MaxSdkLogger.cs.meta deleted file mode 100644 index 01a3427..0000000 --- a/Assets/MaxSdk/Scripts/MaxSdkLogger.cs.meta +++ /dev/null @@ -1,14 +0,0 @@ -fileFormatVersion: 2 -guid: ff2b160afdfd4a74b731954323772a90 -labels: -- al_max -- al_max_export_path-MaxSdk/Scripts/MaxSdkLogger.cs -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Assets/MaxSdk/Scripts/MaxSdkUnityEditor.cs b/Assets/MaxSdk/Scripts/MaxSdkUnityEditor.cs deleted file mode 100644 index 74a7155..0000000 --- a/Assets/MaxSdk/Scripts/MaxSdkUnityEditor.cs +++ /dev/null @@ -1,1240 +0,0 @@ -// This script is used for Unity Editor and non Android or iOS platforms. - -#if UNITY_EDITOR || !(UNITY_ANDROID || UNITY_IPHONE || UNITY_IOS) - -using System; -using System.Collections; -using System.Collections.Generic; -using System.Globalization; -using AppLovinMax.Internal; -using AppLovinMax.ThirdParty.MiniJson; -#if UNITY_EDITOR -using UnityEditor; -#endif -using UnityEngine; -using UnityEngine.UI; -using Object = UnityEngine.Object; - -/// -/// Unity Editor AppLovin MAX Unity Plugin implementation -/// -public class MaxSdkUnityEditor : MaxSdkBase -{ - private static bool _isInitialized; - private static bool _hasUserConsent = false; - private static bool _isUserConsentSet = false; - private static bool _doNotSell = false; - private static bool _isDoNotSellSet = false; - private static bool _showStubAds = true; - private static SafeAreaInsets _safeAreaInsets = new SafeAreaInsets(new int[] {0, 0, 0, 0}); - private static readonly HashSet RequestedAdUnits = new HashSet(); - private static readonly HashSet ReadyAdUnits = new HashSet(); - private static readonly Dictionary StubBanners = new Dictionary(); - - // Ad Placement - private static readonly Dictionary BannerPlacements = new Dictionary(); - private static readonly Dictionary MRecPlacements = new Dictionary(); - - [RuntimeInitializeOnLoadMethod] - public static void InitializeMaxSdkUnityEditorOnLoad() - { - // Unity destroys the stub banners each time the editor exits play mode, but the StubBanners stays in memory if Enter Play Mode settings is enabled. - StubBanners.Clear(); - } - - #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) - { - _isInitialized = true; - - // Slight delay to emulate the SDK initializing - ExecuteWithDelay(0.1f, () => - { - _isInitialized = true; - -#if UNITY_EDITOR - MaxSdkCallbacks.EmitSdkInitializedEvent(); -#endif - }); - } - - /// - /// Check if the SDK has been initialized. - /// - /// True if SDK has been initialized - public static bool IsInitialized() - { - return _isInitialized; - } - - /// - /// Prevent stub ads from showing in the Unity Editor - /// - public static void DisableStubAds() - { - _showStubAds = false; - } - - #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) { } - - /// - /// Set the . - /// - /// The segment collection to be set. Must not be {@code null} - public static void SetSegmentCollection(MaxSegmentCollection segmentCollection) - { - if (_isInitialized) - { - MaxSdkLogger.UserError("Segment collection must be set before MAX SDK is initialized "); - } - } - - #endregion - - #region MAX - - /// - /// Returns the list of available mediation networks. - /// - /// Please call this method after the SDK has initialized. - /// - public static List GetAvailableMediatedNetworks() - { - return new List(); - } - - /// - /// 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() - { - if (!_isInitialized) - { - MaxSdkLogger.UserWarning("The mediation debugger cannot be shown before the MAX SDK has been initialized." - + "\nCall 'MaxSdk.InitializeSdk();' and listen for 'MaxSdkCallbacks.OnSdkInitializedEvent' before showing the mediation debugger."); - } - else - { - MaxSdkLogger.UserWarning("The mediation debugger cannot be shown in the Unity Editor. Please export the project to Android or iOS first."); - } - } - - /// - /// Present the mediation debugger UI. - /// - /// Please call this method after the SDK has initialized. - /// - public static void ShowCreativeDebugger() - { - if (!_isInitialized) - { - MaxSdkLogger.UserWarning("The creative debugger cannot be shown before the MAX SDK has been initialized." - + "\nCall 'MaxSdk.InitializeSdk();' and listen for 'MaxSdkCallbacks.OnSdkInitializedEvent' before showing the mediation debugger."); - } - else - { - MaxSdkLogger.UserWarning("The creative debugger cannot be shown in the Unity Editor. Please export the project to Android or iOS first."); - } - } - - /// - /// 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) - { - return ""; - } - - #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() - { - return SdkConfiguration.CreateEmpty(); - } - - /// - /// 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) - { - _hasUserConsent = hasUserConsent; - _isUserConsentSet = true; - } - - /// - /// 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 . - public static bool HasUserConsent() - { - return _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 _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) - { - _doNotSell = doNotSell; - _isDoNotSellSet = true; - } - - /// - /// 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 . - public static bool IsDoNotSell() - { - return _doNotSell; - } - - /// - /// 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 _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"); - RequestAdUnit(adUnitIdentifier); - - if (configuration.UseCoordinates) return; - - if (_showStubAds && !StubBanners.ContainsKey(adUnitIdentifier)) - { - CreateStubBanner(adUnitIdentifier, configuration.Position); - } - - ExecuteWithDelay(1f, () => - { - var placement = MaxSdkUtils.GetStringFromDictionary(BannerPlacements, adUnitIdentifier); - var eventProps = Json.Serialize(CreateBaseEventPropsDictionary("OnBannerAdLoadedEvent", adUnitIdentifier, placement)); - MaxSdkCallbacks.ForwardEvent(eventProps); - }); - } - - private static void CreateStubBanner(string adUnitIdentifier, AdViewPosition bannerPosition) - { -#if UNITY_EDITOR - // Only support BottomCenter and TopCenter for now - var bannerPrefabName = bannerPosition == AdViewPosition.BottomCenter ? "BannerBottom" : "BannerTop"; - var prefabPath = MaxSdkUtils.GetAssetPathForExportPath("MaxSdk/Prefabs/" + bannerPrefabName + ".prefab"); - var bannerPrefab = AssetDatabase.LoadAssetAtPath(prefabPath); - var stubBanner = Object.Instantiate(bannerPrefab, Vector3.zero, Quaternion.identity); - stubBanner.SetActive(false); // Hidden by default - Object.DontDestroyOnLoad(stubBanner); - - var bannerText = stubBanner.GetComponentInChildren(); - bannerText.text += ":\n" + adUnitIdentifier; - - StubBanners.Add(adUnitIdentifier, stubBanner); -#endif - } - - /// - /// 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"); - - ExecuteWithDelay(1f, () => - { - var placement = MaxSdkUtils.GetStringFromDictionary(BannerPlacements, adUnitIdentifier); - var eventProps = Json.Serialize(CreateBaseEventPropsDictionary("OnBannerAdLoadedEvent", adUnitIdentifier, placement)); - MaxSdkCallbacks.ForwardEvent(eventProps); - }); - } - - /// - /// 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) - { - BannerPlacements[adUnitIdentifier] = placement; - MaxSdkLogger.UserDebug("Setting banner placement to '" + placement + "' for ad unit id '" + adUnitIdentifier + "'"); - } - - /// - /// 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) - { - MaxSdkLogger.UserDebug("Starting banner auto refresh."); - } - - /// - /// 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) - { - MaxSdkLogger.UserDebug("Stopping banner auto refresh."); - } - - /// - /// 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) - { - MaxSdkLogger.D("[AppLovin MAX] Updating banner position to '" + bannerPosition + "' for ad unit id '" + adUnitIdentifier + "'"); - } - - /// - /// 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) - { - MaxSdkLogger.UserDebug("Updating banner position to '(" + x + "," + y + ")"); - } - - /// - /// Overrides the width of the banner in points/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 points/dp - public static void SetBannerWidth(string adUnitIdentifier, float width) - { - // NOTE: Will implement in a future release - MaxSdkLogger.D("[AppLovin MAX] Set banner width to '" + width + "' for ad unit id '" + adUnitIdentifier + "'"); - } - - /// - /// 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"); - - if (!IsAdUnitRequested(adUnitIdentifier)) - { - MaxSdkLogger.UserWarning("Banner '" + adUnitIdentifier + "' was not created, can not show it"); - } - else - { - GameObject stubBanner; - if (StubBanners.TryGetValue(adUnitIdentifier, out stubBanner)) - { - stubBanner.SetActive(true); - } - } - } - - /// - /// 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"); - - GameObject stubBanner; - if (StubBanners.TryGetValue(adUnitIdentifier, out stubBanner)) - { - Object.Destroy(stubBanner); - StubBanners.Remove(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"); - - GameObject stubBanner; - if (StubBanners.TryGetValue(adUnitIdentifier, out stubBanner)) - { - stubBanner.SetActive(false); - } - } - - /// - /// 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"); - - GameObject stubBanner; - if (StubBanners.TryGetValue(adUnitIdentifier, out stubBanner)) - { - stubBanner.GetComponentInChildren().color = 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"); - } - - /// - /// 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 local extra parameter. - public static void SetBannerLocalExtraParameter(string adUnitIdentifier, string key, object value) - { - ValidateAdUnitIdentifier(adUnitIdentifier, "set banner local extra parameter"); - } - - /// - /// 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"); - } - - /// - /// 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"); - return Rect.zero; - } - - #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"); - RequestAdUnit(adUnitIdentifier); - - if (configuration.UseCoordinates) return; - - ExecuteWithDelay(1f, () => - { - var placement = MaxSdkUtils.GetStringFromDictionary(MRecPlacements, adUnitIdentifier); - var eventProps = Json.Serialize(CreateBaseEventPropsDictionary("OnMRecAdLoadedEvent", adUnitIdentifier, placement)); - MaxSdkCallbacks.ForwardEvent(eventProps); - }); - } - - /// - /// 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"); - - ExecuteWithDelay(1f, () => - { - var placement = MaxSdkUtils.GetStringFromDictionary(MRecPlacements, adUnitIdentifier); - var eventProps = Json.Serialize(CreateBaseEventPropsDictionary("OnMRecAdLoadedEvent", adUnitIdentifier, placement)); - MaxSdkCallbacks.ForwardEvent(eventProps); - }); - } - - /// - /// 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) - { - MRecPlacements[adUnitIdentifier] = placement; - MaxSdkLogger.UserDebug("Setting MREC placement to '" + placement + "' for ad unit id '" + adUnitIdentifier + "'"); - } - - /// - /// 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) - { - MaxSdkLogger.UserDebug("Starting banner auto refresh."); - } - - /// - /// 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) - { - MaxSdkLogger.UserDebug("Stopping banner auto refresh."); - } - - /// - /// 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) - { - MaxSdkLogger.UserDebug("Updating MREC position to '" + mrecPosition + "' for ad unit id '" + adUnitIdentifier + "'"); - } - - /// - /// 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) - { - MaxSdkLogger.UserDebug("Updating MREC position to '(" + 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"); - - if (!IsAdUnitRequested(adUnitIdentifier)) - { - MaxSdkLogger.UserWarning("MREC '" + adUnitIdentifier + "' was not created, can not show it"); - } - } - - /// - /// 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"); - } - - /// - /// Hide MREC. - /// - /// Ad unit identifier of the MREC to hide. Must not be null. - public static void HideMRec(string adUnitIdentifier) - { - ValidateAdUnitIdentifier(adUnitIdentifier, "hide MREC"); - } - - /// - /// 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"); - } - - /// - /// 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 local extra parameter. - public static void SetMRecLocalExtraParameter(string adUnitIdentifier, string key, object value) - { - ValidateAdUnitIdentifier(adUnitIdentifier, "set MREC local extra parameter"); - } - - /// - /// 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"); - } - - /// - /// The MREC position on the screen. When setting the MREC position via or , - /// the MREC 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"); - return Rect.zero; - } - - #endregion - - #region Interstitials - - /// - /// Start loading an interstitial. - /// - /// Ad unit identifier of the interstitial to load - public static void LoadInterstitial(string adUnitIdentifier) - { - ValidateAdUnitIdentifier(adUnitIdentifier, "load interstitial"); - RequestAdUnit(adUnitIdentifier); - - ExecuteWithDelay(1f, () => - { - AddReadyAdUnit(adUnitIdentifier); - - var eventProps = Json.Serialize(CreateBaseEventPropsDictionary("OnInterstitialLoadedEvent", adUnitIdentifier)); - MaxSdkCallbacks.ForwardEvent(eventProps); - }); - } - - /// - /// Check if interstitial ad is loaded and ready to be displayed. - /// - /// Ad unit identifier of the interstitial to load - /// True if the ad is ready to be displayed - public static bool IsInterstitialReady(string adUnitIdentifier) - { - ValidateAdUnitIdentifier(adUnitIdentifier, "check interstitial loaded"); - - if (!IsAdUnitRequested(adUnitIdentifier)) - { - MaxSdkLogger.UserWarning("Interstitial '" + adUnitIdentifier + - "' was not requested, can not check if it is loaded"); - return false; - } - - return IsAdUnitReady(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 - /// 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 (!IsAdUnitRequested(adUnitIdentifier)) - { - MaxSdkLogger.UserWarning( - "Interstitial '" + adUnitIdentifier + "' was not requested, can not show it"); - return; - } - - if (!IsInterstitialReady(adUnitIdentifier)) - { - MaxSdkLogger.UserWarning("Interstitial '" + adUnitIdentifier + "' is not ready, please check IsInterstitialReady() before showing."); - return; - } - - RemoveReadyAdUnit(adUnitIdentifier); - - if (_showStubAds) - { - ShowStubInterstitial(adUnitIdentifier, placement); - } - } - - private static void ShowStubInterstitial(string adUnitIdentifier, string placement) - { -#if UNITY_EDITOR - var prefabPath = MaxSdkUtils.GetAssetPathForExportPath("MaxSdk/Prefabs/Interstitial.prefab"); - var interstitialPrefab = AssetDatabase.LoadAssetAtPath(prefabPath); - var stubInterstitial = Object.Instantiate(interstitialPrefab, Vector3.zero, Quaternion.identity); - var interstitialText = GameObject.Find("MaxInterstitialTitle").GetComponent(); - var closeButton = GameObject.Find("MaxInterstitialCloseButton").GetComponent