summaryrefslogtreecommitdiff
path: root/Source/Android/jni/MainAndroid.cpp
diff options
context:
space:
mode:
authorzackhow <zackhow@gmail.com>2018-08-19 17:38:29 -0400
committerzackhow <zackhow@gmail.com>2018-08-23 17:31:17 -0400
commit82f82a6b7d727ff3dcc8b4e5a4d7fc9a214a8596 (patch)
treeba0620e78bd04bd0a74557ac4f43ef81ed9b5f29 /Source/Android/jni/MainAndroid.cpp
parent8e5c3d5b4eff43b9e830831efc91dccf77f00b66 (diff)
Android: Add usage statistics to android.
Added an option in General config to enable/disable usage statistics. Added a popup on first open if the user would like to engage in reporting. Clicking cancel or out of the box opts out. Only clicking 'Ok' will enable reporting. Also added a new android specific values to report.
Diffstat (limited to 'Source/Android/jni/MainAndroid.cpp')
-rw-r--r--Source/Android/jni/MainAndroid.cpp66
1 files changed, 58 insertions, 8 deletions
diff --git a/Source/Android/jni/MainAndroid.cpp b/Source/Android/jni/MainAndroid.cpp
index 69f76bfe3d..c5df6bfa29 100644
--- a/Source/Android/jni/MainAndroid.cpp
+++ b/Source/Android/jni/MainAndroid.cpp
@@ -16,6 +16,7 @@
#include <thread>
#include <utility>
+#include "Common/AndroidAnalytics.h"
#include "Common/CPUDetect.h"
#include "Common/CommonPaths.h"
#include "Common/CommonTypes.h"
@@ -26,6 +27,7 @@
#include "Common/MsgHandler.h"
#include "Common/Version.h"
+#include "Core/Analytics.h"
#include "Core/Boot/Boot.h"
#include "Core/BootManager.h"
#include "Core/ConfigLoaders/GameConfigLoader.h"
@@ -156,6 +158,47 @@ static bool MsgAlert(const char* caption, const char* text, bool yes_no, MsgType
return result != JNI_FALSE;
}
+static void ReportSend(std::string endpoint, std::string report)
+{
+ // Associate the current Thread with the Java VM.
+ JNIEnv* env;
+ IDCache::GetJavaVM()->AttachCurrentThread(&env, nullptr);
+
+ jbyteArray output_array = env->NewByteArray(report.size());
+ jbyte* output = env->GetByteArrayElements(output_array, nullptr);
+ memcpy(output, report.data(), report.size());
+ env->ReleaseByteArrayElements(output_array, output, 0);
+ env->CallStaticVoidMethod(IDCache::GetAnalyticsClass(), IDCache::GetSendAnalyticsReport(),
+ ToJString(env, endpoint), output_array);
+
+ IDCache::GetJavaVM()->DetachCurrentThread();
+}
+
+static std::string GetAnalyticValue(std::string key)
+{
+ // Associate the current Thread with the Java VM.
+ JNIEnv* env;
+ bool attached = false;
+ int getEnvStat =
+ IDCache::GetJavaVM()->GetEnv(reinterpret_cast<void**>(&env), IDCache::JNI_VERSION);
+ if (getEnvStat == JNI_EDETACHED)
+ {
+ IDCache::GetJavaVM()->AttachCurrentThread(&env, nullptr);
+ attached = true;
+ }
+
+ jstring value = reinterpret_cast<jstring>(env->CallStaticObjectMethod(
+ IDCache::GetAnalyticsClass(), IDCache::GetAnalyticsValue(), ToJString(env, key)));
+
+ std::string stdvalue = GetJString(env, value);
+
+ // Only detach the thread if it wasn't already attached
+ if (attached)
+ IDCache::GetJavaVM()->DetachCurrentThread();
+
+ return stdvalue;
+}
+
#ifdef __cplusplus
extern "C" {
#endif
@@ -216,8 +259,8 @@ JNIEXPORT void JNICALL Java_org_dolphinemu_dolphinemu_NativeLibrary_SetProfiling
jboolean enable);
JNIEXPORT void JNICALL
Java_org_dolphinemu_dolphinemu_NativeLibrary_WriteProfileResults(JNIEnv* env, jobject obj);
-JNIEXPORT void JNICALL Java_org_dolphinemu_dolphinemu_NativeLibrary_Run__Ljava_lang_String_2(
- JNIEnv* env, jobject obj, jstring jFile);
+JNIEXPORT void JNICALL Java_org_dolphinemu_dolphinemu_NativeLibrary_Run__Ljava_lang_String_2Z(
+ JNIEnv* env, jobject obj, jstring jFile, jboolean jfirstOpen);
JNIEXPORT void JNICALL
Java_org_dolphinemu_dolphinemu_NativeLibrary_Run__Ljava_lang_String_2Ljava_lang_String_2Z(
JNIEnv* env, jobject obj, jstring jFile, jstring jSavestate, jboolean jDeleteSavestate);
@@ -500,8 +543,8 @@ JNIEXPORT void JNICALL Java_org_dolphinemu_dolphinemu_NativeLibrary_RefreshWiimo
WiimoteReal::Refresh();
}
-static void Run(const std::string& path, std::optional<std::string> savestate_path = {},
- bool delete_savestate = false)
+static void Run(const std::string& path, bool first_open,
+ std::optional<std::string> savestate_path = {}, bool delete_savestate = false)
{
__android_log_print(ANDROID_LOG_INFO, DOLPHIN_TAG, "Running : %s", path.c_str());
@@ -510,10 +553,17 @@ static void Run(const std::string& path, std::optional<std::string> savestate_pa
OSD::AddCallback(OSD::CallbackType::Shutdown, ButtonManager::Shutdown);
RegisterMsgAlertHandler(&MsgAlert);
+ Common::AndroidSetReportHandler(&ReportSend);
+ DolphinAnalytics::AndroidSetGetValFunc(&GetAnalyticValue);
std::unique_lock<std::mutex> guard(s_host_identity_lock);
UICommon::Init();
+ if (first_open)
+ {
+ DolphinAnalytics::Instance()->ReportDolphinStart(GetAnalyticValue("DEVICE_TYPE"));
+ }
+
WiimoteReal::InitAdapterClass();
// No use running the loop when booting fails
@@ -551,17 +601,17 @@ static void Run(const std::string& path, std::optional<std::string> savestate_pa
}
}
-JNIEXPORT void JNICALL Java_org_dolphinemu_dolphinemu_NativeLibrary_Run__Ljava_lang_String_2(
- JNIEnv* env, jobject obj, jstring jFile)
+JNIEXPORT void JNICALL Java_org_dolphinemu_dolphinemu_NativeLibrary_Run__Ljava_lang_String_2Z(
+ JNIEnv* env, jobject obj, jstring jFile, jboolean jfirstOpen)
{
- Run(GetJString(env, jFile));
+ Run(GetJString(env, jFile), jfirstOpen);
}
JNIEXPORT void JNICALL
Java_org_dolphinemu_dolphinemu_NativeLibrary_Run__Ljava_lang_String_2Ljava_lang_String_2Z(
JNIEnv* env, jobject obj, jstring jFile, jstring jSavestate, jboolean jDeleteSavestate)
{
- Run(GetJString(env, jFile), GetJString(env, jSavestate), jDeleteSavestate);
+ Run(GetJString(env, jFile), false, GetJString(env, jSavestate), jDeleteSavestate);
}
JNIEXPORT void JNICALL Java_org_dolphinemu_dolphinemu_NativeLibrary_ChangeDisc(JNIEnv* env,