mirror of
https://github.com/dolphin-emu/dolphin.git
synced 2025-03-12 06:39:14 +01:00
Android: Convert ProfileDialogPresenter to Kotlin
This commit is contained in:
parent
6ad18e4ee5
commit
29e5c78541
@ -1,157 +0,0 @@
|
|||||||
// SPDX-License-Identifier: GPL-2.0-or-later
|
|
||||||
|
|
||||||
package org.dolphinemu.dolphinemu.features.input.ui;
|
|
||||||
|
|
||||||
import android.content.Context;
|
|
||||||
import android.view.LayoutInflater;
|
|
||||||
|
|
||||||
import androidx.annotation.NonNull;
|
|
||||||
import androidx.fragment.app.DialogFragment;
|
|
||||||
|
|
||||||
import com.google.android.material.dialog.MaterialAlertDialogBuilder;
|
|
||||||
import com.google.android.material.textfield.TextInputEditText;
|
|
||||||
|
|
||||||
import org.dolphinemu.dolphinemu.R;
|
|
||||||
import org.dolphinemu.dolphinemu.databinding.DialogInputStringBinding;
|
|
||||||
import org.dolphinemu.dolphinemu.features.settings.ui.MenuTag;
|
|
||||||
import org.dolphinemu.dolphinemu.features.settings.ui.SettingsActivityView;
|
|
||||||
import org.dolphinemu.dolphinemu.utils.DirectoryInitialization;
|
|
||||||
|
|
||||||
import java.io.File;
|
|
||||||
import java.text.Collator;
|
|
||||||
import java.util.Arrays;
|
|
||||||
|
|
||||||
public final class ProfileDialogPresenter
|
|
||||||
{
|
|
||||||
private static final String EXTENSION = ".ini";
|
|
||||||
|
|
||||||
private final Context mContext;
|
|
||||||
private final DialogFragment mDialog;
|
|
||||||
private final MenuTag mMenuTag;
|
|
||||||
|
|
||||||
public ProfileDialogPresenter(MenuTag menuTag)
|
|
||||||
{
|
|
||||||
mContext = null;
|
|
||||||
mDialog = null;
|
|
||||||
mMenuTag = menuTag;
|
|
||||||
}
|
|
||||||
|
|
||||||
public ProfileDialogPresenter(DialogFragment dialog, MenuTag menuTag)
|
|
||||||
{
|
|
||||||
mContext = dialog.getContext();
|
|
||||||
mDialog = dialog;
|
|
||||||
mMenuTag = menuTag;
|
|
||||||
}
|
|
||||||
|
|
||||||
public String[] getProfileNames(boolean stock)
|
|
||||||
{
|
|
||||||
File[] profiles = new File(getProfileDirectoryPath(stock)).listFiles(
|
|
||||||
file -> !file.isDirectory() && file.getName().endsWith(EXTENSION));
|
|
||||||
|
|
||||||
if (profiles == null)
|
|
||||||
return new String[0];
|
|
||||||
|
|
||||||
return Arrays.stream(profiles)
|
|
||||||
.map(file -> file.getName().substring(0, file.getName().length() - EXTENSION.length()))
|
|
||||||
.sorted(Collator.getInstance())
|
|
||||||
.toArray(String[]::new);
|
|
||||||
}
|
|
||||||
|
|
||||||
public void loadProfile(@NonNull String profileName, boolean stock)
|
|
||||||
{
|
|
||||||
new MaterialAlertDialogBuilder(mContext)
|
|
||||||
.setMessage(mContext.getString(R.string.input_profile_confirm_load, profileName))
|
|
||||||
.setPositiveButton(R.string.yes, (dialogInterface, i) ->
|
|
||||||
{
|
|
||||||
mMenuTag.getCorrespondingEmulatedController()
|
|
||||||
.loadProfile(getProfilePath(profileName, stock));
|
|
||||||
((SettingsActivityView) mDialog.requireActivity()).onControllerSettingsChanged();
|
|
||||||
mDialog.dismiss();
|
|
||||||
})
|
|
||||||
.setNegativeButton(R.string.no, null)
|
|
||||||
.show();
|
|
||||||
}
|
|
||||||
|
|
||||||
public void saveProfile(@NonNull String profileName)
|
|
||||||
{
|
|
||||||
// If the user is saving over an existing profile, we should show an overwrite warning.
|
|
||||||
// If the user is creating a new profile, we normally shouldn't show a warning,
|
|
||||||
// but if they've entered the name of an existing profile, we should shown an overwrite warning.
|
|
||||||
|
|
||||||
String profilePath = getProfilePath(profileName, false);
|
|
||||||
if (!new File(profilePath).exists())
|
|
||||||
{
|
|
||||||
mMenuTag.getCorrespondingEmulatedController().saveProfile(profilePath);
|
|
||||||
mDialog.dismiss();
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
new MaterialAlertDialogBuilder(mContext)
|
|
||||||
.setMessage(mContext.getString(R.string.input_profile_confirm_save, profileName))
|
|
||||||
.setPositiveButton(R.string.yes, (dialogInterface, i) ->
|
|
||||||
{
|
|
||||||
mMenuTag.getCorrespondingEmulatedController().saveProfile(profilePath);
|
|
||||||
mDialog.dismiss();
|
|
||||||
})
|
|
||||||
.setNegativeButton(R.string.no, null)
|
|
||||||
.show();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public void saveProfileAndPromptForName()
|
|
||||||
{
|
|
||||||
LayoutInflater inflater = LayoutInflater.from(mContext);
|
|
||||||
|
|
||||||
DialogInputStringBinding binding = DialogInputStringBinding.inflate(inflater);
|
|
||||||
TextInputEditText input = binding.input;
|
|
||||||
|
|
||||||
new MaterialAlertDialogBuilder(mContext)
|
|
||||||
.setView(binding.getRoot())
|
|
||||||
.setPositiveButton(R.string.ok, (dialogInterface, i) ->
|
|
||||||
saveProfile(input.getText().toString()))
|
|
||||||
.setNegativeButton(R.string.cancel, null)
|
|
||||||
.show();
|
|
||||||
}
|
|
||||||
|
|
||||||
public void deleteProfile(@NonNull String profileName)
|
|
||||||
{
|
|
||||||
new MaterialAlertDialogBuilder(mContext)
|
|
||||||
.setMessage(mContext.getString(R.string.input_profile_confirm_delete, profileName))
|
|
||||||
.setPositiveButton(R.string.yes, (dialogInterface, i) ->
|
|
||||||
{
|
|
||||||
new File(getProfilePath(profileName, false)).delete();
|
|
||||||
mDialog.dismiss();
|
|
||||||
})
|
|
||||||
.setNegativeButton(R.string.no, null)
|
|
||||||
.show();
|
|
||||||
}
|
|
||||||
|
|
||||||
private String getProfileDirectoryName()
|
|
||||||
{
|
|
||||||
if (mMenuTag.isGCPadMenu())
|
|
||||||
return "GCPad";
|
|
||||||
else if (mMenuTag.isWiimoteMenu())
|
|
||||||
return "Wiimote";
|
|
||||||
else
|
|
||||||
throw new UnsupportedOperationException();
|
|
||||||
}
|
|
||||||
|
|
||||||
private String getProfileDirectoryPath(boolean stock)
|
|
||||||
{
|
|
||||||
if (stock)
|
|
||||||
{
|
|
||||||
return DirectoryInitialization.getSysDirectory() + "/Profiles/" + getProfileDirectoryName() +
|
|
||||||
'/';
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
return DirectoryInitialization.getUserDirectory() + "/Config/Profiles/" +
|
|
||||||
getProfileDirectoryName() + '/';
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private String getProfilePath(String profileName, boolean stock)
|
|
||||||
{
|
|
||||||
return getProfileDirectoryPath(stock) + profileName + EXTENSION;
|
|
||||||
}
|
|
||||||
}
|
|
@ -0,0 +1,119 @@
|
|||||||
|
// SPDX-License-Identifier: GPL-2.0-or-later
|
||||||
|
|
||||||
|
package org.dolphinemu.dolphinemu.features.input.ui
|
||||||
|
|
||||||
|
import android.content.Context
|
||||||
|
import android.content.DialogInterface
|
||||||
|
import android.view.LayoutInflater
|
||||||
|
import androidx.fragment.app.DialogFragment
|
||||||
|
import com.google.android.material.dialog.MaterialAlertDialogBuilder
|
||||||
|
import org.dolphinemu.dolphinemu.R
|
||||||
|
import org.dolphinemu.dolphinemu.databinding.DialogInputStringBinding
|
||||||
|
import org.dolphinemu.dolphinemu.features.settings.ui.MenuTag
|
||||||
|
import org.dolphinemu.dolphinemu.features.settings.ui.SettingsActivityView
|
||||||
|
import org.dolphinemu.dolphinemu.utils.DirectoryInitialization
|
||||||
|
import java.io.File
|
||||||
|
import java.util.Locale
|
||||||
|
|
||||||
|
class ProfileDialogPresenter {
|
||||||
|
private val context: Context?
|
||||||
|
private val dialog: DialogFragment?
|
||||||
|
private val menuTag: MenuTag
|
||||||
|
|
||||||
|
constructor(menuTag: MenuTag) {
|
||||||
|
context = null
|
||||||
|
dialog = null
|
||||||
|
this.menuTag = menuTag
|
||||||
|
}
|
||||||
|
|
||||||
|
constructor(dialog: DialogFragment, menuTag: MenuTag) {
|
||||||
|
context = dialog.context
|
||||||
|
this.dialog = dialog
|
||||||
|
this.menuTag = menuTag
|
||||||
|
}
|
||||||
|
|
||||||
|
fun getProfileNames(stock: Boolean): Array<String> {
|
||||||
|
val profiles = File(getProfileDirectoryPath(stock)).listFiles { file: File ->
|
||||||
|
!file.isDirectory && file.name.endsWith(EXTENSION)
|
||||||
|
} ?: return emptyArray()
|
||||||
|
|
||||||
|
return profiles.map { it.name.substring(0, it.name.length - EXTENSION.length) }
|
||||||
|
.sortedBy { it.lowercase(Locale.getDefault()) }
|
||||||
|
.toTypedArray()
|
||||||
|
}
|
||||||
|
|
||||||
|
fun loadProfile(profileName: String, stock: Boolean) {
|
||||||
|
MaterialAlertDialogBuilder(context!!)
|
||||||
|
.setMessage(context.getString(R.string.input_profile_confirm_load, profileName))
|
||||||
|
.setPositiveButton(R.string.yes) { _: DialogInterface?, _: Int ->
|
||||||
|
menuTag.correspondingEmulatedController
|
||||||
|
.loadProfile(getProfilePath(profileName, stock))
|
||||||
|
(dialog!!.requireActivity() as SettingsActivityView).onControllerSettingsChanged()
|
||||||
|
dialog.dismiss()
|
||||||
|
}
|
||||||
|
.setNegativeButton(R.string.no, null)
|
||||||
|
.show()
|
||||||
|
}
|
||||||
|
|
||||||
|
fun saveProfile(profileName: String) {
|
||||||
|
// If the user is saving over an existing profile, we should show an overwrite warning.
|
||||||
|
// If the user is creating a new profile, we normally shouldn't show a warning,
|
||||||
|
// but if they've entered the name of an existing profile, we should shown an overwrite warning.
|
||||||
|
val profilePath = getProfilePath(profileName, false)
|
||||||
|
if (!File(profilePath).exists()) {
|
||||||
|
menuTag.correspondingEmulatedController.saveProfile(profilePath)
|
||||||
|
dialog!!.dismiss()
|
||||||
|
} else {
|
||||||
|
MaterialAlertDialogBuilder(context!!)
|
||||||
|
.setMessage(context.getString(R.string.input_profile_confirm_save, profileName))
|
||||||
|
.setPositiveButton(R.string.yes) { _: DialogInterface?, _: Int ->
|
||||||
|
menuTag.correspondingEmulatedController.saveProfile(profilePath)
|
||||||
|
dialog!!.dismiss()
|
||||||
|
}
|
||||||
|
.setNegativeButton(R.string.no, null)
|
||||||
|
.show()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
fun saveProfileAndPromptForName() {
|
||||||
|
val inflater = LayoutInflater.from(context)
|
||||||
|
val binding = DialogInputStringBinding.inflate(inflater)
|
||||||
|
val input = binding.input
|
||||||
|
|
||||||
|
MaterialAlertDialogBuilder(context!!)
|
||||||
|
.setView(binding.root)
|
||||||
|
.setPositiveButton(android.R.string.ok) { _: DialogInterface?, _: Int ->
|
||||||
|
saveProfile(input.text.toString())
|
||||||
|
}
|
||||||
|
.setNegativeButton(android.R.string.cancel, null)
|
||||||
|
.show()
|
||||||
|
}
|
||||||
|
|
||||||
|
fun deleteProfile(profileName: String) {
|
||||||
|
MaterialAlertDialogBuilder(context!!)
|
||||||
|
.setMessage(context.getString(R.string.input_profile_confirm_delete, profileName))
|
||||||
|
.setPositiveButton(R.string.yes) { _: DialogInterface?, _: Int ->
|
||||||
|
File(getProfilePath(profileName, false)).delete()
|
||||||
|
dialog!!.dismiss()
|
||||||
|
}
|
||||||
|
.setNegativeButton(R.string.no, null)
|
||||||
|
.show()
|
||||||
|
}
|
||||||
|
|
||||||
|
private val profileDirectoryName: String
|
||||||
|
get() = if (menuTag.isGCPadMenu) "GCPad" else if (menuTag.isWiimoteMenu) "Wiimote" else throw UnsupportedOperationException()
|
||||||
|
|
||||||
|
private fun getProfileDirectoryPath(stock: Boolean): String =
|
||||||
|
if (stock) {
|
||||||
|
"${DirectoryInitialization.getSysDirectory()}/Profiles/$profileDirectoryName/"
|
||||||
|
} else {
|
||||||
|
"${DirectoryInitialization.getUserDirectory()}/Config/Profiles/$profileDirectoryName/"
|
||||||
|
}
|
||||||
|
|
||||||
|
private fun getProfilePath(profileName: String, stock: Boolean): String =
|
||||||
|
getProfileDirectoryPath(stock) + profileName + EXTENSION
|
||||||
|
|
||||||
|
companion object {
|
||||||
|
private const val EXTENSION = ".ini"
|
||||||
|
}
|
||||||
|
}
|
@ -41,7 +41,7 @@ class SettingsFragmentPresenter(
|
|||||||
private val fragmentView: SettingsFragmentView,
|
private val fragmentView: SettingsFragmentView,
|
||||||
private val context: Context
|
private val context: Context
|
||||||
) {
|
) {
|
||||||
private var menuTag: MenuTag? = null
|
private lateinit var menuTag: MenuTag
|
||||||
private var gameId: String? = null
|
private var gameId: String? = null
|
||||||
|
|
||||||
private var settingsList: ArrayList<SettingsItem>? = null
|
private var settingsList: ArrayList<SettingsItem>? = null
|
||||||
@ -78,7 +78,7 @@ class SettingsFragmentPresenter(
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
fun onViewCreated(menuTag: MenuTag?, settings: Settings?) {
|
fun onViewCreated(menuTag: MenuTag, settings: Settings?) {
|
||||||
this.menuTag = menuTag
|
this.menuTag = menuTag
|
||||||
|
|
||||||
if (!TextUtils.isEmpty(gameId)) {
|
if (!TextUtils.isEmpty(gameId)) {
|
||||||
@ -2148,7 +2148,7 @@ class SettingsFragmentPresenter(
|
|||||||
profileString: String,
|
profileString: String,
|
||||||
controllerNumber: Int
|
controllerNumber: Int
|
||||||
) {
|
) {
|
||||||
val profiles = ProfileDialogPresenter(menuTag!!).getProfileNames(false)
|
val profiles = ProfileDialogPresenter(menuTag).getProfileNames(false)
|
||||||
val profileKey = profileString + "Profile" + (controllerNumber + 1)
|
val profileKey = profileString + "Profile" + (controllerNumber + 1)
|
||||||
sl.add(
|
sl.add(
|
||||||
StringSingleChoiceSetting(
|
StringSingleChoiceSetting(
|
||||||
@ -2227,7 +2227,7 @@ class SettingsFragmentPresenter(
|
|||||||
0,
|
0,
|
||||||
0,
|
0,
|
||||||
true
|
true
|
||||||
) { fragmentView.showDialogFragment(ProfileDialog.create(menuTag!!)) })
|
) { fragmentView.showDialogFragment(ProfileDialog.create(menuTag)) })
|
||||||
|
|
||||||
updateOldControllerSettingsWarningVisibility(controller)
|
updateOldControllerSettingsWarningVisibility(controller)
|
||||||
}
|
}
|
||||||
@ -2313,7 +2313,7 @@ class SettingsFragmentPresenter(
|
|||||||
}
|
}
|
||||||
|
|
||||||
fun updateOldControllerSettingsWarningVisibility() {
|
fun updateOldControllerSettingsWarningVisibility() {
|
||||||
updateOldControllerSettingsWarningVisibility(menuTag!!.correspondingEmulatedController)
|
updateOldControllerSettingsWarningVisibility(menuTag.correspondingEmulatedController)
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun updateOldControllerSettingsWarningVisibility(controller: EmulatedController) {
|
private fun updateOldControllerSettingsWarningVisibility(controller: EmulatedController) {
|
||||||
|
Loading…
x
Reference in New Issue
Block a user