adwhale-sdk-react-native 2.7.101 → 2.7.200

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.
Files changed (50) hide show
  1. package/README.md +4 -4
  2. package/android/build.gradle +9 -6
  3. package/android/proguard-rules.pro +18 -1
  4. package/android/src/main/java/com/adwhalesdkreactnative/AdwhaleSdkReactNativePackage.java +24 -4
  5. package/android/src/main/java/com/adwhalesdkreactnative/RNAdWhaleMediationAdView.java +32 -0
  6. package/android/src/main/java/com/adwhalesdkreactnative/RNAdWhaleMediationAppOpenAd.java +240 -0
  7. package/android/src/main/java/com/adwhalesdkreactnative/RNAdWhaleMediationCustomNativeAdView.java +32 -0
  8. package/android/src/main/java/com/adwhalesdkreactnative/RNAdWhaleMediationInterstitialAd.java +33 -2
  9. package/android/src/main/java/com/adwhalesdkreactnative/RNAdWhaleMediationLoggerModule.java +14 -0
  10. package/android/src/main/java/com/adwhalesdkreactnative/RNAdWhaleMediationRewardAd.java +33 -0
  11. package/android/src/main/java/com/adwhalesdkreactnative/RNAdWhaleMediationTemplateNativeAdView.java +31 -2
  12. package/lib/module/AdWhaleAppOpenAd.js +58 -0
  13. package/lib/module/AdWhaleAppOpenAd.js.map +1 -0
  14. package/lib/module/AdWhaleBannerView.js.map +1 -1
  15. package/lib/module/AdWhaleInterstitialAd.js +12 -1
  16. package/lib/module/AdWhaleInterstitialAd.js.map +1 -1
  17. package/lib/module/AdWhaleMediationSdk.js +6 -0
  18. package/lib/module/AdWhaleMediationSdk.js.map +1 -1
  19. package/lib/module/AdWhaleNativeCustomView.js.map +1 -1
  20. package/lib/module/AdWhaleNativeTemplateView.js.map +1 -1
  21. package/lib/module/AdWhaleRewardAd.js +12 -1
  22. package/lib/module/AdWhaleRewardAd.js.map +1 -1
  23. package/lib/module/index.js +4 -2
  24. package/lib/module/index.js.map +1 -1
  25. package/lib/typescript/src/AdWhaleAppOpenAd.d.ts +27 -0
  26. package/lib/typescript/src/AdWhaleAppOpenAd.d.ts.map +1 -0
  27. package/lib/typescript/src/AdWhaleBannerView.d.ts +7 -0
  28. package/lib/typescript/src/AdWhaleBannerView.d.ts.map +1 -1
  29. package/lib/typescript/src/AdWhaleInterstitialAd.d.ts +9 -1
  30. package/lib/typescript/src/AdWhaleInterstitialAd.d.ts.map +1 -1
  31. package/lib/typescript/src/AdWhaleMediationSdk.d.ts +1 -0
  32. package/lib/typescript/src/AdWhaleMediationSdk.d.ts.map +1 -1
  33. package/lib/typescript/src/AdWhaleNativeCustomView.d.ts +7 -0
  34. package/lib/typescript/src/AdWhaleNativeCustomView.d.ts.map +1 -1
  35. package/lib/typescript/src/AdWhaleNativeTemplateView.d.ts +8 -1
  36. package/lib/typescript/src/AdWhaleNativeTemplateView.d.ts.map +1 -1
  37. package/lib/typescript/src/AdWhaleRewardAd.d.ts +9 -1
  38. package/lib/typescript/src/AdWhaleRewardAd.d.ts.map +1 -1
  39. package/lib/typescript/src/index.d.ts +2 -0
  40. package/lib/typescript/src/index.d.ts.map +1 -1
  41. package/package.json +5 -2
  42. package/plugin/index.js +135 -4
  43. package/src/AdWhaleAppOpenAd.ts +118 -0
  44. package/src/AdWhaleBannerView.tsx +8 -0
  45. package/src/AdWhaleInterstitialAd.ts +27 -1
  46. package/src/AdWhaleMediationSdk.ts +10 -0
  47. package/src/AdWhaleNativeCustomView.tsx +8 -0
  48. package/src/AdWhaleNativeTemplateView.tsx +9 -1
  49. package/src/AdWhaleRewardAd.ts +27 -1
  50. package/src/index.ts +12 -2
package/README.md CHANGED
@@ -43,16 +43,16 @@ npm install adwhale-sdk-react-native
43
43
  운영 안정성을 중시하는 경우
44
44
  ```json
45
45
  {
46
- "adwhale-sdk-react-native": "~2.7.101"
46
+ "adwhale-sdk-react-native": "~2.7.200"
47
47
  }
48
48
  ```
49
- - Android SDK 2.7.1 기반 유지
49
+ - Android SDK 2.7.2 기반 유지
50
50
  - RN 핫픽스만 자동 반영
51
51
 
