committed by
bunnei
3 changed files with 315 additions and 366 deletions
-
366src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/ui/SettingsAdapter.java
-
313src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/ui/SettingsAdapter.kt
-
2src/android/app/src/main/res/values/strings.xml
@ -1,366 +0,0 @@ |
|||||
package org.yuzu.yuzu_emu.features.settings.ui; |
|
||||
|
|
||||
import android.content.Context; |
|
||||
import android.content.DialogInterface; |
|
||||
import android.view.LayoutInflater; |
|
||||
import android.view.View; |
|
||||
import android.view.ViewGroup; |
|
||||
import android.widget.DatePicker; |
|
||||
import android.widget.SeekBar; |
|
||||
import android.widget.TextView; |
|
||||
import android.widget.TimePicker; |
|
||||
|
|
||||
import androidx.appcompat.app.AlertDialog; |
|
||||
import androidx.recyclerview.widget.RecyclerView; |
|
||||
|
|
||||
import org.yuzu.yuzu_emu.R; |
|
||||
import org.yuzu.yuzu_emu.features.settings.model.FloatSetting; |
|
||||
import org.yuzu.yuzu_emu.features.settings.model.IntSetting; |
|
||||
import org.yuzu.yuzu_emu.features.settings.model.StringSetting; |
|
||||
import org.yuzu.yuzu_emu.features.settings.model.view.CheckBoxSetting; |
|
||||
import org.yuzu.yuzu_emu.features.settings.model.view.DateTimeSetting; |
|
||||
import org.yuzu.yuzu_emu.features.settings.model.view.SettingsItem; |
|
||||
import org.yuzu.yuzu_emu.features.settings.model.view.SingleChoiceSetting; |
|
||||
import org.yuzu.yuzu_emu.features.settings.model.view.SliderSetting; |
|
||||
import org.yuzu.yuzu_emu.features.settings.model.view.StringSingleChoiceSetting; |
|
||||
import org.yuzu.yuzu_emu.features.settings.model.view.SubmenuSetting; |
|
||||
import org.yuzu.yuzu_emu.features.settings.ui.viewholder.CheckBoxSettingViewHolder; |
|
||||
import org.yuzu.yuzu_emu.features.settings.ui.viewholder.DateTimeViewHolder; |
|
||||
import org.yuzu.yuzu_emu.features.settings.ui.viewholder.HeaderViewHolder; |
|
||||
import org.yuzu.yuzu_emu.features.settings.ui.viewholder.SettingViewHolder; |
|
||||
import org.yuzu.yuzu_emu.features.settings.ui.viewholder.SingleChoiceViewHolder; |
|
||||
import org.yuzu.yuzu_emu.features.settings.ui.viewholder.SliderViewHolder; |
|
||||
import org.yuzu.yuzu_emu.features.settings.ui.viewholder.SubmenuViewHolder; |
|
||||
import org.yuzu.yuzu_emu.utils.Log; |
|
||||
|
|
||||
import java.util.ArrayList; |
|
||||
|
|
||||
public final class SettingsAdapter extends RecyclerView.Adapter<SettingViewHolder> |
|
||||
implements DialogInterface.OnClickListener, SeekBar.OnSeekBarChangeListener { |
|
||||
private SettingsFragmentView mView; |
|
||||
private Context mContext; |
|
||||
private ArrayList<SettingsItem> mSettings; |
|
||||
|
|
||||
private SettingsItem mClickedItem; |
|
||||
private int mClickedPosition; |
|
||||
private int mSeekbarProgress; |
|
||||
|
|
||||
private AlertDialog mDialog; |
|
||||
private TextView mTextSliderValue; |
|
||||
|
|
||||
public SettingsAdapter(SettingsFragmentView view, Context context) { |
|
||||
mView = view; |
|
||||
mContext = context; |
|
||||
mClickedPosition = -1; |
|
||||
} |
|
||||
|
|
||||
@Override |
|
||||
public SettingViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { |
|
||||
View view; |
|
||||
LayoutInflater inflater = LayoutInflater.from(parent.getContext()); |
|
||||
|
|
||||
switch (viewType) { |
|
||||
case SettingsItem.TYPE_HEADER: |
|
||||
view = inflater.inflate(R.layout.list_item_settings_header, parent, false); |
|
||||
return new HeaderViewHolder(view, this); |
|
||||
|
|
||||
case SettingsItem.TYPE_CHECKBOX: |
|
||||
view = inflater.inflate(R.layout.list_item_setting_checkbox, parent, false); |
|
||||
return new CheckBoxSettingViewHolder(view, this); |
|
||||
|
|
||||
case SettingsItem.TYPE_SINGLE_CHOICE: |
|
||||
case SettingsItem.TYPE_STRING_SINGLE_CHOICE: |
|
||||
view = inflater.inflate(R.layout.list_item_setting, parent, false); |
|
||||
return new SingleChoiceViewHolder(view, this); |
|
||||
|
|
||||
case SettingsItem.TYPE_SLIDER: |
|
||||
view = inflater.inflate(R.layout.list_item_setting, parent, false); |
|
||||
return new SliderViewHolder(view, this); |
|
||||
|
|
||||
case SettingsItem.TYPE_SUBMENU: |
|
||||
view = inflater.inflate(R.layout.list_item_setting, parent, false); |
|
||||
return new SubmenuViewHolder(view, this); |
|
||||
|
|
||||
case SettingsItem.TYPE_DATETIME_SETTING: |
|
||||
view = inflater.inflate(R.layout.list_item_setting, parent, false); |
|
||||
return new DateTimeViewHolder(view, this); |
|
||||
|
|
||||
default: |
|
||||
Log.error("[SettingsAdapter] Invalid view type: " + viewType); |
|
||||
return null; |
|
||||
} |
|
||||
} |
|
||||
|
|
||||
@Override |
|
||||
public void onBindViewHolder(SettingViewHolder holder, int position) { |
|
||||
holder.bind(getItem(position)); |
|
||||
} |
|
||||
|
|
||||
private SettingsItem getItem(int position) { |
|
||||
return mSettings.get(position); |
|
||||
} |
|
||||
|
|
||||
@Override |
|
||||
public int getItemCount() { |
|
||||
if (mSettings != null) { |
|
||||
return mSettings.size(); |
|
||||
} else { |
|
||||
return 0; |
|
||||
} |
|
||||
} |
|
||||
|
|
||||
@Override |
|
||||
public int getItemViewType(int position) { |
|
||||
return getItem(position).getType(); |
|
||||
} |
|
||||
|
|
||||
public void setSettings(ArrayList<SettingsItem> settings) { |
|
||||
mSettings = settings; |
|
||||
notifyDataSetChanged(); |
|
||||
} |
|
||||
|
|
||||
public void onBooleanClick(CheckBoxSetting item, int position, boolean checked) { |
|
||||
IntSetting setting = item.setChecked(checked); |
|
||||
notifyItemChanged(position); |
|
||||
|
|
||||
if (setting != null) { |
|
||||
mView.putSetting(setting); |
|
||||
} |
|
||||
|
|
||||
mView.onSettingChanged(); |
|
||||
} |
|
||||
|
|
||||
public void onSingleChoiceClick(SingleChoiceSetting item) { |
|
||||
mClickedItem = item; |
|
||||
|
|
||||
int value = getSelectionForSingleChoiceValue(item); |
|
||||
|
|
||||
AlertDialog.Builder builder = new AlertDialog.Builder(mView.getActivity()); |
|
||||
|
|
||||
builder.setTitle(item.getNameId()); |
|
||||
builder.setSingleChoiceItems(item.getChoicesId(), value, this); |
|
||||
|
|
||||
mDialog = builder.show(); |
|
||||
} |
|
||||
|
|
||||
public void onSingleChoiceClick(SingleChoiceSetting item, int position) { |
|
||||
mClickedPosition = position; |
|
||||
onSingleChoiceClick(item); |
|
||||
} |
|
||||
|
|
||||
public void onStringSingleChoiceClick(StringSingleChoiceSetting item) { |
|
||||
mClickedItem = item; |
|
||||
|
|
||||
AlertDialog.Builder builder = new AlertDialog.Builder(mView.getActivity()); |
|
||||
|
|
||||
builder.setTitle(item.getNameId()); |
|
||||
builder.setSingleChoiceItems(item.getChoicesId(), item.getSelectValueIndex(), this); |
|
||||
|
|
||||
mDialog = builder.show(); |
|
||||
} |
|
||||
|
|
||||
public void onStringSingleChoiceClick(StringSingleChoiceSetting item, int position) { |
|
||||
mClickedPosition = position; |
|
||||
onStringSingleChoiceClick(item); |
|
||||
} |
|
||||
|
|
||||
DialogInterface.OnClickListener defaultCancelListener = (dialog, which) -> closeDialog(); |
|
||||
|
|
||||
public void onDateTimeClick(DateTimeSetting item, int position) { |
|
||||
mClickedItem = item; |
|
||||
mClickedPosition = position; |
|
||||
|
|
||||
AlertDialog.Builder builder = new AlertDialog.Builder(mView.getActivity()); |
|
||||
|
|
||||
LayoutInflater inflater = LayoutInflater.from(mView.getActivity()); |
|
||||
View view = inflater.inflate(R.layout.sysclock_datetime_picker, null); |
|
||||
|
|
||||
DatePicker dp = view.findViewById(R.id.date_picker); |
|
||||
TimePicker tp = view.findViewById(R.id.time_picker); |
|
||||
|
|
||||
//set date and time to substrings of settingValue; format = 2018-12-24 04:20:69 (alright maybe not that 69) |
|
||||
String settingValue = item.getValue(); |
|
||||
dp.updateDate(Integer.parseInt(settingValue.substring(0, 4)), Integer.parseInt(settingValue.substring(5, 7)) - 1, Integer.parseInt(settingValue.substring(8, 10))); |
|
||||
|
|
||||
tp.setIs24HourView(true); |
|
||||
tp.setHour(Integer.parseInt(settingValue.substring(11, 13))); |
|
||||
tp.setMinute(Integer.parseInt(settingValue.substring(14, 16))); |
|
||||
|
|
||||
DialogInterface.OnClickListener ok = (dialog, which) -> { |
|
||||
//set it |
|
||||
int year = dp.getYear(); |
|
||||
if (year < 2000) { |
|
||||
year = 2000; |
|
||||
} |
|
||||
String month = ("00" + (dp.getMonth() + 1)).substring(String.valueOf(dp.getMonth() + 1).length()); |
|
||||
String day = ("00" + dp.getDayOfMonth()).substring(String.valueOf(dp.getDayOfMonth()).length()); |
|
||||
String hr = ("00" + tp.getHour()).substring(String.valueOf(tp.getHour()).length()); |
|
||||
String min = ("00" + tp.getMinute()).substring(String.valueOf(tp.getMinute()).length()); |
|
||||
String datetime = year + "-" + month + "-" + day + " " + hr + ":" + min + ":01"; |
|
||||
|
|
||||
StringSetting setting = item.setSelectedValue(datetime); |
|
||||
if (setting != null) { |
|
||||
mView.putSetting(setting); |
|
||||
} |
|
||||
|
|
||||
mView.onSettingChanged(); |
|
||||
|
|
||||
mClickedItem = null; |
|
||||
closeDialog(); |
|
||||
}; |
|
||||
|
|
||||
builder.setView(view); |
|
||||
builder.setPositiveButton(android.R.string.ok, ok); |
|
||||
builder.setNegativeButton(android.R.string.cancel, defaultCancelListener); |
|
||||
mDialog = builder.show(); |
|
||||
} |
|
||||
|
|
||||
public void onSliderClick(SliderSetting item, int position) { |
|
||||
mClickedItem = item; |
|
||||
mClickedPosition = position; |
|
||||
mSeekbarProgress = item.getSelectedValue(); |
|
||||
AlertDialog.Builder builder = new AlertDialog.Builder(mView.getActivity()); |
|
||||
|
|
||||
LayoutInflater inflater = LayoutInflater.from(mView.getActivity()); |
|
||||
View view = inflater.inflate(R.layout.dialog_seekbar, null); |
|
||||
|
|
||||
SeekBar seekbar = view.findViewById(R.id.seekbar); |
|
||||
|
|
||||
builder.setTitle(item.getNameId()); |
|
||||
builder.setView(view); |
|
||||
builder.setPositiveButton(android.R.string.ok, this); |
|
||||
builder.setNegativeButton(android.R.string.cancel, defaultCancelListener); |
|
||||
builder.setNeutralButton(R.string.slider_default, (DialogInterface dialog, int which) -> { |
|
||||
seekbar.setProgress(item.getDefaultValue()); |
|
||||
onClick(dialog, which); |
|
||||
}); |
|
||||
mDialog = builder.show(); |
|
||||
|
|
||||
mTextSliderValue = view.findViewById(R.id.text_value); |
|
||||
mTextSliderValue.setText(String.valueOf(mSeekbarProgress)); |
|
||||
|
|
||||
TextView units = view.findViewById(R.id.text_units); |
|
||||
units.setText(item.getUnits()); |
|
||||
|
|
||||
seekbar.setMin(item.getMin()); |
|
||||
seekbar.setMax(item.getMax()); |
|
||||
seekbar.setProgress(mSeekbarProgress); |
|
||||
|
|
||||
seekbar.setOnSeekBarChangeListener(this); |
|
||||
} |
|
||||
|
|
||||
public void onSubmenuClick(SubmenuSetting item) { |
|
||||
mView.loadSubMenu(item.getMenuKey()); |
|
||||
} |
|
||||
|
|
||||
@Override |
|
||||
public void onClick(DialogInterface dialog, int which) { |
|
||||
if (mClickedItem instanceof SingleChoiceSetting) { |
|
||||
SingleChoiceSetting scSetting = (SingleChoiceSetting) mClickedItem; |
|
||||
|
|
||||
int value = getValueForSingleChoiceSelection(scSetting, which); |
|
||||
if (scSetting.getSelectedValue() != value) { |
|
||||
mView.onSettingChanged(); |
|
||||
} |
|
||||
|
|
||||
// Get the backing Setting, which may be null (if for example it was missing from the file) |
|
||||
IntSetting setting = scSetting.setSelectedValue(value); |
|
||||
if (setting != null) { |
|
||||
mView.putSetting(setting); |
|
||||
} |
|
||||
|
|
||||
closeDialog(); |
|
||||
} else if (mClickedItem instanceof StringSingleChoiceSetting) { |
|
||||
StringSingleChoiceSetting scSetting = (StringSingleChoiceSetting) mClickedItem; |
|
||||
String value = scSetting.getValueAt(which); |
|
||||
if (!scSetting.getSelectedValue().equals(value)) |
|
||||
mView.onSettingChanged(); |
|
||||
|
|
||||
StringSetting setting = scSetting.setSelectedValue(value); |
|
||||
if (setting != null) { |
|
||||
mView.putSetting(setting); |
|
||||
} |
|
||||
|
|
||||
closeDialog(); |
|
||||
} else if (mClickedItem instanceof SliderSetting) { |
|
||||
SliderSetting sliderSetting = (SliderSetting) mClickedItem; |
|
||||
if (sliderSetting.getSelectedValue() != mSeekbarProgress) { |
|
||||
mView.onSettingChanged(); |
|
||||
} |
|
||||
|
|
||||
if (sliderSetting.getSetting() instanceof FloatSetting) { |
|
||||
float value = (float) mSeekbarProgress; |
|
||||
|
|
||||
FloatSetting setting = sliderSetting.setSelectedValue(value); |
|
||||
if (setting != null) { |
|
||||
mView.putSetting(setting); |
|
||||
} |
|
||||
} else { |
|
||||
IntSetting setting = sliderSetting.setSelectedValue(mSeekbarProgress); |
|
||||
if (setting != null) { |
|
||||
mView.putSetting(setting); |
|
||||
} |
|
||||
} |
|
||||
|
|
||||
closeDialog(); |
|
||||
} |
|
||||
|
|
||||
mClickedItem = null; |
|
||||
mSeekbarProgress = -1; |
|
||||
} |
|
||||
|
|
||||
public void closeDialog() { |
|
||||
if (mDialog != null) { |
|
||||
if (mClickedPosition != -1) { |
|
||||
notifyItemChanged(mClickedPosition); |
|
||||
mClickedPosition = -1; |
|
||||
} |
|
||||
mDialog.dismiss(); |
|
||||
mDialog = null; |
|
||||
} |
|
||||
} |
|
||||
|
|
||||
@Override |
|
||||
public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) { |
|
||||
mSeekbarProgress = progress; |
|
||||
mTextSliderValue.setText(String.valueOf(mSeekbarProgress)); |
|
||||
} |
|
||||
|
|
||||
@Override |
|
||||
public void onStartTrackingTouch(SeekBar seekBar) { |
|
||||
} |
|
||||
|
|
||||
@Override |
|
||||
public void onStopTrackingTouch(SeekBar seekBar) { |
|
||||
} |
|
||||
|
|
||||
private int getValueForSingleChoiceSelection(SingleChoiceSetting item, int which) { |
|
||||
int valuesId = item.getValuesId(); |
|
||||
|
|
||||
if (valuesId > 0) { |
|
||||
int[] valuesArray = mContext.getResources().getIntArray(valuesId); |
|
||||
return valuesArray[which]; |
|
||||
} else { |
|
||||
return which; |
|
||||
} |
|
||||
} |
|
||||
|
|
||||
private int getSelectionForSingleChoiceValue(SingleChoiceSetting item) { |
|
||||
int value = item.getSelectedValue(); |
|
||||
int valuesId = item.getValuesId(); |
|
||||
|
|
||||
if (valuesId > 0) { |
|
||||
int[] valuesArray = mContext.getResources().getIntArray(valuesId); |
|
||||
for (int index = 0; index < valuesArray.length; index++) { |
|
||||
int current = valuesArray[index]; |
|
||||
if (current == value) { |
|
||||
return index; |
|
||||
} |
|
||||
} |
|
||||
} else { |
|
||||
return value; |
|
||||
} |
|
||||
|
|
||||
return -1; |
|
||||
} |
|
||||
} |
|
||||
@ -0,0 +1,313 @@ |
|||||
|
package org.yuzu.yuzu_emu.features.settings.ui |
||||
|
|
||||
|
import android.content.Context |
||||
|
import android.content.DialogInterface |
||||
|
import android.icu.util.Calendar |
||||
|
import android.icu.util.TimeZone |
||||
|
import android.text.format.DateFormat |
||||
|
import android.view.LayoutInflater |
||||
|
import android.view.View |
||||
|
import android.view.ViewGroup |
||||
|
import android.widget.TextView |
||||
|
import androidx.appcompat.app.AlertDialog |
||||
|
import androidx.recyclerview.widget.RecyclerView |
||||
|
import com.google.android.material.datepicker.MaterialDatePicker |
||||
|
import com.google.android.material.dialog.MaterialAlertDialogBuilder |
||||
|
import com.google.android.material.slider.Slider |
||||
|
import com.google.android.material.timepicker.MaterialTimePicker |
||||
|
import com.google.android.material.timepicker.TimeFormat |
||||
|
import org.yuzu.yuzu_emu.R |
||||
|
import org.yuzu.yuzu_emu.features.settings.model.FloatSetting |
||||
|
import org.yuzu.yuzu_emu.features.settings.model.view.* |
||||
|
import org.yuzu.yuzu_emu.features.settings.ui.viewholder.* |
||||
|
|
||||
|
class SettingsAdapter( |
||||
|
private val fragmentView: SettingsFragmentView, |
||||
|
private val context: Context |
||||
|
) : RecyclerView.Adapter<SettingViewHolder?>(), DialogInterface.OnClickListener { |
||||
|
private var settings: ArrayList<SettingsItem>? = null |
||||
|
private var clickedItem: SettingsItem? = null |
||||
|
private var clickedPosition: Int |
||||
|
private var dialog: AlertDialog? = null |
||||
|
private var sliderProgress = 0 |
||||
|
private var textSliderValue: TextView? = null |
||||
|
|
||||
|
private var defaultCancelListener = |
||||
|
DialogInterface.OnClickListener { _: DialogInterface?, _: Int -> closeDialog() } |
||||
|
|
||||
|
init { |
||||
|
clickedPosition = -1 |
||||
|
} |
||||
|
|
||||
|
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): SettingViewHolder { |
||||
|
val view: View |
||||
|
val inflater = LayoutInflater.from(parent.context) |
||||
|
return when (viewType) { |
||||
|
SettingsItem.TYPE_HEADER -> { |
||||
|
view = inflater.inflate(R.layout.list_item_settings_header, parent, false) |
||||
|
HeaderViewHolder(view, this) |
||||
|
} |
||||
|
SettingsItem.TYPE_CHECKBOX -> { |
||||
|
view = inflater.inflate(R.layout.list_item_setting_checkbox, parent, false) |
||||
|
CheckBoxSettingViewHolder(view, this) |
||||
|
} |
||||
|
SettingsItem.TYPE_SINGLE_CHOICE, SettingsItem.TYPE_STRING_SINGLE_CHOICE -> { |
||||
|
view = inflater.inflate(R.layout.list_item_setting, parent, false) |
||||
|
SingleChoiceViewHolder(view, this) |
||||
|
} |
||||
|
SettingsItem.TYPE_SLIDER -> { |
||||
|
view = inflater.inflate(R.layout.list_item_setting, parent, false) |
||||
|
SliderViewHolder(view, this) |
||||
|
} |
||||
|
SettingsItem.TYPE_SUBMENU -> { |
||||
|
view = inflater.inflate(R.layout.list_item_setting, parent, false) |
||||
|
SubmenuViewHolder(view, this) |
||||
|
} |
||||
|
SettingsItem.TYPE_DATETIME_SETTING -> { |
||||
|
view = inflater.inflate(R.layout.list_item_setting, parent, false) |
||||
|
DateTimeViewHolder(view, this) |
||||
|
} |
||||
|
else -> { |
||||
|
// TODO: Create an error view since we can't return null now |
||||
|
view = inflater.inflate(R.layout.list_item_settings_header, parent, false) |
||||
|
HeaderViewHolder(view, this) |
||||
|
} |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
override fun onBindViewHolder(holder: SettingViewHolder, position: Int) { |
||||
|
holder.bind(getItem(position)) |
||||
|
} |
||||
|
|
||||
|
private fun getItem(position: Int): SettingsItem { |
||||
|
return settings!![position] |
||||
|
} |
||||
|
|
||||
|
override fun getItemCount(): Int { |
||||
|
return if (settings != null) { |
||||
|
settings!!.size |
||||
|
} else { |
||||
|
0 |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
override fun getItemViewType(position: Int): Int { |
||||
|
return getItem(position).type |
||||
|
} |
||||
|
|
||||
|
fun setSettings(settings: ArrayList<SettingsItem>?) { |
||||
|
this.settings = settings |
||||
|
notifyDataSetChanged() |
||||
|
} |
||||
|
|
||||
|
fun onBooleanClick(item: CheckBoxSetting, position: Int, checked: Boolean) { |
||||
|
val setting = item.setChecked(checked) |
||||
|
notifyItemChanged(position) |
||||
|
if (setting != null) { |
||||
|
fragmentView.putSetting(setting) |
||||
|
} |
||||
|
fragmentView.onSettingChanged() |
||||
|
} |
||||
|
|
||||
|
private fun onSingleChoiceClick(item: SingleChoiceSetting) { |
||||
|
clickedItem = item |
||||
|
val value = getSelectionForSingleChoiceValue(item) |
||||
|
dialog = MaterialAlertDialogBuilder(context) |
||||
|
.setTitle(item.nameId) |
||||
|
.setSingleChoiceItems(item.choicesId, value, this) |
||||
|
.show() |
||||
|
} |
||||
|
|
||||
|
fun onSingleChoiceClick(item: SingleChoiceSetting, position: Int) { |
||||
|
clickedPosition = position |
||||
|
onSingleChoiceClick(item) |
||||
|
} |
||||
|
|
||||
|
private fun onStringSingleChoiceClick(item: StringSingleChoiceSetting) { |
||||
|
clickedItem = item |
||||
|
dialog = MaterialAlertDialogBuilder(context) |
||||
|
.setTitle(item.nameId) |
||||
|
.setSingleChoiceItems(item.choicesId, item.selectValueIndex, this) |
||||
|
.show() |
||||
|
} |
||||
|
|
||||
|
fun onStringSingleChoiceClick(item: StringSingleChoiceSetting, position: Int) { |
||||
|
clickedPosition = position |
||||
|
onStringSingleChoiceClick(item) |
||||
|
} |
||||
|
|
||||
|
fun onDateTimeClick(item: DateTimeSetting, position: Int) { |
||||
|
clickedItem = item |
||||
|
clickedPosition = position |
||||
|
val storedTime = java.lang.Long.decode(item.value) * 1000 |
||||
|
|
||||
|
// Helper to extract hour and minute from epoch time |
||||
|
val calendar: Calendar = Calendar.getInstance() |
||||
|
calendar.timeInMillis = storedTime |
||||
|
calendar.timeZone = TimeZone.getTimeZone("UTC") |
||||
|
|
||||
|
var timeFormat: Int = TimeFormat.CLOCK_12H |
||||
|
if (DateFormat.is24HourFormat(fragmentView.fragmentActivity)) { |
||||
|
timeFormat = TimeFormat.CLOCK_24H |
||||
|
} |
||||
|
|
||||
|
val datePicker: MaterialDatePicker<Long> = MaterialDatePicker.Builder.datePicker() |
||||
|
.setSelection(storedTime) |
||||
|
.setTitleText(R.string.select_rtc_date) |
||||
|
.build() |
||||
|
val timePicker: MaterialTimePicker = MaterialTimePicker.Builder() |
||||
|
.setTimeFormat(timeFormat) |
||||
|
.setHour(calendar.get(Calendar.HOUR_OF_DAY)) |
||||
|
.setMinute(calendar.get(Calendar.MINUTE)) |
||||
|
.setTitleText(R.string.select_rtc_time) |
||||
|
.build() |
||||
|
|
||||
|
datePicker.addOnPositiveButtonClickListener { |
||||
|
timePicker.show( |
||||
|
fragmentView.fragmentActivity.supportFragmentManager, |
||||
|
"TimePicker" |
||||
|
) |
||||
|
} |
||||
|
timePicker.addOnPositiveButtonClickListener { |
||||
|
var epochTime: Long = datePicker.selection!! / 1000 |
||||
|
epochTime += timePicker.hour.toLong() * 60 * 60 |
||||
|
epochTime += timePicker.minute.toLong() * 60 |
||||
|
val rtcString = epochTime.toString() |
||||
|
if (item.value != rtcString) { |
||||
|
notifyItemChanged(clickedPosition) |
||||
|
fragmentView.onSettingChanged() |
||||
|
} |
||||
|
item.setSelectedValue(rtcString) |
||||
|
clickedItem = null |
||||
|
} |
||||
|
datePicker.show(fragmentView.fragmentActivity.supportFragmentManager, "DatePicker") |
||||
|
} |
||||
|
|
||||
|
fun onSliderClick(item: SliderSetting, position: Int) { |
||||
|
clickedItem = item |
||||
|
clickedPosition = position |
||||
|
sliderProgress = item.selectedValue |
||||
|
|
||||
|
val inflater = LayoutInflater.from(context) |
||||
|
val sliderLayout = inflater.inflate(R.layout.dialog_slider, null) |
||||
|
val sliderView = sliderLayout.findViewById<Slider>(R.id.slider) |
||||
|
|
||||
|
textSliderValue = sliderLayout.findViewById(R.id.text_value) |
||||
|
textSliderValue!!.text = sliderProgress.toString() |
||||
|
val units = sliderLayout.findViewById<TextView>(R.id.text_units) |
||||
|
units.text = item.units |
||||
|
|
||||
|
sliderView.apply { |
||||
|
valueFrom = item.min.toFloat() |
||||
|
valueTo = item.max.toFloat() |
||||
|
value = sliderProgress.toFloat() |
||||
|
addOnChangeListener { _: Slider, value: Float, _: Boolean -> |
||||
|
sliderProgress = value.toInt() |
||||
|
textSliderValue!!.text = sliderProgress.toString() |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
dialog = MaterialAlertDialogBuilder(context) |
||||
|
.setTitle(item.nameId) |
||||
|
.setView(sliderLayout) |
||||
|
.setPositiveButton(android.R.string.ok, this) |
||||
|
.setNegativeButton(android.R.string.cancel, defaultCancelListener) |
||||
|
.setNeutralButton(R.string.slider_default) { dialog: DialogInterface, which: Int -> |
||||
|
sliderView.value = item.defaultValue.toFloat() |
||||
|
onClick(dialog, which) |
||||
|
} |
||||
|
.show() |
||||
|
} |
||||
|
|
||||
|
fun onSubmenuClick(item: SubmenuSetting) { |
||||
|
fragmentView.loadSubMenu(item.menuKey) |
||||
|
} |
||||
|
|
||||
|
override fun onClick(dialog: DialogInterface, which: Int) { |
||||
|
when (clickedItem) { |
||||
|
is SingleChoiceSetting -> { |
||||
|
val scSetting = clickedItem as SingleChoiceSetting |
||||
|
val value = getValueForSingleChoiceSelection(scSetting, which) |
||||
|
if (scSetting.selectedValue != value) { |
||||
|
fragmentView.onSettingChanged() |
||||
|
} |
||||
|
|
||||
|
// Get the backing Setting, which may be null (if for example it was missing from the file) |
||||
|
val setting = scSetting.setSelectedValue(value) |
||||
|
if (setting != null) { |
||||
|
fragmentView.putSetting(setting) |
||||
|
} |
||||
|
closeDialog() |
||||
|
} |
||||
|
is StringSingleChoiceSetting -> { |
||||
|
val scSetting = clickedItem as StringSingleChoiceSetting |
||||
|
val value = scSetting.getValueAt(which) |
||||
|
if (scSetting.selectedValue != value) fragmentView.onSettingChanged() |
||||
|
val setting = scSetting.setSelectedValue(value) |
||||
|
if (setting != null) { |
||||
|
fragmentView.putSetting(setting) |
||||
|
} |
||||
|
closeDialog() |
||||
|
} |
||||
|
is SliderSetting -> { |
||||
|
val sliderSetting = clickedItem as SliderSetting |
||||
|
if (sliderSetting.selectedValue != sliderProgress) { |
||||
|
fragmentView.onSettingChanged() |
||||
|
} |
||||
|
if (sliderSetting.setting is FloatSetting) { |
||||
|
val value = sliderProgress.toFloat() |
||||
|
val setting = sliderSetting.setSelectedValue(value) |
||||
|
if (setting != null) { |
||||
|
fragmentView.putSetting(setting) |
||||
|
} |
||||
|
} else { |
||||
|
val setting = sliderSetting.setSelectedValue(sliderProgress) |
||||
|
if (setting != null) { |
||||
|
fragmentView.putSetting(setting) |
||||
|
} |
||||
|
} |
||||
|
closeDialog() |
||||
|
} |
||||
|
} |
||||
|
clickedItem = null |
||||
|
sliderProgress = -1 |
||||
|
} |
||||
|
|
||||
|
fun closeDialog() { |
||||
|
if (dialog != null) { |
||||
|
if (clickedPosition != -1) { |
||||
|
notifyItemChanged(clickedPosition) |
||||
|
clickedPosition = -1 |
||||
|
} |
||||
|
dialog!!.dismiss() |
||||
|
dialog = null |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
private fun getValueForSingleChoiceSelection(item: SingleChoiceSetting, which: Int): Int { |
||||
|
val valuesId = item.valuesId |
||||
|
return if (valuesId > 0) { |
||||
|
val valuesArray = context.resources.getIntArray(valuesId) |
||||
|
valuesArray[which] |
||||
|
} else { |
||||
|
which |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
private fun getSelectionForSingleChoiceValue(item: SingleChoiceSetting): Int { |
||||
|
val value = item.selectedValue |
||||
|
val valuesId = item.valuesId |
||||
|
if (valuesId > 0) { |
||||
|
val valuesArray = context.resources.getIntArray(valuesId) |
||||
|
for (index in valuesArray.indices) { |
||||
|
val current = valuesArray[index] |
||||
|
if (current == value) { |
||||
|
return index |
||||
|
} |
||||
|
} |
||||
|
} else { |
||||
|
return value |
||||
|
} |
||||
|
return -1 |
||||
|
} |
||||
|
} |
||||
Write
Preview
Loading…
Cancel
Save
Reference in new issue