Android: Adding PresenceClient\PresenceServer examples
authorTim Kourt <tim.a.kourt@intel.com>
Wed, 9 Sep 2015 20:47:46 +0000 (13:47 -0700)
committerPatrick Lankswert <patrick.lankswert@intel.com>
Sat, 19 Sep 2015 12:24:50 +0000 (12:24 +0000)
PS2: adding modified settings.gradle

Change-Id: Iedba236264ab2b58bb55e11e8f4ea7f8b3871603
Signed-off-by: Tim Kourt <tim.a.kourt@intel.com>
Reviewed-on: https://gerrit.iotivity.org/gerrit/2433
Tested-by: jenkins-iotivity <jenkins-iotivity@opendaylight.org>
Reviewed-by: Patrick Lankswert <patrick.lankswert@intel.com>
35 files changed:
android/examples/presenceclient/.gitignore [new file with mode: 0644]
android/examples/presenceclient/build.gradle [new file with mode: 0644]
android/examples/presenceclient/presenceclient.iml [new file with mode: 0644]
android/examples/presenceclient/src/main/AndroidManifest.xml [new file with mode: 0644]
android/examples/presenceclient/src/main/java/org/iotivity/base/examples/PresenceClient.java [new file with mode: 0644]
android/examples/presenceclient/src/main/res/drawable/iotivityicon.png [new file with mode: 0644]
android/examples/presenceclient/src/main/res/drawable/iotivitylogo.png [new file with mode: 0644]
android/examples/presenceclient/src/main/res/layout/activity_presence_client.xml [new file with mode: 0644]
android/examples/presenceclient/src/main/res/mipmap-hdpi/iotivityicon.png [new file with mode: 0644]
android/examples/presenceclient/src/main/res/mipmap-mdpi/iotivityicon.png [new file with mode: 0644]
android/examples/presenceclient/src/main/res/mipmap-xhdpi/iotivityicon.png [new file with mode: 0644]
android/examples/presenceclient/src/main/res/mipmap-xxhdpi/iotivityicon.png [new file with mode: 0644]
android/examples/presenceclient/src/main/res/values-v21/styles.xml [new file with mode: 0644]
android/examples/presenceclient/src/main/res/values-w820dp/dimens.xml [new file with mode: 0644]
android/examples/presenceclient/src/main/res/values/dimens.xml [new file with mode: 0644]
android/examples/presenceclient/src/main/res/values/strings.xml [new file with mode: 0644]
android/examples/presenceclient/src/main/res/values/styles.xml [new file with mode: 0644]
android/examples/presenceserver/.gitignore [new file with mode: 0644]
android/examples/presenceserver/build.gradle [new file with mode: 0644]
android/examples/presenceserver/presenceserver.iml [new file with mode: 0644]
android/examples/presenceserver/src/main/AndroidManifest.xml [new file with mode: 0644]
android/examples/presenceserver/src/main/java/org/iotivity/base/examples/PresenceServer.java [new file with mode: 0644]
android/examples/presenceserver/src/main/res/drawable/iotivityicon.png [new file with mode: 0644]
android/examples/presenceserver/src/main/res/drawable/iotivitylogo.png [new file with mode: 0644]
android/examples/presenceserver/src/main/res/layout/activity_presence_server.xml [new file with mode: 0644]
android/examples/presenceserver/src/main/res/mipmap-hdpi/iotivityicon.png [new file with mode: 0644]
android/examples/presenceserver/src/main/res/mipmap-mdpi/iotivityicon.png [new file with mode: 0644]
android/examples/presenceserver/src/main/res/mipmap-xhdpi/iotivityicon.png [new file with mode: 0644]
android/examples/presenceserver/src/main/res/mipmap-xxhdpi/iotivityicon.png [new file with mode: 0644]
android/examples/presenceserver/src/main/res/values-v21/styles.xml [new file with mode: 0644]
android/examples/presenceserver/src/main/res/values-w820dp/dimens.xml [new file with mode: 0644]
android/examples/presenceserver/src/main/res/values/dimens.xml [new file with mode: 0644]
android/examples/presenceserver/src/main/res/values/strings.xml [new file with mode: 0644]
android/examples/presenceserver/src/main/res/values/styles.xml [new file with mode: 0644]
android/examples/settings.gradle

