fix privacy popup back button issue
[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         SETTING_TRACE("privacy_id : [%s]", privacy_id);
165
166         r = privacy_info_get_privacy_display_name(privacy_info, &privacy_name);
167         if(r != 0){
168                 SETTING_TRACE_ERROR("privacy_info_get_privacy_display_name failed : %d", r);
169         }
170         SETTING_TRACE("privacy_name : [%s]", privacy_name);
171
172         r = privacy_info_get_privacy_description(privacy_info, &privacy_desc);
173         if(r != 0){
174                 SETTING_TRACE_ERROR("privacy_info_get_privacy_description failed : %d", r);
175         }
176         SETTING_TRACE("privacy_desc : [%s]", privacy_desc);
177
178         r = privacy_info_is_enabled(privacy_info, &enabled);
179         if(r != 0){
180                 SETTING_TRACE_ERROR("privacy_info_is_enabled failed : %d", r);
181         }
182         SETTING_TRACE("enabled : [%d]", enabled);
183
184         setting_privacy_privacyinfo_t *app_info = NULL;
185         app_info = (setting_privacy_privacyinfo_t*)malloc(sizeof(setting_privacy_privacyinfo_t));
186         retv_if(app_info == NULL, -1);
187         memset(app_info, 0, sizeof(setting_privacy_privacyinfo_t));
188         app_info->privacy_id = strdup(privacy_id);
189         app_info->privacy_name = strdup(privacy_name);
190         app_info->privacy_desc = strdup(privacy_desc);
191         app_info->enabled = enabled;
192
193         ad->privacy_service =
194         setting_create_Gendial_field_def(ad->scroller,
195                                 &(ad->itc_1text_1icon),
196                                 setting_privacy_service_list_Gendial_mouse_up_cb,
197                                 /*NULL,*/ad,
198                                 SWALLOW_Type_1CHECK,
199                                 NULL,
200                                 NULL,
201                                 app_info->enabled,                      /* the initial state */
202                                 privacy_name, NULL,
203                                 setting_privacy_service_list_Gendial_chk_btn_cb);
204
205         if(ad->privacy_service) {
206                 ad->privacy_service->userdata = ad;
207         } else {
208                 SETTING_TRACE_ERROR("ad->privacy_service is NULL");
209                 return SETTING_RETURN_FAIL;
210         }
211
212         ad->privacy_check_list = eina_list_append(ad->privacy_check_list, app_info);
213
214         //FREE(privacy_id);
215         //FREE(privacy_name);
216         //FREE(privacy_desc);
217 }
218
219 /**
220  * get 3rd party applist from AIL & searching dir/file by the defined rule
221  * @param data ad
222  * if data is NULL --> just get how many items are there
223  * if data is NOT NULL --> draw UI code
224  */
225 static void setting_privacy_get_privacy_list(void* data)
226 {
227         SETTING_TRACE_BEGIN;
228         SettingPrivacyUG *ad = (SettingPrivacyUG *) data;
229
230         char *pkg_id=NULL;
231         pkg_id = ad->pkg_id;
232         int r = 0;
233         r = privacy_manager_foreach_privacy_info(pkg_id ,_privacy_info_cb, ad);
234         if (0 != r) {
235                 SETTING_TRACE_ERROR("privacy_manager_foreach_privacy_info failed. %d", r);
236         }
237 }
238
239
240 /* ***************************************************
241  **
242  **basic func
243  **
244  ****************************************************/
245 static int setting_privacy_service_create(void *cb)
246 {
247         SETTING_TRACE_BEGIN;
248         retv_if(cb == NULL, SETTING_GENERAL_ERR_NULL_DATA_PARAMETER);
249
250         SettingPrivacyUG *ad = (SettingPrivacyUG *) cb;
251
252         //seperate default from app control
253         char *pkg_id = NULL;
254         service_h service = ad->bundle_data;
255         service_get_extra_data(service, "pkg_id", &pkg_id);
256
257         //need to pkgname from pkgid(pkgmgr)
258         ad->pkg_id = strdup(pkg_id);
259         SETTING_TRACE("pkgid [%s]", ad->pkg_id);
260         int r = _get_privacy_appinfo_by_pkgid(ad);
261         if (r != 0)
262                 SETTING_TRACE("_get_privacy_app_pkg_by_pkgid : fail");
263
264         // init
265         ad->privacy_check_list = NULL;
266
267         // itc
268         setting_create_Gendial_itc("1text.1icon.3", &(ad->itc_1text_1icon));
269
270         Elm_Object_Item *item = NULL;
271         Evas_Object *scroller = NULL;
272         ad->ly_main =
273             setting_create_layout_navi_bar_genlist(ad->win_main_layout,
274                                                    ad->win_get,
275                                                    ad->pkg_label,
276                                                    _("IDS_COM_BODY_BACK"), //_("IDS_COM_BODY_BACK"),
277                                                    _("IDS_COM_SK_OK"), //
278                                                    setting_privacy_service_click_softkey_back_cb, //setting_privacy_service_click_softkey_back_cb,
279                                                    setting_privacy_service_click_softkey_ok_cb,
280                                                    ad,
281                                                    &ad->scroller,
282                                                    &(ad->navi_bar));
283
284         /* separator */
285         item = elm_genlist_item_append(ad->scroller , &itc_seperator, NULL, NULL, ELM_GENLIST_ITEM_NONE, NULL, NULL);
286         elm_genlist_item_select_mode_set(item, ELM_OBJECT_SELECT_MODE_DISPLAY_ONLY);
287
288         setting_create_Gendial_field_def(ad->scroller, &itc_multiline_text, NULL,
289                         ad, SWALLOW_Type_LAYOUT_SPECIALIZTION_X,
290                         NULL, NULL, 0, KeyStr_PrivacyService_desc, NULL, NULL);
291         /* separator */
292         item = elm_genlist_item_append(ad->scroller , &itc_seperator, NULL, NULL, ELM_GENLIST_ITEM_NONE, NULL, NULL);
293         elm_genlist_item_select_mode_set(item, ELM_OBJECT_SELECT_MODE_DISPLAY_ONLY);
294
295         // get_applist
296         setting_privacy_get_privacy_list(ad);
297
298         /* separator */
299         item = elm_genlist_item_append(ad->scroller , &itc_bottom_seperator, NULL, NULL, ELM_GENLIST_ITEM_NONE, NULL, NULL);
300         elm_genlist_item_select_mode_set(item, ELM_OBJECT_SELECT_MODE_DISPLAY_ONLY);
301
302         /* update info */
303         setting_view_privacy_service.is_create = 1;
304         return SETTING_RETURN_SUCCESS;
305 }
306
307 static int setting_privacy_service_destroy(void *cb)
308 {
309         SETTING_TRACE_BEGIN;
310         /* error check */
311         retv_if(cb == NULL, SETTING_GENERAL_ERR_NULL_DATA_PARAMETER);
312         SettingPrivacyUG *ad = (SettingPrivacyUG *) cb;
313
314         if (ad->view_to_load == &setting_view_privacy_service) {
315                 if (ad->ly_main) {
316                         evas_object_del(ad->ly_main);
317                         ad->ly_main = NULL;
318                 }
319         } else {
320                 elm_naviframe_item_pop(ad->navi_bar);
321         }
322         setting_view_privacy_service.is_create = 0;
323
324         return SETTING_RETURN_SUCCESS;
325 }
326
327 static int setting_privacy_service_update(void *cb)
328 {
329         SETTING_TRACE_BEGIN;
330         /* error check */
331         retv_if(cb == NULL, SETTING_GENERAL_ERR_NULL_DATA_PARAMETER);
332         SettingPrivacyUG *ad = (SettingPrivacyUG *) cb;
333
334         if (ad->ly_main != NULL) {
335                 evas_object_show(ad->ly_main);
336         }
337
338         return SETTING_RETURN_SUCCESS;
339 }
340
341 static int setting_privacy_service_cleanup(void *cb)
342 {
343         SETTING_TRACE_BEGIN;
344         /* error check */
345         retv_if(cb == NULL, SETTING_GENERAL_ERR_NULL_DATA_PARAMETER);
346
347         SettingPrivacyUG *ad = (SettingPrivacyUG *) cb;
348         return setting_privacy_service_destroy(ad);
349 }
350
351 /* ***************************************************
352  **
353  **call back func
354  **
355  ****************************************************/
356 static void setting_privacy_service_click_softkey_back_cb(void *data, Evas_Object *obj,
357                                             void *event_info)
358 {
359         SETTING_TRACE_BEGIN;
360         /* error check */
361         retm_if(data == NULL, "Data parameter is NULL");
362         SettingPrivacyUG *ad = (SettingPrivacyUG *) data;
363
364         service_h svc;
365         if (service_create(&svc))
366                 return;
367
368         service_add_extra_data(svc, "exit_key", "back_btn");
369         ug_send_result(ad->ug, svc);
370         service_destroy(svc);
371
372         /* Send destroy request */
373         ug_destroy_me(ad->ug);
374         SETTING_TRACE_END;
375 }
376
377 static void setting_privacy_service_click_softkey_ok_cb(void *data, Evas_Object *obj,
378                                             void *event_info)
379 {
380         SETTING_TRACE_BEGIN;
381         /* error check */
382         retm_if(data == NULL, "Data parameter is NULL");
383         SettingPrivacyUG *ad = (SettingPrivacyUG *) data;
384
385         service_h svc;
386         if (service_create(&svc))
387                 return;
388
389         service_add_extra_data(svc, "exit_key", "ok_btn");
390         ug_send_result(ad->ug, svc);
391         service_destroy(svc);
392
393         /* TEMP:Send destroy request */
394         ug_destroy_me(ad->ug);
395
396         SETTING_TRACE_END;
397 }
398
399 static void setting_privacy_service_list_Gendial_mouse_up_cb(void *data, Evas_Object *obj,
400                                                   void *event_info)
401 {
402         SETTING_TRACE_BEGIN;
403         /* error check */
404         retm_if(data == NULL, "Data parameter is NULL");
405         SettingPrivacyUG *ad = (SettingPrivacyUG *) data;
406
407         retm_if(event_info == NULL, "Invalid argument: event info is NULL");
408         Elm_Object_Item *item = (Elm_Object_Item *) event_info;
409         elm_genlist_item_selected_set(item, 0);
410         Setting_GenGroupItem_Data *list_item = (Setting_GenGroupItem_Data *) elm_object_item_data_get(item);
411
412         int old_status = elm_check_state_get(list_item->eo_check);
413         /* new status */
414         list_item->chk_status = !old_status;
415         elm_check_state_set(list_item->eo_check, list_item->chk_status);
416
417         /* privacy set */
418         int r = _set_privacy(list_item, list_item->chk_status);
419         if(r!=0)
420                 SETTING_TRACE("_set_privacy : faied [%d]", r);
421 }
422
423 static void setting_privacy_service_list_Gendial_chk_btn_cb(void *data, Evas_Object *obj,
424                                           void *event_info)
425 {
426         SETTING_TRACE_BEGIN;
427         /* error check */
428         retm_if(data == NULL, "Data parameter is NULL");
429         SettingPrivacyUG *ad = NULL;
430         Setting_GenGroupItem_Data *list_item = (Setting_GenGroupItem_Data *) data;
431         ad = list_item->userdata;
432
433         /* new status */
434         list_item->chk_status = elm_check_state_get(list_item->eo_check);
435
436         /* privacy set */
437         int r = _set_privacy(list_item, list_item->chk_status);
438         if(r!=0)
439                 SETTING_TRACE("_set_privacy : faied [%d]", r);
440 }
441