52
52
  ### 동일한 Android SDK 기반의 최신 RN 수정만 사용
53
53
  ```json
54
54
  {
55
- "adwhale-sdk-react-native": "^2.7.101"
55
+ "adwhale-sdk-react-native": "^2.7.200"
56
56
  }
57
57
  ```
58
58
  - Android SDK 2.7.x 범위 내 최신 RN 수정 자동 반영
@@ -62,7 +62,7 @@ npm install adwhale-sdk-react-native
62
62
  ### 특정 버전을 완전히 고정하여 사용하는 경우
63
63
  ```json
64
64
  {
65
- "adwhale-sdk-react-native": "2.7.101"
65
+ "adwhale-sdk-react-native": "2.7.200"
66
66
  }
67
67
  ```
68
68
 
@@ -114,22 +114,25 @@ repositories {
114
114
 
115
115
  dependencies {
116
116
  implementation "com.facebook.react:react-android:0.81.1"
117
+ implementation 'androidx.lifecycle:lifecycle-process:2.6.2'
118
+ implementation 'androidx.lifecycle:lifecycle-runtime:2.6.2'
117
119
 
118
120
  // 기본 디펜던시: ADwhale Mediation SDK Repository
119
- implementation "net.adwhale.sdk.mediation:adwhale-mediation-sdk:2.7.1"
121
+ implementation "net.adwhale.sdk.mediation:adwhale-mediation-sdk:2.7.2"
120
122
 
121
123
  // 옵션 디펜던시(제외가능): Cauly Adapter SDK Repository
122
- implementation "net.adwhale.sdk.cauly.adapter:cauly-sdk:3.5.40.3"
124
+ implementation "net.adwhale.sdk.cauly.adapter:cauly-sdk:3.5.41.0"
123
125
 
124
126
  // 옵션 디펜던시(제외가능): Admize Adapter SDK Repository
125
- implementation "net.adwhale.sdk.admize.adapter:admize-sdk:1.0.7.1"
127
+ implementation "net.adwhale.sdk.admize.adapter:admize-sdk:1.0.8.0"
126
128
 
127
129
  // 옵션 디펜던시(제외가능): AdFit Adapter SDK Repository
128
- implementation "net.adwhale.sdk.adfit.adapter:adfit-sdk:3.17.2.4"
130
+ implementation "net.adwhale.sdk.adfit.adapter:adfit-sdk:3.17.2.5"
129
131
 
130
132
  // 옵션 디펜던시(제외가능): Admob Adapter SDK Repository
131
- implementation "net.adwhale.sdk.admob.adapter:admob-sdk:24.3.0.1"
133
+ implementation "net.adwhale.sdk.admob.adapter:admob-sdk:24.3.0.2"
132
134
 
133
135
  // 옵션 디펜던시(제외가능): Levelplay Adapter SDK Repository
134
- implementation "net.adwhale.sdk.levelplay.adapter:levelplay-sdk:8.7.0.5"
136
+ implementation "net.adwhale.sdk.levelplay.adapter:levelplay-sdk:8.7.0.6"
137
+
135
138
  }
@@ -136,6 +136,20 @@
136
136
 
137
137
  -keep interface net.adwhale.sdk.mediation.ads.AdWhaleMediationAdBannerViewListener {*;}
138
138
 
139
+ -keepclasseswithmembers class net.adwhale.sdk.mediation.ads.AdWhaleMediationAppOpenAd {
140
+ public <init>(...);
141
+ public *** loadAd();
142
+ public *** showAd(***);
143
+ public *** setRegion(***);
144
+ public *** setGcoder(***, ***);
145
+ public *** setPlacementUid(***);
146
+ public *** setPlacementName(***);
147
+ public *** destroy();
148
+ public *** setAdWhaleMediationAppOpenAdListener(***);
149
+ }
150
+
151
+ -keep interface net.adwhale.sdk.mediation.ads.AdWhaleMediationAppOpenAdListener {*;}
152
+
139
153
  #================== AdWhale Mediation SDK Proguard for Release 적용 코드 끝 ==================
140
154
 
141
155
  #================== AdWhale Cauly Adapter SDK Proguard for Release 적용 코드 시작 ==================
@@ -191,6 +205,7 @@
191
205
  -keep class net.adwhale.sdk.admob.adapter.AdManagerAdRewardLoader {*;}
192
206
 
193
207
  -keep class net.adwhale.sdk.admob.adapter.AdManagerAdRewardedInterstitialLoader {*;}
208
+ -keep class net.adwhale.sdk.admob.adapter.AdManagerAdAppOpeningLoader {*;}
194
209
 
195
210
  #================== AdWhale AdManager Adapter SDK Proguard for Release 적용 코드 끝 ==================
196
211
 
@@ -210,6 +225,8 @@
210
225
 
211
226
  -keep class net.adwhale.sdk.admob.adapter.AdmobAdRewardedInterstitialLoader {*;}
212
227
 
228
+ -keep class net.adwhale.sdk.admob.adapter.AdmobAdAppOpeningLoader {*;}
229
+
213
230
  -keep class net.adwhale.sdk.admob.adapter.custom.cauly.AdMobCaulyEvent {*;}
214
231
 
215
232
  -keep class net.adwhale.sdk.admob.adapter.custom.cauly.CaulyMediationBannerAd {*;}
@@ -244,4 +261,4 @@
244
261
  public static net.adwhale.sdk.levelplay.adapter.LevelPlayPrivacyAdapter getInstance();
245
262
  }
