From 7abfb5c94a9a18fbad632972f99ae4a8fb60c334 Mon Sep 17 00:00:00 2001 From: Tim Kourt Date: Fri, 18 Sep 2015 10:35:49 -0700 Subject: [PATCH] Android: Refactored SimpleClient The app was refactored with the emphasis to readability and cleanness. The theme has been modified to include IoTivity logo and small android icons. It also exercises the newly created features form the stack such as OcResourceIdentifier. Implemented hashCode() in OcResourceIdentifier to allow it to be used as a key in the dictionary objects PS 2: Removed unnecessary module reference Change-Id: Ib1c9a56d97fa52ffe7d17c156ed228cf6e8946ef Signed-off-by: Tim Kourt Reviewed-on: https://gerrit.iotivity.org/gerrit/2719 Tested-by: jenkins-iotivity Reviewed-by: Patrick Lankswert --- .../main/java/org/iotivity/base/OcResource.java | 14 + .../org/iotivity/base/OcResourceIdentifier.java | 7 + android/examples/examples.iml | 6 +- android/examples/simpleclient/build.gradle | 49 +- android/examples/simpleclient/proguard-rules.pro | 17 + android/examples/simpleclient/simpleclient.iml | 186 +++---- .../simpleclient/src/main/AndroidManifest.xml | 7 +- .../src/main/assets/oic_svr_db_client.json | 0 .../java/org/iotivity/base/examples/Light.java | 92 +++ .../org/iotivity/base/examples/SimpleClient.java | 614 +++++++++++++++++++++ .../iotivity/base/examples/simpleclient/Light.java | 65 --- .../base/examples/simpleclient/SimpleClient.java | 515 ----------------- .../examples/simpleclient/StringConstants.java | 17 - .../src/main/res/drawable-hdpi/ic_launcher.png | Bin 9397 -> 0 bytes .../src/main/res/drawable-mdpi/ic_launcher.png | Bin 5237 -> 0 bytes .../src/main/res/drawable-xhdpi/ic_launcher.png | Bin 14383 -> 0 bytes .../src/main/res/drawable-xxhdpi/ic_launcher.png | Bin 19388 -> 0 bytes .../src/main/res/drawable/iotivityicon.png | Bin 0 -> 2300 bytes .../src/main/res/drawable/iotivitylogo.png | Bin 0 -> 123110 bytes .../src/main/res/layout/activity_main.xml | 18 - .../src/main/res/layout/activity_simple_client.xml | 40 ++ .../simpleclient/src/main/res/menu/menu_main.xml | 6 - .../src/main/res/mipmap-hdpi/iotivityicon.png | Bin 0 -> 2300 bytes .../src/main/res/mipmap-mdpi/iotivityicon.png | Bin 0 -> 1300 bytes .../src/main/res/mipmap-xhdpi/iotivityicon.png | Bin 0 -> 2862 bytes .../src/main/res/mipmap-xxhdpi/iotivityicon.png | Bin 0 -> 2651 bytes .../src/main/res/values-v21/styles.xml | 5 + .../simpleclient/src/main/res/values/strings.xml | 4 +- .../simpleclient/src/main/res/values/styles.xml | 2 +- 29 files changed, 912 insertions(+), 752 deletions(-) mode change 100755 => 100644 android/examples/simpleclient/build.gradle create mode 100644 android/examples/simpleclient/proguard-rules.pro mode change 100755 => 100644 android/examples/simpleclient/simpleclient.iml mode change 100755 => 100644 android/examples/simpleclient/src/main/assets/oic_svr_db_client.json create mode 100644 android/examples/simpleclient/src/main/java/org/iotivity/base/examples/Light.java create mode 100644 android/examples/simpleclient/src/main/java/org/iotivity/base/examples/SimpleClient.java delete mode 100644 android/examples/simpleclient/src/main/java/org/iotivity/base/examples/simpleclient/Light.java delete mode 100644 android/examples/simpleclient/src/main/java/org/iotivity/base/examples/simpleclient/SimpleClient.java delete mode 100644 android/examples/simpleclient/src/main/java/org/iotivity/base/examples/simpleclient/StringConstants.java delete mode 100755 android/examples/simpleclient/src/main/res/drawable-hdpi/ic_launcher.png delete mode 100755 android/examples/simpleclient/src/main/res/drawable-mdpi/ic_launcher.png delete mode 100755 android/examples/simpleclient/src/main/res/drawable-xhdpi/ic_launcher.png delete mode 100755 android/examples/simpleclient/src/main/res/drawable-xxhdpi/ic_launcher.png create mode 100644 android/examples/simpleclient/src/main/res/drawable/iotivityicon.png create mode 100644 android/examples/simpleclient/src/main/res/drawable/iotivitylogo.png delete mode 100644 android/examples/simpleclient/src/main/res/layout/activity_main.xml create mode 100644 android/examples/simpleclient/src/main/res/layout/activity_simple_client.xml delete mode 100644 android/examples/simpleclient/src/main/res/menu/menu_main.xml create mode 100644 android/examples/simpleclient/src/main/res/mipmap-hdpi/iotivityicon.png create mode 100644 android/examples/simpleclient/src/main/res/mipmap-mdpi/iotivityicon.png create mode 100644 android/examples/simpleclient/src/main/res/mipmap-xhdpi/iotivityicon.png create mode 100644 android/examples/simpleclient/src/main/res/mipmap-xxhdpi/iotivityicon.png create mode 100644 android/examples/simpleclient/src/main/res/values-v21/styles.xml diff --git a/android/android_api/base/src/main/java/org/iotivity/base/OcResource.java b/android/android_api/base/src/main/java/org/iotivity/base/OcResource.java index 92e38e6..a6920e6 100644 --- a/android/android_api/base/src/main/java/org/iotivity/base/OcResource.java +++ b/android/android_api/base/src/main/java/org/iotivity/base/OcResource.java @@ -34,6 +34,7 @@ import java.util.Map; * one or more resources. */ public class OcResource { + public static final String CREATED_URI_KEY = "createduri"; private OcResource(long nativeHandle) { this.mNativeHandle = nativeHandle; @@ -556,6 +557,19 @@ public class OcResource { * Event listeners are notified asynchronously */ public interface OnObserveListener { + /** + * To Register. + */ + public static final int REGISTER = 0; + /** + * To Deregister. + */ + public static final int DEREGISTER = 1; + /** + * Others. + */ + public static final int NO_OPTION = 2; + public void onObserveCompleted(List headerOptionList, OcRepresentation ocRepresentation, int sequenceNumber); diff --git a/android/android_api/base/src/main/java/org/iotivity/base/OcResourceIdentifier.java b/android/android_api/base/src/main/java/org/iotivity/base/OcResourceIdentifier.java index 6725b16..6fe698f 100644 --- a/android/android_api/base/src/main/java/org/iotivity/base/OcResourceIdentifier.java +++ b/android/android_api/base/src/main/java/org/iotivity/base/OcResourceIdentifier.java @@ -43,6 +43,13 @@ public class OcResourceIdentifier { return equalsN(other); } + @Override + public int hashCode() { + //return the same hash code for every object to force dictionary objects to use equals() in + //key comparisons, since IoTivity wants to treat OcResourceIdentifier as a blob + return 0; + } + private native boolean equalsN(OcResourceIdentifier other); private native void dispose(); diff --git a/android/examples/examples.iml b/android/examples/examples.iml index 8d49284..533d794 100755 --- a/android/examples/examples.iml +++ b/android/examples/examples.iml @@ -1,9 +1,10 @@ - + @@ -15,5 +16,4 @@ - - + \ No newline at end of file diff --git a/android/examples/simpleclient/build.gradle b/android/examples/simpleclient/build.gradle old mode 100755 new mode 100644 index 07cc15b..410756c --- a/android/examples/simpleclient/build.gradle +++ b/android/examples/simpleclient/build.gradle @@ -1,25 +1,24 @@ -apply plugin: 'com.android.application' - -android { - compileSdkVersion 21 - buildToolsVersion "21.1.2" - - defaultConfig { - applicationId "org.iotivity.base.examples.simpleclient" - minSdkVersion 19 - targetSdkVersion 21 - versionCode 1 - versionName "1.0" - } - buildTypes { - release { - minifyEnabled false - proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' - } - } -} - -dependencies { - compile project(':message') - compile 'com.android.support:appcompat-v7:21.0.3' -} +apply plugin: 'com.android.application' + +android { + compileSdkVersion 22 + buildToolsVersion "22.0.1" + + defaultConfig { + applicationId "org.iotivity.base.examples.simpleclient" + minSdkVersion 21 + targetSdkVersion 22 + versionCode 1 + versionName "1.0" + } + buildTypes { + release { + minifyEnabled false + proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' + } + } +} + +dependencies { + compile fileTree(dir: 'libs', include: ['*.jar']) +} diff --git a/android/examples/simpleclient/proguard-rules.pro b/android/examples/simpleclient/proguard-rules.pro new file mode 100644 index 0000000..d26150c --- /dev/null +++ b/android/examples/simpleclient/proguard-rules.pro @@ -0,0 +1,17 @@ +# Add project specific ProGuard rules here. +# By default, the flags in this file are appended to flags specified +# in /home/rahul/sdk/tools/proguard/proguard-android.txt +# You can edit the include path and order by changing the proguardFiles +# directive in build.gradle. +# +# For more details, see +# http://developer.android.com/guide/developing/tools/proguard.html + +# Add any project specific keep options here: + +# If your project uses WebView with JS, uncomment the following +# and specify the fully qualified class name to the JavaScript interface +# class: +#-keepclassmembers class fqcn.of.javascript.interface.for.webview { +# public *; +#} diff --git a/android/examples/simpleclient/simpleclient.iml b/android/examples/simpleclient/simpleclient.iml old mode 100755 new mode 100644 index 4ba5a36..2a0ba77 --- a/android/examples/simpleclient/simpleclient.iml +++ b/android/examples/simpleclient/simpleclient.iml @@ -1,95 +1,91 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/android/examples/simpleclient/src/main/AndroidManifest.xml b/android/examples/simpleclient/src/main/AndroidManifest.xml index 655870c..e696b3d 100644 --- a/android/examples/simpleclient/src/main/AndroidManifest.xml +++ b/android/examples/simpleclient/src/main/AndroidManifest.xml @@ -1,9 +1,7 @@ + package="org.iotivity.base.examples" > - @@ -17,10 +15,11 @@ diff --git a/android/examples/simpleclient/src/main/assets/oic_svr_db_client.json b/android/examples/simpleclient/src/main/assets/oic_svr_db_client.json old mode 100755 new mode 100644 diff --git a/android/examples/simpleclient/src/main/java/org/iotivity/base/examples/Light.java b/android/examples/simpleclient/src/main/java/org/iotivity/base/examples/Light.java new file mode 100644 index 0000000..651d6a5 --- /dev/null +++ b/android/examples/simpleclient/src/main/java/org/iotivity/base/examples/Light.java @@ -0,0 +1,92 @@ +/* + * //****************************************************************** + * // + * // 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 org.iotivity.base.OcException; +import org.iotivity.base.OcRepresentation; + +/** + * Light + *

