Skip to content
This repository was archived by the owner on Nov 28, 2023. It is now read-only.

Commit 3870acb

Browse files
authored
Merge pull request #8 from Adikteev/release/3.0.0
release:v3.0.0
2 parents aeab343 + f816085 commit 3870acb

File tree

4 files changed

+215
-96
lines changed

4 files changed

+215
-96
lines changed

Assets/CrossDK/CrossDKConverter.cs

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@ public class CrossDKConverter
2424
private static AndroidJavaObject crossDKWrapper;
2525
private const string CONFIG = "config";
2626
private const string DISMISS = "dismissOverlay";
27+
private const string LOAD = "loadOverlay";
2728
private const string DISPLAY = "displayOverlay";
2829
#endif
2930

@@ -73,6 +74,24 @@ public static void DismissOverlay()
7374
#endif
7475
}
7576

77+
public static void LoadOverlayWithFormat(OverlayFormat format, OverlayPosition position, bool withCloseButton, bool isRewarded)
78+
{
79+
#if UNITY_EDITOR
80+
Debug.Log("DisplayOverlayWithFormat called in editor");
81+
#elif UNITY_IOS
82+
displayOverlayWithFormat((int)format, (int)position, withCloseButton, isRewarded);
83+
#endif
84+
#if UNITY_ANDROID
85+
object[] parameters = new object[4];
86+
parameters[0] = (int)format;
87+
parameters[1] = (int)position;
88+
parameters[2] = withCloseButton;
89+
parameters[3] = isRewarded;
90+
91+
crossDKWrapper.Call(LOAD, parameters);
92+
#endif
93+
}
94+
7695
public static void DisplayOverlayWithFormat(OverlayFormat format, OverlayPosition position, bool withCloseButton, bool isRewarded)
7796
{
7897
#if UNITY_EDITOR

Assets/CrossDK/CrossDKSingleton.cs

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,9 @@ public class CrossDKSingleton : MonoBehaviour
99
private static CrossDKSingleton _instance;
1010

1111
public delegate void CrossDKDelegate(string message);
12+
public static CrossDKDelegate overlayWillStartPreloadDelegate;
13+
public static CrossDKDelegate overlayDidFinishPreloadDelegate;
14+
public static CrossDKDelegate overlayPreloadExpiredDelegate;
1215
public static CrossDKDelegate overlayWillStartPresentationDelegate;
1316
public static CrossDKDelegate overlayDidFinishPresentationDelegate;
1417
public static CrossDKDelegate overlayWillStartDismissalDelegate;
@@ -60,6 +63,11 @@ public static void DismissOverlay()
6063
CrossDKConverter.DismissOverlay();
6164
}
6265

