tizen 2.3 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         {
157         case STORAGEUG_KEYWORD_MAIN_SYS_MEM:
158                 item_data = ad->sys_mem;
159                 break;
160         case STORAGEUG_KEYWORD_MAIN_APPS:
161                 item_data = ad->apps;
162                 break;
163         case STORAGEUG_KEYWORD_MAIN_PICS:
164                 item_data = ad->pics_videos;
165                 break;
166         case STORAGEUG_KEYWORD_MAIN_AUDIO:
167                 item_data = ad->audio;
168                 break;
169         case STORAGEUG_KEYWORD_MAIN_MISCES:
170                 item_data = ad->misces;
171                 break;
172         case STORAGEUG_KEYWORD_MAIN_AVAIL:
173                 item_data = ad->avail;
174                 break;
175         case STORAGEUG_KEYWORD_MAIN_SD_CARD:
176                 item_data = ad->sd_card;
177                 break;
178         case STORAGEUG_KEYWORD_DEFAULT_BT:
179                 item_data = ad->data_bt;
180                 break;
181         case STORAGEUG_KEYWORD_DEFAULT_WIFI:
182                 item_data = ad->data_wifidirect;
183                 break;
184         case STORAGEUG_KEYWORD_DEFAULT_NFC:
185                 item_data = ad->data_nfc;
186                 break;
187         case STORAGEUG_KEYWORD_DEFAULT_APP:
188                 item_data = ad->data_installapp;
189                 break;
190         default:
191                 item_data = NULL;
192                 break;
193         }
194
195         if (item_data && item_data->item)
196         {
197                 if(STORAGEUG_KEYWORD_DEFAULT < keynum)
198                         elm_genlist_item_expanded_set(item_data->item, TRUE);
199                 else
200                         elm_genlist_item_bring_in(item_data->item, ELM_GENLIST_ITEM_SCROLLTO_MIDDLE);
201         }
202 }
203
204 static void *setting_storageUg_on_create(ui_gadget_h ug, enum ug_mode mode,
205                 app_control_h service, void *priv)
206 {
207         int ret;
208         char *caller = NULL;
209         SettingStorageUG *ad = priv;
210         char* search_keyword = NULL;
211         const char *GENLIST_edj = EDJDIR"/setting-genlist.edj";
212         STORAGEUG_KEYWORD keyword_val = STORAGEUG_KEYWORD_NONE;
213
214         retvm_if(NULL == ug || NULL == priv, NULL, "ug=%p, priv=%p is Invalid", ug, priv);
215
216         ad->ug = ug;
217         ad->win = ug_get_window();
218         ad->lo_parent = ug_get_parent_layout(ug);
219         if (NULL == ad->lo_parent)
220         {
221                 SETTING_TRACE_ERROR("ug_get_parent_layout(ug) Fail");
222                 return NULL;
223         }
224
225         ret = media_content_connect();
226         if (MEDIA_CONTENT_ERROR_NONE != ret)
227         {
228                 SETTING_TRACE_ERROR("media_content_connect() Fail(%d)", ret);
229                 //return NULL;
230         }
231
232         app_control_get_extra_data(service, "caller", &caller);
233         app_control_get_extra_data(service, "keyword", &search_keyword);
234         if (NULL == caller)
235                 elm_theme_extension_add(NULL, GENLIST_edj);
236
237         /* add listening */
238         _storageUg_listen_vconf(ad);
239
240         storageUg_main_init(ad);
241         storageUg_default_init(ad);
242         storageUg_misc_init(ad);
243
244         setting_view_node_table_intialize();
245         setting_view_node_table_register(ad->main_view, NULL);
246         setting_view_node_table_register(ad->default_view, ad->main_view);
247         setting_view_node_table_register(ad->misces_view, ad->main_view);
248
249         storageUg_init_itcs(ad);
250
251         ad->lo_main = setting_create_win_layout(ad->lo_parent, ad->win);
252         ad->navi = storageUg_create_navi(ad->lo_main, ad);
253         if (NULL == ad->navi)
254         {
255                 SETTING_TRACE_ERROR("calloc() Fail");
256                 return NULL;
257         }
258         elm_object_part_content_set(ad->lo_main, "elm.swallow.content", ad->navi);
259
260         if(search_keyword)
261                 keyword_val = atoi(search_keyword);
262
263         if(STORAGEUG_KEYWORD_DEFAULT <= keyword_val && keyword_val < STORAGEUG_KEYWORD_MAX)
264                 setting_view_create(ad->default_view, ad);
265         else
266                 setting_view_create(ad->main_view, ad);
267
268         if(keyword_val)
269                 storageUg_move_view(keyword_val, ad);
270
271         free(caller);
272         free(search_keyword);
273
274         return ad->lo_main;
275 }
276
277 static void setting_storageUg_on_destroy(ui_gadget_h ug, app_control_h service,
278                 void *priv)
279 {
280         int ret;
281         SettingStorageUG *storageUG = priv;
282
283         retm_if(NULL == ug || NULL == priv, "ug=%p, priv=%p is Invalid", ug, priv);
284
285         FREE(storageUG->usb_otg_path);
286
287         _storageUg_ignore_vconf();
288
289         ret = media_content_disconnect();
290         warn_if(ret != MEDIA_CONTENT_ERROR_NONE, "media_content_disconnect Fail");
291
292         if (storageUG->main_view->is_create)
293                 setting_view_destroy(storageUG->main_view, storageUG);
294         if (storageUG->default_view->is_create)
295                 setting_view_destroy(storageUG->default_view, storageUG);
296
297         if (storageUG->lo_main)
298         {
299                 evas_object_del(storageUG->lo_main);
300                 storageUG->lo_main = NULL;
301         }
302 }
303
304 static void setting_storageUg_on_resume(ui_gadget_h ug, app_control_h service,
305                 void *priv)
306 {
307         SettingStorageUG *storageUG = priv;
308
309         retm_if(NULL == ug || NULL == priv, "ug=%p, priv=%p is Invalid", ug, priv);
310
311         if (storageUG->main_view->is_create)
312                 setting_view_update(storageUG->main_view, storageUG);
313 }
314
315
316 static void setting_storageUg_on_event(ui_gadget_h ug, enum ug_event event,
317                 app_control_h service, void *priv)
318 {
319         SettingStorageUG *storageUG = priv;
320
321         retm_if(NULL == ug || NULL == priv, "ug=%p, priv=%p is Invalid", ug, priv);
322
323         switch (event)
324         {
325         case UG_EVENT_LOW_MEMORY:
326                 break;
327         case UG_EVENT_LOW_BATTERY:
328                 break;
329         case UG_EVENT_LANG_CHANGE:
330                 if (storageUG->navi)
331                         setting_navi_items_update(storageUG->navi);
332                 break;
333         case UG_EVENT_ROTATE_PORTRAIT:
334         case UG_EVENT_ROTATE_PORTRAIT_UPSIDEDOWN:
335         case UG_EVENT_ROTATE_LANDSCAPE:
336         case UG_EVENT_ROTATE_LANDSCAPE_UPSIDEDOWN:
337                 /*
338                    if (storageUG->application_desp)
339                    elm_genlist_item_update(storageUG->application_desp->item);
340                    */
341                 break;
342         case UG_EVENT_REGION_CHANGE:
343                 break;
344         default:
345                 break;
346         }
347 }
348
349 static void setting_storageUg_on_key_event(ui_gadget_h ug,
350                 enum ug_key_event event, app_control_h service, void *priv)
351 {
352         if (!ug)
353                 return;
354
355         switch (event) {
356         case UG_KEY_EVENT_END:
357                 ug_destroy_me(ug);
358                 break;
359         default:
360                 break;
361         }
362 }
363
364 UG_MODULE_API int UG_MODULE_INIT(struct ug_module_ops *ops)
365 {
366         SettingStorageUG *storageUG;
367
368         retv_if(NULL == ops, -1);
369
370         storageUG = calloc(1, sizeof(SettingStorageUG));
371         if (NULL == storageUG)
372         {
373                 SETTING_TRACE_ERROR("calloc() Fail");
374                 return -1;
375         }
376
377         ops->create = setting_storageUg_on_create;
378         ops->start = NULL;
379         ops->pause = NULL;
380         ops->resume = setting_storageUg_on_resume;
381         ops->destroy = setting_storageUg_on_destroy;
382         ops->message = NULL;
383         ops->event = setting_storageUg_on_event;
384         ops->key_event = setting_storageUg_on_key_event;
385         ops->priv = storageUG;
386         ops->opt = UG_OPT_INDICATOR_ENABLE;
387
388         return 0;
389 }
390
391
392 UG_MODULE_API void UG_MODULE_EXIT(struct ug_module_ops *ops)
393 {
394         ret_if(NULL == ops);
395
396         FREE(ops->priv);
397 }
398
399 UG_MODULE_API int setting_plugin_search_init(app_control_h service, void *priv,
400                 char** applocale)
401 {
402         int i;
403         int size;
404         char ug_args[STORAGEUG_MAX_STR_LEN];
405         Setting_Cfg_Node_T *node;
406         Eina_List **pplist = (Eina_List**)priv;
407         const storageUg_search_data search_configs[] = {
408                 /* key_name, view_type, keyword, action, data */
409                 {STORAGEUG_STR_SYS_MEM, STORAGEUG_KEYWORD_MAIN_SYS_MEM},
410                 {STORAGEUG_STR_APPS, STORAGEUG_KEYWORD_MAIN_APPS},
411                 {STORAGEUG_STR_PICS, STORAGEUG_KEYWORD_MAIN_PICS},
412                 {STORAGEUG_STR_AUDIO, STORAGEUG_KEYWORD_MAIN_AUDIO},
413                 {STORAGEUG_STR_MISCES, STORAGEUG_KEYWORD_MAIN_MISCES},
414                 {STORAGEUG_STR_AVAIL, STORAGEUG_KEYWORD_MAIN_AVAIL},
415                 {STORAGEUG_STR_SD_CARD, STORAGEUG_KEYWORD_MAIN_SD_CARD},
416                 {STORAGEUG_STR_DEF_STORAGE, STORAGEUG_KEYWORD_DEFAULT},
417                 {STORAGEUG_STR_BT, STORAGEUG_KEYWORD_DEFAULT_BT},
418                 {STORAGEUG_STR_WIFI, STORAGEUG_KEYWORD_DEFAULT_WIFI},
419                 {STORAGEUG_STR_NFC, STORAGEUG_KEYWORD_DEFAULT_NFC},
420                 {STORAGEUG_STR_INSTALLED_APP_B, STORAGEUG_KEYWORD_DEFAULT_APP}
421         };
422
423         retv_if(NULL == priv, SETTING_GENERAL_ERR_NULL_DATA_PARAMETER);
424         retv_if(NULL == applocale, SETTING_GENERAL_ERR_NULL_DATA_PARAMETER);
425
426         *applocale = strdup("setting:/usr/apps/org.tizen.setting/res/locale");
427
428         size = sizeof(search_configs)/sizeof(storageUg_search_data);
429
430         for(i=0;i<size;i++)
431         {
432                 sprintf(ug_args, "keyword:%d", search_configs[i].keynum);
433                 node = setting_plugin_search_item_subindex_add(
434                                                                                 search_configs[i].key_name,
435                                                                                 ug_args,
436                                                                                 IMG_StorageIcon,
437                                                                                 Cfg_Item_View_Node,
438                                                                                 NULL,
439                                                                                 "Storage");
440
441                 *pplist = eina_list_append(*pplist, node);
442         }
443         return 0;
444 }
445