android/app/src/main/cpp/androidapp.cpp                                |   18 +
 android/app/src/main/java/org/libreoffice/androidapp/MainActivity.java |   37 
+++
 android/app/src/main/java/org/libreoffice/androidapp/PrintAdapter.java |   96 
++++++++++
 loleaflet/src/control/Toolbar.js                                       |    2 
 4 files changed, 141 insertions(+), 12 deletions(-)

New commits:
commit 3209a8c36865e82b10bc87552ef079ad3c5f10aa
Author:     kaishu-sahu <kaishusahu...@gmail.com>
AuthorDate: Fri May 31 18:16:44 2019 +0530
Commit:     Jan Holesovsky <ke...@collabora.com>
CommitDate: Fri Jun 14 20:35:50 2019 +0200

    android: add print feature to the document viewer.
    
    Change-Id: I9de03347bde73faac1e9285f775e9584bb48a08d
    Reviewed-on: https://gerrit.libreoffice.org/73268
    Reviewed-by: Jan Holesovsky <ke...@collabora.com>
    Tested-by: Jan Holesovsky <ke...@collabora.com>

diff --git a/android/app/src/main/cpp/androidapp.cpp 
b/android/app/src/main/cpp/androidapp.cpp
index 26828e6e1..e66a97b84 100644
--- a/android/app/src/main/cpp/androidapp.cpp
+++ b/android/app/src/main/cpp/androidapp.cpp
@@ -219,14 +219,6 @@ 
Java_org_libreoffice_androidapp_MainActivity_postMobileMessageNative(JNIEnv *env
 
             // ???
         }
-        else if (strcmp(string_value, "PRINT") == 0 && false /* FIXME disabled 
so far */)
-        {
-            // TODO this is just a sketch to check this compiles
-            std::string printFile = Util::createRandomTmpDir() + "/print.pdf";
-            getLOKDocument()->saveAs(printFile.c_str(), "pdf", nullptr);
-
-            // TODO more stuff here...
-        }
         else
         {
             // As above
@@ -283,4 +275,14 @@ 
Java_org_libreoffice_androidapp_MainActivity_createLOOLWSD(JNIEnv *env, jobject,
     fakeClientFd = fakeSocketSocket();
 }
 
+extern "C"
+JNIEXPORT void JNICALL
+Java_org_libreoffice_androidapp_MainActivity_saveAs(JNIEnv *env, jobject 
instance,
+                                                    jstring fileUri_) {
+    const char *fileUri = env->GetStringUTFChars(fileUri_, 0);
+
+    getLOKDocument()->saveAs(fileUri, "pdf", nullptr);
+
+    env->ReleaseStringUTFChars(fileUri_, fileUri);
+}
 /* vim:set shiftwidth=4 softtabstop=4 expandtab cinoptions=b1,g0,N-s 
cinkeys+=0=break: */
diff --git 
a/android/app/src/main/java/org/libreoffice/androidapp/MainActivity.java 
b/android/app/src/main/java/org/libreoffice/androidapp/MainActivity.java
index 586a64ee5..a7e0ae366 100644
--- a/android/app/src/main/java/org/libreoffice/androidapp/MainActivity.java
+++ b/android/app/src/main/java/org/libreoffice/androidapp/MainActivity.java
@@ -20,14 +20,16 @@ import android.content.res.AssetManager;
 import android.net.Uri;
 import android.os.Build;
 import android.os.Bundle;
+import android.os.Handler;
 import android.preference.PreferenceManager;
+import android.print.PrintAttributes;
+import android.print.PrintDocumentAdapter;
+import android.print.PrintManager;
 import android.util.Log;
-import android.view.View;
 import android.webkit.JavascriptInterface;
 import android.webkit.WebSettings;
 import android.webkit.WebView;
 import android.webkit.WebViewClient;
-import android.widget.Button;
 import android.widget.Toast;
 
 import java.io.File;
@@ -69,6 +71,7 @@ public class MainActivity extends AppCompatActivity {
     private String urlToLoad;
     private WebView mWebView;
     private SharedPreferences sPrefs;
+    private Handler mainHandler;
 
     private boolean isDocEditable = false;
     private boolean isDocDebuggable = BuildConfig.DEBUG;
@@ -218,6 +221,7 @@ public class MainActivity extends AppCompatActivity {
                 WebView.setWebContentsDebuggingEnabled(true);
             }
         }
+        mainHandler = new Handler(getMainLooper());
     }
 
 
@@ -349,7 +353,9 @@ public class MainActivity extends AppCompatActivity {
     public void postMobileMessage(String message) {
         Log.d(TAG, "postMobileMessage: " + message);
 
-        postMobileMessageNative(message);
+        if (interceptMsgFromWebView(message)) {
+            postMobileMessageNative(message);
+        }
 
         // Going back to document browser on BYE (called when pressing the top 
left exit button)
         if (message.equals("BYE"))
@@ -389,6 +395,31 @@ public class MainActivity extends AppCompatActivity {
             }
         });
     }
