Merge "packaging: spec cleanup" into tizen
[apps/core/preloaded/settings.git] / setting-display / src / setting-display-wallpaper.c
1 /*
2  * setting
3  * Copyright (c) 2012 Samsung Electronics Co., Ltd.
4  *
5  * Licensed under the Flora License, Version 1.1 (the License);
6  * you may not use this file except in compliance with the License.
7  * You may obtain a copy of the License at
8  *
9  *     http://floralicense.org/license/
10  *
11  * Unless required by applicable law or agreed to in writing, software
12  * distributed under the License is distributed on an AS IS BASIS,
13  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14  * See the License for the specific language governing permissions and
15  * limitations under the License.
16  */
17 #include <setting-display-wallpaper.h>
18 #include <Ecore_X.h>
19
20 static int setting_display_wallpaper_create(void *cb);
21 static int setting_display_wallpaper_destroy(void *cb);
22 static int setting_display_wallpaper_update(void *cb);
23 static int setting_display_wallpaper_cleanup(void *cb);
24
25 setting_view setting_view_display_wallpaper = {
26         .create = setting_display_wallpaper_create,
27         .destroy = setting_display_wallpaper_destroy,
28         .update = setting_display_wallpaper_update,
29         .cleanup = setting_display_wallpaper_cleanup,
30 };
31
32 #define SETTING_WALLPAPER_HOME_SCREEN "Wallpaper"      // ug-image-viewer parameter
33 #define SETTING_WALLPAPER_LOCK_SCREEN "Lockscreen"      // ug-image-viewer parameter
34 #define SETTING_WALLPAPER_HOME_AND_LOCK "Wallpaper & Lockscreen"        // ug-image-viewer parameter
35 #define SETTING_WALLPAPER_POPUP_TIMER 3
36 /* ***************************************************
37  *
38  *basic func
39  *
40  ***************************************************/
41 #if DISABLED_CODE
42 static void __setting_display_wallpaper_vconf_change_cb(keynode_t *key, void *data)
43 {
44         SETTING_TRACE_BEGIN;
45         setting_retm_if(data == NULL, "Data parameter is NULL");
46         SettingDisplayUG *ad = (SettingDisplayUG *)data;
47
48         char *vconf_name = vconf_keynode_get_name(key);
49
50         if (!safeStrCmp(vconf_name, VCONFKEY_BGSET)) {
51                 if (ad->cur_sel == WALLPAPER_CUR_SEL_LOCK_SCREEN) {
52                         ad->cur_sel = WALLPAPER_CUR_SEL_HOME_AND_LOCK_SCREEN;
53                 } else if (ad->cur_sel == WALLPAPER_CUR_SEL_NONE) {
54                         ad->cur_sel = WALLPAPER_CUR_SEL_HOME_SCREEN;
55                 } else {
56                         /* do nothing */
57                 }
58         } else if (!safeStrCmp(vconf_name, VCONFKEY_IDLE_LOCK_BGSET)) {
59                 if (ad->cur_sel == WALLPAPER_CUR_SEL_HOME_SCREEN) {
60                         ad->cur_sel = WALLPAPER_CUR_SEL_HOME_AND_LOCK_SCREEN;
61                 } else if (ad->cur_sel == WALLPAPER_CUR_SEL_NONE) {
62                         ad->cur_sel = WALLPAPER_CUR_SEL_LOCK_SCREEN;
63                 } else {
64                         /* do nothing */
65                 }
66         }
67 }
68
69 static int __setting_display_wallpaper_listen_vconf_change(void *data)
70 {
71         SETTING_TRACE_BEGIN;
72         int ret = 0;
73         ret = vconf_notify_key_changed(VCONFKEY_BGSET,
74                         __setting_display_wallpaper_vconf_change_cb, data);
75         setting_retvm_if(ret < 0, ret, "%s notifications Failed(%d)", (char *)VCONFKEY_BGSET, ret);
76
77         ret = vconf_notify_key_changed(VCONFKEY_IDLE_LOCK_BGSET,
78                         __setting_display_wallpaper_vconf_change_cb, data);
79         setting_retvm_if(ret < 0, ret, "%s notifications Failed(%d)", (char *)VCONFKEY_IDLE_LOCK_BGSET, ret);
80         return ret;
81 }
82
83 static int __setting_display_wallpaper_unlisten_vconf_change()
84 {
85         SETTING_TRACE_BEGIN;
86         (void)vconf_ignore_key_changed(VCONFKEY_BGSET,
87                                        __setting_display_wallpaper_vconf_change_cb);
88         (void)vconf_ignore_key_changed(VCONFKEY_IDLE_LOCK_BGSET,
89                                        __setting_display_wallpaper_vconf_change_cb);
90         return 0;
91 }
92 #endif
93
94 static void __setting_display_wallpaper_imageviewer_ug_result_cb(ui_gadget_h ug, service_h result, void *priv)
95 {
96         SETTING_TRACE_BEGIN;
97         /* error check */
98         retm_if(priv == NULL, "Data parameter is NULL");
99
100         SettingDisplayUG *ad = (SettingDisplayUG *) priv;
101
102         if (result) {
103                 char *path = NULL;
104                 switch(ad->cur_sel) {
105                 case WALLPAPER_CUR_SEL_HOME_SCREEN:
106                 {
107                         service_get_extra_data(result, "homescreen_path", &path);
108                         if (path == NULL) {
109                                 ad->wallpaper_changed = EINA_FALSE;
110                                 return;
111                         }
112                         break;
113                 }
114                 case WALLPAPER_CUR_SEL_LOCK_SCREEN:
115                 {
116                         service_get_extra_data(result, "lockscreen_path", &path);
117                         if (path == NULL) {
118                                 ad->wallpaper_changed = EINA_FALSE;
119                                 return;
120                         }
121                         break;
122                 }
123                 case WALLPAPER_CUR_SEL_HOME_AND_LOCK_SCREEN:
124                 {
125                         service_get_extra_data(result, "homescreen_path", &path);
126                         if (path == NULL) {
127                                 ad->wallpaper_changed = EINA_FALSE;
128                                 return;
129                         }
130                         service_get_extra_data(result, "lockscreen_path", &path);
131                         if (path == NULL) {
132                                 ad->wallpaper_changed = EINA_FALSE;
133                                 return;
134                         }
135                         break;
136                 }
137                 default:
138                         ad->wallpaper_changed = EINA_FALSE;
139                         return;
140                 }
141
142                 ad->wallpaper_changed = EINA_TRUE;
143         }
144 }
145
146 static void __setting_display_wallpaper_imageviewer_ug_destroy_cb(ui_gadget_h ug, void *priv)
147 {
148         SETTING_TRACE_BEGIN;
149         setting_retm_if(priv == NULL, "Data parameter is NULL");
150         SettingDisplayUG *ad = (SettingDisplayUG *) priv;       /* ad is point to priv */
151
152         if (ug) {
153                 ug_destroy(ug);
154                 ad->ug_imageviewer = NULL;
155         }
156
157         if (ad->wallpaper_changed) {
158                 if (ad->ug_gallery) {
159                         ug_destroy(ad->ug_gallery);
160                         ad->ug_gallery = NULL;
161                 }
162
163                 char text[MAX_DISPLAY_NAME_LEN_ON_UI +1] = {0, };
164                 SETTING_TRACE("cur_sel = %d", ad->cur_sel);
165
166                 switch(ad->cur_sel) {
167                 case WALLPAPER_CUR_SEL_HOME_SCREEN:
168                         snprintf(text, MAX_DISPLAY_NAME_LEN_ON_UI, "%s", SETTING_WALLPAPER_HOME_SCREEN_CHANGED);
169                         break;
170                 case WALLPAPER_CUR_SEL_LOCK_SCREEN:
171                         snprintf(text, MAX_DISPLAY_NAME_LEN_ON_UI, "%s", SETTING_WALLPAPER_LOCK_SCREEN_CHANGED);
172                         break;
173                 case WALLPAPER_CUR_SEL_HOME_AND_LOCK_SCREEN:
174                         snprintf(text, MAX_DISPLAY_NAME_LEN_ON_UI, "%s", SETTING_WALLPAPER_HOME_AND_LOCK_SCREEN_CHANGED);
175                         break;
176                 default:
177                         ad->cur_sel = WALLPAPER_CUR_SEL_NONE;
178                         return;
179                 }
180
181                 setting_create_sel_info_popup(ad->view_layout,
182                                               &(ad->selInfoPop_layout),
183                                               &(ad->selInfoPop));
184                 elm_notify_timeout_set(ad->selInfoPop, SETTING_WALLPAPER_POPUP_TIMER);
185
186                 edje_object_part_text_set(_EDJ(ad->selInfoPop_layout), "elm.text", text);
187                 ad->cur_sel = WALLPAPER_CUR_SEL_NONE;
188                 ad->wallpaper_changed = EINA_FALSE;
189         } else {
190                 SETTING_TRACE("wallpaper not changed");
191         }
192 }
193
194 static void __setting_display_wallpaper_gallery_ug_result_cb(ui_gadget_h ug, service_h result, void *priv)
195 {
196         SETTING_TRACE_BEGIN;
197         /* error check */
198         retm_if(priv == NULL, "Data parameter is NULL");
199
200         SettingDisplayUG *ad = (SettingDisplayUG *) priv;
201
202         if (result) {
203                 char *path = NULL;
204                 service_get_extra_data(result, "path", &path);
205                 setting_retm_if(path == NULL, "path is NULL");
206
207                 service_h service;
208                 if (service_create(&service)) {
209                         return;
210                 }
211
212                 service_add_extra_data(service, "Path", path);
213                 service_add_extra_data(service, "View Mode", "SETAS");
214
215                 SETTING_TRACE("Path = %s", path);
216
217                 switch(ad->cur_sel) {
218                 case WALLPAPER_CUR_SEL_HOME_SCREEN:
219                         service_add_extra_data(service, "Setas type", SETTING_WALLPAPER_HOME_SCREEN);
220                         break;
221                 case WALLPAPER_CUR_SEL_LOCK_SCREEN:
222                         service_add_extra_data(service, "Setas type", SETTING_WALLPAPER_LOCK_SCREEN);
223                         break;
224                 case WALLPAPER_CUR_SEL_HOME_AND_LOCK_SCREEN:
225                         service_add_extra_data(service, "Setas type", SETTING_WALLPAPER_HOME_AND_LOCK);
226                         break;
227                 default:
228                         service_destroy(service);
229                         SETTING_TRACE_ERROR("ad->cur_sel is error");
230                         return;
231                 }
232
233                 struct ug_cbs *cbs = (struct ug_cbs *)calloc(1, sizeof(struct ug_cbs));
234                 if (!cbs) {
235                         service_destroy(service);
236                         return;
237                 }
238
239                 cbs->layout_cb = setting_display_layout_ug_cb;
240                 cbs->result_cb = __setting_display_wallpaper_imageviewer_ug_result_cb;
241                 cbs->destroy_cb = __setting_display_wallpaper_imageviewer_ug_destroy_cb;
242                 cbs->priv = (void *)ad;
243
244                 ad->ug_imageviewer = ug_create(ad->ug, "image-viewer-efl", UG_MODE_FULLVIEW, service, cbs);
245
246                 if (NULL == ad->ug_imageviewer) {       /* error handling */
247                         SETTING_TRACE_ERROR("NULL == ad->ug_imageviewer");
248                         setting_create_simple_popup(ad, ad->win_get, NULL, _(UNSUPPORTED_FUNCTION));
249                 }
250
251                 service_destroy(service);
252                 FREE(cbs);
253         }
254 }
255
256 static void __setting_display_wallpaper_gallery_ug_destroy_cb(ui_gadget_h ug, void *priv)
257 {
258         SETTING_TRACE_BEGIN;
259         setting_retm_if(priv == NULL, "Data parameter is NULL");
260         SettingDisplayUG *ad = (SettingDisplayUG *) priv;       /* ad is point to priv */
261
262         if (ad->ug_imageviewer == NULL) {
263                 ug_destroy(ug);
264                 ad->ug_gallery = NULL;
265         } else {
266                 return;
267         }
268
269         Elm_Object_Item *navi_it = elm_naviframe_top_item_get(ad->navi_bar);
270         retm_if(navi_it == NULL, "navi_it is NULL");
271         Evas_Object *back_btn = elm_object_item_part_content_get(navi_it, "prev_btn");
272
273         if (back_btn != NULL) {
274                 elm_object_style_set(back_btn, NAVI_BACK_BUTTON_STYLE); /* take into effect */
275         }
276 }
277
278 static void __setting_display_wallpaper_ug_launch(void *data)
279 {
280         SETTING_TRACE_BEGIN;
281         setting_retm_if(data == NULL, "Data parameter is NULL");
282         SettingDisplayUG *ad = (SettingDisplayUG *) data;
283
284         service_h svc;
285         if (service_create(&svc)) {
286                 return;
287         }
288
289         service_add_extra_data(svc, "launch-type", "select-one");
290         service_add_extra_data(svc, "file-type", "image");
291
292         struct ug_cbs *cbs = (struct ug_cbs *)calloc(1, sizeof(struct ug_cbs));
293         if (!cbs) {
294                 service_destroy(svc);
295                 return;
296         }
297
298         cbs->layout_cb = setting_display_layout_ug_cb;
299         cbs->result_cb = __setting_display_wallpaper_gallery_ug_result_cb;
300         cbs->destroy_cb = __setting_display_wallpaper_gallery_ug_destroy_cb;
301         cbs->priv = (void *)ad;
302
303         ad->ug_gallery = ug_create(ad->ug, "gallery-efl", UG_MODE_FULLVIEW, svc, cbs);
304         SETTING_TRACE("ad->ug_gallery = %p", ad->ug_gallery);
305
306         if (NULL == ad->ug_gallery) {   /* error handling */
307                 SETTING_TRACE_ERROR("NULL == ad->ug_gallery");
308                 setting_create_simple_popup(ad, ad->win_get, NULL, _(UNSUPPORTED_FUNCTION));
309         }
310
311         service_destroy(svc);
312         FREE(cbs);
313 }
314
315 static void __setting_display_wallpaper_mouse_up_Gendial_list_cb(void *data, Evas_Object * obj, void *event_info)
316 {
317         //error check
318         setting_retm_if(data == NULL, "Data parameter is NULL");
319         setting_retm_if(event_info == NULL, "Invalid argument: event info is NULL");
320
321         Elm_Object_Item *item = (Elm_Object_Item *) event_info;
322         elm_genlist_item_selected_set(item, 0);
323         Setting_GenGroupItem_Data *list_item = (Setting_GenGroupItem_Data *) elm_object_item_data_get(item);
324
325         SettingDisplayUG *ad = (SettingDisplayUG *) data;
326
327         if (!safeStrCmp("IDS_ST_MBODY_HOME_SCREEN_WALLPAPER", list_item->keyStr)) {
328                 ad->cur_sel = WALLPAPER_CUR_SEL_HOME_SCREEN;
329                 __setting_display_wallpaper_ug_launch(ad);
330         } else if (!safeStrCmp("IDS_ST_MBODY_LOCK_SCREEN_WALLPAPER_M_NOUN", list_item->keyStr)) {
331                 ad->cur_sel = WALLPAPER_CUR_SEL_LOCK_SCREEN;
332                 __setting_display_wallpaper_ug_launch(ad);
333         } else if (!safeStrCmp(SETTING_WALLPAPER_HOME_AND_LOCK_SCREEN, list_item->keyStr)) {
334                 ad->cur_sel = WALLPAPER_CUR_SEL_HOME_AND_LOCK_SCREEN;
335                 __setting_display_wallpaper_ug_launch(ad);
336         } else {
337                 /* do nothing */
338         }
339
340 }
341
342 static int setting_display_wallpaper_create(void *cb)
343 {
344         SETTING_TRACE_BEGIN;
345         retv_if(cb == NULL, SETTING_GENERAL_ERR_NULL_DATA_PARAMETER);
346
347         SettingDisplayUG *ad = (SettingDisplayUG *) cb; /* ad is point to cb */
348         ad->cur_sel = WALLPAPER_CUR_SEL_NONE;
349
350         Evas_Object *controllbar = NULL;
351         Evas_Object *scroller = NULL;
352         scroller = elm_genlist_add(ad->win_main_layout);
353         elm_object_style_set(scroller, "dialogue");
354         retvm_if(scroller == NULL, SETTING_RETURN_FAIL, "Cannot set scroller object as contento of layout");
355         elm_genlist_clear(scroller);    /* first to clear list */
356
357         ad->ly_wall = setting_create_layout_navi_bar(ad->win_main_layout, ad->win_get,
358                                            _(KeyStr_Wallpaper),
359                                            _("IDS_COM_BODY_BACK"), NULL, NULL,
360                                            setting_display_wallpaper_click_softkey_cancel_cb,
361                                            NULL, NULL, ad, scroller,
362                                            &ad->navi_bar, &controllbar);
363
364         Elm_Object_Item *item = NULL;
365         item = elm_genlist_item_append(scroller, &(ad->itc_seperator), NULL, NULL,
366                                 ELM_GENLIST_ITEM_NONE, NULL, NULL);
367         elm_genlist_item_select_mode_set(item, ELM_OBJECT_SELECT_MODE_DISPLAY_ONLY);
368
369         ad->data_home_screen =
370                 setting_create_Gendial_field_def(scroller, &(ad->itc_1text),
371                                              __setting_display_wallpaper_mouse_up_Gendial_list_cb,
372                                              ad, SWALLOW_Type_INVALID, NULL,
373                                              NULL, 0, "IDS_ST_MBODY_HOME_SCREEN_WALLPAPER",
374                                              NULL, NULL);
375         if (ad->data_home_screen) {
376                 ad->data_home_screen->userdata = ad;
377         } else {
378                 SETTING_TRACE_ERROR("ad->screen_reader is NULL");
379                 return SETTING_RETURN_FAIL;
380         }
381
382         ad->data_lock_screen =
383                 setting_create_Gendial_field_def(scroller, &(ad->itc_1text),
384                                              __setting_display_wallpaper_mouse_up_Gendial_list_cb,
385                                              ad, SWALLOW_Type_INVALID, NULL,
386                                              NULL, 0, "IDS_ST_MBODY_LOCK_SCREEN_WALLPAPER_M_NOUN",
387                                              NULL, NULL);
388         if (ad->data_lock_screen) {
389                 ad->data_lock_screen->userdata = ad;
390         } else {
391                 SETTING_TRACE_ERROR("ad->screen_reader is NULL");
392                 return SETTING_RETURN_FAIL;
393         }
394
395         ad->data_home_lock_screen =
396                 setting_create_Gendial_field_def(scroller, &(ad->itc_1text),
397                                              __setting_display_wallpaper_mouse_up_Gendial_list_cb,
398                                              ad, SWALLOW_Type_INVALID, NULL,
399                                              NULL, 0, SETTING_WALLPAPER_HOME_AND_LOCK_SCREEN,
400                                              NULL, NULL);
401         if (ad->data_home_lock_screen) {
402                 ad->data_home_lock_screen->userdata = ad;
403         } else {
404                 SETTING_TRACE_ERROR("ad->screen_reader is NULL");
405                 return SETTING_RETURN_FAIL;
406         }
407
408         ad->wallpaper_changed = EINA_FALSE;
409         setting_view_display_wallpaper.is_create = 1;
410 #if DISABLED_CODE
411         __setting_display_wallpaper_listen_vconf_change(ad);
412 #endif
413         return SETTING_RETURN_SUCCESS;
414 }
415
416 static int setting_display_wallpaper_destroy(void *cb)
417 {
418         SETTING_TRACE_BEGIN;
419         /* error check */
420         retv_if(cb == NULL, SETTING_GENERAL_ERR_NULL_DATA_PARAMETER);
421
422         SettingDisplayUG *ad = (SettingDisplayUG *) cb; /* ad is point to cb */
423 #if DISABLED_CODE
424         __setting_display_wallpaper_unlisten_vconf_change();
425 #endif
426
427         if (ad->selInfoPop) {
428                 evas_object_del(ad->selInfoPop);
429                 ad->selInfoPop = NULL;
430         }
431
432         if (ad->ly_wall != NULL) {
433                 evas_object_del(ad->ly_wall);
434                 ad->ly_wall = NULL;
435         }
436         setting_view_display_wallpaper.is_create = 0;
437
438         return SETTING_RETURN_SUCCESS;
439 }
440
441 static int setting_display_wallpaper_update(void *cb)
442 {
443         return SETTING_RETURN_SUCCESS;
444 }
445
446 static int setting_display_wallpaper_cleanup(void *cb)
447 {
448         SETTING_TRACE_BEGIN;
449         return SETTING_RETURN_SUCCESS;
450 }
451
452 /* ***************************************************
453  *
454  *general func
455  *
456  ***************************************************/
457
458 /* ***************************************************
459  *
460  *call back func
461  *
462  ***************************************************/
463
464 static void
465 setting_display_wallpaper_click_softkey_cancel_cb(void *data, Evas_Object *obj,
466                                                   void *event_info)
467 {
468         SETTING_TRACE_BEGIN;
469         /* error check */
470         retm_if(data == NULL, "Data parameter is NULL");
471         SettingDisplayUG *ad = (SettingDisplayUG *) data;       /* ad is point to cb */
472
473         /*  called when this shared gadget is terminated. similar with app_exit */
474         /* Send destroy request */
475         ug_destroy_me(ad->ug);
476 }