new release for RSA
[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
37 /* ***************************************************
38  *
39  *basic func
40  *
41  ***************************************************/
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
93 static void __destroy_gallery_ug_cb(ui_gadget_h ug, void *priv)
94 {
95         SETTING_TRACE_BEGIN;
96         setting_retm_if(priv == NULL, "Data parameter is NULL");
97         SettingDisplayUG *ad = (SettingDisplayUG *) priv;       /* ad is point to priv */
98
99         if (ug) {
100                 ug_destroy(ug);
101                 ad->ug_loading = NULL;
102         }
103
104         /* restore the '<-' button on the navigate bar */
105         Elm_Object_Item *navi_it = elm_naviframe_top_item_get(ad->navi_bar);
106         ret_if(!navi_it);
107         Evas_Object *back_btn = elm_object_item_part_content_get(navi_it, "prev_btn");
108
109         if (back_btn != NULL) {
110                 elm_object_style_set(back_btn, NAVI_BACK_BUTTON_STYLE); /* take into effect */
111         }
112
113         char text[MAX_DISPLAY_NAME_LEN_ON_UI +1] = {0, };
114         SETTING_TRACE("cur_sel = %d", ad->cur_sel);
115         switch(ad->cur_sel) {
116         case WALLPAPER_CUR_SEL_HOME_SCREEN:
117                 snprintf(text, MAX_DISPLAY_NAME_LEN_ON_UI, "%s", SETTING_WALLPAPER_HOME_SCREEN_CHANGED);
118                 break;
119         case WALLPAPER_CUR_SEL_LOCK_SCREEN:
120                 snprintf(text, MAX_DISPLAY_NAME_LEN_ON_UI, "%s", SETTING_WALLPAPER_LOCK_SCREEN_CHANGED);
121                 break;
122         case WALLPAPER_CUR_SEL_HOME_AND_LOCK_SCREEN:
123                 snprintf(text, MAX_DISPLAY_NAME_LEN_ON_UI, "%s", SETTING_WALLPAPER_HOME_AND_LOCK_SCREEN_CHANGED);
124                 break;
125         default:
126                 ad->cur_sel = WALLPAPER_CUR_SEL_NONE;
127                 return;
128         }
129
130         setting_create_sel_info_popup(ad->view_layout,
131                                       &(ad->selInfoPop_layout),
132                                       &(ad->selInfoPop));
133         elm_notify_timeout_set(ad->selInfoPop, 3);
134
135         edje_object_part_text_set(_EDJ(ad->selInfoPop_layout), "elm.text", text);
136         ad->cur_sel = WALLPAPER_CUR_SEL_NONE;
137 }
138
139 static void __setting_display_wallpaper_ug_launch(void *data)
140 {
141         SETTING_TRACE_BEGIN;
142         setting_retm_if(data == NULL, "Data parameter is NULL");
143         SettingDisplayUG *ad = (SettingDisplayUG *) data;
144
145         service_h svc;
146         if (service_create(&svc)) {
147                 return;
148         }
149
150         service_add_extra_data(svc, "launch-type", "select-setas");
151         service_add_extra_data(svc, "setas-type", "wallpaper");
152         service_add_extra_data(svc, "file-type", "image");
153
154         struct ug_cbs *cbs = (struct ug_cbs *)calloc(1, sizeof(struct ug_cbs));
155         if (!cbs) {
156                 service_destroy(svc);
157                 return;
158         }
159
160         cbs->layout_cb = setting_display_layout_ug_cb;
161         cbs->result_cb = NULL;
162         cbs->destroy_cb = __destroy_gallery_ug_cb;
163         cbs->priv = (void *)ad;
164
165         ad->ug_loading = ug_create(ad->ug, "gallery-efl", UG_MODE_FULLVIEW, svc, cbs);
166
167         if (NULL == ad->ug_loading) {   /* error handling */
168                 SETTING_TRACE_ERROR("NULL == ad->ug_loading");
169                 setting_create_simple_popup(ad, ad->win_get, NULL, _(UNSUPPORTED_FUNCTION));
170         }
171
172         service_destroy(svc);
173         FREE(cbs);
174 }
175
176 static void __setting_display_wallpaper_mouse_up_Gendial_list_cb(void *data, Evas_Object * obj, void *event_info)
177 {
178         //error check
179         setting_retm_if(data == NULL, "Data parameter is NULL");
180         setting_retm_if(event_info == NULL, "Invalid argument: event info is NULL");
181
182         Elm_Object_Item *item = (Elm_Object_Item *) event_info;
183         elm_genlist_item_selected_set(item, 0);
184         Setting_GenGroupItem_Data *list_item = (Setting_GenGroupItem_Data *) elm_object_item_data_get(item);
185
186         SettingDisplayUG *ad = (SettingDisplayUG *) data;
187
188         if (!safeStrCmp("IDS_ST_MBODY_HOME_SCREEN_WALLPAPER", list_item->keyStr)) {
189                 __setting_display_wallpaper_ug_launch(ad);
190         } else if (!safeStrCmp("IDS_ST_MBODY_LOCK_SCREEN_WALLPAPER_M_NOUN", list_item->keyStr)) {
191                 __setting_display_wallpaper_ug_launch(ad);
192         } else if (!safeStrCmp(SETTING_WALLPAPER_HOME_AND_LOCK_SCREEN, list_item->keyStr)) {
193                 __setting_display_wallpaper_ug_launch(ad);
194         } else {
195                 /* do nothing */
196         }
197
198 }
199
200 static int setting_display_wallpaper_create(void *cb)
201 {
202         SETTING_TRACE_BEGIN;
203         retv_if(cb == NULL, SETTING_GENERAL_ERR_NULL_DATA_PARAMETER);
204
205         SettingDisplayUG *ad = (SettingDisplayUG *) cb; /* ad is point to cb */
206         ad->cur_sel = WALLPAPER_CUR_SEL_NONE;
207
208         Evas_Object *view_layout = elm_layout_add(ad->win_main_layout);
209         elm_layout_file_set(view_layout, SETTING_THEME_EDJ_NAME, "selinfo_bottom");
210         evas_object_size_hint_weight_set(view_layout, EVAS_HINT_EXPAND, 0.0);
211         ad->view_layout = view_layout;
212
213         Evas_Object *controllbar = NULL;
214         Evas_Object *scroller = NULL;
215
216         ad->ly_wall = setting_create_layout_navi_bar(ad->win_main_layout, ad->win_get,
217                                            _(KeyStr_Wallpaper),
218                                            _("IDS_COM_BODY_BACK"), NULL, NULL,
219                                            setting_display_wallpaper_click_softkey_cancel_cb,
220                                            NULL, NULL, ad, view_layout,
221                                            &ad->navi_bar, &controllbar);
222
223         scroller = elm_genlist_add(ad->navi_bar);
224         elm_object_style_set(scroller, "dialogue");
225         retvm_if(scroller == NULL, SETTING_RETURN_FAIL, "Cannot set scroller object as contento of layout");
226         elm_genlist_clear(scroller);    /* first to clear list */
227         elm_object_part_content_set(view_layout, "elm.swallow.contents", scroller);
228
229         Elm_Object_Item *item = NULL;
230         item = elm_genlist_item_append(scroller, &(ad->itc_seperator), NULL, NULL,
231                                 ELM_GENLIST_ITEM_NONE, NULL, NULL);
232         elm_genlist_item_select_mode_set(item, ELM_OBJECT_SELECT_MODE_DISPLAY_ONLY);
233
234         ad->data_home_screen =
235                 setting_create_Gendial_field_def(scroller, &(ad->itc_1text),
236                                              __setting_display_wallpaper_mouse_up_Gendial_list_cb,
237                                              ad, SWALLOW_Type_INVALID, NULL,
238                                              NULL, 0, "IDS_ST_MBODY_HOME_SCREEN_WALLPAPER",
239                                              NULL, NULL);
240         if (ad->data_home_screen) {
241                 ad->data_home_screen->userdata = ad;
242         } else {
243                 SETTING_TRACE_ERROR("ad->screen_reader is NULL");
244                 return SETTING_RETURN_FAIL;
245         }
246
247         ad->data_lock_screen =
248                 setting_create_Gendial_field_def(scroller, &(ad->itc_1text),
249                                              __setting_display_wallpaper_mouse_up_Gendial_list_cb,
250                                              ad, SWALLOW_Type_INVALID, NULL,
251                                              NULL, 0, "IDS_ST_MBODY_LOCK_SCREEN_WALLPAPER_M_NOUN",
252                                              NULL, NULL);
253         if (ad->data_lock_screen) {
254                 ad->data_lock_screen->userdata = ad;
255         } else {
256                 SETTING_TRACE_ERROR("ad->screen_reader is NULL");
257                 return SETTING_RETURN_FAIL;
258         }
259
260         ad->data_home_lock_screen =
261                 setting_create_Gendial_field_def(scroller, &(ad->itc_1text),
262                                              __setting_display_wallpaper_mouse_up_Gendial_list_cb,
263                                              ad, SWALLOW_Type_INVALID, NULL,
264                                              NULL, 0, SETTING_WALLPAPER_HOME_AND_LOCK_SCREEN,
265                                              NULL, NULL);
266         if (ad->data_home_lock_screen) {
267                 ad->data_home_lock_screen->userdata = ad;
268         } else {
269                 SETTING_TRACE_ERROR("ad->screen_reader is NULL");
270                 return SETTING_RETURN_FAIL;
271         }
272
273         setting_view_display_wallpaper.is_create = 1;
274         __setting_display_wallpaper_listen_vconf_change(ad);
275         return SETTING_RETURN_SUCCESS;
276 }
277
278 static int setting_display_wallpaper_destroy(void *cb)
279 {
280         SETTING_TRACE_BEGIN;
281         /* error check */
282         retv_if(cb == NULL, SETTING_GENERAL_ERR_NULL_DATA_PARAMETER);
283
284         SettingDisplayUG *ad = (SettingDisplayUG *) cb; /* ad is point to cb */
285         __setting_display_wallpaper_unlisten_vconf_change();
286
287         if (ad->selInfoPop) {
288                 evas_object_del(ad->selInfoPop);
289                 ad->selInfoPop = NULL;
290         }
291
292         if (ad->ly_wall != NULL) {
293                 evas_object_del(ad->ly_wall);
294                 ad->ly_wall = NULL;
295         }
296         setting_view_display_wallpaper.is_create = 0;
297
298         return SETTING_RETURN_SUCCESS;
299 }
300
301 static int setting_display_wallpaper_update(void *cb)
302 {
303         return SETTING_RETURN_SUCCESS;
304 }
305
306 static int setting_display_wallpaper_cleanup(void *cb)
307 {
308         SETTING_TRACE_BEGIN;
309         return SETTING_RETURN_SUCCESS;
310 }
311
312 /* ***************************************************
313  *
314  *general func
315  *
316  ***************************************************/
317
318 /* ***************************************************
319  *
320  *call back func
321  *
322  ***************************************************/
323
324 static void
325 setting_display_wallpaper_click_softkey_cancel_cb(void *data, Evas_Object *obj,
326                                                   void *event_info)
327 {
328         SETTING_TRACE_BEGIN;
329         /* error check */
330         retm_if(data == NULL, "Data parameter is NULL");
331         SettingDisplayUG *ad = (SettingDisplayUG *) data;       /* ad is point to cb */
332
333         /*  called when this shared gadget is terminated. similar with app_exit */
334         /* Send destroy request */
335         ug_destroy_me(ad->ug);
336 }