ソースを参照

Merge pull request #10558 from nextcloud/doNotUploadFolderWhenEncryption

When uploading files to an encrypted folder do not allow to upload entire folders
Álvaro Brey 2 年 前
コミット
b30b8ebf1f

+ 16 - 3
app/src/main/java/com/owncloud/android/ui/activity/UploadFilesActivity.java

@@ -90,6 +90,7 @@ public class UploadFilesActivity extends DrawerActivity implements LocalFileList
     public static final int RESULT_OK_AND_DO_NOTHING = 2;
     public static final int RESULT_OK_AND_MOVE = RESULT_FIRST_USER;
     public static final String REQUEST_CODE_KEY = "requestCode";
+    private static final String ENCRYPTED_FOLDER_KEY = "encrypted_folder";
 
     private static final String QUERY_TO_MOVE_DIALOG_TAG = "QUERY_TO_MOVE";
     private static final String TAG = "UploadFilesActivity";
@@ -108,6 +109,7 @@ public class UploadFilesActivity extends DrawerActivity implements LocalFileList
     private Menu mOptionsMenu;
     private SearchView mSearchView;
     private UploadFilesLayoutBinding binding;
+    private boolean isWithinEncryptedFolder = false;
 
 
     @VisibleForTesting
@@ -123,10 +125,14 @@ public class UploadFilesActivity extends DrawerActivity implements LocalFileList
      * @param user        the user for which the upload activity is called
      * @param requestCode If >= 0, this code will be returned in onActivityResult()
      */
