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" />