summaryrefslogtreecommitdiff
path: root/Source/Android
diff options
context:
space:
mode:
Diffstat (limited to 'Source/Android')
-rw-r--r--Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/settings/model/AchievementModel.kt6
-rw-r--r--Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/settings/model/StringSetting.kt12
-rw-r--r--Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/settings/ui/LoginDialog.kt51
-rw-r--r--Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/settings/ui/SettingsFragmentPresenter.kt28
-rw-r--r--Source/Android/app/src/main/res/layout/dialog_login.xml78
-rw-r--r--Source/Android/app/src/main/res/values/strings.xml4
-rw-r--r--Source/Android/jni/AchievementAdapter.cpp13
7 files changed, 192 insertions, 0 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 345daf54a1..6626ba0df3 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
@@ -7,5 +7,11 @@ object AchievementModel {
external fun init()
@JvmStatic
+ external fun login(password: String)
+
+ @JvmStatic
+ external fun logout()
+
+ @JvmStatic
external fun shutdown()
}
diff --git a/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/settings/model/StringSetting.kt b/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/settings/model/StringSetting.kt
index b150c845e1..29640aa92f 100644
--- a/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/settings/model/StringSetting.kt
+++ b/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/settings/model/StringSetting.kt
@@ -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
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
new file mode 100644
index 0000000000..f49c9ff922
--- /dev/null
+++ b/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/settings/ui/LoginDialog.kt
@@ -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()
+ }
+}
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 a5ee2f28df..0fd8a97782 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
@@ -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,
diff --git a/Source/Android/app/src/main/res/layout/dialog_login.xml b/Source/Android/app/src/main/res/layout/dialog_login.xml
new file mode 100644
index 0000000000..a8b2b3228c
--- /dev/null
+++ b/Source/Android/app/src/main/res/layout/dialog_login.xml
@@ -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>
diff --git a/Source/Android/app/src/main/res/values/strings.xml b/Source/Android/app/src/main/res/values/strings.xml
index 67ac68f75e..90440c466e 100644
--- a/Source/Android/app/src/main/res/values/strings.xml
+++ b/Source/Android/app/src/main/res/values/strings.xml
@@ -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>
diff --git a/Source/Android/jni/AchievementAdapter.cpp b/Source/Android/jni/AchievementAdapter.cpp
index 119ecbbd6f..4ecb73d653 100644
--- a/Source/Android/jni/AchievementAdapter.cpp
+++ b/Source/Android/jni/AchievementAdapter.cpp
@@ -15,6 +15,19 @@ Java_org_dolphinemu_dolphinemu_features_settings_model_AchievementModel_init(JNI
}
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)
{