1 # this file is part of NIT ( http://www.nitlanguage.org ).
3 # Copyright 2014 Romain Chanoir <romain.chanoir@viacesi.fr>
5 # Licensed under the Apache License, Version 2.0 (the "License");
6 # you may not use this file except in compliance with the License.
7 # You may obtain a copy of the License at
9 # http://www.apache.org/licenses/LICENSE-2.0
11 # Unless required by applicable law or agreed to in writing, software
12 # distributed under the License is distributed on an "AS IS" BASIS,
13 # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14 # See the License for the specific language governing permissions and
15 # limitations under the License.
17 # Android Assets and Resources Management
19 # Use the ResourceManager to retrieve resources from the `res` folder of your app
20 # Use the AssetManager to retrieve resources files from the `assets` folder of your app
21 # both are available from `App`
22 # If you write your own resources in your NIT project part of the application,
23 # you are obliged to set a string resource with the name "app_name" or it will be
24 # impossible for you to compile the apk correctly
25 module assets_and_resources
32 import android.content.res.AssetManager;
33 import android.content.res.AssetFileDescriptor;
34 import android.content.res.Resources;
35 import android.content.res.XmlResourceParser;
36 import java.io.IOException;
37 import android.graphics.Bitmap;
38 import android.graphics.BitmapFactory;
39 import android.graphics.drawable.Drawable;
40 import java.io.InputStream;
41 import android.util.Log;
42 import java.io.FileDescriptor;
45 # AssetManager from Java, used by `AssetManager` to access resources in `assets` app's directory
46 # This is a low-level class, use `AssetManager` instead
47 private extern class NativeAssetManager in "Java" `{ android.content.res.AssetManager `}
50 # Close this asset manager
51 fun close in "Java" `{ self.close(); `}
53 # Get the locales that this assets manager contains data for
54 fun get_locales
: Array[JavaString] import Array[JavaString], Array[JavaString].add
in "Java" `{
55 int arr = new_Array_of_JavaString();
56 for (String s : self.getLocales()) {
57 Array_of_JavaString_add(arr, s);
62 # String Array of all the assets at the given path
63 fun list
(path
: JavaString): Array[JavaString] import Array[JavaString], Array[JavaString].add
in "Java" `{
64 int arr = new_Array_of_JavaString();
66 for (String s : self.list(path)) {
67 Array_of_JavaString_add(arr, s);
69 }catch (IOException e) {
70 Log.e("Error retrieving the list of assets at 'path' ", e.getMessage());
76 # Open an asset using ACCESS_STREAMING mode
77 fun open
(file_name
: JavaString): NativeInputStream in "Java" `{
78 InputStream stream = null;
80 stream = self.open(file_name);
81 }catch (IOException e) {
82 Log.e("Error while opening " + file_name, e.getMessage());
88 # Open an asset and return it's file descriptor
89 fun open_fd
(file_name
: JavaString): NativeAssetFileDescriptor in "Java" `{
90 AssetFileDescriptor afd = null;
92 afd = self.openFd(file_name);
93 }catch(IOException e){
94 Log.e("Error while opening " + file_name, e.getMessage());
100 # Open a ,non-asset and return it's file descriptor
101 fun open_non_asset_fd
(file_name
: JavaString): NativeAssetFileDescriptor in "Java" `{
102 AssetFileDescriptor afd = null;
104 afd = self.openNonAssetFd(file_name);
105 }catch(IOException e){
106 Log.e("Error while opening " + file_name, e.getMessage());
113 redef fun new_global_ref
import sys
, Sys.jni_env
`{
114 Sys sys = NativeAssetManager_sys(self);
115 JNIEnv *env = Sys_jni_env(sys);
116 return (*env)->NewGlobalRef(env, self);
120 # Assets manager using a `NativeAssetManager` to manage android assets
123 # Native asset manager
124 private var native_assets_manager
: NativeAssetManager = app
.native_activity
.assets
.new_global_ref
is lazy
126 # Close this asset manager
127 fun close
do native_assets_manager
.close
129 # Get the locales that this assets manager contains data for
130 fun locales
: Array[String] do
131 var java_array
= native_assets_manager
.get_locales
132 var nit_array
= new Array[String]
133 for s
in java_array
do
134 nit_array
.add
(s
.to_s
)
139 # Return a string array of all the assets at the given path
140 fun list
(path
: String): Array[String] do
141 sys
.jni_env
.push_local_frame
(1)
142 var java_array
= native_assets_manager
.list
(path
.to_java_string
)
143 var nit_array
= new Array[String]
144 for s
in java_array
do
145 nit_array
.add
(s
.to_s
)
147 sys
.jni_env
.pop_local_frame
151 # Open an asset using ACCESS_STREAMING mode, returning a NativeInputStream
152 private fun open
(file_name
: String): NativeInputStream do
153 sys
.jni_env
.push_local_frame
(1)
154 var return_value
= native_assets_manager
.open
(file_name
.to_java_string
)
155 sys
.jni_env
.pop_local_frame
159 # Open an asset using it's name and returning a NativeAssetFileDescriptor
161 private fun open_fd
(file_name
: String): NativeAssetFileDescriptor do
162 sys
.jni_env
.push_local_frame
(1)
163 var return_value
= native_assets_manager
.open_fd
(file_name
.to_java_string
).new_global_ref
164 sys
.jni_env
.pop_local_frame
168 # Open a file that is not an asset returning a NativeAssetFileDescriptor
169 private fun open_non_asset_fd
(file_name
: String): NativeAssetFileDescriptor do
170 var return_value
= native_assets_manager
.open_non_asset_fd
(file_name
.to_java_string
)
174 # Return a bitmap from the assets
175 private fun bitmap
(name
: String): NativeBitmap do
176 sys
.jni_env
.push_local_frame
2
177 var return_value
= new NativeBitmap.from_stream
(native_assets_manager
.open
(name
.to_java_string
))
178 return return_value
.pop_from_local_frame
181 # Deallocate the global reference allocated by AssetManager
182 fun destroy
do self.native_assets_manager
.delete_global_ref
185 # Resource manager for android resources placed in the `res` folder of your app
186 # This is a low-level class, use `ResourcesManager` instead
187 private extern class NativeResources in "Java" `{ android.content.res.Resources `}
190 fun get_assets:NativeAssetManager in "Java" `{ return self.getAssets(); `}
191 fun get_color
(id
: Int): Int in "Java" `{ return self.getColor((int)id); `}
192 fun get_boolean(id: Int): Bool in "Java" `{ return self.getBoolean((int)id); `}
193 fun get_dimension
(id
: Int): Int in "Java" `{ return (int)self.getDimension((int)id); `}
194 fun get_drawable(id: Int): NativeDrawable in "Java" `{ return self.getDrawable((int)id); `}
195 fun get_identifier
(name
, def_type
, def_package
: JavaString): Int in "Java" `{ return self.getIdentifier(name, def_type, def_package); `}
196 fun get_integer(id: Int): Int in "Java" `{ return self.getInteger((int)id); `}
197 fun get_string
(id
: Int): JavaString in "Java" `{ return self.getString((int)id); `}
198 fun get_resource_entry_name(resid: Int): JavaString in "Java" `{ return self.getResourceEntryName((int)resid); `}
199 fun get_resource_name
(resid
: Int): JavaString in "Java" `{ return self.getResourceName((int)resid); `}
200 fun get_resource_pakage_name(resid: Int): JavaString in "Java" `{ return self.getResourcePackageName((int)resid); `}
201 fun get_resource_type_name
(resid
: Int): JavaString in "Java" `{ return self.getResourceTypeName((int)resid); `}
204 redef fun new_global_ref import sys, Sys.jni_env `{
205 Sys sys
= NativeResources_sys(self);
206 JNIEnv *env
= Sys_jni_env(sys
);
207 return (*env
)->NewGlobalRef(env
, self);
211 # Resource manager for android resources placed in the `res
` folder of your app
212 class ResourcesManager
214 private var android_resources: NativeResources
216 # The name of the app_package
217 private var app_package: String
219 private init native(res: NativeResources, app_package: String)
221 self.android_resources = res.new_global_ref
222 self.app_package = app_package
225 # Get a color from resources
226 fun color(name: String): Int do
227 sys.jni_env.push_local_frame(3)
228 var return_value = android_resources.get_color(android_resources.get_identifier(name.to_java_string, "color".to_java_string, app_package.to_java_string))
229 sys.jni_env.pop_local_frame
233 # Get a `Bool` from resources
234 fun boolean(name: String): Bool do
235 sys.jni_env.push_local_frame(3)
236 var return_value = android_resources.get_boolean(android_resources.get_identifier(name.to_java_string, "bool".to_java_string, app_package.to_java_string))
237 sys.jni_env.pop_local_frame
241 # Get a dimension from resources
242 # A dimension is specified with a number followed by a unit of measure
243 fun dimension(name: String): Int do
244 sys.jni_env.push_local_frame(3)
245 var return_value = android_resources.get_dimension(android_resources.get_identifier(name.to_java_string, "dimen".to_java_string, app_package.to_java_string))
246 sys.jni_env.pop_local_frame
250 # Get an `Integer` from resources
251 fun integer(name: String): Int do
252 sys.jni_env.push_local_frame(3)
253 var return_value = android_resources.get_integer(android_resources.get_identifier(name.to_java_string, "integer".to_java_string, app_package.to_java_string))
254 sys.jni_env.pop_local_frame
259 # Get a `String` from resources
260 fun string(name: String): String do
261 sys.jni_env.push_local_frame(3)
262 var return_value = android_resources.get_string(android_resources.get_identifier(name.to_java_string, "string".to_java_string, app_package.to_java_string)).to_s
263 sys.jni_env.pop_local_frame
267 # Get a resource ID from one resource in `res
/raw
`folder
268 # you may use this to retrieve the id of a sound for example
269 fun raw_id(name: String): Int do
270 sys.jni_env.push_local_frame(3)
271 var return_value = android_resources.get_identifier(name.to_java_string, "raw".to_java_string, app_package.to_java_string)
272 sys.jni_env.pop_local_frame
276 # Get a drawable from `res
/drawable
` folder
277 private fun drawable(name: String): NativeDrawable do
278 sys.jni_env.push_local_frame(3)
279 var return_value = android_resources.get_drawable(android_resources.get_identifier(name.to_java_string, "drawable".to_java_string, app_package.to_java_string))
280 sys.jni_env.pop_local_frame
284 # Get and ID from a specific resource in `res
/res_type
` folder
285 fun other_id(name, res_type: String): Int do
286 sys.jni_env.push_local_frame(3)
287 var return_value = android_resources.get_identifier(name.to_java_string, res_type.to_java_string, app_package.to_java_string)
288 sys.jni_env.pop_local_frame
292 # Deallocate global reference allocated by ResourcesManager
293 fun destroy do self.android_resources.delete_global_ref
296 # An android Bitmap, get an instance using the AssetManager or the ResourceManager
297 private extern class NativeBitmap in "Java" `{ android.graphics.Bitmap `}
300 # Create a NativeBitmap from a NativeInputStream retrieved with `open` function of the AssetManager
301 # Called by the AssetManager
302 new from_stream
(input_stream
: NativeInputStream) in "Java" `{ return BitmapFactory.decodeStream(input_stream); `}
304 # Create a NativeBitmap using a resource ID and the NativeResources
305 # Called by the ResourceManager
306 new from_resources(res: NativeResources, id: Int) in "Java" `{ return BitmapFactory.decodeResource(res, (int)id); `}
310 # Wraps Java: `int android.graphics.Bitmap.getWidth()`
311 fun width
: Int in "Java" `{ return self.getWidth(); `}
315 # Wraps Java: `int android
.graphics
.Bitmap.getHeight
()`
316 fun height: Int in "Java" `{ return self.getHeight(); `}
318 # Number of bytes per row
320 # Wraps Java: `int android.graphics.Bitmap.getRowBytes()`
321 fun row_bytes
: Int in "Java" `{
322 return self.getRowBytes();
325 # Does this bitmap has an alpha channel?
327 # Wraps Java: `boolean android.graphics.Bitmap.hasAlpha()`
328 fun has_alpha
: Bool in "Java" `{
329 return self.hasAlpha();
333 redef fun new_global_ref
import sys
, Sys.jni_env
`{
334 Sys sys = NativeBitmap_sys(self);
335 JNIEnv *env = Sys_jni_env(sys);
336 return (*env)->NewGlobalRef(env, self);
339 redef fun pop_from_local_frame_with_env
(jni_env
) `{
340 return (*jni_env)->PopLocalFrame(jni_env, self);
344 # Android AssetFileDescriptor, can be retrieve by AssetManager and used to load a sound in a SoundPool
345 extern class NativeAssetFileDescriptor in "Java" `{ android.content.res.AssetFileDescriptor `}
348 fun close in "Java" `{
351 }catch
(IOException e
){
355 fun create_input_stream: NativeFileInputStream in "Java" `{
357 return self.createInputStream
();
358 }catch
(IOException e
){
359 Log.e
("Error creating input_stream", e
.getMessage
());
364 fun create_output_stream: NativeFileOutputStream in "Java" `{
366 return self.createOutputStream
();
367 }catch
(IOException e
){
368 Log.e
("Error creating output stream", e
.getMessage
());
373 fun describe_contents: Int in "Java" `{ return (int)self.describeContents(); `}
374 fun declared_length
: Int in "Java" `{ return (int)self.getDeclaredLength(); `}
375 # fun extras: Bundle in "Java" `{ return self.getExtras(); `}
377 fun file_descriptor
: NativeFileDescriptor in "Java" `{
378 FileDescriptor fd = self.getFileDescriptor();
380 Log.e("AssetFileDesciptorError", "Can't retrieve the FileDescriptor of this AssetFileDescriptor");
385 fun length
: Int in "Java" `{ return (int)self.getLength(); `}
386 fun start_offset: Int in "Java" `{ return (int)self.getStartOffset(); `}
387 redef fun to_s
import JavaString.to_s
in "Java" `{ return JavaString_to_s(self.toString()); `}
390 redef fun new_global_ref import sys, Sys.jni_env `{
391 Sys sys
= NativeAssetFileDescriptor_sys(self);
392 JNIEnv *env
= Sys_jni_env(sys
);
393 return (*env
)->NewGlobalRef(env
, self);
397 # Native class representing something drawable, can be retrieved from the resources
398 # will be used by the GUI
399 private extern class NativeDrawable in "Java" `{ android.graphics.drawable.Drawable `}
403 # Resource Manager used to manage resources placed in the `res` folder of the app
404 var resource_manager
: ResourcesManager is lazy
do
405 var res
= native_activity
.resources
406 var pkg
= native_activity
.package_name
407 return new ResourcesManager.native
(res
, pkg
.to_s
)
410 # Assets Manager used to manage resources placed in the `assets` folder of the app
411 var asset_manager
: AssetManager is lazy
do return new AssetManager
414 redef extern class NativeActivity
416 # Get the native AssetsManager of the application, used to initialize the nit's AssetManager
417 private fun assets
: NativeAssetManager in "Java" `{
418 return self.getAssets();
421 # Get the package name of the application
422 private fun package_name
: JavaString in "Java" `{
423 return self.getPackageName();
426 # Get the native ResourceManager of the application, used to initialize the nit's ResourceManager
427 private fun resources
: NativeResources in "Java" `{
428 return self.getResources();