com.azerion.bluestack 2.0.1 → 3.0.0-preview2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/Editor/BlueStackDependencies.xml +1 -1
- package/Example/Azerion.BlueStack.Example.asmdef +16 -0
- package/Example/Azerion.BlueStack.Example.asmdef.meta +7 -0
- package/Example/Prefabs/NativeAd.prefab +908 -0
- package/Example/Prefabs/NativeAd.prefab.meta +7 -0
- package/Example/Prefabs/SmallNativeAd.prefab +739 -0
- package/Example/Prefabs/SmallNativeAd.prefab.meta +7 -0
- package/Example/Prefabs.meta +8 -0
- package/Example/Scripts/NativeAdManager.cs +208 -0
- package/Example/Scripts/NativeAdManager.cs.meta +11 -0
- package/Example/Scripts/SmallNativeAdManager.cs +181 -0
- package/Example/Scripts/SmallNativeAdManager.cs.meta +11 -0
- package/Example/Scripts.meta +8 -0
- package/Example.meta +8 -0
- package/Plugins/Android/{bluestack-unity-android-bridge-1.0.1.aar → bluestack-unity-android-bridge-2.0.0-preview1.aar} +0 -0
- package/Plugins/Android/{bluestack-unity-android-bridge-1.0.1.aar.meta → bluestack-unity-android-bridge-2.0.0-preview1.aar.meta} +1 -1
- package/Plugins/iOS/BSUInterface.h +14 -0
- package/Plugins/iOS/BSUInterface.m +83 -1
- package/Plugins/iOS/BSUNativeAd.h +32 -0
- package/Plugins/iOS/BSUNativeAd.h.meta +27 -0
- package/Plugins/iOS/BSUNativeAd.m +82 -0
- package/Plugins/iOS/BSUNativeAd.m.meta +37 -0
- package/Plugins/iOS/BSUTypes.h +12 -0
- package/Runtime/API/BlueStackAds.cs +4 -2
- package/Runtime/API/NativeAd/NativeAd.cs +182 -0
- package/Runtime/API/NativeAd/NativeAd.cs.meta +3 -0
- package/Runtime/API/NativeAd/NativeAdEventArgs.cs +14 -0
- package/Runtime/API/NativeAd/NativeAdEventArgs.cs.meta +11 -0
- package/Runtime/API/NativeAd/NativeAdInteractionHandler.cs +157 -0
- package/Runtime/API/NativeAd/NativeAdInteractionHandler.cs.meta +11 -0
- package/Runtime/API/NativeAd/NativeAdInteractionUtils.cs +122 -0
- package/Runtime/API/NativeAd/NativeAdInteractionUtils.cs.meta +11 -0
- package/Runtime/API/NativeAd/NativeAdLoader.cs +57 -0
- package/Runtime/API/NativeAd/NativeAdLoader.cs.meta +11 -0
- package/Runtime/API/NativeAd/NativeAdObject.cs +520 -0
- package/Runtime/API/NativeAd/NativeAdObject.cs.meta +11 -0
- package/Runtime/API/NativeAd/NativeAdType.cs +8 -0
- package/Runtime/API/NativeAd/NativeAdType.cs.meta +11 -0
- package/Runtime/API/NativeAd/NativeAssetID.cs +30 -0
- package/Runtime/API/NativeAd/NativeAssetID.cs.meta +11 -0
- package/Runtime/API/NativeAd/NativeClientFactoryManager.cs +32 -0
- package/Runtime/API/NativeAd/NativeClientFactoryManager.cs.meta +11 -0
- package/Runtime/API/NativeAd.meta +8 -0
- package/Runtime/Common/NativeAd/AdLoaderClientArgs.cs +16 -0
- package/Runtime/Common/NativeAd/AdLoaderClientArgs.cs.meta +11 -0
- package/Runtime/Common/NativeAd/AdsEventExecutor.cs +84 -0
- package/Runtime/Common/NativeAd/AdsEventExecutor.cs.meta +11 -0
- package/Runtime/Common/NativeAd/DummyNativeClient.cs +61 -0
- package/Runtime/Common/NativeAd/DummyNativeClient.cs.meta +11 -0
- package/Runtime/Common/NativeAd/NativeClientEventArgs.cs +10 -0
- package/Runtime/Common/NativeAd/NativeClientEventArgs.cs.meta +11 -0
- package/Runtime/Common/NativeAd/NativeUtils.cs +117 -0
- package/Runtime/Common/NativeAd/NativeUtils.cs.meta +11 -0
- package/Runtime/Internal/IClientsFactory.cs +5 -2
- package/Runtime/Internal/NativeAd/IAdLoaderClient.cs +24 -0
- package/Runtime/Internal/NativeAd/IAdLoaderClient.cs.meta +11 -0
- package/Runtime/Internal/NativeAd/INativeAdClient.cs +25 -0
- package/Runtime/Internal/NativeAd/INativeAdClient.cs.meta +3 -0
- package/Runtime/Internal/NativeAd/INativeAdInteractionHandlerClient.cs +15 -0
- package/Runtime/Internal/NativeAd/INativeAdInteractionHandlerClient.cs.meta +11 -0
- package/Runtime/Internal/NativeAd/INativeClientFactory.cs +9 -0
- package/Runtime/Internal/NativeAd/INativeClientFactory.cs.meta +11 -0
- package/Runtime/Internal/NativeAd.meta +8 -0
- package/Runtime/Platforms/Android/AndroidJavaObjectFactory.cs +9 -1
- package/Runtime/Platforms/Android/BannerAdClient.cs +1 -1
- package/Runtime/Platforms/Android/BlueStackClient.cs +1 -1
- package/Runtime/Platforms/Android/BlueStackErrorUtils.cs +1 -1
- package/Runtime/Platforms/Android/BlueStackNativeClassNames.cs +4 -1
- package/Runtime/Platforms/Android/ClientsFactory.cs +12 -1
- package/Runtime/Platforms/Android/InitializationStatusClient.cs +1 -1
- package/Runtime/Platforms/Android/InterstitialAdClient.cs +1 -1
- package/Runtime/Platforms/Android/NativeAdClient.cs +108 -0
- package/Runtime/Platforms/Android/NativeAdClient.cs.meta +3 -0
- package/Runtime/Platforms/Android/PreferenceClient.cs +1 -1
- package/Runtime/Platforms/Android/RewardedVideoAdClient.cs +1 -1
- package/Runtime/Platforms/Unity/BannerAdClient.cs +1 -0
- package/Runtime/Platforms/Unity/ClientsFactory.cs +6 -1
- package/Runtime/Platforms/Unity/NativeAdClient.cs +101 -0
- package/Runtime/Platforms/Unity/NativeAdClient.cs.meta +3 -0
- package/Runtime/Platforms/Unity/RewardedTimer.cs +2 -2
- package/Runtime/Platforms/Unity/Utils.cs +73 -0
- package/Runtime/Platforms/Unity/Utils.cs.meta +11 -0
- package/Runtime/Platforms/iOS/BannerAdClient.cs +1 -1
- package/Runtime/Platforms/iOS/BlueStackClient.cs +1 -1
- package/Runtime/Platforms/iOS/BlueStackErrorUtils.cs +1 -1
- package/Runtime/Platforms/iOS/ClientsFactory.cs +13 -1
- package/Runtime/Platforms/iOS/Externs.cs +49 -1
- package/Runtime/Platforms/iOS/InitializationStatusClient.cs +1 -1
- package/Runtime/Platforms/iOS/InterstitialAdClient.cs +1 -1
- package/Runtime/Platforms/iOS/NativeAdClient.cs +156 -0
- package/Runtime/Platforms/iOS/NativeAdClient.cs.meta +3 -0
- package/Runtime/Platforms/iOS/PreferenceClient.cs +1 -1
- package/Runtime/Platforms/iOS/RewardedVideoAdClient.cs +1 -1
- package/Runtime/Platforms/iOS/Utils.cs +1 -1
- package/Runtime/Utilities/MiniJSON.cs +581 -0
- package/Runtime/Utilities/MiniJSON.cs.meta +11 -0
- package/Runtime/Utilities.meta +8 -0
- package/package.json +1 -1
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
#import "BSUNativeAd.h"
|
|
2
|
+
#import "BSUPluginUtil.h"
|
|
3
|
+
#import <CoreGraphics/CoreGraphics.h>
|
|
4
|
+
#import <UIKit/UIKit.h>
|
|
5
|
+
#import <BlueStackSDK/BlueStackSDK.h>
|
|
6
|
+
|
|
7
|
+
@interface BSUNativeAd()<MNGAdsAdapterNativeDelegate, MNGClickDelegate>
|
|
8
|
+
|
|
9
|
+
@property(nonatomic, strong) MNGAdsSDKFactory *nativeAdsFactory;
|
|
10
|
+
|
|
11
|
+
@end
|
|
12
|
+
|
|
13
|
+
@implementation BSUNativeAd
|
|
14
|
+
|
|
15
|
+
- (instancetype)initWithNativeAdClientReference:(BSUTypeNativeAdClientRef *)nativeAdClient placementId:(NSString *_Nullable)placementId {
|
|
16
|
+
self = [super init];
|
|
17
|
+
if (self) {
|
|
18
|
+
self.nativeAdClient = nativeAdClient;
|
|
19
|
+
self.nativeAdsFactory = [[MNGAdsSDKFactory alloc] init];
|
|
20
|
+
self.nativeAdsFactory.nativeDelegate = self;
|
|
21
|
+
self.nativeAdsFactory.placementId = placementId;
|
|
22
|
+
self.nativeAdsFactory.clickDelegate = self;
|
|
23
|
+
self.nativeAdsFactory.viewController = [BSUPluginUtil unityGLViewController];
|
|
24
|
+
}
|
|
25
|
+
return self;
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
- (void)loadAd {
|
|
29
|
+
if (self.nativeAdsFactory) {
|
|
30
|
+
[self.nativeAdsFactory loadNative];
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
- (void)loadAdWithPreference:(BSUTypePreferenceRef)preferenceRef {
|
|
35
|
+
MNGPreference *preference = (__bridge MNGPreference *)preferenceRef;
|
|
36
|
+
if (self.nativeAdsFactory) {
|
|
37
|
+
[self.nativeAdsFactory loadNativeWithPreferences:preference withCover:NO];
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
- (void)destroy {
|
|
42
|
+
if (self.nativeAdsFactory) {
|
|
43
|
+
[self.nativeAdsFactory releaseMemory];
|
|
44
|
+
self.nativeAdsFactory = nil;
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
#pragma mark MNGAdsAdapterNativeDelegate
|
|
49
|
+
|
|
50
|
+
// - (void)nativeObjectDidLoad:(MNGAdsAdapter *)adsAdapter {
|
|
51
|
+
// if (self.onDidLoadCallback != nil) {
|
|
52
|
+
// self.onDidLoadCallback(self.nativeAdClient);
|
|
53
|
+
// }
|
|
54
|
+
// }
|
|
55
|
+
|
|
56
|
+
-(void)adsAdapter:(MNGAdsAdapter *)adsAdapter nativeObjectDidLoad:(MNGNAtiveObject *)nativeObject{
|
|
57
|
+
NSLog(@"adsAdapterNativeObjectDidLoad:");
|
|
58
|
+
if (self.onDidLoadCallback != nil) {
|
|
59
|
+
self.title = nativeObject.title;
|
|
60
|
+
self.body = nativeObject.body;
|
|
61
|
+
self.badge = @"Ad"; //nativeObject.badge;
|
|
62
|
+
self.callToAction = nativeObject.callToAction;
|
|
63
|
+
self.clickUrl = @"https://developers.bluestack.app/"; //nativeObject.clickUrl;
|
|
64
|
+
self.iconUrl = @"https://creative.mng-ads.com/10/10394-15539.jpg"; //nativeObject.iconUrl;
|
|
65
|
+
self.coverImageUrl = @"https://creative.mng-ads.com/10/10394-15540.jpg"; //nativeObject.coverImageUrl;
|
|
66
|
+
|
|
67
|
+
self.onDidLoadCallback(self.nativeAdClient);
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
// //possibility to customize the badge title
|
|
71
|
+
// [nativeObject updateBadgeTitle:@"Publicité"];
|
|
72
|
+
// badgeView = nativeObject.badgeView;
|
|
73
|
+
// [_nativeObject registerViewForInteraction:self.nativeView withMediaView:self.backgroundImage withIconImageView:self.iconeImage withViewController:[APP_DELEGATE drawerViewController] withClickableView:self.callToActionButton];
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
- (void)adsAdapter:(MNGAdsAdapter *)adsAdapter nativeObjectDidFailWithError:(NSError *)error withCover:(BOOL)cover{
|
|
77
|
+
if (self.onDidFailCallback != nil) {
|
|
78
|
+
self.onDidFailCallback(self.nativeAdClient, (__bridge BSUTypeErrorRef)error);
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
@end
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
fileFormatVersion: 2
|
|
2
|
+
guid: cfa93ef5fe2e245c7b8edf58470f900a
|
|
3
|
+
PluginImporter:
|
|
4
|
+
externalObjects: {}
|
|
5
|
+
serializedVersion: 2
|
|
6
|
+
iconMap: {}
|
|
7
|
+
executionOrder: {}
|
|
8
|
+
defineConstraints: []
|
|
9
|
+
isPreloaded: 0
|
|
10
|
+
isOverridable: 1
|
|
11
|
+
isExplicitlyReferenced: 0
|
|
12
|
+
validateReferences: 1
|
|
13
|
+
platformData:
|
|
14
|
+
- first:
|
|
15
|
+
Any:
|
|
16
|
+
second:
|
|
17
|
+
enabled: 0
|
|
18
|
+
settings: {}
|
|
19
|
+
- first:
|
|
20
|
+
Editor: Editor
|
|
21
|
+
second:
|
|
22
|
+
enabled: 0
|
|
23
|
+
settings:
|
|
24
|
+
DefaultValueInitialized: true
|
|
25
|
+
- first:
|
|
26
|
+
iPhone: iOS
|
|
27
|
+
second:
|
|
28
|
+
enabled: 1
|
|
29
|
+
settings: {}
|
|
30
|
+
- first:
|
|
31
|
+
tvOS: tvOS
|
|
32
|
+
second:
|
|
33
|
+
enabled: 1
|
|
34
|
+
settings: {}
|
|
35
|
+
userData:
|
|
36
|
+
assetBundleName:
|
|
37
|
+
assetBundleVariant:
|
package/Plugins/iOS/BSUTypes.h
CHANGED
|
@@ -85,3 +85,15 @@ typedef void (*BSUOnBannerDidFailToRefreshCallback)(BSUTypeBannerClientRef *bann
|
|
|
85
85
|
typedef void (*BSUOnBannerHideCallback)(BSUTypeBannerClientRef *bannerClient);
|
|
86
86
|
|
|
87
87
|
typedef void (*BSUOnBannerDisplayCallback)(BSUTypeBannerClientRef *bannerClient);
|
|
88
|
+
|
|
89
|
+
|
|
90
|
+
|
|
91
|
+
|
|
92
|
+
typedef const void *BSUTypeNativeAdRef;
|
|
93
|
+
|
|
94
|
+
typedef const void *BSUTypeNativeAdClientRef;
|
|
95
|
+
|
|
96
|
+
typedef void (*BSUOnNativeAdDidLoadCallback)(BSUTypeNativeAdClientRef *nativeAdClient);
|
|
97
|
+
|
|
98
|
+
typedef void (*BSUOnNativeAdDidFailCallback)(
|
|
99
|
+
BSUTypeNativeAdClientRef *nativeAdClient, BSUTypeErrorRef error);
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
using System;
|
|
2
2
|
using Azerion.BlueStack.Internal;
|
|
3
|
+
using Azerion.BlueStack.Common;
|
|
3
4
|
using UnityEngine;
|
|
4
5
|
|
|
5
6
|
namespace Azerion.BlueStack.API
|
|
@@ -23,6 +24,7 @@ namespace Azerion.BlueStack.API
|
|
|
23
24
|
Instance._blueStackClient.Initialize(appId, settings, sdkInitCompleteAction, client => {
|
|
24
25
|
if (adaptersInitCompleteAction != null) adaptersInitCompleteAction.Invoke(new AdaptersInitializationStatus(client));
|
|
25
26
|
});
|
|
27
|
+
AdsEventExecutor.Initialize();
|
|
26
28
|
}
|
|
27
29
|
|
|
28
30
|
internal static IClientsFactory GetClientsFactory()
|
|
@@ -44,9 +46,9 @@ namespace Azerion.BlueStack.API
|
|
|
44
46
|
else
|
|
45
47
|
{
|
|
46
48
|
const string factoryClassName = "Azerion.BlueStack.Platforms.UnityEditor.ClientsFactory";
|
|
47
|
-
Debug.Log(factoryClassName);
|
|
49
|
+
// Debug.Log(factoryClassName);
|
|
48
50
|
Type type = Type.GetType(factoryClassName, true);
|
|
49
|
-
Debug.Log("Client Type: " + type.ToString());
|
|
51
|
+
// Debug.Log("Client Type: " + type.ToString());
|
|
50
52
|
_clientsFactory = (IClientsFactory)Activator.CreateInstance(type);
|
|
51
53
|
}
|
|
52
54
|
}
|
|
@@ -0,0 +1,182 @@
|
|
|
1
|
+
using System;
|
|
2
|
+
using Azerion.BlueStack.Internal;
|
|
3
|
+
using Azerion.BlueStack.Common;
|
|
4
|
+
using UnityEngine;
|
|
5
|
+
using UnityEngine.UI;
|
|
6
|
+
|
|
7
|
+
namespace Azerion.BlueStack.API
|
|
8
|
+
{
|
|
9
|
+
public class NativeAd
|
|
10
|
+
{
|
|
11
|
+
private INativeAdClient _nativeAdClient;
|
|
12
|
+
|
|
13
|
+
private Texture2D _iconTexture;
|
|
14
|
+
private Texture2D _imageTexture;
|
|
15
|
+
private bool _isTextureLoaded;
|
|
16
|
+
|
|
17
|
+
public event EventHandler<EventArgs> OnNativeAdDidLoad;
|
|
18
|
+
public event EventHandler<BlueStackError> OnNativeAdDidFail;
|
|
19
|
+
public event EventHandler<EventArgs> OnNativeAdImpression;
|
|
20
|
+
public event EventHandler<EventArgs> OnNativeAdClicked;
|
|
21
|
+
public event EventHandler<EventArgs> OnNativeAdOpening;
|
|
22
|
+
public event EventHandler<EventArgs> OnNativeAdClosed;
|
|
23
|
+
|
|
24
|
+
private NativeAdInteractionHandler _nativeAdInteractionHandler;
|
|
25
|
+
|
|
26
|
+
public NativeAd(string placementId) : this(placementId,
|
|
27
|
+
BlueStackAds.GetClientsFactory().CreateNativeAdClient())
|
|
28
|
+
{
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
internal NativeAd(string placementId, INativeAdClient nativeAdClient)
|
|
32
|
+
{
|
|
33
|
+
// AdsEventExecutor.Initialize();
|
|
34
|
+
_nativeAdClient = nativeAdClient;
|
|
35
|
+
_nativeAdClient.Create(placementId);
|
|
36
|
+
ConfigureEvents();
|
|
37
|
+
InitializeTextures();
|
|
38
|
+
_nativeAdInteractionHandler = new NativeAdInteractionHandler();
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
private void ConfigureEvents()
|
|
42
|
+
{
|
|
43
|
+
_nativeAdClient.OnNativeAdDidLoad += (sender, args) => {
|
|
44
|
+
AdsEventExecutor.ExecuteInUpdate(delegate
|
|
45
|
+
{
|
|
46
|
+
LoadTextures();
|
|
47
|
+
});
|
|
48
|
+
SetClickUrl();
|
|
49
|
+
};
|
|
50
|
+
_nativeAdClient.OnNativeAdDidFail += (sender, args) => { OnNativeAdDidFail?.Invoke(this, args); };
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
public void Load()
|
|
54
|
+
{
|
|
55
|
+
_nativeAdClient.Load();
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
public void Load(Preference preference)
|
|
59
|
+
{
|
|
60
|
+
_nativeAdClient.Load(preference.getIPreferenceClient());
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
private void InitializeTextures()
|
|
64
|
+
{
|
|
65
|
+
this._iconTexture = null;
|
|
66
|
+
this._imageTexture = null;
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
private void LoadTextures()
|
|
70
|
+
{
|
|
71
|
+
// Debug.Log("GetIconUrl: " + _nativeAdClient.GetIconUrl());
|
|
72
|
+
AdsEventExecutor.instance.StartCoroutine(NativeUtils.LoadImage(_nativeAdClient.GetIconUrl(),
|
|
73
|
+
delegate(Texture2D texture)
|
|
74
|
+
{
|
|
75
|
+
this._iconTexture = texture;
|
|
76
|
+
// Debug.Log("texture: " + this._iconTexture.name);
|
|
77
|
+
if (this._imageTexture != null && this._iconTexture != null)
|
|
78
|
+
{
|
|
79
|
+
OnNativeAdDidLoad?.Invoke(this, EventArgs.Empty);
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
));
|
|
83
|
+
// Debug.Log("GetCoverImageUrl: " + _nativeAdClient.GetCoverImageUrl());
|
|
84
|
+
AdsEventExecutor.instance.StartCoroutine(NativeUtils.LoadImage(_nativeAdClient.GetCoverImageUrl(),
|
|
85
|
+
delegate(Texture2D texture)
|
|
86
|
+
{
|
|
87
|
+
this._imageTexture = texture;
|
|
88
|
+
if (this._imageTexture != null && this._iconTexture != null)
|
|
89
|
+
{
|
|
90
|
+
OnNativeAdDidLoad?.Invoke(this, EventArgs.Empty);
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
));
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
public string GetTitle()
|
|
97
|
+
{
|
|
98
|
+
Debug.Log("GetTitle: " + _nativeAdClient.GetTitle());
|
|
99
|
+
// LoadTextures();
|
|
100
|
+
return _nativeAdClient.GetTitle();
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
public string GetBodyText()
|
|
104
|
+
{
|
|
105
|
+
return _nativeAdClient.GetBodyText();
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
public string GetCallToActionText()
|
|
109
|
+
{
|
|
110
|
+
return _nativeAdClient.GetCallToActionText();
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
public byte[] GetBadgeBytes()
|
|
114
|
+
{
|
|
115
|
+
return _nativeAdClient.GetBadgeBytes();
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
public string GetBadge()
|
|
119
|
+
{
|
|
120
|
+
return _nativeAdClient.GetBadge();
|
|
121
|
+
}
|
|
122
|
+
|
|
123
|
+
public Texture2D GetIconTexture()
|
|
124
|
+
{
|
|
125
|
+
return this._iconTexture;
|
|
126
|
+
}
|
|
127
|
+
|
|
128
|
+
public Texture2D GetCoverImageTexture()
|
|
129
|
+
{
|
|
130
|
+
return this._imageTexture;
|
|
131
|
+
}
|
|
132
|
+
|
|
133
|
+
private void SetClickUrl()
|
|
134
|
+
{
|
|
135
|
+
_nativeAdInteractionHandler.SetClickUrl(_nativeAdClient.GetClickUrl());
|
|
136
|
+
}
|
|
137
|
+
|
|
138
|
+
public bool RegisterTitleTextGameObject(GameObject gameObject)
|
|
139
|
+
{
|
|
140
|
+
return _nativeAdInteractionHandler.RegisterHeadlineTextGameObject(gameObject);
|
|
141
|
+
}
|
|
142
|
+
|
|
143
|
+
public bool RegisterBodyTextGameObject(GameObject gameObject)
|
|
144
|
+
{
|
|
145
|
+
return _nativeAdInteractionHandler.RegisterBodyTextGameObject(gameObject);
|
|
146
|
+
}
|
|
147
|
+
|
|
148
|
+
public bool RegisterImageGameObject(GameObject gameObject)
|
|
149
|
+
{
|
|
150
|
+
return _nativeAdInteractionHandler.RegisterImageGameObjects(gameObject);
|
|
151
|
+
}
|
|
152
|
+
|
|
153
|
+
public bool RegisterIconImageGameObject(GameObject gameObject)
|
|
154
|
+
{
|
|
155
|
+
return _nativeAdInteractionHandler.RegisterIconImageGameObject(gameObject);
|
|
156
|
+
}
|
|
157
|
+
|
|
158
|
+
public bool RegisterCallToActionGameObject(GameObject gameObject)
|
|
159
|
+
{
|
|
160
|
+
return _nativeAdInteractionHandler.RegisterCallToActionGameObject(gameObject);
|
|
161
|
+
}
|
|
162
|
+
|
|
163
|
+
public bool RegisterBadgeTextGameObject(GameObject gameObject)
|
|
164
|
+
{
|
|
165
|
+
return _nativeAdInteractionHandler.RegisterAdvertiserTextGameObject(gameObject);
|
|
166
|
+
}
|
|
167
|
+
|
|
168
|
+
|
|
169
|
+
public void Destroy()
|
|
170
|
+
{
|
|
171
|
+
_nativeAdClient.Destroy();
|
|
172
|
+
}
|
|
173
|
+
|
|
174
|
+
~NativeAd()
|
|
175
|
+
{
|
|
176
|
+
AdsEventExecutor.ExecuteInUpdate(delegate
|
|
177
|
+
{
|
|
178
|
+
Destroy();
|
|
179
|
+
});
|
|
180
|
+
}
|
|
181
|
+
}
|
|
182
|
+
}
|
|
@@ -0,0 +1,157 @@
|
|
|
1
|
+
using System;
|
|
2
|
+
using System.Collections.Generic;
|
|
3
|
+
using Azerion.BlueStack.Common;
|
|
4
|
+
using Azerion.BlueStack.Internal;
|
|
5
|
+
using Castle.Components.DictionaryAdapter.Xml;
|
|
6
|
+
using UnityEngine;
|
|
7
|
+
|
|
8
|
+
namespace Azerion.BlueStack.API
|
|
9
|
+
{
|
|
10
|
+
public class NativeAdInteractionHandler
|
|
11
|
+
{
|
|
12
|
+
private List<NativeAdObject> _nativeAdObjects;
|
|
13
|
+
|
|
14
|
+
private INativeAdInteractionHandlerClient _nativeAdInteractionHandlerClient;
|
|
15
|
+
|
|
16
|
+
// public NativeAdInteractionHandler(INativeAdInteractionHandlerClient interactionHandlerClient)
|
|
17
|
+
|
|
18
|
+
private string _clickUrl;
|
|
19
|
+
public NativeAdInteractionHandler()
|
|
20
|
+
{
|
|
21
|
+
// _nativeAdInteractionHandlerClient = interactionHandlerClient;
|
|
22
|
+
_nativeAdObjects = new List<NativeAdObject>();
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
public bool RegisterImageGameObjects(GameObject gameObject)
|
|
26
|
+
{
|
|
27
|
+
return RegisterGameObject(gameObject, NativeAssetID.Image);
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
public bool RegisterIconImageGameObject(GameObject gameObject)
|
|
31
|
+
{
|
|
32
|
+
return RegisterGameObject(gameObject, NativeAssetID.Icon);
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
public bool RegisterAdChoicesLogoGameObject(GameObject gameObject)
|
|
36
|
+
{
|
|
37
|
+
return RegisterGameObject(gameObject, NativeAssetID.AdChoices);
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
public bool RegisterHeadlineTextGameObject(GameObject gameObject)
|
|
41
|
+
{
|
|
42
|
+
return RegisterGameObject(gameObject, NativeAssetID.Headline);
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
public bool RegisterBodyTextGameObject(GameObject gameObject)
|
|
46
|
+
{
|
|
47
|
+
return RegisterGameObject(gameObject, NativeAssetID.Body);
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
public bool RegisterCallToActionGameObject(GameObject gameObject)
|
|
51
|
+
{
|
|
52
|
+
return RegisterGameObject(gameObject, NativeAssetID.CallToAction);
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
public bool RegisterAdvertiserTextGameObject(GameObject gameObject)
|
|
56
|
+
{
|
|
57
|
+
return RegisterGameObject(gameObject, NativeAssetID.Advertiser);
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
public bool RegisterPriceGameObject(GameObject gameObject)
|
|
61
|
+
{
|
|
62
|
+
return RegisterGameObject(gameObject, NativeAssetID.Price);
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
public bool RegisterStoreGameObject(GameObject gameObject)
|
|
66
|
+
{
|
|
67
|
+
return RegisterGameObject(gameObject, NativeAssetID.Store);
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
private bool RegisterGameObject(GameObject adObject, NativeAssetID assetID)
|
|
71
|
+
{
|
|
72
|
+
return Register(adObject, assetID.Value); // replace with GetAssetIDMappings
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
private bool Register(GameObject adObject, string assetID, bool isClickable = false)
|
|
76
|
+
{
|
|
77
|
+
NativeAdObject nativeAdObject = adObject.GetComponent<NativeAdObject>();
|
|
78
|
+
if (nativeAdObject != null)
|
|
79
|
+
{
|
|
80
|
+
UnityEngine.Object.DestroyImmediate(nativeAdObject);
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
nativeAdObject = adObject.AddComponent<NativeAdObject>();
|
|
84
|
+
_nativeAdObjects.Add(nativeAdObject);
|
|
85
|
+
nativeAdObject.OnAdDisplay += RecordImpression;
|
|
86
|
+
nativeAdObject.OnAdClick += RecordClick;
|
|
87
|
+
try
|
|
88
|
+
{
|
|
89
|
+
nativeAdObject.Initialize(assetID, isClickable);
|
|
90
|
+
}
|
|
91
|
+
catch (InvalidOperationException ex)
|
|
92
|
+
{
|
|
93
|
+
// Debug.LogWarning("Failed to Register " + assetID + " :" + ex.Message);
|
|
94
|
+
UnityEngine.Object.Destroy(nativeAdObject);
|
|
95
|
+
_nativeAdObjects.Remove(nativeAdObject);
|
|
96
|
+
return false;
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
return true;
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
private bool impressionComplete = false;
|
|
103
|
+
private bool clickComplete = false;
|
|
104
|
+
|
|
105
|
+
internal void SetClickUrl(string url)
|
|
106
|
+
{
|
|
107
|
+
_clickUrl = url;
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
// Handle Ad Impression - Incomplete
|
|
111
|
+
private void RecordImpression(object sender, EventArgs eventArgs)
|
|
112
|
+
{
|
|
113
|
+
impressionComplete = true;
|
|
114
|
+
Debug.LogWarning("Impression Complete");
|
|
115
|
+
|
|
116
|
+
if (sender is NativeAdObject nativeAdObject)
|
|
117
|
+
{
|
|
118
|
+
if (_nativeAdInteractionHandlerClient.RecordImpression(NativeAdInteractionUtils.CreateImpressionSignal(nativeAdObject, _nativeAdObjects)))
|
|
119
|
+
{
|
|
120
|
+
foreach (NativeAdObject adObject in _nativeAdObjects)
|
|
121
|
+
{
|
|
122
|
+
if(adObject != null)
|
|
123
|
+
adObject.StopImpressionCheck();
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
|
|
129
|
+
// Handle Ad Clicked - Incomplete
|
|
130
|
+
private void RecordClick(object sender, ClickEventArgs clickEventArgs)
|
|
131
|
+
{
|
|
132
|
+
// clickComplete = true;
|
|
133
|
+
Debug.Log("Record Click");
|
|
134
|
+
|
|
135
|
+
if (sender is NativeAdObject nativeAdObject)
|
|
136
|
+
{
|
|
137
|
+
Dictionary<string, string> touchEventSignal =
|
|
138
|
+
NativeAdInteractionUtils.CreateTouchEventSignal(clickEventArgs.startClick, clickEventArgs.endClick);
|
|
139
|
+
Dictionary<string, object> clickSignal =
|
|
140
|
+
NativeAdInteractionUtils.CreateClickSignal(nativeAdObject, _nativeAdObjects, clickEventArgs.startClick, clickEventArgs.endClick);
|
|
141
|
+
|
|
142
|
+
// _nativeAdInteractionHandlerClient.ReportTouchEvent(touchEventSignal);
|
|
143
|
+
Debug.LogWarning("InteractionHandlerClient: ReportTouchEvent!");
|
|
144
|
+
// _nativeAdInteractionHandlerClient.PerformClick(clickSignal);
|
|
145
|
+
Debug.LogWarning("InteractionHandlerClient: PerformClick!");
|
|
146
|
+
OpenURL();
|
|
147
|
+
}
|
|
148
|
+
}
|
|
149
|
+
|
|
150
|
+
public void OpenURL()
|
|
151
|
+
{
|
|
152
|
+
Debug.Log("Opened URL");
|
|
153
|
+
Application.OpenURL(_clickUrl);
|
|
154
|
+
}
|
|
155
|
+
|
|
156
|
+
}
|
|
157
|
+
}
|
|
@@ -0,0 +1,122 @@
|
|
|
1
|
+
using System;
|
|
2
|
+
using System.Collections.Generic;
|
|
3
|
+
using System.Globalization;
|
|
4
|
+
using System.Text;
|
|
5
|
+
using Azerion.BlueStack.Common;
|
|
6
|
+
using Azerion.BlueStack.Internal;
|
|
7
|
+
using Castle.Components.DictionaryAdapter.Xml;
|
|
8
|
+
using UnityEngine;
|
|
9
|
+
|
|
10
|
+
// incomplete
|
|
11
|
+
namespace Azerion.BlueStack.API
|
|
12
|
+
{
|
|
13
|
+
internal static class NativeAdInteractionUtils
|
|
14
|
+
{
|
|
15
|
+
public static Dictionary<string, string> CreateTouchEventSignal(ClickInfo currentPosition,
|
|
16
|
+
ClickInfo previousPosition)
|
|
17
|
+
{
|
|
18
|
+
Dictionary<string, string> signal = new Dictionary<string, string>();
|
|
19
|
+
signal.Add(GetHashedString("PreviousClickPosition.x"),
|
|
20
|
+
NativeUtils.ConvertPxToDp(previousPosition.clickPosition.x)
|
|
21
|
+
.ToString((IFormatProvider)CultureInfo.InvariantCulture));
|
|
22
|
+
signal.Add(GetHashedString("PreviousClickPosition.y"),
|
|
23
|
+
NativeUtils.ConvertPxToDp(previousPosition.clickPosition.y)
|
|
24
|
+
.ToString((IFormatProvider)CultureInfo.InvariantCulture));
|
|
25
|
+
signal.Add(GetHashedString("TimeInterval"),
|
|
26
|
+
Mathf.RoundToInt(previousPosition.clickTime - currentPosition.clickTime)
|
|
27
|
+
.ToString((IFormatProvider)CultureInfo.InvariantCulture));
|
|
28
|
+
return signal;
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
public static Dictionary<string, object> CreateClickSignal(NativeAdObject adComponent,
|
|
32
|
+
List<NativeAdObject> adComponents, ClickInfo currentPosition, ClickInfo previousPosition)
|
|
33
|
+
{
|
|
34
|
+
Dictionary<string, object> signal = new Dictionary<string, object>();
|
|
35
|
+
Dictionary<string, string> positionSignal = new Dictionary<string, string>();
|
|
36
|
+
Dictionary<string, object> clickSignal = new Dictionary<string, object>();
|
|
37
|
+
positionSignal.Add(GetHashedString("CurrentClickPosition.x"),
|
|
38
|
+
NativeUtils.ConvertPxToDp(currentPosition.clickPosition.x)
|
|
39
|
+
.ToString((IFormatProvider)CultureInfo.InvariantCulture));
|
|
40
|
+
positionSignal.Add(GetHashedString("CurrentClickPosition.y"),
|
|
41
|
+
NativeUtils.ConvertPxToDp(currentPosition.clickPosition.y)
|
|
42
|
+
.ToString((IFormatProvider)CultureInfo.InvariantCulture));
|
|
43
|
+
positionSignal.Add(GetHashedString("PreviousClickPosition.x"),
|
|
44
|
+
NativeUtils.ConvertPxToDp(previousPosition.clickPosition.x)
|
|
45
|
+
.ToString((IFormatProvider)CultureInfo.InvariantCulture));
|
|
46
|
+
positionSignal.Add(GetHashedString("PreviousClickPosition.y"),
|
|
47
|
+
NativeUtils.ConvertPxToDp(previousPosition.clickPosition.y)
|
|
48
|
+
.ToString((IFormatProvider)CultureInfo.InvariantCulture));
|
|
49
|
+
clickSignal = CreateImpressionSignal(adComponent, adComponents);
|
|
50
|
+
// positionSignal.Add(GetHashedString(""), GetHashedString(""));
|
|
51
|
+
signal.Add(GetHashedString("PositionSignal"), positionSignal);
|
|
52
|
+
signal.Add(GetHashedString("ObjectTag"), adComponent.ObjectTag);
|
|
53
|
+
clickSignal.Add(GetHashedString("Signal"), signal);
|
|
54
|
+
return clickSignal;
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
public static Dictionary<string, object> CreateImpressionSignal(NativeAdObject adComponent,
|
|
58
|
+
List<NativeAdObject> adComponents)
|
|
59
|
+
{
|
|
60
|
+
Dictionary<string, object> signal = new Dictionary<string, object>();
|
|
61
|
+
Dictionary<string, string> adData = new Dictionary<string, string>();
|
|
62
|
+
string version = BuildVersionString(NativeUtils.Version);
|
|
63
|
+
adData.Add(GetHashedString("Version"), version);
|
|
64
|
+
adData.Add(GetHashedString("InteractionTime"),
|
|
65
|
+
adComponent.InteractionTime.ToString((IFormatProvider)CultureInfo.InvariantCulture));
|
|
66
|
+
signal.Add(GetHashedString("AdData"), adData);
|
|
67
|
+
// signal.Add(GetHashedString(""), CreateAdData(adComponents));
|
|
68
|
+
return signal;
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
private static string GetHashedString(uint hash)
|
|
72
|
+
{
|
|
73
|
+
// Return the string representation of the hash
|
|
74
|
+
return hash.ToString();
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
private static string GetHashedString(string text, string salt = "")
|
|
78
|
+
{
|
|
79
|
+
if (String.IsNullOrEmpty(text))
|
|
80
|
+
{
|
|
81
|
+
return String.Empty;
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
// Uses SHA256 to create the hash
|
|
85
|
+
using (var sha = new System.Security.Cryptography.SHA256Managed())
|
|
86
|
+
{
|
|
87
|
+
// Convert the string to a byte array first, to be processed
|
|
88
|
+
byte[] textBytes = System.Text.Encoding.UTF8.GetBytes(text + salt);
|
|
89
|
+
byte[] hashBytes = sha.ComputeHash(textBytes);
|
|
90
|
+
|
|
91
|
+
// Convert back to a string, removing the '-' that BitConverter adds
|
|
92
|
+
string hash = BitConverter
|
|
93
|
+
.ToString(hashBytes)
|
|
94
|
+
.Replace("-", String.Empty);
|
|
95
|
+
|
|
96
|
+
return hash;
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
private static string Version
|
|
101
|
+
{
|
|
102
|
+
get
|
|
103
|
+
{
|
|
104
|
+
Version version = typeof(NativeAd).Assembly.GetName().Version;
|
|
105
|
+
return string.Format("{0}.{1}.{2}", version.Major, version.Minor, version.Build);
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
internal static string BuildVersionString(string nativePluginVersion = null)
|
|
110
|
+
{
|
|
111
|
+
StringBuilder stringBuilder = new StringBuilder("unity-");
|
|
112
|
+
stringBuilder.Append(Version);
|
|
113
|
+
if (!string.IsNullOrEmpty(nativePluginVersion))
|
|
114
|
+
{
|
|
115
|
+
stringBuilder.Append("-native-");
|
|
116
|
+
stringBuilder.Append(nativePluginVersion);
|
|
117
|
+
}
|
|
118
|
+
|
|
119
|
+
return stringBuilder.ToString();
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
}
|