diff --git a/app/src/main/java/com/nextcloud/ui/fileactions/FileActionHandler.kt b/app/src/main/java/com/nextcloud/ui/fileactions/FileActionHandler.kt new file mode 100644 index 000000000000..5f6a06aac968 --- /dev/null +++ b/app/src/main/java/com/nextcloud/ui/fileactions/FileActionHandler.kt @@ -0,0 +1,148 @@ +/* + * Nextcloud - Android Client + * + * SPDX-FileCopyrightText: 2026 Alper Ozturk + * SPDX-License-Identifier: AGPL-3.0-or-later + */ +package com.nextcloud.ui.fileactions + +import androidx.annotation.IdRes +import com.nextcloud.client.account.UserAccountManager +import com.nextcloud.client.editimage.EditImageActivity +import com.nextcloud.client.jobs.BackgroundJobManager +import com.nextcloud.utils.EditorUtils +import com.nextcloud.utils.ShortcutUtil +import com.nextcloud.utils.extensions.handle +import com.owncloud.android.R +import com.owncloud.android.datamodel.OCFile +import com.owncloud.android.datamodel.SyncedFolderProvider +import com.owncloud.android.ui.activity.TextEditorWebView +import com.owncloud.android.ui.dialog.ConfirmationDialogFragment +import com.owncloud.android.ui.dialog.RemoveFilesDialogFragment +import com.owncloud.android.ui.dialog.RenameFileDialogFragment +import com.owncloud.android.ui.dialog.SyncFileNotEnoughSpaceDialogFragment +import com.owncloud.android.ui.fragment.FileDetailFragment +import com.owncloud.android.ui.helpers.FileOperationsHelper +import com.owncloud.android.utils.FileStorageUtils +import com.owncloud.android.utils.theme.ViewThemeUtils +import javax.inject.Inject + +@Suppress("LongParameterList") +class FileActionHandler @Inject constructor( + private val backgroundJobManager: BackgroundJobManager, + private val accountManager: UserAccountManager, + private val editorUtils: EditorUtils, + private val shortcutUtil: ShortcutUtil, + private val syncedFolderProvider: SyncedFolderProvider, + private val viewThemeUtils: ViewThemeUtils +) { + fun handle(@IdRes itemId: Int, files: Collection, host: FileActionHost): Boolean = + files.isNotEmpty() && if (files.size == 1) { + file(itemId, files.first(), host) + } else { + files(itemId, files, host) + } + + @Suppress("CyclomaticComplexMethod") + private fun file(@IdRes itemId: Int, file: OCFile, host: FileActionHost): Boolean { + when (itemId) { + R.id.action_send_share_file -> host.containerActivity.showDetails(file, SHARING_TAB) + + R.id.action_rename_file -> RenameFileDialogFragment.newInstance(file, host.parentFolder) + .show(host.fragmentManager, FileDetailFragment.FTAG_RENAME_FILE) + + R.id.action_open_in_web_editor -> TextEditorWebView.startTextEditor(file, host.context) + + R.id.action_edit -> edit(file, host) + + R.id.action_download_file, R.id.action_sync_file -> sync(file, host) + + R.id.action_sync_all_files -> syncFolder(file, host) + + R.id.action_pin_to_homescreen -> + shortcutUtil.addShortcutToHomescreen(file, viewThemeUtils, accountManager.user, syncedFolderProvider) + + R.id.action_retry -> backgroundJobManager.startOfflineOperations() + + else -> return host.helper?.handle(itemId, file, host.view) == true || files(itemId, listOf(file), host) + } + + return true + } + + private fun files(@IdRes itemId: Int, files: Collection, host: FileActionHost): Boolean { + when (itemId) { + R.id.action_remove_file -> RemoveFilesDialogFragment.newInstance(ArrayList(files), host.actionMode) + .show(host.fragmentManager, ConfirmationDialogFragment.FTAG_CONFIRMATION) + + R.id.action_cancel_sync -> files.forEach { + host.fda?.cancelTransference(it) + } + + R.id.action_favorite -> setFavorite(files, true, host) + + R.id.action_unset_favorite -> setFavorite(files, false, host) + + else -> return host.helper?.handle(itemId, files, host.view, backgroundJobManager) == true + } + + return true + } + + private fun setFavorite(files: Collection, isFavorite: Boolean, host: FileActionHost) { + host.helper?.toggleFavoriteFiles(files, isFavorite) + host.onFavoriteChanged(isFavorite) + } + + private fun edit(file: OCFile, host: FileActionHost) { + val context = host.context ?: return + when { + editorUtils.isEditorAvailable(accountManager.user, file.mimeType) -> + TextEditorWebView.startTextEditor(file, context) + + EditImageActivity.canBePreviewed(file) -> + host.fda?.startImageEditor(file) + + else -> host.helper?.openFileAsRichDocument(file, context) + } + } + + private fun sync(file: OCFile, host: FileActionHost) { + host.fileActivity?.showSyncLoadingDialog(file.isFolder) + host.helper?.syncFileOrFolder(file) + } + + private fun syncFolder(folder: OCFile, host: FileActionHost) { + if (!FileStorageUtils.checkIfEnoughSpace(folder)) { + SyncFileNotEnoughSpaceDialogFragment + .newInstance(folder, FileOperationsHelper.getAvailableSpaceOnDevice()) + .show(host.fragmentManager, ConfirmationDialogFragment.FTAG_CONFIRMATION) + return + } + + ConfirmationDialogFragment.newInstance( + R.string.sync_all_action_dialog_description, + null, + R.string.sync_all_action_dialog_title, + R.drawable.ic_sync_all, + R.string.common_ok, + R.string.common_cancel, + NO_NEUTRAL_BUTTON + ).run { + isCancelable = false + setOnConfirmationListener(object : ConfirmationDialogFragment.ConfirmationDialogFragmentListener { + override fun onConfirmation(callerTag: String?) { + host.helper?.syncFolderIncludingNestedFiles(folder) + } + override fun onNeutral(callerTag: String?) = Unit + override fun onCancel(callerTag: String?) = Unit + }) + show(host.fragmentManager, ConfirmationDialogFragment.FTAG_CONFIRMATION) + } + } + + companion object { + private const val SHARING_TAB = 1 + private const val NO_NEUTRAL_BUTTON = -1 + } +} diff --git a/app/src/main/java/com/nextcloud/ui/fileactions/FileActionHost.kt b/app/src/main/java/com/nextcloud/ui/fileactions/FileActionHost.kt new file mode 100644 index 000000000000..385a86cc709c --- /dev/null +++ b/app/src/main/java/com/nextcloud/ui/fileactions/FileActionHost.kt @@ -0,0 +1,39 @@ +/* + * Nextcloud - Android Client + * + * SPDX-FileCopyrightText: 2026 Alper Ozturk + * SPDX-License-Identifier: AGPL-3.0-or-later + */ +package com.nextcloud.ui.fileactions + +import android.content.Context +import android.view.ActionMode +import android.view.View +import androidx.fragment.app.FragmentManager +import com.owncloud.android.datamodel.OCFile +import com.owncloud.android.ui.activity.FileActivity +import com.owncloud.android.ui.activity.FileDisplayActivity +import com.owncloud.android.ui.fragment.FileFragment +import com.owncloud.android.ui.helpers.FileOperationsHelper + +@Suppress("LongParameterList") +class FileActionHost @JvmOverloads constructor( + val containerActivity: FileFragment.ContainerActivity, + val fragmentManager: FragmentManager, + val view: View?, + val parentFolder: OCFile?, + val actionMode: ActionMode? = null, + val onFavoriteChanged: (isFavorite: Boolean) -> Unit = {} +) { + val helper: FileOperationsHelper? + get() = containerActivity.fileOperationsHelper + + val fileActivity: FileActivity? + get() = containerActivity as? FileActivity + + val fda: FileDisplayActivity? + get() = containerActivity as? FileDisplayActivity + + val context: Context? + get() = view?.context +} diff --git a/app/src/main/java/com/nextcloud/utils/extensions/FileOperationHelperExtensions.kt b/app/src/main/java/com/nextcloud/utils/extensions/FileOperationHelperExtensions.kt new file mode 100644 index 000000000000..8f5a06143cd1 --- /dev/null +++ b/app/src/main/java/com/nextcloud/utils/extensions/FileOperationHelperExtensions.kt @@ -0,0 +1,46 @@ +/* + * Nextcloud - Android Client + * + * SPDX-FileCopyrightText: 2026 Alper Ozturk + * SPDX-License-Identifier: AGPL-3.0-or-later + */ + +package com.nextcloud.utils.extensions + +import android.view.View +import androidx.annotation.IdRes +import com.nextcloud.client.jobs.BackgroundJobManager +import com.owncloud.android.R +import com.owncloud.android.datamodel.OCFile +import com.owncloud.android.ui.helpers.FileOperationsHelper + +fun FileOperationsHelper.handle(@IdRes itemId: Int, file: OCFile, view: View?): Boolean { + when (itemId) { + R.id.action_send_file -> sendShareFile(file, true) + R.id.action_open_file_with -> openFile(file) + R.id.action_stream_media -> streamMediaFile(file) + R.id.action_set_as_wallpaper -> setPictureAs(file, view) + R.id.action_encrypted -> toggleEncryption(file, true) + R.id.action_unset_encrypted -> toggleEncryption(file, false) + R.id.action_lock_file -> toggleFileLock(file, true) + R.id.action_unlock_file -> toggleFileLock(file, false) + else -> return false + } + + return true +} + +fun FileOperationsHelper.handle( + @IdRes itemId: Int, + files: Collection, + view: View?, + backgroundJobManager: BackgroundJobManager +): Boolean { + when (itemId) { + R.id.action_export_file -> exportFiles(files, view?.context, view, backgroundJobManager) + R.id.action_add_to_album -> addFileToAlbum(files) + else -> return false + } + + return true +} diff --git a/app/src/main/java/com/owncloud/android/ui/fragment/FileDetailFragment.kt b/app/src/main/java/com/owncloud/android/ui/fragment/FileDetailFragment.kt index dce3d8b0b65b..a8ef82de4e1d 100644 --- a/app/src/main/java/com/owncloud/android/ui/fragment/FileDetailFragment.kt +++ b/app/src/main/java/com/owncloud/android/ui/fragment/FileDetailFragment.kt @@ -39,13 +39,14 @@ import com.nextcloud.android.common.ui.theme.utils.ColorRole import com.nextcloud.client.account.User import com.nextcloud.client.di.Injectable import com.nextcloud.client.di.ViewModelFactory -import com.nextcloud.client.jobs.BackgroundJobManager import com.nextcloud.client.jobs.download.FileDownloadHelper import com.nextcloud.client.jobs.upload.FileUploadHelper import com.nextcloud.client.preferences.AppPreferences import com.nextcloud.repository.ClientRepository import com.nextcloud.ui.fileDetail.FileDetailPreview import com.nextcloud.ui.fileactions.FileAction +import com.nextcloud.ui.fileactions.FileActionHandler +import com.nextcloud.ui.fileactions.FileActionHost import com.nextcloud.ui.fileactions.FileActionsBottomSheet import com.nextcloud.ui.tags.TagManagementBottomSheet import com.nextcloud.utils.HumanReadableFormatter @@ -66,13 +67,10 @@ import com.owncloud.android.lib.resources.shares.OCShare import com.owncloud.android.lib.resources.shares.ShareType import com.owncloud.android.lib.resources.tags.Tag import com.owncloud.android.ui.activity.DrawerActivity -import com.owncloud.android.ui.activity.FileActivity import com.owncloud.android.ui.activity.FileDisplayActivity import com.owncloud.android.ui.activity.ToolbarActivity import com.owncloud.android.ui.adapter.FileDetailTabAdapter import com.owncloud.android.ui.adapter.progressListener.DownloadProgressListener -import com.owncloud.android.ui.dialog.RemoveFilesDialogFragment -import com.owncloud.android.ui.dialog.RenameFileDialogFragment import com.owncloud.android.ui.events.FavoriteEvent import com.owncloud.android.ui.fragment.filedetail.FileDetailFragmentViewModel import com.owncloud.android.ui.helpers.FileOperationsHelper @@ -107,7 +105,7 @@ class FileDetailFragment : lateinit var viewThemeUtils: ViewThemeUtils @Inject - lateinit var backgroundJobManager: BackgroundJobManager + lateinit var fileActionHandler: FileActionHandler @Inject lateinit var folderThumbnailGenerator: FolderThumbnailGenerator @@ -460,41 +458,15 @@ class FileDetailFragment : private fun onFileActionSelected(@IdRes itemId: Int) { val file = file ?: return - when (itemId) { - R.id.action_send_file -> fileOperationsHelper?.sendShareFile(file, true) - - R.id.action_open_file_with -> fileOperationsHelper?.openFile(file) - - R.id.action_remove_file -> RemoveFilesDialogFragment.newInstance(file) - .show(parentFragmentManager, FTAG_CONFIRMATION) - - R.id.action_rename_file -> RenameFileDialogFragment.newInstance(file, parentFolder) - .show(parentFragmentManager, FTAG_RENAME_FILE) - - R.id.action_cancel_sync -> (containerActivity as? FileDisplayActivity)?.cancelTransference(file) - - R.id.action_download_file, R.id.action_sync_file -> syncFile(file) - - R.id.action_export_file -> fileOperationsHelper?.exportFiles( - arrayListOf(file), - context, - view, - backgroundJobManager - ) - - R.id.action_set_as_wallpaper -> fileOperationsHelper?.setPictureAs(file, view) - - R.id.action_retry -> backgroundJobManager.startOfflineOperations() - - R.id.action_favorite -> setFavorite(file, true) - - R.id.action_unset_favorite -> setFavorite(file, false) - } - } - - private fun syncFile(file: OCFile) { - (containerActivity as? FileActivity)?.showSyncLoadingDialog(file.isFolder) - fileOperationsHelper?.syncFileOrFolder(file) + val containerActivity = containerActivity ?: return + val host = FileActionHost( + containerActivity, + parentFragmentManager, + view, + parentFolder, + onFavoriteChanged = ::setFavoriteIconStatus + ) + fileActionHandler.handle(itemId, listOf(file), host) } private fun toggleDetailedTimestamp(file: OCFile) { @@ -515,11 +487,6 @@ class FileDetailFragment : // endregion // region Favorite - private fun setFavorite(file: OCFile, isFavorite: Boolean) { - fileOperationsHelper?.toggleFavoriteFile(file, isFavorite) - setFavoriteIconStatus(isFavorite) - } - private fun setFavoriteIconStatus(isFavorite: Boolean) { val binding = binding ?: return val (iconRes, descriptionRes) = if (isFavorite) { @@ -745,7 +712,6 @@ class FileDetailFragment : companion object { private val TAG: String = FileDetailFragment::class.java.simpleName - private const val FTAG_CONFIRMATION = "REMOVE_CONFIRMATION_FRAGMENT" private const val FTAG_FILE_ACTIONS = "actions" private const val FTAG_TAG_MANAGEMENT = "tag_management" const val FTAG_RENAME_FILE = "RENAME_FILE_FRAGMENT" diff --git a/app/src/main/java/com/owncloud/android/ui/fragment/OCFileListFragment.java b/app/src/main/java/com/owncloud/android/ui/fragment/OCFileListFragment.java index e1fdf9a331a5..6e42ac67cd7c 100644 --- a/app/src/main/java/com/owncloud/android/ui/fragment/OCFileListFragment.java +++ b/app/src/main/java/com/owncloud/android/ui/fragment/OCFileListFragment.java @@ -46,18 +46,18 @@ import com.nextcloud.client.di.Injectable; import com.nextcloud.client.documentscan.AppScanOptionalFeature; import com.nextcloud.client.documentscan.DocumentScanActivity; -import com.nextcloud.client.editimage.EditImageActivity; import com.nextcloud.client.jobs.BackgroundJobManager; import com.nextcloud.client.network.ClientFactory; import com.nextcloud.client.systembars.SystemBarBackgroundCallbacks; import com.nextcloud.client.utils.Throttler; import com.nextcloud.common.NextcloudClient; import com.nextcloud.ui.fileactions.FileAction; +import com.nextcloud.ui.fileactions.FileActionHandler; +import com.nextcloud.ui.fileactions.FileActionHost; import com.nextcloud.ui.fileactions.FileActionsBottomSheet; import com.nextcloud.ui.sort.SortOrderUi; import com.nextcloud.utils.AppConstants; import com.nextcloud.utils.EditorUtils; -import com.nextcloud.utils.ShortcutUtil; import com.nextcloud.utils.SnackbarUtil; import com.nextcloud.utils.avatar.AvatarGenerator; import com.nextcloud.utils.e2ee.E2EEActionResolver; @@ -104,8 +104,6 @@ import com.owncloud.android.ui.dialog.ChooseTemplateDialogFragment; import com.owncloud.android.ui.dialog.ConfirmationDialogFragment; import com.owncloud.android.ui.dialog.CreateFolderDialogFragment; -import com.owncloud.android.ui.dialog.RemoveFilesDialogFragment; -import com.owncloud.android.ui.dialog.RenameFileDialogFragment; import com.owncloud.android.ui.dialog.SyncFileNotEnoughSpaceDialogFragment; import com.owncloud.android.ui.events.ChangeMenuEvent; import com.owncloud.android.ui.events.CommentsEvent; @@ -190,6 +188,10 @@ public class OCFileListFragment extends ExtendedListFragment implements private static final String DIALOG_BOTTOM_SHEET = "DIALOG_BOTTOM_SHEET"; private static final int SINGLE_SELECTION = 1; + private static final Set SELECTION_ENDING_ACTIONS = Set.of(R.id.action_export_file, + R.id.action_favorite, + R.id.action_unset_favorite, + R.id.action_add_to_album); private static final int NOT_ENOUGH_SPACE_FRAG_REQUEST_CODE = 2; @Inject ClientFactory clientFactory; @@ -199,8 +201,8 @@ public class OCFileListFragment extends ExtendedListFragment implements @Inject BackgroundJobManager backgroundJobManager; @Inject FastScrollUtils fastScrollUtils; @Inject EditorUtils editorUtils; - @Inject ShortcutUtil shortcutUtil; @Inject SyncedFolderProvider syncedFolderProvider; + @Inject FileActionHandler fileActionHandler; @Inject AppScanOptionalFeature appScanOptionalFeature; @Inject ThumbnailGenerator thumbnailGenerator; @Inject AvatarGenerator avatarGenerator; @@ -1349,110 +1351,48 @@ public boolean onFileActionChosen(@IdRes final int itemId, Set checkedFi return false; } - if (checkedFiles.size() == SINGLE_SELECTION) { - /// action only possible on a single file - OCFile singleFile = checkedFiles.iterator().next(); + if (onListActionChosen(itemId, checkedFiles)) { + return true; + } - if (itemId == R.id.action_send_share_file) { - mContainerActivity.showDetails(singleFile, 1); - return true; - } else if (itemId == R.id.action_open_file_with) { - mContainerActivity.getFileOperationsHelper().openFile(singleFile); - return true; - } else if (itemId == R.id.action_open_in_web_editor) { - TextEditorWebView.Companion.startTextEditor(singleFile, getContext()); - return true; - } else if (itemId == R.id.action_stream_media) { - mContainerActivity.getFileOperationsHelper().streamMediaFile(singleFile); - return true; - } else if (itemId == R.id.action_edit) { - // should not be necessary, as menu item is filtered, but better play safe - if (editorUtils.isEditorAvailable(accountManager.getUser(), singleFile.getMimeType())) { - TextEditorWebView.Companion.startTextEditor(singleFile,getContext()); - } else if (EditImageActivity.Companion.canBePreviewed(singleFile)) { - ((FileDisplayActivity) mContainerActivity).startImageEditor(singleFile); - } else { - mContainerActivity.getFileOperationsHelper().openFileAsRichDocument(singleFile, getContext()); - } + final var host = new FileActionHost(mContainerActivity, + getParentFragmentManager(), + getView(), + mFile, + mActiveActionMode); + final boolean isHandled = fileActionHandler.handle(itemId, checkedFiles, host); + if (isHandled && SELECTION_ENDING_ACTIONS.contains(itemId)) { + exitSelectionMode(); + } - return true; - } else if (itemId == R.id.action_rename_file) { - RenameFileDialogFragment dialog = RenameFileDialogFragment.newInstance(singleFile, mFile); - dialog.show(requireFragmentManager(), FileDetailFragment.FTAG_RENAME_FILE); - return true; - } else if (itemId == R.id.action_see_details) { - if (mActiveActionMode != null) { - mActiveActionMode.finish(); - } + return isHandled; + } - mContainerActivity.showDetails(singleFile); - mContainerActivity.showSortListGroup(false); - return true; - } else if (itemId == R.id.action_set_as_wallpaper) { - mContainerActivity.getFileOperationsHelper().setPictureAs(singleFile, getView()); - return true; - } else if (itemId == R.id.action_encrypted) { - mContainerActivity.getFileOperationsHelper().toggleEncryption(singleFile, true); - return true; - } else if (itemId == R.id.action_unset_encrypted) { - mContainerActivity.getFileOperationsHelper().toggleEncryption(singleFile, false); - return true; - } else if (itemId == R.id.action_lock_file) { - mContainerActivity.getFileOperationsHelper().toggleFileLock(singleFile, true); - } else if (itemId == R.id.action_unlock_file) { - mContainerActivity.getFileOperationsHelper().toggleFileLock(singleFile, false); - } else if (itemId == R.id.action_pin_to_homescreen) { - shortcutUtil.addShortcutToHomescreen(singleFile, viewThemeUtils, accountManager.getUser(), syncedFolderProvider); - return true; - } else if (itemId == R.id.action_retry) { - backgroundJobManager.startOfflineOperations(); - return true; - } else if (itemId == R.id.action_sync_all_files) { - syncFolderIncludingAllNestedFiles(singleFile); - return true; + private boolean onListActionChosen(@IdRes final int itemId, Set checkedFiles) { + if (itemId == R.id.action_see_details && checkedFiles.size() == SINGLE_SELECTION) { + if (mActiveActionMode != null) { + mActiveActionMode.finish(); } - } - /// actions possible on a batch of files - if (itemId == R.id.action_remove_file) { - RemoveFilesDialogFragment dialog = - RemoveFilesDialogFragment.newInstance(new ArrayList<>(checkedFiles), mActiveActionMode); - dialog.show(requireFragmentManager(), ConfirmationDialogFragment.FTAG_CONFIRMATION); + mContainerActivity.showDetails(checkedFiles.iterator().next()); + mContainerActivity.showSortListGroup(false); return true; } else if (itemId == R.id.action_download_file || itemId == R.id.action_sync_file) { syncAndCheckFiles(checkedFiles); exitSelectionMode(); return true; - } else if (itemId == R.id.action_export_file) { - mContainerActivity.getFileOperationsHelper().exportFiles(checkedFiles, - getContext(), - getView(), - backgroundJobManager); - exitSelectionMode(); - return true; - } else if (itemId == R.id.action_cancel_sync) { - ((FileDisplayActivity) mContainerActivity).cancelTransference(checkedFiles); - return true; - } else if (itemId == R.id.action_favorite) { - mContainerActivity.getFileOperationsHelper().toggleFavoriteFiles(checkedFiles, true); - exitSelectionMode(); - return true; - } else if (itemId == R.id.action_unset_favorite) { - mContainerActivity.getFileOperationsHelper().toggleFavoriteFiles(checkedFiles, false); - exitSelectionMode(); - return true; } else if (itemId == R.id.action_move_or_copy) { String invalidFilename = checkInvalidFilenames(checkedFiles); if (invalidFilename != null) { SnackbarUtil.show(requireActivity(), getString(R.string.file_name_validator_rename_before_move_or_copy, invalidFilename)); - return false; + return true; } if (!FileNameValidator.INSTANCE.checkParentRemotePaths(new ArrayList<>(checkedFiles), getCapabilities(), requireContext())) { browseToRoot(); SnackbarUtil.show(requireActivity(), R.string.file_name_validator_current_path_is_invalid); - return false; + return true; } pickFolderForMoveOrCopy(checkedFiles); @@ -1466,12 +1406,6 @@ public boolean onFileActionChosen(@IdRes final int itemId, Set checkedFi } else if (itemId == R.id.action_send_file) { mContainerActivity.getFileOperationsHelper().sendFiles(checkedFiles); return true; - } else if (itemId == R.id.action_lock_file) { - // TODO call lock API - } else if (itemId == R.id.action_add_to_album) { - mContainerActivity.getFileOperationsHelper().addFileToAlbum(checkedFiles); - exitSelectionMode(); - return true; } return false; @@ -2035,46 +1969,6 @@ private boolean isSearchEventSet(SearchEvent event) { searchType == SearchRemoteOperation.SearchType.RECENTLY_MODIFIED_SEARCH; } - private void syncFolderIncludingAllNestedFiles(OCFile folder) { - if (FileStorageUtils.checkIfEnoughSpace(folder)) { - informUserForSyncAllAction(folder); - } else { - SyncFileNotEnoughSpaceDialogFragment - .newInstance(folder, FileOperationsHelper.getAvailableSpaceOnDevice()) - .show(getParentFragmentManager(), ConfirmationDialogFragment.FTAG_CONFIRMATION); - } - } - - private void informUserForSyncAllAction(OCFile folder) { - ConfirmationDialogFragment dialog = ConfirmationDialogFragment.newInstance( - R.string.sync_all_action_dialog_description, - null, - R.string.sync_all_action_dialog_title, - R.drawable.ic_sync_all, - R.string.common_ok, - R.string.common_cancel, - -1); - - dialog.setCancelable(false); - - dialog.setOnConfirmationListener(new ConfirmationDialogFragment.ConfirmationDialogFragmentListener() { - @Override - public void onConfirmation(String callerTag) { - mContainerActivity.getFileOperationsHelper().syncFolderIncludingNestedFiles(folder); - } - - @Override - public void onNeutral(String callerTag) { - } - - @Override - public void onCancel(String callerTag) { - } - }); - - dialog.show(getParentFragmentManager(), ConfirmationDialogFragment.FTAG_CONFIRMATION); - } - private void syncAndCheckFiles(Collection files) { if (files.isEmpty()) return;