From 0229f25fc353209338dde48dfd8487486c2e42a9 Mon Sep 17 00:00:00 2001
From: Connor McLaughlin <stenzek@gmail.com>
Date: Sat, 29 May 2021 20:51:53 +1000
Subject: [PATCH] Android: Show patch code categories in list

---
 android/app/src/cpp/android_host_interface.cpp  |  7 +++++--
 .../stenzek/duckstation/EmulationActivity.java  |  2 +-
 .../github/stenzek/duckstation/PatchCode.java   | 17 ++++++++++++++++-
 3 files changed, 22 insertions(+), 4 deletions(-)

diff --git a/android/app/src/cpp/android_host_interface.cpp b/android/app/src/cpp/android_host_interface.cpp
index b850aef33..8f890041b 100644
--- a/android/app/src/cpp/android_host_interface.cpp
+++ b/android/app/src/cpp/android_host_interface.cpp
@@ -1029,7 +1029,8 @@ extern "C" jint JNI_OnLoad(JavaVM* vm, void* reserved)
          env->GetMethodID(s_EmulationActivity_class, "hasInputDeviceVibration", "(I)Z")) == nullptr ||
       (s_EmulationActivity_method_setInputDeviceVibration =
          env->GetMethodID(s_EmulationActivity_class, "setInputDeviceVibration", "(IFF)V")) == nullptr ||
-      (s_PatchCode_constructor = env->GetMethodID(s_PatchCode_class, "<init>", "(ILjava/lang/String;Z)V")) == nullptr ||
+      (s_PatchCode_constructor =
+         env->GetMethodID(s_PatchCode_class, "<init>", "(ILjava/lang/String;Ljava/lang/String;Z)V")) == nullptr ||
       (s_GameListEntry_constructor =
          env->GetMethodID(s_GameListEntry_class, "<init>",
                           "(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;JLjava/lang/String;Ljava/lang/"
@@ -1628,12 +1629,14 @@ DEFINE_JNI_ARGS_METHOD(jobject, AndroidHostInterface_getPatchCodeList, jobject o
   {
     const CheatCode& cc = cl->GetCode(i);
 
+    jstring group_str = cc.group.empty() ? nullptr : env->NewStringUTF(cc.group.c_str());
     jstring desc_str = env->NewStringUTF(cc.description.c_str());
     jobject java_cc =
-      env->NewObject(s_PatchCode_class, s_PatchCode_constructor, static_cast<jint>(i), desc_str, cc.enabled);
+      env->NewObject(s_PatchCode_class, s_PatchCode_constructor, static_cast<jint>(i), group_str, desc_str, cc.enabled);
     env->SetObjectArrayElement(arr, i, java_cc);
     env->DeleteLocalRef(java_cc);
     env->DeleteLocalRef(desc_str);
+    env->DeleteLocalRef(group_str);
   }
 
   return arr;
diff --git a/android/app/src/main/java/com/github/stenzek/duckstation/EmulationActivity.java b/android/app/src/main/java/com/github/stenzek/duckstation/EmulationActivity.java
index adef26f01..9928abb81 100644
--- a/android/app/src/main/java/com/github/stenzek/duckstation/EmulationActivity.java
+++ b/android/app/src/main/java/com/github/stenzek/duckstation/EmulationActivity.java
@@ -581,7 +581,7 @@ public class EmulationActivity extends AppCompatActivity implements SurfaceHolde
             boolean[] itemsChecked = new boolean[codes.length];
             for (int i = 0; i < codes.length; i++) {
                 final PatchCode cc = codes[i];
-                items[i] = cc.getDescription();
+                items[i] = cc.getDisplayText();
                 itemsChecked[i] = cc.isEnabled();
             }
 
diff --git a/android/app/src/main/java/com/github/stenzek/duckstation/PatchCode.java b/android/app/src/main/java/com/github/stenzek/duckstation/PatchCode.java
index d22157ae1..c8de67096 100644
--- a/android/app/src/main/java/com/github/stenzek/duckstation/PatchCode.java
+++ b/android/app/src/main/java/com/github/stenzek/duckstation/PatchCode.java
@@ -1,12 +1,16 @@
 package com.github.stenzek.duckstation;
 
 public class PatchCode {
+    private static final String UNGROUPED_NAME = "Ungrouped";
+
     private int mIndex;
+    private String mGroup;
     private String mDescription;
     private boolean mEnabled;
 
-    public PatchCode(int index, String description, boolean enabled) {
+    public PatchCode(int index, String group, String description, boolean enabled) {
         mIndex = index;
+        mGroup = group;
         mDescription = description;
         mEnabled = enabled;
     }
@@ -15,6 +19,10 @@ public class PatchCode {
         return mIndex;
     }
 
+    public String getGroup() {
+        return mGroup;
+    }
+
     public String getDescription() {
         return mDescription;
     }
@@ -22,4 +30,11 @@ public class PatchCode {
     public boolean isEnabled() {
         return mEnabled;
     }
+
+    public String getDisplayText() {
+        if (mGroup == null || mGroup.equals(UNGROUPED_NAME))
+          return mDescription;
+        else
+          return String.format("(%s) %s", mGroup, mDescription);
+    }
 }