瀏覽代碼

Implementation of folder uploads

Signed-off-by: Lucas Haug <fuermhandy@gmail.com>
Lucas Haug 4 年之前
父節點
當前提交
1e3ea9e74c

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

@@ -117,6 +117,7 @@ import com.owncloud.android.utils.FileSortOrder;
 import com.owncloud.android.utils.MimeTypeUtil;
 import com.owncloud.android.utils.PermissionUtil;
 import com.owncloud.android.utils.PushUtils;
+import com.owncloud.android.utils.StringUtils;
 import com.owncloud.android.utils.theme.ThemeButtonUtils;
 import com.owncloud.android.utils.theme.ThemeSnackbarUtils;
 import com.owncloud.android.utils.theme.ThemeToolbarUtils;
@@ -127,6 +128,7 @@ import org.greenrobot.eventbus.ThreadMode;
 import org.parceler.Parcels;
 
 import java.io.File;
+import java.net.URI;
 import java.util.ArrayList;
 import java.util.Collection;
 import java.util.List;
@@ -907,7 +909,8 @@ public class FileDisplayActivity extends FileActivity
                             return;
                         }
 
-                        requestUploadOfFilesFromFileSystem(new String[]{renamedFile.getAbsolutePath()},
+                        requestUploadOfFilesFromFileSystem(renamedFile.getParentFile().getAbsolutePath(),
+                                                           new String[]{renamedFile.getAbsolutePath()},
                                                            FileUploader.LOCAL_BEHAVIOUR_DELETE);
                     }
                 }
@@ -951,15 +954,21 @@ public class FileDisplayActivity extends FileActivity
 
     private void requestUploadOfFilesFromFileSystem(Intent data, int resultCode) {
         String[] filePaths = data.getStringArrayExtra(UploadFilesActivity.EXTRA_CHOSEN_FILES);
-        requestUploadOfFilesFromFileSystem(filePaths, resultCode);
+        String basePath = data.getStringExtra(UploadFilesActivity.LOCAL_BASE_PATH);
+        requestUploadOfFilesFromFileSystem(basePath, filePaths, resultCode);
     }
 
