Merge branch '2.0_beta' of ssh://tizendev.org:29418/apps/home/settings into 2.0_beta
[apps/core/preloaded/settings.git] / setting-password / src / setting-password.c
old mode 100644 (file)
new mode 100755 (executable)
index c3f7ef0..41526db
@@ -1,64 +1,62 @@
 /*
-  * Copyright 2012  Samsung Electronics Co., Ltd
-  *
-  * Licensed under the Flora License, Version 1.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.tizenopensource.org/license
-  *
-  * 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.
-  */
+ * setting
+ *
+ * Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd.
+ *
+ * Contact: MyoungJune Park <mj2004.park@samsung.com>
+ *
+ * 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 <setting-password.h>
+#include <security-server.h>
 
+#ifdef SUPPORT_MDM
+#include <Ecore_X.h>
+#include <utilX.h>
+#endif
 
-#include <setting-password.h>
 #ifndef UG_MODULE_API
 #define UG_MODULE_API __attribute__ ((visibility("default")))
 #endif
 
-static tapi_request_event tapi_req_events[] = {
-       {-1, TAPI_EVENT_SIM_CHANGE_PINS_CNF},
-       {-1, TAPI_EVENT_SIM_DISABLE_SEC_CNF},
-       {-1, TAPI_EVENT_SIM_ENABLE_SEC_CNF},
-       {-1, TAPI_EVENT_SIM_VERIFY_SEC_CNF},
-       {-1, TAPI_EVENT_SIM_VERIFY_PUK_CNF},
-       {-1, TAPI_EVENT_SIM_DISABLE_FDNMODE_CNF},
-       {-1, TAPI_EVENT_SIM_ENABLE_FDNMODE_CNF},
-       {-1, TAPI_EVENT_SIM_ENABLE_PERS_CNF},
-       {-1, TAPI_EVENT_SIM_DISABLE_PERS_CNF},
-       {-1, TAPI_EVENT_SIM_PERS_STATUS_CNF},
-};
-
 static struct _pw_item pw_its[] = {
-       { SETTING_PW_TYPE_POWER_ON_LOCK, "SETTING_PW_TYPE_POWER_ON_LOCK" },
-       { SETTING_PW_TYPE_PHONE_LOCK, "SETTING_PW_TYPE_PHONE_LOCK" },
-       { SETTING_PW_TYPE_PHONE_LOCK_ON, "SETTING_PW_TYPE_PHONE_LOCK_ON" },
+       { SETTING_PW_TYPE_PASSWORD, "SETTING_PW_TYPE_PASSWORD" },
        { SETTING_PW_TYPE_SET_PASSWORD, "SETTING_PW_TYPE_SET_PASSWORD" },
-       { SETTING_PW_TYPE_SIMPLE_PASSWORD, "SETTING_PW_TYPE_SIMPLE_PASSWORD" },
        { SETTING_PW_TYPE_CHANGE_PASSWORD, "SETTING_PW_TYPE_CHANGE_PASSWORD" },
+       { SETTING_PW_TYPE_SIMPLE_PASSWORD, "SETTING_PW_TYPE_SIMPLE_PASSWORD" },
+       { SETTING_PW_TYPE_SET_SIMPLE_PASSWORD, "SETTING_PW_TYPE_SET_SIMPLE_PASSWORD" },
+       { SETTING_PW_TYPE_CHANGE_SIMPLE_PASSWORD, "SETTING_PW_TYPE_CHANGE_SIMPLE_PASSWORD" },
+       { SETTING_PW_TYPE_ENTER_LOCK_TYPE, "SETTING_PW_TYPE_ENTER_LOCK_TYPE" },
        { SETTING_PW_TYPE_SIM_LOCK_ON, "SETTING_PW_TYPE_SIM_LOCK_ON" },
        { SETTING_PW_TYPE_SIM_LOCK_OFF, "SETTING_PW_TYPE_SIM_LOCK_OFF" },
        { SETTING_PW_TYPE_PIN_LOCK_ON, "SETTING_PW_TYPE_PIN_LOCK_ON" },
        { SETTING_PW_TYPE_PIN_LOCK_OFF, "SETTING_PW_TYPE_PIN_LOCK_OFF" },
        { SETTING_PW_TYPE_CHANGE_PIN1, "SETTING_PW_TYPE_CHANGE_PIN1" },
-       { SETTING_PW_TYPE_FDN_MODE_ON, "SETTING_PW_TYPE_FDN_MODE_ON" },
-       { SETTING_PW_TYPE_FDN_MODE_OFF, "SETTING_PW_TYPE_FDN_MODE_OFF" },
        { SETTING_PW_TYPE_CHANGE_PIN2, "SETTING_PW_TYPE_CHANGE_PIN2" },
        { SETTING_PW_TYPE_PIN1_BLOCKED, "SETTING_PW_TYPE_PIN1_BLOCKED" },
        { SETTING_PW_TYPE_PIN2_BLOCKED, "SETTING_PW_TYPE_PIN2_BLOCKED" },
        { SETTING_PW_TYPE_RESET, "SETTING_PW_TYPE_RESET" },
-       { SETTING_PW_TYPE_CLEAR, "SETTING_PW_TYPE_CLEAR"},              
-       { SETTING_PW_TYPE_LOCK_FOR_APP, "SETTING_PW_TYPE_LOCK_FOR_APP"}, /* used by other app */
+#ifdef SUPPORT_MDM
+       { SETTING_PW_TYPE_MDM_NEW_POLICY, "SETTING_PW_TYPE_MDM_NEW_POLICY" }, /*for mdm policy */
+       { SETTING_PW_TYPE_MDM_CHANGE_PASSWORD, "SETTING_PW_TYPE_MDM_CHANGE_PASSWORD" },
+       { SETTING_PW_TYPE_MDM_TO_SIMPLE, "SETTING_PW_TYPE_MDM_TO_SIMPLE" },
+#endif
        { SETTING_PW_TYPE_MAX, NULL }
 };
 
 static void setting_tapi_init(SettingPasswordUG *ad);
 static void setting_password_ug_display_result_popup(tapi_receive_info *result, SettingPasswordUG *ad);
