Skip to content

Commit 582afcc

Browse files
Mobile Ads Developer Relationscopybara-github
authored andcommitted
Added onPaidEvent callback to receive paid events from android next gen SDK.
PiperOrigin-RevId: 814781895
1 parent ffdcf8f commit 582afcc

File tree

13 files changed

+136
-4
lines changed

13 files changed

+136
-4
lines changed

source/plugin/Assets/Plugins/Android/GoogleMobileAdsPlugin.androidlib/src/main/java/com/google/unity/ads/decagon/UnityAppOpenAd.java

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99
import com.google.android.libraries.ads.mobile.sdk.appopen.AppOpenAdEventCallback;
1010
import com.google.android.libraries.ads.mobile.sdk.common.AdLoadCallback;
1111
import com.google.android.libraries.ads.mobile.sdk.common.AdRequest;
12+
import com.google.android.libraries.ads.mobile.sdk.common.AdValue;
1213
import com.google.android.libraries.ads.mobile.sdk.common.FullScreenContentError;
1314
import com.google.android.libraries.ads.mobile.sdk.common.LoadAdError;
1415
import com.google.android.libraries.ads.mobile.sdk.common.ResponseInfo;
@@ -70,6 +71,7 @@ public void onAdFailedToLoad(@NonNull LoadAdError adError) {
7071
}
7172

7273
/** Shows the app open ad if it has loaded. */
74+
@SuppressWarnings("EnumOrdinal")
7375
public void show() {
7476
if (ad == null) {
7577
Log.e(
@@ -134,6 +136,21 @@ public void onAdClicked() {
134136
}
135137
});
136138
}
139+
140+
@Override
141+
public void onAdPaid(@NonNull AdValue adValue) {
142+
executor.execute(
143+
() -> {
144+
if (callback != null) {
145+
callback.onPaidEvent(
146+
// TODO(vkini): Remove this cast to int and use Utility method to convert to
147+
// int.
148+
adValue.getPrecisionType().ordinal(),
149+
adValue.getValueMicros(),
150+
adValue.getCurrencyCode());
151+
}
152+
});
153+
}
137154
});
138155

