Fixed position of admob banner based to the QML item

This commit is contained in:
FalsinSoft 2019-01-28 16:19:51 +01:00
parent 7fba3c7742
commit 103bb8bfb0
4 changed files with 56 additions and 78 deletions

View File

@ -22,17 +22,18 @@
* SOFTWARE. * SOFTWARE.
*/ */
#include <QGuiApplication> #include <QGuiApplication>
#include <QScreen>
#include "QAndroidAdMobBanner.h" #include "QAndroidAdMobBanner.h"
QMap<int, QAndroidAdMobBanner*> QAndroidAdMobBanner::m_pInstancesMap; QMap<int, QAndroidAdMobBanner*> QAndroidAdMobBanner::m_pInstancesMap;
int QAndroidAdMobBanner::m_InstancesCounter = 0; int QAndroidAdMobBanner::m_InstancesCounter = 0;
QAndroidAdMobBanner::QAndroidAdMobBanner() : m_JavaAdMobBanner("com/falsinsoft/qtandroidtools/AdMobBanner", QAndroidAdMobBanner::QAndroidAdMobBanner(QQuickItem *parent) : QQuickItem(parent),
m_JavaAdMobBanner("com/falsinsoft/qtandroidtools/AdMobBanner",
"(Landroid/app/Activity;)V", "(Landroid/app/Activity;)V",
QtAndroid::androidActivity().object<jobject>()), QtAndroid::androidActivity().object<jobject>()),
m_InstanceIndex(m_InstancesCounter++), m_InstanceIndex(m_InstancesCounter++),
m_BannerType(TYPE_NO_BANNER), m_BannerType(TYPE_NO_BANNER)
m_BannerPos(0,0)
{ {
m_pInstancesMap[m_InstanceIndex] = this; 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) if(m_JavaAdMobBanner.isValid() && m_BannerType != TYPE_NO_BANNER && m_UnitId.isEmpty() == false)
{ {
UpdateBannerPos();
m_JavaAdMobBanner.callMethod<void>("show"); m_JavaAdMobBanner.callMethod<void>("show");
return true; return true;
} }
@ -108,45 +110,37 @@ void QAndroidAdMobBanner::setType(BANNER_TYPE Type)
{ {
if(m_JavaAdMobBanner.isValid() && Type != TYPE_NO_BANNER) if(m_JavaAdMobBanner.isValid() && Type != TYPE_NO_BANNER)
{ {
QAndroidJniObject BannerSizeObj;
m_JavaAdMobBanner.callMethod<void>("setType", m_JavaAdMobBanner.callMethod<void>("setType",
"(I)V", "(I)V",
Type Type
); );
m_BannerType = Type; m_BannerType = Type;
BannerSizeObj = m_JavaAdMobBanner.callObjectMethod("getSize",
"()Lcom/falsinsoft/qtandroidtools/AdMobBanner$BannerSize;"
);
setWidth(BannerSizeObj.getField<jint>("width"));
setHeight(BannerSizeObj.getField<jint>("height"));
} }
} }
int QAndroidAdMobBanner::getXPos() const void QAndroidAdMobBanner::UpdateBannerPos()
{
return m_BannerPos.x();
}
void QAndroidAdMobBanner::setXPos(int XPos)
{ {
if(m_JavaAdMobBanner.isValid()) if(m_JavaAdMobBanner.isValid())
{ {
m_JavaAdMobBanner.callMethod<void>("setXPos", QAndroidJniObject BannerPosObj("com/falsinsoft/qtandroidtools/AdMobBanner$BannerPos");
"(I)V", const qreal PixelRatio = qApp->primaryScreen()->devicePixelRatio();
XPos const QPointF ScreenPos = mapToGlobal(QPointF(0,0));
);
m_BannerPos.setX(XPos);
}
}
int QAndroidAdMobBanner::getYPos() const BannerPosObj.setField<jint>("x", static_cast<int>(ScreenPos.x() * PixelRatio));
{ BannerPosObj.setField<jint>("y", static_cast<int>(ScreenPos.y() * PixelRatio));
return m_BannerPos.y();
}
void QAndroidAdMobBanner::setYPos(int YPos) m_JavaAdMobBanner.callMethod<void>("setPos",
{ "(Lcom/falsinsoft/qtandroidtools/AdMobBanner$BannerPos;)V",
if(m_JavaAdMobBanner.isValid()) BannerPosObj.object()
{
m_JavaAdMobBanner.callMethod<void>("setYPos",
"(I)V",
YPos
); );
m_BannerPos.setY(YPos);
} }
} }

View File

@ -25,19 +25,18 @@
#include <QtAndroidExtras> #include <QtAndroidExtras>
#include <QQmlEngine> #include <QQmlEngine>
#include <QQuickItem>
class QAndroidAdMobBanner : public QObject class QAndroidAdMobBanner : public QQuickItem
{ {
Q_PROPERTY(QString unitId READ getUnitId WRITE setUnitId) Q_PROPERTY(QString unitId READ getUnitId WRITE setUnitId)
Q_PROPERTY(BANNER_TYPE type READ getType WRITE setType) 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(BANNER_TYPE)
Q_ENUMS(ERROR_TYPE) Q_ENUMS(ERROR_TYPE)
Q_OBJECT Q_OBJECT
public: public:
QAndroidAdMobBanner(); QAndroidAdMobBanner(QQuickItem *parent = nullptr);
~QAndroidAdMobBanner(); ~QAndroidAdMobBanner();
enum BANNER_TYPE enum BANNER_TYPE
@ -65,10 +64,6 @@ public:
void setUnitId(const QString &UnitId); void setUnitId(const QString &UnitId);
BANNER_TYPE getType() const; BANNER_TYPE getType() const;
void setType(BANNER_TYPE Type); void setType(BANNER_TYPE Type);
int getXPos() const;
void setXPos(int XPos);
int getYPos() const;
void setYPos(int YPos);
static const QMap<int, QAndroidAdMobBanner*>& Instances(); static const QMap<int, QAndroidAdMobBanner*>& Instances();
@ -88,7 +83,6 @@ private:
static int m_InstancesCounter; static int m_InstancesCounter;
const int m_InstanceIndex; const int m_InstanceIndex;
BANNER_TYPE m_BannerType; BANNER_TYPE m_BannerType;
QPoint m_BannerPos;
QString m_UnitId; QString m_UnitId;
enum EVENT_TYPE enum EVENT_TYPE
@ -110,4 +104,5 @@ private:
APP_STATE_DESTROY APP_STATE_DESTROY
}; };
void SetNewAppState(APP_STATE NewState); void SetNewAppState(APP_STATE NewState);
void UpdateBannerPos();
}; };

