TBR Android Media Sharing

This is an android client for media sharing. It can send urls and
video/image data. It does not yet support choosing who to send to.

Change-Id: Ia2e93af846a5a42e7e6c7b63576299fbc76d773b
diff --git a/.gitignore b/.gitignore
index 82cf2a6..f981a24 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1,4 +1,8 @@
 /.v23
+/android/.idea/
+/android/generated-src/
+/android/android.iml
+/android/app/app.iml
 /go/pkg/
 /go/bin/
 /js/build
diff --git a/android/.idea/.name b/android/.idea/.name
deleted file mode 100644
index 100518e..0000000
--- a/android/.idea/.name
+++ /dev/null
@@ -1 +0,0 @@
-MediaSharing
\ No newline at end of file
diff --git a/android/.idea/compiler.xml b/android/.idea/compiler.xml
deleted file mode 100644
index 96cc43e..0000000
--- a/android/.idea/compiler.xml
+++ /dev/null
@@ -1,22 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<project version="4">
-  <component name="CompilerConfiguration">
-    <resourceExtensions />
-    <wildcardResourcePatterns>
-      <entry name="!?*.java" />
-      <entry name="!?*.form" />
-      <entry name="!?*.class" />
-      <entry name="!?*.groovy" />
-      <entry name="!?*.scala" />
-      <entry name="!?*.flex" />
-      <entry name="!?*.kt" />
-      <entry name="!?*.clj" />
-      <entry name="!?*.aj" />
-    </wildcardResourcePatterns>
-    <annotationProcessing>
-      <profile default="true" name="Default" enabled="false">
-        <processorPath useClasspath="true" />
-      </profile>
-    </annotationProcessing>
-  </component>
-</project>
\ No newline at end of file
diff --git a/android/.idea/copyright/profiles_settings.xml b/android/.idea/copyright/profiles_settings.xml
deleted file mode 100644
index e7bedf3..0000000
--- a/android/.idea/copyright/profiles_settings.xml
+++ /dev/null
@@ -1,3 +0,0 @@
-<component name="CopyrightManager">
-  <settings default="" />
-</component>
\ No newline at end of file
diff --git a/android/.idea/gradle.xml b/android/.idea/gradle.xml
deleted file mode 100644
index 3ec5955..0000000
--- a/android/.idea/gradle.xml
+++ /dev/null
@@ -1,19 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<project version="4">
-  <component name="GradleSettings">
-    <option name="linkedExternalProjectsSettings">
-      <GradleProjectSettings>
-        <option name="distributionType" value="LOCAL" />
-        <option name="externalProjectPath" value="$PROJECT_DIR$" />
-        <option name="gradleHome" value="$APPLICATION_HOME_DIR$/gradle/gradle-2.2.1" />
-        <option name="gradleJvm" value="1.7" />
-        <option name="modules">
-          <set>
-            <option value="$PROJECT_DIR$" />
-            <option value="$PROJECT_DIR$/app" />
-          </set>
-        </option>
-      </GradleProjectSettings>
-    </option>
-  </component>
-</project>
\ No newline at end of file
diff --git a/android/.idea/misc.xml b/android/.idea/misc.xml
deleted file mode 100644
index e45faed..0000000
--- a/android/.idea/misc.xml
+++ /dev/null
@@ -1,19 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<project version="4">
-  <component name="ProjectLevelVcsManager" settingsEditedManually="false">
-    <OptionsSetting value="true" id="Add" />
-    <OptionsSetting value="true" id="Remove" />
-    <OptionsSetting value="true" id="Checkout" />
-    <OptionsSetting value="true" id="Update" />
-    <OptionsSetting value="true" id="Status" />
-    <OptionsSetting value="true" id="Edit" />
-    <ConfirmationsSetting value="0" id="Add" />
-    <ConfirmationsSetting value="0" id="Remove" />
-  </component>
-  <component name="ProjectRootManager" version="2" languageLevel="JDK_1_7" default="true" assert-keyword="true" jdk-15="true" project-jdk-name="1.7" project-jdk-type="JavaSDK">
-    <output url="file://$PROJECT_DIR$/build/classes" />
-  </component>
-  <component name="ProjectType">
-    <option name="id" value="Android" />
-  </component>
-</project>
\ No newline at end of file
diff --git a/android/.idea/modules.xml b/android/.idea/modules.xml
deleted file mode 100644
index abc31fc..0000000
--- a/android/.idea/modules.xml
+++ /dev/null
@@ -1,9 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<project version="4">
-  <component name="ProjectModuleManager">
-    <modules>
-      <module fileurl="file://$PROJECT_DIR$/android.iml" filepath="$PROJECT_DIR$/android.iml" />
-      <module fileurl="file://$PROJECT_DIR$/app/app.iml" filepath="$PROJECT_DIR$/app/app.iml" />
-    </modules>
-  </component>
-</project>
\ No newline at end of file
diff --git a/android/.idea/vcs.xml b/android/.idea/vcs.xml
deleted file mode 100644
index 6c0b863..0000000
--- a/android/.idea/vcs.xml
+++ /dev/null
@@ -1,6 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<project version="4">
-  <component name="VcsDirectoryMappings">
-    <mapping directory="$PROJECT_DIR$/.." vcs="Git" />
-  </component>
-</project>
\ No newline at end of file
diff --git a/android/android.iml b/android/android.iml
deleted file mode 100644
index a2ac54f..0000000
--- a/android/android.iml
+++ /dev/null
@@ -1,19 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<module external.linked.project.id="android" external.linked.project.path="$MODULE_DIR$" external.root.project.path="$MODULE_DIR$" external.system.id="GRADLE" external.system.module.group="" external.system.module.version="unspecified" type="JAVA_MODULE" version="4">
-  <component name="FacetManager">
-    <facet type="java-gradle" name="Java-Gradle">
-      <configuration>
-        <option name="BUILD_FOLDER_PATH" value="$MODULE_DIR$/build" />
-        <option name="BUILDABLE" value="false" />
-      </configuration>
-    </facet>
-  </component>
-  <component name="NewModuleRootManager" inherit-compiler-output="true">
-    <exclude-output />
-    <content url="file://$MODULE_DIR$">
-      <excludeFolder url="file://$MODULE_DIR$/.gradle" />
-    </content>
-    <orderEntry type="inheritedJdk" />
-    <orderEntry type="sourceFolder" forTests="false" />
-  </component>
-</module>
\ No newline at end of file
diff --git a/android/app/app.iml b/android/app/app.iml
deleted file mode 100644
index e8bebb3..0000000
--- a/android/app/app.iml
+++ /dev/null
@@ -1,94 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<module external.linked.project.id=":app" external.linked.project.path="$MODULE_DIR$" external.root.project.path="$MODULE_DIR$/.." external.system.id="GRADLE" external.system.module.group="android" external.system.module.version="unspecified" type="JAVA_MODULE" version="4">
-  <component name="FacetManager">
-    <facet type="android-gradle" name="Android-Gradle">
-      <configuration>
-        <option name="GRADLE_PROJECT_PATH" value=":app" />
-      </configuration>
-    </facet>
-    <facet type="android" name="Android">
-      <configuration>
-        <option name="SELECTED_BUILD_VARIANT" value="debug" />
-        <option name="SELECTED_TEST_ARTIFACT" value="_android_test_" />
-        <option name="ASSEMBLE_TASK_NAME" value="assembleDebug" />
-        <option name="COMPILE_JAVA_TASK_NAME" value="compileDebugSources" />
-        <option name="SOURCE_GEN_TASK_NAME" value="generateDebugSources" />
-        <option name="ASSEMBLE_TEST_TASK_NAME" value="assembleDebugAndroidTest" />
-        <option name="COMPILE_JAVA_TEST_TASK_NAME" value="compileDebugAndroidTestSources" />
-        <option name="TEST_SOURCE_GEN_TASK_NAME" value="generateDebugAndroidTestSources" />
-        <option name="ALLOW_USER_CONFIGURATION" value="false" />
-        <option name="MANIFEST_FILE_RELATIVE_PATH" value="/src/main/AndroidManifest.xml" />
-        <option name="RES_FOLDER_RELATIVE_PATH" value="/src/main/res" />
-        <option name="RES_FOLDERS_RELATIVE_PATH" value="file://$MODULE_DIR$/src/main/res" />
-        <option name="ASSETS_FOLDER_RELATIVE_PATH" value="/src/main/assets" />
-      </configuration>
-    </facet>
-  </component>
-  <component name="NewModuleRootManager" inherit-compiler-output="false">
-    <output url="file://$MODULE_DIR$/build/intermediates/classes/debug" />
-    <output-test url="file://$MODULE_DIR$/build/intermediates/classes/androidTest/debug" />
-    <exclude-output />
-    <content url="file://$MODULE_DIR$">
-      <sourceFolder url="file://$MODULE_DIR$/build/generated/source/r/debug" isTestSource="false" generated="true" />
-      <sourceFolder url="file://$MODULE_DIR$/build/generated/source/aidl/debug" isTestSource="false" generated="true" />
-      <sourceFolder url="file://$MODULE_DIR$/build/generated/source/buildConfig/debug" isTestSource="false" generated="true" />
-      <sourceFolder url="file://$MODULE_DIR$/build/generated/source/rs/debug" isTestSource="false" generated="true" />
-      <sourceFolder url="file://$MODULE_DIR$/build/generated/res/rs/debug" type="java-resource" />
-      <sourceFolder url="file://$MODULE_DIR$/build/generated/res/generated/debug" type="java-resource" />
-      <sourceFolder url="file://$MODULE_DIR$/build/generated/source/r/androidTest/debug" isTestSource="true" generated="true" />
-      <sourceFolder url="file://$MODULE_DIR$/build/generated/source/aidl/androidTest/debug" isTestSource="true" generated="true" />
-      <sourceFolder url="file://$MODULE_DIR$/build/generated/source/buildConfig/androidTest/debug" isTestSource="true" generated="true" />
-      <sourceFolder url="file://$MODULE_DIR$/build/generated/source/rs/androidTest/debug" isTestSource="true" generated="true" />
-      <sourceFolder url="file://$MODULE_DIR$/build/generated/res/rs/androidTest/debug" type="java-test-resource" />
-      <sourceFolder url="file://$MODULE_DIR$/build/generated/res/generated/androidTest/debug" type="java-test-resource" />
-      <sourceFolder url="file://$MODULE_DIR$/src/debug/res" type="java-resource" />
-      <sourceFolder url="file://$MODULE_DIR$/src/debug/resources" type="java-resource" />
-      <sourceFolder url="file://$MODULE_DIR$/src/debug/assets" type="java-resource" />
-      <sourceFolder url="file://$MODULE_DIR$/src/debug/aidl" isTestSource="false" />
-      <sourceFolder url="file://$MODULE_DIR$/src/debug/java" isTestSource="false" />
-      <sourceFolder url="file://$MODULE_DIR$/src/debug/jni" isTestSource="false" />
-      <sourceFolder url="file://$MODULE_DIR$/src/debug/rs" isTestSource="false" />
-      <sourceFolder url="file://$MODULE_DIR$/src/main/res" type="java-resource" />
-      <sourceFolder url="file://$MODULE_DIR$/src/main/resources" type="java-resource" />
-      <sourceFolder url="file://$MODULE_DIR$/src/main/assets" type="java-resource" />
-      <sourceFolder url="file://$MODULE_DIR$/src/main/aidl" isTestSource="false" />
-      <sourceFolder url="file://$MODULE_DIR$/src/main/java" isTestSource="false" />
-      <sourceFolder url="file://$MODULE_DIR$/src/main/jni" isTestSource="false" />
-      <sourceFolder url="file://$MODULE_DIR$/src/main/rs" isTestSource="false" />
-      <sourceFolder url="file://$MODULE_DIR$/src/androidTest/res" type="java-test-resource" />
-      <sourceFolder url="file://$MODULE_DIR$/src/androidTest/resources" type="java-test-resource" />
-      <sourceFolder url="file://$MODULE_DIR$/src/androidTest/assets" type="java-test-resource" />
-      <sourceFolder url="file://$MODULE_DIR$/src/androidTest/aidl" isTestSource="true" />
-      <sourceFolder url="file://$MODULE_DIR$/src/androidTest/java" isTestSource="true" />
-      <sourceFolder url="file://$MODULE_DIR$/src/androidTest/jni" isTestSource="true" />
-      <sourceFolder url="file://$MODULE_DIR$/src/androidTest/rs" isTestSource="true" />
-      <excludeFolder url="file://$MODULE_DIR$/build/intermediates/assets" />
-      <excludeFolder url="file://$MODULE_DIR$/build/intermediates/bundles" />
-      <excludeFolder url="file://$MODULE_DIR$/build/intermediates/classes" />
-      <excludeFolder url="file://$MODULE_DIR$/build/intermediates/coverage-instrumented-classes" />
-      <excludeFolder url="file://$MODULE_DIR$/build/intermediates/dependency-cache" />
-      <excludeFolder url="file://$MODULE_DIR$/build/intermediates/dex" />
-      <excludeFolder url="file://$MODULE_DIR$/build/intermediates/dex-cache" />
-      <excludeFolder url="file://$MODULE_DIR$/build/intermediates/exploded-aar/com.android.support/appcompat-v7/22.1.1/jars" />
-      <excludeFolder url="file://$MODULE_DIR$/build/intermediates/exploded-aar/com.android.support/support-v4/22.1.1/jars" />
-      <excludeFolder url="file://$MODULE_DIR$/build/intermediates/incremental" />
-      <excludeFolder url="file://$MODULE_DIR$/build/intermediates/jacoco" />
-      <excludeFolder url="file://$MODULE_DIR$/build/intermediates/javaResources" />
-      <excludeFolder url="file://$MODULE_DIR$/build/intermediates/libs" />
-      <excludeFolder url="file://$MODULE_DIR$/build/intermediates/lint" />
-      <excludeFolder url="file://$MODULE_DIR$/build/intermediates/manifests" />
-      <excludeFolder url="file://$MODULE_DIR$/build/intermediates/ndk" />
-      <excludeFolder url="file://$MODULE_DIR$/build/intermediates/pre-dexed" />
-      <excludeFolder url="file://$MODULE_DIR$/build/intermediates/proguard" />
-      <excludeFolder url="file://$MODULE_DIR$/build/intermediates/res" />
-      <excludeFolder url="file://$MODULE_DIR$/build/intermediates/rs" />
-      <excludeFolder url="file://$MODULE_DIR$/build/intermediates/symbols" />
-      <excludeFolder url="file://$MODULE_DIR$/build/outputs" />
-    </content>
-    <orderEntry type="jdk" jdkName="Android API 22 Platform" jdkType="Android SDK" />
-    <orderEntry type="sourceFolder" forTests="false" />
-    <orderEntry type="library" exported="" name="appcompat-v7-22.1.1" level="project" />
-    <orderEntry type="library" exported="" name="support-v4-22.1.1" level="project" />
-    <orderEntry type="library" exported="" name="support-annotations-22.1.1" level="project" />
-  </component>
-</module>
\ No newline at end of file
diff --git a/android/app/build.gradle b/android/app/build.gradle
index a1b3d89..24d84f6 100644
--- a/android/app/build.gradle
+++ b/android/app/build.gradle
@@ -1,12 +1,33 @@
 apply plugin: 'com.android.application'
 
