Expand Up @@ -10,12 +10,16 @@
import androidx.annotation.Nullable;

import org.dolphinemu.dolphinemu.databinding.ListItemSettingBinding;
import org.dolphinemu.dolphinemu.features.settings.model.Settings;
import org.dolphinemu.dolphinemu.features.settings.model.view.SettingsItem;
import org.dolphinemu.dolphinemu.features.settings.model.view.SingleChoiceSetting;
import org.dolphinemu.dolphinemu.features.settings.model.view.SingleChoiceSettingDynamicDescriptions;
import org.dolphinemu.dolphinemu.features.settings.model.view.StringSingleChoiceSetting;
import org.dolphinemu.dolphinemu.features.settings.ui.MenuTag;
import org.dolphinemu.dolphinemu.features.settings.ui.SettingsAdapter;

import java.util.function.Function;

public final class SingleChoiceViewHolder extends SettingViewHolder
{
private SettingsItem mItem;
Expand All @@ -35,14 +39,17 @@ public void bind(SettingsItem item)

mBinding.textSettingName.setText(item.getName());

SettingsAdapter adapter = getAdapter();
Settings settings = adapter.getSettings();

if (!TextUtils.isEmpty(item.getDescription()))
{
mBinding.textSettingDescription.setText(item.getDescription());
}
else if (item instanceof SingleChoiceSetting)
{
SingleChoiceSetting setting = (SingleChoiceSetting) item;
int selected = setting.getSelectedValue(getAdapter().getSettings());
int selected = setting.getSelectedValue(settings);
Resources resMgr = mBinding.textSettingDescription.getContext().getResources();
String[] choices = resMgr.getStringArray(setting.getChoicesId());
int[] values = resMgr.getIntArray(setting.getValuesId());
Expand All @@ -58,15 +65,15 @@ else if (item instanceof StringSingleChoiceSetting)
{
StringSingleChoiceSetting setting = (StringSingleChoiceSetting) item;
String[] choices = setting.getChoices();
int valueIndex = setting.getSelectedValueIndex(getAdapter().getSettings());
int valueIndex = setting.getSelectedValueIndex(settings);
if (valueIndex != -1)
mBinding.textSettingDescription.setText(choices[valueIndex]);
}
else if (item instanceof SingleChoiceSettingDynamicDescriptions)
{
SingleChoiceSettingDynamicDescriptions setting =
(SingleChoiceSettingDynamicDescriptions) item;
int selected = setting.getSelectedValue(getAdapter().getSettings());
int selected = setting.getSelectedValue(settings);
Resources resMgr = mBinding.textSettingDescription.getContext().getResources();
String[] choices = resMgr.getStringArray(setting.getDescriptionChoicesId());
int[] values = resMgr.getIntArray(setting.getDescriptionValuesId());
Expand All @@ -79,6 +86,36 @@ else if (item instanceof SingleChoiceSettingDynamicDescriptions)
}
}

MenuTag menuTag = null;
Function<Settings, Integer> 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<Settings, Integer> finalGetSelectedValue = getSelectedValue;
mBinding.buttonMoreSettings.setOnClickListener((view) ->
adapter.onMenuTagAction(finalMenuTag, finalGetSelectedValue.apply(settings)));
}
else
{
mBinding.buttonMoreSettings.setVisibility(View.GONE);
}

setStyle(mBinding.textSettingName, mItem);
}

Expand Down
57 changes: 57 additions & 0 deletions Source/Android/app/src/main/res/layout-ldrtl/list_item_setting.xml
@@ -0,0 +1,57 @@
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout android:id="@+id/root"
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="?android:attr/selectableItemBackground"
android:clickable="true"
android:focusable="true"
android:nextFocusLeft="@id/button_more_settings">

<TextView
android:id="@+id/text_setting_name"
style="@style/TextAppearance.MaterialComponents.Headline5"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_alignParentStart="true"
android:layout_alignParentTop="true"
android:layout_marginEnd="@dimen/spacing_large"
android:layout_marginStart="@dimen/spacing_large"
android:layout_marginTop="@dimen/spacing_large"
android:textSize="16sp"
android:textAlignment="viewStart"
android:layout_toStartOf="@+id/button_more_settings"
tools:text="Setting Name" />

