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>
bb10
Oleg Yadrov 2017-04-19 14:31:43 -04:00
parent 4ad030de71
commit e2e874415e
4 changed files with 39 additions and 7 deletions

View File

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

View File

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

View File

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

View File

@ -45,7 +45,7 @@ QT_BEGIN_NAMESPACE
QAndroidPlatformClipboard::QAndroidPlatformClipboard()
{
QtAndroidClipboard::setClipboardListener(this);
QtAndroidClipboard::setClipboardManager(this);
}
QMimeData *QAndroidPlatformClipboard::mimeData(QClipboard::Mode mode)