-    private void requestUploadOfFilesFromFileSystem(String[] filePaths, int resultCode) {
+    private void requestUploadOfFilesFromFileSystem(String localBasePath, String[] filePaths, int resultCode) {
         if (filePaths != null) {
+            if (!localBasePath.endsWith("/")) {
+                localBasePath = localBasePath + "/";
+            }
+
             String[] remotePaths = new String[filePaths.length];
             String remotePathBase = getCurrentDir().getRemotePath();
             for (int j = 0; j < remotePaths.length; j++) {
-                remotePaths[j] = remotePathBase + (new File(filePaths[j])).getName();
+                String relativePath = StringUtils.removePrefix(filePaths[j], localBasePath);
+                remotePaths[j] = remotePathBase + relativePath;
             }
 
             int behaviour;
@@ -988,7 +997,7 @@ public class FileDisplayActivity extends FileActivity
                 remotePaths,
                 null,           // MIME type will be detected from file name
                 behaviour,
-                false,          // do not create parent folder if not existent
+                true,
                 UploadFileOperation.CREATED_BY_USER,
                 false,
                 false,

+ 2 - 0
src/main/java/com/owncloud/android/ui/activity/UploadFilesActivity.java

@@ -82,6 +82,7 @@ public class UploadFilesActivity extends DrawerActivity implements LocalFileList
 
     private static final String KEY_ALL_SELECTED = UploadFilesActivity.class.getCanonicalName() + ".KEY_ALL_SELECTED";
     public final static String KEY_LOCAL_FOLDER_PICKER_MODE = UploadFilesActivity.class.getCanonicalName() + ".LOCAL_FOLDER_PICKER_MODE";
+    public static final String LOCAL_BASE_PATH = UploadFilesActivity.class.getCanonicalName() + ".LOCAL_BASE_PATH";
     public static final String EXTRA_CHOSEN_FILES = UploadFilesActivity.class.getCanonicalName() + ".EXTRA_CHOSEN_FILES";
     public static final String KEY_DIRECTORY_PATH = UploadFilesActivity.class.getCanonicalName() + ".KEY_DIRECTORY_PATH";
 
@@ -454,6 +455,7 @@ public class UploadFilesActivity extends DrawerActivity implements LocalFileList
                 preferences.setUploaderBehaviour(FileUploader.LOCAL_BEHAVIOUR_DELETE);
             } else {
                 data.putExtra(EXTRA_CHOSEN_FILES, mFileListFragment.getCheckedFilePaths());
+                data.putExtra(LOCAL_BASE_PATH, mCurrentDir.getAbsolutePath());
 
                 // set result code
                 switch (mBehaviourSpinner.getSelectedItemPosition()) {

+ 20 - 18
src/main/java/com/owncloud/android/ui/adapter/LocalFileListAdapter.java

@@ -44,6 +44,7 @@ import com.owncloud.android.utils.theme.ThemeDrawableUtils;
 import java.io.File;
 import java.util.ArrayList;
 import java.util.Arrays;
+import java.util.Collection;
 import java.util.HashSet;
 import java.util.List;
 import java.util.Locale;
@@ -101,14 +102,7 @@ public class LocalFileListAdapter extends RecyclerView.Adapter<RecyclerView.View
     }
 
     public void addAllFilesToCheckedFiles() {
-        for (File file : mFiles) {
-
-            // only select files
-            if (file.isFile()) {
-                checkedFiles.add(file);
-            }
-
-        }
+        checkedFiles.addAll(mFiles);
     }
 
     public void removeAllFilesFromCheckedFiles() {
@@ -120,17 +114,27 @@ public class LocalFileListAdapter extends RecyclerView.Adapter<RecyclerView.View
     }
 
     public String[] getCheckedFilesPath() {
-        List<String> result = new ArrayList<>();
-
-        for (File file : checkedFiles) {
-            result.add(file.getAbsolutePath());
-        }
+        List<String> result = listFilesRecursive(checkedFiles);
 
         Log_OC.d(TAG, "Returning " + result.size() + " selected files");
 
         return result.toArray(new String[0]);
     }
 
+    public List<String> listFilesRecursive(Collection<File> files) {
+        List<String> result = new ArrayList<>();
+
+        for (File file : files) {
+            if (file.isDirectory()) {
+                result.addAll(listFilesRecursive(getFiles(file)));
+            } else {
+                result.add(file.getAbsolutePath());
+            }
+        }
+
+        return result;
+    }
+
     @Override
     public long getItemId(int position) {
         return mFiles.size() <= position ? position : -1;
@@ -164,15 +168,13 @@ public class LocalFileListAdapter extends RecyclerView.Adapter<RecyclerView.View
                 gridViewHolder.thumbnail.setTag(file.hashCode());
                 setThumbnail(file, gridViewHolder.thumbnail, mContext);
 
-                if (file.isDirectory()) {
-                    gridViewHolder.checkbox.setVisibility(View.GONE);
-                } else {
-                    gridViewHolder.checkbox.setVisibility(View.VISIBLE);
-                }
+                gridViewHolder.checkbox.setVisibility(View.VISIBLE);
 
                 File finalFile = file;
                 gridViewHolder.itemLayout.setOnClickListener(v -> localFileListFragmentInterface
                         .onItemClicked(finalFile));
+                gridViewHolder.checkbox.setOnClickListener(v -> localFileListFragmentInterface
+                        .onItemCheckboxClicked(finalFile));
 
 
                 if (holder instanceof LocalFileListItemViewHolder) {

+ 22 - 12
src/main/java/com/owncloud/android/ui/fragment/LocalFileListFragment.java

@@ -164,7 +164,8 @@ public class LocalFileListFragment extends ExtendedListFragment implements
     }
 
     /**
-     * Checks the file clicked over. Browses inside if it is a directory.
+     * Checks the file clicked over. Browses inside if it is a directory. Otherwise behaves like the checkbox was
+     * clicked.
      * Notifies the container activity in any case.
      */
     @Override
@@ -180,21 +181,30 @@ public class LocalFileListFragment extends ExtendedListFragment implements
                 // save index and top position
                 saveIndexAndTopPosition(mAdapter.getItemPosition(file));
 
-            } else {    /// Click on a file
-                if (mAdapter.isCheckedFile(file)) {
-                    // uncheck
-                    mAdapter.removeCheckedFile(file);
-                } else {
-                    // check
-                    mAdapter.addCheckedFile(file);
-                }
+            } else {    /// Click on a file, behave like checkbox was clicked
+                onItemCheckboxClicked(file);
+            }
 
-                mAdapter.notifyItemChanged(mAdapter.getItemPosition(file));
+        } else {
+            Log_OC.w(TAG, "Null object in ListAdapter!!");
+        }
+    }
 
-                // notify the change to the container Activity
-                mContainerActivity.onFileClick(file);
+    @Override
+    public void onItemCheckboxClicked(File file) {
+        if (file != null) {
+            if (mAdapter.isCheckedFile(file)) {
+                // uncheck
+                mAdapter.removeCheckedFile(file);
+            } else {
+                // check
+                mAdapter.addCheckedFile(file);
             }
 
+            mAdapter.notifyItemChanged(mAdapter.getItemPosition(file));
+
+            // notify the change to the container Activity
+            mContainerActivity.onFileClick(file);
         } else {
             Log_OC.w(TAG, "Null object in ListAdapter!!");
         }

+ 1 - 0
src/main/java/com/owncloud/android/ui/interfaces/LocalFileListFragmentInterface.java

@@ -31,4 +31,5 @@ import java.io.File;
 public interface LocalFileListFragmentInterface {
     int getColumnsCount();
     void onItemClicked(File file);
+    void onItemCheckboxClicked(File file);
 }

+ 9 - 0
src/main/java/com/owncloud/android/utils/StringUtils.java

@@ -68,4 +68,13 @@ public final class StringUtils {
             return "";
         }
     }
+
+    public static
+    @NonNull String removePrefix(@NonNull String s, @NonNull String prefix)
+    {
+        if (s.startsWith(prefix)){
+            return s.substring(prefix.length());
+        }
+        return s;
+    }
 }