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.
*/
#include <QGuiApplication>
#include <QScreen>
#include "QAndroidAdMobBanner.h"
QMap<int, QAndroidAdMobBanner*> QAndroidAdMobBanner::m_pInstancesMap;
int QAndroidAdMobBanner::m_InstancesCounter = 0;
QAndroidAdMobBanner::QAndroidAdMobBanner() : m_JavaAdMobBanner("com/falsinsoft/qtandroidtools/AdMobBanner",
"(Landroid/app/Activity;)V",
QtAndroid::androidActivity().object<jobject>()),
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<jobject>()),
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<void>("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<void>("setType",
"(I)V",
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
{
return m_BannerPos.x();
}
void QAndroidAdMobBanner::setXPos(int XPos)
void QAndroidAdMobBanner::UpdateBannerPos()
{
if(m_JavaAdMobBanner.isValid())
{
m_JavaAdMobBanner.callMethod<void>("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<jint>("x", static_cast<int>(ScreenPos.x() * PixelRatio));
BannerPosObj.setField<jint>("y", static_cast<int>(ScreenPos.y() * PixelRatio));
void QAndroidAdMobBanner::setYPos(int YPos)
{
if(m_JavaAdMobBanner.isValid())
{
m_JavaAdMobBanner.callMethod<void>("setYPos",
"(I)V",
YPos
m_JavaAdMobBanner.callMethod<void>("setPos",
"(Lcom/falsinsoft/qtandroidtools/AdMobBanner$BannerPos;)V",
BannerPosObj.object()
);
m_BannerPos.setY(YPos);
}
}

View File

@ -25,19 +25,18 @@
#include <QtAndroidExtras>
#include <QQmlEngine>
#include <QQuickItem>
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<int, QAndroidAdMobBanner*>& 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();
};

View File

@ -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;

View File

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