ref-fusion: implement focus/state change callbacks and set_state() 96/264096/1
authorSung-Jin Park <sj76.park@samsung.com>
Wed, 8 Sep 2021 12:24:25 +0000 (21:24 +0900)
committerSung-Jin Park <sj76.park@samsung.com>
Mon, 13 Sep 2021 11:26:48 +0000 (20:26 +0900)
Change-Id: I91ab02ce71a27cfd6c27ca025a2190cbde3d994b
Signed-off-by: Sung-Jin Park <sj76.park@samsung.com>
src/modules/ref_fusion/mmi-ref-fusion.c

index 22ab8ff..56c0155 100644 (file)
@@ -24,6 +24,7 @@
 #include "mmi-ref-fusion.h"
 #include <mmi-client.h>
 #include <mmi-manager.h>
+#include <mmi-provider.h>
 
 #include <stdio.h>
 #include <stdlib.h>
@@ -70,21 +71,66 @@ Ecore_Event_Handler *_event_handlers[2];
 static Eina_Bool
 _focus_change_cb(void *data EINA_UNUSED, int type, void *event)
 {
+       int r;
+       mmi_state state = MMI_STATE_NONE;
+       unsigned long long caps = MODALITY_PROVIDER_CAP_NONE;
+
        LOGI("...");
 
        mmi_manager_event_focus_change *ev = (mmi_manager_event_focus_change *)event;
 
+       if (ev->cur_focus && ev->cur_focus != _focus_client)
+       {
+               LOGE("Abnormal situation ! (_focus_client=%p, ev->cur_focus=%p)\n",
+                       _focus_client, ev->cur_focus);
+               return ECORE_CALLBACK_PASS_ON;
+       }
+
+       if (ev->cur_focus)
+       {
+               //Set op_mode to MODALITY_PROVIDER_MODE_DROP_EVENT
+               state = client_manager_get_client_state(ev->cur_focus);
+               LOGI("state=%d, ev->cur_focus(%p) !\n", state, ev->cur_focus);
+       }
+       else if (_focus_client)
+       {
+               //Set op_mode to MODALITY_PROVIDER_MODE_DROP_EVENT
+               state = client_manager_get_client_state(_focus_client);
+               LOGI("state=%d, _focus_client(%p) !\n", state, _focus_client);
+       }
+
+       if (state == MMI_STATE_NONE)
+       {
+               state = _state;
+               _state = MMI_STATE_NONE;
+       }
+
+       if (state != MMI_STATE_NONE)
+       {
+               caps = state_caps[state];
+               LOGI("caps=%llu!\n", caps);
+
+               r = mmi_provider_set_op_mode_on_caps(caps, MODALITY_PROVIDER_MODE_DROP_EVENT);
+               if (r)
+               {
+                       LOGE("Failed on setting op_mode(%d) on caps(%llu) !\n",
+                               MODALITY_PROVIDER_MODE_DROP_EVENT, caps);
+                       return ECORE_CALLBACK_PASS_ON;
+               }
+       }
+
        _prev_focus_client = ev->cur_focus;
        _focus_client = ev->new_focus;
 
-       //TODO : check if there is anything to do
-
        return ECORE_CALLBACK_PASS_ON;
 }
 
 static Eina_Bool
 _state_change_cb(void *data EINA_UNUSED, int type, void *event)
 {
+       int r;
+       unsigned long long caps = MODALITY_PROVIDER_CAP_NONE;
+
        LOGI("...");
 
        mmi_manager_event_state_change *ev = (mmi_manager_event_state_change *)event;
@@ -92,14 +138,46 @@ _state_change_cb(void *data EINA_UNUSED, int type, void *event)
        if (ev->client != _focus_client)
        {
                LOGE("Invalid state change event ! (client:%p, focus_client:%p)\n",
-                               ev->client, _focus_client);
+                       ev->client, _focus_client);
                return ECORE_CALLBACK_PASS_ON;
        }
 
-       _prev_state = ev->from_state;
-       _state = ev->to_state;
+       if (_state != ev->from_state)
+       {
+               LOGE("Abnormal situation ! (_state=%d, ev->from_state=%d)\n", _state, ev->from_state);
+               return ECORE_CALLBACK_PASS_ON;
+       }
 
