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