diff --git a/QtAndroidTools/QAndroidAdMobBanner.cpp b/QtAndroidTools/QAndroidAdMobBanner.cpp index 33cb61e..af5c8dc 100644 --- a/QtAndroidTools/QAndroidAdMobBanner.cpp +++ b/QtAndroidTools/QAndroidAdMobBanner.cpp @@ -22,17 +22,18 @@ * SOFTWARE. */ #include +#include #include "QAndroidAdMobBanner.h" QMap QAndroidAdMobBanner::m_pInstancesMap; int QAndroidAdMobBanner::m_InstancesCounter = 0; -QAndroidAdMobBanner::QAndroidAdMobBanner() : m_JavaAdMobBanner("com/falsinsoft/qtandroidtools/AdMobBanner", - "(Landroid/app/Activity;)V", - QtAndroid::androidActivity().object()), - m_InstanceIndex(m_InstancesCounter++), - m_BannerType(TYPE_NO_BANNER), - m_BannerPos(0,0) +QAndroidAdMobBanner::QAndroidAdMobBanner(QQuickItem *parent) : QQuickItem(parent), + m_JavaAdMobBanner("com/falsinsoft/qtandroidtools/AdMobBanner", + "(Landroid/app/Activity;)V", + QtAndroid::androidActivity().object()), + m_InstanceIndex(m_InstancesCounter++), + m_BannerType(TYPE_NO_BANNER) { m_pInstancesMap[m_InstanceIndex] = this; @@ -67,6 +68,7 @@ bool QAndroidAdMobBanner::show() { if(m_JavaAdMobBanner.isValid() && m_BannerType != TYPE_NO_BANNER && m_UnitId.isEmpty() == false) { + UpdateBannerPos(); m_JavaAdMobBanner.callMethod("show"); return true; } @@ -108,45 +110,37 @@ void QAndroidAdMobBanner::setType(BANNER_TYPE Type) { if(m_JavaAdMobBanner.isValid() && Type != TYPE_NO_BANNER) { + QAndroidJniObject BannerSizeObj; + m_JavaAdMobBanner.callMethod("setType", "(I)V", Type - ); + ); m_BannerType = Type; + + BannerSizeObj = m_JavaAdMobBanner.callObjectMethod("getSize", + "()Lcom/falsinsoft/qtandroidtools/AdMobBanner$BannerSize;" + ); + setWidth(BannerSizeObj.getField("width")); + setHeight(BannerSizeObj.getField("height")); } } -int QAndroidAdMobBanner::getXPos() const -{ - return m_BannerPos.x(); -} - -void QAndroidAdMobBanner::setXPos(int XPos) +void QAndroidAdMobBanner::UpdateBannerPos() { if(m_JavaAdMobBanner.isValid()) { - m_JavaAdMobBanner.callMethod("setXPos", - "(I)V", - XPos - ); - m_BannerPos.setX(XPos); - } -} + QAndroidJniObject BannerPosObj("com/falsinsoft/qtandroidtools/AdMobBanner$BannerPos"); + const qreal PixelRatio = qApp->primaryScreen()->devicePixelRatio(); + const QPointF ScreenPos = mapToGlobal(QPointF(0,0)); -int QAndroidAdMobBanner::getYPos() const -{ - return m_BannerPos.y(); -} + BannerPosObj.setField("x", static_cast(ScreenPos.x() * PixelRatio)); + BannerPosObj.setField("y", static_cast(ScreenPos.y() * PixelRatio)); -void QAndroidAdMobBanner::setYPos(int YPos) -{ - if(m_JavaAdMobBanner.isValid()) - { - m_JavaAdMobBanner.callMethod("setYPos", - "(I)V", - YPos + m_JavaAdMobBanner.callMethod("setPos", + "(Lcom/falsinsoft/qtandroidtools/AdMobBanner$BannerPos;)V", + BannerPosObj.object() ); - m_BannerPos.setY(YPos); } } diff --git a/QtAndroidTools/QAndroidAdMobBanner.h b/QtAndroidTools/QAndroidAdMobBanner.h index 9208d29..d1afd8e 100644 --- a/QtAndroidTools/QAndroidAdMobBanner.h +++ b/QtAndroidTools/QAndroidAdMobBanner.h @@ -25,19 +25,18 @@ #include #include +#include -class QAndroidAdMobBanner : public QObject +class QAndroidAdMobBanner : public QQuickItem { Q_PROPERTY(QString unitId READ getUnitId WRITE setUnitId) Q_PROPERTY(BANNER_TYPE type READ getType WRITE setType) - Q_PROPERTY(int x READ getXPos WRITE setXPos) - Q_PROPERTY(int y READ getYPos WRITE setYPos) Q_ENUMS(BANNER_TYPE) Q_ENUMS(ERROR_TYPE) Q_OBJECT public: - QAndroidAdMobBanner(); + QAndroidAdMobBanner(QQuickItem *parent = nullptr); ~QAndroidAdMobBanner(); enum BANNER_TYPE @@ -65,10 +64,6 @@ public: void setUnitId(const QString &UnitId); BANNER_TYPE getType() const; void setType(BANNER_TYPE Type); - int getXPos() const; - void setXPos(int XPos); - int getYPos() const; - void setYPos(int YPos); static const QMap& Instances(); @@ -88,7 +83,6 @@ private: static int m_InstancesCounter; const int m_InstanceIndex; BANNER_TYPE m_BannerType; - QPoint m_BannerPos; QString m_UnitId; enum EVENT_TYPE @@ -110,4 +104,5 @@ private: APP_STATE_DESTROY }; void SetNewAppState(APP_STATE NewState); + void UpdateBannerPos(); }; diff --git a/QtAndroidTools/src/com/falsinsoft/qtandroidtools/AdMobBanner.java b/QtAndroidTools/src/com/falsinsoft/qtandroidtools/AdMobBanner.java index b00b763..9c28436 100644 --- a/QtAndroidTools/src/com/falsinsoft/qtandroidtools/AdMobBanner.java +++ b/QtAndroidTools/src/com/falsinsoft/qtandroidtools/AdMobBanner.java @@ -47,8 +47,7 @@ public class AdMobBanner private AdView mBannerView = null; private boolean mBannerLoaded = false; - private int mBannerWidth = 0; - private int mBannerHeight = 0; + private BannerSize mBannerSize = new BannerSize(); public AdMobBanner(Activity ActivityInstance) { @@ -59,7 +58,7 @@ public class AdMobBanner public BannerSize getSize() { - return new BannerSize(mBannerWidth, mBannerHeight); + return mBannerSize; } public void setType(final int type) @@ -98,31 +97,14 @@ public class AdMobBanner } mBannerView.setAdSize(BannerSize); - mBannerWidth = BannerSize.getWidthInPixels(mActivityInstance); - mBannerHeight = BannerSize.getHeightInPixels(mActivityInstance); + mBannerSize.width = BannerSize.getWidth(); + mBannerSize.height = BannerSize.getHeight(); } }); UiThread.exec(); } - public void setXPos(final int x) - { - if(mBannerView == null) - { - return; - } - - SyncRunOnUiThread UiThread = new SyncRunOnUiThread(mActivityInstance, new SyncRunOnUiThread.SyncRunOnUiThreadListener() - { - public void runOnUIThread() - { - mBannerView.setX(x); - } - }); - UiThread.exec(); - } - - public void setYPos(final int y) + public void setPos(final BannerPos pos) { if(mBannerView == null) { @@ -134,8 +116,11 @@ public class AdMobBanner public void runOnUIThread() { Rect VisibleFrame = new Rect(); + mActivityInstance.getWindow().getDecorView().getWindowVisibleDisplayFrame(VisibleFrame); - mBannerView.setY(VisibleFrame.top + y); // Add the height of the system status bar on top + + mBannerView.setX(pos.x); + mBannerView.setY(VisibleFrame.top + pos.y); // Add the height of the system status bar on top } }); UiThread.exec(); @@ -248,10 +233,9 @@ public class AdMobBanner return; } - mActivityInstance.runOnUiThread(new Runnable() + SyncRunOnUiThread UiThread = new SyncRunOnUiThread(mActivityInstance, new SyncRunOnUiThread.SyncRunOnUiThreadListener() { - @Override - public void run() + public void runOnUIThread() { mViewGroup.removeView(mBannerView); mBannerView.destroy(); @@ -259,6 +243,7 @@ public class AdMobBanner mBannerLoaded = false; } }); + UiThread.exec(); } private class BannerListener extends AdListener @@ -303,15 +288,16 @@ public class AdMobBanner } } - public class BannerSize + public static class BannerPos { - final public int width; - final public int height; - public BannerSize(int width, int height) - { - this.width = width; - this.height = height; - } + public int x = 0; + public int y = 0; + } + + public static class BannerSize + { + public int width = 0; + public int height = 0; } private static final int ERROR_INTERNAL = 0; diff --git a/QtAndroidToolsDemo/tools/AndroidAdMobBanner.qml b/QtAndroidToolsDemo/tools/AndroidAdMobBanner.qml index 907278b..8d239ab 100644 --- a/QtAndroidToolsDemo/tools/AndroidAdMobBanner.qml +++ b/QtAndroidToolsDemo/tools/AndroidAdMobBanner.qml @@ -36,8 +36,11 @@ Page { Button { anchors.horizontalCenter: parent.horizontalCenter - text: "Request permissions" - onClicked: banner1.show() + text: "Show banners" + onClicked: { + banner1.show(); + banner2.show(); + } } } }