+buildscript {
+    repositories {
+        mavenCentral()
+        maven {
+            url 'http://jring.mtv:8081/nexus/content/repositories/test_repo'
+        }
+    }
+    dependencies {
+        classpath 'io.v:gradle-plugin:0.1-SNAPSHOT'
+    }
+}
+
+apply plugin: 'io.v.vdl'
+
+repositories {
+    mavenCentral()
+    maven {
+        url 'http://jring.mtv:8081/nexus/content/repositories/test_repo'
+    }
+}
+
 android {
     compileSdkVersion 22
     buildToolsVersion "22.0.1"
 
     defaultConfig {
-        applicationId "io.v.projects.mediasharing"
-        minSdkVersion 15
+        applicationId "io.v.x.media_sharing"
+        minSdkVersion 19
         targetSdkVersion 22
         versionCode 1
         versionName "1.0"
@@ -17,9 +38,22 @@
             proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
         }
     }
+    packagingOptions {
+        exclude 'META-INF/LICENSE.txt' // Duplicate clash between commons-io and joda-time
+        exclude 'META-INF/NOTICE.txt' // Duplicate clash between commons-io and joda-time
+        exclude 'META-INF/MANIFEST.MF' // Duplicate clash between commons-io and joda-time
+    }
+    sourceSets.main.java.srcDirs = ['src/main/java', '../generated-src/vdl']
 }
 
 dependencies {
     compile fileTree(dir: 'libs', include: ['*.jar'])
     compile 'com.android.support:appcompat-v7:22.1.1'
+    compile 'io.v:vanadium:0.1-SNAPSHOT'
+    compile 'io.v:vanadium-android:0.1-SNAPSHOT'
+    compile group: 'commons-io', name: 'commons-io', version: '2.4'
 }
