diff options
| author | JosJuice <josjuice@gmail.com> | 2021-08-07 16:08:07 +0200 |
|---|---|---|
| committer | JosJuice <josjuice@gmail.com> | 2021-09-16 16:46:49 +0200 |
| commit | 43dcbf33adc72e935c518c3a7a0e621fe5694b69 (patch) | |
| tree | 57c6db34b2e742ac6995fc41a3c4afe7393524d7 /Source/Android/app/src/main/java | |
| parent | a303b4bc98af237ab708221b88c51df22d3f2ebd (diff) | |
Android: Add edit button for cheats
Diffstat (limited to 'Source/Android/app/src/main/java')
7 files changed, 114 insertions, 5 deletions
diff --git a/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/cheats/model/ARCheat.java b/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/cheats/model/ARCheat.java index ebb4ee9416..bed39c2dbd 100644 --- a/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/cheats/model/ARCheat.java +++ b/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/cheats/model/ARCheat.java @@ -22,9 +22,14 @@ public class ARCheat extends AbstractCheat @NonNull public native String getName(); + public native boolean getUserDefined(); + public native boolean getEnabled(); @Override + protected native int trySetImpl(@NonNull String name); + + @Override protected native void setEnabledImpl(boolean enabled); @NonNull diff --git a/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/cheats/model/AbstractCheat.java b/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/cheats/model/AbstractCheat.java index 8f6121808a..60391895c7 100644 --- a/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/cheats/model/AbstractCheat.java +++ b/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/cheats/model/AbstractCheat.java @@ -2,12 +2,26 @@ package org.dolphinemu.dolphinemu.features.cheats.model; +import androidx.annotation.NonNull; import androidx.annotation.Nullable; public abstract class AbstractCheat implements Cheat { private Runnable mChangedCallback = null; + public int trySet(@NonNull String name) + { + if (name.isEmpty()) + return TRY_SET_FAIL_NO_NAME; + + int result = trySetImpl(name); + + if (result == TRY_SET_SUCCESS) + onChanged(); + + return result; + } + public void setEnabled(boolean enabled) { setEnabledImpl(enabled); @@ -25,5 +39,7 @@ public abstract class AbstractCheat implements Cheat mChangedCallback.run(); } + protected abstract int trySetImpl(@NonNull String name); + protected abstract void setEnabledImpl(boolean enabled); } diff --git a/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/cheats/model/Cheat.java b/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/cheats/model/Cheat.java index 97bd57d885..baf8ebb5be 100644 --- a/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/cheats/model/Cheat.java +++ b/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/cheats/model/Cheat.java @@ -3,13 +3,23 @@ package org.dolphinemu.dolphinemu.features.cheats.model; import androidx.annotation.NonNull; +import androidx.annotation.Nullable; public interface Cheat { + int TRY_SET_FAIL_NO_NAME = -1; + int TRY_SET_SUCCESS = 0; + @NonNull String getName(); + int trySet(@NonNull String name); + + boolean getUserDefined(); + boolean getEnabled(); void setEnabled(boolean enabled); + + void setChangedCallback(@Nullable Runnable callback); } diff --git a/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/cheats/model/CheatsViewModel.java b/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/cheats/model/CheatsViewModel.java index aac6c02ed0..e4e5298104 100644 --- a/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/cheats/model/CheatsViewModel.java +++ b/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/cheats/model/CheatsViewModel.java @@ -11,6 +11,7 @@ public class CheatsViewModel extends ViewModel private boolean mLoaded = false; private final MutableLiveData<Cheat> mSelectedCheat = new MutableLiveData<>(null); + private final MutableLiveData<Boolean> mIsEditing = new MutableLiveData<>(false); private final MutableLiveData<Boolean> mOpenDetailsViewEvent = new MutableLiveData<>(false); @@ -75,9 +76,22 @@ public class CheatsViewModel extends ViewModel public void setSelectedCheat(Cheat cheat) { + if (mIsEditing.getValue()) + setIsEditing(false); + mSelectedCheat.setValue(cheat); } + public LiveData<Boolean> getIsEditing() + { + return mIsEditing; + } + + public void setIsEditing(boolean isEditing) + { + mIsEditing.setValue(isEditing); + } + public LiveData<Boolean> getOpenDetailsViewEvent() { return mOpenDetailsViewEvent; diff --git a/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/cheats/model/GeckoCheat.java b/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/cheats/model/GeckoCheat.java index f6ea493ac3..06815d1fe9 100644 --- a/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/cheats/model/GeckoCheat.java +++ b/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/cheats/model/GeckoCheat.java @@ -22,9 +22,14 @@ public class GeckoCheat extends AbstractCheat @NonNull public native String getName(); + public native boolean getUserDefined(); + public native boolean getEnabled(); @Override + protected native int trySetImpl(@NonNull String name); + + @Override protected native void setEnabledImpl(boolean enabled); @NonNull diff --git a/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/cheats/model/PatchCheat.java b/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/cheats/model/PatchCheat.java index 411df3cdc0..b4e0ee3e53 100644 --- a/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/cheats/model/PatchCheat.java +++ b/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/cheats/model/PatchCheat.java @@ -22,9 +22,14 @@ public class PatchCheat extends AbstractCheat @NonNull public native String getName(); + public native boolean getUserDefined(); + public native boolean getEnabled(); @Override + protected native int trySetImpl(@NonNull String name); + + @Override protected native void setEnabledImpl(boolean enabled); @NonNull diff --git a/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/cheats/ui/CheatDetailsFragment.java b/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/cheats/ui/CheatDetailsFragment.java index 90356b63eb..0b7ce49785 100644 --- a/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/cheats/ui/CheatDetailsFragment.java +++ b/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/cheats/ui/CheatDetailsFragment.java @@ -6,6 +6,7 @@ import android.os.Bundle; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; +import android.widget.Button; import android.widget.EditText; import androidx.annotation.NonNull; @@ -22,6 +23,9 @@ public class CheatDetailsFragment extends Fragment { private View mRoot; private EditText mEditName; + private Button mButtonEdit; + private Button mButtonCancel; + private Button mButtonOk; private CheatsViewModel mViewModel; private Cheat mCheat; @@ -39,24 +43,74 @@ public class CheatDetailsFragment extends Fragment { mRoot = view.findViewById(R.id.root); mEditName = view.findViewById(R.id.edit_name); + mButtonEdit = view.findViewById(R.id.button_edit); + mButtonCancel = view.findViewById(R.id.button_cancel); + mButtonOk = view.findViewById(R.id.button_ok); CheatsActivity activity = (CheatsActivity) requireActivity(); mViewModel = new ViewModelProvider(activity).get(CheatsViewModel.class); - LiveData<Cheat> selectedCheat = mViewModel.getSelectedCheat(); - selectedCheat.observe(getViewLifecycleOwner(), this::populateFields); - populateFields(selectedCheat.getValue()); + mViewModel.getSelectedCheat().observe(getViewLifecycleOwner(), this::onSelectedCheatUpdated); + mViewModel.getIsEditing().observe(getViewLifecycleOwner(), this::onIsEditingUpdated); + + mButtonEdit.setOnClickListener((v) -> mViewModel.setIsEditing(true)); + mButtonCancel.setOnClickListener((v) -> + { + mViewModel.setIsEditing(false); + onSelectedCheatUpdated(mCheat); + }); + mButtonOk.setOnClickListener(this::onOkClicked); + } + + private void clearEditErrors() + { + mEditName.setError(null); } - private void populateFields(@Nullable Cheat cheat) + private void onOkClicked(View view) { + clearEditErrors(); + + int result = mCheat.trySet(mEditName.getText().toString()); + + switch (result) + { + case Cheat.TRY_SET_SUCCESS: + mViewModel.setIsEditing(false); + break; + case Cheat.TRY_SET_FAIL_NO_NAME: + mEditName.setError(getText(R.string.cheats_error_no_name)); + break; + } + } + + private void onSelectedCheatUpdated(@Nullable Cheat cheat) + { + clearEditErrors(); + mRoot.setVisibility(cheat == null ? View.GONE : View.VISIBLE); - if (cheat != null && cheat != mCheat) + boolean userDefined = cheat != null && cheat.getUserDefined(); + mButtonEdit.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) { mEditName.setText(cheat.getName()); } mCheat = cheat; } + + private void onIsEditingUpdated(boolean isEditing) + { + mEditName.setEnabled(isEditing); + + mButtonEdit.setVisibility(isEditing ? View.GONE : View.VISIBLE); + mButtonCancel.setVisibility(isEditing ? View.VISIBLE : View.GONE); + mButtonOk.setVisibility(isEditing ? View.VISIBLE : View.GONE); + } } |
