tizen 2.4 release
[framework/security/cert-svc-ui.git] / view / src / certificates / put_password_certificate.c
index 2d1171e..20ae136 100644 (file)
-/**
+/*
  * Copyright (c) 2012 Samsung Electronics Co., Ltd All Rights Reserved
  *
- *    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
+ *  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
+ *  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.
- */
-/*
- * @file        put_password_certificate.c
- * @author      Janusz Kozerski (j.kozerski@samsung.com)
- * @version     1.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.
+
+ * @file      put_password_certificate.c
+ * @author    Janusz Kozerski (j.kozerski@samsung.com)
+ *            Kyungwook Tak (k.tak@samsung.com)
+ * @version   1.0
  * @brief
  */
 
-#include <dlog.h>
+#include <efl_extension.h>
+
 #include <cert-svc/cpkcs12.h>
-#include <efl_assist.h>
 
+#include "common-utils.h"
 #include "certificates/certificate_util.h"
 #include "certificates/certificates.h"
 
-static const char * const dir_path = PATH_SDCARD;
+static const char *const dir_path = PATH_SDCARD;
 
 static Elm_Genlist_Item_Class itc_group;
 static Elm_Genlist_Item_Class itc_entry;
 static Elm_Genlist_Item_Class itc_entry_passwd;
 static struct ListElement *current_file;
 
-static void _install_button_cb(void *data, Evas_Object *obj, void *event_info);
-static void _cancel_button_cb(void *data, Evas_Object *obj, void *event_info);
-
-static Elm_Object_Item *passwd_entry, *passwd_entry_label, *name_entry, *name_entry_label;
-Evas_Object *_entry = NULL;
-Evas_Object *_entry_pass = NULL;
-
-static void _next_button_cb(void *data, Evas_Object *obj, void *event_info)
-{
-       elm_object_focus_set(_entry, EINA_TRUE);
-}
-
-static void _entry_edit_mode_show_cb(void *data, Evas *e, Evas_Object *obj, void *event_info)
-{
-       evas_object_event_callback_del(obj, EVAS_CALLBACK_SHOW, _entry_edit_mode_show_cb);
-       elm_object_focus_set(obj, EINA_TRUE);
-}
-
-static Evas_Object *_singleline_editfield_add(Evas_Object *parent)
-{
-       LOGD("_singleline_editfield_add");
-
-       _entry = ea_editfield_add(parent, EA_EDITFIELD_SCROLL_SINGLELINE);
-       evas_object_smart_callback_add(_entry, "activated", _install_button_cb, NULL);
-       return _entry;
-}
-
-static Evas_Object *_singleline_passfield_add(Evas_Object *parent)
-{
-       LOGD("_singleline_passfield_add");
-
-       _entry_pass = ea_editfield_add(parent, EA_EDITFIELD_SCROLL_SINGLELINE_PASSWORD);
-       elm_entry_input_panel_layout_set(_entry_pass, ELM_INPUT_PANEL_LAYOUT_PASSWORD);
-       elm_entry_input_panel_return_key_type_set(_entry_pass, ELM_INPUT_PANEL_RETURN_KEY_TYPE_NEXT);
-       elm_entry_prediction_allow_set(_entry_pass, EINA_FALSE);
-       elm_entry_cursor_end_set(_entry_pass);
-
-       evas_object_smart_callback_add(_entry_pass, "activated", _next_button_cb, NULL);
-       evas_object_event_callback_add(_entry_pass, EVAS_CALLBACK_SHOW, _entry_edit_mode_show_cb, NULL);
+Evas_Object *_entry;
+Evas_Object *_entry_pass;
 
-       return _entry_pass;
-}
+#ifdef TIZEN_FEAT_STORE_CAPABILITY
+#define CUSTOM_EDITFIELD_PATH "/usr/apps/cert-svc-ui/res/custom_editfield.edj"
+static int sel_sub_item_id;
+Evas_Object *btn;
+static Elm_Genlist_Item_Class itc_drop;
+static Evas_Object *ctxpopup;
+#endif
 
-static Evas_Object *_gl_content_edit_get(void *data, Evas_Object *obj, const char *part)
+static void _get_string_from_entry(Evas_Object *obj, char **out)
 {
-       if (!strcmp(part, "elm.icon.entry"))
-               return _singleline_editfield_add(obj);
-
-       return NULL;
-}
-
-static Evas_Object *_gl_content_pass_get(void *data, Evas_Object *obj, const char *part)
-{
-       if (!strcmp(part, "elm.icon.entry"))
-               return _singleline_passfield_add(obj);
-
-       return NULL;
-}
+       if (!out)
+               return;
 
