Merge: CI: macOS jobs for Gitlab CI
[nit.git] / lib / android / assets_and_resources.nit
index b759c30..2ca56d4 100644 (file)
@@ -52,7 +52,7 @@ private extern class NativeAssetManager in "Java" `{ android.content.res.AssetMa
 
        # Get the locales that this assets manager contains data for
        fun get_locales: Array[JavaString] import Array[JavaString], Array[JavaString].add in "Java" `{
-               int arr = new_Array_of_JavaString();
+               nit.app.NitObject arr = new_Array_of_JavaString();
                for (String s : self.getLocales()) {
                        Array_of_JavaString_add(arr, s);
                }
@@ -61,7 +61,7 @@ private extern class NativeAssetManager in "Java" `{ android.content.res.AssetMa
 
        # String Array of all the assets at the given path
        fun list(path: JavaString): Array[JavaString] import Array[JavaString], Array[JavaString].add  in "Java" `{
-               int arr = new_Array_of_JavaString();
+               nit.app.NitObject arr = new_Array_of_JavaString();
                try {
                        for (String s : self.list(path)) {
                                Array_of_JavaString_add(arr, s);
@@ -120,14 +120,8 @@ end
 # Assets manager using a `NativeAssetManager` to manage android assets
 class AssetManager
 
-       # App instance used to initalize the NativeAssetManager
-       var app: App
-
        # Native asset manager
-       private var native_assets_manager: NativeAssetManager is noinit
-
-       # Instanciate this AssetManager with the context of the app
-       init do self.native_assets_manager = app.assets.new_global_ref
+       private var native_assets_manager: NativeAssetManager = app.native_context.assets.new_global_ref is lazy
 
        # Close this asset manager
        fun close do native_assets_manager.close
@@ -144,7 +138,7 @@ class AssetManager
 
        # Return a string array of all the assets at the given path
        fun list(path: String): Array[String] do
-               sys.jni_env.push_local_frame(1)
+               sys.jni_env.push_local_frame(8)
                var java_array = native_assets_manager.list(path.to_java_string)
                var nit_array = new Array[String]
                for s in java_array do
@@ -156,16 +150,15 @@ class AssetManager
 
        # Open an asset using ACCESS_STREAMING mode, returning a NativeInputStream
        private fun open(file_name: String): NativeInputStream do
-               sys.jni_env.push_local_frame(1)
+               sys.jni_env.push_local_frame(2)
                var return_value =  native_assets_manager.open(file_name.to_java_string)
-               sys.jni_env.pop_local_frame
-               return return_value
+               return return_value.pop_from_local_frame
        end
 
        # Open an asset using it's name and returning a NativeAssetFileDescriptor
        # `file_name` is
        private fun open_fd(file_name: String): NativeAssetFileDescriptor do
-               sys.jni_env.push_local_frame(1)
+               sys.jni_env.push_local_frame(2)
                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
@@ -179,10 +172,9 @@ class AssetManager
 
        # Return a bitmap from the assets
        private 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)).new_global_ref
-               sys.jni_env.pop_local_frame
-               return return_value
+               sys.jni_env.push_local_frame 2
+               var return_value = new NativeBitmap.from_stream(native_assets_manager.open(name.to_java_string))
+               return return_value.pop_from_local_frame
        end
 
        # Deallocate the global reference allocated by AssetManager
@@ -225,8 +217,7 @@ class ResourcesManager
 
        private init native(res: NativeResources, app_package: String)
        do
-               self.android_resources = res.new_global_ref
-               self.app_package = app_package
+               init(res.new_global_ref, app_package)
        end
 
        # Get a color from resources
@@ -311,9 +302,35 @@ private 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, (int)id); `}
+
+       # Width in pixels
+       #
+       # Wraps Java: `int android.graphics.Bitmap.getWidth()`
        fun width: Int in "Java" `{ return self.getWidth(); `}
+
+       # Height in pixels
+       #
+       # Wraps Java: `int android.graphics.Bitmap.getHeight()`
        fun height: Int in "Java" `{ return self.getHeight(); `}
 
+       # Number of bytes per row
+       #
+       # Wraps Java: `int android.graphics.Bitmap.getRowBytes()`
+       fun row_bytes: Int in "Java" `{
+               return self.getRowBytes();
+       `}
+
+       # Does this bitmap has an alpha channel?
+       #
+       # Wraps Java: `boolean android.graphics.Bitmap.hasAlpha()`
+       fun has_alpha: Bool in "Java" `{
+               return self.hasAlpha();
+       `}
+
+       fun recycle in "Java" `{
+               self.recycle();
+       `}
+
        # HACK for bug #845
        redef fun new_global_ref import sys, Sys.jni_env `{
                Sys sys = NativeBitmap_sys(self);
@@ -321,6 +338,9 @@ private extern class NativeBitmap in "Java" `{ android.graphics.Bitmap `}
                return (*env)->NewGlobalRef(env, self);
        `}
 
+       redef fun pop_from_local_frame_with_env(jni_env) `{
+               return (*jni_env)->PopLocalFrame(jni_env, self);
+       `}
 end
 
 # Android AssetFileDescriptor, can be retrieve by AssetManager and used to load a sound in a SoundPool
@@ -356,7 +376,7 @@ extern class NativeAssetFileDescriptor in "Java" `{ android.content.res.AssetFil
        fun declared_length: Int in "Java" `{ return (int)self.getDeclaredLength(); `}
        # fun extras: Bundle in "Java" `{ return self.getExtras(); `}
 
-       fun  file_descriptor: NativeFileDescriptor in "Java" `{
+       fun file_descriptor: NativeFileDescriptor in "Java" `{
                FileDescriptor fd =  self.getFileDescriptor();
                if (fd == null) {
                        Log.e("AssetFileDesciptorError", "Can't retrieve the FileDescriptor of this AssetFileDescriptor");
@@ -383,17 +403,30 @@ end
 
 redef class App
        # Resource Manager used to manage resources placed in the `res` folder of the app
-       var resource_manager: ResourcesManager is lazy  do return new ResourcesManager.native(self.resources, self.package_name.to_s)
+       var resource_manager: ResourcesManager is lazy do
+               var res = native_context.resources
+               var pkg = native_context.package_name
+               return new ResourcesManager.native(res, pkg.to_s)
+       end
 
        # Assets Manager used to manage resources placed in the `assets` folder of the app
-       var asset_manager: AssetManager is lazy do return new AssetManager(self)
+       var asset_manager: AssetManager is lazy do return new AssetManager
+end
+
+redef extern class NativeContext
 
        # 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(self).getAssets(); `}
+       private fun assets: NativeAssetManager in "Java" `{
+               return self.getAssets();
+       `}
 
        # Get the package name of the application
-       private fun package_name: JavaString import native_activity in "Java" `{ return App_native_activity(self).getPackageName(); `}
+       private fun package_name: JavaString in "Java" `{
+               return self.getPackageName();
+       `}
 
        # Get the native ResourceManager of the application, used to initialize the nit's ResourceManager
-       private fun resources: NativeResources import native_activity in "Java" `{ return App_native_activity(self).getResources(); `}
+       private fun resources: NativeResources in "Java" `{
+               return self.getResources();
+       `}
 end