Do not handle HW key event when screen is off 25/210225/3
authorYunjin Lee <yunjin-.lee@samsung.com>
Tue, 16 Jul 2019 05:45:56 +0000 (14:45 +0900)
committerYunjin Lee <yunjin-.lee@samsung.com>
Wed, 7 Aug 2019 09:34:39 +0000 (18:34 +0900)
- Current askuser handles HW key events regardless of screen status so
it processes HW key input to wake up screen-offed device as 'deny once'
response. Hence modify it to distinguish focused and unfocused status
and handle HW key input accordingly.

Change-Id: I5b9073c557c19cdb01314783e154e44f5b4775c4
Signed-off-by: Yunjin Lee <yunjin-.lee@samsung.com>
src/notification-daemon/ui/Popupper.cpp
src/notification-daemon/ui/Popupper.h

index 6f7c31f..26c97ff 100644 (file)
@@ -126,10 +126,27 @@ void Popupper::denyPressedCb(void *data, Evas_Object *, void *)
     popupper->buttonAnswer(IAnswerable::Button::DENY);
 }
 
+Eina_Bool Popupper::checkWakeupCb(void *data, int type, void *event)
+{
+    Ecore_Event_Key *ev = static_cast<Ecore_Event_Key*>(event);
+    Popupper* popupper = static_cast<Popupper*>(data);
+    if ((!strcmp(getHomeKey().c_str(), ev->key) || !strcmp("XF86Back", ev->key)) && elm_win_focus_get(popupper->m_win)) {
+        ALOGD("Focused. Pressed key is <" << ev->key << "> type <" << type << ">");
+        popupper->m_focused = true;
+    } else {
+        popupper->m_focused = false;
+    }
+    return EINA_TRUE;
+}
+
 Eina_Bool Popupper::hwKeyClickedCb(void *data, int type, void *event)
 {
     Ecore_Event_Key *ev = static_cast<Ecore_Event_Key*>(event);
     Popupper* runner = static_cast<Popupper*>(data);
+    if (!runner->m_focused) {
+        ALOGD("Key input for wake up. Ignore.");
+        return EINA_TRUE;
+    }
     double delay = 0.5;
     ALOGD("HW button pressed. type <" << type << "> pressed key is <" << ev->key << ">");
     if ((!strcmp(getHomeKey().c_str(), ev->key) || !strcmp("XF86Back", ev->key)) && runner->m_elementPtr) {
@@ -188,7 +205,8 @@ void Popupper::initialize()
 
     elm_win_keygrab_set(m_win, getHomeKey().c_str(), 0, 0, 0, ELM_WIN_KEYGRAB_SHARED);
     elm_win_keygrab_set(m_win, "XF86Back", 0, 0, 0, ELM_WIN_KEYGRAB_TOPMOST);
-    ecore_event_handler_add(ECORE_EVENT_KEY_UP, &Popupper::hwKeyClickedCb, this);
+    m_keyDownHandler = ecore_event_handler_add(ECORE_EVENT_KEY_DOWN, &Popupper::checkWakeupCb, this);
+    m_keyUpHandler = ecore_event_handler_add(ECORE_EVENT_KEY_UP, &Popupper::hwKeyClickedCb, this);
 }
 
 void Popupper::show() {
@@ -254,6 +272,8 @@ void Popupper::stop()
     m_shouldRaise = false;
     elm_win_keygrab_unset(m_win, getHomeKey().c_str(), 0, 0);
     elm_win_keygrab_unset(m_win, "XF86Back", 0, 0);
+    ecore_event_handler_del(m_keyDownHandler);
+    ecore_event_handler_del(m_keyUpHandler);
     m_elementPtr.reset(nullptr);
     m_answerablePtr.reset(nullptr);
     m_responses.clear();
index fbce729..c6556b2 100644 (file)
@@ -60,6 +60,7 @@ private:
     static void unfocusedCb(void *data, Evas_Object *, void *);
     static void allowPressedCb(void *data, Evas_Object *, void *);
     static void denyPressedCb(void *data, Evas_Object *, void *);
+    static Eina_Bool checkWakeupCb(void *data, int type, void *event);
     static Eina_Bool hwKeyClickedCb(void *data, int type, void *event);
 
     void buttonAnswer(IAnswerable::Button button);
@@ -78,6 +79,10 @@ private:
     std::string m_pkgId;
 
     bool m_shouldRaise = false;
+    bool m_focused = false;
+
+    Ecore_Event_Handler *m_keyDownHandler = nullptr;
+    Ecore_Event_Handler *m_keyUpHandler = nullptr;
 };
 
 } /* namespace Notification */