diff --git a/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/NativeLibrary.java b/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/NativeLibrary.java
index eca80d530c8..7d4714d7580 100644
--- a/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/NativeLibrary.java
+++ b/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/NativeLibrary.java
@@ -308,6 +308,8 @@ public final class NativeLibrary
public static native void ReloadConfig();
+ public static native void ResetDolphinSettings();
+
public static native void UpdateGCAdapterScanThread();
/**
diff --git a/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/activities/UserDataActivity.kt b/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/activities/UserDataActivity.kt
index 39ba64b6578..4639da28399 100644
--- a/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/activities/UserDataActivity.kt
+++ b/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/activities/UserDataActivity.kt
@@ -15,6 +15,8 @@ import androidx.appcompat.app.AppCompatActivity
import androidx.core.view.ViewCompat
import androidx.core.view.WindowInsetsCompat
import androidx.lifecycle.ViewModelProvider
+import com.google.android.material.dialog.MaterialAlertDialogBuilder
+import org.dolphinemu.dolphinemu.NativeLibrary
import org.dolphinemu.dolphinemu.R
import org.dolphinemu.dolphinemu.databinding.ActivityUserDataBinding
import org.dolphinemu.dolphinemu.dialogs.NotificationDialog
@@ -22,8 +24,11 @@ import org.dolphinemu.dolphinemu.dialogs.TaskDialog
import org.dolphinemu.dolphinemu.dialogs.UserDataImportWarningDialog
import org.dolphinemu.dolphinemu.features.DocumentProvider
import org.dolphinemu.dolphinemu.model.TaskViewModel
+import org.dolphinemu.dolphinemu.ui.main.ThemeProvider
import org.dolphinemu.dolphinemu.utils.*
+import org.dolphinemu.dolphinemu.utils.ThemeHelper
import org.dolphinemu.dolphinemu.utils.ThemeHelper.enableScrollTint
+import org.dolphinemu.dolphinemu.utils.ThemeHelper.setCorrectTheme
import java.io.File
import java.io.FileInputStream
import java.io.FileOutputStream
@@ -33,11 +38,13 @@ import java.util.zip.ZipInputStream
import java.util.zip.ZipOutputStream
import kotlin.system.exitProcess
-class UserDataActivity : AppCompatActivity() {
+class UserDataActivity : AppCompatActivity(), ThemeProvider {
private lateinit var taskViewModel: TaskViewModel
private lateinit var mBinding: ActivityUserDataBinding
+ override var themeId: Int = 0
+
override fun onCreate(savedInstanceState: Bundle?) {
taskViewModel = ViewModelProvider(this)[TaskViewModel::class.java]
@@ -73,11 +80,17 @@ class UserDataActivity : AppCompatActivity() {
mBinding.buttonExportUserData.setOnClickListener { exportUserData() }
+ mBinding.buttonResetSettings.setOnClickListener { confirmResetSettings() }
+
setSupportActionBar(mBinding.toolbarUserData)
supportActionBar!!.setDisplayHomeAsUpEnabled(true)
setInsets()
enableScrollTint(this, mBinding.toolbarUserData, mBinding.appbarUserData)
+
+ if (savedInstanceState == null) {
+ Analytics.checkAnalyticsInit(this)
+ }
}
override fun onSupportNavigateUp(): Boolean {
@@ -85,6 +98,16 @@ class UserDataActivity : AppCompatActivity() {
return true
}
+ override fun onResume() {
+ setCorrectTheme(this)
+ super.onResume()
+ }
+
+ override fun setTheme(themeId: Int) {
+ super.setTheme(themeId)
+ this.themeId = themeId
+ }
+
public override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
super.onActivityResult(requestCode, resultCode, data)
@@ -113,6 +136,28 @@ class UserDataActivity : AppCompatActivity() {
}
}
+ private fun confirmResetSettings() {
+ MaterialAlertDialogBuilder(this)
+ .setTitle(R.string.reset_dolphin_settings)
+ .setMessage(R.string.reset_dolphin_settings_confirmation)
+ .setPositiveButton(R.string.yes) { _, _ -> resetSettings() }
+ .setNegativeButton(R.string.no, null)
+ .show()
+ }
+
+ private fun resetSettings() {
+ NativeLibrary.ResetDolphinSettings()
+ ThemeHelper.resetThemePreferences(this, false)
+
+ val restartIntent = Intent(this, UserDataActivity::class.java)
+ restartIntent.addFlags(Intent.FLAG_ACTIVITY_NO_ANIMATION)
+
+ finish()
+ overridePendingTransition(0, 0)
+ startActivity(restartIntent)
+ overridePendingTransition(0, 0)
+ }
+
private fun openFileManager() {
// First, try to open the user data folder directly
try {
diff --git a/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/settings/ui/SettingsActivity.kt b/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/settings/ui/SettingsActivity.kt
index 316a6e97985..9b252b5cdd5 100644
--- a/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/settings/ui/SettingsActivity.kt
+++ b/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/settings/ui/SettingsActivity.kt
@@ -32,18 +32,21 @@ import org.dolphinemu.dolphinemu.features.input.model.ControllerInterface
import org.dolphinemu.dolphinemu.features.settings.model.Settings
import org.dolphinemu.dolphinemu.features.settings.ui.SettingsFragment.Companion.newInstance
import org.dolphinemu.dolphinemu.ui.main.MainPresenter
+import org.dolphinemu.dolphinemu.ui.main.ThemeProvider
import org.dolphinemu.dolphinemu.utils.FileBrowserHelper
import org.dolphinemu.dolphinemu.utils.InsetsHelper
import org.dolphinemu.dolphinemu.utils.SerializableHelper.serializable
import org.dolphinemu.dolphinemu.utils.ThemeHelper.enableScrollTint
+import org.dolphinemu.dolphinemu.utils.ThemeHelper.setCorrectTheme
import org.dolphinemu.dolphinemu.utils.ThemeHelper.setTheme
-class SettingsActivity : AppCompatActivity(), SettingsActivityView {
+class SettingsActivity : AppCompatActivity(), SettingsActivityView, ThemeProvider {
private var presenter: SettingsActivityPresenter? = null
private var dialog: AlertDialog? = null
private var toolbarLayout: CollapsingToolbarLayout? = null
private var binding: ActivitySettingsBinding? = null
+ override var themeId: Int = 0
override var isMappingAllDevices = false
override val settings: Settings
@@ -106,6 +109,16 @@ class SettingsActivity : AppCompatActivity(), SettingsActivityView {
presenter!!.onStart()
}
+ override fun onResume() {
+ setCorrectTheme(this)
+ super.onResume()
+ }
+
+ override fun setTheme(themeId: Int) {
+ super.setTheme(themeId)
+ this.themeId = themeId
+ }
+
/**
* If this is called, the user has left the settings screen (potentially through the
* home button) and will expect their changes to be persisted.
diff --git a/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/utils/ThemeHelper.kt b/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/utils/ThemeHelper.kt
index 1f3f6942026..810bcda8b0f 100644
--- a/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/utils/ThemeHelper.kt
+++ b/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/utils/ThemeHelper.kt
@@ -141,11 +141,27 @@ object ThemeHelper {
activity.recreate()
}
+ @JvmStatic
+ fun resetThemePreferences(activity: AppCompatActivity, applyImmediately: Boolean = false) {
+ PreferenceManager.getDefaultSharedPreferences(activity.applicationContext)
+ .edit()
+ .remove(CURRENT_THEME)
+ .remove(CURRENT_THEME_MODE)
+ .remove(USE_BLACK_BACKGROUNDS)
+ .apply()
+ activity.delegate.localNightMode = AppCompatDelegate.MODE_NIGHT_FOLLOW_SYSTEM
+ activity.delegate.applyDayNight()
+ if (applyImmediately) {
+ activity.recreate()
+ }
+ }
+
@JvmStatic
fun setCorrectTheme(activity: AppCompatActivity) {
- val currentTheme = (activity as ThemeProvider).themeId
+ val provider = activity as? ThemeProvider ?: return
+ val currentTheme = provider.themeId
setTheme(activity)
- if (currentTheme != (activity as ThemeProvider).themeId) {
+ if (currentTheme != provider.themeId) {
activity.recreate()
}
}
diff --git a/Source/Android/app/src/main/res/layout-land/activity_user_data.xml b/Source/Android/app/src/main/res/layout-land/activity_user_data.xml
index df1f5c4cc21..fa729401ba5 100644
--- a/Source/Android/app/src/main/res/layout-land/activity_user_data.xml
+++ b/Source/Android/app/src/main/res/layout-land/activity_user_data.xml
@@ -107,7 +107,7 @@
android:layout_width="wrap_content"
android:layout_height="wrap_content"
app:barrierDirection="start"
- app:constraint_referenced_ids="button_open_system_file_manager,button_import_user_data,button_export_user_data" />
+ app:constraint_referenced_ids="button_open_system_file_manager,button_import_user_data,button_export_user_data,button_reset_settings" />
+
+
diff --git a/Source/Android/app/src/main/res/layout/activity_user_data.xml b/Source/Android/app/src/main/res/layout/activity_user_data.xml
index 7a256bd9e9f..b2abe04cc0d 100644
--- a/Source/Android/app/src/main/res/layout/activity_user_data.xml
+++ b/Source/Android/app/src/main/res/layout/activity_user_data.xml
@@ -118,6 +118,17 @@
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintTop_toBottomOf="@id/button_import_user_data"
+ app:layout_constraintBottom_toTopOf="@id/button_reset_settings" />
+
+
diff --git a/Source/Android/app/src/main/res/values/strings.xml b/Source/Android/app/src/main/res/values/strings.xml
index 1971a1535eb..6342e35cb02 100644
--- a/Source/Android/app/src/main/res/values/strings.xml
+++ b/Source/Android/app/src/main/res/values/strings.xml
@@ -454,6 +454,9 @@
Failed to import user data.
Your user data has been exported.
Failed to export user data.
+ Reset Dolphin Settings
+ Reset All Settings
+ Are you sure you want to restore all Dolphin settings to their default values? This action cannot be undone!\nAll customizations or changes you have made will be lost.\n\nDo you want to proceed?
Yes
diff --git a/Source/Android/jni/MainAndroid.cpp b/Source/Android/jni/MainAndroid.cpp
index 50b60f00353..707e81e336a 100644
--- a/Source/Android/jni/MainAndroid.cpp
+++ b/Source/Android/jni/MainAndroid.cpp
@@ -526,6 +526,14 @@ JNIEXPORT void JNICALL Java_org_dolphinemu_dolphinemu_NativeLibrary_ReloadConfig
SConfig::GetInstance().LoadSettings();
}
+JNIEXPORT void JNICALL Java_org_dolphinemu_dolphinemu_NativeLibrary_ResetDolphinSettings(JNIEnv*,
+ jclass)
+{
+ HostThreadLock guard;
+ SConfig::ResetAllSettings();
+ UICommon::SetUserDirectory(File::GetUserPath(D_USER_IDX));
+}
+
JNIEXPORT void JNICALL
Java_org_dolphinemu_dolphinemu_NativeLibrary_UpdateGCAdapterScanThread(JNIEnv*, jclass)
{