From b26003419f054722c16cfc9bc3b4366261543bff Mon Sep 17 00:00:00 2001 From: BogDan Vatra <bogdan@kdab.com> Date: Wed, 27 Jan 2016 10:48:04 +0200 Subject: [PATCH] Android: Use the new QtAndroidPrivate::runOnAndroidThreadSync Change-Id: I47cb99d84ad87f3b0f6578d3fbdc22d788b31c57 Reviewed-by: Christian Stromme <christian.stromme@theqtcompany.com> --- .../src/wrappers/jni/androidsurfaceview.cpp | 67 +++++++------------ .../src/wrappers/jni/androidsurfaceview.h | 7 +- 2 files changed, 27 insertions(+), 47 deletions(-) diff --git a/src/plugins/android/src/wrappers/jni/androidsurfaceview.cpp b/src/plugins/android/src/wrappers/jni/androidsurfaceview.cpp index d2c150d00..6eec85171 100644 --- a/src/plugins/android/src/wrappers/jni/androidsurfaceview.cpp +++ b/src/plugins/android/src/wrappers/jni/androidsurfaceview.cpp @@ -137,8 +137,32 @@ AndroidSurfaceView::AndroidSurfaceView() , m_surfaceHolder(0) , m_pendingVisible(-1) { - setAutoDelete(false); - QtAndroidPrivate::runOnUiThread(this, QJNIEnvironmentPrivate()); + QtAndroidPrivate::runOnAndroidThreadSync([this] { + m_surfaceView = QJNIObjectPrivate("android/view/SurfaceView", + "(Landroid/content/Context;)V", + QtAndroidPrivate::activity()); + }, QJNIEnvironmentPrivate()); + + Q_ASSERT(m_surfaceView.isValid()); + + QJNIObjectPrivate holder = m_surfaceView.callObjectMethod("getHolder", + "()Landroid/view/SurfaceHolder;"); + if (!holder.isValid()) { + m_surfaceView = QJNIObjectPrivate(); + } else { + m_surfaceHolder = new AndroidSurfaceHolder(holder); + connect(m_surfaceHolder, &AndroidSurfaceHolder::surfaceCreated, + this, &AndroidSurfaceView::surfaceCreated); + { // Lock now to avoid a race with handleSurfaceCreated() + QMutexLocker locker(shLock); + m_window = QWindow::fromWinId(WId(m_surfaceView.object())); + + if (m_pendingVisible != -1) + m_window->setVisible(m_pendingVisible); + if (m_pendingGeometry.isValid()) + m_window->setGeometry(m_pendingGeometry); + } + } } AndroidSurfaceView::~AndroidSurfaceView() @@ -168,43 +192,4 @@ void AndroidSurfaceView::setGeometry(int x, int y, int width, int height) m_pendingGeometry = QRect(x, y, width, height); } -bool AndroidSurfaceView::event(QEvent *e) -{ - if (e->type() == QEvent::User) { - Q_ASSERT(m_surfaceView.isValid()); - - QJNIObjectPrivate holder = m_surfaceView.callObjectMethod("getHolder", - "()Landroid/view/SurfaceHolder;"); - if (!holder.isValid()) { - m_surfaceView = QJNIObjectPrivate(); - } else { - m_surfaceHolder = new AndroidSurfaceHolder(holder); - connect(m_surfaceHolder, &AndroidSurfaceHolder::surfaceCreated, - this, &AndroidSurfaceView::surfaceCreated); - { // Lock now to avoid a race with handleSurfaceCreated() - QMutexLocker locker(shLock); - m_window = QWindow::fromWinId(WId(m_surfaceView.object())); - - if (m_pendingVisible != -1) - m_window->setVisible(m_pendingVisible); - if (m_pendingGeometry.isValid()) - m_window->setGeometry(m_pendingGeometry); - } - } - - return true; - } - - return QObject::event(e); -} - -// Called on the Android UI thread. -void AndroidSurfaceView::run() -{ - m_surfaceView = QJNIObjectPrivate("android/view/SurfaceView", - "(Landroid/content/Context;)V", - QtAndroidPrivate::activity()); - QCoreApplication::postEvent(this, new QEvent(QEvent::User)); -} - QT_END_NAMESPACE diff --git a/src/plugins/android/src/wrappers/jni/androidsurfaceview.h b/src/plugins/android/src/wrappers/jni/androidsurfaceview.h index 3d28f5325..ef603061d 100644 --- a/src/plugins/android/src/wrappers/jni/androidsurfaceview.h +++ b/src/plugins/android/src/wrappers/jni/androidsurfaceview.h @@ -74,7 +74,7 @@ private: friend class AndroidSurfaceView; }; -class AndroidSurfaceView : public QObject, public QRunnable +class AndroidSurfaceView : public QObject { Q_OBJECT public: @@ -86,14 +86,9 @@ public: void setVisible(bool v); void setGeometry(int x, int y, int width, int height); - bool event(QEvent *); - Q_SIGNALS: void surfaceCreated(); -protected: - void run() override; - private: QJNIObjectPrivate m_surfaceView; QWindow *m_window; -- GitLab