66+
public static void LoadOverlay(OverlayFormat format = OverlayFormat.Interstitial, OverlayPosition position = OverlayPosition.Bottom, bool withCloseButton = true, bool isRewarded = true)
67+
{
68+
CrossDKConverter.LoadOverlayWithFormat(format, position, withCloseButton, isRewarded);
69+
}
70+
6371
public static void DisplayOverlay(OverlayFormat format = OverlayFormat.Interstitial, OverlayPosition position = OverlayPosition.Bottom, bool withCloseButton = true, bool isRewarded = true)
6472
{
6573
CrossDKConverter.DisplayOverlayWithFormat(format, position, withCloseButton, isRewarded);
@@ -74,6 +82,21 @@ public static void DisplayOverlay(OverlayFormat format = OverlayFormat.Interstit
7482
// Logger.Log(message);
7583
//}
7684

85+
internal void OverlayWillStartPreload(string message)
86+
{
87+
overlayWillStartPreloadDelegate?.Invoke(message);
88+
}
89+
90+
internal void OverlayDidFinishPreload(string message)
91+
{
92+
overlayDidFinishPreloadDelegate?.Invoke(message);
93+
}
94+
95+
internal void OverlayPreloadExpired(string message)
96+
{
97+
overlayPreloadExpiredDelegate?.Invoke(message);
98+
}
99+
77100
internal void OverlayWillStartPresentation(string message)
78101
{
79102
overlayWillStartPresentationDelegate?.Invoke(message);

Assets/Plugins/Android/CrossDKBridge.kt

Lines changed: 147 additions & 79 deletions
Original file line numberDiff line numberDiff line change
@@ -24,15 +24,15 @@ import com.unity3d.player.UnityPlayer
2424
public class CrossDKBridge {
2525
private var mUnityPlayerActivity: Activity = UnityPlayer.currentActivity
2626
private var mOpenedOverlayFormat: OverlayFormat = OverlayFormat.NONE
27-
private lateinit var mCrossDKView: CrossDKView
28-
private lateinit var mCrossDKMidSizeView: CrossDKMidSizeView
29-
private lateinit var mCrossDKInterstitialView: CrossDKInterstitialView
27+
private var mCrossDKView: CrossDKView? = null
28+
private var mCrossDKMidSizeView: CrossDKMidSizeView? = null
29+
private var mCrossDKInterstitialView: CrossDKInterstitialView? = null
3030

3131
///////////////////////////////////////////////////////////////////////////
3232
// CONFIG
3333
///////////////////////////////////////////////////////////////////////////
3434

35-
public fun config(appId: String, apiKey: String, userId: String?, deviceId:String?) {
35+
public fun config(appId: String, apiKey: String, userId: String?, deviceId: String?) {
3636
CrossDKConfig.Builder()
3737
.apiKey(apiKey)
3838
.appId(appId)
@@ -50,83 +50,52 @@ public class CrossDKBridge {
5050
// DISPLAY
5151
///////////////////////////////////////////////////////////////////////////
5252

53-
public fun displayOverlay(
53+
public fun loadOverlay(
5454
format: Int,
5555
position: Int,
5656
isCloseButtonVisible: Boolean,
5757
isRewarded: Boolean
5858
) {
59-
val crossDKContentCallback = object : CrossDKContentCallback {
60-
override fun onConfigurationError() {
61-
unitySendOverlayError("Overlay error: configuration error")
62-
}
63-
64-
override fun onNoRecommendation() {
65-
unitySendOverlayError("Overlay error: unavailable recommendation")
66-
}
67-
68-
override fun onShowContentError() {
69-
unitySendOverlayError("Overlay error: show content error")
70-
}
71-
72-
override fun onRecommendationDisplayed() {
73-
overlayDidFinishPresentation()
74-
}
75-
76-
override fun onRecommendationClicked() {
77-
overlayShowsRecommendedAppInAppStore()
78-
}
79-
80-
override fun onRecommendationClosed() {
81-
overlayDidFinishDismissal()
82-
destroyViews()
83-
}
84-
85-
override fun onUnsupportedApiVersion() {
86-
unitySendOverlayError("Overlay error: unsupported Api version")
59+
mUnityPlayerActivity.runOnUiThread {
60+
overlayWillStartPreload()
61+
mOpenedOverlayFormat = OverlayFormat.fromInt(format)
62+
createFormat(position, isCloseButtonVisible, isRewarded)
63+
when (mOpenedOverlayFormat) {
64+
OverlayFormat.BANNER -> {
65+
mCrossDKView?.load(getCrossDKLoadCallback())
66+
}
67+
OverlayFormat.MID_SIZE -> {
68+
mCrossDKMidSizeView?.load(getCrossDKLoadCallback())
69+
}
70+
OverlayFormat.INTERSTITIAL -> {
71+
mCrossDKInterstitialView?.load(getCrossDKLoadCallback())
72+
}
73+
else -> {
74+
unitySendOverlayError("Overlay error: unsupported format requested")
75+
}
8776
}
8877
}
78+
}
79+
80+
public fun displayOverlay(
81+
format: Int,
82+
position: Int,
83+
isCloseButtonVisible: Boolean,
84+
isRewarded: Boolean
85+
) {
86+
overlayWillStartPresentation()
8987
mUnityPlayerActivity.runOnUiThread {
90-
if (mOpenedOverlayFormat != OverlayFormat.NONE) dismissOverlay()
91-
val overlayFormat = OverlayFormat.fromInt(format)
92-
mOpenedOverlayFormat = overlayFormat
93-
overlayWillStartPresentation()
94-
when (overlayFormat) {
88+
mOpenedOverlayFormat = OverlayFormat.fromInt(format)
89+
createFormat(position, isCloseButtonVisible, isRewarded)
90+
when (mOpenedOverlayFormat) {
9591
OverlayFormat.BANNER -> {
96-
mCrossDKView = CrossDKView(mUnityPlayerActivity)
97-
mCrossDKView.setCrossDKContentCallback(crossDKContentCallback)
98-
mCrossDKView.setCloseButtonVisibility(if (isCloseButtonVisible) View.VISIBLE else View.INVISIBLE)
99-
mUnityPlayerActivity.addContentView(mCrossDKView, getLayoutParams())
100-
mCrossDKView.setPosition(if (position == 0) CrossDKPosition.BOTTOM else CrossDKPosition.BOTTOM_RAISED)
92+
mCrossDKView?.show()
10193
}
10294
OverlayFormat.MID_SIZE -> {
103-
mCrossDKMidSizeView = CrossDKMidSizeView(mUnityPlayerActivity)
104-
mCrossDKMidSizeView.setCrossDKContentCallback(crossDKContentCallback)
105-
mCrossDKMidSizeView.setCloseButtonVisibility(if (isCloseButtonVisible) View.VISIBLE else View.INVISIBLE)
106-
mUnityPlayerActivity.addContentView(mCrossDKMidSizeView, getLayoutParams())
107-
mCrossDKMidSizeView.setPosition(if (position == 0) CrossDKPosition.BOTTOM else CrossDKPosition.BOTTOM_RAISED)
95+
mCrossDKMidSizeView?.show()
10896
}
10997
OverlayFormat.INTERSTITIAL -> {
110-
mCrossDKInterstitialView = CrossDKInterstitialView(mUnityPlayerActivity)
111-
mCrossDKInterstitialView.setCrossDKContentCallback(crossDKContentCallback)
112-
mCrossDKInterstitialView.setCloseButtonVisibility(if (isCloseButtonVisible) View.VISIBLE else View.INVISIBLE)
113-
mCrossDKInterstitialView.setRewarded(isRewarded,
114-
object : CrossDKRewardedCallback {
115-
override fun onUserRewarded() {
116-
overlayDidFinishPlayingVideo()
117-
overlayDidRewardUserWithReward()
118-
}
119-
})
120-
mUnityPlayerActivity.addContentView(mCrossDKInterstitialView, getLayoutParams())
121-
mCrossDKInterstitialView.load(object : CrossDKLoadCallback {
122-
override fun onRecommendationLoaded() {
123-
mCrossDKInterstitialView.show()
124-
}
125-
126-
override fun onRecommendationLoadFailure() {
127-
overlayDidFailToLoadWithError(java.lang.Exception("Recommendation load failure"))
128-
}
129-
})
98+
mCrossDKInterstitialView?.show()
13099
}
131100
else -> {
132101
unitySendOverlayError("Overlay error: unsupported format requested")
@@ -140,18 +109,18 @@ public class CrossDKBridge {
140109
mUnityPlayerActivity.runOnUiThread {
141110
when (mOpenedOverlayFormat) {
142111
OverlayFormat.BANNER -> {
143-
mCrossDKView.dismissView(true)
112+
mCrossDKView?.dismissView(true)
144113
destroyViews()
145114
}
146115
OverlayFormat.MID_SIZE -> {
147-
mCrossDKMidSizeView.dismissView(true)
116+
mCrossDKMidSizeView?.dismissView(true)
148117
destroyViews()
149118
}
150119
OverlayFormat.INTERSTITIAL -> {
151-
mCrossDKInterstitialView.dismissView(true)
120+
mCrossDKInterstitialView?.dismissView(true)
152121
destroyViews()
153122
}
154-
else -> {}
123+
OverlayFormat.NONE -> overlayDidFinishDismissal()
155124
}
156125
}
157126
}
@@ -160,27 +129,30 @@ public class CrossDKBridge {
160129
mUnityPlayerActivity.runOnUiThread {
161130
when (mOpenedOverlayFormat) {
162131
OverlayFormat.BANNER -> {
163-
mCrossDKView.destroy()
164-
val parentView = mCrossDKView.parent
132+
mCrossDKView?.destroy()
133+
val parentView = mCrossDKView?.parent
165134
if (parentView is ViewGroup) {
166135
parentView.removeView(mCrossDKView)
167136
}
137+
mCrossDKView = null
168138
}
169139
OverlayFormat.MID_SIZE -> {
170-
mCrossDKMidSizeView.destroy()
171-
val parentView = mCrossDKMidSizeView.parent
140+
mCrossDKMidSizeView?.destroy()
141+
val parentView = mCrossDKMidSizeView?.parent
172142
if (parentView is ViewGroup) {
173143
parentView.removeView(mCrossDKMidSizeView)
174144
}
145+
mCrossDKMidSizeView = null
175146
}
176147
OverlayFormat.INTERSTITIAL -> {
177-
mCrossDKInterstitialView.destroy()
178-
val parentView = mCrossDKInterstitialView.parent
148+
mCrossDKInterstitialView?.destroy()
149+
val parentView = mCrossDKInterstitialView?.parent
179150
if (parentView is ViewGroup) {
180151
parentView.removeView(mCrossDKInterstitialView)
181152
}
153+
mCrossDKInterstitialView = null
182154
}
183-
else -> {}
155+
else -> mOpenedOverlayFormat = OverlayFormat.NONE
184156
}
185157
mOpenedOverlayFormat = OverlayFormat.NONE
186158
}
@@ -190,6 +162,18 @@ public class CrossDKBridge {
190162
// LISTENERS
191163
///////////////////////////////////////////////////////////////////////////
192164

165+
private fun overlayWillStartPreload() {
166+
unitySendMessage("OverlayWillStartPreload", "Overlay will start preload");
167+
}
168+
169+
private fun overlayDidFinishedPreload() {
170+
unitySendMessage("OverlayDidFinishPreload", "Overlay did finish preload");
171+
}
172+
173+
private fun overlayPreloadExpired() {
174+
unitySendMessage("OverlayPreloadExpired", "Overlay preload expired");
175+
}
176+
193177
private fun overlayWillStartPresentation() {
194178
unitySendMessage("OverlayWillStartPresentation", "Overlay will start presentation");
195179
}
@@ -240,6 +224,42 @@ public class CrossDKBridge {
240224
// HELPERS
241225
///////////////////////////////////////////////////////////////////////////
242226

227+
private fun createFormat(
228+
position: Int,
229+
isCloseButtonVisible: Boolean,
230+
isRewarded: Boolean
231+
) {
232+
when {
233+
mOpenedOverlayFormat == OverlayFormat.BANNER && mCrossDKView == null -> {
234+
mCrossDKView = CrossDKView(mUnityPlayerActivity)
235+
mCrossDKView?.setCrossDKContentCallback(getCrossDKContentCallback())
236+
mCrossDKView?.setCloseButtonVisibility(if (isCloseButtonVisible) View.VISIBLE else View.INVISIBLE)
237+
mUnityPlayerActivity.addContentView(mCrossDKView, getLayoutParams())
238+
mCrossDKView?.setPosition(if (position == 0) CrossDKPosition.BOTTOM else CrossDKPosition.BOTTOM_RAISED)
239+
}
240+
mOpenedOverlayFormat == OverlayFormat.MID_SIZE && mCrossDKMidSizeView == null -> {
241+
mCrossDKMidSizeView = CrossDKMidSizeView(mUnityPlayerActivity)
242+
mCrossDKMidSizeView?.setCrossDKContentCallback(getCrossDKContentCallback())
243+
mCrossDKMidSizeView?.setCloseButtonVisibility(if (isCloseButtonVisible) View.VISIBLE else View.INVISIBLE)
244+
mUnityPlayerActivity.addContentView(mCrossDKMidSizeView, getLayoutParams())
245+
mCrossDKMidSizeView?.setPosition(if (position == 0) CrossDKPosition.BOTTOM else CrossDKPosition.BOTTOM_RAISED)
246+
}
247+
mOpenedOverlayFormat == OverlayFormat.INTERSTITIAL && mCrossDKInterstitialView == null -> {
248+
mCrossDKInterstitialView = CrossDKInterstitialView(mUnityPlayerActivity)
249+
mCrossDKInterstitialView?.setCrossDKContentCallback(getCrossDKContentCallback())
250+
mCrossDKInterstitialView?.setCloseButtonVisibility(if (isCloseButtonVisible) View.VISIBLE else View.INVISIBLE)
251+
mCrossDKInterstitialView?.setRewarded(isRewarded,
252+
object : CrossDKRewardedCallback {
253+
override fun onUserRewarded() {
254+
overlayDidFinishPlayingVideo()
255+
overlayDidRewardUserWithReward()
256+
}
257+
})
258+
mUnityPlayerActivity.addContentView(mCrossDKInterstitialView, getLayoutParams())
259+
}
260+
}
261+
}
262+
243263
private fun getLayoutParams(): FrameLayout.LayoutParams {
244264
val adParams = FrameLayout.LayoutParams(
245265
FrameLayout.LayoutParams.MATCH_PARENT, FrameLayout.LayoutParams.WRAP_CONTENT
@@ -266,4 +286,52 @@ public class CrossDKBridge {
266286
fun fromInt(value: Int) = values().first { it.value == value }
267287
}
268288
}
289+
290+
private fun getCrossDKLoadCallback() = object : CrossDKLoadCallback {
291+
override fun onRecommendationLoaded() {
292+
overlayDidFinishedPreload()
293+
}
294+
295+
override fun onRecommendationLoadFailure() {
296+
overlayDidFailToLoadWithError(java.lang.Exception("Recommendation load failure"))
297+
destroyViews()
298+
}
299+
300+
override fun onRecommendationExpired() {
301+
overlayPreloadExpired()
302+
destroyViews()
303+
}
304+
}
305+
306+
private fun getCrossDKContentCallback() = object : CrossDKContentCallback {
307+
override fun onConfigurationError() {
308+
unitySendOverlayError("Overlay error: configuration error")
309+
}
310+
311+
override fun onNoRecommendation() {
312+
unitySendOverlayError("Overlay error: unavailable recommendation")
313+
destroyViews()
314+
}
315+
316+
override fun onShowContentError() {
317+
unitySendOverlayError("Overlay error: show content error")
318+
}
319+
320+
override fun onRecommendationDisplayed() {
321+
overlayDidFinishPresentation()
322+
}
323+
324+
override fun onRecommendationClicked() {
325+
overlayShowsRecommendedAppInAppStore()
326+
}
327+
328+
override fun onRecommendationClosed() {
329+
overlayDidFinishDismissal()
330+
destroyViews()
331+
}
332+
333+
override fun onUnsupportedApiVersion() {
334+
unitySendOverlayError("Overlay error: unsupported Api version")
335+
}
336+
}
269337
}

0 commit comments

Comments
 (0)