iu: Support to send event 40/264140/1
authorJihoon Kim <jihoon48.kim@samsung.com>
Mon, 13 Sep 2021 11:39:25 +0000 (20:39 +0900)
committerSung-Jin Park <sj76.park@samsung.com>
Mon, 13 Sep 2021 12:32:57 +0000 (21:32 +0900)
Change-Id: I961a77e2e3006e87e8ce7a895859b263eae5a611
Signed-off-by: Jihoon Kim <jihoon48.kim@samsung.com>
src/mmimgr/iu/intent_understanding_engine.cpp
src/mmimgr/iu/intent_understanding_engine.h
src/mmimgr/iu/mmi_iu.cpp
src/mmimgr/iu/mmi_iu.h
src/mmimgr/mmi-iu-bridge.c
tests/iu/mmi_iu_feed_input_event_unittests.cpp

index 6daf333..adf5d33 100644 (file)
@@ -39,8 +39,8 @@ static unordered_map<string, string> key_action_map
     = { { "UP",         "Up" },
         { "DOWN",       "Down" },
         { "LEFT",       "Left" },
-        { "RIGHT",      "Right" },
-        { "RETURN",     "Ok" },
+        { "RGHT",       "Right" },
+        { "I360",       "Ok" },
         { "XF86Back",   "Back" },
         { "I69",        "Back" },
       };
@@ -447,3 +447,9 @@ void IntentUnderstandingEngine::init_input_buffer()
 {
     input_intent_list.clear();
 }
+
+void IntentUnderstandingEngine::set_event_handler(event_callback_func event_cb)
+{
+    on_event_handler = std::move(event_cb);
+}
+
index f1d4799..6090a44 100644 (file)
@@ -27,6 +27,7 @@
 #include <unistd.h>
 #include <string>
 #include <list>
