From 064cde9774fbd0063a5de78f6fe4473b12ca596d Mon Sep 17 00:00:00 2001 From: JosJuice Date: Fri, 18 Sep 2020 18:53:01 +0200 Subject: [PATCH] Android: Long press a setting to reset it This is particularly important for game INIs, where a setting being unset is not the same as it being set to the default value. --- .../settings/model/view/SettingsItem.java | 10 +++++ .../features/settings/ui/SettingsAdapter.java | 8 ++++ .../ui/SettingsFragmentPresenter.java | 2 + .../viewholder/CheckBoxSettingViewHolder.java | 8 ++++ .../ui/viewholder/FilePickerViewHolder.java | 8 ++++ .../ui/viewholder/HeaderViewHolder.java | 8 ++++ .../InputBindingSettingViewHolder.java | 8 ++++ .../viewholder/RumbleBindingViewHolder.java | 8 ++++ .../ui/viewholder/RunRunnableViewHolder.java | 11 ++++- .../ui/viewholder/SettingViewHolder.java | 43 ++++++++++++++++++- .../ui/viewholder/SingleChoiceViewHolder.java | 8 ++++ .../ui/viewholder/SliderViewHolder.java | 8 ++++ .../ui/viewholder/SubmenuViewHolder.java | 8 ++++ .../app/src/main/res/values/strings.xml | 3 ++ 14 files changed, 137 insertions(+), 4 deletions(-) diff --git a/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/settings/model/view/SettingsItem.java b/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/settings/model/view/SettingsItem.java index ebc68f6948..5a9e5321e3 100644 --- a/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/settings/model/view/SettingsItem.java +++ b/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/settings/model/view/SettingsItem.java @@ -77,4 +77,14 @@ public abstract class SettingsItem AbstractSetting setting = getSetting(); return setting != null && setting.isRuntimeEditable(); } + + public boolean hasSetting() + { + return getSetting() != null; + } + + public void clear(Settings settings) + { + getSetting().delete(settings); + } } diff --git a/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/settings/ui/SettingsAdapter.java b/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/settings/ui/SettingsAdapter.java index 8873a668fb..4bd9753791 100644 --- a/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/settings/ui/SettingsAdapter.java +++ b/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/settings/ui/SettingsAdapter.java @@ -160,6 +160,14 @@ public final class SettingsAdapter extends RecyclerView.Adapter sl) @@ -493,6 +494,7 @@ public final class SettingsFragmentPresenter sl.add(new HeaderSetting(R.string.graphics_enhancements_and_hacks, 0)); sl.add(new SubmenuSetting(R.string.enhancements_submenu, MenuTag.ENHANCEMENTS)); sl.add(new SubmenuSetting(R.string.hacks_submenu, MenuTag.HACKS)); + sl.add(new HeaderSetting(R.string.setting_clear_info, 0)); } private void addEnhanceSettings(ArrayList sl) diff --git a/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/settings/ui/viewholder/CheckBoxSettingViewHolder.java b/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/settings/ui/viewholder/CheckBoxSettingViewHolder.java index 07206a04fa..5a505ea9df 100644 --- a/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/settings/ui/viewholder/CheckBoxSettingViewHolder.java +++ b/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/settings/ui/viewholder/CheckBoxSettingViewHolder.java @@ -4,6 +4,8 @@ import android.view.View; import android.widget.CheckBox; import android.widget.TextView; +import androidx.annotation.Nullable; + import org.dolphinemu.dolphinemu.R; import org.dolphinemu.dolphinemu.features.settings.model.view.CheckBoxSetting; import org.dolphinemu.dolphinemu.features.settings.model.view.LogCheckBoxSetting; @@ -78,4 +80,10 @@ public final class CheckBoxSettingViewHolder extends SettingViewHolder setStyle(mTextSettingName, mItem); } + + @Nullable @Override + protected SettingsItem getItem() + { + return mItem; + } } diff --git a/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/settings/ui/viewholder/FilePickerViewHolder.java b/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/settings/ui/viewholder/FilePickerViewHolder.java index 39b17d587a..790ce1acf9 100644 --- a/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/settings/ui/viewholder/FilePickerViewHolder.java +++ b/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/settings/ui/viewholder/FilePickerViewHolder.java @@ -4,6 +4,8 @@ import android.text.TextUtils; import android.view.View; import android.widget.TextView; +import androidx.annotation.Nullable; + import org.dolphinemu.dolphinemu.R; import org.dolphinemu.dolphinemu.features.settings.model.view.FilePicker; import org.dolphinemu.dolphinemu.features.settings.model.view.SettingsItem; @@ -82,4 +84,10 @@ public final class FilePickerViewHolder extends SettingViewHolder setStyle(mTextSettingName, mItem); } + + @Nullable @Override + protected SettingsItem getItem() + { + return mItem; + } } diff --git a/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/settings/ui/viewholder/HeaderViewHolder.java b/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/settings/ui/viewholder/HeaderViewHolder.java index 6ece671bf4..2661379e70 100644 --- a/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/settings/ui/viewholder/HeaderViewHolder.java +++ b/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/settings/ui/viewholder/HeaderViewHolder.java @@ -3,6 +3,8 @@ package org.dolphinemu.dolphinemu.features.settings.ui.viewholder; import android.view.View; import android.widget.TextView; +import androidx.annotation.Nullable; + import org.dolphinemu.dolphinemu.R; import org.dolphinemu.dolphinemu.features.settings.model.view.SettingsItem; import org.dolphinemu.dolphinemu.features.settings.ui.SettingsAdapter; @@ -34,4 +36,10 @@ public final class HeaderViewHolder extends SettingViewHolder { // no-op } + + @Nullable @Override + protected SettingsItem getItem() + { + return null; + } } diff --git a/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/settings/ui/viewholder/InputBindingSettingViewHolder.java b/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/settings/ui/viewholder/InputBindingSettingViewHolder.java index 7dda7b3630..8e65949112 100644 --- a/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/settings/ui/viewholder/InputBindingSettingViewHolder.java +++ b/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/settings/ui/viewholder/InputBindingSettingViewHolder.java @@ -6,6 +6,8 @@ import android.preference.PreferenceManager; import android.view.View; import android.widget.TextView; +import androidx.annotation.Nullable; + import org.dolphinemu.dolphinemu.R; import org.dolphinemu.dolphinemu.features.settings.model.view.InputBindingSetting; import org.dolphinemu.dolphinemu.features.settings.model.view.SettingsItem; @@ -61,4 +63,10 @@ public final class InputBindingSettingViewHolder extends SettingViewHolder setStyle(mTextSettingName, mItem); } + + @Nullable @Override + protected SettingsItem getItem() + { + return mItem; + } } diff --git a/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/settings/ui/viewholder/RumbleBindingViewHolder.java b/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/settings/ui/viewholder/RumbleBindingViewHolder.java index 3968e0c078..dc77ccf0c5 100644 --- a/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/settings/ui/viewholder/RumbleBindingViewHolder.java +++ b/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/settings/ui/viewholder/RumbleBindingViewHolder.java @@ -6,6 +6,8 @@ import android.preference.PreferenceManager; import android.view.View; import android.widget.TextView; +import androidx.annotation.Nullable; + import org.dolphinemu.dolphinemu.R; import org.dolphinemu.dolphinemu.features.settings.model.view.RumbleBindingSetting; import org.dolphinemu.dolphinemu.features.settings.model.view.SettingsItem; @@ -61,4 +63,10 @@ public class RumbleBindingViewHolder extends SettingViewHolder setStyle(mTextSettingName, mItem); } + + @Nullable @Override + protected SettingsItem getItem() + { + return mItem; + } } diff --git a/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/settings/ui/viewholder/RunRunnableViewHolder.java b/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/settings/ui/viewholder/RunRunnableViewHolder.java index 1fd87824df..b80f218e6a 100644 --- a/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/settings/ui/viewholder/RunRunnableViewHolder.java +++ b/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/settings/ui/viewholder/RunRunnableViewHolder.java @@ -5,6 +5,7 @@ import android.view.View; import android.widget.TextView; import android.widget.Toast; +import androidx.annotation.Nullable; import androidx.appcompat.app.AlertDialog; import org.dolphinemu.dolphinemu.R; @@ -56,8 +57,8 @@ public final class RunRunnableViewHolder extends SettingViewHolder if (alertTextID > 0) { AlertDialog.Builder builder = new AlertDialog.Builder(mContext, R.style.DolphinDialogBase) - .setTitle(mContext.getString(mItem.getNameId())) - .setMessage(mContext.getString(alertTextID)); + .setTitle(mItem.getNameId()) + .setMessage(alertTextID); builder .setPositiveButton(R.string.ok, (dialog, whichButton) -> @@ -75,6 +76,12 @@ public final class RunRunnableViewHolder extends SettingViewHolder } } + @Nullable @Override + protected SettingsItem getItem() + { + return mItem; + } + private void runRunnable() { mItem.getRunnable().run(); diff --git a/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/settings/ui/viewholder/SettingViewHolder.java b/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/settings/ui/viewholder/SettingViewHolder.java index c23a3a270b..bd1cf09f2c 100644 --- a/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/settings/ui/viewholder/SettingViewHolder.java +++ b/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/settings/ui/viewholder/SettingViewHolder.java @@ -1,12 +1,14 @@ package org.dolphinemu.dolphinemu.features.settings.ui.viewholder; - +import android.content.Context; import android.graphics.Paint; import android.graphics.Typeface; import android.view.View; import android.widget.TextView; import android.widget.Toast; +import androidx.annotation.Nullable; +import androidx.appcompat.app.AlertDialog; import androidx.recyclerview.widget.RecyclerView; import org.dolphinemu.dolphinemu.DolphinApplication; @@ -15,7 +17,7 @@ import org.dolphinemu.dolphinemu.features.settings.model.view.SettingsItem; import org.dolphinemu.dolphinemu.features.settings.ui.SettingsAdapter; public abstract class SettingViewHolder extends RecyclerView.ViewHolder - implements View.OnClickListener + implements View.OnClickListener, View.OnLongClickListener { private SettingsAdapter mAdapter; @@ -26,6 +28,7 @@ public abstract class SettingViewHolder extends RecyclerView.ViewHolder mAdapter = adapter; itemView.setOnClickListener(this); + itemView.setOnLongClickListener(this); findViews(itemView); } @@ -72,4 +75,40 @@ public abstract class SettingViewHolder extends RecyclerView.ViewHolder * @param clicked The view that was clicked on. */ public abstract void onClick(View clicked); + + @Nullable + protected abstract SettingsItem getItem(); + + public boolean onLongClick(View clicked) + { + SettingsItem item = getItem(); + + if (item == null || !item.hasSetting()) + return false; + + if (!item.isEditable()) + { + showNotRuntimeEditableError(); + return true; + } + + Context context = clicked.getContext(); + + AlertDialog.Builder builder = new AlertDialog.Builder(context, R.style.DolphinDialogBase) + .setMessage(R.string.setting_clear_confirm); + + builder + .setPositiveButton(R.string.ok, (dialog, whichButton) -> + { + getAdapter().clearSetting(item, getAdapterPosition()); + bind(item); + Toast.makeText(context, R.string.setting_cleared, Toast.LENGTH_SHORT).show(); + dialog.dismiss(); + }) + .setNegativeButton(R.string.cancel, (dialog, whichButton) -> dialog.dismiss()); + + builder.show(); + + return true; + } } diff --git a/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/settings/ui/viewholder/SingleChoiceViewHolder.java b/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/settings/ui/viewholder/SingleChoiceViewHolder.java index a8f869cba9..c359d4d6e1 100644 --- a/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/settings/ui/viewholder/SingleChoiceViewHolder.java +++ b/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/settings/ui/viewholder/SingleChoiceViewHolder.java @@ -4,6 +4,8 @@ import android.content.res.Resources; import android.view.View; import android.widget.TextView; +import androidx.annotation.Nullable; + import org.dolphinemu.dolphinemu.R; import org.dolphinemu.dolphinemu.features.settings.model.view.SettingsItem; import org.dolphinemu.dolphinemu.features.settings.model.view.SingleChoiceSetting; @@ -110,4 +112,10 @@ public final class SingleChoiceViewHolder extends SettingViewHolder setStyle(mTextSettingName, mItem); } + + @Nullable @Override + protected SettingsItem getItem() + { + return mItem; + } } diff --git a/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/settings/ui/viewholder/SliderViewHolder.java b/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/settings/ui/viewholder/SliderViewHolder.java index 6a7d9a0fa3..64534fe957 100644 --- a/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/settings/ui/viewholder/SliderViewHolder.java +++ b/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/settings/ui/viewholder/SliderViewHolder.java @@ -4,6 +4,8 @@ import android.content.Context; import android.view.View; import android.widget.TextView; +import androidx.annotation.Nullable; + import org.dolphinemu.dolphinemu.R; import org.dolphinemu.dolphinemu.features.settings.model.view.SettingsItem; import org.dolphinemu.dolphinemu.features.settings.model.view.SliderSetting; @@ -66,5 +68,11 @@ public final class SliderViewHolder extends SettingViewHolder setStyle(mTextSettingName, mItem); } + + @Nullable @Override + protected SettingsItem getItem() + { + return mItem; + } } diff --git a/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/settings/ui/viewholder/SubmenuViewHolder.java b/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/settings/ui/viewholder/SubmenuViewHolder.java index 0560f3818f..33aa4bfb33 100644 --- a/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/settings/ui/viewholder/SubmenuViewHolder.java +++ b/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/settings/ui/viewholder/SubmenuViewHolder.java @@ -3,6 +3,8 @@ package org.dolphinemu.dolphinemu.features.settings.ui.viewholder; import android.view.View; import android.widget.TextView; +import androidx.annotation.Nullable; + import org.dolphinemu.dolphinemu.R; import org.dolphinemu.dolphinemu.features.settings.model.view.SettingsItem; import org.dolphinemu.dolphinemu.features.settings.model.view.SubmenuSetting; @@ -38,4 +40,10 @@ public final class SubmenuViewHolder extends SettingViewHolder { getAdapter().onSubmenuClick(mItem); } + + @Nullable @Override + protected SettingsItem getItem() + { + return mItem; + } } diff --git a/Source/Android/app/src/main/res/values/strings.xml b/Source/Android/app/src/main/res/values/strings.xml index 902665ba05..c13e665576 100644 --- a/Source/Android/app/src/main/res/values/strings.xml +++ b/Source/Android/app/src/main/res/values/strings.xml @@ -418,6 +418,9 @@ It can efficiently compress both junk data and encrypted Wii data. You need to allow write access to external storage for the emulator to work Loading Settings... This setting can\'t be changed while a game is running. + Long press a setting to clear it. + Do you want to restore this setting to its default value? + Setting cleared Change Disc The external storage needs to be available in order to use Dolphin