diff --git a/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/settings/ui/SettingsActivity.kt b/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/settings/ui/SettingsActivity.kt index 1135dca463..19c08b9a05 100644 --- a/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/settings/ui/SettingsActivity.kt +++ b/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/settings/ui/SettingsActivity.kt @@ -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 } diff --git a/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/settings/ui/SettingsActivityPresenter.kt b/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/settings/ui/SettingsActivityPresenter.kt index 1615911fb6..5baee17f02 100644 --- a/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/settings/ui/SettingsActivityPresenter.kt +++ b/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/settings/ui/SettingsActivityPresenter.kt @@ -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 } diff --git a/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/settings/ui/SettingsActivityView.kt b/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/settings/ui/SettingsActivityView.kt index 44f02bc3f8..95951f1ae9 100644 --- a/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/settings/ui/SettingsActivityView.kt +++ b/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/settings/ui/SettingsActivityView.kt @@ -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 ) /** diff --git a/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/settings/ui/SettingsAdapter.kt b/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/settings/ui/SettingsAdapter.kt index 2492a0113a..6252350d32 100644 --- a/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/settings/ui/SettingsAdapter.kt +++ b/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/settings/ui/SettingsAdapter.kt @@ -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(), DialogInterface.OnClickListener, + private val fragmentView: SettingsFragmentView, private val context: Context +) : RecyclerView.Adapter(), DialogInterface.OnClickListener, Slider.OnChangeListener { private var settingsList: ArrayList? = 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) { diff --git a/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/settings/ui/SettingsFragment.kt b/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/settings/ui/SettingsFragment.kt index 7e6f646478..e0f96e77f1 100644 --- a/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/settings/ui/SettingsFragment.kt +++ b/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/settings/ui/SettingsFragment.kt @@ -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() } diff --git a/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/settings/ui/viewholder/SettingViewHolder.kt b/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/settings/ui/viewholder/SettingViewHolder.kt index f1ba059864..77414fedce 100644 --- a/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/settings/ui/viewholder/SettingViewHolder.kt +++ b/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/settings/ui/viewholder/SettingViewHolder.kt @@ -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 diff --git a/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/settings/ui/viewholder/SettingsSearchResultViewHolder.kt b/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/settings/ui/viewholder/SettingsSearchResultViewHolder.kt index f9bad5042b..9471d6bf43 100644 --- a/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/settings/ui/viewholder/SettingsSearchResultViewHolder.kt +++ b/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/settings/ui/viewholder/SettingsSearchResultViewHolder.kt @@ -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 diff --git a/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/utils/ThemeHelper.kt b/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/utils/ThemeHelper.kt index 89ff3e0cb0..8b41fc6c55 100644 --- a/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/utils/ThemeHelper.kt +++ b/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/utils/ThemeHelper.kt @@ -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) }