Android: Reformat settings search files

This commit is contained in:
Simonx22
2026-07-22 14:27:04 -04:00
parent 893be0996e
commit 93706022d5
8 changed files with 164 additions and 223 deletions

View File

@@ -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
}

View File

@@ -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
}

View File

@@ -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
)
/**

View File

@@ -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) {

View File

@@ -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()
}

View File

@@ -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

View File

@@ -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

View File

@@ -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)
}