Add user activity publishers 31/141131/1
authorMu-Woong Lee <muwoong.lee@samsung.com>
Fri, 28 Jul 2017 07:52:09 +0000 (16:52 +0900)
committerMu-Woong Lee <muwoong.lee@samsung.com>
Fri, 28 Jul 2017 07:52:09 +0000 (16:52 +0900)
Change-Id: I194f221f0b4f82d3728d0eeff4f68516472e1cee
Signed-off-by: Mu-Woong Lee <muwoong.lee@samsung.com>
include/job_scheduler_types_internal.h
packaging/context-job-scheduler.spec
src/server/CMakeLists.txt
src/server/ContextPublisher.h
src/server/publisher/UserActivity.cpp [new file with mode: 0644]

index 0cb484c8234947c057599e8eddcd161b52169f72..06e7a9e06e41957e10020227d9d4d1a1e42081c7 100644 (file)
 
 /* Attribute names */
 #define CTX_SCHED_ATTR_NAME_STATE                      "State"
+#define CTX_SCHED_ATTR_NAME_EVENT                      "Event"
 #define CTX_SCHED_ATTR_NAME_TYPE                       "Type"
 #define CTX_SCHED_ATTR_NAME_LEVEL                      "Level"
+#define CTX_SCHED_ATTR_NAME_ACCURACY           "Accuracy"
 #define CTX_SCHED_ATTR_NAME_IS_CONNECTED       "IsConnected"
 #define CTX_SCHED_ATTR_NAME_IS_CHARGING                "IsCharging"
 
@@ -51,6 +53,7 @@
 #define CTX_SCHED_ATTR_VALUE_UNDEFINED         "Undefined"
 #define CTX_SCHED_ATTR_VALUE_CONNECTED         "Connected"
 #define CTX_SCHED_ATTR_VALUE_DISABLED          "Disabled"
+#define CTX_SCHED_ATTR_VALUE_DETECTED          "Detected"
 #define CTX_SCHED_ATTR_VALUE_HEADSET           "Headset"
 #define CTX_SCHED_ATTR_VALUE_NORMAL                    "Normal"
 #define CTX_SCHED_ATTR_VALUE_SEARCHING         "Searching"
index e0d0b6acf5c5c35ac9378274ff80afe58ae9cc4d..00aadf9e51743e89f4b4b14fb98f043e3d434ad9 100644 (file)
@@ -18,6 +18,7 @@ BuildRequires: pkgconfig(capi-base-common)
 BuildRequires: pkgconfig(capi-system-info)
 BuildRequires: pkgconfig(capi-system-device)
 BuildRequires: pkgconfig(capi-system-runtime-info)
+BuildRequires: pkgconfig(capi-context-motion)
 BuildRequires: pkgconfig(aul)
 BuildRequires: pkgconfig(notification)
 
index ef001a1b2230137cb505692206f3e6913b17fb48..16bb77ea2b7ea690c8ef0f3868a4869e1b00af3b 100644 (file)
@@ -1,7 +1,7 @@
 SET(target "${PROJECT_NAME}-server-genuine")
 
 SET(DEPS "${DEPS} jsoncpp sqlite3 vconf context-common-server")