-       //TODO : do needed things for the given state
+       if (ev->from_state != MMI_STATE_NONE)
+       {
+               //Set op_mode to MODALITY_PROVIDER_MODE_DROP_EVENT
+               caps = state_caps[ev->from_state];
+
+               r = mmi_provider_set_op_mode_on_caps(caps, MODALITY_PROVIDER_MODE_DROP_EVENT);
+               if (r)
+               {
+                       LOGE("Failed on setting op_mode(%d) on caps(%llu) !\n",
+                               MODALITY_PROVIDER_MODE_DROP_EVENT, caps);
+                       return ECORE_CALLBACK_PASS_ON;
+               }
+       }
+
+       if (ev->to_state != MMI_STATE_NONE)
+       {
+               //Set op_mode to MODALITY_PROVIDER_MODE_PROPAGATE_EVENT
+               caps = state_caps[ev->from_state];
+
+               r = mmi_provider_set_op_mode_on_caps(caps, MODALITY_PROVIDER_MODE_PROPAGATE_EVENT);
+               if (r)
+               {
+                       LOGE("Failed on setting op_mode(%d) on caps(%llu) !\n",
+                               MODALITY_PROVIDER_MODE_PROPAGATE_EVENT, caps);
+                       return ECORE_CALLBACK_PASS_ON;
+               }
+       }
+
+       _prev_state = _state;
+       _state = ev->to_state;
 
        return ECORE_CALLBACK_PASS_ON;
 }
@@ -122,8 +200,8 @@ ref_fusion_init(void)
 
        _event_handlers[0] = ecore_event_handler_add(MMI_MANAGER_EVENT_FOCUS_CHANGE,
                        _focus_change_cb, NULL);
-       _event_handlers[1] = ecore_event_handler_add(MMI_MANAGER_EVENT_STATE_CHANGE,
-                       _state_change_cb, NULL);
+       //_event_handlers[1] = ecore_event_handler_add(MMI_MANAGER_EVENT_STATE_CHANGE,
+       //              _state_change_cb, NULL);
 
        return ref_fusion_data;
 }
@@ -131,15 +209,53 @@ ref_fusion_init(void)
 mmi_state
 ref_fusion_set_state(mmi_state state)
 {
-       LOGD("ref_fusion_set_state\n");
-       return MMI_STATE_NONE;
+       int r;
+       unsigned long long caps = MODALITY_PROVIDER_CAP_NONE;
+
+       LOGD("ref_fusion_set_state(%d)\n", state);
+
+       if (state == _state)
+       {
+               LOGE("Given state equals to existing state(%d) !\n", _state);
+               return _state;
+       }
+
+       if (_state != MMI_STATE_NONE)
+       {
+               //Set op_mode to MODALITY_PROVIDER_MODE_DROP_EVENT
+               caps  = state_caps[_state];
+
+               r = mmi_provider_set_op_mode_on_caps(caps, MODALITY_PROVIDER_MODE_DROP_EVENT);
+               if (r)
+               {
+                       LOGE("Failed on setting op_mode(%d) on caps(%llu) !\n",
+                               MODALITY_PROVIDER_MODE_DROP_EVENT, caps);
+               }
+       }
+
+       if (state != MMI_STATE_NONE)
+       {
+               //Set op_mode to MODALITY_PROVIDER_MODE_PROPAGATE_EVENT
+               caps  = state_caps[state];
+
+               r = mmi_provider_set_op_mode_on_caps(caps, MODALITY_PROVIDER_MODE_PROPAGATE_EVENT);
+               if (r)
+               {
+                       LOGE("Failed on setting op_mode(%d) on caps(%llu) !\n",
+                               MODALITY_PROVIDER_MODE_PROPAGATE_EVENT, caps);
+               }
+
+       }
+
+       _state = state;
+       return _state;
 }
 
 mmi_state
 ref_fusion_get_state(void)
 {
-       LOGD("ref_fusion_get_state\n");
-       return MMI_STATE_NONE;
+       LOGD("ref_fusion_get_state(%d)\n", _state);
+       return _state;
 }
 
 static void