Add login to achievement settings

This commit is contained in:
LillyJadeKatrin 2025-04-27 09:15:01 -04:00
parent 98678e9a8b
commit f4f26a26d2
7 changed files with 192 additions and 0 deletions

View File

@ -6,6 +6,12 @@ object AchievementModel {
@JvmStatic
external fun init()
@JvmStatic
external fun login(password: String)
@JvmStatic
external fun logout()
@JvmStatic
external fun shutdown()
}

View File

@ -80,6 +80,18 @@ enum class StringSetting(
Settings.SECTION_GFX_SETTINGS,
"DriverLibName",
""
),
ACHIEVEMENTS_USERNAME(
Settings.FILE_ACHIEVEMENTS,
Settings.SECTION_ACHIEVEMENTS,
"Username",
""
),
ACHIEVEMENTS_API_TOKEN(
Settings.FILE_ACHIEVEMENTS,
Settings.SECTION_ACHIEVEMENTS,
"ApiToken",
""
);
override val isOverridden: Boolean

View File

@ -0,0 +1,51 @@
// SPDX-License-Identifier: GPL-2.0-or-later
package org.dolphinemu.dolphinemu.features.settings.ui
import android.os.Bundle
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import androidx.fragment.app.DialogFragment
import org.dolphinemu.dolphinemu.databinding.DialogLoginBinding
import org.dolphinemu.dolphinemu.features.settings.model.AchievementModel.login
import org.dolphinemu.dolphinemu.features.settings.model.NativeConfig
import org.dolphinemu.dolphinemu.features.settings.model.StringSetting
class LoginDialog : DialogFragment() {
private var _binding: DialogLoginBinding? = null
private val binding get() = _binding!!
override fun onCreateView(
inflater: LayoutInflater,
container: ViewGroup?,
savedInstanceState: Bundle?
): View {
_binding = DialogLoginBinding.inflate(inflater, container, false)
binding.usernameInput.setText(
StringSetting.ACHIEVEMENTS_USERNAME.string
)
return binding.getRoot()
}
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
binding.buttonCancel.setOnClickListener { onCancelClicked() }
binding.buttonLogin.setOnClickListener { onLoginClicked() }
}
override fun onDestroyView() {
super.onDestroyView()
_binding = null
}
private fun onCancelClicked() {
dismiss()
}
private fun onLoginClicked() {
StringSetting.ACHIEVEMENTS_USERNAME.setString(NativeConfig.LAYER_BASE_OR_CURRENT,
binding.usernameInput.text.toString())
login(binding.passwordInput.text.toString())
dismiss()
}
}

View File

@ -31,6 +31,7 @@ import org.dolphinemu.dolphinemu.features.input.ui.ProfileDialog
import org.dolphinemu.dolphinemu.features.input.ui.ProfileDialogPresenter
import org.dolphinemu.dolphinemu.features.settings.model.*
import org.dolphinemu.dolphinemu.features.settings.model.view.*
import org.dolphinemu.dolphinemu.features.settings.model.AchievementModel.logout
import org.dolphinemu.dolphinemu.model.GpuDriverMetadata
import org.dolphinemu.dolphinemu.ui.main.MainPresenter
import org.dolphinemu.dolphinemu.utils.*
@ -953,6 +954,33 @@ class SettingsFragmentPresenter(
)
)
if (BooleanSetting.ACHIEVEMENTS_ENABLED.boolean) {
if (StringSetting.ACHIEVEMENTS_API_TOKEN.string == "") {
sl.add(
RunRunnable(
context,
R.string.achievements_login,
0,
0,
0,
false
) {
fragmentView.showDialogFragment(LoginDialog())
loadSettingsList()
})
} else {
sl.add(
RunRunnable(
context,
R.string.achievements_logout,
0,
0,
0,
false
) {
logout()
loadSettingsList()
})
}
sl.add(
SwitchSetting(
context,

View File

@ -0,0 +1,78 @@
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:id="@+id/root"
android:minWidth="320dp"
android:layout_width="wrap_content"
android:layout_height="wrap_content">
<com.google.android.material.textfield.TextInputLayout
android:id="@+id/username"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_marginHorizontal="@dimen/spacing_large"
android:layout_marginVertical="@dimen/spacing_small"
android:paddingTop="@dimen/spacing_medlarge"
app:layout_constraintBottom_toTopOf="@id/password"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent">
<com.google.android.material.textfield.TextInputEditText
android:id="@+id/username_input"
android:hint="@string/achievements_username"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:importantForAutofill="no"
android:inputType="text"
android:minHeight="48dp"
android:textAlignment="viewStart" />
</com.google.android.material.textfield.TextInputLayout>
<com.google.android.material.textfield.TextInputLayout
android:id="@+id/password"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_marginHorizontal="@dimen/spacing_large"
app:layout_constraintBottom_toTopOf="@id/button_cancel"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@id/username">
<com.google.android.material.textfield.TextInputEditText
android:id="@+id/password_input"
android:hint="@string/achievements_password"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:minHeight="48dp"
android:importantForAutofill="no"
android:inputType="textPassword"
android:textAlignment="viewStart" />
</com.google.android.material.textfield.TextInputLayout>
<Button
android:id="@+id/button_cancel"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_margin="@dimen/spacing_large"
android:text="@string/cancel"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toStartOf="@id/button_login"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@id/password" />
<Button
android:id="@+id/button_login"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_margin="@dimen/spacing_large"
android:text="@string/ok"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toEndOf="@id/button_cancel"
app:layout_constraintTop_toBottomOf="@id/password" />
</androidx.constraintlayout.widget.ConstraintLayout>

View File

@ -962,4 +962,8 @@ It can efficiently compress both junk data and encrypted Wii data.
<string name="achievements_encore_enabled">Enable Encore Mode</string>
<string name="achievements_spectator_enabled">Enable Spectator Mode</string>
<string name="achievements_progress_enabled">Enable Progress Notifications</string>
<string name="achievements_username">Username</string>
<string name="achievements_password">Password</string>
<string name="achievements_login">Log In</string>
<string name="achievements_logout">Log Out</string>
</resources>

View File

@ -14,6 +14,19 @@ Java_org_dolphinemu_dolphinemu_features_settings_model_AchievementModel_init(JNI
AchievementManager::GetInstance().Init(nullptr);
}
JNIEXPORT void JNICALL
Java_org_dolphinemu_dolphinemu_features_settings_model_AchievementModel_login(JNIEnv* env, jclass,
jstring password)
{
AchievementManager::GetInstance().Login(GetJString(env, password));
}
JNIEXPORT void JNICALL
Java_org_dolphinemu_dolphinemu_features_settings_model_AchievementModel_logout(JNIEnv* env, jclass)
{
AchievementManager::GetInstance().Logout();
}
JNIEXPORT void JNICALL
Java_org_dolphinemu_dolphinemu_features_settings_model_AchievementModel_shutdown(JNIEnv* env,
jclass)