1
0
Fork 0
mirror of https://github.com/juce-framework/JUCE.git synced 2026-01-10 23:44:24 +00:00

Android: move a bunch of generic Android and Java classes to JNI helpers, add Android/Java prefixes to disambiguate.

This commit is contained in:
Lukasz Kozakiewicz 2017-11-08 18:29:12 +01:00
parent eac4f9112f
commit 5d30fcd9b5
9 changed files with 328 additions and 353 deletions

View file

@ -44,7 +44,7 @@ private:
{
auto* env = getEnv();
auto methodName = juceString ((jstring) env->CallObjectMethod (method, Method.getName));
auto methodName = juceString ((jstring) env->CallObjectMethod (method, JavaMethod.getName));
if (methodName == "onMediaScannerConnected")
{

View file

@ -330,76 +330,16 @@ DECLARE_JNI_CLASS (JuceAppActivity, JUCE_ANDROID_ACTIVITY_CLASSPATH);
//==============================================================================
#define JNI_CLASS_MEMBERS(METHOD, STATICMETHOD, FIELD, STATICFIELD) \
METHOD (constructor, "<init>", "(I)V") \
METHOD (setColor, "setColor", "(I)V") \
METHOD (setAlpha, "setAlpha", "(I)V") \
METHOD (setTypeface, "setTypeface", "(Landroid/graphics/Typeface;)Landroid/graphics/Typeface;") \
METHOD (ascent, "ascent", "()F") \
METHOD (descent, "descent", "()F") \
METHOD (setTextSize, "setTextSize", "(F)V") \
METHOD (getTextWidths, "getTextWidths", "(Ljava/lang/String;[F)I") \
METHOD (setTextScaleX, "setTextScaleX", "(F)V") \
METHOD (getTextPath, "getTextPath", "(Ljava/lang/String;IIFFLandroid/graphics/Path;)V") \
METHOD (setShader, "setShader", "(Landroid/graphics/Shader;)Landroid/graphics/Shader;") \
STATICMETHOD (createBitmap, "createBitmap", "(IILandroid/graphics/Bitmap$Config;)Landroid/graphics/Bitmap;") \
METHOD (setPixel, "setPixel", "(III)V")
DECLARE_JNI_CLASS (Paint, "android/graphics/Paint");
#undef JNI_CLASS_MEMBERS
//==============================================================================
#define JNI_CLASS_MEMBERS(METHOD, STATICMETHOD, FIELD, STATICFIELD) \
METHOD (constructor, "<init>", "()V") \
METHOD (setValues, "setValues", "([F)V") \
DECLARE_JNI_CLASS (Matrix, "android/graphics/Matrix");
#undef JNI_CLASS_MEMBERS
//==============================================================================
#define JNI_CLASS_MEMBERS(METHOD, STATICMETHOD, FIELD, STATICFIELD) \
METHOD (constructor, "<init>", "(IIII)V") \
FIELD (left, "left", "I") \
FIELD (right, "right", "I") \
FIELD (top, "top", "I") \
FIELD (bottom, "bottom", "I") \
DECLARE_JNI_CLASS (RectClass, "android/graphics/Rect");
#undef JNI_CLASS_MEMBERS
//==============================================================================
#define JNI_CLASS_MEMBERS(METHOD, STATICMETHOD, FIELD, STATICFIELD) \
METHOD (getName, "getName", "()Ljava/lang/String;") \
METHOD (getModifiers, "getModifiers", "()I") \
METHOD (getParameterTypes, "getParameterTypes", "()[Ljava/lang/Class;") \
METHOD (getReturnType, "getReturnType", "()Ljava/lang/Class;") \
METHOD (invoke, "invoke", "(Ljava/lang/Object;[Ljava/lang/Object;)Ljava/lang/Object;") \
METHOD (hashCode, "hashCode", "()I") \
METHOD (equals, "equals", "(Ljava/lang/Object;)Z") \
DECLARE_JNI_CLASS (Method, "java/lang/reflect/Method");
DECLARE_JNI_CLASS (AndroidBitmap, "android/graphics/Bitmap");
#undef JNI_CLASS_MEMBERS
#define JNI_CLASS_MEMBERS(METHOD, STATICMETHOD, FIELD, STATICFIELD) \
METHOD (getName, "getName", "()Ljava/lang/String;") \
METHOD (getModifiers, "getModifiers", "()I") \
METHOD (isAnnotation, "isAnnotation", "()Z") \
METHOD (isAnonymousClass, "isAnonymousClass", "()Z") \
METHOD (isArray, "isArray", "()Z") \
METHOD (isEnum, "isEnum", "()Z") \
METHOD (isInterface, "isInterface", "()Z") \
METHOD (isLocalClass, "isLocalClass", "()Z") \
METHOD (isMemberClass, "isMemberClass", "()Z") \
METHOD (isPrimitive, "isPrimitive", "()Z") \
METHOD (isSynthetic, "isSynthetic", "()Z") \
METHOD (getComponentType, "getComponentType", "()Ljava/lang/Class;") \
METHOD (getSuperclass, "getSuperclass", "()Ljava/lang/Class;") \
METHOD (getClassLoader, "getClassLoader", "()Ljava/lang/ClassLoader;") \
STATICMETHOD (valueOf, "valueOf", "(Ljava/lang/String;)Landroid/graphics/Bitmap$Config;")
DECLARE_JNI_CLASS (JavaClass, "java/lang/Class");
#undef JNI_CLASS_MEMBERS
#define JNI_CLASS_MEMBERS(METHOD, STATICMETHOD, FIELD, STATICFIELD) \
METHOD (constructor, "<init>", "()V") \
DECLARE_JNI_CLASS (JavaObject, "java/lang/Object");
DECLARE_JNI_CLASS (AndroidBitmapConfig, "android/graphics/Bitmap$Config");
#undef JNI_CLASS_MEMBERS
#define JNI_CLASS_MEMBERS(METHOD, STATICMETHOD, FIELD, STATICFIELD) \
@ -418,7 +358,60 @@ DECLARE_JNI_CLASS (JavaObject, "java/lang/Object");
METHOD (setPackage, "setPackage", "(Ljava/lang/String;)Landroid/content/Intent;") \
METHOD (setType, "setType", "(Ljava/lang/String;)Landroid/content/Intent;") \
DECLARE_JNI_CLASS (Intent, "android/content/Intent");
DECLARE_JNI_CLASS (AndroidIntent, "android/content/Intent");
#undef JNI_CLASS_MEMBERS
#define JNI_CLASS_MEMBERS(METHOD, STATICMETHOD, FIELD, STATICFIELD) \
METHOD (constructor, "<init>", "()V") \
METHOD (setValues, "setValues", "([F)V") \
DECLARE_JNI_CLASS (AndroidMatrix, "android/graphics/Matrix");
#undef JNI_CLASS_MEMBERS
#define JNI_CLASS_MEMBERS(METHOD, STATICMETHOD, FIELD, STATICFIELD) \
METHOD (constructor, "<init>", "(I)V") \
METHOD (setColor, "setColor", "(I)V") \
METHOD (setAlpha, "setAlpha", "(I)V") \
METHOD (setTypeface, "setTypeface", "(Landroid/graphics/Typeface;)Landroid/graphics/Typeface;") \
METHOD (ascent, "ascent", "()F") \
METHOD (descent, "descent", "()F") \
METHOD (setTextSize, "setTextSize", "(F)V") \
METHOD (getTextWidths, "getTextWidths", "(Ljava/lang/String;[F)I") \
METHOD (setTextScaleX, "setTextScaleX", "(F)V") \
METHOD (getTextPath, "getTextPath", "(Ljava/lang/String;IIFFLandroid/graphics/Path;)V") \
METHOD (setShader, "setShader", "(Landroid/graphics/Shader;)Landroid/graphics/Shader;") \
DECLARE_JNI_CLASS (AndroidPaint, "android/graphics/Paint");
#undef JNI_CLASS_MEMBERS
#define JNI_CLASS_MEMBERS(METHOD, STATICMETHOD, FIELD, STATICFIELD) \
STATICMETHOD (getActivity, "getActivity", "(Landroid/content/Context;ILandroid/content/Intent;I)Landroid/app/PendingIntent;") \
METHOD (getIntentSender, "getIntentSender", "()Landroid/content/IntentSender;")
DECLARE_JNI_CLASS (AndroidPendingIntent, "android/app/PendingIntent");
#undef JNI_CLASS_MEMBERS
#define JNI_CLASS_MEMBERS(METHOD, STATICMETHOD, FIELD, STATICFIELD) \
METHOD (constructor, "<init>", "(IIII)V") \
FIELD (left, "left", "I") \
FIELD (right, "right", "I") \
FIELD (top, "top", "I") \
FIELD (bottom, "bottom", "I") \
DECLARE_JNI_CLASS (AndroidRectClass, "android/graphics/Rect");
#undef JNI_CLASS_MEMBERS
#define JNI_CLASS_MEMBERS(METHOD, STATICMETHOD, FIELD, STATICFIELD) \
METHOD (getIdentifier, "getIdentifier", "(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)I")
DECLARE_JNI_CLASS (AndroidResources, "android/content/res/Resources")
#undef JNI_CLASS_MEMBERS
#define JNI_CLASS_MEMBERS(METHOD, STATICMETHOD, FIELD, STATICFIELD) \
STATICMETHOD (parse, "parse", "(Ljava/lang/String;)Landroid/net/Uri;") \
METHOD (toString, "toString", "()Ljava/lang/String;")
DECLARE_JNI_CLASS (AndroidUri, "android/net/Uri");
#undef JNI_CLASS_MEMBERS
#define JNI_CLASS_MEMBERS(METHOD, STATICMETHOD, FIELD, STATICFIELD) \
@ -445,12 +438,87 @@ DECLARE_JNI_CLASS (AndroidView, "android/view/View");
DECLARE_JNI_CLASS (AndroidViewGroup, "android/view/ViewGroup")
#undef JNI_CLASS_MEMBERS
//==============================================================================
#define JNI_CLASS_MEMBERS(METHOD, STATICMETHOD, FIELD, STATICFIELD) \
METHOD (constructor, "<init>", "(I)V") \
METHOD (add, "add", "(Ljava/lang/Object;)Z") \
METHOD (iterator, "iterator", "()Ljava/util/Iterator;") \
METHOD (get, "get", "(I)Ljava/lang/Object;") \
METHOD (size, "size", "()I")
DECLARE_JNI_CLASS (JavaArrayList, "java/util/ArrayList");
#undef JNI_CLASS_MEMBERS
#define JNI_CLASS_MEMBERS(METHOD, STATICMETHOD, FIELD, STATICFIELD) \
METHOD (constructor, "<init>", "()V") \
METHOD (containsKey, "containsKey", "(Ljava/lang/String;)Z") \
METHOD (get, "get", "(Ljava/lang/String;)Ljava/lang/Object;") \
METHOD (getBoolean, "getBoolean", "(Ljava/lang/String;)Z") \
METHOD (getBundle, "getBundle", "(Ljava/lang/String;)Landroid/os/Bundle;") \
METHOD (getCharSequence, "getCharSequence", "(Ljava/lang/String;)Ljava/lang/CharSequence;") \
METHOD (getInt, "getInt", "(Ljava/lang/String;)I") \
METHOD (getLong, "getLong", "(Ljava/lang/String;)J") \
METHOD (getLongArray, "getLongArray", "(Ljava/lang/String;)[J") \
METHOD (getParcelable, "getParcelable", "(Ljava/lang/String;)Landroid/os/Parcelable;") \
METHOD (getString, "getString", "(Ljava/lang/String;)Ljava/lang/String;") \
METHOD (getStringArrayList, "getStringArrayList", "(Ljava/lang/String;)Ljava/util/ArrayList;") \
METHOD (keySet, "keySet", "()Ljava/util/Set;") \
METHOD (putBoolean, "putBoolean", "(Ljava/lang/String;Z)V") \
METHOD (putBundle, "putBundle", "(Ljava/lang/String;Landroid/os/Bundle;)V") \
METHOD (putInt, "putInt", "(Ljava/lang/String;I)V") \
METHOD (putLong, "putLong", "(Ljava/lang/String;J)V") \
METHOD (putLongArray, "putLongArray", "(Ljava/lang/String;[J)V") \
METHOD (putString, "putString", "(Ljava/lang/String;Ljava/lang/String;)V") \
METHOD (putStringArrayList, "putStringArrayList", "(Ljava/lang/String;Ljava/util/ArrayList;)V")
DECLARE_JNI_CLASS (JavaBundle, "android/os/Bundle");
#undef JNI_CLASS_MEMBERS
#define JNI_CLASS_MEMBERS(METHOD, STATICMETHOD, FIELD, STATICFIELD) \
METHOD (toString, "toString", "()Ljava/lang/String;")
DECLARE_JNI_CLASS (JavaCharSequence, "java/lang/CharSequence");
#undef JNI_CLASS_MEMBERS
#define JNI_CLASS_MEMBERS(METHOD, STATICMETHOD, FIELD, STATICFIELD) \
METHOD (getName, "getName", "()Ljava/lang/String;") \
METHOD (getModifiers, "getModifiers", "()I") \
METHOD (isAnnotation, "isAnnotation", "()Z") \
METHOD (isAnonymousClass, "isAnonymousClass", "()Z") \
METHOD (isArray, "isArray", "()Z") \
METHOD (isEnum, "isEnum", "()Z") \
METHOD (isInterface, "isInterface", "()Z") \
METHOD (isLocalClass, "isLocalClass", "()Z") \
METHOD (isMemberClass, "isMemberClass", "()Z") \
METHOD (isPrimitive, "isPrimitive", "()Z") \
METHOD (isSynthetic, "isSynthetic", "()Z") \
METHOD (getComponentType, "getComponentType", "()Ljava/lang/Class;") \
METHOD (getSuperclass, "getSuperclass", "()Ljava/lang/Class;") \
METHOD (getClassLoader, "getClassLoader", "()Ljava/lang/ClassLoader;") \
DECLARE_JNI_CLASS (JavaClass, "java/lang/Class");
#undef JNI_CLASS_MEMBERS
#define JNI_CLASS_MEMBERS(METHOD, STATICMETHOD, FIELD, STATICFIELD) \
METHOD (constructor, "<init>", "()V") \
METHOD (constructorWithCapacity, "<init>", "(I)V")
DECLARE_JNI_CLASS (JavaHashMap, "java/util/HashMap");
#undef JNI_CLASS_MEMBERS
#define JNI_CLASS_MEMBERS(METHOD, STATICMETHOD, FIELD, STATICFIELD) \
STATICMETHOD (valueOf, "valueOf", "(I)Ljava/lang/Integer;")
DECLARE_JNI_CLASS (JavaInteger, "java/lang/Integer");
#undef JNI_CLASS_MEMBERS
#define JNI_CLASS_MEMBERS(METHOD, STATICMETHOD, FIELD, STATICFIELD) \
METHOD (hasNext, "hasNext", "()Z") \
METHOD (next, "next", "()Ljava/lang/Object;")
DECLARE_JNI_CLASS (JavaIterator, "java/util/Iterator");
#undef JNI_CLASS_MEMBERS
#define JNI_CLASS_MEMBERS(METHOD, STATICMETHOD, FIELD, STATICFIELD) \
METHOD (get, "get", "(Ljava/lang/Object;)Ljava/lang/Object;") \
METHOD (keySet, "keySet", "()Ljava/util/Set;") \
@ -460,10 +528,32 @@ DECLARE_JNI_CLASS (JavaMap, "java/util/Map");
#undef JNI_CLASS_MEMBERS
#define JNI_CLASS_MEMBERS(METHOD, STATICMETHOD, FIELD, STATICFIELD) \
METHOD (constructor, "<init>", "()V") \
METHOD (constructorWithCapacity, "<init>", "(I)V")
METHOD (getName, "getName", "()Ljava/lang/String;") \
METHOD (getModifiers, "getModifiers", "()I") \
METHOD (getParameterTypes, "getParameterTypes", "()[Ljava/lang/Class;") \
METHOD (getReturnType, "getReturnType", "()Ljava/lang/Class;") \
METHOD (invoke, "invoke", "(Ljava/lang/Object;[Ljava/lang/Object;)Ljava/lang/Object;") \
METHOD (hashCode, "hashCode", "()I") \
METHOD (equals, "equals", "(Ljava/lang/Object;)Z") \
DECLARE_JNI_CLASS (JavaHashMap, "java/util/HashMap");
DECLARE_JNI_CLASS (JavaMethod, "java/lang/reflect/Method");
#undef JNI_CLASS_MEMBERS
#define JNI_CLASS_MEMBERS(METHOD, STATICMETHOD, FIELD, STATICFIELD) \
METHOD (constructor, "<init>", "()V") \
METHOD (getClass, "getClass", "()Ljava/lang/Class;") \
METHOD (toString, "toString", "()Ljava/lang/String;")
DECLARE_JNI_CLASS (JavaObject, "java/lang/Object");
#undef JNI_CLASS_MEMBERS
#define JNI_CLASS_MEMBERS(METHOD, STATICMETHOD, FIELD, STATICFIELD) \
METHOD (contains, "contains", "(Ljava/lang/Object;)Z") \
METHOD (iterator, "iterator", "()Ljava/util/Iterator;") \
METHOD (size, "size", "()I")
DECLARE_JNI_CLASS (JavaSet, "java/util/Set");
#undef JNI_CLASS_MEMBERS
#define JNI_CLASS_MEMBERS(METHOD, STATICMETHOD, FIELD, STATICFIELD) \

View file

@ -159,7 +159,7 @@ LocalRef<jobject> CreateJavaInterface (AndroidInterfaceImplementer* implementer,
jobject AndroidInterfaceImplementer::invoke (jobject /*proxy*/, jobject method, jobjectArray args)
{
auto* env = getEnv();
return env->CallObjectMethod (method, Method.invoke, javaSubClass.get(), args);
return env->CallObjectMethod (method, JavaMethod.invoke, javaSubClass.get(), args);
}
jobject juce_invokeImplementer (JNIEnv* env, jlong thisPtr, jobject proxy, jobject method, jobjectArray args)

View file

@ -43,7 +43,7 @@ namespace Android
jobject invoke (jobject proxy, jobject method, jobjectArray args) override
{
auto* env = getEnv();
auto methodName = juce::juceString ((jstring) env->CallObjectMethod (method, Method.getName));
auto methodName = juce::juceString ((jstring) env->CallObjectMethod (method, JavaMethod.getName));
if (methodName == "run")
{

View file

@ -184,15 +184,15 @@ public:
void initialise (JNIEnv* const env)
{
rect = GlobalRef (env->NewObject (RectClass, RectClass.constructor, 0, 0, 0, 0));
rect = GlobalRef (env->NewObject (AndroidRectClass, AndroidRectClass.constructor, 0, 0, 0, 0));
paint = GlobalRef (GraphicsHelpers::createPaint (Graphics::highResamplingQuality));
const LocalRef<jobject> ignored (paint.callObjectMethod (Paint.setTypeface, typeface.get()));
const LocalRef<jobject> ignored (paint.callObjectMethod (AndroidPaint.setTypeface, typeface.get()));
paint.callVoidMethod (Paint.setTextSize, referenceFontSize);
paint.callVoidMethod (AndroidPaint.setTextSize, referenceFontSize);
const float fullAscent = std::abs (paint.callFloatMethod (Paint.ascent));
const float fullDescent = paint.callFloatMethod (Paint.descent);
const float fullAscent = std::abs (paint.callFloatMethod (AndroidPaint.ascent));
const float fullDescent = paint.callFloatMethod (AndroidPaint.descent);
const float totalHeight = fullAscent + fullDescent;
ascent = fullAscent / totalHeight;
@ -210,7 +210,7 @@ public:
const int numChars = text.length();
jfloatArray widths = env->NewFloatArray (numChars);
const int numDone = paint.callIntMethod (Paint.getTextWidths, javaString (text).get(), widths);
const int numDone = paint.callIntMethod (AndroidPaint.getTextWidths, javaString (text).get(), widths);
HeapBlock<jfloat> localWidths (static_cast<size_t> (numDone));
env->GetFloatArrayRegion (widths, 0, numDone, localWidths);
@ -229,7 +229,7 @@ public:
const int numChars = text.length();
jfloatArray widths = env->NewFloatArray (numChars);
const int numDone = paint.callIntMethod (Paint.getTextWidths, javaString (text).get(), widths);
const int numDone = paint.callIntMethod (AndroidPaint.getTextWidths, javaString (text).get(), widths);
HeapBlock<jfloat> localWidths (static_cast<size_t> (numDone));
env->GetFloatArrayRegion (widths, 0, numDone, localWidths);
@ -306,10 +306,10 @@ public:
env->DeleteLocalRef (matrix);
const int left = env->GetIntField (rect.get(), RectClass.left);
const int top = env->GetIntField (rect.get(), RectClass.top);
const int right = env->GetIntField (rect.get(), RectClass.right);
const int bottom = env->GetIntField (rect.get(), RectClass.bottom);
const int left = env->GetIntField (rect.get(), AndroidRectClass.left);
const int top = env->GetIntField (rect.get(), AndroidRectClass.top);
const int right = env->GetIntField (rect.get(), AndroidRectClass.right);
const int bottom = env->GetIntField (rect.get(), AndroidRectClass.bottom);
const Rectangle<int> bounds (left, top, right - left, bottom - top);

View file

@ -38,12 +38,12 @@ namespace GraphicsHelpers
if (quality > Graphics::lowResamplingQuality)
constructorFlags |= 2; /*FILTER_BITMAP_FLAG*/
return getEnv()->NewObject (Paint, Paint.constructor, constructorFlags);
return getEnv()->NewObject (AndroidPaint, AndroidPaint.constructor, constructorFlags);
}
const jobject createMatrix (JNIEnv* env, const AffineTransform& t)
{
jobject m = env->NewObject (Matrix, Matrix.constructor);
jobject m = env->NewObject (AndroidMatrix, AndroidMatrix.constructor);
jfloat values[9] = { t.mat00, t.mat01, t.mat02,
t.mat10, t.mat11, t.mat12,
@ -52,7 +52,7 @@ namespace GraphicsHelpers
jfloatArray javaArray = env->NewFloatArray (9);
env->SetFloatArrayRegion (javaArray, 0, 9, values);
env->CallVoidMethod (m, Matrix.setValues, javaArray);
env->CallVoidMethod (m, AndroidMatrix.setValues, javaArray);
env->DeleteLocalRef (javaArray);
return m;

View file

@ -587,10 +587,10 @@ public:
void handlePaintCallback (JNIEnv* env, jobject canvas, jobject paint)
{
jobject rect = env->CallObjectMethod (canvas, CanvasMinimal.getClipBounds);
const int left = env->GetIntField (rect, RectClass.left);
const int top = env->GetIntField (rect, RectClass.top);
const int right = env->GetIntField (rect, RectClass.right);
const int bottom = env->GetIntField (rect, RectClass.bottom);
const int left = env->GetIntField (rect, AndroidRectClass.left);
const int top = env->GetIntField (rect, AndroidRectClass.top);
const int right = env->GetIntField (rect, AndroidRectClass.right);
const int bottom = env->GetIntField (rect, AndroidRectClass.bottom);
env->DeleteLocalRef (rect);
const Rectangle<int> clip (left, top, right - left, bottom - top);
@ -876,9 +876,9 @@ JUCE_API void JUCE_CALLTYPE Process::hide()
{
auto* env = getEnv();
GlobalRef intent (env->NewObject (Intent, Intent.constructor));
env->CallObjectMethod (intent, Intent.setAction, javaString ("android.intent.action.MAIN") .get());
env->CallObjectMethod (intent, Intent.addCategory, javaString ("android.intent.category.HOME").get());
GlobalRef intent (env->NewObject (AndroidIntent, AndroidIntent.constructor));
env->CallObjectMethod (intent, AndroidIntent.setAction, javaString ("android.intent.action.MAIN") .get());
env->CallObjectMethod (intent, AndroidIntent.addCategory, javaString ("android.intent.category.HOME").get());
android.activity.callVoidMethod (JuceAppActivity.startActivity, intent.get());
}

View file

@ -38,48 +38,6 @@ DECLARE_JNI_CLASS (AudioAttributesBuilder, "android/media/AudioAttributes$Builde
#undef JNI_CLASS_MEMBERS
#endif
#define JNI_CLASS_MEMBERS(METHOD, STATICMETHOD, FIELD, STATICFIELD) \
STATICMETHOD (createBitmap, "createBitmap", "(IILandroid/graphics/Bitmap$Config;)Landroid/graphics/Bitmap;") \
METHOD (setPixel, "setPixel", "(III)V")
DECLARE_JNI_CLASS (Bitmap, "android/graphics/Bitmap");
#undef JNI_CLASS_MEMBERS
#define JNI_CLASS_MEMBERS(METHOD, STATICMETHOD, FIELD, STATICFIELD) \
STATICMETHOD (valueOf, "valueOf", "(Ljava/lang/String;)Landroid/graphics/Bitmap$Config;")
DECLARE_JNI_CLASS (BitmapConfig, "android/graphics/Bitmap$Config");
#undef JNI_CLASS_MEMBERS
#define JNI_CLASS_MEMBERS(METHOD, STATICMETHOD, FIELD, STATICFIELD) \
METHOD (constructor, "<init>", "()V") \
METHOD (containsKey, "containsKey", "(Ljava/lang/String;)Z") \
METHOD (get, "get", "(Ljava/lang/String;)Ljava/lang/Object;") \
METHOD (getBoolean, "getBoolean", "(Ljava/lang/String;)Z") \
METHOD (getBundle, "getBundle", "(Ljava/lang/String;)Landroid/os/Bundle;") \
METHOD (getCharSequence, "getCharSequence", "(Ljava/lang/String;)Ljava/lang/CharSequence;") \
METHOD (getInt, "getInt", "(Ljava/lang/String;)I") \
METHOD (getLong, "getLong", "(Ljava/lang/String;)J") \
METHOD (getLongArray, "getLongArray", "(Ljava/lang/String;)[J") \
METHOD (getString, "getString", "(Ljava/lang/String;)Ljava/lang/String;") \
METHOD (keySet, "keySet", "()Ljava/util/Set;") \
METHOD (putBoolean, "putBoolean", "(Ljava/lang/String;Z)V") \
METHOD (putBundle, "putBundle", "(Ljava/lang/String;Landroid/os/Bundle;)V") \
METHOD (putInt, "putInt", "(Ljava/lang/String;I)V") \
METHOD (putLong, "putLong", "(Ljava/lang/String;J)V") \
METHOD (putLongArray, "putLongArray", "(Ljava/lang/String;[J)V") \
METHOD (putString, "putString", "(Ljava/lang/String;Ljava/lang/String;)V")
DECLARE_JNI_CLASS (Bundle, "android/os/Bundle");
#undef JNI_CLASS_MEMBERS
#define JNI_CLASS_MEMBERS(METHOD, STATICMETHOD, FIELD, STATICFIELD) \
METHOD (hasNext, "hasNext", "()Z") \
METHOD (next, "next", "()Ljava/lang/Object;")
DECLARE_JNI_CLASS (Iterator, "java/util/Iterator");
#undef JNI_CLASS_MEMBERS
#if __ANDROID_API__ >= 26
#define JNI_CLASS_MEMBERS(METHOD, STATICMETHOD, FIELD, STATICFIELD) \
METHOD (constructor, "<init>", "(Ljava/lang/String;Ljava/lang/CharSequence;I)V") \
@ -244,19 +202,6 @@ DECLARE_JNI_CLASS (NotificationManagerApi26, "android/app/NotificationManager");
#undef JNI_CLASS_MEMBERS
#endif
#define JNI_CLASS_MEMBERS(METHOD, STATICMETHOD, FIELD, STATICFIELD) \
METHOD (getClass, "getClass", "()Ljava/lang/Class;") \
METHOD (toString, "toString", "()Ljava/lang/String;")
DECLARE_JNI_CLASS (Object, "java/lang/Object");
#undef JNI_CLASS_MEMBERS
#define JNI_CLASS_MEMBERS(METHOD, STATICMETHOD, FIELD, STATICFIELD) \
STATICMETHOD (getActivity, "getActivity", "(Landroid/content/Context;ILandroid/content/Intent;I)Landroid/app/PendingIntent;")
DECLARE_JNI_CLASS (PendingIntent, "android/app/PendingIntent");
#undef JNI_CLASS_MEMBERS
#if __ANDROID_API__ >= 20
#define JNI_CLASS_MEMBERS(METHOD, STATICMETHOD, FIELD, STATICFIELD) \
STATICMETHOD (getResultsFromIntent, "getResultsFromIntent", "(Landroid/content/Intent;)Landroid/os/Bundle;")
@ -275,20 +220,6 @@ DECLARE_JNI_CLASS (RemoteInputBuilder, "android/app/RemoteInput$Builder");
#undef JNI_CLASS_MEMBERS
#endif
#define JNI_CLASS_MEMBERS(METHOD, STATICMETHOD, FIELD, STATICFIELD) \
METHOD (getIdentifier, "getIdentifier", "(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)I")
DECLARE_JNI_CLASS (Resources, "android/content/res/Resources")
#undef JNI_CLASS_MEMBERS
#define JNI_CLASS_MEMBERS(METHOD, STATICMETHOD, FIELD, STATICFIELD) \
METHOD (contains, "contains", "(Ljava/lang/Object;)Z") \
METHOD (iterator, "iterator", "()Ljava/util/Iterator;") \
METHOD (size, "size", "()I")
DECLARE_JNI_CLASS (Set, "java/util/Set");
#undef JNI_CLASS_MEMBERS
#if __ANDROID_API__ >= 23
#define JNI_CLASS_MEMBERS(METHOD, STATICMETHOD, FIELD, STATICFIELD) \
METHOD (getNotification, "getNotification", "()Landroid/app/Notification;")
@ -297,13 +228,6 @@ DECLARE_JNI_CLASS (Set, "java/util/Set");
#undef JNI_CLASS_MEMBERS
#endif
#define JNI_CLASS_MEMBERS(METHOD, STATICMETHOD, FIELD, STATICFIELD) \
STATICMETHOD (parse, "parse", "(Ljava/lang/String;)Landroid/net/Uri;") \
METHOD (toString, "toString", "()Ljava/lang/String;")
DECLARE_JNI_CLASS (Uri, "android/net/Uri");
#undef JNI_CLASS_MEMBERS
//==========================================================================
#if defined(JUCE_FIREBASE_INSTANCE_ID_SERVICE_CLASSNAME)
#define JNI_CLASS_MEMBERS(METHOD, STATICMETHOD, FIELD, STATICFIELD) \
@ -465,7 +389,7 @@ struct PushNotifications::Pimpl
{
auto* env = getEnv();
auto bundle = LocalRef<jobject> (env->CallObjectMethod (intent, Intent.getExtras));
auto bundle = LocalRef<jobject> (env->CallObjectMethod (intent, AndroidIntent.getExtras));
const auto notification = localNotificationBundleToJuceNotification (bundle);
@ -475,7 +399,7 @@ struct PushNotifications::Pimpl
String notificationButtonActionString = packageName + ".JUCE_NOTIFICATION_BUTTON_ACTION.";
String notificationTextInputActionString = packageName + ".JUCE_NOTIFICATION_TEXT_INPUT_ACTION.";
auto actionString = juceString ((jstring) env->CallObjectMethod (intent, Intent.getAction));
auto actionString = juceString ((jstring) env->CallObjectMethod (intent, AndroidIntent.getAction));
if (actionString.contains (notificationString))
{
@ -509,7 +433,7 @@ struct PushNotifications::Pimpl
if (remoteInputResult.get() != 0)
{
auto charSequence = LocalRef<jobject> (env->CallObjectMethod (remoteInputResult, Bundle.getCharSequence, resultKeyString.get()));
auto charSequence = LocalRef<jobject> (env->CallObjectMethod (remoteInputResult, JavaBundle.getCharSequence, resultKeyString.get()));
auto responseString = LocalRef<jstring> ((jstring) env->CallObjectMethod (charSequence, JavaCharSequence.toString));
owner.listeners.call (&PushNotifications::Listener::handleNotificationAction,
@ -534,7 +458,7 @@ struct PushNotifications::Pimpl
{
auto* env = getEnv();
auto bundle = LocalRef<jobject> (env->CallObjectMethod (intent, Intent.getExtras));
auto bundle = LocalRef<jobject> (env->CallObjectMethod (intent, AndroidIntent.getExtras));
owner.listeners.call (&PushNotifications::Listener::localNotificationDismissedByUser,
localNotificationBundleToJuceNotification (bundle));
@ -663,7 +587,7 @@ struct PushNotifications::Pimpl
#if defined(JUCE_FIREBASE_MESSAGING_SERVICE_CLASSNAME)
auto* env = getEnv();
auto bundle = LocalRef<jobject> (env->CallObjectMethod (intent, Intent.getExtras));
auto bundle = LocalRef<jobject> (env->CallObjectMethod (intent, AndroidIntent.getExtras));
owner.listeners.call (&PushNotifications::Listener::handleNotification, false,
remoteNotificationBundleToJuceNotification (bundle));
@ -792,19 +716,19 @@ struct PushNotifications::Pimpl
{
auto* env = getEnv();
auto activityClass = LocalRef<jobject> (env->CallObjectMethod (android.activity, Object.getClass));
auto notifyIntent = LocalRef<jobject> (env->NewObject (Intent, Intent.constructorWithContextAndClass, android.activity.get(), activityClass.get()));
auto activityClass = LocalRef<jobject> (env->CallObjectMethod (android.activity, JavaObject.getClass));
auto notifyIntent = LocalRef<jobject> (env->NewObject (AndroidIntent, AndroidIntent.constructorWithContextAndClass, android.activity.get(), activityClass.get()));
auto packageNameString = LocalRef<jstring> ((jstring) (android.activity.callObjectMethod (JuceAppActivity.getPackageName)));
auto actionStringSuffix = javaString (".JUCE_NOTIFICATION." + n.identifier);
auto actionString = LocalRef<jstring> ((jstring)env->CallObjectMethod (packageNameString, JavaString.concat, actionStringSuffix.get()));
env->CallObjectMethod (notifyIntent, Intent.setAction, actionString.get());
env->CallObjectMethod (notifyIntent, AndroidIntent.setAction, actionString.get());
// Packaging entire notification into extras bundle here, so that we can retrieve all the details later on
env->CallObjectMethod (notifyIntent, Intent.putExtras, juceNotificationToBundle (n).get());
env->CallObjectMethod (notifyIntent, AndroidIntent.putExtras, juceNotificationToBundle (n).get());
auto notifyPendingIntent = LocalRef<jobject> (env->CallStaticObjectMethod (PendingIntent,
PendingIntent.getActivity,
auto notifyPendingIntent = LocalRef<jobject> (env->CallStaticObjectMethod (AndroidPendingIntent,
AndroidPendingIntent.getActivity,
android.activity.get(),
1002,
notifyIntent.get(),
@ -815,7 +739,7 @@ struct PushNotifications::Pimpl
env->CallObjectMethod (notificationBuilder, NotificationBuilderBase.setContentIntent, notifyPendingIntent.get());
auto resources = LocalRef<jobject> (env->CallObjectMethod (android.activity, JuceAppActivity.getResources));
const int iconId = env->CallIntMethod (resources, Resources.getIdentifier, javaString (n.icon).get(),
const int iconId = env->CallIntMethod (resources, AndroidResources.getIdentifier, javaString (n.icon).get(),
javaString ("raw").get(), packageNameString.get());
env->CallObjectMethod (notificationBuilder, NotificationBuilderBase.setSmallIcon, iconId);
@ -841,40 +765,40 @@ struct PushNotifications::Pimpl
{
auto* env = getEnv();
auto bundle = LocalRef<jobject> (env->NewObject (Bundle, Bundle.constructor));
auto bundle = LocalRef<jobject> (env->NewObject (JavaBundle, JavaBundle.constructor));
env->CallVoidMethod (bundle, Bundle.putString, javaString ("identifier") .get(), javaString (n.identifier).get());
env->CallVoidMethod (bundle, Bundle.putString, javaString ("title") .get(), javaString (n.title).get());
env->CallVoidMethod (bundle, Bundle.putString, javaString ("body") .get(), javaString (n.body).get());
env->CallVoidMethod (bundle, Bundle.putString, javaString ("subtitle") .get(), javaString (n.subtitle).get());
env->CallVoidMethod (bundle, Bundle.putInt, javaString ("badgeNumber") .get(), n.badgeNumber);
env->CallVoidMethod (bundle, Bundle.putString, javaString ("soundToPlay") .get(), javaString (n.soundToPlay.toString (true)).get());
env->CallVoidMethod (bundle, Bundle.putBundle, javaString ("properties") .get(), varToBundleWithPropertiesString (n.properties).get());
env->CallVoidMethod (bundle, Bundle.putString, javaString ("icon") .get(), javaString (n.icon).get());
env->CallVoidMethod (bundle, Bundle.putString, javaString ("channelId") .get(), javaString (n.channelId).get());
env->CallVoidMethod (bundle, Bundle.putString, javaString ("tickerText") .get(), javaString (n.tickerText).get());
env->CallVoidMethod (bundle, Bundle.putInt, javaString ("progressMax") .get(), n.progress.max);
env->CallVoidMethod (bundle, Bundle.putInt, javaString ("progressCurrent") .get(), n.progress.current);
env->CallVoidMethod (bundle, Bundle.putBoolean, javaString ("progressIndeterminate") .get(), n.progress.indeterminate);
env->CallVoidMethod (bundle, Bundle.putString, javaString ("person") .get(), javaString (n.person).get());
env->CallVoidMethod (bundle, Bundle.putInt, javaString ("type") .get(), n.type);
env->CallVoidMethod (bundle, Bundle.putInt, javaString ("priority") .get(), n.priority);
env->CallVoidMethod (bundle, Bundle.putInt, javaString ("lockScreenAppearance") .get(), n.lockScreenAppearance);
env->CallVoidMethod (bundle, Bundle.putString, javaString ("groupId") .get(), javaString (n.groupId).get());
env->CallVoidMethod (bundle, Bundle.putString, javaString ("groupSortKey") .get(), javaString (n.groupSortKey).get());
env->CallVoidMethod (bundle, Bundle.putBoolean, javaString ("groupSummary") .get(), n.groupSummary);
env->CallVoidMethod (bundle, Bundle.putInt, javaString ("accentColour") .get(), n.accentColour.getARGB());
env->CallVoidMethod (bundle, Bundle.putInt, javaString ("ledColour") .get(), n.ledColour.getARGB());
env->CallVoidMethod (bundle, Bundle.putInt, javaString ("ledBlinkPatternMsToBeOn") .get(), n.ledBlinkPattern.msToBeOn);
env->CallVoidMethod (bundle, Bundle.putInt, javaString ("ledBlinkPatternMsToBeOff").get(), n.ledBlinkPattern.msToBeOff);
env->CallVoidMethod (bundle, Bundle.putBoolean, javaString ("shouldAutoCancel") .get(), n.shouldAutoCancel);
env->CallVoidMethod (bundle, Bundle.putBoolean, javaString ("localOnly") .get(), n.localOnly);
env->CallVoidMethod (bundle, Bundle.putBoolean, javaString ("ongoing") .get(), n.ongoing);
env->CallVoidMethod (bundle, Bundle.putBoolean, javaString ("alertOnlyOnce") .get(), n.alertOnlyOnce);
env->CallVoidMethod (bundle, Bundle.putInt, javaString ("timestampVisibility") .get(), n.timestampVisibility);
env->CallVoidMethod (bundle, Bundle.putInt, javaString ("badgeIconType") .get(), n.badgeIconType);
env->CallVoidMethod (bundle, Bundle.putInt, javaString ("groupAlertBehaviour") .get(), n.groupAlertBehaviour);
env->CallVoidMethod (bundle, Bundle.putLong, javaString ("timeoutAfterMs") .get(), (jlong)n.timeoutAfterMs);
env->CallVoidMethod (bundle, JavaBundle.putString, javaString ("identifier") .get(), javaString (n.identifier).get());
env->CallVoidMethod (bundle, JavaBundle.putString, javaString ("title") .get(), javaString (n.title).get());
env->CallVoidMethod (bundle, JavaBundle.putString, javaString ("body") .get(), javaString (n.body).get());
env->CallVoidMethod (bundle, JavaBundle.putString, javaString ("subtitle") .get(), javaString (n.subtitle).get());
env->CallVoidMethod (bundle, JavaBundle.putInt, javaString ("badgeNumber") .get(), n.badgeNumber);
env->CallVoidMethod (bundle, JavaBundle.putString, javaString ("soundToPlay") .get(), javaString (n.soundToPlay.toString (true)).get());
env->CallVoidMethod (bundle, JavaBundle.putBundle, javaString ("properties") .get(), varToBundleWithPropertiesString (n.properties).get());
env->CallVoidMethod (bundle, JavaBundle.putString, javaString ("icon") .get(), javaString (n.icon).get());
env->CallVoidMethod (bundle, JavaBundle.putString, javaString ("channelId") .get(), javaString (n.channelId).get());
env->CallVoidMethod (bundle, JavaBundle.putString, javaString ("tickerText") .get(), javaString (n.tickerText).get());
env->CallVoidMethod (bundle, JavaBundle.putInt, javaString ("progressMax") .get(), n.progress.max);
env->CallVoidMethod (bundle, JavaBundle.putInt, javaString ("progressCurrent") .get(), n.progress.current);
env->CallVoidMethod (bundle, JavaBundle.putBoolean, javaString ("progressIndeterminate") .get(), n.progress.indeterminate);
env->CallVoidMethod (bundle, JavaBundle.putString, javaString ("person") .get(), javaString (n.person).get());
env->CallVoidMethod (bundle, JavaBundle.putInt, javaString ("type") .get(), n.type);
env->CallVoidMethod (bundle, JavaBundle.putInt, javaString ("priority") .get(), n.priority);
env->CallVoidMethod (bundle, JavaBundle.putInt, javaString ("lockScreenAppearance") .get(), n.lockScreenAppearance);
env->CallVoidMethod (bundle, JavaBundle.putString, javaString ("groupId") .get(), javaString (n.groupId).get());
env->CallVoidMethod (bundle, JavaBundle.putString, javaString ("groupSortKey") .get(), javaString (n.groupSortKey).get());
env->CallVoidMethod (bundle, JavaBundle.putBoolean, javaString ("groupSummary") .get(), n.groupSummary);
env->CallVoidMethod (bundle, JavaBundle.putInt, javaString ("accentColour") .get(), n.accentColour.getARGB());
env->CallVoidMethod (bundle, JavaBundle.putInt, javaString ("ledColour") .get(), n.ledColour.getARGB());
env->CallVoidMethod (bundle, JavaBundle.putInt, javaString ("ledBlinkPatternMsToBeOn") .get(), n.ledBlinkPattern.msToBeOn);
env->CallVoidMethod (bundle, JavaBundle.putInt, javaString ("ledBlinkPatternMsToBeOff").get(), n.ledBlinkPattern.msToBeOff);
env->CallVoidMethod (bundle, JavaBundle.putBoolean, javaString ("shouldAutoCancel") .get(), n.shouldAutoCancel);
env->CallVoidMethod (bundle, JavaBundle.putBoolean, javaString ("localOnly") .get(), n.localOnly);
env->CallVoidMethod (bundle, JavaBundle.putBoolean, javaString ("ongoing") .get(), n.ongoing);
env->CallVoidMethod (bundle, JavaBundle.putBoolean, javaString ("alertOnlyOnce") .get(), n.alertOnlyOnce);
env->CallVoidMethod (bundle, JavaBundle.putInt, javaString ("timestampVisibility") .get(), n.timestampVisibility);
env->CallVoidMethod (bundle, JavaBundle.putInt, javaString ("badgeIconType") .get(), n.badgeIconType);
env->CallVoidMethod (bundle, JavaBundle.putInt, javaString ("groupAlertBehaviour") .get(), n.groupAlertBehaviour);
env->CallVoidMethod (bundle, JavaBundle.putLong, javaString ("timeoutAfterMs") .get(), (jlong)n.timeoutAfterMs);
const int size = n.vibrationPattern.size();
@ -888,7 +812,7 @@ struct PushNotifications::Pimpl
elements[i] = (jlong) n.vibrationPattern[i];
env->SetLongArrayRegion (array, 0, size, elements);
env->CallVoidMethod (bundle, Bundle.putLongArray, javaString ("vibrationPattern").get(), array.get());
env->CallVoidMethod (bundle, JavaBundle.putLongArray, javaString ("vibrationPattern").get(), array.get());
}
return bundle;
@ -981,9 +905,9 @@ struct PushNotifications::Pimpl
env->CallObjectMethod (notificationBuilder, NotificationBuilderApi20.setLocalOnly, n.localOnly);
auto extras = LocalRef<jobject> (env->NewObject (Bundle, Bundle.constructor));
auto extras = LocalRef<jobject> (env->NewObject (JavaBundle, JavaBundle.constructor));
env->CallVoidMethod (extras, Bundle.putBundle, javaString ("notificationData").get(),
env->CallVoidMethod (extras, JavaBundle.putBundle, javaString ("notificationData").get(),
juceNotificationToBundle (n).get());
env->CallObjectMethod (notificationBuilder, NotificationBuilderApi20.addExtras, extras.get());
@ -1025,18 +949,18 @@ struct PushNotifications::Pimpl
{
auto* env = getEnv();
auto activityClass = LocalRef<jobject> (env->CallObjectMethod (android.activity, Object.getClass));
auto deleteIntent = LocalRef<jobject> (env->NewObject (Intent, Intent.constructorWithContextAndClass, android.activity.get(), activityClass.get()));
auto activityClass = LocalRef<jobject> (env->CallObjectMethod (android.activity, JavaObject.getClass));
auto deleteIntent = LocalRef<jobject> (env->NewObject (AndroidIntent, AndroidIntent.constructorWithContextAndClass, android.activity.get(), activityClass.get()));
auto packageNameString = LocalRef<jstring> ((jstring) (android.activity.callObjectMethod (JuceAppActivity.getPackageName)));
auto actionStringSuffix = javaString (".JUCE_NOTIFICATION_DELETED." + n.identifier);
auto actionString = LocalRef<jstring> ((jstring)env->CallObjectMethod (packageNameString, JavaString.concat, actionStringSuffix.get()));
env->CallObjectMethod (deleteIntent, Intent.setAction, actionString.get());
env->CallObjectMethod (deleteIntent, Intent.putExtras, juceNotificationToBundle (n).get());
env->CallObjectMethod (deleteIntent, AndroidIntent.setAction, actionString.get());
env->CallObjectMethod (deleteIntent, AndroidIntent.putExtras, juceNotificationToBundle (n).get());
auto deletePendingIntent = LocalRef<jobject> (env->CallStaticObjectMethod (PendingIntent,
PendingIntent.getActivity,
auto deletePendingIntent = LocalRef<jobject> (env->CallStaticObjectMethod (AndroidPendingIntent,
AndroidPendingIntent.getActivity,
android.activity.get(),
1002,
deleteIntent.get(),
@ -1054,8 +978,8 @@ struct PushNotifications::Pimpl
for (const auto& action : n.actions)
{
auto activityClass = LocalRef<jobject> (env->CallObjectMethod (android.activity, Object.getClass));
auto notifyIntent = LocalRef<jobject> (env->NewObject (Intent, Intent.constructorWithContextAndClass, android.activity.get(), activityClass.get()));
auto activityClass = LocalRef<jobject> (env->CallObjectMethod (android.activity, JavaObject.getClass));
auto notifyIntent = LocalRef<jobject> (env->NewObject (AndroidIntent, AndroidIntent.constructorWithContextAndClass, android.activity.get(), activityClass.get()));
const bool isTextStyle = action.style == PushNotifications::Notification::Action::text;
@ -1064,23 +988,23 @@ struct PushNotifications::Pimpl
auto actionStringSuffix = javaString (notificationActionString + n.identifier + "." + String (actionIndex) + "." + action.title);
auto actionString = LocalRef<jstring> ((jstring)env->CallObjectMethod (packageNameString, JavaString.concat, actionStringSuffix.get()));
env->CallObjectMethod (notifyIntent, Intent.setAction, actionString.get());
env->CallObjectMethod (notifyIntent, AndroidIntent.setAction, actionString.get());
// Packaging entire notification into extras bundle here, so that we can retrieve all the details later on
env->CallObjectMethod (notifyIntent, Intent.putExtras, juceNotificationToBundle (n).get());
env->CallObjectMethod (notifyIntent, AndroidIntent.putExtras, juceNotificationToBundle (n).get());
auto notifyPendingIntent = LocalRef<jobject> (env->CallStaticObjectMethod (PendingIntent,
PendingIntent.getActivity,
auto notifyPendingIntent = LocalRef<jobject> (env->CallStaticObjectMethod (AndroidPendingIntent,
AndroidPendingIntent.getActivity,
android.activity.get(),
1002,
notifyIntent.get(),
0));
auto resources = LocalRef<jobject> (env->CallObjectMethod (android.activity, JuceAppActivity.getResources));
int iconId = env->CallIntMethod (resources, Resources.getIdentifier, javaString (action.icon).get(),
int iconId = env->CallIntMethod (resources, AndroidResources.getIdentifier, javaString (action.icon).get(),
javaString ("raw").get(), packageNameString.get());
if (iconId == 0)
iconId = env->CallIntMethod (resources, Resources.getIdentifier, javaString (n.icon).get(),
iconId = env->CallIntMethod (resources, AndroidResources.getIdentifier, javaString (n.icon).get(),
javaString ("raw").get(), packageNameString.get());
#if __ANDROID_API__ >= 20
@ -1147,7 +1071,7 @@ struct PushNotifications::Pimpl
auto packageNameString = LocalRef<jstring> ((jstring) (android.activity.callObjectMethod (JuceAppActivity.getPackageName)));
auto resources = LocalRef<jobject> (env->CallObjectMethod (android.activity, JuceAppActivity.getResources));
const int id = env->CallIntMethod (resources, Resources.getIdentifier, javaString (url.toString (true)).get(),
const int id = env->CallIntMethod (resources, AndroidResources.getIdentifier, javaString (url.toString (true)).get(),
javaString ("raw").get(), packageNameString.get());
auto schemeString = javaString ("android.resource://");
@ -1155,7 +1079,7 @@ struct PushNotifications::Pimpl
auto uriString = LocalRef<jstring> ((jstring) env->CallObjectMethod (schemeString, JavaString.concat, packageNameString.get()));
uriString = LocalRef<jstring> ((jstring) env->CallObjectMethod (uriString, JavaString.concat, resourceString.get()));
return LocalRef<jobject> (env->CallStaticObjectMethod (Uri, Uri.parse, uriString.get()));
return LocalRef<jobject> (env->CallStaticObjectMethod (AndroidUri, AndroidUri.parse, uriString.get()));
}
static LocalRef<jobject> imagetoJavaBitmap (const Image& image)
@ -1164,16 +1088,19 @@ struct PushNotifications::Pimpl
Image imageToUse = image.convertedToFormat (Image::PixelFormat::ARGB);
auto bitmapConfig = LocalRef<jobject> (env->CallStaticObjectMethod (BitmapConfig, BitmapConfig.valueOf, javaString ("ARGB_8888").get()));
auto bitmap = LocalRef<jobject> (env->CallStaticObjectMethod (Bitmap,
Bitmap.createBitmap,
auto bitmapConfig = LocalRef<jobject> (env->CallStaticObjectMethod (AndroidBitmapConfig,
AndroidBitmapConfig.valueOf,
javaString ("ARGB_8888").get()));
auto bitmap = LocalRef<jobject> (env->CallStaticObjectMethod (AndroidBitmap,
AndroidBitmap.createBitmap,
image.getWidth(),
image.getHeight(),
bitmapConfig.get()));
for (int i = 0; i < image.getWidth(); ++i)
for (int j = 0; j < image.getHeight(); ++j)
env->CallVoidMethod (bitmap.get(), Bitmap.setPixel, i, j, image.getPixelAt (i, j).getARGB());
env->CallVoidMethod (bitmap.get(), AndroidBitmap.setPixel, i, j, image.getPixelAt (i, j).getARGB());
return bitmap;
}
@ -1207,8 +1134,8 @@ struct PushNotifications::Pimpl
{
auto* env = getEnv();
auto bundle = LocalRef<jobject> (env->NewObject (Bundle, Bundle.constructor));
env->CallVoidMethod (bundle, Bundle.putString, javaString ("properties").get(),
auto bundle = LocalRef<jobject> (env->NewObject (JavaBundle, JavaBundle.constructor));
env->CallVoidMethod (bundle, JavaBundle.putString, javaString ("properties").get(),
javaString (JSON::toString (varToParse, false)).get());
return bundle;
@ -1219,7 +1146,7 @@ struct PushNotifications::Pimpl
{
auto* env = getEnv();
auto varString = LocalRef<jstring> ((jstring)env->CallObjectMethod (bundle, Bundle.getString,
auto varString = LocalRef<jstring> ((jstring)env->CallObjectMethod (bundle, JavaBundle.getString,
javaString ("properties").get()));
var resultVar;
@ -1289,9 +1216,9 @@ struct PushNotifications::Pimpl
{
auto keyString = javaString (key);
if (env->CallBooleanMethod (bundle, Bundle.containsKey, keyString.get()))
if (env->CallBooleanMethod (bundle, JavaBundle.containsKey, keyString.get()))
{
auto value = LocalRef<jstring> ((jstring)env->CallObjectMethod (bundle, Bundle.getString, keyString.get()));
auto value = LocalRef<jstring> ((jstring)env->CallObjectMethod (bundle, JavaBundle.getString, keyString.get()));
return juceString (value);
}
@ -1302,8 +1229,8 @@ struct PushNotifications::Pimpl
{
auto keyString = javaString (key);
if (env->CallBooleanMethod (bundle, Bundle.containsKey, keyString.get()))
return env->CallIntMethod (bundle, Bundle.getInt, keyString.get());
if (env->CallBooleanMethod (bundle, JavaBundle.containsKey, keyString.get()))
return env->CallIntMethod (bundle, JavaBundle.getInt, keyString.get());
return 0;
}
@ -1313,8 +1240,8 @@ struct PushNotifications::Pimpl
{
auto keyString = javaString (key);
if (env->CallBooleanMethod (bundle, Bundle.containsKey, keyString.get()))
return (int) env->CallLongMethod (bundle, Bundle.getLong, keyString.get());
if (env->CallBooleanMethod (bundle, JavaBundle.containsKey, keyString.get()))
return (int) env->CallLongMethod (bundle, JavaBundle.getLong, keyString.get());
return 0;
}
@ -1323,9 +1250,9 @@ struct PushNotifications::Pimpl
{
auto keyString = javaString (key);
if (env->CallBooleanMethod (bundle, Bundle.containsKey, keyString.get()))
if (env->CallBooleanMethod (bundle, JavaBundle.containsKey, keyString.get()))
{
auto value = LocalRef<jobject> (env->CallObjectMethod (bundle, Bundle.getBundle, keyString.get()));
auto value = LocalRef<jobject> (env->CallObjectMethod (bundle, JavaBundle.getBundle, keyString.get()));
return bundleWithPropertiesStringToVar (value);
}
@ -1336,8 +1263,8 @@ struct PushNotifications::Pimpl
{
auto keyString = javaString (key);
if (env->CallBooleanMethod (bundle, Bundle.containsKey, keyString.get()))
return env->CallBooleanMethod (bundle, Bundle.getBoolean, keyString.get());
if (env->CallBooleanMethod (bundle, JavaBundle.containsKey, keyString.get()))
return env->CallBooleanMethod (bundle, JavaBundle.getBoolean, keyString.get());
return false;
}
@ -1346,9 +1273,9 @@ struct PushNotifications::Pimpl
{
auto keyString = javaString (key);
if (env->CallBooleanMethod (bundle, Bundle.containsKey, keyString.get()))
if (env->CallBooleanMethod (bundle, JavaBundle.containsKey, keyString.get()))
{
auto array = LocalRef<jlongArray> ((jlongArray) env->CallObjectMethod (bundle, Bundle.getLongArray, keyString.get()));
auto array = LocalRef<jlongArray> ((jlongArray) env->CallObjectMethod (bundle, JavaBundle.getLongArray, keyString.get()));
const int size = env->GetArrayLength (array.get());
@ -1371,7 +1298,7 @@ struct PushNotifications::Pimpl
auto* env = getEnv();
auto extras = LocalRef<jobject> (env->GetObjectField (notification, AndroidNotification.extras));
auto notificationData = LocalRef<jobject> (env->CallObjectMethod (extras, Bundle.getBundle,
auto notificationData = LocalRef<jobject> (env->CallObjectMethod (extras, JavaBundle.getBundle,
javaString ("notificationData").get()));
return localNotificationBundleToJuceNotification (notificationData);
@ -1396,20 +1323,20 @@ struct PushNotifications::Pimpl
{
auto* env = getEnv();
auto keySet = LocalRef<jobject> (env->CallObjectMethod (bundle, Bundle.keySet));
auto iterator = LocalRef<jobject> (env->CallObjectMethod (keySet, Set.iterator));
auto keySet = LocalRef<jobject> (env->CallObjectMethod (bundle, JavaBundle.keySet));
auto iterator = LocalRef<jobject> (env->CallObjectMethod (keySet, JavaSet.iterator));
DynamicObject::Ptr dynamicObject = new DynamicObject();
for (;;)
{
if (! env->CallBooleanMethod (iterator, Iterator.hasNext))
if (! env->CallBooleanMethod (iterator, JavaIterator.hasNext))
break;
auto key = LocalRef<jstring> ((jstring) env->CallObjectMethod (iterator, Iterator.next));
auto object = LocalRef<jobject> (env->CallObjectMethod (bundle, Bundle.get, key.get()));
auto objectAsString = LocalRef<jstring> ((jstring) env->CallObjectMethod (object, Object.toString));
auto objectClass = LocalRef<jobject> (env->CallObjectMethod (object, Object.getClass));
auto key = LocalRef<jstring> ((jstring) env->CallObjectMethod (iterator, JavaIterator.next));
auto object = LocalRef<jobject> (env->CallObjectMethod (bundle, JavaBundle.get, key.get()));
auto objectAsString = LocalRef<jstring> ((jstring) env->CallObjectMethod (object, JavaObject.toString));
auto objectClass = LocalRef<jobject> (env->CallObjectMethod (object, JavaObject.getClass));
auto classAsString = LocalRef<jstring> ((jstring) env->CallObjectMethod (objectClass, JavaClass.getName));
// Note: seems that Firebase delivers values as strings always, so this check is rather unnecessary,
@ -1442,16 +1369,16 @@ struct PushNotifications::Pimpl
const int ttl = env->CallIntMethod (remoteNotification, RemoteMessage.getTtl);
auto keySet = LocalRef<jobject> (env->CallObjectMethod (data, JavaMap.keySet));
auto iterator = LocalRef<jobject> (env->CallObjectMethod (keySet, Set.iterator));
auto iterator = LocalRef<jobject> (env->CallObjectMethod (keySet, JavaSet.iterator));
DynamicObject::Ptr dataDynamicObject = new DynamicObject();
for (;;)
{
if (! env->CallBooleanMethod (iterator, Iterator.hasNext))
if (! env->CallBooleanMethod (iterator, JavaIterator.hasNext))
break;
auto key = LocalRef<jstring> ((jstring) env->CallObjectMethod (iterator, Iterator.next));
auto key = LocalRef<jstring> ((jstring) env->CallObjectMethod (iterator, JavaIterator.next));
auto value = LocalRef<jstring> ((jstring) env->CallObjectMethod (data, JavaMap.get, key.get()));
dataDynamicObject->setProperty (juceString (key.get()), juceString (value.get()));
@ -1624,7 +1551,7 @@ struct PushNotifications::Pimpl
JuceAppActivity.getPackageName))
: String{};
String intentAction = juceString ((jstring) env->CallObjectMethod (intent, Intent.getAction));
String intentAction = juceString ((jstring) env->CallObjectMethod (intent, AndroidIntent.getAction));
for (const auto& string : strings)
if (intentAction.contains (packageName + string))
@ -1650,28 +1577,28 @@ struct PushNotifications::Pimpl
{
auto* env = getEnv();
auto categories = LocalRef<jobject> (env->CallObjectMethod (intent, Intent.getCategories));
auto categories = LocalRef<jobject> (env->CallObjectMethod (intent, AndroidIntent.getCategories));
int categoriesNum = categories != 0
? env->CallIntMethod (categories, Set.size)
? env->CallIntMethod (categories, JavaSet.size)
: 0;
if (categoriesNum == 0)
return false;
if (! env->CallBooleanMethod (categories, Set.contains, javaString ("android.intent.category.LAUNCHER").get()))
if (! env->CallBooleanMethod (categories, JavaSet.contains, javaString ("android.intent.category.LAUNCHER").get()))
return false;
if (! intentActionContainsAnyOf (intent, StringArray ("android.intent.action.MAIN"), false))
return false;
auto extras = LocalRef<jobject> (env->CallObjectMethod (intent, Intent.getExtras));
auto extras = LocalRef<jobject> (env->CallObjectMethod (intent, AndroidIntent.getExtras));
if (extras == 0)
return false;
return env->CallBooleanMethod (extras, Bundle.containsKey, javaString ("google.sent_time").get())
&& env->CallBooleanMethod (extras, Bundle.containsKey, javaString ("google.message_id").get());
return env->CallBooleanMethod (extras, JavaBundle.containsKey, javaString ("google.sent_time").get())
&& env->CallBooleanMethod (extras, JavaBundle.containsKey, javaString ("google.message_id").get());
}
PushNotifications& owner;

View file

@ -45,48 +45,6 @@ DECLARE_JNI_CLASS (IInAppBillingService, "com/android/vending/billing/IInAppBill
DECLARE_JNI_CLASS (IInAppBillingServiceStub, "com/android/vending/billing/IInAppBillingService$Stub");
#undef JNI_CLASS_MEMBERS
#define JNI_CLASS_MEMBERS(METHOD, STATICMETHOD, FIELD, STATICFIELD) \
METHOD (constructor, "<init>", "(I)V") \
METHOD (add, "add", "(Ljava/lang/Object;)Z") \
METHOD (iterator, "iterator", "()Ljava/util/Iterator;") \
METHOD (get, "get", "(I)Ljava/lang/Object;") \
METHOD (size, "size", "()I")
DECLARE_JNI_CLASS (ArrayList, "java/util/ArrayList");
#undef JNI_CLASS_MEMBERS
#define JNI_CLASS_MEMBERS(METHOD, STATICMETHOD, FIELD, STATICFIELD) \
METHOD (constructor, "<init>", "()V") \
METHOD (putBoolean, "putBoolean", "(Ljava/lang/String;Z)V") \
METHOD (putStringArrayList, "putStringArrayList", "(Ljava/lang/String;Ljava/util/ArrayList;)V") \
METHOD (getInt, "getInt", "(Ljava/lang/String;)I") \
METHOD (getStringArrayList, "getStringArrayList", "(Ljava/lang/String;)Ljava/util/ArrayList;") \
METHOD (getString, "getString", "(Ljava/lang/String;)Ljava/lang/String;") \
METHOD (getParcelable, "getParcelable", "(Ljava/lang/String;)Landroid/os/Parcelable;")
DECLARE_JNI_CLASS (Bundle, "android/os/Bundle");
#undef JNI_CLASS_MEMBERS
#define JNI_CLASS_MEMBERS(METHOD, STATICMETHOD, FIELD, STATICFIELD) \
STATICMETHOD (valueOf, "valueOf", "(I)Ljava/lang/Integer;")
DECLARE_JNI_CLASS (Integer, "java/lang/Integer");
#undef JNI_CLASS_MEMBERS
#define JNI_CLASS_MEMBERS(METHOD, STATICMETHOD, FIELD, STATICFIELD) \
METHOD (hasNext, "hasNext", "()Z") \
METHOD (next, "next", "()Ljava/lang/Object;")
DECLARE_JNI_CLASS (Iterator, "java/util/Iterator");
#undef JNI_CLASS_MEMBERS
#define JNI_CLASS_MEMBERS(METHOD, STATICMETHOD, FIELD, STATICFIELD) \
METHOD (getIntentSender, "getIntentSender", "()Landroid/content/IntentSender;")
DECLARE_JNI_CLASS (PendingIntent, "android/app/PendingIntent");
#undef JNI_CLASS_MEMBERS
//==============================================================================
struct ServiceConnection : public AndroidInterfaceImplementer
{
@ -96,7 +54,7 @@ struct ServiceConnection : public AndroidInterfaceImplementer
jobject invoke (jobject proxy, jobject method, jobjectArray args) override
{
auto* env = getEnv();
auto methodName = juceString ((jstring) env->CallObjectMethod (method, Method.getName));
auto methodName = juceString ((jstring) env->CallObjectMethod (method, JavaMethod.getName));
if (methodName == "onServiceConnected")
{
@ -124,9 +82,9 @@ struct InAppPurchases::Pimpl : private AsyncUpdater,
getInAppPurchaseInstances().add (this);
auto* env = getEnv();
auto intent = env->NewObject (Intent, Intent.constructWithString,
auto intent = env->NewObject (AndroidIntent, AndroidIntent.constructWithString,
javaString ("com.android.vending.billing.InAppBillingService.BIND").get());
env->CallObjectMethod (intent, Intent.setPackage, javaString ("com.android.vending").get());
env->CallObjectMethod (intent, AndroidIntent.setPackage, javaString ("com.android.vending").get());
serviceConnection = GlobalRef (CreateJavaInterface (this, "android/content/ServiceConnection").get());
android.activity.callBooleanMethod (JuceAppActivity.bindService, intent,
@ -176,19 +134,19 @@ struct InAppPurchases::Pimpl : private AsyncUpdater,
auto* env = getEnv();
auto responseCodeString = javaString ("RESPONSE_CODE");
auto responseCode = env->CallIntMethod (buyIntentBundle.get(), Bundle.getInt, responseCodeString.get());
auto responseCode = env->CallIntMethod (buyIntentBundle.get(), JavaBundle.getInt, responseCodeString.get());
if (responseCode == 0)
{
auto buyIntentString = javaString ("BUY_INTENT");
auto pendingIntent = LocalRef<jobject> (env->CallObjectMethod (buyIntentBundle.get(), Bundle.getParcelable, buyIntentString.get()));
auto pendingIntent = LocalRef<jobject> (env->CallObjectMethod (buyIntentBundle.get(), JavaBundle.getParcelable, buyIntentString.get()));
auto requestCode = 1001;
auto intentSender = LocalRef<jobject> (env->CallObjectMethod (pendingIntent.get(), PendingIntent.getIntentSender));
auto fillInIntent = LocalRef<jobject> (env->NewObject (Intent, Intent.constructor));
auto flagsMask = LocalRef<jobject> (env->CallStaticObjectMethod (Integer, Integer.valueOf, 0));
auto flagsValues = LocalRef<jobject> (env->CallStaticObjectMethod (Integer, Integer.valueOf, 0));
auto extraFlags = LocalRef<jobject> (env->CallStaticObjectMethod (Integer, Integer.valueOf, 0));
auto intentSender = LocalRef<jobject> (env->CallObjectMethod (pendingIntent.get(), AndroidPendingIntent.getIntentSender));
auto fillInIntent = LocalRef<jobject> (env->NewObject (AndroidIntent, AndroidIntent.constructor));
auto flagsMask = LocalRef<jobject> (env->CallStaticObjectMethod (JavaInteger, JavaInteger.valueOf, 0));
auto flagsValues = LocalRef<jobject> (env->CallStaticObjectMethod (JavaInteger, JavaInteger.valueOf, 0));
auto extraFlags = LocalRef<jobject> (env->CallStaticObjectMethod (JavaInteger, JavaInteger.valueOf, 0));
android.activity.callVoidMethod (JuceAppActivity.startIntentSenderForResult, intentSender.get(), requestCode,
fillInIntent.get(), flagsMask.get(), flagsValues.get(), extraFlags.get());
@ -270,7 +228,7 @@ struct InAppPurchases::Pimpl : private AsyncUpdater,
getPackageName().get(), skuString.get(),
productTypeString.get(), devString.get()));
auto skuList = LocalRef<jobject> (env->NewObject (ArrayList, ArrayList.constructor,
auto skuList = LocalRef<jobject> (env->NewObject (JavaArrayList, JavaArrayList.constructor,
(int) subscriptionIdentifiers.size()));
if (skuList.get() == 0)
@ -280,9 +238,9 @@ struct InAppPurchases::Pimpl : private AsyncUpdater,
}
for (const auto& identifier : subscriptionIdentifiers)
env->CallBooleanMethod (skuList.get(), ArrayList.add, javaString (identifier).get());
env->CallBooleanMethod (skuList.get(), JavaArrayList.add, javaString (identifier).get());
auto extraParams = LocalRef<jobject> (env->NewObject (Bundle, Bundle.constructor));
auto extraParams = LocalRef<jobject> (env->NewObject (JavaBundle, JavaBundle.constructor));
if (extraParams.get() == 0)
{
@ -293,8 +251,8 @@ struct InAppPurchases::Pimpl : private AsyncUpdater,
auto skusToReplaceString = javaString ("skusToReplace");
auto replaceSkusProrationString = javaString ("replaceSkusProration");
env->CallVoidMethod (extraParams.get(), Bundle.putStringArrayList, skusToReplaceString.get(), skuList.get());
env->CallVoidMethod (extraParams.get(), Bundle.putBoolean, replaceSkusProrationString.get(), creditForUnusedSubscription);
env->CallVoidMethod (extraParams.get(), JavaBundle.putStringArrayList, skusToReplaceString.get(), skuList.get());
env->CallVoidMethod (extraParams.get(), JavaBundle.putBoolean, replaceSkusProrationString.get(), creditForUnusedSubscription);
return LocalRef<jobject> (inAppBillingService.callObjectMethod (IInAppBillingService.getBuyIntentExtraParams, 6,
getPackageName().get(), skuString.get(),
@ -437,22 +395,22 @@ struct InAppPurchases::Pimpl : private AsyncUpdater,
{
auto* env = getEnv();
auto skuList = LocalRef<jobject> (env->NewObject (ArrayList, ArrayList.constructor, productIdentifiersToQuery.size()));
auto skuList = LocalRef<jobject> (env->NewObject (JavaArrayList, JavaArrayList.constructor, productIdentifiersToQuery.size()));
if (skuList.get() == 0)
return LocalRef<jobject> (0);
for (const auto& pi : productIdentifiersToQuery)
env->CallBooleanMethod (skuList.get(), ArrayList.add, javaString (pi).get());
env->CallBooleanMethod (skuList.get(), JavaArrayList.add, javaString (pi).get());
auto querySkus = LocalRef<jobject> (env->NewObject (Bundle, Bundle.constructor));
auto querySkus = LocalRef<jobject> (env->NewObject (JavaBundle, JavaBundle.constructor));
if (querySkus.get() == 0)
return LocalRef<jobject> (0);
auto itemIdListString = javaString ("ITEM_ID_LIST");
env->CallVoidMethod (querySkus.get(), Bundle.putStringArrayList, itemIdListString.get(), skuList.get());
env->CallVoidMethod (querySkus.get(), JavaBundle.putStringArrayList, itemIdListString.get(), skuList.get());
auto productTypeString = javaString (productType);
@ -473,27 +431,27 @@ struct InAppPurchases::Pimpl : private AsyncUpdater,
auto responseCodeString = javaString ("RESPONSE_CODE");
auto responseCode = env->CallIntMethod (retrievedProducts.get(), Bundle.getInt, responseCodeString.get());
auto responseCode = env->CallIntMethod (retrievedProducts.get(), JavaBundle.getInt, responseCodeString.get());
if (responseCode == 0)
{
auto detailsListString = javaString ("DETAILS_LIST");
auto responseList = LocalRef<jobject> (env->CallObjectMethod (retrievedProducts.get(), Bundle.getStringArrayList,
auto responseList = LocalRef<jobject> (env->CallObjectMethod (retrievedProducts.get(), JavaBundle.getStringArrayList,
detailsListString.get()));
if (responseList != 0)
{
auto iterator = LocalRef<jobject> (env->CallObjectMethod (responseList.get(), ArrayList.iterator));
auto iterator = LocalRef<jobject> (env->CallObjectMethod (responseList.get(), JavaArrayList.iterator));
if (iterator.get() != 0)
{
for (;;)
{
if (! env->CallBooleanMethod (iterator, Iterator.hasNext))
if (! env->CallBooleanMethod (iterator, JavaIterator.hasNext))
break;
auto response = juce::LocalRef<jstring> ((jstring)env->CallObjectMethod (iterator, Iterator.next));
auto response = juce::LocalRef<jstring> ((jstring)env->CallObjectMethod (iterator, JavaIterator.next));
if (response.get() != 0)
{
@ -601,7 +559,7 @@ struct InAppPurchases::Pimpl : private AsyncUpdater,
if (ownedItems.get() != 0)
{
auto responseCodeString = javaString ("RESPONSE_CODE");
auto responseCode = env->CallIntMethod (ownedItems.get(), Bundle.getInt, responseCodeString.get());
auto responseCode = env->CallIntMethod (ownedItems.get(), JavaBundle.getInt, responseCodeString.get());
if (responseCode == 0)
{
@ -610,16 +568,16 @@ struct InAppPurchases::Pimpl : private AsyncUpdater,
auto signatureListString = javaString ("INAPP_DATA_SIGNATURE_LIST");
auto continuationTokenString = javaString ("INAPP_CONTINUATION_TOKEN");
auto ownedSkus = LocalRef<jobject> (env->CallObjectMethod (ownedItems.get(), Bundle.getStringArrayList, itemListString.get()));
auto purchaseDataList = LocalRef<jobject> (env->CallObjectMethod (ownedItems.get(), Bundle.getStringArrayList, dataListString.get()));
auto signatureList = LocalRef<jobject> (env->CallObjectMethod (ownedItems.get(), Bundle.getStringArrayList, signatureListString.get()));
auto newContinuationToken = LocalRef<jstring> ((jstring) env->CallObjectMethod (ownedItems.get(), Bundle.getString, continuationTokenString.get()));
auto ownedSkus = LocalRef<jobject> (env->CallObjectMethod (ownedItems.get(), JavaBundle.getStringArrayList, itemListString.get()));
auto purchaseDataList = LocalRef<jobject> (env->CallObjectMethod (ownedItems.get(), JavaBundle.getStringArrayList, dataListString.get()));
auto signatureList = LocalRef<jobject> (env->CallObjectMethod (ownedItems.get(), JavaBundle.getStringArrayList, signatureListString.get()));
auto newContinuationToken = LocalRef<jstring> ((jstring) env->CallObjectMethod (ownedItems.get(), JavaBundle.getString, continuationTokenString.get()));
for (auto i = 0; i < env->CallIntMethod (purchaseDataList.get(), ArrayList.size); ++i)
for (auto i = 0; i < env->CallIntMethod (purchaseDataList.get(), JavaArrayList.size); ++i)
{
auto sku = juceString ((jstring) (env->CallObjectMethod (ownedSkus.get(), ArrayList.get, i)));
auto purchaseData = juceString ((jstring) (env->CallObjectMethod (purchaseDataList.get(), ArrayList.get, i)));
auto signature = juceString ((jstring) (env->CallObjectMethod (signatureList.get(), ArrayList.get, i)));
auto sku = juceString ((jstring) (env->CallObjectMethod (ownedSkus.get(), JavaArrayList.get, i)));
auto purchaseData = juceString ((jstring) (env->CallObjectMethod (purchaseDataList.get(), JavaArrayList.get, i)));
auto signature = juceString ((jstring) (env->CallObjectMethod (signatureList.get(), JavaArrayList.get, i)));
var responseData = JSON::parse (purchaseData);
@ -727,19 +685,19 @@ struct InAppPurchases::Pimpl : private AsyncUpdater,
auto* env = getEnv();
auto responseCodeString = javaString ("RESPONSE_CODE");
auto responseCode = env->CallIntMethod (ownedItems.get(), Bundle.getInt, responseCodeString.get());
auto responseCode = env->CallIntMethod (ownedItems.get(), JavaBundle.getInt, responseCodeString.get());
if (responseCode == 0)
{
auto dataListString = javaString ("INAPP_PURCHASE_DATA_LIST");
auto continuationTokenString = javaString ("INAPP_CONTINUATION_TOKEN");
auto purchaseDataList = LocalRef<jobject> (env->CallObjectMethod (ownedItems.get(), Bundle.getStringArrayList, dataListString.get()));
auto newContinuationToken = LocalRef<jstring> ((jstring) env->CallObjectMethod (ownedItems.get(), Bundle.getString, continuationTokenString.get()));
auto purchaseDataList = LocalRef<jobject> (env->CallObjectMethod (ownedItems.get(), JavaBundle.getStringArrayList, dataListString.get()));
auto newContinuationToken = LocalRef<jstring> ((jstring) env->CallObjectMethod (ownedItems.get(), JavaBundle.getString, continuationTokenString.get()));
for (auto i = 0; i < env->CallIntMethod (purchaseDataList.get(), ArrayList.size); ++i)
for (auto i = 0; i < env->CallIntMethod (purchaseDataList.get(), JavaArrayList.size); ++i)
{
auto purchaseData = juceString ((jstring) (env->CallObjectMethod (purchaseDataList.get(), ArrayList.get, i)));
auto purchaseData = juceString ((jstring) (env->CallObjectMethod (purchaseDataList.get(), JavaArrayList.get, i)));
var responseData = JSON::parse (purchaseData);
@ -826,14 +784,14 @@ struct InAppPurchases::Pimpl : private AsyncUpdater,
auto inAppDataSignatureString = javaString ("INAPP_DATA_SIGNATURE");
auto responseCodeString = javaString ("RESPONSE_CODE");
auto pd = LocalRef<jstring> ((jstring) env->CallObjectMethod (intentData, Intent.getStringExtra, inAppPurchaseDataString.get()));
auto sig = LocalRef<jstring> ((jstring) env->CallObjectMethod (intentData, Intent.getStringExtra, inAppDataSignatureString.get()));
auto pd = LocalRef<jstring> ((jstring) env->CallObjectMethod (intentData, AndroidIntent.getStringExtra, inAppPurchaseDataString.get()));
auto sig = LocalRef<jstring> ((jstring) env->CallObjectMethod (intentData, AndroidIntent.getStringExtra, inAppDataSignatureString.get()));
auto purchaseDataString = pd.get() != 0 ? juceString (pd.get()) : String();
auto dataSignatureString = sig.get() != 0 ? juceString (sig.get()) : String();
var responseData = JSON::parse (purchaseDataString);
auto responseCode = env->CallIntMethod (intentData, Intent.getIntExtra, responseCodeString.get());
auto responseCode = env->CallIntMethod (intentData, AndroidIntent.getIntExtra, responseCodeString.get());
auto statusCodeUserString = statusCodeToUserString (responseCode);
if (auto* object = responseData.getDynamicObject())