Build the Android tutorial app by gradle
diff --git a/java/android/.gitignore b/java/android/.gitignore
new file mode 100644
index 0000000..6345b76
--- /dev/null
+++ b/java/android/.gitignore
@@ -0,0 +1,21 @@
+.gradle
+/local.properties
+/gradle.properties
+/.idea/workspace.xml
+/.idea/libraries
+.DS_Store
+/build
+.idea/
+
+*.iml
+*.apk
+*.ap_
+*.dex
+*.class
+bin/
+gen/
+.gradle/
+/*/build/
+local.properties
+proguard/
+*.log
diff --git a/java/android/GreeterGrpc.java b/java/android/GreeterGrpc.java
deleted file mode 100644
index eaef367..0000000
--- a/java/android/GreeterGrpc.java
+++ /dev/null
@@ -1,184 +0,0 @@
-package io.grpc.examples;
-
-import static io.grpc.stub.Calls.createMethodDescriptor;
-import static io.grpc.stub.Calls.asyncUnaryCall;
-import static io.grpc.stub.Calls.asyncServerStreamingCall;
-import static io.grpc.stub.Calls.asyncClientStreamingCall;
-import static io.grpc.stub.Calls.duplexStreamingCall;
-import static io.grpc.stub.Calls.blockingUnaryCall;
-import static io.grpc.stub.Calls.blockingServerStreamingCall;
-import static io.grpc.stub.Calls.unaryFutureCall;
-import static io.grpc.stub.ServerCalls.createMethodDefinition;
-import static io.grpc.stub.ServerCalls.asyncUnaryRequestCall;
-import static io.grpc.stub.ServerCalls.asyncStreamingRequestCall;
-
-import java.io.IOException;
-
-public class GreeterGrpc {
-
- private static final io.grpc.stub.Method<io.grpc.examples.Helloworld.HelloRequest,
- io.grpc.examples.Helloworld.HelloReply> METHOD_SAY_HELLO =
- io.grpc.stub.Method.create(
- io.grpc.MethodType.UNARY, "SayHello",
- io.grpc.nano.NanoUtils.<io.grpc.examples.Helloworld.HelloRequest>marshaller(
- new io.grpc.nano.Parser<io.grpc.examples.Helloworld.HelloRequest>() {
- @Override
- public io.grpc.examples.Helloworld.HelloRequest parse(com.google.protobuf.nano.CodedInputByteBufferNano input) throws IOException {
- return io.grpc.examples.Helloworld.HelloRequest.parseFrom(input);
- }
- }),
- io.grpc.nano.NanoUtils.<io.grpc.examples.Helloworld.HelloReply>marshaller(
- new io.grpc.nano.Parser<io.grpc.examples.Helloworld.HelloReply>() {
- @Override
- public io.grpc.examples.Helloworld.HelloReply parse(com.google.protobuf.nano.CodedInputByteBufferNano input) throws IOException {
- return io.grpc.examples.Helloworld.HelloReply.parseFrom(input);
- }
- }));
-
- public static GreeterStub newStub(io.grpc.Channel channel) {
- return new GreeterStub(channel, CONFIG);
- }
-
- public static GreeterBlockingStub newBlockingStub(
- io.grpc.Channel channel) {
- return new GreeterBlockingStub(channel, CONFIG);
- }
-
- public static GreeterFutureStub newFutureStub(
- io.grpc.Channel channel) {
- return new GreeterFutureStub(channel, CONFIG);
- }
-
- public static final GreeterServiceDescriptor CONFIG =
- new GreeterServiceDescriptor();
-
- public static class GreeterServiceDescriptor extends
- io.grpc.stub.AbstractServiceDescriptor<GreeterServiceDescriptor> {
- public final io.grpc.MethodDescriptor<io.grpc.examples.Helloworld.HelloRequest,
- io.grpc.examples.Helloworld.HelloReply> sayHello;
-
- private GreeterServiceDescriptor() {
- sayHello = createMethodDescriptor(
- "helloworld.Greeter", METHOD_SAY_HELLO);
- }
-
- private GreeterServiceDescriptor(
- java.util.Map<java.lang.String, io.grpc.MethodDescriptor<?, ?>> methodMap) {
- sayHello = (io.grpc.MethodDescriptor<io.grpc.examples.Helloworld.HelloRequest,
- io.grpc.examples.Helloworld.HelloReply>) methodMap.get(
- CONFIG.sayHello.getName());
- }
-
- @java.lang.Override
- protected GreeterServiceDescriptor build(
- java.util.Map<java.lang.String, io.grpc.MethodDescriptor<?, ?>> methodMap) {
- return new GreeterServiceDescriptor(methodMap);
- }
-
- @java.lang.Override
- public com.google.common.collect.ImmutableList<io.grpc.MethodDescriptor<?, ?>> methods() {
- return com.google.common.collect.ImmutableList.<io.grpc.MethodDescriptor<?, ?>>of(
- sayHello);
- }
- }
-
- public static interface Greeter {
-
- public void sayHello(io.grpc.examples.Helloworld.HelloRequest request,
- io.grpc.stub.StreamObserver<io.grpc.examples.Helloworld.HelloReply> responseObserver);
- }
-
- public static interface GreeterBlockingClient {
-
- public io.grpc.examples.Helloworld.HelloReply sayHello(io.grpc.examples.Helloworld.HelloRequest request);
- }
-
- public static interface GreeterFutureClient {
-
- public com.google.common.util.concurrent.ListenableFuture<io.grpc.examples.Helloworld.HelloReply> sayHello(
- io.grpc.examples.Helloworld.HelloRequest request);
- }
-
- public static class GreeterStub extends
- io.grpc.stub.AbstractStub<GreeterStub, GreeterServiceDescriptor>
- implements Greeter {
- private GreeterStub(io.grpc.Channel channel,
- GreeterServiceDescriptor config) {
- super(channel, config);
- }
-
- @java.lang.Override
- protected GreeterStub build(io.grpc.Channel channel,
- GreeterServiceDescriptor config) {
- return new GreeterStub(channel, config);
- }
-
- @java.lang.Override
- public void sayHello(io.grpc.examples.Helloworld.HelloRequest request,
- io.grpc.stub.StreamObserver<io.grpc.examples.Helloworld.HelloReply> responseObserver) {
- asyncUnaryCall(
- channel.newCall(config.sayHello), request, responseObserver);
- }
- }
-
- public static class GreeterBlockingStub extends
- io.grpc.stub.AbstractStub<GreeterBlockingStub, GreeterServiceDescriptor>
- implements GreeterBlockingClient {
- private GreeterBlockingStub(io.grpc.Channel channel,
- GreeterServiceDescriptor config) {
- super(channel, config);
- }
-
- @java.lang.Override
- protected GreeterBlockingStub build(io.grpc.Channel channel,
- GreeterServiceDescriptor config) {
- return new GreeterBlockingStub(channel, config);
- }
-
- @java.lang.Override
- public io.grpc.examples.Helloworld.HelloReply sayHello(io.grpc.examples.Helloworld.HelloRequest request) {
- return blockingUnaryCall(
- channel.newCall(config.sayHello), request);
- }
- }
-
- public static class GreeterFutureStub extends
- io.grpc.stub.AbstractStub<GreeterFutureStub, GreeterServiceDescriptor>
- implements GreeterFutureClient {
- private GreeterFutureStub(io.grpc.Channel channel,
- GreeterServiceDescriptor config) {
- super(channel, config);
- }
-
- @java.lang.Override
- protected GreeterFutureStub build(io.grpc.Channel channel,
- GreeterServiceDescriptor config) {
- return new GreeterFutureStub(channel, config);
- }
-
- @java.lang.Override
- public com.google.common.util.concurrent.ListenableFuture<io.grpc.examples.Helloworld.HelloReply> sayHello(
- io.grpc.examples.Helloworld.HelloRequest request) {
- return unaryFutureCall(
- channel.newCall(config.sayHello), request);
- }
- }
-
- public static io.grpc.ServerServiceDefinition bindService(
- final Greeter serviceImpl) {
- return io.grpc.ServerServiceDefinition.builder("helloworld.Greeter")
- .addMethod(createMethodDefinition(
- METHOD_SAY_HELLO,
- asyncUnaryRequestCall(
- new io.grpc.stub.ServerCalls.UnaryRequestMethod<
- io.grpc.examples.Helloworld.HelloRequest,
- io.grpc.examples.Helloworld.HelloReply>() {
- @java.lang.Override
- public void invoke(
- io.grpc.examples.Helloworld.HelloRequest request,
- io.grpc.stub.StreamObserver<io.grpc.examples.Helloworld.HelloReply> responseObserver) {
- serviceImpl.sayHello(request, responseObserver);
- }
- }))).build();
- }
-}
diff --git a/java/android/Helloworld.java b/java/android/Helloworld.java
deleted file mode 100644
index 35dd534..0000000
--- a/java/android/Helloworld.java
+++ /dev/null
@@ -1,175 +0,0 @@
-// Generated by the protocol buffer compiler. DO NOT EDIT!
-
-package io.grpc.examples;
-
-@SuppressWarnings("hiding")
-public interface Helloworld {
-
- public static final class HelloRequest extends
- com.google.protobuf.nano.MessageNano {
-
- private static volatile HelloRequest[] _emptyArray;
- public static HelloRequest[] emptyArray() {
- // Lazily initializes the empty array
- if (_emptyArray == null) {
- synchronized (
- com.google.protobuf.nano.InternalNano.LAZY_INIT_LOCK) {
- if (_emptyArray == null) {
- _emptyArray = new HelloRequest[0];
- }
- }
- }
- return _emptyArray;
- }
-
- // optional string name = 1;
- public java.lang.String name;
-
- public HelloRequest() {
- clear();
- }
-
- public HelloRequest clear() {
- name = "";
- cachedSize = -1;
- return this;
- }
-
- @Override
- public void writeTo(com.google.protobuf.nano.CodedOutputByteBufferNano output)
- throws java.io.IOException {
- if (!this.name.equals("")) {
- output.writeString(1, this.name);
- }
- super.writeTo(output);
- }
-
- @Override
- protected int computeSerializedSize() {
- int size = super.computeSerializedSize();
- if (!this.name.equals("")) {
- size += com.google.protobuf.nano.CodedOutputByteBufferNano
- .computeStringSize(1, this.name);
- }
- return size;
- }
-
- @Override
- public HelloRequest mergeFrom(
- com.google.protobuf.nano.CodedInputByteBufferNano input)
- throws java.io.IOException {
- while (true) {
- int tag = input.readTag();
- switch (tag) {
- case 0:
- return this;
- default: {
- if (!com.google.protobuf.nano.WireFormatNano.parseUnknownField(input, tag)) {
- return this;
- }
- break;
- }
- case 10: {
- this.name = input.readString();
- break;
- }
- }
- }
- }
-
- public static HelloRequest parseFrom(byte[] data)
- throws com.google.protobuf.nano.InvalidProtocolBufferNanoException {
- return com.google.protobuf.nano.MessageNano.mergeFrom(new HelloRequest(), data);
- }
-
- public static HelloRequest parseFrom(
- com.google.protobuf.nano.CodedInputByteBufferNano input)
- throws java.io.IOException {
- return new HelloRequest().mergeFrom(input);
- }
- }
-
- public static final class HelloReply extends
- com.google.protobuf.nano.MessageNano {
-
- private static volatile HelloReply[] _emptyArray;
- public static HelloReply[] emptyArray() {
- // Lazily initializes the empty array
- if (_emptyArray == null) {
- synchronized (
- com.google.protobuf.nano.InternalNano.LAZY_INIT_LOCK) {
- if (_emptyArray == null) {
- _emptyArray = new HelloReply[0];
- }
- }
- }
- return _emptyArray;
- }
-
- // optional string message = 1;
- public java.lang.String message;
-
- public HelloReply() {
- clear();
- }
-
- public HelloReply clear() {
- message = "";
- cachedSize = -1;
- return this;
- }
-
- @Override
- public void writeTo(com.google.protobuf.nano.CodedOutputByteBufferNano output)
- throws java.io.IOException {
- if (!this.message.equals("")) {
- output.writeString(1, this.message);
- }
- super.writeTo(output);
- }
-
- @Override
- protected int computeSerializedSize() {
- int size = super.computeSerializedSize();
- if (!this.message.equals("")) {
- size += com.google.protobuf.nano.CodedOutputByteBufferNano
- .computeStringSize(1, this.message);
- }
- return size;
- }
-
- @Override
- public HelloReply mergeFrom(
- com.google.protobuf.nano.CodedInputByteBufferNano input)
- throws java.io.IOException {
- while (true) {
- int tag = input.readTag();
- switch (tag) {
- case 0:
- return this;
- default: {
- if (!com.google.protobuf.nano.WireFormatNano.parseUnknownField(input, tag)) {
- return this;
- }
- break;
- }
- case 10: {
- this.message = input.readString();
- break;
- }
- }
- }
- }
-
- public static HelloReply parseFrom(byte[] data)
- throws com.google.protobuf.nano.InvalidProtocolBufferNanoException {
- return com.google.protobuf.nano.MessageNano.mergeFrom(new HelloReply(), data);
- }
-
- public static HelloReply parseFrom(
- com.google.protobuf.nano.CodedInputByteBufferNano input)
- throws java.io.IOException {
- return new HelloReply().mergeFrom(input);
- }
- }
-}
diff --git a/java/android/README.md b/java/android/README.md
index 1b6b819..7e11cb6 100644
--- a/java/android/README.md
+++ b/java/android/README.md
@@ -27,49 +27,15 @@
$ # follow the instructions in 'How to Build'
```
-**3 [Create an Android project](https://developer.android.com/training/basics/firstapp/creating-project.html) under your working directory.**
-- Set Application name to "Helloworld Example" and set Company Domain to "grpc.io". Make sure your package name is "io.grpc.helloworldexample"
-- Choose appropriate minimum SDK
-- Use Blank Activity
-- Set Activity Name to HelloworldActivity
-- Set Layout Name to activity_helloworld
-
-**4 Prepare the app**
+**3 Prepare the app**
- Clone this git repo
```sh
$ git clone https://github.com/grpc/grpc-common
```
-- Replace the generated HelloworldActivity.java and activity_helloworld.xml with the two files in this repo
-- Copy GreeterGrpc.java and Helloworld.java under your_app_dir/app/src/main/java/io/grpc/examples/
-- In your AndroidManifest.xml, make sure you have
-```sh
-<uses-permission android:name="android.permission.INTERNET" />
-```
-added outside your appplication tag
-**5 Add dependencies. gRPC Java on Android depends on grpc-java, protobuf nano, okhttp**
-- Copy grpc-java .jar files to your_app_dir/app/libs
+**4 Install the app**
```sh
-$ cp grpc-java/core/build/libs/*.jar your_app_dir/app/libs/
-$ cp grpc-java/stub/build/libs/*.jar your_app_dir/app/libs/
-$ cp grpc-java/nano/build/libs/*.jar your_app_dir/app/libs/
-$ cp grpc-java/okhttp/build/libs/*.jar your_app_dir/app/libs/
+$ cd grpc-common
+$ ./gradlew installDebug
```
-- Copy or download other dependencies to your_app_dir/app/libs/
- - [Guava 18](http://search.maven.org/remotecontent?filepath=com/google/guava/guava/18.0/guava-18.0.jar)
- - [okhttp 2.2.0](http://repo1.maven.org/maven2/com/squareup/okhttp/okhttp/2.2.0/okhttp-2.2.0.jar)
- - [okio](http://search.maven.org/remotecontent?filepath=com/squareup/okio/okio/1.2.0/okio-1.2.0.jar)
- - [jsr305](http://search.maven.org/remotecontent?filepath=com/google/code/findbugs/jsr305/3.0.0/jsr305-3.0.0.jar)
- - protobuf nano:
-```sh
-$ cp ~/.m2/repository/com/google/protobuf/nano/protobuf-javanano/3.0.0-alpha-2/protobuf-javanano-3.0.0-alpha-2.jar your_app_dir/app/libs/
-```
-- Make sure your_app_dir/app/build.gradle contains:
-```sh
-dependencies {
- compile fileTree(dir: 'libs', include: ['*.jar'])
-}
-```
-
-**6 [Run your Helloworld Example app](https://developer.android.com/training/basics/firstapp/running-app.html)**
diff --git a/java/android/activity_helloworld.xml b/java/android/activity_helloworld.xml
deleted file mode 100644
index 41411d1..0000000
--- a/java/android/activity_helloworld.xml
+++ /dev/null
@@ -1,54 +0,0 @@
-<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent"
- android:layout_height="match_parent"
- tools:context=".MainActivity"
- android:orientation="vertical" >
-
- <LinearLayout
- android:layout_width="match_parent"
- android:layout_height="wrap_content"
- android:orientation="horizontal">
- <EditText
- android:id="@+id/host_edit_text"
- android:layout_weight="2"
- android:layout_width="0dp"
- android:layout_height="wrap_content"
- android:hint="Enter Host" />
- <EditText
- android:id="@+id/port_edit_text"
- android:layout_weight="1"
- android:layout_width="0dp"
- android:layout_height="wrap_content"
- android:inputType="numberDecimal"
- android:hint="Enter Port" />
- </LinearLayout>
-
-
- <EditText
- android:id="@+id/message_edit_text"
- android:layout_width="match_parent"
- android:layout_height="wrap_content"
- android:hint="Enter message to send" />
-
- <Button
- android:id="@+id/send_button"
- android:layout_width="match_parent"
- android:layout_height="wrap_content"
- android:onClick="sendMessage"
- android:text="Send Grpc Request" />
-
- <TextView
- android:layout_width="match_parent"
- android:layout_height="wrap_content"
- android:paddingTop="12dp"
- android:paddingBottom="12dp"
- android:textSize="16dp"
- android:text="Response:" />
-
- <TextView
- android:id="@+id/grpc_response_text"
- android:layout_width="match_parent"
- android:layout_height="match_parent"
- android:textSize="16dp" />
-
-</LinearLayout>
diff --git a/java/android/app/.gitignore b/java/android/app/.gitignore
new file mode 100644
index 0000000..796b96d
--- /dev/null
+++ b/java/android/app/.gitignore
@@ -0,0 +1 @@
+/build
diff --git a/java/android/app/build.gradle b/java/android/app/build.gradle
new file mode 100644
index 0000000..6940ad0
--- /dev/null
+++ b/java/android/app/build.gradle
@@ -0,0 +1,34 @@
+apply plugin: 'com.android.application'
+
+android {
+ compileSdkVersion 21
+ buildToolsVersion "21.1.2"
+
+ defaultConfig {
+ applicationId "io.grpc.helloworldexample"
+ minSdkVersion 7
+ targetSdkVersion 21
+ versionCode 1
+ versionName "1.0"
+ }
+ buildTypes {
+ release {
+ minifyEnabled false
+ proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
+ }
+ }
+}
+
+dependencies {
+ compile 'com.android.support:appcompat-v7:21.0.3'
+ compile 'com.google.code.findbugs:jsr305:3.0.0'
+ compile 'com.squareup.okhttp:okhttp:2.2.0'
+ compile 'com.google.guava:guava:18.0'
+
+ // You need to build the https://github.com/grpc/grpc-java
+ // to obtain these libraries below.
+ compile 'io.grpc:grpc-core:0.1.0-SNAPSHOT'
+ compile 'io.grpc:grpc-nano:0.1.0-SNAPSHOT'
+ compile 'io.grpc:grpc-okhttp:0.1.0-SNAPSHOT'
+ compile 'io.grpc:grpc-stub:0.1.0-SNAPSHOT'
+}
diff --git a/java/android/app/proguard-rules.pro b/java/android/app/proguard-rules.pro
new file mode 100644
index 0000000..3e659b9
--- /dev/null
+++ b/java/android/app/proguard-rules.pro
@@ -0,0 +1,17 @@
+# Add project specific ProGuard rules here.
+# By default, the flags in this file are appended to flags specified
+# in /Users/thagikura/android-sdk/tools/proguard/proguard-android.txt
+# You can edit the include path and order by changing the proguardFiles
+# directive in build.gradle.
+#
+# For more details, see
+# http://developer.android.com/guide/developing/tools/proguard.html
+
+# Add any project specific keep options here:
+
+# If your project uses WebView with JS, uncomment the following
+# and specify the fully qualified class name to the JavaScript interface
+# class:
+#-keepclassmembers class fqcn.of.javascript.interface.for.webview {
+# public *;
+#}
diff --git a/java/android/app/src/main/AndroidManifest.xml b/java/android/app/src/main/AndroidManifest.xml
new file mode 100644
index 0000000..8c40f11
--- /dev/null
+++ b/java/android/app/src/main/AndroidManifest.xml
@@ -0,0 +1,22 @@
+<?xml version="1.0" encoding="utf-8"?>
+<manifest xmlns:android="http://schemas.android.com/apk/res/android"
+ package="io.grpc.helloworldexample" >
+
+ <uses-permission android:name="android.permission.INTERNET" />
+
+ <application
+ android:allowBackup="true"
+ android:icon="@mipmap/ic_launcher"
+ android:label="@string/app_name"
+ android:theme="@style/Base.V7.Theme.AppCompat.Light" >
+ <activity
+ android:name=".HelloworldActivity"
+ android:label="@string/app_name" >
+ <intent-filter>
+ <action android:name="android.intent.action.MAIN" />
+ <category android:name="android.intent.category.LAUNCHER" />
+ </intent-filter>
+ </activity>
+ </application>
+
+</manifest>
diff --git a/java/android/app/src/main/java/io/grpc/helloworldexample/GreeterGrpc.java b/java/android/app/src/main/java/io/grpc/helloworldexample/GreeterGrpc.java
new file mode 100644
index 0000000..595c140
--- /dev/null
+++ b/java/android/app/src/main/java/io/grpc/helloworldexample/GreeterGrpc.java
@@ -0,0 +1,179 @@
+package io.grpc.helloworldexample;
+
+import java.io.IOException;
+
+import static io.grpc.stub.Calls.asyncUnaryCall;
+import static io.grpc.stub.Calls.blockingUnaryCall;
+import static io.grpc.stub.Calls.createMethodDescriptor;
+import static io.grpc.stub.Calls.unaryFutureCall;
+import static io.grpc.stub.ServerCalls.asyncUnaryRequestCall;
+import static io.grpc.stub.ServerCalls.createMethodDefinition;
+
+public class GreeterGrpc {
+
+ private static final io.grpc.stub.Method<Helloworld.HelloRequest,
+ Helloworld.HelloReply> METHOD_SAY_HELLO =
+ io.grpc.stub.Method.create(
+ io.grpc.MethodType.UNARY, "SayHello",
+ io.grpc.nano.NanoUtils.<Helloworld.HelloRequest>marshaller(
+ new io.grpc.nano.Parser<Helloworld.HelloRequest>() {
+ @Override
+ public Helloworld.HelloRequest parse(com.google.protobuf.nano.CodedInputByteBufferNano input) throws IOException {
+ return Helloworld.HelloRequest.parseFrom(input);
+ }
+ }),
+ io.grpc.nano.NanoUtils.<Helloworld.HelloReply>marshaller(
+ new io.grpc.nano.Parser<Helloworld.HelloReply>() {
+ @Override
+ public Helloworld.HelloReply parse(com.google.protobuf.nano.CodedInputByteBufferNano input) throws IOException {
+ return Helloworld.HelloReply.parseFrom(input);
+ }
+ }));
+
+ public static GreeterStub newStub(io.grpc.Channel channel) {
+ return new GreeterStub(channel, CONFIG);
+ }
+
+ public static GreeterBlockingStub newBlockingStub(
+ io.grpc.Channel channel) {
+ return new GreeterBlockingStub(channel, CONFIG);
+ }
+
+ public static GreeterFutureStub newFutureStub(
+ io.grpc.Channel channel) {
+ return new GreeterFutureStub(channel, CONFIG);
+ }
+
+ public static final GreeterServiceDescriptor CONFIG =
+ new GreeterServiceDescriptor();
+
+ public static class GreeterServiceDescriptor extends
+ io.grpc.stub.AbstractServiceDescriptor<GreeterServiceDescriptor> {
+ public final io.grpc.MethodDescriptor<Helloworld.HelloRequest,
+ Helloworld.HelloReply> sayHello;
+
+ private GreeterServiceDescriptor() {
+ sayHello = createMethodDescriptor(
+ "helloworld.Greeter", METHOD_SAY_HELLO);
+ }
+
+ private GreeterServiceDescriptor(
+ java.util.Map<java.lang.String, io.grpc.MethodDescriptor<?, ?>> methodMap) {
+ sayHello = (io.grpc.MethodDescriptor<Helloworld.HelloRequest,
+ Helloworld.HelloReply>) methodMap.get(
+ CONFIG.sayHello.getName());
+ }
+
+ @java.lang.Override
+ protected GreeterServiceDescriptor build(
+ java.util.Map<java.lang.String, io.grpc.MethodDescriptor<?, ?>> methodMap) {
+ return new GreeterServiceDescriptor(methodMap);
+ }
+
+ @java.lang.Override
+ public com.google.common.collect.ImmutableList<io.grpc.MethodDescriptor<?, ?>> methods() {
+ return com.google.common.collect.ImmutableList.<io.grpc.MethodDescriptor<?, ?>>of(
+ sayHello);
+ }
+ }
+
+ public static interface Greeter {
+
+ public void sayHello(Helloworld.HelloRequest request,
+ io.grpc.stub.StreamObserver<Helloworld.HelloReply> responseObserver);
+ }
+
+ public static interface GreeterBlockingClient {
+
+ public Helloworld.HelloReply sayHello(Helloworld.HelloRequest request);
+ }
+
+ public static interface GreeterFutureClient {
+
+ public com.google.common.util.concurrent.ListenableFuture<Helloworld.HelloReply> sayHello(
+ Helloworld.HelloRequest request);
+ }
+
+ public static class GreeterStub extends
+ io.grpc.stub.AbstractStub<GreeterStub, GreeterServiceDescriptor>
+ implements Greeter {
+ private GreeterStub(io.grpc.Channel channel,
+ GreeterServiceDescriptor config) {
+ super(channel, config);
+ }
+
+ @java.lang.Override
+ protected GreeterStub build(io.grpc.Channel channel,
+ GreeterServiceDescriptor config) {
+ return new GreeterStub(channel, config);
+ }
+
+ @java.lang.Override
+ public void sayHello(Helloworld.HelloRequest request,
+ io.grpc.stub.StreamObserver<Helloworld.HelloReply> responseObserver) {
+ asyncUnaryCall(
+ channel.newCall(config.sayHello), request, responseObserver);
+ }
+ }
+
+ public static class GreeterBlockingStub extends
+ io.grpc.stub.AbstractStub<GreeterBlockingStub, GreeterServiceDescriptor>
+ implements GreeterBlockingClient {
+ private GreeterBlockingStub(io.grpc.Channel channel,
+ GreeterServiceDescriptor config) {
+ super(channel, config);
+ }
+
+ @java.lang.Override
+ protected GreeterBlockingStub build(io.grpc.Channel channel,
+ GreeterServiceDescriptor config) {
+ return new GreeterBlockingStub(channel, config);
+ }
+
+ @java.lang.Override
+ public Helloworld.HelloReply sayHello(Helloworld.HelloRequest request) {
+ return blockingUnaryCall(
+ channel.newCall(config.sayHello), request);
+ }
+ }
+
+ public static class GreeterFutureStub extends
+ io.grpc.stub.AbstractStub<GreeterFutureStub, GreeterServiceDescriptor>
+ implements GreeterFutureClient {
+ private GreeterFutureStub(io.grpc.Channel channel,
+ GreeterServiceDescriptor config) {
+ super(channel, config);
+ }
+
+ @java.lang.Override
+ protected GreeterFutureStub build(io.grpc.Channel channel,
+ GreeterServiceDescriptor config) {
+ return new GreeterFutureStub(channel, config);
+ }
+
+ @java.lang.Override
+ public com.google.common.util.concurrent.ListenableFuture<Helloworld.HelloReply> sayHello(
+ Helloworld.HelloRequest request) {
+ return unaryFutureCall(
+ channel.newCall(config.sayHello), request);
+ }
+ }
+
+ public static io.grpc.ServerServiceDefinition bindService(
+ final Greeter serviceImpl) {
+ return io.grpc.ServerServiceDefinition.builder("helloworld.Greeter")
+ .addMethod(createMethodDefinition(
+ METHOD_SAY_HELLO,
+ asyncUnaryRequestCall(
+ new io.grpc.stub.ServerCalls.UnaryRequestMethod<
+ Helloworld.HelloRequest,
+ Helloworld.HelloReply>() {
+ @java.lang.Override
+ public void invoke(
+ Helloworld.HelloRequest request,
+ io.grpc.stub.StreamObserver<Helloworld.HelloReply> responseObserver) {
+ serviceImpl.sayHello(request, responseObserver);
+ }
+ }))).build();
+ }
+}
\ No newline at end of file
diff --git a/java/android/app/src/main/java/io/grpc/helloworldexample/Helloworld.java b/java/android/app/src/main/java/io/grpc/helloworldexample/Helloworld.java
new file mode 100644
index 0000000..28da5a9
--- /dev/null
+++ b/java/android/app/src/main/java/io/grpc/helloworldexample/Helloworld.java
@@ -0,0 +1,175 @@
+// Generated by the protocol buffer compiler. DO NOT EDIT!
+
+package io.grpc.helloworldexample;
+
+@SuppressWarnings("hiding")
+public interface Helloworld {
+
+ public static final class HelloRequest extends
+ com.google.protobuf.nano.MessageNano {
+
+ private static volatile HelloRequest[] _emptyArray;
+ public static HelloRequest[] emptyArray() {
+ // Lazily initializes the empty array
+ if (_emptyArray == null) {
+ synchronized (
+ com.google.protobuf.nano.InternalNano.LAZY_INIT_LOCK) {
+ if (_emptyArray == null) {
+ _emptyArray = new HelloRequest[0];
+ }
+ }
+ }
+ return _emptyArray;
+ }
+
+ // optional string name = 1;
+ public java.lang.String name;
+
+ public HelloRequest() {
+ clear();
+ }
+
+ public HelloRequest clear() {
+ name = "";
+ cachedSize = -1;
+ return this;
+ }
+
+ @Override
+ public void writeTo(com.google.protobuf.nano.CodedOutputByteBufferNano output)
+ throws java.io.IOException {
+ if (!this.name.equals("")) {
+ output.writeString(1, this.name);
+ }
+ super.writeTo(output);
+ }
+
+ @Override
+ protected int computeSerializedSize() {
+ int size = super.computeSerializedSize();
+ if (!this.name.equals("")) {
+ size += com.google.protobuf.nano.CodedOutputByteBufferNano
+ .computeStringSize(1, this.name);
+ }
+ return size;
+ }
+
+ @Override
+ public HelloRequest mergeFrom(
+ com.google.protobuf.nano.CodedInputByteBufferNano input)
+ throws java.io.IOException {
+ while (true) {
+ int tag = input.readTag();
+ switch (tag) {
+ case 0:
+ return this;
+ default: {
+ if (!com.google.protobuf.nano.WireFormatNano.parseUnknownField(input, tag)) {
+ return this;
+ }
+ break;
+ }
+ case 10: {
+ this.name = input.readString();
+ break;
+ }
+ }
+ }
+ }
+
+ public static HelloRequest parseFrom(byte[] data)
+ throws com.google.protobuf.nano.InvalidProtocolBufferNanoException {
+ return com.google.protobuf.nano.MessageNano.mergeFrom(new HelloRequest(), data);
+ }
+
+ public static HelloRequest parseFrom(
+ com.google.protobuf.nano.CodedInputByteBufferNano input)
+ throws java.io.IOException {
+ return new HelloRequest().mergeFrom(input);
+ }
+ }
+
+ public static final class HelloReply extends
+ com.google.protobuf.nano.MessageNano {
+
+ private static volatile HelloReply[] _emptyArray;
+ public static HelloReply[] emptyArray() {
+ // Lazily initializes the empty array
+ if (_emptyArray == null) {
+ synchronized (
+ com.google.protobuf.nano.InternalNano.LAZY_INIT_LOCK) {
+ if (_emptyArray == null) {
+ _emptyArray = new HelloReply[0];
+ }
+ }
+ }
+ return _emptyArray;
+ }
+
+ // optional string message = 1;
+ public java.lang.String message;
+
+ public HelloReply() {
+ clear();
+ }
+
+ public HelloReply clear() {
+ message = "";
+ cachedSize = -1;
+ return this;
+ }
+
+ @Override
+ public void writeTo(com.google.protobuf.nano.CodedOutputByteBufferNano output)
+ throws java.io.IOException {
+ if (!this.message.equals("")) {
+ output.writeString(1, this.message);
+ }
+ super.writeTo(output);
+ }
+
+ @Override
+ protected int computeSerializedSize() {
+ int size = super.computeSerializedSize();
+ if (!this.message.equals("")) {
+ size += com.google.protobuf.nano.CodedOutputByteBufferNano
+ .computeStringSize(1, this.message);
+ }
+ return size;
+ }
+
+ @Override
+ public HelloReply mergeFrom(
+ com.google.protobuf.nano.CodedInputByteBufferNano input)
+ throws java.io.IOException {
+ while (true) {
+ int tag = input.readTag();
+ switch (tag) {
+ case 0:
+ return this;
+ default: {
+ if (!com.google.protobuf.nano.WireFormatNano.parseUnknownField(input, tag)) {
+ return this;
+ }
+ break;
+ }
+ case 10: {
+ this.message = input.readString();
+ break;
+ }
+ }
+ }
+ }
+
+ public static HelloReply parseFrom(byte[] data)
+ throws com.google.protobuf.nano.InvalidProtocolBufferNanoException {
+ return com.google.protobuf.nano.MessageNano.mergeFrom(new HelloReply(), data);
+ }
+
+ public static HelloReply parseFrom(
+ com.google.protobuf.nano.CodedInputByteBufferNano input)
+ throws java.io.IOException {
+ return new HelloReply().mergeFrom(input);
+ }
+ }
+}
\ No newline at end of file
diff --git a/java/android/HelloworldActivity.java b/java/android/app/src/main/java/io/grpc/helloworldexample/HelloworldActivity.java
similarity index 93%
rename from java/android/HelloworldActivity.java
rename to java/android/app/src/main/java/io/grpc/helloworldexample/HelloworldActivity.java
index 3201122..b6d734f 100644
--- a/java/android/HelloworldActivity.java
+++ b/java/android/app/src/main/java/io/grpc/helloworldexample/HelloworldActivity.java
@@ -1,26 +1,23 @@
package io.grpc.helloworldexample;
import android.content.Context;
-import android.support.v7.app.ActionBarActivity;
-import android.os.Bundle;
import android.os.AsyncTask;
+import android.os.Bundle;
+import android.support.v7.app.ActionBarActivity;
import android.text.TextUtils;
-import android.view.Menu;
-import android.view.MenuItem;
import android.view.View;
import android.view.inputmethod.InputMethodManager;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;
-import io.grpc.ChannelImpl;
-import io.grpc.examples.GreeterGrpc;
-import io.grpc.examples.Helloworld.HelloRequest;
-import io.grpc.examples.Helloworld.HelloReply;
-import io.grpc.transport.okhttp.OkHttpChannelBuilder;
-
import java.util.concurrent.TimeUnit;
+import io.grpc.ChannelImpl;
+import io.grpc.helloworldexample.Helloworld.HelloReply;
+import io.grpc.helloworldexample.Helloworld.HelloRequest;
+import io.grpc.transport.okhttp.OkHttpChannelBuilder;
+
public class HelloworldActivity extends ActionBarActivity {
private Button mSendButton;
private EditText mHostEdit;
@@ -90,4 +87,4 @@
mSendButton.setEnabled(true);
}
}
-}
+}
\ No newline at end of file
diff --git a/java/android/app/src/main/res/layout/activity_helloworld.xml b/java/android/app/src/main/res/layout/activity_helloworld.xml
new file mode 100644
index 0000000..00ca04c
--- /dev/null
+++ b/java/android/app/src/main/res/layout/activity_helloworld.xml
@@ -0,0 +1,54 @@
+<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent"
+ android:layout_height="match_parent"
+ tools:context=".MainActivity"
+ android:orientation="vertical" >
+
+ <LinearLayout
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:orientation="horizontal">
+ <EditText
+ android:id="@+id/host_edit_text"
+ android:layout_weight="2"
+ android:layout_width="0dp"
+ android:layout_height="wrap_content"
+ android:hint="Enter Host" />
+ <EditText
+ android:id="@+id/port_edit_text"
+ android:layout_weight="1"
+ android:layout_width="0dp"
+ android:layout_height="wrap_content"
+ android:inputType="numberDecimal"
+ android:hint="Enter Port" />
+ </LinearLayout>
+
+
+ <EditText
+ android:id="@+id/message_edit_text"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:hint="Enter message to send" />
+
+ <Button
+ android:id="@+id/send_button"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:onClick="sendMessage"
+ android:text="Send Grpc Request" />
+
+ <TextView
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:paddingTop="12dp"
+ android:paddingBottom="12dp"
+ android:textSize="16dp"
+ android:text="Response:" />
+
+ <TextView
+ android:id="@+id/grpc_response_text"
+ android:layout_width="match_parent"
+ android:layout_height="match_parent"
+ android:textSize="16dp" />
+
+</LinearLayout>
\ No newline at end of file
diff --git a/java/android/app/src/main/res/mipmap-hdpi/ic_launcher.png b/java/android/app/src/main/res/mipmap-hdpi/ic_launcher.png
new file mode 100644
index 0000000..cde69bc
--- /dev/null
+++ b/java/android/app/src/main/res/mipmap-hdpi/ic_launcher.png
Binary files differ
diff --git a/java/android/app/src/main/res/mipmap-mdpi/ic_launcher.png b/java/android/app/src/main/res/mipmap-mdpi/ic_launcher.png
new file mode 100644
index 0000000..c133a0c
--- /dev/null
+++ b/java/android/app/src/main/res/mipmap-mdpi/ic_launcher.png
Binary files differ
diff --git a/java/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png b/java/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png
new file mode 100644
index 0000000..bfa42f0
--- /dev/null
+++ b/java/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png
Binary files differ
diff --git a/java/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png b/java/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png
new file mode 100644
index 0000000..324e72c
--- /dev/null
+++ b/java/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png
Binary files differ
diff --git a/java/android/app/src/main/res/values/strings.xml b/java/android/app/src/main/res/values/strings.xml
new file mode 100644
index 0000000..64cb312
--- /dev/null
+++ b/java/android/app/src/main/res/values/strings.xml
@@ -0,0 +1,3 @@
+<resources>
+ <string name="app_name">GrpcHelloworldExample</string>
+</resources>
diff --git a/java/android/build.gradle b/java/android/build.gradle
new file mode 100644
index 0000000..1bf89c9
--- /dev/null
+++ b/java/android/build.gradle
@@ -0,0 +1,20 @@
+// Top-level build file where you can add configuration options common to all sub-projects/modules.
+
+buildscript {
+ repositories {
+ jcenter()
+ }
+ dependencies {
+ classpath 'com.android.tools.build:gradle:1.1.0'
+
+ // NOTE: Do not place your application dependencies here; they belong
+ // in the individual module build.gradle files
+ }
+}
+
+allprojects {
+ repositories {
+ jcenter()
+ mavenLocal()
+ }
+}
diff --git a/java/android/gradle/wrapper/gradle-wrapper.jar b/java/android/gradle/wrapper/gradle-wrapper.jar
new file mode 100644
index 0000000..8c0fb64
--- /dev/null
+++ b/java/android/gradle/wrapper/gradle-wrapper.jar
Binary files differ
diff --git a/java/android/gradle/wrapper/gradle-wrapper.properties b/java/android/gradle/wrapper/gradle-wrapper.properties
new file mode 100644
index 0000000..0c71e76
--- /dev/null
+++ b/java/android/gradle/wrapper/gradle-wrapper.properties
@@ -0,0 +1,6 @@
+#Wed Apr 10 15:27:10 PDT 2013
+distributionBase=GRADLE_USER_HOME
+distributionPath=wrapper/dists
+zipStoreBase=GRADLE_USER_HOME
+zipStorePath=wrapper/dists
+distributionUrl=https\://services.gradle.org/distributions/gradle-2.2.1-all.zip
diff --git a/java/android/gradlew b/java/android/gradlew
new file mode 100755
index 0000000..91a7e26
--- /dev/null
+++ b/java/android/gradlew
@@ -0,0 +1,164 @@
+#!/usr/bin/env bash
+
+##############################################################################
+##
+## Gradle start up script for UN*X
+##
+##############################################################################
+
+# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
+DEFAULT_JVM_OPTS=""
+
+APP_NAME="Gradle"
+APP_BASE_NAME=`basename "$0"`
+
+# Use the maximum available, or set MAX_FD != -1 to use that value.
+MAX_FD="maximum"
+
+warn ( ) {
+ echo "$*"
+}
+
+die ( ) {
+ echo
+ echo "$*"
+ echo
+ exit 1
+}
+
+# OS specific support (must be 'true' or 'false').
+cygwin=false
+msys=false
+darwin=false
+case "`uname`" in
+ CYGWIN* )
+ cygwin=true
+ ;;
+ Darwin* )
+ darwin=true
+ ;;
+ MINGW* )
+ msys=true
+ ;;
+esac
+
+# For Cygwin, ensure paths are in UNIX format before anything is touched.
+if $cygwin ; then
+ [ -n "$JAVA_HOME" ] && JAVA_HOME=`cygpath --unix "$JAVA_HOME"`
+fi
+
+# Attempt to set APP_HOME
+# Resolve links: $0 may be a link
+PRG="$0"
+# Need this for relative symlinks.
+while [ -h "$PRG" ] ; do
+ ls=`ls -ld "$PRG"`
+ link=`expr "$ls" : '.*-> \(.*\)$'`
+ if expr "$link" : '/.*' > /dev/null; then
+ PRG="$link"
+ else
+ PRG=`dirname "$PRG"`"/$link"
+ fi
+done
+SAVED="`pwd`"
+cd "`dirname \"$PRG\"`/" >&-
+APP_HOME="`pwd -P`"
+cd "$SAVED" >&-
+
+CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar
+
+# Determine the Java command to use to start the JVM.
+if [ -n "$JAVA_HOME" ] ; then
+ if [ -x "$JAVA_HOME/jre/sh/java" ] ; then
+ # IBM's JDK on AIX uses strange locations for the executables
+ JAVACMD="$JAVA_HOME/jre/sh/java"
+ else
+ JAVACMD="$JAVA_HOME/bin/java"
+ fi
+ if [ ! -x "$JAVACMD" ] ; then
+ die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME
+
+Please set the JAVA_HOME variable in your environment to match the
+location of your Java installation."
+ fi
+else
+ JAVACMD="java"
+ which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
+
+Please set the JAVA_HOME variable in your environment to match the
+location of your Java installation."
+fi
+
+# Increase the maximum file descriptors if we can.
+if [ "$cygwin" = "false" -a "$darwin" = "false" ] ; then
+ MAX_FD_LIMIT=`ulimit -H -n`
+ if [ $? -eq 0 ] ; then
+ if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ] ; then
+ MAX_FD="$MAX_FD_LIMIT"
+ fi
+ ulimit -n $MAX_FD
+ if [ $? -ne 0 ] ; then
+ warn "Could not set maximum file descriptor limit: $MAX_FD"
+ fi
+ else
+ warn "Could not query maximum file descriptor limit: $MAX_FD_LIMIT"
+ fi
+fi
+
+# For Darwin, add options to specify how the application appears in the dock
+if $darwin; then
+ GRADLE_OPTS="$GRADLE_OPTS \"-Xdock:name=$APP_NAME\" \"-Xdock:icon=$APP_HOME/media/gradle.icns\""
+fi
+
+# For Cygwin, switch paths to Windows format before running java
+if $cygwin ; then
+ APP_HOME=`cygpath --path --mixed "$APP_HOME"`
+ CLASSPATH=`cygpath --path --mixed "$CLASSPATH"`
+
+ # We build the pattern for arguments to be converted via cygpath
+ ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null`
+ SEP=""
+ for dir in $ROOTDIRSRAW ; do
+ ROOTDIRS="$ROOTDIRS$SEP$dir"
+ SEP="|"
+ done
+ OURCYGPATTERN="(^($ROOTDIRS))"
+ # Add a user-defined pattern to the cygpath arguments
+ if [ "$GRADLE_CYGPATTERN" != "" ] ; then
+ OURCYGPATTERN="$OURCYGPATTERN|($GRADLE_CYGPATTERN)"
+ fi
+ # Now convert the arguments - kludge to limit ourselves to /bin/sh
+ i=0
+ for arg in "$@" ; do
+ CHECK=`echo "$arg"|egrep -c "$OURCYGPATTERN" -`
+ CHECK2=`echo "$arg"|egrep -c "^-"` ### Determine if an option
+
+ if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then ### Added a condition
+ eval `echo args$i`=`cygpath --path --ignore --mixed "$arg"`
+ else
+ eval `echo args$i`="\"$arg\""
+ fi
+ i=$((i+1))
+ done
+ case $i in
+ (0) set -- ;;
+ (1) set -- "$args0" ;;
+ (2) set -- "$args0" "$args1" ;;
+ (3) set -- "$args0" "$args1" "$args2" ;;
+ (4) set -- "$args0" "$args1" "$args2" "$args3" ;;
+ (5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;;
+ (6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;;
+ (7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;;
+ (8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;;
+ (9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;;
+ esac
+fi
+
+# Split up the JVM_OPTS And GRADLE_OPTS values into an array, following the shell quoting and substitution rules
+function splitJvmOpts() {
+ JVM_OPTS=("$@")
+}
+eval splitJvmOpts $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS
+JVM_OPTS[${#JVM_OPTS[*]}]="-Dorg.gradle.appname=$APP_BASE_NAME"
+
+exec "$JAVACMD" "${JVM_OPTS[@]}" -classpath "$CLASSPATH" org.gradle.wrapper.GradleWrapperMain "$@"
diff --git a/java/android/gradlew.bat b/java/android/gradlew.bat
new file mode 100644
index 0000000..aec9973
--- /dev/null
+++ b/java/android/gradlew.bat
@@ -0,0 +1,90 @@
+@if "%DEBUG%" == "" @echo off
+@rem ##########################################################################
+@rem
+@rem Gradle startup script for Windows
+@rem
+@rem ##########################################################################
+
+@rem Set local scope for the variables with windows NT shell
+if "%OS%"=="Windows_NT" setlocal
+
+@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
+set DEFAULT_JVM_OPTS=
+
+set DIRNAME=%~dp0
+if "%DIRNAME%" == "" set DIRNAME=.
+set APP_BASE_NAME=%~n0
+set APP_HOME=%DIRNAME%
+
+@rem Find java.exe
+if defined JAVA_HOME goto findJavaFromJavaHome
+
+set JAVA_EXE=java.exe
+%JAVA_EXE% -version >NUL 2>&1
+if "%ERRORLEVEL%" == "0" goto init
+
+echo.
+echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
+echo.
+echo Please set the JAVA_HOME variable in your environment to match the
+echo location of your Java installation.
+
+goto fail
+
+:findJavaFromJavaHome
+set JAVA_HOME=%JAVA_HOME:"=%
+set JAVA_EXE=%JAVA_HOME%/bin/java.exe
+
+if exist "%JAVA_EXE%" goto init
+
+echo.
+echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME%
+echo.
+echo Please set the JAVA_HOME variable in your environment to match the
+echo location of your Java installation.
+
+goto fail
+
+:init
+@rem Get command-line arguments, handling Windowz variants
+
+if not "%OS%" == "Windows_NT" goto win9xME_args
+if "%@eval[2+2]" == "4" goto 4NT_args
+
+:win9xME_args
+@rem Slurp the command line arguments.
+set CMD_LINE_ARGS=
+set _SKIP=2
+
+:win9xME_args_slurp
+if "x%~1" == "x" goto execute
+
+set CMD_LINE_ARGS=%*
+goto execute
+
+:4NT_args
+@rem Get arguments from the 4NT Shell from JP Software
+set CMD_LINE_ARGS=%$
+
+:execute
+@rem Setup the command line
+
+set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar
+
+@rem Execute Gradle
+"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %CMD_LINE_ARGS%
+
+:end
+@rem End local scope for the variables with windows NT shell
+if "%ERRORLEVEL%"=="0" goto mainEnd
+
+:fail
+rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of
+rem the _cmd.exe /c_ return code!
+if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1
+exit /b 1
+
+:mainEnd
+if "%OS%"=="Windows_NT" endlocal
+
+:omega
diff --git a/java/android/settings.gradle b/java/android/settings.gradle
new file mode 100644
index 0000000..e7b4def
--- /dev/null
+++ b/java/android/settings.gradle
@@ -0,0 +1 @@
+include ':app'