1715ddf23f41782c11000b4ca708dbdd819012ee
[platform/core/uifw/multi-assistant-service.git] / plugins / wakeup-manager / src / wakeup_policy_default.cpp
1 #include "wakeup_policy_default.h"
2 #include "wakeup_policy_impl.h"
3
4 #include <vector>
5
6 #include <Eina.h>
7 #include <dlog.h>
8
9 #ifndef LOG_TAG
10 #define LOG_TAG "WakeupPolicyDefault"
11 #endif
12
13 namespace multiassistant
14 {
15 namespace wakeup
16 {
17
18 CWakeupPolicyDefault::CWakeupPolicyDefault()
19 {
20 }
21
22 CWakeupPolicyDefault::CWakeupPolicyDefault(IPolicyEventObserver *observer)
23         : CWakeupPolicy(observer)
24 {
25 }
26
27 CWakeupPolicyDefault::~CWakeupPolicyDefault()
28 {
29         if (mTimer) {
30                 ecore_timer_del(mTimer);
31                 mTimer = nullptr;
32         }
33 }
34
35 void CWakeupPolicyDefault::set_assistant_priority(string appid, int priority)
36 {
37         PRIORITY_INFO info;
38         info.appid = appid;
39         info.priority = priority;
40
41         LOGD("Setting assistant priority : %s %d", appid.c_str(), priority);
42         mPriorityInfos.push_back(info);
43 }
44
45 void CWakeupPolicyDefault::set_delay(float seconds)
46 {
47         LOGD("Setting delay : %f", seconds);
48         mDelaySeconds = seconds;
49 }
50
51 static Eina_Bool timer_func(void *data)
52 {
53         LOGD("[ENTER]");
54         if (data) {
55                 CWakeupPolicyDefault *policy = static_cast<CWakeupPolicyDefault*>(data);
56                 policy->timer_expired();
57         }
58         return ECORE_CALLBACK_CANCEL;
59 }
60
61 void CWakeupPolicyDefault::wakeup_candidate(mas_wakeup_event_info wakeup_info)
62 {
63         mWakeupInfos.push_back(wakeup_info);
64         if (nullptr == mTimer) {
65                 ecore_thread_main_loop_begin();
66                 mTimer = ecore_timer_add(mDelaySeconds, timer_func, this);
67                 ecore_thread_main_loop_end();
68         }
69 }
70
71 void CWakeupPolicyDefault::timer_expired()
72 {
73         LOGD("[ENTER]");
74         if (0 == mWakeupInfos.size()) return;
75
76         mas_wakeup_event_info selected = mWakeupInfos.front();
77         int selected_priority = -1;
78         for (const auto &wakeup : mWakeupInfos) {
79                 for (const auto &info : mPriorityInfos) {
80                         if (0 == info.appid.compare(wakeup.wakeup_appid)) {
81                                 if (info.priority > selected_priority || -1 == selected_priority) {
82                                         LOGD("Wakeup with higher priority found : %s, %d",
83                                                 info.appid.c_str(), info.priority);
84                                         selected = wakeup;
85                                         selected_priority = info.priority;
86                                 }
87                         }
88                 }
89         }
90         if (mImpl) mImpl->wakeup(selected);
91         mWakeupInfos.clear();
92
93         if (mTimer) {
94                 LOGD("Now deleting timer");
95                 ecore_timer_del(mTimer);
96                 mTimer = nullptr;
97         }
98 }
99
100 } // wakeup
101 } // multiassistant