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