android/app/src/main/java/org/libreoffice/androidapp/ui/LibreOfficeUIActivity.java
 |   11 +
 
android/app/src/main/java/org/libreoffice/androidapp/ui/RecentFilesAdapter.java 
   |   57 +++++++---
 2 files changed, 54 insertions(+), 14 deletions(-)

New commits:
commit 10c695cfbbb8a9072388f5f0a03f557aa51955cf
Author:     mert <mert.tu...@collabora.com>
AuthorDate: Tue Mar 10 19:08:11 2020 +0300
Commit:     Andras Timar <andras.ti...@collabora.com>
CommitDate: Mon Mar 16 15:50:05 2020 +0100

    android: fix crash on removed/renamed file on recent files
    
    Change-Id: Iedeaba896ecca17c0c7e5c038b1c370b72484c68
    Reviewed-on: https://gerrit.libreoffice.org/c/online/+/90290
    Tested-by: Jenkins CollaboraOffice <jenkinscollaboraoff...@gmail.com>
    Reviewed-by: Mert Tümer <mert.tu...@collabora.com>

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 1ef2acc45..bd9116c94 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
@@ -113,7 +113,7 @@ public class LibreOfficeUIActivity extends 
AppCompatActivity implements Settings
     public static final String EXPLORER_VIEW_TYPE_KEY = "EXPLORER_VIEW_TYPE";
     public static final String EXPLORER_PREFS_KEY = "EXPLORER_PREFS";
     public static final String SORT_MODE_KEY = "SORT_MODE";
-    private static final String RECENT_DOCUMENTS_KEY = "RECENT_DOCUMENTS_LIST";
+    public static final String RECENT_DOCUMENTS_KEY = "RECENT_DOCUMENTS_LIST";
     private static final String ENABLE_SHOW_HIDDEN_FILES_KEY = 
"ENABLE_SHOW_HIDDEN_FILES";
 
     public static final String NEW_FILE_PATH_KEY = "NEW_FILE_PATH_KEY";
@@ -208,6 +208,12 @@ public class LibreOfficeUIActivity extends 
AppCompatActivity implements Settings
         recentRecyclerView.setAdapter(new RecentFilesAdapter(this, 
recentUris));
     }
 
+    /** access shared preferences from the activity instance */
+    public SharedPreferences getPrefs()
+    {
+        return prefs;
+    }
+
     /** Create the Navigation menu and set up the actions and everything 
there. */
     public void setupNavigationDrawer() {
         drawerLayout = findViewById(R.id.drawer_layout);
@@ -986,6 +992,9 @@ public class LibreOfficeUIActivity extends 
AppCompatActivity implements Settings
                 Uri shortcutUri = Uri.parse(pathString);
                 String filename = RecentFilesAdapter.getUriFilename(this, 
shortcutUri);
 
+                if (filename == null)
+                    continue;
+
                 Intent intent = getIntentToEdit(shortcutUri);
                 ShortcutInfo.Builder builder = new ShortcutInfo.Builder(this, 
filename)
                         .setShortLabel(filename)
diff --git 
a/android/app/src/main/java/org/libreoffice/androidapp/ui/RecentFilesAdapter.java
 
b/android/app/src/main/java/org/libreoffice/androidapp/ui/RecentFilesAdapter.java
index 4a06899a9..371b7ab03 100644
--- 
a/android/app/src/main/java/org/libreoffice/androidapp/ui/RecentFilesAdapter.java
+++ 
b/android/app/src/main/java/org/libreoffice/androidapp/ui/RecentFilesAdapter.java
@@ -22,6 +22,7 @@ import android.widget.TextView;
 import org.libreoffice.androidapp.R;
 
 import java.text.SimpleDateFormat;
+import java.util.ArrayList;
 import java.util.Date;
 import java.util.List;
 
@@ -34,11 +35,11 @@ class RecentFilesAdapter extends 
RecyclerView.Adapter<RecentFilesAdapter.ViewHol
     private final long MB = 1048576;
 
     private LibreOfficeUIActivity mActivity;
-    private List<Uri> recentUris;
+    private ArrayList<RecentFile> recentFiles;
 
     RecentFilesAdapter(LibreOfficeUIActivity activity, List<Uri> recentUris) {
         this.mActivity = activity;
-        this.recentUris = recentUris;
+        initRecentFiles(recentUris);
     }
 
     @Override
@@ -47,6 +48,26 @@ class RecentFilesAdapter extends 
RecyclerView.Adapter<RecentFilesAdapter.ViewHol
         return new ViewHolder(item);
     }
 
