1313import android .view .ViewGroup .MarginLayoutParams ;
1414import android .content .Context ;
1515import android .content .SharedPreferences ;
16+ import android .provider .Settings ;
1617
1718import androidx .lifecycle .LifecycleObserver ;
1819import androidx .lifecycle .ProcessLifecycleOwner ;
3334import com .google .android .gms .ads .AdInspectorError ;
3435import com .google .android .gms .ads .OnAdInspectorClosedListener ;
3536import com .google .android .gms .ads .RequestConfiguration ;
37+ import com .google .android .gms .ads .initialization .AdapterStatus ;
3638import com .google .android .gms .ads .initialization .InitializationStatus ;
3739import 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+
3946import com .google .android .gms .ads .interstitial .InterstitialAd ;
4047import 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 ) {
0 commit comments