From 8acc39cc3f769dc378d5231ddeb634a08114f40d Mon Sep 17 00:00:00 2001 From: JosJuice Date: Sun, 26 Feb 2023 12:45:28 +0100 Subject: Android: Add a button for accessing controller mappings The settings GameCube Controller N and Wii Remote N (where N is a number) have two purposes: You can select what controller type you want to use, and also, when you select a controller type (even if you're selecting the one that already is selected), the mapping settings open. This second part is less discoverable than it ideally should be. I'm changing it so that there now is a button for opening the mapping settings instead. --- .../features/settings/ui/SettingsAdapter.java | 6 +--- .../ui/viewholder/SingleChoiceViewHolder.java | 42 ++++++++++++++++++++-- 2 files changed, 40 insertions(+), 8 deletions(-) (limited to 'Source/Android/app/src/main/java') 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 a042e7aaaf..be46ded8a1 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 @@ -467,7 +467,7 @@ public final class SettingsAdapter extends RecyclerView.Adapter getSelectedValue = null; + if (item instanceof SingleChoiceSetting) + { + SingleChoiceSetting setting = (SingleChoiceSetting) item; + menuTag = setting.getMenuTag(); + getSelectedValue = setting::getSelectedValue; + } + else if (item instanceof StringSingleChoiceSetting) + { + StringSingleChoiceSetting setting = (StringSingleChoiceSetting) item; + menuTag = setting.getMenuTag(); + getSelectedValue = setting::getSelectedValueIndex; + } + + if (menuTag != null) + { + mBinding.buttonMoreSettings.setVisibility(View.VISIBLE); + + final MenuTag finalMenuTag = menuTag; + final Function finalGetSelectedValue = getSelectedValue; + mBinding.buttonMoreSettings.setOnClickListener((view) -> + adapter.handleMenuTag(finalMenuTag, finalGetSelectedValue.apply(settings))); + } + else + { + mBinding.buttonMoreSettings.setVisibility(View.GONE); + } + setStyle(mBinding.textSettingName, mItem); } -- cgit v1.2.3 From b827b155a0ac3c29c2f916fd6f3c39f2b54defbc Mon Sep 17 00:00:00 2001 From: JosJuice Date: Mon, 27 Feb 2023 21:50:39 +0100 Subject: Android: Refactor handleMenuTag It was a bit silly having four functions for effectively the same thing in all of SettingsFragmentView, SettingsFragment, SettingsActivityView, SettingsActivity, and SettingsActivityPresenter. With this change, we split on the four MenuTag types in SettingsActivityPresenter instead of in SettingsAdapter. --- .../features/settings/ui/SettingsActivity.java | 22 +------- .../settings/ui/SettingsActivityPresenter.java | 62 ++++++++++++---------- .../features/settings/ui/SettingsActivityView.java | 39 +++----------- .../features/settings/ui/SettingsAdapter.java | 25 +-------- .../features/settings/ui/SettingsFragment.java | 22 +------- .../features/settings/ui/SettingsFragmentView.java | 35 +++--------- .../ui/viewholder/SingleChoiceViewHolder.java | 2 +- 7 files changed, 53 insertions(+), 154 deletions(-) (limited to 'Source/Android/app/src/main/java') diff --git a/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/settings/ui/SettingsActivity.java b/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/settings/ui/SettingsActivity.java index 17e53da132..99ec999f39 100644 --- a/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/settings/ui/SettingsActivity.java +++ b/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/settings/ui/SettingsActivity.java @@ -305,27 +305,9 @@ public final class SettingsActivity extends AppCompatActivity implements Setting } @Override - public void onSerialPort1SettingChanged(MenuTag menuTag, int value) + public void onMenuTagAction(@NonNull MenuTag menuTag, int value) { - mPresenter.onSerialPort1SettingChanged(menuTag, value); - } - - @Override - public void onGcPadSettingChanged(MenuTag key, int value) - { - mPresenter.onGcPadSettingChanged(key, value); - } - - @Override - public void onWiimoteSettingChanged(MenuTag section, int value) - { - mPresenter.onWiimoteSettingChanged(section, value); - } - - @Override - public void onExtensionSettingChanged(MenuTag menuTag, int value) - { - mPresenter.onExtensionSettingChanged(menuTag, value); + mPresenter.onMenuTagAction(menuTag, value); } @Override diff --git a/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/settings/ui/SettingsActivityPresenter.java b/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/settings/ui/SettingsActivityPresenter.java index 710342a64e..8bc2e2141f 100644 --- a/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/settings/ui/SettingsActivityPresenter.java +++ b/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/settings/ui/SettingsActivityPresenter.java @@ -5,6 +5,7 @@ package org.dolphinemu.dolphinemu.features.settings.ui; import android.os.Bundle; import android.text.TextUtils; +import androidx.annotation.NonNull; import androidx.core.app.ComponentActivity; import org.dolphinemu.dolphinemu.R; @@ -128,47 +129,50 @@ public final class SettingsActivityPresenter return mShouldSave; } - public void onSerialPort1SettingChanged(MenuTag key, int value) + public void onMenuTagAction(@NonNull MenuTag menuTag, int value) { - if (value != 0 && value != 255) // Not disabled or dummy + if (menuTag.isSerialPort1Menu()) { - Bundle bundle = new Bundle(); - bundle.putInt(SettingsFragmentPresenter.ARG_SERIALPORT1_TYPE, value); - mView.showSettingsFragment(key, bundle, true, mGameId); + if (value != 0 && value != 255) // Not disabled or dummy + { + Bundle bundle = new Bundle(); + bundle.putInt(SettingsFragmentPresenter.ARG_SERIALPORT1_TYPE, value); + mView.showSettingsFragment(menuTag, bundle, true, mGameId); + } } - } - public void onGcPadSettingChanged(MenuTag key, int value) - { - if (value != 0) // Not disabled + if (menuTag.isGCPadMenu()) { - Bundle bundle = new Bundle(); - bundle.putInt(SettingsFragmentPresenter.ARG_CONTROLLER_TYPE, value); - mView.showSettingsFragment(key, bundle, true, mGameId); + if (value != 0) // Not disabled + { + Bundle bundle = new Bundle(); + bundle.putInt(SettingsFragmentPresenter.ARG_CONTROLLER_TYPE, value); + mView.showSettingsFragment(menuTag, bundle, true, mGameId); + } } - } - public void onWiimoteSettingChanged(MenuTag menuTag, int value) - { - switch (value) + if (menuTag.isWiimoteMenu()) { - case 1: - mView.showSettingsFragment(menuTag, null, true, mGameId); - break; + switch (value) + { + case 1: + mView.showSettingsFragment(menuTag, null, true, mGameId); + break; - case 2: - mView.showToastMessage(mActivity.getString(R.string.make_sure_continuous_scan_enabled)); - break; + case 2: + mView.showToastMessage(mActivity.getString(R.string.make_sure_continuous_scan_enabled)); + break; + } } - } - public void onExtensionSettingChanged(MenuTag menuTag, int value) - { - if (value != 0) // None + if (menuTag.isWiimoteExtensionMenu()) { - Bundle bundle = new Bundle(); - bundle.putInt(SettingsFragmentPresenter.ARG_CONTROLLER_TYPE, value); - mView.showSettingsFragment(menuTag, bundle, true, mGameId); + if (value != 0) // None + { + Bundle bundle = new Bundle(); + bundle.putInt(SettingsFragmentPresenter.ARG_CONTROLLER_TYPE, value); + mView.showSettingsFragment(menuTag, bundle, true, mGameId); + } } } } diff --git a/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/settings/ui/SettingsActivityView.java b/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/settings/ui/SettingsActivityView.java index da14f5c5cb..cb0c23f7be 100644 --- a/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/settings/ui/SettingsActivityView.java +++ b/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/settings/ui/SettingsActivityView.java @@ -4,6 +4,8 @@ package org.dolphinemu.dolphinemu.features.settings.ui; import android.os.Bundle; +import androidx.annotation.NonNull; + import org.dolphinemu.dolphinemu.features.settings.model.Settings; /** @@ -59,40 +61,13 @@ public interface SettingsActivityView void onSettingChanged(); /** - * Called by a containing Fragment to tell the containing Activity that the Serial Port 1 setting - * was modified. - * - * @param menuTag Identifier for the SerialPort that was modified. - * @param value New setting for the SerialPort. - */ - void onSerialPort1SettingChanged(MenuTag menuTag, int value); - - /** - * Called by a containing Fragment to tell the containing Activity that a GCPad's setting - * was modified. - * - * @param menuTag Identifier for the GCPad that was modified. - * @param value New setting for the GCPad. - */ - void onGcPadSettingChanged(MenuTag menuTag, int value); - - /** - * Called by a containing Fragment to tell the containing Activity that a Wiimote's setting - * was modified. - * - * @param menuTag Identifier for Wiimote that was modified. - * @param value New setting for the Wiimote. - */ - void onWiimoteSettingChanged(MenuTag menuTag, int value); - - /** - * Called by a containing Fragment to tell the containing Activity that an extension setting - * was modified. + * Called by a containing Fragment to tell the containing Activity that the user wants to open the + * MenuTag associated with a setting. * - * @param menuTag Identifier for the extension that was modified. - * @param value New setting for the extension. + * @param menuTag The MenuTag to open. + * @param value The current value of the associated setting. */ - void onExtensionSettingChanged(MenuTag menuTag, int value); + void onMenuTagAction(@NonNull MenuTag menuTag, int value); /** * Show loading dialog while loading the 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 be46ded8a1..cc9bf8f85e 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 @@ -467,30 +467,9 @@ public final class SettingsAdapter extends RecyclerView.Adapter finalGetSelectedValue = getSelectedValue; mBinding.buttonMoreSettings.setOnClickListener((view) -> - adapter.handleMenuTag(finalMenuTag, finalGetSelectedValue.apply(settings))); + adapter.onMenuTagAction(finalMenuTag, finalGetSelectedValue.apply(settings))); } else { -- cgit v1.2.3 From 96deb2d8971fd5c9d0644bc0fae9155334c76153 Mon Sep 17 00:00:00 2001 From: JosJuice Date: Mon, 27 Feb 2023 22:04:42 +0100 Subject: Android: Hide controller mappings button when controller type is None Also removed the make_sure_continuous_scan_enabled message. It doesn't make sense with the new UX. --- .../features/settings/ui/SettingsActivity.java | 6 ++++ .../settings/ui/SettingsActivityPresenter.java | 37 ++++++++++++++++------ .../features/settings/ui/SettingsActivityView.java | 13 ++++++-- .../features/settings/ui/SettingsAdapter.java | 5 +++ .../features/settings/ui/SettingsFragment.java | 5 +++ .../features/settings/ui/SettingsFragmentView.java | 13 ++++++-- .../ui/viewholder/SingleChoiceViewHolder.java | 3 +- 7 files changed, 68 insertions(+), 14 deletions(-) (limited to 'Source/Android/app/src/main/java') diff --git a/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/settings/ui/SettingsActivity.java b/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/settings/ui/SettingsActivity.java index 99ec999f39..2af17e2d2f 100644 --- a/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/settings/ui/SettingsActivity.java +++ b/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/settings/ui/SettingsActivity.java @@ -310,6 +310,12 @@ public final class SettingsActivity extends AppCompatActivity implements Setting mPresenter.onMenuTagAction(menuTag, value); } + @Override + public boolean hasMenuTagActionForValue(@NonNull MenuTag menuTag, int value) + { + return mPresenter.hasMenuTagActionForValue(menuTag, value); + } + @Override public boolean onSupportNavigateUp() { diff --git a/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/settings/ui/SettingsActivityPresenter.java b/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/settings/ui/SettingsActivityPresenter.java index 8bc2e2141f..cc235b9863 100644 --- a/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/settings/ui/SettingsActivityPresenter.java +++ b/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/settings/ui/SettingsActivityPresenter.java @@ -153,21 +153,15 @@ public final class SettingsActivityPresenter if (menuTag.isWiimoteMenu()) { - switch (value) + if (value == 1) // Emulated Wii Remote { - case 1: - mView.showSettingsFragment(menuTag, null, true, mGameId); - break; - - case 2: - mView.showToastMessage(mActivity.getString(R.string.make_sure_continuous_scan_enabled)); - break; + mView.showSettingsFragment(menuTag, null, true, mGameId); } } if (menuTag.isWiimoteExtensionMenu()) { - if (value != 0) // None + if (value != 0) // Not disabled { Bundle bundle = new Bundle(); bundle.putInt(SettingsFragmentPresenter.ARG_CONTROLLER_TYPE, value); @@ -175,4 +169,29 @@ public final class SettingsActivityPresenter } } } + + public boolean hasMenuTagActionForValue(@NonNull MenuTag menuTag, int value) + { + if (menuTag.isSerialPort1Menu()) + { + return (value != 0 && value != 255); // Not disabled or dummy + } + + if (menuTag.isGCPadMenu()) + { + return (value != 0); // Not disabled + } + + if (menuTag.isWiimoteMenu()) + { + return (value == 1); // Emulated Wii Remote + } + + if (menuTag.isWiimoteExtensionMenu()) + { + return (value != 0); // Not disabled + } + + return false; + } } diff --git a/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/settings/ui/SettingsActivityView.java b/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/settings/ui/SettingsActivityView.java index cb0c23f7be..c835aa4399 100644 --- a/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/settings/ui/SettingsActivityView.java +++ b/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/settings/ui/SettingsActivityView.java @@ -64,11 +64,20 @@ public interface SettingsActivityView * Called by a containing Fragment to tell the containing Activity that the user wants to open the * MenuTag associated with a setting. * - * @param menuTag The MenuTag to open. - * @param value The current value of the associated setting. + * @param menuTag The MenuTag of the setting. + * @param value The current value of the setting. */ void onMenuTagAction(@NonNull MenuTag menuTag, int value); + /** + * Returns whether anything will happen when the user wants to open the MenuTag associated with a + * setting, given the current value of the setting. + * + * @param menuTag The MenuTag of the setting. + * @param value The current value of the setting. + */ + boolean hasMenuTagActionForValue(@NonNull MenuTag menuTag, int value); + /** * Show loading dialog while loading the 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 cc9bf8f85e..a7f028afe3 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 @@ -472,6 +472,11 @@ public final class SettingsAdapter extends RecyclerView.Adapter diff --git a/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/settings/ui/SettingsFragmentView.java b/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/settings/ui/SettingsFragmentView.java index 7deeead9d2..295ff95abd 100644 --- a/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/settings/ui/SettingsFragmentView.java +++ b/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/settings/ui/SettingsFragmentView.java @@ -76,8 +76,17 @@ public interface SettingsFragmentView * Have the fragment tell the containing Activity that the user wants to open the MenuTag * associated with a setting. * - * @param menuTag The MenuTag to open. - * @param value The current value of the associated setting. + * @param menuTag The MenuTag of the setting. + * @param value The current value of the setting. */ void onMenuTagAction(@NonNull MenuTag menuTag, int value); + + /** + * Returns whether anything will happen when the user wants to open the MenuTag associated with a + * setting, given the current value of the setting. + * + * @param menuTag The MenuTag of the setting. + * @param value The current value of the setting. + */ + boolean hasMenuTagActionForValue(@NonNull MenuTag menuTag, int value); } 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 462ed4bb53..db56ebea40 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 @@ -101,7 +101,8 @@ public final class SingleChoiceViewHolder extends SettingViewHolder getSelectedValue = setting::getSelectedValueIndex; } - if (menuTag != null) + if (menuTag != null && + adapter.hasMenuTagActionForValue(menuTag, getSelectedValue.apply(settings))) { mBinding.buttonMoreSettings.setVisibility(View.VISIBLE); -- cgit v1.2.3