diff options
author | Oleg Yadrov <oleg.yadrov@qt.io> | 2017-04-19 14:31:43 -0400 |
---|---|---|
committer | Oleg Yadrov <oleg.yadrov@qt.io> | 2017-05-04 19:43:33 +0000 |
commit | e2e874415e1f1c6a96915d9dc85dd31c61f73e24 (patch) | |
tree | 471761795f00d27a9520c2f6bd337369d12ad728 | |
parent | 4ad030de71fcf87c6b3afd6f12330a4e4b2fa567 (diff) |
QClipboard: make dataChanged() signal work on Android
This part has not been implemented before.
Also replace deprecated android.text.ClipboardManager with modern
android.content.ClipboardManager.
Task-number: QTBUG-58548
Change-Id: I190208042af8a6c87ed391c6c72f3f51e58dfad3
Reviewed-by: Eskil Abrahamsen Blomfeldt <eskil.abrahamsen-blomfeldt@qt.io>
4 files changed, 39 insertions, 7 deletions
diff --git a/src/android/jar/src/org/qtproject/qt5/android/QtNative.java b/src/android/jar/src/org/qtproject/qt5/android/QtNative.java index c74e38d997..ccd8ec410e 100644 --- a/src/android/jar/src/org/qtproject/qt5/android/QtNative.java +++ b/src/android/jar/src/org/qtproject/qt5/android/QtNative.java @@ -52,7 +52,8 @@ import android.content.pm.PackageManager; import android.net.Uri; import android.os.Handler; import android.os.Looper; -import android.text.ClipboardManager; +import android.content.ClipboardManager; +import android.content.ClipboardManager.OnPrimaryClipChangedListener; import android.os.Build; import android.util.Log; import android.view.ContextMenu; @@ -584,7 +585,14 @@ public class QtNative @Override public void run() { if (m_activity != null) - m_clipboardManager = (android.text.ClipboardManager) m_activity.getSystemService(Context.CLIPBOARD_SERVICE); + m_clipboardManager = (android.content.ClipboardManager) m_activity.getSystemService(Context.CLIPBOARD_SERVICE); + if (m_clipboardManager != null) { + m_clipboardManager.addPrimaryClipChangedListener(new ClipboardManager.OnPrimaryClipChangedListener() { + public void onPrimaryClipChanged() { + onClipboardDataChanged(); + } + }); + } semaphore.release(); } }); @@ -844,6 +852,10 @@ public class QtNative public static native void onContextMenuClosed(Menu menu); // menu methods + // clipboard methods + public static native void onClipboardDataChanged(); + // clipboard methods + // activity methods public static native void onActivityResult(int requestCode, int resultCode, Intent data); public static native void onNewIntent(Intent data); diff --git a/src/plugins/platforms/android/androidjniclipboard.cpp b/src/plugins/platforms/android/androidjniclipboard.cpp index 17ff0e0bbb..833996403c 100644 --- a/src/plugins/platforms/android/androidjniclipboard.cpp +++ b/src/plugins/platforms/android/androidjniclipboard.cpp @@ -38,7 +38,6 @@ ****************************************************************************/ #include "androidjniclipboard.h" -#include "androidjnimain.h" #include <QtCore/private/qjni_p.h> QT_BEGIN_NAMESPACE @@ -46,10 +45,23 @@ QT_BEGIN_NAMESPACE using namespace QtAndroid; namespace QtAndroidClipboard { - void setClipboardListener(QAndroidPlatformClipboard *listener) + QAndroidPlatformClipboard *m_manager = nullptr; + + static char const *const QtNativeClassName = "org/qtproject/qt5/android/QtNative"; + static JNINativeMethod methods[] = { + {"onClipboardDataChanged", "()V", (void *)onClipboardDataChanged} + }; + + void setClipboardManager(QAndroidPlatformClipboard *manager) { - Q_UNUSED(listener); + m_manager = manager; QJNIObjectPrivate::callStaticMethod<void>(applicationClass(), "registerClipboardManager"); + jclass appClass = QtAndroid::applicationClass(); + QJNIEnvironmentPrivate env; + if (env->RegisterNatives(appClass, methods, sizeof(methods) / sizeof(methods[0])) < 0) { + __android_log_print(ANDROID_LOG_FATAL,"Qt", "RegisterNatives failed"); + return; + } } void setClipboardText(const QString &text) @@ -73,6 +85,11 @@ namespace QtAndroidClipboard "()Ljava/lang/String;"); return text.toString(); } + + void onClipboardDataChanged(JNIEnv */*env*/, jobject /*thiz*/) + { + m_manager->emitChanged(QClipboard::Clipboard); + } } QT_END_NAMESPACE diff --git a/src/plugins/platforms/android/androidjniclipboard.h b/src/plugins/platforms/android/androidjniclipboard.h index 9de6dc1f44..2ec566e729 100644 --- a/src/plugins/platforms/android/androidjniclipboard.h +++ b/src/plugins/platforms/android/androidjniclipboard.h @@ -41,6 +41,8 @@ #define ANDROIDJNICLIPBOARD_H #include <QString> +#include "qandroidplatformclipboard.h" +#include "androidjnimain.h" QT_BEGIN_NAMESPACE @@ -48,10 +50,11 @@ class QAndroidPlatformClipboard; namespace QtAndroidClipboard { // Clipboard support - void setClipboardListener(QAndroidPlatformClipboard *listener); + void setClipboardManager(QAndroidPlatformClipboard *manager); void setClipboardText(const QString &text); bool hasClipboardText(); QString clipboardText(); + void onClipboardDataChanged(JNIEnv */*env*/, jobject /*thiz*/); // Clipboard support } diff --git a/src/plugins/platforms/android/qandroidplatformclipboard.cpp b/src/plugins/platforms/android/qandroidplatformclipboard.cpp index a2bc802680..dc5147b259 100644 --- a/src/plugins/platforms/android/qandroidplatformclipboard.cpp +++ b/src/plugins/platforms/android/qandroidplatformclipboard.cpp @@ -45,7 +45,7 @@ QT_BEGIN_NAMESPACE QAndroidPlatformClipboard::QAndroidPlatformClipboard() { - QtAndroidClipboard::setClipboardListener(this); + QtAndroidClipboard::setClipboardManager(this); } QMimeData *QAndroidPlatformClipboard::mimeData(QClipboard::Mode mode) |