246
263
 
247
- #================== AdWhale LevelPlay Adapter SDK Proguard for Release 적용 코드 끝 ==================
264
+ #================== AdWhale LevelPlay Adapter SDK Proguard for Release 적용 코드 끝 ==================
@@ -41,6 +41,12 @@ public class AdwhaleSdkReactNativePackage extends BaseReactPackage {
41
41
  if (RNAdWhaleMediationRewardAd.REACT_CLASS_NAME.equals(name)) {
42
42
  return new RNAdWhaleMediationRewardAd(reactContext);
43
43
  }
44
+
45
+ // 엡오프닝 Old Architecture를 따르지만 등록은 TurboModule로 등록
46
+ if(RNAdWhaleMediationAppOpenAd.REACT_CLASS_NAME.equals(name)) {
47
+ return new RNAdWhaleMediationAppOpenAd(reactContext);
48
+ }
49
+
44
50
  return null;
45
51
  }
46
52
 
@@ -52,7 +58,8 @@ public class AdwhaleSdkReactNativePackage extends BaseReactPackage {
52
58
  return Arrays.<NativeModule>asList(
53
59
  new RNAdWhaleMediationLoggerModule(reactContext),
54
60
  new RNAdWhaleMediationInterstitialAd(reactContext),
55
- new RNAdWhaleMediationRewardAd(reactContext)
61
+ new RNAdWhaleMediationRewardAd(reactContext),
62
+ new RNAdWhaleMediationAppOpenAd(reactContext)
56
63
  // RNAdWhaleMediationAdSettingModule는 TurboModule로 등록되므로 여기서 굳이 추가 안 해도 됨
57
64
  );
58
65
  }
@@ -85,7 +92,7 @@ public class AdwhaleSdkReactNativePackage extends BaseReactPackage {
85
92
  )
86
93
  );
87
94
 
88
- // 로거/전면/보상형은 legacy 모듈로 사용 (isTurboModule = false)
95
+ // 로거/전면/보상형/앱오프닝은 legacy 모듈로 사용 (isTurboModule = false)
89
96
  moduleInfos.put(
90
97
  RNAdWhaleMediationLoggerModule.REACT_CLASS_NAME,
91
98
  new ReactModuleInfo(
@@ -98,7 +105,7 @@ public class AdwhaleSdkReactNativePackage extends BaseReactPackage {
98
105
  )
99
106
  );
100
107
 
101
- // 로거/전면/보상형은 legacy 모듈로 사용 (isTurboModule = false)
108
+ // 로거/전면/보상형/앱오프닝은 legacy 모듈로 사용 (isTurboModule = false)
102
109
  moduleInfos.put(
103
110
  RNAdWhaleMediationInterstitialAd.REACT_CLASS_NAME,
104
111
  new ReactModuleInfo(
@@ -111,7 +118,7 @@ public class AdwhaleSdkReactNativePackage extends BaseReactPackage {
111
118
  )
112
119
  );
113
120
 
114
- // 로거/전면/보상형은 legacy 모듈로 사용 (isTurboModule = false)
121
+ // 로거/전면/보상형/앱오프닝은 legacy 모듈로 사용 (isTurboModule = false)
115
122
  moduleInfos.put(
116
123
  RNAdWhaleMediationRewardAd.REACT_CLASS_NAME,
117
124
  new ReactModuleInfo(
@@ -124,6 +131,19 @@ public class AdwhaleSdkReactNativePackage extends BaseReactPackage {
124
131
  )
125
132
  );
126
133
 
134
+ // 로거/전면/보상형/앱오프닝은 legacy 모듈로 사용 (isTurboModule = false)
135
+ moduleInfos.put(
136
+ RNAdWhaleMediationAppOpenAd.REACT_CLASS_NAME,
137
+ new ReactModuleInfo(
138
+ RNAdWhaleMediationAppOpenAd.REACT_CLASS_NAME,
139
+ RNAdWhaleMediationAppOpenAd.REACT_CLASS_NAME,
140
+ false,
141
+ false,
142
+ false,
143
+ false
144
+ )
145
+ );
146
+
127
147
  return moduleInfos;
128
148
  };
129
149
  }
@@ -11,6 +11,7 @@ import androidx.annotation.Nullable;
11
11
 
12
12
  import com.facebook.react.bridge.Arguments;
13
13
  import com.facebook.react.bridge.ReactContext;
14
+ import com.facebook.react.bridge.ReadableMap;
14
15
  import com.facebook.react.bridge.WritableMap;
15
16
  import com.facebook.react.common.MapBuilder;
16
17
  import com.facebook.react.uimanager.ThemedReactContext;
@@ -133,6 +134,37 @@ public class RNAdWhaleMediationAdView extends ViewGroupManager<RNWrapperView> {
133
134
  }
134
135
  }
