[UI]Lockscreen for RSA
[apps/core/preloaded/lockscreen.git] / src / util.c
1 /*
2  * Copyright 2012  Samsung Electronics Co., Ltd
3  *
4  * Licensed under the Flora License, Version 1.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.tizenopensource.org/license
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 <Ecore_X.h>
18 #include <Elementary.h>
19 #include <utilX.h>
20 #include <vconf.h>
21 #include <vconf-keys.h>
22 #include <ail.h>
23
24 #include "util.h"
25 #include "info.h"
26 #include "bg.h"
27 #include "noti.h"
28
29 #define DEFAULT_BG_PATH     "/opt/share/settings/Wallpapers/Home_default.jpg"
30
31 static Evas_Coord pos_down_y = 0;
32
33 void _set_win_property(Evas_Object * win)
34 {
35         Ecore_X_Window xwin;
36
37         if (win == NULL) {
38                 LOGD("[Error:%s] Invalid argument: win is NULL", __func__);
39                 return;
40         }
41         xwin = elm_win_xwindow_get(win);
42         if (xwin == 0) {
43                 LOGD("[Error:%s] Cannot get xwindow", __func__);
44                 return;
45         }
46
47         ecore_x_netwm_window_type_set(xwin, ECORE_X_WINDOW_TYPE_NOTIFICATION);
48
49         utilx_set_system_notification_level(ecore_x_display_get(), xwin, UTILX_NOTIFICATION_LEVEL_NORMAL);
50
51         utilx_set_window_opaque_state(ecore_x_display_get(), xwin, UTILX_OPAQUE_STATE_ON);
52 }
53
54 Evas_Object *_add_layout(Evas_Object *parent, const char *file, const char *group)
55 {
56         if (parent == NULL)
57                 return NULL;
58
59         Evas_Object *ly;
60         int r;
61
62         ly = elm_layout_add(parent);
63         if (ly == NULL)
64                 return NULL;
65
66         r = elm_layout_file_set(ly, file, group);
67         if (!r) {
68                 evas_object_del(ly);
69                 return NULL;
70         }
71         evas_object_size_hint_weight_set(ly, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
72
73         evas_object_show(ly);
74
75         return ly;
76 }
77
78 Evas_Object *_make_top_layout(struct appdata *ad)
79 {
80         if (ad == NULL)
81                 return NULL;
82
83         Evas_Object *eo = NULL;
84         Evas_Object *conform = NULL;
85
86         conform = elm_conformant_add(ad->win);
87         if(conform == NULL) {
88                 return NULL;
89         }
90         elm_object_style_set(conform, "indicator_overlap");
91
92         eo = _add_layout(conform, EDJEFILE, "lock-main");
93         if (eo == NULL)
94                 return NULL;
95
96         evas_object_size_hint_weight_set(conform, EVAS_HINT_EXPAND,
97                                                  EVAS_HINT_EXPAND);
98         elm_win_resize_object_add(ad->win, conform);
99         elm_object_content_set(conform, eo);
100         evas_object_show(conform);
101         evas_object_resize(eo, ad->win_w, ad->win_h);
102
103         return eo;
104 }
105
106 Evas_Object *_make_slider(Evas_Object *parent)
107 {
108         Evas_Object *layout = NULL;
109
110         if (parent == NULL) {
111                 LOCK_SCREEN_TRACE_DBG("The parent of slider is null");
112                 return NULL;
113         }
114
115         layout = _add_layout(parent, EDJEFILE, "lock-slider");
116         if (layout == NULL) {
117                 return NULL;
118         }
119
120         return layout;
121 }
122
123 Evas_Object *_get_bg_image(Evas_Object *parent)
124 {
125         Evas_Object *bg = NULL;
126         char *file = NULL;
127         Eina_Bool ret = EINA_FALSE;
128
129         if (parent == NULL)
130                 return NULL;
131
132         if ((file = vconf_get_str(VCONFKEY_IDLE_LOCK_BGSET)) ==  NULL) {
133                 file = vconf_get_str(VCONFKEY_BGSET);
134         }
135
136         bg = elm_icon_add(parent);
137         if (bg == NULL)
138                 return NULL;
139         elm_icon_aspect_fixed_set(bg, EINA_FALSE);
140
141         if (file) {
142                 ret = elm_icon_file_set(bg, file, NULL);
143                 if (ret == EINA_FALSE) {
144                         elm_icon_file_set(bg, DEFAULT_BG_PATH, NULL);
145                 }
146                 free(file);
147         } else {
148                 elm_icon_file_set(bg, DEFAULT_BG_PATH, NULL);
149         }
150         return bg;
151 }
152
153 void lockscreen_info_show(struct appdata *ad)
154 {
155         if(ad == NULL){
156                 return;
157         }
158
159         edje_object_signal_emit(_EDJ(ad->ly_main), "show,text.area", "text.area");
160         edje_object_signal_emit(_EDJ(ad->ly_main), "show,sw.noti", "sw.noti");
161         edje_object_signal_emit(_EDJ(ad->ly_main), "show,sim.state", "sim.state");
162         edje_object_signal_emit(_EDJ(ad->ly_main), "show,rect.info", "rect.info");
163         if(ad->slider != NULL) {
164                 evas_object_show(ad->slider);
165         }
166 }
167
168 void lockscreen_info_hide(struct appdata *ad)
169 {
170         if(ad == NULL){
171                 return;
172         }
173
174         edje_object_signal_emit(_EDJ(ad->ly_main), "hide,text.area", "text.area");
175         edje_object_signal_emit(_EDJ(ad->ly_main), "hide,sw.noti", "sw.noti");
176         edje_object_signal_emit(_EDJ(ad->ly_main), "hide,sim.state", "sim.state");
177         edje_object_signal_emit(_EDJ(ad->ly_main), "hide,rect.info", "rect.info");
178         if(ad->slider != NULL) {
179                 evas_object_hide(ad->slider);
180         }
181 }
182
183 static void _set_sim_state(void *data)
184 {
185         struct appdata *ad = data;
186         if (ad == NULL)
187                 return;
188
189         int state = 0;
190         int ret = 0;
191         char *buf = NULL;
192
193         int service_type = VCONFKEY_TELEPHONY_SVCTYPE_NONE;
194
195         if(vconf_get_int(VCONFKEY_TELEPHONY_SVCTYPE, &service_type) != 0) {
196                 LOGD("fail to get VCONFKEY_TELEPHONY_SVCTYPE");
197         }
198
199         ret = (vconf_get_int(VCONFKEY_TELEPHONY_SPN_DISP_CONDITION, &state));
200         if (ret == 0) {
201                 LOGD("[%s:%d] VCONFKEY(%s) = %d", __func__, __LINE__, VCONFKEY_TELEPHONY_SPN_DISP_CONDITION, state);
202                 if (state != VCONFKEY_TELEPHONY_DISP_INVALID
203                         && service_type > VCONFKEY_TELEPHONY_SVCTYPE_SEARCH) {
204                         if (state & VCONFKEY_TELEPHONY_DISP_SPN) {
205                                 buf = vconf_get_str(VCONFKEY_TELEPHONY_SPN_NAME);
206                                 edje_object_part_text_set(_EDJ(ad->ly_main), "sim.state", buf);
207                         }
208
209                         if (state & VCONFKEY_TELEPHONY_DISP_PLMN) {
210                                 buf = vconf_get_str(VCONFKEY_TELEPHONY_NWNAME);
211                                 edje_object_part_text_set(_EDJ(ad->ly_main), "sim.state", buf);
212                         }
213                 } else {
214                         edje_object_part_text_set(_EDJ(ad->ly_main), "sim.state", "");
215                 }
216         }
217 }
218
219 static void _app_exit(void *data, Evas_Object *obj, const char *emission, const char *source)
220 {
221         struct appdata *ad = data;
222         _app_terminate(ad);
223 }
224
225 static Eina_Bool _init_widget_cb(void *data)
226 {
227         struct appdata *ad = data;
228         LOGD("[ == %s == ]", __func__);
229         if (ad == NULL)
230                 return ECORE_CALLBACK_CANCEL;
231
232         ad->slider = _make_slider(ad->ly_main);
233         evas_object_resize(ad->slider, ad->win_w, SLIDER_RATIO_H * ad->win_h);
234         evas_object_move(ad->slider, 0, SLIDER_RATIO_Y * ad->win_h);
235         evas_object_show(ad->slider);
236         evas_object_geometry_get(
237                         edje_object_part_object_get(_EDJ(ad->slider), "lock.wrapper.image.l"),
238                         &ad->slider_rel1.x, &ad->slider_rel1.y, &ad->slider_rel1.w,
239                         &ad->slider_rel1.h);
240         evas_object_geometry_get(
241                         edje_object_part_object_get(_EDJ(ad->slider), "lock.wrapper.image.r"),
242                         &ad->slider_rel2.x, &ad->slider_rel2.y, &ad->slider_rel2.w,
243                         &ad->slider_rel2.h);
244
245         _set_sim_state(ad);
246
247         ad->info = elm_layout_add(ad->win);
248         elm_layout_file_set(ad->info, EDJEFILE, "lock-info");
249         evas_object_show(ad->info);
250         elm_object_part_content_set(ad->ly_main, "rect.info", ad->info);
251         _set_info(ad);
252
253         int state = 0;
254         vconf_get_bool(VCONFKEY_LOCKSCREEN_EVENT_NOTIFICATION_DISPLAY, &state);
255         if(state){
256                 noti_process(ad);
257         }
258
259         evas_object_event_callback_add(ad->event_bg, EVAS_CALLBACK_MOUSE_DOWN, _mouse_down_cb_s, ad);
260         evas_object_event_callback_add(ad->event_bg, EVAS_CALLBACK_MOUSE_UP, _mouse_up_cb_s, ad);
261         evas_object_event_callback_add(ad->event_bg, EVAS_CALLBACK_MOUSE_MOVE, _mouse_move_cb_s, ad);
262
263         evas_object_event_callback_add(ad->slider, EVAS_CALLBACK_MOUSE_DOWN, _slider_down_cb, ad);
264         evas_object_event_callback_add(ad->slider, EVAS_CALLBACK_MOUSE_UP, _slider_up_cb, ad);
265         evas_object_event_callback_add(ad->slider, EVAS_CALLBACK_MOUSE_MOVE, _slider_move_cb, ad);
266
267         edje_object_signal_callback_add(_EDJ(ad->ly_main), "exit,app", "event", _app_exit, ad);
268
269         vconf_set_int(VCONFKEY_IDLE_LOCK_STATE, VCONFKEY_IDLE_LOCK);
270
271         return ECORE_CALLBACK_CANCEL;
272 }
273
274 int _app_create(struct appdata *ad)
275 {
276         if (ad == NULL)
277                 return -1;
278         LOGD("[ == %s == ]", __func__);
279
280         ecore_x_icccm_name_class_set(elm_win_xwindow_get(ad->win), "LOCK_SCREEN", "LOCK_SCREEN");
281         evas_object_show(ad->win);
282         _set_win_property(ad->win);
283
284         elm_win_indicator_mode_set(ad->win, ELM_WIN_INDICATOR_SHOW);
285
286         ad->ly_main = _make_top_layout(ad);
287         if (ad->ly_main == NULL)
288                 return -1;
289         ad->event_bg = _get_bg_image(ad->ly_main);
290         if (ad->event_bg == NULL)
291                 return -1;
292         elm_object_part_content_set(ad->ly_main, "sw.bg", ad->event_bg);
293
294         return 0;
295 }
296
297 int _app_reset(struct appdata *ad)
298 {
299         if (ad == NULL)
300                 return -1;
301
302         static int initted = 0;
303         if(initted == 0) {
304                 ecore_idler_add(_init_widget_cb, ad);
305                 initted = 1;
306         }
307
308         return 0;
309 }
310
311 int _app_resume(struct appdata *ad)
312 {
313         if (ad == NULL)
314                 return -1;
315
316         return 0;
317 }
318
319 int _app_terminate(struct appdata *ad)
320 {
321         vconf_set_int(VCONFKEY_IDLE_LOCK_STATE, VCONFKEY_IDLE_UNLOCK);
322
323         if (ad == NULL) {
324                 LOGD("[_app_terminate] Invalid argument : struct appdata is NULL\n");
325                 return -1;
326         }
327
328         LOGD("[%s] app termiante", __func__);
329         elm_exit();
330
331         return 0;
332 }