misc/vim: inform the user when no results are found
[nit.git] / lib / android / assets_and_resources.nit
index ef78d72..ae124ba 100644 (file)
@@ -25,8 +25,8 @@
 module assets_and_resources
 
 import native_app_glue
-import java_io
 import java
+import java::io
 
 in "Java" `{
        import android.content.res.AssetManager;
@@ -46,7 +46,6 @@ in "Java" `{
 # This is a low-level class, use `AssetManager` instead
 extern class NativeAssetManager in "Java" `{ android.content.res.AssetManager `}
        super JavaObject
-       redef type SELF: NativeAssetManager
 
        fun close in "Java" `{ recv.close(); `}
 
@@ -103,6 +102,13 @@ extern class NativeAssetManager in "Java" `{ android.content.res.AssetManager `}
                }
                return afd;
        `}
+
+       # HACK for bug #845
+       redef fun new_global_ref import sys, Sys.jni_env `{
+               Sys sys = NativeResources_sys(recv);
+               JNIEnv *env = Sys_jni_env(sys);
+               return (*env)->NewGlobalRef(env, recv);
+       `}
 end
 
 # Assets manager using a `NativeAssetManager` to manage android assets
@@ -139,14 +145,18 @@ class AssetManager
 
        # Open an asset using ACCESS_STREAMING mode, returning a NativeInputStream
        fun open(file_name: String): NativeInputStream do
+               sys.jni_env.push_local_frame(1)
                var return_value =  native_assets_manager.open(file_name.to_java_string)
+               sys.jni_env.pop_local_frame
                return return_value
        end
 
        # Open an asset using it's name and returning a NativeAssetFileDescriptor
        # `file_name` is
        fun open_fd(file_name: String): NativeAssetFileDescriptor do
-               var return_value = native_assets_manager.open_fd(file_name.to_java_string)
+               sys.jni_env.push_local_frame(1)
+               var return_value = native_assets_manager.open_fd(file_name.to_java_string).new_global_ref
+               sys.jni_env.pop_local_frame
                return return_value
        end
 
@@ -159,7 +169,7 @@ class AssetManager
        # Return a bitmap from the assets
        fun bitmap(name: String): NativeBitmap do
                sys.jni_env.push_local_frame(1)
-               var return_value = new NativeBitmap.from_stream(native_assets_manager.open(name.to_java_string))
+               var return_value = new NativeBitmap.from_stream(native_assets_manager.open(name.to_java_string)).new_global_ref
                sys.jni_env.pop_local_frame
                return return_value
        end
@@ -172,20 +182,26 @@ end
 # This is a low-level class, use `ResourcesManager` instead
 extern class NativeResources in "Java" `{ android.content.res.Resources `}
        super JavaObject
-       redef type SELF: NativeResources
 
        fun get_assets:NativeAssetManager in "Java" `{ return recv.getAssets(); `}
-       fun get_color(id: Int): Int in "Java" `{ return recv.getColor(id); `}
-       fun get_boolean(id: Int): Bool in "Java" `{ return recv.getBoolean(id); `}
-       fun get_dimension(id: Int): Int in "Java" `{ return (int)recv.getDimension(id); `}
-       fun get_drawable(id: Int): NativeDrawable in "Java" `{ return recv.getDrawable(id); `}
+       fun get_color(id: Int): Int in "Java" `{ return recv.getColor((int)id); `}
+       fun get_boolean(id: Int): Bool in "Java" `{ return recv.getBoolean((int)id); `}
+       fun get_dimension(id: Int): Int in "Java" `{ return (int)recv.getDimension((int)id); `}
+       fun get_drawable(id: Int): NativeDrawable in "Java" `{ return recv.getDrawable((int)id); `}
        fun get_identifier(name, def_type, def_package: JavaString): Int in "Java" `{ return recv.getIdentifier(name, def_type, def_package); `}
-       fun get_integer(id: Int): Int in "Java" `{ return recv.getInteger(id); `}
-       fun get_string(id: Int): JavaString in "Java" `{ return recv.getString(id); `}
-       fun get_resource_entry_name(resid: Int): JavaString in "Java" `{ return recv.getResourceEntryName(resid); `}
-       fun get_resource_name(resid: Int): JavaString in "Java" `{ return recv.getResourceName(resid); `}
-       fun get_resource_pakage_name(resid: Int): JavaString in "Java" `{ return recv.getResourcePackageName(resid); `}
-       fun get_resource_type_name(resid: Int): JavaString in "Java" `{ return recv.getResourceTypeName(resid); `}
+       fun get_integer(id: Int): Int in "Java" `{ return recv.getInteger((int)id); `}
+       fun get_string(id: Int): JavaString in "Java" `{ return recv.getString((int)id); `}
+       fun get_resource_entry_name(resid: Int): JavaString in "Java" `{ return recv.getResourceEntryName((int)resid); `}
+       fun get_resource_name(resid: Int): JavaString in "Java" `{ return recv.getResourceName((int)resid); `}
+       fun get_resource_pakage_name(resid: Int): JavaString in "Java" `{ return recv.getResourcePackageName((int)resid); `}
+       fun get_resource_type_name(resid: Int): JavaString in "Java" `{ return recv.getResourceTypeName((int)resid); `}
+
+       # HACK for bug #845
+       redef fun new_global_ref import sys, Sys.jni_env `{
+               Sys sys = NativeResources_sys(recv);
+               JNIEnv *env = Sys_jni_env(sys);
+               return (*env)->NewGlobalRef(env, recv);
+       `}
 end
 
 # Resource manager for android resources placed in the `res` folder of your app
@@ -276,7 +292,6 @@ end
 # An android Bitmap, get an instance using the AssetManager or the ResourceManager
 extern class NativeBitmap in "Java" `{ android.graphics.Bitmap `}
        super JavaObject
-       redef type SELF: NativeBitmap
 
        # Create a NativeBitmap from a NativeInputStream retrieved with `open` function of the AssetManager
        # Called by the AssetManager
@@ -284,15 +299,22 @@ extern class NativeBitmap in "Java" `{ android.graphics.Bitmap `}
 
        # Create a NativeBitmap using a resource ID and the NativeResources
        # Called by the ResourceManager
-       new from_resources(res: NativeResources, id: Int) in "Java" `{ return BitmapFactory.decodeResource(res, id); `}
+       new from_resources(res: NativeResources, id: Int) in "Java" `{ return BitmapFactory.decodeResource(res, (int)id); `}
        fun width: Int in "Java" `{ return recv.getWidth(); `}
        fun height: Int in "Java" `{ return recv.getHeight(); `}
+
+       # HACK for bug #845
+       redef fun new_global_ref import sys, Sys.jni_env `{
+               Sys sys = NativeResources_sys(recv);
+               JNIEnv *env = Sys_jni_env(sys);
+               return (*env)->NewGlobalRef(env, recv);
+       `}
+
 end
 
 # Android AssetFileDescriptor, can be retrieve by AssetManager and used to load a sound in a SoundPool
 extern class NativeAssetFileDescriptor in "Java" `{ android.content.res.AssetFileDescriptor `}
        super JavaObject
-       redef type SELF: NativeAssetFileDescriptor
 
        fun close in "Java" `{
                try {
@@ -334,6 +356,13 @@ extern class NativeAssetFileDescriptor in "Java" `{ android.content.res.AssetFil
        fun length: Int in "Java" `{ return (int)recv.getLength(); `}
        fun start_offset: Int in "Java" `{ return (int)recv.getStartOffset(); `}
        redef fun to_s: String import JavaString.to_s in "Java" `{ return JavaString_to_s(recv.toString()); `}
+
+       # HACK for bug #845
+       redef fun new_global_ref import sys, Sys.jni_env `{
+               Sys sys = NativeResources_sys(recv);
+               JNIEnv *env = Sys_jni_env(sys);
+               return (*env)->NewGlobalRef(env, recv);
+       `}
 end
 
 # Native class representing something drawable, can be retrieved from the resources
@@ -343,10 +372,10 @@ end
 
 redef class App
        # Resource Manager used to manage resources placed in the `res` folder of the app
-       fun resource_manager: ResourcesManager is cached do return new ResourcesManager(self.resources, self.package_name.to_s)
+       var resource_manager: ResourcesManager is lazy  do return new ResourcesManager(self.resources, self.package_name.to_s)
 
        # Assets Manager used to manage resources placed in the `assets` folder of the app
-       fun asset_manager: AssetManager is cached do return new AssetManager(self)
+       var asset_manager: AssetManager is lazy do return new AssetManager(self)
 
        # Get the native AssetsManager of the application, used to initialize the nit's AssetManager
        private fun assets: NativeAssetManager import native_activity in "Java" `{ return App_native_activity(recv).getAssets(); `}