Merge: Misc AST
[nit.git] / lib / android / bundle / bundle.nit
index b8b8390..3678cbc 100644 (file)
 # 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<Integer> java_array = 
-                       new ArrayList<Integer>(Array_of_Int_length(value));
+                       new ArrayList<Integer>((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<String> java_array = new ArrayList<String>(Array_of_JavaString_length(value));
+               ArrayList<String> java_array = new ArrayList<String>((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<CharSequence> java_array = 
-                 new ArrayList<CharSequence>(Array_of_JavaString_length(value));
+                 new ArrayList<CharSequence>((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<String> 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<CharSequence> 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