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..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 @@ -305,27 +305,15 @@ 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); + mPresenter.onMenuTagAction(menuTag, value); } @Override - public void onGcPadSettingChanged(MenuTag key, int value) + public boolean hasMenuTagActionForValue(@NonNull MenuTag menuTag, 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); + return mPresenter.hasMenuTagActionForValue(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..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 @@ -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,69 @@ 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: + if (value == 1) // Emulated Wii Remote + { mView.showSettingsFragment(menuTag, null, true, mGameId); - break; + } + } - case 2: - mView.showToastMessage(mActivity.getString(R.string.make_sure_continuous_scan_enabled)); - break; + if (menuTag.isWiimoteExtensionMenu()) + { + if (value != 0) // Not disabled + { + Bundle bundle = new Bundle(); + bundle.putInt(SettingsFragmentPresenter.ARG_CONTROLLER_TYPE, value); + mView.showSettingsFragment(menuTag, bundle, true, mGameId); + } } } - public void onExtensionSettingChanged(MenuTag menuTag, int value) + public boolean hasMenuTagActionForValue(@NonNull MenuTag menuTag, int value) { - if (value != 0) // None + if (menuTag.isSerialPort1Menu()) { - Bundle bundle = new Bundle(); - bundle.putInt(SettingsFragmentPresenter.ARG_CONTROLLER_TYPE, value); - mView.showSettingsFragment(menuTag, bundle, true, mGameId); + 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 da14f5c5cb..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 @@ -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,22 @@ public interface SettingsActivityView void onSettingChanged(); /** - * Called by a containing Fragment to tell the containing Activity that the Serial Port 1 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 SerialPort that was modified. - * @param value New setting for the SerialPort. + * @param menuTag The MenuTag of the setting. + * @param value The current value of the setting. */ - void onSerialPort1SettingChanged(MenuTag menuTag, int value); + void onMenuTagAction(@NonNull MenuTag menuTag, int value); /** - * Called by a containing Fragment to tell the containing Activity that a GCPad's setting - * was modified. + * 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 Identifier for the GCPad that was modified. - * @param value New setting for the GCPad. + * @param menuTag The MenuTag of the setting. + * @param value The current value of the setting. */ - 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. - * - * @param menuTag Identifier for the extension that was modified. - * @param value New setting for the extension. - */ - void onExtensionSettingChanged(MenuTag menuTag, int value); + 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 a042e7aaaf..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 @@ -467,30 +467,14 @@ 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 && + adapter.hasMenuTagActionForValue(menuTag, getSelectedValue.apply(settings))) + { + mBinding.buttonMoreSettings.setVisibility(View.VISIBLE); + + final MenuTag finalMenuTag = menuTag; + final Function finalGetSelectedValue = getSelectedValue; + mBinding.buttonMoreSettings.setOnClickListener((view) -> + adapter.onMenuTagAction(finalMenuTag, finalGetSelectedValue.apply(settings))); + } + else + { + mBinding.buttonMoreSettings.setVisibility(View.GONE); + } + setStyle(mBinding.textSettingName, mItem); } diff --git a/Source/Android/app/src/main/res/layout-ldrtl/list_item_setting.xml b/Source/Android/app/src/main/res/layout-ldrtl/list_item_setting.xml new file mode 100644 index 0000000000..eb2ac6c617 --- /dev/null +++ b/Source/Android/app/src/main/res/layout-ldrtl/list_item_setting.xml @@ -0,0 +1,57 @@ + + + + + + + +