-static int setting_password_ug_sim_event_callback(const TelTapiEvent_t *event, void *data);
 
 static void setting_password_ug_cb_resize(void *data, Evas *e, Evas_Object *obj, void *event_info)
 {
@@ -76,19 +74,17 @@ static void setting_tapi_init(SettingPasswordUG *ad)
        case SETTING_PW_TYPE_PIN_LOCK_OFF:
        case SETTING_PW_TYPE_CHANGE_PIN1:
        case SETTING_PW_TYPE_CHANGE_PIN2:
-       case SETTING_PW_TYPE_FDN_MODE_ON:
-       case SETTING_PW_TYPE_FDN_MODE_OFF:
        case SETTING_PW_TYPE_PIN1_BLOCKED:
        case SETTING_PW_TYPE_PIN2_BLOCKED:
-               /* subscribe tapi events */
-               if (setting_password_ug_subscribe_sim_events(ad) != SETTING_RETURN_SUCCESS) {
-                       SETTING_TRACE_DEBUG
-                           ("%s*** [ERR] setting_security_subscribe_sim_events. ***%s",
+               ad->handle =  tel_init(NULL);
+               if (!ad->handle) {
+                       SETTING_TRACE_DEBUG("%s*** [ERR] tel_init. ***%s",
                             SETTING_FONT_RED, SETTING_FONT_BLACK);
                        setting_password_ug_create_popup_notitle_nobtn(ad,
                                                                       _("IDS_COM_POP_ERROR"),
                                                                       FALSE);
                }
+
                break;
        default:
                break;
@@ -106,14 +102,11 @@ static void setting_tapi_finize(SettingPasswordUG *ad)
        case SETTING_PW_TYPE_PIN_LOCK_OFF:
        case SETTING_PW_TYPE_CHANGE_PIN1:
        case SETTING_PW_TYPE_CHANGE_PIN2:
-       case SETTING_PW_TYPE_FDN_MODE_ON:
-       case SETTING_PW_TYPE_FDN_MODE_OFF:
        case SETTING_PW_TYPE_PIN1_BLOCKED:
        case SETTING_PW_TYPE_PIN2_BLOCKED:
-               /* unsubscribe tapi events */
-               if (setting_password_ug_unsubscribe_sim_events(ad) != SETTING_RETURN_SUCCESS) {
+               if (tel_deinit(ad->handle) != TAPI_API_SUCCESS) {
                        SETTING_TRACE_DEBUG
-                           ("%s*** [ERR] setting_security_subscribe_sim_events. ***%s",
+                           ("%s*** [ERR] setting_network_unsubscribe_tapi_events. ***%s",
                             SETTING_FONT_RED, SETTING_FONT_BLACK);
                        setting_password_ug_create_popup_notitle_nobtn(ad,
                                                                       _("IDS_COM_POP_ERROR"),
@@ -126,11 +119,28 @@ static void setting_tapi_finize(SettingPasswordUG *ad)
        SETTING_TRACE_END;
 }
 
-setting_pw_type __get_password_view_type(SettingPasswordUG *ad, bundle *data)
+setting_pw_type __get_password_view_type(SettingPasswordUG *ad, service_h service)
 {
        SETTING_TRACE_BEGIN;
-       setting_retvm_if(NULL == data, -1, "NULL == data");
-       ad->view_type_string = bundle_get_val(data, "viewtype");
+
+       service_get_extra_data(service, "viewtype", &(ad->view_type_string));
+       service_get_extra_data(service, "current", &(ad->cur_pwd));
+
+       if(ad->cur_pwd)
+               SETTING_TRACE_DEBUG("Receive current : %s", ad->cur_pwd);
+#ifdef SUPPORT_MDM
+       char *status = NULL;
+       service_get_extra_data(service, "status", &status);
+       if(safeStrCmp(status, "expired") == 0)
+       {
+               ad->is_expired = SETTING_PW_STATUS_EXPIRED;
+       }
+       else
+       {
+               ad->is_expired = SETTING_PW_STATUS_OK;
+       }
+       SETTING_TRACE_DEBUG("is_expired : %d", ad->is_expired);
+#endif
        SETTING_TRACE("viewtype:%s", ad->view_type_string);
        setting_pw_type ret_pw_type = 0;
        int i;
@@ -141,24 +151,75 @@ setting_pw_type __get_password_view_type(SettingPasswordUG *ad, bundle *data)
                {
                        ret_pw_type = pw_its[i].pw_type_num;
                        break;
-               } 
+               }
        }
 
-       if( (ret_pw_type == SETTING_PW_TYPE_PHONE_LOCK) ||
-               (ret_pw_type == SETTING_PW_TYPE_SIMPLE_PASSWORD) ||
-               (ret_pw_type == SETTING_PW_TYPE_LOCK_FOR_APP) ||
-               (ret_pw_type == SETTING_PW_TYPE_CHANGE_PASSWORD) ||
-               (ret_pw_type == SETTING_PW_TYPE_RESET) )
+       ad->is_empty = setting_password_is_password_empty();
+
+       /* exception handle */
+       if(ret_pw_type == SETTING_PW_TYPE_PASSWORD)
+       {
+               ret_pw_type = SETTING_PW_TYPE_SET_PASSWORD;
+       }
+       else if(ret_pw_type == SETTING_PW_TYPE_SIMPLE_PASSWORD)
        {
-               if(setting_password_is_password_empty() == TRUE)
+               ret_pw_type = SETTING_PW_TYPE_SET_SIMPLE_PASSWORD;
+       }
+       else if(ret_pw_type == SETTING_PW_TYPE_CHANGE_PASSWORD)
+       {
+               if(ad->is_empty == TRUE)
                {
                        ret_pw_type = SETTING_PW_TYPE_SET_PASSWORD;
                }
        }
+       else if(ret_pw_type == SETTING_PW_TYPE_CHANGE_SIMPLE_PASSWORD)
+       {
+               if(ad->is_empty == TRUE)
+               {
+                       ret_pw_type = SETTING_PW_TYPE_SET_SIMPLE_PASSWORD;
+               }
+       }
+       else if( ret_pw_type == SETTING_PW_TYPE_RESET )
+       {
+               if(ad->is_empty == TRUE)
+               {
+                       /* To do : check screen lock option key */
+                       if(ad->screen_lock_type == SETTING_SCREEN_LOCK_TYPE_PASSWORD)
+                               ret_pw_type = SETTING_PW_TYPE_SET_PASSWORD;
+                       else if(ad->screen_lock_type == SETTING_SCREEN_LOCK_TYPE_SIMPLE_PASSWORD)
+                               ret_pw_type = SETTING_PW_TYPE_SET_SIMPLE_PASSWORD;
+               }
+               else
+               {
+                       if(ad->screen_lock_type == SETTING_SCREEN_LOCK_TYPE_PASSWORD)
+                               ret_pw_type = SETTING_PW_TYPE_PASSWORD;
+                       else if(ad->screen_lock_type == SETTING_SCREEN_LOCK_TYPE_SIMPLE_PASSWORD)
+                               ret_pw_type = SETTING_PW_TYPE_SIMPLE_PASSWORD;
+               }
+       }
+       else if( ret_pw_type == SETTING_PW_TYPE_ENTER_LOCK_TYPE )
+       {
+               if(ad->screen_lock_type == SETTING_SCREEN_LOCK_TYPE_PASSWORD)
+                               ret_pw_type = SETTING_PW_TYPE_PASSWORD;
+               else if(ad->screen_lock_type == SETTING_SCREEN_LOCK_TYPE_SIMPLE_PASSWORD)
+                               ret_pw_type = SETTING_PW_TYPE_SIMPLE_PASSWORD;
+       }
+#ifdef SUPPORT_MDM
+       else if (ret_pw_type == SETTING_PW_TYPE_MDM_CHANGE_PASSWORD)
+       {
+               if((ad->is_empty == TRUE)
+                       || (ad->is_expired == SETTING_PW_STATUS_EXPIRED))
+               {
+                       ret_pw_type = SETTING_PW_TYPE_MDM_NEW_POLICY;
+               }
+       }
+#endif
+       /* end */
 
        return ret_pw_type;
 }
 
+#if DISABLED_CODE
 static void setting_password_ug_set_password_cb(void *data, Evas_Object *obj,
                                                void *event_info)
 {
@@ -176,7 +237,7 @@ static void setting_password_ug_set_password_cb(void *data, Evas_Object *obj,
                                                       EVAS_CALLBACK_RESIZE,
                                                       setting_password_ug_cb_resize,
                                                       ad);
-                       if(ad->setpw_notify)
+                       if (ad->setpw_notify)
                        {
                                evas_object_del(ad->setpw_notify);
                                ad->setpw_notify = NULL;
@@ -192,6 +253,17 @@ static void setting_password_ug_set_password_cb(void *data, Evas_Object *obj,
                                ad->setpw_notify = NULL;
                        }
 
+                       /* send result : Cancel */
+                       service_h svc;
+                       if(service_create(&svc))
+                               return;
+
+                       service_add_extra_data(svc, "result", "Cancel");
+                       ug_send_result(ad->ug, svc);
+                       SETTING_TRACE("Send Result : %s\n", "Cancel");
+
+                       service_destroy(svc);
+
                        ug_destroy_me(ad->ug);
                }
                break;
@@ -199,22 +271,118 @@ static void setting_password_ug_set_password_cb(void *data, Evas_Object *obj,
                break;
        }
 }
-
+#endif
 static char *__gl_err_desc_text_get(void *data, Evas_Object *obj, const char *part)
 {
        retv_if(data == NULL, NULL);
        char buf[256] = {0,};
 
        snprintf(buf, sizeof(buf)-1, "<font color=#ff0000>%s</font>", (char*)data);
-       
+
+       return strdup(buf);
+}
+
+#ifdef SUPPORT_MDM
+void setting_password_ug_display_mdm_desc(void *data, const char* guide_text)
+{
+       SETTING_TRACE_BEGIN;
+       ret_if(data == NULL || guide_text == NULL);
+
+       SettingPasswordUG *ad = (SettingPasswordUG *)data;
+
+       if(ad->mdm_desc != NULL)
+       {
+               elm_object_item_del(ad->mdm_desc);
+               ad->mdm_desc = NULL;
+       }
+
+       ad->guide_str = (char *)guide_text;
+
+       ad->mdm_desc = elm_genlist_item_append(ad->scroller, &(ad->itc_mdm_desc), ad, NULL, ELM_GENLIST_ITEM_NONE, NULL, NULL);
+
+       SETTING_TRACE_END;
+}
+
+static char *__gl_mdm_desc_text_get(void *data, Evas_Object *obj, const char *part)
+{
+       SETTING_TRACE_BEGIN;
+       retv_if(data == NULL, NULL);
+       char buf[MAX_DESC_BUF_SIZE] = {0,};
+
+       SettingPasswordUG *ad = (SettingPasswordUG *)data;
+
+       if(ad->mdm_policy == NULL)
+               return NULL;
+
+       if(ad->guide_str)
+               safeCopyStr(buf, ad->guide_str, MAX_DESC_BUF_SIZE);
+
+       SETTING_TRACE_END;
        return strdup(buf);
 }
 
-static void *setting_password_ug_on_create(struct ui_gadget *ug,
-                                          enum ug_mode mode, bundle *data,
+static Eina_Bool __setting_password_ug_keydown_cb(void *data, int type, void *event)
+{
+       SETTING_TRACE_BEGIN;
+
+       Ecore_Event_Key *ev = event;
+
+       if(!strcmp(ev->keyname, KEY_END) || !strcmp(ev->keyname, KEY_SELECT))
+       {
+               SETTING_TRACE_DEBUG("event key name : %s", ev->keyname);
+               // nothing to do.
+       }
+       return ECORE_CALLBACK_DONE;
+}
+
+static void __setting_password_ug_key_grab(SettingPasswordUG *ad)
+{
+       SETTING_TRACE_BEGIN;
+       Ecore_X_Window xwin = 0;
+       Ecore_X_Display *disp = NULL;
+
+       int ret = 0;
+
+       if(ad == NULL)
+               return;
+
+       disp = ecore_x_display_get();
+       xwin = elm_win_xwindow_get((Evas_Object*)ug_get_window());
+
+       ret = utilx_grab_key(disp, xwin, KEY_SELECT, EXCLUSIVE_GRAB);
+       if(ret)
+               return;
+
+       ad->event_handler = ecore_event_handler_add(ECORE_EVENT_KEY_DOWN, __setting_password_ug_keydown_cb, ad);
+       SETTING_TRACE_END;
+}
+static void __setting_password_ug_key_ungrab(SettingPasswordUG *ad)
+{
+       SETTING_TRACE_BEGIN;
+       Ecore_X_Window xwin = 0;
+       Ecore_X_Display *disp = NULL;
+
+       int ret = 0;
+
+       if(ad == NULL)
+               return;
+
+       disp = ecore_x_display_get();
+       xwin = elm_win_xwindow_get((Evas_Object*)ug_get_window());
+
+       ret = utilx_ungrab_key(disp, xwin, KEY_HOME);
+       if(ret)
+               return;
+
+       ecore_event_handler_del(ad->event_handler);
+}
+#endif
+
+static void *setting_password_ug_on_create(ui_gadget_h ug,
+                                          enum ug_mode mode, service_h service,
                                           void *priv)
 {
-       setting_retvm_if((!ug || !priv), NULL, "!ug || !priv");
+       setting_retvm_if((!priv), NULL, "!priv");
 
        SettingPasswordUG *passwordUG = (SettingPasswordUG *)priv;
        passwordUG->ug = ug;
@@ -237,10 +405,8 @@ static void *setting_password_ug_on_create(struct ui_gadget *ug,
                return NULL;
        }
        /* set launguage */
-       setlocale(LC_ALL, "");
-       bindtextdomain(SETTING_PACKAGE, SETTING_LOCALEDIR);
+       setting_set_i18n(SETTING_PACKAGE, SETTING_LOCALEDIR);
        FREE(pa_path);
-       /* --------------------------------------------------------- */
 
        setting_create_Gendial_itc("dialogue/title", &(passwordUG->itc_title));
        setting_create_Gendial_itc("dialogue/1icon",&(passwordUG->itc_variable_height));
@@ -255,81 +421,129 @@ static void *setting_password_ug_on_create(struct ui_gadget *ug,
        passwordUG->itc_err_desc.func.content_get = NULL;
        passwordUG->itc_err_desc.func.state_get = NULL;
        passwordUG->itc_err_desc.func.del = NULL;
+#ifdef SUPPORT_MDM
+       passwordUG->itc_mdm_desc.item_style = "multiline/1text";
+       passwordUG->itc_mdm_desc.func.text_get = __gl_mdm_desc_text_get;
+       passwordUG->itc_mdm_desc.func.content_get = NULL;
+       passwordUG->itc_mdm_desc.func.state_get = NULL;
+       passwordUG->itc_mdm_desc.func.del = NULL;
+#endif
+
+       /* get screen lock type */
+       if( vconf_get_int(VCONFKEY_SETAPPL_SCREEN_LOCK_TYPE_INT, &(passwordUG->screen_lock_type)) < 0) {
+               passwordUG->screen_lock_type = 0;
+       }
+       SETTING_TRACE_DEBUG("screen lock type : %d", passwordUG->screen_lock_type);
+
+       passwordUG->cur_pwd = NULL;
 
        /* init */
-       ecore_imf_init();
-       passwordUG->view_type = __get_password_view_type(passwordUG, data);
+       passwordUG->view_type = __get_password_view_type(passwordUG, service);
        setting_tapi_init(passwordUG);
 
-       /* get simple password flag */
-       if(vconf_get_bool(VCONFKEY_SETAPPL_STATE_SIMPLE_PASSWORD_BOOL, &(passwordUG->is_simple_password_on)) < 0)
-               passwordUG->is_simple_password_on = 0;
+#ifdef SUPPORT_MDM
+       /* To do : check for MDM server */
+       passwordUG->mdm_data = NULL;
+       passwordUG->mdm_policy = NULL;
+
+       passwordUG->mdm_status = mdm_get_service();
+
+       if(passwordUG->mdm_status == MDM_RESULT_SUCCESS)
+       {
+               passwordUG->mdm_data = mdm_get_password_policy();
 
-       SETTING_TRACE_DEBUG("simple password is %d", passwordUG->is_simple_password_on);
+               passwordUG->mdm_policy = (mdm_password_policy_t*)(passwordUG->mdm_data->data);
 
-               if (SETTING_PW_TYPE_SET_PASSWORD == passwordUG->view_type) 
+               if ((SETTING_PW_TYPE_MDM_NEW_POLICY == passwordUG->view_type) /* support mdm policy */
+                       || (SETTING_PW_TYPE_MDM_CHANGE_PASSWORD == passwordUG->view_type))
                {
-               if( strcmp(passwordUG->view_type_string, "SETTING_PW_TYPE_RESET") == 0)
-               {       /* no need to set password, in this case.*/
-                       bundle *b = bundle_create();
-                       if (!b)
-                               return NULL;
-
-                       bundle_add(b, "result", passwordUG->view_type_string);
-                       ug_send_result(passwordUG->ug, b);
-                       SETTING_TRACE("Send Result : %s\n", passwordUG->view_type_string);
-                       bundle_free(b);
-                       /* Send destroy request */
-                       ug_destroy_me(passwordUG->ug);
+                       if(passwordUG->mdm_policy != NULL)
+                       {
+                               if((passwordUG->mdm_policy->quality == MDM_PASSWORD_QUALITY_SOMETHING)
+                                       || (passwordUG->mdm_policy->quality == MDM_PASSWORD_QUALITY_NUMERIC))
+                               {
+                                       if( (passwordUG->view_type == SETTING_PW_TYPE_MDM_NEW_POLICY)
+                                               && (passwordUG->screen_lock_type == SETTING_SCREEN_LOCK_TYPE_SIMPLE_PASSWORD))
+                                       {
+                                               /*if only length is 0~4, apply simple password mode */
+                                               if(passwordUG->mdm_policy->min_length <= SETTING_PW_UG_NORMAL_PASSWORD_MIN_LENGTH)
+                                               {
+                                                       passwordUG->view_type = SETTING_PW_TYPE_MDM_TO_SIMPLE;
+                                               }
+                                               else
+                                               {
+                                                       if(vconf_set_bool(VCONFKEY_SETAPPL_STATE_SIMPLE_PASSWORD_BOOL, FALSE) != 0)
+                                                       {
+                                                               SETTING_TRACE_DEBUG("[ERROR] setting VCONFKEY_SETAPPL_STATE_SIMPLE_PASSWORD_BOOL failed");
+                                                       }
+                                               }
+                                       }
+                               }
+
+                               ecore_x_netwm_window_type_set(elm_win_xwindow_get(passwordUG->win_get), ECORE_X_WINDOW_TYPE_NOTIFICATION);
+                               utilx_set_system_notification_level(ecore_x_display_get(), elm_win_xwindow_get(passwordUG->win_get), UTILX_NOTIFICATION_LEVEL_NORMAL);
+
+                               /*  creating a view. */
+                               setting_view_create(&setting_view_password_main,(void *)passwordUG);
+                               evas_object_event_callback_add(passwordUG->win_main_layout,
+                                                                               EVAS_CALLBACK_RESIZE,
+                                                                               setting_password_ug_cb_resize,
+                                                                               passwordUG);
+                               __setting_password_ug_key_grab(passwordUG);
+
+                               return passwordUG->ly_main;
+                       }
+                       else
+                       {
+                               /* unexpected case */
+                               SETTING_TRACE_DEBUG("[ERROR] no policy");
+                               if (SETTING_PW_TYPE_MDM_NEW_POLICY == passwordUG->view_type)
+                                       passwordUG->view_type = SETTING_PW_TYPE_SET_PASSWORD;
+                               else if (SETTING_PW_TYPE_MDM_CHANGE_PASSWORD == passwordUG->view_type)
+                                       passwordUG->view_type = SETTING_PW_TYPE_CHANGE_PASSWORD;
+                       }
                }
-               /*  Make a popup */
-                       passwordUG->setpw_notify = setting_create_popup_with_btn(passwordUG,
-                                        (Evas_Object *) ug_get_window(),
-                                        _("IDS_ST_POP_NO_PASSWORD_SET_PASSWORD_Q"),
-                                        NULL,
-                                        setting_password_ug_set_password_cb,
-                                        0, 2, _("IDS_COM_SK_YES"),_("IDS_COM_SK_NO"));
-
-               /*  Make a Layout */
-               passwordUG->ly_main = elm_layout_add(passwordUG->win_main_layout);
-               if (passwordUG->ly_main == NULL)
-                       return NULL;
-               evas_object_hide(passwordUG->ly_main);
-
-               return passwordUG->ly_main;
-       } else {
-               /*  creating a view. */
-               setting_view_create(&setting_view_password_main,(void *)passwordUG);
-               evas_object_event_callback_add(passwordUG->win_main_layout,
+               else
+               {
+                       SETTING_TRACE_DEBUG("[ERROR] failed to connect mdm server");
+               }
+       }
+#endif
+#ifdef SUPPORT_MDM
+       if (SETTING_PW_TYPE_CHANGE_PASSWORD == passwordUG->view_type)
+       {
+               // to do : if policy exist and quality is not unspecified,
+               //                      change view type to SETTING_PW_TYPE_MDM_CHANGE_PASSWORD
+               if((passwordUG->mdm_policy) && (passwordUG->mdm_policy->quality != MDM_PASSWORD_QUALITY_UNSPECIFIED))
+               {
+                       passwordUG->view_type = SETTING_PW_TYPE_MDM_CHANGE_PASSWORD;
+                       SETTING_TRACE_DEBUG("change view type to SETTING_PW_TYPE_MDM_CHANGE_PASSWORD");
+               }
+               // end
+       }
+#endif
+       /*  creating a view. */
+       setting_view_create(&setting_view_password_main,(void *)passwordUG);
+       evas_object_event_callback_add(passwordUG->win_main_layout,
                                               EVAS_CALLBACK_RESIZE,
                                               setting_password_ug_cb_resize,
                                               passwordUG);
-               return passwordUG->ly_main;
-       }
+       return passwordUG->ly_main;
 }
 
-static void setting_password_ug_on_start(struct ui_gadget *ug, bundle *data, void *priv)
+static void setting_password_ug_on_start(ui_gadget_h ug, service_h service, void *priv)
 {
-       SettingPasswordUG *passwordUG = (SettingPasswordUG *)priv;
-
-       /* handle focus of entry */
-       if(passwordUG->sp_entry1 != NULL)
-       {
-               SETTING_TRACE_DEBUG("sp_entry1 is exist.");
-               elm_object_focus_set(passwordUG->sp_entry1, EINA_TRUE);
-               passwordUG->sp_focused = passwordUG->sp_entry1;
-       }
 }
 
-static void setting_password_ug_on_pause(struct ui_gadget *ug, bundle *data, void *priv)
+static void setting_password_ug_on_pause(ui_gadget_h ug, service_h service, void *priv)
 {
 }
 
-static void setting_password_ug_on_resume(struct ui_gadget *ug, bundle *data, void *priv)
+static void setting_password_ug_on_resume(ui_gadget_h ug, service_h service, void *priv)
 {
 }
 
-static void setting_password_ug_on_destroy(struct ui_gadget *ug, bundle *data, void *priv)
+static void setting_password_ug_on_destroy(ui_gadget_h ug, service_h service, void *priv)
 {
        SettingPasswordUG *passwordUG = (SettingPasswordUG *)priv;
 
@@ -340,15 +554,21 @@ static void setting_password_ug_on_destroy(struct ui_gadget *ug, bundle *data, v
        if (passwordUG->t_info) {
                FREE(passwordUG->t_info);
        }
-
        if(passwordUG->remove_timer)
        {
                ecore_timer_del(passwordUG->remove_timer);
                passwordUG->remove_timer = NULL;
        }
-       
-       /* release */
-       ecore_imf_shutdown();
+#ifdef SUPPORT_MDM
+       if(passwordUG->event_handler)
+       {
+               __setting_password_ug_key_ungrab(passwordUG);
+       }
+       if(passwordUG->mdm_status == MDM_RESULT_SUCCESS)
+       {
+               mdm_release_service();
+       }
+#endif
 
        /*  delete the allocated objects. */
        setting_view_destroy(&setting_view_password_main, passwordUG);
@@ -358,14 +578,14 @@ static void setting_password_ug_on_destroy(struct ui_gadget *ug, bundle *data, v
        }
 }
 
-static void setting_password_ug_on_message(struct ui_gadget *ug, bundle *msg,
-                                          bundle *data, void *priv)
+static void setting_password_ug_on_message(ui_gadget_h ug, service_h msg,
+                                          service_h service, void *priv)
 {
 
 }
 
-static void setting_password_ug_on_event(struct ui_gadget *ug,
-                                        enum ug_event event, bundle *data,
+static void setting_password_ug_on_event(ui_gadget_h ug,
+                                        enum ug_event event, service_h service,
                                         void *priv)
 {
        switch (event) {
@@ -390,11 +610,11 @@ static void setting_password_ug_on_event(struct ui_gadget *ug,
        }
 }
 
-static void setting_password_ug_on_key_event(struct ui_gadget *ug,
+static void setting_password_ug_on_key_event(ui_gadget_h ug,
                                             enum ug_key_event event,
-                                            bundle *data, void *priv)
+                                            service_h service, void *priv)
 {
-       if (!ug || !priv)
+       if (!priv)
                return;
 
        SettingPasswordUG *ad = (SettingPasswordUG*)priv;
@@ -442,335 +662,198 @@ UG_MODULE_API void UG_MODULE_EXIT(struct ug_module_ops *ops)
                FREE(passwordUG);
 }
 
-int setting_password_ug_subscribe_sim_events(SettingPasswordUG *ad)
+void setting_sim_change_pins_cb(TapiHandle *handle, int result, void *data, void *user_data)
 {
-       int i = 0;
-       int ret = SETTING_RETURN_SUCCESS;
-       int tapi_ret = TAPI_API_SUCCESS;
-       tapi_request_tapi_info *t_info;
-
-       if (tel_init() != TAPI_API_SUCCESS) {
-               SETTING_TRACE_DEBUG("%s*** [ERR] tel_init. ***%s",
-                                   SETTING_FONT_RED, SETTING_FONT_BLACK);
-               return SETTING_TAPI_INIT_ECORE_ERR;
+       SETTING_TRACE_BEGIN;
+       ret_if(!user_data || !data);
+       TelSimPinOperationResult_t sec_rt = result;
+       tapi_receive_info result_info = { 0, };
+       TelSimSecResult_t *sim_event_data = (TelSimSecResult_t *) data;
+       SETTING_TRACE("sec_rt[%d]", sec_rt);
+       SETTING_TRACE("sim_event_data->type:%d", sim_event_data->type);
+       SETTING_TRACE("sim_event_data->retry_count[%d]", sim_event_data->retry_count);
+
+       if (TAPI_SIM_PIN_OPERATION_SUCCESS == sec_rt) {
+               if (TAPI_SIM_PTYPE_PIN1 == sim_event_data->type)
+                       result_info.stat = SIM_PIN1_CHANGE_SUCCESS;
+               else if (TAPI_SIM_PTYPE_PIN2 == sim_event_data->type)
+                       result_info.stat = SIM_PIN2_CHANGE_SUCCESS;
+       } else if (TAPI_SIM_PIN_INCORRECT_PASSWORD == sec_rt) {
+               if (TAPI_SIM_PTYPE_PIN1 == sim_event_data->type) {
+                       result_info.stat = SIM_INCORRECT_PIN1_CODE;
+                       result_info.retry_cnt = sim_event_data->retry_count;
+               } else if (TAPI_SIM_PTYPE_PIN2 == sim_event_data->type) {
+                       result_info.stat = SIM_INCORRECT_PIN2_CODE;
+                       result_info.retry_cnt = sim_event_data->retry_count;
+               }
+       } else if (TAPI_SIM_PUK_REQUIRED == sec_rt) {
+               if (TAPI_SIM_PTYPE_PIN1 == sim_event_data->type)
+                       result_info.stat = SIM_PIN1_BLOCKED;
+               else if (TAPI_SIM_PTYPE_PIN2 == sim_event_data->type)
+                       result_info.stat = SIM_PIN2_BLOCKED;
+       } else {
+               SETTING_TRACE_DEBUG
+                   ("%s*** [ERR] INCORRECTED ***%s",
+                    SETTING_FONT_RED, SETTING_FONT_BLACK);
+               return;
        }
+       setting_password_ug_display_result_popup(&result_info, user_data);
+}
 
-       SETTING_TRACE_DEBUG("Tapi Init : %d", tapi_ret);
-
-       t_info = calloc(1, sizeof(tapi_request_tapi_info));
+void setting_sim_verify_puks_cb(TapiHandle *handle, int result, void *data, void *user_data)
+{
+       SETTING_TRACE_BEGIN;
 
-       if (NULL == t_info) {
-               SETTING_TRACE_DEBUG("Tapi calloc data error\n");
-               return SETTING_RETURN_FAIL;
-       }
+       ret_if(!user_data || !data);
+       SettingPasswordUG *ad = user_data;
+       TelSimPinOperationResult_t sec_rt = result;
+       tapi_receive_info result_info = { 0, };
+       TelSimSecResult_t *sim_event_data = (TelSimSecResult_t *) data;
+       ad->verify_puks_result = sim_event_data;
+       SETTING_TRACE("sec_rt[%d]", sec_rt);
+       SETTING_TRACE("sim_event_data->type:%d", sim_event_data->type);
+       SETTING_TRACE("sim_event_data->retry_count[%d]", sim_event_data->retry_count);
 
-       t_info->evt = tapi_req_events;
-       t_info->evt_sz = sizeof(tapi_req_events) / sizeof(tapi_req_events[0]);
-       t_info->cb = NULL;
-       t_info->cb_data = NULL;
-
-       SETTING_TRACE_DEBUG("Tapi Info Size : %d", t_info->evt_sz);
-       for (i = 0; i < t_info->evt_sz; i++) {
-               tapi_ret =
-                   tel_register_event(t_info->evt[i].event,
-                                      &(t_info->evt[i].sid),
-                                      (TelAppCallback) &
-                                      setting_password_ug_sim_event_callback,
-                                      ad);
-               SETTING_TRACE_DEBUG
-                   ("TAPI Register Return : %d Event : %d sid: %d", tapi_ret,
-                    t_info->evt[i].event, t_info->evt[i].sid);
+       if (TAPI_SIM_PTYPE_PUK1 == sim_event_data->type)
+       {
+               //if (TAPI_SIM_PIN_REQUIRED == sec_rt){
+               if (TAPI_SIM_PIN_OPERATION_SUCCESS == sec_rt){
+                       setting_password_ug_create_popup_notitle_nobtn(ad, _("Verfy PUK1 Sucessfully"), TRUE);
+                       return;
+               } else if (TAPI_SIM_PIN_INCORRECT_PASSWORD == sec_rt) {
+                       result_info.stat = SIM_INCORRECT_PUK1_CODE;
+                       result_info.retry_cnt = sim_event_data->retry_count;
+               } else {
+                       result_info.stat = SIM_UNKNOWN_ERROR;
+               }
        }
 
-       if (TAPI_API_SUCCESS == tapi_ret) {
-               tapi_ret = tel_register_app_name("org.tizen.setting");
-
-               if (tapi_ret != TAPI_API_SUCCESS) {
-                       SETTING_TRACE_DEBUG
-                           ("%s*** [ERR] tel_register_app_name. ***%s",
-                            SETTING_FONT_RED, SETTING_FONT_BLACK);
-                       FREE(t_info);   /* memory leak */
-                       return SETTING_TAPI_REG_EVENT_ECORE_ERR;
+       else if (TAPI_SIM_PTYPE_PUK2 == sim_event_data->type)
+       {
+               //if (TAPI_SIM_PUK_REQUIRED == sec_rt)
+               if (TAPI_SIM_PIN_OPERATION_SUCCESS == sec_rt){
+                       setting_password_ug_create_popup_notitle_nobtn(ad, _("Verfy PUK2 Sucessfully"), TRUE);
+                       return;
+               } else if (TAPI_SIM_PUK_INCORRECT_PASSWORD == sec_rt) {
+                       result_info.stat = SIM_INCORRECT_PUK2_CODE;
+                       result_info.retry_cnt = sim_event_data->retry_count;
+               } else {
+                       result_info.stat = SIM_UNKNOWN_ERROR;
                }
        }
-       ad->t_info = t_info;
-       return ret;
+       else
+       {
+               result_info.stat = SIM_UNKNOWN_ERROR;
+       }
+       setting_password_ug_display_result_popup(&result_info, user_data);
 }
 
-int setting_password_ug_unsubscribe_sim_events(SettingPasswordUG *ad)
+void setting_sim_facility_enable_cb(TapiHandle *handle, int result, void *data, void *user_data)
 {
-       retv_if(ad == NULL, SETTING_GENERAL_ERR_WRONG_PARAMETER);
-       
-       int i = 0;
-       int ret = SETTING_RETURN_SUCCESS;
-       int tapi_ret = TAPI_API_SUCCESS;
-
-       if (ad->t_info) {
-               tapi_request_tapi_info *t_info = ad->t_info;
-               SETTING_TRACE("T_INFO size : %d\n", t_info->evt_sz);
-               for (i = 0; i < t_info->evt_sz; i++) {
-                       if (t_info->evt[i].sid == -1)
-                               continue;
-
-                       /* tapi_ret = tel_deregister_event_at_ecore_loop(t_info->evt[i].sid); */
-                       tapi_ret = tel_deregister_event(t_info->evt[i].sid);
-                       if (tapi_ret != TAPI_API_SUCCESS) {
-                               SETTING_TRACE_DEBUG
-                                   ("%s*** [ERR] tel_deregister_event. %dth , sid =%d, tapi_ret=%d ***%s\n",
-                                    SETTING_FONT_RED, i, t_info->evt[i].sid,
-                                    tapi_ret, SETTING_FONT_BLACK);
-                               return SETTING_TAPI_DEREG_EVENT_ECORE_ERR;
-                               break;
-                       } else {
-                               SETTING_TRACE
-                                   ("Event unregistering succeeded [%dth : %d] [subscription ID: %d]",
-                                    i, t_info->evt[i].event,
-                                    t_info->evt[i].sid);
-                       }
+       SETTING_TRACE_BEGIN;
+       ret_if(!user_data || !data);
+       TelSimPinOperationResult_t sec_rt = result;
+       tapi_receive_info result_info = { 0, };
+       TelSimFacilityResult_t *sim_event_data = (TelSimFacilityResult_t *) data;
+
+       SETTING_TRACE("sec_rt[%d]", sec_rt);
+       SETTING_TRACE("sim_event_data->type:%d", sim_event_data->type);
+       SETTING_TRACE("sim_event_data->retry_count[%d]", sim_event_data->retry_count);
+
+       /*  Sim Lock  */
+       if (TAPI_SIM_LOCK_PS == sim_event_data->type) {
+               SETTING_TRACE("CASE TAPI_SIM_PTYPE_SIM == sim_event_data->type");
+               if (TAPI_SIM_PIN_OPERATION_SUCCESS == sec_rt)
+                       result_info.stat = SIM_LOCK_ON_SUCCESS;
+               else if (TAPI_SIM_PIN_INCORRECT_PASSWORD == sec_rt)
+                       result_info.stat = SIM_LOCK_INCORRECT_PASSWORD;
+               else {
+                       SETTING_TRACE_DEBUG("%s*** [ERR] INCORRECTED ***%s",
+                            SETTING_FONT_RED,
+                            SETTING_FONT_BLACK);
+                       return;
                }
-               FREE(ad->t_info);
        }
-
-       tapi_ret = tel_deinit();
-       if (tapi_ret != TAPI_API_SUCCESS) {
-               SETTING_TRACE_DEBUG("%s*** [ERR] tel_deinit. tapi_ret=%d ***%s",
-                                   SETTING_FONT_RED, tapi_ret,
-                                   SETTING_FONT_BLACK);
-               return SETTING_TAPI_DEREG_EVENT_ECORE_ERR;
+       /*  Pin Lock */
+       else if (TAPI_SIM_LOCK_SC == sim_event_data->type) {
+               SETTING_TRACE("CASE TAPI_SIM_PTYPE_PIN1 == sim_event_data->type");
+               if (TAPI_SIM_PIN_OPERATION_SUCCESS == sec_rt)
+                       result_info.stat = SIM_PIN_LOCK_ON_SUCCESS;
+               else if (TAPI_SIM_PIN_INCORRECT_PASSWORD == sec_rt) {
+                       result_info.stat = SIM_INCORRECT_PIN1_CODE;
+                       result_info.retry_cnt = sim_event_data->retry_count;
+               } else if (TAPI_SIM_PUK_REQUIRED == sec_rt)
+                       result_info.stat = SIM_PIN1_BLOCKED;
+
+               /*  Pre CCF */
+               else if (TAPI_SIM_INCOMPATIBLE_PIN_OPERATION == sec_rt
+                        || TAPI_SIM_CARD_ERROR == sec_rt) {
+                       /*  popup */
+                       result_info.stat = SIM_OPERATION_UNAVAILABLE;
+               }
+               else {
+                       SETTING_TRACE_DEBUG
+                           ("%s*** [ERR] INCORRECTED ***%s",
+                            SETTING_FONT_RED,
+                            SETTING_FONT_BLACK);
+                       return;
+               }
        }
-       return ret;
+       setting_password_ug_display_result_popup(&result_info, user_data);
 }
-
-#ifdef Status
-#undef Status
-#endif
-
-static int
-setting_password_ug_sim_event_callback(const TelTapiEvent_t *event, void *data)
+void setting_sim_facility_disable_cb(TapiHandle *handle, int result, void *data, void *user_data)
 {
-       retv_if(data == NULL || event == NULL, SETTING_GENERAL_ERR_WRONG_PARAMETER);
-       SETTING_TRACE("event->EventClass=\t%d", (int)(event->EventClass));
-       SETTING_TRACE("event->EventType=\t%d", event->EventType);
-       SETTING_TRACE("event->Status=\t%d", event->Status);
-       SETTING_TRACE("event->RequestId=\t%d", event->RequestId);
-       SettingPasswordUG *ad = data;
-
+       SETTING_TRACE_BEGIN;
+       ret_if(!user_data || !data);
+       TelSimPinOperationResult_t sec_rt = result;
        tapi_receive_info result_info = { 0, };
-       TelSimSecResult_t *sim_event_data = NULL;
-       sim_event_data = (TelSimSecResult_t *) event->pData;
-
-       if (TAPI_EVENT_CLASS_SIM != event->EventClass || NULL == sim_event_data) {
-               SETTING_TRACE_DEBUG
-                   ("EventClass is not EVENT_CLASS_SIM or sim_event_data is NULL!\n");
-               SETTING_TRACE_DEBUG("sim_event_data %p\n", sim_event_data);
-               return SETTING_RETURN_FAIL;
-       }
-
-       switch (event->EventType) {
-               /*  Lock ON */
-       case TAPI_EVENT_SIM_ENABLE_SEC_CNF:
-               {
-                       SETTING_TRACE
-                           ("CASE: TAPI_EVENT_SIM_ENABLE_SEC_CNF [Event Data Type: %d]",
-                            sim_event_data->type);
-
-                       /*  Sim Lock  */
-                       if (TAPI_SIM_PTYPE_SIM == sim_event_data->type) {
-                               if (TAPI_SIM_PIN_OPERATION_SUCCESS == event->Status)
-                                       result_info.stat = SIM_LOCK_ON_SUCCESS;
-                               else if (TAPI_SIM_PIN_INCORRECT_PASSWORD == event->Status)
-                                       result_info.stat = SIM_LOCK_INCORRECT_PASSWORD;
-                               else {
-                                       SETTING_TRACE_DEBUG("%s*** [ERR] INCORRECTED ***%s",
-                                            SETTING_FONT_RED,
-                                            SETTING_FONT_BLACK);
-                                       return SETTING_RETURN_FAIL;
-                               }
-                       }
-                       /*  Pin Lock */
-                       else if (TAPI_SIM_PTYPE_PIN1 == sim_event_data->type) {
-                               if (TAPI_SIM_PIN_OPERATION_SUCCESS == event->Status)
-                                       result_info.stat = SIM_PIN_LOCK_ON_SUCCESS;
-                               else if (TAPI_SIM_PIN_INCORRECT_PASSWORD == event->Status) {
-                                       result_info.stat = SIM_INCORRECT_PIN1_CODE;
-                                       result_info.retry_cnt = sim_event_data->retry_count;
-                               } else if (TAPI_SIM_PUK_REQUIRED == event->Status)
-                                       result_info.stat = SIM_PIN1_BLOCKED;
-
-                               /*  Pre CCF */
-                               else if (TAPI_SIM_INCOMPATIBLE_PIN_OPERATION == event->Status
-                                        || TAPI_SIM_CARD_ERROR == event->Status) {
-                                       /*  popup */
-                                       result_info.stat = SIM_OPERATION_UNAVAILABLE;
-                               }
-                               else {
-                                       SETTING_TRACE_DEBUG
-                                           ("%s*** [ERR] INCORRECTED ***%s",
-                                            SETTING_FONT_RED,
-                                            SETTING_FONT_BLACK);
-                                       return SETTING_RETURN_FAIL;
-                               }
-                       }
-               }
-               break;
-
-               /*  Lock OFF                    */
-       case TAPI_EVENT_SIM_DISABLE_SEC_CNF:
-               {
-                       SETTING_TRACE
-                           ("CASE: TAPI_EVENT_SIM_DISABLE_SEC_CNF [Event Data Type: %d]",
-                            sim_event_data->type);
-
-                       /*  Sim Lock  */
-                       if (TAPI_SIM_PTYPE_SIM == sim_event_data->type) {
-                               if (TAPI_SIM_PIN_OPERATION_SUCCESS == event->Status)
-                                       result_info.stat = SIM_LOCK_OFF_SUCCESS;
-                               else if (TAPI_SIM_PIN_INCORRECT_PASSWORD == event->Status)
-                                       result_info.stat = SIM_LOCK_INCORRECT_PASSWORD;
-                               else {
-                                       SETTING_TRACE_DEBUG
-                                           ("%s*** [ERR] INCORRECTED ***%s",
-                                            SETTING_FONT_RED,
-                                            SETTING_FONT_BLACK);
-                                       return SETTING_RETURN_FAIL;
-                               }
-                       }
-                       /*  Pin Lock */
-                       else if (TAPI_SIM_PTYPE_PIN1 == sim_event_data->type) {
-                               if (TAPI_SIM_PIN_OPERATION_SUCCESS == event->Status)
-                                       result_info.stat = SIM_PIN_LOCK_OFF_SUCCESS;
-                               else if (TAPI_SIM_PIN_INCORRECT_PASSWORD == event->Status) {
-                                       result_info.stat = SIM_INCORRECT_PIN1_CODE;
-                                       result_info.retry_cnt = sim_event_data->retry_count;
-                               } else if (TAPI_SIM_PUK_REQUIRED == event->Status)
-                                       result_info.stat = SIM_PIN1_BLOCKED;
-
-                               /*  Pre CCF */
-                               else if (TAPI_SIM_INCOMPATIBLE_PIN_OPERATION == event->Status
-                                        || TAPI_SIM_CARD_ERROR == event->Status) {
-                                       /*  popup */
-                                       result_info.stat = SIM_OPERATION_UNAVAILABLE;
-                               }
-                               else {
-                                       SETTING_TRACE_DEBUG
-                                           ("%s*** [ERR] INCORRECTED ***%s",
-                                            SETTING_FONT_RED,
-                                            SETTING_FONT_BLACK);
-                                       return SETTING_RETURN_FAIL;
-                               }
-                       }
+       TelSimFacilityResult_t *sim_event_data = (TelSimFacilityResult_t *) data;
+       SETTING_TRACE("sec_rt[%d]", sec_rt);
+       SETTING_TRACE("sim_event_data->type:%d", sim_event_data->type);
+       SETTING_TRACE("sim_event_data->retry_count[%d]", sim_event_data->retry_count);
+
+       /*  Sim Lock  */
+       if (TAPI_SIM_LOCK_PS == sim_event_data->type) {
+               if (TAPI_SIM_PIN_OPERATION_SUCCESS == sec_rt)
+                       result_info.stat = SIM_LOCK_OFF_SUCCESS;
+               else if (TAPI_SIM_PIN_INCORRECT_PASSWORD == sec_rt)
+                       result_info.stat = SIM_LOCK_INCORRECT_PASSWORD;
+               else {
+                       SETTING_TRACE_DEBUG
+                           ("%s*** [ERR] INCORRECTED ***%s",
+                            SETTING_FONT_RED,
+                            SETTING_FONT_BLACK);
+                       return;
                }
-               break;
-
-               /*  Verify PUK1, PUK2 */
-       case TAPI_EVENT_SIM_VERIFY_PUK_CNF:
-               {
-                       SETTING_TRACE
-                           ("CASE: TAPI_EVENT_SIM_VERIFY_PUK_CNF [Event Data Type: %d]",
-                            sim_event_data->type);
-
-                       TelSimPinStatus_t pin_status = -1;
-                       TelSimPinType_t pin_type = 0;
-
-                       if (TAPI_SIM_PTYPE_PUK1 == sim_event_data->type)
-                               pin_type = TAPI_SIM_PTYPE_PIN1;
-                       else if (TAPI_SIM_PTYPE_PUK2 == sim_event_data->type)
-                               pin_type = TAPI_SIM_PTYPE_PIN2;
-                       else {
-                               SETTING_TRACE_DEBUG
-                                   ("%s*** [ERR] Invalid pin_type ***%s",
-                                    SETTING_FONT_RED, SETTING_FONT_BLACK);
-                               return SETTING_RETURN_FAIL;
-                       }
-
-                       int tapi_ret = tel_get_sim_security_status(pin_type, &pin_status);
-                       SETTING_TRACE
-                           ("TAPI RET : %d PIN_TYPE : %d PIN_STATUS : %d\n",
-                            tapi_ret, pin_type, pin_status);
-                       if (TAPI_API_SUCCESS != tapi_ret) {
-                               SETTING_TRACE_DEBUG
-                                   ("%s*** [ERR] tel_get_sim_security_status ***%s",
-                                    SETTING_FONT_RED, SETTING_FONT_BLACK);
-                               return SETTING_RETURN_FAIL;
-                       }
-                       /*  Puk Blocked */
-                       if (TAPI_SIM_PIN_STATUS_PUK_BLOCKED == pin_status) {
-                               if (TAPI_SIM_PTYPE_PIN1 == pin_type)
-                                       result_info.stat = SIM_PUK1_BLOCKED;
-                               else
-                                       result_info.stat = SIM_PUK2_BLOCKED;
-                       }
-                       /*  Pin Blocked and verifying puk code */
-                       else if (TAPI_SIM_PIN_STATUS_ENABLED == pin_status) {
-                               if (TAPI_SIM_PIN_OPERATION_SUCCESS == event->Status) {
-                                       if (TAPI_SIM_PTYPE_PIN1 == pin_type)
-                                               result_info.stat = SIM_PIN1_UNBLOCKED;
-                                       else
-                                               result_info.stat = SIM_PIN2_UNBLOCKED;
-                               }
-                       }
-                       /*  Pin Block */
-                       else if (TAPI_SIM_PIN_STATUS_BLOCKED == pin_status) {
-                               if (TAPI_SIM_PTYPE_PIN1 == pin_type) {
-                                       result_info.stat = SIM_INCORRECT_PUK1_CODE;
-                                       result_info.retry_cnt = sim_event_data->retry_count;
-                               } else {
-                                       result_info.stat = SIM_INCORRECT_PUK2_CODE;
-                                       result_info.retry_cnt = sim_event_data->retry_count;
-                               }
-                       } else {
-                               SETTING_TRACE_DEBUG
-                                   ("%s*** [ERR] INCORRECTED ***%s",
-                                    SETTING_FONT_RED, SETTING_FONT_BLACK);
-                               result_info.stat = SIM_UNKNOWN_ERROR;
-                       }
+       }
+       /*  Pin Lock */
+       else if (TAPI_SIM_LOCK_SC == sim_event_data->type) {
+               if (TAPI_SIM_PIN_OPERATION_SUCCESS == sec_rt)
+                       result_info.stat = SIM_PIN_LOCK_OFF_SUCCESS;
+               else if (TAPI_SIM_PIN_INCORRECT_PASSWORD == sec_rt) {
+                       result_info.stat = SIM_INCORRECT_PIN1_CODE;
+                       result_info.retry_cnt = sim_event_data->retry_count;
+               } else if (TAPI_SIM_PUK_REQUIRED == sec_rt)
+                       result_info.stat = SIM_PIN1_BLOCKED;
+
+               /*  Pre CCF */
+               else if (TAPI_SIM_INCOMPATIBLE_PIN_OPERATION == sec_rt
+                        || TAPI_SIM_CARD_ERROR == sec_rt) {
+                       /*  popup */
+                       result_info.stat = SIM_OPERATION_UNAVAILABLE;
                }
-               break;
-
-               /*  Change PIN1, PIN2 */
-       case TAPI_EVENT_SIM_CHANGE_PINS_CNF:
-               {
-                       SETTING_TRACE
-                           ("CASE: TAPI_EVENT_SIM_CHANGE_PINS_CNF [Event Data Type: %d]",
-                            sim_event_data->type);
-
-                       if (TAPI_SIM_PIN_OPERATION_SUCCESS == event->Status) {
-                               if (TAPI_SIM_PTYPE_PIN1 == sim_event_data->type)
-                                       result_info.stat = SIM_PIN1_CHANGE_SUCCESS;
-                               else if (TAPI_SIM_PTYPE_PIN2 == sim_event_data->type)
-                                       result_info.stat = SIM_PIN2_CHANGE_SUCCESS;
-                       } else if (TAPI_SIM_PIN_INCORRECT_PASSWORD == event->Status) {
-                               if (TAPI_SIM_PTYPE_PIN1 == sim_event_data->type) {
-                                       result_info.stat = SIM_INCORRECT_PIN1_CODE;
-                                       result_info.retry_cnt = sim_event_data->retry_count;
-                               } else if (TAPI_SIM_PTYPE_PIN2 == sim_event_data->type) {
-                                       result_info.stat = SIM_INCORRECT_PIN2_CODE;
-                                       result_info.retry_cnt = sim_event_data->retry_count;
-                               }
-                       } else if (TAPI_SIM_PUK_REQUIRED == event->Status) {
-                               if (TAPI_SIM_PTYPE_PIN1 == sim_event_data->type)
-                                       result_info.stat = SIM_PIN1_BLOCKED;
-                               else if (TAPI_SIM_PTYPE_PIN2 == sim_event_data->type)
-                                       result_info.stat = SIM_PIN2_BLOCKED;
-                       } else {
-                               SETTING_TRACE_DEBUG
-                                   ("%s*** [ERR] INCORRECTED ***%s",
-                                    SETTING_FONT_RED, SETTING_FONT_BLACK);
-                               return SETTING_RETURN_FAIL;
-                       }
+               else {
+                       SETTING_TRACE_DEBUG
+                           ("%s*** [ERR] INCORRECTED ***%s",
+                            SETTING_FONT_RED,
+                            SETTING_FONT_BLACK);
+                       return;
                }
-               break;
-               
-       default:
-               break;
        }
-
-       setting_password_ug_display_result_popup(&result_info, ad);
-
-       return 0;
+       setting_password_ug_display_result_popup(&result_info, user_data);
 }
 
-static void setting_password_ug_display_result_popup(tapi_receive_info *result, 
+static void setting_password_ug_display_result_popup(tapi_receive_info *result,
                                                     SettingPasswordUG *ad)
 {
        switch (result->stat) {
@@ -791,14 +874,15 @@ static void setting_password_ug_display_result_popup(tapi_receive_info *result,
                                                "[Error] set value of vconf fail.");
                        }
                        /*  Success to Operate */
-                       bundle *b = NULL;
-                       b = bundle_create();
-                       if (!b)
+                       service_h svc;
+                       if (service_create(&svc))
                                return;
-                       bundle_add(b, "result", ad->view_type_string);
-                       ug_send_result(ad->ug, b);
+
+                       service_add_extra_data(svc, "result", ad->view_type_string);
+                       ug_send_result(ad->ug, svc);
                        SETTING_TRACE("Send Result : %s\n", ad->view_type_string);
-                       bundle_free(b);
+
+                       service_destroy(svc);
                        /* Send destroy request */
                        ug_destroy_me(ad->ug);
                }
@@ -818,10 +902,14 @@ static void setting_password_ug_display_result_popup(tapi_receive_info *result,
                                setting_retm_if(ret < 0, "snprintf fail");
                                ret_str = tmp_str;
                        } else {
-                               ret_str = _("IDS_ST_POP_INCORRECT_PIN1_ATTEMPT_LEFT");
+                               ret_str = _("IDS_ST_POP_INCORRECT_PIN1");
                        }
                        ad->focus_data = ad->ed_pw1;
+#ifdef SUPPORT_POPUP
+                       setting_password_ug_create_popup_notitle_nobtn(ad, (char *)ret_str, FALSE);
+#else
                        setting_password_ug_display_desc(ad, (char *)ret_str, FALSE);
+#endif
                }
                break;
        case SIM_INCORRECT_PIN2_CODE:
@@ -835,10 +923,14 @@ static void setting_password_ug_display_result_popup(tapi_receive_info *result,
                                setting_retm_if(ret < 0, "snprintf fail");
                                ret_str = tmp_str;
                        } else {
-                               ret_str = _("IDS_ST_POP_INCORRECT_PIN1_ATTEMPT_LEFT");
+                               ret_str = _("IDS_ST_POP_INCORRECT_PIN2");
                        }
                        ad->focus_data = ad->ed_pw1;
+#ifdef SUPPORT_POPUP
+                       setting_password_ug_create_popup_notitle_nobtn(ad, ret_str, FALSE);
+#else
                        setting_password_ug_display_desc(ad, ret_str, FALSE);
+#endif
                }
                break;
        case SIM_INCORRECT_PUK1_CODE:
@@ -852,10 +944,14 @@ static void setting_password_ug_display_result_popup(tapi_receive_info *result,
                                setting_retm_if(ret < 0, "snprintf fail");
                                ret_str = tmp_str;
                        } else {
-                               ret_str = _("IDS_ST_POP_INCORRECT_PUK1_1_ATTEMPT_LEFT");
+                               ret_str = _("IDS_ST_POP_INCORRECT_PUK1_CODE");
                        }
                        ad->focus_data = ad->ed_pw1;
+#ifdef SUPPORT_POPUP
+                       setting_password_ug_create_popup_notitle_nobtn(ad, ret_str, FALSE);
+#else
                        setting_password_ug_display_desc(ad, ret_str, FALSE);
+#endif
                }
                break;
        case SIM_INCORRECT_PUK2_CODE:
@@ -868,10 +964,14 @@ static void setting_password_ug_display_result_popup(tapi_receive_info *result,
                                setting_retm_if(ret < 0, "snprintf fail");
                                ret_str = tmp_str;
                        } else {
-                               ret_str = _("IDS_ST_POP_INCORRECT_PUK2_1_ATTEMPT_LEFT");
+                               ret_str = _("IDS_ST_POP_INCORRECT_PUK2");
                        }
                        ad->focus_data = ad->ed_pw1;
+#ifdef SUPPORT_POPUP
+                       setting_password_ug_create_popup_notitle_nobtn(ad, ret_str, FALSE);
+#else
                        setting_password_ug_display_desc(ad, ret_str, FALSE);
+#endif
                }
                break;
        case SIM_PIN1_CHANGE_SUCCESS:
@@ -912,7 +1012,7 @@ static void setting_password_ug_display_result_popup(tapi_receive_info *result,
                break;
        case SIM_OPERATION_UNAVAILABLE:
                setting_password_ug_create_popup_notitle_nobtn(ad,
-                                      _("IDS_ST_POP_SERVICE_UNAVAILABLE"), TRUE);
+                                      _("IDS_ST_HEADER_UNAVAILABLE"), TRUE);
                break;
        case SIM_UNKNOWN_ERROR:
                setting_password_ug_create_popup_notitle_nobtn(ad,
@@ -934,49 +1034,53 @@ static void setting_password_ug_display_result_popup(tapi_receive_info *result,
 
 void setting_password_ug_popup_resp_cb(void *data, Evas_Object *obj,
                                       void *event_info)
-{      
+{
        retm_if(data == NULL, "Data parameter is NULL");
-       bundle *b = NULL;
+
+       service_h svc;
        SettingPasswordUG *ad = (SettingPasswordUG *) data;
-                       if (ad->destroy) {
-                               /*  Success to Operate */
-                               b = bundle_create();
-                               if (!b)
-                                       return;
-                               bundle_add(b, "result", ad->view_type_string);
-                               ug_send_result(ad->ug, b);
-                               SETTING_TRACE("Send Result : %s\n", ad->view_type_string);
-                               bundle_free(b);
-
-                               /* Send destroy request */
-                               ug_destroy_me(ad->ug);
-                       } else {
-                               char *diable_view_type = NULL;
-                               if (ad->disable_item_type == SETTING_PW_TYPE_PHONE_LOCK) {
-                                       diable_view_type = "SETTING_PW_TYPE_PHONE_LOCK_DISABLE";
-                               } else if (ad->disable_item_type == SETTING_PW_TYPE_SIM_LOCK_OFF) {
-                                       diable_view_type = "SETTING_PW_TYPE_SIM_LOCK_DISABLE";
-                               }
+       if (ad->destroy) {
+               /*  Success to Operate */
 
-                               if (diable_view_type) {
-                                       /*  Success to Operate */
-                                       b = bundle_create();
-                                       if (!b)
-                                               return;
-                                       bundle_add(b, "result", diable_view_type);
-                                       ug_send_result(ad->ug, b);
-                                       bundle_free(b);
-
-                                       /* Send destroy request */
-                                       ug_destroy_me(ad->ug);
-                               }
-                               if (ad->focus_data) {
-                                       ad->focus_data->isFocusFlag = TRUE;
-                                       elm_object_item_data_set(ad->focus_data->item, ad->focus_data);
-                                       elm_genlist_item_update(ad->focus_data->item);
-                               }
-                       }
+               if (service_create(&svc))
+                       return;
+
+               service_add_extra_data(svc, "result", ad->view_type_string);
+               ug_send_result(ad->ug, svc);
+               SETTING_TRACE("Send Result : %s\n", ad->view_type_string);
+
+               service_destroy(svc);
+               /* Send destroy request */
+               ug_destroy_me(ad->ug);
+       } else {
+               char *diable_view_type = NULL;
+               //if (ad->disable_item_type == SETTING_PW_TYPE_PASSWORD) {
+               //      diable_view_type = "SETTING_PW_TYPE_PHONE_LOCK_DISABLE";
+               //} else
+               if (ad->disable_item_type == SETTING_PW_TYPE_SIM_LOCK_OFF) {
+                       diable_view_type = "SETTING_PW_TYPE_SIM_LOCK_DISABLE";
                }
+
+               if (diable_view_type) {
+                       /*  Success to Operate */
+
+                       if (service_create(&svc))
+                               return;
+
+                       service_add_extra_data(svc, "result", diable_view_type);
+                       ug_send_result(ad->ug, svc);
+
+                       service_destroy(svc);
+                       /* Send destroy request */
+                       ug_destroy_me(ad->ug);
+               }
+               if (ad->focus_data) {
+                       ad->focus_data->isFocusFlag = TRUE;
+                       elm_object_item_data_set(ad->focus_data->item, ad->focus_data);
+                       elm_genlist_item_update(ad->focus_data->item);
+               }
+       }
+}
 static Eina_Bool __remove_desc(void *data)
 {
        SETTING_TRACE_BEGIN;
@@ -998,33 +1102,38 @@ static Eina_Bool __remove_desc(void *data)
 
        if (ad->destroy) {
                /*  Success to Operate */
-               bundle *b = bundle_create();
-               if (!b)
+
+               service_h svc;
+               if (service_create(&svc))
                        return EINA_FALSE;
-               bundle_add(b, "result", ad->view_type_string);
-               ug_send_result(ad->ug, b);
+
+               service_add_extra_data(svc, "result", ad->view_type_string);
+               ug_send_result(ad->ug, svc);
                SETTING_TRACE("Send Result : %s\n", ad->view_type_string);
-               bundle_free(b);
 
+               service_destroy(svc);
                /* Send destroy request */
                ug_destroy_me(ad->ug);
        } else {
                char *diable_view_type = NULL;
-               if (ad->disable_item_type == SETTING_PW_TYPE_PHONE_LOCK) {
-                       diable_view_type = "SETTING_PW_TYPE_PHONE_LOCK_DISABLE";
-               } else if (ad->disable_item_type == SETTING_PW_TYPE_SIM_LOCK_OFF) {
+               //if (ad->disable_item_type == SETTING_PW_TYPE_PASSWORD) {
+               //      diable_view_type = "SETTING_PW_TYPE_PHONE_LOCK_DISABLE";
+               //} else
+               if (ad->disable_item_type == SETTING_PW_TYPE_SIM_LOCK_OFF) {
                        diable_view_type = "SETTING_PW_TYPE_SIM_LOCK_DISABLE";
                }
 
                if (diable_view_type) {
                        /*  Success to Operate */
-                       bundle *b = bundle_create();
-                       if (!b)
+
+                       service_h svc;
+                       if (service_create(&svc))
                                return EINA_FALSE;
-                       bundle_add(b, "result", diable_view_type);
-                       ug_send_result(ad->ug, b);
-                       bundle_free(b);
 
+                       service_add_extra_data(svc, "result", diable_view_type);
+                       ug_send_result(ad->ug, svc);
+
+                       service_destroy(svc);
                        /* Send destroy request */
                        ug_destroy_me(ad->ug);
                }
@@ -1039,7 +1148,12 @@ void setting_password_ug_display_desc(void *data, char *desc, int destroy)
 
        SettingPasswordUG *ad = (SettingPasswordUG *)data;
 
-       ad->destroy= destroy;
+#ifdef SUPPORT_MDM
+       if(ad->view_type == SETTING_PW_TYPE_MDM_NEW_POLICY)
+               return;
+#endif
+
+       ad->destroy = destroy;
 
        if(ad->scroller == NULL)
                return;
@@ -1049,7 +1163,7 @@ void setting_password_ug_display_desc(void *data, char *desc, int destroy)
                elm_object_item_del(ad->err_desc);
                ad->err_desc = NULL;
        }
-       
+
        ad->err_desc = elm_genlist_item_append(ad->scroller, &(ad->itc_err_desc), desc, NULL, ELM_GENLIST_ITEM_NONE, NULL, NULL);
        ad->remove_timer = ecore_timer_add(2.0, __remove_desc, ad);
 
@@ -1072,10 +1186,14 @@ setting_password_ug_create_popup_notitle_nobtn(void *data, char *str,
        SettingPasswordUG *ad = (SettingPasswordUG *) data;
 
        ad->destroy = destroy;
-       ad->notify = setting_create_popup_without_btn(ad, ad->ly_main, str,
-                                         NULL,
+       if(ad->notify)
+       {
+               evas_object_del(ad->notify);
+               ad->notify = NULL;
+       }
+       ad->notify = setting_create_popup_without_btn(ad, ad->ly_main, NULL, str,
                                          setting_password_ug_popup_resp_cb,
-                                         POPUP_INTERVAL);
+                                         POPUP_INTERVAL, FALSE, FALSE);
 }
 
 void setting_password_ug_check_attemps_left(void *data)
@@ -1087,7 +1205,7 @@ void setting_password_ug_check_attemps_left(void *data)
        setting_str_slp_list item_lock_timestamp;
        int attemps_left_max = 5;
 
-       if (ad->view_type == SETTING_PW_TYPE_PHONE_LOCK) {
+       if (ad->view_type == SETTING_PW_TYPE_PASSWORD) {
                item_attempts_left = INT_SLP_SETTING_PHONE_LOCK_ATTEMPTS_LEFT;
                item_lock_timestamp = STR_SLP_SETTING_PHONE_LOCK_TIMESTAMP;
                attemps_left_max = PHONE_LOCK_ATTEMPS_MAX;
@@ -1117,13 +1235,16 @@ void setting_password_ug_check_attemps_left(void *data)
                        snprintf(temp, sizeof(temp), "%s. %s.", PW_ERR_DESC, ATTEMPTS_DESC);
                else
                        snprintf(temp, sizeof(temp), "%s. %s.", PW_ERR_DESC, ATTEMPT_DESC);
-               
+
                int ret = snprintf(temp_str, MAX_SPECIALIZITION_LEN, temp, value);
-       
+
                ret_if(ret < 0);
-               
-               setting_password_ug_display_desc(ad, temp_str, FALSE);
 
+#ifdef SUPPORT_POPUP
+               setting_password_ug_create_popup_notitle_nobtn(ad, temp_str, FALSE);
+#else
+               setting_password_ug_display_desc(ad, temp_str, FALSE);
+#endif
        } else if (value == 0) {
                /*  store the lock timestamp */
                time_t cur_time = time(NULL);
@@ -1140,10 +1261,10 @@ void setting_password_ug_check_attemps_left(void *data)
                                "[Error] set value of vconf fail.");
 
                ad->disable_item_type = ad->view_type;
-               
+
                char temp[MAX_SPECIALIZITION_LEN] = {0,};
                snprintf(temp, sizeof(temp), PW_ERR_DELAY_DESC, PW_ERR_DELAY_TIME);
-               
+
                setting_password_ug_create_popup_notitle_nobtn(ad, temp, FALSE);
        } else {
                setting_password_ug_create_popup_notitle_nobtn(ad,
@@ -1168,25 +1289,58 @@ int setting_password_is_password_empty()
        else
                return SETTING_RETURN_FAIL;
 }
-int setting_password_check_password(const char *challenge)
+int setting_password_check_password(const char *challenge, unsigned int *remain_attempt, unsigned int *valid_sec)
 {
        SETTING_TRACE_BEGIN;
        retv_if(challenge == NULL, SETTING_GENERAL_ERR_NULL_DATA_PARAMETER);
 
+       int inner_ret = 0;
        int ret = 0;
        unsigned int current_attempt = 0;
        unsigned int max_attempt = 0;
        unsigned int valid_secs = 0;
 
-       ret = security_server_chk_pwd(challenge, &current_attempt, &max_attempt, &valid_secs);
+       inner_ret = security_server_chk_pwd(challenge, &current_attempt, &max_attempt, &valid_secs);
 
-       SETTING_TRACE_DEBUG("chk password : %d", ret);
+       SETTING_TRACE_DEBUG("chk password : %d", inner_ret);
+       SETTING_TRACE_DEBUG("current_attempt : %d, max_attempt : %d, valid_secs : %d secs", current_attempt, max_attempt, valid_secs);
 
-       if(ret == SECURITY_SERVER_API_SUCCESS)
-               return SETTING_RETURN_SUCCESS;
+       if(inner_ret == SECURITY_SERVER_API_SUCCESS)
+       {
+               ret = SETTING_RETURN_SUCCESS;
+       }
        else
-               return SETTING_RETURN_FAIL;
+       {
+               if(remain_attempt != NULL)
+               {
+                       if(max_attempt > 0)
+                               *remain_attempt = max_attempt - current_attempt;
+       else
+                               *remain_attempt = ATTEMPT_INFINITE;     // infinite
+                       ret = SETTING_RETURN_FAIL;
+               }
+       }
+
+       if(valid_sec != NULL)
+               *valid_sec = valid_secs;
+
+       return ret;
+}
+#ifdef SUPPORT_MDM
+static Eina_Bool __set_history_cb(void *data)
+{
+       SETTING_TRACE_BEGIN;
+       retv_if(data == NULL, EINA_FALSE);
+
+       SettingPasswordUG *ad = (SettingPasswordUG *)data;
+
+       if(ad->mdm_policy)
+               security_server_set_pwd_history(ad->mdm_policy->history_cnt);
+
+       return EINA_FALSE;
 }
+#endif
+
 int setting_password_set_password(const char *cur_pwd, const char *new_pwd, void *data)
 {
        SETTING_TRACE_BEGIN;
@@ -1195,12 +1349,60 @@ int setting_password_set_password(const char *cur_pwd, const char *new_pwd, void
        SettingPasswordUG *ad = (SettingPasswordUG*)data;
        int ret = 0;
 
-       /* max attempt count will be handled in passwordug for a while. */
-       ret = security_server_set_pwd(cur_pwd, new_pwd, 0, PW_ERR_DELAY_TIME);
-       SETTING_TRACE_DEBUG("set password : %d", ret);
+#ifdef SUPPORT_MDM
+       if((ad->view_type == SETTING_PW_TYPE_MDM_NEW_POLICY)
+               || (ad->view_type == SETTING_PW_TYPE_MDM_TO_SIMPLE))
+       {
+               if(cur_pwd)
+               {
+                       SETTING_TRACE_DEBUG("cur_pwd : %s, new_pwd : %s", cur_pwd, new_pwd);
+                       ret = security_server_set_pwd(cur_pwd, new_pwd, ad->mdm_policy->max_num_wipe, ad->mdm_policy->expire);
 
-       if(ret == SECURITY_SERVER_API_SUCCESS)
-               return SETTING_RETURN_SUCCESS;
+                       if(ret == SECURITY_SERVER_API_ERROR_PASSWORD_REUSED)
+                       {
+                               SETTING_TRACE_DEBUG("[ERROR - security_server_set_pwd()] password reused");
+                       }
+                       else
+                       {
+                               SETTING_TRACE_DEBUG("[security_server_set_pwd()] returns %d", ret);
+                       }
+               }
+               else
+               {
+                       SETTING_TRACE_DEBUG("new_pwd : %s", new_pwd);
+                       ret = mdm_reset_password((char*)new_pwd);
+                       SETTING_TRACE_DEBUG("[mdm_reset_password()] returns %d", ret);
+               }
+
+               if((ret == MDM_RESULT_SUCCESS) || (ret == SECURITY_SERVER_API_SUCCESS))
+               {
+                       ad->set_history_timer = ecore_timer_add(1, (Ecore_Task_Cb)__set_history_cb, ad);
+                       return SETTING_RETURN_SUCCESS;
+               }
+               else
+               {
+                       return ret;
+               }
+       }
        else
-               return SETTING_RETURN_FAIL;
+#endif
+       {
+               /* max attempt count will be handled in passwordug for a while. */
+               if(cur_pwd == NULL || ad->is_empty == TRUE)
+               {
+                       ret = security_server_set_pwd(NULL, new_pwd, 0, PW_ERR_DELAY_TIME);
+                       SETTING_TRACE_DEBUG("new_pwd : %s", new_pwd);
+               }
+               else
+               {
+                       ret = security_server_set_pwd(cur_pwd, new_pwd, 0, PW_ERR_DELAY_TIME);
+                       SETTING_TRACE_DEBUG("cur_pwd : %s, new_pwd : %s", cur_pwd, new_pwd);
+               }
+               SETTING_TRACE_DEBUG("set password : %d", ret);
+
+               if(ret == SECURITY_SERVER_API_SUCCESS)
+                       return SETTING_RETURN_SUCCESS;
+               else
+                       return SETTING_RETURN_FAIL;
+       }
 }