[Libreoffice-commits] online.git: android/app android/lib

Jan Holesovsky (via logerrit) logerrit at kemper.freedesktop.org
Tue Dec 10 16:14:22 UTC 2019


 android/app/src/main/java/org/libreoffice/androidapp/storage/IDocumentProvider.java     |    2 
 android/app/src/main/java/org/libreoffice/androidapp/storage/IFile.java                 |    4 
 android/app/src/main/java/org/libreoffice/androidapp/storage/external/ExternalFile.java |   28 ++-
 android/app/src/main/java/org/libreoffice/androidapp/storage/local/LocalFile.java       |    2 
 android/app/src/main/java/org/libreoffice/androidapp/storage/owncloud/OwnCloudFile.java |   33 +++
 android/app/src/main/java/org/libreoffice/androidapp/ui/LibreOfficeUIActivity.java      |   83 +++++++++-
 android/lib/src/main/java/org/libreoffice/androidlib/LOActivity.java                    |   19 ++
 7 files changed, 145 insertions(+), 26 deletions(-)

New commits:
commit 07c3a7bdbbec886dd0d2635090e5bd483286853f
Author:     Jan Holesovsky <kendy at collabora.com>
AuthorDate: Tue Dec 10 16:12:52 2019 +0100
Commit:     Jan Holesovsky <kendy at collabora.com>
CommitDate: Tue Dec 10 17:14:03 2019 +0100

    android: Implement uploading back to the cloud storage.
    
    All these cases should be covered:
    
    * user's explicit save via File -> Save
    * autosave
    * autosave on exit
    
    Implemented via IntentFilter magic, we can call back from one activity
    to the other to perform the actual saving in the shell.
    
    Change-Id: I97d6e94028a9600a71f030af7146ee01163d09b8
    Reviewed-on: https://gerrit.libreoffice.org/84872
    Reviewed-by: Jan Holesovsky <kendy at collabora.com>
    Tested-by: Jan Holesovsky <kendy at collabora.com>

diff --git a/android/app/src/main/java/org/libreoffice/androidapp/storage/IDocumentProvider.java b/android/app/src/main/java/org/libreoffice/androidapp/storage/IDocumentProvider.java
index 474610ab1..a16fb07c7 100644
--- a/android/app/src/main/java/org/libreoffice/androidapp/storage/IDocumentProvider.java
+++ b/android/app/src/main/java/org/libreoffice/androidapp/storage/IDocumentProvider.java
@@ -68,3 +68,5 @@ public interface IDocumentProvider {
      */
     boolean checkProviderAvailability(Context context);
 }
+
+/* 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/storage/IFile.java b/android/app/src/main/java/org/libreoffice/androidapp/storage/IFile.java
index da8067bd0..5817f40b2 100644
--- a/android/app/src/main/java/org/libreoffice/androidapp/storage/IFile.java
+++ b/android/app/src/main/java/org/libreoffice/androidapp/storage/IFile.java
@@ -112,5 +112,7 @@ public interface IFile {
      * @param file
      *            A local file pointing to the new version of the document.
      */
-    void saveDocument(File file);
+    void saveDocument();
 }
