|
@@ -3,8 +3,11 @@
|
|
|
*
|
|
|
* @author David A. Velasco
|
|
|
* @author Andy Scherzinger
|
|
|
+ * @author Álvaro Brey
|
|
|
* Copyright (C) 2015 ownCloud Inc.
|
|
|
* Copyright (C) 2018 Andy Scherzinger
|
|
|
+ * Copyright (C) 2022 Álvaro Brey Vilas
|
|
|
+ * Copyright (C) 2022 Nextcloud GmbH
|
|
|
*
|
|
|
* This program is free software: you can redistribute it and/or modify
|
|
|
* it under the terms of the GNU General Public License version 2,
|
|
@@ -22,21 +25,17 @@
|
|
|
package com.owncloud.android.files;
|
|
|
|
|
|
import android.accounts.AccountManager;
|
|
|
-import android.content.ContentResolver;
|
|
|
import android.content.Context;
|
|
|
import android.view.Menu;
|
|
|
-import android.view.MenuItem;
|
|
|
|
|
|
-import com.google.gson.Gson;
|
|
|
import com.nextcloud.android.files.FileLockingHelper;
|
|
|
import com.nextcloud.client.account.User;
|
|
|
+import com.nextcloud.utils.EditorUtils;
|
|
|
import com.owncloud.android.R;
|
|
|
-import com.owncloud.android.datamodel.ArbitraryDataProvider;
|
|
|
+import com.owncloud.android.datamodel.FileDataStorageManager;
|
|
|
import com.owncloud.android.datamodel.OCFile;
|
|
|
import com.owncloud.android.files.services.FileDownloader.FileDownloaderBinder;
|
|
|
import com.owncloud.android.files.services.FileUploader.FileUploaderBinder;
|
|
|
-import com.owncloud.android.lib.common.DirectEditing;
|
|
|
-import com.owncloud.android.lib.common.Editor;
|
|
|
import com.owncloud.android.lib.resources.status.OCCapability;
|
|
|
import com.owncloud.android.services.OperationsService.OperationsServiceBinder;
|
|
|
import com.owncloud.android.ui.activity.ComponentsGetter;
|
|
@@ -49,7 +48,9 @@ import java.util.Collections;
|
|
|
import java.util.Iterator;
|
|
|
import java.util.List;
|
|
|
|
|
|
-import androidx.annotation.Nullable;
|
|
|
+import javax.inject.Inject;
|
|
|
+
|
|
|
+import androidx.annotation.IdRes;
|
|
|
|
|
|
/**
|
|
|
* Filters out the file actions available in a given {@link Menu} for a given {@link OCFile}
|
|
@@ -68,24 +69,54 @@ public class FileMenuFilter {
|
|
|
private final boolean overflowMenu;
|
|
|
private final User user;
|
|
|
private final String userId;
|
|
|
-
|
|
|
- /**
|
|
|
- * Constructor
|
|
|
- *
|
|
|
- * @param numberOfAllFiles Number of all displayed files
|
|
|
- * @param files Collection of {@link OCFile} file targets of the action to filter in the {@link Menu}.
|
|
|
- * @param componentsGetter Accessor to app components, needed to access synchronization services
|
|
|
- * @param context Android {@link Context}, needed to access build setup resources.
|
|
|
- * @param overflowMenu true if the overflow menu items are being filtered
|
|
|
- * @param user currently active user
|
|
|
- */
|
|
|
- public FileMenuFilter(int numberOfAllFiles,
|
|
|
- Collection<OCFile> files,
|
|
|
- ComponentsGetter componentsGetter,
|
|
|
- Context context,
|
|
|
- boolean overflowMenu,
|
|
|
- User user
|
|
|
- ) {
|
|
|
+ private final FileDataStorageManager storageManager;
|
|
|
+ private final EditorUtils editorUtils;
|
|
|
+
|
|
|
+
|
|
|
+ public static class Factory {
|
|
|
+ private final FileDataStorageManager storageManager;
|
|
|
+ private final Context context;
|
|
|
+ private final EditorUtils editorUtils;
|
|
|
+
|
|
|
+ @Inject
|
|
|
+ public Factory(final FileDataStorageManager storageManager, final Context context, final EditorUtils editorUtils) {
|
|
|
+ this.storageManager = storageManager;
|
|
|
+ this.context = context;
|
|
|
+ this.editorUtils = editorUtils;
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * @param numberOfAllFiles Number of all displayed files
|
|
|
+ * @param files Collection of {@link OCFile} file targets of the action to filter in the {@link Menu}.
|
|
|
+ * @param componentsGetter Accessor to app components, needed to access synchronization services
|
|
|
+ * @param overflowMenu true if the overflow menu items are being filtered
|
|
|
+ * @param user currently active user
|
|
|
+ */
|
|
|
+ public FileMenuFilter newInstance(final int numberOfAllFiles, final Collection<OCFile> files, final ComponentsGetter componentsGetter, boolean overflowMenu, User user) {
|
|
|
+ return new FileMenuFilter(storageManager, editorUtils, numberOfAllFiles, files, componentsGetter, context, overflowMenu, user);
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * @param file {@link OCFile} file target
|
|
|
+ * @param componentsGetter Accessor to app components, needed to access synchronization services
|
|
|
+ * @param overflowMenu true if the overflow menu items are being filtered
|
|
|
+ * @param user currently active user
|
|
|
+ */
|
|
|
+ public FileMenuFilter newInstance(final OCFile file, final ComponentsGetter componentsGetter, boolean overflowMenu, User user) {
|
|
|
+ return newInstance(1, Collections.singletonList(file), componentsGetter, overflowMenu, user);
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+ private FileMenuFilter(FileDataStorageManager storageManager, EditorUtils editorUtils, int numberOfAllFiles,
|
|
|
+ Collection<OCFile> files,
|
|
|
+ ComponentsGetter componentsGetter,
|
|
|
+ Context context,
|
|
|
+ boolean overflowMenu,
|
|
|
+ User user
|
|
|
+ ) {
|
|
|
+ this.storageManager = storageManager;
|
|
|
+ this.editorUtils = editorUtils;
|
|
|
this.numberOfAllFiles = numberOfAllFiles;
|
|
|
this.files = files;
|
|
|
this.componentsGetter = componentsGetter;
|
|
@@ -99,147 +130,66 @@ public class FileMenuFilter {
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
- * Constructor
|
|
|
- *
|
|
|
- * @param file {@link OCFile} target of the action to filter in the {@link Menu}.
|
|
|
- * @param componentsGetter Accessor to app components, needed to access synchronization services
|
|
|
- * @param context Android {@link Context}, needed to access build setup resources.
|
|
|
- * @param overflowMenu true if the overflow menu items are being filtered
|
|
|
- * @param user currently active user
|
|
|
- */
|
|
|
- public FileMenuFilter(OCFile file,
|
|
|
- ComponentsGetter componentsGetter,
|
|
|
- Context context,
|
|
|
- boolean overflowMenu,
|
|
|
- User user
|
|
|
- ) {
|
|
|
- this(1, Collections.singletonList(file), componentsGetter, context, overflowMenu, user);
|
|
|
- }
|
|
|
-
|
|
|
- /**
|
|
|
- * Filters out the file actions available in the passed {@link Menu} taken into account the state of the {@link
|
|
|
- * OCFile} held by the filter.
|
|
|
- *
|
|
|
- * @param menu Options or context menu to filter.
|
|
|
- * @param inSingleFileFragment True if this is not listing, but single file fragment, like preview or details.
|
|
|
+ * List of actions to remove given the parameters supplied in the constructor
|
|
|
*/
|
|
|
- public void filter(Menu menu, boolean inSingleFileFragment) {
|
|
|
- if (files == null || files.isEmpty()) {
|
|
|
- hideAll(menu);
|
|
|
- } else {
|
|
|
- List<Integer> toShow = new ArrayList<>();
|
|
|
- List<Integer> toHide = new ArrayList<>();
|
|
|
-
|
|
|
- filter(toShow, toHide, inSingleFileFragment);
|
|
|
-
|
|
|
- for (int i : toShow) {
|
|
|
- final MenuItem item = menu.findItem(i);
|
|
|
- if (item != null) {
|
|
|
- showMenuItem(item);
|
|
|
- } else {
|
|
|
- // group
|
|
|
- menu.setGroupVisible(i, true);
|
|
|
- }
|
|
|
- }
|
|
|
-
|
|
|
- for (int i : toHide) {
|
|
|
- final MenuItem item = menu.findItem(i);
|
|
|
- if (item != null) {
|
|
|
- hideMenuItem(item);
|
|
|
- } else {
|
|
|
- // group
|
|
|
- menu.setGroupVisible(i, false);
|
|
|
- }
|
|
|
- }
|
|
|
- }
|
|
|
- }
|
|
|
-
|
|
|
- public static void hideAll(Menu menu) {
|
|
|
- if (menu != null) {
|
|
|
- for (int i = 0; i < menu.size(); i++) {
|
|
|
- hideMenuItem(menu.getItem(i));
|
|
|
- }
|
|
|
- }
|
|
|
- }
|
|
|
-
|
|
|
- /**
|
|
|
- * hides a given {@link MenuItem}.
|
|
|
- *
|
|
|
- * @param item the {@link MenuItem} to be hidden
|
|
|
- */
|
|
|
- public static void hideMenuItem(MenuItem item) {
|
|
|
- if (item != null) {
|
|
|
- item.setVisible(false);
|
|
|
- item.setEnabled(false);
|
|
|
+ @IdRes
|
|
|
+ public List<Integer> getToHide(final boolean inSingleFileFragment){
|
|
|
+ if(files != null && ! files.isEmpty()){
|
|
|
+ return filter(inSingleFileFragment);
|
|
|
}
|
|
|
+ return null;
|
|
|
}
|
|
|
|
|
|
- private static void showMenuItem(MenuItem item) {
|
|
|
- if (item != null) {
|
|
|
- item.setVisible(true);
|
|
|
- item.setEnabled(true);
|
|
|
- }
|
|
|
- }
|
|
|
-
|
|
|
- public static void hideMenuItems(MenuItem... items) {
|
|
|
- if (items != null) {
|
|
|
- for (MenuItem item : items) {
|
|
|
- hideMenuItem(item);
|
|
|
- }
|
|
|
- }
|
|
|
- }
|
|
|
|
|
|
/**
|
|
|
* Decides what actions must be shown and hidden implementing the different rule sets.
|
|
|
- * @param toShow List to save the options that must be shown in the menu.
|
|
|
- * @param toHide List to save the options that must be shown in the menu.
|
|
|
- * @param inSingleFileFragment True if this is not listing, but single file fragment, like preview or details.
|
|
|
+ *
|
|
|
+ * @param inSingleFileFragment True if this is not listing, but single file fragment, like preview or details.
|
|
|
*/
|
|
|
- private void filter(List<Integer> toShow,
|
|
|
- List<Integer> toHide,
|
|
|
- boolean inSingleFileFragment) {
|
|
|
+ private List<Integer> filter(boolean inSingleFileFragment) {
|
|
|
boolean synchronizing = anyFileSynchronizing();
|
|
|
- OCCapability capability = componentsGetter.getStorageManager().getCapability(user.getAccountName());
|
|
|
+ OCCapability capability = storageManager.getCapability(user.getAccountName());
|
|
|
boolean endToEndEncryptionEnabled = capability.getEndToEndEncryption().isTrue();
|
|
|
boolean fileLockingEnabled = capability.getFilesLockingVersion() != null;
|
|
|
|
|
|
- filterEdit(toShow, toHide, capability);
|
|
|
- filterDownload(toShow, toHide, synchronizing);
|
|
|
- filterExport(toShow, toHide);
|
|
|
- filterRename(toShow, toHide, synchronizing);
|
|
|
- filterCopy(toShow, toHide, synchronizing);
|
|
|
- filterMove(toShow, toHide, synchronizing);
|
|
|
- filterRemove(toShow, toHide, synchronizing);
|
|
|
- filterSelectAll(toShow, toHide, inSingleFileFragment);
|
|
|
- filterDeselectAll(toShow, toHide, inSingleFileFragment);
|
|
|
- filterOpenWith(toShow, toHide, synchronizing);
|
|
|
- filterCancelSync(toShow, toHide, synchronizing);
|
|
|
- filterSync(toShow, toHide, synchronizing);
|
|
|
- filterShareFile(toShow, toHide, capability);
|
|
|
- filterSendFiles(toShow, toHide, inSingleFileFragment);
|
|
|
- filterDetails(toShow, toHide);
|
|
|
- filterFavorite(toShow, toHide, synchronizing);
|
|
|
- filterUnfavorite(toShow, toHide, synchronizing);
|
|
|
- filterEncrypt(toShow, toHide, endToEndEncryptionEnabled);
|
|
|
- filterUnsetEncrypted(toShow, toHide, endToEndEncryptionEnabled);
|
|
|
- filterSetPictureAs(toShow, toHide);
|
|
|
- filterStream(toShow, toHide);
|
|
|
- filterLock(toShow, toHide, fileLockingEnabled);
|
|
|
- filterUnlock(toShow, toHide, fileLockingEnabled);
|
|
|
- filterLockInfo(toShow, toHide, fileLockingEnabled);
|
|
|
- }
|
|
|
-
|
|
|
- private void filterShareFile(List<Integer> toShow, List<Integer> toHide, OCCapability capability) {
|
|
|
+ @IdRes final List<Integer> toHide = new ArrayList<>();
|
|
|
+
|
|
|
+ filterEdit(toHide, capability);
|
|
|
+ filterDownload(toHide, synchronizing);
|
|
|
+ filterExport(toHide);
|
|
|
+ filterRename(toHide, synchronizing);
|
|
|
+ filterCopy(toHide, synchronizing);
|
|
|
+ filterMove(toHide, synchronizing);
|
|
|
+ filterRemove(toHide, synchronizing);
|
|
|
+ filterSelectAll(toHide, inSingleFileFragment);
|
|
|
+ filterDeselectAll(toHide, inSingleFileFragment);
|
|
|
+ filterOpenWith(toHide, synchronizing);
|
|
|
+ filterCancelSync(toHide, synchronizing);
|
|
|
+ filterSync(toHide, synchronizing);
|
|
|
+ filterShareFile(toHide, capability);
|
|
|
+ filterSendFiles(toHide, inSingleFileFragment);
|
|
|
+ filterDetails(toHide);
|
|
|
+ filterFavorite(toHide, synchronizing);
|
|
|
+ filterUnfavorite(toHide, synchronizing);
|
|
|
+ filterEncrypt(toHide, endToEndEncryptionEnabled);
|
|
|
+ filterUnsetEncrypted(toHide, endToEndEncryptionEnabled);
|
|
|
+ filterSetPictureAs(toHide);
|
|
|
+ filterStream(toHide);
|
|
|
+ filterLock(toHide, fileLockingEnabled);
|
|
|
+ filterUnlock(toHide, fileLockingEnabled);
|
|
|
+
|
|
|
+ return toHide;
|
|
|
+ }
|
|
|
+
|
|
|
+ private void filterShareFile(List<Integer> toHide, OCCapability capability) {
|
|
|
if (containsEncryptedFile() || (!isShareViaLinkAllowed() && !isShareWithUsersAllowed()) ||
|
|
|
!isSingleSelection() || !isShareApiEnabled(capability) || !files.iterator().next().canReshare()
|
|
|
|| overflowMenu) {
|
|
|
toHide.add(R.id.action_send_share_file);
|
|
|
- } else {
|
|
|
- toShow.add(R.id.action_send_share_file);
|
|
|
}
|
|
|
}
|
|
|
|
|
|
- private void filterSendFiles(List<Integer> toShow, List<Integer> toHide, boolean inSingleFileFragment) {
|
|
|
+ private void filterSendFiles(List<Integer> toHide, boolean inSingleFileFragment) {
|
|
|
boolean show = true;
|
|
|
if (overflowMenu || SEND_OFF.equalsIgnoreCase(context.getString(R.string.send_files_to_other_apps)) || containsEncryptedFile()) {
|
|
|
show = false;
|
|
@@ -247,106 +197,75 @@ public class FileMenuFilter {
|
|
|
if (!inSingleFileFragment && (isSingleSelection() || !anyFileDown())) {
|
|
|
show = false;
|
|
|
}
|
|
|
- if (show) {
|
|
|
- toShow.add(R.id.action_send_file);
|
|
|
- } else {
|
|
|
+ if (!show) {
|
|
|
toHide.add(R.id.action_send_file);
|
|
|
}
|
|
|
}
|
|
|
|
|
|
- private void filterDetails(Collection<Integer> toShow, Collection<Integer> toHide) {
|
|
|
- if (isSingleSelection()) {
|
|
|
- toShow.add(R.id.action_see_details);
|
|
|
- } else {
|
|
|
+ private void filterDetails(Collection<Integer> toHide) {
|
|
|
+ if (!isSingleSelection()) {
|
|
|
toHide.add(R.id.action_see_details);
|
|
|
}
|
|
|
}
|
|
|
|
|
|
- private void filterFavorite(List<Integer> toShow, List<Integer> toHide, boolean synchronizing) {
|
|
|
+ private void filterFavorite(List<Integer> toHide, boolean synchronizing) {
|
|
|
if (files.isEmpty() || synchronizing || allFavorites()) {
|
|
|
toHide.add(R.id.action_favorite);
|
|
|
- } else {
|
|
|
- toShow.add(R.id.action_favorite);
|
|
|
}
|
|
|
}
|
|
|
|
|
|
- private void filterUnfavorite(List<Integer> toShow, List<Integer> toHide, boolean synchronizing) {
|
|
|
+ private void filterUnfavorite(List<Integer> toHide, boolean synchronizing) {
|
|
|
if (files.isEmpty() || synchronizing || allNotFavorites()) {
|
|
|
toHide.add(R.id.action_unset_favorite);
|
|
|
- } else {
|
|
|
- toShow.add(R.id.action_unset_favorite);
|
|
|
}
|
|
|
}
|
|
|
|
|
|
- private void filterLock(List<Integer> toShow, List<Integer> toHide, boolean fileLockingEnabled) {
|
|
|
+ private void filterLock(List<Integer> toHide, boolean fileLockingEnabled) {
|
|
|
if (files.isEmpty() || !isSingleSelection() || !fileLockingEnabled) {
|
|
|
toHide.add(R.id.action_lock_file);
|
|
|
} else {
|
|
|
OCFile file = files.iterator().next();
|
|
|
if (file.isLocked() || file.isFolder()) {
|
|
|
toHide.add(R.id.action_lock_file);
|
|
|
- } else {
|
|
|
- toShow.add(R.id.action_lock_file);
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
|
|
|
- private void filterUnlock(List<Integer> toShow, List<Integer> toHide, boolean fileLockingEnabled) {
|
|
|
+ private void filterUnlock(List<Integer> toHide, boolean fileLockingEnabled) {
|
|
|
if (files.isEmpty() || !isSingleSelection() || !fileLockingEnabled) {
|
|
|
toHide.add(R.id.action_unlock_file);
|
|
|
} else {
|
|
|
OCFile file = files.iterator().next();
|
|
|
- if (FileLockingHelper.canUserUnlockFile(userId, file)) {
|
|
|
- toShow.add(R.id.action_unlock_file);
|
|
|
- } else {
|
|
|
+ if (!FileLockingHelper.canUserUnlockFile(userId, file)) {
|
|
|
toHide.add(R.id.action_unlock_file);
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
|
|
|
- private void filterLockInfo(List<Integer> toShow, List<Integer> toHide, boolean fileLockingEnabled) {
|
|
|
- if (files.isEmpty() || !isSingleSelection() || !fileLockingEnabled) {
|
|
|
- toHide.add(R.id.menu_group_lock_info);
|
|
|
- } else {
|
|
|
- OCFile file = files.iterator().next();
|
|
|
- if (file.isLocked()) {
|
|
|
- toShow.add(R.id.menu_group_lock_info);
|
|
|
- } else {
|
|
|
- toHide.add(R.id.menu_group_lock_info);
|
|
|
- }
|
|
|
- }
|
|
|
- }
|
|
|
-
|
|
|
- private void filterEncrypt(List<Integer> toShow, List<Integer> toHide, boolean endToEndEncryptionEnabled) {
|
|
|
+ private void filterEncrypt(List<Integer> toHide, boolean endToEndEncryptionEnabled) {
|
|
|
if (files.isEmpty() || !isSingleSelection() || isSingleFile() || isEncryptedFolder() || isGroupFolder()
|
|
|
|| !endToEndEncryptionEnabled || !isEmptyFolder()) {
|
|
|
toHide.add(R.id.action_encrypted);
|
|
|
- } else {
|
|
|
- toShow.add(R.id.action_encrypted);
|
|
|
}
|
|
|
}
|
|
|
|
|
|
- private void filterUnsetEncrypted(List<Integer> toShow, List<Integer> toHide, boolean endToEndEncryptionEnabled) {
|
|
|
+ private void filterUnsetEncrypted(List<Integer> toHide, boolean endToEndEncryptionEnabled) {
|
|
|
if (!endToEndEncryptionEnabled || files.isEmpty() || !isSingleSelection() || isSingleFile() || !isEncryptedFolder() || hasEncryptedParent()
|
|
|
|| !isEmptyFolder()) {
|
|
|
toHide.add(R.id.action_unset_encrypted);
|
|
|
- } else {
|
|
|
- toShow.add(R.id.action_unset_encrypted);
|
|
|
}
|
|
|
}
|
|
|
|
|
|
- private void filterSetPictureAs(List<Integer> toShow, List<Integer> toHide) {
|
|
|
- if (isSingleImage() && !MimeTypeUtil.isSVG(files.iterator().next())) {
|
|
|
- toShow.add(R.id.action_set_as_wallpaper);
|
|
|
- } else {
|
|
|
+ private void filterSetPictureAs(List<Integer> toHide) {
|
|
|
+ if (!isSingleImage() || MimeTypeUtil.isSVG(files.iterator().next())) {
|
|
|
toHide.add(R.id.action_set_as_wallpaper);
|
|
|
}
|
|
|
}
|
|
|
|
|
|
- private void filterEdit(List<Integer> toShow,
|
|
|
- List<Integer> toHide,
|
|
|
- OCCapability capability
|
|
|
- ) {
|
|
|
+ private void filterEdit(
|
|
|
+ List<Integer> toHide,
|
|
|
+ OCCapability capability
|
|
|
+ ) {
|
|
|
if (files.iterator().next().isEncrypted()) {
|
|
|
toHide.add(R.id.action_edit);
|
|
|
return;
|
|
@@ -354,44 +273,11 @@ public class FileMenuFilter {
|
|
|
|
|
|
String mimeType = files.iterator().next().getMimeType();
|
|
|
|
|
|
- if (isRichDocumentEditingSupported(capability, mimeType) || isEditorAvailable(context.getContentResolver(),
|
|
|
- user,
|
|
|
- mimeType)) {
|
|
|
- toShow.add(R.id.action_edit);
|
|
|
- } else {
|
|
|
+ if (!isRichDocumentEditingSupported(capability, mimeType) && !editorUtils.isEditorAvailable(user, mimeType)) {
|
|
|
toHide.add(R.id.action_edit);
|
|
|
}
|
|
|
}
|
|
|
|
|
|
- public static boolean isEditorAvailable(ContentResolver contentResolver, User user, String mimeType) {
|
|
|
- return getEditor(contentResolver, user, mimeType) != null;
|
|
|
- }
|
|
|
-
|
|
|
- @Nullable
|
|
|
- public static Editor getEditor(ContentResolver contentResolver, User user, String mimeType) {
|
|
|
- String json = new ArbitraryDataProvider(contentResolver).getValue(user, ArbitraryDataProvider.DIRECT_EDITING);
|
|
|
-
|
|
|
- if (json.isEmpty()) {
|
|
|
- return null;
|
|
|
- }
|
|
|
-
|
|
|
- DirectEditing directEditing = new Gson().fromJson(json, DirectEditing.class);
|
|
|
-
|
|
|
- for (Editor editor : directEditing.getEditors().values()) {
|
|
|
- if (editor.getMimetypes().contains(mimeType)) {
|
|
|
- return editor;
|
|
|
- }
|
|
|
- }
|
|
|
-
|
|
|
- for (Editor editor : directEditing.getEditors().values()) {
|
|
|
- if (editor.getOptionalMimetypes().contains(mimeType)) {
|
|
|
- return editor;
|
|
|
- }
|
|
|
- }
|
|
|
-
|
|
|
- return null;
|
|
|
- }
|
|
|
-
|
|
|
/**
|
|
|
* This will be replaced by unified editor and can be removed once EOL of corresponding server version.
|
|
|
*/
|
|
@@ -403,31 +289,25 @@ public class FileMenuFilter {
|
|
|
capability.getRichDocumentsDirectEditing().isTrue();
|
|
|
}
|
|
|
|
|
|
- private void filterSync(List<Integer> toShow, List<Integer> toHide, boolean synchronizing) {
|
|
|
+ private void filterSync(List<Integer> toHide, boolean synchronizing) {
|
|
|
if (files.isEmpty() || (!anyFileDown() && !containsFolder()) || synchronizing) {
|
|
|
toHide.add(R.id.action_sync_file);
|
|
|
- } else {
|
|
|
- toShow.add(R.id.action_sync_file);
|
|
|
}
|
|
|
}
|
|
|
|
|
|
- private void filterCancelSync(List<Integer> toShow, List<Integer> toHide, boolean synchronizing) {
|
|
|
+ private void filterCancelSync(List<Integer> toHide, boolean synchronizing) {
|
|
|
if (files.isEmpty() || !synchronizing) {
|
|
|
toHide.add(R.id.action_cancel_sync);
|
|
|
- } else {
|
|
|
- toShow.add(R.id.action_cancel_sync);
|
|
|
}
|
|
|
}
|
|
|
|
|
|
- private void filterOpenWith(Collection<Integer> toShow, Collection<Integer> toHide, boolean synchronizing) {
|
|
|
+ private void filterOpenWith(Collection<Integer> toHide, boolean synchronizing) {
|
|
|
if (!isSingleFile() || !anyFileDown() || synchronizing) {
|
|
|
toHide.add(R.id.action_open_file_with);
|
|
|
- } else {
|
|
|
- toShow.add(R.id.action_open_file_with);
|
|
|
}
|
|
|
}
|
|
|
|
|
|
- private void filterDeselectAll(List<Integer> toShow, List<Integer> toHide, boolean inSingleFileFragment) {
|
|
|
+ private void filterDeselectAll(List<Integer> toHide, boolean inSingleFileFragment) {
|
|
|
if (inSingleFileFragment) {
|
|
|
// Always hide in single file fragments
|
|
|
toHide.add(R.id.action_deselect_all_action_menu);
|
|
@@ -435,19 +315,15 @@ public class FileMenuFilter {
|
|
|
// Show only if at least one item is selected.
|
|
|
if (files.isEmpty() || overflowMenu) {
|
|
|
toHide.add(R.id.action_deselect_all_action_menu);
|
|
|
- } else {
|
|
|
- toShow.add(R.id.action_deselect_all_action_menu);
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
|
|
|
- private void filterSelectAll(List<Integer> toShow, List<Integer> toHide, boolean inSingleFileFragment) {
|
|
|
+ private void filterSelectAll(List<Integer> toHide, boolean inSingleFileFragment) {
|
|
|
if (!inSingleFileFragment) {
|
|
|
// Show only if at least one item isn't selected.
|
|
|
if (files.size() >= numberOfAllFiles || overflowMenu) {
|
|
|
toHide.add(R.id.action_select_all_action_menu);
|
|
|
- } else {
|
|
|
- toShow.add(R.id.action_select_all_action_menu);
|
|
|
}
|
|
|
} else {
|
|
|
// Always hide in single file fragments
|
|
@@ -455,60 +331,46 @@ public class FileMenuFilter {
|
|
|
}
|
|
|
}
|
|
|
|
|
|
- private void filterRemove(List<Integer> toShow, List<Integer> toHide, boolean synchronizing) {
|
|
|
+ private void filterRemove(List<Integer> toHide, boolean synchronizing) {
|
|
|
if (files.isEmpty() || synchronizing || containsLockedFile()) {
|
|
|
toHide.add(R.id.action_remove_file);
|
|
|
- } else {
|
|
|
- toShow.add(R.id.action_remove_file);
|
|
|
}
|
|
|
}
|
|
|
|
|
|
- private void filterMove(List<Integer> toShow, List<Integer> toHide, boolean synchronizing) {
|
|
|
+ private void filterMove(List<Integer> toHide, boolean synchronizing) {
|
|
|
if (files.isEmpty() || synchronizing || containsEncryptedFile() || containsEncryptedFolder() || containsLockedFile()) {
|
|
|
toHide.add(R.id.action_move);
|
|
|
- } else {
|
|
|
- toShow.add(R.id.action_move);
|
|
|
}
|
|
|
}
|
|
|
|
|
|
- private void filterCopy(List<Integer> toShow, List<Integer> toHide, boolean synchronizing) {
|
|
|
+ private void filterCopy(List<Integer> toHide, boolean synchronizing) {
|
|
|
if (files.isEmpty() || synchronizing || containsEncryptedFile() || containsEncryptedFolder()) {
|
|
|
toHide.add(R.id.action_copy);
|
|
|
- } else {
|
|
|
- toShow.add(R.id.action_copy);
|
|
|
}
|
|
|
}
|
|
|
|
|
|
|
|
|
- private void filterRename(Collection<Integer> toShow, Collection<Integer> toHide, boolean synchronizing) {
|
|
|
+ private void filterRename(Collection<Integer> toHide, boolean synchronizing) {
|
|
|
if (!isSingleSelection() || synchronizing || containsEncryptedFile() || containsEncryptedFolder() || containsLockedFile()) {
|
|
|
toHide.add(R.id.action_rename_file);
|
|
|
- } else {
|
|
|
- toShow.add(R.id.action_rename_file);
|
|
|
}
|
|
|
}
|
|
|
|
|
|
- private void filterDownload(List<Integer> toShow, List<Integer> toHide, boolean synchronizing) {
|
|
|
+ private void filterDownload(List<Integer> toHide, boolean synchronizing) {
|
|
|
if (files.isEmpty() || containsFolder() || anyFileDown() || synchronizing) {
|
|
|
toHide.add(R.id.action_download_file);
|
|
|
- } else {
|
|
|
- toShow.add(R.id.action_download_file);
|
|
|
}
|
|
|
}
|
|
|
|
|
|
- private void filterExport(List<Integer> toShow, List<Integer> toHide) {
|
|
|
+ private void filterExport(List<Integer> toHide) {
|
|
|
if (files.isEmpty() || containsFolder()) {
|
|
|
toHide.add(R.id.action_export_file);
|
|
|
- } else {
|
|
|
- toShow.add(R.id.action_export_file);
|
|
|
}
|
|
|
}
|
|
|
|
|
|
- private void filterStream(List<Integer> toShow, List<Integer> toHide) {
|
|
|
+ private void filterStream(List<Integer> toHide) {
|
|
|
if (files.isEmpty() || !isSingleFile() || !isSingleMedia()) {
|
|
|
toHide.add(R.id.action_stream_media);
|
|
|
- } else {
|
|
|
- toShow.add(R.id.action_stream_media);
|
|
|
}
|
|
|
}
|
|
|
|
|
@@ -594,8 +456,7 @@ public class FileMenuFilter {
|
|
|
if (isSingleSelection()) {
|
|
|
OCFile file = files.iterator().next();
|
|
|
|
|
|
- boolean noChildren = componentsGetter
|
|
|
- .getStorageManager()
|
|
|
+ boolean noChildren = storageManager
|
|
|
.getFolderContent(file, false).size() == EMPTY_FILE_LENGTH;
|
|
|
|
|
|
return file.isFolder() && file.getFileLength() == EMPTY_FILE_LENGTH && noChildren;
|
|
@@ -610,7 +471,7 @@ public class FileMenuFilter {
|
|
|
|
|
|
private boolean hasEncryptedParent() {
|
|
|
OCFile folder = files.iterator().next();
|
|
|
- OCFile parent = componentsGetter.getStorageManager().getFileById(folder.getParentId());
|
|
|
+ OCFile parent = storageManager.getFileById(folder.getParentId());
|
|
|
|
|
|
return parent != null && parent.isEncrypted();
|
|
|
}
|