Remove clipboard feature
[platform/core/uifw/ise-default.git] / src / ise.cpp
index 1aa4bb9..e8eb514 100644 (file)
@@ -31,9 +31,7 @@
 #include <app_control.h>
 #include <app_preference.h>
 #include <ode/internal-encryption.h>
-#ifdef HAVE_CBHM
-#include <cbhm.h>
-#endif
+#include <notification.h>
 #include "autofill.h"
 #include "ise.h"
 #include "utils.h"
 #include "w-input-smartreply.h"
 #include "ise-floating-mode.h"
 #include "ise-dbus.h"
-
-#define EDJ_FILE                        RESDIR"/edje/mobile/customised_ctxpopup.edj"
+#include "ise-sticker-mode.h"
+#include "ise-nmt-mode.h"
+#include "nmt.h"
+#include "guidepopup.h"
 
 #define EXIT_ISE_ON_HIDE 0
 #define DEFER_ISE_CREATION 0
@@ -64,12 +64,6 @@ using namespace std;
 static CSCLUI *g_ui = NULL;
 CSCLUI* get_ui() { return g_ui; }
 
-#ifdef HAVE_CBHM
-static cbhm_h cbhm_handle;
-static sclu32 cbhm_sel_type = 0;
-static sclboolean g_set_mime_type = FALSE;
-#endif
-
 static int g_imdata_state = 0;
 
 static sclboolean g_need_send_shift_event = FALSE;
@@ -85,25 +79,18 @@ static const int MAX_DEFAULT_PUNCTUATION = 6;
 static string g_default_punctuation[MAX_DEFAULT_PUNCTUATION] = {"-", "@", "'", "!", "?", ","};
 static string g_current_punctuation[MAX_DEFAULT_PUNCTUATION-1] = {"RCENT1", "RCENT2", "RCENT3", "RCENT4", "RCENT5"};
 static vector<string> g_softcandidate_string;
-static bool g_softcandidate_show = false;
 static bool g_input_panel_show = false;
 static bool g_caps_mode_pending = false;
 static bool g_floating_mode = false;
 static bool g_candidate_more_view = false;
 static bool g_ise_created = false;
 
-static bool g_autofill_exist = false;
-static int g_autofill_hint = 0;
-static string g_autofill_string;
 static vector<string> g_lookup_table_strings;
 static vector<string> g_smartreply_strings;
 #if EXIT_ISE_ON_HIDE
 static Ecore_Timer *exit_timer = NULL;
 #endif
 
-static string g_app_id;
-static string g_resource_id;
-
 #define SOFT_CANDIDATE_DELETE_TIME (100.0/1000)
 static Ecore_Timer *g_softcandidate_hide_timer = NULL;
 
@@ -120,6 +107,7 @@ static KEYBOARD_STATE g_keyboard_state = {
     FALSE,
     "",
     KEY_MODIFIER_NONE,
+    FALSE,
     FALSE
 };
 
