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