Remove trivial unnecessary build dependency
[apps/core/preloaded/lockscreen.git] / src / events_ctrl.c
1 /*
2  * Copyright (c) 2016 Samsung Electronics Co., Ltd All Rights Reserved
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  * http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16
17 #include "log.h"
18 #include "events_ctrl.h"
19 #include "events_view.h"
20 #include "main_view.h"
21 #include "events.h"
22 #include "time_format.h"
23 #include "util_time.h"
24
25 #include <Ecore.h>
26 #include <time.h>
27 #include <app.h>
28
29 static Ecore_Event_Handler *events_handler;
30 static Evas_Object *main_view;
31
32 static Evas_Object *_lockscreen_events_view_ctrl_genlist_noti_content_get(void *data, Evas_Object *obj, const char *part);
33 static char *_lockscreen_events_view_ctrl_genlist_noti_text_get(void *data, Evas_Object *obj, const char *part);
34 static Evas_Object *_lockscreen_events_view_ctrl_genlist_widget_content_get(void *data, Evas_Object *obj, const char *part);
35
36 static Elm_Genlist_Item_Class noti_itc = {
37         .item_style = NOTI_ITEM_STYLE,
38         .func.content_get = _lockscreen_events_view_ctrl_genlist_noti_content_get,
39         .func.text_get = _lockscreen_events_view_ctrl_genlist_noti_text_get,
40 };
41
42 static Elm_Genlist_Item_Class widget_itc = {
43         .item_style = WIDGET_ITEM_STYLE,
44         .func.content_get = _lockscreen_events_view_ctrl_genlist_widget_content_get,
45 };
46
47 static Evas_Object *_lockscreen_events_view_ctrl_genlist_noti_content_get(void *data, Evas_Object *obj, const char *part)
48 {
49         Evas_Object *ret = NULL;
50         lockscreen_event_t *event = data;
51
52         if (!strcmp(part, NOTI_ITEM_ICON)) {
53                 ret = elm_icon_add(obj);
54                 elm_image_file_set(ret, lockscreen_event_icon_get(event), NULL);
55         }
56         else if (!strcmp(part, NOTI_ITEM_ICON_SUB)) {
57                 ret = elm_icon_add(obj);
58                 elm_image_file_set(ret, lockscreen_event_sub_icon_get(event), NULL);
59         }
60         return ret;
61 }
62
63 static char *_lockscreen_events_view_ctrl_genlist_noti_text_time_get(time_t time)
64 {
65         const char *locale = lockscreen_time_format_locale_get();
66         const char *timezone = lockscreen_time_format_timezone_get();
67         bool use24hformat = lockscreen_time_format_use_24h();
68         char *str_time, *str_meridiem;
69         char time_buf[PATH_MAX] = {0,};
70
71         if (!util_time_formatted_time_get(time, locale, timezone, use24hformat, &str_time, &str_meridiem)) {
72                 ERR("util_time_formatted_time_get failed");
73                 return NULL;
74         }
75
76         if (use24hformat) {
77                 snprintf(time_buf, sizeof(time_buf), "%s", str_time);
78         } else {
79                 snprintf(time_buf, sizeof(time_buf), "%s %s", str_time, str_meridiem);
80         }
81
82         free(str_time);
83         free(str_meridiem);
84         return strdup(time_buf);
85 }
86
87 static char *_lockscreen_events_view_ctrl_genlist_noti_text_get(void *data, Evas_Object *obj, const char *part)
88 {
89         lockscreen_event_t *event = data;
90         const char *val = NULL;
91
92         if (!strcmp(part, NOTI_ITEM_TEXT)) {
93                 val = lockscreen_event_title_get(event);
94         }
95         else if (!strcmp(part, NOTI_ITEM_TEXT_SUB)) {
96                 val = lockscreen_event_content_get(event);
97         }
98         else if (!strcmp(part, NOTI_ITEM_TEXT_TIME)) {
99                 val = _lockscreen_events_view_ctrl_genlist_noti_text_time_get(lockscreen_event_time_get(event));
100                 return (char*)val;
101         }
102         return val ? strdup(val) : NULL;
103 }
104
105 static Evas_Object *_lockscreen_events_view_ctrl_genlist_widget_content_get(void *data, Evas_Object *obj, const char *part)
106 {
107         lockscreen_event_t *event = data;
108
109         if (!strcmp(part, WIDGET_ITEM_CONTENT)) {
110                 return lockscreen_event_minicontroller_create(event, obj);
111         }
112         return NULL;
113 }
114
115 static void _lockscreen_events_view_close_all_button_clicked(void *data, Evas_Object *obj, void *event_info)
116 {
117         lockscreen_events_remove_all();
118 }
119
120 static void _lockscreen_events_ctrl_view_show()
121 {
122         Evas_Object *events_view = lockscreen_main_view_part_content_get(main_view, PART_EVENTS);
123         if (!events_view) {
124                 events_view = lockscreen_events_view_create(main_view);
125                 evas_object_smart_callback_add(events_view, SIGNAL_CLOSE_BUTTON_CLICKED, _lockscreen_events_view_close_all_button_clicked, NULL);
126                 lockscreen_main_view_part_content_set(main_view, PART_EVENTS, events_view);
127         }
128 }
129
130 static void _lockscreen_events_ctrl_view_hide()
131 {
132         Evas_Object *events_view = lockscreen_main_view_part_content_unset(main_view, PART_EVENTS);
133         if (events_view) {
134                 evas_object_del(events_view);
135         }
136 }
137
138 static int _lockscreen_events_ctrl_sort(const void *data1, const void *data2)
139 {
140         const lockscreen_event_t *event1 = data1;
141         const lockscreen_event_t *event2 = data2;
142
143         lockscreen_event_type_e type1 = lockscreen_event_type_get(event1);
144         lockscreen_event_type_e type2 = lockscreen_event_type_get(event2);
145
146         if (type1 != type2)
147                 return type1 > type2 ? -1 : 1;
148
149         time_t time1 = lockscreen_event_time_get(event1);
150         time_t time2 = lockscreen_event_time_get(event2);
151
152         return time1 > time2 ? -1 : 1;
153 }
154
155 static void _lockscreen_events_ctrl_main_view_unlocked(void *data, Evas_Object *obj, void *event_info)
156 {
157         ui_app_exit();
158 }
159
160 static void _lockscreen_events_ctrl_launch_result(bool result)
161 {
162         if (result) {
163                 evas_object_smart_callback_add(main_view, SIGNAL_UNLOCK_ANIMATION_FINISHED, _lockscreen_events_ctrl_main_view_unlocked, NULL);
164                 lockscreen_main_view_unlock(main_view);
165         } else {
166                 INF("Failed to launch application");
167         }
168 }
169
170 static void _lockscreen_events_ctrl_item_selected(void *data, Evas_Object *obj, void *info)
171 {
172         lockscreen_event_t *event = data;
173         lockscreen_event_launch(event, _lockscreen_events_ctrl_launch_result);
174 }
175
176 static void _lockscreen_events_ctrl_events_load()
177 {
178         lockscreen_event_t *event;
179
180         Evas_Object *genlist = lockscreen_events_genlist_get(lockscreen_main_view_part_content_get(main_view, PART_EVENTS));
181         if (!genlist) {
182                 FAT("lockscreen_events_genlist_get failed");
183                 return;
184         }
185
186         Eina_List *events = lockscreen_events_get();
187         events = eina_list_sort(events, -1, _lockscreen_events_ctrl_sort);
188         EINA_LIST_FREE(events, event) {
189                 lockscreen_event_type_e type = lockscreen_event_type_get(event);
190
191                 switch (type) {
192                         case LOCKSCREEN_EVENT_TYPE_NOTIFICATION:
193                                 elm_genlist_item_append(genlist, &noti_itc, event, NULL, ELM_GENLIST_ITEM_NONE, _lockscreen_events_ctrl_item_selected, event);
194                                 break;
195                         case LOCKSCREEN_EVENT_TYPE_MINICONTROLLER:
196                                 elm_genlist_item_append(genlist, &widget_itc, event, NULL, ELM_GENLIST_ITEM_NONE, NULL, NULL);
197                 }
198         }
199 }
200
201 static void _lockscreen_events_ctrl_events_unload()
202 {
203         Evas_Object *genlist = lockscreen_events_genlist_get(lockscreen_main_view_part_content_get(main_view, PART_EVENTS));
204         elm_genlist_clear(genlist);
205 }
206
207 static Eina_Bool _lockscreen_events_ctrl_events_changed(void *data, int event, void *event_info)
208 {
209         /* Improve load/unload in the future */
210         _lockscreen_events_ctrl_events_unload();
211
212         if (lockscreen_events_exists()) {
213                 _lockscreen_events_ctrl_view_show();
214                 _lockscreen_events_ctrl_events_load();
215         }
216         else {
217                 _lockscreen_events_ctrl_view_hide();
218         }
219
220         return EINA_TRUE;
221 }
222
223 int lockscreen_events_ctrl_init(Evas_Object *mv)
224 {
225         if (lockscreen_events_init()) {
226                 FAT("lockscreen_events_init failed.");
227                 return 1;
228         }
229
230         if (lockscreen_time_format_init()) {
231                 FAT("lockscreen_time_format_init failed.");
232                 lockscreen_events_shutdown();
233         }
234
235         main_view = mv;
236
237         events_handler = ecore_event_handler_add(LOCKSCREEN_EVENT_EVENTS_CHANGED, _lockscreen_events_ctrl_events_changed, NULL);
238
239         if (lockscreen_events_exists()) {
240                 _lockscreen_events_ctrl_view_show();
241         }
242         else
243                 _lockscreen_events_ctrl_view_hide();
244
245         return 0;
246 }
247
248 void lockscreen_events_ctrl_shutdown()
249 {
250         ecore_event_handler_del(events_handler);
251         lockscreen_events_shutdown();
252         lockscreen_time_format_shutdown();
253 }