+#include <functional>
 
 #include "input_intent.h"
 #include "mmi-common.h"
 using namespace std;
 
 class IntentUnderstandingEngine {
+private:
+    typedef std::function<void(int, void *)> event_callback_func;
+
+    event_callback_func on_event_handler;
+
 public:
     IntentUnderstandingEngine();
     virtual ~IntentUnderstandingEngine();
@@ -55,6 +61,8 @@ public:
 
     mmi_state get_app_state();
 
+    void set_event_handler(event_callback_func event_cb);
+
 private:
     bool match_input_intent(IntentUnderstandingRule iu_rule);
 
index 03ebc16..77ba0d7 100644 (file)
@@ -39,6 +39,9 @@ static mmi_state g_app_state = MMI_STATE_INITIATION;
 static mmi_iu_output_intent_received_cb iu_output_intent_received_callback = NULL;
 static void *iu_output_intent_user_data = NULL;
 
+static mmi_iu_output_event_received_cb iu_output_event_received_callback = NULL;
+static void *iu_output_event_user_data = NULL;
+
 static bool initialized = false;
 
 static string g_system_app_id;
@@ -180,11 +183,14 @@ EXPORT_API int mmi_iu_feed_input_event(const char *app_id, int type, void *event
         return MMI_IU_ERROR_NOT_INITIALIZED;
     }
 
-    if (iu_engine)
+    if (iu_engine) {
         if (!iu_engine->set_input_event(type, event)) {
-            LOGE("Failed to set input event");
-            return MMI_IU_ERROR_OPERATION_FAILED;
+            if (iu_output_event_received_callback)
+                iu_output_event_received_callback(app_id, type, event, iu_output_event_user_data);
+
+            return MMI_IU_ERROR_NONE;
         }
+    }
 
     _I("app state: %d\n", g_app_state);
 
@@ -225,6 +231,24 @@ EXPORT_API int mmi_iu_set_output_intent_received_callback(mmi_iu_output_intent_r
     return MMI_IU_ERROR_NONE;
 }
 
+EXPORT_API int mmi_iu_set_output_event_received_callback(mmi_iu_output_event_received_cb callback, void *user_data)
+{
+    if (!callback) {
+        _W("[ERROR] Invalid parameter");
+        return MMI_IU_ERROR_INVALID_PARAMETER;
+    }
+
+    if (!initialized) {
+        _W("[ERROR] Not initialized");
+        return MMI_IU_ERROR_NOT_INITIALIZED;
+    }
+
+    iu_output_event_received_callback = callback;
+    iu_output_event_user_data = user_data;
+
+    return MMI_IU_ERROR_NONE;
+}
+
 EXPORT_API int mmi_iu_unset_output_intent_received_callback()
 {
     if (!initialized) {
@@ -238,6 +262,19 @@ EXPORT_API int mmi_iu_unset_output_intent_received_callback()
     return MMI_IU_ERROR_NONE;
 }
 
+EXPORT_API int mmi_iu_unset_output_event_received_callback()
+{
+    if (!initialized) {
+        _W("[ERROR] Not initialized");
+        return MMI_IU_ERROR_NOT_INITIALIZED;
+    }
+
+    iu_output_event_received_callback = NULL;
+    iu_output_event_user_data = NULL;
+
+    return MMI_IU_ERROR_NONE;
+}
+
 EXPORT_API int mmi_iu_set_app_state(mmi_state app_state)
 {
     if (!initialized) {
index 21c2b67..ba0cf6b 100644 (file)
@@ -49,6 +49,8 @@ extern "C" {
  */
 typedef void (*mmi_iu_output_intent_received_cb)(const char *target_app_id, const char *json_data, void *user_data);
 
+typedef void (*mmi_iu_output_event_received_cb)(const char *target_app_id, int type, void *event, void *user_data);
+
 /**
  * @brief Initialize Intent Understanding library
  *
@@ -94,11 +96,15 @@ int mmi_iu_feed_input_event(const char *app_id, int type, void *event);
  */
 int mmi_iu_set_output_intent_received_callback(mmi_iu_output_intent_received_cb callback, void *user_data);
 
+int mmi_iu_set_output_event_received_callback(mmi_iu_output_event_received_cb callback, void *user_data);
+
 /**
  * @brief Unregister the callback function to receive output intent
  */
 int mmi_iu_unset_output_intent_received_callback();
 
+int mmi_iu_unset_output_event_received_callback();
+
 /**
  * @brief Set app state
  * @param app_state The application state
index 3f5fb9a..3a804d4 100644 (file)
@@ -117,6 +117,43 @@ cleanup:
                g_object_unref(parser);
 }
 
+static void output_event_received_cb(const char *app_id, int type, void *event, void *user_data)
+{
+       if (type == MMI_PROVIDER_EVENT_KEY) {
+               mmi_provider_event_key *key_event = (mmi_provider_event_key *)event;
+               key_event_arg arg;
+
+               arg.type = key_event->type;
+               arg.timestamp = key_event->timestamp;
+               arg.key_down = key_event->key_down;
+               arg.keycode = key_event->keycode;
+               arg.keyname = key_event->keyname;
+               arg.source = key_event->source;
+
+               client_manager_send_key_event(g_client, &arg);
+       }
+       else if (type == MMI_PROVIDER_EVENT_VOICE) {
+               mmi_provider_event_voice *voice_event = (mmi_provider_event_voice *)event;
+               voice_event_arg arg;
+
+               arg.type = voice_event->type;
+               arg.timestamp = voice_event->timestamp;
+               arg.source = voice_event->source;
+
+               client_manager_send_voice_event(g_client, &arg);
+       }
+       else if (type == MMI_PROVIDER_EVENT_GESTURE) {
+               mmi_provider_event_gesture *gesture_event = (mmi_provider_event_gesture *)event;
+               gesture_event_arg arg;
+
+               arg.type = gesture_event->type;
+               arg.timestamp = gesture_event->timestamp;
+               arg.source = gesture_event->source;
+
+               client_manager_send_gesture_event(g_client, &arg);
+       }
+}
+
 static Eina_Bool
 _focus_change_cb(void *data EINA_UNUSED, int type, void *event)
 {
@@ -230,6 +267,12 @@ int mmi_iu_bridge_init()
                return ret;
        }
 
+       ret = mmi_iu_set_output_event_received_callback(output_event_received_cb, NULL);
+       if (ret != MMI_IU_ERROR_NONE) {
+               LOGE("Error code : %d", ret);
+               return ret;
+       }
+
        return ret;
 }
 
index 42d9905..191df34 100644 (file)
@@ -40,6 +40,11 @@ using namespace std;
 
 static string output_action;
 
+static int g_received_event_type = -1;
+static void *g_received_event_data = NULL;
+
+#define MMI_EVENT_VOICE_TYPE_GO 1000 // for test
+
 namespace {
 
 static void output_intent_received_cb(const char *app_id, const char *json_data, void *user_data)
@@ -80,6 +85,12 @@ cleanup:
         g_object_unref(parser);
 }
 
+static void output_event_received_cb(const char *app_id, int type, void *event, void *user_data)
+{
+    g_received_event_type = type;
+    g_received_event_data = event;
+}
+
 class IUClientFeedInputEventTest : public testing::Test {
     public:
         virtual void SetUp() {
@@ -90,6 +101,9 @@ class IUClientFeedInputEventTest : public testing::Test {
             MMI_PROVIDER_EVENT_VOICE = ecore_event_type_new();
             MMI_PROVIDER_EVENT_VISION = ecore_event_type_new();
 
+            g_received_event_type = -1;
+            g_received_event_data = NULL;
+
             int ret = mmi_iu_init();
             EXPECT_EQ(ret, MMI_IU_ERROR_NONE);
 
@@ -97,7 +111,11 @@ class IUClientFeedInputEventTest : public testing::Test {
 
             ret = mmi_iu_set_output_intent_received_callback(output_intent_received_cb, NULL);
             EXPECT_EQ(ret, MMI_IU_ERROR_NONE);
+
+            ret = mmi_iu_set_output_event_received_callback(output_event_received_cb, NULL);
+            EXPECT_EQ(ret, MMI_IU_ERROR_NONE);
         }
+
         virtual void TearDown() {
             mmi_iu_shutdown();
 
@@ -179,7 +197,7 @@ TEST_F(IUClientFeedInputEventTest, utc_mmi_iu_feed_intent_key_input_press_left)
 
 TEST_F(IUClientFeedInputEventTest, utc_mmi_iu_feed_intent_voice_move_up)
 {
-    mmi_provider_event_voice ve;
+    mmi_provider_event_voice ve = { 0, };
     ve.type = MMI_EVENT_VOICE_TYPE_UP;
 
     int ret = feed_input_event_test(MMI_STATE_EXPLORATION, MMI_PROVIDER_EVENT_VOICE, &ve);
@@ -190,7 +208,7 @@ TEST_F(IUClientFeedInputEventTest, utc_mmi_iu_feed_intent_voice_move_up)
 
 TEST_F(IUClientFeedInputEventTest, utc_mmi_iu_feed_intent_voice_move_down)
 {
-    mmi_provider_event_voice ve;
+    mmi_provider_event_voice ve = { 0, };
     ve.type = MMI_EVENT_VOICE_TYPE_DOWN;
 
     int ret = feed_input_event_test(MMI_STATE_EXPLORATION, MMI_PROVIDER_EVENT_VOICE, &ve);
@@ -201,7 +219,7 @@ TEST_F(IUClientFeedInputEventTest, utc_mmi_iu_feed_intent_voice_move_down)
 
 TEST_F(IUClientFeedInputEventTest, utc_mmi_iu_feed_intent_voice_move_right)
 {
-    mmi_provider_event_voice ve;
+    mmi_provider_event_voice ve = { 0, };
     ve.type = MMI_EVENT_VOICE_TYPE_RIGHT;
 
     int ret = feed_input_event_test(MMI_STATE_EXPLORATION, MMI_PROVIDER_EVENT_VOICE, &ve);
@@ -212,7 +230,7 @@ TEST_F(IUClientFeedInputEventTest, utc_mmi_iu_feed_intent_voice_move_right)
 
 TEST_F(IUClientFeedInputEventTest, utc_mmi_iu_feed_intent_voice_move_left)
 {
-    mmi_provider_event_voice ve;
+    mmi_provider_event_voice ve = { 0, };
     ve.type = MMI_EVENT_VOICE_TYPE_LEFT;
 
     int ret = feed_input_event_test(MMI_STATE_EXPLORATION, MMI_PROVIDER_EVENT_VOICE, &ve);
@@ -223,7 +241,7 @@ TEST_F(IUClientFeedInputEventTest, utc_mmi_iu_feed_intent_voice_move_left)
 
 TEST_F(IUClientFeedInputEventTest, utc_mmi_iu_feed_intent_gesture_hand_up)
 {
-    mmi_provider_event_gesture ge;
+    mmi_provider_event_gesture ge = { 0, };
     ge.type = MMI_EVENT_GESTURE_TYPE_SWIPE_UP;
 
     int ret = feed_input_event_test(MMI_STATE_EXPLORATION, MMI_PROVIDER_EVENT_GESTURE, &ge);
@@ -234,7 +252,7 @@ TEST_F(IUClientFeedInputEventTest, utc_mmi_iu_feed_intent_gesture_hand_up)
 
 TEST_F(IUClientFeedInputEventTest, utc_mmi_iu_feed_intent_gesture_hand_down)
 {
-    mmi_provider_event_gesture ge;
+    mmi_provider_event_gesture ge = { 0, };
     ge.type = MMI_EVENT_GESTURE_TYPE_SWIPE_DOWN;
 
     int ret = feed_input_event_test(MMI_STATE_EXPLORATION, MMI_PROVIDER_EVENT_GESTURE, &ge);
@@ -245,7 +263,7 @@ TEST_F(IUClientFeedInputEventTest, utc_mmi_iu_feed_intent_gesture_hand_down)
 
 TEST_F(IUClientFeedInputEventTest, utc_mmi_iu_feed_intent_gesture_hand_right)
 {
-    mmi_provider_event_gesture ge;
+    mmi_provider_event_gesture ge = { 0, };
     ge.type = MMI_EVENT_GESTURE_TYPE_SWIPE_RIGHT;
 
     int ret = feed_input_event_test(MMI_STATE_EXPLORATION, MMI_PROVIDER_EVENT_GESTURE, &ge);
@@ -256,7 +274,7 @@ TEST_F(IUClientFeedInputEventTest, utc_mmi_iu_feed_intent_gesture_hand_right)
 
 TEST_F(IUClientFeedInputEventTest, utc_mmi_iu_feed_intent_gesture_hand_left)
 {
-    mmi_provider_event_gesture ge;
+    mmi_provider_event_gesture ge = { 0, };
     ge.type = MMI_EVENT_GESTURE_TYPE_SWIPE_LEFT;
 
     int ret = feed_input_event_test(MMI_STATE_EXPLORATION, MMI_PROVIDER_EVENT_GESTURE, &ge);
@@ -280,7 +298,7 @@ TEST_F(IUClientFeedInputEventTest, utc_mmi_iu_feed_intent_key_press_ok)
 
 TEST_F(IUClientFeedInputEventTest, utc_mmi_iu_feed_intent_voice_execute)
 {
-    mmi_provider_event_voice ve;
+    mmi_provider_event_voice ve = { 0, };
     ve.type = MMI_EVENT_VOICE_TYPE_EXECUTE;
 
     int ret = feed_input_event_test(MMI_STATE_EXECUTION, MMI_PROVIDER_EVENT_VOICE, &ve);
@@ -291,7 +309,7 @@ TEST_F(IUClientFeedInputEventTest, utc_mmi_iu_feed_intent_voice_execute)
 
 TEST_F(IUClientFeedInputEventTest, utc_mmi_iu_feed_intent_voice_play)
 {
-    mmi_provider_event_voice ve;
+    mmi_provider_event_voice ve = { 0, };
     ve.type = MMI_EVENT_VOICE_TYPE_PLAY;
 
     int ret = feed_input_event_test(MMI_STATE_EXECUTION, MMI_PROVIDER_EVENT_VOICE, &ve);
@@ -302,7 +320,7 @@ TEST_F(IUClientFeedInputEventTest, utc_mmi_iu_feed_intent_voice_play)
 
 TEST_F(IUClientFeedInputEventTest, utc_mmi_iu_feed_intent_voice_yes)
 {
-    mmi_provider_event_voice ve;
+    mmi_provider_event_voice ve = { 0, };
     ve.type = MMI_EVENT_VOICE_TYPE_YES;
 
     int ret = feed_input_event_test(MMI_STATE_EXECUTION,  MMI_PROVIDER_EVENT_VOICE, &ve);
@@ -313,7 +331,7 @@ TEST_F(IUClientFeedInputEventTest, utc_mmi_iu_feed_intent_voice_yes)
 
 TEST_F(IUClientFeedInputEventTest, utc_mmi_iu_feed_intent_gesture_hand_push)
 {
-    mmi_provider_event_gesture ge;
+    mmi_provider_event_gesture ge = { 0, };
     ge.type = MMI_EVENT_GESTURE_TYPE_PUSH;
 
     int ret = feed_input_event_test(MMI_STATE_EXECUTION, MMI_PROVIDER_EVENT_GESTURE, &ge);
@@ -337,7 +355,7 @@ TEST_F(IUClientFeedInputEventTest, utc_mmi_iu_feed_intent_key_back_button)
 
 TEST_F(IUClientFeedInputEventTest, utc_mmi_iu_feed_intent_voice_cancel)
 {
-    mmi_provider_event_voice ve;
+    mmi_provider_event_voice ve = { 0, };
     ve.type = MMI_EVENT_VOICE_TYPE_CANCEL;
 
     int ret = feed_input_event_test(MMI_STATE_FEEDBACK, MMI_PROVIDER_EVENT_VOICE, &ve);
@@ -348,7 +366,7 @@ TEST_F(IUClientFeedInputEventTest, utc_mmi_iu_feed_intent_voice_cancel)
 
 TEST_F(IUClientFeedInputEventTest, utc_mmi_iu_feed_intent_voice_back)
 {
-    mmi_provider_event_voice ve;
+    mmi_provider_event_voice ve = { 0, };
     ve.type = MMI_EVENT_VOICE_TYPE_BACK;
 
     int ret = feed_input_event_test(MMI_STATE_FEEDBACK, MMI_PROVIDER_EVENT_VOICE, &ve);
@@ -370,7 +388,7 @@ TEST_F(IUClientFeedInputEventTest, utc_mmi_iu_feed_intent_vision_outofvision)
     }
     )";
 
-    mmi_provider_event_vision vision_event;
+    mmi_provider_event_vision vision_event = { 0, };
     vision_event.type = MMI_EVENT_VISION_TYPE_USER_MOVE_AWAY;
 
     int ret = feed_input_event_test(MMI_STATE_OBSERVATION, MMI_PROVIDER_EVENT_VISION, &vision_event);
@@ -394,7 +412,7 @@ TEST_F(IUClientFeedInputEventTest, utc_mmi_iu_feed_intent_key_back_terminate)
 
 TEST_F(IUClientFeedInputEventTest, utc_mmi_iu_feed_intent_voice_exit)
 {
-    mmi_provider_event_voice ve;
+    mmi_provider_event_voice ve = { 0, };
     ve.type = MMI_EVENT_VOICE_TYPE_EXIT;
 
     int ret = feed_input_event_test(MMI_STATE_TERMINATION, MMI_PROVIDER_EVENT_VOICE, &ve);
@@ -405,7 +423,7 @@ TEST_F(IUClientFeedInputEventTest, utc_mmi_iu_feed_intent_voice_exit)
 
 TEST_F(IUClientFeedInputEventTest, utc_mmi_iu_feed_intent_voice_stop)
 {
-    mmi_provider_event_voice ve;
+    mmi_provider_event_voice ve = { 0, };
     ve.type = MMI_EVENT_VOICE_TYPE_STOP;
 
     int ret = feed_input_event_test(MMI_STATE_TERMINATION, MMI_PROVIDER_EVENT_VOICE, &ve);
@@ -416,7 +434,7 @@ TEST_F(IUClientFeedInputEventTest, utc_mmi_iu_feed_intent_voice_stop)
 
 TEST_F(IUClientFeedInputEventTest, utc_mmi_iu_feed_intent_voice_terminate)
 {
-    mmi_provider_event_voice ve;
+    mmi_provider_event_voice ve = { 0, };
     ve.type = MMI_EVENT_VOICE_TYPE_TERMINATE;
 
     int ret = feed_input_event_test(MMI_STATE_TERMINATION, MMI_PROVIDER_EVENT_VOICE, &ve);
@@ -436,7 +454,7 @@ TEST_F(IUClientFeedInputEventTest, utc_mmi_iu_feed_intent_gesture_push_different
     ret = mmi_iu_set_focus_app_id(SYSTEM_APP_ID);
     EXPECT_EQ(ret, MMI_IU_ERROR_NONE);
 
-    mmi_provider_event_gesture ge;
+    mmi_provider_event_gesture ge = { 0, };
     ge.type = MMI_EVENT_GESTURE_TYPE_PUSH;
 
     ret = mmi_iu_feed_input_event(TEST_APP_ID, MMI_PROVIDER_EVENT_GESTURE, &ge);
@@ -444,4 +462,22 @@ TEST_F(IUClientFeedInputEventTest, utc_mmi_iu_feed_intent_gesture_push_different
 
     EXPECT_STREQ(output_action.c_str(), "");
 }
+
+TEST_F(IUClientFeedInputEventTest, utc_mmi_iu_feed_intent_voice_go)
+{
+    int timestamp = 1234;
+    mmi_provider_event_voice ve = { 0, };
+    ve.type = MMI_EVENT_VOICE_TYPE_GO;
+    ve.timestamp = timestamp;
+
+    int ret = feed_input_event_test(MMI_STATE_TERMINATION, MMI_PROVIDER_EVENT_VOICE, &ve);
+    EXPECT_EQ(ret, MMI_IU_ERROR_NONE);
+
+    EXPECT_EQ(g_received_event_type, MMI_PROVIDER_EVENT_VOICE);
+    EXPECT_EQ(g_received_event_data, &ve);
+
+    mmi_provider_event_voice *rcv_ve = (mmi_provider_event_voice *)g_received_event_data;
+    EXPECT_EQ(rcv_ve->timestamp, timestamp);
+}
+
 } // namespace