Merge: Contract implementation
[nit.git] / lib / android / shared_preferences / shared_preferences_api10.nit
index 6cd184d..f012ed2 100644 (file)
@@ -19,7 +19,7 @@ module shared_preferences_api10
 
 import dalvik
 import serialization
-private import json::serialization
+private import json
 
 in "Java" `{
        import android.content.SharedPreferences;
@@ -34,13 +34,13 @@ in "Java" `{
 extern class NativeSharedPreferences in "Java" `{ android.content.SharedPreferences `}
        super JavaObject
 
-       fun contains(key: JavaString): Bool in "Java" `{ return recv.contains(key); `}
+       fun contains(key: JavaString): Bool in "Java" `{ return self.contains(key); `}
        fun get_all: HashMap[JavaString, JavaObject] import HashMap[JavaString, JavaObject],
                HashMap[JavaString, JavaObject].[]= in "Java" `{
                Map<String, ?> java_map = null;
-               int nit_hashmap = new_HashMap_of_JavaString_JavaObject();
+               nit.app.NitObject nit_hashmap = new_HashMap_of_JavaString_JavaObject();
                try {
-                       java_map = recv.getAll();
+                       java_map = self.getAll();
                } catch (NullPointerException e) {
                        return nit_hashmap;
                }
@@ -54,7 +54,7 @@ extern class NativeSharedPreferences in "Java" `{ android.content.SharedPreferen
        fun get_boolean(key: JavaString, def_value: Bool): Bool in "Java" `{
                boolean return_value;
                try {
-                       return_value = recv.getBoolean(key, def_value);
+                       return_value = self.getBoolean(key, def_value);
                } catch (ClassCastException e) {
                        return def_value;
                }
@@ -64,7 +64,7 @@ extern class NativeSharedPreferences in "Java" `{ android.content.SharedPreferen
        fun get_float(key: JavaString, def_value: Float): Float in "Java" `{
                float return_value;
                try {
-                       return_value = recv.getFloat(key, (float) def_value);
+                       return_value = self.getFloat(key, (float) def_value);
                } catch (ClassCastException e) {
                        return def_value;
                }
@@ -74,7 +74,7 @@ extern class NativeSharedPreferences in "Java" `{ android.content.SharedPreferen
        fun get_int(key: JavaString, def_value: Int): Int in "Java" `{
                int return_value;
                try {
-                       return_value = recv.getInt(key, (int)def_value);
+                       return_value = self.getInt(key, (int)def_value);
                } catch (ClassCastException e) {
                        return def_value;
                }
@@ -84,7 +84,7 @@ extern class NativeSharedPreferences in "Java" `{ android.content.SharedPreferen
        fun get_long(key: JavaString, def_value: Int): Int in "Java" `{
                long return_value;
                try {
-                       return_value = recv.getLong(key, def_value);
+                       return_value = self.getLong(key, def_value);
                } catch (ClassCastException e) {
                        return def_value;
                }
@@ -94,7 +94,7 @@ extern class NativeSharedPreferences in "Java" `{ android.content.SharedPreferen
        fun get_string(key: JavaString, def_value: JavaString): JavaString in "Java" `{
                String return_value = null;
                try {
-                       return_value = recv.getString(key, def_value);
+                       return_value = self.getString(key, def_value);
                } catch (ClassCastException e) {
                        return def_value;
                }
@@ -104,47 +104,46 @@ extern class NativeSharedPreferences in "Java" `{ android.content.SharedPreferen
 
        # HACK for bug #845
        redef fun new_global_ref import sys, Sys.jni_env `{
-               Sys sys = NativeSharedPreferences_sys(recv);
+               Sys sys = NativeSharedPreferences_sys(self);
                JNIEnv *env = Sys_jni_env(sys);
-               return (*env)->NewGlobalRef(env, recv);
+               return (*env)->NewGlobalRef(env, self);
        `}
 end
 
 extern class NativeSharedPreferencesEditor in "Java" `{ android.content.SharedPreferences$Editor `}
        super JavaObject
 
-       fun clear: NativeSharedPreferencesEditor in "Java" `{ return recv.clear(); `}
-       fun commit: Bool in "Java" `{ return recv.commit(); `}
+       fun clear: NativeSharedPreferencesEditor in "Java" `{ return self.clear(); `}
+       fun commit: Bool in "Java" `{ return self.commit(); `}
        fun put_boolean(key: JavaString, value: Bool): NativeSharedPreferencesEditor in "Java" `{
-               return recv.putBoolean (key, value);
+               return self.putBoolean (key, value);
        `}
        fun put_float(key: JavaString, value: Float): NativeSharedPreferencesEditor in "Java" `{
-               return recv.putFloat(key, (float) value);
+               return self.putFloat(key, (float) value);
        `}
        fun put_int(key: JavaString, value: Int): NativeSharedPreferencesEditor in "Java" `{
-               return recv.putInt(key, (int)value);
+               return self.putInt(key, (int)value);
        `}
        fun put_long(key: JavaString, value: Int): NativeSharedPreferencesEditor in "Java" `{
-               return recv.putLong(key, value);
+               return self.putLong(key, value);
        `}
        fun put_string(key: JavaString, value: JavaString): NativeSharedPreferencesEditor in "Java" `{
-               return recv.putString(key, value);
+               return self.putString(key, value);
        `}
        fun remove(key: JavaString): NativeSharedPreferencesEditor in "Java" `{
-               return recv.remove(key);
+               return self.remove(key);
        `}
 
        # HACK for bug #845
        redef fun new_global_ref import sys, Sys.jni_env `{
-               Sys sys = NativeSharedPreferencesEditor_sys(recv);
+               Sys sys = NativeSharedPreferencesEditor_sys(self);
                JNIEnv *env = Sys_jni_env(sys);
-               return (*env)->NewGlobalRef(env, recv);
+               return (*env)->NewGlobalRef(env, self);
        `}
 end
 
 # Provides services to save and load data for the android platform
 class SharedPreferences
