Skip to content
This repository has been archived by the owner on Apr 27, 2022. It is now read-only.

Commit

Permalink
feat: add SSV options
Browse files Browse the repository at this point in the history
  • Loading branch information
wjaykim committed Dec 14, 2021
1 parent 26369dc commit edb61ad
Show file tree
Hide file tree
Showing 10 changed files with 101 additions and 15 deletions.
22 changes: 22 additions & 0 deletions android/src/main/java/com/rnadmob/admob/RNAdMobCommon.java
Expand Up @@ -12,6 +12,7 @@
import com.google.ads.mediation.admob.AdMobAdapter;
import com.google.android.gms.ads.AdSize;
import com.google.android.gms.ads.admanager.AdManagerAdRequest;
import com.google.android.gms.ads.rewarded.ServerSideVerificationOptions;

import java.util.ArrayList;
import java.util.Map;
Expand Down Expand Up @@ -133,5 +134,26 @@ static public AdManagerAdRequest buildAdRequest(ReadableMap requestOptions) {
return builder.build();
}

public static ServerSideVerificationOptions buildServerSideVerificationOptions(ReadableMap requestOptions) {
if (requestOptions.hasKey("serverSideVerificationOptions")) {
ReadableMap serverSideVerificationOptions =
requestOptions.getMap("serverSideVerificationOptions");

if (serverSideVerificationOptions != null) {
ServerSideVerificationOptions.Builder options =
new ServerSideVerificationOptions.Builder();

if (serverSideVerificationOptions.hasKey("userId")) {
options.setUserId(Objects.requireNonNull(serverSideVerificationOptions.getString("userId")));
}

if (serverSideVerificationOptions.hasKey("customData")) {
options.setCustomData(
Objects.requireNonNull(serverSideVerificationOptions.getString("customData")));
}
return options.build();
}
}
return null;
}
}
Expand Up @@ -19,6 +19,9 @@
import com.google.android.gms.ads.FullScreenContentCallback;
import com.google.android.gms.ads.LoadAdError;
import com.google.android.gms.ads.admanager.AdManagerAdRequest;
import com.google.android.gms.ads.rewarded.RewardedAd;
import com.google.android.gms.ads.rewarded.ServerSideVerificationOptions;
import com.google.android.gms.ads.rewardedinterstitial.RewardedInterstitialAd;
import com.rnadmob.admob.ActivityAwareJavaModule;
import com.rnadmob.admob.RNAdMobAdHolder;
import com.rnadmob.admob.RNAdMobCommon;
Expand Down Expand Up @@ -94,6 +97,17 @@ private AdLoadCallback<T> getAdLoadCallback(int requestId, ReadableMap options,
public void onAdLoaded(@NonNull T ad) {
adHolder.add(requestId, ad);

ReadableMap requestOptions = Objects.requireNonNull(options.getMap("requestOptions"));
ServerSideVerificationOptions ssv = RNAdMobCommon.buildServerSideVerificationOptions(requestOptions);

if (ssv != null) {
if (ad instanceof RewardedAd) {
((RewardedAd) ad).setServerSideVerificationOptions(ssv);
} else if (ad instanceof RewardedInterstitialAd) {
((RewardedInterstitialAd) ad).setServerSideVerificationOptions(ssv);
}
}

if (promise != null) promise.resolve(null);

sendEvent(AD_LOADED, requestId, null);
Expand Down
@@ -1,7 +1,5 @@
package com.rnadmob.admob.ads.fullscreen;

import android.app.Activity;

import androidx.annotation.NonNull;

import com.facebook.react.bridge.Promise;
Expand Down
Expand Up @@ -2,8 +2,6 @@

import static com.rnadmob.admob.RNAdMobEventModule.REWARDED;

import android.app.Activity;

import androidx.annotation.NonNull;

import com.facebook.react.bridge.Arguments;
Expand Down
Expand Up @@ -2,8 +2,6 @@

import static com.rnadmob.admob.RNAdMobEventModule.REWARDED;

import android.app.Activity;

import androidx.annotation.NonNull;

import com.facebook.react.bridge.Arguments;
Expand Down
3 changes: 3 additions & 0 deletions example/src/examples/FullScreenAdExamples/HookApiExample.tsx
Expand Up @@ -15,6 +15,9 @@ const hookOptions: FullScreenAdOptions = {
loadOnDismissed: true,
requestOptions: {
requestNonPersonalizedAdsOnly: true,
serverSideVerificationOptions: {
userId: '123',
},
},
};

Expand Down
7 changes: 7 additions & 0 deletions ios/Ads/FullScreen/RNAdMobFullScreenAd.swift
Expand Up @@ -83,6 +83,13 @@ class RNAdMobFullScreenAd<T>: NSObject {
func onAdLoaded(ad: T) {
module.adHolder.add(requestId: requestId, ad: ad)

let ssv = RNAdMobCommon.buildServerSideVerificationOptions(options["requestOptions"] as? [AnyHashable : Any])
if (module.getAdType() == RNAdMobRewarded.AD_TYPE) {
(ad as! GADRewardedAd).serverSideVerificationOptions = ssv
} else if (module.getAdType() == RNAdMobRewardedInterstitial.AD_TYPE) {
(ad as! GADRewardedInterstitialAd).serverSideVerificationOptions = ssv
}

if (resolve != nil) {
resolve!(nil)
}
Expand Down
2 changes: 2 additions & 0 deletions ios/RNAdMobCommon.h
Expand Up @@ -12,4 +12,6 @@

+ (GAMRequest *)buildAdRequest:(NSDictionary *)requestOptions;

+ (GADServerSideVerificationOptions *)buildServerSideVerificationOptions:(NSDictionary *)requestOptions;

@end
42 changes: 33 additions & 9 deletions ios/RNAdMobCommon.m
Expand Up @@ -6,7 +6,7 @@ + (GADAdSize)stringToAdSize:(NSString *)value {
NSError *error = nil;
NSRegularExpression *regex = [NSRegularExpression regularExpressionWithPattern:@"([0-9]+)x([0-9]+)" options:0 error:&error];
NSArray *matches = [regex matchesInString:value options:0 range:NSMakeRange(0, [value length])];

for (NSTextCheckingResult *match in matches) {
NSString *matchText = [value substringWithRange:[match range]];
if (matchText) {
Expand All @@ -16,9 +16,9 @@ + (GADAdSize)stringToAdSize:(NSString *)value {
return GADAdSizeFromCGSize(CGSizeMake(width, height));
}
}

value = [value uppercaseString];

if ([value isEqualToString:@"BANNER"]) {
return GADAdSizeBanner;
} else if ([value isEqualToString:@"FLUID"]) {
Expand Down Expand Up @@ -58,31 +58,31 @@ + (GAMRequest *)buildAdRequest:(NSDictionary *)requestOptions {
GAMRequest *request = [GAMRequest request];
NSMutableDictionary *extras = [@{} mutableCopy];
NSMutableDictionary *targets = [@{} mutableCopy];

if (requestOptions[@"requestNonPersonalizedAdsOnly"] && [requestOptions[@"requestNonPersonalizedAdsOnly"] boolValue]) {
extras[@"npa"] = @"1";
}

if (requestOptions[@"networkExtras"]) {
for (NSString *key in requestOptions[@"networkExtras"]) {
NSString *value = requestOptions[@"networkExtras"][key];
extras[key] = value;
}
}

GADExtras *networkExtras = [[GADExtras alloc] init];
networkExtras.additionalParameters = extras;
[request registerAdNetworkExtras:networkExtras];

if (requestOptions[@"keywords"]) {
request.keywords = requestOptions[@"keywords"];
}

if (requestOptions[@"location"]) {
NSArray<NSNumber *> *latLong = requestOptions[@"location"];
[request setLocationWithLatitude:[latLong[0] doubleValue] longitude:[latLong[1] doubleValue] accuracy:[requestOptions[@"locationAccuracy"] doubleValue]];
}

if (requestOptions[@"contentUrl"]) {
request.contentURL = requestOptions[@"contentUrl"];
}
Expand All @@ -99,4 +99,28 @@ + (GAMRequest *)buildAdRequest:(NSDictionary *)requestOptions {
return request;
}

+ (GADServerSideVerificationOptions *)buildServerSideVerificationOptions:(NSDictionary *)requestOptions {
NSDictionary *serverSideVerificationOptions = [requestOptions objectForKey:@"serverSideVerificationOptions"];

if (serverSideVerificationOptions != nil) {
GADServerSideVerificationOptions *options =
[[GADServerSideVerificationOptions alloc] init];

NSString *userId = [serverSideVerificationOptions valueForKey:@"userId"];

if (userId != nil) {
options.userIdentifier = userId;
}

NSString *customData = [serverSideVerificationOptions valueForKey:@"customData"];

if (customData != nil) {
options.customRewardString = customData;
}

return options;
}
return nil;
}

@end
20 changes: 20 additions & 0 deletions src/types.ts
Expand Up @@ -119,6 +119,26 @@ export interface RequestOptions {
* });
*/
targets?: { [key: string]: string };

/**
* Server Side Verification(SSV) Options
* See [Google Mobile SDK Docs](https://developers.google.com/admob/android/ssv) for more information.
*/
serverSideVerificationOptions?: ServerSideVerificationOptions;
}

export interface ServerSideVerificationOptions {
/**
* User identifier.
* If no user identifier is provided by the app, this query parameter will not be present in the SSV callback.
*/
userId?: string;

/**
* Custom data string.
* If no custom data string is provided by the app, this query parameter value will not be present in the SSV callback.
*/
customData?: string;
}

export interface InitializationStatus {
Expand Down

0 comments on commit edb61ad

Please sign in to comment.