-SET(DEPS "${DEPS} capi-system-info capi-system-device capi-system-runtime-info")
+SET(DEPS "${DEPS} capi-system-info capi-system-device capi-system-runtime-info capi-context-motion")
 SET(DEPS "${DEPS} aul notification")
 
 FILE(GLOB_RECURSE SRCS *.cpp ../shared/*.cpp)
index b76ca6b09e05e87e14f72244d878e35390ac64fd..8401a8ec946209ad4a90d298f62b654fe497ef7e 100644 (file)
 #include <list>
 #include <json/json.h>
 
-#define REGISTER_PUBLISHER(uri, pubs) \
-       static ctx::ContextPublisher* __create(uid_t uid) \
+#define REGISTER_PUBLISHER_FULL(name, uri, pubs) \
+       static ctx::ContextPublisher* __create_##name(uid_t uid) \
        { \
                return new pubs(uid); \
        } \
-       __attribute__((__constructor__)) static void __registerPublisher() \
+       __attribute__((__constructor__)) static void __register_##name() \
        { \
-               ctx::ContextPublisher::registerPublisher((uri), __create); \
+               ctx::ContextPublisher::registerPublisher((uri), __create_##name); \
        }
 
+#define REGISTER_PUBLISHER(uri, pubs) REGISTER_PUBLISHER_FULL(publisher, uri, pubs)
+
 namespace ctx {
 
        class IContextObserver;
diff --git a/src/server/publisher/UserActivity.cpp b/src/server/publisher/UserActivity.cpp
new file mode 100644 (file)
index 0000000..f84ecb3
--- /dev/null
@@ -0,0 +1,318 @@
+/*
+ * Copyright (c) 2017 Samsung Electronics Co., Ltd.
+ *
+ * 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.
+ */
+
+#include <activity_recognition.h>
+
+#include <ContextTypes.h>
+#include <JobSchedulerTypesPrivate.h>
+#include <job_scheduler_types_internal.h>
+#include "../ContextPublisher.h"
+#include "../IContextObserver.h"
+
+using namespace ctx;
+
+namespace {
+       class UserActivity : public ContextPublisher {
+       public:
+               virtual ~UserActivity();
+
+               virtual const char* getUri() const = 0;
+
+               bool isReadable() const;
+
+       protected:
+               UserActivity();
+
+               void read();
+               void subscribe();
+               void unsubscribe();
+               void publish(activity_data_h event);
+
+               virtual activity_type_e getActivityType() const = 0;
+               virtual activity_recognition_cb getCallback() const = 0;
+
+       private:
+               activity_h __handle;
+       };
+
+       class ActivityStationary : public UserActivity {
+       public:
+               ActivityStationary(uid_t uid);
+               ~ActivityStationary();
+
+               const char* getUri() const;
+
+       protected:
+               activity_type_e getActivityType() const;
+               activity_recognition_cb getCallback() const;
+
+       private:
+               static void __activityCb(activity_type_e activity,
+                               const activity_data_h data, double timestamp, activity_error_e error, void *userData);
+       };
+
+       class ActivityWalking : public UserActivity {
+       public:
+               ActivityWalking(uid_t uid);
+               ~ActivityWalking();
+
+               const char* getUri() const;
+
+       protected:
+               activity_type_e getActivityType() const;
+               activity_recognition_cb getCallback() const;
+
+       private:
+               static void __activityCb(activity_type_e activity,
+                               const activity_data_h data, double timestamp, activity_error_e error, void *userData);
+       };
+
+       class ActivityRunning : public UserActivity {
+       public:
+               ActivityRunning(uid_t uid);
+               ~ActivityRunning();
+
+               const char* getUri() const;
+
+       protected:
+               activity_type_e getActivityType() const;
+               activity_recognition_cb getCallback() const;
+
+       private:
+               static void __activityCb(activity_type_e activity,
+                               const activity_data_h data, double timestamp, activity_error_e error, void *userData);
+       };
+
+       class ActivityInVehicle : public UserActivity {
+       public:
+               ActivityInVehicle(uid_t uid);
+               ~ActivityInVehicle();
+
+               const char* getUri() const;
+
+       protected:
+               activity_type_e getActivityType() const;
+               activity_recognition_cb getCallback() const;
+
+       private:
+               static void __activityCb(activity_type_e activity,
+                               const activity_data_h data, double timestamp, activity_error_e error, void *userData);
+       };
+}
+
+REGISTER_PUBLISHER_FULL(__create_stationary, URI(STATIONARY), ActivityStationary)
+REGISTER_PUBLISHER_FULL(__create_walking, URI(WALKING), ActivityWalking)
+REGISTER_PUBLISHER_FULL(__create_running, URI(RUNNING), ActivityRunning)
+REGISTER_PUBLISHER_FULL(__create_in_vehicle, URI(IN_VEHICLE), ActivityInVehicle)
+
+UserActivity::UserActivity() :
+       __handle(NULL)
+{
+}
+
+UserActivity::~UserActivity()
+{
+}
+
+bool UserActivity::isReadable() const
+{
+       return false;
+}
+
+void UserActivity::read()
+{
+}
+
+void UserActivity::subscribe()
+{
+       activity_create(&__handle);
+       activity_start_recognition(__handle, getActivityType(), getCallback(), this);
+}
+
+void UserActivity::unsubscribe()
+{
+       if (__handle) {
+               activity_stop_recognition(__handle);
+               activity_release(__handle);
+               __handle = NULL;
+       }
+}
+
+void UserActivity::publish(activity_data_h event)
+{
+       __data[NAME(EVENT)] = VALUE(DETECTED);
+
+       activity_accuracy_e accuracy = ACTIVITY_ACCURACY_LOW;
+       activity_get_accuracy(event, &accuracy);
+
+       switch (accuracy) {
+       case ACTIVITY_ACCURACY_HIGH:
+               __data[NAME(ACCURACY)] = VALUE(HIGH);
+               break;
+       case ACTIVITY_ACCURACY_MID:
+               __data[NAME(ACCURACY)] = VALUE(NORMAL);
+               break;
+       default:
+               __data[NAME(ACCURACY)] = VALUE(LOW);
+               break;
+       }
+
+       notifyObservers();
+}
+
+
+ActivityStationary::ActivityStationary(uid_t uid)
+{
+       bool supported = false;
+       activity_is_supported(ACTIVITY_STATIONARY, &supported);
+       IF_FAIL_THROW(supported, E_SUPPORT);
+       _D("Created");
+}
+
+ActivityStationary::~ActivityStationary()
+{
+       unsubscribe();
+       _D("Destroyed");
+}
+
+const char* ActivityStationary::getUri() const
+{
+       return URI(STATIONARY);
+}
+
+activity_type_e ActivityStationary::getActivityType() const
+{
+       return ACTIVITY_STATIONARY;
+}
+
+activity_recognition_cb ActivityStationary::getCallback() const
+{
+       return __activityCb;
+}
+
+void ActivityStationary::__activityCb(activity_type_e activity, const activity_data_h data, double timestamp, activity_error_e error, void *userData)
+{
+       IF_FAIL_VOID(error == ACTIVITY_ERROR_NONE);
+       static_cast<ActivityStationary*>(userData)->publish(data);
+}
+
+
+ActivityWalking::ActivityWalking(uid_t uid)
+{
+       bool supported = false;
+       activity_is_supported(ACTIVITY_WALK, &supported);
+       IF_FAIL_THROW(supported, E_SUPPORT);
+       _D("Created");
+}
+
+ActivityWalking::~ActivityWalking()
+{
+       unsubscribe();
+       _D("Destroyed");
+}
+
+const char* ActivityWalking::getUri() const
+{
+       return URI(WALKING);
+}
+
+activity_type_e ActivityWalking::getActivityType() const
+{
+       return ACTIVITY_WALK;
+}
+
+activity_recognition_cb ActivityWalking::getCallback() const
+{
+       return __activityCb;
+}
+
+void ActivityWalking::__activityCb(activity_type_e activity, const activity_data_h data, double timestamp, activity_error_e error, void *userData)
+{
+       IF_FAIL_VOID(error == ACTIVITY_ERROR_NONE);
+       static_cast<ActivityWalking*>(userData)->publish(data);
+}
+
+
+ActivityRunning::ActivityRunning(uid_t uid)
+{
+       bool supported = false;
+       activity_is_supported(ACTIVITY_RUN, &supported);
+       IF_FAIL_THROW(supported, E_SUPPORT);
+       _D("Created");
+}
+
+ActivityRunning::~ActivityRunning()
+{
+       unsubscribe();
+       _D("Destroyed");
+}
+
+const char* ActivityRunning::getUri() const
+{
+       return URI(RUNNING);
+}
+
+activity_type_e ActivityRunning::getActivityType() const
+{
+       return ACTIVITY_RUN;
+}
+
+activity_recognition_cb ActivityRunning::getCallback() const
+{
+       return __activityCb;
+}
+
+void ActivityRunning::__activityCb(activity_type_e activity, const activity_data_h data, double timestamp, activity_error_e error, void *userData)
+{
+       IF_FAIL_VOID(error == ACTIVITY_ERROR_NONE);
+       static_cast<ActivityRunning*>(userData)->publish(data);
+}
+
+
+ActivityInVehicle::ActivityInVehicle(uid_t uid)
+{
+       bool supported = false;
+       activity_is_supported(ACTIVITY_IN_VEHICLE, &supported);
+       IF_FAIL_THROW(supported, E_SUPPORT);
+       _D("Created");
+}
+
+ActivityInVehicle::~ActivityInVehicle()
+{
+       unsubscribe();
+       _D("Destroyed");
+}
+
+const char* ActivityInVehicle::getUri() const
+{
+       return URI(IN_VEHICLE);
+}
+
+activity_type_e ActivityInVehicle::getActivityType() const
+{
+       return ACTIVITY_IN_VEHICLE;
+}
+
+activity_recognition_cb ActivityInVehicle::getCallback() const
+{
+       return __activityCb;
+}
+
+void ActivityInVehicle::__activityCb(activity_type_e activity, const activity_data_h data, double timestamp, activity_error_e error, void *userData)
+{
+       IF_FAIL_VOID(error == ACTIVITY_ERROR_NONE);
+       static_cast<ActivityInVehicle*>(userData)->publish(data);
+}