tizen 2.3.1 release
[apps/home/settings.git] / setting-storage / src / setting-storage-default.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 #include <glib.h>
20
21 #include "setting-storage-utils.h"
22 #include "setting-storage-default.h"
23
24 enum {
25     STORAGEUG_DEFAULT_STORAGE_PHONE,
26     STORAGEUG_DEFAULT_STORAGE_SD
27 };
28
29 static setting_view setting_view_storage_default;
30
31
32 Evas_Object *storageUg_default_notice_get_icon(void *data, Evas_Object *obj,
33                                                const char *part)
34 {
35         Evas_Object *layout;
36         Evas_Coord height, width;
37         SettingStorageUG *ad = data;
38         int offset = SETTING_STORAGE_PIE_RECT_OFFSET * 2;
39
40         retv_if(NULL == obj, NULL);
41         retv_if(NULL == data, NULL);
42         retvm_if(safeStrCmp(part, "elm.icon"), NULL, "part(%s) Invaild", part);
43
44         layout = elm_layout_add(obj);
45         elm_layout_file_set(layout, SETTING_THEME_EDJ_NAME, "default_storage");
46         evas_object_size_hint_weight_set(layout, EVAS_HINT_EXPAND, 0.0);
47         elm_object_part_text_set(layout, "application_desp.text",
48                                  _(STORAGEUG_STR_APP_LOC_NOTICE));
49
50         /* in landscape mode, the size should be resize */
51         evas_object_geometry_get(obj, NULL, NULL, &width, NULL);
52
53         app_device_orientation_e m = elm_win_rotation_get(ad->win);
54         if (APP_DEVICE_ORIENTATION_90 == m || APP_DEVICE_ORIENTATION_270 == m)
55                 height = SETTING_STORAGE_DEFAULT_STORAGE_APP_DESP_SIZE * 2 / 3;
56         else
57                 height = SETTING_STORAGE_DEFAULT_STORAGE_APP_DESP_SIZE;
58
59         setting_resize_object(layout, width - offset, height);
60         evas_object_show(layout);
61         return layout;
62 }
63
64 static Eina_Bool storageUg_default_back_cb(void *data, Elm_Object_Item *it)
65 {
66         SettingStorageUG *ad = data;
67
68         retv_if(data == NULL, EINA_FALSE);
69
70         if (ad->main_view->is_create)
71                 setting_view_change(ad->default_view, ad->main_view, ad);
72         else
73                 ug_destroy_me(ad->ug);
74
75         return EINA_TRUE;
76 }
77
78 static void _storageUg_default_set_value(Elm_Object_Item *parentItem,
79                                          Setting_GenGroupItem_Data *d_subItem, Setting_GenGroupItem_Data *d_parentItem)
80 {
81         int err;
82
83         setting_set_int_slp_key(d_parentItem->int_slp_setting_binded, d_subItem->chk_status,
84                                 &err);
85         retm_if(0 != err, "setting_set_int_slp_key(%d) Fail(%d)",
86                 d_parentItem->int_slp_setting_binded, err);
87
88         G_FREE(d_parentItem->sub_desc);
89         d_parentItem->sub_desc = (char *)g_strdup(d_subItem->keyStr);
90         elm_object_item_data_set(d_parentItem->item, d_parentItem);
91         elm_genlist_item_update(d_parentItem->item);
92 }
93
94 static void storageUg_default_expand_item_sel(void *data, Evas_Object *obj,
95                                               void *event_info)
96 {
97         Elm_Object_Item *parentItem;
98         Elm_Object_Item *subitem = event_info;
99         Setting_GenGroupItem_Data *d_subItem;
100         Setting_GenGroupItem_Data *d_parentItem;
101
102         ret_if(event_info == NULL);
103
104         elm_genlist_item_selected_set(subitem, 0);
105
106         parentItem = elm_genlist_item_parent_get(subitem);
107
108         d_subItem = elm_object_item_data_get(subitem);
109         ret_if(NULL == d_subItem);
110
111         d_parentItem = elm_object_item_data_get(parentItem);    /* parent data */
112         ret_if(NULL == d_parentItem);
113
114         elm_radio_value_set(d_subItem->rgd, d_subItem->chk_status);
115
116         _storageUg_default_set_value(parentItem, d_subItem, d_parentItem);
117
118         elm_genlist_item_expanded_set(d_parentItem->item, EINA_FALSE);
119 }
120
121
122 static void storageUg_default_radio_change(void *data, Evas_Object *obj,
123                                            void *event_info)
124 {
125         Elm_Object_Item *subItem, *parentItem;
126         Setting_GenGroupItem_Data *list_item = data;
127         Setting_GenGroupItem_Data *d_subItem;
128         Setting_GenGroupItem_Data *d_parentItem;
129
130         ret_if(data == NULL);
131
132         list_item->chk_status = elm_radio_value_get(obj);       /*  for update */
133
134         subItem = list_item->item;
135         parentItem = elm_genlist_item_parent_get(subItem);
136
137         d_subItem = elm_object_item_data_get(subItem);
138         ret_if(NULL == d_subItem);
139
140         if (d_subItem->disableflag)
141                 return;
142
143         d_parentItem = elm_object_item_data_get(parentItem);
144         ret_if(NULL == d_parentItem);
145
146         _storageUg_default_set_value(parentItem, d_subItem, d_parentItem);
147 }
148
149 static void storageUg_default_expand_cb(void *data, Evas_Object *obj,
150                                         void *event_info)
151 {
152         Evas_Object *scroller, *rgd;
153         SettingStorageUG *ad = data;
154         Setting_GenGroupItem_Data *data_parentItem;
155         Setting_GenGroupItem_Data *memory_card;
156         Setting_GenGroupItem_Data *phone = NULL;
157         Elm_Object_Item *parentItem = event_info;       /* parent item */
158
159         ret_if(NULL == data);
160         ret_if(NULL == event_info);
161
162         data_parentItem = elm_object_item_data_get(parentItem); /* parent data */
163         scroller = elm_object_item_widget_get(parentItem);
164
165         if (data_parentItem == ad->data_bt || data_parentItem == ad->data_nfc
166             || data_parentItem == ad->data_wifidirect
167             || data_parentItem == ad->data_installapp) {
168                 rgd = elm_radio_add(scroller);
169                 elm_radio_value_set(rgd, -1);
170                 phone = setting_create_Gendial_exp_sub_field(scroller, &itc_1icon_1text_sub,
171                                 storageUg_default_expand_item_sel, ad, parentItem, SWALLOW_Type_1RADIO,
172                                 rgd, SETTING_DEF_MEMORY_PHONE, STORAGEUG_STR_INTERNAL_STORAGE, NULL);
173                 if (phone) {
174                         setting_genlist_item_groupstyle_set(phone, SETTING_GROUP_STYLE_CENTER);
175                         phone->disableflag = EINA_FALSE;
176                 }
177
178                 memory_card = setting_create_Gendial_exp_sub_field(scroller,
179                                                                    &itc_1icon_1text_sub, storageUg_default_expand_item_sel, ad,
180                                                                    parentItem, SWALLOW_Type_1RADIO, rgd, SETTING_DEF_MEMORY_MMC,
181                                                                    STORAGEUG_STR_SD_CARD, storageUg_default_radio_change);
182                 retm_if(NULL == memory_card, "setting_create_Gendial_exp_sub_field() Fail");
183                 if (data_parentItem == ad->data_wifidirect
184                     || data_parentItem == ad->data_installapp) {
185                         setting_genlist_item_groupstyle_set(memory_card, SETTING_GROUP_STYLE_BOTTOM);
186                 } else {
187                         setting_genlist_item_groupstyle_set(memory_card, SETTING_GROUP_STYLE_CENTER);
188                 }
189
190                 memory_card->disableflag = EINA_FALSE;
191
192                 if (ad->mmc_status != VCONFKEY_SYSMAN_MMC_MOUNTED) {
193                         setting_disable_genlist_item(memory_card->item);
194                         memory_card->disableflag = EINA_TRUE;
195                 }
196
197                 setting_update_chk_status(rgd, data_parentItem->int_slp_setting_binded);
198         }
199 }
200
201 static void storageUg_default_reset_vconf(Setting_GenGroupItem_Data *data_item)
202 {
203         int err = 0;
204         int value = 0;
205
206         ret_if(NULL == data_item);
207
208         if (!safeStrCmp(data_item->sub_desc, STORAGEUG_STR_SD_CARD)) {
209
210                 setting_get_int_slp_key(data_item->int_slp_setting_binded, &value, &err);
211                 retm_if(0 != err, "setting_get_int_slp_key(%d) Fail(%d)",
212                         data_item->int_slp_setting_binded, err);
213                 if (value != STORAGEUG_DEFAULT_STORAGE_PHONE) {
214                         setting_set_int_slp_key(data_item->int_slp_setting_binded,
215                                                 STORAGEUG_DEFAULT_STORAGE_PHONE, &err);
216                         retm_if(0 != err, "setting_set_int_slp_key(%d) Fail(%d)",
217                                 data_item->int_slp_setting_binded, err);
218                 }
219
220                 G_FREE(data_item->sub_desc);
221                 data_item->sub_desc = (char *)g_strdup(STORAGEUG_STR_INTERNAL_STORAGE);
222                 elm_object_item_data_set(data_item->item, data_item);
223                 elm_genlist_item_update(data_item->item);
224         }
225 }
226
227 static void storageUg_default_mmc_changed_cb(keynode_t *node, void *data)
228 {
229         int status;
230         SettingStorageUG *ad = data;
231
232         ret_if(NULL == node);
233         ret_if(NULL == data);
234
235         status = vconf_keynode_get_int(node);
236
237         SETTING_TRACE("status:%d", status);
238         if (VCONFKEY_SYSMAN_MMC_MOUNTED != status) {
239                 storageUg_default_reset_vconf(ad->data_bt);
240                 storageUg_default_reset_vconf(ad->data_wifidirect);
241                 storageUg_default_reset_vconf(ad->data_nfc);
242                 storageUg_default_reset_vconf(ad->data_installapp);
243         }
244
245         /* when vconf change, expand set false */
246         if (ad->data_bt && ad->data_bt->item)
247                 elm_genlist_item_expanded_set(ad->data_bt->item, EINA_FALSE);
248
249         if (ad->data_nfc && ad->data_nfc->item)
250                 elm_genlist_item_expanded_set(ad->data_nfc->item, EINA_FALSE);
251
252         if (ad->data_wifidirect && ad->data_wifidirect->item)
253                 elm_genlist_item_expanded_set(ad->data_wifidirect->item, EINA_FALSE);
254
255         if (ad->data_installapp && ad->data_installapp->item)
256                 elm_genlist_item_expanded_set(ad->data_installapp->item, EINA_FALSE);
257 }
258
259 static const char *storageUg_default_cur_storage_get(int mmc_status,
260                                                      setting_int_slp_list slp_key)
261 {
262         int err, value = 0;
263         const char *phone = STORAGEUG_STR_INTERNAL_STORAGE;
264         const char *sd = STORAGEUG_STR_SD_CARD;
265
266         setting_get_int_slp_key(slp_key, &value, &err);
267         warn_if(0 != err, "setting_get_int_slp_key(%d) Fail(%d)", slp_key, err);
268
269         if (mmc_status != VCONFKEY_SYSMAN_MMC_MOUNTED && STORAGEUG_DEFAULT_STORAGE_SD == value) {
270                 setting_set_int_slp_key(slp_key, STORAGEUG_DEFAULT_STORAGE_PHONE, &err);
271                 warn_if(0 != err, "setting_set_int_slp_key(%d) Fail(%d)", slp_key, err);
272
273                 value = STORAGEUG_DEFAULT_STORAGE_PHONE;
274         }
275
276         if (STORAGEUG_DEFAULT_STORAGE_SD == value)
277                 return sd;
278         else
279                 return phone;
280 }
281
282 static int storageUg_default_create(void *data)
283 {
284         int ret;
285         SettingStorageUG *ad = data;
286         Elm_Object_Item *item = NULL;
287         Evas_Object *genlist = NULL;
288         const char *grp_title, *item_title;
289         const char *cur_storage;
290
291         retv_if(NULL == data, SETTING_GENERAL_ERR_NULL_DATA_PARAMETER);
292
293         if (!ad->main_view->is_create) {
294                 ret = vconf_get_int(storageUg_MMC_stat, &ad->mmc_status);
295                 retvm_if(ret, SETTING_RETURN_FAIL, "vconf_get_int(%s) Fail", storageUg_MMC_stat);
296         }
297
298         setting_push_layout_navi_bar_genlist(ad->lo_parent, ad->win,
299                                              STORAGEUG_STR_DEF_STORAGE, STORAGEUG_STR_BACK, NULL,
300                                              (setting_call_back_func)storageUg_default_back_cb,
301                                              NULL, ad, &genlist, ad->navi);
302         elm_genlist_realization_mode_set(genlist, EINA_FALSE);
303
304         setting_enable_expandable_genlist(genlist, ad,
305                                           storageUg_default_expand_cb, NULL);
306
307         storageUg_append_separator(genlist, ad);
308
309         /*Shared contents */
310         setting_create_Gendial_field_titleItem(genlist, &itc_group_item,
311                                                STORAGEUG_STR_SHARED_CONTENTS, NULL);
312
313         /* bluetooth */
314         cur_storage = storageUg_default_cur_storage_get(ad->mmc_status,
315                                                         INT_SLP_SETTING_DEFAULT_MEM_BLUETOOTH);
316         ad->data_bt = setting_create_Gendial_exp_parent_field(genlist,
317                                                               &itc_2text_3_parent, NULL, NULL, SWALLOW_Type_INVALID,
318                                                               STORAGEUG_STR_BT, (char *)cur_storage, SETTING_GROUP_STYLE_TOP,
319                                                               SETTING_GROUP_STYLE_TOP);
320         if (ad->data_bt)
321                 ad->data_bt->int_slp_setting_binded = INT_SLP_SETTING_DEFAULT_MEM_BLUETOOTH;
322         else
323                 SETTING_TRACE_ERROR("ad->data_bt is NULL");
324
325 #if 0
326         /* NFC */
327
328         cur_storage = storageUg_default_cur_storage_get(ad->mmc_status,
329                                                         INT_SLP_SETTING_DEFAULT_MEM_NFC);
330         ad->data_nfc = setting_create_Gendial_exp_parent_field(genlist,
331                                                                &itc_2text_3_parent, NULL, NULL, SWALLOW_Type_INVALID,
332                                                                STORAGEUG_STR_NFC, (char *)cur_storage, SETTING_GROUP_STYLE_CENTER,
333                                                                SETTING_GROUP_STYLE_CENTER);
334         if (ad->data_nfc) {
335                 ad->data_nfc->int_slp_setting_binded = INT_SLP_SETTING_DEFAULT_MEM_NFC;
336         } else {
337                 SETTING_TRACE_ERROR("ad->data_dload is NULL");
338         }
339 #endif
340
341         /* Wifi Direct */
342         cur_storage = storageUg_default_cur_storage_get(ad->mmc_status,
343                                                         INT_SLP_SETTING_DEFAULT_MEM_WIFIDIRECT);
344         ad->data_wifidirect = setting_create_Gendial_exp_parent_field(genlist,
345                                                                       &itc_2text_3_parent, NULL, NULL, SWALLOW_Type_INVALID,
346                                                                       STORAGEUG_STR_WIFI, (char *)cur_storage, SETTING_GROUP_STYLE_CENTER,
347                                                                       SETTING_GROUP_STYLE_BOTTOM);
348         if (ad->data_wifidirect) {
349                 ad->data_wifidirect->int_slp_setting_binded = INT_SLP_SETTING_DEFAULT_MEM_WIFIDIRECT;
350         } else {
351                 SETTING_TRACE_ERROR("ad->data_wifidirect is NULL");
352         }
353
354         /*Install application */
355         storageUg_append_separator(genlist, ad);
356
357         grp_title = STORAGEUG_STR_INSTALLED_APP_H;
358         item_title = STORAGEUG_STR_INSTALLED_APP_B;
359
360         setting_create_Gendial_field_titleItem(genlist, &itc_group_item, grp_title,
361                                                NULL);
362
363         cur_storage = storageUg_default_cur_storage_get(ad->mmc_status,
364                                                         INT_SLP_SETTING_DEFAULT_MEM_INSTALLAPPLICATIONS);
365         ad->data_installapp = setting_create_Gendial_exp_parent_field(genlist,
366                                                                       &itc_2text_3_parent, NULL, NULL, SWALLOW_Type_INVALID, item_title,
367                                                                       (char *)cur_storage, SETTING_GROUP_STYLE_TOP, SETTING_GROUP_STYLE_NONE);
368         if (ad->data_installapp) {
369                 ad->data_installapp->int_slp_setting_binded =
370                     INT_SLP_SETTING_DEFAULT_MEM_INSTALLAPPLICATIONS;
371         } else {
372                 SETTING_TRACE_ERROR("ad->data_installapp is NULL");
373         }
374
375         storageUg_append_separator(genlist, ad);
376
377         ADD_GL_HELP(genlist, STORAGEUG_STR_APP_LOC_NOTICE);
378
379         ret = vconf_notify_key_changed(storageUg_MMC_stat, storageUg_default_mmc_changed_cb,
380                                        ad);
381         if (ret != 0) {
382                 SETTING_TRACE_ERROR("vconf_notify_key_changed(%s) Fail(%d)", storageUg_MMC_stat,
383                                     ret);
384         }
385
386         setting_view_storage_default.is_create = 1;
387
388         return SETTING_RETURN_SUCCESS;
389 }
390
391 static int storageUg_default_destroy(void *data)
392 {
393         int ret;
394
395         ret = vconf_ignore_key_changed(storageUg_MMC_stat, storageUg_default_mmc_changed_cb);
396         warn_if(ret, "vconf_ignore_key_changed(%s) Fail(%d)", storageUg_MMC_stat, ret);
397
398         setting_view_storage_default.is_create = 0;
399
400         return SETTING_RETURN_SUCCESS;
401 }
402 static int storageUg_default_update(void *data)
403 {
404         return SETTING_RETURN_SUCCESS;
405 }
406 static int storageUg_default_cleanup(void *data)
407 {
408         return storageUg_default_destroy(data);
409 }
410
411
412 void storageUg_default_init(SettingStorageUG *ad)
413 {
414         ret_if(NULL == ad);
415         ret_if(ad->default_view);
416
417         setting_view_storage_default.create = storageUg_default_create;
418         setting_view_storage_default.destroy = storageUg_default_destroy;
419         setting_view_storage_default.update = storageUg_default_update;
420         setting_view_storage_default.cleanup = storageUg_default_cleanup;
421
422         ad->default_view = &setting_view_storage_default;
423 }
424