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>