[Libreoffice-commits] core.git: android/source

Michael Weghorn (via logerrit) logerrit at kemper.freedesktop.org
Fri Apr 16 06:49:18 UTC 2021


 android/source/res/values-de/strings.xml                             |    2 
 android/source/res/values-tr/strings.xml                             |    1 
 android/source/res/values/strings.xml                                |    2 
 android/source/src/java/org/libreoffice/LOKitTileProvider.java       |   56 +++-------
 android/source/src/java/org/libreoffice/LibreOfficeMainActivity.java |   44 +++++++
 android/source/src/java/org/libreoffice/TileProvider.java            |    5 
 android/source/src/java/org/libreoffice/ToolbarController.java       |    4 
 android/source/src/java/org/libreoffice/ui/FileUtilities.java        |    1 
 8 files changed, 70 insertions(+), 45 deletions(-)

New commits:
commit 9ebcb80e2e4335fca1e137d015fe4d84631e282a
Author:     Michael Weghorn <m.weghorn at posteo.de>
AuthorDate: Thu Apr 15 11:22:46 2021 +0200
Commit:     Michael Weghorn <m.weghorn at posteo.de>
CommitDate: Fri Apr 16 08:48:28 2021 +0200

    android: Ask where to save PDF file on export
    
    In Android Viewer, show a file picker to select
    where to save the PDF file on PDF export, rather
    than unconditionally trying to save in the
    "Documents" directory.
    
    This also means that permission
    'android.PERMISSION_WRITE_EXTERNAL_STORAGE' is
    now no longer needed for this task, s. commit
    message from
    
        commit 7d9db806d65cb814af1e99a1e79c3db5aa7c17d5
        Date:   Fri Apr 9 11:24:16 2021 +0200
    
            android: Request PERMISSION_WRITE_EXTERNAL_STORAGE again
    
    for more details.
    
    Also, adapt the 'TileKitProvider#saveDocumentAs'
    methods to return a boolean value indicating
    whether the save operation was successful,
    and trigger showing the message right into
    'LibreOfficeMainActivity#exportToPDF'.
    
    Rename 'LOKitTileProvider#exportToPDF(boolean print)' to
    just 'LOKitTileProvider#printDocument()', since the only
    remaining use case for which it is used is printing now.
    
    Change-Id: I779d782813ca01640811690a388a4b7fd3db4b2a
    Reviewed-on: https://gerrit.libreoffice.org/c/core/+/114143
    Tested-by: Jenkins
    Reviewed-by: Michael Weghorn <m.weghorn at posteo.de>

diff --git a/android/source/res/values-de/strings.xml b/android/source/res/values-de/strings.xml
index c2c33ff5b5e5..36effc9303f0 100644
--- a/android/source/res/values-de/strings.xml
+++ b/android/source/res/values-de/strings.xml
@@ -153,9 +153,9 @@
     <string name="current_uno_command">Aktuelles UNO-Kommando</string>
     <string name="display_language">Anzeigesprache</string>
     <string name="display_language_summary">Wählen Sie die Standard-Anzeigesprache</string>
+    <string name="pdf_export_finished">PDF-Export abgeschlossen</string>
     <string name="unable_to_export_pdf">PDF-Export nicht möglich</string>
     <string name="unable_to_save">Speichern nicht möglich</string>
-    <string name="pdf_exported_at">PDF exportiert nach</string>
     <string name="printing_not_supported">Ihr Gerät unterstützt Drucken nicht</string>
     <string name="creating_new_files_not_supported">Erstellen neuer Dokumente auf diesem Gerät nicht verfügbar, benötigt Android-SDK-Version >= 19.</string>
     <string name="error">Fehler</string>
diff --git a/android/source/res/values-tr/strings.xml b/android/source/res/values-tr/strings.xml
index 72d15c210933..a780a59fe165 100644
--- a/android/source/res/values-tr/strings.xml
+++ b/android/source/res/values-tr/strings.xml
@@ -149,7 +149,6 @@
     <string name="display_language">Uygulama Dili</string>
     <string name="display_language_summary">Varsayılan dili değiştir</string>
     <string name="unable_to_export_pdf">Pdf dışa aktarılamıyor.</string>
