Browse Source

Merge pull request #13227 from nextcloud/convert-remove-files-dialog-to-kt

Convert Remove Files Dialog to Kotlin
Alper Öztürk 10 months ago
parent
commit
32ad133d4a

+ 0 - 201
app/src/main/java/com/owncloud/android/ui/dialog/RemoveFilesDialogFragment.java

@@ -1,201 +0,0 @@
-/*
- * Nextcloud - Android Client
- *
- * SPDX-FileCopyrightText: 2023 Alper Ozturk <alper.ozturk@nextcloud.com>
- * SPDX-FileCopyrightText: 2018 Andy Scherzinger <info@andy-scherzinger.de>
- * SPDX-FileCopyrightText: 2018 Jessie Chatham Spencer <jessie@teainspace.com>
- * SPDX-FileCopyrightText: 2016-2022 Tobias Kaminsky <tobias@kaminsky.me>
- * SPDX-FileCopyrightText: 2015 ownCloud Inc.
- * SPDX-FileCopyrightText: 2015 David A. Velasco <dvelasco@solidgear.es>
- * SPDX-License-Identifier: GPL-2.0-only AND (AGPL-3.0-or-later OR GPL-2.0-only)
- */
-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;
-
-/**
- * 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 {
-
-    private static final int SINGLE_SELECTION = 1;
-    private static final String ARG_TARGET_FILES = "TARGET_FILES";
-
-    private Collection<OCFile> 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<OCFile> 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<OCFile> 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();
-        }
-
-        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;
-        }
-
-        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<OCFile> 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);
-            }
-        }
-    }
-
-    @NonNull
-    @Override
-    public Dialog onCreateDialog(Bundle savedInstanceState) {
-        Dialog dialog = super.onCreateDialog(savedInstanceState);
-        Bundle arguments = getArguments();
-
-        if (arguments == null) {
-            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);
-    }
-
-    /**
-     * Performs the removal of the local copy of the target file
-     */
-    @Override
-    public void onCancel(String callerTag) {
-        removeFiles(true);
-    }
-
-    private void removeFiles(boolean onlyLocalCopy) {
-        ComponentsGetter cg = (ComponentsGetter) getActivity();
-        if (cg != null) {
-            cg.getFileOperationsHelper().removeFiles(mTargetFiles, onlyLocalCopy, 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();
-        }
-    }
-}

+ 175 - 0
app/src/main/java/com/owncloud/android/ui/dialog/RemoveFilesDialogFragment.kt

@@ -0,0 +1,175 @@
+/*
+ * Nextcloud - Android Client
+ *
+ * SPDX-FileCopyrightText: 2023 Alper Ozturk <alper.ozturk@nextcloud.com>
+ * SPDX-FileCopyrightText: 2018 Andy Scherzinger <info@andy-scherzinger.de>
+ * SPDX-FileCopyrightText: 2018 Jessie Chatham Spencer <jessie@teainspace.com>
+ * SPDX-FileCopyrightText: 2016-2022 Tobias Kaminsky <tobias@kaminsky.me>
+ * SPDX-FileCopyrightText: 2015 ownCloud Inc.
+ * SPDX-FileCopyrightText: 2015 David A. Velasco <dvelasco@solidgear.es>
+ * SPDX-License-Identifier: GPL-2.0-only AND (AGPL-3.0-or-later OR GPL-2.0-only)
+ */
+package com.owncloud.android.ui.dialog
+
+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.
+ */
+class RemoveFilesDialogFragment : ConfirmationDialogFragment(), ConfirmationDialogFragmentListener, Injectable {
+    private var mTargetFiles: Collection<OCFile>? = null
+    private var actionMode: ActionMode? = null
+
+    override fun onStart() {
+        super.onStart()
+
+        val alertDialog = dialog as AlertDialog? ?: return
+
+        val positiveButton = alertDialog.getButton(AlertDialog.BUTTON_POSITIVE) as? MaterialButton
+        positiveButton?.let {
+            viewThemeUtils?.material?.colorMaterialButtonPrimaryTonal(positiveButton)
+        }
+
+        val negativeButton = alertDialog.getButton(AlertDialog.BUTTON_NEGATIVE) as? MaterialButton
+        negativeButton?.let {
+            viewThemeUtils?.material?.colorMaterialButtonPrimaryBorderless(negativeButton)
+        }
+
+        val neutralButton = alertDialog.getButton(AlertDialog.BUTTON_NEUTRAL) as? MaterialButton
+        neutralButton?.let {
+            viewThemeUtils?.material?.colorMaterialButtonPrimaryBorderless(neutralButton)
+        }
+    }
+
+    override fun onCreateDialog(savedInstanceState: Bundle?): Dialog {
+        val dialog = super.onCreateDialog(savedInstanceState)
+        val arguments = arguments ?: 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 fun onConfirmation(callerTag: String?) {
+        removeFiles(false)
+    }
+
+    /**
+     * Performs the removal of the local copy of the target file
+     */
+    override fun onCancel(callerTag: String?) {
+        removeFiles(true)
+    }
+
+    private fun removeFiles(onlyLocalCopy: Boolean) {
+        val cg = activity as ComponentsGetter?
+        cg?.fileOperationsHelper?.removeFiles(mTargetFiles, onlyLocalCopy, false)
+        finishActionMode()
+    }
+
+    override fun onNeutral(callerTag: String?) {
+        // nothing to do here
+    }
+
+    private fun 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 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<OCFile>, actionMode: ActionMode?): RemoveFilesDialogFragment {
+            return newInstance(files).apply {
+                setActionMode(actionMode)
+            }
+        }
+
+        @JvmStatic
+        fun newInstance(files: ArrayList<OCFile>): 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<OCFile>().apply {
+                add(file)
+            }
+            return newInstance(list)
+        }
+    }
+}