Android: Implement save overwrite confirmation

This commit is contained in:
JosJuice 2021-01-18 12:22:26 +01:00
parent cd4ccda51c
commit 347551a01d
7 changed files with 66 additions and 6 deletions

View File

@ -18,11 +18,14 @@ import org.dolphinemu.dolphinemu.features.settings.ui.MenuTag;
import org.dolphinemu.dolphinemu.model.GameFileCache; import org.dolphinemu.dolphinemu.model.GameFileCache;
import org.dolphinemu.dolphinemu.services.GameFileCacheService; import org.dolphinemu.dolphinemu.services.GameFileCacheService;
import org.dolphinemu.dolphinemu.utils.AfterDirectoryInitializationRunner; import org.dolphinemu.dolphinemu.utils.AfterDirectoryInitializationRunner;
import org.dolphinemu.dolphinemu.utils.BooleanSupplier;
import org.dolphinemu.dolphinemu.utils.ContentHandler; import org.dolphinemu.dolphinemu.utils.ContentHandler;
import org.dolphinemu.dolphinemu.utils.FileBrowserHelper; import org.dolphinemu.dolphinemu.utils.FileBrowserHelper;
import org.dolphinemu.dolphinemu.utils.WiiUtils; import org.dolphinemu.dolphinemu.utils.WiiUtils;
import java.util.Arrays; import java.util.Arrays;
import java.util.concurrent.CompletableFuture;
import java.util.concurrent.ExecutionException;
import java.util.function.Supplier; import java.util.function.Supplier;
public final class MainPresenter public final class MainPresenter
@ -168,9 +171,41 @@ public final class MainPresenter
public void importWiiSave(String path) 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, () -> 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; int message;
switch (result) switch (result)
{ {

View File

@ -0,0 +1,6 @@
package org.dolphinemu.dolphinemu.utils;
public interface BooleanSupplier
{
boolean get();
}

View File

@ -10,5 +10,5 @@ public final class WiiUtils
public static native boolean installWAD(String file); public static native boolean installWAD(String file);
public static native int importWiiSave(String file); public static native int importWiiSave(String file, BooleanSupplier canOverwrite);
} }

View File

@ -333,6 +333,7 @@
<string name="import_in_progress">Importing...</string> <string name="import_in_progress">Importing...</string>
<string name="wad_install_success">Successfully installed this title to the NAND.</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="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_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_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> <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>

View File

@ -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_prefix_length;
static jmethodID s_network_helper_get_network_gateway; static jmethodID s_network_helper_get_network_gateway;
static jclass s_boolean_supplier_class;
static jmethodID s_boolean_supplier_get;
namespace IDCache namespace IDCache
{ {
JNIEnv* GetEnvForThread() JNIEnv* GetEnvForThread()
@ -261,6 +264,11 @@ jmethodID GetNetworkHelperGetNetworkGateway()
return s_network_helper_get_network_gateway; return s_network_helper_get_network_gateway;
} }
jmethodID GetBooleanSupplierGet()
{
return s_boolean_supplier_get;
}
} // namespace IDCache } // namespace IDCache
#ifdef __cplusplus #ifdef __cplusplus
@ -361,6 +369,11 @@ jint JNI_OnLoad(JavaVM* vm, void* reserved)
s_network_helper_get_network_gateway = s_network_helper_get_network_gateway =
env->GetStaticMethodID(s_network_helper_class, "GetNetworkGateway", "()I"); 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; return JNI_VERSION;
} }

View File

@ -56,4 +56,6 @@ jmethodID GetNetworkHelperGetNetworkIpAddress();
jmethodID GetNetworkHelperGetNetworkPrefixLength(); jmethodID GetNetworkHelperGetNetworkPrefixLength();
jmethodID GetNetworkHelperGetNetworkGateway(); jmethodID GetNetworkHelperGetNetworkGateway();
jmethodID GetBooleanSupplierGet();
} // namespace IDCache } // namespace IDCache

View File

@ -7,6 +7,7 @@
#include <jni.h> #include <jni.h>
#include "jni/AndroidCommon/AndroidCommon.h" #include "jni/AndroidCommon/AndroidCommon.h"
#include "jni/AndroidCommon/IDCache.h"
#include "Core/HW/WiiSave.h" #include "Core/HW/WiiSave.h"
#include "Core/WiiUtils.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)); return static_cast<jboolean>(WiiUtils::InstallWAD(path));
} }
JNIEXPORT jint JNICALL Java_org_dolphinemu_dolphinemu_utils_WiiUtils_importWiiSave(JNIEnv* env, JNIEXPORT jint JNICALL Java_org_dolphinemu_dolphinemu_utils_WiiUtils_importWiiSave(
jclass, JNIEnv* env, jclass, jstring jFile, jobject jCanOverwrite)
jstring jFile)
{ {
const std::string path = GetJString(env, jFile); 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)); return ConvertCopyResult(WiiSave::Import(path, can_overwrite));
} }