11///<reference path="../.d.ts"/>
22import path = require( "path" ) ;
33import shell = require( "shelljs" ) ;
4+ import util = require( "util" ) ;
45import options = require( "./../options" ) ;
56import helpers = require( "./../common/helpers" ) ;
7+ import constants = require( "./../constants" ) ;
68
7- class AndroidProjectService implements IPlatformSpecificProjectService {
9+ class AndroidProjectService implements IPlatformProjectService {
810 constructor ( private $fs : IFileSystem ,
911 private $errors : IErrors ,
1012 private $logger : ILogger ,
@@ -23,26 +25,17 @@ class AndroidProjectService implements IPlatformSpecificProjectService {
2325
2426 public createProject ( projectRoot : string , frameworkDir : string ) : IFuture < void > {
2527 return ( ( ) => {
26- var packageName = this . $projectData . projectId ;
27- var packageAsPath = packageName . replace ( / \. / g, path . sep ) ;
28+ this . validateAndroidTarget ( frameworkDir ) ; // We need framework to be installed to validate android target so we can't call this method in validate()
2829
29- var validTarget = this . getTarget ( frameworkDir ) . wait ( ) ;
30- var output = this . $childProcess . exec ( 'android list targets' ) . wait ( ) ;
31- if ( ! output . match ( validTarget ) ) {
32- this . $errors . fail ( "Please install Android target %s the Android newest SDK). Make sure you have the latest Android tools installed as well. Run \"android\" from your command-line to install/update any missing SDKs or tools." ,
33- validTarget . split ( '-' ) [ 1 ] ) ;
34- }
30+ var paths = "assets gen libs res" . split ( ' ' ) . map ( p => path . join ( frameworkDir , p ) ) ;
31+ shell . cp ( "-r" , paths , projectRoot ) ;
3532
36- shell . cp ( "-r" , path . join ( frameworkDir , "assets" ) , projectRoot ) ;
37- shell . cp ( "-r" , path . join ( frameworkDir , "gen" ) , projectRoot ) ;
38- shell . cp ( "-r" , path . join ( frameworkDir , "libs" ) , projectRoot ) ;
39- shell . cp ( "-r" , path . join ( frameworkDir , "res" ) , projectRoot ) ;
40-
41- shell . cp ( "-f" , path . join ( frameworkDir , ".project" ) , projectRoot ) ;
42- shell . cp ( "-f" , path . join ( frameworkDir , "AndroidManifest.xml" ) , projectRoot ) ;
43- shell . cp ( "-f" , path . join ( frameworkDir , "project.properties" ) , projectRoot ) ;
33+ paths = ".project AndroidManifest.xml project.properties" . split ( ' ' ) . map ( p => path . join ( frameworkDir , p ) ) ;
34+ shell . cp ( "-f" , paths , projectRoot ) ;
4435
4536 // Create src folder
37+ var packageName = this . $projectData . projectId ;
38+ var packageAsPath = packageName . replace ( / \. / g, path . sep ) ;
4639 var activityDir = path . join ( projectRoot , 'src' , packageAsPath ) ;
4740 this . $fs . createDirectory ( activityDir ) . wait ( ) ;
4841
@@ -58,12 +51,39 @@ class AndroidProjectService implements IPlatformSpecificProjectService {
5851 shell . sed ( '-i' , / _ _ P A C K A G E _ _ / , this . $projectData . projectId , path . join ( projectRoot , "AndroidManifest.xml" ) ) ;
5952 }
6053
61- public executePlatformSpecificAction ( projectRoot : string ) {
54+ public afterCreateProject ( projectRoot : string ) {
6255 var targetApi = this . getTarget ( projectRoot ) . wait ( ) ;
6356 this . $logger . trace ( "Android target: %s" , targetApi ) ;
6457 this . runAndroidUpdate ( projectRoot , targetApi ) . wait ( ) ;
6558 }
6659
60+ public prepareProject ( normalizedPlatformName : string , platforms : string [ ] ) : IFuture < void > {
61+ return ( ( ) => {
62+ var platform = normalizedPlatformName . toLowerCase ( ) ;
63+ var assetsDirectoryPath = path . join ( this . $projectData . platformsDir , platform , "assets" ) ;
64+ var appResourcesDirectoryPath = path . join ( assetsDirectoryPath , constants . APP_FOLDER_NAME , constants . APP_RESOURCES_FOLDER_NAME ) ;
65+ shell . cp ( "-r" , path . join ( this . $projectData . projectDir , constants . APP_FOLDER_NAME ) , assetsDirectoryPath ) ;
66+
67+ if ( this . $fs . exists ( appResourcesDirectoryPath ) . wait ( ) ) {
68+ shell . cp ( "-r" , path . join ( appResourcesDirectoryPath , normalizedPlatformName , "*" ) , path . join ( this . $projectData . platformsDir , platform , "res" ) ) ;
69+ this . $fs . deleteDirectory ( appResourcesDirectoryPath ) . wait ( ) ;
70+ }
71+
72+ var files = helpers . enumerateFilesInDirectorySync ( path . join ( assetsDirectoryPath , constants . APP_FOLDER_NAME ) ) ;
73+ var platformsAsString = platforms . join ( "|" ) ;
74+
75+ _ . each ( files , fileName => {
76+ var platformInfo = AndroidProjectService . parsePlatformSpecificFileName ( path . basename ( fileName ) , platformsAsString ) ;
77+ var shouldExcludeFile = platformInfo && platformInfo . platform !== platform ;
78+ if ( shouldExcludeFile ) {
79+ this . $fs . deleteFile ( fileName ) . wait ( ) ;
80+ } else if ( platformInfo && platformInfo . onDeviceName ) {
81+ this . $fs . rename ( fileName , path . join ( path . dirname ( fileName ) , platformInfo . onDeviceName ) ) . wait ( ) ;
82+ }
83+ } ) ;
84+ } ) . future < void > ( ) ( ) ;
85+ }
86+
6787 public buildProject ( projectRoot : string ) : IFuture < void > {
6888 return ( ( ) => {
6989 var buildConfiguration = options . release ? "release" : "debug" ;
@@ -121,6 +141,15 @@ class AndroidProjectService implements IPlatformSpecificProjectService {
121141 }
122142 }
123143
144+ private validateAndroidTarget ( frameworkDir : string ) {
145+ var validTarget = this . getTarget ( frameworkDir ) . wait ( ) ;
146+ var output = this . $childProcess . exec ( 'android list targets' ) . wait ( ) ;
147+ if ( ! output . match ( validTarget ) ) {
148+ this . $errors . fail ( "Please install Android target %s the Android newest SDK). Make sure you have the latest Android tools installed as well. Run \"android\" from your command-line to install/update any missing SDKs or tools." ,
149+ validTarget . split ( '-' ) [ 1 ] ) ;
150+ }
151+ }
152+
124153 private getTarget ( projectRoot : string ) : IFuture < string > {
125154 return ( ( ) => {
126155 var projectPropertiesFilePath = path . join ( projectRoot , "project.properties" ) ;
@@ -167,5 +196,17 @@ class AndroidProjectService implements IPlatformSpecificProjectService {
167196 }
168197 } ) . future < void > ( ) ( ) ;
169198 }
199+
200+ private static parsePlatformSpecificFileName ( fileName : string , platforms : string ) : any {
201+ var regex = util . format ( "^(.+?)\.(%s)(\..+?)$" , platforms ) ;
202+ var parsed = fileName . toLowerCase ( ) . match ( new RegExp ( regex , "i" ) ) ;
203+ if ( parsed ) {
204+ return {
205+ platform : parsed [ 2 ] ,
206+ onDeviceName : parsed [ 1 ] + parsed [ 3 ]
207+ } ;
208+ }
209+ return undefined ;
210+ }
170211}
171212$injector . register ( "androidProjectService" , AndroidProjectService ) ;
0 commit comments