diff --git a/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/settings/ui/SettingsFragment.java b/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/settings/ui/SettingsFragment.java deleted file mode 100644 index 1a7905565d..0000000000 --- a/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/settings/ui/SettingsFragment.java +++ /dev/null @@ -1,295 +0,0 @@ -// SPDX-License-Identifier: GPL-2.0-or-later - -package org.dolphinemu.dolphinemu.features.settings.ui; - -import android.content.Context; -import android.os.Bundle; -import android.view.LayoutInflater; -import android.view.View; -import android.view.ViewGroup; - -import androidx.annotation.NonNull; -import androidx.annotation.Nullable; -import androidx.core.graphics.Insets; -import androidx.core.view.ViewCompat; -import androidx.core.view.WindowInsetsCompat; -import androidx.fragment.app.DialogFragment; -import androidx.fragment.app.Fragment; -import androidx.recyclerview.widget.LinearLayoutManager; -import androidx.recyclerview.widget.RecyclerView; - -import org.dolphinemu.dolphinemu.R; -import org.dolphinemu.dolphinemu.databinding.FragmentSettingsBinding; -import org.dolphinemu.dolphinemu.features.settings.model.Settings; -import org.dolphinemu.dolphinemu.features.settings.model.view.SettingsItem; - -import java.util.ArrayList; -import java.util.HashMap; -import java.util.Map; - -public final class SettingsFragment extends Fragment implements SettingsFragmentView -{ - private static final String ARGUMENT_MENU_TAG = "menu_tag"; - private static final String ARGUMENT_GAME_ID = "game_id"; - - private SettingsFragmentPresenter mPresenter; - private SettingsActivityView mActivity; - - private SettingsAdapter mAdapter; - - private int mOldControllerSettingsWarningHeight = 0; - - private static final Map titles = new HashMap<>(); - - static - { - titles.put(MenuTag.SETTINGS, R.string.settings); - titles.put(MenuTag.CONFIG, R.string.config); - titles.put(MenuTag.CONFIG_GENERAL, R.string.general_submenu); - titles.put(MenuTag.CONFIG_INTERFACE, R.string.interface_submenu); - titles.put(MenuTag.CONFIG_AUDIO, R.string.audio_submenu); - titles.put(MenuTag.CONFIG_PATHS, R.string.paths_submenu); - titles.put(MenuTag.CONFIG_GAME_CUBE, R.string.gamecube_submenu); - titles.put(MenuTag.CONFIG_SERIALPORT1, R.string.serialport1_submenu); - titles.put(MenuTag.CONFIG_WII, R.string.wii_submenu); - titles.put(MenuTag.CONFIG_ADVANCED, R.string.advanced_submenu); - titles.put(MenuTag.DEBUG, R.string.debug_submenu); - titles.put(MenuTag.GRAPHICS, R.string.graphics_settings); - titles.put(MenuTag.ENHANCEMENTS, R.string.enhancements_submenu); - titles.put(MenuTag.STEREOSCOPY, R.string.stereoscopy_submenu); - titles.put(MenuTag.HACKS, R.string.hacks_submenu); - titles.put(MenuTag.STATISTICS, R.string.statistics_submenu); - titles.put(MenuTag.ADVANCED_GRAPHICS, R.string.advanced_graphics_submenu); - titles.put(MenuTag.CONFIG_LOG, R.string.log_submenu); - titles.put(MenuTag.GCPAD_TYPE, R.string.gcpad_settings); - titles.put(MenuTag.WIIMOTE, R.string.wiimote_settings); - titles.put(MenuTag.WIIMOTE_EXTENSION, R.string.wiimote_extensions); - titles.put(MenuTag.GCPAD_1, R.string.controller_0); - titles.put(MenuTag.GCPAD_2, R.string.controller_1); - titles.put(MenuTag.GCPAD_3, R.string.controller_2); - titles.put(MenuTag.GCPAD_4, R.string.controller_3); - titles.put(MenuTag.WIIMOTE_1, R.string.wiimote_0); - titles.put(MenuTag.WIIMOTE_2, R.string.wiimote_1); - titles.put(MenuTag.WIIMOTE_3, R.string.wiimote_2); - titles.put(MenuTag.WIIMOTE_4, R.string.wiimote_3); - titles.put(MenuTag.WIIMOTE_EXTENSION_1, R.string.wiimote_extension_0); - titles.put(MenuTag.WIIMOTE_EXTENSION_2, R.string.wiimote_extension_1); - titles.put(MenuTag.WIIMOTE_EXTENSION_3, R.string.wiimote_extension_2); - titles.put(MenuTag.WIIMOTE_EXTENSION_4, R.string.wiimote_extension_3); - titles.put(MenuTag.WIIMOTE_GENERAL_1, R.string.wiimote_general); - titles.put(MenuTag.WIIMOTE_GENERAL_2, R.string.wiimote_general); - titles.put(MenuTag.WIIMOTE_GENERAL_3, R.string.wiimote_general); - titles.put(MenuTag.WIIMOTE_GENERAL_4, R.string.wiimote_general); - titles.put(MenuTag.WIIMOTE_MOTION_SIMULATION_1, R.string.wiimote_motion_simulation); - titles.put(MenuTag.WIIMOTE_MOTION_SIMULATION_2, R.string.wiimote_motion_simulation); - titles.put(MenuTag.WIIMOTE_MOTION_SIMULATION_3, R.string.wiimote_motion_simulation); - titles.put(MenuTag.WIIMOTE_MOTION_SIMULATION_4, R.string.wiimote_motion_simulation); - titles.put(MenuTag.WIIMOTE_MOTION_INPUT_1, R.string.wiimote_motion_input); - titles.put(MenuTag.WIIMOTE_MOTION_INPUT_2, R.string.wiimote_motion_input); - titles.put(MenuTag.WIIMOTE_MOTION_INPUT_3, R.string.wiimote_motion_input); - titles.put(MenuTag.WIIMOTE_MOTION_INPUT_4, R.string.wiimote_motion_input); - } - - private FragmentSettingsBinding mBinding; - - public static Fragment newInstance(MenuTag menuTag, String gameId, Bundle extras) - { - SettingsFragment fragment = new SettingsFragment(); - - Bundle arguments = new Bundle(); - if (extras != null) - { - arguments.putAll(extras); - } - - arguments.putSerializable(ARGUMENT_MENU_TAG, menuTag); - arguments.putString(ARGUMENT_GAME_ID, gameId); - - fragment.setArguments(arguments); - return fragment; - } - - @Override - public void onAttach(@NonNull Context context) - { - super.onAttach(context); - - mActivity = (SettingsActivityView) context; - } - - @Override - public void onCreate(Bundle savedInstanceState) - { - super.onCreate(savedInstanceState); - - Bundle args = getArguments(); - MenuTag menuTag = (MenuTag) args.getSerializable(ARGUMENT_MENU_TAG); - String gameId = getArguments().getString(ARGUMENT_GAME_ID); - - mPresenter = new SettingsFragmentPresenter(this, getContext()); - mAdapter = new SettingsAdapter(this, getContext()); - - mPresenter.onCreate(menuTag, gameId, args); - } - - @NonNull - @Override - public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, - @Nullable Bundle savedInstanceState) - { - mBinding = FragmentSettingsBinding.inflate(inflater, container, false); - return mBinding.getRoot(); - } - - @Override - public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) - { - Bundle args = getArguments(); - MenuTag menuTag = (MenuTag) args.getSerializable(ARGUMENT_MENU_TAG); - - if (titles.containsKey(menuTag)) - { - mActivity.setToolbarTitle(getString(titles.get(menuTag))); - } - - LinearLayoutManager manager = new LinearLayoutManager(getActivity()); - - RecyclerView recyclerView = mBinding.listSettings; - - recyclerView.setAdapter(mAdapter); - recyclerView.setLayoutManager(manager); - - SettingsDividerItemDecoration divider = new SettingsDividerItemDecoration(requireActivity()); - recyclerView.addItemDecoration(divider); - - setInsets(); - - SettingsActivityView activity = (SettingsActivityView) getActivity(); - mPresenter.onViewCreated(menuTag, activity.getSettings()); - } - - @Override - public void onDestroyView() - { - super.onDestroyView(); - mBinding = null; - } - - @Override - public void onDetach() - { - super.onDetach(); - mActivity = null; - - if (mAdapter != null) - { - mAdapter.closeDialog(); - } - } - - @Override - public void onSettingsFileLoaded( - org.dolphinemu.dolphinemu.features.settings.model.Settings settings) - { - mPresenter.setSettings(settings); - } - - @Override - public void showSettingsList(ArrayList settingsList) - { - mAdapter.setSettings(settingsList); - } - - @Override - public void loadDefaultSettings() - { - mPresenter.loadDefaultSettings(); - } - - @Override - public SettingsAdapter getAdapter() - { - return mAdapter; - } - - @Override - public void loadSubMenu(MenuTag menuKey) - { - mActivity.showSettingsFragment(menuKey, null, true, getArguments().getString(ARGUMENT_GAME_ID)); - } - - @Override - public void showDialogFragment(DialogFragment fragment) - { - mActivity.showDialogFragment(fragment); - } - - @Override - public void showToastMessage(String message) - { - mActivity.showToastMessage(message); - } - - @Override - public Settings getSettings() - { - return mPresenter.getSettings(); - } - - @Override - public void onSettingChanged() - { - mActivity.onSettingChanged(); - } - - @Override - public void onControllerSettingsChanged() - { - mAdapter.notifyAllSettingsChanged(); - mPresenter.updateOldControllerSettingsWarningVisibility(); - } - - @Override - public void onMenuTagAction(@NonNull MenuTag menuTag, int value) - { - mActivity.onMenuTagAction(menuTag, value); - } - - public boolean hasMenuTagActionForValue(@NonNull MenuTag menuTag, int value) - { - return mActivity.hasMenuTagActionForValue(menuTag, value); - } - - @Override - public void setMappingAllDevices(boolean allDevices) - { - mActivity.setMappingAllDevices(allDevices); - } - - @Override - public boolean isMappingAllDevices() - { - return mActivity.isMappingAllDevices(); - } - - @Override - public void setOldControllerSettingsWarningVisibility(boolean visible) - { - mOldControllerSettingsWarningHeight = - mActivity.setOldControllerSettingsWarningVisibility(visible); - - // Trigger the insets listener we've registered - mBinding.listSettings.requestApplyInsets(); - } - - private void setInsets() - { - ViewCompat.setOnApplyWindowInsetsListener(mBinding.listSettings, (v, windowInsets) -> - { - Insets insets = windowInsets.getInsets(WindowInsetsCompat.Type.systemBars()); - int listSpacing = getResources().getDimensionPixelSize(R.dimen.spacing_list); - v.setPadding(0, 0, 0, insets.bottom + listSpacing + mOldControllerSettingsWarningHeight); - return windowInsets; - }); - } -} 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 new file mode 100644 index 0000000000..d9ffd9113f --- /dev/null +++ b/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/settings/ui/SettingsFragment.kt @@ -0,0 +1,242 @@ +// SPDX-License-Identifier: GPL-2.0-or-later + +package org.dolphinemu.dolphinemu.features.settings.ui + +import android.content.Context +import android.os.Bundle +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import androidx.core.view.ViewCompat +import androidx.core.view.WindowInsetsCompat +import androidx.core.view.updatePadding +import androidx.fragment.app.DialogFragment +import androidx.fragment.app.Fragment +import androidx.fragment.app.FragmentActivity +import androidx.recyclerview.widget.LinearLayoutManager +import org.dolphinemu.dolphinemu.R +import org.dolphinemu.dolphinemu.databinding.FragmentSettingsBinding +import org.dolphinemu.dolphinemu.features.settings.model.Settings +import org.dolphinemu.dolphinemu.features.settings.model.view.SettingsItem +import org.dolphinemu.dolphinemu.utils.SerializableHelper.serializable +import java.util.* +import kotlin.collections.ArrayList + +class SettingsFragment : Fragment(), SettingsFragmentView { + private lateinit var presenter: SettingsFragmentPresenter + private var activityView: SettingsActivityView? = null + + private lateinit var menuTag: MenuTag + + override val fragmentActivity: FragmentActivity + get() = requireActivity() + + override var adapter: SettingsAdapter? = null + + private var oldControllerSettingsWarningHeight = 0 + + private var binding: FragmentSettingsBinding? = null + + override fun onAttach(context: Context) { + super.onAttach(context) + + activityView = context as SettingsActivityView + } + + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + + menuTag = requireArguments().serializable(ARGUMENT_MENU_TAG)!! + + val gameId = requireArguments().getString(ARGUMENT_GAME_ID) + presenter = SettingsFragmentPresenter(this, requireContext()) + adapter = SettingsAdapter(this, requireContext()) + + presenter.onCreate(menuTag, gameId, requireArguments()) + } + + override fun onCreateView( + inflater: LayoutInflater, + container: ViewGroup?, + savedInstanceState: Bundle? + ): View { + binding = FragmentSettingsBinding.inflate(inflater, container, false) + return binding!!.root + } + + override fun onViewCreated(view: View, savedInstanceState: Bundle?) { + if (titles.containsKey(menuTag)) { + activityView!!.setToolbarTitle(getString(titles[menuTag]!!)) + } + + val manager = LinearLayoutManager(activity) + + val recyclerView = binding!!.listSettings + recyclerView.adapter = adapter + recyclerView.layoutManager = manager + + val divider = SettingsDividerItemDecoration(requireActivity()) + recyclerView.addItemDecoration(divider) + + setInsets() + + val activity = activity as SettingsActivityView? + presenter.onViewCreated(menuTag, activity!!.settings) + } + + override fun onDestroyView() { + super.onDestroyView() + binding = null + } + + override fun onDetach() { + super.onDetach() + activityView = null + + if (adapter != null) { + adapter!!.closeDialog() + } + } + + override fun onSettingsFileLoaded(settings: Settings) { + presenter.settings = settings + } + + override fun showSettingsList(settingsList: ArrayList) { + adapter!!.setSettings(settingsList) + } + + override fun loadDefaultSettings() { + presenter.loadDefaultSettings() + } + + override fun loadSubMenu(menuKey: MenuTag) { + activityView!!.showSettingsFragment( + menuKey, + null, + true, + requireArguments().getString(ARGUMENT_GAME_ID)!! + ) + } + + override fun showDialogFragment(fragment: DialogFragment) { + activityView!!.showDialogFragment(fragment) + } + + override fun showToastMessage(message: String) { + activityView!!.showToastMessage(message) + } + + override val settings: Settings? + get() = presenter.settings + + override fun onSettingChanged() { + activityView!!.onSettingChanged() + } + + override fun onControllerSettingsChanged() { + adapter!!.notifyAllSettingsChanged() + presenter.updateOldControllerSettingsWarningVisibility() + } + + override fun onMenuTagAction(menuTag: MenuTag, value: Int) { + activityView!!.onMenuTagAction(menuTag, value) + } + + override fun hasMenuTagActionForValue(menuTag: MenuTag, value: Int): Boolean { + return activityView!!.hasMenuTagActionForValue(menuTag, value) + } + + override var isMappingAllDevices: Boolean + get() = activityView!!.isMappingAllDevices + set(allDevices) { + activityView!!.isMappingAllDevices = allDevices + } + + override fun setOldControllerSettingsWarningVisibility(visible: Boolean) { + oldControllerSettingsWarningHeight = + activityView!!.setOldControllerSettingsWarningVisibility(visible) + + // Trigger the insets listener we've registered + binding!!.listSettings.requestApplyInsets() + } + + private fun setInsets() { + ViewCompat.setOnApplyWindowInsetsListener(binding!!.listSettings) { v: View, windowInsets: WindowInsetsCompat -> + val insets = windowInsets.getInsets(WindowInsetsCompat.Type.systemBars()) + val listSpacing = resources.getDimensionPixelSize(R.dimen.spacing_list) + v.updatePadding(bottom = insets.bottom + listSpacing + oldControllerSettingsWarningHeight) + windowInsets + } + } + + companion object { + private const val ARGUMENT_MENU_TAG = "menu_tag" + private const val ARGUMENT_GAME_ID = "game_id" + private val titles: MutableMap = EnumMap(MenuTag::class.java) + + init { + titles[MenuTag.SETTINGS] = R.string.settings + titles[MenuTag.CONFIG] = R.string.config + titles[MenuTag.CONFIG_GENERAL] = R.string.general_submenu + titles[MenuTag.CONFIG_INTERFACE] = R.string.interface_submenu + titles[MenuTag.CONFIG_AUDIO] = R.string.audio_submenu + titles[MenuTag.CONFIG_PATHS] = R.string.paths_submenu + titles[MenuTag.CONFIG_GAME_CUBE] = R.string.gamecube_submenu + titles[MenuTag.CONFIG_SERIALPORT1] = R.string.serialport1_submenu + titles[MenuTag.CONFIG_WII] = R.string.wii_submenu + titles[MenuTag.CONFIG_ADVANCED] = R.string.advanced_submenu + titles[MenuTag.DEBUG] = R.string.debug_submenu + titles[MenuTag.GRAPHICS] = R.string.graphics_settings + titles[MenuTag.ENHANCEMENTS] = R.string.enhancements_submenu + titles[MenuTag.STEREOSCOPY] = R.string.stereoscopy_submenu + titles[MenuTag.HACKS] = R.string.hacks_submenu + titles[MenuTag.STATISTICS] = R.string.statistics_submenu + titles[MenuTag.ADVANCED_GRAPHICS] = R.string.advanced_graphics_submenu + titles[MenuTag.CONFIG_LOG] = R.string.log_submenu + titles[MenuTag.GCPAD_TYPE] = R.string.gcpad_settings + titles[MenuTag.WIIMOTE] = R.string.wiimote_settings + titles[MenuTag.WIIMOTE_EXTENSION] = R.string.wiimote_extensions + titles[MenuTag.GCPAD_1] = R.string.controller_0 + titles[MenuTag.GCPAD_2] = R.string.controller_1 + titles[MenuTag.GCPAD_3] = R.string.controller_2 + titles[MenuTag.GCPAD_4] = R.string.controller_3 + titles[MenuTag.WIIMOTE_1] = R.string.wiimote_0 + titles[MenuTag.WIIMOTE_2] = R.string.wiimote_1 + titles[MenuTag.WIIMOTE_3] = R.string.wiimote_2 + titles[MenuTag.WIIMOTE_4] = R.string.wiimote_3 + titles[MenuTag.WIIMOTE_EXTENSION_1] = R.string.wiimote_extension_0 + titles[MenuTag.WIIMOTE_EXTENSION_2] = R.string.wiimote_extension_1 + titles[MenuTag.WIIMOTE_EXTENSION_3] = R.string.wiimote_extension_2 + titles[MenuTag.WIIMOTE_EXTENSION_4] = R.string.wiimote_extension_3 + titles[MenuTag.WIIMOTE_GENERAL_1] = R.string.wiimote_general + titles[MenuTag.WIIMOTE_GENERAL_2] = R.string.wiimote_general + titles[MenuTag.WIIMOTE_GENERAL_3] = R.string.wiimote_general + titles[MenuTag.WIIMOTE_GENERAL_4] = R.string.wiimote_general + titles[MenuTag.WIIMOTE_MOTION_SIMULATION_1] = R.string.wiimote_motion_simulation + titles[MenuTag.WIIMOTE_MOTION_SIMULATION_2] = R.string.wiimote_motion_simulation + titles[MenuTag.WIIMOTE_MOTION_SIMULATION_3] = R.string.wiimote_motion_simulation + titles[MenuTag.WIIMOTE_MOTION_SIMULATION_4] = R.string.wiimote_motion_simulation + titles[MenuTag.WIIMOTE_MOTION_INPUT_1] = R.string.wiimote_motion_input + titles[MenuTag.WIIMOTE_MOTION_INPUT_2] = R.string.wiimote_motion_input + titles[MenuTag.WIIMOTE_MOTION_INPUT_3] = R.string.wiimote_motion_input + titles[MenuTag.WIIMOTE_MOTION_INPUT_4] = R.string.wiimote_motion_input + } + + @JvmStatic + fun newInstance(menuTag: MenuTag?, gameId: String?, extras: Bundle?): Fragment { + val fragment = SettingsFragment() + + val arguments = Bundle() + if (extras != null) { + arguments.putAll(extras) + } + + arguments.putSerializable(ARGUMENT_MENU_TAG, menuTag) + arguments.putString(ARGUMENT_GAME_ID, gameId) + + fragment.arguments = arguments + return fragment + } + } +}