4 * Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd.
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
10 * http://www.apache.org/licenses/LICENSE-2.0
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.
20 #include <privilege_info.h>
21 #include <app2ext_interface.h>
23 #include "setting-appmgr-utils.h"
24 #include "setting-appmgr-pkginfo-utils.h"
26 static int appmgrUg_pkg_get_privileges_help(const char *privilege,
32 SettingAppMgrUG *ad = user_data;
33 char *name = NULL, *help = NULL;
35 retv_if(NULL == user_data, -1);
36 retv_if(NULL == ad->pkginfo, -1);
37 retv_if(NULL == privilege, 0);
41 ret = privilege_info_get_privilege_display_name(privilege, &name);
42 if(PRVMGR_ERR_NONE != ret)
44 SETTING_TRACE_ERROR("privilege_info_get_privilege_display_name() Fail(%d)", ret);
48 ret = privilege_info_get_privilege_description(privilege, &help);
49 if(PRVMGR_ERR_NONE != ret)
51 SETTING_TRACE_ERROR("privilege_info_get_privilege_description() Fail(%d)", ret);
56 desc = g_strconcat("<font_size=28><B>", name, "</B></font_size><br>",
61 appmgrUg_append_separator(info->gl_prv, ad);
63 setting_create_Gendial_field_titleItem(info->gl_prv, &ad->itc_multiline, desc, NULL);
69 static void appmgrUg_pkg_privilege_info_view(void *data, Evas_Object *obj,
75 char *grp_name = NULL;
76 Setting_GenGroupItem_Data *d_item;
77 Elm_Object_Item *item = event_info;
80 ret_if(event_info == NULL);
82 elm_genlist_item_selected_set(item, EINA_FALSE);
84 d_item = elm_object_item_data_get(item);
85 ret_if(NULL == d_item);
87 ad = d_item->userdata;
90 privilege_info_get_privilege_group_display_name(grp, &grp_name);
92 setting_push_layout_navi_bar_genlist(ad->lo_parent, ad->win, grp_name,
93 NULL, NULL, NULL, NULL, NULL, &info->gl_prv, ad->navi);
94 elm_genlist_mode_set(info->gl_prv, ELM_LIST_COMPRESS);
96 privilege_info_foreach_privilege_list_by_pkgid_and_privilege_group(info->pkgid, grp,
97 appmgrUg_pkg_get_privileges_help, ad);
100 static int appmgrUg_pkg_get_privileges_iter(const char *privilege, void *user_data)
103 gchar **str = user_data;
104 char *old_str, *name = NULL;
106 retv_if(NULL == user_data, -1);
107 retv_if(NULL == privilege, 0);
109 ret = privilege_info_get_privilege_display_name(privilege, &name);
110 if(PRVMGR_ERR_NONE != ret)
112 SETTING_TRACE_ERROR("privilege_info_get_privilege_display_name() Fail(%d)", ret);
117 *str = g_strconcat(*str, name, "<br>", NULL);
124 int appmgrUg_pkg_get_privileges_grp_iter(const char *grp, void *user_data)
127 appmgr_pkginfo *info;
128 char *grp_name = NULL;
130 SettingAppMgrUG *ad = user_data;
132 retv_if(NULL == user_data, -1);
133 retv_if(NULL == ad->pkginfo, -1);
137 ret = privilege_info_get_privilege_group_display_name(grp, &grp_name);
138 if(PRVMGR_ERR_NONE != ret)
141 "privilege_info_get_privilege_group_display_name() Fail(%d)", ret);
145 prv_desc = g_strdup("");
146 ret = privilege_info_foreach_privilege_list_by_pkgid_and_privilege_group(info->pkgid,
147 grp, appmgrUg_pkg_get_privileges_iter, &prv_desc);
148 if(PRVMGR_ERR_NONE != ret || '\0' == *prv_desc)
151 "privilege_info_foreach_privilege_list_by_pkgid_and_privilege_group()"
152 " Fail(%d), prv_desc(%p)", ret, prv_desc);
159 /* remove the last <br> */
160 char *p = strrchr(prv_desc, '<');
164 info->last_prv = setting_create_Gendial_field_def(ad->gl_pkg, &ad->itc_multiline_2txt,
165 appmgrUg_pkg_privilege_info_view, (void *)grp, SWALLOW_Type_INVALID, NULL,
166 NULL, 0, grp_name, prv_desc, NULL);
169 info->last_prv->userdata = ad;
171 if (NULL == info->first_prv)
173 info->first_prv = info->last_prv;
174 info->first_prv->group_style = SETTING_GROUP_STYLE_TOP;
178 info->last_prv->group_style = SETTING_GROUP_STYLE_CENTER;
188 void appmgrUg_pkg_free_pkginfo(appmgr_pkginfo *info)
190 ret_if(NULL == info);
193 free(info->pkg_label);
194 free(info->icon_path);
195 free(info->pkg_type);
196 free(info->pkg_version);
197 free(info->main_appid);
198 g_list_free_full(info->appids, free);
202 pkgmgr_client_free(info->pc_size);
203 info->pc_size = NULL;
205 if (info->pc_request)
207 pkgmgr_client_free(info->pc_request);
208 info->pc_request = NULL;
214 static int appmgrUg_pkg_get_appinfo_iter(pkgmgrinfo_appinfo_h handle, void *data)
218 appmgr_pkginfo *pkginfo;
219 SettingAppMgrUG *ad = data;
221 retv_if(data == NULL, -1);
223 pkginfo = ad->pkginfo;
225 ret = pkgmgrinfo_appinfo_get_appid(handle, &appid);
226 if (PMINFO_R_OK != ret || NULL == appid)
228 SETTING_TRACE_ERROR("pkgmgrinfo_appinfo_get_appid() Fail(%d)", ret);
232 ret = pkgmgrinfo_appinfo_get_label(handle, &label);
233 warn_if(PMINFO_R_OK != ret, "pkgmgrinfo_appinfo_get_label() Fail(%d)", ret);
235 if (NULL == pkginfo->icon_path && safeStrCmp(appid, pkginfo->main_appid))
236 pkginfo->icon_path = appmgrUg_get_defualt_icon(handle);
238 pkginfo->appids = g_list_append(pkginfo->appids, strdup(appid));
243 static inline void appmgrUg_pkg_update_size(appmgr_pkginfo *info)
246 char desc[APPMGRUG_MAX_STR_LEN] = {0};
248 appmgrUg_size_to_str(info->sz_total, desc, sizeof(desc));
249 g_free(info->total_size->sub_desc);
250 info->total_size->sub_desc = (char *)g_strdup(desc);
251 elm_genlist_item_fields_update(info->total_size->item, "elm.text.sub.left.bottom",
252 ELM_GENLIST_ITEM_FIELD_TEXT);
254 appmgrUg_size_to_str(info->sz_data, desc, sizeof(desc));
255 g_free(info->data_size->sub_desc);
256 info->data_size->sub_desc = (char *)g_strdup(desc);
257 elm_genlist_item_fields_update(info->data_size->item, "elm.text.sub.left.bottom",
258 ELM_GENLIST_ITEM_FIELD_TEXT);
260 appmgrUg_size_to_str(info->sz_total - info->sz_data, desc, sizeof(desc));
261 g_free(info->app_size->sub_desc);
262 info->app_size->sub_desc = (char *)g_strdup(desc);
263 elm_genlist_item_fields_update(info->app_size->item, "elm.text.sub.left.bottom",
264 ELM_GENLIST_ITEM_FIELD_TEXT);
267 void appmgrUg_pkg_update_cache_size(void *data)
270 retm_if(data == NULL, "Data parameter is NULL");
271 SettingAppMgrUG *ad = data;
272 appmgr_pkginfo *info = ad->pkginfo;
273 retm_if(info == NULL, "info is NULL");
275 char desc[APPMGRUG_MAX_STR_LEN] = {0};
277 appmgrUg_size_to_str(info->sz_cache, desc, sizeof(desc));
279 if (ad->cache_size && ad->cache_size->item) {
280 ad->cache_size->sub_desc = (char *)g_strdup(desc);
281 elm_genlist_item_fields_update(ad->cache_size->item, "elm.text.sub.left.bottom",
282 ELM_GENLIST_ITEM_FIELD_TEXT);
285 if (ad->clear_cache && ad->clear_cache->item) {
286 elm_genlist_item_update(ad->clear_cache->item);
290 static int _appmgrUg_pkg_get_pkg_size(int req_id, const char *pkg_type,
291 const char *pkgid, const char *key, const char *val, const void *pmsg, void *data)
293 appmgr_pkginfo *info = data;
295 retv_if(NULL == data, 0);
296 retv_if(NULL == key, 0);
297 retv_if(NULL == val, 0);
299 info->sz_total = atoi(val);
300 info->sz_data = atoi(key);
302 appmgrUg_pkg_update_size(info);
307 static inline void appmgrUg_pkg_get_pkg_size(appmgr_pkginfo *info)
311 ret_if(NULL == info);
314 pkgmgr_client_free(info->pc_size);
316 info->pc_size = pkgmgr_client_new(PC_REQUEST);
317 if (NULL == info->pc_size)
319 SETTING_TRACE_ERROR("pkgmgr_client_new() Fail");
323 ret = pkgmgr_client_get_size(info->pc_size, info->pkgid, PM_GET_TOTAL_SIZE,
324 _appmgrUg_pkg_get_pkg_size, info);
325 warn_if(ret, "pkgmgr_client_get_size(%s) Fail(%d)", info->pkgid, ret);
328 static void _get_cache_cb(const char *package_id, const pkg_size_info_t *size_info, void *data){
330 retm_if(data == NULL, "data == NULL");
331 SettingAppMgrUG *ad = data;
332 appmgr_pkginfo *info = ad->pkginfo;
333 retm_if(info == NULL, "info == NULL");
335 info->sz_cache = (int)size_info->cache_size;
336 SETTING_TRACE("cache size: %lld", size_info->cache_size);
337 appmgrUg_pkg_update_cache_size(ad);
340 static Eina_Bool __get_pkg_size_on_time(void *data){
342 retvm_if(data == NULL, EINA_FALSE, "Data parameter is NULL");
343 SettingAppMgrUG *ad = data;
344 appmgr_pkginfo *info = ad->pkginfo;
345 retv_if(info == NULL, 0);
348 if (info->is_disable) {
349 //if pkg is disabled, size = 0
351 appmgrUg_pkg_update_cache_size(ad);
353 int ret = package_manager_get_package_size_info(info->pkgid,
356 SETTING_TRACE_ERROR("failed to invoke ret = %d", ret);
360 //get pkg total & data size
361 if (ad->sel_total < 0 || ad->sel_data_size < 0) {
362 appmgrUg_pkg_get_pkg_size(info);
364 info->sz_total = ad->sel_total;
365 info->sz_data = ad->sel_data_size;
366 appmgrUg_pkg_update_size(info);
369 ad->pkginfo_getsize_timer = NULL;
373 static int _appmgrUg_pkg_get_info(pkgmgrinfo_pkginfo_h handle, void *data){
374 retv_if(data == NULL, 0);
375 SettingAppMgrUG *ad = data;
376 appmgr_pkginfo *info = ad->pkginfo;
377 retv_if(info == NULL, 0);
382 //get pkgsize info in timer to avoid block UI
386 if (ad->pkginfo_getsize_timer) {
387 ecore_timer_del(ad->pkginfo_getsize_timer);
388 ad->pkginfo_getsize_timer = NULL;
390 ad->pkginfo_getsize_timer = ecore_timer_add(0.6,
391 (Ecore_Task_Cb) __get_pkg_size_on_time, ad);
395 info->icon_path = strdup(ad->sel_icon);
398 ret = pkgmgrinfo_pkginfo_get_icon(handle, &value);
399 warn_if(ret < 0, "pkgmgrinfo_pkginfo_get_icon() Fail(%d)", ret);
400 info->icon_path = appmgrUg_check_icon(value);
401 ad->sel_icon = SAFE_STRDUP(info->icon_path);
404 SETTING_TRACE("icon_path : %s", info->icon_path);
407 ret = pkgmgrinfo_pkginfo_get_mainappid(handle, &value);
408 warn_if(ret < 0, "pkgmgrinfo_pkginfo_get_mainappid() Fail(%d)", ret);
409 info->main_appid = SAFE_STRDUP(value);
411 ret = pkgmgrinfo_appinfo_get_list(handle, PMINFO_ALL_APP,
412 appmgrUg_pkg_get_appinfo_iter, ad);
413 warn_if(PMINFO_R_OK != ret, "pkgmgrinfo_appinfo_get_list() Fail(%d)", ret);
415 ret = pkgmgrinfo_pkginfo_is_movable(handle, &info->is_movable);
416 warn_if(PMINFO_R_OK != ret, "pkgmgrinfo_pkginfo_is_movable() Fail(%d)", ret);
418 ret = pkgmgrinfo_pkginfo_is_preload(handle, &info->is_preload);
419 warn_if(PMINFO_R_OK != ret, "pkgmgrinfo_pkginfo_is_preload() Fail(%d)", ret);
421 ret = pkgmgrinfo_pkginfo_is_update(handle, &info->is_updated);
422 warn_if(PMINFO_R_OK != ret, "pkgmgrinfo_pkginfo_is_update() Fail(%d)", ret);
424 ret = pkgmgrinfo_pkginfo_get_installed_storage(handle, &info->storage);
425 warn_if(PMINFO_R_OK != ret, "pkgmgrinfo_pkginfo_get_installed_storage() Fail(%d)", ret);
427 ret = pkgmgrinfo_pkginfo_is_removable(handle, &info->removable);
428 warn_if(PMINFO_R_OK != ret, "pkgmgrinfo_pkginfo_is_removable() Fail(%d)", ret);
431 ret = pkgmgrinfo_pkginfo_get_type(handle, &value);
432 warn_if(PMINFO_R_OK != ret, "pkgmgrinfo_pkginfo_get_type() Fail(%d)", ret);
433 info->pkg_type = SAFE_STRDUP(value);
436 ret = pkgmgrinfo_pkginfo_get_version(handle, &value);
437 warn_if(PMINFO_R_OK != ret, "pkgmgrinfo_pkginfo_get_version() Fail(%d)", ret);
438 info->pkg_version = SAFE_STRDUP(value);
442 info->pkg_label = strdup(ad->sel_label);
447 ret = pkgmgrinfo_pkginfo_get_label(handle, &value);
448 warn_if(ret < 0, "pkgmgrinfo_pkginfo_get_label() Fail(%d)", ret);
449 info->pkg_label = SAFE_STRDUP(value);
450 ad->sel_label = SAFE_STRDUP(info->pkg_label);
453 ret = pkgmgrinfo_pkginfo_is_support_disable(handle, &info->is_support_disable);
454 warn_if(PMINFO_R_OK != ret, "pkgmgrinfo_appinfo_is_support_disable() Fail(%d)", ret);
459 int appmgrUg_pkg_get_info(SettingAppMgrUG *ad)
463 appmgr_pkginfo *info;
465 retv_if(NULL == ad, -1);
466 retv_if(NULL == ad->sel_pkgid, -1);
468 info = calloc(1, sizeof(appmgr_pkginfo));
471 SETTING_TRACE_ERROR("calloc() Fail");
475 info->is_disable = ad->sel_is_disabled;
476 info->pkgid = strdup(ad->sel_pkgid);
478 if (info->is_disable) {
479 SETTING_TRACE("Get disabled app[%s] info", info->pkgid);
480 pkgmgrinfo_pkginfo_filter_h filter_handle;
481 int ret = pkgmgrinfo_pkginfo_filter_create(&filter_handle);
483 warn_if(PMINFO_R_OK != ret, "pkgmgrinfo_appinfo_filter_create() Fail(%d)", ret);
485 ret = pkgmgrinfo_pkginfo_filter_add_bool(filter_handle,
486 PMINFO_PKGINFO_PROP_PACKAGE_DISABLE, EINA_TRUE);
488 warn_if(PMINFO_R_OK != ret, "pkgmgrinfo_appinfo_filter_add_bool() Fail(%d)", ret);
490 ret = pkgmgrinfo_pkginfo_filter_add_string(filter_handle,
491 PMINFO_PKGINFO_PROP_PACKAGE_ID, info->pkgid);
493 warn_if(PMINFO_R_OK != ret, "pkgmgrinfo_pkginfo_filter_add_string() Fail(%d)", ret);
495 ret = pkgmgrinfo_pkginfo_filter_foreach_pkginfo(filter_handle,
496 _appmgrUg_pkg_get_info, ad);
497 warn_if(PMINFO_R_OK != ret, "pkgmgrinfo_pkginfo_filter_foreach_pkginfo() Fail(%d)", ret);
499 pkgmgrinfo_pkginfo_filter_destroy(filter_handle);
502 pkgmgrinfo_pkginfo_h handle;
503 ret = pkgmgrinfo_pkginfo_get_pkginfo(info->pkgid, &handle);
504 if (PMINFO_R_OK != ret)
506 SETTING_TRACE_ERROR("pkgmgrinfo_pkginfo_get_pkginfo() Fail(%d)", ret);
507 appmgrUg_pkg_free_pkginfo(info);
511 _appmgrUg_pkg_get_info(handle, ad);
512 pkgmgrinfo_pkginfo_destroy_pkginfo(handle);
518 void appmgrUg_pkg_moveto_worker_finish(SettingAppMgrUG *ad)
523 ret = pthread_join(ad->pkginfo->tid, &ret_val);
526 SETTING_TRACE_ERROR("pthread_join() Fail(%d)", ret);
538 evas_object_del(ad->popup);
540 ad->popup = setting_create_popup_with_btn(ad, ad->win, NULL,
541 MGRAPP_STR_MOVE_COMPLETED, appmgrUg_popup_del, 0, 1, MGRAPP_STR_OK);
542 setting_view_update(ad->pkginfo_view, ad);
544 case APP2EXT_ERROR_MMC_STATUS:
545 case APP2EXT_ERROR_MMC_INSUFFICIENT_MEMORY:
546 SETTING_TRACE_ERROR("moveto() SD_FULL Fail(%d)", ret);
547 appmgrUg_fail_popup(MGRAPP_STR_SD_FULL, ad);
549 case APP2EXT_ERROR_INVALID_CASE:
550 if (PMINFO_INTERNAL_STORAGE == ad->pkginfo->storage)
552 SETTING_TRACE_ERROR("moveto() NO_MEM Fail(%d)", ret);
553 appmgrUg_fail_popup(MGRAPP_STR_NO_MEM, ad);
557 SETTING_TRACE_ERROR("moveto() Fail(%d)", ret);
558 appmgrUg_fail_popup(MGRAPP_STR_MOVE_FAIL, ad);
562 ad->pkg_request = APPMGRUG_PKG_REQUEST_NONE;
565 void* appmgrUg_pkg_moveto_worker(void *data)
569 appmgr_pkginfo *info;
570 SettingAppMgrUG *ad = data;
571 pkgmgr_move_type move_type;
573 retv_if(NULL == data, NULL);
574 retv_if(NULL == ad->pkginfo, NULL);
578 if (PMINFO_INTERNAL_STORAGE == info->storage)
579 move_type = PM_MOVE_TO_SDCARD;
581 move_type = PM_MOVE_TO_INTERNAL;
583 pc = pkgmgr_client_new(PC_REQUEST);
584 ret = pkgmgr_client_request_service(PM_REQUEST_MOVE, move_type, pc, info->pkg_type,
585 info->pkgid, NULL, NULL, NULL);
587 pkgmgr_client_free(pc);
589 pthread_exit((void*)ret);
592 static void appmgrUg_pkg_ug_layout_cb(ui_gadget_h ug, enum ug_mode mode, void *priv)
594 Evas_Object *base = NULL;
596 ret_if(priv == NULL);
598 base = ug_get_layout(ug);
601 SETTING_TRACE_ERROR("ug_get_layout() Fail");
606 case UG_MODE_FULLVIEW:
607 evas_object_size_hint_weight_set(base, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
608 evas_object_show(base);
616 static void appmgrUg_pkg_ug_destroy_cb(ui_gadget_h ug, void *priv)
618 SettingAppMgrUG *ad = priv;
620 ret_if(priv == NULL);
623 setting_ug_destroy(ug);
625 elm_object_tree_focus_allow_set(ad->lo_main, EINA_TRUE);
628 void appmgrUg_pkg_webapp_ug(void *data, Evas_Object *obj, void *event_info)
634 SettingAppMgrUG *ad = data;
635 Elm_Object_Item *item = event_info;
637 ret_if(NULL == data);
638 ret_if(NULL == event_info);
640 elm_genlist_item_selected_set(item, EINA_FALSE);
642 if (app_control_create(&svc))
645 app_control_add_extra_data(svc, "pkg_name", ad->pkginfo->pkgid);
647 memset(&cbs, 0, sizeof(struct ug_cbs));
648 cbs.layout_cb = appmgrUg_pkg_ug_layout_cb;
649 cbs.result_cb = NULL;
650 cbs.destroy_cb = appmgrUg_pkg_ug_destroy_cb;
651 cbs.priv = (void *)ad;
653 elm_object_tree_focus_allow_set(ad->lo_main, EINA_FALSE);
654 ug = setting_ug_create(ad->ug, "webapp-detail-efl", UG_MODE_FULLVIEW, svc, &cbs);
655 warn_if(NULL == ug, "setting_ug_create() Fail");
657 app_control_destroy(svc);
661 void appmgrUg_pkg_clear_default(void *data, Evas_Object *obj, void *event_info)
664 appmgr_pkginfo *info;
665 SettingAppMgrUG *ad = data;
666 Elm_Object_Item *next;
667 Elm_Object_Item *item = event_info;
669 ret_if(NULL == data);
670 ret_if(NULL == ad->pkginfo);
671 ret_if(NULL == event_info);
675 elm_genlist_item_selected_set(item, EINA_FALSE);
681 char *appid = cur->data;
688 ret = appsvc_unset_defapp(appid);
689 warn_if(APPSVC_RET_OK != ret, "appsvc_unset_defapp() Fail(%d)", ret);
692 /* clear default separator */
693 next = elm_genlist_item_next_get(info->def_sep);
694 elm_object_item_del(info->def_sep);
695 info->def_sep = NULL;
697 /* clear default title */
699 next = elm_genlist_item_next_get(next);
700 elm_object_item_del(item);
702 /* clear default button */
704 next = elm_genlist_item_next_get(next);
705 elm_object_item_del(item);
707 /* clear default notice */
708 elm_object_item_del(next);
710 setting_view_update(ad->main_view, ad);
713 char* appmgrUg_pkg_size_gl_label_get(void *data, Evas_Object *obj,
717 Evas_Object *ao = NULL;
718 char desc[APPMGRUG_MAX_STR_LEN] = {0};
719 Setting_GenGroupItem_Data *item_data = data;
721 retv_if(data == NULL, NULL);
723 if (0 == strcmp(part, "elm.text.sub.left.bottom"))
724 label = SAFE_STRDUP(_(item_data->sub_desc));
725 else if (0 == strcmp(part, "elm.text.main.left.top"))
726 label = SAFE_STRDUP(_(item_data->keyStr));
728 if (item_data->keyStr && item_data->sub_desc)
729 snprintf(desc, sizeof(desc), "%s,%s", _(item_data->keyStr), _(item_data->sub_desc));
731 ao = elm_object_item_access_object_get(item_data->item);
732 setting_set_tts_info(ao, desc, "", "", "");