diff --git a/mobile/android/AndroidManifest.xml b/mobile/android/AndroidManifest.xml index 5e889e1fd..d8689ea21 100644 --- a/mobile/android/AndroidManifest.xml +++ b/mobile/android/AndroidManifest.xml @@ -2,42 +2,15 @@ + - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/mobile/android/src/OpenFileActivity.java b/mobile/android/src/OpenFileActivity.java index 9971fa75d..c92e4aac1 100644 --- a/mobile/android/src/OpenFileActivity.java +++ b/mobile/android/src/OpenFileActivity.java @@ -6,6 +6,7 @@ import android.util.Log; import android.os.Bundle; import android.os.ParcelFileDescriptor; import android.net.Uri; +import android.app.Activity; import org.qtproject.qt5.android.bindings.QtActivity; @@ -14,16 +15,13 @@ class FileClass public static native void openUri(String uri); } -public class OpenFileActivity extends QtActivity { - @Override - public void onCreate(Bundle savedInstanceState) { - super.onCreate(savedInstanceState); - final Intent bundleIntent = getIntent(); - if (bundleIntent == null) +public class OpenFileActivity extends QtActivity +{ + private void displayUri(Uri uri) + { + if (uri == null) return; - final String action = bundleIntent.getAction(); - Uri uri = bundleIntent.getData(); if (!uri.getScheme().equals("file")) { try { ContentResolver resolver = getBaseContext().getContentResolver(); @@ -33,11 +31,49 @@ public class OpenFileActivity extends QtActivity { e.printStackTrace(); //TODO: emit warning that couldn't be opened - Log.v("Okular", "failed to open"); + Log.e("Okular", "failed to open"); return; } } + Log.e("Okular", "opening url: " + uri.toString()); FileClass.openUri(uri.toString()); } + + @Override + public void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + final Intent bundleIntent = getIntent(); + if (bundleIntent == null) + return; + + final String action = bundleIntent.getAction(); + Log.v("Okular", "Starting action: " + action); + if (action == "android.intent.action.VIEW") { + displayUri(bundleIntent.getData()); + } + } + + private static int OpenDocumentRequest = 42; + + public static void openFile(Activity context, String title, String mimes) + { + Intent intent = new Intent(); + intent.setAction(Intent.ACTION_GET_CONTENT); + intent.setType("application/pdf"); + Log.v("Okular", "opening: " + mimes); + intent.putExtra(Intent.EXTRA_MIME_TYPES, mimes.split(";")); + + context.startActivityForResult(intent, OpenDocumentRequest); + } + + @Override + public void onActivityResult(int requestCode, int resultCode, Intent intent) { + Log.v("Okular", "Activity Result: " + String.valueOf(requestCode) + " with code: " + String.valueOf(resultCode)); + if (requestCode == OpenDocumentRequest) { + Uri uri = intent.getData(); + Log.v("Okular", "Opening document: " + uri.toString()); + displayUri(uri); + } + } } diff --git a/mobile/app/CMakeLists.txt b/mobile/app/CMakeLists.txt index f4f06ef88..3def6ef53 100644 --- a/mobile/app/CMakeLists.txt +++ b/mobile/app/CMakeLists.txt @@ -2,7 +2,9 @@ set(CMAKE_AUTORCC ON) add_executable(okularkirigami main.cpp app.qrc) target_link_libraries(okularkirigami Qt5::Widgets Qt5::Qml KF5::I18n) if (ANDROID) + find_package(Qt5 COMPONENTS AndroidExtras) target_sources(okularkirigami PRIVATE android.cpp) + target_link_libraries(okularkirigami Qt5::AndroidExtras) endif() install(TARGETS okularkirigami ${KDE_INSTALL_TARGETS_DEFAULT_ARGS}) diff --git a/mobile/app/android.cpp b/mobile/app/android.cpp index 40afc3982..8a91e35ce 100644 --- a/mobile/app/android.cpp +++ b/mobile/app/android.cpp @@ -17,6 +17,32 @@ *************************************************************************************/ #include "android.h" +#include +#include +#include +#include + +static AndroidInstance* s_instance = nullptr; + +void AndroidInstance::openFile(const QString &title, const QStringList &mimes) +{ + s_instance = this; + QAndroidJniObject activity = QAndroidJniObject::callStaticObjectMethod("org/qtproject/qt5/android/QtNative", "activity", "()Landroid/app/Activity;"); //activity is valid + Q_ASSERT ( activity.isValid() ); + + QAndroidJniEnvironment _env; + QAndroidJniObject::callStaticMethod("org/kde/something/OpenFileActivity", + "openFile", + "(Landroid/app/Activity;Ljava/lang/String;Ljava/lang/String;)V", + activity.object(), + QAndroidJniObject::fromString(title).object(), + QAndroidJniObject::fromString(mimes.join(';')).object() + ); + if (_env->ExceptionCheck()) { + _env->ExceptionClear(); + qWarning() << "couldn't launch intent"; + } +} void Java_org_kde_something_FileClass_openUri(JNIEnv *env, jobject /*obj*/, @@ -24,7 +50,11 @@ void Java_org_kde_something_FileClass_openUri(JNIEnv *env, { jboolean isCopy = false; const char* utf = env->GetStringUTFChars(uri, &isCopy); - handler.openUri(QString::fromUtf8(utf)); + const QString uriString = QString::fromUtf8(utf); + if (s_instance) + s_instance->openUri(QUrl(uriString)); + else + handler.openUri(uriString); env->ReleaseStringUTFChars(uri, utf); } diff --git a/mobile/app/android.h b/mobile/app/android.h index 358c70f0e..7c456084b 100644 --- a/mobile/app/android.h +++ b/mobile/app/android.h @@ -19,7 +19,8 @@ #ifndef ANDROID_H #define ANDROID_H -#include +#include +#include #include class URIHandler { @@ -33,6 +34,16 @@ public: static URIHandler handler; +class AndroidInstance : public QObject +{ + Q_OBJECT +public: + Q_SCRIPTABLE void openFile(const QString &title, const QStringList &mimes); + +Q_SIGNALS: + void openUri(const QUrl &uri); +}; + extern "C" { JNIEXPORT void JNICALL diff --git a/mobile/app/main.cpp b/mobile/app/main.cpp index 139c587b2..57fdf72ea 100644 --- a/mobile/app/main.cpp +++ b/mobile/app/main.cpp @@ -49,8 +49,10 @@ int main(int argc, char *argv[]) QQmlApplicationEngine engine; #ifdef __ANDROID__ + qmlRegisterSingletonType("org.kde.okular.app", 2, 0, "AndroidInstance", [](QQmlEngine*, QJSEngine*) -> QObject* { return new AndroidInstance; }); const QString uri = handler.m_lastUrl; #else + qmlRegisterSingletonType("org.kde.okular.app", 2, 0, "AndroidInstance", [](QQmlEngine*, QJSEngine*) -> QObject* { return new QObject; }); const QString uri = parser.positionalArguments().count() == 1 ? QUrl::fromUserInput(parser.positionalArguments().constFirst(), {}, QUrl::AssumeLocalFile).toString() : QString(); diff --git a/mobile/app/package/contents/ui/main.qml b/mobile/app/package/contents/ui/main.qml index 3091b573f..b25cb3d74 100644 --- a/mobile/app/package/contents/ui/main.qml +++ b/mobile/app/package/contents/ui/main.qml @@ -21,6 +21,7 @@ import QtQuick 2.1 import QtQuick.Dialogs 1.3 as QQD import org.kde.okular 2.0 as Okular import org.kde.kirigami 2.0 as Kirigami +import org.kde.okular.app 2.0 Kirigami.AbstractApplicationWindow { id: fileBrowserRoot @@ -47,6 +48,22 @@ Kirigami.AbstractApplicationWindow { onTriggered: { fileDialog.open() } + }, + Kirigami.Action { + text: i18n("Open Android...") + icon.name: "document-open" + readonly property var p0: Connections { + target: AndroidInstance + enabled: AndroidInstance.hasOwnProperty("openFile") + onOpenUri: { + console.log("open uri!", uri) + documentItem.url = uri + } + } + onTriggered: { +// var mimetypes = Okular.Okular.mimeTypes.join(",") + AndroidInstance.openFile(i18n("Document to open..."), "*/*") + } } ] }