mirror of
https://github.com/dolphin-emu/dolphin.git
synced 2026-09-09 03:47:07 -05:00
Android: Reformat settings search files
This commit is contained in:
@@ -127,15 +127,13 @@ class SettingsActivity : AppCompatActivity(), SettingsActivityView, ThemeProvide
|
||||
}
|
||||
|
||||
refreshToolbarState()
|
||||
val focusDelay =
|
||||
if (areSystemAnimationsEnabled()) SEARCH_FOCUS_DELAY_MS else 0L
|
||||
val focusDelay = if (areSystemAnimationsEnabled()) SEARCH_FOCUS_DELAY_MS else 0L
|
||||
searchView.postDelayed({
|
||||
if (!isSettingsSearchActive) {
|
||||
return@postDelayed
|
||||
}
|
||||
searchView.requestFocus()
|
||||
WindowCompat.getInsetsController(window, searchView)
|
||||
.show(WindowInsetsCompat.Type.ime())
|
||||
WindowCompat.getInsetsController(window, searchView).show(WindowInsetsCompat.Type.ime())
|
||||
}, focusDelay)
|
||||
}
|
||||
|
||||
@@ -153,18 +151,14 @@ class SettingsActivity : AppCompatActivity(), SettingsActivityView, ThemeProvide
|
||||
private fun refreshToolbarState() {
|
||||
val title = currentToolbarTitle ?: getString(R.string.settings)
|
||||
setToolbarState(
|
||||
title,
|
||||
currentToolbarShowsHeadline,
|
||||
currentToolbarShowsSearch
|
||||
title, currentToolbarShowsHeadline, currentToolbarShowsSearch
|
||||
)
|
||||
}
|
||||
|
||||
private fun setUpBackNavigation() {
|
||||
onBackPressedDispatcher.addCallback(this, object : OnBackPressedCallback(true) {
|
||||
override fun handleOnBackPressed() {
|
||||
if (supportFragmentManager.backStackEntryCount == 0 &&
|
||||
isSettingsSearchActive
|
||||
) {
|
||||
if (supportFragmentManager.backStackEntryCount == 0 && isSettingsSearchActive) {
|
||||
exitSettingsSearch()
|
||||
return
|
||||
}
|
||||
|
||||
@@ -10,8 +10,7 @@ import org.dolphinemu.dolphinemu.utils.AfterDirectoryInitializationRunner
|
||||
import org.dolphinemu.dolphinemu.utils.Log
|
||||
|
||||
class SettingsActivityPresenter(
|
||||
private val activityView: SettingsActivityView,
|
||||
var settings: Settings?
|
||||
private val activityView: SettingsActivityView, var settings: Settings?
|
||||
) {
|
||||
private var menuTag: MenuTag? = null
|
||||
private var gameId: String? = null
|
||||
@@ -141,34 +140,25 @@ class SettingsActivityPresenter(
|
||||
private fun getMenuTagAction(menuTag: MenuTag, value: Int): MenuTagAction? {
|
||||
return when {
|
||||
// Not disabled or dummy
|
||||
menuTag.isSerialPort1Menu && value != 0 && value != 255 ->
|
||||
MenuTagAction(
|
||||
menuTag,
|
||||
Bundle().apply {
|
||||
putInt(SettingsFragmentPresenter.ARG_SERIALPORT1_TYPE, value)
|
||||
}
|
||||
)
|
||||
menuTag.isSerialPort1Menu && value != 0 && value != 255 -> MenuTagAction(
|
||||
menuTag, Bundle().apply {
|
||||
putInt(SettingsFragmentPresenter.ARG_SERIALPORT1_TYPE, value)
|
||||
})
|
||||
|
||||
// Not disabled
|
||||
menuTag.isGCPadMenu && value != 0 ->
|
||||
MenuTagAction(
|
||||
menuTag,
|
||||
Bundle().apply {
|
||||
putInt(SettingsFragmentPresenter.ARG_CONTROLLER_TYPE, value)
|
||||
}
|
||||
)
|
||||
menuTag.isGCPadMenu && value != 0 -> MenuTagAction(
|
||||
menuTag, Bundle().apply {
|
||||
putInt(SettingsFragmentPresenter.ARG_CONTROLLER_TYPE, value)
|
||||
})
|
||||
|
||||
// Emulated Wii Remote
|
||||
menuTag.isWiimoteMenu && value == 1 -> MenuTagAction(menuTag, null)
|
||||
|
||||
// Not disabled
|
||||
menuTag.isWiimoteExtensionMenu && value != 0 ->
|
||||
MenuTagAction(
|
||||
menuTag,
|
||||
Bundle().apply {
|
||||
putInt(SettingsFragmentPresenter.ARG_CONTROLLER_TYPE, value)
|
||||
}
|
||||
)
|
||||
menuTag.isWiimoteExtensionMenu && value != 0 -> MenuTagAction(
|
||||
menuTag, Bundle().apply {
|
||||
putInt(SettingsFragmentPresenter.ARG_CONTROLLER_TYPE, value)
|
||||
})
|
||||
|
||||
else -> null
|
||||
}
|
||||
|
||||
@@ -27,10 +27,7 @@ interface SettingsActivityView {
|
||||
* @param addToStack Whether or not this fragment should replace a previous one.
|
||||
*/
|
||||
fun showSettingsFragment(
|
||||
menuTag: MenuTag,
|
||||
extras: Bundle?,
|
||||
addToStack: Boolean,
|
||||
gameId: String
|
||||
menuTag: MenuTag, extras: Bundle?, addToStack: Boolean, gameId: String
|
||||
)
|
||||
|
||||
/**
|
||||
|
||||
@@ -27,14 +27,46 @@ import com.google.android.material.slider.Slider
|
||||
import com.google.android.material.timepicker.MaterialTimePicker
|
||||
import com.google.android.material.timepicker.TimeFormat
|
||||
import org.dolphinemu.dolphinemu.R
|
||||
import org.dolphinemu.dolphinemu.databinding.*
|
||||
import org.dolphinemu.dolphinemu.databinding.DialogAdvancedMappingBinding
|
||||
import org.dolphinemu.dolphinemu.databinding.DialogInputStringBinding
|
||||
import org.dolphinemu.dolphinemu.databinding.DialogSliderBinding
|
||||
import org.dolphinemu.dolphinemu.databinding.ListItemHeaderBinding
|
||||
import org.dolphinemu.dolphinemu.databinding.ListItemMappingBinding
|
||||
import org.dolphinemu.dolphinemu.databinding.ListItemSearchResultBinding
|
||||
import org.dolphinemu.dolphinemu.databinding.ListItemSettingBinding
|
||||
import org.dolphinemu.dolphinemu.databinding.ListItemSettingSwitchBinding
|
||||
import org.dolphinemu.dolphinemu.databinding.ListItemSubmenuBinding
|
||||
import org.dolphinemu.dolphinemu.features.input.model.view.InputMappingControlSetting
|
||||
import org.dolphinemu.dolphinemu.features.input.ui.AdvancedMappingDialog
|
||||
import org.dolphinemu.dolphinemu.features.input.ui.MotionAlertDialog
|
||||
import org.dolphinemu.dolphinemu.features.input.ui.viewholder.InputMappingControlSettingViewHolder
|
||||
import org.dolphinemu.dolphinemu.features.settings.model.Settings
|
||||
import org.dolphinemu.dolphinemu.features.settings.model.view.*
|
||||
import org.dolphinemu.dolphinemu.features.settings.ui.viewholder.*
|
||||
import org.dolphinemu.dolphinemu.features.settings.model.view.DateTimeChoiceSetting
|
||||
import org.dolphinemu.dolphinemu.features.settings.model.view.DirectoryPicker
|
||||
import org.dolphinemu.dolphinemu.features.settings.model.view.FilePicker
|
||||
import org.dolphinemu.dolphinemu.features.settings.model.view.FloatSliderSetting
|
||||
import org.dolphinemu.dolphinemu.features.settings.model.view.InputStringSetting
|
||||
import org.dolphinemu.dolphinemu.features.settings.model.view.IntSliderSetting
|
||||
import org.dolphinemu.dolphinemu.features.settings.model.view.SettingsItem
|
||||
import org.dolphinemu.dolphinemu.features.settings.model.view.SettingsSearchResult
|
||||
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.SliderSetting
|
||||
import org.dolphinemu.dolphinemu.features.settings.model.view.StringSingleChoiceSetting
|
||||
import org.dolphinemu.dolphinemu.features.settings.model.view.SubmenuSetting
|
||||
import org.dolphinemu.dolphinemu.features.settings.model.view.SwitchSetting
|
||||
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
|
||||
import org.dolphinemu.dolphinemu.features.settings.ui.viewholder.InputStringSettingViewHolder
|
||||
import org.dolphinemu.dolphinemu.features.settings.ui.viewholder.RunRunnableViewHolder
|
||||
import org.dolphinemu.dolphinemu.features.settings.ui.viewholder.SettingViewHolder
|
||||
import org.dolphinemu.dolphinemu.features.settings.ui.viewholder.SettingsSearchResultViewHolder
|
||||
import org.dolphinemu.dolphinemu.features.settings.ui.viewholder.SingleChoiceViewHolder
|
||||
import org.dolphinemu.dolphinemu.features.settings.ui.viewholder.SliderViewHolder
|
||||
import org.dolphinemu.dolphinemu.features.settings.ui.viewholder.SubmenuViewHolder
|
||||
import org.dolphinemu.dolphinemu.features.settings.ui.viewholder.SwitchSettingViewHolder
|
||||
import org.dolphinemu.dolphinemu.utils.DirectoryInitialization
|
||||
import org.dolphinemu.dolphinemu.utils.FileBrowserHelper
|
||||
import org.dolphinemu.dolphinemu.utils.Log
|
||||
@@ -42,14 +74,13 @@ import org.dolphinemu.dolphinemu.utils.PermissionsHandler
|
||||
import java.io.File
|
||||
import java.io.IOException
|
||||
import java.io.RandomAccessFile
|
||||
import java.util.*
|
||||
import java.util.Calendar
|
||||
import java.util.TimeZone
|
||||
import kotlin.math.roundToInt
|
||||
|
||||
class SettingsAdapter(
|
||||
private val fragmentView: SettingsFragmentView,
|
||||
private val context: Context
|
||||
) :
|
||||
RecyclerView.Adapter<SettingViewHolder>(), DialogInterface.OnClickListener,
|
||||
private val fragmentView: SettingsFragmentView, private val context: Context
|
||||
) : RecyclerView.Adapter<SettingViewHolder>(), DialogInterface.OnClickListener,
|
||||
Slider.OnChangeListener {
|
||||
private var settingsList: ArrayList<SettingsItem>? = null
|
||||
private var clickedItem: SettingsItem? = null
|
||||
@@ -68,53 +99,53 @@ class SettingsAdapter(
|
||||
val inflater = LayoutInflater.from(parent.context)
|
||||
return when (viewType) {
|
||||
SettingsItem.TYPE_HEADER -> HeaderViewHolder(
|
||||
ListItemHeaderBinding.inflate(inflater, parent, false),
|
||||
this
|
||||
ListItemHeaderBinding.inflate(inflater, parent, false), this
|
||||
)
|
||||
|
||||
SettingsItem.TYPE_SWITCH -> SwitchSettingViewHolder(
|
||||
ListItemSettingSwitchBinding.inflate(inflater, parent, false),
|
||||
this
|
||||
ListItemSettingSwitchBinding.inflate(inflater, parent, false), this
|
||||
)
|
||||
SettingsItem.TYPE_STRING_SINGLE_CHOICE,
|
||||
SettingsItem.TYPE_SINGLE_CHOICE_DYNAMIC_DESCRIPTIONS,
|
||||
SettingsItem.TYPE_SINGLE_CHOICE -> SingleChoiceViewHolder(
|
||||
ListItemSettingBinding.inflate(inflater, parent, false),
|
||||
this
|
||||
|
||||
SettingsItem.TYPE_STRING_SINGLE_CHOICE, SettingsItem.TYPE_SINGLE_CHOICE_DYNAMIC_DESCRIPTIONS, SettingsItem.TYPE_SINGLE_CHOICE -> SingleChoiceViewHolder(
|
||||
ListItemSettingBinding.inflate(inflater, parent, false), this
|
||||
)
|
||||
|
||||
SettingsItem.TYPE_SLIDER -> SliderViewHolder(
|
||||
ListItemSettingBinding.inflate(inflater, parent, false),
|
||||
this,
|
||||
context
|
||||
ListItemSettingBinding.inflate(inflater, parent, false), this, context
|
||||
)
|
||||
|
||||
SettingsItem.TYPE_SUBMENU -> SubmenuViewHolder(
|
||||
ListItemSubmenuBinding.inflate(inflater, parent, false),
|
||||
this
|
||||
ListItemSubmenuBinding.inflate(inflater, parent, false), this
|
||||
)
|
||||
|
||||
SettingsItem.TYPE_INPUT_MAPPING_CONTROL -> InputMappingControlSettingViewHolder(
|
||||
ListItemMappingBinding.inflate(inflater, parent, false),
|
||||
this
|
||||
ListItemMappingBinding.inflate(inflater, parent, false), this
|
||||
)
|
||||
SettingsItem.TYPE_FILE_PICKER,
|
||||
SettingsItem.TYPE_DIRECTORY_PICKER -> FilePickerViewHolder(
|
||||
ListItemSettingBinding.inflate(inflater, parent, false),
|
||||
this
|
||||
|
||||
SettingsItem.TYPE_FILE_PICKER, SettingsItem.TYPE_DIRECTORY_PICKER -> FilePickerViewHolder(
|
||||
ListItemSettingBinding.inflate(inflater, parent, false), this
|
||||
)
|
||||
|
||||
SettingsItem.TYPE_RUN_RUNNABLE -> RunRunnableViewHolder(
|
||||
ListItemSettingBinding.inflate(inflater, parent, false),
|
||||
this, context
|
||||
ListItemSettingBinding.inflate(inflater, parent, false), this, context
|
||||
)
|
||||
|
||||
SettingsItem.TYPE_STRING -> InputStringSettingViewHolder(
|
||||
ListItemSettingBinding.inflate(inflater, parent, false), this
|
||||
)
|
||||
|
||||
SettingsItem.TYPE_HYPERLINK_HEADER -> HeaderHyperLinkViewHolder(
|
||||
ListItemHeaderBinding.inflate(inflater, parent, false), this
|
||||
)
|
||||
|
||||
SettingsItem.TYPE_DATETIME_CHOICE -> DateTimeSettingViewHolder(
|
||||
ListItemSettingBinding.inflate(inflater, parent, false), this
|
||||
)
|
||||
|
||||
SettingsItem.TYPE_SEARCH_RESULT -> SettingsSearchResultViewHolder(
|
||||
ListItemSearchResultBinding.inflate(inflater, parent, false), this
|
||||
)
|
||||
|
||||
else -> throw IllegalArgumentException("Invalid view type: $viewType")
|
||||
}
|
||||
}
|
||||
@@ -165,8 +196,7 @@ class SettingsAdapter(
|
||||
val binding = DialogInputStringBinding.inflate(inflater)
|
||||
val input = binding.input
|
||||
input.setText(item.selectedValue)
|
||||
dialog = MaterialAlertDialogBuilder(fragmentView.fragmentActivity)
|
||||
.setView(binding.root)
|
||||
dialog = MaterialAlertDialogBuilder(fragmentView.fragmentActivity).setView(binding.root)
|
||||
.setMessage(item.description)
|
||||
.setPositiveButton(R.string.ok) { _: DialogInterface?, _: Int ->
|
||||
val editTextInput = input.text.toString()
|
||||
@@ -175,19 +205,15 @@ class SettingsAdapter(
|
||||
fragmentView.onSettingChanged(item)
|
||||
}
|
||||
item.setSelectedValue(fragmentView.settings!!, editTextInput)
|
||||
}
|
||||
.setNegativeButton(R.string.cancel, null)
|
||||
.show()
|
||||
}.setNegativeButton(R.string.cancel, null).show()
|
||||
}
|
||||
|
||||
fun onSingleChoiceClick(item: SingleChoiceSetting, position: Int) {
|
||||
clickedItem = item
|
||||
clickedPosition = position
|
||||
val value = getSelectionForSingleChoiceValue(item)
|
||||
dialog = MaterialAlertDialogBuilder(fragmentView.fragmentActivity)
|
||||
.setTitle(item.name)
|
||||
.setSingleChoiceItems(item.choicesId, value, this)
|
||||
.show()
|
||||
dialog = MaterialAlertDialogBuilder(fragmentView.fragmentActivity).setTitle(item.name)
|
||||
.setSingleChoiceItems(item.choicesId, value, this).show()
|
||||
}
|
||||
|
||||
fun onStringSingleChoiceClick(item: StringSingleChoiceSetting, position: Int) {
|
||||
@@ -197,35 +223,26 @@ class SettingsAdapter(
|
||||
val choices = item.choices
|
||||
val noChoicesAvailableString = item.noChoicesAvailableString
|
||||
dialog = if (noChoicesAvailableString != 0 && choices.isEmpty()) {
|
||||
MaterialAlertDialogBuilder(fragmentView.fragmentActivity)
|
||||
.setTitle(item.name)
|
||||
.setMessage(noChoicesAvailableString)
|
||||
.setPositiveButton(R.string.ok, null)
|
||||
.show()
|
||||
MaterialAlertDialogBuilder(fragmentView.fragmentActivity).setTitle(item.name)
|
||||
.setMessage(noChoicesAvailableString).setPositiveButton(R.string.ok, null).show()
|
||||
} else {
|
||||
MaterialAlertDialogBuilder(fragmentView.fragmentActivity)
|
||||
.setTitle(item.name)
|
||||
MaterialAlertDialogBuilder(fragmentView.fragmentActivity).setTitle(item.name)
|
||||
.setSingleChoiceItems(
|
||||
item.choices, item.selectedValueIndex,
|
||||
this
|
||||
)
|
||||
.show()
|
||||
item.choices, item.selectedValueIndex, this
|
||||
).show()
|
||||
}
|
||||
}
|
||||
|
||||
fun onSingleChoiceDynamicDescriptionsClick(
|
||||
item: SingleChoiceSettingDynamicDescriptions,
|
||||
position: Int
|
||||
item: SingleChoiceSettingDynamicDescriptions, position: Int
|
||||
) {
|
||||
clickedItem = item
|
||||
clickedPosition = position
|
||||
|
||||
val value = getSelectionForSingleChoiceDynamicDescriptionsValue(item)
|
||||
|
||||
dialog = MaterialAlertDialogBuilder(fragmentView.fragmentActivity)
|
||||
.setTitle(item.name)
|
||||
.setSingleChoiceItems(item.choicesId, value, this)
|
||||
.show()
|
||||
dialog = MaterialAlertDialogBuilder(fragmentView.fragmentActivity).setTitle(item.name)
|
||||
.setSingleChoiceItems(item.choicesId, value, this).show()
|
||||
}
|
||||
|
||||
fun onSliderClick(item: SliderSetting, position: Int) {
|
||||
@@ -255,6 +272,7 @@ class SettingsAdapter(
|
||||
slider.valueTo = item.max
|
||||
slider.stepSize = item.stepSize
|
||||
}
|
||||
|
||||
is IntSliderSetting -> {
|
||||
slider.valueFrom = item.min.toFloat()
|
||||
slider.valueTo = item.max.toFloat()
|
||||
@@ -264,11 +282,8 @@ class SettingsAdapter(
|
||||
slider.value = (seekbarProgress / slider.stepSize).roundToInt() * slider.stepSize
|
||||
slider.addOnChangeListener(this)
|
||||
|
||||
dialog = MaterialAlertDialogBuilder(fragmentView.fragmentActivity)
|
||||
.setTitle(item.name)
|
||||
.setView(binding.root)
|
||||
.setPositiveButton(R.string.ok, this)
|
||||
.show()
|
||||
dialog = MaterialAlertDialogBuilder(fragmentView.fragmentActivity).setTitle(item.name)
|
||||
.setView(binding.root).setPositiveButton(R.string.ok, this).show()
|
||||
}
|
||||
|
||||
fun onSubmenuClick(item: SubmenuSetting) {
|
||||
@@ -281,16 +296,13 @@ class SettingsAdapter(
|
||||
|
||||
fun onInputMappingClick(item: InputMappingControlSetting, position: Int) {
|
||||
if (item.controller.getDefaultDevice().isEmpty() && !fragmentView.isMappingAllDevices) {
|
||||
MaterialAlertDialogBuilder(fragmentView.fragmentActivity)
|
||||
.setMessage(R.string.input_binding_no_device)
|
||||
.setPositiveButton(R.string.ok, this)
|
||||
.show()
|
||||
MaterialAlertDialogBuilder(fragmentView.fragmentActivity).setMessage(R.string.input_binding_no_device)
|
||||
.setPositiveButton(R.string.ok, this).show()
|
||||
return
|
||||
}
|
||||
|
||||
val dialog = MotionAlertDialog(
|
||||
fragmentView.fragmentActivity, item,
|
||||
fragmentView.isMappingAllDevices
|
||||
fragmentView.fragmentActivity, item, fragmentView.isMappingAllDevices
|
||||
)
|
||||
|
||||
val background = ContextCompat.getDrawable(context, R.drawable.dialog_round)
|
||||
@@ -304,14 +316,12 @@ class SettingsAdapter(
|
||||
dialog.setTitle(R.string.input_binding)
|
||||
dialog.setMessage(
|
||||
String.format(
|
||||
context.getString(R.string.input_binding_description),
|
||||
item.name
|
||||
context.getString(R.string.input_binding_description), item.name
|
||||
)
|
||||
)
|
||||
dialog.setButton(AlertDialog.BUTTON_NEGATIVE, context.getString(R.string.cancel), this)
|
||||
dialog.setButton(
|
||||
AlertDialog.BUTTON_NEUTRAL,
|
||||
context.getString(R.string.clear)
|
||||
AlertDialog.BUTTON_NEUTRAL, context.getString(R.string.clear)
|
||||
) { _: DialogInterface?, _: Int -> item.clearValue() }
|
||||
dialog.setOnDismissListener {
|
||||
notifyItemChanged(position)
|
||||
@@ -325,10 +335,7 @@ class SettingsAdapter(
|
||||
val inflater = LayoutInflater.from(context)
|
||||
val binding = DialogAdvancedMappingBinding.inflate(inflater)
|
||||
val dialog = AdvancedMappingDialog(
|
||||
context,
|
||||
binding,
|
||||
item.controlReference,
|
||||
item.controller
|
||||
context, binding, item.controlReference, item.controller
|
||||
)
|
||||
|
||||
val background = ContextCompat.getDrawable(context, R.drawable.dialog_round)
|
||||
@@ -350,8 +357,7 @@ class SettingsAdapter(
|
||||
}
|
||||
dialog.setButton(AlertDialog.BUTTON_NEGATIVE, context.getString(R.string.cancel), this)
|
||||
dialog.setButton(
|
||||
AlertDialog.BUTTON_NEUTRAL,
|
||||
context.getString(R.string.clear)
|
||||
AlertDialog.BUTTON_NEUTRAL, context.getString(R.string.clear)
|
||||
) { _: DialogInterface?, _: Int -> }
|
||||
dialog.setCanceledOnTouchOutside(false)
|
||||
dialog.show()
|
||||
@@ -369,14 +375,12 @@ class SettingsAdapter(
|
||||
val directoryPicker = item as DirectoryPicker
|
||||
|
||||
if (!PermissionsHandler.isExternalStorageLegacy()) {
|
||||
MaterialAlertDialogBuilder(context)
|
||||
.setMessage(R.string.path_not_changeable_scoped_storage)
|
||||
MaterialAlertDialogBuilder(context).setMessage(R.string.path_not_changeable_scoped_storage)
|
||||
.setPositiveButton(R.string.ok) { dialog: DialogInterface, _: Int -> dialog.dismiss() }
|
||||
.show()
|
||||
} else {
|
||||
val intent = FileBrowserHelper.createDirectoryPickerIntent(
|
||||
fragmentView.fragmentActivity,
|
||||
FileBrowserHelper.GAME_EXTENSIONS
|
||||
fragmentView.fragmentActivity, FileBrowserHelper.GAME_EXTENSIONS
|
||||
)
|
||||
directoryPicker.launcher.launch(intent)
|
||||
}
|
||||
@@ -408,32 +412,24 @@ class SettingsAdapter(
|
||||
calendar.timeZone = TimeZone.getTimeZone("UTC")
|
||||
|
||||
// Start and end epoch times available for the Wii's date picker
|
||||
val calendarConstraints = CalendarConstraints.Builder()
|
||||
.setStart(946684800000L)
|
||||
.setEnd(2082672000000L)
|
||||
.build()
|
||||
val calendarConstraints =
|
||||
CalendarConstraints.Builder().setStart(946684800000L).setEnd(2082672000000L).build()
|
||||
|
||||
var timeFormat = TimeFormat.CLOCK_12H
|
||||
if (DateFormat.is24HourFormat(fragmentView.fragmentActivity)) {
|
||||
timeFormat = TimeFormat.CLOCK_24H
|
||||
}
|
||||
|
||||
val datePicker = MaterialDatePicker.Builder.datePicker()
|
||||
.setSelection(storedTime)
|
||||
.setTitleText(R.string.select_rtc_date)
|
||||
.setCalendarConstraints(calendarConstraints)
|
||||
.build()
|
||||
val timePicker = MaterialTimePicker.Builder()
|
||||
.setTimeFormat(timeFormat)
|
||||
.setHour(calendar[Calendar.HOUR_OF_DAY])
|
||||
.setMinute(calendar[Calendar.MINUTE])
|
||||
.setTitleText(R.string.select_rtc_time)
|
||||
val datePicker = MaterialDatePicker.Builder.datePicker().setSelection(storedTime)
|
||||
.setTitleText(R.string.select_rtc_date).setCalendarConstraints(calendarConstraints)
|
||||
.build()
|
||||
val timePicker = MaterialTimePicker.Builder().setTimeFormat(timeFormat)
|
||||
.setHour(calendar[Calendar.HOUR_OF_DAY]).setMinute(calendar[Calendar.MINUTE])
|
||||
.setTitleText(R.string.select_rtc_time).build()
|
||||
|
||||
datePicker.addOnPositiveButtonClickListener {
|
||||
timePicker.show(
|
||||
fragmentView.fragmentActivity.supportFragmentManager,
|
||||
"TimePicker"
|
||||
fragmentView.fragmentActivity.supportFragmentManager, "TimePicker"
|
||||
)
|
||||
}
|
||||
timePicker.addOnPositiveButtonClickListener {
|
||||
@@ -484,6 +480,7 @@ class SettingsAdapter(
|
||||
|
||||
closeDialog()
|
||||
}
|
||||
|
||||
is SingleChoiceSettingDynamicDescriptions -> {
|
||||
val scSetting = clickedItem as SingleChoiceSettingDynamicDescriptions
|
||||
|
||||
@@ -494,6 +491,7 @@ class SettingsAdapter(
|
||||
|
||||
closeDialog()
|
||||
}
|
||||
|
||||
is StringSingleChoiceSetting -> {
|
||||
val scSetting = clickedItem as StringSingleChoiceSetting
|
||||
|
||||
@@ -504,6 +502,7 @@ class SettingsAdapter(
|
||||
|
||||
closeDialog()
|
||||
}
|
||||
|
||||
is IntSliderSetting -> {
|
||||
val sliderSetting = clickedItem as IntSliderSetting
|
||||
if (sliderSetting.selectedValue != seekbarProgress.toInt()) {
|
||||
@@ -512,6 +511,7 @@ class SettingsAdapter(
|
||||
sliderSetting.setSelectedValue(settings!!, seekbarProgress.toInt())
|
||||
closeDialog()
|
||||
}
|
||||
|
||||
is FloatSliderSetting -> {
|
||||
val sliderSetting = clickedItem as FloatSliderSetting
|
||||
|
||||
@@ -598,8 +598,7 @@ class SettingsAdapter(
|
||||
}
|
||||
|
||||
private fun getValueForSingleChoiceDynamicDescriptionsSelection(
|
||||
item: SingleChoiceSettingDynamicDescriptions,
|
||||
which: Int
|
||||
item: SingleChoiceSettingDynamicDescriptions, which: Int
|
||||
): Int {
|
||||
val valuesId = item.valuesId
|
||||
return if (valuesId > 0) {
|
||||
|
||||
@@ -39,8 +39,7 @@ import org.dolphinemu.dolphinemu.features.settings.model.view.SettingsItem
|
||||
import org.dolphinemu.dolphinemu.features.settings.ui.viewholder.SettingViewHolder
|
||||
import org.dolphinemu.dolphinemu.utils.GpuDriverInstallResult
|
||||
import org.dolphinemu.dolphinemu.utils.SerializableHelper.serializable
|
||||
import java.util.*
|
||||
import kotlin.collections.ArrayList
|
||||
import java.util.EnumMap
|
||||
|
||||
class SettingsFragment : Fragment(), SettingsFragmentView {
|
||||
private lateinit var presenter: SettingsFragmentPresenter
|
||||
@@ -93,9 +92,7 @@ class SettingsFragment : Fragment(), SettingsFragmentView {
|
||||
}
|
||||
|
||||
override fun onCreateView(
|
||||
inflater: LayoutInflater,
|
||||
container: ViewGroup?,
|
||||
savedInstanceState: Bundle?
|
||||
inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?
|
||||
): View {
|
||||
binding = FragmentSettingsBinding.inflate(inflater, container, false)
|
||||
return binding!!.root
|
||||
@@ -161,15 +158,15 @@ class SettingsFragment : Fragment(), SettingsFragmentView {
|
||||
}
|
||||
|
||||
val position = arguments?.getInt(
|
||||
ARGUMENT_SCROLL_TO_SETTING_POSITION,
|
||||
RecyclerView.NO_POSITION
|
||||
ARGUMENT_SCROLL_TO_SETTING_POSITION, RecyclerView.NO_POSITION
|
||||
) ?: RecyclerView.NO_POSITION
|
||||
if (!hasScrolledToSearchResult && position in settingsList.indices) {
|
||||
hasScrolledToSearchResult = true
|
||||
binding?.listSettings?.post {
|
||||
val recyclerView = binding?.listSettings ?: return@post
|
||||
(recyclerView.layoutManager as? LinearLayoutManager)
|
||||
?.scrollToPositionWithOffset(position, 0)
|
||||
(recyclerView.layoutManager as? LinearLayoutManager)?.scrollToPositionWithOffset(
|
||||
position, 0
|
||||
)
|
||||
highlightSearchResult(position, settingsList[position])
|
||||
}
|
||||
}
|
||||
@@ -231,19 +228,13 @@ class SettingsFragment : Fragment(), SettingsFragmentView {
|
||||
}
|
||||
|
||||
activityView!!.showSettingsFragment(
|
||||
menuKey,
|
||||
null,
|
||||
true,
|
||||
requireArguments().getString(ARGUMENT_GAME_ID)!!
|
||||
menuKey, null, true, requireArguments().getString(ARGUMENT_GAME_ID)!!
|
||||
)
|
||||
}
|
||||
|
||||
override fun loadSearchResult(menuKey: MenuTag, settingPosition: Int, extras: Bundle?) {
|
||||
activityView!!.showSearchResult(
|
||||
menuKey,
|
||||
settingPosition,
|
||||
requireArguments().getString(ARGUMENT_GAME_ID)!!,
|
||||
extras
|
||||
menuKey, settingPosition, requireArguments().getString(ARGUMENT_GAME_ID)!!, extras
|
||||
)
|
||||
}
|
||||
|
||||
@@ -331,17 +322,13 @@ class SettingsFragment : Fragment(), SettingsFragmentView {
|
||||
}
|
||||
val msg = "${presenter.gpuDriver!!.name} ${presenter.gpuDriver!!.driverVersion}"
|
||||
|
||||
MaterialAlertDialogBuilder(requireContext())
|
||||
.setTitle(getString(R.string.gpu_driver_dialog_title))
|
||||
.setMessage(msg)
|
||||
.setNegativeButton(android.R.string.cancel, null)
|
||||
MaterialAlertDialogBuilder(requireContext()).setTitle(getString(R.string.gpu_driver_dialog_title))
|
||||
.setMessage(msg).setNegativeButton(android.R.string.cancel, null)
|
||||
.setNeutralButton(R.string.gpu_driver_dialog_system) { _: DialogInterface?, _: Int ->
|
||||
presenter.useSystemDriver()
|
||||
}
|
||||
.setPositiveButton(R.string.gpu_driver_dialog_install) { _: DialogInterface?, _: Int ->
|
||||
}.setPositiveButton(R.string.gpu_driver_dialog_install) { _: DialogInterface?, _: Int ->
|
||||
askForDriverFile()
|
||||
}
|
||||
.show()
|
||||
}.show()
|
||||
}
|
||||
|
||||
override fun getFragmentLifecycle(): Lifecycle {
|
||||
@@ -358,16 +345,12 @@ class SettingsFragment : Fragment(), SettingsFragmentView {
|
||||
|
||||
override fun onDriverInstallDone(result: GpuDriverInstallResult) {
|
||||
val view = binding?.root ?: return
|
||||
Snackbar
|
||||
.make(view, resolveInstallResultString(result), Snackbar.LENGTH_LONG)
|
||||
.show()
|
||||
Snackbar.make(view, resolveInstallResultString(result), Snackbar.LENGTH_LONG).show()
|
||||
}
|
||||
|
||||
override fun onDriverUninstallDone() {
|
||||
Toast.makeText(
|
||||
requireContext(),
|
||||
R.string.gpu_driver_dialog_uninstall_done,
|
||||
Toast.LENGTH_SHORT
|
||||
requireContext(), R.string.gpu_driver_dialog_uninstall_done, Toast.LENGTH_SHORT
|
||||
).show()
|
||||
}
|
||||
|
||||
|
||||
@@ -4,11 +4,11 @@ package org.dolphinemu.dolphinemu.features.settings.ui.viewholder
|
||||
|
||||
import android.animation.ValueAnimator
|
||||
import android.content.DialogInterface
|
||||
import android.graphics.Paint
|
||||
import android.graphics.Typeface
|
||||
import android.graphics.drawable.ColorDrawable
|
||||
import android.graphics.drawable.Drawable
|
||||
import android.graphics.drawable.LayerDrawable
|
||||
import android.graphics.Paint
|
||||
import android.graphics.Typeface
|
||||
import android.view.View
|
||||
import android.view.View.OnLongClickListener
|
||||
import android.view.animation.DecelerateInterpolator
|
||||
|
||||
@@ -9,8 +9,7 @@ import org.dolphinemu.dolphinemu.features.settings.model.view.SettingsSearchResu
|
||||
import org.dolphinemu.dolphinemu.features.settings.ui.SettingsAdapter
|
||||
|
||||
class SettingsSearchResultViewHolder(
|
||||
private val binding: ListItemSearchResultBinding,
|
||||
adapter: SettingsAdapter
|
||||
private val binding: ListItemSearchResultBinding, adapter: SettingsAdapter
|
||||
) : SettingViewHolder(binding.root, adapter) {
|
||||
private lateinit var result: SettingsSearchResult
|
||||
|
||||
|
||||
@@ -1,20 +1,20 @@
|
||||
package org.dolphinemu.dolphinemu.utils
|
||||
|
||||
import androidx.appcompat.app.AppCompatActivity
|
||||
import org.dolphinemu.dolphinemu.R
|
||||
import android.os.Build
|
||||
import androidx.core.content.ContextCompat
|
||||
import androidx.appcompat.app.AppCompatDelegate
|
||||
import androidx.core.view.WindowInsetsControllerCompat
|
||||
import androidx.core.view.WindowCompat
|
||||
import org.dolphinemu.dolphinemu.ui.main.ThemeProvider
|
||||
import android.content.res.Configuration
|
||||
import com.google.android.material.appbar.MaterialToolbar
|
||||
import com.google.android.material.appbar.AppBarLayout
|
||||
import com.google.android.material.elevation.ElevationOverlayProvider
|
||||
import com.google.android.material.color.MaterialColors
|
||||
import android.os.Build
|
||||
import androidx.annotation.ColorInt
|
||||
import androidx.appcompat.app.AppCompatActivity
|
||||
import androidx.appcompat.app.AppCompatDelegate
|
||||
import androidx.core.content.ContextCompat
|
||||
import androidx.core.view.WindowCompat
|
||||
import androidx.core.view.WindowInsetsControllerCompat
|
||||
import androidx.preference.PreferenceManager
|
||||
import com.google.android.material.appbar.AppBarLayout
|
||||
import com.google.android.material.appbar.MaterialToolbar
|
||||
import com.google.android.material.color.MaterialColors
|
||||
import com.google.android.material.elevation.ElevationOverlayProvider
|
||||
import org.dolphinemu.dolphinemu.R
|
||||
import org.dolphinemu.dolphinemu.ui.main.ThemeProvider
|
||||
|
||||
object ThemeHelper {
|
||||
|
||||
@@ -52,8 +52,7 @@ object ThemeHelper {
|
||||
.getInt(CURRENT_THEME_MODE, AppCompatDelegate.MODE_NIGHT_FOLLOW_SYSTEM)
|
||||
activity.delegate.localNightMode = themeMode
|
||||
val windowController = WindowCompat.getInsetsController(
|
||||
activity.window,
|
||||
activity.window.decorView
|
||||
activity.window, activity.window.decorView
|
||||
)
|
||||
val systemReportedThemeMode =
|
||||
activity.resources.configuration.uiMode and Configuration.UI_MODE_NIGHT_MASK
|
||||
@@ -62,6 +61,7 @@ object ThemeHelper {
|
||||
Configuration.UI_MODE_NIGHT_NO -> setLightModeSystemBars(windowController)
|
||||
Configuration.UI_MODE_NIGHT_YES -> setDarkModeSystemBars(windowController)
|
||||
}
|
||||
|
||||
AppCompatDelegate.MODE_NIGHT_NO -> setLightModeSystemBars(windowController)
|
||||
AppCompatDelegate.MODE_NIGHT_YES -> setDarkModeSystemBars(windowController)
|
||||
}
|
||||
@@ -83,66 +83,50 @@ object ThemeHelper {
|
||||
|
||||
@JvmStatic
|
||||
fun saveTheme(activity: AppCompatActivity, themeValue: Int) {
|
||||
PreferenceManager.getDefaultSharedPreferences(activity.applicationContext)
|
||||
.edit()
|
||||
.putInt(CURRENT_THEME, themeValue)
|
||||
.apply()
|
||||
PreferenceManager.getDefaultSharedPreferences(activity.applicationContext).edit()
|
||||
.putInt(CURRENT_THEME, themeValue).apply()
|
||||
activity.recreate()
|
||||
}
|
||||
|
||||
@JvmStatic
|
||||
fun deleteThemeKey(activity: AppCompatActivity) {
|
||||
PreferenceManager.getDefaultSharedPreferences(activity.applicationContext)
|
||||
.edit()
|
||||
.remove(CURRENT_THEME)
|
||||
.apply()
|
||||
PreferenceManager.getDefaultSharedPreferences(activity.applicationContext).edit()
|
||||
.remove(CURRENT_THEME).apply()
|
||||
activity.recreate()
|
||||
}
|
||||
|
||||
@JvmStatic
|
||||
fun saveThemeMode(activity: AppCompatActivity, themeModeValue: Int) {
|
||||
PreferenceManager.getDefaultSharedPreferences(activity.applicationContext)
|
||||
.edit()
|
||||
.putInt(CURRENT_THEME_MODE, themeModeValue)
|
||||
.apply()
|
||||
PreferenceManager.getDefaultSharedPreferences(activity.applicationContext).edit()
|
||||
.putInt(CURRENT_THEME_MODE, themeModeValue).apply()
|
||||
setThemeMode(activity)
|
||||
}
|
||||
|
||||
@JvmStatic
|
||||
fun deleteThemeModeKey(activity: AppCompatActivity) {
|
||||
PreferenceManager.getDefaultSharedPreferences(activity.applicationContext)
|
||||
.edit()
|
||||
.remove(CURRENT_THEME_MODE)
|
||||
.apply()
|
||||
PreferenceManager.getDefaultSharedPreferences(activity.applicationContext).edit()
|
||||
.remove(CURRENT_THEME_MODE).apply()
|
||||
setThemeMode(activity)
|
||||
}
|
||||
|
||||
@JvmStatic
|
||||
fun saveBackgroundSetting(activity: AppCompatActivity, backgroundValue: Boolean) {
|
||||
PreferenceManager.getDefaultSharedPreferences(activity.applicationContext)
|
||||
.edit()
|
||||
.putBoolean(USE_BLACK_BACKGROUNDS, backgroundValue)
|
||||
.apply()
|
||||
PreferenceManager.getDefaultSharedPreferences(activity.applicationContext).edit()
|
||||
.putBoolean(USE_BLACK_BACKGROUNDS, backgroundValue).apply()
|
||||
activity.recreate()
|
||||
}
|
||||
|
||||
@JvmStatic
|
||||
fun deleteBackgroundSetting(activity: AppCompatActivity) {
|
||||
PreferenceManager.getDefaultSharedPreferences(activity.applicationContext)
|
||||
.edit()
|
||||
.remove(USE_BLACK_BACKGROUNDS)
|
||||
.apply()
|
||||
PreferenceManager.getDefaultSharedPreferences(activity.applicationContext).edit()
|
||||
.remove(USE_BLACK_BACKGROUNDS).apply()
|
||||
activity.recreate()
|
||||
}
|
||||
|
||||
@JvmStatic
|
||||
fun resetThemePreferences(activity: AppCompatActivity, applyImmediately: Boolean = false) {
|
||||
PreferenceManager.getDefaultSharedPreferences(activity.applicationContext)
|
||||
.edit()
|
||||
.remove(CURRENT_THEME)
|
||||
.remove(CURRENT_THEME_MODE)
|
||||
.remove(USE_BLACK_BACKGROUNDS)
|
||||
.apply()
|
||||
PreferenceManager.getDefaultSharedPreferences(activity.applicationContext).edit()
|
||||
.remove(CURRENT_THEME).remove(CURRENT_THEME_MODE).remove(USE_BLACK_BACKGROUNDS).apply()
|
||||
activity.delegate.localNightMode = AppCompatDelegate.MODE_NIGHT_FOLLOW_SYSTEM
|
||||
activity.delegate.applyDayNight()
|
||||
if (applyImmediately) {
|
||||
@@ -170,10 +154,7 @@ object ThemeHelper {
|
||||
activity: AppCompatActivity, toolbar: MaterialToolbar, appBarLayout: AppBarLayout
|
||||
) {
|
||||
appBarLayout.addOnOffsetChangedListener { layout: AppBarLayout, verticalOffset: Int ->
|
||||
if (
|
||||
layout.totalScrollRange > 0 &&
|
||||
-verticalOffset >= layout.totalScrollRange / 2
|
||||
) {
|
||||
if (layout.totalScrollRange > 0 && -verticalOffset >= layout.totalScrollRange / 2) {
|
||||
@ColorInt val color =
|
||||
ElevationOverlayProvider(appBarLayout.context).compositeOverlay(
|
||||
MaterialColors.getColor(appBarLayout, R.attr.colorSurface),
|
||||
@@ -183,8 +164,7 @@ object ThemeHelper {
|
||||
setStatusBarColor(activity, color)
|
||||
} else {
|
||||
@ColorInt val statusBarColor = ContextCompat.getColor(
|
||||
activity.applicationContext,
|
||||
android.R.color.transparent
|
||||
activity.applicationContext, android.R.color.transparent
|
||||
)
|
||||
@ColorInt val appBarColor = MaterialColors.getColor(toolbar, R.attr.colorSurface)
|
||||
toolbar.setBackgroundColor(appBarColor)
|
||||
@@ -201,8 +181,7 @@ object ThemeHelper {
|
||||
setStatusBarColor(activity, color)
|
||||
} else {
|
||||
@ColorInt val statusBarColor = ContextCompat.getColor(
|
||||
activity.applicationContext,
|
||||
android.R.color.transparent
|
||||
activity.applicationContext, android.R.color.transparent
|
||||
)
|
||||
setStatusBarColor(activity, statusBarColor)
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user