diff --git a/src/plugins/android/src/wrappers/jni/androidsurfaceview.cpp b/src/plugins/android/src/wrappers/jni/androidsurfaceview.cpp index d2c150d006d803f4c6b674e6066373b5758d3ecd..6eec8517121989953bef8d81e90ccded02c385f6 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 3d28f53256860f1577769c295271abd2a5388346..ef603061d260580186ff4da180828aa076a97265 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;