Added a new fridgegroupserver and fridgegroupclient example.
This creates proxy child resources from the fridgeResource.
Change-Id: I235ea32a2a9dd2d596cfd1a3407f2a012d6fe3cd
Signed-off-by: Rahul Rahul <rahul.rahul@intel.com>
Reviewed-on: https://gerrit.iotivity.org/gerrit/3439
Tested-by: jenkins-iotivity <jenkins-iotivity@opendaylight.org>
Reviewed-by: Patrick Lankswert <patrick.lankswert@intel.com>
<option name="BUILDABLE" value="false" />\r
</configuration>\r
</facet>\r
+ <facet type="android-gradle" name="Android-Gradle">\r
+ <configuration>\r
+ <option name="GRADLE_PROJECT_PATH" value=":" />\r
+ </configuration>\r
+ </facet>\r
+ <facet type="android" name="Android">\r
+ <configuration>\r
+ <option name="ALLOW_USER_CONFIGURATION" value="false" />\r
+ </configuration>\r
+ </facet>\r
</component>\r
<component name="NewModuleRootManager" inherit-compiler-output="true">\r
<exclude-output />\r
-//apply plugin: 'com.android.application'\r
-//\r
-//android {\r
-// compileSdkVersion 21\r
-// buildToolsVersion "20.0.0"\r
-//\r
-// defaultConfig {\r
-// applicationId "org.iotivity.base.examples.fridgeclient"\r
-// minSdkVersion 21\r
-// targetSdkVersion 21\r
-// versionCode 1\r
-// versionName "1.0"\r
-// }\r
-// buildTypes {\r
-// release {\r
-// minifyEnabled false\r
-// proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'\r
-// }\r
-// }\r
-// lintOptions {\r
-// abortOnError false\r
-// }\r
-//}\r
-//repositories {\r
-// flatDir {\r
-// dirs "../../android_api/base/build/outputs/aar/"\r
-// }\r
-//}\r
-//\r
-//try {\r
-// dependencies {\r
-// compile ":iotivity-base-${TARGET_ARCH}-${RELEASE}@aar"\r
-// }\r
-//} catch (all) {\r
-// print "${ERROR_MSG}"\r
-// assert all\r
-//}
\ No newline at end of file
+apply plugin: 'com.android.application'
+android {
+ compileSdkVersion 21
+ buildToolsVersion "20.0.0"
+
+ defaultConfig {
+ applicationId "org.iotivity.base.examples.fridgeclient"
+ minSdkVersion 21
+ targetSdkVersion 21
+ versionCode 1
+ versionName "1.0"
+ }
+ buildTypes {
+ release {
+ minifyEnabled false
+ proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
+ }
+ }
+ lintOptions {
+ abortOnError false
+ }
+}
+repositories {
+ flatDir {
+ dirs "../../android_api/base/build/outputs/aar/"
+ }
+}
+try {
+ dependencies {
+ compile ":iotivity-base-${TARGET_ARCH}-${RELEASE}@aar"
+ }
+} catch (all) {
+ print "${ERROR_MSG}"
+ assert all
+}
\ No newline at end of file
-<?xml version="1.0" encoding="UTF-8"?>\r
-<module 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">\r
- <component name="FacetManager">\r
- <facet type="android-gradle" name="Android-Gradle">\r
- <configuration>\r
- <option name="GRADLE_PROJECT_PATH" value=":fridgeclient" />\r
- </configuration>\r
- </facet>\r
- <facet type="android" name="Android">\r
- <configuration>\r
- <option name="SELECTED_BUILD_VARIANT" value="debug" />\r
- <option name="SELECTED_TEST_ARTIFACT" value="_android_test_" />\r
- <option name="ASSEMBLE_TASK_NAME" value="assembleDebug" />\r
- <option name="COMPILE_JAVA_TASK_NAME" value="compileDebugSources" />\r
- <option name="ASSEMBLE_TEST_TASK_NAME" value="assembleDebugTest" />\r
- <option name="SOURCE_GEN_TASK_NAME" value="generateDebugSources" />\r
- <option name="TEST_SOURCE_GEN_TASK_NAME" value="generateDebugTestSources" />\r
- <option name="ALLOW_USER_CONFIGURATION" value="false" />\r
- <option name="MANIFEST_FILE_RELATIVE_PATH" value="/src/main/AndroidManifest.xml" />\r
- <option name="RES_FOLDER_RELATIVE_PATH" value="/src/main/res" />\r
- <option name="RES_FOLDERS_RELATIVE_PATH" value="file://$MODULE_DIR$/src/main/res" />\r
- <option name="ASSETS_FOLDER_RELATIVE_PATH" value="/src/main/assets" />\r
- </configuration>\r
- </facet>\r
- </component>\r
- <component name="NewModuleRootManager" inherit-compiler-output="false">\r
- <output url="file://$MODULE_DIR$/build/intermediates/classes/debug" />\r
- <output-test url="file://$MODULE_DIR$/build/intermediates/classes/test/debug" />\r
- <exclude-output />\r
- <content url="file://$MODULE_DIR$">\r
- <sourceFolder url="file://$MODULE_DIR$/build/generated/source/r/debug" isTestSource="false" generated="true" />\r
- <sourceFolder url="file://$MODULE_DIR$/build/generated/source/aidl/debug" isTestSource="false" generated="true" />\r
- <sourceFolder url="file://$MODULE_DIR$/build/generated/source/buildConfig/debug" isTestSource="false" generated="true" />\r
- <sourceFolder url="file://$MODULE_DIR$/build/generated/source/rs/debug" isTestSource="false" generated="true" />\r
- <sourceFolder url="file://$MODULE_DIR$/build/generated/res/rs/debug" type="java-resource" />\r
- <sourceFolder url="file://$MODULE_DIR$/build/generated/res/generated/debug" type="java-resource" />\r
- <sourceFolder url="file://$MODULE_DIR$/build/generated/source/r/test/debug" isTestSource="true" generated="true" />\r
- <sourceFolder url="file://$MODULE_DIR$/build/generated/source/aidl/test/debug" isTestSource="true" generated="true" />\r
- <sourceFolder url="file://$MODULE_DIR$/build/generated/source/buildConfig/test/debug" isTestSource="true" generated="true" />\r
- <sourceFolder url="file://$MODULE_DIR$/build/generated/source/rs/test/debug" isTestSource="true" generated="true" />\r
- <sourceFolder url="file://$MODULE_DIR$/build/generated/res/rs/test/debug" type="java-test-resource" />\r
- <sourceFolder url="file://$MODULE_DIR$/build/generated/res/generated/test/debug" type="java-test-resource" />\r
- <sourceFolder url="file://$MODULE_DIR$/src/debug/res" type="java-resource" />\r
- <sourceFolder url="file://$MODULE_DIR$/src/debug/resources" type="java-resource" />\r
- <sourceFolder url="file://$MODULE_DIR$/src/debug/assets" type="java-resource" />\r
- <sourceFolder url="file://$MODULE_DIR$/src/debug/aidl" isTestSource="false" />\r
- <sourceFolder url="file://$MODULE_DIR$/src/debug/java" isTestSource="false" />\r
- <sourceFolder url="file://$MODULE_DIR$/src/debug/jni" isTestSource="false" />\r
- <sourceFolder url="file://$MODULE_DIR$/src/debug/rs" isTestSource="false" />\r
- <sourceFolder url="file://$MODULE_DIR$/src/main/res" type="java-resource" />\r
- <sourceFolder url="file://$MODULE_DIR$/src/main/resources" type="java-resource" />\r
- <sourceFolder url="file://$MODULE_DIR$/src/main/assets" type="java-resource" />\r
- <sourceFolder url="file://$MODULE_DIR$/src/main/aidl" isTestSource="false" />\r
- <sourceFolder url="file://$MODULE_DIR$/src/main/java" isTestSource="false" />\r
- <sourceFolder url="file://$MODULE_DIR$/src/main/jni" isTestSource="false" />\r
- <sourceFolder url="file://$MODULE_DIR$/src/main/rs" isTestSource="false" />\r
- <sourceFolder url="file://$MODULE_DIR$/src/androidTest/res" type="java-test-resource" />\r
- <sourceFolder url="file://$MODULE_DIR$/src/androidTest/resources" type="java-test-resource" />\r
- <sourceFolder url="file://$MODULE_DIR$/src/androidTest/assets" type="java-test-resource" />\r
- <sourceFolder url="file://$MODULE_DIR$/src/androidTest/aidl" isTestSource="true" />\r
- <sourceFolder url="file://$MODULE_DIR$/src/androidTest/java" isTestSource="true" />\r
- <sourceFolder url="file://$MODULE_DIR$/src/androidTest/jni" isTestSource="true" />\r
- <sourceFolder url="file://$MODULE_DIR$/src/androidTest/rs" isTestSource="true" />\r
- <excludeFolder url="file://$MODULE_DIR$/build/intermediates/assets" />\r
- <excludeFolder url="file://$MODULE_DIR$/build/intermediates/bundles" />\r
- <excludeFolder url="file://$MODULE_DIR$/build/intermediates/classes" />\r
- <excludeFolder url="file://$MODULE_DIR$/build/intermediates/coverage-instrumented-classes" />\r
- <excludeFolder url="file://$MODULE_DIR$/build/intermediates/dependency-cache" />\r
- <excludeFolder url="file://$MODULE_DIR$/build/intermediates/dex" />\r
- <excludeFolder url="file://$MODULE_DIR$/build/intermediates/dex-cache" />\r
- <excludeFolder url="file://$MODULE_DIR$/build/intermediates/incremental" />\r
- <excludeFolder url="file://$MODULE_DIR$/build/intermediates/jacoco" />\r
- <excludeFolder url="file://$MODULE_DIR$/build/intermediates/javaResources" />\r
- <excludeFolder url="file://$MODULE_DIR$/build/intermediates/libs" />\r
- <excludeFolder url="file://$MODULE_DIR$/build/intermediates/lint" />\r
- <excludeFolder url="file://$MODULE_DIR$/build/intermediates/manifests" />\r
- <excludeFolder url="file://$MODULE_DIR$/build/intermediates/ndk" />\r
- <excludeFolder url="file://$MODULE_DIR$/build/intermediates/pre-dexed" />\r
- <excludeFolder url="file://$MODULE_DIR$/build/intermediates/proguard" />\r
- <excludeFolder url="file://$MODULE_DIR$/build/intermediates/res" />\r
- <excludeFolder url="file://$MODULE_DIR$/build/intermediates/rs" />\r
- <excludeFolder url="file://$MODULE_DIR$/build/intermediates/symbols" />\r
- <excludeFolder url="file://$MODULE_DIR$/build/outputs" />\r
- <excludeFolder url="file://$MODULE_DIR$/build/tmp" />\r
- </content>\r
- <orderEntry type="jdk" jdkName="Android API 21 Platform" jdkType="Android SDK" />\r
- <orderEntry type="sourceFolder" forTests="false" />\r
- <orderEntry type="library" exported="" name="iotivity-x86-base-debug-unspecified" level="project" />\r
- <orderEntry type="library" exported="" name="appcompat-v7-21.0.3" level="project" />\r
- <orderEntry type="library" exported="" name="support-annotations-21.0.3" level="project" />\r
- <orderEntry type="library" exported="" name="support-v4-21.0.3" level="project" />\r
- <orderEntry type="module" module-name="message" exported="" />\r
- </component>\r
-</module>\r
-\r
+<?xml version="1.0" encoding="UTF-8"?>
+<module external.linked.project.id=":fridgeclient" 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=":fridgeclient" />
+ </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/resValues/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/resValues/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/examples/iotivity-base-armeabi-release/unspecified/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" />
+ <excludeFolder url="file://$MODULE_DIR$/build/tmp" />
+ </content>
+ <orderEntry type="jdk" jdkName="Android API 21 Platform" jdkType="Android SDK" />
+ <orderEntry type="sourceFolder" forTests="false" />
+ <orderEntry type="module" module-name="iotivity-base-armeabi-release" exported="" />
+ <orderEntry type="library" exported="" name="iotivity-base-armeabi-release-unspecified" level="project" />
+ </component>
+</module>
\ No newline at end of file
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
- package="org.iotivity.base.examples.fridgeclient" >
- <uses-sdk tools:overrideLibrary="org.iotivity.base"></uses-sdk>
+ package="org.iotivity.base.examples" >
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<application
android:allowBackup="true"
- android:icon="@drawable/ic_launcher"
- android:label="@string/app_name"
+ android:icon="@drawable/iotivityicon"
+ android:label= "@string/app_name"
android:theme="@style/AppTheme">
<activity
+ android:screenOrientation="portrait"
android:name=".FridgeClient"
android:label="@string/app_name" >
<intent-filter>
--- /dev/null
+/*
+ * //******************************************************************
+ * //
+ * // 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.os.Bundle;
+import android.os.Message;
+import android.text.method.ScrollingMovementMethod;
+import android.util.Log;
+import android.view.View;
+import android.widget.Button;
+import android.widget.TextView;
+
+import org.iotivity.base.ModeType;
+import org.iotivity.base.OcConnectivityType;
+import org.iotivity.base.OcException;
+import org.iotivity.base.OcHeaderOption;
+import org.iotivity.base.OcPlatform;
+import org.iotivity.base.OcRepresentation;
+import org.iotivity.base.OcResource;
+import org.iotivity.base.PlatformConfig;
+import org.iotivity.base.QualityOfService;
+import org.iotivity.base.ServiceType;
+
+import java.util.EnumSet;
+import java.util.HashMap;
+import java.util.LinkedList;
+import java.util.List;
+
+/**
+ * FridgeClient
+ * <p/>
+ * FridgeClient is a sample client app which should be started after the fridgeServer is started.
+ * It creates DeviceResource, DoorResources, LightResource and performs a GET operation on them.
+ */
+public class FridgeClient extends Activity implements
+ OcPlatform.OnResourceFoundListener,
+ OcResource.OnGetListener {
+ public static final String DEVICE_URI = "/device";
+ public static final String LIGHT = "/light";
+ public static final String LEFT_DOOR = "/door/left";
+ public static final String RIGHT_DOOR = "/door/right";
+ public static final String RANDOM_DOOR = "/door/random";
+ public static final String API_VERSION = "v.1.0";
+ public static final String CLIENT_TOKEN = "21ae43gf";
+ public static final int API_VERSION_KEY = 2048;
+ public static final int CLIENT_TOKEN_KEY = 3000;
+
+ private final List<OcResource> mResourceList = new LinkedList<OcResource>();
+ private OcResource mFridgeResource;
+
+ /**
+ * configure OIC platform and call findResource
+ */
+ private void startFridgeClient() {
+ PlatformConfig cfg = new PlatformConfig(
+ this, // context
+ ServiceType.IN_PROC,
+ ModeType.CLIENT,
+ "0.0.0.0", // bind to all available interfaces
+ 0,
+ QualityOfService.LOW);
+
+ logMessage("Configuring platform");
+ OcPlatform.Configure(cfg);
+ logMessage("Initiating fridge discovery");
+ try {
+ OcPlatform.findResource("",
+ OcPlatform.WELL_KNOWN_QUERY + "?rt=" + "intel.fridge",
+ EnumSet.of(OcConnectivityType.CT_DEFAULT),
+ this);
+ } catch (OcException e) {
+ logMessage(" Failed to discover resource");
+ Log.e(TAG, e.getMessage());
+ }
+ logMessage("-----------------------------------------------------");
+ }
+
+ /**
+ * An event handler to be executed whenever a "findResource" request completes successfully
+ *
+ * @param ocResource found resource
+ */
+ @Override
+ public synchronized void onResourceFound(OcResource ocResource) {
+ if (null != mFridgeResource || !ocResource.getUri().equals(DEVICE_URI)) {
+ logMessage("Didn't find the correct fridge resource. Exiting");
+ return;
+ }
+ mFridgeResource = ocResource;
+ logMessage("Discovered a fridge with \nHost: " + mFridgeResource.getHost());
+
+ List<String> lightTypes = new LinkedList<>();
+ lightTypes.add("intel.fridge.light");
+ List<String> doorTypes = new LinkedList<>();
+ doorTypes.add("intel.fridge.door");
+ List<String> resourceInterfaces = new LinkedList<>();
+ resourceInterfaces.add(OcPlatform.DEFAULT_INTERFACE);
+ logMessage("Creating child resource proxies for the previously known fridge components");
+ OcResource light = null;
+ OcResource leftDoor = null;
+ OcResource rightDoor = null;
+ OcResource randomDoor = null;
+ try {
+ light = OcPlatform.constructResourceObject(mFridgeResource.getHost(),
+ LIGHT,
+ mFridgeResource.getConnectivityTypeSet(),
+ false, //isObservable
+ lightTypes,
+ resourceInterfaces);
+ mResourceList.add(light);
+
+ leftDoor = OcPlatform.constructResourceObject(mFridgeResource.getHost(),
+ LEFT_DOOR,
+ mFridgeResource.getConnectivityTypeSet(),
+ false, //isObservable
+ doorTypes,
+ resourceInterfaces);
+ mResourceList.add(leftDoor);
+
+ rightDoor = OcPlatform.constructResourceObject(mFridgeResource.getHost(),
+ RIGHT_DOOR,
+ mFridgeResource.getConnectivityTypeSet(),
+ false, //isObservable
+ doorTypes,
+ resourceInterfaces);
+ mResourceList.add(rightDoor);
+
+ randomDoor = OcPlatform.constructResourceObject(mFridgeResource.getHost(),
+ RANDOM_DOOR,
+ mFridgeResource.getConnectivityTypeSet(),
+ false, //isObservable
+ doorTypes,
+ resourceInterfaces);
+ mResourceList.add(randomDoor);
+ } catch (OcException e) {
+ logMessage("Error in constructResourceObject");
+ Log.e(TAG, e.getMessage());
+ }
+
+ List<OcHeaderOption> headerOptions = new LinkedList<>();
+ OcHeaderOption apiVersion = new OcHeaderOption(API_VERSION_KEY, API_VERSION);
+ OcHeaderOption clientToken = new OcHeaderOption(CLIENT_TOKEN_KEY, CLIENT_TOKEN);
+ headerOptions.add(apiVersion);
+ headerOptions.add(clientToken);
+ mFridgeResource.setHeaderOptions(headerOptions);
+
+ logMessage("Calling GET api on mFridgeResource and other component resources");
+ try {
+ mFridgeResource.get(new HashMap<String, String>(), this);
+ if (null != light) light.get(new HashMap<String, String>(), this);
+ if (null != leftDoor) leftDoor.get(new HashMap<String, String>(), this);
+ if (null != rightDoor) rightDoor.get(new HashMap<String, String>(), this);
+ if (null != randomDoor) randomDoor.get(new HashMap<String, String>(), this);
+ } catch (OcException e) {
+ logMessage("Error in GET calls");
+ Log.e(TAG, e.getMessage());
+ }
+ }
+
+ /**
+ * An event handler to be executed whenever a "get" request completes successfully
+ *
+ * @param headerOptionList list of the header options
+ * @param ocRepresentation representation of a resource
+ */
+ @Override
+ public synchronized void onGetCompleted(List<OcHeaderOption> headerOptionList,
+ OcRepresentation ocRepresentation) {
+ logMessage("Got a response from " + ocRepresentation.getUri());
+ }
+
+ /**
+ * An event handler to be executed whenever a "get" request fails
+ *
+ * @param throwable exception
+ */
+ @Override
+ public synchronized void onGetFailed(Throwable throwable) {
+ logMessage("GET request has failed");
+ Log.e(TAG, throwable.toString());
+ }
+
+ //******************************************************************************
+ // End of the OIC specific code
+ //******************************************************************************
+ @Override
+ protected void onCreate(Bundle savedInstanceState) {
+ super.onCreate(savedInstanceState);
+ setContentView(R.layout.activity_fridge_client);
+
+ mConsoleTextView = (TextView) findViewById(R.id.consoleTextView);
+ mConsoleTextView.setMovementMethod(new ScrollingMovementMethod());
+ final Button button = (Button) findViewById(R.id.button);
+
+ if (null == savedInstanceState) {
+ button.setOnClickListener(new View.OnClickListener() {
+ @Override
+ public void onClick(View v) {
+ button.setEnabled(false);
+ new Thread(new Runnable() {
+ public void run() {
+ startFridgeClient();
+ }
+ }).start();
+ }
+ });
+ } else {
+ String consoleOutput = savedInstanceState.getString("consoleOutputString");
+ mConsoleTextView.setText(consoleOutput);
+ }
+ }
+
+ private void logMessage(final String text) {
+ runOnUiThread(new Runnable() {
+ public void run() {
+ final Message msg = new Message();
+ msg.obj = text;
+ mConsoleTextView.append("\n");
+ mConsoleTextView.append(text);
+ }
+ });
+ Log.i(TAG, text);
+ }
+
+ private static String TAG = "FridgeClient: ";
+ private TextView mConsoleTextView;
+}
\ No newline at end of file
+++ /dev/null
-/*
- * //******************************************************************
- * //
- * // 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.fridgeclient;
-
-import android.app.Activity;
-import android.content.BroadcastReceiver;
-import android.content.Context;
-import android.content.Intent;
-import android.content.IntentFilter;
-import android.os.Bundle;
-import android.os.Message;
-import android.support.v4.content.LocalBroadcastManager;
-import android.text.method.ScrollingMovementMethod;
-import android.util.Log;
-import android.view.Menu;
-import android.view.MenuItem;
-import android.widget.LinearLayout;
-import android.widget.TextView;
-
-import org.iotivity.base.ErrorCode;
-import org.iotivity.base.ModeType;
-import org.iotivity.base.OcConnectivityType;
-import org.iotivity.base.OcException;
-import org.iotivity.base.OcHeaderOption;
-import org.iotivity.base.OcPlatform;
-import org.iotivity.base.OcRepresentation;
-import org.iotivity.base.OcResource;
-import org.iotivity.base.PlatformConfig;
-import org.iotivity.base.QualityOfService;
-import org.iotivity.base.ServiceType;
-
-import java.util.EnumSet;
-import java.util.HashMap;
-import java.util.LinkedList;
-import java.util.List;
-
-import base.iotivity.org.examples.message.IMessageLogger;
-
-/**
- * FridgeClient
- * <p/>
- * FridgeClient is a sample client app which should be started after the fridgeServer is started.
- * It creates DeviceResource, DoorResource, LightResource and performs a get operation on them.
- * This implements IMessageLogger to display messages on the screen
- */
-public class FridgeClient extends Activity implements
- OcPlatform.OnResourceFoundListener, IMessageLogger {
- private static String TAG = "FridgeClient: ";
-
- private MessageReceiver mMessageReceiver = new MessageReceiver();
- private TextView mEventsTextView;
- private String mDeviceName;
- private int mDeviceCode;
- private List<String> ifaces;
- private final List<OcResource> resourceList = new LinkedList<OcResource>();
-
- /**
- * configure OIC platform and call findResource
- */
- private void initOICStack() {
- PlatformConfig cfg = new PlatformConfig(
- this,
- ServiceType.IN_PROC,
- ModeType.CLIENT,
- "0.0.0.0", // bind to all available interfaces
- 0,
- QualityOfService.LOW);
-
- OcPlatform.Configure(cfg);
- try {
- OcPlatform.findResource("", OcPlatform.WELL_KNOWN_QUERY + "?rt=" + "intel.fridge",
- EnumSet.of(OcConnectivityType.CT_DEFAULT), this);
- } catch (OcException e) {
- logMessage(TAG + " init Error. " + e.getMessage());
- Log.e(TAG, e.getMessage());
- }
- }
-
- /**
- * prints out the appropriate messages depending on the device code
- *
- * @param representation representation of the OcResource
- * @param value clientDeviceCode
- */
- private void getResponse(OcRepresentation representation, int value) {
- switch (value) {
- case 0:
- // Get on device
- try {
- logMessage(TAG + "Name of device: " +
- representation.getValue(StringConstants.DEVICE_NAME));
- } catch (OcException e) {
- Log.e(TAG, e.getMessage());
- }
- break;
- case 1:
- // get on fridge light
- try {
- boolean lightOn = representation.getValue(StringConstants.ON);
- logMessage(TAG + "The fridge light is " +
- (lightOn ? "" : "not " + "on"));
- } catch (OcException e) {
- Log.e(TAG, e.getMessage());
- }
- break;
- case 2:
- case 3:
- // get on fridge door(s)
- try {
- boolean doorOpen = representation.getValue(StringConstants.OPEN);
- logMessage(TAG + "Door is " + (doorOpen ?
- "open" : "not open") + " and is on the " +
- representation.getValue(StringConstants.SIDE) + " side");
- } catch (OcException e) {
- Log.e(TAG, e.getMessage());
- }
- break;
- case 4:
- // get on fridge random door
- try {
- logMessage("Name of fridge: " +
- representation.getValue(StringConstants.DEVICE_NAME));
- } catch (OcException e) {
- Log.e(TAG, e.getMessage());
- }
- break;
- default:
- logMessage("Unexpected State");
- break;
- }
- }
-
- /**
- * this method is used to wait for 1 second between calls to different resources.
- * It is added for better readability
- */
- private void doWait() {
- try {
- Thread.sleep(StringConstants.WAIT_TIME);
- } catch (InterruptedException e) {
- logMessage(TAG + "doWait exception: " + e.getMessage());
- Log.e(TAG, e.getMessage());
- }
- }
-
- @Override
- /**
- * callback when a resource is found. This method calls getResponse with the correct code
- */
- synchronized public void onResourceFound(OcResource ocResource) {
- // eventHandler for onGetListener
- resourceList.add(ocResource);
- OcResource.OnGetListener onGetListener = new OcResource.OnGetListener() {
- @Override
- public void onGetCompleted(List<OcHeaderOption> headerOptionList, OcRepresentation rep) {
- logMessage(TAG + " Got a response from " + getClientDeviceName());
- getResponse(rep, getClientDeviceCode());
- }
-
- @Override
- public void onGetFailed(Throwable throwable) {
- if (throwable instanceof OcException) {
- OcException ocEx = (OcException) throwable;
- ErrorCode errCode = ocEx.getErrorCode();
- //do something based on errorCode
- }
- Log.e(TAG, throwable.toString());
- }
- };
-
- if (ocResource.getUri().equals(StringConstants.RESOURCE_URI)) {
- logMessage(TAG + "Discovered a device with \nHost: " + ocResource.getHost() +
- ", Uri: " + ocResource.getUri());
- }
- List<String> lightTypes = new LinkedList<>();
- lightTypes.add("intel.fridge.light");
- try {
- OcResource light = OcPlatform.constructResourceObject(ocResource.getHost(),
- StringConstants.LIGHT, EnumSet.of(OcConnectivityType.CT_DEFAULT), false, lightTypes, ifaces);
-
- List<String> doorTypes = new LinkedList<>();
- doorTypes.add("intel.fridge.door");
- OcResource leftDoor = OcPlatform.constructResourceObject(ocResource.getHost(),
- StringConstants.LEFT_DOOR, EnumSet.of(OcConnectivityType.CT_DEFAULT), false, doorTypes, ifaces);
-
- OcResource rightDoor = OcPlatform.constructResourceObject(ocResource.getHost(),
- StringConstants.RIGHT_DOOR, EnumSet.of(OcConnectivityType.CT_DEFAULT), false, doorTypes, ifaces);
-
- OcResource randomDoor = OcPlatform.constructResourceObject(ocResource.getHost(),
- StringConstants.RANDOM_DOOR, EnumSet.of(OcConnectivityType.CT_DEFAULT), false, doorTypes, ifaces);
-
- List<OcHeaderOption> headerOptions = new LinkedList<>();
- OcHeaderOption apiVersion = new OcHeaderOption(StringConstants.API_VERSION_KEY,
- StringConstants.API_VERSION);
- OcHeaderOption clientToken = new OcHeaderOption(StringConstants.CLIENT_TOKEN_KEY,
- StringConstants.CLIENT_TOKEN);
- headerOptions.add(apiVersion);
- headerOptions.add(clientToken);
- ocResource.setHeaderOptions(headerOptions);
- /**
- * wait for 1 second before calling get on different resources.
- * It is done for better readability.
- * doWait() is called before each call to get
- */
- doWait();
-
- setupClientOptions("Device", 0);
- ocResource.get(new HashMap<String, String>(), onGetListener);
- doWait();
-
- setupClientOptions("Fridge Light", 1);
- light.get(new HashMap<String, String>(), onGetListener);
- doWait();
-
- setupClientOptions("Left Door", 2);
- leftDoor.get(new HashMap<String, String>(), onGetListener);
- doWait();
-
- setupClientOptions("Right Door", 3);
- rightDoor.get(new HashMap<String, String>(), onGetListener);
- doWait();
-
- setupClientOptions("Random Door", 4);
- randomDoor.get(new HashMap<String, String>(), onGetListener);
- doWait();
-
- resourceList.add(leftDoor);
- leftDoor.deleteResource(new OcResource.OnDeleteListener() {
- @Override
- public void onDeleteCompleted(List<OcHeaderOption> ocHeaderOptions) {
- logMessage(TAG + "Delete resource successful");
- }
-
- @Override
- public void onDeleteFailed(Throwable throwable) {
- if (throwable instanceof OcException) {
- OcException ocEx = (OcException) throwable;
- ErrorCode errCode = ocEx.getErrorCode();
- //do something based on errorCode
- }
- Log.e(TAG, throwable.toString());
- }
- });
- } catch (OcException e) {
- logMessage(TAG + "onResourceFound Error. " + e.getMessage());
- Log.e(TAG, e.getMessage());
- }
- }
-
- @Override
- protected void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- setContentView(R.layout.activity_fridge_client);
- registerReceiver(mMessageReceiver, new IntentFilter(StringConstants.INTENT));
-
- mEventsTextView = new TextView(this);
- mEventsTextView.setMovementMethod(new ScrollingMovementMethod());
- LinearLayout layout = (LinearLayout) findViewById(R.id.linearLayout);
- layout.addView(mEventsTextView, new LinearLayout.LayoutParams
- (LinearLayout.LayoutParams.MATCH_PARENT, 0, 1f));
- ifaces = new LinkedList<>();
- ifaces.add(StringConstants.RESOURCE_INTERFACE);
- mDeviceCode = -1;
- mDeviceName = "";
-
- initOICStack();
- }
-
- public class MessageReceiver extends BroadcastReceiver {
- @Override
- public void onReceive(Context context, Intent intent) {
- final String message = intent.getStringExtra(StringConstants.MESSAGE);
- logMessage(message);
- }
- }
-
- @Override
- public void logMessage(final String text) {
- if (StringConstants.ENABLE_PRINTING) {
- runOnUiThread(new Runnable() {
- public void run() {
- final Message msg = new Message();
- msg.obj = text;
- mEventsTextView.append("\n");
- mEventsTextView.append(text);
- }
- });
- Log.i(TAG, text);
- }
- }
-
-
- private void setupClientOptions(String name, int value) {
- mDeviceName = name;
- mDeviceCode = value;
- }
-
- private String getClientDeviceName() {
- return mDeviceName;
- }
-
- private int getClientDeviceCode() {
- return mDeviceCode;
- }
-
-
- //method to print the headerOptions received from the server
- void printHeaderOptions(List<OcHeaderOption> headerOptions) {
- for (OcHeaderOption headerOption : headerOptions) {
- if (StringConstants.API_VERSION_KEY == headerOption.getOptionId()) {
- logMessage(TAG + "Server API version in GET response: " +
- headerOption.getOptionData());
- }
- }
- }
-
- @Override
- public boolean onCreateOptionsMenu(Menu menu) {
- getMenuInflater().inflate(R.menu.menu_fridge_client, menu);
- return true;
- }
-
- @Override
- public boolean onOptionsItemSelected(MenuItem item) {
- int id = item.getItemId();
- if (id == R.id.action_settings) {
- return true;
- }
- return super.onOptionsItemSelected(item);
- }
-
- @Override
- public void onDestroy() {
- super.onDestroy();
- onStop();
- }
-
- @Override
- protected void onStop() {
- LocalBroadcastManager.getInstance(this).unregisterReceiver(mMessageReceiver);
- super.onStop();
- }
-}
+++ /dev/null
-package org.iotivity.base.examples.fridgeclient;
-
-import org.iotivity.base.OcPlatform;
-
-/**
- * StringConstant contains the fridgeclient specific constant values. To add another supported
- * Resource or Interface type to this app, begin by adding the new strings here, and then
- * find the places throughout the app where Resource-specific case switches occur, and add
- * the newly-supported type there.
- */
-public interface StringConstants {
- public static final String RESOURCE_URI = "/device";
- public static final String DEVICE_NAME = "device_name";
- public static final String LIGHT = "/light";
- public static final String LEFT_DOOR = "/door/left";
- public static final String RIGHT_DOOR = "/door/right";
- public static final String RANDOM_DOOR = "/door/random";
- public static final String MESSAGE = "message";
- public static final String API_VERSION = "v.1.2";
- public static final String CLIENT_TOKEN = "AaBbYyZz";
- public static final String ON = "on";
- public static final String OPEN = "open";
- public static final String SIDE = "side";
- public static final String INTENT = "org.iotivity.base.examples.fridgeclient";
- public static final String RESOURCE_INTERFACE = OcPlatform.DEFAULT_INTERFACE;
-
- public static final int WAIT_TIME = 1000;
- public static final int API_VERSION_KEY = 2048;
- public static final int CLIENT_TOKEN_KEY = 3000;
-
- public static final boolean ENABLE_PRINTING = true; // change to false to disable printing
- // of messages on the console and the screen
-}
<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"
+ xmlns:tools="http://schemas.android.com/tools"
+ android:layout_width="match_parent"
+ android:layout_height="match_parent"
+ android:orientation="vertical"
+ android:paddingBottom="@dimen/activity_vertical_margin"
+ 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=".FridgeClient">
-
- <TextView android:text="@string/app_name" android:layout_width="wrap_content"
- android:layout_height="wrap_content" />
-
- <LinearLayout
+ tools:context=".FridgeClient">
+ <Button
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:id="@+id/button"
+ android:layout_centerHorizontal="true"
+ android:textOff="Start"
+ android:textOn="Stop"
+ android:layout_alignParentEnd="true"
+ android:layout_alignParentStart="true"
+ android:text="Start" />
+ <ScrollView
+ android:layout_below="@id/button"
+ android:layout_above="@+id/imageView"
android:layout_width="fill_parent"
- android:layout_height="fill_parent"
- android:orientation="vertical"
- android:id="@+id/linearLayout" >
- </LinearLayout>
-
-</RelativeLayout>
+ 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
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools" tools:context=".FridgeClient">
<item android:id="@+id/action_settings" android:title="@string/action_settings"
- android:orderInCategory="100" app:showAsAction="never" />
+ android:orderInCategory="100" />
</menu>
<resources>
<!-- Base application theme. -->
- <style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar">
+ <style name="AppTheme" parent="android:Theme.Holo.Light.DarkActionBar">
<!-- Customize your theme here. -->
</style>
--- /dev/null
+apply plugin: 'com.android.application'\r
+android {\r
+ compileSdkVersion 21\r
+ buildToolsVersion "20.0.0"\r
+\r
+ defaultConfig {\r
+ applicationId "org.iotivity.base.examples.fridgegroupclient"\r
+ minSdkVersion 21\r
+ targetSdkVersion 21\r
+ versionCode 1\r
+ versionName "1.0"\r
+ }\r
+ buildTypes {\r
+ release {\r
+ minifyEnabled false\r
+ proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'\r
+ }\r
+ }\r
+ lintOptions {\r
+ abortOnError false\r
+ }\r
+}\r
+repositories {\r
+ flatDir {\r
+ dirs "../../android_api/base/build/outputs/aar/"\r
+ }\r
+}\r
+try {\r
+ dependencies {\r
+ compile ":iotivity-base-${TARGET_ARCH}-${RELEASE}@aar"\r
+ }\r
+} catch (all) {\r
+ print "${ERROR_MSG}"\r
+ assert all\r
+}\r
--- /dev/null
+<?xml version="1.0" encoding="utf-8"?>
+<manifest xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:tools="http://schemas.android.com/tools"
+ 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="@drawable/iotivityicon"
+ android:label= "@string/app_name"
+ android:theme="@style/AppTheme">
+ <activity
+ android:screenOrientation="portrait"
+ android:name=".FridgeGroupClient"
+ 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>
--- /dev/null
+/*
+ * //******************************************************************
+ * //
+ * // 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.os.Bundle;
+import android.os.Message;
+import android.text.method.ScrollingMovementMethod;
+import android.util.Log;
+import android.view.View;
+import android.widget.Button;
+import android.widget.TextView;
+
+import org.iotivity.base.ModeType;
+import org.iotivity.base.OcConnectivityType;
+import org.iotivity.base.OcException;
+import org.iotivity.base.OcHeaderOption;
+import org.iotivity.base.OcPlatform;
+import org.iotivity.base.OcRepresentation;
+import org.iotivity.base.OcResource;
+import org.iotivity.base.PlatformConfig;
+import org.iotivity.base.QualityOfService;
+import org.iotivity.base.ServiceType;
+
+import java.util.EnumSet;
+import java.util.HashMap;
+import java.util.LinkedList;
+import java.util.List;
+
+/**
+ * FridgeGroupClient
+ * <p/>
+ * FridgeGroupClient is a sample client app which should be started after the fridgeGroupServer is
+ * started. It discovers a fridge resource and then creates the proxy resources for each one of its
+ * children (light and door) and performs a GET on them.
+ */
+public class FridgeGroupClient extends Activity implements
+ OcPlatform.OnResourceFoundListener,
+ OcResource.OnGetListener {
+ private static String TAG = "FridgeGroupClient: ";
+
+ private final List<OcResource> childResourceList = new LinkedList<>();
+ private OcResource fridgeResource;
+
+ private void startFridgeClient() {
+ PlatformConfig cfg = new PlatformConfig(
+ this, // context
+ ServiceType.IN_PROC,
+ ModeType.CLIENT,
+ "0.0.0.0", // bind to all available interfaces
+ 0,
+ QualityOfService.LOW);
+
+ logMessage("Configuring platform");
+ OcPlatform.Configure(cfg);
+ String requestUri = OcPlatform.WELL_KNOWN_QUERY + "?rt=intel.fridge.group";
+ logMessage("Initiating fridge discovery");
+ try {
+ OcPlatform.findResource("",
+ requestUri,
+ EnumSet.of(OcConnectivityType.CT_DEFAULT),
+ this);
+ } catch (OcException e) {
+ logMessage("Failed to discover resource");
+ Log.e(TAG, e.getMessage());
+ }
+ logMessage("-----------------------------------------------------");
+ }
+
+ /**
+ * callback when a fridge resource is found.
+ */
+ @Override
+ public synchronized void onResourceFound(OcResource ocResource) {
+ if ((null != fridgeResource) && !fridgeResource.getUri().equals("/fridge/group")) {
+ logMessage("Didn't find the correct fridge resource. Exiting");
+ return;
+ }
+ fridgeResource = ocResource;
+ logMessage("Discovered a fridge with \nHost: " + fridgeResource.getHost());
+ logMessage("Trying to call GET api on fridgeResource");
+ try {
+ fridgeResource.get(new HashMap<String, String>(), this);
+ } catch (OcException e) {
+ logMessage("Failed to call GET api");
+ Log.e(TAG, e.getMessage());
+ }
+ logMessage("-----------------------------------------------------");
+ }
+
+ /**
+ * once the fridge resource is discovered, create proxy child resources of the fridge
+ * and call GET on each of the child resource proxies.
+ *
+ * @param list
+ * @param ocRepresentation parent resource
+ */
+ @Override
+ public synchronized void onGetCompleted(List<OcHeaderOption> list,
+ OcRepresentation ocRepresentation) {
+ logMessage("Got a response from " + ocRepresentation.getUri());
+ for (OcRepresentation child : ocRepresentation.getChildren()) {
+ try {
+ logMessage("Creating child resource proxy from fridgeResource with uri " +
+ child.getUri());
+ OcResource childResource = OcPlatform.constructResourceObject(
+ fridgeResource.getHost(),
+ child.getUri(),
+ fridgeResource.getConnectivityTypeSet(),
+ false, // isObservable set to false
+ child.getResourceTypes(),
+ child.getResourceInterfaces());
+ childResourceList.add(childResource);
+ } catch (OcException e) {
+ logMessage("Error in creating child resource proxy");
+ Log.e(TAG, e.getMessage());
+ }
+ logMessage("-----------------------------------------------------");
+ }
+
+ OcResource.OnGetListener childOnGetListener = new OcResource.OnGetListener() {
+ public static final String DOOR_STATE_KEY = "state";
+ public static final String DOOR_SIDE_KEY = "side";
+ public static final String LIGHT_STATUS_KEY = "light";
+
+ @Override
+ public synchronized void onGetCompleted(List<OcHeaderOption> list,
+ OcRepresentation ocRepresentation) {
+ logMessage("Received a response from a child of the fridge with uri: " +
+ ocRepresentation.getUri());
+ for (String resType : ocRepresentation.getResourceTypes()) {
+ if (resType.equals("intel.fridge.door")) {
+ try {
+ logMessage(ocRepresentation.getValue(DOOR_SIDE_KEY) +
+ " door is " + ((ocRepresentation.getValue(DOOR_STATE_KEY)
+ ) ? "open" : "close"));
+ } catch (OcException e) {
+ logMessage("Failed to get the door resource representation");
+ Log.e(TAG, e.getMessage());
+ }
+ } else if (resType.equals("intel.fridge.light")) {
+ try {
+ logMessage("Fridge light is " +
+ ((ocRepresentation.getValue(LIGHT_STATUS_KEY)) ?
+ "on" : "off"));
+ } catch (OcException e) {
+ logMessage("Failed to get the light resource representation");
+ Log.e(TAG, e.getMessage());
+ }
+ }
+ }
+ logMessage("-----------------------------------------------------");
+ }
+
+ @Override
+ public synchronized void onGetFailed(Throwable throwable) {
+ logMessage("OnGet failed for child of fridge");
+ Log.e(TAG, throwable.getMessage());
+ }
+ };
+
+ for (OcResource child : childResourceList) {
+ try {
+ logMessage("Trying to get a representation of " + child.getUri() +
+ " resource from server");
+ child.get(new HashMap<String, String>(), childOnGetListener);
+ } catch (OcException e) {
+ logMessage(e.getMessage());
+ Log.e(TAG, e.getMessage());
+ }
+ }
+
+ }
+
+ @Override
+ public synchronized void onGetFailed(Throwable throwable) {
+ logMessage("Failed to get representation of the fridge");
+ Log.e(TAG, throwable.toString());
+ }
+
+ //******************************************************************************
+ // End of the OIC specific code
+ //******************************************************************************
+ private TextView mConsoleTextView;
+
+ @Override
+ protected void onCreate(Bundle savedInstanceState) {
+ super.onCreate(savedInstanceState);
+ setContentView(R.layout.activity_fridge_client);
+
+ mConsoleTextView = (TextView) findViewById(R.id.consoleTextView);
+ mConsoleTextView.setMovementMethod(new ScrollingMovementMethod());
+ final Button button = (Button) findViewById(R.id.button);
+
+ if (null == savedInstanceState) {
+ button.setOnClickListener(new View.OnClickListener() {
+ @Override
+ public void onClick(View v) {
+ button.setEnabled(false);
+ new Thread(new Runnable() {
+ public void run() {
+ startFridgeClient();
+ }
+ }).start();
+ }
+ });
+ } else {
+ String consoleOutput = savedInstanceState.getString("consoleOutputString");
+ mConsoleTextView.setText(consoleOutput);
+ }
+ }
+
+ @Override
+ protected void onSaveInstanceState(Bundle outState) {
+ super.onSaveInstanceState(outState);
+ outState.putString("consoleOutputString", mConsoleTextView.getText().toString());
+ }
+
+ @Override
+ protected void onRestoreInstanceState(Bundle savedInstanceState) {
+ super.onRestoreInstanceState(savedInstanceState);
+
+ String consoleOutput = savedInstanceState.getString("consoleOutputString");
+ mConsoleTextView.setText(consoleOutput);
+ }
+
+ private void logMessage(final String text) {
+ runOnUiThread(new Runnable() {
+ public void run() {
+ final Message msg = new Message();
+ msg.obj = text;
+ mConsoleTextView.append("\n");
+ mConsoleTextView.append(text);
+ }
+ });
+ Log.i(TAG, text);
+ }
+}
\ No newline at end of file
--- /dev/null
+<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:orientation="vertical"
+ android:paddingBottom="@dimen/activity_vertical_margin"
+ android:paddingLeft="@dimen/activity_horizontal_margin"
+ android:paddingRight="@dimen/activity_horizontal_margin"
+ android:paddingTop="@dimen/activity_vertical_margin"
+ tools:context=".FridgeGroupClient">
+ <Button
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:id="@+id/button"
+ android:layout_centerHorizontal="true"
+ android:textOff="Start"
+ android:textOn="Stop"
+ android:layout_alignParentEnd="true"
+ android:layout_alignParentStart="true"
+ android:text="Start" />
+ <ScrollView
+ android:layout_below="@id/button"
+ 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
--- /dev/null
+<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>
--- /dev/null
+<?xml version="1.0" encoding="utf-8"?>
+<resources></resources>
\ No newline at end of file
--- /dev/null
+<resources>
+ <!-- Default screen margins, per the Android Design guidelines. -->
+ <dimen name="activity_horizontal_margin">16dp</dimen>
+ <dimen name="activity_vertical_margin">16dp</dimen>
+</resources>
--- /dev/null
+<?xml version="1.0" encoding="utf-8"?>
+<resources>
+ <string name="app_name">FridgeGroupClient</string>
+</resources>
--- /dev/null
+<resources>
+
+ <!-- Base application theme. -->
+ <style name="AppTheme" parent="android:Theme.Holo.Light.DarkActionBar">
+ <!-- Customize your theme here. -->
+ </style>
+
+</resources>
--- /dev/null
+apply plugin: 'com.android.application'\r
+android {\r
+ compileSdkVersion 21\r
+ buildToolsVersion "20.0.0"\r
+\r
+ defaultConfig {\r
+ applicationId "org.iotivity.base.examples.fridgegroupserver"\r
+ minSdkVersion 21\r
+ targetSdkVersion 21\r
+ versionCode 1\r
+ versionName "1.0"\r
+ }\r
+ buildTypes {\r
+ release {\r
+ minifyEnabled false\r
+ proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'\r
+ }\r
+ }\r
+ lintOptions {\r
+ abortOnError false\r
+ }\r
+}\r
+repositories {\r
+ flatDir {\r
+ dirs "../../android_api/base/build/outputs/aar/"\r
+ }\r
+}\r
+try {\r
+ dependencies {\r
+ compile ":iotivity-base-${TARGET_ARCH}-${RELEASE}@aar"\r
+ }\r
+} catch (all) {\r
+ print "${ERROR_MSG}"\r
+ assert all\r
+}
\ No newline at end of file
--- /dev/null
+<?xml version="1.0" encoding="utf-8"?>
+<manifest xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:tools="http://schemas.android.com/tools"
+ 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="@drawable/iotivityicon"
+ android:label="@string/app_name"
+ android:theme="@style/AppTheme">
+ <activity
+ android:name=".FridgeGroupServer"
+ android:label="@string/app_name"
+ android:screenOrientation="portrait">
+ <intent-filter>
+ <action android:name="android.intent.action.MAIN" />
+
+ <category android:name="android.intent.category.LAUNCHER" />
+ </intent-filter>
+ </activity>
+ </application>
+
+</manifest>
--- /dev/null
+/*
+ * //******************************************************************
+ * //
+ * // 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.content.Context;
+import android.content.Intent;
+import android.util.Log;
+
+import org.iotivity.base.EntityHandlerResult;
+import org.iotivity.base.OcException;
+import org.iotivity.base.OcPlatform;
+import org.iotivity.base.OcRepresentation;
+import org.iotivity.base.OcResourceHandle;
+import org.iotivity.base.OcResourceRequest;
+import org.iotivity.base.OcResourceResponse;
+import org.iotivity.base.RequestHandlerFlag;
+import org.iotivity.base.ResourceProperty;
+
+import java.util.EnumSet;
+
+/**
+ * DoorResource
+ * <p/>
+ * DoorResource is a sample OIC server resource created by the refrigerator.
+ */
+public class DoorResource extends Resource implements OcPlatform.EntityHandler {
+ DoorResource(String side, Context context) {
+ mContext = context;
+ mSide = side;
+
+ registerDoorResource();
+ }
+
+ private void registerDoorResource() {
+ String resourceURI = DOOR_URI + mSide;
+ logMessage(TAG + "RegisterDoorResource " + resourceURI + " : " + RESOURCE_TYPEDOOR);
+ try {
+ mResourceHandle = OcPlatform.registerResource(
+ resourceURI,
+ RESOURCE_TYPEDOOR,
+ OcPlatform.DEFAULT_INTERFACE,
+ this,
+ EnumSet.of(ResourceProperty.DISCOVERABLE));
+ } catch (OcException e) {
+ logMessage(TAG + "Failed to register DoorResource");
+ Log.e(TAG, e.getMessage());
+ }
+ logMessage("-----------------------------------------------------");
+ }
+
+ /**
+ * sample implementation of eventHandler for doorResource - this can be implemented in many
+ * different ways
+ *
+ * @param ocResourceRequest OcResourceRequest from the client
+ * @return EntityHandlerResult indicates whether the request was handled successfully or not
+ */
+ @Override
+ public synchronized EntityHandlerResult handleEntity(OcResourceRequest ocResourceRequest) {
+ EntityHandlerResult result = EntityHandlerResult.ERROR;
+ if (null != ocResourceRequest) {
+ try {
+ if (ocResourceRequest.getRequestHandlerFlagSet().contains(
+ RequestHandlerFlag.REQUEST)) {
+ OcResourceResponse response = new OcResourceResponse();
+ response.setRequestHandle(ocResourceRequest.getRequestHandle());
+ response.setResourceHandle(ocResourceRequest.getResourceHandle());
+
+ switch (ocResourceRequest.getRequestType()) {
+ case GET:
+ response.setErrorCode(Resource.SUCCESS);
+ updateRepresentationValues();
+ response.setResourceRepresentation(mRepresentation);
+ response.setResponseResult(EntityHandlerResult.OK);
+ OcPlatform.sendResponse(response);
+ break;
+ case PUT:
+ response.setErrorCode(Resource.SUCCESS);
+ put(ocResourceRequest.getResourceRepresentation());
+ updateRepresentationValues();
+ response.setResourceRepresentation(mRepresentation);
+ response.setResponseResult(EntityHandlerResult.OK);
+ OcPlatform.sendResponse(response);
+ break;
+ case DELETE:
+ response.setResponseResult(EntityHandlerResult.RESOURCE_DELETED);
+ response.setErrorCode(204);
+ OcPlatform.sendResponse(response);
+ break;
+ }
+ result = EntityHandlerResult.OK;
+ }
+ } catch (OcException e) {
+ logMessage("Error in handleEntity of DoorResource");
+ Log.e(TAG, e.getMessage());
+ return EntityHandlerResult.ERROR;
+ }
+ }
+ logMessage("-----------------------------------------------------");
+ return result;
+ }
+
+ public OcResourceHandle getHandle() {
+ return mResourceHandle;
+ }
+
+ /**
+ * helper function to update the current value of the door resource
+ */
+ private void updateRepresentationValues() {
+ try {
+ mRepresentation.setValue(DOOR_STATE_KEY, mDoorState);
+ mRepresentation.setValue(DOOR_SIDE_KEY, mSide);
+ logMessage(TAG + "door state is " + ((mDoorState == true) ? "open" : "close") +
+ " and door side is " + mSide);
+ } catch (OcException e) {
+ Log.e(TAG, e.getMessage());
+ }
+ }
+
+ /**
+ * update the value of doorResource, depending on if door is open/ closed
+ *
+ * @param representation new state of a door
+ */
+ private void put(OcRepresentation representation) {
+ try {
+ mDoorState = representation.getValue(DOOR_STATE_KEY);
+ } catch (OcException e) {
+ Log.e(TAG, e.getMessage());
+ }
+ // Note, we won't let the user change the door side!
+ }
+
+ //******************************************************************************
+ // End of the OIC specific code
+ //******************************************************************************
+ private Context mContext;
+ private String mSide;
+ private boolean mDoorState;
+ public static final String DOOR_URI = "/door/";
+ public static final String RESOURCE_TYPEDOOR = "intel.fridge.door";
+ private static String TAG = "DoorResource: ";
+ public static final String DOOR_STATE_KEY = "state";
+ public static final String DOOR_SIDE_KEY = "side";
+
+ private void logMessage(String msg) {
+ Intent intent = new Intent(Resource.INTENT);
+ intent.putExtra(Resource.MESSAGE, msg);
+ mContext.sendBroadcast(intent);
+ }
+}
\ No newline at end of file
--- /dev/null
+/*
+ * //******************************************************************
+ * //
+ * // 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.BroadcastReceiver;
+import android.content.Context;
+import android.content.Intent;
+import android.content.IntentFilter;
+import android.os.Bundle;
+import android.os.Message;
+import android.text.method.ScrollingMovementMethod;
+import android.util.Log;
+import android.view.View;
+import android.widget.Button;
+import android.widget.ScrollView;
+import android.widget.TextView;
+
+import org.iotivity.base.ModeType;
+import org.iotivity.base.OcPlatform;
+import org.iotivity.base.PlatformConfig;
+import org.iotivity.base.QualityOfService;
+import org.iotivity.base.ServiceType;
+
+/**
+ * FridgeGroupServer
+ * <p/>
+ * This is the main fridgeGroupServer class. This instantiates Refrigerator object
+ * which has different resources such as LightResource, DoorResource, etc.
+ */
+public class FridgeGroupServer extends Activity {
+ private Refrigerator refrigerator;
+
+ /**
+ * configure OIC platform and call findResource
+ */
+ private void startFridgeServer() {
+ logMessage("Configuring platform config");
+ PlatformConfig cfg = new PlatformConfig(
+ this, // context
+ ServiceType.IN_PROC,
+ ModeType.SERVER,
+ "0.0.0.0", // bind to all available interfaces
+ 0,
+ QualityOfService.LOW);
+ OcPlatform.Configure(cfg);
+
+ logMessage("Creating refrigerator resources");
+ refrigerator = new Refrigerator(this);
+ logMessage("-----------------------------------------------------");
+ }
+
+ //******************************************************************************
+ // End of the OIC specific code
+ //******************************************************************************
+ private static String TAG = "FridgeServer: ";
+ private TextView mConsoleTextView;
+ private ScrollView mScrollView;
+ private BroadcastReceiver mMessageReceiver = new MessageReceiver();
+
+ @Override
+ protected void onCreate(Bundle savedInstanceState) {
+ super.onCreate(savedInstanceState);
+ setContentView(R.layout.activity_fridge_server);
+ registerReceiver(mMessageReceiver, new IntentFilter(Resource.INTENT));
+
+ mConsoleTextView = (TextView) findViewById(R.id.consoleTextView);
+ mConsoleTextView.setMovementMethod(new ScrollingMovementMethod());
+ mScrollView = (ScrollView) findViewById(R.id.scrollView);
+ mScrollView.fullScroll(View.FOCUS_DOWN);
+ final Button button = (Button) findViewById(R.id.button);
+
+ if (null == savedInstanceState) {
+ button.setOnClickListener(new View.OnClickListener() {
+ @Override
+ public void onClick(View v) {
+ button.setEnabled(false);
+ new Thread(new Runnable() {
+ public void run() {
+ startFridgeServer();
+ }
+ }).start();
+ }
+ });
+ } else {
+ String consoleOutput = savedInstanceState.getString("consoleOutputString");
+ mConsoleTextView.setText(consoleOutput);
+ }
+ }
+
+ @Override
+ protected void onSaveInstanceState(Bundle outState) {
+ super.onSaveInstanceState(outState);
+ outState.putString("consoleOutputString", mConsoleTextView.getText().toString());
+ }
+
+ @Override
+ protected void onRestoreInstanceState(Bundle savedInstanceState) {
+ super.onRestoreInstanceState(savedInstanceState);
+ String consoleOutput = savedInstanceState.getString("consoleOutputString");
+ mConsoleTextView.setText(consoleOutput);
+ }
+
+ public class MessageReceiver extends BroadcastReceiver {
+ @Override
+ public void onReceive(Context context, Intent intent) {
+ final String message = intent.getStringExtra(Resource.MESSAGE);
+ logMessage(message);
+ }
+ }
+
+ private void logMessage(final String text) {
+ runOnUiThread(new Runnable() {
+ public void run() {
+ final Message msg = new Message();
+ msg.obj = text;
+ mConsoleTextView.append("\n");
+ mConsoleTextView.append(text);
+ }
+ });
+ Log.i(TAG, text);
+ }
+}
--- /dev/null
+/*
+ * //******************************************************************
+ * //
+ * // 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.content.Context;
+import android.content.Intent;
+import android.util.Log;
+
+import org.iotivity.base.OcException;
+import org.iotivity.base.OcPlatform;
+import org.iotivity.base.OcResourceHandle;
+import org.iotivity.base.ResourceProperty;
+
+import java.util.EnumSet;
+
+
+/**
+ * FridgeResource
+ * <p/>
+ * FridgeResource is a sample OIC server resource created by the refrigerator.
+ */
+public class FridgeResource extends Resource {
+ FridgeResource(Context context) {
+ mContext = context;
+ registerFridgeResource();
+ }
+
+ private void registerFridgeResource() {
+ try {
+ logMessage(TAG + "RegisterFridgeResource " + FRIDGE_URI +
+ " : " + FRIDGE_TYPENAME);
+ mResourceHandle = OcPlatform.registerResource(
+ FRIDGE_URI,
+ FRIDGE_TYPENAME,
+ OcPlatform.GROUP_INTERFACE,
+ null,
+ EnumSet.of(ResourceProperty.DISCOVERABLE));
+ } catch (OcException e) {
+ logMessage(TAG + "FridgeResource register error: " + e.getMessage());
+ Log.e(TAG, e.getMessage());
+ }
+ logMessage("-----------------------------------------------------");
+ }
+
+ public OcResourceHandle getHandle() {
+ return mResourceHandle;
+ }
+
+ //******************************************************************************
+ // End of the OIC specific code
+ //******************************************************************************
+ private Context mContext;
+ public static final String FRIDGE_URI = "/fridge/group";
+ public static final String FRIDGE_TYPENAME = "intel.fridge.group";
+ private static String TAG = "FridgeResource: ";
+
+ private void logMessage(String msg) {
+ Intent intent = new Intent(Resource.INTENT);
+ intent.putExtra("message", msg);
+ mContext.sendBroadcast(intent);
+ }
+}
--- /dev/null
+/*
+ * //******************************************************************
+ * //
+ * // 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.content.Context;
+import android.content.Intent;
+import android.util.Log;
+
+import org.iotivity.base.EntityHandlerResult;
+import org.iotivity.base.OcException;
+import org.iotivity.base.OcPlatform;
+import org.iotivity.base.OcRepresentation;
+import org.iotivity.base.OcResourceHandle;
+import org.iotivity.base.OcResourceRequest;
+import org.iotivity.base.OcResourceResponse;
+import org.iotivity.base.RequestHandlerFlag;
+import org.iotivity.base.ResourceProperty;
+
+import java.util.EnumSet;
+
+
+/**
+ * LightResource
+ * <p/>
+ * LightResource is a sample OIC server resource created by the refrigerator.
+ */
+public class LightResource extends Resource implements OcPlatform.EntityHandler {
+ LightResource(Context context) {
+ mContext = context;
+
+ registerLightResource();
+ }
+
+ private void registerLightResource() {
+ try {
+ logMessage(TAG + "RegisterLightResource " + LIGHT_URI + " : " + RESOURCE_TYPELIGHT);
+ mResourceHandle = OcPlatform.registerResource(
+ LIGHT_URI,
+ RESOURCE_TYPELIGHT,
+ OcPlatform.DEFAULT_INTERFACE,
+ this,
+ EnumSet.of(ResourceProperty.DISCOVERABLE));
+ } catch (OcException e) {
+ logMessage(TAG + "Failed to register LightResource");
+ Log.e(TAG, e.getMessage());
+ }
+ logMessage("-----------------------------------------------------");
+ }
+
+ /**
+ * sample implementation of eventHandler for lightResource - this can be implemented in many
+ * different ways
+ *
+ * @param ocResourceRequest OcResourceRequest from the client
+ * @return EntityHandlerResult indicates whether the request was handled successfully or not
+ */
+ @Override
+ public synchronized EntityHandlerResult handleEntity(OcResourceRequest ocResourceRequest) {
+ EntityHandlerResult result = EntityHandlerResult.ERROR;
+ if (null != ocResourceRequest) {
+ try {
+ if (ocResourceRequest.getRequestHandlerFlagSet().contains(
+ RequestHandlerFlag.REQUEST)) {
+ OcResourceResponse response = new OcResourceResponse();
+ response.setRequestHandle(ocResourceRequest.getRequestHandle());
+ response.setResourceHandle(ocResourceRequest.getResourceHandle());
+ switch (ocResourceRequest.getRequestType()) {
+ case GET:
+ response.setErrorCode(Resource.SUCCESS);
+ updateRepresentationValues();
+ response.setResourceRepresentation(mRepresentation);
+ response.setResponseResult(EntityHandlerResult.OK);
+ OcPlatform.sendResponse(response);
+ result = EntityHandlerResult.OK;
+ break;
+ case PUT:
+ response.setErrorCode(Resource.SUCCESS);
+ put(ocResourceRequest.getResourceRepresentation());
+ updateRepresentationValues();
+ response.setResourceRepresentation(mRepresentation);
+ response.setResponseResult(EntityHandlerResult.OK);
+ OcPlatform.sendResponse(response);
+ result = EntityHandlerResult.OK;
+ break;
+ }
+ }
+ } catch (OcException e) {
+ logMessage("Error in handleEntity");
+ Log.e(TAG, e.getMessage());
+ return EntityHandlerResult.ERROR;
+ }
+ }
+ logMessage("-----------------------------------------------------");
+ return result;
+ }
+
+ public OcResourceHandle getHandle() {
+ return mResourceHandle;
+ }
+
+ /**
+ * update the value of light (ON/ OFF) from the representation
+ *
+ * @param representation new state of light
+ */
+ private void put(OcRepresentation representation) {
+ try {
+ mIsLightOn = representation.getValue(LIGHT_STATUS_KEY);
+ } catch (OcException e) {
+ Log.e(TAG, e.getMessage());
+ }
+ }
+
+ /**
+ * helper function to update the current state of the light
+ */
+ private void updateRepresentationValues() {
+ try {
+ mRepresentation.setValue(LIGHT_STATUS_KEY, mIsLightOn);
+ } catch (OcException e) {
+ Log.e(TAG, e.getMessage());
+ }
+ }
+
+ //******************************************************************************
+ // End of the OIC specific code
+ //******************************************************************************
+ private Context mContext;
+ private boolean mIsLightOn = false;
+
+ private static String TAG = "LightResource: ";
+ public static final String LIGHT_URI = "/light";
+ public static final String RESOURCE_TYPELIGHT = "intel.fridge.light";
+ public static final String LIGHT_STATUS_KEY = "light";
+
+ private void logMessage(String msg) {
+ Intent intent = new Intent(Resource.INTENT);
+ intent.putExtra(Resource.MESSAGE, msg);
+ mContext.sendBroadcast(intent);
+ }
+}
--- /dev/null
+/*
+ * //******************************************************************
+ * //
+ * // 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.content.Context;
+
+/**
+ * Refrigerator
+ * <p/>
+ * Refrigerator class has different objects (resources) which are instantiated when a
+ * Refrigerator object is created. Operations are performed on each of the individual resources.
+ */
+public class Refrigerator {
+ public static final String LEFT_SIDE = "left";
+ public static final String RIGHT_SIDE = "right";
+ public static final String RANDOM_SIDE = "random";
+
+ private FridgeResource mFridge;
+ private LightResource mLight;
+ private DoorResource mLeftDoor;
+ private DoorResource mRightDoor;
+ private DoorResource mRandomDoor;
+
+ /**
+ * constructor - creates resources of light and doors
+ *
+ * @param context needed by individual resources to be able to send broadcast
+ * messages to be displayed on the user screen
+ */
+ Refrigerator(Context context) {
+ mFridge = new FridgeResource(context);
+ mLight = new LightResource(context);
+ mLeftDoor = new DoorResource(LEFT_SIDE, context);
+ mRightDoor = new DoorResource(RIGHT_SIDE, context);
+ mRandomDoor = new DoorResource(RANDOM_SIDE, context);
+
+ mLight.bindTo(mFridge.getHandle());
+ mLeftDoor.bindTo(mFridge.getHandle());
+ mRightDoor.bindTo(mFridge.getHandle());
+ mRandomDoor.bindTo(mFridge.getHandle());
+ }
+}
\ No newline at end of file
--- /dev/null
+/*
+ * //******************************************************************
+ * //
+ * // 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.util.Log;
+
+import org.iotivity.base.OcException;
+import org.iotivity.base.OcPlatform;
+import org.iotivity.base.OcRepresentation;
+import org.iotivity.base.OcResourceHandle;
+
+/**
+ * Resource
+ * <p/>
+ * Each of the other resource classes (DeviceResource, DoorResource and LightResource extend Resource
+ */
+public abstract class Resource {
+ protected OcResourceHandle mResourceHandle;
+ protected OcRepresentation mRepresentation;
+
+ Resource() {
+ mResourceHandle = null;
+ mRepresentation = new OcRepresentation();
+ }
+
+ public void bindTo(OcResourceHandle collectionResourceHandle) {
+ try {
+ if (null != mResourceHandle && null != collectionResourceHandle) {
+ OcPlatform.bindResource(collectionResourceHandle, mResourceHandle);
+ }
+ } catch (OcException e) {
+ Log.e("Resource", e.getMessage());
+ }
+ }
+
+ public static final int SUCCESS = 200;
+ public static final String INTENT = "org.iotivity.base.examples.fridgegroupserver";
+ public static final String MESSAGE = "message";
+}
\ No newline at end of file
--- /dev/null
+<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:orientation="vertical"
+ android:paddingBottom="@dimen/activity_vertical_margin"
+ android:paddingLeft="@dimen/activity_horizontal_margin"
+ android:paddingRight="@dimen/activity_horizontal_margin"
+ android:paddingTop="@dimen/activity_vertical_margin"
+ tools:context=".FridgeGroupServer">
+ <Button
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:id="@+id/button"
+ android:layout_centerHorizontal="true"
+ android:textOff="Start"
+ android:textOn="Stop"
+ android:layout_alignParentEnd="true"
+ android:layout_alignParentStart="true"
+ android:text="Start" />
+ <ScrollView
+ android:layout_below="@id/button"
+ 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
--- /dev/null
+<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>
--- /dev/null
+<resources>
+ <!-- Default screen margins, per the Android Design guidelines. -->
+ <dimen name="activity_horizontal_margin">16dp</dimen>
+ <dimen name="activity_vertical_margin">16dp</dimen>
+</resources>
--- /dev/null
+<?xml version="1.0" encoding="utf-8"?>
+<resources>
+ <string name="app_name">FridgeGroupServer</string>
+</resources>
--- /dev/null
+<resources>
+
+ <!-- Base application theme. -->
+ <style name="AppTheme" parent="android:Theme.Holo.Light.DarkActionBar">
+ <!-- Customize your theme here. -->
+ </style>
+
+</resources>
-//apply plugin: 'com.android.application'\r
-//\r
-//android {\r
-// compileSdkVersion 21\r
-// buildToolsVersion "20.0.0"\r
-//\r
-// defaultConfig {\r
-// applicationId "org.iotivity.base.examples.fridgeserver"\r
-// minSdkVersion 21\r
-// targetSdkVersion 21\r
-// versionCode 1\r
-// versionName "1.0"\r
-// }\r
-// buildTypes {\r
-// release {\r
-// minifyEnabled false\r
-// proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'\r
-// }\r
-// }\r
-// lintOptions {\r
-// abortOnError false\r
-// }\r
-//}\r
-//repositories {\r
-// flatDir {\r
-// dirs "../../android_api/base/build/outputs/aar/"\r
-// }\r
-//}\r
-//\r
-//try {\r
-// dependencies {\r
-// compile ":iotivity-base-${TARGET_ARCH}-${RELEASE}@aar"\r
-// }\r
-//} catch (all) {\r
-// print "${ERROR_MSG}"\r
-// assert all\r
-//}
\ No newline at end of file
+apply plugin: 'com.android.application'
+android {
+ compileSdkVersion 21
+ buildToolsVersion "20.0.0"
+
+ defaultConfig {
+ applicationId "org.iotivity.base.examples.fridgeserver"
+ minSdkVersion 21
+ targetSdkVersion 21
+ versionCode 1
+ versionName "1.0"
+ }
+ buildTypes {
+ release {
+ minifyEnabled false
+ proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
+ }
+ }
+ lintOptions {
+ abortOnError false
+ }
+}
+repositories {
+ flatDir {
+ dirs "../../android_api/base/build/outputs/aar/"
+ }
+}
+try {
+ dependencies {
+ compile ":iotivity-base-${TARGET_ARCH}-${RELEASE}@aar"
+ }
+} catch (all) {
+ print "${ERROR_MSG}"
+ assert all
+}
\ No newline at end of file
-<?xml version="1.0" encoding="UTF-8"?>\r
-<module 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">\r
- <component name="FacetManager">\r
- <facet type="android-gradle" name="Android-Gradle">\r
- <configuration>\r
- <option name="GRADLE_PROJECT_PATH" value=":fridgeserver" />\r
- </configuration>\r
- </facet>\r
- <facet type="android" name="Android">\r
- <configuration>\r
- <option name="SELECTED_BUILD_VARIANT" value="debug" />\r
- <option name="SELECTED_TEST_ARTIFACT" value="_android_test_" />\r
- <option name="ASSEMBLE_TASK_NAME" value="assembleDebug" />\r
- <option name="COMPILE_JAVA_TASK_NAME" value="compileDebugSources" />\r
- <option name="ASSEMBLE_TEST_TASK_NAME" value="assembleDebugTest" />\r
- <option name="SOURCE_GEN_TASK_NAME" value="generateDebugSources" />\r
- <option name="TEST_SOURCE_GEN_TASK_NAME" value="generateDebugTestSources" />\r
- <option name="ALLOW_USER_CONFIGURATION" value="false" />\r
- <option name="MANIFEST_FILE_RELATIVE_PATH" value="/src/main/AndroidManifest.xml" />\r
- <option name="RES_FOLDER_RELATIVE_PATH" value="/src/main/res" />\r
- <option name="RES_FOLDERS_RELATIVE_PATH" value="file://$MODULE_DIR$/src/main/res" />\r
- <option name="ASSETS_FOLDER_RELATIVE_PATH" value="/src/main/assets" />\r
- </configuration>\r
- </facet>\r
- </component>\r
- <component name="NewModuleRootManager" inherit-compiler-output="false">\r
- <output url="file://$MODULE_DIR$/build/intermediates/classes/debug" />\r
- <output-test url="file://$MODULE_DIR$/build/intermediates/classes/test/debug" />\r
- <exclude-output />\r
- <content url="file://$MODULE_DIR$">\r
- <sourceFolder url="file://$MODULE_DIR$/build/generated/source/r/debug" isTestSource="false" generated="true" />\r
- <sourceFolder url="file://$MODULE_DIR$/build/generated/source/aidl/debug" isTestSource="false" generated="true" />\r
- <sourceFolder url="file://$MODULE_DIR$/build/generated/source/buildConfig/debug" isTestSource="false" generated="true" />\r
- <sourceFolder url="file://$MODULE_DIR$/build/generated/source/rs/debug" isTestSource="false" generated="true" />\r
- <sourceFolder url="file://$MODULE_DIR$/build/generated/res/rs/debug" type="java-resource" />\r
- <sourceFolder url="file://$MODULE_DIR$/build/generated/res/generated/debug" type="java-resource" />\r
- <sourceFolder url="file://$MODULE_DIR$/build/generated/source/r/test/debug" isTestSource="true" generated="true" />\r
- <sourceFolder url="file://$MODULE_DIR$/build/generated/source/aidl/test/debug" isTestSource="true" generated="true" />\r
- <sourceFolder url="file://$MODULE_DIR$/build/generated/source/buildConfig/test/debug" isTestSource="true" generated="true" />\r
- <sourceFolder url="file://$MODULE_DIR$/build/generated/source/rs/test/debug" isTestSource="true" generated="true" />\r
- <sourceFolder url="file://$MODULE_DIR$/build/generated/res/rs/test/debug" type="java-test-resource" />\r
- <sourceFolder url="file://$MODULE_DIR$/build/generated/res/generated/test/debug" type="java-test-resource" />\r
- <sourceFolder url="file://$MODULE_DIR$/src/debug/res" type="java-resource" />\r
- <sourceFolder url="file://$MODULE_DIR$/src/debug/resources" type="java-resource" />\r
- <sourceFolder url="file://$MODULE_DIR$/src/debug/assets" type="java-resource" />\r
- <sourceFolder url="file://$MODULE_DIR$/src/debug/aidl" isTestSource="false" />\r
- <sourceFolder url="file://$MODULE_DIR$/src/debug/java" isTestSource="false" />\r
- <sourceFolder url="file://$MODULE_DIR$/src/debug/jni" isTestSource="false" />\r
- <sourceFolder url="file://$MODULE_DIR$/src/debug/rs" isTestSource="false" />\r
- <sourceFolder url="file://$MODULE_DIR$/src/main/res" type="java-resource" />\r
- <sourceFolder url="file://$MODULE_DIR$/src/main/resources" type="java-resource" />\r
- <sourceFolder url="file://$MODULE_DIR$/src/main/assets" type="java-resource" />\r
- <sourceFolder url="file://$MODULE_DIR$/src/main/aidl" isTestSource="false" />\r
- <sourceFolder url="file://$MODULE_DIR$/src/main/java" isTestSource="false" />\r
- <sourceFolder url="file://$MODULE_DIR$/src/main/jni" isTestSource="false" />\r
- <sourceFolder url="file://$MODULE_DIR$/src/main/rs" isTestSource="false" />\r
- <sourceFolder url="file://$MODULE_DIR$/src/androidTest/res" type="java-test-resource" />\r
- <sourceFolder url="file://$MODULE_DIR$/src/androidTest/resources" type="java-test-resource" />\r
- <sourceFolder url="file://$MODULE_DIR$/src/androidTest/assets" type="java-test-resource" />\r
- <sourceFolder url="file://$MODULE_DIR$/src/androidTest/aidl" isTestSource="true" />\r
- <sourceFolder url="file://$MODULE_DIR$/src/androidTest/java" isTestSource="true" />\r
- <sourceFolder url="file://$MODULE_DIR$/src/androidTest/jni" isTestSource="true" />\r
- <sourceFolder url="file://$MODULE_DIR$/src/androidTest/rs" isTestSource="true" />\r
- <excludeFolder url="file://$MODULE_DIR$/build/intermediates/assets" />\r
- <excludeFolder url="file://$MODULE_DIR$/build/intermediates/bundles" />\r
- <excludeFolder url="file://$MODULE_DIR$/build/intermediates/classes" />\r
- <excludeFolder url="file://$MODULE_DIR$/build/intermediates/coverage-instrumented-classes" />\r
- <excludeFolder url="file://$MODULE_DIR$/build/intermediates/dependency-cache" />\r
- <excludeFolder url="file://$MODULE_DIR$/build/intermediates/dex" />\r
- <excludeFolder url="file://$MODULE_DIR$/build/intermediates/dex-cache" />\r
- <excludeFolder url="file://$MODULE_DIR$/build/intermediates/incremental" />\r
- <excludeFolder url="file://$MODULE_DIR$/build/intermediates/jacoco" />\r
- <excludeFolder url="file://$MODULE_DIR$/build/intermediates/javaResources" />\r
- <excludeFolder url="file://$MODULE_DIR$/build/intermediates/libs" />\r
- <excludeFolder url="file://$MODULE_DIR$/build/intermediates/lint" />\r
- <excludeFolder url="file://$MODULE_DIR$/build/intermediates/manifests" />\r
- <excludeFolder url="file://$MODULE_DIR$/build/intermediates/ndk" />\r
- <excludeFolder url="file://$MODULE_DIR$/build/intermediates/pre-dexed" />\r
- <excludeFolder url="file://$MODULE_DIR$/build/intermediates/proguard" />\r
- <excludeFolder url="file://$MODULE_DIR$/build/intermediates/res" />\r
- <excludeFolder url="file://$MODULE_DIR$/build/intermediates/rs" />\r
- <excludeFolder url="file://$MODULE_DIR$/build/intermediates/symbols" />\r
- <excludeFolder url="file://$MODULE_DIR$/build/outputs" />\r
- <excludeFolder url="file://$MODULE_DIR$/build/tmp" />\r
- </content>\r
- <orderEntry type="jdk" jdkName="Android API 21 Platform" jdkType="Android SDK" />\r
- <orderEntry type="sourceFolder" forTests="false" />\r
- <orderEntry type="library" exported="" name="iotivity-x86-base-debug-unspecified" level="project" />\r
- <orderEntry type="library" exported="" name="appcompat-v7-21.0.3" level="project" />\r
- <orderEntry type="library" exported="" name="support-annotations-21.0.3" level="project" />\r
- <orderEntry type="library" exported="" name="support-v4-21.0.3" level="project" />\r
- <orderEntry type="module" module-name="message" exported="" />\r
- </component>\r
-</module>\r
-\r
+<?xml version="1.0" encoding="UTF-8"?>
+<module external.linked.project.id=":fridgeserver" 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=":fridgeserver" />
+ </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/resValues/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/resValues/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/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 21 Platform" jdkType="Android SDK" />
+ <orderEntry type="sourceFolder" forTests="false" />
+ <orderEntry type="module" module-name="iotivity-base-armeabi-release" exported="" />
+ <orderEntry type="library" exported="" name="iotivity-base-armeabi-release-unspecified" level="project" />
+ </component>
+</module>
\ No newline at end of file
xmlns:tools="http://schemas.android.com/tools"
package="org.iotivity.base.examples.fridgeserver">
- <uses-sdk tools:overrideLibrary="org.iotivity.base"></uses-sdk>
-
<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"/>
<application
android:allowBackup="true"
- android:icon="@drawable/ic_launcher"
+ android:icon="@drawable/iotivityicon"
android:label="@string/app_name"
android:theme="@style/AppTheme" >
<activity
+ android:screenOrientation="portrait"
android:name=".FridgeServer"
android:label="@string/app_name" >
<intent-filter>
import java.util.LinkedList;
import java.util.List;
-import base.iotivity.org.examples.message.IMessageLogger;
-
/**
* DeviceResource
* <p/>
* Creates a device resource and performs action based on client requests
*/
-public class DeviceResource extends Resource implements IMessageLogger {
- private Context mContext;
-
+public class DeviceResource extends Resource implements OcPlatform.EntityHandler {
+ public static final String DEVICE_URI = "/device";
+ public static final String RESOURCE_TYPENAME = "intel.fridge";
+ public static final String API_VERSION = "v.1.0";
+ public static final String CLIENT_TOKEN = "21ae43gf";
+ public static final String DEVICE_NAME = "device_name";
private static String TAG = "DeviceResource: ";
+ public static final int SUCCESS = 200;
+ public static final int API_VERSION_KEY = 2048;
+ public static final int CLIENT_VERSION_KEY = 3000;
+
+ private Context mContext;
/**
* constructor
*/
DeviceResource(Context context) {
mContext = context;
-
- // eventHandler for register deviceResource
- OcPlatform.EntityHandler eh = new OcPlatform.EntityHandler() {
- @Override
- public EntityHandlerResult handleEntity(OcResourceRequest ocResourceRequest) {
- // this is where the main logic of DeviceResource is handled
- return entityHandler(ocResourceRequest);
- }
- };
-
- try {
- logMessage(TAG + "RegisterDeviceResource " + StringConstants.DEVICE_URI + " : " +
- StringConstants.RESOURCE_TYPENAME + " : " + StringConstants.RESOURCE_INTERFACE);
- mResourceHandle = OcPlatform.registerResource(StringConstants.DEVICE_URI,
- StringConstants.RESOURCE_TYPENAME, StringConstants.RESOURCE_INTERFACE,
- eh, EnumSet.of(ResourceProperty.DISCOVERABLE));
- } catch (OcException e) {
- logMessage(TAG + "registerResource error: " + e.getMessage());
- Log.e(TAG, e.getMessage());
- }
+ registerDeviceResource();
}
- /**
- * update current state of device
- *
- * @return device representation
- */
- private void updateRepresentationValues() {
+ private void registerDeviceResource() {
try {
- mRepresentation.setValue(StringConstants.DEVICE_NAME,
- "Intel Powered 2 door, 1 light refrigerator");
+ logMessage("RegisterDeviceResource " + DEVICE_URI + " : " + RESOURCE_TYPENAME);
+ mResourceHandle = OcPlatform.registerResource(
+ DEVICE_URI,
+ RESOURCE_TYPENAME,
+ OcPlatform.DEFAULT_INTERFACE,
+ this,
+ EnumSet.of(ResourceProperty.DISCOVERABLE));
} catch (OcException e) {
- Log.e(TAG, e.getMessage());
- }
- }
-
- /**
- * unregister the resource
- */
- private void deleteDeviceResource() {
- try {
- OcPlatform.unregisterResource(mResourceHandle);
- logMessage(TAG + "Unregister DeviceResource successful");
- } catch (OcException e) {
- logMessage(TAG + e.getMessage());
+ logMessage(TAG + "Failed to register DeviceResource");
Log.e(TAG, e.getMessage());
}
}
/**
* this is the main method which handles different incoming requests appropriately.
*
- * @param request OcResourceRequest from the client
- * @return EntityHandlerResult depending on whether the request was handled successfully or not
+ * @param ocResourceRequest OcResourceRequest from the client
+ * @return EntityHandlerResult indicates whether the request was handled successfully or not
*/
- private EntityHandlerResult entityHandler(OcResourceRequest request) {
+ @Override
+ public synchronized EntityHandlerResult handleEntity(OcResourceRequest ocResourceRequest) {
EntityHandlerResult result = EntityHandlerResult.ERROR;
- if (null != request) {
- List<OcHeaderOption> headerOptions = request.getHeaderOptions();
+ if (null != ocResourceRequest) {
+ List<OcHeaderOption> headerOptions = ocResourceRequest.getHeaderOptions();
String clientAPIVersion = "";
String clientToken = "";
-
// search for header options map and look for API version and client token
for (OcHeaderOption headerOption : headerOptions) {
int optionId = headerOption.getOptionId();
- if (StringConstants.API_VERSION_KEY == optionId) {
+ if (API_VERSION_KEY == optionId) {
clientAPIVersion = headerOption.getOptionData();
logMessage(TAG + " Client API Version: " + clientAPIVersion);
- } else if (StringConstants.CLIENT_VERSION_KEY == optionId) {
+ } else if (CLIENT_VERSION_KEY == optionId) {
clientToken = headerOption.getOptionData();
logMessage(TAG + " Client Token: " + clientToken);
}
}
-
- if (clientAPIVersion.equals(StringConstants.API_VERSION) &&
- clientToken.equals(StringConstants.CLIENT_TOKEN)) {
+ if (clientAPIVersion.equals(API_VERSION) &&
+ clientToken.equals(CLIENT_TOKEN)) {
List<OcHeaderOption> serverHeaderOptions = new LinkedList<>();
- OcHeaderOption apiVersion = new OcHeaderOption(StringConstants.API_VERSION_KEY,
- StringConstants.API_VERSION);
+ OcHeaderOption apiVersion = new OcHeaderOption(API_VERSION_KEY,
+ API_VERSION);
serverHeaderOptions.add(apiVersion);
try {
- if (request.getRequestHandlerFlagSet().contains(RequestHandlerFlag.REQUEST)) {
+ if (ocResourceRequest.getRequestHandlerFlagSet().contains(RequestHandlerFlag.REQUEST)) {
OcResourceResponse response = new OcResourceResponse();
- response.setRequestHandle(request.getRequestHandle());
- response.setResourceHandle(request.getResourceHandle());
+ response.setRequestHandle(ocResourceRequest.getRequestHandle());
+ response.setResourceHandle(ocResourceRequest.getResourceHandle());
response.setHeaderOptions(serverHeaderOptions);
- switch (request.getRequestType()) {
+ switch (ocResourceRequest.getRequestType()) {
case GET:
- response.setErrorCode(StringConstants.OK);
+ response.setErrorCode(SUCCESS);
response.setResponseResult(EntityHandlerResult.OK);
updateRepresentationValues();
response.setResourceRepresentation(mRepresentation);
OcPlatform.sendResponse(response);
break;
- case DELETE:
- deleteDeviceResource();
- response.setErrorCode(StringConstants.OK);
- response.setResponseResult(EntityHandlerResult.OK);
- break;
}
result = EntityHandlerResult.OK;
}
} catch (OcException e) {
- logMessage(TAG + e.getMessage());
+ logMessage("Error in handleEntity of DeviceResource");
Log.e(TAG, e.getMessage());
}
}
}
+ logMessage("-----------------------------------------------------");
return result;
}
- @Override
- public void logMessage(String msg) {
- logMsg(msg);
- if (StringConstants.ENABLE_PRINTING) {
- Log.i(TAG, msg);
+ /**
+ * update state of device
+ *
+ * @return device representation
+ */
+ private void updateRepresentationValues() {
+ try {
+ mRepresentation.setValue(DEVICE_NAME,
+ "Intel Powered 3 door, 1 light refrigerator");
+ } catch (OcException e) {
+ Log.e(TAG, e.getMessage());
}
}
- public void logMsg(final String text) {
- Intent intent = new Intent(StringConstants.INTENT);
- intent.putExtra("message", text);
+ //******************************************************************************
+ // End of the OIC specific code
+ //******************************************************************************
+ public void logMessage(String msg) {
+ Intent intent = new Intent(FridgeServer.INTENT);
+ intent.putExtra("message", msg);
mContext.sendBroadcast(intent);
}
}
import java.util.EnumSet;
-import base.iotivity.org.examples.message.IMessageLogger;
-
/**
* DoorResource
* <p/>
- * Creates a door resource and performs action based on client requests
+ * Creates a door resource and performs actions based on the client requests
*/
-public class DoorResource extends Resource implements IMessageLogger {
- private Context mContext;
-
- private static String TAG = "DoorResource: ";
- private String mSide = StringConstants.LEFT;
- private boolean mOpen;
- private String resourceURI;
+public class DoorResource extends Resource implements OcPlatform.EntityHandler {
+ public static final String DOOR_URI = "/door/";
+ public static final String RESOURCE_TYPEDOOR = "intel.fridge.door";
+ public static final String DOOR_STATE_KEY = "state";
+ public static final String DOOR_SIDE_KEY = "side";
+ private boolean mDoorState;
+ private String mSide;
/**
* Constructor
*
- * @param side left or right side of the door
+ * @param side side of the door
* @param context to enable sending of broadcast messages to be displayed on the user screen
*/
DoorResource(String side, Context context) {
mContext = context;
mSide = side;
-
- resourceURI = StringConstants.DOOR_URI + mSide;
-
- // eventHandler for register doorResource
- OcPlatform.EntityHandler eh = new OcPlatform.EntityHandler() {
- @Override
- public EntityHandlerResult handleEntity(OcResourceRequest ocResourceRequest) {
- // this is where the main logic of DoorResource is handled
- return entityHandler(ocResourceRequest);
- }
- };
- try {
- logMessage(TAG + "RegisterDoorResource " + resourceURI + " : " +
- StringConstants.RESOURCE_TYPEDOOR + " : " + StringConstants.RESOURCE_INTERFACE);
- mResourceHandle = OcPlatform.registerResource(resourceURI,
- StringConstants.RESOURCE_TYPEDOOR, StringConstants.RESOURCE_INTERFACE,
- eh, EnumSet.of(ResourceProperty.DISCOVERABLE));
- } catch (OcException e) {
- logMessage(TAG + "DoorResource registerResource error: " + e.getMessage());
- Log.e(TAG, e.getMessage());
- }
- }
-
- /**
- * updates the current value of the door resource
- *
- * @return door representation
- */
- private void updateRepresentationValues() {
- try {
- mRepresentation.setValue(StringConstants.SIDE, mSide);
- mRepresentation.setValue(StringConstants.OPEN, mOpen);
- mRepresentation.setValue(StringConstants.DEVICE_NAME,
- "Intel Powered 2 door, 1 light refrigerator");
- } catch (OcException e) {
- Log.e(TAG, e.getMessage());
- }
+ registerDoorResource();
}
- /**
- * update the OPEN value of doorResource (door is open/ closed)
- *
- * @param representation get current state of door
- */
- private void put(OcRepresentation representation) {
+ private void registerDoorResource() {
+ String resourceURI = DOOR_URI + mSide;
+ logMessage(TAG + "RegisterDoorResource " + resourceURI + " : " + RESOURCE_TYPEDOOR);
try {
- mOpen = representation.getValue(StringConstants.OPEN);
+ mResourceHandle = OcPlatform.registerResource(resourceURI,
+ RESOURCE_TYPEDOOR,
+ OcPlatform.DEFAULT_INTERFACE,
+ this,
+ EnumSet.of(ResourceProperty.DISCOVERABLE));
} catch (OcException e) {
+ logMessage(TAG + "Failed to register DoorResource");
Log.e(TAG, e.getMessage());
}
- // Note, we won't let the user change the door side!
}
/**
* this is the main method which handles different incoming requests appropriately.
*
- * @param request OcResourceRequest from the client
- * @return EntityHandlerResult depending on whether the request was handled successfully or not
+ * @param ocResourceRequest OcResourceRequest from the client
+ * @return EntityHandlerResult indicates whether the request was handled successfully or not
*/
- private EntityHandlerResult entityHandler(OcResourceRequest request) {
+ @Override
+ public synchronized EntityHandlerResult handleEntity(OcResourceRequest ocResourceRequest) {
EntityHandlerResult result = EntityHandlerResult.ERROR;
- if (null != request) {
+ if (null != ocResourceRequest) {
try {
- if (request.getRequestHandlerFlagSet().contains(RequestHandlerFlag.REQUEST)) {
+ if (ocResourceRequest.getRequestHandlerFlagSet().contains(RequestHandlerFlag.REQUEST)) {
OcResourceResponse response = new OcResourceResponse();
- response.setRequestHandle(request.getRequestHandle());
- response.setResourceHandle(request.getResourceHandle());
+ response.setRequestHandle(ocResourceRequest.getRequestHandle());
+ response.setResourceHandle(ocResourceRequest.getResourceHandle());
- switch (request.getRequestType()) {
+ switch (ocResourceRequest.getRequestType()) {
case GET:
- response.setErrorCode(StringConstants.OK);
+ response.setErrorCode(SUCCESS);
updateRepresentationValues();
response.setResourceRepresentation(mRepresentation);
response.setResponseResult(EntityHandlerResult.OK);
OcPlatform.sendResponse(response);
break;
case PUT:
- response.setErrorCode(StringConstants.OK);
- put(request.getResourceRepresentation());
+ response.setErrorCode(SUCCESS);
+ put(ocResourceRequest.getResourceRepresentation());
updateRepresentationValues();
response.setResourceRepresentation(mRepresentation);
response.setResponseResult(EntityHandlerResult.OK);
result = EntityHandlerResult.OK;
}
} catch (OcException e) {
- logMessage(TAG + e.getMessage());
+ logMessage("Error in handleEntity of DoorResource");
Log.e(TAG, e.getMessage());
return EntityHandlerResult.ERROR;
}
}
+ logMessage("-----------------------------------------------------");
return result;
}
- @Override
- public void logMessage(String msg) {
- logMsg(msg);
- if (StringConstants.ENABLE_PRINTING) {
- Log.i(TAG, msg);
+ /**
+ * helper function to update the current value of the door resource
+ */
+ private void updateRepresentationValues() {
+ try {
+ mRepresentation.setValue(DOOR_STATE_KEY, mDoorState);
+ mRepresentation.setValue(DOOR_SIDE_KEY, mSide);
+ logMessage(TAG + "door state is " + ((mDoorState == true) ? "open" : "close") +
+ " and door side is " + mSide);
+ } catch (OcException e) {
+ Log.e(TAG, e.getMessage());
+ }
+ }
+
+ /**
+ * update the value of doorResource, depending on if door is open/ closed
+ *
+ * @param representation new state of a door
+ */
+ private void put(OcRepresentation representation) {
+ try {
+ mDoorState = representation.getValue(DOOR_STATE_KEY);
+ } catch (OcException e) {
+ Log.e(TAG, e.getMessage());
}
+ // Note, we won't let the user change the door side!
}
- public void logMsg(final String text) {
- Intent intent = new Intent(StringConstants.INTENT);
- intent.putExtra(StringConstants.MESSAGE, text);
+ //******************************************************************************
+ // End of the OIC specific code
+ //******************************************************************************
+ private Context mContext;
+ private static String TAG = "DoorResource: ";
+
+ public void logMessage(String msg) {
+ Intent intent = new Intent(FridgeServer.INTENT);
+ intent.putExtra(FridgeServer.MESSAGE, msg);
mContext.sendBroadcast(intent);
}
-}
+}
\ No newline at end of file
import android.content.IntentFilter;
import android.os.Bundle;
import android.os.Message;
-import android.support.v4.content.LocalBroadcastManager;
import android.text.method.ScrollingMovementMethod;
import android.util.Log;
-import android.view.Menu;
-import android.view.MenuItem;
-import android.widget.LinearLayout;
+import android.view.View;
+import android.widget.Button;
+import android.widget.ScrollView;
import android.widget.TextView;
import org.iotivity.base.ModeType;
import org.iotivity.base.QualityOfService;
import org.iotivity.base.ServiceType;
-import base.iotivity.org.examples.message.IMessageLogger;
-
/**
* FridgeServer
* <p/>
* This is the main fridgeServer class. This instantiates Refrigerator object
- * which has different resources (DeviceResource, LightResource, DoorResource).
+ * which has different resources (DeviceResource, LightResource, DoorResources).
*/
-public class FridgeServer extends Activity implements IMessageLogger {
- private Context mContext;
- private static String TAG = "FridgeServer: ";
- private TextView mEventsTextView;
- private MessageReceiver mMessageReceiver = new MessageReceiver();
+public class FridgeServer extends Activity {
private Refrigerator refrigerator;
/**
* configure OIC platform and call findResource
*/
- private void initOICStack() {
+ private void startFridgeServer() {
//create platform config
PlatformConfig cfg = new PlatformConfig(
- this,
+ this, //context
ServiceType.IN_PROC,
ModeType.SERVER,
"0.0.0.0", // bind to all available interfaces
0,
QualityOfService.LOW);
+ logMessage("Configuring platform");
OcPlatform.Configure(cfg);
- logMessage(TAG + "Creating refrigerator resources");
-
- refrigerator = new Refrigerator(mContext);
+ logMessage("Creating refrigerator resources");
+ refrigerator = new Refrigerator(this);
+ logMessage("-----------------------------------------------------");
}
+ //******************************************************************************
+ // End of the OIC specific code
+ //******************************************************************************
+ private static String TAG = "FridgeServer: ";
+ public static final String MESSAGE = "message";
+ public static final String INTENT = "org.iotivity.base.examples.fridgeserver";
+ private TextView mConsoleTextView;
+ private ScrollView mScrollView;
+ private MessageReceiver mMessageReceiver = new MessageReceiver();
+
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_fridge_server);
- registerReceiver(mMessageReceiver, new IntentFilter(StringConstants.INTENT));
-
- mEventsTextView = new TextView(this);
- mEventsTextView.setMovementMethod(new ScrollingMovementMethod());
- LinearLayout layout = (LinearLayout) findViewById(R.id.linearLayout);
- layout.addView(mEventsTextView, new LinearLayout.LayoutParams
- (LinearLayout.LayoutParams.MATCH_PARENT, 0, 1f));
- mContext = this;
-
- initOICStack();
+ registerReceiver(mMessageReceiver, new IntentFilter(INTENT));
+
+ mConsoleTextView = (TextView) findViewById(R.id.consoleTextView);
+ mConsoleTextView.setMovementMethod(new ScrollingMovementMethod());
+ mScrollView = (ScrollView) findViewById(R.id.scrollView);
+ mScrollView.fullScroll(View.FOCUS_DOWN);
+ final Button button = (Button) findViewById(R.id.button);
+
+ if (null == savedInstanceState) {
+ button.setOnClickListener(new View.OnClickListener() {
+ @Override
+ public void onClick(View v) {
+ button.setEnabled(false);
+ new Thread(new Runnable() {
+ public void run() {
+ startFridgeServer();
+ }
+ }).start();
+ }
+ });
+ } else {
+ String consoleOutput = savedInstanceState.getString("consoleOutputString");
+ mConsoleTextView.setText(consoleOutput);
+ }
}
public class MessageReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
- final String message = intent.getStringExtra(StringConstants.MESSAGE);
+ final String message = intent.getStringExtra(MESSAGE);
logMessage(message);
}
}
- @Override
public void logMessage(final String text) {
- if (StringConstants.ENABLE_PRINTING) {
- runOnUiThread(new Runnable() {
- public void run() {
- final Message msg = new Message();
- msg.obj = text;
- mEventsTextView.append("\n");
- mEventsTextView.append(text);
- }
- });
- Log.i(TAG, text);
- }
- }
-
- @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_fridge_server, menu);
- return true;
- }
-
- @Override
- public boolean onOptionsItemSelected(MenuItem item) {
- int id = item.getItemId();
- if (id == R.id.action_settings) {
- return true;
- }
- return super.onOptionsItemSelected(item);
- }
-
- @Override
- public void onDestroy() {
- super.onDestroy();
- onStop();
- }
-
- @Override
- protected void onStop() {
- LocalBroadcastManager.getInstance(this).unregisterReceiver(mMessageReceiver);
- super.onStop();
+ runOnUiThread(new Runnable() {
+ public void run() {
+ final Message msg = new Message();
+ msg.obj = text;
+ mConsoleTextView.append("\n");
+ mConsoleTextView.append(text);
+ }
+ });
+ Log.i(TAG, text);
}
}
import java.util.EnumSet;
-import base.iotivity.org.examples.message.IMessageLogger;
-
/**
* LightResource
* <p/>
- * Creates a light resource and performs action based on client requests
+ * Creates a light resource and performs actions based on the client requests
*/
-public class LightResource extends Resource implements IMessageLogger {
- private Context mContext;
-
- private static String TAG = "LightResource: ";
-
- private boolean mIsOn = false;
+public class LightResource extends Resource implements OcPlatform.EntityHandler {
+ public static final String LIGHT_STATUS_KEY = "light";
+ public static final String LIGHT_URI = "/light";
+ public static final String RESOURCE_TYPELIGHT = "intel.fridge.light";
+ private boolean mIsLightOn = false;
/**
* constructor
*/
LightResource(Context context) {
mContext = context;
- //eventHandler for register lightResource
- OcPlatform.EntityHandler eh = new OcPlatform.EntityHandler() {
- @Override
- public EntityHandlerResult handleEntity(OcResourceRequest ocResourceRequest) {
- // this is where the main logic of LightResource is handled
- return entityHandler(ocResourceRequest);
- }
- };
- try {
- logMessage(TAG + "RegisterLightResource " + StringConstants.LIGHT_URI + " : " +
- StringConstants.RESOURCE_TYPELIGHT + " : " + StringConstants.RESOURCE_INTERFACE);
- mResourceHandle = OcPlatform.registerResource(StringConstants.LIGHT_URI,
- StringConstants.RESOURCE_TYPELIGHT, StringConstants.RESOURCE_INTERFACE,
- eh, EnumSet.of(ResourceProperty.DISCOVERABLE));
- } catch (OcException e) {
- logMessage(TAG + "LightResource registerResource error: " + e.getMessage());
- Log.e(TAG, e.getMessage());
- }
- }
-
- /**
- * updates the current state of the light (on/ off)
- *
- * @return light is on or off
- */
- private void updateRepresentationValues() {
- try {
- mRepresentation.setValue(StringConstants.ON, mIsOn);
- } catch (OcException e) {
- Log.e(TAG, e.getMessage());
- }
+ registerLightResource();
}
- /**
- * update the value of mIsOn from the representation
- *
- * @param representation get current state of light
- */
- private void put(OcRepresentation representation) {
+ private void registerLightResource() {
try {
- mIsOn = representation.getValue(StringConstants.ON);
+ logMessage(TAG + "RegisterLightResource " + LIGHT_URI + " : " + RESOURCE_TYPELIGHT);
+ mResourceHandle = OcPlatform.registerResource(LIGHT_URI,
+ RESOURCE_TYPELIGHT,
+ OcPlatform.DEFAULT_INTERFACE,
+ this,
+ EnumSet.of(ResourceProperty.DISCOVERABLE));
} catch (OcException e) {
+ logMessage(TAG + "Failed to register LightResource");
Log.e(TAG, e.getMessage());
}
+ logMessage("-----------------------------------------------------");
}
/**
* this is the main method which handles different incoming requests appropriately.
*
- * @param request OcResourceRequest from the client
- * @return EntityHandlerResult depending on whether the request was handled successfully or not
+ * @param ocResourceRequest OcResourceRequest from the client
+ * @return EntityHandlerResult indicates whether the request was handled successfully or not
*/
- private EntityHandlerResult entityHandler(OcResourceRequest request) {
+ @Override
+ public synchronized EntityHandlerResult handleEntity(OcResourceRequest ocResourceRequest) {
EntityHandlerResult result = EntityHandlerResult.ERROR;
- if (null != request) {
+ if (null != ocResourceRequest) {
try {
- if (request.getRequestHandlerFlagSet().contains(RequestHandlerFlag.REQUEST)) {
+ if (ocResourceRequest.getRequestHandlerFlagSet().contains(RequestHandlerFlag.REQUEST)) {
OcResourceResponse response = new OcResourceResponse();
- response.setRequestHandle(request.getRequestHandle());
- response.setResourceHandle(request.getResourceHandle());
+ response.setRequestHandle(ocResourceRequest.getRequestHandle());
+ response.setResourceHandle(ocResourceRequest.getResourceHandle());
- switch (request.getRequestType()) {
+ switch (ocResourceRequest.getRequestType()) {
case GET:
- response.setErrorCode(StringConstants.OK);
+ response.setErrorCode(SUCCESS);
updateRepresentationValues();
response.setResourceRepresentation(mRepresentation);
response.setResponseResult(EntityHandlerResult.OK);
result = EntityHandlerResult.OK;
break;
case PUT:
- response.setErrorCode(StringConstants.OK);
- put(request.getResourceRepresentation());
+ response.setErrorCode(SUCCESS);
+ put(ocResourceRequest.getResourceRepresentation());
updateRepresentationValues();
response.setResourceRepresentation(mRepresentation);
response.setResponseResult(EntityHandlerResult.OK);
}
}
} catch (OcException e) {
- logMessage(TAG + e.getMessage());
+ logMessage("Error in handleEntity of LightResource");
Log.e(TAG, e.getMessage());
return EntityHandlerResult.ERROR;
}
}
+ logMessage("-----------------------------------------------------");
return result;
}
- @Override
- public void logMessage(String msg) {
- logMsg(msg);
- if (StringConstants.ENABLE_PRINTING) {
- Log.i(TAG, msg);
+ /**
+ * updates the current state of the light (on/ off)
+ *
+ * @return light is on or off
+ */
+ private void updateRepresentationValues() {
+ try {
+ mRepresentation.setValue(LIGHT_STATUS_KEY, mIsLightOn);
+ } catch (OcException e) {
+ Log.e(TAG, e.getMessage());
+ }
+ }
+
+ /**
+ * update the value of mIsOn from the representation
+ *
+ * @param representation get current state of light
+ */
+ private void put(OcRepresentation representation) {
+ try {
+ mIsLightOn = representation.getValue(LIGHT_STATUS_KEY);
+ } catch (OcException e) {
+ Log.e(TAG, e.getMessage());
}
}
- public void logMsg(final String text) {
- Intent intent = new Intent(StringConstants.INTENT);
- intent.putExtra(StringConstants.MESSAGE, text);
+ //******************************************************************************
+ // End of the OIC specific code
+ //******************************************************************************
+ private Context mContext;
+ private static String TAG = "LightResource: ";
+
+ public void logMessage(String msg) {
+ Intent intent = new Intent(FridgeServer.INTENT);
+ intent.putExtra(FridgeServer.MESSAGE, msg);
mContext.sendBroadcast(intent);
}
}
* Refrigerator
* <p/>
* Refrigerator class has different objects (resources) which are instantiated when a
- * Refrigerator object is created. Operations are performed on each of the individual resources.
+ * Refrigerator object is created.
*/
public class Refrigerator {
- private Context mContext;
+ public static final String LEFT_SIDE = "left";
+ public static final String RIGHT_SIDE = "right";
+ public static final String RANDOM_SIDE = "random";
private LightResource mLight;
private DeviceResource mDevice;
* messages to be displayed on the user screen
*/
Refrigerator(Context context) {
- mContext = context;
mLight = new LightResource(context);
mDevice = new DeviceResource(context);
- mLeftDoor = new DoorResource(StringConstants.LEFT, context);
- mRightDoor = new DoorResource(StringConstants.RIGHT, context);
- mRandomDoor = new DoorResource(StringConstants.RANDOM, context);
- }
+ mLeftDoor = new DoorResource(LEFT_SIDE, context);
+ mRightDoor = new DoorResource(RIGHT_SIDE, context);
+ mRandomDoor = new DoorResource(RANDOM_SIDE, context);
+ mLight.bindTo(mDevice.getHandle());
+ mLeftDoor.bindTo(mDevice.getHandle());
+ mRightDoor.bindTo(mDevice.getHandle());
+ mRandomDoor.bindTo(mDevice.getHandle());
+ }
}
package org.iotivity.base.examples.fridgeserver;
+import android.util.Log;
+
+import org.iotivity.base.OcException;
+import org.iotivity.base.OcPlatform;
import org.iotivity.base.OcRepresentation;
import org.iotivity.base.OcResourceHandle;
mResourceHandle = null;
mRepresentation = new OcRepresentation();
}
+
+ public void bindTo(OcResourceHandle collectionResourceHandle) {
+ try {
+ if (null != mResourceHandle && null != collectionResourceHandle) {
+ OcPlatform.bindResource(collectionResourceHandle, mResourceHandle);
+ }
+ } catch (OcException e) {
+ Log.e("Resource", e.getMessage());
+ }
+ }
+
+ public OcResourceHandle getHandle() {
+ return mResourceHandle;
+ }
+
+ public static final int SUCCESS = 200;
}
\ No newline at end of file
+++ /dev/null
-package org.iotivity.base.examples.fridgeserver;
-
-import org.iotivity.base.OcPlatform;
-
-/**
- * StringConstant contains the fridgeserver specific constant values. To add another supported
- * Resource or Interface type to this app, begin by adding the new strings here, and then
- * find the places throughout the app where Resource-specific case switches occur, and add
- * the newly-supported type there.
- */
-public interface StringConstants {
- public static final String DEVICE_URI = "/device";
- public static final String LIGHT_URI = "/light";
- public static final String DOOR_URI = "/door/";
- public static final String DEVICE_NAME = "device_name";
- public static final String RESOURCE_TYPENAME = "intel.fridge";
- public static final String RESOURCE_TYPEDOOR = "intel.fridge.door";
- public static final String RESOURCE_TYPELIGHT = "intel.fridge.light";
- public static final String API_VERSION = "v.1.2";
- public static final String CLIENT_TOKEN = "AaBbYyZz";
- public static final String SIDE = "side";
- public static final String OPEN = "open";
- public static final String MESSAGE = "message";
- public static final String LEFT = "left";
- public static final String RIGHT = "right";
- public static final String RANDOM = "random";
- public static final String ON = "on";
- public static final String INTENT = "org.iotivity.base.examples.fridgeserver";
- public static final String RESOURCE_INTERFACE = OcPlatform.DEFAULT_INTERFACE;
-
- public static final int API_VERSION_KEY = 2048;
- public static final int CLIENT_VERSION_KEY = 3000;
- public static final int OK = 200;
-
- public static final boolean ENABLE_PRINTING = true; // change to false to disable printing
- // of messages on the console and the screen
-}
<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"
+ xmlns:tools="http://schemas.android.com/tools"
+ android:layout_width="match_parent"
+ android:layout_height="match_parent"
+ android:orientation="vertical"
+ android:paddingBottom="@dimen/activity_vertical_margin"
+ 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=".FridgeServer">
-
- <TextView android:text="@string/app_name" android:layout_width="wrap_content"
- android:layout_height="wrap_content" />
-
- <LinearLayout
+ tools:context=".FridgeServer">
+ <Button
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:id="@+id/button"
+ android:layout_centerHorizontal="true"
+ android:textOff="Start"
+ android:textOn="Stop"
+ android:layout_alignParentEnd="true"
+ android:layout_alignParentStart="true"
+ android:text="Start" />
+ <ScrollView
+ android:layout_below="@id/button"
+ android:layout_above="@+id/imageView"
android:layout_width="fill_parent"
- android:layout_height="fill_parent"
- android:orientation="vertical"
- android:id="@+id/linearLayout" >
- </LinearLayout>
-
-</RelativeLayout>
+ 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
+++ /dev/null
-<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=".FridgeServer">
- <item android:id="@+id/action_settings" android:title="@string/action_settings"
- android:orderInCategory="100" app:showAsAction="never" />
-</menu>
<resources>
<!-- Base application theme. -->
- <style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar">
+ <style name="AppTheme" parent="android:Theme.Holo.Light.DarkActionBar">
<!-- Customize your theme here. -->
</style>
-include ':simpleserver', ':simpleclient', ':message', ':fridgeserver', ':fridgeclient', ':guiclient', ':provisioningclient', ':presenceserver', ':presenceclient', ':devicediscoveryclient', ':devicediscoveryserver', ':groupclient', ':groupserver'
+include ':simpleserver', ':simpleclient', ':message', ':fridgeserver', ':fridgeclient', ':guiclient', ':provisioningclient', ':presenceserver', ':presenceclient', ':devicediscoveryclient', ':devicediscoveryserver', ':groupclient', ':groupserver', ':fridgegroupclient', ':fridgegroupserver'