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'