-static void _gl_sel(void *data, Evas_Object *obj, void *event_info)
-{
-       if (event_info)
-               elm_genlist_item_selected_set(event_info, EINA_FALSE);
-}
+       *out = NULL;
 
-static char* _gl_get_text_group(void *data, Evas_Object *obj, const char *part)
-{
-       int index = (int)data;
+       if (!obj)
+               return;
 
-       if (strcmp(part, "elm.text.main"))
-               return NULL;
+       const char *entry_str = elm_entry_entry_get(obj);
+       if (!entry_str)
+               return;
 
-       if (0 == index) {
-               LOGD("IDS_ST_BODY_ENTER_PASSWORD_C");
-               return strdup(dgettext(PACKAGE, "IDS_ST_BODY_ENTER_PASSWORD_C"));
-       } else if (1 == index) {
-               LOGD("IDS_ST_BODY_ENTER_KEY_ALIAS_C");
-               return strdup(dgettext(PACKAGE, "IDS_ST_BODY_ENTER_KEY_ALIAS_C"));
-       } else {
-               LOGD("Wrong index - return NULL");
+       char *out_temp = strdup(entry_str);
+       if (out_temp && out_temp[0] == '\0') {
+               free(out_temp);
+               out_temp = NULL;
        }
 
-       return NULL;
-}
-
-static void _set_itc_classes(void)
-{
-       itc_group.item_style = "groupindex";
-       itc_group.func.text_get = _gl_get_text_group;
-       itc_entry.func.state_get = NULL;
-       itc_entry.func.del = NULL;
-
-       itc_entry.item_style = "entry";
-       itc_entry.func.text_get = NULL;
-       itc_entry.func.content_get = _gl_content_edit_get;
-       itc_entry.func.state_get = NULL;
-       itc_entry.func.del = NULL;
-
-       itc_entry_passwd.item_style = "entry";
-       itc_entry_passwd.func.text_get = NULL;
-       itc_entry_passwd.func.content_get = _gl_content_pass_get;
-       itc_entry_passwd.func.state_get = NULL;
-       itc_entry_passwd.func.del = NULL;
+       if (out_temp)
+               *out = out_temp;
 }
 
 static void _cancel_button_cb(void *data, Evas_Object *obj, void *event_info)
 {
-       struct ug_data *ad = get_ug_data();
+       struct ug_data *ad = (struct ug_data *)data;
 
        elm_naviframe_item_pop(ad->navi_bar);
 }
 
 static void _install_button_cb(void *data, Evas_Object *obj, void *event_info)
 {
-       LOGD("_install_button_cb");
+       int returned_value;
 
-       struct ug_data *ad = get_ug_data();
-       if(!ad){
-               LOGE("ug_data can't be null!");
-               return;
-       }
+       char *alias = NULL;
+       char *password = NULL;
+       char *path = NULL;
 
-       char *alias;
-       char *password;
-       char *path;
        CertSvcString Alias;
        CertSvcString Path;
        CertSvcString Password;
-       int returned_value;
-       int is_unique = CERTSVC_FALSE;
-       CertSvcString pkcs_alias;
-       SECURE_LOGD("alias:     %s", elm_entry_entry_get(_entry));
-
-       if (!elm_entry_entry_get(_entry_pass)) {
-               password = NULL;
-       } else {
-               password = strdup(elm_entry_entry_get(_entry_pass));
-               if (password) {
-                       if (0 == strlen(password)){
-                               free(password);
-                               password = NULL;
-                       }
-               }
-       }
 
-       alias = strdup(elm_entry_entry_get(_entry));
-       path = path_cat(current_file->path, current_file->name);
-       if (!path) {
-               LOGD("patch_cat failed; return");
-               goto exit;
-       }
+       struct ug_data *ad = (struct ug_data *)data;
+
+       _get_string_from_entry(_entry_pass, &password);
+       _get_string_from_entry(_entry, &alias);
 
-       // Empty alias
-       if (!alias || strlen(alias) < 1) {
-               LOGD("alias is empty");
+       if (!alias) {
                create_ok_pop(ad, "IDS_ST_BODY_ALIAS_CANNOT_BE_EMPTY");
-               free(path);
                goto exit;
        }
 
-       certsvc_string_new(ad->instance, alias, strlen(alias), &pkcs_alias);
-       certsvc_pkcs12_alias_exists(ad->instance, pkcs_alias, &is_unique);
-       // Alias already exists
-       if (CERTSVC_FALSE == is_unique || 1 > strlen(alias)) {
-               SECURE_LOGD("alias %s already exist", alias);
-               create_ok_pop(ad, "IDS_ST_BODY_ALIAS_ALREADY_EXISTS_ENTER_A_UNIQUE_ALIAS");
-               free(path);
+       path = path_cat(current_file->path, current_file->name);
+       if (!path) {
+               LOGE("patch_cat failed; return");
                goto exit;
        }
 
@@ -208,52 +109,67 @@ static void _install_button_cb(void *data, Evas_Object *obj, void *event_info)
        certsvc_string_new(ad->instance, alias, strlen(alias), &Alias);
        certsvc_string_new(ad->instance, path, strlen(path), &Path);
        certsvc_string_new(ad->instance, (password) ? password : "", (password) ? strlen(password) : 1, &Password);
+
+       char *dot = strrchr(path, '.');
+       if (dot && (!strncasecmp(dot, ".crt", 4) || !strncasecmp(dot, ".pem", 4)))
+               Password.privateHandler = password;
+
+#ifdef TIZEN_FEAT_STORE_CAPABILITY
+       CertStoreType storeType = VPN_STORE;
+       if (sel_sub_item_id == 0)
+               storeType = VPN_STORE;
+       else if (sel_sub_item_id == 1)
+               storeType = WIFI_STORE;
+       else
+               storeType = EMAIL_STORE;
+
+       returned_value = certsvc_pkcs12_import_from_file_to_store(ad->instance, storeType, Path, Password, Alias);
+#else
        returned_value = certsvc_pkcs12_import_from_file(ad->instance, Path, Password, Alias);
-       LOGD("certsvc_pkcs12_import_from_file -- result : %d", returned_value);
-       free(path);
+#endif
 
        switch (returned_value) {
        case CERTSVC_SUCCESS:
-               SECURE_LOGD("Certificate %s import success", current_file->name);
                if (ad->user_cert_list_item)
                        elm_naviframe_item_pop_to(ad->user_cert_list_item);
                else if (ad->type_of_screen == PKCS12_SCREEN)
-                       quit_cb(ad, NULL); //Exit from UG called directly by cert select UG.
+                       quit_cb(ad, NULL); /*Exit from UG called directly by cert select UG. */
                else
                        elm_naviframe_item_pop(ad->navi_bar);
 
-               if (ad && ad->refresh_screen_cb)
+               if (ad->refresh_screen_cb)
                        ad->refresh_screen_cb(ad, NULL, NULL);
 
                break;
 
        case CERTSVC_INVALID_PASSWORD:
-               SECURE_LOGD("Invalid password to %s", current_file->name);
+               LOGE("Invalid password to %s", current_file->name);
+               create_ok_pop(ad, "IDS_ST_BODY_INCORRECT_PASSWORD");
                break;
 
        case CERTSVC_IO_ERROR:
-               LOGD("There's no such file!");
+               LOGE("There's no such file!");
                elm_naviframe_item_pop(ad->navi_bar);
                break;
 
        case CERTSVC_WRONG_ARGUMENT:
-               LOGD("Wrong PKCS12 or PFX file.");
+               LOGE("Wrong PKCS12 or PFX file.");
                elm_naviframe_item_pop(ad->navi_bar);
                break;
 
        case CERTSVC_DUPLICATED_ALIAS:
-               // This case should not happened - alias was already checked
-               LOGD("Failed. Such alias already exist. This should not happen");
+               LOGD("Alias is duplicated. Try different alias.");
+               create_ok_pop(ad, "IDS_ST_BODY_ALIAS_ALREADY_EXISTS_ENTER_A_UNIQUE_ALIAS");
                break;
 
        case CERTSVC_FAIL:
-               LOGD("Failed. Wrong password probably.");
+               LOGE("Failed. Wrong password probably.");
                create_ok_pop(ad, "IDS_ST_POP_FAILED_TO_INSTALL_THE_CERTIFICATE_THE_CERTIFICATE_IS_INVALID_HAS_EXPIRED_OR_YOU_HAVE_ENTERED_AN_INCORRECT_PASSWORD");
-               // Do NOT delete list in this case!!!
+               /* Do NOT delete list in this case!!! */
                goto exit;
 
        default:
-               LOGD("DEFAULT");
+               LOGE("Unknown error code from cert-svc");
                break;
        }
 
@@ -262,145 +178,447 @@ static void _install_button_cb(void *data, Evas_Object *obj, void *event_info)
 exit:
        free(password);
        free(alias);
+       free(path);
        return;
 }
 
-static Evas_Object *_create_title_text_btn(Evas_Object *parent, const char *text, Evas_Smart_Cb func, void *data)
+
+/* for editfield from here */
+static void editfield_focused_cb(void *data, Evas_Object *obj, void *event_info)
 {
-       Evas_Object *btn = elm_button_add(parent);
-       if (!btn)
+       Evas_Object *editfield = (Evas_Object *)data;
+       elm_object_signal_emit(editfield, "elm,state,focused", "");
+
+       if (!elm_entry_is_empty(obj))
+               elm_object_signal_emit(editfield, "elm,action,show,button", "");
+}
+
+static void editfield_unfocused_cb(void *data, Evas_Object *obj, void *event_info)
+{
+       Evas_Object *editfield = (Evas_Object *)data;
+       elm_object_signal_emit(editfield, "elm,state,unfocused", "");
+       elm_object_signal_emit(editfield, "elm,action,hide,button", "");
+}
+
+static void editfield_changed_cb(void *data, Evas_Object *obj, void *event_info)
+{
+       Evas_Object *editfield = (Evas_Object *)data;
+
+       if (!elm_entry_is_empty(obj) && elm_object_focus_get(obj))
+               elm_object_signal_emit(editfield, "elm,action,show,button", "");
+       else
+               elm_object_signal_emit(editfield, "elm,action,hide,button", "");
+}
+
+static void editfield_clear_button_clicked_cb(void *data, Evas_Object *obj, void *event_info)
+{
+       Evas_Object *entry = (Evas_Object *)data;
+
+       elm_entry_entry_set(entry, "");
+}
+
+static Evas_Object *create_singleline_editfield_layout(Evas_Object *parent)
+{
+       Evas_Object *editfield;
+       Evas_Object *button;
+
+       editfield = elm_layout_add(parent);
+       elm_layout_theme_set(editfield, "layout", "editfield", "singleline");
+       evas_object_size_hint_align_set(editfield, EVAS_HINT_FILL, 0.0);
+       evas_object_size_hint_weight_set(editfield, EVAS_HINT_EXPAND, 0.0);
+
+       _entry = elm_entry_add(editfield);
+       elm_entry_single_line_set(_entry, EINA_TRUE);
+       elm_entry_scrollable_set(_entry, EINA_TRUE);
+       elm_object_part_text_set(_entry, "elm.guide", "Alias");
+       evas_object_smart_callback_add(_entry, "focused", editfield_focused_cb, editfield);
+       evas_object_smart_callback_add(_entry, "unfocused", editfield_unfocused_cb, editfield);
+       evas_object_smart_callback_add(_entry, "changed", editfield_changed_cb, editfield);
+       evas_object_smart_callback_add(_entry, "preedit,changed", editfield_changed_cb, editfield);
+       elm_object_part_content_set(editfield, "elm.swallow.content", _entry);
+
+       button = elm_button_add(editfield);
+       elm_object_style_set(button, "editfield_clear");
+       evas_object_smart_callback_add(button, "clicked", editfield_clear_button_clicked_cb, _entry);
+       elm_object_part_content_set(editfield, "elm.swallow.button", button);
+
+       return editfield;
+}
+
+static Evas_Object *create_password_editfield_layout(Evas_Object *parent)
+{
+       Evas_Object *editfield;
+       Evas_Object *button;
+
+       editfield = elm_layout_add(parent);
+       elm_layout_theme_set(editfield, "layout", "editfield", "singleline");
+       evas_object_size_hint_align_set(editfield, EVAS_HINT_FILL, 0.0);
+       evas_object_size_hint_weight_set(editfield, EVAS_HINT_EXPAND, 0.0);
+
+       _entry_pass = elm_entry_add(editfield);
+       elm_entry_single_line_set(_entry_pass, EINA_TRUE);
+       elm_entry_scrollable_set(_entry_pass, EINA_TRUE);
+       elm_entry_password_set(_entry_pass, EINA_TRUE);
+       elm_object_part_text_set(_entry_pass, "elm.guide", "Password");
+       evas_object_smart_callback_add(_entry_pass, "focused", editfield_focused_cb, editfield);
+       evas_object_smart_callback_add(_entry_pass, "unfocused", editfield_unfocused_cb, editfield);
+       evas_object_smart_callback_add(_entry_pass, "changed", editfield_changed_cb, editfield);
+       evas_object_smart_callback_add(_entry_pass, "preedit,changed", editfield_changed_cb, editfield);
+       elm_object_part_content_set(editfield, "elm.swallow.content", _entry_pass);
+
+       button = elm_button_add(editfield);
+       elm_object_style_set(button, "editfield_clear");
+       evas_object_smart_callback_add(button, "clicked", editfield_clear_button_clicked_cb, _entry_pass);
+       elm_object_part_content_set(editfield, "elm.swallow.button", button);
+
+       return editfield;
+}
+/* for editfield done */
+
+
+static Evas_Object *_gl_content_edit_get(void *data, Evas_Object *obj, const char *part)
+{
+       if (!strcmp(part, "elm.icon.entry"))
+               return create_singleline_editfield_layout(obj);
+
+       return NULL;
+}
+
+static Evas_Object *_gl_content_pass_get(void *data, Evas_Object *obj, const char *part)
+{
+       if (!strcmp(part, "elm.icon.entry"))
+               return create_password_editfield_layout(obj);
+
+       return NULL;
+}
+
+static void _gl_sel(void *data, Evas_Object *obj, void *event_info)
+{
+       LOGD("_gl_sel called");
+
+       struct ug_data *ad = (struct ug_data *)data;
+       if (ad == NULL)
+               return;
+
+       if (event_info)
+               elm_genlist_item_selected_set(event_info, EINA_FALSE);
+
+       if (ad->popup) {
+               evas_object_del(ad->popup);
+               ad->popup = NULL;
+       }
+
+       LOGD("_gl_sel done");
+}
+
+static char *_gl_get_text_group(void *data, Evas_Object *obj, const char *part)
+{
+       LOGD("_gl_get_text_group called");
+
+       char *str = NULL;
+
+       if (strcmp(part, "elm.text.main")) {
+               LOGD("_gl_get_text_group done. not text.main.");
                return NULL;
-       elm_object_style_set(btn, "naviframe/title_text");
-       elm_object_domain_translatable_text_set(btn, PACKAGE, text);
+       }
 
-       evas_object_smart_callback_add(btn, "clicked", func, data);
-       return btn;
+       switch ((int)data) {
+       case 0:
+               LOGD("IDS_ST_BODY_ENTER_PASSWORD_C");
+               str = strdup(dgettext(PACKAGE, "IDS_ST_BODY_ENTER_PASSWORD_C"));
+               break;
+       case 1:
+               LOGD("IDS_ST_BODY_ENTER_KEY_ALIAS_C");
+               str = strdup(dgettext(PACKAGE, "IDS_ST_BODY_ENTER_KEY_ALIAS_C"));
+               break;
+       case 2:
+               LOGD("IDS_ST_HEADER_USED_FOR");
+               str = strdup(dgettext(PACKAGE, "IDS_ST_HEADER_USED_FOR"));
+               break;
+       default:
+               LOGE("Wrong index - return NULL");
+               str = NULL;
+               break;
+       }
+
+       LOGD("_gl_get_text_group done");
+
+       return str;
+}
+
+#ifdef TIZEN_FEAT_STORE_CAPABILITY
+static void move_dropdown(Evas_Object *ctxpopup, Evas_Object *btn)
+{
+       Evas_Coord x, y, w, h;
+       evas_object_geometry_get(btn, &x, &y, &w, &h);
+       evas_object_move(ctxpopup, x + (w / 2), y + h);
 }
 
-static void _gl_lang_changed(void *data, Evas_Object *obj, void *event_info)
+static void ctxpopup_dismissed_cb(void *data, Evas_Object *obj, void *event_info)
 {
-   //Update genlist items. The Item texts will be translated in the gl_text_get().
-   elm_genlist_realized_items_update(obj);
+       evas_object_del(ctxpopup);
+       ctxpopup = NULL;
 }
 
-void put_pkcs12_name_and_pass_cb(void *data, Evas_Object *obj, void *event_info)
+static void ctxpopup_item_select_cb(void *data, Evas_Object *obj, void *event_info)
+{
+       char buf[100];
+       sel_sub_item_id = (int)data;
+
+       if (sel_sub_item_id == 0)
+               snprintf(buf, sizeof(buf), "<align=left>%s</align>", "VPN");
+       else if (sel_sub_item_id == 1)
+               snprintf(buf, sizeof(buf), "<align=left>%s</align>", "WIFI");
+       else
+               snprintf(buf, sizeof(buf), "<align=left>%s</align>", "EMAIL");
+
+       elm_object_text_set(btn, buf);
+       ctxpopup_dismissed_cb(obj, NULL, NULL);
+}
+
+static void btn_dropdown_label_style_cb(void *data, Evas_Object *obj, void *event_info)
 {
-       LOGD("put_pkcs12_name_and_pass_cb");
        struct ug_data *ad = get_ug_data();
-       Evas_Object *btn = NULL;
 
-       current_file = (struct ListElement *) data;
+       if (ad->popup) {
+               evas_object_del(ad->popup);
+               ad->popup = NULL;
+       }
+
+       if (ctxpopup) {
+               evas_object_del(ctxpopup);
+               ctxpopup = NULL;
+       }
+
+       ctxpopup = elm_ctxpopup_add(elm_object_top_widget_get(obj));
+       elm_object_style_set(ctxpopup, "dropdown/list");
+       eext_object_event_callback_add(ctxpopup, EEXT_CALLBACK_BACK, eext_ctxpopup_back_cb, NULL);
+       evas_object_smart_callback_add(ctxpopup, "dismissed", ctxpopup_dismissed_cb, NULL);
+
+       elm_ctxpopup_item_append(ctxpopup, "VPN", NULL, ctxpopup_item_select_cb, (void *)0);
+       elm_ctxpopup_item_append(ctxpopup, "WIFI", NULL, ctxpopup_item_select_cb, (void *)1);
+       elm_ctxpopup_item_append(ctxpopup, "EMAIL", NULL, ctxpopup_item_select_cb, (void *)2);
+
+       elm_ctxpopup_direction_priority_set(ctxpopup, ELM_CTXPOPUP_DIRECTION_DOWN, ELM_CTXPOPUP_DIRECTION_UNKNOWN, ELM_CTXPOPUP_DIRECTION_UNKNOWN, ELM_CTXPOPUP_DIRECTION_UNKNOWN);
+
+       move_dropdown(ctxpopup, obj);
+       evas_object_show(ctxpopup);
+}
+
+static Evas_Object *_gl_drop_type_content_get(void *data, Evas_Object *obj, const char *part)
+{
+       LOGD("_gl_drop_type_content_get called");
+       char buf[100];
+       sel_sub_item_id = 0;
+
+       if (strcmp(part, "elm.icon.entry")) {
+               LOGD("_gl_drop_type_content_get done. not entry icon.");
+               return NULL;
+       }
+
+       Evas_Object *ly = elm_layout_add(obj);
+       elm_layout_file_set(ly, CUSTOM_EDITFIELD_PATH, "eap_dropdown_button");
+       btn = elm_button_add(ly);
+
+       snprintf(buf, sizeof(buf), "<align=left>%s</align>", "VPN");
+
+       elm_object_text_set(btn, buf);
+       elm_object_style_set(btn, "dropdown/list");
+       evas_object_propagate_events_set(btn, EINA_FALSE);
+       evas_object_size_hint_weight_set(btn, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+       evas_object_size_hint_align_set(btn, EVAS_HINT_FILL, EVAS_HINT_FILL);
+       evas_object_smart_callback_add(btn, "clicked", btn_dropdown_label_style_cb, NULL);
+       elm_layout_content_set(ly, "btn", btn);
+       evas_object_show(btn);
+
+       LOGD("_gl_drop_type_content_get done");
+       return ly;
+}
+#endif
+
+
+static void _set_itc_classes(void)
+{
+       itc_group.item_style = "groupindex";
+       itc_group.func.text_get = _gl_get_text_group;
+       itc_entry.func.state_get = NULL;
+       itc_entry.func.del = NULL;
+
+       itc_entry.item_style = "entry";
+       itc_entry.func.text_get = NULL;
+       itc_entry.func.content_get = _gl_content_edit_get;
+       itc_entry.func.state_get = NULL;
+       itc_entry.func.del = NULL;
+
+       itc_entry_passwd.item_style = "entry";
+       itc_entry_passwd.func.text_get = NULL;
+       itc_entry_passwd.func.content_get = _gl_content_pass_get;
+       itc_entry_passwd.func.state_get = NULL;
+       itc_entry_passwd.func.del = NULL;
+
+#ifdef TIZEN_FEAT_STORE_CAPABILITY
+       itc_drop.item_style = "entry";
+       itc_drop.func.text_get = NULL;
+       itc_drop.func.content_get = _gl_drop_type_content_get;
+       itc_drop.func.state_get = NULL;
+       itc_drop.func.del = NULL;
+#endif
+}
+
+void put_pkcs12_name_and_pass(struct ListElement *file, struct ug_data *ad)
+{
+       current_file = file;
+
+       Evas_Object *genlist = common_genlist(ad->navi_bar);
 
        _set_itc_classes();
-       Evas_Object *genlist = elm_genlist_add(ad->navi_bar);
-       elm_genlist_realization_mode_set(genlist, EINA_TRUE);
-       elm_genlist_homogeneous_set(genlist, EINA_TRUE);
 
-       passwd_entry_label = elm_genlist_item_append(
+       LOGD("Ready to append items to genlist");
+
+       Elm_Object_Item *passwd_entry_label = elm_genlist_item_append(
                        genlist,
                        &itc_group,
-                       (void *) 0,
+                       (void *)0,
                        NULL,
                        ELM_GENLIST_ITEM_NONE,
                        _gl_sel,
-                       NULL);
+                       ad);
        elm_genlist_item_select_mode_set(passwd_entry_label, ELM_OBJECT_SELECT_MODE_DISPLAY_ONLY);
 
-       passwd_entry = elm_genlist_item_append(
+       elm_genlist_item_append(
                        genlist,
                        &itc_entry_passwd,
                        NULL,
                        NULL,
                        ELM_GENLIST_ITEM_NONE,
                        _gl_sel,
-                       NULL);
+                       ad);
 
-       name_entry_label = elm_genlist_item_append(
+       Elm_Object_Item *name_entry_label = elm_genlist_item_append(
                        genlist,
                        &itc_group,
                        (void *)1,
                        NULL,
                        ELM_GENLIST_ITEM_NONE,
                        _gl_sel,
-                       NULL);
+                       ad);
        elm_genlist_item_select_mode_set(name_entry_label, ELM_OBJECT_SELECT_MODE_DISPLAY_ONLY);
 
-       name_entry = elm_genlist_item_append(
+       elm_genlist_item_append(
                        genlist,
                        &itc_entry,
+                       (void *)0,
                        NULL,
+                       ELM_GENLIST_ITEM_NONE,
+                       _gl_sel,
+                       ad);
+
+#ifdef TIZEN_FEAT_STORE_CAPABILITY
+       Elm_Object_Item *ctxpopup_entry_label = elm_genlist_item_append(
+                       genlist,
+                       &itc_group,
+                       (void *)2,
                        NULL,
                        ELM_GENLIST_ITEM_NONE,
                        _gl_sel,
-                       NULL);
+                       ad);
+       elm_genlist_item_select_mode_set(ctxpopup_entry_label, ELM_OBJECT_SELECT_MODE_DISPLAY_ONLY);
 
-       evas_object_smart_callback_add(genlist, "language,changed", _gl_lang_changed, NULL);
+       elm_genlist_item_append(
+                       genlist,
+                       &itc_drop,
+                       ad,
+                       NULL,
+                       ELM_GENLIST_ITEM_NONE,
+                       _gl_sel,
+                       ad);
+#endif
 
-       Elm_Object_Item *nf_it = elm_naviframe_item_push(ad->navi_bar, "Install certificate", NULL, NULL, genlist, NULL);
+       Elm_Object_Item *nf_it = elm_naviframe_item_push(
+                       ad->navi_bar,
+                       "IDS_ST_HEADER_INSTALL_CERTIFICATE_ABB2",
+                       NULL,
+                       NULL,
+                       genlist,
+                       NULL);
 
-       if (!nf_it)
-               LOGE("Error in elm_naviframe_item_push");
+       elm_object_item_domain_text_translatable_set(nf_it, PACKAGE, EINA_TRUE);
 
-       /* Title Cancel Button */
-       btn = elm_button_add(ad->navi_bar);
-       elm_object_style_set(btn, "naviframe/title_done");
-       evas_object_smart_callback_add(btn, "clicked", _install_button_cb, ad->navi_bar);
-       elm_object_item_part_content_set(nf_it, "title_right_btn", btn);
+       if (!nf_it) {
+               LOGE("Error in elm_naviframe_item_push");
+               return;
+       }
 
-       /* Title Done Button */
-       btn = elm_button_add(ad->navi_bar);
-       elm_object_style_set(btn, "naviframe/title_cancel");
-       evas_object_smart_callback_add(btn, "clicked", _cancel_button_cb, ad->navi_bar);
-       elm_object_item_part_content_set(nf_it, "title_left_btn", btn);
+       add_common_done_btn(ad, _install_button_cb);
+       add_common_cancel_btn(ad, _cancel_button_cb);
 
+       LOGD("append items to genlist done");
 }
 
 void put_pkcs12_name_cb(void *data, Evas_Object *obj, void *event_info)
 {
-       LOGD("put_pkcs12_name_cb");
-
        struct ug_data *ad = get_ug_data();
-       Evas_Object *btn = NULL;
-
+       ad->popup = NULL;
        current_file = (struct ListElement *) data;
 
+       Evas_Object *genlist = common_genlist(ad->navi_bar);
+
        _set_itc_classes();
-       Evas_Object *genlist = elm_genlist_add(ad->navi_bar);
-       elm_genlist_realization_mode_set(genlist, EINA_TRUE);
-       elm_genlist_homogeneous_set(genlist, EINA_TRUE);
 
-       name_entry_label = elm_genlist_item_append(
+       LOGD("Ready to append items to genlist");
+
+       Elm_Object_Item *name_entry_label = elm_genlist_item_append(
+                               genlist,
+                               &itc_group,
+                               (void *) 1,
+                               NULL,
+                               ELM_GENLIST_ITEM_NONE,
+                               _gl_sel,
+                               ad);
+       elm_genlist_item_select_mode_set(name_entry_label, ELM_OBJECT_SELECT_MODE_DISPLAY_ONLY);
+
+       elm_genlist_item_append(
+                               genlist,
+                               &itc_entry,
+                               (void *) 1,
+                               NULL,
+                               ELM_GENLIST_ITEM_NONE,
+                               _gl_sel,
+                               ad);
+#ifdef TIZEN_FEAT_STORE_CAPABILITY
+       Elm_Object_Item *ctxpopup_entry_label = elm_genlist_item_append(
                        genlist,
                        &itc_group,
-                       (void *)1,
+                       (void *) 2,
                        NULL,
                        ELM_GENLIST_ITEM_NONE,
                        _gl_sel,
-                       NULL);
-       elm_genlist_item_select_mode_set(name_entry_label, ELM_OBJECT_SELECT_MODE_DISPLAY_ONLY);
+                       ad);
+       elm_genlist_item_select_mode_set(ctxpopup_entry_label, ELM_OBJECT_SELECT_MODE_DISPLAY_ONLY);
 
-       name_entry = elm_genlist_item_append(
+       elm_genlist_item_append(
                        genlist,
-                       &itc_entry,
-                       NULL,
+                       &itc_drop,
+                       ad,
                        NULL,
                        ELM_GENLIST_ITEM_NONE,
                        _gl_sel,
-                       NULL);
+                       ad);
+#endif
 
-       evas_object_smart_callback_add(genlist, "language,changed", _gl_lang_changed, NULL);
+       Elm_Object_Item *nf_it = elm_naviframe_item_push(
+                       ad->navi_bar,
+                       "IDS_ST_HEADER_INSTALL_CERTIFICATE_ABB2",
+                       NULL,
+                       NULL,
+                       genlist,
+                       NULL);
 
-       Elm_Object_Item *navi_it = elm_naviframe_item_push(ad->navi_bar, "IDS_ST_HEADER_INSTALL_CERTIFICATE_ABB", NULL, NULL, genlist, NULL);
-       if (!navi_it)
+       if (!nf_it)
                LOGE("Error in elm_naviframe_item_push");
 
-       elm_object_item_domain_text_translatable_set(navi_it, PACKAGE, EINA_TRUE);
-
-       //Title Text Left Button
-       btn = _create_title_text_btn(ad->navi_bar, "IDS_ST_BUTTON_INSTALL", _install_button_cb, NULL);
-       elm_object_item_part_content_set(navi_it, "title_right_btn", btn);
+       elm_object_item_domain_text_translatable_set(nf_it, PACKAGE, EINA_TRUE);
 
-       //Title Text Right Button
-       btn = _create_title_text_btn(ad->navi_bar, "IDS_ST_BUTTON_CANCEL", _cancel_button_cb, NULL);
-       elm_object_item_part_content_set(navi_it, "title_left_btn", btn);
+       add_common_done_btn(ad, _install_button_cb);
+       add_common_cancel_btn(ad, _cancel_button_cb);
 }