X-Git-Url: http://nitlanguage.org diff --git a/lib/android/assets_and_resources.nit b/lib/android/assets_and_resources.nit index 871c13c..40dace2 100644 --- a/lib/android/assets_and_resources.nit +++ b/lib/android/assets_and_resources.nit @@ -44,11 +44,13 @@ in "Java" `{ # AssetManager from Java, used by `AssetManager` to access resources in `assets` app's directory # This is a low-level class, use `AssetManager` instead -extern class NativeAssetManager in "Java" `{ android.content.res.AssetManager `} +private extern class NativeAssetManager in "Java" `{ android.content.res.AssetManager `} super JavaObject + # Close this asset manager fun close in "Java" `{ self.close(); `} + # 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(); for (String s : self.getLocales()) { @@ -57,6 +59,7 @@ extern class NativeAssetManager in "Java" `{ android.content.res.AssetManager `} return arr; `} + # 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(); try { @@ -70,42 +73,45 @@ extern class NativeAssetManager in "Java" `{ android.content.res.AssetManager `} return arr; `} + # Open an asset using ACCESS_STREAMING mode fun open(file_name: JavaString): NativeInputStream in "Java" `{ InputStream stream = null; try { stream = self.open(file_name); }catch (IOException e) { Log.e("Error while opening " + file_name, e.getMessage()); - e.printStackTrace(); + return null; } return stream; `} + # Open an asset and return it's file descriptor fun open_fd(file_name: JavaString): NativeAssetFileDescriptor in "Java" `{ AssetFileDescriptor afd = null; try { afd = self.openFd(file_name); }catch(IOException e){ Log.e("Error while opening " + file_name, e.getMessage()); - e.printStackTrace(); + return null; } return afd; `} + # Open a ,non-asset and return it's file descriptor fun open_non_asset_fd(file_name: JavaString): NativeAssetFileDescriptor in "Java" `{ AssetFileDescriptor afd = null; try { afd = self.openNonAssetFd(file_name); }catch(IOException e){ Log.e("Error while opening " + file_name, e.getMessage()); - e.printStackTrace(); + return null; } return afd; `} # HACK for bug #845 redef fun new_global_ref import sys, Sys.jni_env `{ - Sys sys = NativeResources_sys(self); + Sys sys = NativeAssetManager_sys(self); JNIEnv *env = Sys_jni_env(sys); return (*env)->NewGlobalRef(env, self); `} @@ -113,10 +119,9 @@ end # Assets manager using a `NativeAssetManager` to manage android assets class AssetManager - # Native asset manager - var native_assets_manager: NativeAssetManager - init(app: App) do self.native_assets_manager = app.assets.new_global_ref + # Native asset manager + 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 @@ -133,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 @@ -144,34 +149,32 @@ class AssetManager end # Open an asset using ACCESS_STREAMING mode, returning a NativeInputStream - fun open(file_name: String): NativeInputStream do - sys.jni_env.push_local_frame(1) + private fun open(file_name: String): NativeInputStream do + 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 - fun open_fd(file_name: String): NativeAssetFileDescriptor do - sys.jni_env.push_local_frame(1) + private fun open_fd(file_name: String): NativeAssetFileDescriptor do + 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 end # Open a file that is not an asset returning a NativeAssetFileDescriptor - fun open_non_asset_fd(file_name: String): NativeAssetFileDescriptor do + private fun open_non_asset_fd(file_name: String): NativeAssetFileDescriptor do var return_value = native_assets_manager.open_non_asset_fd(file_name.to_java_string) return return_value end # 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)).new_global_ref - sys.jni_env.pop_local_frame - return return_value + private fun bitmap(name: String): NativeBitmap do + 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 @@ -180,7 +183,7 @@ end # Resource manager for android resources placed in the `res` folder of your app # This is a low-level class, use `ResourcesManager` instead -extern class NativeResources in "Java" `{ android.content.res.Resources `} +private extern class NativeResources in "Java" `{ android.content.res.Resources `} super JavaObject fun get_assets:NativeAssetManager in "Java" `{ return self.getAssets(); `} @@ -207,15 +210,14 @@ end # Resource manager for android resources placed in the `res` folder of your app class ResourcesManager # Native resources - var android_resources: NativeResources + private var android_resources: NativeResources # The name of the app_package - var app_package: String + private var app_package: String - init(res: NativeResources, app_package: String) + 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 @@ -270,7 +272,7 @@ class ResourcesManager end # Get a drawable from `res/drawable` folder - fun drawable(name: String): NativeDrawable do + private fun drawable(name: String): NativeDrawable do sys.jni_env.push_local_frame(3) var return_value = android_resources.get_drawable(android_resources.get_identifier(name.to_java_string, "drawable".to_java_string, app_package.to_java_string)) sys.jni_env.pop_local_frame @@ -290,7 +292,7 @@ class ResourcesManager end # An android Bitmap, get an instance using the AssetManager or the ResourceManager -extern class NativeBitmap in "Java" `{ android.graphics.Bitmap `} +private extern class NativeBitmap in "Java" `{ android.graphics.Bitmap `} super JavaObject # Create a NativeBitmap from a NativeInputStream retrieved with `open` function of the AssetManager @@ -300,16 +302,41 @@ 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(); + `} + # HACK for bug #845 redef fun new_global_ref import sys, Sys.jni_env `{ - Sys sys = NativeResources_sys(self); + Sys sys = NativeBitmap_sys(self); JNIEnv *env = Sys_jni_env(sys); 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 @@ -345,7 +372,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"); @@ -355,11 +382,11 @@ extern class NativeAssetFileDescriptor in "Java" `{ android.content.res.AssetFil fun length: Int in "Java" `{ return (int)self.getLength(); `} fun start_offset: Int in "Java" `{ return (int)self.getStartOffset(); `} - redef fun to_s: String import JavaString.to_s in "Java" `{ return JavaString_to_s(self.toString()); `} + redef fun to_s import JavaString.to_s in "Java" `{ return JavaString_to_s(self.toString()); `} # HACK for bug #845 redef fun new_global_ref import sys, Sys.jni_env `{ - Sys sys = NativeResources_sys(self); + Sys sys = NativeAssetFileDescriptor_sys(self); JNIEnv *env = Sys_jni_env(sys); return (*env)->NewGlobalRef(env, self); `} @@ -367,22 +394,35 @@ end # Native class representing something drawable, can be retrieved from the resources # will be used by the GUI -extern class NativeDrawable in "Java" `{ android.graphics.drawable.Drawable `} +private extern class NativeDrawable in "Java" `{ android.graphics.drawable.Drawable `} 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(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