adwhale-sdk-react-native 2.7.102 → 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.
- package/README.md +4 -4
- package/android/build.gradle +9 -6
- package/android/proguard-rules.pro +17 -0
- package/android/src/main/java/com/adwhalesdkreactnative/AdwhaleSdkReactNativePackage.java +24 -4
- package/android/src/main/java/com/adwhalesdkreactnative/RNAdWhaleMediationAppOpenAd.java +240 -0
- package/android/src/main/java/com/adwhalesdkreactnative/RNAdWhaleMediationLoggerModule.java +14 -0
- package/android/src/main/java/com/adwhalesdkreactnative/RNAdWhaleMediationTemplateNativeAdView.java +2 -0
- package/lib/module/AdWhaleAppOpenAd.js +58 -0
- package/lib/module/AdWhaleAppOpenAd.js.map +1 -0
- package/lib/module/AdWhaleMediationSdk.js +6 -0
- package/lib/module/AdWhaleMediationSdk.js.map +1 -1
- package/lib/module/index.js +4 -2
- package/lib/module/index.js.map +1 -1
- package/lib/typescript/src/AdWhaleAppOpenAd.d.ts +27 -0
- package/lib/typescript/src/AdWhaleAppOpenAd.d.ts.map +1 -0
- package/lib/typescript/src/AdWhaleMediationSdk.d.ts +1 -0
- package/lib/typescript/src/AdWhaleMediationSdk.d.ts.map +1 -1
- package/lib/typescript/src/AdWhaleNativeTemplateView.d.ts +1 -1
- package/lib/typescript/src/AdWhaleNativeTemplateView.d.ts.map +1 -1
- package/lib/typescript/src/index.d.ts +2 -0
- package/lib/typescript/src/index.d.ts.map +1 -1
- package/package.json +5 -2
- package/plugin/index.js +135 -4
- package/src/AdWhaleAppOpenAd.ts +118 -0
- package/src/AdWhaleMediationSdk.ts +10 -0
- package/src/AdWhaleNativeTemplateView.tsx +1 -1
- 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.
|
|
46
|
+
"adwhale-sdk-react-native": "~2.7.200"
|
|
47
47
|
}
|
|
48
48
|
```
|
|
49
|
-
- Android SDK 2.7.
|
|
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.
|
|
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.
|
|
65
|
+
"adwhale-sdk-react-native": "2.7.200"
|
|
66
66
|
}
|
|
67
67
|
```
|
|
68
68
|
|
package/android/build.gradle
CHANGED
|
@@ -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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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
|
-
//
|
|
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
|
-
//
|
|
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
|
-
//
|
|
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
|
}
|
package/android/src/main/java/com/adwhalesdkreactnative/RNAdWhaleMediationTemplateNativeAdView.java
CHANGED
|
@@ -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":";;AAAA;AACA,SAASA,aAAa,EAAEC,QAAQ,QAAQ,cAAc;AACtD,OAAOC,2BAA2B,MAAM,kCAA+B;AAEvE,MAAMC,aAAa,GACjB,oDAAoD,GACpD,cAAc,GACd,6EAA6E,GAC7E,mCAAmC,GACnC,0BAA0B,GAC1B,aAAaF,QAAQ,CAACG,EAAE,EAAE;
|
|
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":[]}
|
package/lib/module/index.js
CHANGED
|
@@ -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
|
-
// ✅
|
|
26
|
+
// ✅ 7) (선택) 네이티브 템플릿 뷰가 있다면 그대로 유지
|
|
25
27
|
// 파일이 실제로 있다면 그대로 유효하고,
|
|
26
28
|
// 나중에 뺄 거면 여기 export 한 줄만 지우면 됨.
|
|
27
29
|
export * from "./AdWhaleNativeTemplateView.js";
|
package/lib/module/index.js.map
CHANGED
|
@@ -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 +1 @@
|
|
|
1
|
-
{"version":3,"file":"AdWhaleMediationSdk.d.ts","sourceRoot":"","sources":["../../../src/AdWhaleMediationSdk.ts"],"names":[],"mappings":"
|
|
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;
|
|
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.
|
|
3
|
+
"version": "2.7.200",
|
|
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",
|
|
@@ -30,6 +30,7 @@
|
|
|
30
30
|
"!android/gradlew",
|
|
31
31
|
"!android/gradlew.bat",
|
|
32
32
|
"!android/local.properties",
|
|
33
|
+
"!android/build.gradle.backup",
|
|
33
34
|
"!**/__tests__",
|
|
34
35
|
"!**/__fixtures__",
|
|
35
36
|
"!**/__mocks__",
|
|
@@ -42,7 +43,9 @@
|
|
|
42
43
|
"typecheck": "tsc",
|
|
43
44
|
"lint": "eslint \"**/*.{js,ts,tsx}\"",
|
|
44
45
|
"release": "release-it --only-version",
|
|
45
|
-
"test": "jest"
|
|
46
|
+
"test": "jest",
|
|
47
|
+
"prepack": "node scripts/prepack-build-gradle.js",
|
|
48
|
+
"postpack": "node scripts/postpack-build-gradle.js"
|
|
46
49
|
},
|
|
47
50
|
"keywords": [
|
|
48
51
|
"react-native",
|
package/plugin/index.js
CHANGED
|
@@ -1,11 +1,142 @@
|
|
|
1
1
|
// plugin/index.js
|
|
2
|
-
const { createRunOncePlugin } = require('@expo/config-plugins');
|
|
2
|
+
const { createRunOncePlugin, withAndroidBuildGradle } = require('@expo/config-plugins');
|
|
3
3
|
const pkg = require('../package.json');
|
|
4
4
|
|
|
5
|
-
//
|
|
6
|
-
|
|
5
|
+
// Maven repository URLs to add
|
|
6
|
+
const MAVEN_REPOSITORIES = [
|
|
7
|
+
{
|
|
8
|
+
comment: 'AdWhale SDK Repository Public Access Info',
|
|
9
|
+
url: 'https://dev-adwhale.github.io/adwhale-sdk-android-maven/maven-repo',
|
|
10
|
+
},
|
|
11
|
+
{
|
|
12
|
+
comment: 'Cauly SDK Repository Public Access Info',
|
|
13
|
+
url: 'https://cauly.github.io/cauly-sdk-android-maven/maven-repo',
|
|
14
|
+
},
|
|
15
|
+
{
|
|
16
|
+
comment: 'Admize SDK Repository Public Access Info',
|
|
17
|
+
url: 'https://cauly.github.io/admize-sdk-android-maven/maven-repo',
|
|
18
|
+
},
|
|
19
|
+
{
|
|
20
|
+
comment: 'AdFit SDK Repository Public Access Info',
|
|
21
|
+
url: 'https://devrepo.kakao.com/nexus/content/groups/public/',
|
|
22
|
+
},
|
|
23
|
+
];
|
|
24
|
+
|
|
25
|
+
/**
|
|
26
|
+
* Generate maven repositories block content
|
|
27
|
+
*/
|
|
28
|
+
function generateMavenRepositories(indent = ' ') {
|
|
29
|
+
return MAVEN_REPOSITORIES.map(
|
|
30
|
+
(repo) => `${indent}// ${repo.comment}\n${indent}maven { url "${repo.url}" }`
|
|
31
|
+
).join('\n\n');
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
/**
|
|
35
|
+
* Add maven repositories to Android build.gradle
|
|
36
|
+
* This modifies the allprojects { repositories { ... } } block
|
|
37
|
+
*/
|
|
38
|
+
const withAdwhaleMavenRepositories = (config) => {
|
|
39
|
+
return withAndroidBuildGradle(config, (config) => {
|
|
40
|
+
let buildGradle = config.modResults.contents;
|
|
41
|
+
|
|
42
|
+
// Check if allprojects block exists
|
|
43
|
+
if (!buildGradle.includes('allprojects')) {
|
|
44
|
+
// If allprojects doesn't exist, add it at the end
|
|
45
|
+
const repositoriesBlock = `
|
|
46
|
+
|
|
47
|
+
allprojects {
|
|
48
|
+
repositories {
|
|
49
|
+
google()
|
|
50
|
+
mavenCentral()
|
|
51
|
+
|
|
52
|
+
${generateMavenRepositories()}
|
|
53
|
+
}
|
|
54
|
+
}`;
|
|
55
|
+
config.modResults.contents = buildGradle + repositoriesBlock;
|
|
56
|
+
return config;
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
// allprojects exists, check if repositories block exists inside it
|
|
60
|
+
const allprojectsRepositoriesRegex = /allprojects\s*\{[\s\S]*?repositories\s*\{/;
|
|
61
|
+
|
|
62
|
+
if (!allprojectsRepositoriesRegex.test(buildGradle)) {
|
|
63
|
+
// allprojects exists but no repositories block, add it
|
|
64
|
+
const repositoriesBlock = ` repositories {
|
|
65
|
+
google()
|
|
66
|
+
mavenCentral()
|
|
67
|
+
|
|
68
|
+
${generateMavenRepositories(' ')}
|
|
69
|
+
|
|
70
|
+
}`;
|
|
71
|
+
|
|
72
|
+
// Insert repositories block after allprojects {
|
|
73
|
+
buildGradle = buildGradle.replace(
|
|
74
|
+
/(allprojects\s*\{)/,
|
|
75
|
+
`$1\n${repositoriesBlock}`
|
|
76
|
+
);
|
|
77
|
+
config.modResults.contents = buildGradle;
|
|
78
|
+
return config;
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
// allprojects { repositories { ... } } exists, add missing repositories
|
|
82
|
+
// Ensure google() exists in allprojects.repositories
|
|
83
|
+
const googleInAllprojectsRegex = /allprojects\s*\{[\s\S]*?repositories\s*\{[\s\S]*?google\(\)/;
|
|
84
|
+
if (!googleInAllprojectsRegex.test(buildGradle)) {
|
|
85
|
+
buildGradle = buildGradle.replace(
|
|
86
|
+
/(allprojects\s*\{[\s\S]*?repositories\s*\{)/,
|
|
87
|
+
'$1\n google()'
|
|
88
|
+
);
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
// Ensure mavenCentral() exists in allprojects.repositories
|
|
92
|
+
const mavenCentralInAllprojectsRegex = /allprojects\s*\{[\s\S]*?repositories\s*\{[\s\S]*?mavenCentral\(\)/;
|
|
93
|
+
if (!mavenCentralInAllprojectsRegex.test(buildGradle)) {
|
|
94
|
+
if (googleInAllprojectsRegex.test(buildGradle)) {
|
|
95
|
+
buildGradle = buildGradle.replace(
|
|
96
|
+
/(allprojects\s*\{[\s\S]*?repositories\s*\{[\s\S]*?google\(\))/,
|
|
97
|
+
'$1\n mavenCentral()'
|
|
98
|
+
);
|
|
99
|
+
} else {
|
|
100
|
+
buildGradle = buildGradle.replace(
|
|
101
|
+
/(allprojects\s*\{[\s\S]*?repositories\s*\{)/,
|
|
102
|
+
'$1\n mavenCentral()'
|
|
103
|
+
);
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
// Add each maven repository if it doesn't exist
|
|
108
|
+
MAVEN_REPOSITORIES.forEach((repo) => {
|
|
109
|
+
const urlEscaped = repo.url.replace(/[.*+?^${}()|[\]\\]/g, '\\$&');
|
|
110
|
+
const urlInAllprojectsRegex = new RegExp(
|
|
111
|
+
`allprojects\\s*\\{[\\s\\S]*?repositories\\s*\\{[\\s\\S]*?${urlEscaped}`
|
|
112
|
+
);
|
|
113
|
+
|
|
114
|
+
if (!urlInAllprojectsRegex.test(buildGradle)) {
|
|
115
|
+
// Add after mavenCentral() if it exists in allprojects.repositories
|
|
116
|
+
if (mavenCentralInAllprojectsRegex.test(buildGradle)) {
|
|
117
|
+
buildGradle = buildGradle.replace(
|
|
118
|
+
/(allprojects\s*\{[\s\S]*?repositories\s*\{[\s\S]*?mavenCentral\(\))/,
|
|
119
|
+
`$1\n\n // ${repo.comment}\n maven { url "${repo.url}" }`
|
|
120
|
+
);
|
|
121
|
+
} else {
|
|
122
|
+
// Add after repositories {
|
|
123
|
+
buildGradle = buildGradle.replace(
|
|
124
|
+
/(allprojects\s*\{[\s\S]*?repositories\s*\{)/,
|
|
125
|
+
`$1\n // ${repo.comment}\n maven { url "${repo.url}" }`
|
|
126
|
+
);
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
});
|
|
130
|
+
|
|
131
|
+
config.modResults.contents = buildGradle;
|
|
132
|
+
return config;
|
|
133
|
+
});
|
|
134
|
+
};
|
|
135
|
+
|
|
136
|
+
// Expo config plugin
|
|
7
137
|
const withAdwhaleSdkReactNative = (config, props = {}) => {
|
|
8
|
-
//
|
|
138
|
+
// Android build.gradle에 maven repositories 추가
|
|
139
|
+
config = withAdwhaleMavenRepositories(config);
|
|
9
140
|
return config;
|
|
10
141
|
};
|
|
11
142
|
|
|
@@ -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
|
-
// ✅
|
|
68
|
+
// ✅ 7) (선택) 네이티브 템플릿 뷰가 있다면 그대로 유지
|
|
59
69
|
// 파일이 실제로 있다면 그대로 유효하고,
|
|
60
70
|
// 나중에 뺄 거면 여기 export 한 줄만 지우면 됨.
|
|
61
71
|
export * from './AdWhaleNativeTemplateView';
|