Skip to content

Commit 14afe7f

Browse files
author
Felix Oghină
committed
Merge pull request #3 from foghina/initandroid
react-native init should generate an android project
2 parents c62f0e5 + 6252031 commit 14afe7f

File tree

27 files changed

+159
-100
lines changed

27 files changed

+159
-100
lines changed

react-native-cli/generator-react-native-android/generators/app/index.js renamed to local-cli/generator-react-native-android/generators/app/index.js

Lines changed: 16 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,6 @@ var chalk = require('chalk');
44
var fs = require('fs');
55
var path = require('path');
66
var yeoman = require('yeoman-generator');
7-
var yosay = require('yosay');
87

98
function validatePackageName(name) {
109
if (!name.match(/^([a-zA-Z_$][a-zA-Z\d_$]*\.)+([a-zA-Z_$][a-zA-Z\d_$]*)$/)) {
@@ -18,9 +17,7 @@ module.exports = yeoman.generators.NamedBase.extend({
1817
var done = this.async();
1918

2019
// Have Yeoman greet the user.
21-
this.log(yosay(
22-
'Welcome to the ' + chalk.red('ReactNative') + ' Android app generator!'
23-
));
20+
this.log('Generating Android React Native app...');
2421

2522
this.prompt([{
2623
name: 'package',
@@ -52,16 +49,27 @@ module.exports = yeoman.generators.NamedBase.extend({
5249
'path when prompted.');
5350
return;
5451
}
52+
var templateParams = {
53+
package: this.props.package,
54+
appname: this.props.name,
55+
name: this.name,
56+
sdkdir: this.props.sdkdir
57+
};
5558
this.fs.copyTpl(
5659
this.templatePath(path.join('src', '**')),
57-
this.destinationPath(this.name),
58-
{package: this.props.package, appname: this.props.name, sdkdir: this.props.sdkdir}
60+
this.destinationRoot(),
61+
templateParams
5962
);
6063
this.fs.copy(
6164
this.templatePath(path.join('bin', '**')),
62-
this.destinationPath(this.name)
65+
this.destinationRoot()
66+
);
67+
var javaPath = path.join.apply(null, ['app', 'src', 'main', 'java'].concat(this.props.package.split('.')));
68+
this.fs.copyTpl(
69+
this.templatePath(path.join('package', '**')),
70+
this.destinationPath(javaPath),
71+
templateParams
6372
);
64-
// TODO: create app/src/main/java/com/package/RNActivity.java, update AndroidManifest.xml
6573
},
6674

6775
_error: function(message) {
Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
package <%= package %>;
2+
3+
import android.os.Bundle;
4+
5+
import com.facebook.react.shell.BaseReactActivity;
6+
7+
8+
public class RNActivity extends BaseReactActivity {
9+
10+
@Override
11+
protected void onCreate(Bundle savedInstanceState) {
12+
super.onCreate(savedInstanceState);
13+
loadApp("<%= name %>");
14+
}
15+
16+
@Override
17+
protected String getDefaultBundleName() {
18+
return "index.android.js";
19+
}
20+
21+
@Override
22+
protected String getDefaultMainModule() {
23+
return "<%= name %>";
24+
}
25+
26+
}
Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
apply plugin: 'com.android.application'
2+
apply plugin: 'com.facebook.react'
23

34
android {
45
compileSdkVersion 22
@@ -22,4 +23,5 @@ android {
2223
dependencies {
2324
compile fileTree(dir: 'libs', include: ['*.jar'])
2425
compile 'com.android.support:appcompat-v7:22.2.0'
26+
compile 'com.facebook.react:react:0.1'
2527
}
Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
2+
package="<%= package %>">
3+
4+
<application
5+
android:allowBackup="true"
6+
android:label="@string/app_name"
7+
android:icon="@mipmap/ic_launcher"
8+
android:theme="@style/AppTheme">
9+
<activity
10+
android:name=".RNActivity">
11+
<intent-filter>
12+
<action android:name="android.intent.action.MAIN" />
13+
<category android:name="android.intent.category.LAUNCHER" />
14+
</intent-filter>
15+
</activity>
16+
</application>
17+
18+
</manifest>

react-native-cli/generator-react-native-android/generators/app/templates/src/build.gradle renamed to local-cli/generator-react-native-android/generators/app/templates/src/build.gradle

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,10 +2,12 @@
22

33
buildscript {
44
repositories {
5+
mavenLocal()
56
jcenter()
67
}
78
dependencies {
89
classpath 'com.android.tools.build:gradle:1.2.3'
10+
classpath 'com.facebook.react:gradleplugin:1.0.+'
911

1012
// NOTE: Do not place your application dependencies here; they belong
1113
// in the individual module build.gradle files
@@ -14,6 +16,7 @@ buildscript {
1416

1517
allprojects {
1618
repositories {
19+
mavenLocal()
1720
jcenter()
1821
}
1922
}
Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
rootProject.name = '<%= appname %>'
2+
3+
include ':app'
Lines changed: 63 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,63 @@
1+
'use strict';
2+
3+
var path = require('path');
4+
var assert = require('yeoman-generator').assert;
5+
var helpers = require('yeoman-generator').test;
6+
var os = require('os');
7+
8+
describe('react-native-android:app', function () {
9+
before(function (done) {
10+
helpers.run(path.join(__dirname, '..', 'generators', 'app'))
11+
.withArguments(['TestApp'])
12+
.withPrompts({package: 'com.reactnative.test', name: 'Test App', sdkdir: '/path/to/sdk'})
13+
.on('end', done);
14+
});
15+
16+
it('creates files', function () {
17+
assert.file([
18+
'build.gradle',
19+
'gradle.properties',
20+
'gradlew.bat',
21+
'gradlew',
22+
'local.properties',
23+
'settings.gradle',
24+
path.join('app', 'build.gradle'),
25+
path.join('app', 'proguard-rules.pro'),
26+
path.join('app', 'src', 'main', 'AndroidManifest.xml'),
27+
path.join('app', 'src', 'main', 'java', 'com', 'reactnative', 'test', 'RNActivity.java'),
28+
path.join('app', 'src', 'main', 'res', 'mipmap-hdpi', 'ic_launcher.png'),
29+
path.join('app', 'src', 'main', 'res', 'mipmap-mdpi', 'ic_launcher.png'),
30+
path.join('app', 'src', 'main', 'res', 'mipmap-xhdpi', 'ic_launcher.png'),
31+
path.join('app', 'src', 'main', 'res', 'mipmap-xxhdpi', 'ic_launcher.png'),
32+
path.join('app', 'src', 'main', 'res', 'values', 'strings.xml'),
33+
path.join('app', 'src', 'main', 'res', 'values', 'styles.xml'),
34+
path.join('gradle', 'wrapper', 'gradle-wrapper.jar'),
35+
path.join('gradle', 'wrapper', 'gradle-wrapper.properties')
36+
]);
37+
});
38+
39+
it('replaces variables', function() {
40+
assert.fileContent('local.properties', 'sdk.dir=/path/to/sdk');
41+
assert.fileContent(path.join('app', 'build.gradle'), 'applicationId "com.reactnative.test"');
42+
assert.fileContent(
43+
path.join('app', 'src', 'main', 'AndroidManifest.xml'),
44+
'package="com.reactnative.test"'
45+
);
46+
assert.fileContent(
47+
path.join('app', 'src', 'main', 'AndroidManifest.xml'),
48+
'name=".RNActivity"'
49+
);
50+
assert.fileContent(
51+
path.join('app', 'src', 'main', 'java', 'com', 'reactnative', 'test', 'RNActivity.java'),
52+
'package com.reactnative.test;'
53+
);
54+
assert.fileContent(
55+
path.join('app', 'src', 'main', 'java', 'com', 'reactnative', 'test', 'RNActivity.java'),
56+
'loadApp("TestApp");'
57+
);
58+
assert.fileContent(
59+
path.join('app', 'src', 'main', 'res', 'values', 'strings.xml'),
60+
'<string name="app_name">Test App</string>'
61+
);
62+
});
63+
});

local-cli/init.js

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,14 @@
11
'use strict';
22

3+
var fs = require('fs');
34
var path = require('path');
45
var utils = require('./generator-utils');
56

67
function init(projectDir, appName) {
78
console.log('Setting up new React Native app in ' + projectDir);
89
var source = path.resolve(__dirname, '..', 'Examples/SampleApp');
910

11+
// copy iOS source
1012
utils.walk(source).forEach(function(f) {
1113
f = f.replace(source + '/', ''); // Strip off absolute path
1214
if (f === 'project.xcworkspace' || f.indexOf('.xcodeproj/xcuserdata') !== -1) {
@@ -28,6 +30,26 @@ function init(projectDir, appName) {
2830
);
2931
});
3032

33+
// generate Android source
34+
fs.mkdirSync(path.join(projectDir, 'android'));
35+
var oldCwd = process.cwd();
36+
process.chdir(path.join(projectDir, 'android'));
37+
38+
var yeoman = require('yeoman-environment');
39+
var env = yeoman.createEnv();
40+
var generatorPath = path.join(
41+
__dirname,
42+
'generator-react-native-android',
43+
'generators',
44+
'app',
45+
'index.js'
46+
);
47+
env.register(generatorPath, 'android:app');
48+
env.run(['android:app', appName], function() {
49+
process.chdir(oldCwd);
50+
});
51+
52+
3153
console.log('Next Steps:');
3254
console.log(' Open ' + path.resolve(projectDir, appName) + '.xcodeproj in Xcode');
3355
console.log(' Hit Run button');

package.json

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -72,12 +72,15 @@
7272
"wordwrap": "^1.0.0",
7373
"worker-farm": "^1.3.1",
7474
"ws": "0.4.31",
75-
"yargs": "1.3.2"
75+
"yargs": "1.3.2",
76+
"yeoman-environment": "^1.2.5",
77+
"yeoman-generator": "^0.20.1"
7678
},
7779
"devDependencies": {
7880
"jest-cli": "facebook/jest#0.5.x",
7981
"babel-eslint": "3.1.5",
8082
"eslint": "0.21.2",
81-
"eslint-plugin-react": "2.3.0"
83+
"eslint-plugin-react": "2.3.0",
84+
"mocha": "*"
8285
}
8386
}

react-native-cli/generator-react-native-android/generators/app/templates/bin/settings.gradle

Lines changed: 0 additions & 1 deletion
This file was deleted.

react-native-cli/generator-react-native-android/generators/app/templates/src/app/src/main/AndroidManifest.xml

Lines changed: 0 additions & 9 deletions
This file was deleted.

react-native-cli/generator-react-native-android/test/test-app.js

Lines changed: 0 additions & 56 deletions
This file was deleted.

react-native-cli/index.js

Lines changed: 0 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -45,24 +45,6 @@ if (cli) {
4545
process.exit(1);
4646
}
4747
break;
48-
case 'android':
49-
if (args[1]) {
50-
var yeoman = require('yeoman-environment');
51-
var env = yeoman.createEnv();
52-
var generatorPath = path.join(
53-
__dirname,
54-
'generator-react-native-android',
55-
'generators',
56-
'app',
57-
'index.js'
58-
);
59-
env.register(generatorPath, 'android:app');
60-
env.run(['android:app', args[1]]);
61-
} else {
62-
console.error('Usage: react-native android <ProjectName>');
63-
process.exit(1);
64-
}
65-
break;
6648
default:
6749
console.error(
6850
'Command `%s` unrecognized. ' +

react-native-cli/package.json

Lines changed: 1 addition & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -10,11 +10,6 @@
1010
"react-native": "index.js"
1111
},
1212
"dependencies": {
13-
"prompt": "^0.2.14",
14-
"yeoman-environment": "^1.2.5",
15-
"yeoman-generator": "^0.20.1"
16-
},
17-
"devDependencies": {
18-
"mocha": "*"
13+
"prompt": "^0.2.14"
1914
}
2015
}

0 commit comments

Comments
 (0)