Skip to content

Commit 0d21fc6

Browse files
committed
add helpers and info about adapters
1 parent 49e02f7 commit 0d21fc6

8 files changed

Lines changed: 104 additions & 23 deletions

File tree

.gitignore

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,3 +13,4 @@ builtins
1313
/debug.keystore.pass.txt
1414
/.editor_settings
1515
/.vscode
16+
*.eclipse.buildship.core.prefs

docs/index.md

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@ The extension can be configured by adding the following fields to `game.project`
2828
[admob]
2929
app_id_ios = ca-app-pub-3940256099942544~1458002511
3030
app_id_android = ca-app-pub-3940256099942544~3347511713
31+
test_ads_in_debug = 1
3132
app_open_android = ca-app-pub-3940256099942544/9257395921
3233
app_open_ios = ca-app-pub-3940256099942544/5575463023
3334
ios_tracking_usage_description = Your data will be used to provide you a better and personalized ad experience.
@@ -39,6 +40,9 @@ This is your iOS AdMob app ID. An app ID is a unique ID number assigned to your
3940
### app_id_android
4041
This is your Android AdMob app ID. An app ID is a unique ID number assigned to your apps when they're added to AdMob. The app ID is used to identify your apps.
4142

43+
### test_ads_in_debug
44+
Android only. When set to `1`, the extension enables test ads in non-release builds.
45+
4246
### app_open_android
4347
Ad unit to use for App Open ads on Android. If this value is set App Open Ads will be shown when the app is brought to the foreground.
4448

extension-admob/ext.properties

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,9 @@ app_id_ios.label = App ID iOS
99
app_id_android.type = string
1010
app_id_android.label = App ID Android
1111

12+
test_ads_in_debug.type = bool
13+
test_ads_in_debug.label = Testable In Debug
14+
1215
app_open_android.type = string
1316

1417
app_open_ios.type = string

