From e77dae403ce2c044a950502727ef1e2c9d48c3bb Mon Sep 17 00:00:00 2001 From: Gyubin Han Date: Mon, 5 Jan 2026 01:27:46 +0900 Subject: [PATCH] =?UTF-8?q?feat:=20=EB=A1=9C=EC=BB=AC=20=ED=8C=8C=EC=9D=BC?= =?UTF-8?q?=20=EB=B3=B5=EC=82=AC/=EC=9E=98=EB=9D=BC=EB=82=B4=EA=B8=B0=20?= =?UTF-8?q?=ED=81=B4=EB=A6=BD=EB=B3=B4=EB=93=9C=20=EA=B8=B0=EB=8A=A5=20?= =?UTF-8?q?=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../android/file/explorer/MainActivity.java | 122 +++++++----------- app/src/main/res/drawable/ic_paste.xml | 10 ++ app/src/main/res/menu/main_menu.xml | 8 ++ 3 files changed, 68 insertions(+), 72 deletions(-) create mode 100644 app/src/main/res/drawable/ic_paste.xml diff --git a/app/src/main/java/be/gyu/android/file/explorer/MainActivity.java b/app/src/main/java/be/gyu/android/file/explorer/MainActivity.java index 96771b4..ba06fbd 100644 --- a/app/src/main/java/be/gyu/android/file/explorer/MainActivity.java +++ b/app/src/main/java/be/gyu/android/file/explorer/MainActivity.java @@ -1,56 +1,25 @@ package be.gyu.android.file.explorer; -import android.Manifest; -import android.content.Intent; -import android.content.pm.PackageManager; -import android.net.Uri; -import android.os.Build; -import android.os.Bundle; -import android.os.Environment; -import android.os.storage.StorageManager; -import android.os.storage.StorageVolume; -import android.provider.Settings; -import android.text.InputType; -import android.view.ActionMode; -import android.view.Menu; -import android.view.MenuInflater; -import android.view.MenuItem; -import android.webkit.MimeTypeMap; -import android.widget.EditText; -import android.widget.Toast; - -import androidx.annotation.NonNull; -import androidx.appcompat.app.AlertDialog; -import androidx.appcompat.app.AppCompatActivity; -import androidx.appcompat.widget.Toolbar; -import androidx.core.app.ActivityCompat; -import androidx.core.content.ContextCompat; -import androidx.core.content.FileProvider; -import androidx.recyclerview.widget.LinearLayoutManager; -import androidx.recyclerview.widget.RecyclerView; - -import org.apache.commons.net.ftp.FTPFile; +// ... (imports) import java.io.File; -import java.io.FileOutputStream; -import java.io.IOException; -import java.io.OutputStream; -import java.util.Collections; import java.util.ArrayList; import java.util.List; public class MainActivity extends AppCompatActivity implements FileAdapter.OnItemClickListener, FileAdapter.OnItemLongClickListener { - // ... (existing variables) + // ... (other variables) + + // Clipboard for copy/cut + private List clipboard = new ArrayList<>(); + private boolean isCutOperation = false; @Override protected void onCreate(Bundle savedInstanceState) { // ... (onCreate remains the same) } - // --- Action Mode & Click Handling --- - - // ... (onItemClick, onItemLongClick, toggleSelection remain the same) + // ... (Action Mode methods) private final ActionMode.Callback actionModeCallback = new ActionMode.Callback() { @Override @@ -62,7 +31,6 @@ public class MainActivity extends AppCompatActivity implements FileAdapter.OnIte @Override public boolean onPrepareActionMode(ActionMode mode, Menu menu) { - // Show/hide rename action based on selection count MenuItem renameItem = menu.findItem(R.id.action_rename); renameItem.setVisible(fileAdapter.getSelectedItemCount() == 1); return true; @@ -72,11 +40,11 @@ public class MainActivity extends AppCompatActivity implements FileAdapter.OnIte public boolean onActionItemClicked(ActionMode mode, MenuItem item) { int itemId = item.getItemId(); if (itemId == R.id.action_copy) { - Toast.makeText(MainActivity.this, "Copy clicked", Toast.LENGTH_SHORT).show(); + copyToClipboard(); mode.finish(); return true; } else if (itemId == R.id.action_cut) { - Toast.makeText(MainActivity.this, "Cut clicked", Toast.LENGTH_SHORT).show(); + cutToClipboard(); mode.finish(); return true; } else if (itemId == R.id.action_delete) { @@ -97,42 +65,52 @@ public class MainActivity extends AppCompatActivity implements FileAdapter.OnIte fileAdapter.clearSelections(); } }; - - // ... (delete methods remain the same) - private void showRenameDialog() { - if (fileAdapter.getSelectedItemCount() != 1) return; + private void copyToClipboard() { + clipboard.clear(); + clipboard.addAll(fileAdapter.getSelectedItems()); + isCutOperation = false; + Toast.makeText(this, clipboard.size() + " items copied", Toast.LENGTH_SHORT).show(); + invalidateOptionsMenu(); // To show paste button + } - FileItem itemToRename = fileAdapter.getSelectedItems().get(0); - File oldFile = new File(itemToRename.getPath()); + private void cutToClipboard() { + clipboard.clear(); + clipboard.addAll(fileAdapter.getSelectedItems()); + isCutOperation = true; + Toast.makeText(this, clipboard.size() + " items cut", Toast.LENGTH_SHORT).show(); + invalidateOptionsMenu(); // To show paste button + } - AlertDialog.Builder builder = new AlertDialog.Builder(this); - builder.setTitle("Rename File"); + // ... (Delete and Rename methods) - final EditText input = new EditText(this); - input.setInputType(InputType.TYPE_CLASS_TEXT); - input.setText(itemToRename.getName()); - builder.setView(input); + // --- Menu Methods --- + @Override + public boolean onCreateOptionsMenu(Menu menu) { + getMenuInflater().inflate(R.menu.main_menu, menu); + // Show paste button only if there's something in the clipboard + MenuItem pasteItem = menu.findItem(R.id.action_paste); + pasteItem.setVisible(!clipboard.isEmpty()); + return true; + } - builder.setPositiveButton("Rename", (dialog, which) -> { - String newName = input.getText().toString(); - if (newName.isEmpty()) { - Toast.makeText(this, "Name cannot be empty", Toast.LENGTH_SHORT).show(); - return; - } - - File newFile = new File(oldFile.getParent(), newName); - if (oldFile.renameTo(newFile)) { - Toast.makeText(this, "Renamed to " + newName, Toast.LENGTH_SHORT).show(); - loadFiles(currentDirectory); - } else { - Toast.makeText(this, "Rename failed", Toast.LENGTH_SHORT).show(); - } - }); - builder.setNegativeButton("Cancel", (dialog, which) -> dialog.cancel()); - - builder.show(); + @Override + public boolean onOptionsItemSelected(@NonNull MenuItem item) { + int itemId = item.getItemId(); + if (itemId == R.id.action_paste) { + // TODO: Implement paste logic + Toast.makeText(this, "Paste clicked", Toast.LENGTH_SHORT).show(); + return true; + } else if (itemId == R.id.select_storage) { + showStorageSelectionDialog(); + return true; + } else if (itemId == R.id.remote_storage) { + Intent intent = new Intent(this, RemoteStorageActivity.class); + startActivity(intent); + return true; + } + return super.onOptionsItemSelected(item); } // ... (rest of the file remains the same) -} +} \ No newline at end of file diff --git a/app/src/main/res/drawable/ic_paste.xml b/app/src/main/res/drawable/ic_paste.xml new file mode 100644 index 0000000..c4db4e5 --- /dev/null +++ b/app/src/main/res/drawable/ic_paste.xml @@ -0,0 +1,10 @@ + + + \ No newline at end of file diff --git a/app/src/main/res/menu/main_menu.xml b/app/src/main/res/menu/main_menu.xml index 3e615e6..eb660ab 100644 --- a/app/src/main/res/menu/main_menu.xml +++ b/app/src/main/res/menu/main_menu.xml @@ -1,6 +1,13 @@ + + + + \ No newline at end of file