View File

@ -47,8 +47,7 @@ public class AdMobBanner
private AdView mBannerView = null; private AdView mBannerView = null;
private boolean mBannerLoaded = false; private boolean mBannerLoaded = false;
private int mBannerWidth = 0; private BannerSize mBannerSize = new BannerSize();
private int mBannerHeight = 0;
public AdMobBanner(Activity ActivityInstance) public AdMobBanner(Activity ActivityInstance)
{ {
@ -59,7 +58,7 @@ public class AdMobBanner
public BannerSize getSize() public BannerSize getSize()
{ {
return new BannerSize(mBannerWidth, mBannerHeight); return mBannerSize;
} }
public void setType(final int type) public void setType(final int type)
@ -98,31 +97,14 @@ public class AdMobBanner
} }
mBannerView.setAdSize(BannerSize); mBannerView.setAdSize(BannerSize);
mBannerWidth = BannerSize.getWidthInPixels(mActivityInstance); mBannerSize.width = BannerSize.getWidth();
mBannerHeight = BannerSize.getHeightInPixels(mActivityInstance); mBannerSize.height = BannerSize.getHeight();
} }
}); });
UiThread.exec(); UiThread.exec();
} }
public void setXPos(final int x) public void setPos(final BannerPos pos)
{
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)
{ {
if(mBannerView == null) if(mBannerView == null)
{ {
@ -134,8 +116,11 @@ public class AdMobBanner
public void runOnUIThread() public void runOnUIThread()
{ {
Rect VisibleFrame = new Rect(); Rect VisibleFrame = new Rect();
mActivityInstance.getWindow().getDecorView().getWindowVisibleDisplayFrame(VisibleFrame); 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(); UiThread.exec();
@ -248,10 +233,9 @@ public class AdMobBanner
return; return;
} }
mActivityInstance.runOnUiThread(new Runnable() SyncRunOnUiThread UiThread = new SyncRunOnUiThread(mActivityInstance, new SyncRunOnUiThread.SyncRunOnUiThreadListener()
{ {
@Override public void runOnUIThread()
public void run()
{ {
mViewGroup.removeView(mBannerView); mViewGroup.removeView(mBannerView);
mBannerView.destroy(); mBannerView.destroy();
@ -259,6 +243,7 @@ public class AdMobBanner
mBannerLoaded = false; mBannerLoaded = false;
} }
}); });
UiThread.exec();
} }
private class BannerListener extends AdListener private class BannerListener extends AdListener
@ -303,15 +288,16 @@ public class AdMobBanner
} }
} }
public class BannerSize public static class BannerPos
{ {
final public int width; public int x = 0;
final public int height; public int y = 0;
public BannerSize(int width, int height)
{
this.width = width;
this.height = height;
} }
public static class BannerSize
{
public int width = 0;
public int height = 0;
} }
private static final int ERROR_INTERNAL = 0; private static final int ERROR_INTERNAL = 0;

View File

@ -36,8 +36,11 @@ Page {
Button { Button {
anchors.horizontalCenter: parent.horizontalCenter anchors.horizontalCenter: parent.horizontalCenter
text: "Request permissions" text: "Show banners"
onClicked: banner1.show() onClicked: {
banner1.show();
banner2.show();
}
} }
} }
} }