extension-admob/manifests/android/build.gradle

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -88,11 +88,11 @@ dependencies {
8888
{{/admob.pangle_android}}
8989

9090
{{#admob.pubmatic_android}}
91-
implementation 'com.google.ads.mediation:pubmatic:4.11.0.0'
91+
implementation 'com.google.ads.mediation:pubmatic:4.11.0.1'
9292
{{/admob.pubmatic_android}}
9393

9494
{{#admob.unity_android}}
95-
implementation 'com.unity3d.ads:unity-ads:4.16.2'
95+
implementation 'com.unity3d.ads:unity-ads:4.16.5'
9696
implementation 'com.google.ads.mediation:unity:4.16.5.0'
9797
{{/admob.unity_android}}
9898
}

extension-admob/src/admob_android.cpp

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -159,11 +159,16 @@ void Initialize_Ext(dmExtension::Params* params, const char* defoldUserAgent)
159159

160160
InitJNIMethods(env, cls);
161161

162+
bool enableTestAds = false;
163+
#ifdef DM_DEBUG
164+
enableTestAds = dmConfigFile::GetInt(params->m_ConfigFile, "admob.test_ads_in_debug", 0) != 0;
165+
#endif
166+
162167
const char* appOpenAdUnitId = dmConfigFile::GetString(params->m_ConfigFile, "admob.app_open_android", 0);
163168
jstring jappOpenAdUnitId = env->NewStringUTF(appOpenAdUnitId);
164169
jstring jdefoldUserAgent = env->NewStringUTF(defoldUserAgent);
165-
jmethodID jni_constructor = env->GetMethodID(cls, "<init>", "(Landroid/app/Activity;Ljava/lang/String;Ljava/lang/String;)V");
166-
g_admob.m_AdmobJNI = env->NewGlobalRef(env->NewObject(cls, jni_constructor, threadAttacher.GetActivity()->clazz, jappOpenAdUnitId, jdefoldUserAgent));
170+
jmethodID jni_constructor = env->GetMethodID(cls, "<init>", "(Landroid/app/Activity;Ljava/lang/String;Ljava/lang/String;Z)V");
171+
g_admob.m_AdmobJNI = env->NewGlobalRef(env->NewObject(cls, jni_constructor, threadAttacher.GetActivity()->clazz, jappOpenAdUnitId, jdefoldUserAgent, (jboolean)enableTestAds));
167172
env->DeleteLocalRef(jappOpenAdUnitId);
168173
env->DeleteLocalRef(jdefoldUserAgent);
169174
}

extension-admob/src/java/com/defold/admob/AdmobJNI.java

Lines changed: 73 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@
1313
import android.view.ViewGroup.MarginLayoutParams;
1414
import android.content.Context;
1515
import android.content.SharedPreferences;
16+
import android.provider.Settings;
1617

1718
import androidx.lifecycle.LifecycleObserver;
1819
import androidx.lifecycle.ProcessLifecycleOwner;
@@ -33,9 +34,15 @@
3334
import com.google.android.gms.ads.AdInspectorError;
3435
import com.google.android.gms.ads.OnAdInspectorClosedListener;
3536
import com.google.android.gms.ads.RequestConfiguration;
37+
import com.google.android.gms.ads.initialization.AdapterStatus;
3638
import com.google.android.gms.ads.initialization.InitializationStatus;
3739
import com.google.android.gms.ads.initialization.OnInitializationCompleteListener;
3840

41+
import java.security.MessageDigest;
42+
import java.util.ArrayList;
43+
import java.util.List;
44+
import java.util.Map;
45+
3946
import com.google.android.gms.ads.interstitial.InterstitialAd;
4047
import com.google.android.gms.ads.interstitial.InterstitialAdLoadCallback;
4148

@@ -113,11 +120,13 @@ public class AdmobJNI implements LifecycleObserver {
113120
private Activity activity;
114121

115122

116-
public AdmobJNI(Activity activity, String appOpenAdUnitId, String defoldUserAgent) {
123+
public AdmobJNI(Activity activity, String appOpenAdUnitId, String defoldUserAgent, boolean testAdsInDebug) {
117124
this.activity = activity;
118125
this.mAppOpenAdUnitId = appOpenAdUnitId;
119126
this.defoldUserAgent = defoldUserAgent;
120127

128+
configureTestAdsIfNeeded(testAdsInDebug);
129+
121130
if (isAutomaticAppOpenEnabled()) {
122131
activity.runOnUiThread(new Runnable() {
123132
@Override
@@ -130,13 +139,70 @@ public void run() {
130139
}
131140
}
132141

142+
private void configureTestAdsIfNeeded(boolean testAdsInDebug) {
143+
if (!testAdsInDebug) {
144+
return;
145+
}
146+
List<String> testDeviceIds = new ArrayList<String>();
147+
testDeviceIds.add(AdRequest.DEVICE_ID_EMULATOR);
148+
String deviceId = getHashedDeviceId();
149+
if (deviceId != null && deviceId.length() > 0) {
150+
testDeviceIds.add(deviceId);
151+
}
152+
RequestConfiguration requestConfiguration = MobileAds.getRequestConfiguration()
153+
.toBuilder()
154+
.setTestDeviceIds(testDeviceIds)
155+
.build();
156+
MobileAds.setRequestConfiguration(requestConfiguration);
157+
Log.d(TAG, "Test ads enabled for this device: " + (deviceId != null ? deviceId : "unknown"));
158+
}
159+
160+
private String getHashedDeviceId() {
161+
String androidId = Settings.Secure.getString(activity.getContentResolver(), Settings.Secure.ANDROID_ID);
162+
if (androidId == null || androidId.length() == 0) {
163+
return null;
164+
}
165+
try {
166+
MessageDigest md = MessageDigest.getInstance("MD5");
167+
md.update(androidId.getBytes("UTF-8"));
168+
byte[] digest = md.digest();
169+
StringBuilder builder = new StringBuilder();
170+
for (int i = 0; i < digest.length; i++) {
171+
builder.append(String.format("%02X", digest[i] & 0xFF));
172+
}
173+
return builder.toString();
174+
} catch (Exception e) {
175+
Log.w(TAG, "Failed to compute test device id", e);
176+
return null;
177+
}
178+
}
179+
133180
public void initialize() {
134-
MobileAds.initialize(activity, new OnInitializationCompleteListener() {
135-
@Override
136-
public void onInitializationComplete(InitializationStatus initializationStatus) {
137-
sendSimpleMessage(MSG_INITIALIZATION, EVENT_COMPLETE);
138-
}
139-
});
181+
new Thread(new Runnable() {
182+
@Override
183+
public void run() {
184+
MobileAds.initialize(activity, new OnInitializationCompleteListener() {
185+
@Override
186+
public void onInitializationComplete(InitializationStatus initializationStatus) {
187+
logAdapterStatus(initializationStatus);
188+
sendSimpleMessage(MSG_INITIALIZATION, EVENT_COMPLETE);
189+
}
190+
});
191+
}
192+
}).start();
193+
}
194+
195+
private void logAdapterStatus(InitializationStatus initializationStatus) {
196+
Map<String, AdapterStatus> statusMap = initializationStatus.getAdapterStatusMap();
197+
for (Map.Entry<String, AdapterStatus> entry : statusMap.entrySet()) {
198+
String adapterClass = entry.getKey();
199+
AdapterStatus status = entry.getValue();
200+
Log.d(
201+
TAG,
202+
String.format(
203+
"Adapter name: %s, Description: %s, Latency: %d",
204+
adapterClass, status.getDescription(), status.getLatency()));
205+
}
140206
}
141207

142208
public void setPrivacySettings(boolean enable_rdp) {

game.project

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -38,3 +38,4 @@ app_id_android = ca-app-pub-3940256099942544~3347511713
3838
app_open_android = ca-app-pub-3940256099942544/9257395921
3939
app_open_ios = ca-app-pub-3940256099942544/5575463023
4040
ios_tracking_usage_description = Your data will be used to provide you a better and personalized ad experience.
41+
test_ads_in_debug = 1

main/ads.gui_script

Lines changed: 13 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -69,19 +69,20 @@ local function set_block_height(height)
6969
gui.set_size(height_b_node, size)
7070
end
7171

72+
local EVENT_TEXTS = {}
7273
if admob then
73-
local EVENT_TEXTS = {
74-
[admob.EVENT_CLOSED] = "EVENT_CLOSED: %s closed",
75-
[admob.EVENT_FAILED_TO_SHOW] = "EVENT_FAILED_TO_SHOW: %s failed to show",
76-
[admob.EVENT_OPENING] = "EVENT_OPENING: %s is opening",
77-
[admob.EVENT_FAILED_TO_LOAD] = "EVENT_FAILED_TO_LOAD: %s failed to load",
78-
[admob.EVENT_LOADED] = "EVENT_LOADED: %s loaded",
79-
[admob.EVENT_NOT_LOADED] = "EVENT_NOT_LOADED: %s can't call show before EVENT_LOADED",
80-
[admob.EVENT_EARNED_REWARD] = "EVENT_EARNED_REWARD: %s Reward",
81-
[admob.EVENT_IMPRESSION_RECORDED] = "EVENT_IMPRESSION_RECORDED: %s did record impression",
82-
[admob.EVENT_CLICKED] = "EVENT_CLICKED: %s clicked",
83-
[admob.EVENT_JSON_ERROR] = "EVENT_JSON_ERROR: %s Internal NE json error",
84-
}
74+
EVENT_TEXTS = {
75+
[admob.EVENT_CLOSED] = "EVENT_CLOSED: %s closed",
76+
[admob.EVENT_FAILED_TO_SHOW] = "EVENT_FAILED_TO_SHOW: %s failed to show",
77+
[admob.EVENT_OPENING] = "EVENT_OPENING: %s is opening",
78+
[admob.EVENT_FAILED_TO_LOAD] = "EVENT_FAILED_TO_LOAD: %s failed to load",
79+
[admob.EVENT_LOADED] = "EVENT_LOADED: %s loaded",
80+
[admob.EVENT_NOT_LOADED] = "EVENT_NOT_LOADED: %s can't call show before EVENT_LOADED",
81+
[admob.EVENT_EARNED_REWARD] = "EVENT_EARNED_REWARD: %s Reward",
82+
[admob.EVENT_IMPRESSION_RECORDED] = "EVENT_IMPRESSION_RECORDED: %s did record impression",
83+
[admob.EVENT_CLICKED] = "EVENT_CLICKED: %s clicked",
84+
[admob.EVENT_JSON_ERROR] = "EVENT_JSON_ERROR: %s Internal NE json error",
85+
}
8586
end
8687

8788
local function print_event(ad_type, message)

0 commit comments

Comments
 (0)