+
+vdl {
+    inputPaths += "$projectDir/../../go"
+}
\ No newline at end of file
diff --git a/android/app/generated-src/vdl/io/v/x/media_sharing/MediaSharingClient.java b/android/app/generated-src/vdl/io/v/x/media_sharing/MediaSharingClient.java
new file mode 100644
index 0000000..0cd50d8
--- /dev/null
+++ b/android/app/generated-src/vdl/io/v/x/media_sharing/MediaSharingClient.java
@@ -0,0 +1,39 @@
+// Copyright 2015 The Vanadium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+// This file was auto-generated by the vanadium vdl tool.
+
+// Source: media.vdl
+package io.v.x.media_sharing;
+
+
+public interface MediaSharingClient  {
+
+    
+    
+
+    
+    /**
+ * DisplayURL will cause the server to display whatever media is at
+ * the given URL.  The server will rely on the ContentType response
+ * header it gets when fetching the url to decide how to display
+ * the media.
+*/
+    void displayUrl(io.v.v23.context.VContext context, final java.lang.String url) throws io.v.v23.verror.VException;
+    void displayUrl(io.v.v23.context.VContext context, final java.lang.String url, io.v.v23.Options vOpts) throws io.v.v23.verror.VException;
+
+    
+    
+
+    
+    /**
+ * DisplayBytes will cause the server to display whatever media is
+ * sent in the stream.  In the case of audio or movie media, the
+ * media should be played while the data is streaming.  The mediaType
+ * can be used by the server to decide how to display the media.
+*/
+    io.v.v23.vdl.ClientStream<byte[], java.lang.Void, java.lang.Void> displayBytes(io.v.v23.context.VContext context, final java.lang.String mediaType) throws io.v.v23.verror.VException;
+    io.v.v23.vdl.ClientStream<byte[], java.lang.Void, java.lang.Void> displayBytes(io.v.v23.context.VContext context, final java.lang.String mediaType, io.v.v23.Options vOpts) throws io.v.v23.verror.VException;
+
+}
diff --git a/android/app/generated-src/vdl/io/v/x/media_sharing/MediaSharingClientFactory.java b/android/app/generated-src/vdl/io/v/x/media_sharing/MediaSharingClientFactory.java
new file mode 100644
index 0000000..f2cbde9
--- /dev/null
+++ b/android/app/generated-src/vdl/io/v/x/media_sharing/MediaSharingClientFactory.java
@@ -0,0 +1,42 @@
+// Copyright 2015 The Vanadium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+// This file was auto-generated by the vanadium vdl tool.
+
+// Source(s):  media.vdl
+package io.v.x.media_sharing;
+
+/**
+ * Factory for {@link MediaSharingClient}s.
+ */
+public final class MediaSharingClientFactory {
+    /**
+     * Creates a new {@link MediaSharingClient}, binding it to the provided name.
+     *
+     * @param name name to bind to
+     */
+    public static MediaSharingClient getMediaSharingClient(java.lang.String name) {
+        return getMediaSharingClient(name, null);
+    }
+
+    /**
+     * Creates a new {@link MediaSharingClient}, binding it to the provided name and using the
+     * provided options.  Currently supported options are:
+     * <p><ul>
+     * <li>{@link io.v.v23.OptionDefs#CLIENT}, which specifies a {@link io.v.v23.rpc.Client} to use for all rpc calls.</li>
+     * </ul>
+     *
+     * @param name name to bind to
+     * @param opts creation options
+     */
+    public static MediaSharingClient getMediaSharingClient(java.lang.String name, io.v.v23.Options opts) {
+        io.v.v23.rpc.Client client = null;
+        if (opts != null && opts.get(io.v.v23.OptionDefs.CLIENT) != null) {
+            client = opts.get(io.v.v23.OptionDefs.CLIENT, io.v.v23.rpc.Client.class);
+        }
+        return new MediaSharingClientImpl(client, name);
+    }
+
+    private MediaSharingClientFactory() {}
+}
diff --git a/android/app/generated-src/vdl/io/v/x/media_sharing/MediaSharingClientImpl.java b/android/app/generated-src/vdl/io/v/x/media_sharing/MediaSharingClientImpl.java
new file mode 100644
index 0000000..d88f2c8
--- /dev/null
+++ b/android/app/generated-src/vdl/io/v/x/media_sharing/MediaSharingClientImpl.java
@@ -0,0 +1,116 @@
+// Copyright 2015 The Vanadium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+// This file was auto-generated by the vanadium vdl tool.
+
+// Source(s):  media.vdl
+package io.v.x.media_sharing;
+
+/**
+ * Implementation of the {@link MediaSharingClient} interface.
+ */
+final class MediaSharingClientImpl implements io.v.x.media_sharing.MediaSharingClient {
+    private final io.v.v23.rpc.Client client;
+    private final java.lang.String vName;
+
+    
+    
+
+    /**
+     * Creates a new instance of {@link MediaSharingClientImpl}.
+     *
+     * @param client Vanadium client
+     * @param vName  remote server name
+     */
+    public MediaSharingClientImpl(io.v.v23.rpc.Client client, java.lang.String vName) {
+        this.client = client;
+        this.vName = vName;
+        
+        
+    }
+
+    private io.v.v23.rpc.Client getClient(io.v.v23.context.VContext context) {
+        return this.client != null ? client : io.v.v23.V.getClient(context);
+
+    }
+
+    // Methods from interface MediaSharingClient.
+
+
+    
+    @Override
+    public void displayUrl(io.v.v23.context.VContext context, final java.lang.String url) throws io.v.v23.verror.VException {
+         displayUrl(context, url, null);
+    }
+    
+    @Override
+    public void displayUrl(io.v.v23.context.VContext context, final java.lang.String url, io.v.v23.Options vOpts) throws io.v.v23.verror.VException {
+        
+        // Start the call.
+        java.lang.Object[] _args = new java.lang.Object[]{ url };
+        java.lang.reflect.Type[] _argTypes = new java.lang.reflect.Type[]{ new com.google.common.reflect.TypeToken<java.lang.String>(){}.getType() };
+        final io.v.v23.rpc.Client.Call _call = getClient(context).startCall(context, this.vName, "displayUrl", _args, _argTypes, vOpts);
+
+        // Finish the call.
+        
+        
+
+        
+        java.lang.reflect.Type[] _resultTypes = new java.lang.reflect.Type[]{};
+        _call.finish(_resultTypes);
+         
+
+        
+    }
+
+    
+    @Override
+    public io.v.v23.vdl.ClientStream<byte[], java.lang.Void, java.lang.Void> displayBytes(io.v.v23.context.VContext context, final java.lang.String mediaType) throws io.v.v23.verror.VException {
+        return displayBytes(context, mediaType, null);
+    }
+    
+    @Override
+    public io.v.v23.vdl.ClientStream<byte[], java.lang.Void, java.lang.Void> displayBytes(io.v.v23.context.VContext context, final java.lang.String mediaType, io.v.v23.Options vOpts) throws io.v.v23.verror.VException {
+        
+        // Start the call.
+        java.lang.Object[] _args = new java.lang.Object[]{ mediaType };
+        java.lang.reflect.Type[] _argTypes = new java.lang.reflect.Type[]{ new com.google.common.reflect.TypeToken<java.lang.String>(){}.getType() };
+        final io.v.v23.rpc.Client.Call _call = getClient(context).startCall(context, this.vName, "displayBytes", _args, _argTypes, vOpts);
+
+        // Finish the call.
+        
+         
+        return new io.v.v23.vdl.ClientStream<byte[], java.lang.Void, java.lang.Void>() {
+            @Override
+            public void send(byte[] item) throws io.v.v23.verror.VException {
+                java.lang.reflect.Type type = new com.google.common.reflect.TypeToken<byte[]>() {}.getType();
+                _call.send(item, type);
+            }
+            @Override
+            public java.lang.Void recv() throws java.io.EOFException, io.v.v23.verror.VException {
+                java.lang.reflect.Type type = new com.google.common.reflect.TypeToken<java.lang.Void>() {}.getType();
+                java.lang.Object result = _call.recv(type);
+                try {
+                    return (java.lang.Void)result;
+                } catch (java.lang.ClassCastException e) {
+                    throw new io.v.v23.verror.VException("Unexpected result type: " + result.getClass().getCanonicalName());
+                }
+            }
+            @Override
+            public java.lang.Void finish() throws io.v.v23.verror.VException {
+                
+                java.lang.reflect.Type[] resultTypes = new java.lang.reflect.Type[]{};
+                _call.finish(resultTypes);
+                return null;
+                 
+            }
+        };
+        
+    }
+
+
+
+
+
+}
diff --git a/android/app/generated-src/vdl/io/v/x/media_sharing/MediaSharingServer.java b/android/app/generated-src/vdl/io/v/x/media_sharing/MediaSharingServer.java
new file mode 100644
index 0000000..c2f1489
--- /dev/null
+++ b/android/app/generated-src/vdl/io/v/x/media_sharing/MediaSharingServer.java
@@ -0,0 +1,40 @@
+// Copyright 2015 The Vanadium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+// This file was auto-generated by the vanadium vdl tool.
+
+// Source: media.vdl
+package io.v.x.media_sharing;
+
+
+@io.v.v23.vdl.VServer(
+    serverWrapper = io.v.x.media_sharing.MediaSharingServerWrapper.class
+)
+public interface MediaSharingServer  {
+
+    
+    
+
+    
+    /**
+ * DisplayURL will cause the server to display whatever media is at
+ * the given URL.  The server will rely on the ContentType response
+ * header it gets when fetching the url to decide how to display
+ * the media.
+*/
+    void displayUrl(io.v.v23.context.VContext ctx, io.v.v23.rpc.ServerCall call, final java.lang.String url) throws io.v.v23.verror.VException;
+
+    
+    
+
+    
+    /**
+ * DisplayBytes will cause the server to display whatever media is
+ * sent in the stream.  In the case of audio or movie media, the
+ * media should be played while the data is streaming.  The mediaType
+ * can be used by the server to decide how to display the media.
+*/
+    void displayBytes(io.v.v23.context.VContext ctx, io.v.v23.rpc.ServerCall call, final java.lang.String mediaType, io.v.v23.vdl.Stream<java.lang.Void, byte[]> stream) throws io.v.v23.verror.VException;
+
+}
diff --git a/android/app/generated-src/vdl/io/v/x/media_sharing/MediaSharingServerWrapper.java b/android/app/generated-src/vdl/io/v/x/media_sharing/MediaSharingServerWrapper.java
new file mode 100644
index 0000000..d70ee56
--- /dev/null
+++ b/android/app/generated-src/vdl/io/v/x/media_sharing/MediaSharingServerWrapper.java
@@ -0,0 +1,168 @@
+// Copyright 2015 The Vanadium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+// This file was auto-generated by the vanadium vdl tool.
+
+// Source(s):  media.vdl
+package io.v.x.media_sharing;
+
+/**
+ * Wrapper for {@link MediaSharingServer}.  This wrapper is used by
+ * {@link io.v.v23.rpc.ReflectInvoker} to indirectly invoke server methods.
+ */
+public final class MediaSharingServerWrapper {
+    private final io.v.x.media_sharing.MediaSharingServer server;
+
+
+
+
+    /**
+     * Creates a new {@link MediaSharingServerWrapper} to invoke the methods of the
+     * provided server.
+     *
+     * @param server server whose methods are to be invoked
+     */
+    public MediaSharingServerWrapper(io.v.x.media_sharing.MediaSharingServer server) {
+        this.server = server;
+        
+        
+    }
+
+    /**
+     * Returns a description of this server.
+     */
+    public io.v.v23.vdlroot.signature.Interface signature() {
+        java.util.List<io.v.v23.vdlroot.signature.Embed> embeds = new java.util.ArrayList<io.v.v23.vdlroot.signature.Embed>();
+        java.util.List<io.v.v23.vdlroot.signature.Method> methods = new java.util.ArrayList<io.v.v23.vdlroot.signature.Method>();
+        
+        {
+            java.util.List<io.v.v23.vdlroot.signature.Arg> inArgs = new java.util.ArrayList<io.v.v23.vdlroot.signature.Arg>();
+            
+            inArgs.add(new io.v.v23.vdlroot.signature.Arg("", "", new io.v.v23.vdl.VdlTypeObject(new com.google.common.reflect.TypeToken<java.lang.String>(){}.getType())));
+            
+            java.util.List<io.v.v23.vdlroot.signature.Arg> outArgs = new java.util.ArrayList<io.v.v23.vdlroot.signature.Arg>();
+            
+            java.util.List<io.v.v23.vdl.VdlAny> tags = new java.util.ArrayList<io.v.v23.vdl.VdlAny>();
+            
+            methods.add(new io.v.v23.vdlroot.signature.Method(
+                "displayUrl",
+                "// DisplayURL will cause the server to display whatever media is at" + 
+"// the given URL.  The server will rely on the ContentType response" + 
+"// header it gets when fetching the url to decide how to display" + 
+"// the media." + 
+"",
+                inArgs,
+                outArgs,
+                null,
+                null,
+                tags));
+        }
+        
+        {
+            java.util.List<io.v.v23.vdlroot.signature.Arg> inArgs = new java.util.ArrayList<io.v.v23.vdlroot.signature.Arg>();
+            
+            inArgs.add(new io.v.v23.vdlroot.signature.Arg("", "", new io.v.v23.vdl.VdlTypeObject(new com.google.common.reflect.TypeToken<java.lang.String>(){}.getType())));
+            
+            java.util.List<io.v.v23.vdlroot.signature.Arg> outArgs = new java.util.ArrayList<io.v.v23.vdlroot.signature.Arg>();
+            
+            java.util.List<io.v.v23.vdl.VdlAny> tags = new java.util.ArrayList<io.v.v23.vdl.VdlAny>();
+            
+            methods.add(new io.v.v23.vdlroot.signature.Method(
+                "displayBytes",
+                "// DisplayBytes will cause the server to display whatever media is" + 
+"// sent in the stream.  In the case of audio or movie media, the" + 
+"// media should be played while the data is streaming.  The mediaType" + 
+"// can be used by the server to decide how to display the media." + 
+"",
+                inArgs,
+                outArgs,
+                null,
+                null,
+                tags));
+        }
+        
+
+        return new io.v.v23.vdlroot.signature.Interface("MediaSharing", "io.v.x.media_sharing", "", embeds, methods);
+    }
+
+    /**
+     * Returns all tags associated with the provided method or {@code null} if the method isn't
+     * implemented by this server.
+     *
+     * @param method method whose tags are to be returned
+     */
+    @SuppressWarnings("unused")
+    public io.v.v23.vdl.VdlValue[] getMethodTags(java.lang.String method) throws io.v.v23.verror.VException {
+        
+        if ("displayBytes".equals(method)) {
+            try {
+                return new io.v.v23.vdl.VdlValue[] {
+                    
+                };
+            } catch (IllegalArgumentException e) {
+                throw new io.v.v23.verror.VException(String.format("Couldn't get tags for method \"displayBytes\": %s", e.getMessage()));
+            }
+        }
+        
+        if ("displayUrl".equals(method)) {
+            try {
+                return new io.v.v23.vdl.VdlValue[] {
+                    
+                };
+            } catch (IllegalArgumentException e) {
+                throw new io.v.v23.verror.VException(String.format("Couldn't get tags for method \"displayUrl\": %s", e.getMessage()));
+            }
+        }
+        
+        
+        return null;  // method not found
+    }
+
+     
+    
+    /**
+ * DisplayURL will cause the server to display whatever media is at
+ * the given URL.  The server will rely on the ContentType response
+ * header it gets when fetching the url to decide how to display
+ * the media.
+*/
+    public void displayUrl(io.v.v23.context.VContext ctx, final io.v.v23.rpc.StreamServerCall call, final java.lang.String url) throws io.v.v23.verror.VException {
+         
+         this.server.displayUrl(ctx, call , url  );
+    }
+
+    /**
+ * DisplayBytes will cause the server to display whatever media is
+ * sent in the stream.  In the case of audio or movie media, the
+ * media should be played while the data is streaming.  The mediaType
+ * can be used by the server to decide how to display the media.
+*/
+    public void displayBytes(io.v.v23.context.VContext ctx, final io.v.v23.rpc.StreamServerCall call, final java.lang.String mediaType) throws io.v.v23.verror.VException {
+        
+        io.v.v23.vdl.Stream<java.lang.Void, byte[]> _stream = new io.v.v23.vdl.Stream<java.lang.Void, byte[]>() {
+            @Override
+            public void send(java.lang.Void item) throws io.v.v23.verror.VException {
+                java.lang.reflect.Type type = new com.google.common.reflect.TypeToken< java.lang.Void >() {}.getType();
+                call.send(item, type);
+            }
+            @Override
+            public byte[] recv() throws java.io.EOFException, io.v.v23.verror.VException {
+                java.lang.reflect.Type type = new com.google.common.reflect.TypeToken< byte[] >() {}.getType();
+                java.lang.Object result = call.recv(type);
+                try {
+                    return (byte[])result;
+                } catch (java.lang.ClassCastException e) {
+                    throw new io.v.v23.verror.VException("Unexpected result type: " + result.getClass().getCanonicalName());
+                }
+            }
+        };
+         
+         this.server.displayBytes(ctx, call , mediaType  ,_stream  );
+    }
+
+
+
+ 
+
+}
diff --git a/android/app/src/androidTest/java/io/v/projects/mediasharing/ApplicationTest.java b/android/app/src/androidTest/java/io/v/x/media_sharing/ApplicationTest.java
similarity index 92%
rename from android/app/src/androidTest/java/io/v/projects/mediasharing/ApplicationTest.java
rename to android/app/src/androidTest/java/io/v/x/media_sharing/ApplicationTest.java
index a3c8324..020b3df 100644
--- a/android/app/src/androidTest/java/io/v/projects/mediasharing/ApplicationTest.java
+++ b/android/app/src/androidTest/java/io/v/x/media_sharing/ApplicationTest.java
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style
 // license that can be found in the LICENSE file.
 
