/* * ownCloud Android client application * * @author David A. Velasco * Copyright (C) 2015 ownCloud Inc. * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2, * as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ package com.owncloud.android.ui.dialog; import android.app.AlertDialog; import android.app.Dialog; import android.os.Bundle; import android.support.annotation.NonNull; import android.view.ActionMode; import com.owncloud.android.R; import com.owncloud.android.datamodel.OCFile; import com.owncloud.android.ui.activity.ComponentsGetter; import com.owncloud.android.ui.dialog.ConfirmationDialogFragment.ConfirmationDialogFragmentListener; import com.owncloud.android.utils.ThemeUtils; import java.util.ArrayList; import java.util.Collection; /** * Dialog requiring confirmation before removing a collection of given OCFiles. * * Triggers the removal according to the user response. */ public class RemoveFilesDialogFragment extends ConfirmationDialogFragment implements ConfirmationDialogFragmentListener { private static final int SINGLE_SELECTION = 1; private static final String ARG_TARGET_FILES = "TARGET_FILES"; private Collection mTargetFiles; private ActionMode actionMode; /** * Public factory method to create new RemoveFilesDialogFragment instances. * * @param files Files to remove. * @param actionMode ActionMode to finish on confirmation * @return Dialog ready to show. */ public static RemoveFilesDialogFragment newInstance(ArrayList files, ActionMode actionMode) { RemoveFilesDialogFragment dialogFragment = newInstance(files); dialogFragment.setActionMode(actionMode); return dialogFragment; } /** * Public factory method to create new RemoveFilesDialogFragment instances. * * @param files Files to remove. * @return Dialog ready to show. */ public static RemoveFilesDialogFragment newInstance(ArrayList files) { RemoveFilesDialogFragment frag = new RemoveFilesDialogFragment(); Bundle args = new Bundle(); int messageStringId; boolean containsFolder = false; boolean containsDown = false; boolean containsFavorite = false; for (OCFile file: files) { containsFolder |= file.isFolder(); containsDown |= file.isDown(); containsFavorite |= file.isAvailableOffline(); } if (files.size() == SINGLE_SELECTION) { // choose message for a single file OCFile file = files.get(0); messageStringId = file.isFolder() ? R.string.confirmation_remove_folder_alert : R.string.confirmation_remove_file_alert; } else { // choose message for more than one file messageStringId = containsFolder ? R.string.confirmation_remove_folders_alert : R.string.confirmation_remove_files_alert; } int localRemoveButton = (!containsFavorite && (containsFolder || containsDown)) ? R.string.confirmation_remove_local : -1; args.putInt(ARG_MESSAGE_RESOURCE_ID, messageStringId); if (files.size() == 1) { args.putStringArray(ARG_MESSAGE_ARGUMENTS, new String[]{files.get(0).getFileName()}); } args.putInt(ARG_POSITIVE_BTN_RES, R.string.file_delete); args.putInt(ARG_NEUTRAL_BTN_RES, R.string.file_keep); args.putInt(ARG_NEGATIVE_BTN_RES, localRemoveButton); args.putParcelableArrayList(ARG_TARGET_FILES, files); frag.setArguments(args); return frag; } /** * Convenience factory method to create new RemoveFilesDialogFragment instances for a single file * * @param file File to remove. * @return Dialog ready to show. */ public static RemoveFilesDialogFragment newInstance(OCFile file) { ArrayList list = new ArrayList<>(); list.add(file); return newInstance(list); } @Override public void onStart() { super.onStart(); int color = ThemeUtils.primaryAccentColor(getActivity()); android.support.v7.app.AlertDialog alertDialog = (android.support.v7.app.AlertDialog) getDialog(); alertDialog.getButton(AlertDialog.BUTTON_POSITIVE).setTextColor(color); alertDialog.getButton(AlertDialog.BUTTON_NEGATIVE).setTextColor(color); alertDialog.getButton(AlertDialog.BUTTON_NEUTRAL).setTextColor(color); } @NonNull @Override public Dialog onCreateDialog(Bundle savedInstanceState) { Dialog dialog = super.onCreateDialog(savedInstanceState); mTargetFiles = getArguments().getParcelableArrayList(ARG_TARGET_FILES); setOnConfirmationListener(this); return dialog; } /** * Performs the removal of the target file, both locally and in the server and * finishes the supplied ActionMode if one was given. */ @Override public void onConfirmation(String callerTag) { ComponentsGetter cg = (ComponentsGetter) getActivity(); cg.getFileOperationsHelper().removeFiles(mTargetFiles, false, false); finishActionMode(); } /** * Performs the removal of the local copy of the target file */ @Override public void onCancel(String callerTag) { ComponentsGetter cg = (ComponentsGetter) getActivity(); cg.getFileOperationsHelper().removeFiles(mTargetFiles, true, false); finishActionMode(); } @Override public void onNeutral(String callerTag) { // nothing to do here } private void setActionMode(ActionMode actionMode) { this.actionMode = actionMode; } /** * This is used when finishing an actionMode, * for example if we want to exit the selection mode * after deleting the target files. */ private void finishActionMode() { if (actionMode != null) { actionMode.finish(); } } }