Android: Convert CheatDetailsFragment to Kotlin
This commit is contained in:
parent
b2dd510d0a
commit
5f5c95e7da
|
@ -1,178 +0,0 @@
|
|||
// SPDX-License-Identifier: GPL-2.0-or-later
|
||||
|
||||
package org.dolphinemu.dolphinemu.features.cheats.ui;
|
||||
|
||||
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.fragment.app.Fragment;
|
||||
import androidx.lifecycle.ViewModelProvider;
|
||||
|
||||
import com.google.android.material.dialog.MaterialAlertDialogBuilder;
|
||||
|
||||
import org.dolphinemu.dolphinemu.R;
|
||||
import org.dolphinemu.dolphinemu.databinding.FragmentCheatDetailsBinding;
|
||||
import org.dolphinemu.dolphinemu.features.cheats.model.Cheat;
|
||||
import org.dolphinemu.dolphinemu.features.cheats.model.CheatsViewModel;
|
||||
|
||||
public class CheatDetailsFragment extends Fragment
|
||||
{
|
||||
private CheatsViewModel mViewModel;
|
||||
private Cheat mCheat;
|
||||
|
||||
private FragmentCheatDetailsBinding mBinding;
|
||||
|
||||
@Nullable
|
||||
@Override
|
||||
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container,
|
||||
@Nullable Bundle savedInstanceState)
|
||||
{
|
||||
mBinding = FragmentCheatDetailsBinding.inflate(inflater, container, false);
|
||||
return mBinding.getRoot();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState)
|
||||
{
|
||||
CheatsActivity activity = (CheatsActivity) requireActivity();
|
||||
mViewModel = new ViewModelProvider(activity).get(CheatsViewModel.class);
|
||||
|
||||
mViewModel.getSelectedCheat().observe(getViewLifecycleOwner(), this::onSelectedCheatUpdated);
|
||||
mViewModel.getIsEditing().observe(getViewLifecycleOwner(), this::onIsEditingUpdated);
|
||||
|
||||
mBinding.buttonDelete.setOnClickListener(this::onDeleteClicked);
|
||||
mBinding.buttonEdit.setOnClickListener(this::onEditClicked);
|
||||
mBinding.buttonCancel.setOnClickListener(this::onCancelClicked);
|
||||
mBinding.buttonOk.setOnClickListener(this::onOkClicked);
|
||||
|
||||
CheatsActivity.setOnFocusChangeListenerRecursively(view,
|
||||
(v, hasFocus) -> activity.onDetailsViewFocusChange(hasFocus));
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onDestroyView()
|
||||
{
|
||||
super.onDestroyView();
|
||||
mBinding = null;
|
||||
}
|
||||
|
||||
private void clearEditErrors()
|
||||
{
|
||||
mBinding.editName.setError(null);
|
||||
mBinding.editCode.setError(null);
|
||||
}
|
||||
|
||||
private void onDeleteClicked(View view)
|
||||
{
|
||||
new MaterialAlertDialogBuilder(requireContext())
|
||||
.setMessage(getString(R.string.cheats_delete_confirmation, mCheat.getName()))
|
||||
.setPositiveButton(R.string.yes, (dialog, i) -> mViewModel.deleteSelectedCheat())
|
||||
.setNegativeButton(R.string.no, null)
|
||||
.show();
|
||||
}
|
||||
|
||||
private void onEditClicked(View view)
|
||||
{
|
||||
mViewModel.setIsEditing(true);
|
||||
mBinding.buttonOk.requestFocus();
|
||||
}
|
||||
|
||||
private void onCancelClicked(View view)
|
||||
{
|
||||
mViewModel.setIsEditing(false);
|
||||
onSelectedCheatUpdated(mCheat);
|
||||
mBinding.buttonDelete.requestFocus();
|
||||
}
|
||||
|
||||
private void onOkClicked(View view)
|
||||
{
|
||||
clearEditErrors();
|
||||
|
||||
int result = mCheat.trySet(mBinding.editNameInput.getText().toString(),
|
||||
mBinding.editCreatorInput.getText().toString(),
|
||||
mBinding.editNotesInput.getText().toString(),
|
||||
mBinding.editCodeInput.getText().toString());
|
||||
|
||||
switch (result)
|
||||
{
|
||||
case Cheat.TRY_SET_SUCCESS:
|
||||
if (mViewModel.getIsAdding().getValue())
|
||||
{
|
||||
mViewModel.finishAddingCheat();
|
||||
onSelectedCheatUpdated(mCheat);
|
||||
}
|
||||
else
|
||||
{
|
||||
mViewModel.notifySelectedCheatChanged();
|
||||
mViewModel.setIsEditing(false);
|
||||
}
|
||||
mBinding.buttonEdit.requestFocus();
|
||||
break;
|
||||
case Cheat.TRY_SET_FAIL_NO_NAME:
|
||||
mBinding.editName.setError(getString(R.string.cheats_error_no_name));
|
||||
mBinding.scrollView.smoothScrollTo(0, mBinding.editNameInput.getTop());
|
||||
break;
|
||||
case Cheat.TRY_SET_FAIL_NO_CODE_LINES:
|
||||
mBinding.editCode.setError(getString(R.string.cheats_error_no_code_lines));
|
||||
mBinding.scrollView.smoothScrollTo(0, mBinding.editCodeInput.getBottom());
|
||||
break;
|
||||
case Cheat.TRY_SET_FAIL_CODE_MIXED_ENCRYPTION:
|
||||
mBinding.editCode.setError(getString(R.string.cheats_error_mixed_encryption));
|
||||
mBinding.scrollView.smoothScrollTo(0, mBinding.editCodeInput.getBottom());
|
||||
break;
|
||||
default:
|
||||
mBinding.editCode.setError(getString(R.string.cheats_error_on_line, result));
|
||||
mBinding.scrollView.smoothScrollTo(0, mBinding.editCodeInput.getBottom());
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
private void onSelectedCheatUpdated(@Nullable Cheat cheat)
|
||||
{
|
||||
clearEditErrors();
|
||||
|
||||
mBinding.root.setVisibility(cheat == null ? View.GONE : View.VISIBLE);
|
||||
|
||||
int creatorVisibility = cheat != null && cheat.supportsCreator() ? View.VISIBLE : View.GONE;
|
||||
int notesVisibility = cheat != null && cheat.supportsNotes() ? View.VISIBLE : View.GONE;
|
||||
int codeVisibility = cheat != null && cheat.supportsCode() ? View.VISIBLE : View.GONE;
|
||||
mBinding.editCreator.setVisibility(creatorVisibility);
|
||||
mBinding.editNotes.setVisibility(notesVisibility);
|
||||
mBinding.editCode.setVisibility(codeVisibility);
|
||||
|
||||
boolean userDefined = cheat != null && cheat.getUserDefined();
|
||||
mBinding.buttonDelete.setEnabled(userDefined);
|
||||
mBinding.buttonEdit.setEnabled(userDefined);
|
||||
|
||||
// If the fragment was recreated while editing a cheat, it's vital that we
|
||||
// don't repopulate the fields, otherwise the user's changes will be lost
|
||||
boolean isEditing = mViewModel.getIsEditing().getValue();
|
||||
|
||||
if (!isEditing && cheat != null)
|
||||
{
|
||||
mBinding.editNameInput.setText(cheat.getName());
|
||||
mBinding.editCreatorInput.setText(cheat.getCreator());
|
||||
mBinding.editNotesInput.setText(cheat.getNotes());
|
||||
mBinding.editCodeInput.setText(cheat.getCode());
|
||||
}
|
||||
|
||||
mCheat = cheat;
|
||||
}
|
||||
|
||||
private void onIsEditingUpdated(boolean isEditing)
|
||||
{
|
||||
mBinding.editNameInput.setEnabled(isEditing);
|
||||
mBinding.editCreatorInput.setEnabled(isEditing);
|
||||
mBinding.editNotesInput.setEnabled(isEditing);
|
||||
mBinding.editCodeInput.setEnabled(isEditing);
|
||||
|
||||
mBinding.buttonDelete.setVisibility(isEditing ? View.GONE : View.VISIBLE);
|
||||
mBinding.buttonEdit.setVisibility(isEditing ? View.GONE : View.VISIBLE);
|
||||
mBinding.buttonCancel.setVisibility(isEditing ? View.VISIBLE : View.GONE);
|
||||
mBinding.buttonOk.setVisibility(isEditing ? View.VISIBLE : View.GONE);
|
||||
}
|
||||
}
|
|
@ -0,0 +1,170 @@
|
|||
// SPDX-License-Identifier: GPL-2.0-or-later
|
||||
|
||||
package org.dolphinemu.dolphinemu.features.cheats.ui
|
||||
|
||||
import android.content.DialogInterface
|
||||
import android.os.Bundle
|
||||
import android.view.LayoutInflater
|
||||
import android.view.View
|
||||
import android.view.ViewGroup
|
||||
import androidx.fragment.app.Fragment
|
||||
import androidx.lifecycle.ViewModelProvider
|
||||
import com.google.android.material.dialog.MaterialAlertDialogBuilder
|
||||
import org.dolphinemu.dolphinemu.R
|
||||
import org.dolphinemu.dolphinemu.databinding.FragmentCheatDetailsBinding
|
||||
import org.dolphinemu.dolphinemu.features.cheats.model.Cheat
|
||||
import org.dolphinemu.dolphinemu.features.cheats.model.CheatsViewModel
|
||||
|
||||
class CheatDetailsFragment : Fragment() {
|
||||
private lateinit var viewModel: CheatsViewModel
|
||||
private var cheat: Cheat? = null
|
||||
|
||||
private var _binding: FragmentCheatDetailsBinding? = null
|
||||
private val binding get() = _binding!!
|
||||
|
||||
override fun onCreateView(
|
||||
inflater: LayoutInflater,
|
||||
container: ViewGroup?,
|
||||
savedInstanceState: Bundle?
|
||||
): View {
|
||||
_binding = FragmentCheatDetailsBinding.inflate(inflater, container, false)
|
||||
return binding.getRoot()
|
||||
}
|
||||
|
||||
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
|
||||
val activity = requireActivity() as CheatsActivity
|
||||
viewModel = ViewModelProvider(activity)[CheatsViewModel::class.java]
|
||||
|
||||
viewModel.selectedCheat.observe(viewLifecycleOwner) { cheat: Cheat? ->
|
||||
onSelectedCheatUpdated(
|
||||
cheat
|
||||
)
|
||||
}
|
||||
viewModel.isEditing.observe(viewLifecycleOwner) { isEditing: Boolean ->
|
||||
onIsEditingUpdated(
|
||||
isEditing
|
||||
)
|
||||
}
|
||||
|
||||
binding.buttonDelete.setOnClickListener { onDeleteClicked() }
|
||||
binding.buttonEdit.setOnClickListener { onEditClicked() }
|
||||
binding.buttonCancel.setOnClickListener { onCancelClicked() }
|
||||
binding.buttonOk.setOnClickListener { onOkClicked() }
|
||||
|
||||
CheatsActivity.setOnFocusChangeListenerRecursively(
|
||||
view
|
||||
) { _: View?, hasFocus: Boolean -> activity.onDetailsViewFocusChange(hasFocus) }
|
||||
}
|
||||
|
||||
override fun onDestroyView() {
|
||||
super.onDestroyView()
|
||||
_binding = null
|
||||
}
|
||||
|
||||
private fun clearEditErrors() {
|
||||
binding.editName.error = null
|
||||
binding.editCode.error = null
|
||||
}
|
||||
|
||||
private fun onDeleteClicked() {
|
||||
MaterialAlertDialogBuilder(requireContext())
|
||||
.setMessage(getString(R.string.cheats_delete_confirmation, cheat!!.getName()))
|
||||
.setPositiveButton(R.string.yes) { _: DialogInterface?, i: Int -> viewModel.deleteSelectedCheat() }
|
||||
.setNegativeButton(R.string.no, null)
|
||||
.show()
|
||||
}
|
||||
|
||||
private fun onEditClicked() {
|
||||
viewModel.setIsEditing(true)
|
||||
binding.buttonOk.requestFocus()
|
||||
}
|
||||
|
||||
private fun onCancelClicked() {
|
||||
viewModel.setIsEditing(false)
|
||||
onSelectedCheatUpdated(cheat)
|
||||
binding.buttonDelete.requestFocus()
|
||||
}
|
||||
|
||||
private fun onOkClicked() {
|
||||
clearEditErrors()
|
||||
|
||||
val result = cheat!!.setCheat(
|
||||
binding.editNameInput.text.toString(),
|
||||
binding.editCreatorInput.text.toString(),
|
||||
binding.editNotesInput.text.toString(),
|
||||
binding.editCodeInput.text.toString()
|
||||
)
|
||||
|
||||
when (result) {
|
||||
Cheat.TRY_SET_SUCCESS -> {
|
||||
if (viewModel.isAdding.value!!) {
|
||||
viewModel.finishAddingCheat()
|
||||
onSelectedCheatUpdated(cheat)
|
||||
} else {
|
||||
viewModel.notifySelectedCheatChanged()
|
||||
viewModel.setIsEditing(false)
|
||||
}
|
||||
binding.buttonEdit.requestFocus()
|
||||
}
|
||||
Cheat.TRY_SET_FAIL_NO_NAME -> {
|
||||
binding.editName.error = getString(R.string.cheats_error_no_name)
|
||||
binding.scrollView.smoothScrollTo(0, binding.editNameInput.top)
|
||||
}
|
||||
Cheat.TRY_SET_FAIL_NO_CODE_LINES -> {
|
||||
binding.editCode.error = getString(R.string.cheats_error_no_code_lines)
|
||||
binding.scrollView.smoothScrollTo(0, binding.editCodeInput.bottom)
|
||||
}
|
||||
Cheat.TRY_SET_FAIL_CODE_MIXED_ENCRYPTION -> {
|
||||
binding.editCode.error = getString(R.string.cheats_error_mixed_encryption)
|
||||
binding.scrollView.smoothScrollTo(0, binding.editCodeInput.bottom)
|
||||
}
|
||||
else -> {
|
||||
binding.editCode.error = getString(R.string.cheats_error_on_line, result)
|
||||
binding.scrollView.smoothScrollTo(0, binding.editCodeInput.bottom)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private fun onSelectedCheatUpdated(cheat: Cheat?) {
|
||||
clearEditErrors()
|
||||
|
||||
binding.root.visibility = if (cheat == null) View.GONE else View.VISIBLE
|
||||
|
||||
val creatorVisibility =
|
||||
if (cheat != null && cheat.supportsCreator()) View.VISIBLE else View.GONE
|
||||
val notesVisibility =
|
||||
if (cheat != null && cheat.supportsNotes()) View.VISIBLE else View.GONE
|
||||
val codeVisibility = if (cheat != null && cheat.supportsCode()) View.VISIBLE else View.GONE
|
||||
binding.editCreator.visibility = creatorVisibility
|
||||
binding.editNotes.visibility = notesVisibility
|
||||
binding.editCode.visibility = codeVisibility
|
||||
|
||||
val userDefined = cheat != null && cheat.getUserDefined()
|
||||
binding.buttonDelete.isEnabled = userDefined
|
||||
binding.buttonEdit.isEnabled = userDefined
|
||||
|
||||
// If the fragment was recreated while editing a cheat, it's vital that we
|
||||
// don't repopulate the fields, otherwise the user's changes will be lost
|
||||
val isEditing = viewModel.isEditing.value!!
|
||||
|
||||
if (!isEditing && cheat != null) {
|
||||
binding.editNameInput.setText(cheat.getName())
|
||||
binding.editCreatorInput.setText(cheat.getCreator())
|
||||
binding.editNotesInput.setText(cheat.getNotes())
|
||||
binding.editCodeInput.setText(cheat.getCode())
|
||||
}
|
||||
this.cheat = cheat
|
||||
}
|
||||
|
||||
private fun onIsEditingUpdated(isEditing: Boolean) {
|
||||
binding.editNameInput.isEnabled = isEditing
|
||||
binding.editCreatorInput.isEnabled = isEditing
|
||||
binding.editNotesInput.isEnabled = isEditing
|
||||
binding.editCodeInput.isEnabled = isEditing
|
||||
|
||||
binding.buttonDelete.visibility = if (isEditing) View.GONE else View.VISIBLE
|
||||
binding.buttonEdit.visibility = if (isEditing) View.GONE else View.VISIBLE
|
||||
binding.buttonCancel.visibility = if (isEditing) View.VISIBLE else View.GONE
|
||||
binding.buttonOk.visibility = if (isEditing) View.VISIBLE else View.GONE
|
||||
}
|
||||
}
|
Loading…
Reference in New Issue