2015-07-15 08:34:16 +02:00
#!/usr/bin/python
import lutin . module as module
import lutin . tools as tools
import lutin . debug as debug
import os
import lutin . multiprocess as lutinMultiprocess
2015-10-14 21:21:03 +02:00
def get_type ( ) :
return " LIBRARY "
2015-07-15 08:34:16 +02:00
def get_desc ( ) :
return " gale is a main library to use widget in the openGl environement and manage all the wraping os "
2015-10-14 21:21:03 +02:00
def get_licence ( ) :
return " APACHE-2 "
2015-07-15 08:34:16 +02:00
2015-10-14 21:21:03 +02:00
def get_compagny_type ( ) :
return " com "
def get_compagny_name ( ) :
return " atria-soft "
def get_maintainer ( ) :
return [ " Mr DUPIN Edouard <yui.heero@gmail.com> " ]
def get_version ( ) :
2016-08-30 22:54:57 +02:00
return [ 0 , 6 , " dev " ]
2015-10-14 21:21:03 +02:00
def create ( target , module_name ) :
my_module = module . Module ( __file__ , module_name , get_type ( ) )
2015-09-24 21:44:04 +02:00
my_module . add_extra_compile_flags ( )
2015-07-15 08:34:16 +02:00
# add the file to compile:
2015-09-24 21:44:04 +02:00
my_module . add_src_file ( [
2016-08-07 22:49:40 +02:00
' gale/gale.cpp ' ,
' gale/debug.cpp ' ,
' gale/Dimension.cpp ' ,
' gale/orientation.cpp ' ,
' gale/Application.cpp ' ,
' gale/Thread.cpp ' ,
] )
2015-09-24 21:44:04 +02:00
my_module . add_header_file ( [
2016-08-07 22:49:40 +02:00
' gale/debug.h ' ,
' gale/gale.h ' ,
' gale/Dimension.h ' ,
' gale/orientation.h ' ,
' gale/Application.h ' ,
' gale/Thread.h ' ,
] )
2015-10-14 21:21:03 +02:00
# context:
2015-09-24 21:44:04 +02:00
my_module . add_src_file ( [
2016-08-07 22:49:40 +02:00
' gale/context/clipBoard.cpp ' ,
' gale/context/commandLine.cpp ' ,
' gale/context/Context.cpp ' ,
' gale/context/cursor.cpp ' ,
] )
2015-09-24 21:44:04 +02:00
my_module . add_header_file ( [
2016-08-07 22:49:40 +02:00
' gale/context/clipBoard.h ' ,
' gale/context/commandLine.h ' ,
' gale/context/Context.h ' ,
' gale/context/cursor.h ' ,
' gale/context/Fps.h '
] )
2015-07-15 08:34:16 +02:00
if target . name == " Linux " :
2015-09-24 21:44:04 +02:00
my_module . add_src_file ( ' gale/context/X11/Context.cpp ' )
2015-08-24 22:15:26 +02:00
# check if egami is present in the worktree: this is for the icon parsing ...
2015-09-24 21:44:04 +02:00
my_module . add_optionnal_module_depend ( ' egami ' , [ " c++ " , " -DGALE_BUILD_EGAMI " ] )
2015-07-15 08:34:16 +02:00
elif target . name == " Windows " :
2015-09-24 21:44:04 +02:00
my_module . add_src_file ( ' gale/context/Windows/Context.cpp ' )
2015-07-15 08:34:16 +02:00
elif target . name == " Android " :
2015-09-24 21:44:04 +02:00
my_module . add_src_file ( ' gale/context/Android/Context.cpp ' )
my_module . add_src_file ( [
2016-08-07 22:49:40 +02:00
' android/src/org/gale/GaleCallback.java ' ,
' android/src/org/gale/GaleConstants.java ' ,
' android/src/org/gale/Gale.java ' ,
' android/src/org/gale/GaleRendererGL.java ' ,
' android/src/org/gale/GaleSurfaceViewGL.java ' ,
' android/src/org/gale/GaleActivity.java ' ,
' android/src/org/gale/GaleWallpaper.java ' ,
' org.gale.GaleConstants.javah '
] )
2015-09-24 21:44:04 +02:00
my_module . add_path ( tools . get_current_path ( __file__ ) + ' /android/src/ ' , type = ' java ' )
2015-07-15 08:34:16 +02:00
elif target . name == " MacOs " :
2015-09-24 21:44:04 +02:00
my_module . add_src_file ( [
2016-08-07 22:49:40 +02:00
' gale/context/MacOs/Context.mm ' ,
' gale/context/MacOs/Interface.mm ' ,
' gale/context/MacOs/Windows.mm ' ,
' gale/context/MacOs/OpenglView.mm ' ,
' gale/context/MacOs/AppDelegate.mm '
] )
2015-07-15 08:34:16 +02:00
elif target . name == " IOs " :
2015-09-24 21:44:04 +02:00
my_module . add_src_file ( [
2016-08-07 22:49:40 +02:00
' gale/context/IOs/Context.cpp ' ,
' gale/context/IOs/Interface.m ' ,
' gale/context/IOs/OpenglView.mm ' ,
' gale/context/IOs/AppDelegate.mm '
] )
2015-07-15 08:34:16 +02:00
else :
debug . error ( " unknow mode... " )
2015-10-14 21:21:03 +02:00
# Key properties:
2015-09-24 21:44:04 +02:00
my_module . add_src_file ( [
2016-08-07 22:49:40 +02:00
' gale/key/keyboard.cpp ' ,
' gale/key/Special.cpp ' ,
' gale/key/status.cpp ' ,
' gale/key/type.cpp '
] )
2015-09-24 21:44:04 +02:00
my_module . add_header_file ( [
2016-08-07 22:49:40 +02:00
' gale/key/keyboard.h ' ,
' gale/key/Special.h ' ,
' gale/key/status.h ' ,
' gale/key/type.h ' ,
' gale/key/key.h '
] )
2015-10-14 21:21:03 +02:00
# OpenGL interface:
2015-09-24 21:44:04 +02:00
my_module . add_src_file ( [
2016-08-07 22:49:40 +02:00
' gale/renderer/openGL/openGL.cpp '
] )
2015-09-24 21:44:04 +02:00
my_module . add_header_file ( [
2016-08-07 22:49:40 +02:00
' gale/renderer/openGL/openGL.h ' ,
' gale/renderer/openGL/openGL-include.h '
] )
2015-10-14 21:21:03 +02:00
# resources:
2015-09-24 21:44:04 +02:00
my_module . add_src_file ( [
2016-08-07 22:49:40 +02:00
' gale/resource/Manager.cpp ' ,
' gale/resource/Program.cpp ' ,
' gale/resource/Resource.cpp ' ,
' gale/resource/Shader.cpp ' ,
' gale/resource/Texture.cpp ' ,
' gale/resource/VirtualBufferObject.cpp '
] )
2015-09-24 21:44:04 +02:00
my_module . add_header_file ( [
2016-08-07 22:49:40 +02:00
' gale/resource/Manager.h ' ,
' gale/resource/Program.h ' ,
' gale/resource/Resource.h ' ,
' gale/resource/Shader.h ' ,
' gale/resource/Texture.h ' ,
' gale/resource/VirtualBufferObject.h '
] )
my_module . add_module_depend ( [
' etk ' ,
' opengl '
] )
2016-03-22 22:18:16 +01:00
my_module . add_optionnal_module_depend ( ' esignal ' , [ " c++ " , " -DGALE_BUILD_ESIGNAL " ] )
my_module . add_optionnal_module_depend ( ' eproperty ' , [ " c++ " , " -DGALE_BUILD_EPROPERTY " ] )
2015-09-24 21:44:04 +02:00
my_module . add_path ( tools . get_current_path ( __file__ ) )
2015-10-14 21:21:03 +02:00
2015-09-24 21:44:04 +02:00
my_module . compile_flags ( ' c++ ' , [
2016-08-07 22:49:40 +02:00
" -DGALE_VERSION= \" \\ \" " + tools . version_to_string ( get_version ( ) ) + " \\ \" \" "
] )
2015-07-15 08:34:16 +02:00
if target . name == " Linux " :
2016-08-07 22:49:40 +02:00
pass
2015-07-15 08:34:16 +02:00
elif target . name == " Android " :
2015-09-24 21:44:04 +02:00
my_module . add_module_depend ( [ " SDK " , " jvm-basics " ] )
2015-07-15 08:34:16 +02:00
# add tre creator of the basic java class ...
2015-09-18 21:29:53 +02:00
target . add_action ( " BINARY " , 50 , " gale-auto-wrapper " , tool_generate_main_java_class )
2015-07-15 08:34:16 +02:00
# TODO : Add the same for BINARY to create a console interface ?
elif target . name == " Windows " :
2016-08-07 22:49:40 +02:00
#my_module.add_module_depend("glew")
pass
2015-07-15 08:34:16 +02:00
elif target . name == " MacOs " :
2015-09-24 21:44:04 +02:00
my_module . add_export_flag ( ' link ' , [
2016-08-07 22:49:40 +02:00
" -framework Cocoa " ,
" -framework QuartzCore " ,
" -framework AppKit "
] )
2015-07-15 08:34:16 +02:00
elif target . name == " IOs " :
2015-09-24 21:44:04 +02:00
my_module . add_export_flag ( ' link ' , [
2016-08-07 22:49:40 +02:00
" -framework CoreGraphics " ,
" -framework UIKit " ,
" -framework GLKit " ,
" -framework Foundation " ,
" -framework QuartzCore "
] )
2015-07-15 08:34:16 +02:00
2015-09-24 21:44:04 +02:00
return my_module
2015-07-15 08:34:16 +02:00
##################################################################
##
## Android specific section
##
##################################################################
def tool_generate_main_java_class ( target , module , package_name ) :
file_list = [ ]
debug . debug ( " ------------------------------------------------------------------------ " )
2015-11-02 21:35:08 +01:00
debug . debug ( " Generate android wrapping for ' " + package_name + " ' ==> ' " + target . convert_name_application ( package_name ) + " ' " )
2015-07-15 08:34:16 +02:00
debug . debug ( " ------------------------------------------------------------------------ " )
2015-11-02 21:35:08 +01:00
application_name = target . convert_name_application ( package_name )
2015-07-15 08:34:16 +02:00
if target . config [ " mode " ] == " debug " :
application_name + = " debug "
2015-09-18 21:29:53 +02:00
target . path_java_project = target . get_build_path ( package_name ) \
2015-07-15 08:34:16 +02:00
+ " /src/ " \
+ module . package_prop [ " COMPAGNY_TYPE " ] \
+ " / " + module . package_prop [ " COMPAGNY_NAME2 " ] \
+ " / " + application_name + " / "
2015-09-18 21:29:53 +02:00
java_file_wrapper = target . path_java_project + " / " + application_name + " .java "
2015-07-15 08:34:16 +02:00
android_package_name = module . package_prop [ " COMPAGNY_TYPE " ] + " . " + module . package_prop [ " COMPAGNY_NAME2 " ] + " . " + application_name
debug . print_element ( " pkg " , " absractionFile " , " <== " , " dynamic file " )
2015-09-18 21:29:53 +02:00
# Create path :
2015-07-15 08:34:16 +02:00
tools . create_directory_of_file ( java_file_wrapper )
debug . debug ( " create file : ' " + java_file_wrapper + " ' " )
# Create file :
tmpFile = open ( java_file_wrapper + " _tmp " , ' w ' )
tmpFile . write ( " /** \n " )
tmpFile . write ( " * @author Edouard DUPIN, Kevin BILLONNEAU \n " )
tmpFile . write ( " * @copyright 2011, Edouard DUPIN, all right reserved \n " )
tmpFile . write ( " * @license APACHE v2.0 (see license file) \n " )
tmpFile . write ( " * @note This file is autogenerate ==> see documantation to generate your own \n " )
tmpFile . write ( " */ \n " )
tmpFile . write ( " package " + android_package_name + " ; \n " )
tmpFile . write ( " import android.util.Log; \n " )
if module . package_prop [ " ANDROID_APPL_TYPE " ] == " APPL " :
tmpFile . write ( " import org.gale.GaleActivity; \n " )
else :
tmpFile . write ( " import org.gale.GaleWallpaper; \n " )
tmpFile . write ( " \n " )
if " GENERATE_SECTION__IMPORT " in module . package_prop :
for elem in module . package_prop [ " GENERATE_SECTION__IMPORT " ] :
for line in elem :
tmpFile . write ( line + " \n " )
if module . package_prop [ " ANDROID_APPL_TYPE " ] == " APPL " :
tmpFile . write ( " public class " + application_name + " extends GaleActivity { \n " )
else :
tmpFile . write ( " public class " + application_name + " extends GaleWallpaper { \n " )
tmpFile . write ( " public static final String SHARED_PREFS_NAME = \" " + application_name + " settings \" ; \n " )
if " GENERATE_SECTION__DECLARE " in module . package_prop :
for elem in module . package_prop [ " GENERATE_SECTION__DECLARE " ] :
for line in elem :
tmpFile . write ( " " + line + " \n " )
tmpFile . write ( " \n " )
tmpFile . write ( " static { \n " )
tmpFile . write ( " try { \n " )
tmpFile . write ( " System.loadLibrary( \" " + package_name + " \" ); \n " )
tmpFile . write ( " } catch (UnsatisfiedLinkError e) { \n " )
tmpFile . write ( " Log.e( \" " + application_name + " \" , \" error getting lib(): \" + e); \n " )
tmpFile . write ( " } \n " )
tmpFile . write ( " } \n " )
tmpFile . write ( " \n " )
if module . package_prop [ " ANDROID_APPL_TYPE " ] != " APPL " :
tmpFile . write ( " public Engine onCreateEngine() { \n " )
tmpFile . write ( " Engine tmpEngine = super.onCreateEngine(); \n " )
2015-09-18 21:29:53 +02:00
tmpFile . write ( " initApkPath( \" " + module . package_prop [ " COMPAGNY_TYPE " ] + " \" , \" " + module . package_prop [ " COMPAGNY_NAME2 " ] + " \" , \" " + application_name + " \" , \" " + package_name + " \" ); \n " )
2015-07-15 08:34:16 +02:00
tmpFile . write ( " return tmpEngine; \n " )
tmpFile . write ( " } \n " )
if " GENERATE_SECTION__CONSTRUCTOR " in module . package_prop :
tmpFile . write ( " public " + application_name + " () { \n " )
for elem in module . package_prop [ " GENERATE_SECTION__CONSTRUCTOR " ] :
for line in elem :
tmpFile . write ( " " + line + " \n " )
tmpFile . write ( " } \n " )
tmpFile . write ( " public void onCreate(android.os.Bundle savedInstanceState) { \n " )
tmpFile . write ( " super.onCreate(savedInstanceState); \n " )
2015-09-18 21:29:53 +02:00
tmpFile . write ( " initApkPath( \" " + module . package_prop [ " COMPAGNY_TYPE " ] + " \" , \" " + module . package_prop [ " COMPAGNY_NAME2 " ] + " \" , \" " + application_name + " \" , \" " + package_name + " \" ); \n " )
2015-07-15 08:34:16 +02:00
if " GENERATE_SECTION__ON_CREATE " in module . package_prop :
for elem in module . package_prop [ " GENERATE_SECTION__ON_CREATE " ] :
for line in elem :
tmpFile . write ( " " + line + " \n " )
tmpFile . write ( " } \n " )
if " GENERATE_SECTION__ON_START " in module . package_prop :
tmpFile . write ( " @Override protected void onStart() { \n " )
for elem in module . package_prop [ " GENERATE_SECTION__ON_START " ] :
for line in elem :
tmpFile . write ( " " + line + " \n " )
tmpFile . write ( " super.onStart(); \n " )
tmpFile . write ( " } \n " )
if " GENERATE_SECTION__ON_RESTART " in module . package_prop :
tmpFile . write ( " @Override protected void onRestart() { \n " )
for elem in module . package_prop [ " GENERATE_SECTION__ON_RESTART " ] :
for line in elem :
tmpFile . write ( " " + line + " \n " )
tmpFile . write ( " super.onRestart(); \n " )
tmpFile . write ( " } \n " )
if " GENERATE_SECTION__ON_RESUME " in module . package_prop :
tmpFile . write ( " @Override protected void onResume() { \n " )
tmpFile . write ( " super.onResume(); \n " )
for elem in module . package_prop [ " GENERATE_SECTION__ON_RESUME " ] :
for line in elem :
tmpFile . write ( " " + line + " \n " )
tmpFile . write ( " } \n " )
if " GENERATE_SECTION__ON_PAUSE " in module . package_prop :
tmpFile . write ( " @Override protected void onPause() { \n " )
for elem in module . package_prop [ " GENERATE_SECTION__ON_PAUSE " ] :
for line in elem :
tmpFile . write ( " " + line + " \n " )
tmpFile . write ( " super.onPause(); \n " )
tmpFile . write ( " } \n " )
if " GENERATE_SECTION__ON_STOP " in module . package_prop :
tmpFile . write ( " @Override protected void onStop() { \n " )
for elem in module . package_prop [ " GENERATE_SECTION__ON_STOP " ] :
for line in elem :
tmpFile . write ( " " + line + " \n " )
tmpFile . write ( " super.onStop(); \n " )
tmpFile . write ( " } \n " )
if " GENERATE_SECTION__ON_DESTROY " in module . package_prop :
tmpFile . write ( " @Override protected void onDestroy() { \n " )
for elem in module . package_prop [ " GENERATE_SECTION__ON_DESTROY " ] :
for line in elem :
tmpFile . write ( " " + line + " \n " )
tmpFile . write ( " super.onDestroy(); \n " )
tmpFile . write ( " } \n " )
tmpFile . write ( " } \n " )
tmpFile . flush ( )
tmpFile . close ( )
tools . move_if_needed ( java_file_wrapper + " _tmp " , java_file_wrapper ) ;
# add java file to build:
module . add_src_file ( [ java_file_wrapper ] )
"""
## todo:
2015-09-18 21:29:53 +02:00
tools . create_directory_of_file ( target . get_staging_path ( package_name ) + " /res/drawable/icon.png " ) ;
2015-07-15 08:34:16 +02:00
if " ICON " in module . package_prop . keys ( ) \
and module . package_prop [ " ICON " ] != " " :
2015-09-18 21:29:53 +02:00
image . resize ( module . package_prop [ " ICON " ] , target . get_staging_path ( package_name ) + " /res/drawable/icon.png " , 256 , 256 )
2015-07-15 08:34:16 +02:00
else :
# to be sure that we have all time a resource ...
2015-09-18 21:29:53 +02:00
tmpFile = open ( target . get_staging_path ( package_name ) + " /res/drawable/plop.txt " , ' w ' )
2015-07-15 08:34:16 +02:00
tmpFile . write ( ' plop \n ' )
tmpFile . flush ( )
tmpFile . close ( )
"""
if module . package_prop [ " ANDROID_MANIFEST " ] == " " :
# force manifest file:
2015-09-18 21:29:53 +02:00
module . package_prop [ " ANDROID_MANIFEST " ] = target . get_build_path ( package_name ) + " /AndroidManifest.xml " ;
2015-07-15 08:34:16 +02:00
debug . debug ( " create file: ' " + module . package_prop [ " ANDROID_MANIFEST " ] + " ' " )
if " VERSION_CODE " not in module . package_prop :
module . package_prop [ " VERSION_CODE " ] = " 1 "
debug . print_element ( " pkg " , " AndroidManifest.xml " , " <== " , " package configurations " )
tools . create_directory_of_file ( module . package_prop [ " ANDROID_MANIFEST " ] )
tmpFile = open ( module . package_prop [ " ANDROID_MANIFEST " ] , ' w ' )
tmpFile . write ( ' <?xml version= " 1.0 " encoding= " utf-8 " ?> \n ' )
tmpFile . write ( ' <!-- Manifest is autoGenerated with Gale ... do not patch it--> \n ' )
tmpFile . write ( ' <manifest xmlns:android= " http://schemas.android.com/apk/res/android " \n ' )
tmpFile . write ( ' package= " ' + android_package_name + ' " \n ' )
2015-11-02 21:35:08 +01:00
if module . package_prop [ " VERSION_CODE " ] == ' ' :
debug . warning ( " Missing application ' VERSION_CODE ' ==> set it at ' 0 ' (this can creata an NON update on android play store) " )
module . package_prop [ " VERSION_CODE " ] = " 0 "
tmpFile . write ( ' android:versionCode= " ' + str ( module . package_prop [ " VERSION_CODE " ] ) + ' " \n ' )
2015-10-21 22:12:18 +02:00
tmpFile . write ( ' android:versionName= " ' + tools . version_to_string ( module . package_prop [ " VERSION " ] ) + ' " > \n ' )
2015-07-15 08:34:16 +02:00
tmpFile . write ( ' <uses-feature android:glEsVersion= " 0x00020000 " android:required= " true " /> \n ' )
2015-10-30 21:25:22 +01:00
tmpFile . write ( ' <uses-sdk android:minSdkVersion= " ' + str ( target . board_id ) + ' " \n ' )
tmpFile . write ( ' android:targetSdkVersion= " ' + str ( target . board_id ) + ' " /> \n ' )
2015-07-15 08:34:16 +02:00
if module . package_prop [ " ANDROID_APPL_TYPE " ] == " APPL " :
tmpFile . write ( ' <application android:label= " ' + application_name + ' " \n ' )
if " ICON " in module . package_prop . keys ( ) :
tmpFile . write ( ' android:icon= " @drawable/icon " \n ' )
if target . config [ " mode " ] == " debug " :
tmpFile . write ( ' android:debuggable= " true " \n ' )
tmpFile . write ( ' > \n ' )
if " ADMOD_ID " in module . package_prop :
tmpFile . write ( ' <meta-data android:name= " com.google.android.gms.version " \n ' )
tmpFile . write ( ' android:value= " @integer/google_play_services_version " /> \n ' )
tmpFile . write ( ' <activity android:name= " . ' + application_name + ' " \n ' )
tmpFile . write ( ' android:label= " ' + module . package_prop [ ' NAME ' ] )
if target . config [ " mode " ] == " debug " :
tmpFile . write ( " -debug " )
tmpFile . write ( ' " \n ' )
if " ICON " in module . package_prop . keys ( ) :
tmpFile . write ( ' android:icon= " @drawable/icon " \n ' )
tmpFile . write ( ' android:hardwareAccelerated= " true " \n ' )
tmpFile . write ( ' android:configChanges= " keyboard|keyboardHidden|orientation|screenSize " > \n ' )
tmpFile . write ( ' <intent-filter> \n ' )
tmpFile . write ( ' <action android:name= " android.intent.action.MAIN " /> \n ' )
tmpFile . write ( ' <category android:name= " android.intent.category.LAUNCHER " /> \n ' )
tmpFile . write ( ' </intent-filter> \n ' )
tmpFile . write ( ' </activity> \n ' )
if " ADMOD_ID " in module . package_prop :
tmpFile . write ( ' <activity android:name= " com.google.android.gms.ads.AdActivity " \n ' )
tmpFile . write ( ' android:configChanges= " keyboard|keyboardHidden|orientation|screenLayout|uiMode|screenSize|smallestScreenSize " /> \n ' )
tmpFile . write ( ' </application> \n ' )
else :
tmpFile . write ( ' <application android:label= " ' + application_name + ' " \n ' )
tmpFile . write ( ' android:permission= " android.permission.BIND_WALLPAPER " \n ' )
if " ICON " in module . package_prop . keys ( ) :
tmpFile . write ( ' android:icon= " @drawable/icon " \n ' )
tmpFile . write ( ' > \n ' )
tmpFile . write ( ' <service android:name= " . ' + application_name + ' " \n ' )
tmpFile . write ( ' android:label= " ' + module . package_prop [ ' NAME ' ] )
if target . config [ " mode " ] == " debug " :
tmpFile . write ( " -debug " )
tmpFile . write ( ' " \n ' )
if " ICON " in module . package_prop . keys ( ) :
tmpFile . write ( ' android:icon= " @drawable/icon " \n ' )
tmpFile . write ( ' > \n ' )
tmpFile . write ( ' <intent-filter> \n ' )
tmpFile . write ( ' <action android:name= " android.service.wallpaper.WallpaperService " /> \n ' )
tmpFile . write ( ' </intent-filter> \n ' )
tmpFile . write ( ' <meta-data android:name= " android.service.wallpaper " \n ' )
tmpFile . write ( ' android:resource= " @xml/ ' + application_name + ' _resource " /> \n ' )
tmpFile . write ( ' </service> \n ' )
if len ( module . package_prop [ " ANDROID_WALLPAPER_PROPERTIES " ] ) != 0 :
tmpFile . write ( ' <activity android:label= " Setting " \n ' )
tmpFile . write ( ' android:name= " . ' + application_name + ' Settings " \n ' )
tmpFile . write ( ' android:theme= " @android:style/Theme.Light.WallpaperSettings " \n ' )
tmpFile . write ( ' android:exported= " true " \n ' )
if " ICON " in module . package_prop . keys ( ) :
tmpFile . write ( ' android:icon= " @drawable/icon " \n ' )
tmpFile . write ( ' > \n ' )
tmpFile . write ( ' </activity> \n ' )
tmpFile . write ( ' </application> \n ' )
# write package autorisations :
if True == target . check_right_package ( module . package_prop , " WRITE_EXTERNAL_STORAGE " ) :
tmpFile . write ( ' <permission android:name= " android.permission.WRITE_EXTERNAL_STORAGE " /> \n ' )
tmpFile . write ( ' <uses-permission android:name= " android.permission.WRITE_EXTERNAL_STORAGE " /> \n ' )
if True == target . check_right_package ( module . package_prop , " CAMERA " ) :
tmpFile . write ( ' <permission android:name= " android.permission.CAMERA " /> \n ' )
tmpFile . write ( ' <uses-permission android:name= " android.permission.CAMERA " /> \n ' )
if True == target . check_right_package ( module . package_prop , " INTERNET " ) :
tmpFile . write ( ' <permission android:name= " android.permission.INTERNET " /> \n ' )
tmpFile . write ( ' <uses-permission android:name= " android.permission.INTERNET " /> \n ' )
if True == target . check_right_package ( module . package_prop , " ACCESS_NETWORK_STATE " ) :
tmpFile . write ( ' <permission android:name= " android.permission.ACCESS_NETWORK_STATE " /> \n ' )
tmpFile . write ( ' <uses-permission android:name= " android.permission.ACCESS_NETWORK_STATE " /> \n ' )
if True == target . check_right_package ( module . package_prop , " MODIFY_AUDIO_SETTINGS " ) :
tmpFile . write ( ' <permission android:name= " android.permission.MODIFY_AUDIO_SETTINGS " /> \n ' )
tmpFile . write ( ' <uses-permission android:name= " android.permission.MODIFY_AUDIO_SETTINGS " /> \n ' )
if True == target . check_right_package ( module . package_prop , " READ_CALENDAR " ) :
tmpFile . write ( ' <permission android:name= " android.permission.READ_CALENDAR " /> \n ' )
tmpFile . write ( ' <uses-permission android:name= " android.permission.READ_CALENDAR " /> \n ' )
if True == target . check_right_package ( module . package_prop , " READ_CONTACTS " ) :
tmpFile . write ( ' <permission android:name= " android.permission.READ_CONTACTS " /> \n ' )
tmpFile . write ( ' <uses-permission android:name= " android.permission.READ_CONTACTS " /> \n ' )
if True == target . check_right_package ( module . package_prop , " READ_FRAME_BUFFER " ) :
tmpFile . write ( ' <permission android:name= " android.permission.READ_FRAME_BUFFER " /> \n ' )
tmpFile . write ( ' <uses-permission android:name= " android.permission.READ_FRAME_BUFFER " /> \n ' )
if True == target . check_right_package ( module . package_prop , " READ_PROFILE " ) :
tmpFile . write ( ' <permission android:name= " android.permission.READ_PROFILE " /> \n ' )
tmpFile . write ( ' <uses-permission android:name= " android.permission.READ_PROFILE " /> \n ' )
if True == target . check_right_package ( module . package_prop , " RECORD_AUDIO " ) :
tmpFile . write ( ' <permission android:name= " android.permission.RECORD_AUDIO " /> \n ' )
tmpFile . write ( ' <uses-permission android:name= " android.permission.RECORD_AUDIO " /> \n ' )
if True == target . check_right_package ( module . package_prop , " SET_ORIENTATION " ) :
tmpFile . write ( ' <permission android:name= " android.permission.SET_ORIENTATION " /> \n ' )
tmpFile . write ( ' <uses-permission android:name= " android.permission.SET_ORIENTATION " /> \n ' )
if True == target . check_right_package ( module . package_prop , " VIBRATE " ) :
tmpFile . write ( ' <permission android:name= " android.permission.VIBRATE " /> \n ' )
tmpFile . write ( ' <uses-permission android:name= " android.permission.VIBRATE " /> \n ' )
if True == target . check_right_package ( module . package_prop , " ACCESS_COARSE_LOCATION " ) :
tmpFile . write ( ' <permission android:name= " android.permission.ACCESS_COARSE_LOCATION " /> \n ' )
tmpFile . write ( ' <uses-permission android:name= " android.permission.ACCESS_COARSE_LOCATION " /> \n ' )
if True == target . check_right_package ( module . package_prop , " ACCESS_FINE_LOCATION " ) :
tmpFile . write ( ' <permission android:name= " android.permission.ACCESS_FINE_LOCATION " /> \n ' )
tmpFile . write ( ' <uses-permission android:name= " android.permission.ACCESS_FINE_LOCATION " /> \n ' )
tmpFile . write ( ' </manifest> \n \n ' )
tmpFile . flush ( )
tmpFile . close ( )
# end generating android manifest
if module . package_prop [ " ANDROID_APPL_TYPE " ] != " APPL " :
#create the Wallpaper sub files : (main element for the application
debug . print_element ( " pkg " , application_name + " _resource.xml " , " <== " , " package configurations " )
2015-09-18 21:29:53 +02:00
tools . create_directory_of_file ( target . get_build_path ( package_name ) + " /res/xml/ " + application_name + " _resource.xml " )
tmpFile = open ( target . get_build_path ( package_name ) + " /res/xml/ " + application_name + " _resource.xml " , ' w ' )
2015-07-15 08:34:16 +02:00
tmpFile . write ( " <?xml version= \" 1.0 \" encoding= \" utf-8 \" ?> \n " )
tmpFile . write ( " <wallpaper xmlns:android= \" http://schemas.android.com/apk/res/android \" \n " )
if len ( module . package_prop [ " ANDROID_WALLPAPER_PROPERTIES " ] ) != 0 :
tmpFile . write ( " android:settingsActivity= \" " + android_package_name + " . " + application_name + " Settings \" \n " )
if " ICON " in module . package_prop . keys ( ) :
tmpFile . write ( " android:thumbnail= \" @drawable/icon \" \n " )
tmpFile . write ( " /> \n " )
tmpFile . flush ( )
tmpFile . close ( )
# create wallpaper setting if needed (class and config file)
if len ( module . package_prop [ " ANDROID_WALLPAPER_PROPERTIES " ] ) != 0 :
2015-09-18 21:29:53 +02:00
tools . create_directory_of_file ( target . path_java_project + application_name + " Settings.java " )
debug . print_element ( " pkg " , target . path_java_project + application_name + " Settings.java " , " <== " , " package configurations " )
tmpFile = open ( target . path_java_project + application_name + " Settings.java " , ' w ' ) ;
2015-07-15 08:34:16 +02:00
tmpFile . write ( " package " + android_package_name + " ; \n " )
tmpFile . write ( " \n " )
tmpFile . write ( " import " + android_package_name + " .R; \n " )
tmpFile . write ( " \n " )
tmpFile . write ( " import android.content.SharedPreferences; \n " )
tmpFile . write ( " import android.os.Bundle; \n " )
tmpFile . write ( " import android.preference.PreferenceActivity; \n " )
tmpFile . write ( " \n " )
tmpFile . write ( " public class " + application_name + " Settings extends PreferenceActivity implements SharedPreferences.OnSharedPreferenceChangeListener \n " )
tmpFile . write ( " { \n " )
tmpFile . write ( " @Override protected void onCreate(Bundle icicle) { \n " )
tmpFile . write ( " super.onCreate(icicle); \n " )
tmpFile . write ( " getPreferenceManager().setSharedPreferencesName( " + application_name + " .SHARED_PREFS_NAME); \n " )
tmpFile . write ( " addPreferencesFromResource(R.xml. " + application_name + " _settings); \n " )
tmpFile . write ( " getPreferenceManager().getSharedPreferences().registerOnSharedPreferenceChangeListener(this); \n " )
tmpFile . write ( " } \n " )
tmpFile . write ( " @Override protected void onResume() { \n " )
tmpFile . write ( " super.onResume(); \n " )
tmpFile . write ( " } \n " )
tmpFile . write ( " @Override protected void onDestroy() { \n " )
tmpFile . write ( " getPreferenceManager().getSharedPreferences().unregisterOnSharedPreferenceChangeListener(this); \n " )
tmpFile . write ( " super.onDestroy(); \n " )
tmpFile . write ( " } \n " )
tmpFile . write ( " public void onSharedPreferenceChanged(SharedPreferences sharedPreferences,String key) { } \n " )
tmpFile . write ( " } \n " )
tmpFile . flush ( )
tmpFile . close ( )
2015-09-18 21:29:53 +02:00
debug . print_element ( " pkg " , target . get_build_path ( package_name ) + " /res/xml/ " + application_name + " _settings.xml " , " <== " , " package configurations " )
tools . create_directory_of_file ( target . get_build_path ( package_name ) + " /res/xml/ " + application_name + " _settings.xml " )
tmpFile = open ( target . get_build_path ( package_name ) + " /res/xml/ " + application_name + " _settings.xml " , ' w ' ) ;
2015-07-15 08:34:16 +02:00
tmpFile . write ( " <?xml version= \" 1.0 \" encoding= \" utf-8 \" ?> \n " )
tmpFile . write ( " <PreferenceScreen xmlns:android= \" http://schemas.android.com/apk/res/android \" \n " )
tmpFile . write ( " android:title= \" Settings \" \n " )
tmpFile . write ( " android:key= \" " + application_name + " _settings \" > \n " )
WALL_haveArray = False
for WALL_type , WALL_key , WALL_title , WALL_summary , WALL_other in module . package_prop [ " ANDROID_WALLPAPER_PROPERTIES " ] :
debug . info ( " find : ' " + WALL_type + " ' " ) ;
if WALL_type == " list " :
debug . info ( " create : LIST " ) ;
tmpFile . write ( " <ListPreference android:key= \" " + application_name + " _ " + WALL_key + " \" \n " )
tmpFile . write ( " android:title= \" " + WALL_title + " \" \n " )
tmpFile . write ( " android:summary= \" " + WALL_summary + " \" \n " )
tmpFile . write ( " android:entries= \" @array/ " + application_name + " _ " + WALL_key + " _names \" \n " )
tmpFile . write ( " android:entryValues= \" @array/ " + application_name + " _ " + WALL_key + " _prefix \" /> \n " )
WALL_haveArray = True
elif WALL_type == " bool " :
debug . info ( " create : CHECKBOX " ) ;
tmpFile . write ( " <CheckBoxPreference android:key= \" " + application_name + " _ " + WALL_key + " \" \n " )
tmpFile . write ( " android:title= \" " + WALL_title + " \" \n " )
tmpFile . write ( " android:summary= \" " + WALL_summary + " \" \n " )
tmpFile . write ( " android:summaryOn= \" " + WALL_other [ 0 ] + " \" \n " )
tmpFile . write ( " android:summaryOff= \" " + WALL_other [ 1 ] + " \" /> \n " )
tmpFile . write ( " </PreferenceScreen> \n " )
tmpFile . flush ( )
tmpFile . close ( )
if WALL_haveArray == True :
for WALL_type , WALL_key , WALL_title , WALL_summary , WALL_other in module . package_prop [ " ANDROID_WALLPAPER_PROPERTIES " ] :
if WALL_type == " list " :
2015-09-18 21:29:53 +02:00
debug . print_element ( " pkg " , target . get_build_path ( package_name ) + " /res/values/ " + WALL_key + " .xml " , " <== " , " package configurations " )
tools . create_directory_of_file ( target . get_build_path ( package_name ) + " /res/values/ " + WALL_key + " .xml " )
tmpFile = open ( target . get_build_path ( package_name ) + " /res/values/ " + WALL_key + " .xml " , ' w ' ) ;
2015-07-15 08:34:16 +02:00
tmpFile . write ( " <?xml version= \" 1.0 \" encoding= \" utf-8 \" ?> \n " )
tmpFile . write ( " <resources xmlns:xliff= \" urn:oasis:names:tc:xliff:document:1.2 \" > \n " )
tmpFile . write ( " <string-array name= \" " + application_name + " _ " + WALL_key + " _names \" > \n " )
for WALL_subKey , WALL_display in WALL_other :
tmpFile . write ( " <item> " + WALL_display + " </item> \n " )
tmpFile . write ( " </string-array> \n " )
tmpFile . write ( " <string-array name= \" " + application_name + " _ " + WALL_key + " _prefix \" > \n " )
for WALL_subKey , WALL_display in WALL_other :
tmpFile . write ( " <item> " + WALL_subKey + " </item> \n " )
tmpFile . write ( " </string-array> \n " )
tmpFile . write ( " </resources> \n " )
tmpFile . flush ( )
tmpFile . close ( )
"""
#add properties on wallpaper :
2015-09-24 21:44:04 +02:00
# my_module.pkg_add("ANDROID_WALLPAPER_PROPERTIES", ["list", key, title, summary, [["key","value display"],["key2","value display 2"]])
# my_module.pkg_add("ANDROID_WALLPAPER_PROPERTIES", ["list", "testpattern", "Select test pattern", "Choose which test pattern to display", [["key","value display"],["key2","value display 2"]]])
# my_module.pkg_add("ANDROID_WALLPAPER_PROPERTIES", ["bool", key, title, summary, ["enable string", "disable String"])
# my_module.pkg_add("ANDROID_WALLPAPER_PROPERTIES", ["bool", "movement", "Motion", "Apply movement to test pattern", ["Moving test pattern", "Still test pattern"]
2015-07-15 08:34:16 +02:00
#copy needed resources :
for res_source , res_dest in module . package_prop [ " ANDROID_RESOURCES " ] :
if res_source == " " :
continue
2015-09-18 21:29:53 +02:00
tools . copy_file ( res_source , target . get_staging_path ( package_name ) + " /res/ " + res_dest + " / " + os . path . basename ( res_source ) , force = True )
2015-07-15 08:34:16 +02:00
"""
"""
# Doc :
# http://asantoso.wordpress.com/2009/09/15/how-to-build-android-application-package-apk-from-the-command-line-using-the-sdk-tools-continuously-integrated-using-cruisecontrol/
debug . print_element ( " pkg " , " R.java " , " <== " , " Resources files " )
2015-09-18 21:29:53 +02:00
tools . create_directory_of_file ( target . get_staging_path ( package_name ) + " /src/noFile " )
androidToolPath = target . path_sdk + " /build-tools/ "
2015-07-15 08:34:16 +02:00
# find android tool version
2015-09-18 21:29:53 +02:00
dirnames = tools . get_list_sub_path ( androidToolPath )
2015-07-15 08:34:16 +02:00
if len ( dirnames ) != 1 :
debug . error ( " an error occured when getting the tools for android " )
androidToolPath + = dirnames [ 0 ] + " / "
2015-09-18 21:29:53 +02:00
adModResoucepath = " "
2015-07-15 08:34:16 +02:00
if " ADMOD_ID " in module . package_prop :
2015-09-18 21:29:53 +02:00
adModResoucepath = " -S " + target . path_sdk + " /extras/google/google_play_services/libproject/google-play-services_lib/res/ "
2015-07-15 08:34:16 +02:00
cmdLine = androidToolPath + " aapt p -f " \
2015-09-18 21:29:53 +02:00
+ " -M " + target . get_staging_path ( package_name ) + " /AndroidManifest.xml " \
+ " -F " + target . get_staging_path ( package_name ) + " /resources.res " \
2015-10-30 21:25:22 +01:00
+ " -I " + target . path_sdk + " /platforms/android- " + str ( target . board_id ) + " /android.jar " \
2015-09-18 21:29:53 +02:00
+ " -S " + target . get_staging_path ( package_name ) + " /res/ " \
+ adModResoucepath \
+ " -J " + target . get_staging_path ( package_name ) + " /src/ "
2015-07-15 08:34:16 +02:00
multiprocess . run_command ( cmdLine )
#aapt package -f -M ${manifest.file} -F ${packaged.resource.file} -I ${path.to.android-jar.library}
2015-09-18 21:29:53 +02:00
# -S ${android-resource-directory} [-m -J ${path.to.output.the.R.java}]
2015-07-15 08:34:16 +02:00
2015-09-18 21:29:53 +02:00
tools . create_directory_of_file ( target . get_staging_path ( package_name ) + " /build/classes/noFile " )
2015-07-15 08:34:16 +02:00
debug . print_element ( " pkg " , " *.class " , " <== " , " *.java " )
# more information with : -Xlint
# + java_file_wrapper + " "\ # this generate ex: out/Android/debug/staging/tethys/src/com/edouarddupin/tethys/edn.java
#generate android java files:
filesString = " "
for element in module . package_prop [ " ANDROID_JAVA_FILES " ] :
if element == " DEFAULT " :
2015-09-18 21:29:53 +02:00
filesString + = target . path_gale + " /android/src/org/gale/GaleAudioTask.java "
filesString + = target . path_gale + " /android/src/org/gale/GaleCallback.java "
filesString + = target . path_gale + " /android/src/org/gale/GaleConstants.java "
filesString + = target . path_gale + " /android/src/org/gale/Gale.java "
filesString + = target . path_gale + " /android/src/org/gale/GaleRendererGL.java "
filesString + = target . path_gale + " /android/src/org/gale/GaleSurfaceViewGL.java "
filesString + = target . path_gale + " /android/src/org/gale/GaleActivity.java "
filesString + = target . path_gale + " /android/src/org/gale/GaleWallpaper.java "
2015-07-15 08:34:16 +02:00
else :
filesString + = element + " "
if " ADMOD_ID " in module . package_prop :
2015-09-18 21:29:53 +02:00
filesString + = target . path_sdk + " /extras/google/google_play_services/libproject/google-play-services_lib/src/android/UnusedStub.java "
2015-07-15 08:34:16 +02:00
if len ( module . package_prop [ " ANDROID_WALLPAPER_PROPERTIES " ] ) != 0 :
2015-09-18 21:29:53 +02:00
filesString + = target . path_java_project + application_name + " Settings.java "
2015-07-15 08:34:16 +02:00
adModJarFile = " "
if " ADMOD_ID " in module . package_prop :
2015-09-18 21:29:53 +02:00
adModJarFile = " : " + target . path_sdk + " /extras/google/google_play_services/libproject/google-play-services_lib/libs/google-play-services.jar "
2015-07-15 08:34:16 +02:00
cmdLine = " javac " \
2015-09-18 21:29:53 +02:00
+ " -d " + target . get_staging_path ( package_name ) + " /build/classes " \
2015-10-30 21:25:22 +01:00
+ " -classpath " + target . path_sdk + " /platforms/android- " + str ( target . board_id ) + " /android.jar " \
2015-07-15 08:34:16 +02:00
+ adModJarFile + " " \
+ filesString \
+ java_file_wrapper + " " \
2015-09-18 21:29:53 +02:00
+ target . get_staging_path ( package_name ) + " /src/R.java "
2015-07-15 08:34:16 +02:00
multiprocess . run_command ( cmdLine )
debug . print_element ( " pkg " , " .dex " , " <== " , " *.class " )
cmdLine = androidToolPath + " dx " \
+ " --dex --no-strict " \
2015-09-18 21:29:53 +02:00
+ " --output= " + target . get_staging_path ( package_name ) + " /build/ " + application_name + " .dex " \
+ target . get_staging_path ( package_name ) + " /build/classes/ "
2015-07-15 08:34:16 +02:00
if " ADMOD_ID " in module . package_prop :
2015-09-18 21:29:53 +02:00
cmdLine + = target . path_sdk + " /extras/google/google_play_services/libproject/google-play-services_lib/libs/google-play-services.jar "
2015-07-15 08:34:16 +02:00
multiprocess . run_command ( cmdLine )
"""
return { " files " : file_list }