@@ -161,13 +149,10 @@ class CandidateEventListener: public EventListener
 
             switch (multidesc.type) {
                 case MultiEventDesc::CANDIDATE_ITEM_MOUSE_DOWN:
-                    if (g_autofill_exist) {
+                    if (ime_autofill_get_exist()) {
                         if (multidesc.index == 0) {
-                            char *text = autofill_get_string(g_app_id.c_str(), g_resource_id.c_str(), (Ecore_IMF_Input_Hints)g_autofill_hint);
-                            if (text) {
-                                ise_send_string(text);
-                                free(text);
-                            }
+                            string autofill_string = ime_autofill_get_string();
+                            ise_send_string(autofill_string.c_str());
                         } else if (multidesc.index < (int)smartreply_size + 1) {
                             ise_send_string(g_softcandidate_string[multidesc.index].c_str());
                             ise_update_table(g_smartreply_strings);
@@ -222,21 +207,21 @@ static CandidateEventListener g_candidate_event_listener;
 #define MVK_space 0x020
 #define MVK_Done 0xff0d
 
-#define CM_KEY_LIST_SIZE         5
+#define CM_KEY_LIST_SIZE         7
 #define MULTITAP_TIMEOUT         3.0
 #define USER_KEYSTRING_OPTION    "OPTION"
 #define USER_KEYSTRING_EMOTICON  "EMOTICON_LAYOUT"
-#define USER_KEYSTRING_CLIPBOARD "CLIPBOARD"
 #define USER_KEYSTRING_VOICE     "STT_3X4"
 #define USER_KEYSTRING_FLOATING  "FLOATING"
+#define USER_KEYSTRING_STICKER   "STICKER_LAYOUT"
+#define USER_KEYSTRING_TRANSLATION "TRANSLATION_LAYOUT"
 
 #define USER_VOICE_LANGUAGE     "LANGUAGE"
 
 static sclboolean           _cm_popup_opened = FALSE;
-static const char          *_cm_key_list[CM_KEY_LIST_SIZE] = {USER_KEYSTRING_OPTION, USER_KEYSTRING_EMOTICON, USER_KEYSTRING_CLIPBOARD, USER_KEYSTRING_VOICE, USER_KEYSTRING_FLOATING};
+static const char          *_cm_key_list[CM_KEY_LIST_SIZE] = {USER_KEYSTRING_OPTION, USER_KEYSTRING_EMOTICON,
+                                                              USER_KEYSTRING_VOICE, USER_KEYSTRING_FLOATING, USER_KEYSTRING_STICKER, USER_KEYSTRING_TRANSLATION};
 static scluint              _current_cm_key_id = 0;
-static Evas_Object* _guide_popup_setting = NULL;
-static Evas_Object* _guide_popup_space = NULL;
 
 /*
  * This callback class will receive all response events from SCL
@@ -255,6 +240,13 @@ public :
     SCLEventReturnType on_event_key_clicked(SclUIEventDesc event_desc);
     SCLEventReturnType on_event_drag_state_changed(SclUIEventDesc event_desc);
     SCLEventReturnType on_event_notification(SCLUINotiType noti_type, SclNotiDesc *etc_info);
+
+private:
+    void on_event_string_key(CSCLUI *ui, SclUIEventDesc event_desc);
+    void on_event_control_key(CSCLUI *ui, SclUIEventDesc event_desc, KEYBOARD_STATE *keyboard_state);
+    void on_event_character_key(CSCLUI *ui, SclUIEventDesc event_desc, KEYBOARD_STATE *keyboard_state);
+    void on_event_modechange_key(CSCLUI *ui, SclUIEventDesc event_desc, KEYBOARD_STATE *keyboard_state, SCLEventReturnType &ret);
+    void process_user_key(CSCLUI *ui, SclUIEventDesc event_desc, KEYBOARD_STATE *keyboard_state, SCLEventReturnType &ret);
 };
 
 static CUIEventCallback callback;
@@ -279,8 +271,8 @@ static void update_candidate_table()
     g_ic_smartreply = -1;
 
     // add autofill string
-    if (g_autofill_exist)
-        g_softcandidate_string.push_back(g_autofill_string);
+    if (ime_autofill_get_exist())
+        g_softcandidate_string.push_back(ime_autofill_get_string());
 
     // add lookup table string(s)
     iter = g_lookup_table_strings.begin();
@@ -413,12 +405,6 @@ static void ise_set_cm_private_key(scluint cm_key_id)
             const_cast<sclchar*>("icon/54x54/icon_setting_press.png"),
             const_cast<sclchar*>("icon/54x54/icon_setting_dim.png")};
         ui->set_private_key("CM_KEY", const_cast<sclchar*>(" "), imagelabel, NULL, 0, const_cast<sclchar*>(USER_KEYSTRING_OPTION), TRUE);
-    } else if (strcmp(_cm_key_list[cm_key_id], USER_KEYSTRING_CLIPBOARD) == 0) {
-        sclchar* imagelabel[SCL_BUTTON_STATE_MAX] = {
-            const_cast<sclchar*>("icon/54x54/icon_clipboard_nor.png"),
-            const_cast<sclchar*>("icon/54x54/icon_clipboard_press.png"),
-            const_cast<sclchar*>("icon/54x54/icon_clipboard_dim.png")};
-        ui->set_private_key("CM_KEY", const_cast<sclchar*>(" "), imagelabel, NULL, 0, const_cast<sclchar*>(USER_KEYSTRING_CLIPBOARD), TRUE);
     } else if (strcmp(_cm_key_list[cm_key_id], USER_KEYSTRING_VOICE) == 0) {
         sclchar* imagelabel[SCL_BUTTON_STATE_MAX] = {
             const_cast<sclchar*>("icon/54x54/icon_mic_nor.png"),
@@ -431,6 +417,18 @@ static void ise_set_cm_private_key(scluint cm_key_id)
             const_cast<sclchar*>("icon/54x54/icon_floating_keypad_press.png"),
             const_cast<sclchar*>("icon/54x54/icon_floating_keypad_dim.png")};
         ui->set_private_key("CM_KEY", const_cast<sclchar*>(" "), imagelabel, NULL, 0, const_cast<sclchar*>(USER_KEYSTRING_FLOATING), TRUE);
+    } else if (strcmp(_cm_key_list[cm_key_id], USER_KEYSTRING_TRANSLATION) == 0) {
+        sclchar* imagelabel[SCL_BUTTON_STATE_MAX] = {
+            const_cast<sclchar*>("icon/54x54/icon_translation_nor.png"),
+            const_cast<sclchar*>("icon/54x54/icon_translation_press.png"),
+            const_cast<sclchar*>("icon/54x54/icon_translation_dim.png")};
+        ui->set_private_key("CM_KEY", const_cast<sclchar*>(" "), imagelabel, NULL, 0, const_cast<sclchar*>(USER_KEYSTRING_TRANSLATION), TRUE);
+    } else if (strcmp(_cm_key_list[cm_key_id], USER_KEYSTRING_STICKER) == 0) {
+        sclchar* imagelabel[SCL_BUTTON_STATE_MAX] = {
+            const_cast<sclchar*>("icon/54x54/icon_sticker_nor.png"),
+            const_cast<sclchar*>("icon/54x54/icon_sticker_press.png"),
+            const_cast<sclchar*>("icon/54x54/icon_sticker_dim.png")};
+        ui->set_private_key("CM_KEY", const_cast<sclchar*>(" "), imagelabel, NULL, 0, const_cast<sclchar*>(USER_KEYSTRING_STICKER), TRUE);
     }
 }
 
@@ -506,7 +504,6 @@ static Eina_Bool softcandidate_hide_timer_callback(void *data)
     Candidate *candidate = get_candidate();
     if (candidate) {
         candidate->hide();
-        g_softcandidate_show = false;
     }
     return ECORE_CALLBACK_CANCEL;
 }
@@ -692,9 +689,18 @@ on_input_mode_changed(const sclchar *key_value, sclulong key_event, sclint key_t
                 }
             }
         }
+
+        if (ise_sticker_is_show())
+            ise_sticker_destroy_layout();
+
         if (ise_emoticon_is_show()) {
             ise_emoticon_destroy_layout();
         }
+
+        if (ise_nmt_is_show()) {
+            ise_nmt_destroy_layout();
+        }
+
         if (key_value) {
             if (!strcmp(key_value, USER_KEYSTRING_EMOTICON)) {
                 ise_emoticon_init_list();
@@ -709,33 +715,17 @@ on_input_mode_changed(const sclchar *key_value, sclulong key_event, sclint key_t
                 SCLRotation rotation = ui->get_rotation();
                 ise_emoticon_show_layout(ise_emoticon_get_current_group(), ROTATION_TO_DEGREE(rotation), false, ime_get_main_window());
             }
+            else if (!strcmp(key_value, USER_KEYSTRING_TRANSLATION)) {
+                LOGD("");
+                SCLRotation rotation = ui->get_rotation();
+                ise_nmt_show_layout(ROTATION_TO_DEGREE(rotation), false, ime_get_main_window());
+            }
         }
     }
 
     return ret;
 }
 
-static void show_cbhm()
-{
-#ifdef HAVE_CBHM
-    int ret;
-
-    if (g_set_mime_type)
-        ret = cbhm_selection_type_set(cbhm_handle, static_cast<cbhm_sel_type_e>(cbhm_sel_type));
-    else
-        ret = cbhm_selection_type_set(cbhm_handle, CBHM_SEL_TYPE_TEXT);
-
-    if (ret != CBHM_ERROR_NONE)
-        LOGW("Failed to set selection type in cbhm. error : %d\n", ret);
-
-    ret = cbhm_show(cbhm_handle);
-    if (ret != CBHM_ERROR_NONE)
-        LOGW("cbhm show error : %d\n", ret);
-    else
-        LOGD("Show cbhm\n");
-#endif
-}
-
 SCLEventReturnType CUIEventCallback::on_event_notification(SCLUINotiType noti_type, SclNotiDesc *etc_info)
 {
     CSCLUI *ui = get_ui();
@@ -784,6 +774,14 @@ SCLEventReturnType CUIEventCallback::on_event_notification(SCLUINotiType noti_ty
         }
         SclNotiPopupOpeningDesc *openingDesc = (SclNotiPopupOpeningDesc *)etc_info;
         if (ui && 0 == strcmp(openingDesc->input_mode, "CM_POPUP")) {
+            if (!ise_sticker_check_sticker_exists())
+                ui->enable_button("STICKER_KEY", EINA_FALSE);
+
+            if (nmt_is_disabled())
+                ui->enable_button("TRANSLATION_KEY", false);
+            else
+                ui->enable_button("TRANSLATION_KEY", true);
+
             if (ise_is_emoticons_disabled())
                 ui->enable_button("EMOTICON_KEY", false);
             else
@@ -829,185 +827,27 @@ SCLEventReturnType CUIEventCallback::on_event_notification(SCLUINotiType noti_ty
     return ret;
 }
 
-void ise_destory_popup_setting()
-{
-    if (_guide_popup_setting != NULL) {
-        LOGD("destroy setting popup iter\n");
-        evas_object_del(_guide_popup_setting);
-        _guide_popup_setting = NULL;
-        CONFIG_VALUES *config_values = get_config_values();
-        if (config_values) {
-            config_values->first_guideset = TRUE;
-        }
-        write_ise_config_values();
-    }
-}
-
-void ise_destory_popup_space()
-{
-    if (_guide_popup_space != NULL) {
-        LOGD("destroy space popup iter\n");
-        evas_object_del(_guide_popup_space);
-        _guide_popup_setting = NULL;
-        CONFIG_VALUES *config_values = get_config_values();
-        if (config_values) {
-            config_values->first_guidechange = TRUE;
-        }
-        write_ise_config_values();
-    }
-}
-
-Evas_Object *open_message_popup(Evas_Object *parentWnd)
-{
-    static Evas_Object *msg_window = NULL;
-    if (msg_window) {
-        evas_object_del(msg_window);
-        msg_window = NULL;
-    }
-    msg_window = elm_win_add(parentWnd, "MCFMessagePopup", ELM_WIN_UTILITY);
-    if (msg_window) {
-        int w, h;
-        elm_win_borderless_set(msg_window, EINA_TRUE);
-        elm_win_alpha_set(msg_window, EINA_TRUE);
-        elm_win_title_set(msg_window, "ISF Popup");
-        elm_win_screen_size_get(msg_window, NULL, NULL, &w, &h);
-        elm_win_prop_focus_skip_set(msg_window, TRUE);
-        int rots[4] = {0, 90, 180, 270};
-        elm_win_wm_rotation_available_rotations_set(msg_window, rots, 4);
-        evas_object_resize(msg_window, w, h);
-    }
-
-    int rots[4] = { 0, 90, 180, 270 };
-    elm_win_wm_rotation_available_rotations_set(msg_window, rots, 4);
-    evas_object_show(msg_window);
-    return msg_window;
-}
-
-void _guideline_popup_setting_cb(void *data, Evas_Object *obj, void *event_info)
-{
-    evas_object_smart_callback_del(obj, "dismissed", _guideline_popup_setting_cb);
-    evas_object_del(obj);
-    obj = NULL;
-    ise_destory_popup_setting();
-    CONFIG_VALUES *config_values = get_config_values();
-    if (config_values) {
-        config_values->first_guideset = TRUE;
-    }
-    write_ise_config_values();
-}
-
-void _guideline_popup_space_cb(void *data, Evas_Object *obj, void *event_info)
-{
-    evas_object_smart_callback_del(obj, "dismissed", _guideline_popup_space_cb);
-    evas_object_del(obj);
-    obj = NULL;
-    ise_destory_popup_space();
-    CONFIG_VALUES *config_values = get_config_values();
-    if (config_values) {
-        config_values->first_guidechange = TRUE;
-    }
-    write_ise_config_values();
-}
-
-void ise_show_help_popup(sclulong keyEvent)
+bool get_landscape_device(int degree)
 {
-    char buf[2048] = {0, };
-    int font_size = 40;
-    sclint scr_w = 0;
-    sclint scr_h = 0;
-    SclRectangle rectangle = {0};
-    Evas_Object *ctxpopup = NULL;
-    Elm_Theme *theme = NULL;
+    sclint width = 0;
+    sclint height = 0;
+    bool landscape_device = false;
 
     CSCLUI *ui = get_ui();
-    if (ui) {
-        ui->get_screen_resolution(&scr_w, &scr_h);
-
-        if (keyEvent == MVK_space) {
-            CONFIG_VALUES *config_values = get_config_values();
-            if (config_values) {
-                config_values->first_guidechange = TRUE;
-            }
-            write_ise_config_values();
-            ui->get_button_geometry("SPACE_KEY", &rectangle);
-            _guide_popup_space = open_message_popup(NATIVE_WINDOW_CAST(ime_get_main_window()));
+    if (!ui) return false;
 
-            theme = elm_theme_new();
-            elm_theme_ref_set(theme, NULL);
-            elm_theme_extension_add(theme, EDJ_FILE);
+    ui->get_screen_resolution(&width, &height);
 
-            ctxpopup = elm_ctxpopup_add(_guide_popup_space);
-            elm_object_theme_set(ctxpopup, theme);
-            evas_object_smart_callback_add(ctxpopup, "dismissed", _guideline_popup_space_cb, (void *)keyEvent);
-        } else {
-            CONFIG_VALUES *config_values = get_config_values();
-            if (config_values) {
-                config_values->first_guideset = TRUE;
-            }
-            write_ise_config_values();
-            ui->get_button_geometry("CM_KEY", &rectangle);
-            _guide_popup_setting = open_message_popup(NATIVE_WINDOW_CAST(ime_get_main_window()));
-            theme = elm_theme_new();
-            elm_theme_ref_set(theme, NULL);
-            elm_theme_extension_add(theme, EDJ_FILE);
-            ctxpopup = elm_ctxpopup_add(_guide_popup_setting);
-            elm_object_theme_set(ctxpopup, theme);
-            evas_object_smart_callback_add(ctxpopup, "dismissed", _guideline_popup_setting_cb, (void *)keyEvent);
-        }
-    }
-
-    int rotation = elm_win_rotation_get(NATIVE_WINDOW_CAST(ime_get_main_window()));
-    if (rotation == 0 || rotation == 180) {
-        elm_object_style_set(ctxpopup, "customised_guideline_popup");
-    } else {
-        elm_object_style_set(ctxpopup, "customised_guideline_popup_landscape");
+    if (degree == 0 || degree == 180) {
+        if (width > height)
+            landscape_device = true;
     }
-
-    elm_ctxpopup_direction_priority_set(ctxpopup, ELM_CTXPOPUP_DIRECTION_UP,
-                          ELM_CTXPOPUP_DIRECTION_UNKNOWN,
-                          ELM_CTXPOPUP_DIRECTION_UNKNOWN,
-                          ELM_CTXPOPUP_DIRECTION_UNKNOWN);
-
-    Evas_Object* text = elm_label_add(ctxpopup);
-
-    if (keyEvent == MVK_space) {
-        snprintf(buf, sizeof(buf), "<font_style=Regular font_size=%d align=left wrap=mixed color=#000000>%s</>", font_size,
-            dgettext(PACKAGE, "IDS_IME_BODY_SWIPE_THE_SPACE_BAR_LEFT_OR_RIGHT_TO_CHANGE_BETWEEN_LANGUAGES"));
-    } else {
-        snprintf(buf, sizeof(buf), "<font_style=Regular font_size=%d align=left wrap=mixed color=#000000>%s</>", font_size,
-               dgettext(PACKAGE, "IDS_IME_BODY_TAP_AND_HOLD_THIS_KEY_TO_SEE_THE_SYMBOL_LIST_SELECT_ONE_TO_USE_IT_AS_A_SHORTCUT"));
-    }
-    elm_object_text_set(text, buf);
-    elm_object_content_set(ctxpopup, text);
-    Evas_Coord x, y, w, h;
-    evas_object_geometry_get(NATIVE_WINDOW_CAST(ime_get_main_window()), &x, &y, &w, &h);
-
-    if (rotation == 0 || rotation == 180) {
-        elm_label_wrap_width_set(text, (scr_w * 4) / 5);
-        evas_object_size_hint_min_set(ctxpopup, ELM_SCALE_SIZE(scr_w), ELM_SCALE_SIZE(50));
-        evas_object_size_hint_max_set(ctxpopup, ELM_SCALE_SIZE(scr_w), ELM_SCALE_SIZE(600));
-        evas_object_move(ctxpopup, rectangle.x + rectangle.width / 2,
-                    (scr_h - h) + rectangle.y - ELM_SCALE_SIZE(5));
-    } else {
-        elm_label_wrap_width_set(text, (scr_h * 4) / 5);
-        evas_object_size_hint_min_set(ctxpopup, ELM_SCALE_SIZE(scr_h), ELM_SCALE_SIZE(50));
-        evas_object_size_hint_max_set(ctxpopup, ELM_SCALE_SIZE(scr_h), ELM_SCALE_SIZE(600));
-        evas_object_move(ctxpopup, rectangle.x + rectangle.width / 2,
-                (scr_w - h)+ rectangle.y - ELM_SCALE_SIZE(5));
-    }
-    elm_label_line_wrap_set(text, ELM_WRAP_MIXED);
-    evas_object_show(text);
-
-    if (keyEvent == MVK_space) {
-        evas_object_layer_set(_guide_popup_space, EVAS_LAYER_MAX);
-        evas_object_show(_guide_popup_space);
-    } else {
-        evas_object_layer_set(_guide_popup_setting, EVAS_LAYER_MAX);
-        evas_object_show(_guide_popup_setting);
+    else {
+        if (width < height)
+            landscape_device = true;
     }
 
-    evas_object_layer_set(ctxpopup, EVAS_LAYER_MAX);
-    evas_object_show(ctxpopup);
+    return landscape_device;
 }
 
 SCLEventReturnType CUIEventCallback::on_event_drag_state_changed(SclUIEventDesc event_desc)
@@ -1028,15 +868,15 @@ SCLEventReturnType CUIEventCallback::on_event_drag_state_changed(SclUIEventDesc
         if (g_floating_mode)
             ime_set_floating_drag_end();
     } else if (event_desc.event_type == EVENT_TYPE_PRESS) {
-#ifdef _MOBILE
+#if defined(_MOBILE) || defined(_COMMON)
         CONFIG_VALUES *config_values = get_config_values();
 
         if (config_values && (!config_values->first_guideset) && event_desc.key_value && (strncmp(event_desc.key_value, "OPTION", strlen(event_desc.key_value)) == 0)) {
-            ise_show_help_popup(event_desc.key_event);//show help popup in on_event_drag_state_changed other than on_event_key_clicked for fixing help popup show delay issue
+            ise_show_help_popup(event_desc.key_event, NATIVE_WINDOW_CAST(ime_get_main_window()));//show help popup in on_event_drag_state_changed other than on_event_key_clicked for fixing help popup show delay issue
             LOGD("setting popup show\n");
             return SCL_EVENT_PASS_ON;
         } else {
-            ise_destory_popup_setting();//destory popup manually in case of abnormal situation
+            ise_destroy_popup_setting();//destroy popup manually in case of abnormal situation
         }
 #endif
         if (g_floating_mode && event_desc.mouse_current_point.y <= FLOATING_TITLE_BAR_HEIGHT
@@ -1080,315 +920,355 @@ end:
         app_control_destroy(app_control);
 }
 
-SCLEventReturnType CUIEventCallback::on_event_key_clicked(SclUIEventDesc event_desc)
+void CUIEventCallback::on_event_string_key(CSCLUI *ui, SclUIEventDesc event_desc)
 {
-    SCLEventReturnType ret = SCL_EVENT_PASS_ON;
-    if (word_timer != NULL) {
-        ecore_timer_del(word_timer);
-        word_timer = NULL;
+    if (event_desc.key_modifier != KEY_MODIFIER_MULTITAP_START &&
+        event_desc.key_modifier != KEY_MODIFIER_MULTITAP_REPEAT) {
+        if (event_desc.key_event) {
+            ise_forward_key_event(event_desc.key_event);
+        } else {
+            ise_send_string(event_desc.key_value);
+        }
     }
 
-    KEYBOARD_STATE *keyboard_state = get_keyboard_state();
-    if (!keyboard_state) return ret;
-
-    if (event_desc.key_modifier == KEY_MODIFIER_MULTITAP_START) {
-        if (!keyboard_state->multitap_value.empty()) {
-            ise_send_string(keyboard_state->multitap_value.c_str());
+    if (!g_popup_opened) {
+        const sclchar *input_mode = ui->get_input_mode();
+        if (input_mode && ((0 == strcmp(input_mode, "SYM_QTY_1")) || (0 == strcmp(input_mode, "SYM_QTY_2")))) {
+            update_recent_used_punctuation(event_desc.key_value);
         }
-        ise_update_preedit_string(event_desc.key_value);
-        keyboard_state->multitap_value = event_desc.key_value;
-    } else if (event_desc.key_modifier == KEY_MODIFIER_MULTITAP_REPEAT) {
-        ise_update_preedit_string(event_desc.key_value);
-        keyboard_state->multitap_value = event_desc.key_value;
-    } else {
-        _reset_multitap_state();
+    } else if (g_punctuation_popup_opened) {
+        update_recent_used_punctuation(event_desc.key_value);
     }
-    keyboard_state->prev_modifier = event_desc.key_modifier;
+}
 
-    CSCLUI *ui = get_ui();
-    if (ui) {
-        switch (event_desc.key_type) {
-        case KEY_TYPE_STRING: {
-            if (event_desc.key_modifier != KEY_MODIFIER_MULTITAP_START &&
-                event_desc.key_modifier != KEY_MODIFIER_MULTITAP_REPEAT) {
-                    if (event_desc.key_event) {
-                        ise_forward_key_event(event_desc.key_event);
-                    } else {
-                        ise_send_string(event_desc.key_value);
-                    }
-            }
-            if (!g_popup_opened) {
-                const sclchar *input_mode = ui->get_input_mode();
-                if (input_mode && ((0 == strcmp(input_mode, "SYM_QTY_1")) || (0 == strcmp(input_mode, "SYM_QTY_2")))) {
-                    update_recent_used_punctuation(event_desc.key_value);
-                }
-            } else if (g_punctuation_popup_opened) {
-                update_recent_used_punctuation(event_desc.key_value);
-            }
-            break;
+void CUIEventCallback::on_event_control_key(CSCLUI *ui, SclUIEventDesc event_desc, KEYBOARD_STATE *keyboard_state)
+{
+    commit_timeout(NULL);
+
+    const char *long_shift = "LongShift";
+    const char *caps_lock = "CapsLock";
+    const char *delete_all = "DeleteAll";
+    const char *hide_panel = "Hide";
+
+    if (strncmp(event_desc.key_value, long_shift, strlen(long_shift)) == 0) {
+        LOGD("shift key is longpress\n");
+        ui->set_shift_state(SCL_SHIFT_STATE_ON);
+        g_need_send_shift_event = TRUE;
+        //ise_send_event (MVK_Shift_Lock, KEY_MASK_NULL);
+    } else if (strncmp(event_desc.key_value, caps_lock, strlen(caps_lock)) == 0) {
+        bool load_in_ime = false;
+        const sclchar *cur_lang = _language_manager.get_current_language();
+        if (cur_lang) {
+            LANGUAGE_INFO *info = _language_manager.get_language_info(cur_lang);
+            if (info)
+                load_in_ime = info->load_in_ime;
+        }
+
+        if (ui->get_shift_state() != SCL_SHIFT_STATE_LOCK) {
+            ui->set_shift_state(SCL_SHIFT_STATE_LOCK);
+            if (load_in_ime)
+                ime_send_imengine_event(MVK_Shift_Lock, 0);
+            else
+                engine_loader_send_imengine_event(MVK_Shift_Lock, 0);
+        } else {
+            ui->set_shift_state(SCL_SHIFT_STATE_OFF);
+            if (load_in_ime)
+                ime_send_imengine_event(MVK_Shift_Off, 0);
+            else
+                engine_loader_send_imengine_event(MVK_Shift_Off, 0);
+        }
+        //g_need_send_shift_event = TRUE;
+    } else if (strncmp(event_desc.key_value, delete_all, strlen(delete_all)) == 0) {
+        ime_delete_surrounding_text((INT_MAX / 2) * -1, INT_MAX);
+    } else if (strncmp(event_desc.key_value, hide_panel, strlen(hide_panel)) == 0) {
+        ise_hide();
+        ime_request_hide();
+    } else if (event_desc.key_event) {
+        if (keyboard_state->layout == ISE_LAYOUT_STYLE_VOICE) {
+            ise_stt_stop();
         }
-        case KEY_TYPE_CHAR: {
-                sclboolean need_forward = FALSE;
-                // FIXME : Should decide when to forward key events
-                const sclchar *input_mode = ui->get_input_mode();
-                if (input_mode) {
-                    if (strcmp(input_mode, "SYM_QTY_1") == 0 ||
-                            strcmp(input_mode, "SYM_QTY_2") == 0 ||
-                            strcmp(input_mode, "PHONE_3X4") == 0 ||
-                            strcmp(input_mode, "IPv6_3X4_123") == 0 ||
-                            strcmp(input_mode, "IPv6_3X4_ABC") == 0 ||
-                            strcmp(input_mode, "NUMONLY_3X4") == 0 ||
-                            strcmp(input_mode, "NUMONLY_3X4_SIG") == 0 ||
-                            strcmp(input_mode, "NUMONLY_3X4_DEC") == 0 ||
-                            strcmp(input_mode, "NUMONLY_3X4_SIGDEC") == 0 ||
-                            strcmp(input_mode, "DATETIME_3X4") == 0) {
-                        need_forward = TRUE;
-                    }
-                }
-                if (input_mode && strcmp (input_mode, "NUMONLY_3X4_SIGDEC") == 0 &&
-                    strcmp(event_desc.key_value, ".") == 0) {
-                    ime_update_preedit_string(_sig_dec[_click_count%SIG_DEC_SIZE], NULL);
-                    ime_show_preedit_string();
-                    delete_commit_timer();
-                    _commit_timer = ecore_timer_add(1.0, commit_timeout, NULL);
-                    _click_count++;
-                } else if (event_desc.key_event) {
-                    commit_timeout(NULL);
-                    if (need_forward) {
-                        ise_forward_key_event(event_desc.key_event);
-                    } else {
-                        if (_cm_popup_opened) {
-                            static sclchar current_cm_symbol[2] = {'\0'};
-                            sclchar* imagelabel[SCL_BUTTON_STATE_MAX] = {
-                                const_cast<sclchar*>(" "),
-                                const_cast<sclchar*>(" "),
-                                const_cast<sclchar*>(" ")};
-                            if (event_desc.key_value) {
-                                current_cm_symbol[0] = event_desc.key_value[0];
-                                current_cm_symbol[1] = '\0';
-                            }
-                            ui->set_private_key("CM_KEY",
-                                    const_cast<sclchar*>(current_cm_symbol),
-                                    imagelabel, NULL, 0,
-                                    const_cast<sclchar*>(current_cm_symbol), TRUE);
-
-                            _cm_popup_opened = FALSE;
-                            _current_cm_key_id = -1;
-                        }
 #ifdef _WEARABLE
-                        /*
-                        *
-                        *change the keyboard mode of GLM from QWERTY to KEYPAD
-                        *ensure the Number keypad won't be affected
-                        *
-                        */
-                        if (keyboard_state->layout == ISE_LAYOUT_STYLE_NUMBER) {
-                            ime_send_key_event(IME_KEY_Print, IME_KEY_MASK_CONTROL, false);
-                        } else {
-                            if (word_timer == NULL && (!get_candidate() || !g_softcandidate_show)) {
-                                word_timer = ecore_timer_add(MULTITAP_TIMEOUT, _multi_tap_timer_cb, NULL);
-                            }
-                            ime_send_key_event(IME_KEY_Select, IME_KEY_MASK_CONTROL, false);
-                        }
+        if (event_desc.key_event == MVK_Done) {
+            LOGD("ENTER");
+            //commit the preedit string first
+            ise_send_event(event_desc.key_event, KEY_MASK_NULL);
+        }
 #endif
-                        ise_send_event(event_desc.key_event, KEY_MASK_NULL);
-                    }
-                }
-                if (input_mode) {
-                    if ((strcmp(input_mode, "SYM_QTY_1") == 0) || (0 == strcmp(input_mode, "SYM_QTY_2"))) {
-                        update_recent_used_punctuation(event_desc.key_value);
-                    }
+        ise_send_event(event_desc.key_event, KEY_MASK_NULL);
+        if (event_desc.key_event == MVK_Shift_L) {
+            g_need_send_shift_event = TRUE;
+        }
+    }
+}
+
+void CUIEventCallback::on_event_character_key(CSCLUI *ui, SclUIEventDesc event_desc, KEYBOARD_STATE *keyboard_state)
+{
+    sclboolean need_forward = FALSE;
+    // FIXME : Should decide when to forward key events
+    const sclchar *input_mode = ui->get_input_mode();
+    if (input_mode) {
+        if (strcmp(input_mode, "SYM_QTY_1") == 0 ||
+            strcmp(input_mode, "SYM_QTY_2") == 0 ||
+            strcmp(input_mode, "PHONE_3X4") == 0 ||
+            strcmp(input_mode, "IPv6_3X4_123") == 0 ||
+            strcmp(input_mode, "IPv6_3X4_ABC") == 0 ||
+            strcmp(input_mode, "NUMONLY_3X4") == 0 ||
+            strcmp(input_mode, "NUMONLY_3X4_SIG") == 0 ||
+            strcmp(input_mode, "NUMONLY_3X4_DEC") == 0 ||
+            strcmp(input_mode, "NUMONLY_3X4_SIGDEC") == 0 ||
+            strcmp(input_mode, "DATETIME_3X4") == 0) {
+            need_forward = TRUE;
+        }
+    }
+    if (input_mode && strcmp (input_mode, "NUMONLY_3X4_SIGDEC") == 0 &&
+        event_desc.key_value && strcmp(event_desc.key_value, ".") == 0) {
+        ime_update_preedit_string(_sig_dec[_click_count%SIG_DEC_SIZE], NULL);
+        ime_show_preedit_string();
+        delete_commit_timer();
+        _commit_timer = ecore_timer_add(1.0, commit_timeout, NULL);
+        _click_count++;
+    } else if (event_desc.key_event) {
+        commit_timeout(NULL);
+        if (need_forward) {
+            ise_forward_key_event(event_desc.key_event);
+        } else {
+            if (_cm_popup_opened) {
+                static sclchar current_cm_symbol[2] = {'\0'};
+                sclchar* imagelabel[SCL_BUTTON_STATE_MAX] = {
+                    const_cast<sclchar*>(" "),
+                    const_cast<sclchar*>(" "),
+                    const_cast<sclchar*>(" ")};
+                if (event_desc.key_value) {
+                    current_cm_symbol[0] = event_desc.key_value[0];
+                    current_cm_symbol[1] = '\0';
                 }
-                break;
-            }
-        case KEY_TYPE_CONTROL: {
-                commit_timeout(NULL);
-
-                const char *long_shift = "LongShift";
-                const char *caps_lock = "CapsLock";
-                const char *delete_all = "DeleteAll";
-                const char *hide_panel = "Hide";
-                if (strncmp(event_desc.key_value, long_shift, strlen(long_shift)) == 0) {
-                    LOGD("shift key is longpress\n");
-                    ui->set_shift_state(SCL_SHIFT_STATE_ON);
-                    g_need_send_shift_event = TRUE;
-                    //ise_send_event (MVK_Shift_Lock, KEY_MASK_NULL);
-                } else if (strncmp(event_desc.key_value, caps_lock, strlen(caps_lock)) == 0) {
-                    bool load_in_ime = false;
-                    const sclchar *cur_lang = _language_manager.get_current_language();
-                    if (cur_lang) {
-                        LANGUAGE_INFO *info = _language_manager.get_language_info(cur_lang);
-                        if (info)
-                            load_in_ime = info->load_in_ime;
-                    }
+                ui->set_private_key("CM_KEY",
+                        const_cast<sclchar*>(current_cm_symbol),
+                        imagelabel, NULL, 0,
+                        const_cast<sclchar*>(current_cm_symbol), TRUE);
 
-                    if (ui->get_shift_state() != SCL_SHIFT_STATE_LOCK) {
-                        ui->set_shift_state(SCL_SHIFT_STATE_LOCK);
-                        if (load_in_ime)
-                            ime_send_imengine_event(MVK_Shift_Lock, 0);
-                        else
-                            engine_loader_send_imengine_event(MVK_Shift_Lock, 0);
-                    } else {
-                        ui->set_shift_state(SCL_SHIFT_STATE_OFF);
-                        if (load_in_ime)
-                            ime_send_imengine_event(MVK_Shift_Off, 0);
-                        else
-                            engine_loader_send_imengine_event(MVK_Shift_Off, 0);
-                    }
-                    //g_need_send_shift_event = TRUE;
-                } else if (strncmp(event_desc.key_value, delete_all, strlen(delete_all)) == 0) {
-                    ime_delete_surrounding_text((INT_MAX / 2) * -1, INT_MAX);
-                } else if (strncmp(event_desc.key_value, hide_panel, strlen(hide_panel)) == 0) {
-                    ise_hide();
-                    ime_request_hide();
-                } else if (event_desc.key_event) {
-                    if (keyboard_state->layout == ISE_LAYOUT_STYLE_VOICE) {
-                        ise_stt_stop();
-                    }
+                _cm_popup_opened = FALSE;
+                _current_cm_key_id = -1;
+            }
 #ifdef _WEARABLE
-                    if (event_desc.key_event == MVK_Done) {
-                        LOGD("ENTER");
-                        //commit the preedit string first
-                        ise_send_event(event_desc.key_event, KEY_MASK_NULL);
-                    }
-#endif
-                    ise_send_event(event_desc.key_event, KEY_MASK_NULL);
-                    if (event_desc.key_event == MVK_Shift_L) {
-                        g_need_send_shift_event = TRUE;
-                    }
+            /*
+             * change the keyboard mode of GLM from QWERTY to KEYPAD
+             * ensure the Number keypad won't be affected
+             */
+            if (keyboard_state->layout == ISE_LAYOUT_STYLE_NUMBER) {
+                ime_send_key_event(IME_KEY_Print, IME_KEY_MASK_CONTROL, false);
+            } else {
+                Candidate *candidate = get_candidate();
+                if (word_timer == NULL && (!candidate || !candidate->get_visible())) {
+                    word_timer = ecore_timer_add(MULTITAP_TIMEOUT, _multi_tap_timer_cb, NULL);
                 }
-                break;
-           }
-        case KEY_TYPE_MODECHANGE:
-#ifdef _MOBILE
-            if (_guide_popup_setting != NULL) {//popup is showing
-                break;
+                ime_send_key_event(IME_KEY_Select, IME_KEY_MASK_CONTROL, false);
             }
 #endif
-            if (strcmp(event_desc.key_value, USER_VOICE_LANGUAGE) == 0) {
-                if (!get_setting_window_open_status()) {
-                    ise_hide_stt_mode();
-#ifdef _WEARABLE
-                    hide_indicator_window();
-#endif
-                    create_setting_window();
-                }
-            } else if (strcmp(event_desc.key_value, USER_KEYSTRING_VOICE) == 0) {
-                keyboard_state->layout = ISE_LAYOUT_STYLE_VOICE;
-                ui->set_input_mode("STT_3X4");
+            ise_send_event(event_desc.key_event, KEY_MASK_NULL);
+        }
+    }
+
+    if (input_mode) {
+        if ((strcmp(input_mode, "SYM_QTY_1") == 0) || (0 == strcmp(input_mode, "SYM_QTY_2"))) {
+            update_recent_used_punctuation(event_desc.key_value);
+        }
+    }
+}
 
-            } else if (strcmp(event_desc.key_value, USER_KEYSTRING_OPTION) == 0) {
-                launch_option();
+void CUIEventCallback::on_event_modechange_key(CSCLUI *ui, SclUIEventDesc event_desc, KEYBOARD_STATE *keyboard_state, SCLEventReturnType &ret)
+{
+#if defined(_MOBILE) || defined(_COMMON)
+    if (guide_popup_get_visible()) {//popup is showing
+        return;
+    }
+#endif
 
-                ret = SCL_EVENT_DONE;
-            } else if (strcmp(event_desc.key_value, USER_KEYSTRING_CLIPBOARD) == 0) {
-                show_cbhm();
+    if (strcmp(event_desc.key_value, USER_VOICE_LANGUAGE) == 0) {
+        if (!get_setting_window_open_status()) {
+            ise_hide_stt_mode();
+#ifdef _WEARABLE
+            hide_indicator_window();
+#endif
+            create_setting_window();
+        }
+    } else if (strcmp(event_desc.key_value, USER_KEYSTRING_VOICE) == 0) {
+        keyboard_state->layout = ISE_LAYOUT_STYLE_VOICE;
+        ui->set_input_mode("STT_3X4");
 
-                ret = SCL_EVENT_DONE;
-            } else if (strcmp(event_desc.key_value, USER_KEYSTRING_FLOATING) == 0) {
-                CONFIG_VALUES *config_values = get_config_values();
+    } else if (strcmp(event_desc.key_value, USER_KEYSTRING_OPTION) == 0) {
+        launch_option();
 
-                if (g_floating_mode) {
-                    if (config_values) {
-                        config_values->floating_mode = false;
-                    }
-                } else {
-                    if (config_values) {
-                        config_values->floating_mode = true;
-                    }
-                }
-                write_ise_config_values();
+        ret = SCL_EVENT_DONE;
+    } else if (strcmp(event_desc.key_value, USER_KEYSTRING_FLOATING) == 0) {
+        CONFIG_VALUES *config_values = get_config_values();
 
-                ret = SCL_EVENT_DONE;
-            } else if (on_input_mode_changed(event_desc.key_value, event_desc.key_event, event_desc.key_type)) {
-                ret = SCL_EVENT_DONE;
+        if (g_floating_mode) {
+            if (config_values) {
+                config_values->floating_mode = false;
             }
-            if (_cm_popup_opened) {
-                if (strcmp(event_desc.key_value, USER_KEYSTRING_EMOTICON) == 0 ||
-                    strcmp(event_desc.key_value, USER_KEYSTRING_VOICE) == 0 ||
-                    strcmp(event_desc.key_value, USER_KEYSTRING_FLOATING) == 0) {
-                    scluint id = ise_get_cm_key_id(event_desc.key_value);
-                    if (id != _current_cm_key_id) {
-                        _current_cm_key_id = id;
-                        ise_set_cm_private_key(_current_cm_key_id);
-                    }
-                }
-                _cm_popup_opened = FALSE;
+        } else {
+            if (config_values) {
+                config_values->floating_mode = true;
             }
-            if (strlen(event_desc.key_value) == 1) {
-                const char allowed_chars_in_modechange[] = {
-                    ',', '?', '!', '`', '~'
-                };
-                const int allowed_chars_in_modechange_num =
-                    sizeof(allowed_chars_in_modechange) / sizeof(char);
-                for (unsigned int loop = 0;loop < sizeof(allowed_chars_in_modechange_num);loop++) {
-                    if (*(event_desc.key_value) == allowed_chars_in_modechange[loop]) {
-                        ise_send_string(event_desc.key_value);
-                    }
-                }
+        }
+        write_ise_config_values();
+
+        ret = SCL_EVENT_DONE;
+    } else if (strcmp(event_desc.key_value, USER_KEYSTRING_STICKER) == 0) {
+        SCLRotation rotation = ui->get_rotation();
+        ise_sticker_show_layout(STICKER_GROUP_RECENTLY_USED, ROTATION_TO_DEGREE(rotation), false, ime_get_main_window());
+    } else if (strcmp(event_desc.key_value, USER_KEYSTRING_TRANSLATION) == 0) {
+        if (ise_sticker_is_show())
+            ise_sticker_destroy_layout();
+
+        SCLRotation rotation = ui->get_rotation();
+        ise_nmt_show_layout(ROTATION_TO_DEGREE(rotation), false, ime_get_main_window());
+    } else if (on_input_mode_changed(event_desc.key_value, event_desc.key_event, event_desc.key_type)) {
+        ret = SCL_EVENT_DONE;
+    }
+
+    if (_cm_popup_opened) {
+        if (strcmp(event_desc.key_value, USER_KEYSTRING_EMOTICON) == 0 ||
+            strcmp(event_desc.key_value, USER_KEYSTRING_VOICE) == 0 ||
+            strcmp(event_desc.key_value, USER_KEYSTRING_FLOATING) == 0 ||
+            strcmp(event_desc.key_value, USER_KEYSTRING_STICKER) == 0 ||
+            strcmp(event_desc.key_value, USER_KEYSTRING_TRANSLATION) == 0) {
+            scluint id = ise_get_cm_key_id(event_desc.key_value);
+            if (id != _current_cm_key_id) {
+                _current_cm_key_id = id;
+                ise_set_cm_private_key(_current_cm_key_id);
             }
-            break;
-        case KEY_TYPE_USER:
-            if (strcmp(event_desc.key_value, USER_KEYSTRING_OPTION) == 0) {
-                //open_option_window(NULL, ROTATION_TO_DEGREE(ui->get_rotation()));
-                launch_option();
-
-                ret = SCL_EVENT_DONE;
-            } else if (strcmp(event_desc.key_value, USER_KEYSTRING_CLIPBOARD) == 0) {
-                show_cbhm();
-                ret = SCL_EVENT_DONE;
-            } else if (strcmp(event_desc.key_value, "Cancel") == 0) {
-                ret = SCL_EVENT_DONE;
-                const sclchar *input_mode = ui->get_input_mode();
-                if (input_mode && strcmp(input_mode, "STT_3X4") == 0 ) {
-                    keyboard_state->need_reset = TRUE;
-                    voice_result_string_flush();
-                    ise_set_layout(keyboard_state->layout, keyboard_state->layout_variation);
-                    if (keyboard_state->visible_state)
-                        ise_show(keyboard_state->ic);
-                }
+        }
+        _cm_popup_opened = FALSE;
+    }
+
+    if (strlen(event_desc.key_value) == 1) {
+        const char allowed_chars_in_modechange[] = {
+            ',', '?', '!', '`', '~', '@', '-'
+        };
+        const int allowed_chars_in_modechange_num =
+            sizeof(allowed_chars_in_modechange) / sizeof(char);
+        for (unsigned int loop = 0;loop < sizeof(allowed_chars_in_modechange_num);loop++) {
+            if (*(event_desc.key_value) == allowed_chars_in_modechange[loop]) {
+                ise_send_string(event_desc.key_value);
+            }
+        }
+    }
+}
+
+void CUIEventCallback::process_user_key(CSCLUI *ui, SclUIEventDesc event_desc, KEYBOARD_STATE *keyboard_state, SCLEventReturnType &ret)
+{
+    if (strcmp(event_desc.key_value, USER_KEYSTRING_OPTION) == 0) {
+        //open_option_window(NULL, ROTATION_TO_DEGREE(ui->get_rotation()));
+        launch_option();
+
+        ret = SCL_EVENT_DONE;
+    } else if (strcmp(event_desc.key_value, "Cancel") == 0) {
+        ret = SCL_EVENT_DONE;
+        const sclchar *input_mode = ui->get_input_mode();
+        if (input_mode && strcmp(input_mode, "STT_3X4") == 0 ) {
+            keyboard_state->need_reset = TRUE;
+            voice_result_string_flush();
+            ise_set_layout(keyboard_state->layout, keyboard_state->layout_variation);
+            if (keyboard_state->visible_state)
+                ise_show(keyboard_state->ic);
+        }
 #ifdef _TV
-                ise_send_event(IME_KEY_Cancel, KEY_MASK_NULL);
-                ime_request_hide();
+        ise_send_event(IME_KEY_Cancel, KEY_MASK_NULL);
+        ime_request_hide();
 #endif
-            }  else if (strcmp(event_desc.key_value, "Done") == 0) {
+    }  else if (strcmp(event_desc.key_value, "Done") == 0) {
 #ifdef _TV
-                ret = SCL_EVENT_DONE;
-                ise_send_event(IME_KEY_Return, KEY_MASK_NULL);
-                ime_request_hide();
+        ret = SCL_EVENT_DONE;
+        ise_send_event(IME_KEY_Return, KEY_MASK_NULL);
+        ime_request_hide();
 #endif
-            }  else {
-                const sclchar *input_mode = ui->get_input_mode();
-                if ((NULL != input_mode) && (!strcmp(input_mode, "EMOTICON_LAYOUT"))) {
-                    if (ise_emoticon_is_show()) {
-                        ise_emoticon_destroy_layout();
-                    }
+    } else if (strcmp(event_desc.key_value, "Translate") == 0) {
+        ise_nmt_translate();
+    }  else {
+        const sclchar *input_mode = ui->get_input_mode();
+        if ((NULL != input_mode) && (!strcmp(input_mode, "EMOTICON_LAYOUT"))) {
+            if (ise_emoticon_is_show()) {
+                ise_emoticon_destroy_layout();
+            }
 #ifdef _WEARABLE
-                    emoticon_group_t group_id = EMOTICON_GROUP_1;
-                    if (ise_emoticon_get_current_group() < EMOTICON_GROUP_3)
-                        group_id = (emoticon_group_t)(ise_emoticon_get_current_group() + 1);
+            emoticon_group_t group_id = EMOTICON_GROUP_1;
+            if (ise_emoticon_get_current_group() < EMOTICON_GROUP_3)
+                group_id = (emoticon_group_t)(ise_emoticon_get_current_group() + 1);
 
-                    ise_set_emoticon_label(group_id);
+            ise_set_emoticon_label(group_id);
 #else
-                    emoticon_group_t group_id = ise_emoticon_get_group_id(event_desc.key_value);
+            emoticon_group_t group_id = ise_emoticon_get_group_id(event_desc.key_value);
 #endif
-                    if ((group_id >= 0) && (group_id < MAX_EMOTICON_GROUP)) {
-                        SCLRotation rotation = ui->get_rotation();
-                        ise_emoticon_show_layout(group_id, ROTATION_TO_DEGREE(rotation), false, ime_get_main_window());
-                    }
-                }
+            if ((group_id >= 0) && (group_id < MAX_EMOTICON_GROUP)) {
+                SCLRotation rotation = ui->get_rotation();
+                ise_emoticon_show_layout(group_id, ROTATION_TO_DEGREE(rotation), false, ime_get_main_window());
             }
-            if (_cm_popup_opened) {
-                if (strcmp(event_desc.key_value, USER_KEYSTRING_OPTION) == 0 ||
-                    strcmp(event_desc.key_value, USER_KEYSTRING_CLIPBOARD) == 0) {
-                    scluint id = ise_get_cm_key_id(event_desc.key_value);
-                    if (id != _current_cm_key_id) {
-                        _current_cm_key_id = id;
-                        ise_set_cm_private_key(_current_cm_key_id);
-                    }
-                }
-                _cm_popup_opened = FALSE;
+        }
+
+        if (input_mode && (!strcmp(input_mode, "STICKER_LAYOUT"))) {
+            if (ise_sticker_is_show())
+                ise_sticker_change_group(ise_sticker_get_group_id(event_desc.key_value));
+        }
+    }
+
+    if (_cm_popup_opened) {
+        if (strcmp(event_desc.key_value, USER_KEYSTRING_OPTION) == 0 ||
+            strcmp(event_desc.key_value, USER_KEYSTRING_STICKER) == 0 ||
+            strcmp(event_desc.key_value, USER_KEYSTRING_TRANSLATION) == 0) {
+            scluint id = ise_get_cm_key_id(event_desc.key_value);
+            if (id != _current_cm_key_id) {
+                _current_cm_key_id = id;
+                ise_set_cm_private_key(_current_cm_key_id);
             }
+        }
+        _cm_popup_opened = FALSE;
+    }
+}
+
+SCLEventReturnType CUIEventCallback::on_event_key_clicked(SclUIEventDesc event_desc)
+{
+    SCLEventReturnType ret = SCL_EVENT_PASS_ON;
+    if (word_timer != NULL) {
+        ecore_timer_del(word_timer);
+        word_timer = NULL;
+    }
+
+    KEYBOARD_STATE *keyboard_state = get_keyboard_state();
+    if (!keyboard_state) return ret;
+
+    if (event_desc.key_modifier == KEY_MODIFIER_MULTITAP_START) {
+        if (!keyboard_state->multitap_value.empty()) {
+            ise_send_string(keyboard_state->multitap_value.c_str());
+        }
+        ise_update_preedit_string(event_desc.key_value);
+        keyboard_state->multitap_value = event_desc.key_value;
+    } else if (event_desc.key_modifier == KEY_MODIFIER_MULTITAP_REPEAT) {
+        ise_update_preedit_string(event_desc.key_value);
+        keyboard_state->multitap_value = event_desc.key_value;
+    } else {
+        _reset_multitap_state();
+    }
+    keyboard_state->prev_modifier = event_desc.key_modifier;
+
+    CSCLUI *ui = get_ui();
+    if (ui) {
+        switch (event_desc.key_type) {
+        case KEY_TYPE_STRING:
+            on_event_string_key(ui, event_desc);
+            break;
+        case KEY_TYPE_CHAR:
+            on_event_character_key(ui, event_desc, keyboard_state);
+            break;
+        case KEY_TYPE_CONTROL:
+            on_event_control_key(ui, event_desc, keyboard_state);
+            break;
+        case KEY_TYPE_MODECHANGE:
+            on_event_modechange_key(ui, event_desc, keyboard_state, ret);
+            break;
+        case KEY_TYPE_USER:
+            process_user_key(ui, event_desc, keyboard_state, ret);
             break;
         default:
             break;
@@ -1458,14 +1338,14 @@ static void save_autofill_data()
     char *text = NULL;
     int cursor;
 
-    if (g_autofill_hint == 0)
+    if (ime_autofill_get_hint() == 0)
         return;
 
     ime_get_surrounding_text(-1, -1, &text, &cursor);
     SECURE_LOGD("surrounding text : %s\n", text);
     if (!text) return;
 
-    autofill_save_string(g_app_id.c_str(), g_resource_id.c_str(), (Ecore_IMF_Input_Hints)g_autofill_hint, text);
+    ime_autofill_save_string(text);
 
     free(text);
 }
@@ -1556,12 +1436,16 @@ ise_show(int ic)
         }
 
         if (ic == keyboard_state->focused_ic) {
-            if (keyboard_state->layout == ISE_LAYOUT_STYLE_PHONENUMBER ||
-                keyboard_state->layout == ISE_LAYOUT_STYLE_IP ||
-                keyboard_state->layout == ISE_LAYOUT_STYLE_MONTH ||
-                keyboard_state->layout == ISE_LAYOUT_STYLE_NUMBERONLY) {
-                ime_set_engine_loader_flag(true);
-                engine_loader_set_imengine(DEFAULT_KEYBOARD_ISE_UUID, DEFAULT_KEYBOARD_ISE_PKGID);
+            switch (keyboard_state->layout)
+            {
+                case ISE_LAYOUT_STYLE_PHONENUMBER:
+                case ISE_LAYOUT_STYLE_IP:
+                case ISE_LAYOUT_STYLE_MONTH:
+                case ISE_LAYOUT_STYLE_NUMBERONLY:
+                    ime_set_imengine(DEFAULT_KEYBOARD_ISE_UUID);
+                    break;
+                default:
+                    break;
             }
         }
 
@@ -1601,12 +1485,20 @@ ise_show(int ic)
         LANGUAGE_INFO *info =
             (config_values ? _language_manager.get_language_info(config_values->selected_language.c_str()) : NULL);
         if (info) {
-            if (g_ise_default_values[keyboard_state->layout].force_latin && !(info->is_latin_language)) {
+            if (!info->is_latin_language) {
                 if (!keyboard_state->disable_force_latin) {
-                    force_primary_latin = TRUE;
+                    if (g_ise_default_values[keyboard_state->layout].force_latin) {
+                        force_primary_latin = TRUE;
+                    }
+                    else {
+                        if (keyboard_state->prefer_latin) {
+                            force_primary_latin = TRUE;
+                        }
+                    }
                 }
             }
         }
+
         if (force_primary_latin) {
             /* If there is enabled latin-based language, select it */
             sclboolean selected = FALSE;
@@ -1691,6 +1583,12 @@ ise_show(int ic)
                     SCLRotation rotation = ui->get_rotation();
                     ise_emoticon_show_layout(ise_emoticon_get_current_group(), ROTATION_TO_DEGREE(rotation), false, ime_get_main_window());
                 }
+
+                if (ise_sticker_is_show())
+                    ise_sticker_destroy_layout();
+
+                if (ise_nmt_is_show())
+                    ise_nmt_destroy_layout();
             }
         }
 
@@ -1735,13 +1633,13 @@ ise_show(int ic)
         ui->enable_button("CM_KEY", false);
 #endif
 
-#ifdef _MOBILE
+#if defined(_MOBILE) || defined(_COMMON)
         if (ise_is_guideline_popup_enable_layout()) {
             if ((config_values && config_values->first_guidechange) && (_language_manager.get_enabled_languages_num() > 1)) {
-                ise_show_help_popup(MVK_space);
+                ise_show_help_popup(MVK_space, NATIVE_WINDOW_CAST(ime_get_main_window()));
                 LOGD("space popup show\n");
             } else {
-                ise_destory_popup_space();
+                ise_destroy_popup_space();
             }
         }
 #endif
@@ -1852,7 +1750,7 @@ ise_set_screen_rotation(int degree)
     Candidate *candidate = get_candidate();
     if (candidate) {
         candidate->rotate(degree);
-        if (g_softcandidate_show) {
+        if (candidate->get_visible()) {
             candidate->update(g_softcandidate_string);
         }
     }
@@ -1885,8 +1783,8 @@ ise_hide()
 
     _click_count = 0;
     delete_commit_timer();
-    ise_destory_popup_space();
-    ise_destory_popup_setting();
+    ise_destroy_popup_space();
+    ise_destroy_popup_setting();
 
     if (keyboard_state) keyboard_state->visible_state = FALSE;
 
@@ -1903,7 +1801,8 @@ ise_hide()
     }
 
     g_input_panel_show = false;
-    if (g_softcandidate_show && get_candidate())
+    Candidate *candidate = get_candidate();
+    if (candidate && candidate->get_visible())
         set_ime_size(g_floating_mode, ISE_CANDIDATE_REQ_SHOW);
 #ifdef _WEARABLE
     hide_indicator_window();
@@ -2001,7 +1900,6 @@ static void ise_floating_mode_changed_cb(const char *key, void *user_data)
 
         create_softcandidate();
         if (g_candidate && g_candidate->get_visible()) {
-            g_softcandidate_show = true;
             g_candidate->show();
             set_ime_size(g_floating_mode, ISE_CANDIDATE_REQ_SHOW);
             return;
@@ -2087,12 +1985,6 @@ ise_create()
             sclboolean succeeded = FALSE;
 
             const sclchar *entry_path = MAIN_ENTRY_XML_PATH;
-            int nwidth  = 0;
-            int nheight = 0;
-            CSCLUtils *utils = CSCLUtils::get_instance();
-            if (utils) {
-                utils->get_screen_resolution(&nwidth, &nheight);
-            }
             _language_manager.set_resource_file_path(entry_path);
             const sclchar *resource_file_path = _language_manager.get_resource_file_path();
 
@@ -2123,6 +2015,9 @@ ise_create()
             }
 
             read_ise_config_values();
+            if (access(ISE_CONFIG_FILE_PATH, F_OK) == 0 && !config_values->init_flag)
+                read_ise_config_file();
+
             if (config_values) {
                 _language_manager.set_enabled_languages(config_values->enabled_languages);
                 _language_manager.select_language(config_values->selected_language.c_str());
@@ -2174,6 +2069,7 @@ ise_destroy()
         LOGD("deleting ui\n");
         delete ui;
         ui = NULL;
+        g_ui = NULL;
     }
 
     if (g_candidate) {
@@ -2198,16 +2094,17 @@ void
 ise_app_candidate_show()
 {
 #ifdef _WEARABLE
-    if (!g_softcandidate_show) {
+    if (!g_candidate)
+        return;
+
+    if (!g_candidate->get_visible())
         return;
-    }
 #endif
     LOGD("Enter\n");
     delete_softcandidate_hide_timer();
 
     create_softcandidate();
 
-    g_softcandidate_show = true;
     Candidate *candidate = get_candidate();
     if (candidate) {
         candidate->show();
@@ -2221,12 +2118,12 @@ ise_app_candidate_hide()
     LOGD("Enter\n");
 
     Candidate *candidate = get_candidate();
-    if (!candidate || !g_softcandidate_show) {
+    if (!candidate || !candidate->get_visible()) {
         LOGD("No candidate\n");
         return;
     }
 
-    if (g_ic_smartreply != -1 || g_autofill_exist)
+    if (g_ic_smartreply != -1 || ime_autofill_get_exist())
         return;
 
     add_softcandidate_hide_timer();
@@ -2252,7 +2149,6 @@ void ise_check_wearable_candidate()
                   keyboard_state->layout == ISE_LAYOUT_STYLE_PASSWORD) {
         ise_app_candidate_hide();
     } else {
-        g_softcandidate_show = true;
         ise_app_candidate_show();
     }
 }
@@ -2443,11 +2339,12 @@ void ise_get_language_locale(char **locale)
 
 void ise_update_table(const vector<string> &vec_str)
 {
-    if (!get_candidate() || !g_softcandidate_show) {
+    Candidate *candidate = get_candidate();
+    if (!candidate || !candidate->get_visible()) {
         create_softcandidate();
     }
 
-    Candidate *candidate = get_candidate();
+    candidate = get_candidate();
     if (candidate) {
         candidate->update(vec_str);
     }
@@ -2678,9 +2575,8 @@ static void ime_app_create_cb(void *user_data)
     if (elm_scale)
         elm_app_base_scale_set(atof(elm_scale));
 
-#ifdef HAVE_CBHM
-    cbhm_open_service(&cbhm_handle);
-#endif
+    if (nmt_check_agent_install())
+        nmt_init();
 }
 
 static void ime_app_exit_cb(void *user_data)
@@ -2691,27 +2587,18 @@ static void ime_app_exit_cb(void *user_data)
     if (!engine_loader_dbus_shutdown())
         LOGE("Failed to finalize dbus");
 
-#ifdef HAVE_CBHM
-    cbhm_close_service(cbhm_handle);
-    cbhm_handle = NULL;
-#endif
+    nmt_shutdown();
 }
 
-static void show_autofill_data(Ecore_IMF_Input_Hints input_hints)
+static void show_autofill_data()
 {
-    g_autofill_exist = false;
-    char *text = autofill_get_string(g_app_id.c_str(), g_resource_id.c_str(), input_hints);
+    ime_autofill_set_exist(false);
+    string autofill_string = ime_autofill_get_string();
 
-    if (text) {
-        g_autofill_string = string(text);
-        free(text);
-    } else {
-        g_autofill_string = string("");
-    }
-    SECURE_LOGD("autofill string : %s", g_autofill_string.c_str());
+    SECURE_LOGD("autofill string : %s", autofill_string.c_str());
 
-    if (g_autofill_string.length() > 0) {
-        g_autofill_exist = true;
+    if (!autofill_string.empty()) {
+        ime_autofill_set_exist(true);
 
         ise_app_candidate_show();
         update_candidate_table();
@@ -2756,12 +2643,12 @@ static void ime_app_show_cb(int ic, ime_context_h ime_ctx, void *user_data)
 
     g_ic = ic;
 
-    g_autofill_hint = iseContext.input_hint & ECORE_IMF_INPUT_HINT_AUTOFILL_MASK;
+    ime_autofill_set_hint(iseContext.input_hint & ECORE_IMF_INPUT_HINT_AUTOFILL_MASK);
 
-    LOGD("input hint : %x, autofill hint : %x\n", iseContext.input_hint, g_autofill_hint);
+    LOGD("input hint : %x, autofill hint : %x\n", iseContext.input_hint, ime_autofill_get_hint());
 
     // show autofill data
-    show_autofill_data((Ecore_IMF_Input_Hints)g_autofill_hint);
+    show_autofill_data();
 
     //g_ise_common->set_keyboard_ise_by_uuid(KEYBD_ISE_UUID);
 
@@ -2772,13 +2659,18 @@ static void ime_app_show_cb(int ic, ime_context_h ime_ctx, void *user_data)
 
     ise_reset_context(); // reset ISE
 
-    // if (iseContext.language == ECORE_IMF_INPUT_PANEL_LANG_ALPHABET) {
-    //     LOGD("alphabet");
-    //     ise_explictly_set_language(PRIMARY_LATIN_LANGUAGE_INDEX);
-    // }
-    // else {
-    //     LOGD("non-alphabet");
-    // }
+    KEYBOARD_STATE *keyboard_state = get_keyboard_state();
+
+    if (iseContext.language == ECORE_IMF_INPUT_PANEL_LANG_ALPHABET) {
+        LOGD("prefer latin");
+        if (keyboard_state)
+            keyboard_state->prefer_latin = TRUE;
+    }
+    else {
+        LOGD("prefer automatic");
+        if (keyboard_state)
+            keyboard_state->prefer_latin = FALSE;
+    }
 
     _context_layout = iseContext.layout;
     _context_layout_variation = iseContext.layout_variation;
@@ -2801,9 +2693,7 @@ static void ime_app_hide_cb(int ic, void *user_data)
 {
     LOGD("Enter\n");
     ise_hide();
-#ifdef HAVE_CBHM
-    g_set_mime_type = FALSE;
-#endif
+
     g_ic_smartreply = -1;
 }
 
@@ -2863,8 +2753,8 @@ static void ime_app_focus_in_cb(int context_id, void *user_data)
     LOGD("Enter\n");
     ise_focus_in(context_id);
     Candidate *candidate = get_candidate();
-    if (input_smartreply_get_reply_num() == 0 && g_softcandidate_show) {
-        if (candidate) {
+    if (input_smartreply_get_reply_num() == 0) {
+        if (candidate && candidate->get_visible()) {
             ise_app_candidate_hide();
             candidate->hide();
         }
@@ -2878,19 +2768,14 @@ static void ime_app_focus_out_cb(int context_id, void *user_data)
     LOGD("Enter\n");
     ise_focus_out(context_id);
     g_imdata_state = 0;
-#ifdef HAVE_CBHM
-    g_set_mime_type = FALSE;
-#endif
     input_smartreply_deinit();
     g_ic_smartreply = -1;
 
-    g_autofill_exist = false;
-    g_autofill_hint = 0;
-
-    g_app_id = string("");
-    g_resource_id = string("");
+    ime_autofill_set_exist(false);
+    ime_autofill_set_hint(0);
+    ime_autofill_set_app_id("");
+    ime_autofill_set_resource_id("");
 
-    g_autofill_string = string("");
     g_smartreply_strings.clear();
     g_lookup_table_strings.clear();
     g_softcandidate_string.clear();
@@ -2919,6 +2804,11 @@ static void ime_app_layout_set_cb(Ecore_IMF_Input_Panel_Layout layout, void *use
     engine_loader_set_layout(static_cast<uint32_t>(layout));
 }
 
+static void ime_app_input_hint_set_cb(Ecore_IMF_Input_Hints input_hint, void *user_data)
+{
+    LOGD("input hint=%u\n", input_hint);
+}
+
 static void ime_app_rotation_degree_changed_cb(int degree, void *user_data)
 {
     KEYBOARD_STATE *keyboard_state = get_keyboard_state();
@@ -2999,10 +2889,26 @@ static bool ime_app_process_key_event_cb(ime_key_code_e keycode, ime_key_mask_e
         key.dev_subclass = dev_subclass;
     }
 
-    if (keyboard_state->visible_state)
+    if (keyboard_state->visible_state) {
         ise_process_key_event(key, ret);
-    else
-        ret = FALSE;
+    } else {
+        if (key.code == IME_KEY_space && (key.mask & IME_KEY_MASK_SHIFT)) {
+            if (key.mask & IME_KEY_MASK_RELEASED) {
+                if (_language_manager.select_next_language()) {
+                    LANGUAGE_INFO *info = _language_manager.get_language_info(_language_manager.get_current_language());
+                    if (info) {
+                        notification_status_message_post(info->display_name.c_str());
+                    }
+                } else {
+                    LOGE("Failed to change language");
+                }
+            }
+
+            ret = TRUE;
+        } else {
+            ret = FALSE;
+        }
+    }
 
     if (dev_name)
         free(dev_name);
@@ -3078,128 +2984,138 @@ static void ime_app_lookup_table_changed_cb(Eina_List *list, void *user_data)
 }
 
 #ifdef _WEARABLE
+static sclu32 get_rotate_layout(ime_input_device_rotary_direction_e direction)
+{
+    KEYBOARD_STATE *keyboard_state = get_keyboard_state();
+    if (!keyboard_state) return ISE_LAYOUT_STYLE_NORMAL;
+
+    sclu32 new_layout = keyboard_state->layout;
+
+    if (direction == IME_INPUT_DEVICE_ROTARY_DIRECTION_CLOCKWISE) {
+        LOGD("CLOCKWISE\n");
+        switch (keyboard_state->layout) {
+            case ISE_LAYOUT_STYLE_NORMAL:
+            case ISE_LAYOUT_STYLE_EMAIL:
+            case ISE_LAYOUT_STYLE_URL:
+            case ISE_LAYOUT_STYLE_PASSWORD:
+                if (_context_layout == ISE_LAYOUT_STYLE_PASSWORD &&
+                        _context_layout_variation == ECORE_IMF_INPUT_PANEL_LAYOUT_PASSWORD_VARIATION_NUMBERONLY)
+                    ;   // PASSWORD NUMBER ONLY, do nothing
+                else
+                    new_layout = ISE_LAYOUT_STYLE_NUMBER;
+                break;
+            case ISE_LAYOUT_STYLE_NUMBER:
+                new_layout = ISE_LAYOUT_STYLE_HEX;
+                break;
+            case ISE_LAYOUT_STYLE_HEX:
+                if (_context_layout == ISE_LAYOUT_STYLE_EMAIL ||
+                        _context_layout == ISE_LAYOUT_STYLE_URL)
+                    new_layout = ISE_LAYOUT_STYLE_VOICE;
+                else if (_context_layout == ISE_LAYOUT_STYLE_PASSWORD)
+                    new_layout = _context_layout;
+                else
+                    new_layout = ISE_LAYOUT_STYLE_EMOTICON;
+                break;
+            case ISE_LAYOUT_STYLE_EMOTICON:
+                if (_context_layout == ISE_LAYOUT_STYLE_EMAIL ||
+                        _context_layout == ISE_LAYOUT_STYLE_URL ||
+                        _context_layout == ISE_LAYOUT_STYLE_PASSWORD)
+                    new_layout = _context_layout;
+                else
+                    new_layout = ISE_LAYOUT_STYLE_VOICE;
+                break;
+            case ISE_LAYOUT_STYLE_VOICE:
+                new_layout = ISE_LAYOUT_STYLE_NORMAL;
+                break;
+            default:
+                ;
+        }
+    } else if (direction == IME_INPUT_DEVICE_ROTARY_DIRECTION_COUNTER_CLOCKWISE) {
+        LOGD("COUNTER_CLOCKWISE\n");
+        switch (keyboard_state->layout) {
+            case ISE_LAYOUT_STYLE_NORMAL:
+            case ISE_LAYOUT_STYLE_EMAIL:
+            case ISE_LAYOUT_STYLE_URL:
+            case ISE_LAYOUT_STYLE_PASSWORD:
+                if (_context_layout == ISE_LAYOUT_STYLE_PASSWORD &&
+                        _context_layout_variation == ECORE_IMF_INPUT_PANEL_LAYOUT_PASSWORD_VARIATION_NUMBERONLY)
+                    ;   // PASSWORD NUMBER ONLY, do nothing
+                else if (_context_layout == ISE_LAYOUT_STYLE_PASSWORD)
+                    new_layout = ISE_LAYOUT_STYLE_HEX;
+                else
+                    new_layout = ISE_LAYOUT_STYLE_VOICE;
+                break;
+            case ISE_LAYOUT_STYLE_NUMBER:
+                if (_context_layout == ISE_LAYOUT_STYLE_EMAIL ||
+                        _context_layout == ISE_LAYOUT_STYLE_URL ||
+                        _context_layout == ISE_LAYOUT_STYLE_PASSWORD)
+                    new_layout = _context_layout;
+                else
+                    new_layout = ISE_LAYOUT_STYLE_NORMAL;
+                break;
+            case ISE_LAYOUT_STYLE_HEX:
+                new_layout = ISE_LAYOUT_STYLE_NUMBER;
+                break;
+            case ISE_LAYOUT_STYLE_EMOTICON:
+                new_layout = ISE_LAYOUT_STYLE_HEX;
+                break;
+            case ISE_LAYOUT_STYLE_VOICE:
+                if (_context_layout == ISE_LAYOUT_STYLE_EMAIL ||
+                        _context_layout == ISE_LAYOUT_STYLE_URL)
+                    new_layout = ISE_LAYOUT_STYLE_HEX;
+                else
+                    new_layout = ISE_LAYOUT_STYLE_EMOTICON;
+                break;
+            default:
+                ;
+        }
+    }
+
+    return new_layout;
+}
+
 static void ime_app_process_input_device_event_cb(ime_input_device_type_e device_type, ime_input_device_event_h device_event, void *user_data)
 {
     KEYBOARD_STATE *keyboard_state = get_keyboard_state();
     if (!keyboard_state) return;
+    if (device_type != IME_INPUT_DEVICE_TYPE_ROTARY) return;
 
-    if (device_type == IME_INPUT_DEVICE_TYPE_ROTARY) {
-        ime_input_device_rotary_direction_e direction;
-        if (IME_ERROR_NONE == ime_input_device_rotary_get_direction(device_event, &direction)) {
-            sclu32 new_layout = keyboard_state->layout;
-            if (direction == IME_INPUT_DEVICE_ROTARY_DIRECTION_CLOCKWISE) {
-                LOGD("CLOCKWISE\n");
-                switch (keyboard_state->layout) {
-                    case ISE_LAYOUT_STYLE_NORMAL:
-                    case ISE_LAYOUT_STYLE_EMAIL:
-                    case ISE_LAYOUT_STYLE_URL:
-                    case ISE_LAYOUT_STYLE_PASSWORD:
-                        if (_context_layout == ISE_LAYOUT_STYLE_PASSWORD &&
-                            _context_layout_variation == ECORE_IMF_INPUT_PANEL_LAYOUT_PASSWORD_VARIATION_NUMBERONLY)
-                            ;   // PASSWORD NUMBER ONLY, do nothing
-                        else
-                            new_layout = ISE_LAYOUT_STYLE_NUMBER;
-                        break;
-                    case ISE_LAYOUT_STYLE_NUMBER:
-                        new_layout = ISE_LAYOUT_STYLE_HEX;
-                        break;
-                    case ISE_LAYOUT_STYLE_HEX:
-                        if (_context_layout == ISE_LAYOUT_STYLE_EMAIL ||
-                            _context_layout == ISE_LAYOUT_STYLE_URL)
-                            new_layout = ISE_LAYOUT_STYLE_VOICE;
-                        else if (_context_layout == ISE_LAYOUT_STYLE_PASSWORD)
-                            new_layout = _context_layout;
-                        else
-                            new_layout = ISE_LAYOUT_STYLE_EMOTICON;
-                        break;
-                    case ISE_LAYOUT_STYLE_EMOTICON:
-                        if (_context_layout == ISE_LAYOUT_STYLE_EMAIL ||
-                            _context_layout == ISE_LAYOUT_STYLE_URL ||
-                            _context_layout == ISE_LAYOUT_STYLE_PASSWORD)
-                            new_layout = _context_layout;
-                        else
-                            new_layout = ISE_LAYOUT_STYLE_VOICE;
-                        break;
-                    case ISE_LAYOUT_STYLE_VOICE:
-                        new_layout = ISE_LAYOUT_STYLE_NORMAL;
-                        break;
-                    default:
-                        ;
-                }
-            } else if (direction == IME_INPUT_DEVICE_ROTARY_DIRECTION_COUNTER_CLOCKWISE) {
-                LOGD("COUNTER_CLOCKWISE\n");
-                switch (keyboard_state->layout) {
-                    case ISE_LAYOUT_STYLE_NORMAL:
-                    case ISE_LAYOUT_STYLE_EMAIL:
-                    case ISE_LAYOUT_STYLE_URL:
-                    case ISE_LAYOUT_STYLE_PASSWORD:
-                        if (_context_layout == ISE_LAYOUT_STYLE_PASSWORD &&
-                            _context_layout_variation == ECORE_IMF_INPUT_PANEL_LAYOUT_PASSWORD_VARIATION_NUMBERONLY)
-                            ;   // PASSWORD NUMBER ONLY, do nothing
-                        else if (_context_layout == ISE_LAYOUT_STYLE_PASSWORD)
-                            new_layout = ISE_LAYOUT_STYLE_HEX;
-                        else
-                            new_layout = ISE_LAYOUT_STYLE_VOICE;
-                        break;
-                    case ISE_LAYOUT_STYLE_NUMBER:
-                        if (_context_layout == ISE_LAYOUT_STYLE_EMAIL ||
-                            _context_layout == ISE_LAYOUT_STYLE_URL ||
-                            _context_layout == ISE_LAYOUT_STYLE_PASSWORD)
-                            new_layout = _context_layout;
-                        else
-                            new_layout = ISE_LAYOUT_STYLE_NORMAL;
-                        break;
-                    case ISE_LAYOUT_STYLE_HEX:
-                        new_layout = ISE_LAYOUT_STYLE_NUMBER;
-                        break;
-                    case ISE_LAYOUT_STYLE_EMOTICON:
-                        new_layout = ISE_LAYOUT_STYLE_HEX;
-                        break;
-                    case ISE_LAYOUT_STYLE_VOICE:
-                        if (_context_layout == ISE_LAYOUT_STYLE_EMAIL ||
-                            _context_layout == ISE_LAYOUT_STYLE_URL)
-                            new_layout = ISE_LAYOUT_STYLE_HEX;
-                        else
-                            new_layout = ISE_LAYOUT_STYLE_EMOTICON;
-                        break;
-                    default:
-                        ;
-                }
-            }
+    ime_input_device_rotary_direction_e direction;
+    if (IME_ERROR_NONE != ime_input_device_rotary_get_direction(device_event, &direction)) return;
 
-            CONFIG_VALUES *config_values = get_config_values();
-            if (check_is_tutorial_show() && config_values) {
-                read_ise_config_values();
-                if ((direction == IME_INPUT_DEVICE_ROTARY_DIRECTION_COUNTER_CLOCKWISE && !config_values->number_tutorial_enable && !config_values->symbol_tutorial_enable) ||
-                    (direction == IME_INPUT_DEVICE_ROTARY_DIRECTION_CLOCKWISE && config_values->symbol_tutorial_enable)) {
-                    new_layout = keyboard_state->layout;
-                } else if (direction == IME_INPUT_DEVICE_ROTARY_DIRECTION_COUNTER_CLOCKWISE && config_values->symbol_tutorial_enable) {
-                    ise_destroy_tutorial_mode_popup();
-                    config_values->symbol_tutorial_enable = false;
-                     write_ise_config_values();
-                } else if (direction == IME_INPUT_DEVICE_ROTARY_DIRECTION_CLOCKWISE && !config_values->number_tutorial_enable) {
-                    ise_destroy_tutorial_mode_popup();
-                    new_layout = ISE_LAYOUT_STYLE_NUMBER;
-                    if (!config_values->symbol_tutorial_enable) {
-                        ise_show_tutorial_mode_popup(new_layout);
-                        config_values->symbol_tutorial_enable = true;
-                         write_ise_config_values();
-                    }
-                }
+    sclu32 new_layout = get_rotate_layout(direction);
+
+    CONFIG_VALUES *config_values = get_config_values();
+    if (check_is_tutorial_show() && config_values) {
+        read_ise_config_values();
+        if ((direction == IME_INPUT_DEVICE_ROTARY_DIRECTION_COUNTER_CLOCKWISE && !config_values->number_tutorial_enable && !config_values->symbol_tutorial_enable) ||
+                (direction == IME_INPUT_DEVICE_ROTARY_DIRECTION_CLOCKWISE && config_values->symbol_tutorial_enable)) {
+            new_layout = keyboard_state->layout;
+        } else if (direction == IME_INPUT_DEVICE_ROTARY_DIRECTION_COUNTER_CLOCKWISE && config_values->symbol_tutorial_enable) {
+            ise_destroy_tutorial_mode_popup();
+            config_values->symbol_tutorial_enable = false;
+            write_ise_config_values();
+        } else if (direction == IME_INPUT_DEVICE_ROTARY_DIRECTION_CLOCKWISE && !config_values->number_tutorial_enable) {
+            ise_destroy_tutorial_mode_popup();
+            new_layout = ISE_LAYOUT_STYLE_NUMBER;
+            if (!config_values->symbol_tutorial_enable) {
+                ise_show_tutorial_mode_popup(new_layout);
+                config_values->symbol_tutorial_enable = true;
+                write_ise_config_values();
             }
+        }
+    }
 
-            if (new_layout != keyboard_state->layout && new_layout < ISE_LAYOUT_STYLE_MAX) {
-                keyboard_state->need_reset = TRUE;
-                keyboard_state->layout = new_layout;
+    if (new_layout != keyboard_state->layout && new_layout < ISE_LAYOUT_STYLE_MAX) {
+        keyboard_state->need_reset = TRUE;
+        keyboard_state->layout = new_layout;
 
-                if (keyboard_state->visible_state) {
-                    _reset_multitap_state();
-                    if (config_values) {
-                        _language_manager.reset_language(config_values->selected_language.c_str());
-                    }
-                    ise_show(keyboard_state->ic);
-                }
+        if (keyboard_state->visible_state) {
+            _reset_multitap_state();
+            if (config_values) {
+                _language_manager.reset_language(config_values->selected_language.c_str());
             }
+            ise_show(keyboard_state->ic);
         }
     }
 }
@@ -3227,20 +3143,6 @@ static void ime_app_prediction_hint_set_cb(const char *prediction_hint, void *us
 static void ime_app_mime_type_set_request_cb(const char *mime_types, void *user_data)
 {
     LOGD("mime type : %s\n", mime_types);
-
-#ifdef HAVE_CBHM
-    g_set_mime_type = TRUE;
-    cbhm_sel_type = 0;
-    string str(mime_types), text_key = "text/", image_key = "image/";
-
-    if (str.find(text_key) != string::npos)
-        cbhm_sel_type |= CBHM_SEL_TYPE_TEXT;
-
-    if (str.find(image_key) != string::npos)
-        cbhm_sel_type |= CBHM_SEL_TYPE_IMAGE;
-
-    LOGD("cbhm_sel_type=0x%x", cbhm_sel_type);
-#endif
 }
 
 static void ime_app_prediction_hint_data_set_cb(const char *key, const char *value, void *user_data)
@@ -3248,9 +3150,9 @@ static void ime_app_prediction_hint_data_set_cb(const char *key, const char *val
     SECURE_LOGD("key : %s, value : %s\n", key, value);
 
     if (string(key) == "appid")
-        g_app_id = string(value ? value : "");
+        ime_autofill_set_app_id(value);
     else if (string(key) == "res_id")
-        g_resource_id = string(value ? value : "");
+        ime_autofill_set_resource_id(value);
 }
 
 static void ime_app_autocapital_type_set_cb(uint32_t type, void *user_data)
@@ -3357,6 +3259,7 @@ EXPORTED void ime_app_main(int argc, char **argv)
     ime_event_set_imdata_set_cb(ime_app_imdata_set_cb, NULL);
     ime_event_set_process_key_event_cb(ime_app_process_key_event_cb, NULL);
     ime_event_set_process_key_event_with_imengine_cb(ime_app_process_key_event_with_imengine_cb, NULL);
+    ime_event_set_input_hint_set_cb(ime_app_input_hint_set_cb, NULL);
 
     ime_event_set_candidate_show_cb(ime_app_candidate_show_cb, NULL);
     ime_event_set_candidate_hide_cb(ime_app_candidate_hide_cb, NULL);