summaryrefslogtreecommitdiff
path: root/Source
diff options
context:
space:
mode:
authorCharles Lombardo <clombardo169@gmail.com>2023-01-17 13:18:33 -0500
committerCharles Lombardo <clombardo169@gmail.com>2023-01-18 01:56:05 -0500
commitbbb83054afe13451d1f8b463b61b9e057d3db267 (patch)
tree95a3a576941ab0b14782e16e9b9bf585be3fb5d6 /Source
parentd63462a14e8565a596f0678fbc956be36746e36c (diff)
Android: Expose custom rtc options
Diffstat (limited to 'Source')
-rw-r--r--Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/settings/model/BooleanSetting.java3
-rw-r--r--Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/settings/model/StringSetting.java4
-rw-r--r--Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/settings/model/view/DateTimeChoiceSetting.kt31
-rw-r--r--Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/settings/model/view/SettingsItem.java1
-rw-r--r--Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/settings/ui/SettingsAdapter.java69
-rw-r--r--Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/settings/ui/SettingsFragmentPresenter.java7
-rw-r--r--Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/settings/ui/viewholder/DateTimeSettingViewHolder.kt52
-rw-r--r--Source/Android/app/src/main/res/values/strings.xml6
8 files changed, 173 insertions, 0 deletions
diff --git a/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/settings/model/BooleanSetting.java b/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/settings/model/BooleanSetting.java
index b473831adc..e7b22c36d9 100644
--- a/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/settings/model/BooleanSetting.java
+++ b/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/settings/model/BooleanSetting.java
@@ -44,6 +44,8 @@ public enum BooleanSetting implements AbstractBooleanSetting
MAIN_OVERCLOCK_ENABLE(Settings.FILE_DOLPHIN, Settings.SECTION_INI_CORE, "OverclockEnable", false),
MAIN_RAM_OVERRIDE_ENABLE(Settings.FILE_DOLPHIN, Settings.SECTION_INI_CORE, "RAMOverrideEnable",
false),
+ MAIN_CUSTOM_RTC_ENABLE(Settings.FILE_DOLPHIN, Settings.SECTION_INI_CORE, "EnableCustomRTC",
+ false),
MAIN_AUTO_DISC_CHANGE(Settings.FILE_DOLPHIN, Settings.SECTION_INI_CORE, "AutoDiscChange", false),
MAIN_ALLOW_SD_WRITES(Settings.FILE_DOLPHIN, Settings.SECTION_INI_CORE, "WiiSDCardAllowWrites",
true),
@@ -267,6 +269,7 @@ public enum BooleanSetting implements AbstractBooleanSetting
MAIN_PAUSE_ON_PANIC,
MAIN_ACCURATE_CPU_CACHE,
MAIN_RAM_OVERRIDE_ENABLE,
+ MAIN_CUSTOM_RTC_ENABLE,
MAIN_DSP_JIT,
};
diff --git a/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/settings/model/StringSetting.java b/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/settings/model/StringSetting.java
index d838f6879b..09af07ef76 100644
--- a/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/settings/model/StringSetting.java
+++ b/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/settings/model/StringSetting.java
@@ -21,6 +21,9 @@ public enum StringSetting implements AbstractStringSetting
MAIN_BBA_BUILTIN_DNS(Settings.FILE_DOLPHIN, Settings.SECTION_INI_CORE, "BBA_BUILTIN_DNS",
"149.56.167.128"),
+ MAIN_CUSTOM_RTC_VALUE(Settings.FILE_DOLPHIN, Settings.SECTION_INI_CORE, "CustomRTCValue",
+ "0x386d4380"),
+
MAIN_GFX_BACKEND(Settings.FILE_DOLPHIN, Settings.SECTION_INI_CORE, "GFXBackend",
NativeLibrary.GetDefaultGraphicsBackendName()),
@@ -39,6 +42,7 @@ public enum StringSetting implements AbstractStringSetting
"PostProcessingShader", "");
private static final StringSetting[] NOT_RUNTIME_EDITABLE_ARRAY = new StringSetting[]{
+ MAIN_CUSTOM_RTC_VALUE,
MAIN_GFX_BACKEND,
};
diff --git a/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/settings/model/view/DateTimeChoiceSetting.kt b/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/settings/model/view/DateTimeChoiceSetting.kt
new file mode 100644
index 0000000000..d37ea57a98
--- /dev/null
+++ b/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/settings/model/view/DateTimeChoiceSetting.kt
@@ -0,0 +1,31 @@
+// SPDX-License-Identifier: GPL-2.0-or-later
+
+package org.dolphinemu.dolphinemu.features.settings.model.view
+
+import android.content.Context
+import org.dolphinemu.dolphinemu.features.settings.model.AbstractSetting
+import org.dolphinemu.dolphinemu.features.settings.model.AbstractStringSetting
+import org.dolphinemu.dolphinemu.features.settings.model.Settings
+
+class DateTimeChoiceSetting(
+ context: Context,
+ private val setting: AbstractStringSetting,
+ nameId: Int,
+ descriptionId: Int
+) : SettingsItem(context, nameId, descriptionId) {
+ override fun getType(): Int {
+ return TYPE_DATETIME_CHOICE
+ }
+
+ override fun getSetting(): AbstractSetting {
+ return setting
+ }
+
+ fun setSelectedValue(settings: Settings?, selection: String) {
+ setting.setString(settings, selection)
+ }
+
+ fun getSelectedValue(settings: Settings): String {
+ return setting.getString(settings)
+ }
+}
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 21b782fcb3..7b41c8e3f8 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
@@ -29,6 +29,7 @@ public abstract class SettingsItem
public static final int TYPE_RUN_RUNNABLE = 10;
public static final int TYPE_STRING = 11;
public static final int TYPE_HYPERLINK_HEADER = 12;
+ public static final int TYPE_DATETIME_CHOICE = 13;
private final CharSequence mName;
private final CharSequence mDescription;
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 b51d87e5a9..89db998bbd 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
@@ -9,6 +9,7 @@ import android.graphics.PorterDuff;
import android.graphics.drawable.Drawable;
import android.os.Build;
import android.provider.DocumentsContract;
+import android.text.format.DateFormat;
import android.view.LayoutInflater;
import android.view.ViewGroup;
import android.widget.TextView;
@@ -20,10 +21,14 @@ import androidx.core.content.ContextCompat;
import androidx.recyclerview.widget.RecyclerView;
import com.google.android.material.color.MaterialColors;
+import com.google.android.material.datepicker.CalendarConstraints;
+import com.google.android.material.datepicker.MaterialDatePicker;
import com.google.android.material.dialog.MaterialAlertDialogBuilder;
import com.google.android.material.elevation.ElevationOverlayProvider;
import com.google.android.material.slider.Slider;
import com.google.android.material.textfield.TextInputEditText;
+import com.google.android.material.timepicker.MaterialTimePicker;
+import com.google.android.material.timepicker.TimeFormat;
import org.dolphinemu.dolphinemu.R;
import org.dolphinemu.dolphinemu.databinding.DialogInputStringBinding;
@@ -34,6 +39,7 @@ import org.dolphinemu.dolphinemu.databinding.ListItemSettingSwitchBinding;
import org.dolphinemu.dolphinemu.databinding.ListItemSubmenuBinding;
import org.dolphinemu.dolphinemu.dialogs.MotionAlertDialog;
import org.dolphinemu.dolphinemu.features.settings.model.Settings;
+import org.dolphinemu.dolphinemu.features.settings.model.view.DateTimeChoiceSetting;
import org.dolphinemu.dolphinemu.features.settings.model.view.SwitchSetting;
import org.dolphinemu.dolphinemu.features.settings.model.view.FilePicker;
import org.dolphinemu.dolphinemu.features.settings.model.view.FloatSliderSetting;
@@ -47,6 +53,7 @@ import org.dolphinemu.dolphinemu.features.settings.model.view.SliderSetting;
import org.dolphinemu.dolphinemu.features.settings.model.view.InputStringSetting;
import org.dolphinemu.dolphinemu.features.settings.model.view.StringSingleChoiceSetting;
import org.dolphinemu.dolphinemu.features.settings.model.view.SubmenuSetting;
+import org.dolphinemu.dolphinemu.features.settings.ui.viewholder.DateTimeSettingViewHolder;
import org.dolphinemu.dolphinemu.features.settings.ui.viewholder.FilePickerViewHolder;
import org.dolphinemu.dolphinemu.features.settings.ui.viewholder.HeaderHyperLinkViewHolder;
import org.dolphinemu.dolphinemu.features.settings.ui.viewholder.HeaderViewHolder;
@@ -68,6 +75,8 @@ import java.io.File;
import java.io.IOException;
import java.io.RandomAccessFile;
import java.util.ArrayList;
+import java.util.Calendar;
+import java.util.TimeZone;
public final class SettingsAdapter extends RecyclerView.Adapter<SettingViewHolder>
implements DialogInterface.OnClickListener, Slider.OnChangeListener
@@ -135,6 +144,9 @@ public final class SettingsAdapter extends RecyclerView.Adapter<SettingViewHolde
case SettingsItem.TYPE_HYPERLINK_HEADER:
return new HeaderHyperLinkViewHolder(ListItemHeaderBinding.inflate(inflater), this);
+ case SettingsItem.TYPE_DATETIME_CHOICE:
+ return new DateTimeSettingViewHolder(ListItemSettingBinding.inflate(inflater), this);
+
default:
throw new IllegalArgumentException("Invalid view type: " + viewType);
}
@@ -366,6 +378,63 @@ public final class SettingsAdapter extends RecyclerView.Adapter<SettingViewHolde
mView.getActivity().startActivityForResult(intent, filePicker.getRequestType());
}
+ public void onDateTimeClick(DateTimeChoiceSetting item, int position)
+ {
+ mClickedItem = item;
+ mClickedPosition = position;
+ long storedTime = Long.decode(item.getSelectedValue(mView.getSettings())) * 1000;
+
+ // Helper to extract hour and minute from epoch time
+ Calendar calendar = Calendar.getInstance();
+ calendar.setTimeInMillis(storedTime);
+ calendar.setTimeZone(TimeZone.getTimeZone("UTC"));
+
+ // Start and end epoch times available for the Wii's date picker
+ CalendarConstraints calendarConstraints = new CalendarConstraints.Builder()
+ .setStart(946684800000L)
+ .setEnd(2082672000000L)
+ .build();
+
+ int timeFormat = TimeFormat.CLOCK_12H;
+ if (DateFormat.is24HourFormat(mView.getActivity()))
+ {
+ timeFormat = TimeFormat.CLOCK_24H;
+ }
+
+ MaterialDatePicker<Long> datePicker = MaterialDatePicker.Builder.datePicker()
+ .setSelection(storedTime)
+ .setTitleText(R.string.select_rtc_date)
+ .setCalendarConstraints(calendarConstraints)
+ .build();
+ MaterialTimePicker timePicker = new 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(
+ selection -> timePicker.show(mView.getActivity().getSupportFragmentManager(),
+ "TimePicker"));
+ timePicker.addOnPositiveButtonClickListener(selection ->
+ {
+ long epochTime = datePicker.getSelection() / 1000;
+ epochTime += (long) timePicker.getHour() * 60 * 60;
+ epochTime += (long) timePicker.getMinute() * 60;
+ String rtcString = "0x" + Long.toHexString(epochTime);
+ if (!item.getSelectedValue(mView.getSettings()).equals(rtcString))
+ {
+ notifyItemChanged(mClickedPosition);
+ mView.onSettingChanged();
+ }
+
+ item.setSelectedValue(mView.getSettings(), rtcString);
+
+ mClickedItem = null;
+ });
+ datePicker.show(mView.getActivity().getSupportFragmentManager(), "DatePicker");
+ }
+
public void onFilePickerConfirmation(String selectedFile)
{
FilePicker filePicker = (FilePicker) mClickedItem;
diff --git a/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/settings/ui/SettingsFragmentPresenter.java b/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/settings/ui/SettingsFragmentPresenter.java
index b5282a296d..9d51007c4f 100644
--- a/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/settings/ui/SettingsFragmentPresenter.java
+++ b/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/settings/ui/SettingsFragmentPresenter.java
@@ -25,6 +25,7 @@ import org.dolphinemu.dolphinemu.features.settings.model.PostProcessing;
import org.dolphinemu.dolphinemu.features.settings.model.Settings;
import org.dolphinemu.dolphinemu.features.settings.model.StringSetting;
import org.dolphinemu.dolphinemu.features.settings.model.WiimoteProfileStringSetting;
+import org.dolphinemu.dolphinemu.features.settings.model.view.DateTimeChoiceSetting;
import org.dolphinemu.dolphinemu.features.settings.model.view.SwitchSetting;
import org.dolphinemu.dolphinemu.features.settings.model.view.FilePicker;
import org.dolphinemu.dolphinemu.features.settings.model.view.HeaderSetting;
@@ -811,6 +812,12 @@ public final class SettingsFragmentPresenter
sl.add(new SingleChoiceSetting(mContext, synchronizeGpuThread, R.string.synchronize_gpu_thread,
R.string.synchronize_gpu_thread_description, R.array.synchronizeGpuThreadEntries,
R.array.synchronizeGpuThreadValues));
+
+ sl.add(new HeaderSetting(mContext, R.string.custom_rtc_options, 0));
+ sl.add(new SwitchSetting(mContext, BooleanSetting.MAIN_CUSTOM_RTC_ENABLE,
+ R.string.custom_rtc_enable, R.string.custom_rtc_description));
+ sl.add(new DateTimeChoiceSetting(mContext, StringSetting.MAIN_CUSTOM_RTC_VALUE,
+ R.string.set_custom_rtc, 0));
}
private void addSerialPortSubSettings(ArrayList<SettingsItem> sl, int serialPort1Type)
diff --git a/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/settings/ui/viewholder/DateTimeSettingViewHolder.kt b/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/settings/ui/viewholder/DateTimeSettingViewHolder.kt
new file mode 100644
index 0000000000..79693e9c64
--- /dev/null
+++ b/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/settings/ui/viewholder/DateTimeSettingViewHolder.kt
@@ -0,0 +1,52 @@
+// SPDX-License-Identifier: GPL-2.0-or-later
+
+package org.dolphinemu.dolphinemu.features.settings.ui.viewholder
+
+import android.text.TextUtils
+import android.view.View
+import org.dolphinemu.dolphinemu.databinding.ListItemSettingBinding
+import org.dolphinemu.dolphinemu.features.settings.model.view.DateTimeChoiceSetting
+import org.dolphinemu.dolphinemu.features.settings.model.view.SettingsItem
+import org.dolphinemu.dolphinemu.features.settings.ui.SettingsAdapter
+import java.time.Instant
+import java.time.ZoneId
+import java.time.ZonedDateTime
+import java.time.format.DateTimeFormatter
+import java.time.format.FormatStyle
+
+class DateTimeSettingViewHolder(
+ private val binding: ListItemSettingBinding,
+ adapter: SettingsAdapter
+) : SettingViewHolder(binding.root, adapter) {
+ private var mItem: DateTimeChoiceSetting? = null
+
+ override fun bind(item: SettingsItem) {
+ mItem = item as DateTimeChoiceSetting
+ val inputTime = mItem!!.getSelectedValue(adapter.settings)
+ binding.textSettingName.text = item.getName()
+
+ if (!TextUtils.isEmpty(inputTime)) {
+ val epochTime = inputTime.substring(2).toLong(16)
+ val instant = Instant.ofEpochMilli(epochTime * 1000)
+ val zonedTime = ZonedDateTime.ofInstant(instant, ZoneId.of("UTC"))
+ val dateFormatter = DateTimeFormatter.ofLocalizedDateTime(FormatStyle.MEDIUM)
+ binding.textSettingDescription.text = dateFormatter.format(zonedTime)
+ } else {
+ binding.textSettingDescription.text = item.getDescription()
+ }
+ setStyle(binding.textSettingName, mItem)
+ }
+
+ override fun onClick(clicked: View) {
+ if (!mItem!!.isEditable) {
+ showNotRuntimeEditableError()
+ return
+ }
+ adapter.onDateTimeClick(mItem, bindingAdapterPosition)
+ setStyle(binding.textSettingName, mItem)
+ }
+
+ override fun getItem(): SettingsItem? {
+ 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 51502c1943..163a78c3be 100644
--- a/Source/Android/app/src/main/res/values/strings.xml
+++ b/Source/Android/app/src/main/res/values/strings.xml
@@ -404,6 +404,12 @@
<string name="gpu_options">GPU Options</string>
<string name="synchronize_gpu_thread">Synchronize GPU Thread</string>
<string name="synchronize_gpu_thread_description">Synchronizing the GPU thread reduces the risk of games crashing or becoming unstable with dual core enabled, but can also reduce the performance gain of dual core. If unsure, select \"On Idle Skipping\". Selecting \"Never\" is risky and not recommended!</string>
+ <string name="custom_rtc_options">Custom RTC Options</string>
+ <string name="custom_rtc_enable">Enable Custom RTC</string>
+ <string name="custom_rtc_description">This settings allows you to set a custom real time clock (RTC) separate from your current system time.</string>
+ <string name="set_custom_rtc">Set Custom RTC</string>
+ <string name="select_rtc_date">Select RTC Date</string>
+ <string name="select_rtc_time">Select RTC Time</string>
<!-- Log Configuration -->
<string name="log_submenu">Log</string>