From 3d593c205f95130110417c3bf047468dc8f24cad Mon Sep 17 00:00:00 2001 From: Hyejin Kim Date: Wed, 17 Apr 2013 12:58:23 +0900 Subject: [PATCH] support 3rd party lock Change-Id: I5f2bf1f5595b93936d243aad31eafb02133a112b --- include/setting-debug.h | 2 +- packaging/org.tizen.setting.spec | 1 + resource/setting.cfg | 8 + setting-security/CMakeLists.txt | 3 +- .../include/setting-security-locktype.h | 44 +++ setting-security/include/setting-security.h | 11 + setting-security/src/setting-security-locktype.c | 414 +++++++++++++++++++++ setting-security/src/setting-security-main.c | 29 ++ setting-security/src/setting-security.c | 4 + 9 files changed, 514 insertions(+), 2 deletions(-) create mode 100755 setting-security/include/setting-security-locktype.h create mode 100755 setting-security/src/setting-security-locktype.c diff --git a/include/setting-debug.h b/include/setting-debug.h index 86639b5..4acc1c0 100755 --- a/include/setting-debug.h +++ b/include/setting-debug.h @@ -76,7 +76,7 @@ #define SUPPORT_STORAGE 1 #define SUPPORT_WIFI_DIRECT 1 #define SUPPORT_DATA_USAGE 0 -#define SUPPORT_SECURITY 0 +#define SUPPORT_SECURITY 1 #define SUPPORT_WEB_APPLICATION 0 /*#endif*/ diff --git a/packaging/org.tizen.setting.spec b/packaging/org.tizen.setting.spec index 91bed35..503f983 100755 --- a/packaging/org.tizen.setting.spec +++ b/packaging/org.tizen.setting.spec @@ -360,6 +360,7 @@ GOPTION="-g 6514" vconftool $GOPTION set -t bool db/setting/power_on_lock "0" vconftool $GOPTION set -t bool db/setting/simple_password "1" vconftool $GOPTION set -t int db/setting/screen_lock_type "0" + vconftool $GOPTION set -t string db/setting/3rd_lock_pkg_name "" vconftool $GOPTION set -t bool db/setting/fmm/sim_change_alert "0" vconftool $GOPTION set -t string db/setting/fmm/recipients "" vconftool $GOPTION set -t string db/setting/fmm/sender "" diff --git a/resource/setting.cfg b/resource/setting.cfg index d2c6be8..8bf751a 100755 --- a/resource/setting.cfg +++ b/resource/setting.cfg @@ -120,6 +120,14 @@ "is_resetable" : 1 }, { + "key_name" : "IDS_ST_BODY_SECURITY", + "icon_path" : "/usr/apps/org.tizen.setting/res/icons/A01-1_icon_Security.png", + "ug_args" : "setting-security-efl", + "pos" : 0, + "click_times" : 0, + "is_resetable" : 1 + }, + { "key_name" : "IDS_ST_HEADER_HOME_SCREEN_ABB", "icon_path" : "/usr/apps/org.tizen.setting/res/icons/A01-1_icon_Menu.png", "ug_args" : "setting-homescreen-efl", diff --git a/setting-security/CMakeLists.txt b/setting-security/CMakeLists.txt index 1183688..d82cc97 100755 --- a/setting-security/CMakeLists.txt +++ b/setting-security/CMakeLists.txt @@ -4,7 +4,7 @@ INCLUDE_DIRECTORIES(${CMAKE_SOURCE_DIR}/${SETTING_COMMON}/include) INCLUDE(FindPkgConfig) pkg_check_modules(pkgs_security REQUIRED ecore evas elementary tapi dlog -ui-gadget-1 capi-appfw-application appcore-common ail utilX) +ui-gadget-1 capi-appfw-application appcore-common ail utilX pkgmgr-info) FOREACH(flag ${pkgs_security_CFLAGS}) SET(EXTRA_CFLAGS "${EXTRA_CFLAGS} ${flag}") @@ -28,6 +28,7 @@ ADD_LIBRARY(${SETTING_SECURITY_UG} SHARED ./src/setting-security.c ./src/setting-security-main.c ./src/setting-security-sim-settings.c + ./src/setting-security-locktype.c ) TARGET_LINK_LIBRARIES(${SETTING_SECURITY_UG} -L${CMAKE_BINARY_DIR}/${SETTING_COMMON} -lsetting-common) diff --git a/setting-security/include/setting-security-locktype.h b/setting-security/include/setting-security-locktype.h new file mode 100755 index 0000000..7a5e172 --- /dev/null +++ b/setting-security/include/setting-security-locktype.h @@ -0,0 +1,44 @@ +/* + * setting + * + * Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd. + * + * Contact: MyoungJune Park + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ +#ifndef __SETTING_SECURITY_LOCKTYPE_H__ +#define __SETTING_SECURITY_LOCKTYPE_H__ + +#include + +typedef struct _openlock_appdata openlock_appdata; + +struct _openlock_appdata { + openlock_appdata *prev; + openlock_appdata *next; + + char *pkg_name; + char *app_name; + int index; +}; + +static int setting_security_locktype_create(void *cb); + +static void +setting_security_locktype_click_softkey_back_cb(void *data, Evas_Object *obj, void *event_info); +static void +setting_security_locktype_mouse_up_Gendial_list_cb(void *data, Evas_Object *obj, void *event_info); + +#endif diff --git a/setting-security/include/setting-security.h b/setting-security/include/setting-security.h index 4bf784d..f2e59f8 100755 --- a/setting-security/include/setting-security.h +++ b/setting-security/include/setting-security.h @@ -35,6 +35,8 @@ #include #define USELESS_SIM_CARD "Not useful SIM card" +#define Keystr_ScreenLockType "IDS_ST_BODY_SCREEN_LOCK_TYPE" +#define Keystr_Swipe "IDS_ST_MBODY_SWIPE" #if SUPPORT_PARENTAL_MODE #define Keystr_ParentalMode "Parental mode" @@ -90,6 +92,14 @@ struct _SettingSecurityUG { Setting_GenGroupItem_Data *data_pin_lk; Setting_GenGroupItem_Data *data_change_pin1; Setting_GenGroupItem_Data *data_change_pin2; + Setting_GenGroupItem_Data *data_screen_lock_type; + Setting_GenGroupItem_Data *data_locktype_swipe; + Setting_GenGroupItem_Data *data_locktype_3rd[128]; + Evas_Object *sl_scroller; + Evas_Object *lock_type_rd; + + Elm_Object_Item *screen_lock_main_item; + char *selected_lock_type; /* for simple password */ Elm_Genlist_Item_Class itc_1text; @@ -107,6 +117,7 @@ struct _SettingSecurityUG { extern setting_view setting_view_security_main; extern setting_view setting_view_security_sim_settings; +extern setting_view setting_view_security_locktype; SettingSecurityUG *g_ad; /* for tapi callback */ diff --git a/setting-security/src/setting-security-locktype.c b/setting-security/src/setting-security-locktype.c new file mode 100755 index 0000000..b62be85 --- /dev/null +++ b/setting-security/src/setting-security-locktype.c @@ -0,0 +1,414 @@ +/* + * setting + * + * Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd. + * + * Contact: MyoungJune Park + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ +#include +#include +#include +#include + +#include +#include +#include +#include +#include + +#define TBD 0 + +static int setting_security_locktype_create(void *cb); +static int setting_security_locktype_destroy(void *cb); +static int setting_security_locktype_update(void *cb); +static int setting_security_locktype_cleanup(void *cb); +setting_view setting_view_security_locktype = { + .create = setting_security_locktype_create, + .destroy = setting_security_locktype_destroy, + .update = setting_security_locktype_update, + .cleanup = setting_security_locktype_cleanup, +}; + +openlock_appdata *lockapp_data = NULL; + +/* *************************************************** + ** + **basic func + ** + ****************************************************/ + +static int __get_lockapp_index_from_pkgname(char *pkg_name) +{ + SETTING_TRACE_BEGIN; + if(pkg_name == NULL) + return SETTING_RETURN_FAIL; + + openlock_appdata *item = lockapp_data; + for(; item != NULL; item = item->next) + { + if(safeStrCmp(item->pkg_name, pkg_name) == 0) + return item->index; + } + return SETTING_RETURN_FAIL; +} +static int __get_lockapp_index_from_appname(char *app_name) +{ + SETTING_TRACE_BEGIN; + if(app_name == NULL) + return SETTING_RETURN_FAIL; + + openlock_appdata *item = lockapp_data; + for(; item != NULL; item = item->next) + { + if(safeStrCmp(item->app_name, app_name) == 0) + return item->index; + } + return SETTING_RETURN_FAIL; +} +static char* __get_lockapp_pkgname_from_appname(char *app_name) +{ + SETTING_TRACE_BEGIN; + if(app_name == NULL) + return NULL; + + openlock_appdata *item = lockapp_data; + for(; item != NULL; item = item->next) + { + if(safeStrCmp(item->app_name, app_name) == 0) + return item->app_name; + } + return NULL; +} + +ail_cb_ret_e __get_appinfo_cb(const ail_appinfo_h appinfo, void *user_data) +{ + SETTING_TRACE_BEGIN; + + openlock_appdata *item = lockapp_data; + openlock_appdata *new_item = NULL; + char *pkg_name = NULL; + char *app_name = NULL; + + ail_appinfo_get_str(appinfo, AIL_PROP_PACKAGE_STR, &pkg_name); + ail_appinfo_get_str(appinfo, AIL_PROP_NAME_STR, &app_name); + + while(item->next != NULL) + item = item->next; + + if(item->index == 0 && item->pkg_name == NULL) + { + /* first app */ + item->pkg_name = strdup(pkg_name); + item->app_name = strdup(app_name); + + SETTING_TRACE_DEBUG("app info %d %s %s", item->index, item->pkg_name, item->app_name); + } + else + { + /* create new */ + new_item = (openlock_appdata*)malloc(sizeof(openlock_appdata)); + if(new_item != NULL) + { + memset(new_item, 0x00, sizeof(openlock_appdata)); + new_item->pkg_name = strdup(pkg_name); + new_item->app_name = strdup(app_name); + new_item->index = item->index + 1; + new_item->prev = item; + item->next = new_item; + + SETTING_TRACE_DEBUG("app info %d %s %s", new_item->index, new_item->pkg_name, new_item->app_name); + } + else + { + SETTING_TRACE_DEBUG("malloc() failed"); + } + } + return AIL_CB_RET_CONTINUE; +} + +static void __add_3rd_party_lock(void *data) +{ + SETTING_TRACE_BEGIN; + ret_if(data == NULL); + + SettingSecurityUG *ad = (SettingSecurityUG *) data; + + /* Get info from AIL */ + pkgmgrinfo_appinfo_filter_h filter; //ail_filter_h filter; + int ret = 0; //ail_error_e ret; + int count = -1; //int count = 0; + + ret = pkgmgrinfo_appinfo_filter_create(&filter); //ret = ail_filter_new(&filter); + if(ret > 0) //if(ret != AIL_ERROR_OK) + { + SETTING_TRACE_DEBUG("pkgmgrinfo_appinfo_filter_create() failed"); //SETTING_TRACE_DEBUG("ail_filter_new() failed"); + return; + } + ret = pkgmgrinfo_appinfo_filter_add_string(filter, PMINFO_APPINFO_PROP_APP_CATEGORY, "http://tizen.org/category/lockapp"); + //ret = ail_filter_add_str(filter, AIL_PROP_CATEGORIES_STR, "lockscreen"); + ret = pkgmgrinfo_appinfo_filter_count(filter, &count); ////ret = ail_filter_count_appinfo(filter, &count); + SETTING_TRACE_DEBUG("There is/are %d 3rd lock app(s)", count); + if(count <= 0) + { + SETTING_TRACE_DEBUG("No 3rd lock app"); + pkgmgrinfo_appinfo_filter_destroy(filter); //ail_filter_destroy(filter); + return; + + } + + lockapp_data = (openlock_appdata*)malloc(sizeof(openlock_appdata)); + if(lockapp_data == NULL) + { + SETTING_TRACE_DEBUG("malloc() failed"); + return; + } + memset(lockapp_data, 0x00, sizeof(openlock_appdata)); + lockapp_data->prev = NULL; + lockapp_data->next = NULL; + lockapp_data->pkg_name = NULL; + lockapp_data->app_name = NULL; + lockapp_data->index = 0; + + pkgmgrinfo_appinfo_filter_foreach_appinfo(filter, __get_appinfo_cb, ad); //ail_filter_list_appinfo_foreach(filter, __get_appinfo_cb, ad); + pkgmgrinfo_appinfo_filter_destroy(filter); //ail_filter_destroy(filter); + + /* Add to genlist */ + openlock_appdata *list = lockapp_data; + Setting_GenGroupItem_Data *item_data = NULL; + int index = 0; + for(index = 0; index < count; index++) + { + ad->data_locktype_3rd[index] = setting_create_Gendial_field_1radio(ad->sl_scroller, + &(itc_1text_1icon_2), + setting_security_locktype_mouse_up_Gendial_list_cb, /*add to sel_cb */ + ad, /* sel data */ + SWALLOW_Type_1RADIO, + ad->lock_type_rd, SETTING_SCREEN_LOCK_TYPE_OTHER + index, + list->app_name, + NULL); + if (ad->data_locktype_3rd[index]) { + ad->data_locktype_3rd[index]->userdata = ad; + } else { + SETTING_TRACE_ERROR("item_data is NULL"); + } + list = list->next; + } + SETTING_TRACE_END; +} + +void __add_locktype_items(void *data) +{ + SETTING_TRACE_BEGIN; + retv_if(data == NULL, SETTING_GENERAL_ERR_NULL_DATA_PARAMETER); + + SettingSecurityUG *ad = (SettingSecurityUG *) data; + + Elm_Object_Item *item = NULL; + Evas_Object *radio; + Setting_GenGroupItem_Data *item_data = NULL; + + int index = -1; + int locktype = 0; + vconf_get_int(VCONFKEY_SETAPPL_SCREEN_LOCK_TYPE_INT, &locktype); + + radio = elm_radio_add(ad->sl_scroller); + elm_radio_state_value_set(radio, -1); + ad->lock_type_rd = radio; + + /* separator */ + item = elm_genlist_item_append(ad->sl_scroller, &(ad->itc_seperator), NULL, NULL, ELM_GENLIST_ITEM_NONE, NULL, NULL); + elm_genlist_item_select_mode_set(item, ELM_OBJECT_SELECT_MODE_DISPLAY_ONLY); + + //evas_object_smart_callback_add(ad->sl_scroller, "realized", __gl_realized_cb, NULL); + + /* to do : radio menu */ + /* 1) swipe */ + ad->data_locktype_swipe = + setting_create_Gendial_field_1radio(ad->sl_scroller, + &(itc_1text_1icon_2), + setting_security_locktype_mouse_up_Gendial_list_cb, /*add to sel_cb */ + ad, /* sel data */ + SWALLOW_Type_1RADIO, + radio, SETTING_SCREEN_LOCK_TYPE_SWIPE, + Keystr_Swipe, + NULL); + if (ad->data_locktype_swipe) { + ad->data_locktype_swipe->userdata = ad; + ad->data_locktype_swipe->group_style = SETTING_GROUP_STYLE_TOP; + } else { + SETTING_TRACE_ERROR("item_data is NULL"); + } + + /* Add 3rd party lock apps in list. */ + __add_3rd_party_lock(ad); + + /* update info */ + /* To do : If type is OTHER, should calculate something.*/ + if(locktype == SETTING_SCREEN_LOCK_TYPE_OTHER) + { + char *open_lock_name = NULL; + open_lock_name = vconf_get_str(VCONFKEY_SETAPPL_3RD_LOCK_PKG_NAME_STR); + index = __get_index_of_lockapp(open_lock_name); + + if(open_lock_name) + FREE(open_lock_name); + } + /* End */ + if(index < 0) + elm_radio_value_set(radio, locktype); + else + elm_radio_value_set(radio, locktype + index); +} + +static int setting_security_locktype_create(void *cb) +{ + SETTING_TRACE_BEGIN; + retv_if(cb == NULL, SETTING_GENERAL_ERR_NULL_DATA_PARAMETER); + + SettingSecurityUG *ad = (SettingSecurityUG *) cb; + + /* add basic layout */ + + Evas_Object *scroller = NULL; + + setting_push_layout_navi_bar_genlist(ad->win_main_layout, + ad->win_get, + _(Keystr_ScreenLockType), + _("IDS_COM_BODY_BACK"), NULL, + setting_security_locktype_click_softkey_back_cb, + NULL, ad, &scroller, ad->navi_bar); + + ad->sl_scroller = scroller; + + __add_locktype_items(ad); + + setting_view_security_locktype.is_create = 1; + + return SETTING_RETURN_SUCCESS; +} + +static int setting_security_locktype_destroy(void *cb) +{ + SETTING_TRACE_BEGIN; + /* error check */ + retv_if(cb == NULL, SETTING_GENERAL_ERR_NULL_DATA_PARAMETER); + + SettingSecurityUG *ad = (SettingSecurityUG *) cb; + if (ad->notify) + { + evas_object_del(ad->notify); + ad->notify = NULL; + } + + elm_naviframe_item_pop(ad->navi_bar); + + setting_view_security_locktype.is_create = 0; + + return SETTING_RETURN_SUCCESS; +} + +static int setting_security_locktype_update(void *cb) +{ + SETTING_TRACE_BEGIN; + /* error check */ + retv_if(cb == NULL, SETTING_GENERAL_ERR_NULL_DATA_PARAMETER); + + return SETTING_RETURN_SUCCESS; +} + +static int setting_security_locktype_cleanup(void *cb) +{ + SETTING_TRACE_BEGIN; + /* error check */ + retv_if(cb == NULL, SETTING_GENERAL_ERR_NULL_DATA_PARAMETER); + + SettingSecurityUG *ad = (SettingSecurityUG *) cb; + + return setting_security_locktype_destroy(ad); +} + +/* *************************************************** + ** + **call back func + ** + ****************************************************/ + +static void +setting_security_locktype_mouse_up_Gendial_list_cb(void *data, Evas_Object *obj, + void *event_info) +{ + SETTING_TRACE_BEGIN; + /* error check */ + setting_retm_if(data == NULL, "Data parameter is NULL"); + + retm_if(event_info == NULL, "Invalid argument: event info is NULL"); + Elm_Object_Item *item = (Elm_Object_Item *) event_info; + elm_genlist_item_selected_set(item, 0); + Setting_GenGroupItem_Data *list_item = + (Setting_GenGroupItem_Data *) elm_object_item_data_get(item); + SettingSecurityUG *ad = (SettingSecurityUG *) data; + int lock_type = list_item->chk_status; + SETTING_TRACE("clicking item[%s]", _(list_item->keyStr)); + int old_type = elm_radio_value_get(list_item->eo_check); + + ad->selected_lock_type = list_item->keyStr; + + /* If lock_type is same with old_lock_type, return. */ + if(lock_type == old_type) + { + SETTING_TRACE_DEBUG("[Screen Lock Type] Selected same type"); + return; + } + + int index = -1; + char *pkg_name = NULL; + + switch(lock_type) + { + case SETTING_SCREEN_LOCK_TYPE_SWIPE: + if(vconf_set_int(VCONFKEY_SETAPPL_SCREEN_LOCK_TYPE_INT, lock_type) == 0) + { + /* set radio */ + elm_radio_value_set(list_item->eo_check, lock_type); + } + ug_destroy_me(ad->ug); + break; + case SETTING_SCREEN_LOCK_TYPE_OTHER: + index = __get_lockapp_index_from_appname(list_item->keyStr); + pkg_name = __get_lockapp_pkgname_from_appname(list_item->keyStr); + SETTING_TRACE_DEBUG("3rd lock selected. index[%d] pkg_name[%s]", index, pkg_name); + vconf_set_str(VCONFKEY_SETAPPL_3RD_LOCK_PKG_NAME_STR, pkg_name); + vconf_set_int(VCONFKEY_SETAPPL_SCREEN_LOCK_TYPE_INT, lock_type); + /* set radio */ + elm_radio_value_set(list_item->eo_check, lock_type + index); + break; + default: + break; + } +} + +static void +setting_security_locktype_click_softkey_back_cb(void *data, Evas_Object *obj, + void *event_info) +{ + SETTING_TRACE_BEGIN; + /* error check */ + retm_if(data == NULL, "[Setting > Security] Data parameter is NULL"); + + SettingSecurityUG *ad = (SettingSecurityUG *) data; + setting_view_change(&setting_view_security_locktype, &setting_view_security_main, ad); + SETTING_TRACE_END; +} diff --git a/setting-security/src/setting-security-main.c b/setting-security/src/setting-security-main.c index 8f063c2..831f998 100755 --- a/setting-security/src/setting-security-main.c +++ b/setting-security/src/setting-security-main.c @@ -61,6 +61,23 @@ static void setting_security_main_check_vconf_value(void *data); ** ****************************************************/ +char *get_pa_screen_lock_type_str() +{ + int lock_type = 0; + + vconf_get_int(VCONFKEY_SETAPPL_SCREEN_LOCK_TYPE_INT, &lock_type); + + switch(lock_type) + { + case SETTING_SCREEN_LOCK_TYPE_SWIPE: + return setting_gettext("IDS_ST_MBODY_SWIPE"); + case SETTING_SCREEN_LOCK_TYPE_OTHER: + return vconf_get_str(VCONFKEY_SETAPPL_3RD_LOCK_PKG_NAME_STR); + default: + return NULL; + } +} + static int setting_security_main_create(void *cb) { retv_if(cb == NULL, SETTING_GENERAL_ERR_NULL_DATA_PARAMETER); @@ -91,6 +108,15 @@ static int setting_security_main_create(void *cb) Elm_Object_Item *item = NULL; + /* Screen lock type */ + ad->data_screen_lock_type = setting_create_Gendial_field_def(scroller, &(ad->itc_2text_2), + setting_security_main_mouse_up_Gendial_list_cb,ad, + SWALLOW_Type_INVALID, + NULL, NULL, + 0, Keystr_ScreenLockType, get_pa_screen_lock_type_str(ad), NULL); + if(ad->data_screen_lock_type) + ad->data_screen_lock_type->userdata = ad; + /* SIM settings */ if(ad->handle && !isEmulBin()) { @@ -250,4 +276,7 @@ setting_security_main_mouse_up_Gendial_list_cb(void *data, Evas_Object *obj, if(!safeStrCmp("IDS_ST_BODY_SIM_CARD_SETTINGS", list_item->keyStr)) { setting_view_change(&setting_view_security_main, &setting_view_security_sim_settings, ad); } + else if(!safeStrCmp(Keystr_ScreenLockType, list_item->keyStr)) { + setting_view_change(&setting_view_security_main, &setting_view_security_locktype, ad); + } } diff --git a/setting-security/src/setting-security.c b/setting-security/src/setting-security.c index b610932..68d60be 100755 --- a/setting-security/src/setting-security.c +++ b/setting-security/src/setting-security.c @@ -189,6 +189,7 @@ static void *setting_security_ug_on_create(ui_gadget_h ug, setting_view_node_table_intialize(); setting_view_node_table_register(&setting_view_security_main, NULL); setting_view_node_table_register(&setting_view_security_sim_settings, &setting_view_security_main); + setting_view_node_table_register(&setting_view_security_locktype, &setting_view_security_main); setting_create_Gendial_itc("dialogue/1text", &(securityUG->itc_1text)); setting_create_Gendial_itc("dialogue/2text.3", &(securityUG->itc_2text_2)); @@ -257,6 +258,9 @@ static void setting_security_ug_on_destroy(ui_gadget_h ug, service_h service, } /* delete the allocated objects. */ + if (TRUE == setting_view_security_locktype.is_create) { + setting_view_destroy(&setting_view_security_locktype, securityUG); + } if (TRUE == setting_view_security_sim_settings.is_create) { setting_view_destroy(&setting_view_security_sim_settings, securityUG); } -- 2.7.4