<TextView
android:id="@+id/text_setting_description"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_alignParentStart="true"
android:layout_alignStart="@+id/text_setting_name"
android:layout_below="@+id/text_setting_name"
android:layout_marginBottom="@dimen/spacing_large"
android:layout_marginEnd="@dimen/spacing_large"
android:layout_marginStart="@dimen/spacing_large"
android:layout_marginTop="@dimen/spacing_small"
android:layout_toStartOf="@+id/button_more_settings"
android:textAlignment="viewStart"
tools:text="@string/overclock_enable_description" />

<Button
android:id="@+id/button_more_settings"
style="?attr/materialIconButtonStyle"
android:contentDescription="@string/more_settings"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentEnd="true"
android:layout_centerVertical="true"
android:layout_marginEnd="@dimen/spacing_small"
android:nextFocusRight="@id/root"
android:visibility="gone"
app:icon="@drawable/ic_settings"
app:iconTint="?attr/colorOnPrimaryContainer" />

</RelativeLayout>
27 changes: 21 additions & 6 deletions Source/Android/app/src/main/res/layout/list_item_setting.xml
@@ -1,42 +1,57 @@
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout
<RelativeLayout android:id="@+id/root"
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="?android:attr/selectableItemBackground"
android:clickable="true"
android:focusable="true"
android:minHeight="72dp">
android:nextFocusRight="@id/button_more_settings">

<TextView
android:id="@+id/text_setting_name"
style="@style/TextAppearance.MaterialComponents.Headline5"
android:layout_width="0dp"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_alignParentEnd="true"
android:layout_alignParentStart="true"
android:layout_alignParentTop="true"
android:layout_marginEnd="@dimen/spacing_large"
android:layout_marginStart="@dimen/spacing_large"
android:layout_marginTop="@dimen/spacing_large"
android:textSize="16sp"
android:textAlignment="viewStart"
android:layout_toStartOf="@+id/button_more_settings"
tools:text="Setting Name" />

<TextView
android:id="@+id/text_setting_description"
android:layout_width="wrap_content"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_alignParentEnd="true"
android:layout_alignParentStart="true"
android:layout_alignStart="@+id/text_setting_name"
android:layout_below="@+id/text_setting_name"
android:layout_marginBottom="@dimen/spacing_large"
android:layout_marginEnd="@dimen/spacing_large"
android:layout_marginStart="@dimen/spacing_large"
android:layout_marginTop="@dimen/spacing_small"
android:layout_toStartOf="@+id/button_more_settings"
android:textAlignment="viewStart"
tools:text="@string/overclock_enable_description" />

<Button
android:id="@+id/button_more_settings"
style="?attr/materialIconButtonStyle"
android:contentDescription="@string/more_settings"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentEnd="true"
android:layout_centerVertical="true"
android:layout_marginEnd="@dimen/spacing_small"
android:nextFocusLeft="@id/root"
android:visibility="gone"
app:icon="@drawable/ic_settings"
app:iconTint="?attr/colorOnPrimaryContainer" />

</RelativeLayout>
2 changes: 1 addition & 1 deletion Source/Android/app/src/main/res/values/strings.xml
Expand Up @@ -478,6 +478,7 @@
<string name="disabled">Disabled</string>
<string name="other">Other</string>
<string name="continue_anyway">Continue Anyway</string>
<string name="more_settings">More Settings</string>

<!-- Game Grid Screen-->
<string name="platform_gamecube">GameCube Games</string>
Expand Down Expand Up @@ -682,7 +683,6 @@ It can efficiently compress both junk data and encrypted Wii data.
<string name="replug_gc_adapter">GameCube Adapter couldn\'t be opened. Please re-plug the device.</string>
<string name="disabled_gc_overlay_notice">GameCube Controller 1 is set to \"None\"</string>
<string name="ignore_warning_alert_messages">Ignore for this session</string>
<string name="make_sure_continuous_scan_enabled">Please make sure Continuous Scanning is enabled in Core Settings.</string>

<!-- UI CPU Core selection -->
<string name="jit_recompiler_x86">JIT Recompiler for x86–64 (recommended)</string>
Expand Down