From e700745a19c1e69cb966d76a8d823213ca2a0503 Mon Sep 17 00:00:00 2001 From: LillyJadeKatrin Date: Mon, 9 Jun 2025 23:38:49 -0400 Subject: [PATCH] RetroAchievements - Android login callback Modify the RetroAchievements login code in Android to pass in a callback, pop a message if login fails, close the login box if it succeeds. --- .../features/settings/model/AchievementModel.kt | 11 ++++++++++- .../features/settings/ui/LoginDialog.kt | 14 +++++++++++--- Source/Android/jni/AchievementAdapter.cpp | 16 ++++++++++++++-- 3 files changed, 35 insertions(+), 6 deletions(-) diff --git a/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/settings/model/AchievementModel.kt b/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/settings/model/AchievementModel.kt index 1625c98fb0..1ea53ddbec 100644 --- a/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/settings/model/AchievementModel.kt +++ b/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/settings/model/AchievementModel.kt @@ -2,12 +2,21 @@ package org.dolphinemu.dolphinemu.features.settings.model +import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.withContext + object AchievementModel { @JvmStatic external fun init() + suspend fun asyncLogin(password: String): Boolean { + return withContext(Dispatchers.IO) { + login(password) + } + } + @JvmStatic - external fun login(password: String) + private external fun login(password: String): Boolean @JvmStatic external fun logout() diff --git a/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/settings/ui/LoginDialog.kt b/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/settings/ui/LoginDialog.kt index f49c9ff922..9734767166 100644 --- a/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/settings/ui/LoginDialog.kt +++ b/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/settings/ui/LoginDialog.kt @@ -7,8 +7,11 @@ import android.view.LayoutInflater import android.view.View import android.view.ViewGroup import androidx.fragment.app.DialogFragment +import androidx.lifecycle.lifecycleScope +import kotlinx.coroutines.launch import org.dolphinemu.dolphinemu.databinding.DialogLoginBinding -import org.dolphinemu.dolphinemu.features.settings.model.AchievementModel.login +import org.dolphinemu.dolphinemu.dialogs.AlertMessage +import org.dolphinemu.dolphinemu.features.settings.model.AchievementModel.asyncLogin import org.dolphinemu.dolphinemu.features.settings.model.NativeConfig import org.dolphinemu.dolphinemu.features.settings.model.StringSetting @@ -45,7 +48,12 @@ class LoginDialog : DialogFragment() { private fun onLoginClicked() { StringSetting.ACHIEVEMENTS_USERNAME.setString(NativeConfig.LAYER_BASE_OR_CURRENT, binding.usernameInput.text.toString()) - login(binding.passwordInput.text.toString()) - dismiss() + lifecycleScope.launch { + if (asyncLogin(binding.passwordInput.text.toString())) + dismiss() + else + AlertMessage.newInstance("Login Failed", "Login Failed", false, false) + .show(childFragmentManager, "AlertMessage"); + } } } diff --git a/Source/Android/jni/AchievementAdapter.cpp b/Source/Android/jni/AchievementAdapter.cpp index f3f27c8f8d..4c5e44c58a 100644 --- a/Source/Android/jni/AchievementAdapter.cpp +++ b/Source/Android/jni/AchievementAdapter.cpp @@ -3,8 +3,10 @@ #include +#include "Common/Event.h" #include "Core/AchievementManager.h" #include "jni/AndroidCommon/AndroidCommon.h" +#include "jni/AndroidCommon/IDCache.h" extern "C" { @@ -14,11 +16,21 @@ Java_org_dolphinemu_dolphinemu_features_settings_model_AchievementModel_init(JNI AchievementManager::GetInstance().Init(nullptr); } -JNIEXPORT void JNICALL +JNIEXPORT jboolean JNICALL Java_org_dolphinemu_dolphinemu_features_settings_model_AchievementModel_login(JNIEnv* env, jclass, jstring password) { - AchievementManager::GetInstance().Login(GetJString(env, password)); + auto& instance = AchievementManager::GetInstance(); + bool success; + auto login_complete_event = std::make_shared(); + instance.SetUpdateCallback( + [&login_complete_event, &success](AchievementManager::UpdatedItems updated_items) { + success = (updated_items.failed_login_code == 0); + login_complete_event->Set(); + }); + instance.Login(GetJString(env, password)); + login_complete_event->Wait(); + return success; } JNIEXPORT void JNICALL