1
1
///<reference path="../.d.ts"/>
2
2
import path = require( "path" ) ;
3
3
import shell = require( "shelljs" ) ;
4
+ import util = require( "util" ) ;
4
5
import options = require( "./../options" ) ;
5
6
import helpers = require( "./../common/helpers" ) ;
7
+ import constants = require( "./../constants" ) ;
6
8
7
- class AndroidProjectService implements IPlatformSpecificProjectService {
9
+ class AndroidProjectService implements IPlatformProjectService {
8
10
constructor ( private $fs : IFileSystem ,
9
11
private $errors : IErrors ,
10
12
private $logger : ILogger ,
@@ -23,26 +25,17 @@ class AndroidProjectService implements IPlatformSpecificProjectService {
23
25
24
26
public createProject ( projectRoot : string , frameworkDir : string ) : IFuture < void > {
25
27
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()
28
29
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 ) ;
35
32
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 ) ;
44
35
45
36
// Create src folder
37
+ var packageName = this . $projectData . projectId ;
38
+ var packageAsPath = packageName . replace ( / \. / g, path . sep ) ;
46
39
var activityDir = path . join ( projectRoot , 'src' , packageAsPath ) ;
47
40
this . $fs . createDirectory ( activityDir ) . wait ( ) ;
48
41
@@ -58,12 +51,39 @@ class AndroidProjectService implements IPlatformSpecificProjectService {
58
51
shell . sed ( '-i' , / _ _ P A C K A G E _ _ / , this . $projectData . projectId , path . join ( projectRoot , "AndroidManifest.xml" ) ) ;
59
52
}
60
53
61
- public executePlatformSpecificAction ( projectRoot : string ) {
54
+ public afterCreateProject ( projectRoot : string ) {
62
55
var targetApi = this . getTarget ( projectRoot ) . wait ( ) ;
63
56
this . $logger . trace ( "Android target: %s" , targetApi ) ;
64
57
this . runAndroidUpdate ( projectRoot , targetApi ) . wait ( ) ;
65
58
}
66
59
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
+
67
87
public buildProject ( projectRoot : string ) : IFuture < void > {
68
88
return ( ( ) => {
69
89
var buildConfiguration = options . release ? "release" : "debug" ;
@@ -121,6 +141,15 @@ class AndroidProjectService implements IPlatformSpecificProjectService {
121
141
}
122
142
}
123
143
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
+
124
153
private getTarget ( projectRoot : string ) : IFuture < string > {
125
154
return ( ( ) => {
126
155
var projectPropertiesFilePath = path . join ( projectRoot , "project.properties" ) ;
@@ -167,5 +196,17 @@ class AndroidProjectService implements IPlatformSpecificProjectService {
167
196
}
168
197
} ) . future < void > ( ) ( ) ;
169
198
}
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
+ }
170
211
}
171
212
$injector . register ( "androidProjectService" , AndroidProjectService ) ;
0 commit comments