diff --git a/app/src/main/java/com/owncloud/android/ui/dialog/RemoveFilesDialogFragment.kt b/app/src/main/java/com/owncloud/android/ui/dialog/RemoveFilesDialogFragment.kt index 62086d0441..5008c8b6db 100644 --- a/app/src/main/java/com/owncloud/android/ui/dialog/RemoveFilesDialogFragment.kt +++ b/app/src/main/java/com/owncloud/android/ui/dialog/RemoveFilesDialogFragment.kt @@ -9,183 +9,84 @@ * SPDX-FileCopyrightText: 2015 David A. Velasco * SPDX-License-Identifier: GPL-2.0-only AND (AGPL-3.0-or-later OR GPL-2.0-only) */ -package com.owncloud.android.ui.dialog; +package com.owncloud.android.ui.dialog -import android.app.Dialog; -import android.os.Bundle; -import android.view.ActionMode; - -import com.google.android.material.button.MaterialButton; -import com.nextcloud.client.di.Injectable; -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 java.util.ArrayList; -import java.util.Collection; - -import androidx.annotation.NonNull; -import androidx.appcompat.app.AlertDialog; +import android.app.Dialog +import android.os.Bundle +import android.view.ActionMode +import androidx.appcompat.app.AlertDialog +import com.google.android.material.button.MaterialButton +import com.nextcloud.client.di.Injectable +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 /** * 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, Injectable { +class RemoveFilesDialogFragment : ConfirmationDialogFragment(), ConfirmationDialogFragmentListener, Injectable { + private var mTargetFiles: Collection? = null + private var actionMode: ActionMode? = null - private static final int SINGLE_SELECTION = 1; - private static final String ARG_TARGET_FILES = "TARGET_FILES"; + override fun onStart() { + super.onStart() - private Collection mTargetFiles; - private ActionMode actionMode; + val alertDialog = dialog as AlertDialog? ?: return - /** - * 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; - - for (OCFile file: files) { - containsFolder |= file.isFolder(); - containsDown |= file.isDown(); + val positiveButton = alertDialog.getButton(AlertDialog.BUTTON_POSITIVE) as? MaterialButton + positiveButton?.let { + viewThemeUtils?.material?.colorMaterialButtonPrimaryTonal(positiveButton) } - 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; + val negativeButton = alertDialog.getButton(AlertDialog.BUTTON_NEGATIVE) as? MaterialButton + negativeButton?.let { + viewThemeUtils?.material?.colorMaterialButtonPrimaryBorderless(negativeButton) } - args.putInt(ARG_MESSAGE_RESOURCE_ID, messageStringId); - if (files.size() == SINGLE_SELECTION) { - args.putStringArray(ARG_MESSAGE_ARGUMENTS, new String[] { files.get(0).getFileName() } ); - } - - args.putInt(ARG_POSITIVE_BTN_RES, R.string.file_delete); - - if (containsFolder || containsDown) { - args.putInt(ARG_NEGATIVE_BTN_RES, R.string.confirmation_remove_local); - } - - args.putInt(ARG_NEUTRAL_BTN_RES, R.string.file_keep); - 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(); - - AlertDialog alertDialog = (AlertDialog) getDialog(); - - if (alertDialog != null) { - MaterialButton positiveButton = (MaterialButton) alertDialog.getButton(AlertDialog.BUTTON_POSITIVE); - viewThemeUtils.material.colorMaterialButtonPrimaryTonal(positiveButton); - - MaterialButton negativeButton = (MaterialButton) alertDialog.getButton(AlertDialog.BUTTON_NEGATIVE); - viewThemeUtils.material.colorMaterialButtonPrimaryBorderless(negativeButton); - - MaterialButton neutralButton = (MaterialButton) alertDialog.getButton(AlertDialog.BUTTON_NEUTRAL); - if (neutralButton != null) { - viewThemeUtils.material.colorMaterialButtonPrimaryBorderless(neutralButton); - } + val neutralButton = alertDialog.getButton(AlertDialog.BUTTON_NEUTRAL) as? MaterialButton + neutralButton?.let { + viewThemeUtils?.material?.colorMaterialButtonPrimaryBorderless(neutralButton) } } - @NonNull - @Override - public Dialog onCreateDialog(Bundle savedInstanceState) { - Dialog dialog = super.onCreateDialog(savedInstanceState); - Bundle arguments = getArguments(); + override fun onCreateDialog(savedInstanceState: Bundle?): Dialog { + val dialog = super.onCreateDialog(savedInstanceState) + val arguments = arguments ?: return dialog - if (arguments == null) { - return dialog; - } - - mTargetFiles = arguments.getParcelableArrayList(ARG_TARGET_FILES); - setOnConfirmationListener(this); - return dialog; + mTargetFiles = arguments.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) { - removeFiles(false); + override fun onConfirmation(callerTag: String?) { + removeFiles(false) } /** * Performs the removal of the local copy of the target file */ - @Override - public void onCancel(String callerTag) { - removeFiles(true); + override fun onCancel(callerTag: String?) { + removeFiles(true) } - private void removeFiles(boolean onlyLocalCopy) { - ComponentsGetter cg = (ComponentsGetter) getActivity(); - if (cg != null) { - cg.getFileOperationsHelper().removeFiles(mTargetFiles, onlyLocalCopy, false); - } - finishActionMode(); + private fun removeFiles(onlyLocalCopy: Boolean) { + val cg = activity as ComponentsGetter? + cg?.fileOperationsHelper?.removeFiles(mTargetFiles, onlyLocalCopy, false) + finishActionMode() } - @Override - public void onNeutral(String callerTag) { + override fun onNeutral(callerTag: String?) { // nothing to do here } - private void setActionMode(ActionMode actionMode) { - this.actionMode = actionMode; + private fun setActionMode(actionMode: ActionMode?) { + this.actionMode = actionMode } /** @@ -193,9 +94,73 @@ public class RemoveFilesDialogFragment extends ConfirmationDialogFragment implem * for example if we want to exit the selection mode * after deleting the target files. */ - private void finishActionMode() { - if (actionMode != null) { - actionMode.finish(); + private fun finishActionMode() { + actionMode?.finish() + } + + companion object { + private const val SINGLE_SELECTION = 1 + private const val ARG_TARGET_FILES = "TARGET_FILES" + + @JvmStatic + fun newInstance(files: ArrayList, actionMode: ActionMode?): RemoveFilesDialogFragment { + return newInstance(files).apply { + setActionMode(actionMode) + } + } + + @JvmStatic + fun newInstance(files: ArrayList): RemoveFilesDialogFragment { + val messageStringId: Int + + var containsFolder = false + var containsDown = false + + for (file in files) { + containsFolder = containsFolder or file.isFolder + containsDown = containsDown or file.isDown + } + + if (files.size == SINGLE_SELECTION) { + val file = files[0] + messageStringId = + if (file.isFolder) R.string.confirmation_remove_folder_alert else R.string.confirmation_remove_file_alert + } else { + messageStringId = + if (containsFolder) R.string.confirmation_remove_folders_alert else R.string.confirmation_remove_files_alert + } + + val bundle = Bundle().apply { + putInt(ARG_MESSAGE_RESOURCE_ID, messageStringId) + if (files.size == SINGLE_SELECTION) { + putStringArray( + ARG_MESSAGE_ARGUMENTS, arrayOf( + files[0].fileName + ) + ) + } + + putInt(ARG_POSITIVE_BTN_RES, R.string.file_delete) + + if (containsFolder || containsDown) { + putInt(ARG_NEGATIVE_BTN_RES, R.string.confirmation_remove_local) + } + + putInt(ARG_NEUTRAL_BTN_RES, R.string.file_keep) + putParcelableArrayList(ARG_TARGET_FILES, files) + } + + return RemoveFilesDialogFragment().apply { + arguments = bundle + } + } + + @JvmStatic + fun newInstance(file: OCFile): RemoveFilesDialogFragment { + val list = ArrayList().apply { + add(file) + } + return newInstance(list) } } }