diff options
| author | JosJuice <josjuice@gmail.com> | 2021-07-17 19:47:11 +0200 |
|---|---|---|
| committer | JosJuice <josjuice@gmail.com> | 2021-09-16 16:46:48 +0200 |
| commit | 4d609c769f7b8eba12da931c0936c5950509e165 (patch) | |
| tree | a107ede305d2d9e8054be8aa89f42fd721200f49 /Source/Android/app/src/main/java | |
| parent | ee3a5a4a81f56aeeda8c2aa1c0800847ab652bed (diff) | |
Android: Implement basic read-only cheats list
Diffstat (limited to 'Source/Android/app/src/main/java')
9 files changed, 302 insertions, 0 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 new file mode 100644 index 0000000000..f17ef89859 --- /dev/null +++ b/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/cheats/model/ARCheat.java @@ -0,0 +1,27 @@ +// SPDX-License-Identifier: GPL-2.0-or-later + +package org.dolphinemu.dolphinemu.features.cheats.model; + +import androidx.annotation.Keep; +import androidx.annotation.NonNull; + +public class ARCheat implements Cheat +{ + @Keep + private final long mPointer; + + @Keep + private ARCheat(long pointer) + { + mPointer = pointer; + } + + @Override + public native void finalize(); + + @NonNull + public native String getName(); + + @NonNull + public static native ARCheat[] loadCodes(String gameId, int revision); +} 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 new file mode 100644 index 0000000000..3c50325edf --- /dev/null +++ b/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/cheats/model/Cheat.java @@ -0,0 +1,11 @@ +// SPDX-License-Identifier: GPL-2.0-or-later + +package org.dolphinemu.dolphinemu.features.cheats.model; + +import androidx.annotation.NonNull; + +public interface Cheat +{ + @NonNull + String getName(); +} 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 new file mode 100644 index 0000000000..24eb4eff7c --- /dev/null +++ b/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/cheats/model/CheatsViewModel.java @@ -0,0 +1,41 @@ +// SPDX-License-Identifier: GPL-2.0-or-later + +package org.dolphinemu.dolphinemu.features.cheats.model; + +import androidx.lifecycle.ViewModel; + +public class CheatsViewModel extends ViewModel +{ + private boolean mLoaded = false; + + private PatchCheat[] mPatchCheats; + private ARCheat[] mARCheats; + private GeckoCheat[] mGeckoCheats; + + public void load(String gameID, int revision) + { + if (mLoaded) + return; + + mPatchCheats = PatchCheat.loadCodes(gameID, revision); + mARCheats = ARCheat.loadCodes(gameID, revision); + mGeckoCheats = GeckoCheat.loadCodes(gameID, revision); + + mLoaded = true; + } + + public Cheat[] getPatchCheats() + { + return mPatchCheats; + } + + public ARCheat[] getARCheats() + { + return mARCheats; + } + + public Cheat[] getGeckoCheats() + { + return mGeckoCheats; + } +} 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 new file mode 100644 index 0000000000..5f9c7029ec --- /dev/null +++ b/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/cheats/model/GeckoCheat.java @@ -0,0 +1,27 @@ +// SPDX-License-Identifier: GPL-2.0-or-later + +package org.dolphinemu.dolphinemu.features.cheats.model; + +import androidx.annotation.Keep; +import androidx.annotation.NonNull; + +public class GeckoCheat implements Cheat +{ + @Keep + private final long mPointer; + + @Keep + private GeckoCheat(long pointer) + { + mPointer = pointer; + } + + @Override + public native void finalize(); + + @NonNull + public native String getName(); + + @NonNull + public static native GeckoCheat[] loadCodes(String gameId, int revision); +} 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 new file mode 100644 index 0000000000..5b2027807e --- /dev/null +++ b/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/cheats/model/PatchCheat.java @@ -0,0 +1,27 @@ +// SPDX-License-Identifier: GPL-2.0-or-later + +package org.dolphinemu.dolphinemu.features.cheats.model; + +import androidx.annotation.Keep; +import androidx.annotation.NonNull; + +public class PatchCheat implements Cheat +{ + @Keep + private final long mPointer; + + @Keep + private PatchCheat(long pointer) + { + mPointer = pointer; + } + + @Override + public native void finalize(); + + @NonNull + public native String getName(); + + @NonNull + public static native PatchCheat[] loadCodes(String gameId, int revision); +} diff --git a/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/cheats/ui/CheatListFragment.java b/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/cheats/ui/CheatListFragment.java new file mode 100644 index 0000000000..82c5b549bb --- /dev/null +++ b/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/cheats/ui/CheatListFragment.java @@ -0,0 +1,43 @@ +// 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 androidx.recyclerview.widget.LinearLayoutManager; +import androidx.recyclerview.widget.RecyclerView; + +import org.dolphinemu.dolphinemu.R; +import org.dolphinemu.dolphinemu.features.cheats.model.CheatsViewModel; +import org.dolphinemu.dolphinemu.ui.DividerItemDecoration; + +public class CheatListFragment extends Fragment +{ + @Nullable + @Override + public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, + @Nullable Bundle savedInstanceState) + { + return inflater.inflate(R.layout.fragment_cheat_list, container, false); + } + + @Override + public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) + { + RecyclerView recyclerView = view.findViewById(R.id.cheat_list); + + CheatsActivity activity = (CheatsActivity) requireActivity(); + CheatsViewModel viewModel = new ViewModelProvider(activity).get(CheatsViewModel.class); + + recyclerView.setAdapter(new CheatsAdapter(viewModel)); + recyclerView.setLayoutManager(new LinearLayoutManager(activity)); + recyclerView.addItemDecoration(new DividerItemDecoration(activity, null)); + } +} diff --git a/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/cheats/ui/CheatViewHolder.java b/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/cheats/ui/CheatViewHolder.java new file mode 100644 index 0000000000..e99f75f6b2 --- /dev/null +++ b/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/cheats/ui/CheatViewHolder.java @@ -0,0 +1,29 @@ +// SPDX-License-Identifier: GPL-2.0-or-later + +package org.dolphinemu.dolphinemu.features.cheats.ui; + +import android.view.View; +import android.widget.TextView; + +import androidx.annotation.NonNull; +import androidx.recyclerview.widget.RecyclerView.ViewHolder; + +import org.dolphinemu.dolphinemu.R; +import org.dolphinemu.dolphinemu.features.cheats.model.Cheat; + +public class CheatViewHolder extends ViewHolder +{ + private TextView mName; + + public CheatViewHolder(@NonNull View itemView) + { + super(itemView); + + mName = itemView.findViewById(R.id.text_name); + } + + public void bind(Cheat item) + { + mName.setText(item.getName()); + } +} diff --git a/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/cheats/ui/CheatsActivity.java b/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/cheats/ui/CheatsActivity.java index 4090507408..80a875e026 100644 --- a/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/cheats/ui/CheatsActivity.java +++ b/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/cheats/ui/CheatsActivity.java @@ -4,8 +4,14 @@ package org.dolphinemu.dolphinemu.features.cheats.ui; import android.content.Context; import android.content.Intent; +import android.os.Bundle; import androidx.appcompat.app.AppCompatActivity; +import androidx.lifecycle.ViewModelProvider; + +import org.dolphinemu.dolphinemu.R; +import org.dolphinemu.dolphinemu.features.cheats.model.CheatsViewModel; +import org.dolphinemu.dolphinemu.ui.main.MainPresenter; public class CheatsActivity extends AppCompatActivity { @@ -19,4 +25,23 @@ public class CheatsActivity extends AppCompatActivity intent.putExtra(ARG_REVISION, revision); context.startActivity(intent); } + + @Override + protected void onCreate(Bundle savedInstanceState) + { + super.onCreate(savedInstanceState); + + MainPresenter.skipRescanningLibrary(); + + Intent intent = getIntent(); + String gameId = intent.getStringExtra(ARG_GAME_ID); + int revision = intent.getIntExtra(ARG_REVISION, 0); + + setTitle(getString(R.string.cheats_with_game_id, gameId)); + + CheatsViewModel viewModel = new ViewModelProvider(this).get(CheatsViewModel.class); + viewModel.load(gameId, revision); + + setContentView(R.layout.activity_cheats); + } } diff --git a/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/cheats/ui/CheatsAdapter.java b/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/cheats/ui/CheatsAdapter.java new file mode 100644 index 0000000000..6193b6c52f --- /dev/null +++ b/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/cheats/ui/CheatsAdapter.java @@ -0,0 +1,72 @@ +// SPDX-License-Identifier: GPL-2.0-or-later + +package org.dolphinemu.dolphinemu.features.cheats.ui; + +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; + +import androidx.annotation.NonNull; +import androidx.recyclerview.widget.RecyclerView; + +import org.dolphinemu.dolphinemu.R; +import org.dolphinemu.dolphinemu.features.cheats.model.Cheat; +import org.dolphinemu.dolphinemu.features.cheats.model.CheatsViewModel; + +public class CheatsAdapter extends RecyclerView.Adapter<CheatViewHolder> +{ + private final CheatsViewModel mViewModel; + + public CheatsAdapter(CheatsViewModel viewModel) + { + mViewModel = viewModel; + } + + @NonNull + @Override + public CheatViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) + { + LayoutInflater inflater = LayoutInflater.from(parent.getContext()); + View view = inflater.inflate(R.layout.list_item_cheat, parent, false); + return new CheatViewHolder(view); + } + + @Override + public void onBindViewHolder(@NonNull CheatViewHolder holder, int position) + { + holder.bind(getItemAt(position)); + } + + @Override + public int getItemCount() + { + return mViewModel.getARCheats().length + mViewModel.getGeckoCheats().length + + mViewModel.getPatchCheats().length; + } + + private Cheat getItemAt(int position) + { + Cheat[] patchCheats = mViewModel.getPatchCheats(); + if (position < patchCheats.length) + { + return patchCheats[position]; + } + position -= patchCheats.length; + + Cheat[] arCheats = mViewModel.getARCheats(); + if (position < arCheats.length) + { + return arCheats[position]; + } + position -= arCheats.length; + + Cheat[] geckoCheats = mViewModel.getGeckoCheats(); + if (position < geckoCheats.length) + { + return geckoCheats[position]; + } + position -= geckoCheats.length; + + throw new IndexOutOfBoundsException(); + } +} |