+
+/* 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/storage/external/ExternalFile.java b/android/app/src/main/java/org/libreoffice/androidapp/storage/external/ExternalFile.java
index 6a78f983c..557e7580e 100644
--- a/android/app/src/main/java/org/libreoffice/androidapp/storage/external/ExternalFile.java
+++ b/android/app/src/main/java/org/libreoffice/androidapp/storage/external/ExternalFile.java
@@ -34,7 +34,10 @@ public class ExternalFile implements IFile{
 
     private ExtsdDocumentsProvider provider;
     private DocumentFile docFile;
-    private File duplicateFile;
+
+    /** We create the document just once, cache it for further returning. */
+    private File mCachedFile;
+
     private Context context;
 
     public ExternalFile(ExtsdDocumentsProvider provider, DocumentFile docFile, Context context) {
@@ -112,12 +115,14 @@ public class ExternalFile implements IFile{
 
     @Override
     public File getDocument() {
-        if(isDirectory()) {
+        if (mCachedFile != null)
+            return mCachedFile;
+
+        if (isDirectory())
             return null;
-        } else {
-            duplicateFile = duplicateInCache();
-            return duplicateFile;
-        }
+
+        mCachedFile = duplicateInCache();
+        return mCachedFile;
     }
 
     private File duplicateInCache() {
@@ -138,11 +143,16 @@ public class ExternalFile implements IFile{
     }
 
     @Override
-    public void saveDocument(File file) {
+    public void saveDocument() {
+        if (mCachedFile == null) {
+            Log.e(LOGTAG, "Trying to save document that was not created via getDocument()(");
+            return;
+        }
+
         try{
             OutputStream ostream = context.getContentResolver().
                     openOutputStream(docFile.getUri());
-            InputStream istream = new FileInputStream(file);
+            InputStream istream = new FileInputStream(mCachedFile);
 
             IOUtils.copy(istream, ostream);
 
@@ -162,3 +172,5 @@ public class ExternalFile implements IFile{
     }
 
 }
+
+/* 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/storage/local/LocalFile.java b/android/app/src/main/java/org/libreoffice/androidapp/storage/local/LocalFile.java
index 0594c7272..bf1661047 100644
--- a/android/app/src/main/java/org/libreoffice/androidapp/storage/local/LocalFile.java
+++ b/android/app/src/main/java/org/libreoffice/androidapp/storage/local/LocalFile.java
@@ -97,7 +97,7 @@ public class LocalFile implements IFile {
     }
 
     @Override
-    public void saveDocument(File file) {
+    public void saveDocument() {
         // do nothing; file is local
     }
 }
diff --git a/android/app/src/main/java/org/libreoffice/androidapp/storage/owncloud/OwnCloudFile.java b/android/app/src/main/java/org/libreoffice/androidapp/storage/owncloud/OwnCloudFile.java
index cc7589fae..4683f81f9 100644
--- a/android/app/src/main/java/org/libreoffice/androidapp/storage/owncloud/OwnCloudFile.java
+++ b/android/app/src/main/java/org/libreoffice/androidapp/storage/owncloud/OwnCloudFile.java
@@ -1,6 +1,7 @@
 package org.libreoffice.androidapp.storage.owncloud;
 
 import android.content.Context;
+import android.util.Log;
 
 import java.io.File;
 import java.io.FileFilter;
@@ -25,10 +26,14 @@ import com.owncloud.android.lib.resources.files.model.RemoteFile;
  * Implementation of IFile for ownCloud servers.
  */
 public class OwnCloudFile implements IFile {
+    final static String LOGTAG = "OwnCloudFile";
 
     private OwnCloudProvider provider;
     private RemoteFile file;
 
+    /** We create the document just once, cache it for further returning. */
+    private File mCachedFile;
+
     private String name;
     private String parentPath;
 
@@ -136,9 +141,12 @@ public class OwnCloudFile implements IFile {
 
     @Override
     public File getDocument() {
-        if (isDirectory()) {
+        if (mCachedFile != null)
+            return mCachedFile;
+
+        if (isDirectory())
             return null;
-        }
+
         File downFolder = provider.getCacheDir();
         DownloadFileRemoteOperation operation = new DownloadFileRemoteOperation(
                 file.getRemotePath(), downFolder.getAbsolutePath());
@@ -146,7 +154,9 @@ public class OwnCloudFile implements IFile {
         if (!result.isSuccess()) {
             throw provider.buildRuntimeExceptionForResultCode(result.getCode());
         }
-        return new File(downFolder.getAbsolutePath() + file.getRemotePath());
+
+        mCachedFile = new File(downFolder.getAbsolutePath() + file.getRemotePath());
+        return mCachedFile;
     }
 
     @Override
@@ -160,14 +170,19 @@ public class OwnCloudFile implements IFile {
     }
 
     @Override
-    public void saveDocument(File newFile) {
+    public void saveDocument() {
+        if (mCachedFile == null) {
+            Log.e(LOGTAG, "Trying to save document that was not created via getDocument()(");
+            return;
+        }
+
         UploadFileRemoteOperation uploadOperation;
-        if (newFile.length() > ChunkedFileUploadRemoteOperation.CHUNK_SIZE_MOBILE) {
+        if (mCachedFile.length() > ChunkedFileUploadRemoteOperation.CHUNK_SIZE_MOBILE) {
             uploadOperation = new ChunkedFileUploadRemoteOperation(
-                    newFile.getPath(), file.getRemotePath(), file.getMimeType(), file.getEtag(), String.valueOf(file.getModifiedTimestamp()), false /* TODO actually check if on Wifi */);
+                    mCachedFile.getPath(), file.getRemotePath(), file.getMimeType(), file.getEtag(), String.valueOf(mCachedFile.lastModified()), false /* TODO actually check if on Wifi */);
         } else {
-            uploadOperation = new UploadFileRemoteOperation(newFile.getPath(),
-                    file.getRemotePath(), file.getMimeType(), String.valueOf(file.getModifiedTimestamp()));
+            uploadOperation = new UploadFileRemoteOperation(mCachedFile.getPath(),
+                    file.getRemotePath(), file.getMimeType(), String.valueOf(mCachedFile.lastModified()));
         }
 
         RemoteOperationResult result = uploadOperation.execute(provider
@@ -177,3 +192,5 @@ public class OwnCloudFile implements IFile {
         }
     }
 }
+
+/* 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/ui/LibreOfficeUIActivity.java b/android/app/src/main/java/org/libreoffice/androidapp/ui/LibreOfficeUIActivity.java
index 037de08ad..c21e884f5 100644
--- a/android/app/src/main/java/org/libreoffice/androidapp/ui/LibreOfficeUIActivity.java
+++ b/android/app/src/main/java/org/libreoffice/androidapp/ui/LibreOfficeUIActivity.java
@@ -95,6 +95,7 @@ import androidx.core.app.ActivityCompat;
 import androidx.core.content.ContextCompat;
 import androidx.core.view.ViewCompat;
 import androidx.drawerlayout.widget.DrawerLayout;
+import androidx.localbroadcastmanager.content.LocalBroadcastManager;
 import androidx.recyclerview.widget.GridLayoutManager;
 import androidx.recyclerview.widget.LinearLayoutManager;
 import androidx.recyclerview.widget.RecyclerView;
@@ -120,6 +121,9 @@ public class LibreOfficeUIActivity extends AppCompatActivity implements Settings
     private IFile currentDirectory;
     private int currentlySelectedFile;
 
+    /** The document that is being edited - to know what to save back to cloud. */
+    private IFile mCurrentDocument;
+
     private static final String CURRENT_DIRECTORY_KEY = "CURRENT_DIRECTORY";
     private static final String DOC_PROVIDER_KEY = "CURRENT_DOCUMENT_PROVIDER";
     private static final String FILTER_MODE_KEY = "FILTER_MODE";
@@ -164,6 +168,9 @@ public class LibreOfficeUIActivity extends AppCompatActivity implements Settings
     private LinearLayout impressLayout;
     private LinearLayout calcLayout;
 
+    /** Request code to evaluate that we are returning from the LOActivity. */
+    private static final int LO_ACTIVITY_REQUEST_CODE = 42;
+
     @Override
     public void onCreate(Bundle savedInstanceState) {
         super.onCreate(savedInstanceState);
@@ -182,9 +189,12 @@ public class LibreOfficeUIActivity extends AppCompatActivity implements Settings
         filter.addAction(UsbManager.ACTION_USB_DEVICE_ATTACHED);
         filter.addAction(UsbManager.ACTION_USB_DEVICE_DETACHED);
         registerReceiver(mUSBReceiver, filter);
-        // init UI and populate with contents from the provider
 
+        // Register the LOActivity events broadcast receiver
+        LocalBroadcastManager.getInstance(this).registerReceiver(mLOActivityReceiver,
+              new IntentFilter(LOActivity.LO_ACTIVITY_BROADCAST));
 
+        // init UI and populate with contents from the provider
         createUI();
         fabOpenAnimation = AnimationUtils.loadAnimation(this, R.anim.fab_open);
         fabCloseAnimation = AnimationUtils.loadAnimation(this, R.anim.fab_close);
@@ -540,6 +550,7 @@ public class LibreOfficeUIActivity extends AppCompatActivity implements Settings
 
     public void open(final IFile document) {
         addDocumentToRecents(document);
+        mCurrentDocument = document;
         new AsyncTask<IFile, Void, File>() {
             @Override
             protected File doInBackground(IFile... document) {
@@ -566,8 +577,7 @@ public class LibreOfficeUIActivity extends AppCompatActivity implements Settings
                 if (file != null) {
                     Intent i = new Intent(Intent.ACTION_VIEW, Uri.fromFile(file));
                     String packageName = getApplicationContext().getPackageName();
-                    ComponentName componentName = new ComponentName(packageName,
-                            LOActivity.class.getName());
+                    ComponentName componentName = new ComponentName(packageName, LOActivity.class.getName());
                     i.setComponent(componentName);
 
                     // these extras allow to rebuild the IFile object in LOActivity
@@ -576,7 +586,7 @@ public class LibreOfficeUIActivity extends AppCompatActivity implements Settings
                     i.putExtra("org.libreoffice.document_uri",
                             document.getUri());
 
-                    startActivity(i);
+                    startActivityForResult(i, LO_ACTIVITY_REQUEST_CODE);
                 }
             }
         }.execute(document);
@@ -616,7 +626,7 @@ public class LibreOfficeUIActivity extends AppCompatActivity implements Settings
                         i.putExtra("org.libreoffice.document_provider_id", documentProvider.getId());
                         i.putExtra("org.libreoffice.document_uri", newDocUri);
 
-                        startActivity(i);
+                        startActivityForResult(i, LO_ACTIVITY_REQUEST_CODE);
                     } else {
                         Toast.makeText(LibreOfficeUIActivity.this, getString(R.string.file_creation_failed), Toast.LENGTH_SHORT).show();
                     }
@@ -1022,6 +1032,67 @@ public class LibreOfficeUIActivity extends AppCompatActivity implements Settings
         }
     };
 
+    /** Receiver for receiving messages from LOActivity - like that Save was performed and similar. */
+    private final BroadcastReceiver mLOActivityReceiver = new BroadcastReceiver() {
+        @Override
+        public void onReceive(Context context, Intent intent) {
+            String event = intent.getStringExtra(LOActivity.LO_ACTION_EVENT);
+            Log.d(LOGTAG, "Received a message from LOActivity: " + event);
+
+            // Handle various events from LOActivity
+            if (event.equals("SAVE")) {
+                LibreOfficeUIActivity.this.saveFileToCloud();
+            }
+        }
+    };
+
+    /** Uploading back when we return from the LOActivity. */
+    @Override
+    public void onActivityResult(int requestCode, int resultCode, Intent data) {
+        if (requestCode == LO_ACTIVITY_REQUEST_CODE) {
+            Log.d(LOGTAG, "LOActivity has finished.");
+            saveFileToCloud();
+        }
+    }
+
+    /** Actually copy the file to the remote storage (if applicable). */
+    public void saveFileToCloud() {
+        if (mCurrentDocument == null)
+        {
+            Log.e(LOGTAG, "No idea what should be uploaded.");
+            return;
+        }
+
+        final AsyncTask<Void, Void, Void> task = new AsyncTask<Void, Void, Void>() {
+            @Override
+            protected Void doInBackground(Void... params) {
+                try {
+                    // call document provider save operation
+                    mCurrentDocument.saveDocument();
+                }
+                catch (final RuntimeException e) {
+                    LibreOfficeUIActivity.this.runOnUiThread(new Runnable() {
+                        @Override
+                        public void run() {
+                            Toast.makeText(LibreOfficeUIActivity.this, e.getMessage(), Toast.LENGTH_SHORT).show();
+                        }
+                    });
+                    Log.e(LOGTAG, e.getMessage(), e.getCause());
+                }
+                return null;
+            }
+
+            @Override
+            protected void onPostExecute(Void param) {
+                // FIXME Should we present a toast that the file was saved, or
+                // is it annoying?
+                //Toast.makeText(LibreOfficeUIActivity.this, R.string.message_saved, Toast.LENGTH_SHORT).show();
+            }
+        };
+
+        task.execute();
+    }
+
     @Override
     protected void onPause() {
         super.onPause();
@@ -1061,6 +1132,7 @@ public class LibreOfficeUIActivity extends AppCompatActivity implements Settings
     protected void onDestroy() {
         super.onDestroy();
         unregisterReceiver(mUSBReceiver);
+        unregisterReceiver(mLOActivityReceiver);
         Log.d(LOGTAG, "onDestroy");
     }
 
@@ -1082,7 +1154,6 @@ public class LibreOfficeUIActivity extends AppCompatActivity implements Settings
         //put the new value in the first place
         recentsArrayList.add(0, newRecent);
 
-
         /*
          * 4 because the number of recommended items in App Shortcuts is 4, and also
          * because it's a good number of recent items in general
diff --git a/android/lib/src/main/java/org/libreoffice/androidlib/LOActivity.java b/android/lib/src/main/java/org/libreoffice/androidlib/LOActivity.java
index 3fe1c317f..66dc87497 100644
--- a/android/lib/src/main/java/org/libreoffice/androidlib/LOActivity.java
+++ b/android/lib/src/main/java/org/libreoffice/androidlib/LOActivity.java
@@ -60,6 +60,7 @@ import androidx.appcompat.app.AlertDialog;
 import androidx.appcompat.app.AppCompatActivity;
 import androidx.core.app.ActivityCompat;
 import androidx.core.content.ContextCompat;
+import androidx.localbroadcastmanager.content.LocalBroadcastManager;
 
 public class LOActivity extends AppCompatActivity {
     final static String TAG = "LOActivity";
@@ -98,6 +99,15 @@ public class LOActivity extends AppCompatActivity {
     private ValueCallback<Uri[]> valueCallback;
     public static final int REQUEST_SELECT_FILE = 555;
 
+    /** Broadcasting event for passing info back to the shell. */
+    public static final String LO_ACTIVITY_BROADCAST = "LOActivityBroadcast";
+
+    /** Event description for passing info back to the shell. */
+    public static final String LO_ACTION_EVENT = "LOEvent";
+
+    /** Data description for passing info back to the shell. */
+    public static final String LO_ACTION_DATA = "LOData";
+
     private static boolean copyFromAssets(AssetManager assetManager,
                                           String fromAssetPath, String targetDir) {
         try {
@@ -647,8 +657,13 @@ public class LOActivity extends AppCompatActivity {
         });
     }
 
-    /** Could be overridden if it's necessary to forward some callbacks elsewhere. */
-    public void sendBroadcast(String event, String data) {}
+    /** Send message back to the shell (for example for the cloud save). */
+    public void sendBroadcast(String event, String data) {
+        Intent intent = new Intent(LO_ACTIVITY_BROADCAST);
+        intent.putExtra(LO_ACTION_EVENT, event);
+        intent.putExtra(LO_ACTION_DATA, data);
+        LocalBroadcastManager.getInstance(this).sendBroadcast(intent);
+    }
 
     public native void saveAs(String fileUri, String format);
 


More information about the Libreoffice-commits mailing list