+ * This class is used by SimpleClient to create an object representation of a remote light resource + * and update the values depending on the server response + */ +public class Light { + public static final String NAME_KEY = "name"; + public static final String STATE_KEY = "state"; + public static final String POWER_KEY = "power"; + + private String mName; + private boolean mState; + private int mPower; + + public Light() { + mName = ""; + mState = false; + mPower = 0; + } + + public void setOcRepresentation(OcRepresentation rep) throws OcException { + mName = rep.getValue(NAME_KEY); + mState = rep.getValue(Light.STATE_KEY); + mPower = rep.getValue(Light.POWER_KEY); + } + + public OcRepresentation getOcRepresentation() throws OcException { + OcRepresentation rep = new OcRepresentation(); + rep.setValue(NAME_KEY, mName); + rep.setValue(STATE_KEY, mState); + rep.setValue(POWER_KEY, mPower); + return rep; + } + + public String getName() { + return mName; + } + + public void setName(String name) { + this.mName = mName; + } + + public boolean getState() { + return mState; + } + + public void setState(boolean state) { + this.mState = state; + } + + public int getPower() { + return mPower; + } + + public void setPower(int power) { + this.mPower = power; + } + + @Override + public String toString() { + return "\t" + NAME_KEY + ": " + mName + + "\n\t" + STATE_KEY + ": " + mState + + "\n\t" + POWER_KEY + ": " + mPower; + } +} diff --git a/android/examples/simpleclient/src/main/java/org/iotivity/base/examples/SimpleClient.java b/android/examples/simpleclient/src/main/java/org/iotivity/base/examples/SimpleClient.java new file mode 100644 index 0000000..4d1bde3 --- /dev/null +++ b/android/examples/simpleclient/src/main/java/org/iotivity/base/examples/SimpleClient.java @@ -0,0 +1,614 @@ +/* + * //****************************************************************** + * // + * // Copyright 2015 Intel Corporation. + * // + * //-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= + * // + * // Licensed under the Apache License, Version 2.0 (the "License"); + * // you may not use this file except in compliance with the License. + * // You may obtain a copy of the License at + * // + * // http://www.apache.org/licenses/LICENSE-2.0 + * // + * // Unless required by applicable law or agreed to in writing, software + * // distributed under the License is distributed on an "AS IS" BASIS, + * // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * // See the License for the specific language governing permissions and + * // limitations under the License. + * // + * //-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= + */ +package org.iotivity.base.examples; + +import android.app.Activity; +import android.content.Context; +import android.os.Bundle; +import android.text.method.ScrollingMovementMethod; +import android.util.Log; +import android.view.View; +import android.widget.Button; +import android.widget.ScrollView; +import android.widget.TextView; + +import org.iotivity.base.ErrorCode; +import org.iotivity.base.ModeType; +import org.iotivity.base.ObserveType; +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.OcResourceIdentifier; +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.List; +import java.util.Map; + +/** + * SimpleClient + *

+ * SimpleClient is a sample client app which should be started after the simpleServer is started. + * It finds resources advertised by the server and calls different operations on it (GET, PUT, + * POST, DELETE and OBSERVE). + */ +public class SimpleClient extends Activity implements + OcPlatform.OnResourceFoundListener, + OcResource.OnGetListener, + OcResource.OnPutListener, + OcResource.OnPostListener, + OcResource.OnObserveListener { + + private Map mFoundResources = new HashMap<>(); + private OcResource mFoundLightResource = null; + //local representation of a server's light resource + private Light mLight = new Light(); + + /** + * A local method to configure and initialize platform, and then search for the light resources. + */ + private void startSimpleClient() { + Context context = this; + + PlatformConfig platformConfig = new PlatformConfig( + context, + ServiceType.IN_PROC, + ModeType.CLIENT, + "0.0.0.0", // By setting to "0.0.0.0", it binds to all available interfaces + 0, // Uses randomly available port + QualityOfService.LOW + ); + + msg("Configuring platform."); + OcPlatform.Configure(platformConfig); + + try { + msg("Finding all resources of type \"core.light\"."); + String requestUri = OcPlatform.WELL_KNOWN_QUERY + "?rt=core.light"; + OcPlatform.findResource("", + requestUri, + EnumSet.of(OcConnectivityType.CT_DEFAULT), + this + ); + sleep(1); + + /*Find resource is done twice so that we discover the original resources a second time. + These resources will have the same uniqueidentifier (yet be different objects), + so that we can verify/show the duplicate-checking code in foundResource(above); + */ + msg("Finding all resources of type \"core.light\" for the second time"); + OcPlatform.findResource("", + requestUri, + EnumSet.of(OcConnectivityType.CT_DEFAULT), + this + ); + + } catch (OcException e) { + Log.e(TAG, e.toString()); + msg("Failed to invoke find resource API"); + } + + printLine(); + } + + /** + * 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 == ocResource) { + msg("Found resource is invalid"); + return; + } + + if (mFoundResources.containsKey(ocResource.getUniqueIdentifier())) { + msg("Found a previously seen resource again!"); + } else { + msg("Found resource for the first time on server with ID: " + ocResource.getServerId()); + mFoundResources.put(ocResource.getUniqueIdentifier(), ocResource); + } + + if (null != mFoundLightResource) { + msg("Found another resource, ignoring"); + return; + } + // Get the resource URI + String resourceUri = ocResource.getUri(); + // Get the resource host address + String hostAddress = ocResource.getHost(); + msg("\tURI of the resource: " + resourceUri); + msg("\tHost address of the resource: " + hostAddress); + // Get the resource types + msg("\tList of resource types: "); + for (String resourceType : ocResource.getResourceTypes()) { + msg("\t\t" + resourceType); + } + msg("\tList of resource interfaces:"); + for (String resourceInterface : ocResource.getResourceInterfaces()) { + msg("\t\t" + resourceInterface); + } + msg("\tList of resource connectivity types:"); + for (OcConnectivityType connectivityType : ocResource.getConnectivityTypeSet()) { + msg("\t\t" + connectivityType); + } + printLine(); + + //In this example we are only interested in the light resources + if (resourceUri.equals("/a/light")) { + //Assign resource reference to a global variable to keep it from being + //destroyed by the GC when it is out of scope. + mFoundLightResource = ocResource; + + // Call a local method which will internally invoke "get" API on the foundLightResource + getLightResourceRepresentation(); + } + } + + /** + * Local method to get representation of a found light resource + */ + private void getLightResourceRepresentation() { + msg("Getting Light Representation..."); + + Map queryParams = new HashMap<>(); + try { + // Invoke resource's "get" API with a OcResource.OnGetListener event + // listener implementation + sleep(1); + mFoundLightResource.get(queryParams, this); + } catch (OcException e) { + Log.e(TAG, e.toString()); + msg("Error occurred while invoking \"get\" API"); + } + } + + /** + * An event handler to be executed whenever a "get" request completes successfully + * + * @param list list of the header options + * @param ocRepresentation representation of a resource + */ + @Override + public synchronized void onGetCompleted(List list, + OcRepresentation ocRepresentation) { + msg("GET request was successful"); + msg("Resource URI: " + ocRepresentation.getUri()); + + try { + //Read attribute values into local representation of a light + mLight.setOcRepresentation(ocRepresentation); + } catch (OcException e) { + Log.e(TAG, e.toString()); + msg("Failed to read the attributes of a light resource"); + } + msg("Light attributes: "); + msg(mLight.toString()); + printLine(); + + //Call a local method which will internally invoke put API on the foundLightResource + putLightRepresentation(); + } + + /** + * An event handler to be executed whenever a "get" request fails + * + * @param throwable exception + */ + @Override + public synchronized void onGetFailed(Throwable throwable) { + if (throwable instanceof OcException) { + OcException ocEx = (OcException) throwable; + Log.e(TAG, ocEx.toString()); + ErrorCode errCode = ocEx.getErrorCode(); + //do something based on errorCode + msg("Error code: " + errCode); + } + msg("Failed to get representation of a found light resource"); + } + + /** + * Local method to put a different state for this light resource + */ + private void putLightRepresentation() { + //set new values + mLight.setState(true); + mLight.setPower(15); + + msg("Putting light representation..."); + OcRepresentation representation = null; + try { + representation = mLight.getOcRepresentation(); + } catch (OcException e) { + Log.e(TAG, e.toString()); + msg("Failed to get OcRepresentation from a light"); + } + + Map queryParams = new HashMap<>(); + + try { + sleep(1); + // Invoke resource's "put" API with a new representation, query parameters and + // OcResource.OnPutListener event listener implementation + mFoundLightResource.put(representation, queryParams, this); + } catch (OcException e) { + Log.e(TAG, e.toString()); + msg("Error occurred while invoking \"put\" API"); + } + } + + /** + * An event handler to be executed whenever a "put" request completes successfully + * + * @param list list of the header options + * @param ocRepresentation representation of a resource + */ + @Override + public synchronized void onPutCompleted(List list, OcRepresentation ocRepresentation) { + msg("PUT request was successful"); + try { + mLight.setOcRepresentation(ocRepresentation); + } catch (OcException e) { + Log.e(TAG, e.toString()); + msg("Failed to create Light representation"); + } + msg("Light attributes: "); + msg(mLight.toString()); + printLine(); + + //Call a local method which will internally invoke post API on the foundLightResource + postLightRepresentation(); + } + + /** + * An event handler to be executed whenever a "put" request fails + * + * @param throwable exception + */ + @Override + public synchronized void onPutFailed(Throwable throwable) { + if (throwable instanceof OcException) { + OcException ocEx = (OcException) throwable; + Log.e(TAG, ocEx.toString()); + ErrorCode errCode = ocEx.getErrorCode(); + //do something based on errorCode + msg("Error code: " + errCode); + } + msg("Failed to \"put\" a new representation"); + } + + /** + * Local method to post a different state for this light resource + */ + private void postLightRepresentation() { + //set new values + mLight.setState(false); + mLight.setPower(105); + + msg("Posting light representation..."); + OcRepresentation representation = null; + try { + representation = mLight.getOcRepresentation(); + } catch (OcException e) { + Log.e(TAG, e.toString()); + msg("Failed to get OcRepresentation from a light"); + } + + Map queryParams = new HashMap<>(); + try { + sleep(1); + // Invoke resource's "post" API with a new representation, query parameters and + // OcResource.OnPostListener event listener implementation + mFoundLightResource.post(representation, queryParams, this); + } catch (OcException e) { + Log.e(TAG, e.toString()); + msg("Error occurred while invoking \"post\" API"); + } + } + + /** + * An event handler to be executed whenever a "post" request completes successfully + * + * @param list list of the header options + * @param ocRepresentation representation of a resource + */ + @Override + public synchronized void onPostCompleted(List list, + OcRepresentation ocRepresentation) { + msg("POST request was successful"); + try { + if (ocRepresentation.hasAttribute(OcResource.CREATED_URI_KEY)) { + msg("\tUri of the created resource: " + + ocRepresentation.getValue(OcResource.CREATED_URI_KEY)); + } else { + mLight.setOcRepresentation(ocRepresentation); + msg(mLight.toString()); + } + } catch (OcException e) { + Log.e(TAG, e.toString()); + } + + //setting new values + mLight.setState(true); + mLight.setPower(55); + msg("Posting again light representation..."); + OcRepresentation representation2 = null; + try { + representation2 = mLight.getOcRepresentation(); + } catch (OcException e) { + Log.e(TAG, e.toString()); + msg("Failed to get OcRepresentation from a light"); + } + + Map queryParams = new HashMap<>(); + try { + // Invoke resource's "post" API with a new representation, query parameters and + // OcResource.OnPostListener event listener implementation + mFoundLightResource.post(representation2, queryParams, onPostListener2); + } catch (OcException e) { + Log.e(TAG, e.toString()); + msg("Error occurred while invoking \"post\" API"); + } + } + + /** + * An event handler to be executed whenever a "post" request fails + * + * @param throwable exception + */ + @Override + public synchronized void onPostFailed(Throwable throwable) { + if (throwable instanceof OcException) { + OcException ocEx = (OcException) throwable; + Log.e(TAG, ocEx.toString()); + ErrorCode errCode = ocEx.getErrorCode(); + //do something based on errorCode + msg("Error code: " + errCode); + } + msg("Failed to \"post\" a new representation"); + } + + /** + * Declare and implement a second OcResource.OnPostListener + */ + OcResource.OnPostListener onPostListener2 = new OcResource.OnPostListener() { + /** + * An event handler to be executed whenever a "post" request completes successfully + * @param list list of the header options + * @param ocRepresentation representation of a resource + */ + @Override + public synchronized void onPostCompleted(List list, + OcRepresentation ocRepresentation) { + msg("Second POST request was successful"); + try { + if (ocRepresentation.hasAttribute(OcResource.CREATED_URI_KEY)) { + msg("\tUri of the created resource: " + + ocRepresentation.getValue(OcResource.CREATED_URI_KEY)); + } else { + mLight.setOcRepresentation(ocRepresentation); + msg(mLight.toString()); + } + } catch (OcException e) { + Log.e(TAG, e.toString()); + } + + //Call a local method which will internally invoke observe API on the foundLightResource + observeFoundLightResource(); + } + + /** + * An event handler to be executed whenever a "post" request fails + * + * @param throwable exception + */ + @Override + public synchronized void onPostFailed(Throwable throwable) { + if (throwable instanceof OcException) { + OcException ocEx = (OcException) throwable; + Log.e(TAG, ocEx.toString()); + ErrorCode errCode = ocEx.getErrorCode(); + //do something based on errorCode + msg("Error code: " + errCode); + } + msg("Failed to \"post\" a new representation"); + } + }; + + /** + * Local method to start observing this light resource + */ + private void observeFoundLightResource() { + try { + sleep(1); + // Invoke resource's "observe" API with a observe type, query parameters and + // OcResource.OnObserveListener event listener implementation + mFoundLightResource.observe(ObserveType.OBSERVE, new HashMap(), this); + } catch (OcException e) { + Log.e(TAG, e.toString()); + msg("Error occurred while invoking \"observe\" API"); + } + } + + // holds current number of observations + private static int mObserveCount = 0; + + /** + * An event handler to be executed whenever a "post" request completes successfully + * + * @param list list of the header options + * @param ocRepresentation representation of a resource + * @param sequenceNumber sequence number + */ + @Override + public synchronized void onObserveCompleted(List list, + OcRepresentation ocRepresentation, + int sequenceNumber) { + if (OcResource.OnObserveListener.REGISTER == sequenceNumber) { + msg("Observe registration action is successful:"); + } else if (OcResource.OnObserveListener.DEREGISTER == sequenceNumber) { + msg("Observe De-registration action is successful"); + } else if (OcResource.OnObserveListener.NO_OPTION == sequenceNumber) { + msg("Observe registration or de-registration action is failed"); + } + + msg("OBSERVE Result:"); + msg("\tSequenceNumber:" + sequenceNumber); + try { + mLight.setOcRepresentation(ocRepresentation); + } catch (OcException e) { + Log.e(TAG, e.toString()); + msg("Failed to get the attribute values"); + } + msg(mLight.toString()); + + if (++mObserveCount == 11) { + msg("Cancelling Observe..."); + try { + mFoundLightResource.cancelObserve(); + } catch (OcException e) { + Log.e(TAG, e.toString()); + msg("Error occurred while invoking \"cancelObserve\" API"); + } + msg("DONE"); + + //prepare for the next restart of the SimpleClient + resetGlobals(); + enableStartButton(); + } + } + + /** + * An event handler to be executed whenever a "observe" request fails + * + * @param throwable exception + */ + @Override + public synchronized void onObserveFailed(Throwable throwable) { + if (throwable instanceof OcException) { + OcException ocEx = (OcException) throwable; + Log.e(TAG, ocEx.toString()); + ErrorCode errCode = ocEx.getErrorCode(); + //do something based on errorCode + msg("Error code: " + errCode); + } + msg("Observation of the found light resource has failed"); + } + + //****************************************************************************** + // End of the OIC specific code + //****************************************************************************** + + private final static String TAG = SimpleClient.class.getSimpleName(); + private TextView mConsoleTextView; + private ScrollView mScrollView; + + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setContentView(R.layout.activity_simple_client); + + 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.setText("Re-start"); + button.setEnabled(false); + new Thread(new Runnable() { + public void run() { + startSimpleClient(); + } + }).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 enableStartButton() { + runOnUiThread(new Runnable() { + public void run() { + Button button = (Button) findViewById(R.id.button); + button.setEnabled(true); + } + }); + } + + private void sleep(int seconds) { + try { + Thread.sleep(seconds * 1000); + } catch (InterruptedException e) { + e.printStackTrace(); + Log.e(TAG, e.toString()); + } + } + + private void msg(final String text) { + runOnUiThread(new Runnable() { + public void run() { + mConsoleTextView.append("\n"); + mConsoleTextView.append(text); + mScrollView.fullScroll(View.FOCUS_DOWN); + } + }); + Log.i(TAG, text); + } + + private void printLine() { + msg("------------------------------------------------------------------------"); + } + + private synchronized void resetGlobals() { + mFoundLightResource = null; + mFoundResources.clear(); + mLight = new Light(); + mObserveCount = 0; + } +} diff --git a/android/examples/simpleclient/src/main/java/org/iotivity/base/examples/simpleclient/Light.java b/android/examples/simpleclient/src/main/java/org/iotivity/base/examples/simpleclient/Light.java deleted file mode 100644 index f09c39b..0000000 --- a/android/examples/simpleclient/src/main/java/org/iotivity/base/examples/simpleclient/Light.java +++ /dev/null @@ -1,65 +0,0 @@ -/* - * //****************************************************************** - * // - * // 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.simpleclient; - -/** - * Light - * - * This class is used by simpleclient to create an object and update the values depending on the server response - */ -public class Light { - private boolean mState; - private int mPower; - private String mName; - - // constructor - Light() { - mState = false; - mPower = 0; - mName = ""; - } - - // accessor methods - public boolean getState() { - return mState; - } - void setState(boolean state) { - mState = state; - } - int getPower() { - return mPower; - } - void setPower(int power) { - mPower = power; - } - String getName() { - return mName; - } - void setName(String name) { - mName = name; - } -} - - - - diff --git a/android/examples/simpleclient/src/main/java/org/iotivity/base/examples/simpleclient/SimpleClient.java b/android/examples/simpleclient/src/main/java/org/iotivity/base/examples/simpleclient/SimpleClient.java deleted file mode 100644 index d20794e..0000000 --- a/android/examples/simpleclient/src/main/java/org/iotivity/base/examples/simpleclient/SimpleClient.java +++ /dev/null @@ -1,515 +0,0 @@ -/* - * //****************************************************************** - * // - * // 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.simpleclient; - -import android.app.Activity; -import android.content.BroadcastReceiver; -import android.content.Context; -import android.content.Intent; -import android.content.SharedPreferences; -import android.content.res.AssetManager; -import android.os.Bundle; -import android.os.Message; -import android.preference.PreferenceManager; -import android.text.method.ScrollingMovementMethod; -import android.util.Log; -import android.widget.LinearLayout; -import android.widget.TextView; - -import org.iotivity.base.ErrorCode; -import org.iotivity.base.ModeType; -import org.iotivity.base.ObserveType; -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.io.File; -import java.io.FileNotFoundException; -import java.io.FileOutputStream; -import java.io.IOException; -import java.io.InputStream; -import java.io.OutputStream; -import java.util.EnumSet; -import java.util.HashMap; -import java.util.List; - -import base.iotivity.org.examples.message.IMessageLogger; - -/** - * SimpleClient - *

- * SimpleClient is a sample client app which should be started after the simpleServer is started. - * It finds resources advertised by the server and calls different operations on it (GET, PUT, - * POST and OBSERVE). - * This implements IMessageLogger to display messages on the screen - */ -public class SimpleClient extends Activity implements OcPlatform.OnResourceFoundListener, - IMessageLogger { - private static final String TAG = "SimpleClient: "; - - private static final int BUFFER_SIZE = 1024; - private String filePath = ""; - private Light myLight; - private OcResource curResource; - - //for display - private TextView mEventsTextView; - private static boolean printOnce = true; - - /** - * configure OIC platform and call findResource - */ - private void initOICStack() { - //create platform config - PlatformConfig cfg = new PlatformConfig( - this, - ServiceType.IN_PROC, - ModeType.CLIENT_SERVER, - "0.0.0.0", // bind to all available interfaces - 0, - QualityOfService.LOW, filePath + StringConstants.OIC_CLIENT_JSON_DB_FILE); - OcPlatform.Configure(cfg); - try { - /** - * find all resources - */ - OcPlatform.findResource("", OcPlatform.WELL_KNOWN_QUERY + "?rt=" + "core.light", - EnumSet.of(OcConnectivityType.CT_DEFAULT), this); - } catch (OcException e) { - logMessage(TAG + "findResource error: " + e.getMessage()); - Log.e(TAG, e.getMessage()); - } - } - - @Override - /** - * callback when a resource is found. This method calls doGetLightRepresentation to get the - * current values of myLight - */ - synchronized public void onResourceFound(OcResource ocResource) { - /** - * this may potentially be called by multiple threads at the same time - */ - synchronized (this) { - String resourceUri; - String hostAddress; - resourceUri = ocResource.getUri(); - hostAddress = ocResource.getHost(); - logMessage(TAG + "Discovered Resource\nUri: " + resourceUri + " \n Host: " + hostAddress); - // get the resource types - if (resourceUri.contains("light")) { - curResource = ocResource; - doGetLightRepresentation(); - } - } - } - - /** - * get myLight values after observe - */ - private void doObserveLightRepresentation() { - // eventhandler for observe() - OcResource.OnObserveListener onObserveListener = new OcResource.OnObserveListener() { - @Override - public void onObserveCompleted(List ocHeaderOptions, - OcRepresentation ocRepresentation, int seqNum) { - if (printOnce) { - logMessage(TAG + "OBSERVE request was successful"); - printOnce = false; - } - try { - boolean state = ocRepresentation.getValue(StringConstants.STATE); - int power = ocRepresentation.getValue(StringConstants.POWER); - String name = ocRepresentation.getValue(StringConstants.NAME); - myLight.setState(state); - myLight.setPower(power); - myLight.setName(name); - } catch (OcException e) { - Log.e(TAG, e.getMessage()); - } - logMessage(TAG + "onObserve: Power: " + myLight.getPower()); - if (seqNum > 20) { - try { - curResource.cancelObserve(); - logMessage(TAG + "Successfully cancelled observe"); - } catch (OcException e) { - logMessage(TAG + "cancelObserve error. " + e.getMessage()); - Log.e(TAG, e.getMessage()); - } - } - - } - - @Override - public void onObserveFailed(Throwable throwable) { - if (throwable instanceof OcException) { - OcException ocEx = (OcException) throwable; - ErrorCode errCode = ocEx.getErrorCode(); - //do something based on errorCode - } - Log.e(TAG, throwable.toString()); - } - }; - try { - curResource.observe(ObserveType.OBSERVE, new HashMap(), onObserveListener); - } catch (OcException e) { - logMessage(TAG + e.getMessage()); - Log.e(TAG, e.getMessage()); - } - } - - /** - * get the current value of myLight after POST and call doObserveLightRepresentation - * - * @param ocRepresentation needed to invoke post() - */ - private void doOnPost2(OcRepresentation ocRepresentation) { - // eventhandler for post() - OcResource.OnPostListener onPostListener2 = new OcResource.OnPostListener() { - @Override - public void onPostCompleted(List ocHeaderOptions, OcRepresentation rep) { - logMessage(TAG + "POST request was successful"); - String createdUri = rep.getUri(); - if (createdUri.equals(StringConstants.RESOURCE_URI1)) { - logMessage(TAG + "Uri of the created resource: " + createdUri); - } else { - try { - boolean state = rep.getValue(StringConstants.STATE); - int power = rep.getValue(StringConstants.POWER); - String name = rep.getValue(StringConstants.NAME); - myLight.setState(state); - myLight.setPower(power); - myLight.setName(name); - } catch (OcException e) { - Log.e(TAG, e.getMessage()); - } - logMessage(TAG + "onPost\nState: " + myLight.getState() + "\nPower: " + - myLight.getPower() + "\nName: " + myLight.getName()); - } - doObserveLightRepresentation(); - } - - @Override - public void onPostFailed(Throwable throwable) { - if (throwable instanceof OcException) { - OcException ocEx = (OcException) throwable; - ErrorCode errCode = ocEx.getErrorCode(); - //do something based on errorCode - } - Log.e(TAG, throwable.toString()); - } - }; - try { - curResource.post(ocRepresentation, new HashMap(), onPostListener2); - } catch (OcException e) { - logMessage(TAG + e.getMessage()); - Log.e(TAG, e.getMessage()); - } - } - - /** - * create a new resource and update its value. - */ - private void doPostLightRepresentation() { - // eventhandler for post() - OcResource.OnPostListener onPostListener = new OcResource.OnPostListener() { - @Override - public void onPostCompleted(List ocHeaderOptions, - OcRepresentation ocRepresentation) { - String createdUri = ""; - try { - createdUri = ocRepresentation.getValue(StringConstants.CREATED_URI); - } catch (OcException e) { - Log.e(TAG, e.getMessage()); - } - if (createdUri.equals(StringConstants.RESOURCE_URI1)) { - logMessage(TAG + "Uri of the created resource: " + createdUri); - } else { - boolean state = false; - try { - state = ocRepresentation.getValue(StringConstants.STATE); - int power = ocRepresentation.getValue(StringConstants.POWER); - String name = ocRepresentation.getValue(StringConstants.NAME); - myLight.setState(state); - myLight.setPower(power); - myLight.setName(name); - } catch (OcException e) { - Log.e(TAG, e.getMessage()); - } - } - OcRepresentation rep = new OcRepresentation(); - myLight.setState(true); - myLight.setPower(55); - try { - rep.setValue(StringConstants.POWER, myLight.getPower()); - rep.setValue(StringConstants.STATE, myLight.getState()); - } catch (OcException e) { - Log.e(TAG, e.getMessage()); - } - doOnPost2(rep); - } - - @Override - public void onPostFailed(Throwable throwable) { - if (throwable instanceof OcException) { - OcException ocEx = (OcException) throwable; - ErrorCode errCode = ocEx.getErrorCode(); - //do something based on errorCode - } - Log.e(TAG, throwable.toString()); - } - }; - - OcRepresentation rep = new OcRepresentation(); - myLight.setState(false); - myLight.setPower(105); - try { - rep.setValue(StringConstants.STATE, myLight.getState()); - rep.setValue(StringConstants.POWER, myLight.getPower()); - } catch (OcException e) { - Log.e(TAG, e.getMessage()); - } - try { - curResource.post(rep, new HashMap(), onPostListener); - } catch (OcException e) { - logMessage(TAG + e.getMessage()); - Log.e(TAG, e.getMessage()); - } - } - - /** - * modify the current value of myLight and call doPostLightRepresentation - */ - private void doPutLightRepresentation() { - // eventhandler for put() - OcResource.OnPutListener onPutListener = new OcResource.OnPutListener() { - @Override - public void onPutCompleted(List ocHeaderOptions, - OcRepresentation ocRepresentation) { - logMessage(TAG + "PUT resource was successful"); - try { - boolean state = ocRepresentation.getValue(StringConstants.STATE); - int power = ocRepresentation.getValue(StringConstants.POWER); - String name = ocRepresentation.getValue(StringConstants.NAME); - myLight.setState(state); - myLight.setPower(power); - myLight.setName(name); - } catch (OcException e) { - Log.e(TAG, e.getMessage()); - } - - logMessage(TAG + "onPutCompleted:\nState:" + myLight.getState() + "\nPower: " + - myLight.getPower() + "\nName: " + myLight.getName()); - doPostLightRepresentation(); - } - - @Override - public void onPutFailed(Throwable throwable) { - - if (throwable instanceof OcException) { - OcException ocEx = (OcException) throwable; - ErrorCode errCode = ocEx.getErrorCode(); - //do something based on errorCode - } - Log.e(TAG, throwable.toString()); - } - }; - - OcRepresentation rep = new OcRepresentation(); - Log.d(TAG, "myLight settings: power = 15"); - myLight.setState(true); - myLight.setPower(15); - try { - rep.setValue(StringConstants.STATE, myLight.getState()); - rep.setValue(StringConstants.POWER, myLight.getPower()); - rep.setValue(StringConstants.NAME, myLight.getName()); - } catch (OcException e) { - Log.e(TAG, e.getMessage()); - } - try { - Log.d(TAG, "before calling put"); - curResource.put(rep, new HashMap(), onPutListener); - } catch (OcException e) { - logMessage(TAG + e.getMessage()); - Log.e(TAG, e.getMessage()); - } - Log.d(TAG, "end of put call"); - } - - /** - * get the existing value of myLight and call doPutLightRepresentation() to modify the current values - */ - private void doGetLightRepresentation() { - // eventhandler for get() - OcResource.OnGetListener onGetListener = new OcResource.OnGetListener() { - @Override - public void onGetCompleted(List headerOptionList, - OcRepresentation ocRepresentation) { - logMessage(TAG + "GET resource was successful " + StringConstants.STATE); - try { - boolean state = ocRepresentation.getValue(StringConstants.STATE); - int power = ocRepresentation.getValue(StringConstants.POWER); - String name = ocRepresentation.getValue(StringConstants.NAME); - myLight.setState(state); - myLight.setPower(power); - myLight.setName(name); - } catch (OcException e) { - Log.e(TAG, e.getMessage()); - } - logMessage(TAG + "onGetCompleted\nState: " + myLight.getState() + "\nPower: " + - myLight.getPower() + "\nName: " + myLight.getName()); - doPutLightRepresentation(); - } - - @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()); - } - }; - - try { - curResource.get(new HashMap(), onGetListener); - } catch (OcException e) { - logMessage(TAG + e.getMessage()); - Log.e(TAG, e.getMessage()); - } - } - - /** - * to display on SimpleClient screen - */ - public class MessageReceiver extends BroadcastReceiver { - @Override - public void onReceive(Context context, Intent intent) { - final String message = intent.getStringExtra(StringConstants.MESSAGE); - logMessage(message); - } - } - - @Override - protected void onCreate(Bundle savedInstanceState) { - super.onCreate(savedInstanceState); - setContentView(R.layout.activity_main); - 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) - ); - myLight = new Light(); - filePath = getFilesDir().getPath() + "/"; // data/data//files/ - //copy json when application runs first time - SharedPreferences wmbPreference = PreferenceManager.getDefaultSharedPreferences(this); - boolean isFirstRun = wmbPreference.getBoolean("FIRSTRUN", true); - if (isFirstRun) { - copyJsonFromAsset(); - SharedPreferences.Editor editor = wmbPreference.edit(); - editor.putBoolean("FIRSTRUN", false); - editor.commit(); - } - - - initOICStack(); - } -/** - * Copy svr db json file from assets folder to app data files dir - */ - private void copyJsonFromAsset() { - AssetManager assetManager = getAssets(); - InputStream in = null; - OutputStream out = null; - try { - in = assetManager.open(StringConstants.OIC_CLIENT_JSON_DB_FILE); - File file = new File(filePath); - //check files directory exists - if (!(file.exists() && file.isDirectory())) { - file.mkdirs(); - } - out = new FileOutputStream(filePath + StringConstants.OIC_CLIENT_JSON_DB_FILE); - copyFile(in, out); - } catch (NullPointerException e) { - logMessage(TAG + "Null pointer exception " + e.getMessage()); - Log.e(TAG, e.getMessage()); - } catch (FileNotFoundException e) { - logMessage(TAG + "Json svr db file not found " + e.getMessage()); - Log.e(TAG, e.getMessage()); - } catch (IOException e) { - logMessage(TAG + StringConstants.OIC_CLIENT_JSON_DB_FILE+ " file copy failed"); - Log.e(TAG, e.getMessage()); - } finally { - if (in != null) { - try { - in.close(); - } catch (IOException e) { - Log.e(TAG, e.getMessage()); - } - } - if (out != null) { - try { - out.close(); - } catch (IOException e) { - Log.e(TAG, e.getMessage()); - } - } - } - } - - private void copyFile(InputStream in, OutputStream out) throws IOException { - byte[] buffer = new byte[BUFFER_SIZE]; - int read; - while ((read = in.read(buffer)) != -1) { - out.write(buffer, 0, read); - } - } - @Override - public void logMessage(String text) { - logMsg(text); - } - - public void logMsg(final String text) { - runOnUiThread(new Runnable() { - public void run() { - Message msg = new Message(); - msg.obj = text; - mEventsTextView.append("\n"); - mEventsTextView.append(text); - } - }); - Log.i(TAG, text); - //to print on SimpleServer screen - Intent intent = new Intent("org.iotivity.base.examples.simpleclient"); - intent.putExtra(StringConstants.MESSAGE, text); - sendBroadcast(intent); - } -} diff --git a/android/examples/simpleclient/src/main/java/org/iotivity/base/examples/simpleclient/StringConstants.java b/android/examples/simpleclient/src/main/java/org/iotivity/base/examples/simpleclient/StringConstants.java deleted file mode 100644 index e02837e..0000000 --- a/android/examples/simpleclient/src/main/java/org/iotivity/base/examples/simpleclient/StringConstants.java +++ /dev/null @@ -1,17 +0,0 @@ -package org.iotivity.base.examples.simpleclient; -/** - * StringConstant contains the simpleclient 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_URI0 = "/a/light"; - public static final String RESOURCE_URI1 = "/a/light2"; - public static final String OIC_CLIENT_JSON_DB_FILE = "oic_svr_db_client.json"; - public static final String CREATED_URI = "createduri"; - public static final String STATE = "state"; - public static final String NAME = "name"; - public static final String POWER = "power"; - public static final String MESSAGE = "message"; -} diff --git a/android/examples/simpleclient/src/main/res/drawable-hdpi/ic_launcher.png b/android/examples/simpleclient/src/main/res/drawable-hdpi/ic_launcher.png deleted file mode 100755 index 96a442e5b8e9394ccf50bab9988cb2316026245d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 9397 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 diff --git a/android/examples/simpleclient/src/main/res/drawable-xhdpi/ic_launcher.png b/android/examples/simpleclient/src/main/res/drawable-xhdpi/ic_launcher.png deleted file mode 100755 index 71c6d760f05183ef8a47c614d8d13380c8528499..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 14383 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 diff --git a/android/examples/simpleclient/src/main/res/drawable-xxhdpi/ic_launcher.png b/android/examples/simpleclient/src/main/res/drawable-xxhdpi/ic_launcher.png deleted file mode 100755 index 4df18946442ed763bd52cf3adca31617848656fa..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 19388 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 diff --git a/android/examples/simpleclient/src/main/res/drawable/iotivityicon.png b/android/examples/simpleclient/src/main/res/drawable/iotivityicon.png new file mode 100644 index 0000000000000000000000000000000000000000..e1e4aa71b5449b12e60072f3999fc75186d8946c GIT binary patch literal 2300 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 OpaH}C@9H;h$^QYPfGv3d literal 0 HcmV?d00001 diff --git a/android/examples/simpleclient/src/main/res/layout/activity_main.xml b/android/examples/simpleclient/src/main/res/layout/activity_main.xml deleted file mode 100644 index 9797443..0000000 --- a/android/examples/simpleclient/src/main/res/layout/activity_main.xml +++ /dev/null @@ -1,18 +0,0 @@ - - - - - - - diff --git a/android/examples/simpleclient/src/main/res/layout/activity_simple_client.xml b/android/examples/simpleclient/src/main/res/layout/activity_simple_client.xml new file mode 100644 index 0000000..aa667fe --- /dev/null +++ b/android/examples/simpleclient/src/main/res/layout/activity_simple_client.xml @@ -0,0 +1,40 @@ + +