Browse Source

clicking on link in activity list shows correct file/folder

tobiasKaminsky 7 years ago
parent
commit
af094a570f

+ 55 - 10
src/main/java/com/owncloud/android/ui/activity/ActivitiesListActivity.java

@@ -1,4 +1,4 @@
-/**
+/*
  * Nextcloud Android client application
  *
  * @author Andy Scherzinger
@@ -37,10 +37,12 @@ import android.widget.ImageView;
 import android.widget.LinearLayout;
 import android.widget.ProgressBar;
 import android.widget.TextView;
+import android.widget.Toast;
 
 import com.owncloud.android.MainApp;
 import com.owncloud.android.R;
 import com.owncloud.android.authentication.AccountUtils;
+import com.owncloud.android.datamodel.FileDataStorageManager;
 import com.owncloud.android.datamodel.OCFile;
 import com.owncloud.android.lib.common.OwnCloudAccount;
 import com.owncloud.android.lib.common.OwnCloudClient;
@@ -49,14 +51,18 @@ import com.owncloud.android.lib.common.operations.RemoteOperation;
 import com.owncloud.android.lib.common.operations.RemoteOperationResult;
 import com.owncloud.android.lib.common.utils.Log_OC;
 import com.owncloud.android.lib.resources.activities.GetRemoteActivitiesOperation;
+import com.owncloud.android.lib.resources.activities.models.Activity;
 import com.owncloud.android.lib.resources.activities.models.RichObject;
 import com.owncloud.android.lib.resources.files.FileUtils;
+import com.owncloud.android.lib.resources.files.ReadRemoteFileOperation;
+import com.owncloud.android.lib.resources.files.RemoteFile;
 import com.owncloud.android.ui.adapter.ActivityListAdapter;
 import com.owncloud.android.ui.interfaces.ActivityListInterface;
 import com.owncloud.android.ui.preview.PreviewImageActivity;
 import com.owncloud.android.ui.preview.PreviewImageFragment;
 import com.owncloud.android.utils.AnalyticsUtils;
 import com.owncloud.android.utils.DisplayUtils;
+import com.owncloud.android.utils.FileStorageUtils;
 
 import java.io.IOException;
 import java.util.ArrayList;
@@ -165,7 +171,8 @@ public class ActivitiesListActivity extends FileActivity implements ActivityList
         emptyContentIcon.setImageResource(R.drawable.ic_activity_light_grey);
         setLoadingMessage();
 
-        adapter = new ActivityListAdapter(this, this);
+        FileDataStorageManager storageManager = new FileDataStorageManager(getAccount(), getContentResolver());
+        adapter = new ActivityListAdapter(this, this, storageManager);
         recyclerView.setAdapter(adapter);
 
         LinearLayoutManager layoutManager = new LinearLayoutManager(this);
@@ -190,7 +197,7 @@ public class ActivitiesListActivity extends FileActivity implements ActivityList
 
 
             public void run() {
-                OwnCloudAccount ocAccount = null;
+                OwnCloudAccount ocAccount;
                 try {
                     ocAccount = new OwnCloudAccount(
                             currentAccount,
@@ -207,6 +214,32 @@ public class ActivitiesListActivity extends FileActivity implements ActivityList
                     if (result.isSuccess() && result.getData() != null) {
                         final ArrayList<Object> activities = result.getData();
 
+                        // update all data
+                        for (Object object : activities) {
+                            Activity activity = (Activity) object;
+
+                            if (!activity.getType().equalsIgnoreCase("file_deleted") &&
+                                    !activity.getType().equalsIgnoreCase("calendar_event")) {
+                                for (RichObject richObject : activity.getRichSubjectElement().getRichObjectList()) {
+                                    String path = FileUtils.PATH_SEPARATOR + richObject.getPath();
+                                    OCFile file = getStorageManager().getFileByPath(path);
+
+                                    if (file == null) {
+                                        file = getStorageManager().getFileByPath(path + FileUtils.PATH_SEPARATOR);
+                                    }
+                                    if (file == null) {
+                                        // remote request
+                                        ReadRemoteFileOperation operation = new ReadRemoteFileOperation(path);
+                                        RemoteOperationResult resultRemoteOp = operation.execute(mClient);
+                                        if (resultRemoteOp.isSuccess()) {
+                                            file = FileStorageUtils.fillOCFile((RemoteFile) resultRemoteOp.getData().get(0));
+                                            getStorageManager().saveFileWithParent(file, context);
+                                        }
+                                    }
+                                }
+                            }
+                        }
+
                         runOnUiThread(new Runnable() {
                             @Override
                             public void run() {
@@ -316,14 +349,26 @@ public class ActivitiesListActivity extends FileActivity implements ActivityList
     @Override
     public void onActivityClicked(RichObject richObject) {
         Intent showDetailsIntent;
-        OCFile ocFile = new OCFile(FileUtils.PATH_SEPARATOR + richObject.getPath());
-        if (PreviewImageFragment.canBePreviewed(ocFile)) {
-            showDetailsIntent = new Intent(this, PreviewImageActivity.class);
+
+        // folders do not have a trailing /, so we have to test both cases
+        String path = FileUtils.PATH_SEPARATOR + richObject.getPath();
+        OCFile ocFile = getStorageManager().getFileByPath(path);
+
+        if (ocFile == null) {
+            ocFile = getStorageManager().getFileByPath(path + FileUtils.PATH_SEPARATOR);
+        }
+
+        if (ocFile == null) {
+            Toast.makeText(getBaseContext(), R.string.file_not_found, Toast.LENGTH_LONG).show();
         } else {
-            showDetailsIntent = new Intent(this, FileDisplayActivity.class);
+            if (PreviewImageFragment.canBePreviewed(ocFile)) {
+                showDetailsIntent = new Intent(this, PreviewImageActivity.class);
+            } else {
+                showDetailsIntent = new Intent(this, FileDisplayActivity.class);
+            }
+            showDetailsIntent.putExtra(EXTRA_FILE, ocFile);
+            showDetailsIntent.putExtra(EXTRA_ACCOUNT, getAccount());
+            startActivity(showDetailsIntent);
         }
-        showDetailsIntent.putExtra(EXTRA_FILE, ocFile);
-        showDetailsIntent.putExtra(EXTRA_ACCOUNT, getAccount());
-        startActivity(showDetailsIntent);
     }
 }

+ 14 - 5
src/main/java/com/owncloud/android/ui/activity/FileDisplayActivity.java

@@ -1,4 +1,4 @@
-/**
+/*
  * ownCloud Android client application
  *
  * @author Bartek Przybylski
@@ -1063,14 +1063,23 @@ public class FileDisplayActivity extends HookActivity
         Log_OC.v(TAG, "onResume() start");
         super.onResume();
 
+        OCFile startFile = null;
+        if (getIntent() != null && getIntent().getParcelableExtra(EXTRA_FILE) != null) {
+            startFile = getIntent().getParcelableExtra(EXTRA_FILE);
+            setFile(startFile);
+        }
 
         revertBottomNavigationBarToAllFiles();
         // refresh list of files
 
         if (searchView != null && !TextUtils.isEmpty(searchQuery)) {
             searchView.setQuery(searchQuery, true);
-        } else if (getListOfFilesFragment() != null && !getListOfFilesFragment().getIsSearchFragment()) {
+        } else if (getListOfFilesFragment() != null && !getListOfFilesFragment().getIsSearchFragment()
+                && startFile == null) {
             refreshListOfFilesFragment(false);
+        } else {
+            getListOfFilesFragment().listDirectory(startFile, false, false);
+            updateActionBarTitleAndHomeButton(startFile);
         }
 
         // Listen for sync messages
@@ -1212,8 +1221,7 @@ public class FileDisplayActivity extends HookActivity
                             if (currentDir.getRemotePath().equals(synchFolderRemotePath)) {
                                 OCFileListFragment fileListFragment = getListOfFilesFragment();
                                 if (fileListFragment != null) {
-                                    fileListFragment.listDirectory(currentDir,
-                                            MainApp.isOnlyOnDevice(), false);
+                                    fileListFragment.listDirectory(currentDir, MainApp.isOnlyOnDevice(), false);
                                 }
                             }
                             setFile(currentFile);
@@ -1552,7 +1560,8 @@ public class FileDisplayActivity extends HookActivity
             // a new chance to get the mDownloadBinder through
             // getFileDownloadBinder() - THIS IS A MESS
             OCFileListFragment listOfFiles = getListOfFilesFragment();
-            if (listOfFiles != null) {
+            if (listOfFiles != null && (getIntent() == null ||
+                    (getIntent() != null && getIntent().getParcelableExtra(EXTRA_FILE) == null))) {
                 listOfFiles.listDirectory(MainApp.isOnlyOnDevice(), false);
             }
             FileFragment secondFragment = getSecondFragment();

+ 17 - 4
src/main/java/com/owncloud/android/ui/adapter/ActivityListAdapter.java

@@ -1,4 +1,4 @@
-/**
+/*
  * Nextcloud Android client application
  *
  * @author Alejandro Bautista
@@ -45,11 +45,13 @@ import com.bumptech.glide.load.resource.file.FileToStreamDecoder;
 import com.caverock.androidsvg.SVG;
 import com.owncloud.android.MainApp;
 import com.owncloud.android.R;
+import com.owncloud.android.datamodel.FileDataStorageManager;
 import com.owncloud.android.datamodel.OCFile;
 import com.owncloud.android.lib.common.OwnCloudClient;
 import com.owncloud.android.lib.resources.activities.models.Activity;
 import com.owncloud.android.lib.resources.activities.models.RichElement;
 import com.owncloud.android.lib.resources.activities.models.RichObject;
+import com.owncloud.android.lib.resources.files.FileUtils;
 import com.owncloud.android.ui.interfaces.ActivityListInterface;
 import com.owncloud.android.utils.DisplayUtils;
 import com.owncloud.android.utils.MimeTypeUtil;
@@ -76,12 +78,15 @@ public class ActivityListAdapter extends RecyclerView.Adapter<RecyclerView.ViewH
     private OwnCloudClient mClient;
 
     private Context context;
+    private FileDataStorageManager storageManager;
     private List<Object> mValues;
 
-    public ActivityListAdapter(Context context, ActivityListInterface activityListInterface) {
+    public ActivityListAdapter(Context context, ActivityListInterface activityListInterface,
+                               FileDataStorageManager storageManager) {
         this.mValues = new ArrayList<>();
         this.context = context;
         this.activityListInterface = activityListInterface;
+        this.storageManager = storageManager;
         px = getThumbnailDimension();
     }
 
@@ -200,8 +205,16 @@ public class ActivityListAdapter extends RecyclerView.Adapter<RecyclerView.ViewH
     }
 
     private ImageView createThumbnail(final RichObject richObject) {
-        OCFile file = new OCFile("/" + richObject.getPath());
-        file.setRemoteId(richObject.getId());
+        String path = FileUtils.PATH_SEPARATOR + richObject.getPath();
+        OCFile file = storageManager.getFileByPath(path);
+
+        if (file == null) {
+            file = storageManager.getFileByPath(path + FileUtils.PATH_SEPARATOR);
+        }
+        if (file == null) {
+            file = new OCFile(path);
+            file.setRemoteId(richObject.getId());
+        }
 
         LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(px, px);
         params.setMargins(10, 10, 10, 10);