diff options
| author | JosJuice <josjuice@gmail.com> | 2021-01-18 12:22:26 +0100 |
|---|---|---|
| committer | JosJuice <josjuice@gmail.com> | 2021-01-27 20:10:07 +0100 |
| commit | 347551a01da643980fabfd3579ec34bb6cbb5419 (patch) | |
| tree | 7eab872f13982d6815c331f6787a9cfb508b983c /Source/Android | |
| parent | cd4ccda51c7b16be602ad32ffdf672a3de7cffeb (diff) | |
Android: Implement save overwrite confirmation
Diffstat (limited to 'Source/Android')
7 files changed, 66 insertions, 6 deletions
diff --git a/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/ui/main/MainPresenter.java b/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/ui/main/MainPresenter.java index c07fe5b388..1534b0c654 100644 --- a/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/ui/main/MainPresenter.java +++ b/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/ui/main/MainPresenter.java @@ -18,11 +18,14 @@ import org.dolphinemu.dolphinemu.features.settings.ui.MenuTag; import org.dolphinemu.dolphinemu.model.GameFileCache; import org.dolphinemu.dolphinemu.services.GameFileCacheService; import org.dolphinemu.dolphinemu.utils.AfterDirectoryInitializationRunner; +import org.dolphinemu.dolphinemu.utils.BooleanSupplier; import org.dolphinemu.dolphinemu.utils.ContentHandler; import org.dolphinemu.dolphinemu.utils.FileBrowserHelper; import org.dolphinemu.dolphinemu.utils.WiiUtils; import java.util.Arrays; +import java.util.concurrent.CompletableFuture; +import java.util.concurrent.ExecutionException; import java.util.function.Supplier; public final class MainPresenter @@ -168,9 +171,41 @@ public final class MainPresenter public void importWiiSave(String path) { + if (android.os.Build.VERSION.SDK_INT < android.os.Build.VERSION_CODES.N) + return; // TODO + + final Activity mainPresenterActivity = (Activity) mContext; + + CompletableFuture<Boolean> canOverwriteFuture = new CompletableFuture<>(); + runOnThreadAndShowResult(R.string.import_in_progress, () -> { - int result = WiiUtils.importWiiSave(path); + BooleanSupplier canOverwrite = () -> + { + mainPresenterActivity.runOnUiThread(() -> + { + AlertDialog.Builder builder = + new AlertDialog.Builder(mContext, R.style.DolphinDialogBase); + builder.setMessage(R.string.wii_save_exists); + builder.setCancelable(false); + builder.setPositiveButton(R.string.yes, (dialog, i) -> canOverwriteFuture.complete(true)); + builder.setNegativeButton(R.string.no, (dialog, i) -> canOverwriteFuture.complete(false)); + builder.show(); + }); + + try + { + return canOverwriteFuture.get(); + } + catch (ExecutionException | InterruptedException e) + { + // Shouldn't happen + throw new RuntimeException(e); + } + }; + + int result = WiiUtils.importWiiSave(path, canOverwrite); + int message; switch (result) { diff --git a/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/utils/BooleanSupplier.java b/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/utils/BooleanSupplier.java new file mode 100644 index 0000000000..d1c490fe2a --- /dev/null +++ b/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/utils/BooleanSupplier.java @@ -0,0 +1,6 @@ +package org.dolphinemu.dolphinemu.utils; + +public interface BooleanSupplier +{ + boolean get(); +} diff --git a/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/utils/WiiUtils.java b/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/utils/WiiUtils.java index 404d7e9909..9a6440c9e5 100644 --- a/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/utils/WiiUtils.java +++ b/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/utils/WiiUtils.java @@ -10,5 +10,5 @@ public final class WiiUtils public static native boolean installWAD(String file); - public static native int importWiiSave(String file); + public static native int importWiiSave(String file, BooleanSupplier canOverwrite); } diff --git a/Source/Android/app/src/main/res/values/strings.xml b/Source/Android/app/src/main/res/values/strings.xml index 1e1739df92..6a53b7ce3c 100644 --- a/Source/Android/app/src/main/res/values/strings.xml +++ b/Source/Android/app/src/main/res/values/strings.xml @@ -333,6 +333,7 @@ <string name="import_in_progress">Importing...</string> <string name="wad_install_success">Successfully installed this title to the NAND.</string> <string name="wad_install_failure">Failed to install this title to the NAND.</string> + <string name="wii_save_exists">Save data for this title already exists in the NAND. Consider backing up the current data before overwriting.\nOverwrite now?</string> <string name="wii_save_import_success">Successfully imported save file.</string> <string name="wii_save_import_error">Failed to import save file. Your NAND may be corrupt, or something is preventing access to files within it.</string> <string name="wii_save_import_corruped_source">Failed to import save file. The given file appears to be corrupted or is not a valid Wii save.</string> diff --git a/Source/Android/jni/AndroidCommon/IDCache.cpp b/Source/Android/jni/AndroidCommon/IDCache.cpp index 4c6c4b2ce7..b5ca604c6e 100644 --- a/Source/Android/jni/AndroidCommon/IDCache.cpp +++ b/Source/Android/jni/AndroidCommon/IDCache.cpp @@ -56,6 +56,9 @@ static jmethodID s_network_helper_get_network_ip_address; static jmethodID s_network_helper_get_network_prefix_length; static jmethodID s_network_helper_get_network_gateway; +static jclass s_boolean_supplier_class; +static jmethodID s_boolean_supplier_get; + namespace IDCache { JNIEnv* GetEnvForThread() @@ -261,6 +264,11 @@ jmethodID GetNetworkHelperGetNetworkGateway() return s_network_helper_get_network_gateway; } +jmethodID GetBooleanSupplierGet() +{ + return s_boolean_supplier_get; +} + } // namespace IDCache #ifdef __cplusplus @@ -361,6 +369,11 @@ jint JNI_OnLoad(JavaVM* vm, void* reserved) s_network_helper_get_network_gateway = env->GetStaticMethodID(s_network_helper_class, "GetNetworkGateway", "()I"); + const jclass boolean_supplier_class = + env->FindClass("org/dolphinemu/dolphinemu/utils/BooleanSupplier"); + s_boolean_supplier_class = reinterpret_cast<jclass>(env->NewGlobalRef(boolean_supplier_class)); + s_boolean_supplier_get = env->GetMethodID(s_boolean_supplier_class, "get", "()Z"); + return JNI_VERSION; } diff --git a/Source/Android/jni/AndroidCommon/IDCache.h b/Source/Android/jni/AndroidCommon/IDCache.h index b633267f55..b0e7a3d814 100644 --- a/Source/Android/jni/AndroidCommon/IDCache.h +++ b/Source/Android/jni/AndroidCommon/IDCache.h @@ -56,4 +56,6 @@ jmethodID GetNetworkHelperGetNetworkIpAddress(); jmethodID GetNetworkHelperGetNetworkPrefixLength(); jmethodID GetNetworkHelperGetNetworkGateway(); +jmethodID GetBooleanSupplierGet(); + } // namespace IDCache diff --git a/Source/Android/jni/WiiUtils.cpp b/Source/Android/jni/WiiUtils.cpp index a2f607d68a..9b0601c1df 100644 --- a/Source/Android/jni/WiiUtils.cpp +++ b/Source/Android/jni/WiiUtils.cpp @@ -7,6 +7,7 @@ #include <jni.h> #include "jni/AndroidCommon/AndroidCommon.h" +#include "jni/AndroidCommon/IDCache.h" #include "Core/HW/WiiSave.h" #include "Core/WiiUtils.h" @@ -44,12 +45,14 @@ JNIEXPORT jboolean JNICALL Java_org_dolphinemu_dolphinemu_utils_WiiUtils_install return static_cast<jboolean>(WiiUtils::InstallWAD(path)); } -JNIEXPORT jint JNICALL Java_org_dolphinemu_dolphinemu_utils_WiiUtils_importWiiSave(JNIEnv* env, - jclass, - jstring jFile) +JNIEXPORT jint JNICALL Java_org_dolphinemu_dolphinemu_utils_WiiUtils_importWiiSave( + JNIEnv* env, jclass, jstring jFile, jobject jCanOverwrite) { const std::string path = GetJString(env, jFile); - const auto can_overwrite = [] { return true; }; // TODO + const auto can_overwrite = [&] { + const jmethodID get = IDCache::GetBooleanSupplierGet(); + return static_cast<bool>(env->CallBooleanMethod(jCanOverwrite, get)); + }; return ConvertCopyResult(WiiSave::Import(path, can_overwrite)); } |