-    <string name="pdf_exported_at">Şu konumda pdf\'e aktarıldı: </string>
     <string name="printing_not_supported">Cihazınız yazdırmayı desteklemiyor.</string>
     <string name="error">Hata</string>
     <string name="enter_part_name">Bölüm ismi girin.</string>
diff --git a/android/source/res/values/strings.xml b/android/source/res/values/strings.xml
index d0014646bc15..6b3db68e23b6 100644
--- a/android/source/res/values/strings.xml
+++ b/android/source/res/values/strings.xml
@@ -152,9 +152,9 @@
     <string name="current_uno_command">Current UNO command</string>
     <string name="display_language">Display Language</string>
     <string name="display_language_summary">Set the default display language</string>
+    <string name="pdf_export_finished">PDF export finished</string>
     <string name="unable_to_export_pdf">Unable to export to pdf</string>
     <string name="unable_to_save">Unable to save file</string>
-    <string name="pdf_exported_at">Exported to PDF at</string>
     <string name="printing_not_supported">Your device does not support printing</string>
     <string name="creating_new_files_not_supported">Creating new files not supported on this device, requires Android SDK version >= 19.</string>
     <string name="error">Error</string>
diff --git a/android/source/src/java/org/libreoffice/LOKitTileProvider.java b/android/source/src/java/org/libreoffice/LOKitTileProvider.java
index 5f4684703f36..5d8d2e557d0f 100644
--- a/android/source/src/java/org/libreoffice/LOKitTileProvider.java
+++ b/android/source/src/java/org/libreoffice/LOKitTileProvider.java
@@ -277,7 +277,7 @@ class LOKitTileProvider implements TileProvider {
     }
 
     @Override