diff --git a/android/examples/presenceclient/.gitignore b/android/examples/presenceclient/.gitignore
new file mode 100644 (file)
index 0000000..796b96d
--- /dev/null
@@ -0,0 +1 @@
+/build
diff --git a/android/examples/presenceclient/build.gradle b/android/examples/presenceclient/build.gradle
new file mode 100644 (file)
index 0000000..ddb5f29
--- /dev/null
@@ -0,0 +1,24 @@
+apply plugin: 'com.android.application'
+
+android {
+    compileSdkVersion 22
+    buildToolsVersion "22.0.1"
+
+    defaultConfig {
+        applicationId "org.iotivity.base.examples"
+        minSdkVersion 21
+        targetSdkVersion 22
+        versionCode 1
+        versionName "1.0"
+    }
+    buildTypes {
+        release {
+            minifyEnabled false
+            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
+        }
+    }
+}
+
+dependencies {
+    compile fileTree(dir: 'libs', include: ['*.jar'])
+}
diff --git a/android/examples/presenceclient/presenceclient.iml b/android/examples/presenceclient/presenceclient.iml
new file mode 100644 (file)
index 0000000..e92011c
--- /dev/null
@@ -0,0 +1,91 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<module external.linked.project.id=":presenceclient" external.linked.project.path="$MODULE_DIR$" external.root.project.path="$MODULE_DIR$/.." external.system.id="GRADLE" external.system.module.group="examples" 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=":presenceclient" />
+      </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="assembleDebugTest" />
+        <option name="COMPILE_JAVA_TEST_TASK_NAME" value="compileDebugTestSources" />
+        <option name="TEST_SOURCE_GEN_TASK_NAME" value="generateDebugTestSources" />
+        <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/test/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/test/debug" isTestSource="true" generated="true" />
+      <sourceFolder url="file://$MODULE_DIR$/build/generated/source/aidl/test/debug" isTestSource="true" generated="true" />
+      <sourceFolder url="file://$MODULE_DIR$/build/generated/source/buildConfig/test/debug" isTestSource="true" generated="true" />
+      <sourceFolder url="file://$MODULE_DIR$/build/generated/source/rs/test/debug" isTestSource="true" generated="true" />
+      <sourceFolder url="file://$MODULE_DIR$/build/generated/res/rs/test/debug" type="java-test-resource" />
+      <sourceFolder url="file://$MODULE_DIR$/build/generated/res/generated/test/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/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" />
+      <excludeFolder url="file://$MODULE_DIR$/build/tmp" />
+    </content>
+    <orderEntry type="jdk" jdkName="Android API 22 Platform" jdkType="Android SDK" />
+    <orderEntry type="sourceFolder" forTests="false" />
+    <orderEntry type="library" exported="" name="iotivity-armeabi-base-debug-unspecified" level="project" />
+  </component>
+</module>
\ No newline at end of file
diff --git a/android/examples/presenceclient/src/main/AndroidManifest.xml b/android/examples/presenceclient/src/main/AndroidManifest.xml
new file mode 100644 (file)
index 0000000..df7d065
--- /dev/null
@@ -0,0 +1,34 @@
+<?xml version="1.0" encoding="utf-8"?>
+<manifest xmlns:android="http://schemas.android.com/apk/res/android"
+    package="org.iotivity.base.examples" >
+
+    <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
+    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
+    <uses-permission android:name="android.permission.BLUETOOTH"/>
+    <uses-permission android:name="android.permission.BLUETOOTH_ADMIN"/>
+    <uses-permission android:name="android.permission.INTERNET"/>
+    <uses-permission android:name="android.permission.ACCESS_WIFI_STATE"/>
+    <uses-permission android:name="android.permission.CHANGE_WIFI_MULTICAST_STATE"/>
+    <uses-permission android:name="android.permission.CHANGE_NETWORK_STATE"/>
+    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
+    <uses-permission android:name="android.permission.CHANGE_WIFI_STATE"/>
+
+
+    <application
+        android:allowBackup="true"
+        android:icon="@mipmap/iotivityicon"
+        android:label="@string/app_name"
+        android:theme="@style/AppTheme" >
+        <activity
+            android:screenOrientation="portrait"
+            android:name=".PresenceClient"
+            android:label="@string/app_name" >
+            <intent-filter>
+                <action android:name="android.intent.action.MAIN" />
+
+                <category android:name="android.intent.category.LAUNCHER" />
+            </intent-filter>
+        </activity>
+    </application>
+
+</manifest>
diff --git a/android/examples/presenceclient/src/main/java/org/iotivity/base/examples/PresenceClient.java b/android/examples/presenceclient/src/main/java/org/iotivity/base/examples/PresenceClient.java
new file mode 100644 (file)
index 0000000..237ae27
--- /dev/null
@@ -0,0 +1,254 @@
+/*
+ * //******************************************************************
+ * //
+ * // Copyright 2015 Intel Corporation.
+ * //
+ * //-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
+ * //
+ * // Licensed under the Apache License, Version 2.0 (the "License");
+ * // you may not use this file except in compliance with the License.
+ * // You may obtain a copy of the License at
+ * //
+ * //      http://www.apache.org/licenses/LICENSE-2.0
+ * //
+ * // Unless required by applicable law or agreed to in writing, software
+ * // distributed under the License is distributed on an "AS IS" BASIS,
+ * // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * // See the License for the specific language governing permissions and
+ * // limitations under the License.
+ * //
+ * //-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
+ */
+package org.iotivity.base.examples;
+
+import android.app.Activity;
+import android.content.Context;
+import android.os.Bundle;
+import android.text.method.ScrollingMovementMethod;
+import android.util.Log;
+import android.view.View;
+import android.widget.CompoundButton;
+import android.widget.ScrollView;
+import android.widget.TextView;
+import android.widget.ToggleButton;
+
+import org.iotivity.base.ModeType;
+import org.iotivity.base.OcConnectivityType;
+import org.iotivity.base.OcException;
+import org.iotivity.base.OcPlatform;
+import org.iotivity.base.OcPresenceHandle;
+import org.iotivity.base.OcPresenceStatus;
+import org.iotivity.base.OcResource;
+import org.iotivity.base.OcResourceHandle;
+import org.iotivity.base.PlatformConfig;
+import org.iotivity.base.QualityOfService;
+import org.iotivity.base.ResourceProperty;
+import org.iotivity.base.ServiceType;
+
+import java.util.EnumSet;
+import java.util.LinkedList;
+import java.util.List;
+
+
+public class PresenceClient extends Activity implements
+        OcPlatform.OnResourceFoundListener,
+        OcPlatform.OnPresenceListener {
+    private OcResource mResource;
+    private OcPresenceHandle mPresenceHandle;
+
+    private void startPresenceClient() {
+        Context context = this;
+
+        PlatformConfig platformConfig = new PlatformConfig(
+                context,
+                ServiceType.IN_PROC,
+                ModeType.CLIENT,
+                "0.0.0.0", // By setting to "0.0.0.0", it binds to all available interfaces
+                0,         // Uses randomly available port
+                QualityOfService.LOW
+        );
+
+        msg("Configuring platform.");
+        OcPlatform.Configure(platformConfig);
+
+        try {
+            msg("Finding Resource...");
+            OcPlatform.findResource("", OcPlatform.WELL_KNOWN_QUERY,
+                    EnumSet.of(OcConnectivityType.CT_DEFAULT), this);
+        } catch (OcException e) {
+            Log.e(TAG, e.toString());
+            msg("Failed to find resource(s). ");
+        }
+        printLine();
+        enableStartStopButton();
+    }
+
+    @Override
+    public synchronized void onResourceFound(OcResource foundResource) {
+        String resourceUri = foundResource.getUri();
+        if (null != mResource || !resourceUri.equals("/a/light")) {
+            msg("Found resource, ignoring");
+            return;
+        }
+
+        msg("Found Resource");
+        String hostAddress = foundResource.getHost();
+        msg("\tResource URI : " + resourceUri);
+        msg("\tResource Host : " + hostAddress);
+        msg("\tResource Interfaces : ");
+        for (String resInterface : foundResource.getResourceInterfaces()) {
+            msg("\t\t" + resInterface);
+        }
+        msg("\tResource Type : ");
+        for (String resTypes : foundResource.getResourceTypes()) {
+            msg("\t\t" + resTypes);
+        }
+
+        try {
+            msg("Subscribing to unicast address:" + hostAddress);
+            OcPlatform.subscribePresence(hostAddress,
+                    EnumSet.of(OcConnectivityType.CT_DEFAULT), this);
+        } catch (OcException e) {
+            Log.e(TAG, e.toString());
+            msg("Failed to subscribe to unicast address:" + hostAddress);
+        }
+        mResource = foundResource;
+        printLine();
+    }
+
+    @Override
+    public void onPresence(OcPresenceStatus ocPresenceStatus, int nonce, String hostAddress) {
+        msg("Received presence notification from : " + hostAddress);
+        switch (ocPresenceStatus) {
+            case OK:
+                msg("Nonce# " + nonce);
+                break;
+            case STOPPED:
+                msg("Presence Stopped");
+                break;
+            case TIMEOUT:
+                msg("Presence Timeout");
+                break;
+            case DO_NOT_HANDLE:
+                msg("Presence Do Not Handle");
+                break;
+        }
+    }
+
+    private void stopPresenceClient() {
+        if (null != mPresenceHandle) {
+            try {
+                msg("Unsubscribing from the presence notifications.");
+                OcPlatform.unsubscribePresence(mPresenceHandle);
+                mPresenceHandle = null;
+            } catch (OcException e) {
+                Log.e(TAG, e.toString());
+                msg("Failed to unsubscribe from the presence notifications" + e.toString());
+            }
+        }
+        mResource = null;
+        printLine();
+        enableStartStopButton();
+    }
+
+    //******************************************************************************
+    // End of the OIC specific code
+    //******************************************************************************
+
+    private final static String TAG = PresenceClient.class.getSimpleName();
+    private TextView mConsoleTextView;
+    private ScrollView mScrollView;
+
+    @Override
+    protected void onCreate(Bundle savedInstanceState) {
+        super.onCreate(savedInstanceState);
+        setContentView(R.layout.activity_presence_client);
+
+        mConsoleTextView = (TextView) findViewById(R.id.consoleTextView);
+        mConsoleTextView.setMovementMethod(new ScrollingMovementMethod());
+        mScrollView = (ScrollView) findViewById(R.id.scrollView);
+        mScrollView.fullScroll(View.FOCUS_DOWN);
+        final ToggleButton toggleButton = (ToggleButton) findViewById(R.id.toggleButton);
+
+        if (null == savedInstanceState) {
+            toggleButton.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
+                public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
+                    toggleButton.setEnabled(false);
+                    if (isChecked) {
+                        new Thread(new Runnable() {
+                            public void run() {
+                                startPresenceClient();
+                            }
+                        }).start();
+                    } else {
+                        new Thread(new Runnable() {
+                            public void run() {
+                                stopPresenceClient();
+                            }
+                        }).start();
+                    }
+                }
+            });
+        }
+
+        if (null != savedInstanceState) {
+            String consoleOutput = savedInstanceState.getString("consoleOutputString");
+            mConsoleTextView.setText(consoleOutput);
+            boolean buttonCheked = savedInstanceState.getBoolean("toggleButtonChecked");
+            toggleButton.setChecked(buttonCheked);
+        }
+    }
+
+    @Override
+    protected void onSaveInstanceState(Bundle outState) {
+        super.onSaveInstanceState(outState);
+        outState.putString("consoleOutputString", mConsoleTextView.getText().toString());
+        ToggleButton toggleButton = (ToggleButton) findViewById(R.id.toggleButton);
+        outState.putBoolean("toggleButtonChecked", toggleButton.isChecked());
+    }
+
+    @Override
+    protected void onRestoreInstanceState(Bundle savedInstanceState) {
+        super.onRestoreInstanceState(savedInstanceState);
+
+        String consoleOutput = savedInstanceState.getString("consoleOutputString");
+        mConsoleTextView.setText(consoleOutput);
+
+        final ToggleButton toggleButton = (ToggleButton) findViewById(R.id.toggleButton);
+        boolean buttonCheked = savedInstanceState.getBoolean("toggleButtonChecked");
+        toggleButton.setChecked(buttonCheked);
+    }
+
+    private void msg(final String text) {
+        runOnUiThread(new Runnable() {
+            public void run() {
+                mConsoleTextView.append("\n");
+                mConsoleTextView.append(text);
+                mScrollView.fullScroll(View.FOCUS_DOWN);
+            }
+        });
+        Log.i(TAG, text);
+    }
+
+    private void printLine() {
+        msg("------------------------------------------------------------------------");
+    }
+
+    private void sleep(int seconds) {
+        try {
+            Thread.sleep(seconds * 1000);
+        } catch (InterruptedException e) {
+            e.printStackTrace();
+            Log.e(TAG, e.toString());
+        }
+    }
+
+    private void enableStartStopButton() {
+        runOnUiThread(new Runnable() {
+            public void run() {
+                ToggleButton toggleButton = (ToggleButton) findViewById(R.id.toggleButton);
+                toggleButton.setEnabled(true);
+            }
+        });
+    }
+}
\ No newline at end of file
diff --git a/android/examples/presenceclient/src/main/res/drawable/iotivityicon.png b/android/examples/presenceclient/src/main/res/drawable/iotivityicon.png
new file mode 100644 (file)
index 0000000..e1e4aa7
Binary files /dev/null and b/android/examples/presenceclient/src/main/res/drawable/iotivityicon.png differ
diff --git a/android/examples/presenceclient/src/main/res/drawable/iotivitylogo.png b/android/examples/presenceclient/src/main/res/drawable/iotivitylogo.png
new file mode 100644 (file)
index 0000000..a7d3115
Binary files /dev/null and b/android/examples/presenceclient/src/main/res/drawable/iotivitylogo.png differ
diff --git a/android/examples/presenceclient/src/main/res/layout/activity_presence_client.xml b/android/examples/presenceclient/src/main/res/layout/activity_presence_client.xml
new file mode 100644 (file)
index 0000000..ac5037f
--- /dev/null
@@ -0,0 +1,36 @@
+<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:orientation="vertical"
+    android:paddingRight="@dimen/activity_horizontal_margin"
+    android:paddingTop="@dimen/activity_vertical_margin"
+    android:paddingBottom="@dimen/activity_vertical_margin" tools:context=".PresenceClient">
+    <ToggleButton
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        android:id="@+id/toggleButton"
+        android:layout_centerHorizontal="true"
+        android:textOff="Start"
+        android:textOn="Stop"
+        android:layout_alignParentEnd="true"
+        android:layout_alignParentStart="true" />
+    <ScrollView
+        android:layout_below="@id/toggleButton"
+        android:layout_above="@+id/imageView"
+        android:layout_width="fill_parent"
+        android:layout_height="wrap_content"
+        android:fillViewport="true"
+        android:id="@+id/scrollView">
+        <TextView android:layout_width="wrap_content"
+            android:layout_height="wrap_content"
+            android:id="@+id/consoleTextView" />
+    </ScrollView>
+    <ImageView
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        android:id="@+id/imageView"
+        android:layout_alignParentBottom="true"
+        android:layout_alignParentEnd="true"
+        android:layout_alignParentStart="true"
+        android:src="@drawable/iotivitylogo" />
+</RelativeLayout>
\ No newline at end of file
diff --git a/android/examples/presenceclient/src/main/res/mipmap-hdpi/iotivityicon.png b/android/examples/presenceclient/src/main/res/mipmap-hdpi/iotivityicon.png
new file mode 100644 (file)
index 0000000..e1e4aa7
Binary files /dev/null and b/android/examples/presenceclient/src/main/res/mipmap-hdpi/iotivityicon.png differ
diff --git a/android/examples/presenceclient/src/main/res/mipmap-mdpi/iotivityicon.png b/android/examples/presenceclient/src/main/res/mipmap-mdpi/iotivityicon.png
new file mode 100644 (file)
index 0000000..2e7bce6
Binary files /dev/null and b/android/examples/presenceclient/src/main/res/mipmap-mdpi/iotivityicon.png differ
diff --git a/android/examples/presenceclient/src/main/res/mipmap-xhdpi/iotivityicon.png b/android/examples/presenceclient/src/main/res/mipmap-xhdpi/iotivityicon.png
new file mode 100644 (file)
index 0000000..afa486b
Binary files /dev/null and b/android/examples/presenceclient/src/main/res/mipmap-xhdpi/iotivityicon.png differ
diff --git a/android/examples/presenceclient/src/main/res/mipmap-xxhdpi/iotivityicon.png b/android/examples/presenceclient/src/main/res/mipmap-xxhdpi/iotivityicon.png
new file mode 100644 (file)
index 0000000..3e6bc6a
Binary files /dev/null and b/android/examples/presenceclient/src/main/res/mipmap-xxhdpi/iotivityicon.png differ
diff --git a/android/examples/presenceclient/src/main/res/values-v21/styles.xml b/android/examples/presenceclient/src/main/res/values-v21/styles.xml
new file mode 100644 (file)
index 0000000..dba3c41
--- /dev/null
@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="utf-8"?>
+<resources>
+    <style name="AppTheme" parent="android:Theme.Material.Light">
+    </style>
+</resources>
diff --git a/android/examples/presenceclient/src/main/res/values-w820dp/dimens.xml b/android/examples/presenceclient/src/main/res/values-w820dp/dimens.xml
new file mode 100644 (file)
index 0000000..63fc816
--- /dev/null
@@ -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/examples/presenceclient/src/main/res/values/dimens.xml b/android/examples/presenceclient/src/main/res/values/dimens.xml
new file mode 100644 (file)
index 0000000..47c8224
--- /dev/null
@@ -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/examples/presenceclient/src/main/res/values/strings.xml b/android/examples/presenceclient/src/main/res/values/strings.xml
new file mode 100644 (file)
index 0000000..28df764
--- /dev/null
@@ -0,0 +1,6 @@
+<resources>
+    <string name="app_name">Presence Client</string>
+
+    <string name="hello_world">Hello world!</string>
+    <string name="action_settings">Settings</string>
+</resources>
diff --git a/android/examples/presenceclient/src/main/res/values/styles.xml b/android/examples/presenceclient/src/main/res/values/styles.xml
new file mode 100644 (file)
index 0000000..ff6c9d2
--- /dev/null
@@ -0,0 +1,8 @@
+<resources>
+
+    <!-- Base application theme. -->
+    <style name="AppTheme" parent="android:Theme.Holo.Light.DarkActionBar">
+        <!-- Customize your theme here. -->
+    </style>
+
+</resources>
diff --git a/android/examples/presenceserver/.gitignore b/android/examples/presenceserver/.gitignore
new file mode 100644 (file)
index 0000000..796b96d
--- /dev/null
@@ -0,0 +1 @@
+/build
diff --git a/android/examples/presenceserver/build.gradle b/android/examples/presenceserver/build.gradle
new file mode 100644 (file)
index 0000000..5270f78
--- /dev/null
@@ -0,0 +1,24 @@
+apply plugin: 'com.android.application'
+
+android {
+    compileSdkVersion 22
+    buildToolsVersion "22.0.1"
+
+    defaultConfig {
+        applicationId "org.iotivity.base.examples.presenceserver"
+        minSdkVersion 21
+        targetSdkVersion 22
+        versionCode 1
+        versionName "1.0"
+    }
+    buildTypes {
+        release {
+            minifyEnabled false
+            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
+        }
+    }
+}
+
+dependencies {
+    compile fileTree(dir: 'libs', include: ['*.jar'])
+}
diff --git a/android/examples/presenceserver/presenceserver.iml b/android/examples/presenceserver/presenceserver.iml
new file mode 100644 (file)
index 0000000..7b8aee8
--- /dev/null
@@ -0,0 +1,91 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<module external.linked.project.id=":presenceserver" external.linked.project.path="$MODULE_DIR$" external.root.project.path="$MODULE_DIR$/.." external.system.id="GRADLE" external.system.module.group="examples" 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=":presenceserver" />
+      </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="assembleDebugTest" />
+        <option name="COMPILE_JAVA_TEST_TASK_NAME" value="compileDebugTestSources" />
+        <option name="TEST_SOURCE_GEN_TASK_NAME" value="generateDebugTestSources" />
+        <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/test/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/test/debug" isTestSource="true" generated="true" />
+      <sourceFolder url="file://$MODULE_DIR$/build/generated/source/aidl/test/debug" isTestSource="true" generated="true" />
+      <sourceFolder url="file://$MODULE_DIR$/build/generated/source/buildConfig/test/debug" isTestSource="true" generated="true" />
+      <sourceFolder url="file://$MODULE_DIR$/build/generated/source/rs/test/debug" isTestSource="true" generated="true" />
+      <sourceFolder url="file://$MODULE_DIR$/build/generated/res/rs/test/debug" type="java-test-resource" />
+      <sourceFolder url="file://$MODULE_DIR$/build/generated/res/generated/test/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/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" />
+      <excludeFolder url="file://$MODULE_DIR$/build/tmp" />
+    </content>
+    <orderEntry type="jdk" jdkName="Android API 22 Platform" jdkType="Android SDK" />
+    <orderEntry type="sourceFolder" forTests="false" />
+    <orderEntry type="library" exported="" name="iotivity-armeabi-base-debug-unspecified" level="project" />
+  </component>
+</module>
\ No newline at end of file
diff --git a/android/examples/presenceserver/src/main/AndroidManifest.xml b/android/examples/presenceserver/src/main/AndroidManifest.xml
new file mode 100644 (file)
index 0000000..aa035bf
--- /dev/null
@@ -0,0 +1,33 @@
+<?xml version="1.0" encoding="utf-8"?>
+<manifest xmlns:android="http://schemas.android.com/apk/res/android"
+    package="org.iotivity.base.examples" >
+
+    <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
+    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
+    <uses-permission android:name="android.permission.BLUETOOTH"/>
+    <uses-permission android:name="android.permission.BLUETOOTH_ADMIN"/>
+    <uses-permission android:name="android.permission.INTERNET"/>
+    <uses-permission android:name="android.permission.ACCESS_WIFI_STATE"/>
+    <uses-permission android:name="android.permission.CHANGE_WIFI_MULTICAST_STATE"/>
+    <uses-permission android:name="android.permission.CHANGE_NETWORK_STATE"/>
+    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
+    <uses-permission android:name="android.permission.CHANGE_WIFI_STATE"/>
+
+    <application
+        android:allowBackup="true"
+        android:icon="@mipmap/iotivityicon"
+        android:label="@string/app_name"
+        android:theme="@style/AppTheme" >
+        <activity
+            android:screenOrientation="portrait"
+            android:name=".PresenceServer"
+            android:label="@string/app_name" >
+            <intent-filter>
+                <action android:name="android.intent.action.MAIN" />
+
+                <category android:name="android.intent.category.LAUNCHER" />
+            </intent-filter>
+        </activity>
+    </application>
+
+</manifest>
diff --git a/android/examples/presenceserver/src/main/java/org/iotivity/base/examples/PresenceServer.java b/android/examples/presenceserver/src/main/java/org/iotivity/base/examples/PresenceServer.java
new file mode 100644 (file)
index 0000000..809c8ff
--- /dev/null
@@ -0,0 +1,224 @@
+/*
+ * //******************************************************************
+ * //
+ * // Copyright 2015 Intel Corporation.
+ * //
+ * //-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
+ * //
+ * // Licensed under the Apache License, Version 2.0 (the "License");
+ * // you may not use this file except in compliance with the License.
+ * // You may obtain a copy of the License at
+ * //
+ * //      http://www.apache.org/licenses/LICENSE-2.0
+ * //
+ * // Unless required by applicable law or agreed to in writing, software
+ * // distributed under the License is distributed on an "AS IS" BASIS,
+ * // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * // See the License for the specific language governing permissions and
+ * // limitations under the License.
+ * //
+ * //-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
+ */
+package org.iotivity.base.examples;
+
+import android.app.Activity;
+import android.content.Context;
+import android.os.Bundle;
+import android.text.method.ScrollingMovementMethod;
+import android.util.Log;
+
+import android.view.View;
+import android.widget.CompoundButton;
+import android.widget.ScrollView;
+import android.widget.TextView;
+import android.widget.ToggleButton;
+
+import org.iotivity.base.EntityHandlerResult;
+import org.iotivity.base.ModeType;
+import org.iotivity.base.OcException;
+import org.iotivity.base.OcPlatform;
+import org.iotivity.base.OcResourceHandle;
+import org.iotivity.base.OcResourceRequest;
+import org.iotivity.base.PlatformConfig;
+import org.iotivity.base.QualityOfService;
+import org.iotivity.base.ResourceProperty;
+import org.iotivity.base.ServiceType;
+
+import java.util.EnumSet;
+import java.util.LinkedList;
+import java.util.List;
+
+
+public class PresenceServer extends Activity {
+    private OcResourceHandle mResourceHandle;
+
+    private void startPresenceServer() {
+        Context context = this;
+
+        PlatformConfig platformConfig = new PlatformConfig(
+                context,
+                ServiceType.IN_PROC,
+                ModeType.SERVER,
+                "0.0.0.0", // By setting to "0.0.0.0", it binds to all available interfaces
+                0,         // Uses randomly available port
+                QualityOfService.LOW
+        );
+
+        msg("Configuring platform.");
+        OcPlatform.Configure(platformConfig);
+
+        try {
+            msg("Creating resource of type \"core.light\".");
+            createResource();
+            sleep(1);
+
+            msg("Starting presence notifications.");
+            OcPlatform.startPresence(OcPlatform.DEFAULT_PRESENCE_TTL);
+            sleep(1);
+        } catch (OcException e) {
+            Log.e(TAG, e.toString());
+            msg("Error: " + e.toString());
+        }
+        printLine();
+        enableStartStopButton();
+    }
+
+    /**
+     * This function internally calls registerResource API.
+     */
+    private void createResource() {
+        String resourceUri = "/a/light"; // URI of the resource
+        String resourceTypeName = "core.light"; // resource type name.
+        String resourceInterface = OcPlatform.DEFAULT_INTERFACE; // resource interface.
+
+        try {
+            // This will internally create and register the resource.
+            mResourceHandle = OcPlatform.registerResource(
+                    resourceUri,
+                    resourceTypeName,
+                    resourceInterface,
+                    null, //Use default entity handler
+                    EnumSet.of(ResourceProperty.DISCOVERABLE));
+        } catch (OcException e) {
+            msg("Resource creation was unsuccessful.");
+            Log.e(TAG, e.toString());
+        }
+    }
+
+    private void stopPresenceServer() {
+        try {
+            msg("Stopping presence notifications.");
+            OcPlatform.stopPresence();
+
+            msg("Unregister resource.");
+            if (null != mResourceHandle) OcPlatform.unregisterResource(mResourceHandle);
+        } catch (OcException e) {
+            Log.e(TAG, e.toString());
+            msg("Error: " + e.toString());
+        }
+
+        printLine();
+        enableStartStopButton();
+    }
+
+    //******************************************************************************
+    // End of the OIC specific code
+    //******************************************************************************
+
+    private final static String TAG = PresenceServer.class.getSimpleName();
+    private TextView mConsoleTextView;
+    private ScrollView mScrollView;
+
+    @Override
+    protected void onCreate(Bundle savedInstanceState) {
+        super.onCreate(savedInstanceState);
+        setContentView(R.layout.activity_presence_server);
+
+        mConsoleTextView = (TextView) findViewById(R.id.consoleTextView);
+        mConsoleTextView.setMovementMethod(new ScrollingMovementMethod());
+        mScrollView = (ScrollView) findViewById(R.id.scrollView);
+        mScrollView.fullScroll(View.FOCUS_DOWN);
+        final ToggleButton toggleButton = (ToggleButton) findViewById(R.id.toggleButton);
+
+        if (null == savedInstanceState) {
+            toggleButton.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
+                public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
+                    toggleButton.setEnabled(false);
+                    if (isChecked) {
+                        new Thread(new Runnable() {
+                            public void run() {
+                                startPresenceServer();
+                            }
+                        }).start();
+                    } else {
+                        new Thread(new Runnable() {
+                            public void run() {
+                                stopPresenceServer();
+                            }
+                        }).start();
+                    }
+                }
+            });
+        }
+
+        if (null != savedInstanceState) {
+            String consoleOutput = savedInstanceState.getString("consoleOutputString");
+            mConsoleTextView.setText(consoleOutput);
+            boolean buttonCheked = savedInstanceState.getBoolean("toggleButtonChecked");
+            toggleButton.setChecked(buttonCheked);
+        }
+    }
+
+    @Override
+    protected void onSaveInstanceState(Bundle outState) {
+        super.onSaveInstanceState(outState);
+        outState.putString("consoleOutputString", mConsoleTextView.getText().toString());
+        ToggleButton toggleButton = (ToggleButton) findViewById(R.id.toggleButton);
+        outState.putBoolean("toggleButtonChecked", toggleButton.isChecked());
+    }
+
+    @Override
+    protected void onRestoreInstanceState(Bundle savedInstanceState) {
+        super.onRestoreInstanceState(savedInstanceState);
+
+        String consoleOutput = savedInstanceState.getString("consoleOutputString");
+        mConsoleTextView.setText(consoleOutput);
+
+        final ToggleButton toggleButton = (ToggleButton) findViewById(R.id.toggleButton);
+        boolean buttonCheked = savedInstanceState.getBoolean("toggleButtonChecked");
+        toggleButton.setChecked(buttonCheked);
+    }
+
+    private void msg(final String text) {
+        runOnUiThread(new Runnable() {
+            public void run() {
+                mConsoleTextView.append("\n");
+                mConsoleTextView.append(text);
+                mScrollView.fullScroll(View.FOCUS_DOWN);
+            }
+        });
+        Log.i(TAG, text);
+    }
+
+    private void printLine() {
+        msg("------------------------------------------------------------------------");
+    }
+
+    private void sleep(int seconds) {
+        try {
+            Thread.sleep(seconds * 1000);
+        } catch (InterruptedException e) {
+            e.printStackTrace();
+            Log.e(TAG, e.toString());
+        }
+    }
+
+    private void enableStartStopButton() {
+        runOnUiThread(new Runnable() {
+            public void run() {
+                ToggleButton toggleButton = (ToggleButton) findViewById(R.id.toggleButton);
+                toggleButton.setEnabled(true);
+            }
+        });
+    }
+}
\ No newline at end of file
diff --git a/android/examples/presenceserver/src/main/res/drawable/iotivityicon.png b/android/examples/presenceserver/src/main/res/drawable/iotivityicon.png
new file mode 100644 (file)
index 0000000..e1e4aa7
Binary files /dev/null and b/android/examples/presenceserver/src/main/res/drawable/iotivityicon.png differ
diff --git a/android/examples/presenceserver/src/main/res/drawable/iotivitylogo.png b/android/examples/presenceserver/src/main/res/drawable/iotivitylogo.png
new file mode 100644 (file)
index 0000000..a7d3115
Binary files /dev/null and b/android/examples/presenceserver/src/main/res/drawable/iotivitylogo.png differ
diff --git a/android/examples/presenceserver/src/main/res/layout/activity_presence_server.xml b/android/examples/presenceserver/src/main/res/layout/activity_presence_server.xml
new file mode 100644 (file)
index 0000000..585701f
--- /dev/null
@@ -0,0 +1,36 @@
+<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:orientation="vertical"
+    android:paddingRight="@dimen/activity_horizontal_margin"
+    android:paddingTop="@dimen/activity_vertical_margin"
+    android:paddingBottom="@dimen/activity_vertical_margin" tools:context=".PresenceServer">
+    <ToggleButton
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        android:id="@+id/toggleButton"
+        android:layout_centerHorizontal="true"
+        android:textOff="Start"
+        android:textOn="Stop"
+        android:layout_alignParentEnd="true"
+        android:layout_alignParentStart="true" />
+    <ScrollView
+        android:layout_below="@id/toggleButton"
+        android:layout_above="@+id/imageView"
+        android:layout_width="fill_parent"
+        android:layout_height="wrap_content"
+        android:fillViewport="true"
+        android:id="@+id/scrollView">
+        <TextView android:layout_width="wrap_content"
+            android:layout_height="wrap_content"
+            android:id="@+id/consoleTextView" />
+    </ScrollView>
+    <ImageView
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        android:id="@+id/imageView"
+        android:layout_alignParentBottom="true"
+        android:layout_alignParentEnd="true"
+        android:layout_alignParentStart="true"
+        android:src="@drawable/iotivitylogo" />
+</RelativeLayout>
\ No newline at end of file
diff --git a/android/examples/presenceserver/src/main/res/mipmap-hdpi/iotivityicon.png b/android/examples/presenceserver/src/main/res/mipmap-hdpi/iotivityicon.png
new file mode 100644 (file)
index 0000000..e1e4aa7
Binary files /dev/null and b/android/examples/presenceserver/src/main/res/mipmap-hdpi/iotivityicon.png differ
diff --git a/android/examples/presenceserver/src/main/res/mipmap-mdpi/iotivityicon.png b/android/examples/presenceserver/src/main/res/mipmap-mdpi/iotivityicon.png
new file mode 100644 (file)
index 0000000..2e7bce6
Binary files /dev/null and b/android/examples/presenceserver/src/main/res/mipmap-mdpi/iotivityicon.png differ
diff --git a/android/examples/presenceserver/src/main/res/mipmap-xhdpi/iotivityicon.png b/android/examples/presenceserver/src/main/res/mipmap-xhdpi/iotivityicon.png
new file mode 100644 (file)
index 0000000..afa486b
Binary files /dev/null and b/android/examples/presenceserver/src/main/res/mipmap-xhdpi/iotivityicon.png differ
diff --git a/android/examples/presenceserver/src/main/res/mipmap-xxhdpi/iotivityicon.png b/android/examples/presenceserver/src/main/res/mipmap-xxhdpi/iotivityicon.png
new file mode 100644 (file)
index 0000000..3e6bc6a
Binary files /dev/null and b/android/examples/presenceserver/src/main/res/mipmap-xxhdpi/iotivityicon.png differ
diff --git a/android/examples/presenceserver/src/main/res/values-v21/styles.xml b/android/examples/presenceserver/src/main/res/values-v21/styles.xml
new file mode 100644 (file)
index 0000000..dba3c41
--- /dev/null
@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="utf-8"?>
+<resources>
+    <style name="AppTheme" parent="android:Theme.Material.Light">
+    </style>
+</resources>
diff --git a/android/examples/presenceserver/src/main/res/values-w820dp/dimens.xml b/android/examples/presenceserver/src/main/res/values-w820dp/dimens.xml
new file mode 100644 (file)
index 0000000..63fc816
--- /dev/null
@@ -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/examples/presenceserver/src/main/res/values/dimens.xml b/android/examples/presenceserver/src/main/res/values/dimens.xml
new file mode 100644 (file)
index 0000000..47c8224
--- /dev/null
@@ -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/examples/presenceserver/src/main/res/values/strings.xml b/android/examples/presenceserver/src/main/res/values/strings.xml
new file mode 100644 (file)
index 0000000..3abffdc
--- /dev/null
@@ -0,0 +1,3 @@
+<resources>
+    <string name="app_name">Presence Server</string>
+</resources>
diff --git a/android/examples/presenceserver/src/main/res/values/styles.xml b/android/examples/presenceserver/src/main/res/values/styles.xml
new file mode 100644 (file)
index 0000000..ff6c9d2
--- /dev/null
@@ -0,0 +1,8 @@
+<resources>
+
+    <!-- Base application theme. -->
+    <style name="AppTheme" parent="android:Theme.Holo.Light.DarkActionBar">
+        <!-- Customize your theme here. -->
+    </style>
+
+</resources>
index 4cd41ac..0237a05 100755 (executable)
@@ -1 +1 @@
-include ':simpleserver', ':simpleclient', ':message', ':fridgeserver', ':fridgeclient', ':guiclient'
+include ':simpleserver', ':simpleclient', ':message', ':fridgeserver', ':fridgeclient', ':guiclient', ':presenceserver', ':presenceclient'