3 * Copyright (c) 2012 Samsung Electronics Co., Ltd.
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
9 * http://floralicense.org/license/
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.
17 #include <setting-display-wallpaper.h>
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);
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,
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 /* ***************************************************
39 ***************************************************/
41 static void __setting_display_wallpaper_vconf_change_cb(keynode_t *key, void *data)
44 setting_retm_if(data == NULL, "Data parameter is NULL");
45 SettingDisplayUG *ad = (SettingDisplayUG *)data;
47 char *vconf_name = vconf_keynode_get_name(key);
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;
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;
68 static int __setting_display_wallpaper_listen_vconf_change(void *data)
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);
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);
82 static int __setting_display_wallpaper_unlisten_vconf_change()
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);
93 static void __setting_display_wallpaper_imageviewer_ug_result_cb(ui_gadget_h ug, service_h result, void *priv)
97 retm_if(priv == NULL, "Data parameter is NULL");
99 SettingDisplayUG *ad = (SettingDisplayUG *) priv;
103 switch(ad->cur_sel) {
104 case WALLPAPER_CUR_SEL_HOME_SCREEN:
106 service_get_extra_data(result, "homescreen_path", &path);
108 ad->wallpaper_changed = EINA_FALSE;
113 case WALLPAPER_CUR_SEL_LOCK_SCREEN:
115 service_get_extra_data(result, "lockscreen_path", &path);
117 ad->wallpaper_changed = EINA_FALSE;
122 case WALLPAPER_CUR_SEL_HOME_AND_LOCK_SCREEN:
124 service_get_extra_data(result, "homescreen_path", &path);
126 ad->wallpaper_changed = EINA_FALSE;
129 service_get_extra_data(result, "lockscreen_path", &path);
131 ad->wallpaper_changed = EINA_FALSE;
137 ad->wallpaper_changed = EINA_FALSE;
141 ad->wallpaper_changed = EINA_TRUE;
145 static void __setting_display_wallpaper_imageviewer_ug_destroy_cb(ui_gadget_h ug, void *priv)
148 setting_retm_if(priv == NULL, "Data parameter is NULL");
149 SettingDisplayUG *ad = (SettingDisplayUG *) priv; /* ad is point to priv */
153 ad->ug_imageviewer = NULL;
156 if (ad->wallpaper_changed) {
157 if (ad->ug_gallery) {
158 ug_destroy(ad->ug_gallery);
159 ad->ug_gallery = NULL;
162 char text[MAX_DISPLAY_NAME_LEN_ON_UI +1] = {0, };
163 SETTING_TRACE("cur_sel = %d", ad->cur_sel);
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);
169 case WALLPAPER_CUR_SEL_LOCK_SCREEN:
170 snprintf(text, MAX_DISPLAY_NAME_LEN_ON_UI, "%s", SETTING_WALLPAPER_LOCK_SCREEN_CHANGED);
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);
176 ad->cur_sel = WALLPAPER_CUR_SEL_NONE;
180 setting_create_sel_info_popup(ad->view_layout,
181 &(ad->selInfoPop_layout),
183 elm_notify_timeout_set(ad->selInfoPop, SETTING_WALLPAPER_POPUP_TIMER);
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;
189 SETTING_TRACE("wallpaper not changed");
193 static void __setting_display_wallpaper_gallery_ug_result_cb(ui_gadget_h ug, service_h result, void *priv)
197 retm_if(priv == NULL, "Data parameter is NULL");
199 SettingDisplayUG *ad = (SettingDisplayUG *) priv;
203 service_get_extra_data(result, "path", &path);
204 setting_retm_if(path == NULL, "path is NULL");
207 if (service_create(&service)) {
211 service_add_extra_data(service, "Path", path);
212 service_add_extra_data(service, "View Mode", "SETAS");
214 SETTING_TRACE("Path = %s", path);
216 switch(ad->cur_sel) {
217 case WALLPAPER_CUR_SEL_HOME_SCREEN:
218 service_add_extra_data(service, "Setas type", SETTING_WALLPAPER_HOME_SCREEN);
220 case WALLPAPER_CUR_SEL_LOCK_SCREEN:
221 service_add_extra_data(service, "Setas type", SETTING_WALLPAPER_LOCK_SCREEN);
223 case WALLPAPER_CUR_SEL_HOME_AND_LOCK_SCREEN:
224 service_add_extra_data(service, "Setas type", SETTING_WALLPAPER_HOME_AND_LOCK);
227 service_destroy(service);
228 SETTING_TRACE_ERROR("ad->cur_sel is error");
232 struct ug_cbs *cbs = (struct ug_cbs *)calloc(1, sizeof(struct ug_cbs));
234 service_destroy(service);
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;
243 ad->ug_imageviewer = ug_create(ad->ug, "image-viewer-efl", UG_MODE_FULLVIEW, service, cbs);
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));
250 service_destroy(service);
255 static void __setting_display_wallpaper_gallery_ug_destroy_cb(ui_gadget_h ug, void *priv)
258 setting_retm_if(priv == NULL, "Data parameter is NULL");
259 SettingDisplayUG *ad = (SettingDisplayUG *) priv; /* ad is point to priv */
261 if (ad->ug_imageviewer == NULL) {
263 ad->ug_gallery = NULL;
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");
272 if (back_btn != NULL) {
273 elm_object_style_set(back_btn, NAVI_BACK_BUTTON_STYLE); /* take into effect */
277 static void __setting_display_wallpaper_ug_launch(void *data)
280 setting_retm_if(data == NULL, "Data parameter is NULL");
281 SettingDisplayUG *ad = (SettingDisplayUG *) data;
284 if (service_create(&svc)) {
288 service_add_extra_data(svc, "launch-type", "select-one");
289 service_add_extra_data(svc, "file-type", "image");
291 struct ug_cbs *cbs = (struct ug_cbs *)calloc(1, sizeof(struct ug_cbs));
293 service_destroy(svc);
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;
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);
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));
310 service_destroy(svc);
314 static void __setting_display_wallpaper_mouse_up_Gendial_list_cb(void *data, Evas_Object * obj, void *event_info)
317 setting_retm_if(data == NULL, "Data parameter is NULL");
318 setting_retm_if(event_info == NULL, "Invalid argument: event info is NULL");
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);
324 SettingDisplayUG *ad = (SettingDisplayUG *) data;
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);
341 static int setting_display_wallpaper_create(void *cb)
344 retv_if(cb == NULL, SETTING_GENERAL_ERR_NULL_DATA_PARAMETER);
346 SettingDisplayUG *ad = (SettingDisplayUG *) cb; /* ad is point to cb */
347 ad->cur_sel = WALLPAPER_CUR_SEL_NONE;
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 */
356 ad->ly_wall = setting_create_layout_navi_bar(ad->win_main_layout, ad->win_get,
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);
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);
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",
374 if (ad->data_home_screen) {
375 ad->data_home_screen->userdata = ad;
377 SETTING_TRACE_ERROR("ad->screen_reader is NULL");
378 return SETTING_RETURN_FAIL;
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",
387 if (ad->data_lock_screen) {
388 ad->data_lock_screen->userdata = ad;
390 SETTING_TRACE_ERROR("ad->screen_reader is NULL");
391 return SETTING_RETURN_FAIL;
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,
400 if (ad->data_home_lock_screen) {
401 ad->data_home_lock_screen->userdata = ad;
403 SETTING_TRACE_ERROR("ad->screen_reader is NULL");
404 return SETTING_RETURN_FAIL;
407 ad->wallpaper_changed = EINA_FALSE;
408 setting_view_display_wallpaper.is_create = 1;
410 __setting_display_wallpaper_listen_vconf_change(ad);
412 return SETTING_RETURN_SUCCESS;
415 static int setting_display_wallpaper_destroy(void *cb)
419 retv_if(cb == NULL, SETTING_GENERAL_ERR_NULL_DATA_PARAMETER);
421 SettingDisplayUG *ad = (SettingDisplayUG *) cb; /* ad is point to cb */
423 __setting_display_wallpaper_unlisten_vconf_change();
426 if (ad->selInfoPop) {
427 evas_object_del(ad->selInfoPop);
428 ad->selInfoPop = NULL;
431 if (ad->ly_wall != NULL) {
432 evas_object_del(ad->ly_wall);
435 setting_view_display_wallpaper.is_create = 0;
437 return SETTING_RETURN_SUCCESS;
440 static int setting_display_wallpaper_update(void *cb)
442 return SETTING_RETURN_SUCCESS;
445 static int setting_display_wallpaper_cleanup(void *cb)
448 return SETTING_RETURN_SUCCESS;
451 /* ***************************************************
455 ***************************************************/
457 /* ***************************************************
461 ***************************************************/
464 setting_display_wallpaper_click_softkey_cancel_cb(void *data, Evas_Object *obj,
469 retm_if(data == NULL, "Data parameter is NULL");
470 SettingDisplayUG *ad = (SettingDisplayUG *) data; /* ad is point to cb */
472 /* called when this shared gadget is terminated. similar with app_exit */
473 /* Send destroy request */
474 ug_destroy_me(ad->ug);