diff --git a/QtAdMob.pri b/QtAdMob.pri index 083375c..7dd7056 100644 --- a/QtAdMob.pri +++ b/QtAdMob.pri @@ -14,6 +14,7 @@ SOURCES += \ $$PWD/QtAdMobInterstitialAndroid.cpp \ $$PWD/QtAdMobInterstitialDummy.cpp \ $$PWD/QtAdmobBanner.cpp \ + $$PWD/QtAdMobRewardedVideo.cpp \ $$PWD/QtAdmobInterstitial.cpp OBJECTIVE_SOURCES += \ @@ -30,6 +31,7 @@ HEADERS += \ $$PWD/QtAdMobInterstitial.h \ $$PWD/QtAdMobInterstitialIos.h \ $$PWD/QtAdMobInterstitialAndroid.h \ + $$PWD/QtAdMobRewardedVideo.h \ $$PWD/QtAdMobInterstitialDummy.h ios { diff --git a/QtAdMobRewardedVideo.cpp b/QtAdMobRewardedVideo.cpp new file mode 100644 index 0000000..b84f630 --- /dev/null +++ b/QtAdMobRewardedVideo.cpp @@ -0,0 +1,182 @@ +#include "QtAdMobRewardedVideo.h" + +#ifdef __cplusplus +extern "C" { +#endif + +#ifdef Q_OS_ANDROID +// Listener when Java calls Rewarded() signal +JNIEXPORT void JNICALL Java_org_dreamdev_QtAdMob_QtAdMobActivity_Rewarded(JNIEnv *env, jobject thiz) +{ + Q_UNUSED(env) + Q_UNUSED(thiz) + + // Emit to QML app by calling Rewarded signal + emit QmlRewardedVideoAd::Instances()->rewarded(); +} +// Listener when Java calls RewardedVideoAdClosed() signal +JNIEXPORT void JNICALL Java_org_dreamdev_QtAdMob_QtAdMobActivity_RewardedVideoAdClosed(JNIEnv *env, jobject thiz) +{ + Q_UNUSED(env) + Q_UNUSED(thiz) + + // Emit to QML app by calling RewardedVideoAdClosed signal + emit QmlRewardedVideoAd::Instances()->rewardedVideoAdClosed(); +} +// Listener when Java calls RewardedVideoAdFailedToLoad() signal +JNIEXPORT void JNICALL Java_org_dreamdev_QtAdMob_QtAdMobActivity_RewardedVideoAdFailedToLoad(JNIEnv *env, jobject thiz, jint errorCode) +{ + Q_UNUSED(env) + Q_UNUSED(thiz) + + // Emit to QML app by calling RewardedVideoAdFailedToLoad signal + emit QmlRewardedVideoAd::Instances()->rewardedVideoAdFailedToLoad(errorCode); +} +// Listener when Java calls RewardedVideoAdLeftApplication() signal +JNIEXPORT void JNICALL Java_org_dreamdev_QtAdMob_QtAdMobActivity_RewardedVideoAdLeftApplication(JNIEnv *env, jobject thiz) +{ + Q_UNUSED(env) + Q_UNUSED(thiz) + + // Emit to QML app by calling RewardedVideoAdLeftApplication signal + emit QmlRewardedVideoAd::Instances()->rewardedVideoAdLeftApplication(); +} +// Listener when Java calls RewardedVideoAdLoaded() signal +JNIEXPORT void JNICALL Java_org_dreamdev_QtAdMob_QtAdMobActivity_RewardedVideoAdLoaded(JNIEnv *env, jobject thiz) +{ + Q_UNUSED(env) + Q_UNUSED(thiz) + + // Emit to QML app by calling RewardedVideoAdLoaded signal + emit QmlRewardedVideoAd::Instances()->rewardedVideoAdLoaded(); +} +// Listener when Java calls RewardedVideoAdOpened() signal +JNIEXPORT void JNICALL Java_org_dreamdev_QtAdMob_QtAdMobActivity_RewardedVideoAdOpened(JNIEnv *env, jobject thiz) +{ + Q_UNUSED(env) + Q_UNUSED(thiz) + + // Emit to QML app by calling RewardedVideoAdOpened signal + emit QmlRewardedVideoAd::Instances()->rewardedVideoAdOpened(); +} +// Listener when Java calls RewardedVideoCompleted() signal +JNIEXPORT void JNICALL Java_com_gmail_manhcuong5993_QtAdMobActivity_RewardedVideoCompleted(JNIEnv *env, jobject thiz) +{ + Q_UNUSED(env) + Q_UNUSED(thiz) + + // Emit to QML app by calling RewardedVideoCompleted signal + emit QmlRewardedVideoAd::Instances()->rewardedVideoCompleted(); +} +// Listener when Java calls RewardedVideoStarted() signal +JNIEXPORT void JNICALL Java_org_dreamdev_QtAdMob_QtAdMobActivity_RewardedVideoStarted(JNIEnv *env, jobject thiz) +{ + Q_UNUSED(env) + Q_UNUSED(thiz) + + // Emit to QML app by calling RewardedVideoStarted signal + emit QmlRewardedVideoAd::Instances()->rewardedVideoStarted(); +} +#endif + +#ifdef __cplusplus +} +#endif + +// Global variable to keep instance of class +static QtAdMobRewardedVideoAndroid *mQmlRewardedVideoAd = nullptr; + +QtAdMobRewardedVideoAndroid::QtAdMobRewardedVideoAndroid() +{ +#ifdef Q_OS_ANDROID + // Update global instance + mQmlRewardedVideoAd = this; + + // Create Android Activity on Qt + QPlatformNativeInterface* interface = QGuiApplication::platformNativeInterface(); + jobject activity = (jobject)interface->nativeResourceForIntegration("QtActivity"); + if (activity) + { + m_Activity = new QAndroidJniObject(activity); + } + + // Call InitializeBanner method of Java + m_Activity->callMethod("InitializeRewardedVideoAd"); +#endif + +#if (TARGET_OS_IPHONE || TARGET_IPHONE_SIMULATOR) + m_QtAdmobRewardVideo = new QtAdmobRewardVideoDelegateImpl(); + m_QtAdmobRewardVideo->setQtAdmobRewardVideoIos(this); +#endif +} + +QtAdMobRewardedVideoAndroid *QtAdMobRewardedVideoAndroid::Instances() +{ + return mQmlRewardedVideoAd; +} + +void QtAdMobRewardedVideoAndroid::setUnitId(const QString &unitId) +{ +#ifdef Q_OS_ANDROID + if(m_Activity != nullptr) + { + QAndroidJniObject param1 = QAndroidJniObject::fromString(unitId); + // Call SetBannerUnitId method of Java + m_Activity->callMethod("SetRewardedVideoAdUnitId", "(Ljava/lang/String;)V", param1.object()); + } +#elif _WIN32 + Q_UNUSED(unitId) +#endif + +#if (TARGET_OS_IPHONE || TARGET_IPHONE_SIMULATOR) + m_QtAdmobRewardVideo->setUnitId(unitId); +#endif +} + +void QtAdMobRewardedVideoAndroid::setTestDeviceId(const QString &testDeviceId) +{ +#ifdef Q_OS_ANDROID + if(m_Activity != nullptr) + { + QAndroidJniObject param1 = QAndroidJniObject::fromString(testDeviceId); + // Call SetBannerUnitId method of Java + m_Activity->callMethod("SetRewardedVideoTestDeviceId", "(Ljava/lang/String;)V", param1.object()); + } +#elif _WIN32 + Q_UNUSED(testDeviceId) +#endif + +#if (TARGET_OS_IPHONE || TARGET_IPHONE_SIMULATOR) + m_QtAdmobRewardVideo->setTestDeviceId(testDeviceId); +#endif +} + +void QtAdMobRewardedVideoAndroid::loadRewardedVideoAd() +{ +#ifdef Q_OS_ANDROID + if(m_Activity != nullptr) + { + // Call LoadBanner method of Java + m_Activity->callMethod("LoadRewardedVideoAd"); + } +#endif + +#if (TARGET_OS_IPHONE || TARGET_IPHONE_SIMULATOR) + m_QtAdmobRewardVideo->loadRewardedVideoAd(); +#endif +} + +void QtAdMobRewardedVideoAndroid::show() +{ +#ifdef Q_OS_ANDROID + if(m_Activity != nullptr) + { + // Call LoadBanner method of Java + m_Activity->callMethod("ShowRewardedVideoAd"); + } +#endif + +#if (TARGET_OS_IPHONE || TARGET_IPHONE_SIMULATOR) + m_QtAdmobRewardVideo->show(); +#endif +} diff --git a/QtAdMobRewardedVideo.h b/QtAdMobRewardedVideo.h new file mode 100644 index 0000000..cc81e62 --- /dev/null +++ b/QtAdMobRewardedVideo.h @@ -0,0 +1,53 @@ +#ifndef QMLREWARDEDVIDEOAD_H +#define QMLREWARDEDVIDEOAD_H + +#include +#include +#ifdef Q_OS_ANDROID +#include +#include +#include +#endif + +#if (TARGET_OS_IPHONE || TARGET_IPHONE_SIMULATOR) +class QtAdmobRewardVideoDelegateImpl; +#endif + +class QtAdMobRewardedVideoAndroid : public QObject +{ + Q_OBJECT + Q_PROPERTY(QString unitId WRITE setUnitId) + Q_PROPERTY(QString testDeviceId WRITE setTestDeviceId) +public: + QtAdMobRewardedVideoAndroid(); + static QtAdMobRewardedVideoAndroid* Instances(); + + static void DeclareQML(); + void setUnitId(const QString& unitId); + void setTestDeviceId(const QString &testDeviceId); + +signals: + void rewarded(); + void rewardedVideoAdClosed(); + void rewardedVideoAdFailedToLoad(int errorCode); + void rewardedVideoAdLeftApplication(); + void rewardedVideoAdLoaded(); + void rewardedVideoAdOpened(); + void rewardedVideoCompleted(); + void rewardedVideoStarted(); + +public slots: + void loadRewardedVideoAd(); + void show(); + +private: +#ifdef Q_OS_ANDROID + QAndroidJniObject* m_Activity; +#endif + +#if (TARGET_OS_IPHONE || TARGET_IPHONE_SIMULATOR) + QtAdmobRewardVideoDelegateImpl* m_QtAdmobRewardVideo; +#endif +}; + +#endif // QMLREWARDEDVIDEOAD_H diff --git a/platform/android/src/org/dreamdev/QtAdMob/QtAdMobActivity.java b/platform/android/src/org/dreamdev/QtAdMob/QtAdMobActivity.java index 07ba711..39e66bb 100644 --- a/platform/android/src/org/dreamdev/QtAdMob/QtAdMobActivity.java +++ b/platform/android/src/org/dreamdev/QtAdMob/QtAdMobActivity.java @@ -5,6 +5,10 @@ import com.google.android.gms.ads.AdView; import com.google.android.gms.ads.AdListener; import com.google.android.gms.ads.InterstitialAd; +import com.google.android.gms.ads.reward.RewardedVideoAd; +import com.google.android.gms.ads.reward.RewardedVideoAdListener; +import com.google.android.gms.ads.reward.RewardItem; +import com.google.android.gms.ads.MobileAds; import android.os.Bundle; import android.view.View; import android.view.Window; @@ -29,6 +33,10 @@ public class QtAdMobActivity extends QtActivity private int m_AdBannerHeight = 0; private int m_StatusBarHeight = 0; private int m_ReadyToRequest = 0x00; + /// rewarded video Ad + private RewardedVideoAd m_AdRewardedVideo = null; + private String m_RewardedVideoAdUnitId; + private String m_RewardedVideoTestDeviceId; private int GetStatusBarHeight() { @@ -354,6 +362,64 @@ public void run() } }); } + + public void InitializeRewardedVideoAd() + { + final QtAdMobActivity self = this; + runOnUiThread(new Runnable() + { + public void run() + { + m_AdRewardedVideo = MobileAds.getRewardedVideoAdInstance(self); + m_AdRewardedVideo.setRewardedVideoAdListener(self); + } + }); + } + + public void SetRewardedVideoAdUnitId(final String adId) + { + runOnUiThread(new Runnable() + { + public void run() + { + m_RewardedVideoAdUnitId = adId; + } + }); + } + + public void SetRewardedVideoTestDeviceId(final String testDeviceId){ + runOnUiThread(new Runnable() + { + public void run() + { + m_RewardedVideoTestDeviceId = testDeviceId; + } + }); + } + + public void LoadRewardedVideoAd() + { + runOnUiThread(new Runnable() + { + public void run() + { + AdRequest.Builder adRequest = new AdRequest.Builder(); + adRequest.addTestDevice(m_RewardedVideoTestDeviceId); + m_AdRewardedVideo.loadAd(m_RewardedVideoAdUnitId, adRequest.build()); + } + }); + } + + public void ShowRewardedVideoAd() + { + runOnUiThread(new Runnable() + { + public void run() + { + m_AdRewardedVideo.show(); + } + }); + } @Override public void onCreate(Bundle savedInstanceState) @@ -388,6 +454,43 @@ public void onDestroy() m_AdBannerView.destroy(); } } + + @Override + public void onRewarded(RewardItem reward) + { + Rewarded(); + } + @Override + public void onRewardedVideoAdClosed() + { + RewardedVideoAdClosed(); + } + @Override + public void onRewardedVideoAdFailedToLoad(int errorCode) + { + RewardedVideoAdFailedToLoad(errorCode); + } + @Override + public void onRewardedVideoAdLeftApplication() + { + } + @Override + public void onRewardedVideoAdLoaded() + { + RewardedVideoAdLoaded(); + } + @Override + public void onRewardedVideoAdOpened() + { + } + @Override + public void onRewardedVideoCompleted() + { + } + @Override + public void onRewardedVideoStarted() + { + } private static native void onBannerLoaded(); private static native void onBannerLoading(); @@ -399,4 +502,13 @@ public void onDestroy() private static native void onInterstitialWillPresent(); private static native void onInterstitialClosed(); private static native void onInterstitialClicked(); + + private static native void Rewarded(); + private static native void RewardedVideoAdClosed(); + private static native void RewardedVideoAdFailedToLoad(int errorCode); + private static native void RewardedVideoAdLeftApplication(); + private static native void RewardedVideoAdLoaded(); + private static native void RewardedVideoAdOpened(); + private static native void RewardedVideoCompleted(); + private static native void RewardedVideoStarted(); }