135
136
 
137
+ @ReactProp(name = "placementName")
138
+ public void setPlacementName(RNWrapperView view, String placementName) {
139
+ Log.e(REACT_CLASS_NAME, "placementName: " + placementName);
140
+ AdWhaleMediationAdView adView = getAdWhaleMediationAdView(view);
141
+ if (adView != null) {
142
+ adView.setPlacementName(placementName);
143
+ }
144
+ }
145
+
146
+ @ReactProp(name = "region")
147
+ public void setRegion(RNWrapperView view, String region) {
148
+ Log.e(REACT_CLASS_NAME, "region: " + region);
149
+ AdWhaleMediationAdView adView = getAdWhaleMediationAdView(view);
150
+ if (adView != null) {
151
+ adView.setRegion(region);
152
+ }
153
+ }
154
+
155
+ @ReactProp(name = "gcoder")
156
+ public void setGcoder(RNWrapperView view, ReadableMap gcoderMap) {
157
+ Log.e(REACT_CLASS_NAME, "gcoderMap: " + gcoderMap);
158
+ AdWhaleMediationAdView adView = getAdWhaleMediationAdView(view);
159
+
160
+ if (adView != null && gcoderMap != null) {
161
+ double lt = gcoderMap.hasKey("lt") ? gcoderMap.getDouble("lt") : 0.0;
162
+ double lng = gcoderMap.hasKey("lng") ? gcoderMap.getDouble("lng") : 0.0;
163
+
164
+ adView.setGcoder(lt, lng);
165
+ }
166
+ }
167
+
136
168
  private AdWhaleMediationAdView getAdWhaleMediationAdView(RNWrapperView parent) {
137
169
  if (parent != null && parent.getChildCount() > 0 && parent.getChildAt(0) instanceof AdWhaleMediationAdView) {
138
170
  return (AdWhaleMediationAdView) parent.getChildAt(0);
@@ -0,0 +1,240 @@
1
+ package com.adwhalesdkreactnative;
2
+
3
+ import android.util.Log;
4
+
5
+ import androidx.annotation.NonNull;
6
+ import androidx.annotation.Nullable;
7
+ import androidx.lifecycle.DefaultLifecycleObserver;
8
+ import androidx.lifecycle.LifecycleOwner;
9
+ import androidx.lifecycle.ProcessLifecycleOwner;
10
+
11
+ import com.facebook.react.bridge.Arguments;
12
+ import com.facebook.react.bridge.LifecycleEventListener;
13
+ import com.facebook.react.bridge.ReactApplicationContext;
14
+ import com.facebook.react.bridge.ReactContextBaseJavaModule;
15
+ import com.facebook.react.bridge.ReactMethod;
16
+ import com.facebook.react.bridge.ReadableMap;
17
+ import com.facebook.react.bridge.UiThreadUtil;
18
+ import com.facebook.react.bridge.WritableMap;
19
+ import com.facebook.react.modules.core.DeviceEventManagerModule;
20
+
21
+ import net.adwhale.sdk.mediation.ads.AdWhaleMediationAppOpenAd;
22
+ import net.adwhale.sdk.mediation.ads.AdWhaleMediationAppOpenAdListener;
23
+
24
+ public class RNAdWhaleMediationAppOpenAd extends ReactContextBaseJavaModule implements AdWhaleMediationAppOpenAdListener, LifecycleEventListener {
25
+
26
+ public static final String REACT_CLASS_NAME = RNAdWhaleMediationAppOpenAd.class.getSimpleName();
27
+ private AdWhaleMediationAppOpenAd adWhaleMediationAppOpenAd;
28
+ private final ReactApplicationContext reactContext;
29
+
30
+ private boolean isAppInBackground = false;
31
+ private DefaultLifecycleObserver appLifecycleObserver;
32
+ private boolean isObserverSetup = false;
33
+
34
+ private String placementName;
35
+ private String region;
36
+ private double lt;
37
+ private double lng;
38
+
39
+ public RNAdWhaleMediationAppOpenAd(ReactApplicationContext context) {
40
+ super(context);
41
+ reactContext = context;
42
+ reactContext.addLifecycleEventListener(this);
43
+ }
44
+
45
+ private void setupLifecycleObserver() {
46
+ UiThreadUtil.runOnUiThread(() -> {
47
+ if (isObserverSetup) {
48
+ return;
49
+ }
50
+
51
+ appLifecycleObserver = new DefaultLifecycleObserver() {
52
+ @Override
53
+ public void onStart(@NonNull LifecycleOwner owner) {
54
+ Log.d(REACT_CLASS_NAME, "App moved to foreground");
55
+ if (adWhaleMediationAppOpenAd != null && isAppInBackground) {
56
+ if (getCurrentActivity() != null) {
57
+ adWhaleMediationAppOpenAd.showAd(getCurrentActivity());
58
+ }
59
+ }
60
+ isAppInBackground = false;
61
+ }
62
+
63
+ @Override
64
+ public void onStop(@NonNull LifecycleOwner owner) {
65
+ Log.d(REACT_CLASS_NAME, "App moved to background");
66
+ isAppInBackground = true;
67
+ }
68
+ };
69
+ ProcessLifecycleOwner.get().getLifecycle().addObserver(appLifecycleObserver);
70
+ isObserverSetup = true;
71
+ Log.d(REACT_CLASS_NAME, "ProcessLifecycleOwner observer setup successfully.");
72
+ });
73
+ }
74
+
75
+ private void release() {
76
+ UiThreadUtil.runOnUiThread(() -> {
77
+ if (appLifecycleObserver != null) {
78
+ ProcessLifecycleOwner.get().getLifecycle().removeObserver(appLifecycleObserver);
79
+ appLifecycleObserver = null;
80
+ isObserverSetup = false;
81
+ }
82
+ });
83
+ if (adWhaleMediationAppOpenAd != null) {
84
+ adWhaleMediationAppOpenAd.destroy();
85
+ adWhaleMediationAppOpenAd = null;
86
+ }
87
+ }
88
+
89
+ @NonNull
90
+ @Override
91
+ public String getName() {
92
+ return REACT_CLASS_NAME;
93
+ }
94
+
95
+ @ReactMethod
96
+ public void setPlacementName(String placementName) {
97
+ Log.e(REACT_CLASS_NAME, "placementName: " + placementName);
98
+ this.placementName = placementName;
99
+ }
100
+
101
+ @ReactMethod
102
+ public void setRegion(String region) {
103
+ Log.e(REACT_CLASS_NAME, "region: " + region);
104
+ this.region = region;
105
+ }
106
+
107
+ @ReactMethod
108
+ public void setGcoder(ReadableMap gcoderMap) {
109
+ Log.e(REACT_CLASS_NAME, "gcoderMap: " + gcoderMap);
110
+
111
+ if (gcoderMap != null) {
112
+ double lt = gcoderMap.hasKey("lt") ? gcoderMap.getDouble("lt") : 0.0;
113
+ double lng = gcoderMap.hasKey("lng") ? gcoderMap.getDouble("lng") : 0.0;
114
+
115
+ this.lt = lt;
116
+ this.lng = lng;
117
+ }
118
+ }
119
+
120
+ @ReactMethod
121
+ public void loadAd(String placementUid) {
122
+ Log.d(REACT_CLASS_NAME, "loadAd(" + placementUid + ")");
123
+ UiThreadUtil.runOnUiThread(() -> {
124
+ Log.d(REACT_CLASS_NAME, "runOnUiThread()");
125
+ if (getCurrentActivity() != null) {
126
+ if (adWhaleMediationAppOpenAd != null) {
127
+ adWhaleMediationAppOpenAd.destroy();
128
+ }
129
+ adWhaleMediationAppOpenAd = new AdWhaleMediationAppOpenAd(getCurrentActivity(), placementUid);
130
+ adWhaleMediationAppOpenAd.setAdWhaleMediationAppOpenAdListener(this);
131
+ adWhaleMediationAppOpenAd.setPlacementName(placementName);
132
+ adWhaleMediationAppOpenAd.setRegion(region);
133
+ adWhaleMediationAppOpenAd.setGcoder(lt, lng);
134
+ adWhaleMediationAppOpenAd.loadAd();
135
+ } else {
136
+ Log.e(REACT_CLASS_NAME, "Current Activity is null, cannot create AppOpenAd.");
137
+ WritableMap params = Arguments.createMap();
138
+ params.putInt("statusCode", -1);
139
+ params.putString("message", "Activity not available to load ad.");
140
+ sendEvent("onAppOpenAdFailedToLoad", params);
141
+ }
142
+ });
143
+ }
144
+
145
+ @ReactMethod
146
+ public void showAd() {
147
+ Log.d(REACT_CLASS_NAME, "showAd()");
148
+ UiThreadUtil.runOnUiThread(() -> {
149
+ if (adWhaleMediationAppOpenAd != null) {
150
+ if (getCurrentActivity() != null) {
151
+ adWhaleMediationAppOpenAd.showAd(getCurrentActivity());
152
+ } else {
153
+ Log.e(REACT_CLASS_NAME, "Current Activity is null, cannot show AppOpenAd.");
154
+ }
155
+ } else {
156
+ Log.e(REACT_CLASS_NAME, "adWhaleMediationAppOpenAd is not loaded yet.");
157
+ }
158
+ });
159
+ }
160
+
161
+ private void sendEvent(String eventName, @Nullable WritableMap params) {
162
+ if (reactContext.hasActiveCatalystInstance()) {
163
+ reactContext
164
+ .getJSModule(DeviceEventManagerModule.RCTDeviceEventEmitter.class)
165
+ .emit(eventName, params);
166
+ }
167
+ }
168
+
169
+ @Override
170
+ public void onAdLoaded() {
171
+ Log.i(REACT_CLASS_NAME, ".onAdLoaded()");
172
+ sendEvent("onAppOpenAdLoaded", null);
173
+ }
174
+
175
+ @Override
176
+ public void onAdFailedToLoad(int statusCode, String message) {
177
+ Log.e(REACT_CLASS_NAME, ".onAdFailedToLoad(" + statusCode + ", " + message + ")");
178
+ WritableMap params = Arguments.createMap();
179
+ params.putInt("statusCode", statusCode);
180
+ params.putString("message", message);
181
+ sendEvent("onAppOpenAdFailedToLoad", params);
182
+ }
183
+
184
+ @Override
185
+ public void onAdShowed() {
186
+ Log.i(REACT_CLASS_NAME, ".onAdShowed()");
187
+ sendEvent("onAppOpenAdShowed", null);
188
+ }
189
+
190
+ @Override
191
+ public void onAdFailedToShow(int statusCode, String message) {
192
+ Log.e(REACT_CLASS_NAME, ".onAdFailedToShow(" + statusCode + ", " + message + ")");
193
+ WritableMap params = Arguments.createMap();
194
+ params.putInt("statusCode", statusCode);
195
+ params.putString("message", message);
196
+ sendEvent("onAppOpenAdFailedToShow", params);
197
+ }
198
+
199
+ @Override
200
+ public void onAdDismissed() {
201
+ Log.i(REACT_CLASS_NAME, ".onAdDismissed()");
202
+ sendEvent("onAppOpenAdDismissed", null);
203
+ if (adWhaleMediationAppOpenAd != null) {
204
+ adWhaleMediationAppOpenAd.destroy();
205
+ adWhaleMediationAppOpenAd = null;
206
+ }
207
+ }
208
+
209
+ @Override
210
+ public void onAdClicked() {
211
+ Log.i(REACT_CLASS_NAME, ".onAdClicked()");
212
+ sendEvent("onAppOpenAdClicked", null);
213
+ }
214
+
215
+ @ReactMethod
216
+ public void addListener(String eventName) {
217
+ // Keep: Required for RN built in Event Emitter Calls.
218
+ }
219
+
220
+ @ReactMethod
221
+ public void removeListeners(Integer count) {
222
+ // Keep: Required for RN built in Event Emitter Calls.
223
+ }
224
+
225
+ @Override
226
+ public void onHostResume() {
227
+ setupLifecycleObserver();
228
+ }
229
+
230
+ @Override
231
+ public void onHostPause() {
232
+
233
+ }
234
+
235
+ @Override
236
+ public void onHostDestroy() {
237
+ release();
238
+ reactContext.removeLifecycleEventListener(this);
239
+ }
240
+ }
@@ -11,6 +11,7 @@ import androidx.annotation.Nullable;
11
11
  import com.facebook.react.bridge.Arguments;
12
12
  import com.facebook.react.bridge.ReactContext;
13
13
  import com.facebook.react.bridge.ReadableArray;
14
+ import com.facebook.react.bridge.ReadableMap;
14
15
  import com.facebook.react.bridge.WritableMap;
15
16
  import com.facebook.react.common.MapBuilder;
16
17
  import com.facebook.react.uimanager.SimpleViewManager;
@@ -18,6 +19,7 @@ import com.facebook.react.uimanager.ThemedReactContext;
18
19
  import com.facebook.react.uimanager.annotations.ReactProp;
19
20
  import com.facebook.react.uimanager.events.RCTEventEmitter;
20
21
 
22
+ import net.adwhale.sdk.mediation.ads.AdWhaleMediationAdView;
21
23
  import net.adwhale.sdk.mediation.ads.AdWhaleMediationNativeAdView;
22
24
  import net.adwhale.sdk.mediation.ads.AdWhaleMediationNativeAdViewListener;
23
25
  import net.adwhale.sdk.mediation.ads.AdWhaleNativeAdBinder;
@@ -32,6 +34,7 @@ public class RNAdWhaleMediationCustomNativeAdView extends SimpleViewManager<RNWr
32
34
 
33
35
  private String placementUid;
34
36
  private String layoutName;
37
+ private String placementName;
35
38
 
36
39
  @NonNull
37
40
  @Override
@@ -55,6 +58,35 @@ public class RNAdWhaleMediationCustomNativeAdView extends SimpleViewManager<RNWr
55
58
  this.layoutName = name;
56
59
  }
57
60
 
61
+
62
+ @ReactProp(name = "placementName")
63
+ public void setPlacementName(RNWrapperView view, String placementName) {
64
+ Log.e(REACT_CLASS_NAME, "placementName: " + placementName);
65
+ this.placementName = placementName;
66
+ }
67
+
68
+ @ReactProp(name = "region")
69
+ public void setRegion(RNWrapperView view, String region) {
70
+ Log.e(REACT_CLASS_NAME, "region: " + region);
71
+ AdWhaleMediationNativeAdView adView = getAdWhaleMediationNativeAdView(view);
72
+ if (adView != null) {
73
+ adView.setRegion(region);
74
+ }
75
+ }
76
+
77
+ @ReactProp(name = "gcoder")
78
+ public void setGcoder(RNWrapperView view, ReadableMap gcoderMap) {
79
+ Log.e(REACT_CLASS_NAME, "gcoderMap: " + gcoderMap);
80
+ AdWhaleMediationNativeAdView adView = getAdWhaleMediationNativeAdView(view);
81
+
82
+ if (adView != null && gcoderMap != null) {
83
+ double lt = gcoderMap.hasKey("lt") ? gcoderMap.getDouble("lt") : 0.0;
84
+ double lng = gcoderMap.hasKey("lng") ? gcoderMap.getDouble("lng") : 0.0;
85
+
86
+ adView.setGcoder(lt, lng);
87
+ }
88
+ }
89
+
58
90
  @Nullable
59
91
  @Override
60
92
  public Map<String, Integer> getCommandsMap() {
@@ -6,14 +6,13 @@ import androidx.annotation.NonNull;
6
6
  import androidx.annotation.Nullable;
7
7
 
8
8
  import com.facebook.react.bridge.Arguments;
9
- import com.facebook.react.bridge.Promise;
10
9
  import com.facebook.react.bridge.ReactApplicationContext;
11
10
  import com.facebook.react.bridge.ReactContextBaseJavaModule;
12
11
  import com.facebook.react.bridge.ReactMethod;
12
+ import com.facebook.react.bridge.ReadableMap;
13
13
  import com.facebook.react.bridge.UiThreadUtil;
14
14
  import com.facebook.react.bridge.WritableMap;
15
15
  import com.facebook.react.modules.core.DeviceEventManagerModule;
16
- import com.facebook.react.uimanager.events.RCTEventEmitter;
17
16
 
18
17
  import net.adwhale.sdk.mediation.ads.AdWhaleMediationInterstitialAd;
19
18
  import net.adwhale.sdk.mediation.ads.AdWhaleMediationInterstitialAdListener;
@@ -30,6 +29,10 @@ public class RNAdWhaleMediationInterstitialAd extends ReactContextBaseJavaModule
30
29
  public static final String REACT_CLASS_NAME = RNAdWhaleMediationInterstitialAd.class.getSimpleName();
31
30
  private AdWhaleMediationInterstitialAd adWhaleMediationInterstitialAd;
32
31
  private String placementUid;
32
+ private String placementName;
33
+ private String region;
34
+ private double lt;
35
+ private double lng;
33
36
 
34
37
  public RNAdWhaleMediationInterstitialAd(ReactApplicationContext context) {
35
38
  super(context);
@@ -41,12 +44,40 @@ public class RNAdWhaleMediationInterstitialAd extends ReactContextBaseJavaModule
41
44
  return REACT_CLASS_NAME;
42
45
  }
43
46
 
47
+ @ReactMethod
48
+ public void setPlacementName(String placementName) {
49
+ Log.e(REACT_CLASS_NAME, "placementName: " + placementName);
50
+ this.placementName = placementName;
51
+ }
52
+
53
+ @ReactMethod
54
+ public void setRegion(String region) {
55
+ Log.e(REACT_CLASS_NAME, "region: " + region);
56
+ this.region = region;
57
+ }
58
+
59
+ @ReactMethod
60
+ public void setGcoder(ReadableMap gcoderMap) {
61
+ Log.e(REACT_CLASS_NAME, "gcoderMap: " + gcoderMap);
62
+
63
+ if (gcoderMap != null) {
64
+ double lt = gcoderMap.hasKey("lt") ? gcoderMap.getDouble("lt") : 0.0;
65
+ double lng = gcoderMap.hasKey("lng") ? gcoderMap.getDouble("lng") : 0.0;
66
+
67
+ this.lt = lt;
68
+ this.lng = lng;
69
+ }
70
+ }
71
+
44
72
  @ReactMethod
45
73
  public void loadAd(String placementUid) {
46
74
  Log.e(REACT_CLASS_NAME, ".loadAd()");
47
75
  this.placementUid = placementUid;
48
76
  adWhaleMediationInterstitialAd = new AdWhaleMediationInterstitialAd(placementUid);
49
77
  adWhaleMediationInterstitialAd.setAdWhaleMediationInterstitialAdListener(this);
78
+ adWhaleMediationInterstitialAd.setPlacementName(placementName);
79
+ adWhaleMediationInterstitialAd.setRegion(region);
80
+ adWhaleMediationInterstitialAd.setGcoder(lt, lng);
50
81
 
51
82
  UiThreadUtil.runOnUiThread(() -> {
52
83
  adWhaleMediationInterstitialAd.loadAd();
@@ -7,6 +7,7 @@ import androidx.annotation.NonNull;
7
7
  import com.facebook.react.bridge.ReactApplicationContext;
8
8
  import com.facebook.react.bridge.ReactContextBaseJavaModule;
9
9
  import com.facebook.react.bridge.ReactMethod;
10
+ import com.facebook.react.bridge.Promise;
10
11
  import net.adwhale.sdk.utils.AdWhaleLog;
11
12
 
12
13
  public class RNAdWhaleMediationLoggerModule extends ReactContextBaseJavaModule {
@@ -32,4 +33,17 @@ public class RNAdWhaleMediationLoggerModule extends ReactContextBaseJavaModule {
32
33
  AdWhaleLog.setLogLevel(AdWhaleLog.LogLevel.None);
33
34
  }
34
35
  }
36
+
37
+ @ReactMethod
38
+ public void getLogLevel(Promise promise) {
39
+ try {
40
+ AdWhaleLog.LogLevel logLevel = AdWhaleLog.getLogLevel();
41
+ String logLevelString = logLevel.toString();
42
+ Log.d(REACT_CLASS_NAME, "현재 로그 레벨: " + logLevelString);
43
+ promise.resolve(logLevelString);
44
+ } catch (Exception e) {
45
+ Log.e(REACT_CLASS_NAME, "로그 레벨 조회 실패", e);
46
+ promise.reject("GET_LOG_LEVEL_ERROR", "Failed to get log level", e);
47
+ }
48
+ }
35
49
  }
@@ -9,6 +9,7 @@ import com.facebook.react.bridge.Arguments;
9
9
  import com.facebook.react.bridge.ReactApplicationContext;
10
10
  import com.facebook.react.bridge.ReactContextBaseJavaModule;
11
11
  import com.facebook.react.bridge.ReactMethod;
12
+ import com.facebook.react.bridge.ReadableMap;
12
13
  import com.facebook.react.bridge.UiThreadUtil;
13
14
  import com.facebook.react.bridge.WritableMap;
14
15
  import com.facebook.react.modules.core.DeviceEventManagerModule;
@@ -31,6 +32,10 @@ public class RNAdWhaleMediationRewardAd extends ReactContextBaseJavaModule imple
31
32
  public static final String REACT_CLASS_NAME = RNAdWhaleMediationRewardAd.class.getSimpleName();
32
33
  private AdWhaleMediationRewardAd adWhaleMediationRewardAd;
33
34
  private String placementUid;
35
+ private String placementName;
36
+ private String region;
37
+ private double lt;
38
+ private double lng;
34
39
  private final ReactApplicationContext reactContext;
35
40
 
36
41
  public RNAdWhaleMediationRewardAd(ReactApplicationContext context) {
@@ -45,12 +50,40 @@ public class RNAdWhaleMediationRewardAd extends ReactContextBaseJavaModule imple
45
50
  return REACT_CLASS_NAME;
46
51
  }
47
52
 
53
+ @ReactMethod
54
+ public void setPlacementName(String placementName) {
55
+ Log.e(REACT_CLASS_NAME, "placementName: " + placementName);
56
+ this.placementName = placementName;
57
+ }
58
+
59
+ @ReactMethod
60
+ public void setRegion(String region) {
61
+ Log.e(REACT_CLASS_NAME, "region: " + region);
62
+ this.region = region;
63
+ }
64
+
65
+ @ReactMethod
66
+ public void setGcoder(ReadableMap gcoderMap) {
67
+ Log.e(REACT_CLASS_NAME, "gcoderMap: " + gcoderMap);
68
+
69
+ if (gcoderMap != null) {
70
+ double lt = gcoderMap.hasKey("lt") ? gcoderMap.getDouble("lt") : 0.0;
71
+ double lng = gcoderMap.hasKey("lng") ? gcoderMap.getDouble("lng") : 0.0;
72
+
73
+ this.lt = lt;
74
+ this.lng = lng;
75
+ }
76
+ }
77
+
48
78
  @ReactMethod
49
79
  public void loadAd(String placementUid) {
50
80
  Log.e(REACT_CLASS_NAME, "loadAd()");
51
81
  this.placementUid = placementUid;
52
82
  adWhaleMediationRewardAd = new AdWhaleMediationRewardAd(placementUid);
53
83
  adWhaleMediationRewardAd.setAdWhaleMediationFullScreenContentCallback(this);
84
+ adWhaleMediationRewardAd.setPlacementName(placementName);
85
+ adWhaleMediationRewardAd.setRegion(region);
86
+ adWhaleMediationRewardAd.setGcoder(lt, lng);
54
87
 
55
88
  UiThreadUtil.runOnUiThread(() -> {
56
89
  adWhaleMediationRewardAd.loadAd(this);