-package io.v.projects.mediasharing;
+package io.v.x.media_sharing;
 
 import android.app.Application;
 import android.test.ApplicationTestCase;
diff --git a/android/app/src/main/AndroidManifest.xml b/android/app/src/main/AndroidManifest.xml
index 10283f4..3022450 100644
--- a/android/app/src/main/AndroidManifest.xml
+++ b/android/app/src/main/AndroidManifest.xml
@@ -1,9 +1,23 @@
+<?xml version="1.0" encoding="utf-8"?>
 <manifest xmlns:android="http://schemas.android.com/apk/res/android"
-    package="io.v.projects.mediasharing">
+    package="io.v.x.media_sharing" >
 
-    <application android:allowBackup="true" android:label="@string/app_name"
-        android:icon="@mipmap/ic_launcher" android:theme="@style/AppTheme">
-
+    <application
+        android:allowBackup="true"
+        android:icon="@mipmap/ic_launcher"
+        android:label="@string/app_name"
+        android:theme="@style/Theme.AppCompat.Dialog" >
+        <activity
+            android:name="io.v.x.media_sharing.MediaSharingActivity"
+            android:label="@string/title_activity_media_sharing" >
+            <intent-filter>
+                <action android:name="android.intent.action.SEND" />
+                <category android:name="android.intent.category.DEFAULT" />
+                <data android:mimeType="image/*" />
+                <data android:mimeType="video/*" />
+                <data android:mimeType="text/plain" />
+            </intent-filter>
+        </activity>
     </application>
 
 </manifest>
