diff --git a/.gitignore b/.gitignore index 3a38a5f..76ceb33 100644 --- a/.gitignore +++ b/.gitignore @@ -11,3 +11,5 @@ builtins /.idea/ /debug.keystore /debug.keystore.pass.txt +/.editor_settings +/.vscode \ No newline at end of file diff --git a/extension-admob/src/admob.cpp b/extension-admob/src/admob.cpp index b66c387..363643e 100644 --- a/extension-admob/src/admob.cpp +++ b/extension-admob/src/admob.cpp @@ -71,8 +71,13 @@ static int Lua_LoadRewarded(lua_State* L) if (lua_type(L, 1) != LUA_TSTRING) { return DM_LUA_ERROR("Expected string, got %s. Wrong type for Rewarded UnitId variable '%s'.", luaL_typename(L, 1), lua_tostring(L, 1)); } + if (lua_type(L, 2) != LUA_TSTRING) { + return DM_LUA_ERROR("Expected string, got %s. Wrong type for Rewarded UserId variable '%s'.", luaL_typename(L, 2), lua_tostring(L, 2)); + } const char* unitId_lua = luaL_checkstring(L, 1); - LoadRewarded(unitId_lua); + const char* userId_lua = luaL_checkstring(L, 2); + const char* customData_lua = lua_type(L,3) == LUA_TNONE ? nullptr : luaL_checkstring(L, 3); + LoadRewarded(unitId_lua, userId_lua, customData_lua); return 0; } diff --git a/extension-admob/src/admob_android.cpp b/extension-admob/src/admob_android.cpp index ffaa390..cd83f2c 100644 --- a/extension-admob/src/admob_android.cpp +++ b/extension-admob/src/admob_android.cpp @@ -93,6 +93,20 @@ static void CallVoidMethodCharBoolean(jobject instance, jmethodID method, const env->DeleteLocalRef(jstr); } +static void CallVoidMethodCharCharChar(jobject instance, jmethodID method, const char* cstr, const char* cstr2, const char* cstr3) +{ + dmAndroid::ThreadAttacher threadAttacher; + JNIEnv* env = threadAttacher.GetEnv(); + + jstring jstr = env->NewStringUTF(cstr); + jstring jstr2 = env->NewStringUTF(cstr2); + jstring jstr3 = env->NewStringUTF(cstr3); + env->CallVoidMethod(instance, method, jstr, jstr2, jstr3); + env->DeleteLocalRef(jstr); + env->DeleteLocalRef(jstr2); + env->DeleteLocalRef(jstr3); +} + static void CallVoidMethodInt(jobject instance, jmethodID method, int cint) { dmAndroid::ThreadAttacher threadAttacher; @@ -116,7 +130,7 @@ static void InitJNIMethods(JNIEnv* env, jclass cls) g_admob.m_ShowAppOpen = env->GetMethodID(cls, "showAppOpen", "()V"); g_admob.m_LoadInterstitial = env->GetMethodID(cls, "loadInterstitial", "(Ljava/lang/String;)V"); g_admob.m_ShowInterstitial = env->GetMethodID(cls, "showInterstitial", "()V"); - g_admob.m_LoadRewarded = env->GetMethodID(cls, "loadRewarded", "(Ljava/lang/String;)V"); + g_admob.m_LoadRewarded = env->GetMethodID(cls, "loadRewarded", "(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)V"); g_admob.m_ShowRewarded = env->GetMethodID(cls, "showRewarded", "()V"); g_admob.m_LoadRewardedInterstitial = env->GetMethodID(cls, "loadRewardedInterstitial", "(Ljava/lang/String;)V"); g_admob.m_ShowRewardedInterstitial = env->GetMethodID(cls, "showRewardedInterstitial", "()V"); @@ -193,9 +207,9 @@ bool IsInterstitialLoaded() return CallBoolMethod(g_admob.m_AdmobJNI, g_admob.m_IsInterstitialLoaded); } -void LoadRewarded(const char* unitId) +void LoadRewarded(const char* unitId, const char* userId, const char* customData) { - CallVoidMethodChar(g_admob.m_AdmobJNI, g_admob.m_LoadRewarded, unitId); + CallVoidMethodCharCharChar(g_admob.m_AdmobJNI, g_admob.m_LoadRewarded, unitId, userId, customData); } void ShowRewarded() diff --git a/extension-admob/src/admob_ios.mm b/extension-admob/src/admob_ios.mm index 7954586..51341b8 100755 --- a/extension-admob/src/admob_ios.mm +++ b/extension-admob/src/admob_ios.mm @@ -276,7 +276,14 @@ void SetRewardedAd(GADRewardedAd *newAd) { rewardedAd = newAd; } - void LoadRewarded(const char* unitId) { + void LoadRewarded(const char* unitId, const char* userId, const char* customData) { + GADServerSideVerificationOptions *ssvOptions = [[GADServerSideVerificationOptions alloc] init]; + if (userId) { + ssvOptions.userIdentifier = [NSString stringWithUTF8String:userId]; + } + if (customData) { + ssvOptions.customRewardString = [NSString stringWithUTF8String:customData]; + } [GADRewardedAd loadWithAdUnitID:[NSString stringWithUTF8String:unitId] request:createGADRequest() @@ -288,6 +295,7 @@ void LoadRewarded(const char* unitId) { @"error", [NSString stringWithFormat:@"Error domain: \"%@\". %@", [error domain], [error localizedDescription]]); return; } + ad.serverSideVerificationOptions = ssvOptions; SetRewardedAd(ad); SendSimpleMessage(MSG_REWARDED, EVENT_LOADED); }]; diff --git a/extension-admob/src/admob_private.h b/extension-admob/src/admob_private.h index 68d15e3..6c8492e 100644 --- a/extension-admob/src/admob_private.h +++ b/extension-admob/src/admob_private.h @@ -52,7 +52,7 @@ void LoadAppOpen(const char* unitId, bool showImmediately); void ShowAppOpen(); void LoadInterstitial(const char* unitId); void ShowInterstitial(); -void LoadRewarded(const char* unitId); +void LoadRewarded(const char* unitId, const char* userId, const char* customData); void ShowRewarded(); void LoadRewardedInterstitial(const char* unitId); void ShowRewardedInterstitial(); diff --git a/extension-admob/src/java/com/defold/admob/AdmobJNI.java b/extension-admob/src/java/com/defold/admob/AdmobJNI.java index f579273..bce41c5 100644 --- a/extension-admob/src/java/com/defold/admob/AdmobJNI.java +++ b/extension-admob/src/java/com/defold/admob/AdmobJNI.java @@ -43,6 +43,7 @@ import com.google.android.gms.ads.rewarded.RewardItem; import com.google.android.gms.ads.rewarded.RewardedAd; import com.google.android.gms.ads.rewarded.RewardedAdLoadCallback; +import com.google.android.gms.ads.rewarded.ServerSideVerificationOptions; import com.google.android.gms.ads.rewardedinterstitial.RewardedInterstitialAd; import com.google.android.gms.ads.rewardedinterstitial.RewardedInterstitialAdLoadCallback; @@ -505,7 +506,18 @@ public boolean isInterstitialLoaded() { private RewardedAd mRewardedAd; - public void loadRewarded(final String unitId) { + private void setRewardedCustomData(final String userId, final String customData) { + if( userId != null) + { + ServerSideVerificationOptions options = new ServerSideVerificationOptions.Builder() + .setUserId(userId) + .setCustomData(customData != null ? customData : "") + .build(); + mRewardedAd.setServerSideVerificationOptions(options); + } + } + + public void loadRewarded(final String unitId, final String userId, final String customData) { activity.runOnUiThread(new Runnable() { @Override public void run() { @@ -518,6 +530,7 @@ public void onAdLoaded(@NonNull RewardedAd rewardedAd) { // Log.d(TAG, "onAdLoaded"); mRewardedAd = rewardedAd; sendSimpleMessage(MSG_REWARDED, EVENT_LOADED); + setRewardedCustomData(userId, customData); mRewardedAd.setFullScreenContentCallback(new FullScreenContentCallback() { @Override public void onAdDismissedFullScreenContent() {