fix for applying wayland (removing X)
[apps/home/settings.git] / setting-appmgr / src / setting-appmgr-pkginfo.c
1 /*
2  * setting
3  *
4  * Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd.
5  *
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
9  *
10  * http://www.apache.org/licenses/LICENSE-2.0
11  *
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.
17  *
18  */
19 #include <appsvc.h>
20 #include <privilege_info.h>
21
22
23 #include <package_manager.h>
24
25 #include "setting-appmgr-utils.h"
26 #include "setting-appmgr-pkginfo-utils.h"
27 #include "setting-appmgr-pkginfo.h"
28
29 #define APPMGRUG_PROGRESSBAR_TIMEOUT 10
30
31 setting_view setting_view_appmgr_pkginfo;
32
33 static Eina_Bool appmgrUg_pkg_back_cb(void *data, Elm_Object_Item *it)
34 {
35         SETTING_TRACE_BEGIN;
36         SettingAppMgrUG *ad = data;
37
38         retv_if(data == NULL, EINA_FALSE);
39
40         if (ad->support_taskmanager) {
41                 ug_destroy_me(ad->ug);
42                 return EINA_FALSE;
43         } else {
44                 setting_view_destroy(ad->pkginfo_view, ad);
45                 return EINA_TRUE;
46         }
47 }
48
49 static inline void appmgrUg_pkg_append_storage(SettingAppMgrUG *ad)
50 {
51         SETTING_TRACE_BEGIN;
52         appmgr_pkginfo *info;
53         char desc[APPMGRUG_MAX_STR_LEN] = {0};
54
55         ret_if(NULL == ad);
56
57         info = ad->pkginfo;
58
59         appmgrUg_append_separator(ad->gl_pkg, ad);
60
61         setting_create_Gendial_field_titleItem(ad->gl_pkg, &(ad->itc_grp_title),
62                                                MGRAPP_STR_STORAGE, NULL);
63
64         /* Total size */
65         if (0 <= ad->sel_total)
66                 appmgrUg_size_to_str(ad->sel_total, desc, sizeof(desc));
67         else
68                 snprintf(desc, sizeof(desc), "%s", MGRAPP_STR_COMPUTING);
69         info->total_size = setting_create_Gendial_field_def(ad->gl_pkg, &ad->itc_2txt_2,
70                                                             NULL, NULL, SWALLOW_Type_INVALID, NULL, NULL, 0, _(MGRAPP_STR_TOTAL), desc,
71                                                             NULL);
72
73         if (info->total_size) {
74                 info->total_size->group_style = SETTING_GROUP_STYLE_TOP;
75                 elm_genlist_item_select_mode_set(info->total_size->item,
76                                                  ELM_OBJECT_SELECT_MODE_DISPLAY_ONLY);
77         }
78
79         /* App size */
80         if (0 <= info->sz_total && 0 <= info->sz_data)
81                 appmgrUg_size_to_str(info->sz_total - info->sz_data, desc, sizeof(desc));
82         else
83                 snprintf(desc, sizeof(desc), "%s", MGRAPP_STR_COMPUTING);
84         info->app_size = setting_create_Gendial_field_def(ad->gl_pkg, &ad->itc_2txt_2,
85                                                           NULL, NULL, SWALLOW_Type_INVALID, NULL, NULL, 0, MGRAPP_STR_APPLICATION,
86                                                           desc, NULL);
87         if (info->app_size) {
88                 info->app_size->group_style = SETTING_GROUP_STYLE_CENTER;
89                 elm_genlist_item_select_mode_set(info->app_size->item,
90                                                  ELM_OBJECT_SELECT_MODE_DISPLAY_ONLY);
91         }
92
93         /* Data size */
94         if (0 <= info->sz_data)
95                 appmgrUg_size_to_str(info->sz_data, desc, sizeof(desc));
96         else
97                 snprintf(desc, sizeof(desc), "%s", MGRAPP_STR_COMPUTING);
98         info->data_size = setting_create_Gendial_field_def(ad->gl_pkg, &ad->itc_2txt_2,
99                                                            NULL, NULL, SWALLOW_Type_INVALID, NULL, NULL, 0, MGRAPP_STR_DATA,
100                                                            desc, NULL);
101         if (info->data_size) {
102                 info->data_size->group_style = SETTING_GROUP_STYLE_BOTTOM;
103                 elm_genlist_item_select_mode_set(info->data_size->item,
104                                                  ELM_OBJECT_SELECT_MODE_DISPLAY_ONLY);
105         }
106
107 }
108
109 static inline void appmgrUg_pkg_append_cache(SettingAppMgrUG *ad)
110 {
111         SETTING_TRACE_BEGIN;
112         GList *cur;
113         appmgr_pkginfo *info;
114         Setting_GenGroupItem_Data *item_data = NULL;
115         char desc[APPMGRUG_MAX_STR_LEN] = {0};
116
117         ret_if(NULL == ad);
118         ret_if(NULL == ad->pkginfo);
119
120         info = ad->pkginfo;
121
122         appmgrUg_append_separator(ad->gl_pkg, ad);
123
124         /* title */
125         setting_create_Gendial_field_titleItem(ad->gl_pkg, &(ad->itc_grp_title),
126                                                MGRAPP_STR_CACHE, NULL);
127
128         /* cache size */
129         if (0 <= info->sz_cache)
130                 appmgrUg_size_to_str(info->sz_cache, desc, sizeof(desc));
131         else
132                 snprintf(desc, sizeof(desc), "%s", MGRAPP_STR_COMPUTING);
133         ad->cache_size = setting_create_Gendial_field_def(ad->gl_pkg, &ad->itc_2txt_2,
134                                                           NULL, NULL, SWALLOW_Type_INVALID, NULL, NULL, 0, MGRAPP_STR_CACHE,
135                                                           desc, NULL);
136         if (ad->cache_size) {
137                 __BACK_POINTER_SET(ad->cache_size);
138                 ad->cache_size->group_style = SETTING_GROUP_STYLE_NONE;
139                 elm_genlist_item_select_mode_set(ad->cache_size->item,
140                                                  ELM_OBJECT_SELECT_MODE_DISPLAY_ONLY);
141         }
142
143         /* clear cache */
144         item_data = (Setting_GenGroupItem_Data *) calloc(1, sizeof(Setting_GenGroupItem_Data));
145         if (item_data) {
146                 ad->clear_cache = item_data;
147                 __BACK_POINTER_SET(ad->clear_cache);
148                 item_data->userdata = ad;
149                 item_data->item = elm_genlist_item_append(ad->gl_pkg, &(ad->itc_1button), item_data, NULL,
150                                                           ELM_GENLIST_ITEM_NONE, NULL, NULL);
151                 elm_genlist_item_select_mode_set(item_data->item, ELM_OBJECT_SELECT_MODE_DISPLAY_ONLY);
152         } else {
153                 SETTING_TRACE_ERROR("item_data is NULL");
154         }
155 }
156
157 static inline void appmgrUg_pkg_append_default(SettingAppMgrUG *ad)
158 {
159         SETTING_TRACE_BEGIN;
160         GList *cur;
161         appmgr_pkginfo *info;
162
163         ret_if(NULL == ad);
164         ret_if(NULL == ad->pkginfo);
165
166         info = ad->pkginfo;
167
168         cur = info->appids;
169         while (cur) {
170                 char *appid = cur->data;
171
172                 if (appid && 1 == appsvc_is_defapp(appid))
173                         break;
174
175                 cur = cur->next;
176         }
177
178         if (NULL == cur) {
179                 SETTING_TRACE_ERROR("No defualt Application");
180                 return;
181         }
182
183         info->def_sep = appmgrUg_append_separator(ad->gl_pkg, ad);
184
185         setting_create_Gendial_field_titleItem(ad->gl_pkg, &(ad->itc_grp_title),
186                                                MGRAPP_STR_LAUNCH_BY_DEFAULT, NULL);
187
188         setting_create_Gendial_field_def(ad->gl_pkg, &ad->itc_1txt,
189                                          appmgrUg_pkg_clear_default, ad, SWALLOW_Type_INVALID, NULL, NULL, 0,
190                                          MGRAPP_STR_CLEAR_DEFAULTS, NULL, NULL);
191
192         setting_create_Gendial_field_titleItem(ad->gl_pkg, &ad->itc_multiline,
193                                                MGRAPP_STR_DEFAULT_DESC, NULL);
194 }
195
196 static inline void appmgrUg_pkg_append_website(SettingAppMgrUG *ad)
197 {
198         SETTING_TRACE_BEGIN;
199         appmgr_pkginfo *info;
200
201         ret_if(NULL == ad);
202         ret_if(NULL == ad->pkginfo);
203
204         info = ad->pkginfo;
205
206         if (safeStrCmp(info->pkg_type, "wgt")) {
207                 SETTING_TRACE_ERROR("No Web Application");
208                 return;
209         }
210
211         appmgrUg_append_separator(ad->gl_pkg, ad);
212
213         setting_create_Gendial_field_def(ad->gl_pkg, &ad->itc_1txt,
214                                          appmgrUg_pkg_webapp_ug, ad, SWALLOW_Type_INVALID, NULL, NULL, 0,
215                                          MAGAPP_STR_WEB_SETTING, NULL, NULL);
216 }
217
218 static inline void appmgrUg_pkg_append_privilege(SettingAppMgrUG *ad)
219 {
220         SETTING_TRACE_BEGIN;
221         int ret;
222         appmgr_pkginfo *info;
223         Elm_Object_Item *sep_it;
224         Setting_GenGroupItem_Data *title_itdata;
225
226         ret_if(NULL == ad);
227         ret_if(NULL == ad->pkginfo);
228
229         info = ad->pkginfo;
230
231         sep_it = appmgrUg_append_separator(ad->gl_pkg, ad);
232
233         title_itdata = setting_create_Gendial_field_titleItem(ad->gl_pkg, &(ad->itc_grp_title),
234                                                               MGRAPP_STR_PRIVILEGE, NULL);
235
236         info->first_prv = NULL;
237         ret = privilege_info_foreach_privilege_group_list_by_pkgid(info->pkgid,
238                                                                    appmgrUg_pkg_get_privileges_grp_iter, ad);
239         warn_if(PRVMGR_ERR_NONE != ret,
240                 "privilege_info_foreach_privilege_group_list_by_pkgid() Fail(%d)", ret);
241
242         if (NULL == info->first_prv) {
243                 SETTING_TRACE_ERROR("No privilege");
244                 elm_object_item_del(sep_it);
245                 if (title_itdata)
246                         elm_object_item_del(title_itdata->item);
247                 return;
248         }
249
250         if (info->first_prv == info->last_prv)
251                 info->first_prv->group_style = SETTING_GROUP_STYLE_NONE;
252         else
253                 info->last_prv->group_style = SETTING_GROUP_STYLE_BOTTOM;
254 }
255
256 static void appmgrUg_pkg_uninstall(void *data, Evas_Object *obj, void *event_info)
257 {
258         SETTING_TRACE_BEGIN;
259         int ret;
260         char *btn_str;
261         appmgr_pkginfo *info;
262         SettingAppMgrUG *ad = data;
263
264         ret_if(NULL == data);
265         ret_if(NULL == ad->pkginfo);
266
267         info = ad->pkginfo;
268
269         btn_str = elm_entry_markup_to_utf8(elm_object_text_get(obj));
270         ret = safeStrCmp(btn_str, _(MGRAPP_STR_UNINSTALL));
271         free(btn_str);
272
273         if (ad->popup) {
274                 evas_object_del(ad->popup);
275                 ad->popup = NULL;
276         }
277
278         if (0 != ret)
279                 return;
280
281         ad->popup = setting_create_popup_with_progressbar(ad, ad->win, PROGRESSBAR_STYLE, NULL,
282                                                           MGRAPP_STR_UNINSTALLING, appmgrUg_popup_del, 0, TRUE, TRUE);
283
284         if (info->pc_request)
285                 pkgmgr_client_free(info->pc_request);
286         info->pc_request = pkgmgr_client_new(PC_REQUEST);
287         if (NULL == info->pc_request) {
288                 SETTING_TRACE_ERROR("pkgmgr_client_new() Fail");
289                 return;
290         }
291
292         ad->pkg_request = APPMGRUG_PKG_REQUEST_UNINSTALL;
293         ret = pkgmgr_client_uninstall(info->pc_request, info->pkg_type, info->pkgid, PM_QUIET,
294                                       NULL, NULL);
295         if (ret < PKGMGR_R_OK) {
296                 SETTING_TRACE_ERROR("pkgmgr_client_uninstall() Fail(%d)", ret);
297                 ad->pkg_request = APPMGRUG_PKG_REQUEST_NONE;
298                 appmgrUg_fail_popup(MGRAPP_STR_UNINSTALL_FAILED, ad);
299         }
300 }
301
302 void appmgrUg_pkg_uninstall_click(void *data, Evas_Object *obj,
303                                   void *event_info)
304 {
305         SETTING_TRACE_BEGIN;
306         SettingAppMgrUG *ad = data;
307
308         ret_if(NULL == data);
309
310         if (ad->popup)
311                 evas_object_del(ad->popup);
312         ad->popup = setting_create_popup_with_btn(ad, ad->win, MGRAPP_STR_UNINSTALL, MGRAPP_STR_UNINSTALL_MSG,
313                                                   appmgrUg_pkg_uninstall, 0, 2, MGRAPP_STR_UNINSTALL, MGRAPP_STR_CANCEL);
314 }
315
316 void appmgrUg_pkg_clear_cache_click(void *data, Evas_Object *obj,
317                                     void *event_info)
318 {
319         SETTING_TRACE_BEGIN;
320         setting_retm_if(data == NULL, "Data parameter is NULL");
321         SettingAppMgrUG *ad = data;
322         ret_if(NULL == ad->pkginfo);
323
324         appmgr_pkginfo *info = ad->pkginfo;
325         int ret = package_manager_clear_cache_dir(info->pkgid);
326         if (ret != 0) {
327                 SETTING_TRACE_ERROR("failed to invoke, ret = %d", ret);
328         } else {
329                 info->sz_cache = 0;
330                 appmgrUg_pkg_update_cache_size(ad);
331         }
332 }
333
334 void appmgrUg_pkg_moveto_cb(void *data, Evas_Object *obj,
335                             void *event_info)
336 {
337         SETTING_TRACE_BEGIN;
338         int ret;
339         appmgr_pkginfo *info;
340         SettingAppMgrUG *ad = data;
341
342         ret_if(NULL == data);
343         ret_if(NULL == ad->pkginfo);
344
345         info = ad->pkginfo;
346         if (ad->popup)
347                 evas_object_del(ad->popup);
348
349         ad->popup = setting_create_popup_with_progressbar(ad, ad->win, PROGRESSBAR_STYLE,
350                                                           NULL, MGRAPP_STR_MOVEING, appmgrUg_popup_del, 0, TRUE, TRUE);
351
352         ad->pkg_request = APPMGRUG_PKG_REQUEST_MOVE;
353
354         ret = pthread_create(&info->tid, NULL, appmgrUg_pkg_moveto_worker, ad);
355         if (ret) {
356                 SETTING_TRACE_ERROR("phread_create() Fail(%d)", ret);
357                 appmgrUg_fail_popup(MGRAPP_STR_MOVE_FAIL, ad);
358         }
359 }
360
361 static void appmgrUg_pkg_append_toolbar(Evas_Object *toolbar,
362                                         SettingAppMgrUG *ad)
363 {
364         SETTING_TRACE_BEGIN;
365         int ret, mmc;
366         char *btn_str;
367         appmgr_pkginfo *info;
368         Elm_Object_Item *tool_it;
369         const char *mmc_key = VCONFKEY_SYSMAN_MMC_STATUS;
370
371         ret_if(NULL == ad->pkginfo);
372
373         info = ad->pkginfo;
374
375         if (NULL == toolbar) {
376                 elm_object_item_del(elm_toolbar_first_item_get(ad->pkg_toolbar));
377                 elm_object_item_del(elm_toolbar_last_item_get(ad->pkg_toolbar));
378                 toolbar = ad->pkg_toolbar;
379         }
380
381         /* Move to */
382         mmc = VCONFKEY_SYSMAN_MMC_REMOVED;
383         ret = vconf_get_int(mmc_key, &mmc);
384         warn_if(ret, "vconf_get_int(%s) Fail", mmc_key);
385
386         if (PMINFO_INTERNAL_STORAGE == info->storage)
387                 btn_str = MGRAPP_STR_MOVE_TO_SD;
388         else
389                 btn_str = MGRAPP_STR_MOVE_TO_PHONE;
390         tool_it = elm_toolbar_item_append(toolbar, NULL, btn_str, appmgrUg_pkg_moveto_cb, ad);
391         elm_object_item_domain_text_translatable_set(tool_it, SETTING_PACKAGE, EINA_TRUE);
392         if (VCONFKEY_SYSMAN_MMC_MOUNTED != mmc || !info->is_movable || info->is_preload)
393                 elm_object_item_disabled_set(tool_it, EINA_TRUE);
394
395         /* Uninstall */
396         if (info->is_preload && info->is_updated)
397                 btn_str = MGRAPP_STR_UNINSTALL_UPDATES;
398         else
399                 btn_str = MGRAPP_STR_UNINSTALL;
400         tool_it = elm_toolbar_item_append(toolbar, NULL, btn_str,
401                                           appmgrUg_pkg_uninstall_click, ad);
402         elm_object_item_domain_text_translatable_set(tool_it, SETTING_PACKAGE, EINA_TRUE);
403
404         if (!info->removable)
405                 elm_object_item_disabled_set(tool_it, EINA_TRUE);
406 }
407
408 static inline Evas_Object *appmgrUg_pkg_create_toolbar(Evas_Object *parent,
409                                                        SettingAppMgrUG *ad)
410 {
411         SETTING_TRACE_BEGIN;
412         Evas_Object *toolbar;
413
414         retv_if(NULL == ad, NULL);
415
416         toolbar = elm_toolbar_add(parent);
417
418         elm_object_style_set(toolbar, "default");
419         elm_toolbar_select_mode_set(toolbar, ELM_OBJECT_SELECT_MODE_NONE);
420         elm_toolbar_shrink_mode_set(toolbar, ELM_TOOLBAR_SHRINK_EXPAND);
421         elm_toolbar_transverse_expanded_set(toolbar, EINA_TRUE);
422
423         appmgrUg_pkg_append_toolbar(toolbar, ad);
424
425         evas_object_show(toolbar);
426
427         return toolbar;
428 }
429
430 static void appmgrUg_pkg_append_genlist(SettingAppMgrUG *ad)
431 {
432         SETTING_TRACE_BEGIN;
433         Elm_Object_Item *item;
434
435         appmgrUg_append_separator(ad->gl_pkg, ad);
436
437         /* Title (pkg name, version S) */
438         item = elm_genlist_item_append(ad->gl_pkg, &ad->itc_info_title, ad, NULL,
439                                        ELM_GENLIST_ITEM_NONE, NULL, NULL);
440         elm_genlist_item_select_mode_set(item, ELM_OBJECT_SELECT_MODE_DISPLAY_ONLY);
441
442         item = elm_genlist_item_append(ad->gl_pkg, &ad->itc_2button1, ad, NULL,
443                                        ELM_GENLIST_ITEM_NONE, NULL, NULL);
444         /*elm_genlist_item_select_mode_set(item, ELM_OBJECT_SELECT_MODE_DISPLAY_ONLY); */
445
446         appmgrUg_pkg_append_storage(ad);
447
448         item = elm_genlist_item_append(ad->gl_pkg, &ad->itc_2button2, ad, NULL,
449                                        ELM_GENLIST_ITEM_NONE, NULL, NULL);
450         /*elm_genlist_item_select_mode_set(item, ELM_OBJECT_SELECT_MODE_DISPLAY_ONLY); */
451
452         appmgrUg_pkg_append_cache(ad);
453
454         appmgrUg_pkg_append_default(ad);
455 #if 0
456         appmgrUg_pkg_append_website(ad);
457 #endif
458
459         appmgrUg_pkg_append_privilege(ad);
460
461         appmgrUg_append_separator(ad->gl_pkg, ad);
462 }
463
464 static int appmgrUg_pkg_create(void *data)
465 {
466         SETTING_TRACE_BEGIN;
467         int ret;
468         Elm_Object_Item *navi_it;
469         SettingAppMgrUG *ad = data;
470
471         retv_if(data == NULL, SETTING_GENERAL_ERR_NULL_DATA_PARAMETER);
472
473         ret = appmgrUg_pkg_get_info(ad);
474         if (ret) {
475                 SETTING_TRACE_ERROR("appmgrUg_pkg_get_info() Fail", ret);
476                 appmgrUg_fail_popup(MGRAPP_STR_ERROR, ad);
477                 return -1;
478         }
479
480         navi_it = setting_push_layout_navi_bar_genlist(ad->lo_parent, ad->win,
481                                                        MGRAPP_STR_APPLICATION_INFO, NULL, NULL,
482                                                        NULL, NULL, ad, &ad->gl_pkg, ad->navi);
483         elm_genlist_mode_set(ad->gl_pkg, ELM_LIST_COMPRESS);
484         //elm_genlist_realization_mode_set(ad->gl_pkg, EINA_TRUE);
485         elm_naviframe_item_pop_cb_set(navi_it, appmgrUg_pkg_back_cb, ad);
486
487         appmgrUg_pkg_append_genlist(ad);
488
489         if (ad->support_taskmanager && ad->pc_main == NULL) {
490
491                 SETTING_TRACE("Load pkginfo view");
492                 appmgrUg_pkgmgr_subscribe(ad);
493         }
494
495         setting_view_appmgr_pkginfo.is_create = 1;
496
497         return SETTING_RETURN_SUCCESS;
498 }
499
500 static int appmgrUg_pkg_destroy(void *data)
501 {
502         SETTING_TRACE_BEGIN;
503         SettingAppMgrUG *ad = data;
504
505         retv_if(NULL == data, SETTING_GENERAL_ERR_NULL_DATA_PARAMETER);
506
507         if (ad->popup) {
508                 evas_object_del(ad->popup);
509                 ad->popup = NULL;
510         }
511         if (ad->pkginfo_getsize_timer) {
512                 ecore_timer_del(ad->pkginfo_getsize_timer);
513                 ad->pkginfo_getsize_timer = NULL;
514         }
515
516         if (ad->support_taskmanager && ad->pc_main != NULL) {
517
518                 SETTING_TRACE("Load pkginfo view");
519                 pkgmgr_client_free(ad->pc_main);
520                 ad->pc_main = NULL;
521         }
522
523         appmgrUg_pkg_free_pkginfo(ad->pkginfo);
524         ad->pkginfo = NULL;
525         ad->info_run = NULL;
526         ad->runinfos = NULL;
527
528         FREE(ad->sel_pkgid);
529         FREE(ad->sel_label);
530         FREE(ad->sel_icon);
531
532         setting_view_appmgr_pkginfo.is_create = 0;
533
534         return SETTING_RETURN_SUCCESS;
535 }
536
537 static int appmgrUg_pkg_update(void *data)
538 {
539         SETTING_TRACE_BEGIN;
540         int ret;
541         SettingAppMgrUG *ad = data;
542
543         retv_if(NULL == data, SETTING_GENERAL_ERR_NULL_DATA_PARAMETER);
544
545         /*record old size info, need not re-get size info when update */
546         if (ad->pkginfo) {
547                 if (ad->pkginfo->sz_total >= 0)
548                         ad->sel_total = ad->pkginfo->sz_total;
549                 if (ad->pkginfo->sz_data >= 0)
550                         ad->sel_data_size = ad->pkginfo->sz_data;
551         }
552
553         elm_genlist_clear(ad->gl_pkg);
554
555         appmgr_pkginfo *old_pkginfo = ad->pkginfo;
556         ad->pkginfo = NULL;
557
558         ret = appmgrUg_pkg_get_info(ad);
559         if (ret) {
560                 SETTING_TRACE_ERROR("appmgrUg_pkg_get_info() Fail", ret);
561                 elm_naviframe_item_pop(ad->navi);
562                 return -1;
563         }
564
565         /*appmgrUg_pkg_append_toolbar(NULL, ad); */
566         appmgrUg_pkg_append_genlist(ad);
567
568         appmgrUg_pkg_free_pkginfo(old_pkginfo);
569
570         return SETTING_RETURN_SUCCESS;
571 }
572
573 static int appmgrUg_pkg_cleanup(void *data)
574 {
575         return appmgrUg_pkg_destroy(data);
576 }
577
578 void appmgrUg_pkginfo_init(SettingAppMgrUG *ad)
579 {
580         ret_if(NULL == ad);
581         ret_if(ad->pkginfo_view);
582
583         setting_view_appmgr_pkginfo.create = appmgrUg_pkg_create;
584         setting_view_appmgr_pkginfo.destroy = appmgrUg_pkg_destroy;
585         setting_view_appmgr_pkginfo.update = appmgrUg_pkg_update;
586         setting_view_appmgr_pkginfo.cleanup = appmgrUg_pkg_cleanup;
587
588         ad->pkginfo_view = &setting_view_appmgr_pkginfo;
589 }