-    public static void startUploadActivityForResult(Activity activity, User user, int requestCode) {
+    public static void startUploadActivityForResult(Activity activity,
+                                                    User user,
+                                                    int requestCode,
+                                                    boolean isWithinEncryptedFolder) {
         Intent action = new Intent(activity, UploadFilesActivity.class);
         action.putExtra(EXTRA_USER, user);
         action.putExtra(REQUEST_CODE_KEY, requestCode);
+        action.putExtra(ENCRYPTED_FOLDER_KEY, isWithinEncryptedFolder);
         activity.startActivityForResult(action, requestCode);
     }
 
@@ -140,12 +146,14 @@ public class UploadFilesActivity extends DrawerActivity implements LocalFileList
         if (extras != null) {
             mLocalFolderPickerMode = extras.getBoolean(KEY_LOCAL_FOLDER_PICKER_MODE, false);
             requestCode = (int) extras.get(REQUEST_CODE_KEY);
+            isWithinEncryptedFolder = extras.getBoolean(ENCRYPTED_FOLDER_KEY, false);
         }
 
         if (savedInstanceState != null) {
-            mCurrentDir = new File(savedInstanceState.getString(UploadFilesActivity.KEY_DIRECTORY_PATH,
+            mCurrentDir = new File(savedInstanceState.getString(KEY_DIRECTORY_PATH,
                                                                 Environment.getExternalStorageDirectory().getAbsolutePath()));
-            mSelectAll = savedInstanceState.getBoolean(UploadFilesActivity.KEY_ALL_SELECTED, false);
+            mSelectAll = savedInstanceState.getBoolean(KEY_ALL_SELECTED, false);
+            isWithinEncryptedFolder = savedInstanceState.getBoolean(ENCRYPTED_FOLDER_KEY, false);
         } else {
             String lastUploadFrom = preferences.getUploadFromLocalLastPath();
 
@@ -605,6 +613,11 @@ public class UploadFilesActivity extends DrawerActivity implements LocalFileList
         return mLocalFolderPickerMode;
     }
 
+    @Override
+    public boolean isWithinEncryptedFolder() {
+        return isWithinEncryptedFolder;
+    }
+
     /**
      * Performs corresponding action when user presses 'Cancel' or 'Upload' button
      * <p>

+ 16 - 2
app/src/main/java/com/owncloud/android/ui/adapter/LocalFileListAdapter.java

@@ -73,6 +73,7 @@ public class LocalFileListAdapter extends RecyclerView.Adapter<RecyclerView.View
     private LocalFileListFragmentInterface localFileListFragmentInterface;
     private Set<File> checkedFiles;
     private ViewThemeUtils viewThemeUtils;
+    private boolean isWithinEncryptedFolder;
 
     private static final int VIEWTYPE_ITEM = 0;
     private static final int VIEWTYPE_FOOTER = 1;
@@ -83,13 +84,15 @@ public class LocalFileListAdapter extends RecyclerView.Adapter<RecyclerView.View
                                 LocalFileListFragmentInterface localFileListFragmentInterface,
                                 AppPreferences preferences,
                                 Context context,
-                                final ViewThemeUtils viewThemeUtils) {
+                                final ViewThemeUtils viewThemeUtils,
+                                boolean isWithinEncryptedFolder) {
         this.preferences = preferences;
         mContext = context;
         mLocalFolderPicker = localFolderPickerMode;
         this.localFileListFragmentInterface = localFileListFragmentInterface;
         checkedFiles = new HashSet<>();
         this.viewThemeUtils = viewThemeUtils;
+        this.isWithinEncryptedFolder = isWithinEncryptedFolder;
 
         swapDirectory(directory);
     }
@@ -116,7 +119,15 @@ public class LocalFileListAdapter extends RecyclerView.Adapter<RecyclerView.View
     }
 
     public void addAllFilesToCheckedFiles() {
-        checkedFiles.addAll(mFiles);
+        if (isWithinEncryptedFolder) {
+            for (File file : mFilesAll) {
+                if (file.isFile()) {
+                    checkedFiles.add(file);
+                }
+            }
+        } else {
+            checkedFiles.addAll(mFiles);
+        }
     }
 
     public void removeAllFilesFromCheckedFiles() {
@@ -200,6 +211,9 @@ public class LocalFileListAdapter extends RecyclerView.Adapter<RecyclerView.View
                     if (file.isDirectory()) {
                         itemViewHolder.fileSize.setVisibility(View.GONE);
                         itemViewHolder.fileSeparator.setVisibility(View.GONE);
+                        if (isWithinEncryptedFolder) {
+                            itemViewHolder.checkbox.setVisibility(View.GONE);
+                        }
                     } else {
                         itemViewHolder.fileSize.setVisibility(View.VISIBLE);
                         itemViewHolder.fileSeparator.setVisibility(View.VISIBLE);

+ 5 - 3
app/src/main/java/com/owncloud/android/ui/fragment/LocalFileListFragment.java

@@ -135,7 +135,8 @@ public class LocalFileListFragment extends ExtendedListFragment implements
                                             this,
                                             preferences,
                                             getActivity(),
-                                            viewThemeUtils);
+                                            viewThemeUtils,
+                                            mContainerActivity.isWithinEncryptedFolder());
         setRecyclerViewAdapter(mAdapter);
 
         listDirectory(mContainerActivity.getInitialDirectory());
@@ -424,12 +425,13 @@ public class LocalFileListFragment extends ExtendedListFragment implements
         File getInitialDirectory();
 
         /**
-         * config check if the list should behave in
-         * folder picker mode only displaying folders but no files.
+         * config check if the list should behave in folder picker mode only displaying folders but no files.
          *
          * @return true if folder picker mode, else false
          */
         boolean isFolderPickerMode();
+
+        boolean isWithinEncryptedFolder();
     }
 
 

+ 5 - 4
app/src/main/java/com/owncloud/android/ui/fragment/OCFileListFragment.java

@@ -530,10 +530,11 @@ public class OCFileListFragment extends ExtendedListFragment implements
     @Override
     public void uploadFiles() {
         UploadFilesActivity.startUploadActivityForResult(
-                getActivity(),
-                ((FileActivity) getActivity()).getUser().orElseThrow(RuntimeException::new),
-                FileDisplayActivity.REQUEST_CODE__SELECT_FILES_FROM_FILE_SYSTEM
-        );
+            getActivity(),
+            ((FileActivity) getActivity()).getUser().orElseThrow(RuntimeException::new),
+            FileDisplayActivity.REQUEST_CODE__SELECT_FILES_FROM_FILE_SYSTEM,
+            getCurrentFile().isEncrypted()
+                                                        );
     }
 
     @Override