4 * Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd.
6 * Contact: MyoungJune Park <mj2004.park@samsung.com>
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
12 * http://www.apache.org/licenses/LICENSE-2.0
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.
21 #include <setting-display-wallpaper.h>
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);
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,
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 /* ***************************************************
44 ***************************************************/
46 static void __setting_display_wallpaper_vconf_change_cb(keynode_t *key, void *data)
49 setting_retm_if(data == NULL, "Data parameter is NULL");
50 SettingDisplayUG *ad = (SettingDisplayUG *)data;
52 char *vconf_name = vconf_keynode_get_name(key);
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;
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;
73 static int __setting_display_wallpaper_listen_vconf_change(void *data)
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);
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);
87 static int __setting_display_wallpaper_unlisten_vconf_change()
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);
98 static void __setting_display_wallpaper_imageviewer_ug_result_cb(ui_gadget_h ug, service_h result, void *priv)
102 retm_if(priv == NULL, "Data parameter is NULL");
104 SettingDisplayUG *ad = (SettingDisplayUG *) priv;
108 switch(ad->cur_sel) {
109 case WALLPAPER_CUR_SEL_HOME_SCREEN:
111 service_get_extra_data(result, "homescreen_path", &path);
113 ad->wallpaper_changed = EINA_FALSE;
118 case WALLPAPER_CUR_SEL_LOCK_SCREEN:
120 service_get_extra_data(result, "lockscreen_path", &path);
122 ad->wallpaper_changed = EINA_FALSE;
127 case WALLPAPER_CUR_SEL_HOME_AND_LOCK_SCREEN:
129 service_get_extra_data(result, "homescreen_path", &path);
131 ad->wallpaper_changed = EINA_FALSE;
134 service_get_extra_data(result, "lockscreen_path", &path);
136 ad->wallpaper_changed = EINA_FALSE;
142 ad->wallpaper_changed = EINA_FALSE;
146 ad->wallpaper_changed = EINA_TRUE;
150 static void __setting_display_wallpaper_imageviewer_ug_destroy_cb(ui_gadget_h ug, void *priv)
153 setting_retm_if(priv == NULL, "Data parameter is NULL");
154 SettingDisplayUG *ad = (SettingDisplayUG *) priv; /* ad is point to priv */
158 ad->ug_imageviewer = NULL;
161 if (ad->wallpaper_changed) {
162 if (ad->ug_gallery) {
163 ug_destroy(ad->ug_gallery);
164 ad->ug_gallery = NULL;
167 char text[MAX_DISPLAY_NAME_LEN_ON_UI +1] = {0, };
168 SETTING_TRACE("cur_sel = %d", ad->cur_sel);
170 switch(ad->cur_sel) {
171 case WALLPAPER_CUR_SEL_HOME_SCREEN:
172 snprintf(text, MAX_DISPLAY_NAME_LEN_ON_UI, "%s", SETTING_WALLPAPER_HOME_SCREEN_CHANGED);
174 case WALLPAPER_CUR_SEL_LOCK_SCREEN:
175 snprintf(text, MAX_DISPLAY_NAME_LEN_ON_UI, "%s", SETTING_WALLPAPER_LOCK_SCREEN_CHANGED);
177 case WALLPAPER_CUR_SEL_HOME_AND_LOCK_SCREEN:
178 snprintf(text, MAX_DISPLAY_NAME_LEN_ON_UI, "%s", SETTING_WALLPAPER_HOME_AND_LOCK_SCREEN_CHANGED);
181 ad->cur_sel = WALLPAPER_CUR_SEL_NONE;
185 setting_create_sel_info_popup(ad->view_layout,
186 &(ad->selInfoPop_layout),
188 elm_notify_timeout_set(ad->selInfoPop, SETTING_WALLPAPER_POPUP_TIMER);
190 edje_object_part_text_set(_EDJ(ad->selInfoPop_layout), "elm.text", text);
191 ad->cur_sel = WALLPAPER_CUR_SEL_NONE;
192 ad->wallpaper_changed = EINA_FALSE;
194 SETTING_TRACE("wallpaper not changed");
198 static void __setting_display_wallpaper_gallery_ug_result_cb(ui_gadget_h ug, service_h result, void *priv)
202 retm_if(priv == NULL, "Data parameter is NULL");
204 SettingDisplayUG *ad = (SettingDisplayUG *) priv;
208 service_get_extra_data(result, "path", &path);
209 setting_retm_if(path == NULL, "path is NULL");
212 if (service_create(&service)) {
216 service_add_extra_data(service, "Path", path);
217 service_add_extra_data(service, "View Mode", "SETAS");
219 SETTING_TRACE("Path = %s", path);
221 switch(ad->cur_sel) {
222 case WALLPAPER_CUR_SEL_HOME_SCREEN:
223 service_add_extra_data(service, "Setas type", SETTING_WALLPAPER_HOME_SCREEN);
225 case WALLPAPER_CUR_SEL_LOCK_SCREEN:
226 service_add_extra_data(service, "Setas type", SETTING_WALLPAPER_LOCK_SCREEN);
228 case WALLPAPER_CUR_SEL_HOME_AND_LOCK_SCREEN:
229 service_add_extra_data(service, "Setas type", SETTING_WALLPAPER_HOME_AND_LOCK);
232 service_destroy(service);
233 SETTING_TRACE_ERROR("ad->cur_sel is error");
237 struct ug_cbs *cbs = (struct ug_cbs *)calloc(1, sizeof(struct ug_cbs));
238 setting_retm_if(cbs == NULL, "calloc failed");
240 cbs->layout_cb = setting_display_layout_ug_cb;
241 cbs->result_cb = __setting_display_wallpaper_imageviewer_ug_result_cb;
242 cbs->destroy_cb = __setting_display_wallpaper_imageviewer_ug_destroy_cb;
243 cbs->priv = (void *)ad;
245 ad->ug_imageviewer = ug_create(ad->ug_gallery, "image-viewer-efl", UG_MODE_FULLVIEW, service, cbs);
247 if (NULL == ad->ug_imageviewer) { /* error handling */
248 SETTING_TRACE_ERROR("NULL == ad->ug_imageviewer");
249 setting_create_simple_popup(ad, ad->win_get, NULL, _(UNSUPPORTED_FUNCTION));
252 service_destroy(service);
257 static void __setting_display_wallpaper_gallery_ug_destroy_cb(ui_gadget_h ug, void *priv)
260 setting_retm_if(priv == NULL, "Data parameter is NULL");
261 SettingDisplayUG *ad = (SettingDisplayUG *) priv; /* ad is point to priv */
263 if (ad->ug_imageviewer == NULL) {
265 ad->ug_gallery = NULL;
270 Elm_Object_Item *navi_it = elm_naviframe_top_item_get(ad->navi_bar);
271 retm_if(navi_it == NULL, "navi_it is NULL");
272 Evas_Object *back_btn = elm_object_item_part_content_get(navi_it, "prev_btn");
274 if (back_btn != NULL) {
275 elm_object_style_set(back_btn, NAVI_BACK_BUTTON_STYLE); /* take into effect */
279 static void __setting_display_wallpaper_ug_launch(void *data)
282 setting_retm_if(data == NULL, "Data parameter is NULL");
283 SettingDisplayUG *ad = (SettingDisplayUG *) data;
286 if (service_create(&svc)) {
290 service_add_extra_data(svc, "launch-type", "select-one");
291 service_add_extra_data(svc, "file-type", "image");
293 struct ug_cbs *cbs = (struct ug_cbs *)calloc(1, sizeof(struct ug_cbs));
295 service_destroy(svc);
299 cbs->layout_cb = setting_display_layout_ug_cb;
300 cbs->result_cb = __setting_display_wallpaper_gallery_ug_result_cb;
301 cbs->destroy_cb = __setting_display_wallpaper_gallery_ug_destroy_cb;
302 cbs->priv = (void *)ad;
304 ad->ug_gallery = ug_create(ad->ug, "gallery-efl", UG_MODE_FULLVIEW, svc, cbs);
305 SETTING_TRACE("ad->ug_gallery = %p", ad->ug_gallery);
307 if (NULL == ad->ug_gallery) { /* error handling */
308 SETTING_TRACE_ERROR("NULL == ad->ug_gallery");
309 setting_create_simple_popup(ad, ad->win_get, NULL, _(UNSUPPORTED_FUNCTION));
312 service_destroy(svc);
316 static void __setting_display_wallpaper_mouse_up_Gendial_list_cb(void *data, Evas_Object * obj, void *event_info)
319 setting_retm_if(data == NULL, "Data parameter is NULL");
320 setting_retm_if(event_info == NULL, "Invalid argument: event info is NULL");
322 Elm_Object_Item *item = (Elm_Object_Item *) event_info;
323 elm_genlist_item_selected_set(item, 0);
324 Setting_GenGroupItem_Data *list_item = (Setting_GenGroupItem_Data *) elm_object_item_data_get(item);
326 SettingDisplayUG *ad = (SettingDisplayUG *) data;
328 if (!safeStrCmp("IDS_ST_MBODY_HOME_SCREEN_WALLPAPER", list_item->keyStr)) {
329 ad->cur_sel = WALLPAPER_CUR_SEL_HOME_SCREEN;
330 __setting_display_wallpaper_ug_launch(ad);
331 } else if (!safeStrCmp("IDS_ST_MBODY_LOCK_SCREEN_WALLPAPER_M_NOUN", list_item->keyStr)) {
332 ad->cur_sel = WALLPAPER_CUR_SEL_LOCK_SCREEN;
333 __setting_display_wallpaper_ug_launch(ad);
334 } else if (!safeStrCmp(SETTING_WALLPAPER_HOME_AND_LOCK_SCREEN, list_item->keyStr)) {
335 ad->cur_sel = WALLPAPER_CUR_SEL_HOME_AND_LOCK_SCREEN;
336 __setting_display_wallpaper_ug_launch(ad);
343 static int setting_display_wallpaper_create(void *cb)
346 retv_if(cb == NULL, SETTING_GENERAL_ERR_NULL_DATA_PARAMETER);
348 SettingDisplayUG *ad = (SettingDisplayUG *) cb; /* ad is point to cb */
349 ad->cur_sel = WALLPAPER_CUR_SEL_NONE;
351 Evas_Object *view_layout = elm_layout_add(ad->win_main_layout);
352 elm_layout_file_set(view_layout, SETTING_THEME_EDJ_NAME, "selinfo_bottom");
353 evas_object_size_hint_weight_set(view_layout, EVAS_HINT_EXPAND, 0.0);
354 ad->view_layout = view_layout;
356 Evas_Object *controllbar = NULL;
357 Evas_Object *scroller = NULL;
359 ad->ly_wall = setting_create_layout_navi_bar(ad->win_main_layout, ad->win_get,
361 _("IDS_COM_BODY_BACK"), NULL, NULL,
362 setting_display_wallpaper_click_softkey_cancel_cb,
363 NULL, NULL, ad, view_layout,
364 &ad->navi_bar, &controllbar);
366 scroller = elm_genlist_add(ad->navi_bar);
367 elm_object_style_set(scroller, "dialogue");
368 retvm_if(scroller == NULL, SETTING_RETURN_FAIL, "Cannot set scroller object as contento of layout");
369 elm_genlist_clear(scroller); /* first to clear list */
370 elm_object_part_content_set(view_layout, "elm.swallow.contents", scroller);
372 Elm_Object_Item *item = NULL;
373 item = elm_genlist_item_append(scroller, &(ad->itc_seperator), NULL, NULL,
374 ELM_GENLIST_ITEM_NONE, NULL, NULL);
375 elm_genlist_item_select_mode_set(item, ELM_OBJECT_SELECT_MODE_DISPLAY_ONLY);
377 ad->data_home_screen =
378 setting_create_Gendial_field_def(scroller, &(ad->itc_1text),
379 __setting_display_wallpaper_mouse_up_Gendial_list_cb,
380 ad, SWALLOW_Type_INVALID, NULL,
381 NULL, 0, "IDS_ST_MBODY_HOME_SCREEN_WALLPAPER",
383 if (ad->data_home_screen) {
384 ad->data_home_screen->userdata = ad;
386 SETTING_TRACE_ERROR("ad->screen_reader is NULL");
387 return SETTING_RETURN_FAIL;
390 ad->data_lock_screen =
391 setting_create_Gendial_field_def(scroller, &(ad->itc_1text),
392 __setting_display_wallpaper_mouse_up_Gendial_list_cb,
393 ad, SWALLOW_Type_INVALID, NULL,
394 NULL, 0, "IDS_ST_MBODY_LOCK_SCREEN_WALLPAPER_M_NOUN",
396 if (ad->data_lock_screen) {
397 ad->data_lock_screen->userdata = ad;
399 SETTING_TRACE_ERROR("ad->screen_reader is NULL");
400 return SETTING_RETURN_FAIL;
403 ad->data_home_lock_screen =
404 setting_create_Gendial_field_def(scroller, &(ad->itc_1text),
405 __setting_display_wallpaper_mouse_up_Gendial_list_cb,
406 ad, SWALLOW_Type_INVALID, NULL,
407 NULL, 0, SETTING_WALLPAPER_HOME_AND_LOCK_SCREEN,
409 if (ad->data_home_lock_screen) {
410 ad->data_home_lock_screen->userdata = ad;
412 SETTING_TRACE_ERROR("ad->screen_reader is NULL");
413 return SETTING_RETURN_FAIL;
416 ad->wallpaper_changed = EINA_FALSE;
417 setting_view_display_wallpaper.is_create = 1;
419 __setting_display_wallpaper_listen_vconf_change(ad);
421 return SETTING_RETURN_SUCCESS;
424 static int setting_display_wallpaper_destroy(void *cb)
428 retv_if(cb == NULL, SETTING_GENERAL_ERR_NULL_DATA_PARAMETER);
430 SettingDisplayUG *ad = (SettingDisplayUG *) cb; /* ad is point to cb */
432 __setting_display_wallpaper_unlisten_vconf_change();
435 if (ad->selInfoPop) {
436 evas_object_del(ad->selInfoPop);
437 ad->selInfoPop = NULL;
440 if (ad->ly_wall != NULL) {
441 evas_object_del(ad->ly_wall);
444 setting_view_display_wallpaper.is_create = 0;
446 return SETTING_RETURN_SUCCESS;
449 static int setting_display_wallpaper_update(void *cb)
451 return SETTING_RETURN_SUCCESS;
454 static int setting_display_wallpaper_cleanup(void *cb)
457 return SETTING_RETURN_SUCCESS;
460 /* ***************************************************
464 ***************************************************/
466 /* ***************************************************
470 ***************************************************/
473 setting_display_wallpaper_click_softkey_cancel_cb(void *data, Evas_Object *obj,
478 retm_if(data == NULL, "Data parameter is NULL");
479 SettingDisplayUG *ad = (SettingDisplayUG *) data; /* ad is point to cb */
481 /* called when this shared gadget is terminated. similar with app_exit */
482 /* Send destroy request */
483 ug_destroy_me(ad->ug);