diff --git a/xwords4/android/app/src/main/java/org/eehouse/android/xw4/GamesListDelegate.kt b/xwords4/android/app/src/main/java/org/eehouse/android/xw4/GamesListDelegate.kt index cbee040da..9f71a56a6 100644 --- a/xwords4/android/app/src/main/java/org/eehouse/android/xw4/GamesListDelegate.kt +++ b/xwords4/android/app/src/main/java/org/eehouse/android/xw4/GamesListDelegate.kt @@ -1761,8 +1761,14 @@ class GamesListDelegate(delegator: Delegator) : R.id.games_menu_emailLogs -> Perms23.tryGetPerms( this, Perm.STORAGE, null, - DlgDelegate.Action.WRITE_LOG_DB - ) + DlgDelegate.Action.WRITE_LOG_DB) + + R.id.games_menu_statsShow -> { + val stats = XwJNI.sts_export().toString() + makeOkOnlyBuilder(stats) + .show() + } + R.id.games_menu_statsClear -> XwJNI.sts_clearAll() else -> handled = (handleSelGamesItem(itemID, selRowIDs) || handleSelGroupsItem(itemID, selGroupIDs)) @@ -2935,6 +2941,7 @@ class GamesListDelegate(delegator: Delegator) : private val DEBUG_ITEMS = intArrayOf( R.id.games_menu_writegit, R.id.games_submenu_logs, + R.id.games_submenu_stats, R.id.games_submenu_mqtt, R.id.games_menu_restart, ) diff --git a/xwords4/android/app/src/main/java/org/eehouse/android/xw4/jni/XwJNI.kt b/xwords4/android/app/src/main/java/org/eehouse/android/xw4/jni/XwJNI.kt index 960d7c481..1b2ac5d70 100644 --- a/xwords4/android/app/src/main/java/org/eehouse/android/xw4/jni/XwJNI.kt +++ b/xwords4/android/app/src/main/java/org/eehouse/android/xw4/jni/XwJNI.kt @@ -20,6 +20,7 @@ package org.eehouse.android.xw4.jni import java.io.Serializable +import org.json.JSONObject import org.eehouse.android.xw4.Assert import org.eehouse.android.xw4.BuildConfig @@ -884,6 +885,14 @@ class XwJNI private constructor() { return smsproto_prepInbound(jNI.m_ptrGlobals, data, fromPhone, wantPort) } + fun sts_export(): JSONObject { + val str = sts_export(jNI.m_ptrGlobals) + return JSONObject(str) + } + + @JvmStatic + fun sts_clearAll() { sts_clearAll(jNI.m_ptrGlobals) } + @JvmStatic external fun dict_tilesAreSame(dict1: Long, dict2: Long): Boolean @JvmStatic @@ -1127,6 +1136,11 @@ class XwJNI private constructor() { wantPort: Int ): Array? + @JvmStatic + private external fun sts_export(jniState: Long): String? + @JvmStatic + private external fun sts_clearAll(jniState: Long) + // This always returns true on release builds now. @JvmStatic private external fun haveEnv(jniState: Long): Boolean diff --git a/xwords4/android/app/src/main/res/menu/games_list_menu.xml b/xwords4/android/app/src/main/res/menu/games_list_menu.xml index 6f09de27e..4df065b8c 100644 --- a/xwords4/android/app/src/main/res/menu/games_list_menu.xml +++ b/xwords4/android/app/src/main/res/menu/games_list_menu.xml @@ -158,6 +158,20 @@ + + + + + + + + diff --git a/xwords4/android/app/src/main/res/values/tmpstrings.xml b/xwords4/android/app/src/main/res/values/tmpstrings.xml index 1bfdb4ff8..f9d5ab0f2 100644 --- a/xwords4/android/app/src/main/res/values/tmpstrings.xml +++ b/xwords4/android/app/src/main/res/values/tmpstrings.xml @@ -40,4 +40,9 @@ someone. I have %1$d games using mqtt. + + Stats + Show + Clear + diff --git a/xwords4/android/jni/xwjni.c b/xwords4/android/jni/xwjni.c index 3c2ad37f8..5e48bc3f7 100644 --- a/xwords4/android/jni/xwjni.c +++ b/xwords4/android/jni/xwjni.c @@ -46,6 +46,9 @@ #include "andglobals.h" #include "jniutlswrapper.h" #include "paths.h" +#include "stats.h" + +#include "cJSON.h" #ifdef MAP_THREAD_TO_ENV # define LOG_MAPPING @@ -1218,6 +1221,34 @@ Java_org_eehouse_android_xw4_jni_XwJNI_dict_1getDesc return result; } +JNIEXPORT jstring JNICALL +Java_org_eehouse_android_xw4_jni_XwJNI_sts_1export +( JNIEnv* env, jclass C, jlong jniGlobalPtr ) +{ + jstring result = NULL; + DVC_HEADER(jniGlobalPtr); + cJSON* stats = sts_export( globalState->dutil, env ); + + char* replyStr = cJSON_PrintUnformatted( stats ); + result = (*env)->NewStringUTF( env, replyStr ); + free( replyStr ); + cJSON_Delete( stats ); + + DVC_HEADER_END(); + return result; +} + +JNIEXPORT jstring JNICALL +Java_org_eehouse_android_xw4_jni_XwJNI_sts_1clearAll +( JNIEnv* env, jclass C, jlong jniGlobalPtr ) +{ + jstring result = NULL; + DVC_HEADER(jniGlobalPtr); + sts_clearAll( globalState->dutil, env ); + DVC_HEADER_END(); + return result; +} + /* Dictionary methods: don't use gamePtr */ JNIEXPORT jboolean JNICALL Java_org_eehouse_android_xw4_jni_XwJNI_dict_1tilesAreSame diff --git a/xwords4/common/stats.c b/xwords4/common/stats.c index 853427838..85b1b705f 100644 --- a/xwords4/common/stats.c +++ b/xwords4/common/stats.c @@ -62,6 +62,9 @@ sts_increment( XW_DUtilCtxt* dutil, XWEnv xwe, STAT stat ) } ++ss->statsVals[stat]; END_WITH_MUTEX(); + + XP_LOGFF( "bad: storing after every change" ); + storeCounts( dutil, xwe ); } }