From ddced1a070848d935bd1d140eed549a4cae89566 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. --- .../settings/model/AchievementModel.kt | 11 +++++- .../features/settings/ui/LoginDialog.kt | 20 ++++++++-- .../settings/ui/SettingsFragmentPresenter.kt | 4 +- .../app/src/main/res/layout/dialog_login.xml | 38 +++++++++++++++++-- .../app/src/main/res/values/strings.xml | 2 + Source/Android/jni/AchievementAdapter.cpp | 18 ++++++++- Source/Core/Core/AchievementManager.cpp | 5 +++ Source/Core/Core/AchievementManager.h | 1 + 8 files changed, 87 insertions(+), 12 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 1625c98fb08..1ea53ddbec1 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 f49c9ff9224..9f1d3efd5ff 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,12 +7,15 @@ 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 -class LoginDialog : DialogFragment() { +class LoginDialog(val parent: SettingsFragmentPresenter) : DialogFragment() { private var _binding: DialogLoginBinding? = null private val binding get() = _binding!! @@ -43,9 +46,18 @@ class LoginDialog : DialogFragment() { } private fun onLoginClicked() { + binding.loginFailed.visibility = View.GONE + binding.loginInProgress.visibility = View.VISIBLE 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())) { + parent.loadSettingsList() + dismiss() + } else { + binding.loginInProgress.visibility = View.GONE + binding.loginFailed.visibility = View.VISIBLE + } + } } } diff --git a/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/settings/ui/SettingsFragmentPresenter.kt b/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/settings/ui/SettingsFragmentPresenter.kt index 15947711283..e9181785272 100644 --- a/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/settings/ui/SettingsFragmentPresenter.kt +++ b/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/settings/ui/SettingsFragmentPresenter.kt @@ -101,7 +101,7 @@ class SettingsFragmentPresenter( } } - private fun loadSettingsList() { + fun loadSettingsList() { val sl = ArrayList() when (menuTag) { MenuTag.SETTINGS -> addTopLevelSettings(sl) @@ -964,7 +964,7 @@ class SettingsFragmentPresenter( 0, false ) { - fragmentView.showDialogFragment(LoginDialog()) + fragmentView.showDialogFragment(LoginDialog(this)) loadSettingsList() }) } else { diff --git a/Source/Android/app/src/main/res/layout/dialog_login.xml b/Source/Android/app/src/main/res/layout/dialog_login.xml index a8b2b3228c5..320aed0e6a0 100644 --- a/Source/Android/app/src/main/res/layout/dialog_login.xml +++ b/Source/Android/app/src/main/res/layout/dialog_login.xml @@ -36,7 +36,7 @@ android:layout_width="0dp" android:layout_height="wrap_content" android:layout_marginHorizontal="@dimen/spacing_large" - app:layout_constraintBottom_toTopOf="@id/button_cancel" + app:layout_constraintBottom_toTopOf="@id/login_in_progress" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toBottomOf="@id/username"> @@ -53,6 +53,38 @@ + + + +