diff --git a/android/app/src/main/java/io/v/x/media_sharing/ClientByteOutputStream.java b/android/app/src/main/java/io/v/x/media_sharing/ClientByteOutputStream.java
new file mode 100644
index 0000000..26b38e0
--- /dev/null
+++ b/android/app/src/main/java/io/v/x/media_sharing/ClientByteOutputStream.java
@@ -0,0 +1,51 @@
+// Copyright 2015 The Vanadium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+package io.v.x.media_sharing;
+
+import java.io.IOException;
+import java.io.OutputStream;
+import java.util.Arrays;
+
+import io.v.v23.vdl.TypedClientStream;
+import io.v.v23.verror.VException;
+
+/**
+ * Output stream that writes to a Vanadium byte stream.
+ */
+class ClientByteOutputStream extends OutputStream {
+    private TypedClientStream<byte[], Void, Void> clientStream;
+    public ClientByteOutputStream(TypedClientStream<byte[], Void, Void> clientStream) {
+        this.clientStream = clientStream;
+    }
+
+    @Override
+    public void write(int oneByte) throws IOException {
+        this.write(new byte[]{(byte)oneByte});
+    }
+
+    @Override
+    public void write(byte[] b) throws IOException {
+        try {
+            this.clientStream.send(b);
+        } catch (VException e) {
+            throw new IOException("Failed to write data to client stream", e);
+        }
+    }
+
+    @Override
+    public void write(byte[] b, int off, int len) throws IOException {
+        this.write(Arrays.copyOfRange(b, off, off + len));
+    }
+
+    @Override
+    public void close() {
+        // stream.finish() should be called separately
+    }
+
+    @Override
+    public void flush(){
+        // ignore
+    }
+}
diff --git a/android/app/src/main/java/io/v/x/media_sharing/MediaSharingActivity.java b/android/app/src/main/java/io/v/x/media_sharing/MediaSharingActivity.java
new file mode 100644
index 0000000..98c8a89
--- /dev/null
+++ b/android/app/src/main/java/io/v/x/media_sharing/MediaSharingActivity.java
@@ -0,0 +1,67 @@
+// Copyright 2015 The Vanadium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+package io.v.x.media_sharing;
+
+import android.content.Intent;
+import android.net.Uri;
+import android.support.v7.app.ActionBarActivity;
+import android.os.Bundle;
+import android.view.Menu;
+import android.view.MenuItem;
+
+import io.v.v23.V;
+import io.v.v23.context.VContext;
+
+
+public class MediaSharingActivity extends ActionBarActivity {
+    // Target name must be entered manually. Go to namespace browser for the name you want to
+    // connect to and copy the proxied name here.
+    private static final String targetName = "";
+
+    @Override
+    protected void onCreate(Bundle savedInstanceState) {
+        super.onCreate(savedInstanceState);
+        setContentView(R.layout.activity_media_sharing);
+
+        VContext vContext = V.init();
+
+        String action = getIntent().getAction();
+        String type = getIntent().getType();
+        if (Intent.ACTION_SEND.equals(action) && type != null) {
+            if (type.startsWith("image/") || type.startsWith("video/")) {
+                Uri uri = (Uri)getIntent().getExtras().get(Intent.EXTRA_STREAM);
+                String mimeType = getIntent().getType();
+
+                new SendMediaTask(this, vContext, targetName, uri, mimeType).execute();
+            } else if ("text/plain".equals(type)) {
+                String url = (String)getIntent().getExtras().get(Intent.EXTRA_TEXT);
+                new SendUrlTask(vContext, targetName, url).execute();
+            }
+        }
+    }
+
+
+    @Override
+    public boolean onCreateOptionsMenu(Menu menu) {
+        // Inflate the menu; this adds items to the action bar if it is present.
+        getMenuInflater().inflate(R.menu.menu_media_sharing, menu);
+        return true;
+    }
+
+    @Override
+    public boolean onOptionsItemSelected(MenuItem item) {
+        // Handle action bar item clicks here. The action bar will
+        // automatically handle clicks on the Home/Up button, so long
+        // as you specify a parent activity in AndroidManifest.xml.
+        int id = item.getItemId();
+
+        //noinspection SimplifiableIfStatement
+        if (id == R.id.action_settings) {
+            return true;
+        }
+
+        return super.onOptionsItemSelected(item);
+    }
+}
diff --git a/android/app/src/main/java/io/v/x/media_sharing/MediaSharingActivityFragment.java b/android/app/src/main/java/io/v/x/media_sharing/MediaSharingActivityFragment.java
new file mode 100644
index 0000000..1d37f80
--- /dev/null
+++ b/android/app/src/main/java/io/v/x/media_sharing/MediaSharingActivityFragment.java
@@ -0,0 +1,27 @@
+// Copyright 2015 The Vanadium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+package io.v.x.media_sharing;
+
+import android.support.v4.app.Fragment;
+import android.os.Bundle;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.view.ViewGroup;
+
+
+/**
+ * A placeholder fragment containing a simple view.
+ */
+public class MediaSharingActivityFragment extends Fragment {
+
+    public MediaSharingActivityFragment() {
+    }
+
+    @Override
+    public View onCreateView(LayoutInflater inflater, ViewGroup container,
+                             Bundle savedInstanceState) {
+        return inflater.inflate(R.layout.fragment_media_sharing, container, false);
+    }
+}
diff --git a/android/app/src/main/java/io/v/x/media_sharing/SendMediaTask.java b/android/app/src/main/java/io/v/x/media_sharing/SendMediaTask.java
new file mode 100644
index 0000000..464a332
--- /dev/null
+++ b/android/app/src/main/java/io/v/x/media_sharing/SendMediaTask.java
@@ -0,0 +1,65 @@
+// Copyright 2015 The Vanadium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+package io.v.x.media_sharing;
+
+import android.app.Activity;
+import android.net.Uri;
+import android.os.AsyncTask;
+
+import org.apache.commons.io.IOUtils;
+
+import java.io.IOException;
+import java.io.InputStream;
+
+import io.v.v23.OptionDefs;
+import io.v.v23.Options;
+import io.v.v23.context.VContext;
+import io.v.v23.vdl.TypedClientStream;
+import io.v.v23.verror.VException;
+
+/**
+ * Background task to stream media without blocking the UI thread.
+ */
+public class SendMediaTask extends AsyncTask<Void, Void, Void> {
+    Activity activity;
+    VContext vContext;
+    String targetName;
+    Uri uri;
+    String mimeType;
+
+    public SendMediaTask(Activity activity, VContext vContext, String targetName, Uri uri, String mimeType) {
+        this.activity = activity;
+        this.vContext = vContext;
+        this.targetName = targetName;
+        this.uri = uri;
+        this.mimeType = mimeType;
+    }
+
+    @Override
+    protected Void doInBackground(Void... params) {
+        try {
+            InputStream is = activity.getContentResolver().openInputStream(uri);
+
+            MediaSharingClient client = MediaSharingClientFactory.getMediaSharingClient(targetName);
+            
+            // TODO(bprosnitz) Remove this option when possible. It is allows the app to connect
+            // without having the proper blessings.
+            Options opts = new Options();
+            opts.set(OptionDefs.SKIP_SERVER_ENDPOINT_AUTHORIZATION, true);
+
+            String mimeType = activity.getIntent().getType();
+            TypedClientStream<byte[], Void, Void> stream = client.displayBytes(vContext, mimeType, opts);
+
+            ClientByteOutputStream os = new ClientByteOutputStream(stream);
+            IOUtils.copy(is, os);
+            stream.finish();
+            return null;
+        } catch (IOException e) {
+            throw new RuntimeException(e);
+        } catch (VException e) {
+            throw new RuntimeException(e);
+        }
+    }
+}
diff --git a/android/app/src/main/java/io/v/x/media_sharing/SendUrlTask.java b/android/app/src/main/java/io/v/x/media_sharing/SendUrlTask.java
new file mode 100644
index 0000000..8dc4723
--- /dev/null
+++ b/android/app/src/main/java/io/v/x/media_sharing/SendUrlTask.java
@@ -0,0 +1,44 @@
+// Copyright 2015 The Vanadium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+package io.v.x.media_sharing;
+
+import android.os.AsyncTask;
+
+import io.v.v23.OptionDefs;
+import io.v.v23.Options;
+import io.v.v23.context.VContext;
+import io.v.v23.verror.VException;
+
+/**
+ * Background task to send a URL without blocking the UI thread.
+ */
+public class SendUrlTask extends AsyncTask<Void, Void, Void> {
+    VContext vContext;
+    String targetName;
+    String url;
+
+    public SendUrlTask(VContext vContext, String targetName, String url) {
+        this.vContext = vContext;
+        this.targetName = targetName;
+        this.url = url;
+    }
+
+    @Override
+    protected Void doInBackground(Void... params) {
+        try {
+            MediaSharingClient client = MediaSharingClientFactory.getMediaSharingClient(targetName);
+
+            // TODO(bprosnitz) Remove this option when possible. It is allows the app to connect
+            // without having the proper blessings.
+            Options opts = new Options();
+            opts.set(OptionDefs.SKIP_SERVER_ENDPOINT_AUTHORIZATION, true);
+
+            client.displayUrl(vContext, url, opts);
+            return null;
+        } catch (VException e) {
+            throw new RuntimeException(e);
+        }
+    }
+}
diff --git a/android/app/src/main/res/layout/activity_media_sharing.xml b/android/app/src/main/res/layout/activity_media_sharing.xml
new file mode 100644
index 0000000..25f79c5
--- /dev/null
+++ b/android/app/src/main/res/layout/activity_media_sharing.xml
@@ -0,0 +1,5 @@
+<fragment xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:tools="http://schemas.android.com/tools" android:id="@+id/fragment"
+    android:name="io.v.x.media_sharing.MediaSharingActivityFragment"
+    tools:layout="@layout/fragment_media_sharing" android:layout_width="match_parent"
+    android:layout_height="match_parent" />
diff --git a/android/app/src/main/res/layout/fragment_media_sharing.xml b/android/app/src/main/res/layout/fragment_media_sharing.xml
new file mode 100644
index 0000000..8bd2c36
--- /dev/null
+++ b/android/app/src/main/res/layout/fragment_media_sharing.xml
@@ -0,0 +1,12 @@
+<RelativeLayout 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" android:paddingLeft="@dimen/activity_horizontal_margin"
+    android:paddingRight="@dimen/activity_horizontal_margin"
+    android:paddingTop="@dimen/activity_vertical_margin"
+    android:paddingBottom="@dimen/activity_vertical_margin"
+    tools:context="io.v.x.media_sharing.MediaSharingActivityFragment">
+
+    <TextView android:text="@string/media_sharing_message" android:layout_width="wrap_content"
+        android:layout_height="wrap_content" />
+
+</RelativeLayout>
diff --git a/android/app/src/main/res/menu/menu_media_sharing.xml b/android/app/src/main/res/menu/menu_media_sharing.xml
new file mode 100644
index 0000000..a2e3127
--- /dev/null
+++ b/android/app/src/main/res/menu/menu_media_sharing.xml
@@ -0,0 +1,7 @@
+<menu xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:app="http://schemas.android.com/apk/res-auto"
+    xmlns:tools="http://schemas.android.com/tools"
+    tools:context="io.v.x.mediasharing.MediaSharingActivity">
+    <item android:id="@+id/action_settings" android:title="@string/action_settings"
+        android:orderInCategory="100" app:showAsAction="never" />
+</menu>
diff --git a/android/app/src/main/res/mipmap-hdpi/ic_launcher.png b/android/app/src/main/res/mipmap-hdpi/ic_launcher.png
index cde69bc..4eed94e 100644
--- a/android/app/src/main/res/mipmap-hdpi/ic_launcher.png
+++ b/android/app/src/main/res/mipmap-hdpi/ic_launcher.png
Binary files differ
diff --git a/android/app/src/main/res/mipmap-mdpi/ic_launcher.png b/android/app/src/main/res/mipmap-mdpi/ic_launcher.png
index c133a0c..61e8910 100644
--- a/android/app/src/main/res/mipmap-mdpi/ic_launcher.png
+++ b/android/app/src/main/res/mipmap-mdpi/ic_launcher.png
Binary files differ
diff --git a/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png b/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png
index bfa42f0..c79b512 100644
--- a/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png
+++ b/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png
Binary files differ
diff --git a/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png b/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png
index 324e72c..0e624d4 100644
--- a/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png
+++ b/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png
Binary files differ
diff --git a/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png b/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png
new file mode 100644
index 0000000..e38df02
--- /dev/null
+++ b/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png
Binary files differ
diff --git a/android/app/src/main/res/values-w820dp/dimens.xml b/android/app/src/main/res/values-w820dp/dimens.xml
new file mode 100644
index 0000000..63fc816
--- /dev/null
+++ b/android/app/src/main/res/values-w820dp/dimens.xml
@@ -0,0 +1,6 @@
+<resources>
+    <!-- Example customization of dimensions originally defined in res/values/dimens.xml
+         (such as screen margins) for screens with more than 820dp of available width. This
+         would include 7" and 10" devices in landscape (~960dp and ~1280dp respectively). -->
+    <dimen name="activity_horizontal_margin">64dp</dimen>
+</resources>
diff --git a/android/app/src/main/res/values/dimens.xml b/android/app/src/main/res/values/dimens.xml
new file mode 100644
index 0000000..47c8224
--- /dev/null
+++ b/android/app/src/main/res/values/dimens.xml
@@ -0,0 +1,5 @@
+<resources>
+    <!-- Default screen margins, per the Android Design guidelines. -->
+    <dimen name="activity_horizontal_margin">16dp</dimen>
+    <dimen name="activity_vertical_margin">16dp</dimen>
+</resources>
diff --git a/android/app/src/main/res/values/strings.xml b/android/app/src/main/res/values/strings.xml
index 1a7c6d3..6f4eb76 100644
--- a/android/app/src/main/res/values/strings.xml
+++ b/android/app/src/main/res/values/strings.xml
@@ -1,3 +1,6 @@
 <resources>
     <string name="app_name">MediaSharing</string>
+    <string name="title_activity_media_sharing">Media Sharing</string>
+    <string name="action_settings">Settings</string>
+    <string name="media_sharing_message">Sharing Media...</string>
 </resources>