139156
activity.runOnUiThread(

source/plugin/Assets/Plugins/Android/GoogleMobileAdsPlugin.androidlib/src/main/java/com/google/unity/ads/decagon/UnityAppOpenAdCallback.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,8 @@
66
* An interface form of {@link AppOpenAdCallback} that can be implemented via {@code
77
* AndroidJavaProxy} in Unity to receive ad events synchronously.
88
*/
9-
public interface UnityAppOpenAdCallback extends UnityFullScreenContentCallback {
9+
public interface UnityAppOpenAdCallback
10+
extends UnityFullScreenContentCallback, UnityPaidEventListener {
1011

1112
void onAppOpenAdLoaded();
1213

source/plugin/Assets/Plugins/Android/GoogleMobileAdsPlugin.androidlib/src/main/java/com/google/unity/ads/decagon/UnityInterstitialAd.java

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
import androidx.annotation.VisibleForTesting;
88
import com.google.android.libraries.ads.mobile.sdk.common.AdLoadCallback;
99
import com.google.android.libraries.ads.mobile.sdk.common.AdRequest;
10+
import com.google.android.libraries.ads.mobile.sdk.common.AdValue;
1011
import com.google.android.libraries.ads.mobile.sdk.common.FullScreenContentError;
1112
import com.google.android.libraries.ads.mobile.sdk.common.LoadAdError;
1213
import com.google.android.libraries.ads.mobile.sdk.common.ResponseInfo;
@@ -70,6 +71,7 @@ public void onAdFailedToLoad(@NonNull LoadAdError adError) {
7071
}
7172

7273
/** Shows the interstitial ad if it has loaded. */
74+
@SuppressWarnings("EnumOrdinal")
7375
public void show() {
7476
if (ad == null) {
7577
Log.e(
@@ -138,6 +140,21 @@ public void onAdClicked() {
138140
}
139141
});
140142
}
143+
144+
@Override
145+
public void onAdPaid(@NonNull AdValue adValue) {
146+
executor.execute(
147+
() -> {
148+
if (callback != null) {
149+
callback.onPaidEvent(
150+
// TODO(vkini): Remove this cast to int and use Utility method to convert to
151+
// int.
152+
adValue.getPrecisionType().ordinal(),
153+
adValue.getValueMicros(),
154+
adValue.getCurrencyCode());
155+
}
156+
});
157+
}
141158
});
142159

143160
activity.runOnUiThread(

source/plugin/Assets/Plugins/Android/GoogleMobileAdsPlugin.androidlib/src/main/java/com/google/unity/ads/decagon/UnityInterstitialAdCallback.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,8 @@
2222
* An interface form of {@link InterstitialAdCallback} that can be implemented via {@code
2323
* AndroidJavaProxy} in Unity to receive ad events synchronously.
2424
*/
25-
public interface UnityInterstitialAdCallback extends UnityFullScreenContentCallback {
25+
public interface UnityInterstitialAdCallback
26+
extends UnityFullScreenContentCallback, UnityPaidEventListener {
2627

2728
void onInterstitialAdLoaded();
2829

Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
/*
2+
* Copyright (C) 2025 Google LLC
3+
*
4+
* Licensed under the Apache License, Version 2.0 (the "License");
5+
* you may not use this file except in compliance with the License.
6+
* You may obtain a copy of the License at
7+
*
8+
* http://www.apache.org/licenses/LICENSE-2.0
9+
*
10+
* Unless required by applicable law or agreed to in writing, software
11+
* distributed under the License is distributed on an "AS IS" BASIS,
12+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13+
* See the License for the specific language governing permissions and
14+
* limitations under the License.
15+
*/
16+
package com.google.unity.ads.decagon;
17+
18+
/**
19+
* An interface form of {@link UnityPaidEventListener} that can be implemented via {@code
20+
* AndroidJavaProxy} in Unity to receive paid events synchronously.
21+
*/
22+
public interface UnityPaidEventListener {
23+
void onPaidEvent(int precision, long value, String currencyCode);
24+
}

source/plugin/Assets/Plugins/Android/GoogleMobileAdsPlugin.androidlib/src/main/java/com/google/unity/ads/decagon/UnityRewardedAd.java

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
import androidx.annotation.VisibleForTesting;
88
import com.google.android.libraries.ads.mobile.sdk.common.AdLoadCallback;
99
import com.google.android.libraries.ads.mobile.sdk.common.AdRequest;
10+
import com.google.android.libraries.ads.mobile.sdk.common.AdValue;
1011
import com.google.android.libraries.ads.mobile.sdk.common.FullScreenContentError;
1112
import com.google.android.libraries.ads.mobile.sdk.common.LoadAdError;
1213
import com.google.android.libraries.ads.mobile.sdk.common.ResponseInfo;
@@ -75,6 +76,7 @@ public void onAdFailedToLoad(@NonNull LoadAdError adError) {
7576
}
7677

7778
/** Shows the rewarded ad if it has loaded. */
79+
@SuppressWarnings("EnumOrdinal")
7880
public void show() {
7981
if (ad == null) {
8082
Log.e(
@@ -139,6 +141,21 @@ public void onAdClicked() {
139141
}
140142
});
141143
}
144+
145+
@Override
146+
public void onAdPaid(@NonNull AdValue adValue) {
147+
executor.execute(
148+
() -> {
149+
if (callback != null) {
150+
callback.onPaidEvent(
151+
// TODO(vkini): Remove this cast to int and use Utility method to convert to
152+
// int.
153+
adValue.getPrecisionType().ordinal(),
154+
adValue.getValueMicros(),
155+
adValue.getCurrencyCode());
156+
}
157+
});
158+
}
142159
});
143160

144161
activity.runOnUiThread(

source/plugin/Assets/Plugins/Android/GoogleMobileAdsPlugin.androidlib/src/main/java/com/google/unity/ads/decagon/UnityRewardedAdCallback.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,8 @@
2121
* An interface form of {@link UnityRewardedAdCallback} that can be implemented via {@code
2222
* AndroidJavaProxy} in Unity to receive ad events synchronously.
2323
*/
24-
public interface UnityRewardedAdCallback extends UnityFullScreenContentCallback {
24+
public interface UnityRewardedAdCallback
25+
extends UnityFullScreenContentCallback, UnityPaidEventListener {
2526

2627
void onRewardedAdLoaded();
2728

source/plugin/Assets/Plugins/Android/GoogleMobileAdsPlugin.androidlib/src/main/java/com/google/unity/ads/decagon/UnityRewardedInterstitialAd.java

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@
2323
import androidx.annotation.VisibleForTesting;
2424
import com.google.android.libraries.ads.mobile.sdk.common.AdLoadCallback;
2525
import com.google.android.libraries.ads.mobile.sdk.common.AdRequest;
26+
import com.google.android.libraries.ads.mobile.sdk.common.AdValue;
2627
import com.google.android.libraries.ads.mobile.sdk.common.FullScreenContentError;
2728
import com.google.android.libraries.ads.mobile.sdk.common.LoadAdError;
2829
import com.google.android.libraries.ads.mobile.sdk.common.ResponseInfo;
@@ -97,6 +98,7 @@ public void onAdFailedToLoad(@NonNull LoadAdError adError) {
9798
}
9899

99100
/** Shows the rewarded interstitial ad if it has loaded. */
101+
@SuppressWarnings("EnumOrdinal")
100102
public void show() {
101103
if (ad == null) {
102104
Log.e(
@@ -161,6 +163,21 @@ public void onAdClicked() {
161163
}
162164
});
163165
}
166+
167+
@Override
168+
public void onAdPaid(@NonNull AdValue adValue) {
169+
executor.execute(
170+
() -> {
171+
if (callback != null) {
172+
callback.onPaidEvent(
173+
// TODO(vkini): Remove this cast to int and use Utility method to convert to
174+
// int.
175+
adValue.getPrecisionType().ordinal(),
176+
adValue.getValueMicros(),
177+
adValue.getCurrencyCode());
178+
}
179+
});
180+
}
164181
});
165182

166183
activity.runOnUiThread(

source/plugin/Assets/Plugins/Android/GoogleMobileAdsPlugin.androidlib/src/main/java/com/google/unity/ads/decagon/UnityRewardedInterstitialAdCallback.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,8 @@
2121
/**
2222
* Rewarded interstitial ad events that can be implemented via {@code AndroidJavaProxy} in Unity.
2323
*/
24-
public interface UnityRewardedInterstitialAdCallback extends UnityFullScreenContentCallback {
24+
public interface UnityRewardedInterstitialAdCallback
25+
extends UnityFullScreenContentCallback, UnityPaidEventListener {
2526

2627
void onRewardedInterstitialAdLoaded();
2728

source/plugin/Assets/Plugins/Android/GoogleMobileAdsPlugin.androidlib/src/test/java/com/google/unity/ads/decagon/UnityAppOpenAdTest.java

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,8 +11,10 @@
1111
import com.google.android.libraries.ads.mobile.sdk.appopen.AppOpenAdEventCallback;
1212
import com.google.android.libraries.ads.mobile.sdk.common.AdLoadCallback;
1313
import com.google.android.libraries.ads.mobile.sdk.common.AdRequest;
14+
import com.google.android.libraries.ads.mobile.sdk.common.AdValue;
1415
import com.google.android.libraries.ads.mobile.sdk.common.FullScreenContentError;
1516
import com.google.android.libraries.ads.mobile.sdk.common.LoadAdError;
17+
import com.google.android.libraries.ads.mobile.sdk.common.PrecisionType;
1618
import com.google.android.libraries.ads.mobile.sdk.common.ResponseInfo;
1719
import java.util.ArrayList;
1820
import org.junit.Before;
@@ -76,6 +78,7 @@ public void testLoad_onAdFailedToLoad() {
7678
}
7779

7880
@Test
81+
@SuppressWarnings("EnumOrdinal")
7982
public void testShow_showsAdAndTriggersCallbacks() {
8083
// First, simulate a successful ad load.
8184
unityAppOpenAd.load(mockAdRequest);
@@ -110,6 +113,12 @@ public void testShow_showsAdAndTriggersCallbacks() {
110113

111114
eventCallback.onAdDismissedFullScreenContent();
112115
verify(mockCallback).onAdDismissedFullScreenContent();
116+
117+
PrecisionType precisionType = PrecisionType.PRECISE;
118+
long valueMicros = 1000000L;
119+
String currencyCode = "USD";
120+
eventCallback.onAdPaid(new AdValue(precisionType, valueMicros, currencyCode));
121+
verify(mockCallback).onPaidEvent(precisionType.ordinal(), valueMicros, currencyCode);
113122
}
114123

115124
@Test

0 commit comments

Comments
 (0)