fix bug for privacy popup
[apps/home/settings.git] / setting-privacy / src / setting-privacy-service.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-privacy-service.h>
22 #include <package-manager.h>
23 #include <privacy_manager.h>
24 #include <pkgmgr-info.h>
25 //#include <privacy_info.h>
26
27 static int setting_privacy_service_create(void *cb);
28 static int setting_privacy_service_destroy(void *cb);
29 static int setting_privacy_service_update(void *cb);
30 static int setting_privacy_service_cleanup(void *cb);
31
32 setting_view setting_view_privacy_service = {
33         .create = setting_privacy_service_create,
34         .destroy = setting_privacy_service_destroy,
35         .update = setting_privacy_service_update,
36         .cleanup = setting_privacy_service_cleanup,
37 };
38
39 void _init_privacy_list(void *data)
40 {
41         SETTING_TRACE_BEGIN;
42         SettingPrivacyUG *ad = (SettingPrivacyUG *)data;
43
44         setting_privacy_privacyinfo_t *list_data = NULL;
45         if(ad->privacy_check_list)
46                 EINA_LIST_FREE(ad->privacy_check_list, list_data);
47
48         SETTING_TRACE_DEBUG("ad->privacy_check_list %d items", eina_list_count(ad->privacy_check_list));
49 }
50
51 static int _set_privacy(void* data, int chk_status)
52 {
53         Setting_GenGroupItem_Data *list_item = (Setting_GenGroupItem_Data *) data;
54         SettingPrivacyUG *ad = NULL;
55         ad = list_item->userdata;
56         int r=0;
57
58         setting_privacy_privacyinfo_t* node = NULL;
59         if (ad->privacy_check_list != NULL) {
60
61                 Eina_List *l = NULL;
62                 EINA_LIST_FOREACH(ad->privacy_check_list, l, node) {
63                         if (node->privacy_id != NULL)
64                         {
65                                 if ( strcmp(list_item->keyStr, node->privacy_name) == 0)
66                                 {
67                                         node->enabled = chk_status;
68                                         SETTING_TRACE("SELECTED ITEM, list_item->keyStr[%s] : privacy_id[%s], privacy_name[%s] -- (state:%d)  ",list_item->keyStr , node->privacy_id, node->privacy_name,node->enabled);
69
70                                         // #case 1
71                                         SETTING_TRACE("ad->pkg_id : %s, node->privacy_id:%s, list_item->chk_status:%d", ad->pkg_id, node->privacy_id, list_item->chk_status);
72                                         r = privacy_manager_set_package_privacy(ad->pkg_id, node->privacy_id, list_item->chk_status);
73                                         if(r!=0)
74                                                 SETTING_TRACE("privacy_manager_set_package_privacy : faied [%d]", r);
75                                 }
76                         } else {
77                                 SETTING_TRACE(" SELECTED ITEM is NULL - excpetion case");
78                         }
79                 }
80         }
81
82         return r;
83 }
84
85 static int _get_privacy_appinfo_by_pkgid(void* data)
86 {
87         SETTING_TRACE_BEGIN;
88         SettingPrivacyUG *ad = (SettingPrivacyUG *)data;
89
90         int ret = 0;
91         pkgmgr_pkginfo_h pkg_handle = NULL;
92         char *pkg_name = NULL;
93         char *icon_path = NULL;
94         char *main_appid = NULL;
95         char *pkg_label = NULL;
96         pkgmgrinfo_appinfo_h appinfo_h = NULL;
97
98         //pkgmgr handle
99         SETTING_TRACE("pkgid [%s]", ad->pkg_id);
100         ret = pkgmgr_pkginfo_get_pkginfo(ad->pkg_id, &pkg_handle);
101         if (ret < 0)
102         {
103                 SETTING_TRACE_ERROR("pkgmgr_pkginfo_get_pkginfo failed. %d", ret);
104                 goto end;
105         }
106
107         //pkg_name
108         pkgmgrinfo_pkginfo_h handle = (pkgmgrinfo_pkginfo_h)pkg_handle;
109         ret = pkgmgrinfo_pkginfo_get_pkgid(handle, &pkg_name);
110         if (ret < 0) {
111                 SETTING_TRACE_ERROR("pkgmgrinfo_pkginfo_get_pkgid is failed %d", ret);
112                 goto end;
113         }
114         SETTING_TRACE_DEBUG("pkg_name: %s", pkg_name);
115
116         //main appid
117         ret = pkgmgrinfo_pkginfo_get_mainappid(handle, &main_appid);
118         if (ret < 0)
119         {
120                 SETTING_TRACE_ERROR("pkgmgrinfo_pkginfo_get_mainappid failed. %d", ret);
121                 goto end;
122         }
123         SETTING_TRACE_DEBUG("main_appid: %s", main_appid);
124
125         //appinfo
126         ret = pkgmgrinfo_appinfo_get_appinfo(main_appid, &appinfo_h);
127         if (ret < 0) {
128                 SETTING_TRACE_ERROR("pkgmgrinfo_appinfo_get_appinfo is failed %d", ret);
129                 goto end;
130         }
131
132         //label
133         ret = pkgmgrinfo_appinfo_get_label(appinfo_h, &pkg_label);
134         if (ret < 0) {
135                 SETTING_TRACE_ERROR("pkgmgrinfo_appinfo_get_label is failed %d", ret);
136                 goto end;
137         }
138         if(pkg_label)
139                 ad->pkg_label = (char*)strdup(pkg_label);
140         SETTING_TRACE_DEBUG("pkg_label: %s", pkg_label);
141
142 end:
143         if (appinfo_h) {
144                 pkgmgrinfo_appinfo_destroy_appinfo(appinfo_h);
145         }
146         return ret;
147 }
148
149 static void _privacy_info_cb(const privacy_info_h* privacy_info, void* data)
150 {
151         SETTING_TRACE_BEGIN;
152         SettingPrivacyUG *ad = (SettingPrivacyUG *) data;
153
154         int r=0;
155         char *privacy_id = NULL;
156         char *privacy_name = NULL;
157         char *privacy_desc = NULL;
158         bool enabled = false;
159         r = privacy_info_get_privacy_id(privacy_info, &privacy_id);
160         if(r != 0){
161                 SETTING_TRACE_ERROR("privacy_info_get_privacy_id failed : %d", r);
162         }
163         ad->privacy_id = strdup(privacy_id);
164
165         r = privacy_info_get_privacy_display_name(privacy_info, &privacy_name);
166         if(r != 0){
167                 SETTING_TRACE_ERROR("privacy_info_get_privacy_display_name failed : %d", r);
168         }
169
170         r = privacy_info_get_privacy_description(privacy_info, &privacy_desc);
171         if(r != 0){
172                 SETTING_TRACE_ERROR("privacy_info_get_privacy_description failed : %d", r);
173         }
174
175         r = privacy_info_is_enabled(privacy_info, &enabled);
176         if(r != 0){
177                 SETTING_TRACE_ERROR("privacy_info_is_enabled failed : %d", r);
178         }
179
180         setting_privacy_privacyinfo_t *app_info = NULL;
181         app_info = (setting_privacy_privacyinfo_t*)malloc(sizeof(setting_privacy_privacyinfo_t));
182         retv_if(app_info == NULL, -1);
183         memset(app_info, 0, sizeof(setting_privacy_privacyinfo_t));
184         app_info->privacy_id = strdup(privacy_id);
185         app_info->privacy_name = strdup(privacy_name);
186         app_info->privacy_desc = strdup(privacy_desc);
187         app_info->enabled = enabled;
188
189         ad->privacy_service =
190         setting_create_Gendial_field_def(ad->scroller,
191                                 &(ad->itc_1text_1icon),
192                                 setting_privacy_service_list_Gendial_mouse_up_cb,
193                                 /*NULL,*/ad,
194                                 SWALLOW_Type_1CHECK,
195                                 NULL,
196                                 NULL,
197                                 app_info->enabled,                      /* the initial state */
198                                 privacy_name, NULL,
199                                 setting_privacy_service_list_Gendial_chk_btn_cb);
200
201         if(ad->privacy_service) {
202                 ad->privacy_service->userdata = ad;
203         } else {
204                 SETTING_TRACE_ERROR("ad->privacy_service is NULL");
205                 return SETTING_RETURN_FAIL;
206         }
207
208         ad->privacy_check_list = eina_list_append(ad->privacy_check_list, app_info);
209
210         //FREE(privacy_id);
211         //FREE(privacy_name);
212         //FREE(privacy_desc);
213 }
214
215 /**
216  * get 3rd party applist from AIL & searching dir/file by the defined rule
217  * @param data ad
218  * if data is NULL --> just get how many items are there
219  * if data is NOT NULL --> draw UI code
220  */
221 static void setting_privacy_get_privacy_list(void* data)
222 {
223         SETTING_TRACE_BEGIN;
224         SettingPrivacyUG *ad = (SettingPrivacyUG *) data;
225
226         char *pkg_id=NULL;
227         pkg_id = ad->pkg_id;
228         int r = 0;
229         r = privacy_manager_foreach_privacy_info(pkg_id ,_privacy_info_cb, ad);
230         if (0 != r) {
231                 SETTING_TRACE_ERROR("privacy_manager_foreach_privacy_info failed. %d", r);
232         }
233 }
234
235
236 /* ***************************************************
237  **
238  **basic func
239  **
240  ****************************************************/
241 static int setting_privacy_service_create(void *cb)
242 {
243         SETTING_TRACE_BEGIN;
244         retv_if(cb == NULL, SETTING_GENERAL_ERR_NULL_DATA_PARAMETER);
245
246         SettingPrivacyUG *ad = (SettingPrivacyUG *) cb;
247
248         //seperate default from app control
249         char *pkg_id = NULL;
250         service_h service = ad->bundle_data;
251         service_get_extra_data(service, "pkg_id", &pkg_id);
252
253         //need to pkgname from pkgid(pkgmgr)
254         ad->pkg_id = strdup(pkg_id);
255         //FREE(pkg_id);
256         SETTING_TRACE("pkgid [%s]", ad->pkg_id);
257         int r = _get_privacy_appinfo_by_pkgid(ad);
258         if (r != 0)
259                 SETTING_TRACE("_get_privacy_app_pkg_by_pkgid : fail");
260
261         // init
262         ad->privacy_check_list = NULL;
263
264         // itc
265         setting_create_Gendial_itc("1text.1icon.3", &(ad->itc_1text_1icon));
266
267         Elm_Object_Item *item = NULL;
268         Evas_Object *scroller = NULL;
269         ad->ly_main =
270             setting_create_layout_navi_bar_genlist(ad->win_main_layout,
271                                                    ad->win_get,
272                                                    ad->pkg_label,
273                                                    _("IDS_COM_BODY_BACK"), //_("IDS_COM_BODY_BACK"),
274                                                    _("IDS_COM_SK_OK"), //
275                                                    setting_privacy_service_click_softkey_back_cb, //setting_privacy_service_click_softkey_back_cb,
276                                                    setting_privacy_service_click_softkey_ok_cb,
277                                                    ad,
278                                                    &ad->scroller,
279                                                    &(ad->navi_bar));
280
281         /* separator */
282         item = elm_genlist_item_append(ad->scroller , &itc_seperator, NULL, NULL, ELM_GENLIST_ITEM_NONE, NULL, NULL);
283         elm_genlist_item_select_mode_set(item, ELM_OBJECT_SELECT_MODE_DISPLAY_ONLY);
284
285         setting_create_Gendial_field_def(ad->scroller, &itc_multiline_text, NULL,
286                         ad, SWALLOW_Type_LAYOUT_SPECIALIZTION_X,
287                         NULL, NULL, 0, KeyStr_PrivacyService_desc, NULL, NULL);
288         /* separator */
289         item = elm_genlist_item_append(ad->scroller , &itc_seperator, NULL, NULL, ELM_GENLIST_ITEM_NONE, NULL, NULL);
290         elm_genlist_item_select_mode_set(item, ELM_OBJECT_SELECT_MODE_DISPLAY_ONLY);
291
292         // get_applist
293         setting_privacy_get_privacy_list(ad);
294
295         /* separator */
296         item = elm_genlist_item_append(ad->scroller , &itc_bottom_seperator, NULL, NULL, ELM_GENLIST_ITEM_NONE, NULL, NULL);
297         elm_genlist_item_select_mode_set(item, ELM_OBJECT_SELECT_MODE_DISPLAY_ONLY);
298
299         /* update info */
300         setting_view_privacy_service.is_create = 1;
301         return SETTING_RETURN_SUCCESS;
302 }
303
304 static int setting_privacy_service_destroy(void *cb)
305 {
306         SETTING_TRACE_BEGIN;
307         /* error check */
308         retv_if(cb == NULL, SETTING_GENERAL_ERR_NULL_DATA_PARAMETER);
309         SettingPrivacyUG *ad = (SettingPrivacyUG *) cb;
310
311         if(ad->pkg_id)
312                 FREE(ad->pkg_id);
313
314         setting_privacy_privacyinfo_t *list_data = NULL;
315         if(ad->privacy_check_list)
316                 EINA_LIST_FREE(ad->privacy_check_list, list_data);
317
318         if (ad->view_to_load == &setting_view_privacy_service) {
319                 if (ad->ly_main) {
320                         evas_object_del(ad->ly_main);
321                         ad->ly_main = NULL;
322                 }
323         } else {
324                 elm_naviframe_item_pop(ad->navi_bar);
325         }
326         setting_view_privacy_service.is_create = 0;
327
328         return SETTING_RETURN_SUCCESS;
329 }
330
331 static int setting_privacy_service_update(void *cb)
332 {
333         SETTING_TRACE_BEGIN;
334         /* error check */
335         retv_if(cb == NULL, SETTING_GENERAL_ERR_NULL_DATA_PARAMETER);
336         SettingPrivacyUG *ad = (SettingPrivacyUG *) cb;
337
338         if (ad->ly_main != NULL) {
339                 evas_object_show(ad->ly_main);
340         }
341
342         return SETTING_RETURN_SUCCESS;
343 }
344
345 static int setting_privacy_service_cleanup(void *cb)
346 {
347         SETTING_TRACE_BEGIN;
348         /* error check */
349         retv_if(cb == NULL, SETTING_GENERAL_ERR_NULL_DATA_PARAMETER);
350
351         SettingPrivacyUG *ad = (SettingPrivacyUG *) cb;
352         return setting_privacy_service_destroy(ad);
353 }
354
355 /* ***************************************************
356  **
357  **call back func
358  **
359  ****************************************************/
360 static void setting_privacy_service_click_softkey_back_cb(void *data, Evas_Object *obj,
361                                             void *event_info)
362 {
363         SETTING_TRACE_BEGIN;
364         /* error check */
365         retm_if(data == NULL, "Data parameter is NULL");
366         SettingPrivacyUG *ad = (SettingPrivacyUG *) data;
367
368         service_h svc;
369         if (service_create(&svc))
370                 return;
371
372         service_add_extra_data(svc, "exit_key", "back_btn");
373         ug_send_result(ad->ug, svc);
374         service_destroy(svc);
375
376         /* Send destroy request */
377         ug_destroy_me(ad->ug);
378         SETTING_TRACE_END;
379 }
380
381 static void setting_privacy_service_click_softkey_ok_cb(void *data, Evas_Object *obj,
382                                             void *event_info)
383 {
384         SETTING_TRACE_BEGIN;
385         /* error check */
386         retm_if(data == NULL, "Data parameter is NULL");
387         SettingPrivacyUG *ad = (SettingPrivacyUG *) data;
388
389         service_h svc;
390         if (service_create(&svc))
391                 return;
392
393         service_add_extra_data(svc, "exit_key", "ok_btn");
394         ug_send_result(ad->ug, svc);
395         service_destroy(svc);
396
397         /* TEMP:Send destroy request */
398         ug_destroy_me(ad->ug);
399
400         SETTING_TRACE_END;
401 }
402
403 static void setting_privacy_service_list_Gendial_mouse_up_cb(void *data, Evas_Object *obj,
404                                                   void *event_info)
405 {
406         SETTING_TRACE_BEGIN;
407         /* error check */
408         retm_if(data == NULL, "Data parameter is NULL");
409         SettingPrivacyUG *ad = (SettingPrivacyUG *) data;
410
411         retm_if(event_info == NULL, "Invalid argument: event info is NULL");
412         Elm_Object_Item *item = (Elm_Object_Item *) event_info;
413         elm_genlist_item_selected_set(item, 0);
414         Setting_GenGroupItem_Data *list_item = (Setting_GenGroupItem_Data *) elm_object_item_data_get(item);
415
416         int old_status = elm_check_state_get(list_item->eo_check);
417         /* new status */
418         list_item->chk_status = !old_status;
419         elm_check_state_set(list_item->eo_check, list_item->chk_status);
420
421         /* privacy set */
422         int r = _set_privacy(list_item, list_item->chk_status);
423         if(r!=0)
424                 SETTING_TRACE("_set_privacy : faied [%d]", r);
425 }
426
427 static void setting_privacy_service_list_Gendial_chk_btn_cb(void *data, Evas_Object *obj,
428                                           void *event_info)
429 {
430         SETTING_TRACE_BEGIN;
431         /* error check */
432         retm_if(data == NULL, "Data parameter is NULL");
433         SettingPrivacyUG *ad = NULL;
434         Setting_GenGroupItem_Data *list_item = (Setting_GenGroupItem_Data *) data;
435         ad = list_item->userdata;
436
437         /* new status */
438         list_item->chk_status = elm_check_state_get(list_item->eo_check);
439
440         /* privacy set */
441         int r = _set_privacy(list_item, list_item->chk_status);
442         if(r!=0)
443                 SETTING_TRACE("_set_privacy : faied [%d]", r);
444 }
445