tizen 2.3.1 release
[apps/home/settings.git] / setting-storage / src / setting-storage.c
1 /*
2  * setting
3  *
4  * Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd.
5  *
6  * Licensed under the Apache License, Version 2.0 (the "License");
7  * you may not use this file except in compliance with the License.
8  * You may obtain a copy of the License at
9  *
10  * http://www.apache.org/licenses/LICENSE-2.0
11  *
12  * Unless required by applicable law or agreed to in writing, software
13  * distributed under the License is distributed on an "AS IS" BASIS,
14  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15  * See the License for the specific language governing permissions and
16  * limitations under the License.
17  *
18  */
19 #ifndef UG_MODULE_API
20 #define UG_MODULE_API __attribute__ ((visibility("default")))
21 #endif
22
23 #include <efl_assist.h>
24 #include <media_content.h>
25
26 #include "setting-cfg.h"
27 #include "setting-storage-main.h"
28 #include "setting-storage-default.h"
29 #include "setting-storage-miscellaneous.h"
30 #include "setting-storage.h"
31
32 typedef enum {
33     STORAGEUG_KEYWORD_NONE = 0,
34     STORAGEUG_KEYWORD_MAIN_SYS_MEM,
35     STORAGEUG_KEYWORD_MAIN_APPS,
36     STORAGEUG_KEYWORD_MAIN_PICS,
37     STORAGEUG_KEYWORD_MAIN_AUDIO,
38     STORAGEUG_KEYWORD_MAIN_MISCES,
39     STORAGEUG_KEYWORD_MAIN_AVAIL,
40     STORAGEUG_KEYWORD_MAIN_SD_CARD,
41
42     STORAGEUG_KEYWORD_DEFAULT = 100,
43     STORAGEUG_KEYWORD_DEFAULT_BT,
44     STORAGEUG_KEYWORD_DEFAULT_WIFI,
45     STORAGEUG_KEYWORD_DEFAULT_NFC,
46     STORAGEUG_KEYWORD_DEFAULT_APP,
47     STORAGEUG_KEYWORD_MAX
48 } STORAGEUG_KEYWORD;
49
50 typedef struct {
51         char *key_name;
52         int keynum;
53 } storageUg_search_data;
54
55 static void _storageUg_vconf_change_cb(keynode_t *key, void *data)
56 {
57         char *vconf_name;
58         SettingStorageUG *ad = data;
59
60         ret_if(data == NULL);
61
62         vconf_name = vconf_keynode_get_name(key);
63         if (NULL == vconf_name)
64                 return;
65
66         if (ad->pie_it)
67                 elm_genlist_item_update(ad->pie_it);
68 }
69
70 static inline void _storageUg_listen_vconf(SettingStorageUG *storageUG)
71 {
72         int ret;
73         const char *FONT_SIZE = VCONFKEY_SETAPPL_ACCESSIBILITY_FONT_SIZE;
74         const char *FONT_NAME = VCONFKEY_SETAPPL_ACCESSIBILITY_FONT_NAME;
75
76         ret = vconf_notify_key_changed(FONT_SIZE, _storageUg_vconf_change_cb, storageUG);
77         warn_if(ret < 0, "vconf_notify_key_changed(%s) Fail(%d)", FONT_SIZE, ret);
78
79         ret = vconf_notify_key_changed(FONT_NAME, _storageUg_vconf_change_cb, storageUG);
80         warn_if(ret < 0, "vconf_notify_key_changed(%s) Fail(%d)", FONT_NAME, ret);
81 }
82
83 static inline void _storageUg_ignore_vconf()
84 {
85         int ret;
86         const char *FONT_SIZE = VCONFKEY_SETAPPL_ACCESSIBILITY_FONT_SIZE;
87         const char *FONT_NAME = VCONFKEY_SETAPPL_ACCESSIBILITY_FONT_NAME;
88
89         ret = vconf_ignore_key_changed(FONT_SIZE, _storageUg_vconf_change_cb);
90         warn_if(ret < 0, "vconf_ignore_key_changed(%s) Fail(%d)", FONT_SIZE, ret);
91
92         ret = vconf_ignore_key_changed(FONT_NAME, _storageUg_vconf_change_cb);
93         warn_if(ret < 0, "vconf_ignore_key_changed(%s) Fail(%d)", FONT_NAME, ret);
94 }
95
96 static inline void storageUg_init_itcs(SettingStorageUG *ad)
97 {
98         setting_create_Gendial_itc("dialogue/2text.3/expandable", &(ad->itc_2text_3_parent));
99         setting_create_Gendial_itc("dialogue/1text.1icon/expandable2",
100                                    &(ad->itc_1icon_1text_sub));
101         setting_create_Gendial_itc("dialogue/2text.3", &(ad->itc_2text_2));
102         setting_create_Gendial_itc("groupindex", &(ad->itc_group_item));
103         setting_create_Gendial_itc("2line.top.4", &(ad->itc_2text_1icon_3));
104         setting_create_Gendial_itc("dialogue/1text", &(ad->itc_1text));
105         setting_create_Gendial_itc("1text.1icon.3", &(ad->itc_1text_1icon));
106         setting_create_Gendial_itc("1icon", &(ad->itc_pie));
107         ad->itc_pie.func.content_get = storageUg_main_pie_item_get_icon;
108         ad->itc_pie.func.del = NULL;
109         setting_create_Gendial_itc("1icon/no_padding_line", &(ad->itc_notice));
110         ad->itc_notice.func.content_get = storageUg_default_notice_get_icon;
111         ad->itc_notice.func.del = NULL;
112
113         setting_create_Gendial_itc("2line.top", &(ad->itc_color_item));
114         ad->itc_color_item.func.content_get = storageUg_color_item_content_get;
115         ad->itc_color_item.func.del = NULL;
116 }
117
118 static void storageUg_navi_back(void *data, Evas_Object *obj, void *event_info)
119 {
120         SettingStorageUG *ad = data;
121
122         ret_if(NULL == data);
123         ret_if(NULL != ad->del_worker);
124         retm_if(ad->sd_request || ad->usb_request, "sd_request(%d), usb_request(%d)",
125                 ad->sd_request, ad->usb_request);
126
127         elm_naviframe_item_pop(obj);
128 }
129
130 static inline Evas_Object *storageUg_create_navi(Evas_Object *parent,
131                                                  SettingStorageUG *ad)
132 {
133         Evas_Object *navi;
134
135         retv_if(NULL == parent, NULL);
136
137         navi = elm_naviframe_add(parent);
138         elm_naviframe_prev_btn_auto_pushed_set(navi, EINA_FALSE);
139
140         ea_object_event_callback_add(navi, EA_CALLBACK_BACK, storageUg_navi_back, ad);
141         /*ea_object_event_callback_add(navi, EA_CALLBACK_MORE, ea_naviframe_more_cb, NULL); */
142
143         evas_object_show(navi);
144         return navi;
145 }
146
147 static inline void storageUg_move_view(STORAGEUG_KEYWORD keynum,
148                                        SettingStorageUG *ad)
149 {
150         Setting_GenGroupItem_Data *item_data;
151
152         retm_if(keynum <= STORAGEUG_KEYWORD_NONE || STORAGEUG_KEYWORD_MAX <= keynum,
153                 "keynum(%d) is Invalid", keynum);
154
155         switch (keynum) {
156                 case STORAGEUG_KEYWORD_MAIN_SYS_MEM:
157                         item_data = ad->sys_mem;
158                         break;
159                 case STORAGEUG_KEYWORD_MAIN_APPS:
160                         item_data = ad->apps;
161                         break;
162                 case STORAGEUG_KEYWORD_MAIN_PICS:
163                         item_data = ad->pics_videos;
164                         break;
165                 case STORAGEUG_KEYWORD_MAIN_AUDIO:
166                         item_data = ad->audio;
167                         break;
168                 case STORAGEUG_KEYWORD_MAIN_MISCES:
169                         item_data = ad->misces;
170                         break;
171                 case STORAGEUG_KEYWORD_MAIN_AVAIL:
172                         item_data = ad->avail;
173                         break;
174                 case STORAGEUG_KEYWORD_MAIN_SD_CARD:
175                         item_data = ad->sd_card;
176                         break;
177                 case STORAGEUG_KEYWORD_DEFAULT_BT:
178                         item_data = ad->data_bt;
179                         break;
180                 case STORAGEUG_KEYWORD_DEFAULT_WIFI:
181                         item_data = ad->data_wifidirect;
182                         break;
183                 case STORAGEUG_KEYWORD_DEFAULT_NFC:
184                         item_data = ad->data_nfc;
185                         break;
186                 case STORAGEUG_KEYWORD_DEFAULT_APP:
187                         item_data = ad->data_installapp;
188                         break;
189                 default:
190                         item_data = NULL;
191                         break;
192         }
193
194         if (item_data && item_data->item) {
195                 if (STORAGEUG_KEYWORD_DEFAULT < keynum)
196                         elm_genlist_item_expanded_set(item_data->item, TRUE);
197                 else
198                         elm_genlist_item_bring_in(item_data->item, ELM_GENLIST_ITEM_SCROLLTO_MIDDLE);
199         }
200 }
201
202 static void *setting_storageUg_on_create(ui_gadget_h ug, enum ug_mode mode,
203                                          app_control_h service, void *priv)
204 {
205         int ret;
206         char *caller = NULL;
207         SettingStorageUG *ad = priv;
208         char *search_keyword = NULL;
209         const char *GENLIST_edj = EDJDIR"/setting-genlist.edj";
210         STORAGEUG_KEYWORD keyword_val = STORAGEUG_KEYWORD_NONE;
211
212         retvm_if(NULL == ug || NULL == priv, NULL, "ug=%p, priv=%p is Invalid", ug, priv);
213
214         ad->ug = ug;
215         ad->win = ug_get_window();
216         ad->lo_parent = ug_get_parent_layout(ug);
217         if (NULL == ad->lo_parent) {
218                 SETTING_TRACE_ERROR("ug_get_parent_layout(ug) Fail");
219                 return NULL;
220         }
221
222         ret = media_content_connect();
223         if (MEDIA_CONTENT_ERROR_NONE != ret) {
224                 SETTING_TRACE_ERROR("media_content_connect() Fail(%d)", ret);
225                 /*return NULL; */
226         }
227
228         app_control_get_extra_data(service, "caller", &caller);
229         app_control_get_extra_data(service, "keyword", &search_keyword);
230         if (NULL == caller)
231                 elm_theme_extension_add(NULL, GENLIST_edj);
232
233         /* add listening */
234         _storageUg_listen_vconf(ad);
235
236         storageUg_main_init(ad);
237         storageUg_default_init(ad);
238         storageUg_misc_init(ad);
239
240         setting_view_node_table_intialize();
241         setting_view_node_table_register(ad->main_view, NULL);
242         setting_view_node_table_register(ad->default_view, ad->main_view);
243         setting_view_node_table_register(ad->misces_view, ad->main_view);
244
245         storageUg_init_itcs(ad);
246
247         ad->lo_main = setting_create_win_layout(ad->lo_parent, ad->win);
248         ad->navi = storageUg_create_navi(ad->lo_main, ad);
249         if (NULL == ad->navi) {
250                 SETTING_TRACE_ERROR("calloc() Fail");
251                 return NULL;
252         }
253         elm_object_part_content_set(ad->lo_main, "elm.swallow.content", ad->navi);
254
255         if (search_keyword)
256                 keyword_val = atoi(search_keyword);
257
258         if (STORAGEUG_KEYWORD_DEFAULT <= keyword_val && keyword_val < STORAGEUG_KEYWORD_MAX)
259                 setting_view_create(ad->default_view, ad);
260         else
261                 setting_view_create(ad->main_view, ad);
262
263         if (keyword_val)
264                 storageUg_move_view(keyword_val, ad);
265
266         free(caller);
267         free(search_keyword);
268
269         return ad->lo_main;
270 }
271
272 static void setting_storageUg_on_destroy(ui_gadget_h ug, app_control_h service,
273                                          void *priv)
274 {
275         int ret;
276         SettingStorageUG *storageUG = priv;
277
278         retm_if(NULL == ug || NULL == priv, "ug=%p, priv=%p is Invalid", ug, priv);
279
280         FREE(storageUG->usb_otg_path);
281
282         _storageUg_ignore_vconf();
283
284         ret = media_content_disconnect();
285         warn_if(ret != MEDIA_CONTENT_ERROR_NONE, "media_content_disconnect Fail");
286
287         if (storageUG->main_view->is_create)
288                 setting_view_destroy(storageUG->main_view, storageUG);
289         if (storageUG->default_view->is_create)
290                 setting_view_destroy(storageUG->default_view, storageUG);
291
292         if (storageUG->lo_main) {
293                 evas_object_del(storageUG->lo_main);
294                 storageUG->lo_main = NULL;
295         }
296 }
297
298 static void setting_storageUg_on_resume(ui_gadget_h ug, app_control_h service,
299                                         void *priv)
300 {
301         SettingStorageUG *storageUG = priv;
302
303         retm_if(NULL == ug || NULL == priv, "ug=%p, priv=%p is Invalid", ug, priv);
304
305         if (storageUG->main_view->is_create)
306                 setting_view_update(storageUG->main_view, storageUG);
307 }
308
309
310 static void setting_storageUg_on_event(ui_gadget_h ug, enum ug_event event,
311                                        app_control_h service, void *priv)
312 {
313         SettingStorageUG *storageUG = priv;
314
315         retm_if(NULL == ug || NULL == priv, "ug=%p, priv=%p is Invalid", ug, priv);
316
317         switch (event) {
318                 case UG_EVENT_LOW_MEMORY:
319                         break;
320                 case UG_EVENT_LOW_BATTERY:
321                         break;
322                 case UG_EVENT_LANG_CHANGE:
323                         if (storageUG->navi)
324                                 setting_navi_items_update(storageUG->navi);
325                         break;
326                 case UG_EVENT_ROTATE_PORTRAIT:
327                 case UG_EVENT_ROTATE_PORTRAIT_UPSIDEDOWN:
328                 case UG_EVENT_ROTATE_LANDSCAPE:
329                 case UG_EVENT_ROTATE_LANDSCAPE_UPSIDEDOWN:
330                         /*
331                            if (storageUG->application_desp)
332                            elm_genlist_item_update(storageUG->application_desp->item);
333                            */
334                         break;
335                 case UG_EVENT_REGION_CHANGE:
336                         break;
337                 default:
338                         break;
339         }
340 }
341
342 static void setting_storageUg_on_key_event(ui_gadget_h ug,
343                                            enum ug_key_event event, app_control_h service, void *priv)
344 {
345         if (!ug)
346                 return;
347
348         switch (event) {
349                 case UG_KEY_EVENT_END:
350                         ug_destroy_me(ug);
351                         break;
352                 default:
353                         break;
354         }
355 }
356
357 UG_MODULE_API int UG_MODULE_INIT(struct ug_module_ops *ops)
358 {
359         SettingStorageUG *storageUG;
360
361         retv_if(NULL == ops, -1);
362
363         storageUG = calloc(1, sizeof(SettingStorageUG));
364         if (NULL == storageUG) {
365                 SETTING_TRACE_ERROR("calloc() Fail");
366                 return -1;
367         }
368
369         ops->create = setting_storageUg_on_create;
370         ops->start = NULL;
371         ops->pause = NULL;
372         ops->resume = setting_storageUg_on_resume;
373         ops->destroy = setting_storageUg_on_destroy;
374         ops->message = NULL;
375         ops->event = setting_storageUg_on_event;
376         ops->key_event = setting_storageUg_on_key_event;
377         ops->priv = storageUG;
378         ops->opt = UG_OPT_INDICATOR_ENABLE;
379
380         return 0;
381 }
382
383
384 UG_MODULE_API void UG_MODULE_EXIT(struct ug_module_ops *ops)
385 {
386         ret_if(NULL == ops);
387
388         FREE(ops->priv);
389 }
390
391 UG_MODULE_API int setting_plugin_search_init(app_control_h service, void *priv,
392                                              char **applocale)
393 {
394         int i;
395         int size;
396         char ug_args[STORAGEUG_MAX_STR_LEN];
397         Setting_Cfg_Node_T *node;
398         Eina_List **pplist = (Eina_List **)priv;
399         const storageUg_search_data search_configs[] = {
400                 /* key_name, view_type, keyword, action, data */
401                 {STORAGEUG_STR_SYS_MEM, STORAGEUG_KEYWORD_MAIN_SYS_MEM},
402                 {STORAGEUG_STR_APPS, STORAGEUG_KEYWORD_MAIN_APPS},
403                 {STORAGEUG_STR_PICS, STORAGEUG_KEYWORD_MAIN_PICS},
404                 {STORAGEUG_STR_AUDIO, STORAGEUG_KEYWORD_MAIN_AUDIO},
405                 {STORAGEUG_STR_MISCES, STORAGEUG_KEYWORD_MAIN_MISCES},
406                 {STORAGEUG_STR_AVAIL, STORAGEUG_KEYWORD_MAIN_AVAIL},
407                 {STORAGEUG_STR_SD_CARD, STORAGEUG_KEYWORD_MAIN_SD_CARD},
408                 {STORAGEUG_STR_DEF_STORAGE, STORAGEUG_KEYWORD_DEFAULT},
409                 {STORAGEUG_STR_BT, STORAGEUG_KEYWORD_DEFAULT_BT},
410                 {STORAGEUG_STR_WIFI, STORAGEUG_KEYWORD_DEFAULT_WIFI},
411                 {STORAGEUG_STR_NFC, STORAGEUG_KEYWORD_DEFAULT_NFC},
412                 {STORAGEUG_STR_INSTALLED_APP_B, STORAGEUG_KEYWORD_DEFAULT_APP}
413         };
414
415         retv_if(NULL == priv, SETTING_GENERAL_ERR_NULL_DATA_PARAMETER);
416         retv_if(NULL == applocale, SETTING_GENERAL_ERR_NULL_DATA_PARAMETER);
417
418         *applocale = strdup("setting:/usr/apps/org.tizen.setting/res/locale");
419
420         size = sizeof(search_configs) / sizeof(storageUg_search_data);
421
422         for (i = 0; i < size; i++) {
423                 sprintf(ug_args, "keyword:%d", search_configs[i].keynum);
424                 node = setting_plugin_search_item_subindex_add(
425                            search_configs[i].key_name,
426                            ug_args,
427                            IMG_StorageIcon,
428                            Cfg_Item_View_Node,
429                            NULL,
430                            "Storage");
431
432                 *pplist = eina_list_append(*pplist, node);
433         }
434         return 0;
435 }
436