+    /** Validate uris in case of removed/renamed documents and return 
RecentFile ArrayList from the valid uris */
+    public void initRecentFiles(List<Uri> recentUris) {
+        this.recentFiles = new ArrayList<>();
+        boolean invalidUriFound = false;
+        String joined = "";
+        for (Uri u: recentUris) {
+            String filename = getUriFilename(mActivity, u);
+            if (null != filename) {
+                long length = getUriFileLength(mActivity, u);
+                recentFiles.add(new RecentFile(u, filename, length));
+                joined = joined.concat(u.toString()+"\n");
+            }
+            else
+                invalidUriFound = true;
+        }
+        if (invalidUriFound) {
+            
mActivity.getPrefs().edit().putString(mActivity.RECENT_DOCUMENTS_KEY, 
joined).apply();
+        }
+    }
+
     /** Return the filename of the given Uri. */
     public static String getUriFilename(Activity activity, Uri uri) {
         String filename = "";
@@ -60,11 +81,8 @@ class RecentFilesAdapter extends 
RecyclerView.Adapter<RecentFilesAdapter.ViewHol
                 cursor.close();
         }
 
-        if (filename.isEmpty()) {
-            List<String> segments = uri.getPathSegments();
-            if (segments.size() > 0)
-                filename = segments.get(segments.size() - 1);
-        }
+        if (filename.isEmpty())
+            return null;
 
         return filename;
     }
@@ -91,17 +109,18 @@ class RecentFilesAdapter extends 
RecyclerView.Adapter<RecentFilesAdapter.ViewHol
 
     @Override
     public void onBindViewHolder(ViewHolder holder, int position) {
-        final Uri uri = recentUris.get(position);
+        final RecentFile file = recentFiles.get(position);
 
         holder.itemView.setOnClickListener(new View.OnClickListener() {
             @Override
             public void onClick(View view) {
-                mActivity.open(uri);
+                mActivity.open(file.uri);
             }
         });
 
-        String filename = getUriFilename(mActivity, uri);
-        long length = getUriFileLength(mActivity, uri);
+        String filename = file.filename;
+        long length = file.fileLength;
+
         // TODO Date not avaiable now
         //Date date = null;
 
@@ -155,12 +174,12 @@ class RecentFilesAdapter extends 
RecyclerView.Adapter<RecentFilesAdapter.ViewHol
 
     @Override
     public int getItemCount() {
-        if (recentUris.size() == 0) {
+        if (recentFiles.size() == 0) {
             mActivity.noRecentItemsTextView.setVisibility(View.VISIBLE);
         } else {
             mActivity.noRecentItemsTextView.setVisibility(View.GONE);
         }
-        return recentUris.size();
+        return recentFiles.size();
     }
 
     class ViewHolder extends RecyclerView.ViewHolder {
@@ -180,6 +199,18 @@ class RecentFilesAdapter extends 
RecyclerView.Adapter<RecentFilesAdapter.ViewHol
             }
         }
     }
+    /** Cache the name & size so that we don't have ask later. */
+    private class RecentFile {
+        public Uri uri;
+        public String filename;
+        public long fileLength;
+
+        public RecentFile(Uri uri, String filename, long fileLength) {
+            this.uri = uri;
+            this.filename = filename;
+            this.fileLength = fileLength;
+        }
+    }
 }
 
 /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
_______________________________________________
Libreoffice-commits mailing list
libreoffice-comm...@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/libreoffice-commits

Reply via email to