X-Git-Url: http://nitlanguage.org diff --git a/lib/android/bundle/bundle.nit b/lib/android/bundle/bundle.nit index b8b8390..3678cbc 100644 --- a/lib/android/bundle/bundle.nit +++ b/lib/android/bundle/bundle.nit @@ -18,10 +18,12 @@ # Android API for various data exchange purposes module bundle -import native_app_glue import serialization import json_serialization +import platform +import activities + in "Java" `{ import android.os.Bundle; import android.app.Activity; @@ -31,7 +33,8 @@ in "Java" `{ extern class NativeBundle in "Java" `{ android.os.Bundle `} super JavaObject - redef type SELF: NativeBundle + + new in "Java" `{ return new Bundle(); `} fun clone: JavaObject in "Java" `{ return recv.clone(); `} fun size: Int in "Java" `{ return recv.size(); `} @@ -58,6 +61,7 @@ extern class NativeBundle in "Java" `{ android.os.Bundle `} fun put_byte(key: JavaString, value: Int) in "Java" `{ recv.putByte(key, (byte) value); `} + # FIXME: Java's `char` are encoded on 16-bits whereas Nit's are on 8-bits. fun put_char(key: JavaString, value: Char) in "Java" `{ recv.putChar(key, value); `} @@ -85,7 +89,7 @@ extern class NativeBundle in "Java" `{ android.os.Bundle `} fun put_integer_array_list(key: JavaString, value: Array[Int]) import Array[Int].length, Array[Int].[] in "Java" `{ ArrayList java_array = - new ArrayList(Array_of_Int_length(value)); + new ArrayList((int) Array_of_Int_length(value)); for(int i=0; i < java_array.size(); ++i) java_array.add((int) Array_of_Int__index(value, i)); @@ -94,7 +98,7 @@ extern class NativeBundle in "Java" `{ android.os.Bundle `} `} fun put_string_array_list(key: JavaString, value: Array[JavaString]) import Array[JavaString].length, Array[JavaString].[] in "Java" `{ - ArrayList java_array = new ArrayList(Array_of_JavaString_length(value)); + ArrayList java_array = new ArrayList((int)Array_of_JavaString_length(value)); for(int i=0; i < java_array.size(); ++i) java_array.add(Array_of_JavaString__index(value, i)); @@ -104,7 +108,7 @@ extern class NativeBundle in "Java" `{ android.os.Bundle `} fun put_char_sequence_array_list(key: JavaString, value: Array[JavaString]) import Array[JavaString].length, Array[JavaString].[] in "Java" `{ ArrayList java_array = - new ArrayList(Array_of_JavaString_length(value)); + new ArrayList((int)Array_of_JavaString_length(value)); for(int i=0; i < java_array.size(); ++i) java_array.add(Array_of_JavaString__index(value, i)); @@ -113,7 +117,7 @@ extern class NativeBundle in "Java" `{ android.os.Bundle `} `} fun put_boolean_array(key: JavaString, value: Array[Bool]) import Array[Bool].length, Array[Bool].[] in "Java" `{ - boolean[] java_array = new boolean[Array_of_Bool_length(value)]; + boolean[] java_array = new boolean[(int)Array_of_Bool_length(value)]; for(int i=0; i < java_array.length; ++i) java_array[i] = Array_of_Bool__index(value, i); @@ -122,7 +126,7 @@ extern class NativeBundle in "Java" `{ android.os.Bundle `} `} fun put_byte_array(key: JavaString, value: Array[Int]) import Array[Int].length, Array[Int].[] in "Java" `{ - byte[] java_array = new byte[Array_of_Int_length(value)]; + byte[] java_array = new byte[(int)Array_of_Int_length(value)]; for(int i=0; i < java_array.length; ++i) java_array[i] = (byte) Array_of_Int__index(value, i); @@ -131,16 +135,17 @@ extern class NativeBundle in "Java" `{ android.os.Bundle `} `} fun put_short_array(key: JavaString, value: Array[Int]) import Array[Int].length, Array[Int].[] in "Java" `{ - short[] java_array = new short[Array_of_Int_length(value)]; + short[] java_array = new short[(int)Array_of_Int_length(value)]; for(int i=0; i < java_array.length; ++i) java_array[i] = (short) Array_of_Int__index(value, i); recv.putShortArray(key, java_array); `} + # FIXME: Java's `char` are encoded on 16-bits whereas Nit's are on 8-bits. fun put_char_array(key: JavaString, value: Array[Char]) import Array[Char].length, Array[Char].[] in "Java" `{ - char[] java_array = new char[Array_of_Char_length(value)]; + char[] java_array = new char[(int)Array_of_Char_length(value)]; for(int i=0; i < java_array.length; ++i) java_array[i] = Array_of_Char__index(value, i); @@ -149,7 +154,7 @@ extern class NativeBundle in "Java" `{ android.os.Bundle `} `} fun put_int_array(key: JavaString, value: Array[Int]) import Array[Int].length, Array[Int].[] in "Java" `{ - int[] java_array = new int[Array_of_Int_length(value)]; + int[] java_array = new int[(int)Array_of_Int_length(value)]; for(int i=0; i < java_array.length; ++i) java_array[i] = (int) Array_of_Int__index(value, i); @@ -158,7 +163,7 @@ extern class NativeBundle in "Java" `{ android.os.Bundle `} `} fun put_long_array(key: JavaString, value: Array[Int]) import Array[Int].length, Array[Int].[] in "Java" `{ - long[] java_array = new long[Array_of_Int_length(value)]; + long[] java_array = new long[(int)Array_of_Int_length(value)]; for(int i=0; i < java_array.length; ++i) java_array[i] = Array_of_Int__index(value, i); @@ -167,7 +172,7 @@ extern class NativeBundle in "Java" `{ android.os.Bundle `} `} fun put_float_array(key: JavaString, value: Array[Float]) import Array[Float].length, Array[Float].[] in "Java" `{ - float[] java_array = new float[Array_of_Float_length(value)]; + float[] java_array = new float[(int)Array_of_Float_length(value)]; for(int i=0; i < java_array.length; ++i) java_array[i] = (float) Array_of_Float__index(value, i); @@ -176,7 +181,7 @@ extern class NativeBundle in "Java" `{ android.os.Bundle `} `} fun put_double_array(key: JavaString, value: Array[Float]) import Array[Float].length, Array[Float].[] in "Java" `{ - double[] java_array = new double[Array_of_Float_length(value)]; + double[] java_array = new double[(int)Array_of_Float_length(value)]; for(int i=0; i < java_array.length; ++i) java_array[i] = Array_of_Float__index(value, i); @@ -185,7 +190,7 @@ extern class NativeBundle in "Java" `{ android.os.Bundle `} `} fun put_string_array(key: JavaString, value: Array[JavaString]) import Array[JavaString].length, Array[JavaString].[] in "Java" `{ - String[] java_array = new String[Array_of_JavaString_length(value)]; + String[] java_array = new String[(int)Array_of_JavaString_length(value)]; for(int i=0; i < java_array.length; ++i) java_array[i] = Array_of_JavaString__index(value, i); @@ -194,7 +199,7 @@ extern class NativeBundle in "Java" `{ android.os.Bundle `} `} fun put_char_sequence_array(key: JavaString, value: Array[JavaString]) import Array[JavaString].length, Array[JavaString].[] in "Java" `{ - CharSequence[] java_array = new CharSequence[Array_of_JavaString_length(value)]; + CharSequence[] java_array = new CharSequence[(int)Array_of_JavaString_length(value)]; for(int i=0; i < java_array.length; ++i) java_array[i] = Array_of_JavaString__index(value, i); @@ -212,7 +217,9 @@ extern class NativeBundle in "Java" `{ android.os.Bundle `} fun get_byte_with_def_value(key: JavaString, def_value: Int): Int in "Java" `{ return recv.getByte(key, (byte) def_value); `} + # FIXME: Java's `char` are encoded on 16-bits whereas Nit's are on 8-bits. fun get_char(key: JavaString): Char in "Java" `{ return recv.getChar(key); `} + # FIXME: Java's `char` are encoded on 16-bits whereas Nit's are on 8-bits. fun get_char_with_def_value(key: JavaString, def_value: Char): Char in "Java" `{ return recv.getChar(key, def_value); `} @@ -222,13 +229,11 @@ extern class NativeBundle in "Java" `{ android.os.Bundle `} `} fun get_int(key: JavaString): Int in "Java" `{ return recv.getInt(key); `} fun get_int_with_def_value(key: JavaString, def_value: Int): Int in "Java" `{ - return (int) recv.getInt(key, (int) def_value); + return recv.getInt(key, (int) def_value); `} - # FIXME: Get rid of the int cast as soon as the ffi is fixed - fun get_long(key: JavaString): Int in "Java" `{ return (int) recv.getLong(key); `} - # FIXME: Get rid of the int cast as soon as the ffi is fixed + fun get_long(key: JavaString): Int in "Java" `{ return recv.getLong(key); `} fun get_long_with_def_value(key: JavaString, def_value: Int): Int in "Java" `{ - return (int) recv.getLong(key); + return recv.getLong(key); `} fun get_float(key: JavaString): Float in "Java" `{ return (float) recv.getFloat(key); @@ -261,29 +266,29 @@ extern class NativeBundle in "Java" `{ android.os.Bundle `} return nit_array; `} - fun get_string_array_list(key: JavaString): Array[JavaString] - import Array[JavaString], Array[JavaString].add in "Java" `{ + fun get_string_array_list(key: JavaString): Array[String] + import StringCopyArray, StringCopyArray.add, StringCopyArray.collection in "Java" `{ ArrayList java_array = recv.getStringArrayList(key); - int nit_array = new_Array_of_JavaString(); + int nit_array = new_StringCopyArray(); if (java_array == null) return nit_array; for (String element: java_array) - Array_of_JavaString_add(nit_array, element); + StringCopyArray_add(nit_array, element); - return nit_array; + return StringCopyArray_collection(nit_array); `} - fun get_char_sequence_array_list(key: JavaString): Array[JavaString] - import Array[JavaString], Array[JavaString].add in "Java" `{ + fun get_char_sequence_array_list(key: JavaString): Array[String] + import StringCopyArray, StringCopyArray.add, StringCopyArray.collection in "Java" `{ ArrayList java_array = recv.getCharSequenceArrayList(key); - int nit_array = new_Array_of_JavaString(); + int nit_array = new_StringCopyArray(); if (java_array == null) return nit_array; for (CharSequence element: java_array) - Array_of_JavaString_add(nit_array, (String) element); + StringCopyArray_add(nit_array, (String) element); - return nit_array; + return StringCopyArray_collection(nit_array); `} fun get_boolean_array(key: JavaString): Array[Bool] import Array[Bool], Array[Bool].add in "Java" `{ @@ -305,7 +310,7 @@ extern class NativeBundle in "Java" `{ android.os.Bundle `} if (java_array == null) return nit_array; for(int i=0; i < java_array.length; ++i) - Array_of_Int_add(nit_array, (int) java_array[i]); + Array_of_Int_add(nit_array, java_array[i]); return nit_array; `} @@ -317,10 +322,11 @@ extern class NativeBundle in "Java" `{ android.os.Bundle `} if (java_array == null) return nit_array; for(int i=0; i < java_array.length; ++i) - Array_of_Int_add(nit_array, (int) java_array[i]); + Array_of_Int_add(nit_array, java_array[i]); return nit_array; `} + # FIXME: Java's `char` are encoded on 16-bits whereas Nit's are on 8-bits. fun get_char_array(key: JavaString): Array[Char] import Array[Char], Array[Char].add in "Java" `{ char[] java_array = recv.getCharArray(key); @@ -354,7 +360,7 @@ extern class NativeBundle in "Java" `{ android.os.Bundle `} if (java_array == null) return nit_array; for(int i=0; i < java_array.length; ++i) - Array_of_Int_add(nit_array, (int) java_array[i]); + Array_of_Int_add(nit_array, java_array[i]); return nit_array; `} @@ -382,56 +388,47 @@ extern class NativeBundle in "Java" `{ android.os.Bundle `} return nit_array; `} - fun get_string_array(key: JavaString): Array[JavaString] - import Array[JavaString], Array[JavaString].add in "Java" `{ + fun get_string_array(key: JavaString): Array[String] + import StringCopyArray, StringCopyArray.add, StringCopyArray.collection in "Java" `{ String[] java_array = recv.getStringArray(key); - int nit_array = new_Array_of_JavaString(); + int nit_array = new_StringCopyArray(); if (java_array == null) return nit_array; for(int i=0; i < java_array.length; ++i) - Array_of_JavaString_add(nit_array, java_array[i]); + StringCopyArray_add(nit_array, java_array[i]); - return nit_array; + return StringCopyArray_collection(nit_array); `} - fun get_char_sequence_array(key: JavaString): Array[JavaString] - import Array[JavaString], Array[JavaString].add in "Java" `{ + fun get_char_sequence_array(key: JavaString): Array[String] + import StringCopyArray, StringCopyArray.add, StringCopyArray.collection in "Java" `{ CharSequence[] java_array = recv.getCharSequenceArray(key); - int nit_array = new_Array_of_JavaString(); + int nit_array = new_StringCopyArray(); if (java_array == null) return nit_array; for(int i=0; i < java_array.length; ++i) - Array_of_JavaString_add(nit_array, (String) java_array[i]); + StringCopyArray_add(nit_array, (String)java_array[i]); - return nit_array; + return StringCopyArray_collection(nit_array); `} fun describe_contents: Int in "Java" `{ return recv.describeContents(); `} fun to_string: JavaString in "Java" `{ return recv.toString(); `} + + # HACK for bug #845 + redef fun new_global_ref import sys, Sys.jni_env `{ + Sys sys = NativeBundle_sys(recv); + JNIEnv *env = Sys_jni_env(sys); + return (*env)->NewGlobalRef(env, recv); + `} end # A class mapping `String` keys to various value types class Bundle - private var native_bundle: NativeBundle - private var context: NativeActivity + private var native_bundle: NativeBundle = new NativeBundle is lazy - init(app: App) - do - self.context = app.native_activity - setup - end - - private fun set_vars(native_bundle: NativeBundle) - do - self.native_bundle = native_bundle.new_global_ref - end - - private fun setup import context, set_vars in "Java" `{ - Activity context = (Activity) Bundle_context(recv); - Bundle bundle = new Bundle(); - - Bundle_set_vars(recv, bundle); - `} + # Get a new `Bundle` wrapping `native_bundle` + init from(native_bundle: NativeBundle) do self.native_bundle = native_bundle # Returns `true` if the Bundle contains this key fun has(key: String): Bool @@ -552,7 +549,7 @@ class Bundle if return_value == "" then return null - return return_value.to_s + return return_value end # Retrieves the `Bool` value corresponding to the given key @@ -568,6 +565,7 @@ class Bundle # Retrieves the `Char` value corresponding to the given key # Returns the `def_value` if none or if it's the wrong value type + # FIXME: Java's `char` are encoded on 16-bits whereas Nit's are on 8-bits. fun char(key: String, def_value: Char): Char do sys.jni_env.push_local_frame(1) @@ -614,6 +612,7 @@ class Bundle # Retrieves the `Array[Char]` value corresponding to the given key # Returns the `null` if none or if it's the wrong value type + # FIXME: Java's `char` are encoded on 16-bits whereas Nit's are on 8-bits. fun array_of_char(key: String): nullable Array[Char] do sys.jni_env.push_local_frame(1) @@ -654,20 +653,14 @@ class Bundle # Returns the `null` if none or if it's the wrong value type fun array_of_string(key: String): nullable Array[String] do - var string_array = new Array[String] sys.jni_env.push_local_frame(1) - var return_value = native_bundle.get_string_array(key.to_java_string) - - for element in return_value - do - string_array.add(element.to_s) - end + var return_value = native_bundle.get_string_array(key.to_java_string) sys.jni_env.pop_local_frame if return_value.is_empty then return null - return string_array + return return_value end end @@ -679,7 +672,7 @@ redef class Serializable protected fun add_to_bundle(bundle: NativeBundle, key: JavaString) do sys.jni_env.push_local_frame(1) - var serialized_string = new StringOStream + var serialized_string = new StringWriter var serializer = new JsonSerializer(serialized_string) serializer.serialize(self) @@ -747,7 +740,7 @@ redef class Array[E] var java_string_array = new Array[JavaString] for element in self do - var serialized_string = new StringOStream + var serialized_string = new StringWriter var serializer = new JsonSerializer(serialized_string) serializer.serialize(element) java_string_array.add(serialized_string.to_s.to_java_string) @@ -757,3 +750,9 @@ redef class Array[E] end end end + +# Allows JavaString collection copy through FFI with Java +private class StringCopyArray + var collection = new Array[String] + fun add(element: JavaString) do collection.add element.to_s +end