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