diff --git a/android/app/src/main/java/com/classicube/MainActivity.java b/android/app/src/main/java/com/classicube/MainActivity.java index 2656cd35d..2bd3fe8a3 100644 --- a/android/app/src/main/java/com/classicube/MainActivity.java +++ b/android/app/src/main/java/com/classicube/MainActivity.java @@ -465,6 +465,23 @@ public class MainActivity extends Activity implements SurfaceHolder.Callback2 { // wait for dialog to be closed // TODO: this fails because multiple dialog boxes show } + + public String shareScreenshot(String path) { + try { + File file = new File(getExternalAppDir() + path); + Intent intent = new Intent(); + + intent.setAction(Intent.ACTION_SEND); + intent.putExtra(Intent.EXTRA_TEXT, "Check out my app."); + intent.putExtra(Intent.EXTRA_STREAM, Uri.fromFile(file)); + intent.setType("image/png"); + intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION); + startActivity(Intent.createChooser(intent, "share via")); + } catch (Exception ex) { + return ex.toString(); + } + return ""; + } // ====================================== // ---------------- HTTP ---------------- diff --git a/src/Game.c b/src/Game.c index 823096309..dfaf84447 100644 --- a/src/Game.c +++ b/src/Game.c @@ -568,8 +568,16 @@ void Game_TakeScreenshot(void) { res = stream.Close(&stream); if (res) { Logger_Warn2(res, "closing", &path); return; } - Chat_Add1("&eTaken screenshot as: %s", &filename); + +#ifdef CC_BUILD_ANDROID + filename.length = 0; + JavaCall_String_String("shareScreenshot", &path, &filename); + if (!filename.length) return; + + Chat_AddRaw("&cError sharing screenshot"); + Chat_Add1(" &c%s", &filename); +#endif #endif } diff --git a/src/Platform.c b/src/Platform.c index b95b78070..a5b19544e 100644 --- a/src/Platform.c +++ b/src/Platform.c @@ -1938,21 +1938,36 @@ void JavaCall_String_Void(const char* name, const String* value) { (*env)->DeleteLocalRef(env, args[0].l); } -void JavaCall_Void_String(const char* name, String* dst) { +static void ReturnString(JNIEnv* env, jobject obj, String* dst) { const jchar* src; jsize len; + if (!obj) return; + + src = (*env)->GetStringChars(env, obj, NULL); + len = (*env)->GetStringLength(env, obj); + String_AppendUtf16(dst, src, len * 2); + (*env)->ReleaseStringChars(env, obj, src); + (*env)->DeleteLocalRef(env, obj); +} + +void JavaCall_Void_String(const char* name, String* dst) { JNIEnv* env; jobject obj; JavaGetCurrentEnv(env); obj = JavaCallObject(env, name, "()Ljava/lang/String;", NULL); - if (!obj) return; + ReturnString(env, obj, dst); +} - src = (*env)->GetStringChars(env, obj, NULL); - len = (*env)->GetStringLength(env, obj); - String_AppendUtf16(dst, src, len * 2); +void JavaCall_String_String(const char* name, const String* arg, String* dst) { + JNIEnv* env; + jobject obj; + jvalue args[1]; + JavaGetCurrentEnv(env); - (*env)->ReleaseStringChars(env, obj, src); - (*env)->DeleteLocalRef(env, obj); + args[0].l = JavaMakeString(env, arg); + obj = JavaCallObject(env, name, "(Ljava/lang/String;)Ljava/lang/String;", args); + ReturnString(env, obj, dst); + (*env)->DeleteLocalRef(env, args[0].l); } #endif diff --git a/src/Platform.h b/src/Platform.h index c7ea39456..29d8544d4 100644 --- a/src/Platform.h +++ b/src/Platform.h @@ -258,5 +258,7 @@ jobject JavaCallObject(JNIEnv* env, const char* name, const char* sig, jvalue* a void JavaCall_String_Void(const char* name, const String* value); /* Calls a method in the activity class that takes no arguments and returns a string. */ void JavaCall_Void_String(const char* name, String* dst); +/* Calls a method in the activity class that takes a string and returns a string. */ +void JavaCall_String_String(const char* name, const String* arg, String* dst); #endif #endif