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