-    public void saveDocumentAs(final String filePath, String format, boolean takeOwnership) {
+    public boolean saveDocumentAs(final String filePath, String format, boolean takeOwnership) {
         String options = "";
         if (takeOwnership) {
             options = "TakeOwnership";
@@ -287,21 +287,16 @@ class LOKitTileProvider implements TileProvider {
         Log.d("saveFilePathURL", newFilePath);
         LOKitShell.showProgressSpinner(mContext);
         mDocument.saveAs(newFilePath, format, options);
+        final boolean ok;
         if (!mOffice.getError().isEmpty()){
+            ok = true;
             Log.e("Save Error", mOffice.getError());
             if (format.equals("svg")) {
                 // error in creating temp slideshow svg file
                 Log.d(LOGTAG, "Error in creating temp slideshow svg file");
             } else if(format.equals("pdf")){
                 Log.d(LOGTAG, "Error in creating pdf file");
-                LOKitShell.getMainHandler().post(new Runnable() {
-                    @Override
-                    public void run() {
-                        // There was some error
-                        mContext.showCustomStatusMessage(mContext.getString(R.string.unable_to_export_pdf));
-                    }
-                });
-            }else {
+            } else {
                 LOKitShell.getMainHandler().post(new Runnable() {
                     @Override
                     public void run() {
@@ -311,6 +306,7 @@ class LOKitTileProvider implements TileProvider {
                 });
             }
         } else {
+            ok = false;
             if (format.equals("svg")) {
                 // successfully created temp slideshow svg file
                 LOKitShell.getMainHandler().post(new Runnable() {
@@ -319,52 +315,36 @@ class LOKitTileProvider implements TileProvider {
                         mContext.startPresentation(newFilePath);
                     }
                 });
-            }else if(format.equals("pdf")){
-                LOKitShell.getMainHandler().post(new Runnable() {
-                    @Override
-                    public void run() {
-                        // There was no error
-                        mContext.showCustomStatusMessage(mContext.getString(R.string.pdf_exported_at)+filePath);
-                    }
-                });
             } else if (takeOwnership) {
                 mInputFile = filePath;
             }
         }
         LOKitShell.hideProgressSpinner(mContext);
+        return ok;
     }
 
     @Override
-    public void saveDocumentAs(final String filePath, boolean takeOwnership) {
+    public boolean saveDocumentAs(final String filePath, boolean takeOwnership) {
         final int docType = mDocument.getDocumentType();
         if (docType == Document.DOCTYPE_TEXT)
-            saveDocumentAs(filePath, "odt", takeOwnership);
+            return saveDocumentAs(filePath, "odt", takeOwnership);
         else if (docType == Document.DOCTYPE_SPREADSHEET)
-            saveDocumentAs(filePath, "ods", takeOwnership);
+            return saveDocumentAs(filePath, "ods", takeOwnership);
         else if (docType == Document.DOCTYPE_PRESENTATION)
-            saveDocumentAs(filePath, "odp", takeOwnership);
+            return saveDocumentAs(filePath, "odp", takeOwnership);
         else if (docType == Document.DOCTYPE_DRAWING)
-            saveDocumentAs(filePath, "odg", takeOwnership);
-        else
-            Log.w(LOGTAG, "Cannot determine file format from document. Not saving.");
+            return saveDocumentAs(filePath, "odg", takeOwnership);
+
+        Log.w(LOGTAG, "Cannot determine file format from document. Not saving.");
+        return false;
     }
 
-    public void exportToPDF(boolean print){
-        String dir = Environment.getExternalStorageDirectory().getAbsolutePath()+"/Documents";
-        File docDir = new File(dir);
-        if(!docDir.exists()){
-            docDir.mkdir();
-        }
+    public void printDocument() {
         String mInputFileName = (new File(mInputFile)).getName();
         String file = mInputFileName.substring(0,(mInputFileName.length()-3))+"pdf";
-        if(print){
-            String cacheFile = mContext.getExternalCacheDir().getAbsolutePath()
-                    + "/" + file;
-            mDocument.saveAs("file://"+cacheFile,"pdf","");
-            printDocument(cacheFile);
-        }else{
-            saveDocumentAs(dir+"/"+file,"pdf", false);
-        }
+        String cacheFile = mContext.getExternalCacheDir().getAbsolutePath() + "/" + file;
+        mDocument.saveAs("file://"+cacheFile,"pdf","");
+        printDocument(cacheFile);
     }
 
     private void printDocument(String cacheFile) {
diff --git a/android/source/src/java/org/libreoffice/LibreOfficeMainActivity.java b/android/source/src/java/org/libreoffice/LibreOfficeMainActivity.java
index 255c4d5bdd95..1812ad253744 100644
--- a/android/source/src/java/org/libreoffice/LibreOfficeMainActivity.java
+++ b/android/source/src/java/org/libreoffice/LibreOfficeMainActivity.java
@@ -64,6 +64,7 @@ public class LibreOfficeMainActivity extends AppCompatActivity implements Settin
     private static final String ASSETS_EXTRACTED_PREFS_KEY = "ASSETS_EXTRACTED";
     private static final String ENABLE_DEVELOPER_PREFS_KEY = "ENABLE_DEVELOPER";
     private static final int REQUEST_CODE_SAVEAS = 12345;
+    private static final int REQUEST_CODE_EXPORT_TO_PDF = 12346;
 
     //TODO "public static" is a temporary workaround
     public static LOKitThread loKitThread;
@@ -340,6 +341,46 @@ public class LibreOfficeMainActivity extends AppCompatActivity implements Settin
         toolbarTop.setTitle(displayName);
     }
 
+    public void exportToPDF() {
+        Intent intent = new Intent(Intent.ACTION_CREATE_DOCUMENT);
+        intent.addCategory(Intent.CATEGORY_OPENABLE);
+        intent.setType(FileUtilities.MIMETYPE_PDF);
+        intent.putExtra(DocumentsContract.EXTRA_INITIAL_URI, mDocumentUri);
+
+        startActivityForResult(intent, REQUEST_CODE_EXPORT_TO_PDF);
+    }
+
+    private void exportToPDF(final Uri uri) {
+        boolean exportOK = false;
+        File tempFile = null;
+        try {
+            tempFile = File.createTempFile("LibreOffice_", ".pdf");
+            mTileProvider.saveDocumentAs(tempFile.getAbsolutePath(),"pdf", false);
+
+            try {
+                FileInputStream inputStream = new FileInputStream(tempFile);
+                exportOK = copyStreamToUri(inputStream, uri);
+            } catch (FileNotFoundException e) {
+                e.printStackTrace();
+            }
+
+        } catch (IOException e) {
+            e.printStackTrace();
+        } finally {
+            if (tempFile != null && tempFile.exists()) {
+                tempFile.delete();
+            }
+        }
+
+        final int msgId = exportOK ? R.string.pdf_export_finished : R.string.unable_to_export_pdf;
+        LOKitShell.getMainHandler().post(new Runnable() {
+            @Override
+            public void run() {
+                showCustomStatusMessage(getString(msgId));
+            }
+        });
+    }
+
     /**
      * Returns the ODF MIME type that can be used for the current document,
      * regardless of whether the document is an ODF Document or not
@@ -1046,6 +1087,9 @@ public class LibreOfficeMainActivity extends AppCompatActivity implements Settin
         if (requestCode == REQUEST_CODE_SAVEAS && resultCode == RESULT_OK) {
             final Uri fileUri = data.getData();
             saveDocumentAs(fileUri);
+        } else if (requestCode == REQUEST_CODE_EXPORT_TO_PDF && resultCode == RESULT_OK) {
+            final Uri fileUri = data.getData();
+            exportToPDF(fileUri);
         } else {
             mFormattingController.handleActivityResult(requestCode, resultCode, data);
             hideBottomToolbar();
diff --git a/android/source/src/java/org/libreoffice/TileProvider.java b/android/source/src/java/org/libreoffice/TileProvider.java
index ea93d5b5c803..c979a9883c13 100644
--- a/android/source/src/java/org/libreoffice/TileProvider.java
+++ b/android/source/src/java/org/libreoffice/TileProvider.java
@@ -29,8 +29,9 @@ public interface TileProvider {
      *                      as compared to just saving a copy of the current document
      *                      or exporting to a different file format.
      *                      Must be 'false' when using this method for export to e.g. PNG or PDF.
+     * @return Whether saving was successful.
      */
-    void saveDocumentAs(String filePath, String format, boolean takeOwnership);
+    boolean saveDocumentAs(String filePath, String format, boolean takeOwnership);
 
     /**
      * Saves the current document under the given path,
@@ -38,7 +39,7 @@ public interface TileProvider {
      * @param takeOwnership (s. documentation for
      *                      'saveDocumentAs(String filePath, String format, boolean takeOwnership)')
      */
-    void saveDocumentAs(String filePath, boolean takeOwnership);
+    boolean saveDocumentAs(String filePath, boolean takeOwnership);
 
     /**
      * Returns the page width in pixels.
diff --git a/android/source/src/java/org/libreoffice/ToolbarController.java b/android/source/src/java/org/libreoffice/ToolbarController.java
index ceea83a2b311..1384339f8c30 100644
--- a/android/source/src/java/org/libreoffice/ToolbarController.java
+++ b/android/source/src/java/org/libreoffice/ToolbarController.java
@@ -181,10 +181,10 @@ public class ToolbarController implements Toolbar.OnMenuItemClickListener {
                 mContext.openDrawer();
                 return true;
             case R.id.action_exportToPDF:
-                mContext.getTileProvider().exportToPDF(false);
+                mContext.exportToPDF();
                 return true;
             case R.id.action_print:
-                mContext.getTileProvider().exportToPDF(true);
+                mContext.getTileProvider().printDocument();
                 return true;
             case R.id.action_settings:
                 mContext.showSettings();
diff --git a/android/source/src/java/org/libreoffice/ui/FileUtilities.java b/android/source/src/java/org/libreoffice/ui/FileUtilities.java
index 8422e845dd40..f1581a678c30 100644
--- a/android/source/src/java/org/libreoffice/ui/FileUtilities.java
+++ b/android/source/src/java/org/libreoffice/ui/FileUtilities.java
@@ -42,6 +42,7 @@ public class FileUtilities {
     public static final String MIMETYPE_OPENDOCUMENT_SPREADSHEET = "application/vnd.oasis.opendocument.spreadsheet";
     public static final String MIMETYPE_OPENDOCUMENT_PRESENTATION = "application/vnd.oasis.opendocument.presentation";
     public static final String MIMETYPE_OPENDOCUMENT_GRAPHICS = "application/vnd.oasis.opendocument.graphics";
+    public static final String MIMETYPE_PDF = "application/pdf";
 
     private static final Map<String, Integer> mExtnMap = new HashMap<String, Integer>();
     private static final Map<String, String> extensionToMimeTypeMap = new HashMap<String, String>();


More information about the Libreoffice-commits mailing list