-       protected var context: NativeActivity
        protected var shared_preferences: NativeSharedPreferences
        protected var editor: NativeSharedPreferencesEditor
 
@@ -153,9 +152,8 @@ class SharedPreferences
 
        protected init(app: App, file_name: String, mode: Int)
        do
-               self.context = app.native_activity
                sys.jni_env.push_local_frame(1)
-               setup(file_name.to_java_string, mode)
+               setup(file_name.to_java_string, mode, app.native_context)
                sys.jni_env.pop_local_frame
        end
 
@@ -174,20 +172,20 @@ class SharedPreferences
                self.editor = editor.new_global_ref
        end
 
-       private fun setup(file_name: JavaString, mode: Int) import context, set_vars in "Java" `{
-               Activity context = (Activity) SharedPreferences_context(recv);
+       private fun setup(file_name: JavaString, mode: Int, context: NativeContext) import set_vars in "Java" `{
                SharedPreferences sp;
 
                // Uses default SharedPreferences if file_name is an empty String
                if (file_name.equals("")) {
-                       sp = context.getPreferences((int)mode);
+                       Activity activity = (Activity)context;
+                       sp = activity.getPreferences((int)mode);
                } else {
                        sp = context.getSharedPreferences(file_name, (int)mode);
                }
 
                SharedPreferences.Editor editor = sp.edit();
 
-               SharedPreferences_set_vars(recv, sp, editor);
+               SharedPreferences_set_vars(self, sp, editor);
        `}
 
        private fun commit_if_auto do if auto_commit then self.commit
@@ -390,7 +388,7 @@ class SharedPreferences
        # Retrieve an `Object` stored via `[]=` function
        #
        # Returns `null` if there's no serialized object corresponding to the given key
-       # Make sure that the serialized object is `auto_serializable` or that it redefines
+       # Make sure that the serialized object is `serialize` or that it redefines
        # the appropriate methods. Refer to `Serializable` documentation for further details
        fun [](key: String): nullable Object
        do
@@ -399,12 +397,21 @@ class SharedPreferences
                if serialized_string == "" then return null
 
                var deserializer = new JsonDeserializer(serialized_string)
-               return deserializer.deserialize
+               var deserialized = deserializer.deserialize
+
+               var errors = deserializer.errors
+               if errors.not_empty then
+                       # An update may have broken the versioning compatibility
+                       print_error "{class_name} error at deserialization: {errors.join(", ")}"
+                       return null # Let's be safe
+               end
+
+               return deserialized
        end
 end
 
 redef class App
        var shared_preferences: SharedPreferences is lazy do
-               return new SharedPreferences.privately(self, "")
+               return new SharedPreferences.privately(self, "app.nit")
        end
 end