adwhale-sdk-react-native 2.7.102 → 2.7.201

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.
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.102"
46
+ "adwhale-sdk-react-native": "~2.7.201"
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.102"
55
+ "adwhale-sdk-react-native": "^2.7.201"
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.102"
65
+ "adwhale-sdk-react-native": "2.7.201"
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 {*;}
@@ -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
  }
@@ -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
+ }
@@ -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
  }
@@ -287,6 +287,8 @@ public class RNAdWhaleMediationTemplateNativeAdView extends SimpleViewManager<RN
287
287
  this.template = ADWHALE_NATIVE_TEMPLATE.SMALL;
288
288
  } else if ("MEDIUM".equalsIgnoreCase(templateName)) {
289
289
  this.template = ADWHALE_NATIVE_TEMPLATE.MEDIUM;
290
+ } else if ("FULLSCREEN".equalsIgnoreCase(templateName)) {
291
+ this.template = ADWHALE_NATIVE_TEMPLATE.FULLSCREEN;
290
292
  }
291
293
  }
292
294
 
@@ -0,0 +1,58 @@
1
+ "use strict";
2
+
3
+ // src/AdWhaleAppOpenAd.ts
4
+ import { NativeEventEmitter, NativeModules } from 'react-native';
5
+ const {
6
+ RNAdWhaleMediationAppOpenAd
7
+ } = NativeModules;
8
+ const appOpenEmitter = new NativeEventEmitter(RNAdWhaleMediationAppOpenAd);
9
+ export const AdWhaleAppOpenAd = {
10
+ loadAd(placementUid, options) {
11
+ // 먼저 옵션들을 설정
12
+ if (options?.placementName) {
13
+ RNAdWhaleMediationAppOpenAd.setPlacementName(options.placementName);
14
+ }
15
+ if (options?.region) {
16
+ RNAdWhaleMediationAppOpenAd.setRegion(options.region);
17
+ }
18
+ if (options?.gcoder) {
19
+ RNAdWhaleMediationAppOpenAd.setGcoder(options.gcoder);
20
+ }
21
+ // 그 다음 loadAd 호출
22
+ RNAdWhaleMediationAppOpenAd.loadAd(placementUid);
23
+ },
24
+ showAd() {
25
+ RNAdWhaleMediationAppOpenAd.showAd();
26
+ },
27
+ addEventListeners(listeners) {
28
+ const subs = [];
29
+ if (listeners.onLoaded) {
30
+ subs.push(appOpenEmitter.addListener('onAppOpenAdLoaded', () => {
31
+ listeners.onLoaded?.();
32
+ }));
33
+ }
34
+ if (listeners.onLoadFailed) {
35
+ subs.push(appOpenEmitter.addListener('onAppOpenAdFailedToLoad', event => listeners.onLoadFailed?.(event)));
36
+ }
37
+ if (listeners.onShowed) {
38
+ subs.push(appOpenEmitter.addListener('onAppOpenAdShowed', () => {
39
+ listeners.onShowed?.();
40
+ }));
41
+ }
42
+ if (listeners.onShowFailed) {
43
+ subs.push(appOpenEmitter.addListener('onAppOpenAdFailedToShow', event => listeners.onShowFailed?.(event)));
44
+ }
45
+ if (listeners.onDismissed) {
46
+ subs.push(appOpenEmitter.addListener('onAppOpenAdDismissed', () => {
47
+ listeners.onDismissed?.();
48
+ }));
49
+ }
50
+ if (listeners.onClicked) {
51
+ subs.push(appOpenEmitter.addListener('onAppOpenAdClicked', () => {
52
+ listeners.onClicked?.();
53
+ }));
54
+ }
55
+ return subs;
56
+ }
57
+ };
58
+ //# sourceMappingURL=AdWhaleAppOpenAd.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["NativeEventEmitter","NativeModules","RNAdWhaleMediationAppOpenAd","appOpenEmitter","AdWhaleAppOpenAd","loadAd","placementUid","options","placementName","setPlacementName","region","setRegion","gcoder","setGcoder","showAd","addEventListeners","listeners","subs","onLoaded","push","addListener","onLoadFailed","event","onShowed","onShowFailed","onDismissed","onClicked"],"sourceRoot":"../../src","sources":["AdWhaleAppOpenAd.ts"],"mappings":";;AAAA;AACA,SAASA,kBAAkB,EAAEC,aAAa,QAAQ,cAAc;AAgChE,MAAM;EAAEC;AAA4B,CAAC,GAAGD,aAEvC;AAED,MAAME,cAAc,GAAG,IAAIH,kBAAkB,CAACE,2BAA2B,CAAC;AAE1E,OAAO,MAAME,gBAAgB,GAAG;EAC9BC,MAAMA,CACJC,YAAoB,EACpBC,OAIC,EACD;IACA;IACA,IAAIA,OAAO,EAAEC,aAAa,EAAE;MAC1BN,2BAA2B,CAACO,gBAAgB,CAACF,OAAO,CAACC,aAAa,CAAC;IACrE;IACA,IAAID,OAAO,EAAEG,MAAM,EAAE;MACnBR,2BAA2B,CAACS,SAAS,CAACJ,OAAO,CAACG,MAAM,CAAC;IACvD;IACA,IAAIH,OAAO,EAAEK,MAAM,EAAE;MACnBV,2BAA2B,CAACW,SAAS,CAACN,OAAO,CAACK,MAAM,CAAC;IACvD;IACA;IACAV,2BAA2B,CAACG,MAAM,CAACC,YAAY,CAAC;EAClD,CAAC;EAEDQ,MAAMA,CAAA,EAAG;IACPZ,2BAA2B,CAACY,MAAM,CAAC,CAAC;EACtC,CAAC;EAEDC,iBAAiBA,CAACC,SAA+B,EAAyB;IACxE,MAAMC,IAA2B,GAAG,EAAE;IAEtC,IAAID,SAAS,CAACE,QAAQ,EAAE;MACtBD,IAAI,CAACE,IAAI,CACPhB,cAAc,CAACiB,WAAW,CAAC,mBAAmB,EAAE,MAAM;QACpDJ,SAAS,CAACE,QAAQ,GAAG,CAAC;MACxB,CAAC,CACH,CAAC;IACH;IACA,IAAIF,SAAS,CAACK,YAAY,EAAE;MAC1BJ,IAAI,CAACE,IAAI,CACPhB,cAAc,CAACiB,WAAW,CACxB,yBAAyB,EACzBE,KAAK,IAAIN,SAAS,CAACK,YAAY,GAAGC,KAAiC,CACrE,CACF,CAAC;IACH;IACA,IAAIN,SAAS,CAACO,QAAQ,EAAE;MACtBN,IAAI,CAACE,IAAI,CACPhB,cAAc,CAACiB,WAAW,CAAC,mBAAmB,EAAE,MAAM;QACpDJ,SAAS,CAACO,QAAQ,GAAG,CAAC;MACxB,CAAC,CACH,CAAC;IACH;IACA,IAAIP,SAAS,CAACQ,YAAY,EAAE;MAC1BP,IAAI,CAACE,IAAI,CACPhB,cAAc,CAACiB,WAAW,CACxB,yBAAyB,EACzBE,KAAK,IAAIN,SAAS,CAACQ,YAAY,GAAGF,KAAiC,CACrE,CACF,CAAC;IACH;IACA,IAAIN,SAAS,CAACS,WAAW,EAAE;MACzBR,IAAI,CAACE,IAAI,CACPhB,cAAc,CAACiB,WAAW,CAAC,sBAAsB,EAAE,MAAM;QACvDJ,SAAS,CAACS,WAAW,GAAG,CAAC;MAC3B,CAAC,CACH,CAAC;IACH;IACA,IAAIT,SAAS,CAACU,SAAS,EAAE;MACvBT,IAAI,CAACE,IAAI,CACPhB,cAAc,CAACiB,WAAW,CAAC,oBAAoB,EAAE,MAAM;QACrDJ,SAAS,CAACU,SAAS,GAAG,CAAC;MACzB,CAAC,CACH,CAAC;IACH;IAEA,OAAOT,IAAI;EACb;AACF,CAAC","ignoreList":[]}
@@ -32,6 +32,12 @@ export const AdWhaleMediationSdk = {
32
32
  setLoggerEnabled(enabled) {
33
33
  RNAdWhaleMediationLoggerModule?.setLogLevel?.(enabled);
34
34
  },
35
+ getLogLevel() {
36
+ if (!RNAdWhaleMediationLoggerModule?.getLogLevel) {
37
+ return Promise.reject(new Error('getLogLevel is not implemented in native module'));
38
+ }
39
+ return RNAdWhaleMediationLoggerModule.getLogLevel();
40
+ },
35
41
  setCoppa(enabled) {
36
42
  console.log('[AdWhaleMediationSdk] setCoppa called:', enabled);
37
43
  if (!AdwhaleSdkReactNative?.setCoppa) {
@@ -1 +1 @@
1
- {"version":3,"names":["NativeModules","Platform","NativeAdwhaleSdkReactNative","LINKING_ERROR","OS","RNAdWhaleMediationLoggerModule","AdwhaleSdkReactNative","console","warn","log","hasInitialize","initialize","hasRequestGdprConsent","requestGdprConsent","hasGetConsentStatus","getConsentStatus","hasResetGdprConsentStatus","resetGdprConsentStatus","hasSetGdpr","setGdpr","hasSetCoppa","setCoppa","AdWhaleMediationSdk","Promise","reject","Error","setLoggerEnabled","enabled","setLogLevel","error","consent"],"sourceRoot":"../../src","sources":["AdWhaleMediationSdk.ts"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"names":["NativeModules","Platform","NativeAdwhaleSdkReactNative","LINKING_ERROR","OS","RNAdWhaleMediationLoggerModule","AdwhaleSdkReactNative","console","warn","log","hasInitialize","initialize","hasRequestGdprConsent","requestGdprConsent","hasGetConsentStatus","getConsentStatus","hasResetGdprConsentStatus","resetGdprConsentStatus","hasSetGdpr","setGdpr","hasSetCoppa","setCoppa","AdWhaleMediationSdk","Promise","reject","Error","setLoggerEnabled","enabled","setLogLevel","getLogLevel","error","consent"],"sourceRoot":"../../src","sources":["AdWhaleMediationSdk.ts"],"mappings":"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","ignoreList":[]}
@@ -19,9 +19,11 @@ export { AdWhaleBannerView } from "./AdWhaleBannerView.js";
19
19
  export { AdWhaleInterstitialAd } from "./AdWhaleInterstitialAd.js";
20
20
  // ✅ 4) 리워드 광고 API
21
21
  export { AdWhaleRewardAd } from "./AdWhaleRewardAd.js";
22
- // ✅ 5) 네이티브 커스텀 (네이티브 템플릿/커스텀용)
22
+ // ✅ 5) 오프닝 광고 API
23
+ export { AdWhaleAppOpenAd } from "./AdWhaleAppOpenAd.js";
24
+ // ✅ 6) 네이티브 커스텀 뷰 (네이티브 템플릿/커스텀용)
23
25
  export { AdWhaleNativeCustomView } from "./AdWhaleNativeCustomView.js";
24
- // ✅ 6) (선택) 네이티브 템플릿 뷰가 있다면 그대로 유지
26
+ // ✅ 7) (선택) 네이티브 템플릿 뷰가 있다면 그대로 유지
25
27
  // 파일이 실제로 있다면 그대로 유효하고,
26
28
  // 나중에 뺄 거면 여기 export 한 줄만 지우면 됨.
27
29
  export * from "./AdWhaleNativeTemplateView.js";
@@ -1 +1 @@
1
- {"version":3,"names":["AdWhaleMediationSdk","AdWhaleBannerView","AdWhaleInterstitialAd","AdWhaleRewardAd","AdWhaleNativeCustomView"],"sourceRoot":"../../src","sources":["index.ts"],"mappings":";;AAAA;;AAEA;AACA,SAASA,mBAAmB,QAAQ,0BAAuB;AAC3D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAGA;AACA,SACEC,iBAAiB,QACZ,wBAAqB;AAQ5B;AACA,SACEC,qBAAqB,QAChB,4BAAyB;AAOhC;AACA,SACEC,eAAe,QACV,sBAAmB;AAQ1B;AACA,SACEC,uBAAuB,QAClB,8BAA2B;AAQlC;AACA;AACA;AACA,cAAc,gCAA6B","ignoreList":[]}
1
+ {"version":3,"names":["AdWhaleMediationSdk","AdWhaleBannerView","AdWhaleInterstitialAd","AdWhaleRewardAd","AdWhaleAppOpenAd","AdWhaleNativeCustomView"],"sourceRoot":"../../src","sources":["index.ts"],"mappings":";;AAAA;;AAEA;AACA,SAASA,mBAAmB,QAAQ,0BAAuB;AAC3D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAGA;AACA,SACEC,iBAAiB,QACZ,wBAAqB;AAQ5B;AACA,SACEC,qBAAqB,QAChB,4BAAyB;AAOhC;AACA,SACEC,eAAe,QACV,sBAAmB;AAQ1B;AACA,SACEC,gBAAgB,QACX,uBAAoB;AAO3B;AACA,SACEC,uBAAuB,QAClB,8BAA2B;AAQlC;AACA;AACA;AACA,cAAc,gCAA6B","ignoreList":[]}
@@ -0,0 +1,27 @@
1
+ import type { EmitterSubscription } from 'react-native';
2
+ export interface AdWhaleAppOpenErrorEvent {
3
+ statusCode: number;
4
+ message: string;
5
+ }
6
+ export interface AdWhaleAppOpenEvents {
7
+ onLoaded?: () => void;
8
+ onLoadFailed?: (event: AdWhaleAppOpenErrorEvent) => void;
9
+ onShowed?: () => void;
10
+ onShowFailed?: (event: AdWhaleAppOpenErrorEvent) => void;
11
+ onDismissed?: () => void;
12
+ onClicked?: () => void;
13
+ }
14
+ export interface AdWhaleAppOpenAdGcoder {
15
+ lt: number;
16
+ lng: number;
17
+ }
18
+ export declare const AdWhaleAppOpenAd: {
19
+ loadAd(placementUid: string, options?: {
20
+ placementName?: string;
21
+ region?: string;
22
+ gcoder?: AdWhaleAppOpenAdGcoder;
23
+ }): void;
24
+ showAd(): void;
25
+ addEventListeners(listeners: AdWhaleAppOpenEvents): EmitterSubscription[];
26
+ };
27
+ //# sourceMappingURL=AdWhaleAppOpenAd.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"AdWhaleAppOpenAd.d.ts","sourceRoot":"","sources":["../../../src/AdWhaleAppOpenAd.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,cAAc,CAAC;AAExD,MAAM,WAAW,wBAAwB;IACvC,UAAU,EAAE,MAAM,CAAC;IACnB,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,oBAAoB;IACnC,QAAQ,CAAC,EAAE,MAAM,IAAI,CAAC;IACtB,YAAY,CAAC,EAAE,CAAC,KAAK,EAAE,wBAAwB,KAAK,IAAI,CAAC;IACzD,QAAQ,CAAC,EAAE,MAAM,IAAI,CAAC;IACtB,YAAY,CAAC,EAAE,CAAC,KAAK,EAAE,wBAAwB,KAAK,IAAI,CAAC;IACzD,WAAW,CAAC,EAAE,MAAM,IAAI,CAAC;IACzB,SAAS,CAAC,EAAE,MAAM,IAAI,CAAC;CACxB;AAED,MAAM,WAAW,sBAAsB;IACrC,EAAE,EAAE,MAAM,CAAC;IACX,GAAG,EAAE,MAAM,CAAC;CACb;AAkBD,eAAO,MAAM,gBAAgB;yBAEX,MAAM,YACV;QACR,aAAa,CAAC,EAAE,MAAM,CAAC;QACvB,MAAM,CAAC,EAAE,MAAM,CAAC;QAChB,MAAM,CAAC,EAAE,sBAAsB,CAAC;KACjC;;iCAoB0B,oBAAoB,GAAG,mBAAmB,EAAE;CAkD1E,CAAC"}
@@ -1,6 +1,7 @@
1
1
  export declare const AdWhaleMediationSdk: {
2
2
  initialize(): Promise<number>;
3
3
  setLoggerEnabled(enabled: boolean): void;
4
+ getLogLevel(): Promise<string>;
4
5
  setCoppa(enabled: boolean): void;
5
6
  requestGdprConsent(): Promise<{
6
7
  isSuccess: boolean;
@@ -1 +1 @@
1
- {"version":3,"file":"AdWhaleMediationSdk.d.ts","sourceRoot":"","sources":["../../../src/AdWhaleMediationSdk.ts"],"names":[],"mappings":"AAoCA,eAAO,MAAM,mBAAmB;kBAChB,OAAO,CAAC,MAAM,CAAC;8BAOH,OAAO;sBAIf,OAAO;0BASH,OAAO,CAAC;QAAE,SAAS,EAAE,OAAO,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,CAAC;wBAUlD,OAAO,CAAC;QAC1B,KAAK,EAAE,OAAO,CAAC;QACf,IAAI,EAAE,MAAM,CAAC;QACb,mBAAmB,EAAE,OAAO,CAAC;KAC9B,CAAC;;qBAmBe,OAAO;CAQzB,CAAC"}
1
+ {"version":3,"file":"AdWhaleMediationSdk.d.ts","sourceRoot":"","sources":["../../../src/AdWhaleMediationSdk.ts"],"names":[],"mappings":"AAqCA,eAAO,MAAM,mBAAmB;kBAChB,OAAO,CAAC,MAAM,CAAC;8BAOH,OAAO;mBAIlB,OAAO,CAAC,MAAM,CAAC;sBASZ,OAAO;0BASH,OAAO,CAAC;QAAE,SAAS,EAAE,OAAO,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,CAAC;wBAUlD,OAAO,CAAC;QAC1B,KAAK,EAAE,OAAO,CAAC;QACf,IAAI,EAAE,MAAM,CAAC;QACb,mBAAmB,EAAE,OAAO,CAAC;KAC9B,CAAC;;qBAmBe,OAAO;CAQzB,CAAC"}
@@ -1,6 +1,6 @@
1
1
  import React from 'react';
2
2
  import type { StyleProp, ViewStyle } from 'react-native';
3
- export type AdWhaleNativeTemplateType = 'SMALL' | 'MEDIUM';
3
+ export type AdWhaleNativeTemplateType = 'SMALL' | 'MEDIUM' | 'FULLSCREEN';
4
4
  export interface AdWhaleNativeTemplateStyle {
5
5
  mainBackgroundColor?: string;
6
6
  primaryTextTypefaceColor?: string;
@@ -1 +1 @@
1
- {"version":3,"file":"AdWhaleNativeTemplateView.d.ts","sourceRoot":"","sources":["../../../src/AdWhaleNativeTemplateView.tsx"],"names":[],"mappings":"AACA,OAAO,KAAkD,MAAM,OAAO,CAAC;AAEvE,OAAO,KAAK,EAEV,SAAS,EACT,SAAS,EACV,MAAM,cAAc,CAAC;AAEtB,MAAM,MAAM,yBAAyB,GAAG,OAAO,GAAG,QAAQ,CAAC;AAE3D,MAAM,WAAW,0BAA0B;IACzC,mBAAmB,CAAC,EAAE,MAAM,CAAC;IAC7B,wBAAwB,CAAC,EAAE,MAAM,CAAC;IAClC,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,0BAA0B,CAAC,EAAE,MAAM,CAAC;IACpC,0BAA0B,CAAC,EAAE,MAAM,CAAC;IACpC,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,4BAA4B,CAAC,EAAE,MAAM,CAAC;IACtC,yBAAyB,CAAC,EAAE,MAAM,CAAC;IACnC,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,2BAA2B,CAAC,EAAE,MAAM,CAAC;IACrC,yBAAyB,CAAC,EAAE,MAAM,CAAC;IACnC,oBAAoB,CAAC,EAAE,MAAM,CAAC;IAC9B,2BAA2B,CAAC,EAAE,MAAM,CAAC;IACrC,mBAAmB,CAAC,EAAE,MAAM,GAAG,QAAQ,CAAC;IACxC,qBAAqB,CAAC,EAAE,MAAM,GAAG,QAAQ,CAAC;IAC1C,wBAAwB,CAAC,EAAE,MAAM,GAAG,QAAQ,CAAC;CAC9C;AAED,MAAM,WAAW,0BAA0B;IACzC,SAAS,EAAE,MAAM,CAAC;IAClB,YAAY,EAAE,MAAM,CAAC;CACtB;AAED,MAAM,WAAW,2BAA2B;IAC1C,EAAE,EAAE,MAAM,CAAC;IACX,GAAG,EAAE,MAAM,CAAC;CACb;AAED,MAAM,WAAW,8BAA8B;IAC7C,KAAK,CAAC,EAAE,SAAS,CAAC,SAAS,CAAC,CAAC;IAC7B,YAAY,EAAE,MAAM,CAAC;IACrB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,MAAM,CAAC,EAAE,2BAA2B,CAAC;IACrC,QAAQ,EAAE,yBAAyB,CAAC;IACpC,aAAa,CAAC,EAAE,0BAA0B,CAAC;IAE3C,UAAU,CAAC,EAAE,MAAM,IAAI,CAAC;IACxB,gBAAgB,CAAC,EAAE,CAAC,KAAK,EAAE,0BAA0B,KAAK,IAAI,CAAC;IAC/D,cAAc,CAAC,EAAE,CAAC,KAAK,EAAE,0BAA0B,KAAK,IAAI,CAAC;CAC9D;AAED,MAAM,WAAW,2BAA2B;IAC1C,MAAM,IAAI,IAAI,CAAC;IACf,MAAM,IAAI,IAAI,CAAC;CAChB;AAkBD,eAAO,MAAM,yBAAyB,oHAmDpC,CAAC"}
1
+ {"version":3,"file":"AdWhaleNativeTemplateView.d.ts","sourceRoot":"","sources":["../../../src/AdWhaleNativeTemplateView.tsx"],"names":[],"mappings":"AACA,OAAO,KAAkD,MAAM,OAAO,CAAC;AAEvE,OAAO,KAAK,EAEV,SAAS,EACT,SAAS,EACV,MAAM,cAAc,CAAC;AAEtB,MAAM,MAAM,yBAAyB,GAAG,OAAO,GAAG,QAAQ,GAAG,YAAY,CAAC;AAE1E,MAAM,WAAW,0BAA0B;IACzC,mBAAmB,CAAC,EAAE,MAAM,CAAC;IAC7B,wBAAwB,CAAC,EAAE,MAAM,CAAC;IAClC,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,0BAA0B,CAAC,EAAE,MAAM,CAAC;IACpC,0BAA0B,CAAC,EAAE,MAAM,CAAC;IACpC,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,4BAA4B,CAAC,EAAE,MAAM,CAAC;IACtC,yBAAyB,CAAC,EAAE,MAAM,CAAC;IACnC,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,2BAA2B,CAAC,EAAE,MAAM,CAAC;IACrC,yBAAyB,CAAC,EAAE,MAAM,CAAC;IACnC,oBAAoB,CAAC,EAAE,MAAM,CAAC;IAC9B,2BAA2B,CAAC,EAAE,MAAM,CAAC;IACrC,mBAAmB,CAAC,EAAE,MAAM,GAAG,QAAQ,CAAC;IACxC,qBAAqB,CAAC,EAAE,MAAM,GAAG,QAAQ,CAAC;IAC1C,wBAAwB,CAAC,EAAE,MAAM,GAAG,QAAQ,CAAC;CAC9C;AAED,MAAM,WAAW,0BAA0B;IACzC,SAAS,EAAE,MAAM,CAAC;IAClB,YAAY,EAAE,MAAM,CAAC;CACtB;AAED,MAAM,WAAW,2BAA2B;IAC1C,EAAE,EAAE,MAAM,CAAC;IACX,GAAG,EAAE,MAAM,CAAC;CACb;AAED,MAAM,WAAW,8BAA8B;IAC7C,KAAK,CAAC,EAAE,SAAS,CAAC,SAAS,CAAC,CAAC;IAC7B,YAAY,EAAE,MAAM,CAAC;IACrB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,MAAM,CAAC,EAAE,2BAA2B,CAAC;IACrC,QAAQ,EAAE,yBAAyB,CAAC;IACpC,aAAa,CAAC,EAAE,0BAA0B,CAAC;IAE3C,UAAU,CAAC,EAAE,MAAM,IAAI,CAAC;IACxB,gBAAgB,CAAC,EAAE,CAAC,KAAK,EAAE,0BAA0B,KAAK,IAAI,CAAC;IAC/D,cAAc,CAAC,EAAE,CAAC,KAAK,EAAE,0BAA0B,KAAK,IAAI,CAAC;CAC9D;AAED,MAAM,WAAW,2BAA2B;IAC1C,MAAM,IAAI,IAAI,CAAC;IACf,MAAM,IAAI,IAAI,CAAC;CAChB;AAkBD,eAAO,MAAM,yBAAyB,oHAmDpC,CAAC"}
@@ -5,6 +5,8 @@ export { AdWhaleInterstitialAd, } from './AdWhaleInterstitialAd';
5
5
  export type { AdWhaleInterstitialErrorEvent, AdWhaleInterstitialEvents, } from './AdWhaleInterstitialAd';
6
6
  export { AdWhaleRewardAd, } from './AdWhaleRewardAd';
7
7
  export type { AdWhaleRewardErrorEvent, AdWhaleRewardUserRewardedEvent, AdWhaleRewardEvents, } from './AdWhaleRewardAd';
8
+ export { AdWhaleAppOpenAd, } from './AdWhaleAppOpenAd';
9
+ export type { AdWhaleAppOpenErrorEvent, AdWhaleAppOpenEvents, } from './AdWhaleAppOpenAd';
8
10
  export { AdWhaleNativeCustomView, } from './AdWhaleNativeCustomView';
9
11
  export type { AdWhaleNativeCustomHandle, AdWhaleNativeCustomViewProps, AdWhaleNativeCustomError, } from './AdWhaleNativeCustomView';
10
12
  export * from './AdWhaleNativeTemplateView';
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/index.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,mBAAmB,EAAE,MAAM,uBAAuB,CAAC;AAY5D,OAAO,EACL,iBAAiB,GAClB,MAAM,qBAAqB,CAAC;AAC7B,YAAY,EACV,iBAAiB,EACjB,kBAAkB,EAClB,sBAAsB,GACvB,MAAM,qBAAqB,CAAC;AAI7B,OAAO,EACL,qBAAqB,GACtB,MAAM,yBAAyB,CAAC;AACjC,YAAY,EACV,6BAA6B,EAC7B,yBAAyB,GAC1B,MAAM,yBAAyB,CAAC;AAIjC,OAAO,EACL,eAAe,GAChB,MAAM,mBAAmB,CAAC;AAC3B,YAAY,EACV,uBAAuB,EACvB,8BAA8B,EAC9B,mBAAmB,GACpB,MAAM,mBAAmB,CAAC;AAI3B,OAAO,EACL,uBAAuB,GACxB,MAAM,2BAA2B,CAAC;AACnC,YAAY,EACV,yBAAyB,EACzB,4BAA4B,EAC5B,wBAAwB,GACzB,MAAM,2BAA2B,CAAC;AAMnC,cAAc,6BAA6B,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/index.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,mBAAmB,EAAE,MAAM,uBAAuB,CAAC;AAY5D,OAAO,EACL,iBAAiB,GAClB,MAAM,qBAAqB,CAAC;AAC7B,YAAY,EACV,iBAAiB,EACjB,kBAAkB,EAClB,sBAAsB,GACvB,MAAM,qBAAqB,CAAC;AAI7B,OAAO,EACL,qBAAqB,GACtB,MAAM,yBAAyB,CAAC;AACjC,YAAY,EACV,6BAA6B,EAC7B,yBAAyB,GAC1B,MAAM,yBAAyB,CAAC;AAIjC,OAAO,EACL,eAAe,GAChB,MAAM,mBAAmB,CAAC;AAC3B,YAAY,EACV,uBAAuB,EACvB,8BAA8B,EAC9B,mBAAmB,GACpB,MAAM,mBAAmB,CAAC;AAI3B,OAAO,EACL,gBAAgB,GACjB,MAAM,oBAAoB,CAAC;AAC5B,YAAY,EACV,wBAAwB,EACxB,oBAAoB,GACrB,MAAM,oBAAoB,CAAC;AAI5B,OAAO,EACL,uBAAuB,GACxB,MAAM,2BAA2B,CAAC;AACnC,YAAY,EACV,yBAAyB,EACzB,4BAA4B,EAC5B,wBAAwB,GACzB,MAAM,2BAA2B,CAAC;AAMnC,cAAc,6BAA6B,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "adwhale-sdk-react-native",
3
- "version": "2.7.102",
3
+ "version": "2.7.201",
4
4
  "description": "Adwhale SDK React Native library for integrating Adwhale advertising mediation SDK into React Native applications.",
5
5
  "main": "./lib/module/index.js",
6
6
  "react-native": "./lib/module/index.js",
@@ -12,6 +12,8 @@
12
12
  "source": "./src/index.ts",
13
13
  "default": "./lib/module/index.js"
14
14
  },
15
+ "./app.plugin.js": "./app.plugin.js",
16
+ "./plugin": "./plugin/index.js",
15
17
  "./package.json": "./package.json"
16
18
  },
17
19
  "files": [
@@ -30,6 +32,7 @@
30
32
  "!android/gradlew",
31
33
  "!android/gradlew.bat",
32
34
  "!android/local.properties",
35
+ "!android/build.gradle.backup",
33
36
  "!**/__tests__",
34
37
  "!**/__fixtures__",
35
38
  "!**/__mocks__",
@@ -42,7 +45,9 @@
42
45
  "typecheck": "tsc",
43
46
  "lint": "eslint \"**/*.{js,ts,tsx}\"",
44
47
  "release": "release-it --only-version",
45
- "test": "jest"
48
+ "test": "jest",
49
+ "prepack": "node scripts/prepack-build-gradle.js",
50
+ "postpack": "node scripts/postpack-build-gradle.js"
46
51
  },
47
52
  "keywords": [
48
53
  "react-native",
package/plugin/index.js CHANGED
@@ -1,16 +1,300 @@
1
- // plugin/index.js
2
- const { createRunOncePlugin } = require('@expo/config-plugins');
1
+ /**
2
+ * AdWhale Expo Config Plugin
3
+ *
4
+ * 목적:
5
+ * - Expo Bare / Managed / prebuild / EAS Dev Client 환경에서
6
+ * AdWhale Android SDK 의존성을 정상적으로 resolve 하기 위해
7
+ * Maven Repository들을 자동으로 Gradle 설정에 추가한다.
8
+ *
9
+ * 전략:
10
+ * 1) android/settings.gradle
11
+ * - dependencyResolutionManagement { repositories { ... } } 에 repo 추가
12
+ * - rootProject.name 바로 다음 줄에 삽입 (가독성 + 충돌 최소화)
13
+ *
14
+ * 2) android/build.gradle (project-level)
15
+ * - allprojects { repositories { ... } } 에 repo 추가
16
+ *
17
+ * 3) 단, settings.gradle에
18
+ * repositoriesMode.set(RepositoriesMode.FAIL_ON_PROJECT_REPOS)
19
+ * 가 존재하는 경우:
20
+ * - project-level repo 사용이 금지되므로
21
+ * - build.gradle 수정은 생략
22
+ *
23
+ * 결과:
24
+ * - AGP 7/8
25
+ * - Expo SDK 49+
26
+ * - Version Catalog / 강한 repo 정책
27
+ * 모두에서 안전하게 동작
28
+ */
29
+
30
+ const {
31
+ createRunOncePlugin,
32
+ withAndroidProjectBuildGradle,
33
+ withSettingsGradle,
34
+ } = require('expo/config-plugins');
35
+
3
36
  const pkg = require('../package.json');
4
37
 
5
- // Expo config plugin (no-op)
6
- // - Expo prebuild 호출되지만, 실제로는 config를 그대로 반환만 함.
7
- const withAdwhaleSdkReactNative = (config, props = {}) => {
8
- // 나중에 필요해지면 여기서 AndroidManifest / build.gradle 수정 로직만 추가하면 됨.
38
+ /**
39
+ * 추가할 Maven Repository 목록
40
+ */
41
+ const MAVEN_REPOSITORIES = [
42
+ {
43
+ comment: 'AdWhale SDK Repository Public Access Info',
44
+ url: 'https://dev-adwhale.github.io/adwhale-sdk-android-maven/maven-repo',
45
+ },
46
+ {
47
+ comment: 'Cauly SDK Repository Public Access Info',
48
+ url: 'https://cauly.github.io/cauly-sdk-android-maven/maven-repo',
49
+ },
50
+ {
51
+ comment: 'Admize SDK Repository Public Access Info',
52
+ url: 'https://cauly.github.io/admize-sdk-android-maven/maven-repo',
53
+ },
54
+ {
55
+ comment: 'AdFit SDK Repository Public Access Info',
56
+ url: 'https://devrepo.kakao.com/nexus/content/groups/public/',
57
+ },
58
+ ];
59
+
60
+ /**
61
+ * 중복 삽입 방지를 위한 마커
62
+ */
63
+ const MARKER_BEGIN = '// [AdWhale] BEGIN Maven Repositories';
64
+ const MARKER_END = '// [AdWhale] END Maven Repositories';
65
+
66
+ /**
67
+ * repo 블록 문자열 생성
68
+ */
69
+ function generateReposBlock(indent = ' ') {
70
+ const body = MAVEN_REPOSITORIES.map(
71
+ (repo) =>
72
+ `${indent}// ${repo.comment}\n` +
73
+ `${indent}maven { url "${repo.url}" }`
74
+ ).join('\n\n');
75
+
76
+ return `${indent}${MARKER_BEGIN}\n\n${body}\n\n${indent}${MARKER_END}`;
77
+ }
78
+
79
+ /**
80
+ * repositories { } 안에
81
+ * google(), mavenCentral() 이 없으면 보장해준다
82
+ */
83
+ function ensureGoogleAndMavenCentral(reposBlock, indent = ' ') {
84
+ if (!/google\(\)/.test(reposBlock)) {
85
+ reposBlock = reposBlock.replace(
86
+ /repositories\s*\{\s*/m,
87
+ (m) => `${m}\n${indent}google()`
88
+ );
89
+ }
90
+
91
+ if (!/mavenCentral\(\)/.test(reposBlock)) {
92
+ if (/google\(\)/.test(reposBlock)) {
93
+ reposBlock = reposBlock.replace(
94
+ /(google\(\))/m,
95
+ `$1\n${indent}mavenCentral()`
96
+ );
97
+ } else {
98
+ reposBlock = reposBlock.replace(
99
+ /repositories\s*\{\s*/m,
100
+ (m) => `${m}\n${indent}mavenCentral()`
101
+ );
102
+ }
103
+ }
104
+
105
+ return reposBlock;
106
+ }
107
+
108
+ /**
109
+ * settings.gradle 에서
110
+ * repositoriesMode = FAIL_ON_PROJECT_REPOS 가 있는지 검사
111
+ *
112
+ * 이 설정이 있으면 project-level(build.gradle) repo 사용이 금지됨
113
+ */
114
+ function hasFailOnProjectRepos(contents) {
115
+ return /repositoriesMode\.set\s*\(\s*RepositoriesMode\.FAIL_ON_PROJECT_REPOS\s*\)/
116
+ .test(contents);
117
+ }
118
+
119
+ /**
120
+ * android/settings.gradle 패치
121
+ *
122
+ * - dependencyResolutionManagement 가 없으면 새로 생성
123
+ * - 있으면 내부 repositories { } 에 repo 추가
124
+ * - rootProject.name 바로 다음 줄에 삽입
125
+ */
126
+ function patchSettingsGradle(contents) {
127
+ const failOnProjectRepos = hasFailOnProjectRepos(contents);
128
+
129
+ // 이미 우리가 삽입한 흔적이 있으면 그대로 유지
130
+ if (contents.includes(MARKER_BEGIN)) {
131
+ return { contents, failOnProjectRepos };
132
+ }
133
+
134
+ // dependencyResolutionManagement 가 아예 없는 경우
135
+ if (!/dependencyResolutionManagement\s*\{/.test(contents)) {
136
+ const drmBlock =
137
+ `\n\ndependencyResolutionManagement {\n` +
138
+ ` repositories {\n` +
139
+ ` google()\n` +
140
+ ` mavenCentral()\n\n` +
141
+ `${generateReposBlock(' ')}\n` +
142
+ ` }\n` +
143
+ `}\n`;
144
+
145
+ // rootProject.name 바로 뒤에 삽입
146
+ const rootNameRegex =
147
+ /(^\s*rootProject\.name\s*=\s*['"][^'"]+['"]\s*$)/m;
148
+
149
+ const match = contents.match(rootNameRegex);
150
+ if (match) {
151
+ const insertAt = match.index + match[0].length;
152
+ contents =
153
+ contents.slice(0, insertAt) +
154
+ drmBlock +
155
+ contents.slice(insertAt);
156
+ } else {
157
+ contents += drmBlock;
158
+ }
159
+
160
+ return { contents, failOnProjectRepos };
161
+ }
162
+
163
+ // dependencyResolutionManagement 는 있으나 repositories 가 없는 경우
164
+ if (
165
+ !/dependencyResolutionManagement\s*\{[\s\S]*?repositories\s*\{/
166
+ .test(contents)
167
+ ) {
168
+ contents = contents.replace(
169
+ /(dependencyResolutionManagement\s*\{)/,
170
+ `$1\n repositories {\n google()\n mavenCentral()\n\n${generateReposBlock(
171
+ ' '
172
+ )}\n }\n`
173
+ );
174
+
175
+ return { contents, failOnProjectRepos };
176
+ }
177
+
178
+ // repositories 블록 내부에 repo 추가
179
+ const startMatch =
180
+ contents.match(/dependencyResolutionManagement\s*\{[\s\S]*?repositories\s*\{/);
181
+
182
+ if (!startMatch) {
183
+ return { contents, failOnProjectRepos };
184
+ }
185
+
186
+ const startIdx = contents.indexOf(startMatch[0]) + startMatch[0].length;
187
+
188
+ // brace 스캔으로 repositories { } 범위 찾기
189
+ let i = startIdx - 1;
190
+ let brace = 1;
191
+ while (i < contents.length && brace > 0) {
192
+ i++;
193
+ if (contents[i] === '{') brace++;
194
+ else if (contents[i] === '}') brace--;
195
+ }
196
+
197
+ const reposBlockStart = contents.lastIndexOf('repositories', startIdx);
198
+ let reposBlock = contents.slice(reposBlockStart, i + 1);
199
+
200
+ reposBlock = ensureGoogleAndMavenCentral(reposBlock, ' ');
201
+
202
+ const missing = MAVEN_REPOSITORIES.filter(
203
+ (r) => !reposBlock.includes(r.url)
204
+ );
205
+
206
+ if (missing.length === 0) {
207
+ return { contents, failOnProjectRepos };
208
+ }
209
+
210
+ const block =
211
+ ` ${MARKER_BEGIN}\n\n` +
212
+ missing
213
+ .map(
214
+ (r) =>
215
+ ` // ${r.comment}\n maven { url "${r.url}" }`
216
+ )
217
+ .join('\n\n') +
218
+ `\n\n ${MARKER_END}`;
219
+
220
+ reposBlock = reposBlock.replace(
221
+ /(mavenCentral\(\)\s*)/,
222
+ `$1\n\n${block}\n`
223
+ );
224
+
225
+ contents =
226
+ contents.slice(0, reposBlockStart) +
227
+ reposBlock +
228
+ contents.slice(i + 1);
229
+
230
+ return { contents, failOnProjectRepos };
231
+ }
232
+
233
+ /**
234
+ * android/build.gradle (project-level) 패치
235
+ *
236
+ * - allprojects { repositories { ... } } 에 repo 추가
237
+ * - settings.gradle 에 FAIL_ON_PROJECT_REPOS 가 있으면 호출되지 않음
238
+ */
239
+ function patchProjectBuildGradle(contents) {
240
+ if (contents.includes(MARKER_BEGIN)) return contents;
241
+
242
+ if (!/allprojects\s*\{/.test(contents)) {
243
+ return (
244
+ contents +
245
+ `\n\nallprojects {\n` +
246
+ ` repositories {\n` +
247
+ ` google()\n` +
248
+ ` mavenCentral()\n\n` +
249
+ `${generateReposBlock(' ')}\n` +
250
+ ` }\n` +
251
+ `}\n`
252
+ );
253
+ }
254
+
255
+ if (
256
+ !/allprojects\s*\{[\s\S]*?repositories\s*\{/.test(contents)
257
+ ) {
258
+ return contents.replace(
259
+ /(allprojects\s*\{)/,
260
+ `$1\n repositories {\n google()\n mavenCentral()\n\n${generateReposBlock(
261
+ ' '
262
+ )}\n }\n`
263
+ );
264
+ }
265
+
266
+ return contents;
267
+ }
268
+
269
+ /**
270
+ * 실제 적용 플러그인
271
+ */
272
+ const withAdwhaleMavenRepositories = (config) => {
273
+ let failOnProjectRepos = false;
274
+
275
+ // 1) settings.gradle 먼저 처리
276
+ config = withSettingsGradle(config, (c) => {
277
+ const result = patchSettingsGradle(c.modResults.contents);
278
+ c.modResults.contents = result.contents;
279
+ failOnProjectRepos = result.failOnProjectRepos;
280
+ return c;
281
+ });
282
+
283
+ // 2) FAIL_ON_PROJECT_REPOS 가 없을 때만 build.gradle 처리
284
+ if (!failOnProjectRepos) {
285
+ config = withAndroidProjectBuildGradle(config, (c) => {
286
+ c.modResults.contents = patchProjectBuildGradle(
287
+ c.modResults.contents
288
+ );
289
+ return c;
290
+ });
291
+ }
292
+
9
293
  return config;
10
294
  };
11
295
 
12
296
  module.exports = createRunOncePlugin(
13
- withAdwhaleSdkReactNative,
297
+ withAdwhaleMavenRepositories,
14
298
  pkg.name,
15
299
  pkg.version
16
300
  );
@@ -0,0 +1,118 @@
1
+ // src/AdWhaleAppOpenAd.ts
2
+ import { NativeEventEmitter, NativeModules } from 'react-native';
3
+ import type { EmitterSubscription } from 'react-native';
4
+
5
+ export interface AdWhaleAppOpenErrorEvent {
6
+ statusCode: number;
7
+ message: string;
8
+ }
9
+
10
+ export interface AdWhaleAppOpenEvents {
11
+ onLoaded?: () => void;
12
+ onLoadFailed?: (event: AdWhaleAppOpenErrorEvent) => void;
13
+ onShowed?: () => void;
14
+ onShowFailed?: (event: AdWhaleAppOpenErrorEvent) => void;
15
+ onDismissed?: () => void;
16
+ onClicked?: () => void;
17
+ }
18
+
19
+ export interface AdWhaleAppOpenAdGcoder {
20
+ lt: number;
21
+ lng: number;
22
+ }
23
+
24
+ interface RNAdWhaleMediationAppOpenAdNativeModule {
25
+ setPlacementName(placementName: string): void;
26
+ setRegion(region: string): void;
27
+ setGcoder(gcoder: { lt: number; lng: number }): void;
28
+ loadAd(placementUid: string): void;
29
+ showAd(): void;
30
+ addListener(eventName: string): void;
31
+ removeListeners(count: number): void;
32
+ }
33
+
34
+ const { RNAdWhaleMediationAppOpenAd } = NativeModules as {
35
+ RNAdWhaleMediationAppOpenAd: RNAdWhaleMediationAppOpenAdNativeModule;
36
+ };
37
+
38
+ const appOpenEmitter = new NativeEventEmitter(RNAdWhaleMediationAppOpenAd);
39
+
40
+ export const AdWhaleAppOpenAd = {
41
+ loadAd(
42
+ placementUid: string,
43
+ options?: {
44
+ placementName?: string;
45
+ region?: string;
46
+ gcoder?: AdWhaleAppOpenAdGcoder;
47
+ },
48
+ ) {
49
+ // 먼저 옵션들을 설정
50
+ if (options?.placementName) {
51
+ RNAdWhaleMediationAppOpenAd.setPlacementName(options.placementName);
52
+ }
53
+ if (options?.region) {
54
+ RNAdWhaleMediationAppOpenAd.setRegion(options.region);
55
+ }
56
+ if (options?.gcoder) {
57
+ RNAdWhaleMediationAppOpenAd.setGcoder(options.gcoder);
58
+ }
59
+ // 그 다음 loadAd 호출
60
+ RNAdWhaleMediationAppOpenAd.loadAd(placementUid);
61
+ },
62
+
63
+ showAd() {
64
+ RNAdWhaleMediationAppOpenAd.showAd();
65
+ },
66
+
67
+ addEventListeners(listeners: AdWhaleAppOpenEvents): EmitterSubscription[] {
68
+ const subs: EmitterSubscription[] = [];
69
+
70
+ if (listeners.onLoaded) {
71
+ subs.push(
72
+ appOpenEmitter.addListener('onAppOpenAdLoaded', () => {
73
+ listeners.onLoaded?.();
74
+ }),
75
+ );
76
+ }
77
+ if (listeners.onLoadFailed) {
78
+ subs.push(
79
+ appOpenEmitter.addListener(
80
+ 'onAppOpenAdFailedToLoad',
81
+ event => listeners.onLoadFailed?.(event as AdWhaleAppOpenErrorEvent),
82
+ ),
83
+ );
84
+ }
85
+ if (listeners.onShowed) {
86
+ subs.push(
87
+ appOpenEmitter.addListener('onAppOpenAdShowed', () => {
88
+ listeners.onShowed?.();
89
+ }),
90
+ );
91
+ }
92
+ if (listeners.onShowFailed) {
93
+ subs.push(
94
+ appOpenEmitter.addListener(
95
+ 'onAppOpenAdFailedToShow',
96
+ event => listeners.onShowFailed?.(event as AdWhaleAppOpenErrorEvent),
97
+ ),
98
+ );
99
+ }
100
+ if (listeners.onDismissed) {
101
+ subs.push(
102
+ appOpenEmitter.addListener('onAppOpenAdDismissed', () => {
103
+ listeners.onDismissed?.();
104
+ }),
105
+ );
106
+ }
107
+ if (listeners.onClicked) {
108
+ subs.push(
109
+ appOpenEmitter.addListener('onAppOpenAdClicked', () => {
110
+ listeners.onClicked?.();
111
+ }),
112
+ );
113
+ }
114
+
115
+ return subs;
116
+ },
117
+ };
118
+
@@ -12,6 +12,7 @@ const LINKING_ERROR =
12
12
 
13
13
  interface RNAdWhaleMediationLoggerModule {
14
14
  setLogLevel?(enabled: boolean): void;
15
+ getLogLevel?(): Promise<string>;
15
16
  }
16
17
 
17
18
  const { RNAdWhaleMediationLoggerModule } = NativeModules as {
@@ -46,6 +47,15 @@ export const AdWhaleMediationSdk = {
46
47
  RNAdWhaleMediationLoggerModule?.setLogLevel?.(enabled);
47
48
  },
48
49
 
50
+ getLogLevel(): Promise<string> {
51
+ if (!RNAdWhaleMediationLoggerModule?.getLogLevel) {
52
+ return Promise.reject(
53
+ new Error('getLogLevel is not implemented in native module')
54
+ );
55
+ }
56
+ return RNAdWhaleMediationLoggerModule.getLogLevel();
57
+ },
58
+
49
59
  setCoppa(enabled: boolean) {
50
60
  console.log('[AdWhaleMediationSdk] setCoppa called:', enabled);
51
61
  if (!AdwhaleSdkReactNative?.setCoppa) {
@@ -7,7 +7,7 @@ import type {
7
7
  ViewStyle,
8
8
  } from 'react-native';
9
9
 
10
- export type AdWhaleNativeTemplateType = 'SMALL' | 'MEDIUM';
10
+ export type AdWhaleNativeTemplateType = 'SMALL' | 'MEDIUM' | 'FULLSCREEN';
11
11
 
12
12
  export interface AdWhaleNativeTemplateStyle {
13
13
  mainBackgroundColor?: string;
package/src/index.ts CHANGED
@@ -44,7 +44,17 @@ export type {
44
44
  } from './AdWhaleRewardAd';
45
45
 
46
46
 
47
- // ✅ 5) 네이티브 커스텀 (네이티브 템플릿/커스텀용)
47
+ // ✅ 5) 오프닝 광고 API
48
+ export {
49
+ AdWhaleAppOpenAd,
50
+ } from './AdWhaleAppOpenAd';
51
+ export type {
52
+ AdWhaleAppOpenErrorEvent,
53
+ AdWhaleAppOpenEvents,
54
+ } from './AdWhaleAppOpenAd';
55
+
56
+
57
+ // ✅ 6) 네이티브 커스텀 뷰 (네이티브 템플릿/커스텀용)
48
58
  export {
49
59
  AdWhaleNativeCustomView,
50
60
  } from './AdWhaleNativeCustomView';
@@ -55,7 +65,7 @@ export type {
55
65
  } from './AdWhaleNativeCustomView';
56
66
 
57
67
 
58
- // ✅ 6) (선택) 네이티브 템플릿 뷰가 있다면 그대로 유지
68
+ // ✅ 7) (선택) 네이티브 템플릿 뷰가 있다면 그대로 유지
59
69
  // 파일이 실제로 있다면 그대로 유효하고,
60
70
  // 나중에 뺄 거면 여기 export 한 줄만 지우면 됨.
61
71
  export * from './AdWhaleNativeTemplateView';