+
+    /**
+     * return true to pass the message to the native part and false to block 
the message
+     */
+    boolean interceptMsgFromWebView(String message) {
+        if (message.equals("PRINT")) {
+            mainHandler.post(new Runnable() {
+                @Override
+                public void run() {
+                    initiatePrint();
+                }
+            });
+            return false;
+        }
+        return true;
+    }
+
+    private void initiatePrint() {
+        PrintManager printManager = (PrintManager) 
getSystemService(PRINT_SERVICE);
+        PrintDocumentAdapter printAdapter = new 
PrintAdapter(MainActivity.this);
+        printManager.print("Document", printAdapter, new 
PrintAttributes.Builder().build());
+    }
+
+    public native void saveAs(String fileUri);
+
 }
 
 /* vim:set shiftwidth=4 softtabstop=4 expandtab cinoptions=b1,g0,N-s 
cinkeys+=0=break: */
diff --git 
a/android/app/src/main/java/org/libreoffice/androidapp/PrintAdapter.java 
b/android/app/src/main/java/org/libreoffice/androidapp/PrintAdapter.java
new file mode 100644
index 000000000..e4c5bbbb5
--- /dev/null
+++ b/android/app/src/main/java/org/libreoffice/androidapp/PrintAdapter.java
@@ -0,0 +1,96 @@
+/* -*- Mode: Java; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- 
*/
+/*
+ * This file is part of the LibreOffice project.
+ *
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ */
+
+package org.libreoffice.androidapp;
+
+import android.os.Bundle;
+import android.os.CancellationSignal;
+import android.os.ParcelFileDescriptor;
+import android.print.PageRange;
+import android.print.PrintAttributes;
+import android.print.PrintDocumentAdapter;
+import android.print.PrintDocumentInfo;
+
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.FileOutputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.OutputStream;
+import java.util.Objects;
+
+public class PrintAdapter extends PrintDocumentAdapter {
+
+    private File printDocFile;
+    private MainActivity mainActivity;
+
+    PrintAdapter(MainActivity mainActivity) {
+        this.mainActivity = mainActivity;
+    }
+
+    @Override
+    public void onStart() {
+        super.onStart();
+        //Will show its own progress bar for the below task
+        printDocFile = new File(mainActivity.getCacheDir(), "print.pdf");
+        mainActivity.saveAs(printDocFile.toURI().toString());
+    }
+
+    @Override
+    public void onLayout(PrintAttributes oldAttributes, PrintAttributes 
newAttributes,
+                         CancellationSignal cancellationSignal, 
LayoutResultCallback callback,
+                         Bundle extras) {
+        if (cancellationSignal.isCanceled()) {
+            callback.onLayoutCancelled();
+        } else {
+            PrintDocumentInfo.Builder builder =
+                    new PrintDocumentInfo.Builder("finalPrint.pdf");
+            builder.setContentType(PrintDocumentInfo.CONTENT_TYPE_DOCUMENT)
+                    .setPageCount(PrintDocumentInfo.PAGE_COUNT_UNKNOWN)
+                    .build();
+            callback.onLayoutFinished(builder.build(),
+                    !newAttributes.equals(oldAttributes));
+        }
+    }
+
+    @Override
+    public void onWrite(PageRange[] pages, ParcelFileDescriptor destination, 
CancellationSignal cancellationSignal,
+                        WriteResultCallback callback) {
+        InputStream in = null;
+        OutputStream out = null;
+        try {
+            in = new FileInputStream(printDocFile);
+            out = new FileOutputStream(destination.getFileDescriptor());
+
+            byte[] buf = new byte[16384];
+            int size;
+
+            while ((size = in.read(buf)) >= 0
+                    && !cancellationSignal.isCanceled()) {
+                out.write(buf, 0, size);
+            }
+
+            if (cancellationSignal.isCanceled()) {
+                callback.onWriteCancelled();
+            } else {
+                callback.onWriteFinished(new PageRange[]{PageRange.ALL_PAGES});
+            }
+        } catch (IOException e) {
+            e.printStackTrace();
+        } finally {
+            try {
+                Objects.requireNonNull(in).close();
+                Objects.requireNonNull(out).close();
+            } catch (IOException | NullPointerException e) {
+                e.printStackTrace();
+            }
+        }
+    }
+}
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/loleaflet/src/control/Toolbar.js b/loleaflet/src/control/Toolbar.js
index f75c0ae31..06563be19 100644
--- a/loleaflet/src/control/Toolbar.js
+++ b/loleaflet/src/control/Toolbar.js
@@ -81,7 +81,7 @@ L.Map.include({
        },
 
        print: function () {
-               if (window.ThisIsTheiOSApp) {
+               if (window.ThisIsTheiOSApp || window.ThisIsTheAndroidApp) {
                        window.postMobileMessage('PRINT');
                } else {
                        this.showBusy(_('Downloading...'), false);
_______________________________________________
Libreoffice-commits mailing list
libreoffice-comm...@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/libreoffice-commits

Reply via email to