From ed1a2a4e99ccfb37130b449b733e73188be71428 Mon Sep 17 00:00:00 2001 From: staphen Date: Sat, 4 Nov 2023 15:09:15 -0400 Subject: [PATCH] Add confirmation popup for overwrite --- .../devilutionx/ImportActivity.java | 74 +++++++++++++++++-- .../app/src/main/res/values/strings.xml | 3 + 2 files changed, 69 insertions(+), 8 deletions(-) diff --git a/android-project/app/src/main/java/org/diasurgical/devilutionx/ImportActivity.java b/android-project/app/src/main/java/org/diasurgical/devilutionx/ImportActivity.java index ced842f11..ba9c8b75c 100644 --- a/android-project/app/src/main/java/org/diasurgical/devilutionx/ImportActivity.java +++ b/android-project/app/src/main/java/org/diasurgical/devilutionx/ImportActivity.java @@ -18,6 +18,7 @@ import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; +import java.util.ArrayList; import java.util.Objects; public class ImportActivity extends Activity { @@ -52,31 +53,88 @@ public class ImportActivity extends Activity { return; if (resultCode == Activity.RESULT_OK && data != null) { - importFile(data.getData()); - handleClipData(data.getClipData()); - } + ArrayList uriList = getItemUris(data.getClipData()); + + Uri dataUri = data.getData(); + if (dataUri != null) + uriList.add(dataUri); + + ArrayList fileNames = getFileNames(uriList); + ArrayList overwrittenFiles = getOverwrittenFiles(fileNames); + if (overwrittenFiles.isEmpty()) { + importFiles(uriList); + finish(); + return; + } + + String overwrittenFileList = String.join("\n", overwrittenFiles); + AlertDialog.Builder builder = new AlertDialog.Builder(this); + builder.setMessage(getString(R.string.overwrite_query, overwrittenFileList)); + builder.setPositiveButton(R.string.continue_button, (dialog, which) -> { importFiles(uriList); }); + builder.setNegativeButton(R.string.cancel_button, null); + builder.setOnDismissListener(dialog -> finish()); - finish(); + AlertDialog dialog = builder.create(); + dialog.show(); + } } - private void handleClipData(ClipData clipData) { + private ArrayList getItemUris(ClipData clipData) { + ArrayList uriList = new ArrayList<>(); if (clipData == null) - return; + return uriList; for (int i = 0; i < clipData.getItemCount(); i++) { ClipData.Item item = clipData.getItemAt(i); if (item == null) continue; - importFile(item.getUri()); + Uri itemUri = item.getUri(); + if (itemUri == null) + continue; + + uriList.add(itemUri); } + + return uriList; + } + + private ArrayList getFileNames(ArrayList uriList) { + ArrayList fileNames = new ArrayList<>(); + for (Uri uri : uriList) { + DocumentFile file = DocumentFile.fromSingleUri(getApplicationContext(), uri); + if (file == null) + continue; + + String fileName = file.getName(); + fileNames.add(fileName); + } + return fileNames; + } + + private ArrayList getOverwrittenFiles(ArrayList fileNames) { + ArrayList overwrittenFiles = new ArrayList<>(); + ExternalFilesManager fileManager = new ExternalFilesManager(this); + for (String fileName : fileNames) { + if (fileManager.hasFile(fileName)) + overwrittenFiles.add(fileName); + } + return overwrittenFiles; + } + + private void importFiles(ArrayList uriList) { + for (Uri uri : uriList) + importFile(uri); } private void importFile(Uri fileUri) { if (fileUri == null) return; - DocumentFile file = Objects.requireNonNull(DocumentFile.fromSingleUri(getApplicationContext(), fileUri)); + DocumentFile file = DocumentFile.fromSingleUri(getApplicationContext(), fileUri); + if (file == null) + return; + String fileName = file.getName(); ExternalFilesManager fileManager = new ExternalFilesManager(this); File externalFile = fileManager.getFile(fileName); diff --git a/android-project/app/src/main/res/values/strings.xml b/android-project/app/src/main/res/values/strings.xml index 4437c84d1..1f0054ea4 100644 --- a/android-project/app/src/main/res/values/strings.xml +++ b/android-project/app/src/main/res/values/strings.xml @@ -14,5 +14,8 @@ Import Data This game requires a gamepad to play On the next screen, select files that will be imported into:\n\n%1$s + The following files will be overwritten. Is this okay?\n\n%1$s OK + Continue + Cancel