[IOT-1740]Adding UnSubscribe functionality in Notification Consumer
authorabitha.s <abitha.s@samsung.com>
Wed, 11 Jan 2017 05:53:53 +0000 (11:23 +0530)
committerUze Choi <uzchoi@samsung.com>
Mon, 16 Jan 2017 01:52:39 +0000 (01:52 +0000)
1. Added Unsubscribe function in C++, JNI and Java APIs
2. Added sample application chages to test Unsubscribe function from C++ sample
3. Added return code for missng API to return the result of API

patch 4: removed return code from Java and JNI apis.(will add a separate commit with review comments incorporated

Change-Id: I478ccc25b999be8b1d40a9aaec49dc241f22f055
Signed-off-by: abitha.s <abitha.s@samsung.com>
Reviewed-on: https://gerrit.iotivity.org/gerrit/16305
Tested-by: jenkins-iotivity <jenkins-iotivity@opendaylight.org>
Reviewed-by: Chihyun Cho <ch79.cho@samsung.com>
Reviewed-by: Uze Choi <uzchoi@samsung.com>
17 files changed:
service/notification/android/notification-service/src/main/java/org/iotivity/service/ns/consumer/Provider.java
service/notification/android/notification-service/src/main/jni/consumer/JniNotificationConsumer.cpp
service/notification/android/notification-service/src/main/jni/consumer/JniNotificationConsumer.h
service/notification/cpp-wrapper/consumer/inc/NSConsumerService.h
service/notification/cpp-wrapper/consumer/inc/NSProvider.h
service/notification/cpp-wrapper/consumer/src/NSConsumerService.cpp
service/notification/cpp-wrapper/consumer/src/NSProvider.cpp
service/notification/cpp-wrapper/examples/linux/notificationserviceconsumer.cpp
service/notification/cpp-wrapper/examples/linux/notificationserviceprovider.cpp
service/notification/cpp-wrapper/provider/inc/NSConsumer.h
service/notification/cpp-wrapper/provider/inc/NSProviderService.h
service/notification/cpp-wrapper/provider/src/NSConsumer.cpp
service/notification/cpp-wrapper/provider/src/NSProviderService.cpp
service/notification/examples/android/NotiConsumerExample/app/src/androidTest/java/org/iotivity/service/ns/sample/consumer/ExampleUnitTest.java [changed mode: 0644->0755]
service/notification/examples/android/NotiConsumerExample/app/src/main/java/org/iotivity/service/ns/sample/consumer/ConsumerSample.java [changed mode: 0644->0755]
service/notification/examples/android/NotiConsumerExample/app/src/main/java/org/iotivity/service/ns/sample/consumer/MainActivity.java [changed mode: 0644->0755]
service/notification/examples/android/NotiConsumerExample/app/src/main/res/layout/activity_main.xml

index 6f2f058..c3823df 100755 (executable)
@@ -109,6 +109,14 @@ public class Provider {
     }
 
     /**
+     * API for for requesting unsubscription of Notification service
+     * @throws NSException failure to subscribe
+     */
+    public void unsubscribe() throws NSException {
+        nativeUnsubscribe();
+    }
+
+    /**
      * API for for requesting subscription status from Provider of Notification
      * service
      *
@@ -212,6 +220,7 @@ public class Provider {
     }
 
     private native void nativeSubscribe() throws NSException;
+    private native void nativeUnsubscribe() throws NSException;
 
     private native void nativeSendSyncInfo(long messageId, int syncType)
             throws NSException;
index 2eb79b3..bbee81d 100755 (executable)
@@ -1116,6 +1116,45 @@ JNIEXPORT void JNICALL Java_org_iotivity_service_ns_consumer_Provider_nativeSubs
     return;\r
 }\r
 \r
+JNIEXPORT void JNICALL Java_org_iotivity_service_ns_consumer_Provider_nativeUnsubscribe\r
+(JNIEnv *env, jobject jObj)\r
+{\r
+    LOGD ("Provider_UnSubscribe -IN");\r
+    jclass providerClass = env->GetObjectClass(jObj);\r
+    if (!providerClass)\r
+    {\r
+        ThrowNSException(NS_ERROR, "Failed to Get ObjectClass for Provider");\r
+        return ;\r
+    }\r
+\r
+    jfieldID nativeHandle = env->GetFieldID(providerClass, "mNativeHandle", "J");\r
+    if (!nativeHandle)\r
+    {\r
+        ThrowNSException(NS_ERROR, "Failed to get nativeHandle for Provider");\r
+        return ;\r
+    }\r
+    jlong jProvider = env->GetLongField(jObj, nativeHandle);\r
+    if (jProvider)\r
+    {\r
+        LOGD ("calling subscribe on mNativeHandle");\r
+        OIC::Service::NSProvider *provider = (OIC::Service::NSProvider *) (jProvider);\r
+        provider->unsubscribe();\r
+    }\r
+    else\r
+    {\r
+        OIC::Service::NSProvider *provider = getNativeProvider(env, jObj);\r
+        if (provider == nullptr)\r
+        {\r
+            ThrowNSException(NS_ERROR, "Provider with Given Id doesn't exist");\r
+            return;\r
+        }\r
+        LOGD ("calling subscribe on ProviderID");\r
+        provider->unsubscribe();\r
+    }\r
+    LOGD ("Provider_UnSubscribe -OUT");\r
+    return;\r
+}\r
+\r
 JNIEXPORT void JNICALL Java_org_iotivity_service_ns_consumer_Provider_nativeSendSyncInfo\r
 (JNIEnv *env, jobject jObj, jlong jMessageId, jint jSyncType)\r
 {\r
index 020589e..bd24deb 100755 (executable)
@@ -78,6 +78,15 @@ JNIEXPORT void JNICALL Java_org_iotivity_service_ns_consumer_ConsumerService_nat
 JNIEXPORT void JNICALL Java_org_iotivity_service_ns_consumer_Provider_nativeSubscribe\r
 (JNIEnv *, jobject);\r
 \r
+\r
+/*\r
+ * Class:     org_iotivity_service_ns_consumer_Provider\r
+ * Method:    nativeUnsubscribe\r
+ * Signature: ()V\r
+ */\r
+JNIEXPORT void JNICALL Java_org_iotivity_service_ns_consumer_Provider_nativeUnsubscribe\r
+(JNIEnv *, jobject);\r
+\r
 /*\r
  * Class:     org_iotivity_service_ns_consumer_Provider\r
  * Method:    nativeSendSyncInfo\r
index dd054d8..8aa8c54 100755 (executable)
@@ -62,13 +62,15 @@ namespace OIC
                 /**\r
                       * Initialize notification service for consumer\r
                       * @param providerDiscovered Callback function pointers to ProviderDiscoveredCallback,\r
+                      * @return ::NS_OK or result code of NSResult\r
                       */\r
-                void start(ProviderDiscoveredCallback providerDiscovered);\r
+                NSResult start(ProviderDiscoveredCallback providerDiscovered);\r
 \r
                 /**\r
                       * Terminate notification service for consumer\r
+                      * @return ::NS_OK or result code of NSResult\r
                       */\r
-                void stop();\r
+                NSResult stop();\r
 \r
                 /**\r
                      * Request to discover to remote address as parameter.\r
@@ -87,8 +89,9 @@ namespace OIC
 \r
                 /**\r
                       * Request discovery manually\r
+                      * @return ::NS_OK or result code of NSResult\r
                       */\r
-                void rescanProvider();\r
+                NSResult rescanProvider();\r
 \r
                 /**\r
                       *  get the callback for ProviderDiscovered\r
index bdbd678..97c319e 100755 (executable)
@@ -165,9 +165,15 @@ namespace OIC
 \r
                 /**\r
                       * This method is for requesting subscription of Notification service.\r
-                      *\r
+                      * @return ::NS_OK or result code of NSResult\r
                       */\r
-                void subscribe();\r
+                NSResult subscribe();\r
+\r
+                /**\r
+                      * Request to unsubscribe in order not to receive notification message from provider\r
+                      * @return ::NS_OK or result code of NSResult\r
+                     */\r
+                NSResult unsubscribe();\r
 \r
                 /**\r
                       * This method is for requesting subscription status from Provider of Notification service.\r
@@ -180,8 +186,9 @@ namespace OIC
                       *\r
                       * @param messageId - id of type message.\r
                       * @param type - NSSyncType of Notification service.\r
+                      * @return ::NS_OK or result code of NSResult\r
                       */\r
-                void sendSyncInfo(uint64_t messageId, NSSyncInfo::NSSyncType type);\r
+                NSResult sendSyncInfo(uint64_t messageId, NSSyncInfo::NSSyncType type);\r
 \r
                 /**\r
                       * This method is for registering for listeners of Notification .\r
index 48a1e76..fb46e45 100755 (executable)
@@ -143,6 +143,7 @@ namespace OIC
                         NS_LOG(DEBUG, "initiating the callback for Response : NS_STOPPED");\r
                         changeCallback((NSProviderState)state);\r
                     }\r
+                    delete oldProvider;\r
                 }\r
             }\r
             NS_LOG(DEBUG, "onNSProviderStateChanged - OUT");\r
@@ -159,6 +160,7 @@ namespace OIC
                      NSConsumerService::getInstance()->getAcceptedProviders().size());\r
             for (auto it : NSConsumerService::getInstance()->getAcceptedProviders())\r
             {\r
+                NS_LOG_V(DEBUG, "it->getProviderId : %s", it->getProviderId().c_str());\r
                 if (it->getProviderId() == nsMessage->getProviderId())\r
                 {\r
                     NS_LOG(DEBUG, "Found Provider with given ID");\r
@@ -178,9 +180,13 @@ namespace OIC
         void onNSSyncInfoReceived(::NSSyncInfo *syncInfo)\r
         {\r
             NS_LOG(DEBUG, "onNSSyncInfoReceived - IN");\r
+            NS_LOG_V(DEBUG, "syncInfo->providerId : %s", syncInfo->providerId);\r
+\r
             NSSyncInfo *nsSyncInfo = new NSSyncInfo(syncInfo);\r
+\r
             for (auto it : NSConsumerService::getInstance()->getAcceptedProviders())\r
             {\r
+                NS_LOG_V(DEBUG, "it->getProviderId : %s", it->getProviderId().c_str());\r
                 if (it->getProviderId() == nsSyncInfo->getProviderId())\r
                 {\r
                     NS_LOG(DEBUG, "Found Provider with given ID");\r
@@ -217,31 +223,39 @@ namespace OIC
             return &s_instance;\r
         }\r
 \r
-        void NSConsumerService::start(NSConsumerService::ProviderDiscoveredCallback providerDiscovered)\r
+        NSResult NSConsumerService::start(NSConsumerService::ProviderDiscoveredCallback providerDiscovered)\r
         {\r
             NS_LOG(DEBUG, "start - IN");\r
+            for (auto it : getAcceptedProviders())\r
+            {\r
+                delete it;\r
+            }\r
+            getAcceptedProviders().clear();\r
+\r
             m_providerDiscoveredCb = providerDiscovered;\r
             NSConsumerConfig nsConfig;\r
             nsConfig.changedCb = onProviderStateReceived;\r
             nsConfig.messageCb = onNSMessageReceived;\r
             nsConfig.syncInfoCb = onNSSyncInfoReceived;\r
 \r
-            NSStartConsumer(nsConfig);\r
+            NSResult result = (NSResult) NSStartConsumer(nsConfig);\r
             NS_LOG(DEBUG, "start - OUT");\r
-            return;\r
+            return result;\r
         }\r
 \r
-        void NSConsumerService::stop()\r
+        NSResult NSConsumerService::stop()\r
         {\r
             NS_LOG(DEBUG, "stop - IN");\r
-            NSStopConsumer();\r
+            m_providerDiscoveredCb = NULL;\r
             for (auto it : getAcceptedProviders())\r
             {\r
                 delete it;\r
             }\r
             getAcceptedProviders().clear();\r
+\r
+            NSResult result = (NSResult) NSStopConsumer();\r
             NS_LOG(DEBUG, "stop - OUT");\r
-            return;\r
+            return result;\r
         }\r
 \r
         NSResult NSConsumerService::enableRemoteService(const std::string &serverAddress)\r
@@ -277,12 +291,12 @@ namespace OIC
             return result;\r
         }\r
 \r
-        void NSConsumerService::rescanProvider()\r
+        NSResult NSConsumerService::rescanProvider()\r
         {\r
             NS_LOG(DEBUG, "rescanProvider - IN");\r
-            NSRescanProvider();\r
+            NSResult result = (NSResult) NSRescanProvider();\r
             NS_LOG(DEBUG, "rescanProvider - OUT");\r
-            return;\r
+            return result;\r
         }\r
 \r
         NSConsumerService::ProviderDiscoveredCallback NSConsumerService::getProviderDiscoveredCb()\r
@@ -292,8 +306,11 @@ namespace OIC
 \r
         NSProvider *NSConsumerService::getProvider(const std::string &id)\r
         {\r
+            NS_LOG_V(DEBUG, "getAcceptedProviders size  : %d", (int) getAcceptedProviders().size());\r
             for (auto it : getAcceptedProviders())\r
             {\r
+                NS_LOG_V(DEBUG, "getProvider  stored providerId : %s", it->getProviderId().c_str());\r
+                NS_LOG_V(DEBUG, "getProvider  requesting providerId : %s", id.c_str());\r
                 if (it->getProviderId() == id)\r
                 {\r
                     NS_LOG(DEBUG, "getProvider : Found Provider with given ID");\r
index 0c5588a..8ba14a0 100755 (executable)
@@ -194,11 +194,20 @@ namespace OIC
             return m_subscribedState;\r
         }\r
 \r
-        void NSProvider::subscribe()\r
+        NSResult NSProvider::subscribe()\r
         {\r
             NS_LOG(DEBUG, "Subscribe - IN");\r
-            NSSubscribe(getProviderId().c_str());\r
+            NSResult result = (NSResult) NSSubscribe(getProviderId().c_str());\r
             NS_LOG(DEBUG, "Subscribe - OUT");\r
+            return result;\r
+        }\r
+\r
+        NSResult NSProvider::unsubscribe()\r
+        {\r
+            NS_LOG(DEBUG, "unsubscribe - IN");\r
+            NSResult result = (NSResult) NSUnsubscribe(getProviderId().c_str());\r
+            NS_LOG(DEBUG, "unsubscribe - OUT");\r
+            return result;\r
         }\r
 \r
         bool NSProvider::isSubscribed()\r
@@ -212,12 +221,13 @@ namespace OIC
             return false;\r
         }\r
 \r
-        void NSProvider::sendSyncInfo(uint64_t messageId, NSSyncInfo::NSSyncType type)\r
+        NSResult NSProvider::sendSyncInfo(uint64_t messageId, NSSyncInfo::NSSyncType type)\r
         {\r
             NS_LOG(DEBUG, "SendSyncInfo - IN");\r
-            NSConsumerSendSyncInfo(m_providerId.c_str(), messageId, (::NSSyncType)type);\r
+            NSResult result = (NSResult) NSConsumerSendSyncInfo(m_providerId.c_str(), messageId,\r
+                              (::NSSyncType)type);\r
             NS_LOG(DEBUG, "SendSyncInfo - OUT");\r
-            return;\r
+            return result;\r
         }\r
 \r
         void NSProvider::setListener(NSProvider::ProviderStateCallback stateHandle,\r
index f7c027c..cdf20f3 100755 (executable)
@@ -185,10 +185,13 @@ int main(void)
         std::cout << "3. SendSyncInfo" << std::endl;\r
         std::cout << "4. GetTopicList" << std::endl;\r
         std::cout << "5. UpdateTopicList" << std::endl;\r
+        std::cout << "6. Subscribe provider" << std::endl;\r
+        std::cout << "7. UnSubscribe provider" << std::endl;\r
+        std::cout << "8. Rescan provider" << std::endl;\r
 #ifdef WITH_CLOUD\r
-        std::cout << "6. Enable  NS Consumer RemoteService" << std::endl;\r
+        std::cout << "9. Enable  NS Consumer RemoteService" << std::endl;\r
 #endif\r
-        std::cout << "7. Exit" << std::endl;\r
+        std::cout << "10. Exit" << std::endl;\r
 \r
         std::cout << "Input: " << std::endl;\r
         std::cin >> num;\r
@@ -235,8 +238,8 @@ int main(void)
                                     provider->sendSyncInfo(mainMessageId,\r
                                                            OIC::Service::NSSyncInfo::NSSyncType::NS_SYNC_READ);\r
                                 }\r
+                                break;\r
                             }\r
-                            break;\r
                         case 2:\r
                             {\r
                                 std::cout << "Sending Delete Sync" << std::endl;\r
@@ -247,8 +250,8 @@ int main(void)
                                     provider->sendSyncInfo(mainMessageId,\r
                                                            OIC::Service::NSSyncInfo::NSSyncType::NS_SYNC_DELETED);\r
                                 }\r
+                                break;\r
                             }\r
-                            break;\r
                         default:\r
                             {\r
                                 cout << "Invalid Input!. sending default Read Sync";\r
@@ -282,8 +285,8 @@ int main(void)
                             }\r
                         }\r
                     }\r
+                    break;\r
                 }\r
-                break;\r
             case 5:\r
                 {\r
                     std::cout <<  "UpdateTopicList" << std::endl;\r
@@ -299,11 +302,56 @@ int main(void)
                         delete topicList;\r
                         delete provider;\r
                     }\r
+                    break;\r
                 }\r
-                break;\r
-#ifdef WITH_CLOUD\r
             case 6:\r
                 {\r
+                    std::cout << "Subscribe provider" << std::endl;\r
+                    if (!mainProvider.empty())\r
+                    {\r
+                        OIC::Service::NSProvider *provider =\r
+                            NSConsumerService::getInstance()->getProvider(mainProvider);\r
+                        if (provider != nullptr )\r
+                        {\r
+                            std::cout << "calling Subscribe on discovered mainProvider" << std::endl;\r
+                            if (!provider->isSubscribed())\r
+                            {\r
+                                std::cout << "start Subscribing" << std::endl;\r
+                                provider->subscribe();\r
+                            }\r
+                        }\r
+                    }\r
+                    break;\r
+                }\r
+            case 7:\r
+                {\r
+                    std::cout << "UnSubscribe provider" << std::endl;\r
+                    if (!mainProvider.empty())\r
+                    {\r
+                        OIC::Service::NSProvider *provider =\r
+                            NSConsumerService::getInstance()->getProvider(mainProvider);\r
+                        if (provider != nullptr )\r
+                        {\r
+                            std::cout << "calling UnSubscribe on discovered mainProvider" << std::endl;\r
+                            if (provider->isSubscribed())\r
+                            {\r
+                                std::cout << "start UnSubscribing" << std::endl;\r
+                                provider->unsubscribe();\r
+                            }\r
+                        }\r
+                    }\r
+                    break;\r
+                }\r
+            case 8:\r
+                {\r
+                    std::cout << "Rescan Provider" << std::endl;\r
+                    NSConsumerService::getInstance()->rescanProvider();\r
+                    break;\r
+                }\r
+\r
+#ifdef WITH_CLOUD\r
+            case 9:\r
+                {\r
                     std::cout << "Enable NS Consumer RemoteService" << std::endl;\r
                     std::cout << "Input the Server Address :";\r
                     std::cin >> REMOTE_SERVER_ADDRESS;\r
@@ -311,7 +359,7 @@ int main(void)
                     break;\r
                 }\r
 #endif\r
-            case 7:\r
+            case 10:\r
                 {\r
                     std::cout << "Exit" << std::endl;\r
                     NSConsumerService::getInstance()->stop();\r
index f233073..c1343ca 100755 (executable)
@@ -280,15 +280,15 @@ int main()
                                 std::cout << "Sending Read Sync" << std::endl;\r
                                 NSProviderService::getInstance()->sendSyncInfo(mainMessageId,\r
                                         OIC::Service::NSSyncInfo::NSSyncType::NS_SYNC_READ);\r
+                                break;\r
                             }\r
-                            break;\r
                         case 2:\r
                             {\r
                                 std::cout << "Sending Delete Sync" << std::endl;\r
                                 NSProviderService::getInstance()->sendSyncInfo(mainMessageId,\r
                                         OIC::Service::NSSyncInfo::NSSyncType::NS_SYNC_DELETED);\r
+                                break;\r
                             }\r
-                            break;\r
                         default:\r
                             {\r
                                 cout << "Invalid Input!. sending default Read Sync";\r
@@ -361,8 +361,8 @@ int main()
                         }\r
                         std::cout <<  "GetConsumerTopicList completed" << std::endl;\r
                     }\r
+                    break;\r
                 }\r
-                break;\r
 \r
             case 12:\r
                 {\r
@@ -375,8 +375,8 @@ int main()
                         std::cout << (int) it->getState() << std::endl;\r
                     }\r
                     delete nsTopics;\r
+                    break;\r
                 }\r
-                break;\r
 #ifdef WITH_CLOUD\r
             case 13:\r
                 {\r
index 203ab9e..6f191ba 100755 (executable)
@@ -82,8 +82,9 @@ namespace OIC
                       * This method is for setting icon image for the Notification service media contents.\r
                       * This function is valid only when subControllability is set true.\r
                       * @param accepted - as bool.\r
+                      * @return :: OK or result code of NSResult\r
                       */\r
-                int acceptSubscription(bool accepted);\r
+                NSResult acceptSubscription(bool accepted);\r
 \r
                 /**\r
                      * Select a topic name for a consumer\r
index da2a890..9826dd8 100755 (executable)
@@ -137,8 +137,9 @@ namespace OIC
                       * Send read-check to provider in order to synchronize notification status with other consumers\r
                       * @param[in]  messageId  ID of Notification message to synchronize the status\r
                       * @param[in]  type  NotificationSyncType of the SyncInfo message\r
+                      * @return :: OK or result code of NSResult\r
                       */\r
-                void sendSyncInfo(uint64_t messageId, NSSyncInfo::NSSyncType type);\r
+                NSResult sendSyncInfo(uint64_t messageId, NSSyncInfo::NSSyncType type);\r
 \r
                 /**\r
                      * Initialize NSMessage class, This function is valid only when subControllability is set true.\r
index a81f875..d4c4f3d 100755 (executable)
@@ -49,12 +49,12 @@ namespace OIC
             return m_consumerId;\r
         }\r
 \r
-        int NSConsumer::acceptSubscription(bool accepted)\r
+        NSResult NSConsumer::acceptSubscription(bool accepted)\r
         {\r
             NS_LOG(DEBUG, "acceptSubscription - IN");\r
             NSResult result = (NSResult) NSAcceptSubscription(getConsumerId().c_str(), accepted);\r
             NS_LOG(DEBUG, "acceptSubscription - OUT");\r
-            return (int) result;\r
+            return result;\r
         }\r
 \r
         NSResult NSConsumer::setTopic(const std::string &topicName)\r
index 8c79360..1ddf099 100755 (executable)
@@ -89,6 +89,8 @@ namespace OIC
 \r
         NSProviderService::~NSProviderService()\r
         {\r
+            m_config.m_subscribeRequestCb = NULL;\r
+            m_config.m_syncInfoCb = NULL;\r
             for (auto it : getAcceptedConsumers())\r
             {\r
                 delete it;\r
@@ -106,6 +108,12 @@ namespace OIC
         {\r
             NS_LOG(DEBUG, "start - IN");\r
 \r
+            for (auto it : getAcceptedConsumers())\r
+            {\r
+                delete it;\r
+            }\r
+            getAcceptedConsumers().clear();\r
+\r
             m_config = config;\r
             NSProviderConfig nsConfig;\r
             nsConfig.subRequestCallback = onConsumerSubscribedCallback;\r
@@ -123,6 +131,15 @@ namespace OIC
         NSResult NSProviderService::stop()\r
         {\r
             NS_LOG(DEBUG, "stop - IN");\r
+\r
+            m_config.m_subscribeRequestCb = NULL;\r
+            m_config.m_syncInfoCb = NULL;\r
+            for (auto it : getAcceptedConsumers())\r
+            {\r
+                delete it;\r
+            }\r
+            getAcceptedConsumers().clear();\r
+\r
             NSResult result = (NSResult) NSStopProvider();\r
             NS_LOG(DEBUG, "stop - OUT");\r
             return result;\r
@@ -210,13 +227,13 @@ namespace OIC
             return result;\r
         }\r
 \r
-        void NSProviderService::sendSyncInfo(uint64_t messageId,\r
-                                             NSSyncInfo::NSSyncType type)\r
+        NSResult NSProviderService::sendSyncInfo(uint64_t messageId,\r
+                NSSyncInfo::NSSyncType type)\r
         {\r
             NS_LOG(DEBUG, "sendSyncInfo - IN");\r
-            NSProviderSendSyncInfo(messageId, (NSSyncType)type);\r
+            NSResult result = (NSResult) NSProviderSendSyncInfo(messageId, (NSSyncType)type);\r
             NS_LOG(DEBUG, "sendSyncInfo - OUT");\r
-            return;\r
+            return result;\r
         }\r
 \r
         NSMessage *NSProviderService::createMessage()\r
@@ -267,8 +284,11 @@ namespace OIC
 \r
         NSConsumer *NSProviderService::getConsumer(const std::string &id)\r
         {\r
+            NS_LOG_V(DEBUG, "getAcceptedConsumers size  : %d", (int) getAcceptedConsumers().size());\r
             for (auto it : getAcceptedConsumers())\r
             {\r
+                NS_LOG_V(DEBUG, "getConsumer  stored consumerId : %s", it->getConsumerId().c_str());\r
+                NS_LOG_V(DEBUG, "getConsumer  requesting consumerId : %s", id.c_str());\r
                 if (it->getConsumerId() == id)\r
                 {\r
                     NS_LOG(DEBUG, "getConsumer : Found Consumer with given ID");\r
old mode 100644 (file)
new mode 100755 (executable)
index a5b0d68..992c8c5
@@ -115,6 +115,23 @@ public class ExampleUnitTest extends ApplicationTestCase<Application> {
             e.printStackTrace();
         }
     }
+    public void unsubscribe() {
+        lockObject = new CountDownLatch(1);
+        response = new Response();
+        provCb.set(lockObject, response);
+        provCb.setState(Provider.ProviderState.STOPPED);
+        Provider mProvider = disCb.getProvider();
+        setListener(mProvider);
+        try {
+            if (mProvider.isSubscribed()) {
+                Log.i(TAG, "subscribed");
+                mProvider.unsubscribe();
+            }
+            lockObject.await(4000, TimeUnit.MILLISECONDS);
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+    }
 
     public long sendMessage() {
         lockObject = new CountDownLatch(1);
@@ -237,6 +254,7 @@ public class ExampleUnitTest extends ApplicationTestCase<Application> {
         } catch (Exception e) {
             e.printStackTrace();
         }
+        assertEquals(true, response.get());
     }
 
     @Test
@@ -248,7 +266,17 @@ public class ExampleUnitTest extends ApplicationTestCase<Application> {
         subscribe(state);
         assertEquals(true, response.get());
     }
+    @Test
+    public void ExpectUnSubscribeSuccess() {
+        startAfter(false);
+        assertEquals(true, response.get());
 
+        Provider.ProviderState state = Provider.ProviderState.ALLOW;
+        subscribe(state);
+        assertEquals(true, response.get());
+        unsubscribe();
+        assertEquals(true, response.get());
+    }
     @Test
     public void ExpectReceiveNotification() {
         startAfter(false);
old mode 100644 (file)
new mode 100755 (executable)
index 6e15108..bd21e4b
@@ -134,6 +134,23 @@ public class ConsumerSample
         }
     }
 
+    public void subscribe() {
+        try {
+            mProvider.subscribe();
+            Log.i(TAG, "Notification consumer subscribe: " );
+        } catch (Exception e) {
+            Log.e(TAG, "Exception: subscribe : " + e);
+        }
+    }
+
+    public void unsubscribe() {
+        try {
+            mProvider.unsubscribe();
+            Log.i(TAG, "Notification consumer unsubscribe: ");
+        } catch (Exception e) {
+            Log.e(TAG, "Exception: unsubscribe : " + e);
+        }
+    }
     public void getTopicsList() {
         if (mProvider != null) {
             try {
old mode 100644 (file)
new mode 100755 (executable)
index b0f2230..6a0b960
@@ -65,6 +65,8 @@ public class MainActivity extends Activity
     private Button              btnStart;
     private Button              btnStop;
     private Button              btnRescan;
+    private Button              btnSubscribe;
+    private Button              btnUnsubscribe;
     private Button              btnEnableRemoteService;
     private Button              btnGetTopicList;
     private Button              btnUpdateTopicList;
@@ -152,6 +154,8 @@ public class MainActivity extends Activity
         btnStart = (Button) findViewById(R.id.BtnStart);
         btnStop = (Button) findViewById(R.id.BtnStop);
         btnRescan = (Button) findViewById(R.id.BtnRescan);
+        btnSubscribe = (Button) findViewById(R.id.BtnSubscribe);
+        btnUnsubscribe = (Button) findViewById(R.id.BtnUnsubscribe);
         btnEnableRemoteService = (Button) findViewById(
                 R.id.BtnEnableRemoteService);
         btnGetTopicList = (Button) findViewById(R.id.BtnGetTopicList);
@@ -176,6 +180,8 @@ public class MainActivity extends Activity
         signOut.setEnabled(false);
         btnEnableRemoteService.setEnabled(false);
 
+        btnSubscribe.setOnClickListener(mClickListener);
+        btnUnsubscribe.setOnClickListener(mClickListener);
         signUp.setOnClickListener(mClickListener);
         signIn.setOnClickListener(mClickListener);
         signOut.setOnClickListener(mClickListener);
@@ -232,6 +238,28 @@ public class MainActivity extends Activity
                     mConsumerSample.rescanProvider();
                 }
                     break;
+                case R.id.BtnSubscribe: {
+                    if (!isStarted) {
+                        Log.e(TAG,
+                                "Fail to Subscribe. Service has not been started");
+                        showToast("Error : Service has not been started");
+                        break;
+                    }
+                    TvLog.append("Subscribe NS-Consumer\n");
+                    mConsumerSample.subscribe();
+                }
+                break;
+                case R.id.BtnUnsubscribe: {
+                    if (!isStarted) {
+                        Log.e(TAG,
+                                "Fail to Unsubscribe. Service has not been started");
+                        showToast("Error : Service has not been started");
+                        break;
+                    }
+                    TvLog.append("Unsubscribe NS-Consumer\n");
+                    mConsumerSample.unsubscribe();
+                }
+                break;
                 case R.id.BtnEnableRemoteService: {
                     if (!isStarted) {
                         Log.e(TAG,
index cdede23..bea595b 100755 (executable)
 \r
             <Button\r
                 android:layout_height="wrap_content"\r
+                android:layout_width="150dp"\r
+                android:id="@+id/BtnSubscribe"\r
+                android:text="Subscribe"/>\r
+            <Button\r
+                android:layout_height="wrap_content"\r
+                android:layout_width="150dp"\r
+                android:id="@+id/BtnUnsubscribe"\r
+                android:text="Unsubscribe" />\r
+        </LinearLayout>\r
+        <LinearLayout\r
+            android:layout_width="match_parent"\r
+            android:layout_height="wrap_content"\r
+            android:paddingLeft="5dp"\r
+            android:paddingRight="5dp"\r
+            android:orientation="horizontal"\r
+            android:weightSum="1">\r
+\r
+            <Button\r
+                android:layout_height="wrap_content"\r
                 android:layout_width="100dp"\r
                 android:id="@+id/signup"\r
                 android:text="Sign Up"/>\r