2 * Copyright (c) 2014 Samsung Electronics Co., Ltd. All rights reserved.
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
8 * http://www.apache.org/licenses/LICENSE-2.0
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
17 #include "input_method_setting_list.h"
18 #include "input_method_setting_list_ui.h"
19 #include "input_method_setting_list_popup_view.h"
24 #include <tzplatform_config.h>
25 #include <inputmethod_manager.h>
26 #include <package_manager.h>
28 #include "isf_control.h"
30 #define IM_SETTING_LIST_PACKAGE PACKAGE
31 #define IM_SETTING_LIST_LOCALE_DIR tzplatform_mkpath(TZ_SYS_RO_APP, PACKAGE_NAME"/res/locale")
32 #define IM_SETTING_LIST_TITLE "IDS_IME_BODY_KEYBOARD"
33 #define IM_SETTING_LIST_KEYBOARD_HEADER "IDS_ST_HEADER_KEYBOARDS"
34 #define IM_SETTING_LIST_POPUP_TITLE "IDS_ST_BODY_ATTENTION"
35 #define IM_SETTING_LIST_POPUP_CANCEL "IDS_COM_SK_CANCEL_ABB"
36 #define IM_SETTING_LIST_POPUP_ENABLE "IDS_ST_BUTTON_ENABLE"
37 #define IM_SETTING_LIST_VIRTUAL_KEYBOARD "IDS_ST_HEADER_VIRTUAL_KEYBOARD"
38 #define IM_SETTING_LIST_DEFAULT_KEYBOARD "IDS_ST_HEADER_DEFAULT_KEYBOARD_ABB"
39 #define IM_SETTING_LIST_KEYBOARD_SETTING "IDS_IME_HEADER_KEYBOARD_SETTINGS_ABB"
40 #define IM_SETTING_LIST_TURNON_KEYBOARD "IDS_ST_BUTTON_TURN_ON_KEYBOARD_ABB"
41 #define IM_SETTING_LIST_TURNON "IDS_ST_BUTTON_TURN_ON_ABB3"
42 #define IM_SETTING_LIST_POPUP_TEXT dgettext(PACKAGE, "IDS_ST_POP_THIS_INPUT_METHOD_MAY_BE_ABLE_TO_COLLECT_ALL_THE"\
43 "_TEXT_YOU_TYPE_INCLUDING_PERSONAL_DATA_LIKE_PASSWORDS_AND"\
44 "_CREDIT_CARD_NUMBERS_MSG")
47 typedef struct list_item_text_s
53 typedef struct popup_cb_data_s
59 typedef struct gen_item_data_s
61 Elm_Object_Item *gen_item;
65 typedef struct _Item_Data
68 Elm_Object_Item *item;
71 class ime_info_compare
74 bool operator()(const ime_info_s &first, const ime_info_s &sec)
76 return (strcasecmp(first.label, sec.label) < 0);
80 typedef void (*popup_ok_cb)(void *data, Evas_Object *obj, void *event_info);
81 typedef void (*popup_cancel_cb)(void *data, Evas_Object *obj, void *event_info);
83 static std::vector<ime_info_s> g_ime_info_list;
84 static Elm_Genlist_Item_Class *itc_im_list_keyboard_list = NULL;
85 static Elm_Genlist_Item_Class *itc_im_list_group = NULL;
86 static Elm_Genlist_Item_Class *itc_im_list_item = NULL;
87 static Elm_Genlist_Item_Class *itc_im_list_item_one_line = NULL;
88 static Elm_Genlist_Item_Class *itc_im_list_title = NULL;
89 static int g_active_ime_index = -1;
90 static list_item_text item_text[2];
91 static std::vector<gen_item_data> g_gen_item_data;
92 static package_manager_h pkgmgr = NULL;
94 void im_setting_list_update_window(void *data);
96 static void im_setting_list_text_domain_set(void)
98 bindtextdomain(IM_SETTING_LIST_PACKAGE, IM_SETTING_LIST_LOCALE_DIR);
99 textdomain(IM_SETTING_LIST_PACKAGE);
103 im_setting_list_main_window_create(const char *name, int app_type)
105 Evas_Object *eo = NULL;
106 eo = elm_win_add(NULL, name, ELM_WIN_BASIC);
108 elm_win_title_set(eo, name);
109 elm_win_borderless_set(eo, EINA_TRUE);
110 elm_win_alpha_set(eo, EINA_FALSE);
111 elm_win_conformant_set(eo, EINA_TRUE);
112 elm_win_autodel_set(eo, EINA_TRUE);
113 if (app_type != APP_TYPE_SETTING_NO_ROTATION) {
114 int rots[4] = {0, 90, 180, 270};
115 elm_win_wm_rotation_available_rotations_set(eo, rots, 4);
121 static Evas_Object* im_setting_list_bg_create(Evas_Object *parent)
124 if (parent == NULL) return NULL;
125 bg = elm_bg_add(parent);
126 evas_object_size_hint_weight_set(bg, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
127 elm_win_resize_object_add(parent, bg);
128 evas_object_show(bg);
132 static void im_setting_list_sort_ime_info(std::vector<ime_info_s> &preinstall, std::vector<ime_info_s> &user)
134 std::sort(preinstall.begin(), preinstall.end(), ime_info_compare());
135 std::sort(user.begin(), user.end(), ime_info_compare());
136 for (unsigned int i = 0; i < preinstall.size(); ++i)
138 g_ime_info_list.push_back(preinstall[i]);
140 for (unsigned int i = 0; i < user.size(); ++i)
142 g_ime_info_list.push_back(user[i]);
146 static void im_setting_list_load_ime_info(void)
148 std::vector<ime_info_s> ime_info_list_preinstall;
149 std::vector<ime_info_s> ime_info_list_user;
150 ime_info_s *info = NULL;
151 g_ime_info_list.clear();
152 int cnt = isf_control_get_all_ime_info(&info);
154 for (int i = 0; i < cnt; ++i)
156 SECURE_LOGD("%s %s %d %d %d\n", info[i].appid, info[i].label, info[i].is_enabled, info[i].is_preinstalled, info[i].has_option);
157 if (info[i].is_preinstalled) {
158 ime_info_list_preinstall.push_back(info[i]);
160 ime_info_list_user.push_back(info[i]);
165 LOGW("isf_control_get_all_ime_info failed\n");
167 im_setting_list_sort_ime_info(ime_info_list_preinstall, ime_info_list_user);
170 static int im_setting_list_get_active_ime_index(void)
172 char *active_ime_appid = NULL;
174 int ret = ime_manager_get_active_ime(&active_ime_appid);
175 if (ret == IME_MANAGER_ERROR_NONE)
176 LOGD("get active ime : %s\n", active_ime_appid);
178 LOGW("Failed to get active ime. error : %d\n", ret);
180 std::vector<ime_info_s>::iterator iter = g_ime_info_list.begin();
181 std::vector<ime_info_s>::iterator end = g_ime_info_list.end();
182 for (; iter != end; ++iter)
184 if (active_ime_appid && (!strcmp(active_ime_appid, iter->appid)))
189 if (active_ime_appid)
191 free(active_ime_appid);
193 return (iter - g_ime_info_list.begin());
197 im_setting_list_check_popup_ok_cb(void *data, Evas_Object *obj, void *event_info)
199 popup_cb_data *cb_data = (popup_cb_data *)data;
202 int index = (int)reinterpret_cast<long>(cb_data->data);
203 if (index < 0 || index >= (int)g_ime_info_list.size()) {
204 LOGW("Wrong value. index : %d, g_ime_info_list.size() : %zu\n", index, g_ime_info_list.size());
207 Eina_Bool state = EINA_FALSE;
208 state = g_gen_item_data[index].chk_status;
209 if (isf_control_set_enable_ime(g_ime_info_list[index].appid, state) != 0)
210 LOGW("Failed to set enable ime : %s\n", g_ime_info_list[index].appid);
212 evas_object_del(cb_data->popup);
216 im_setting_list_check_popup_cancel_cb(void *data, Evas_Object *obj, void *event_info)
218 popup_cb_data *cb_data = (popup_cb_data *)data;
221 int index = (int)reinterpret_cast<long>(cb_data->data);
222 if (index < 0 || index >= (int)g_ime_info_list.size()) {
223 LOGW("Wrong value. index : %d, g_ime_info_list.size() : %zu\n", index, g_ime_info_list.size());
227 Eina_Bool state = g_gen_item_data[index].chk_status;
228 if (isf_control_set_enable_ime(g_ime_info_list[index].appid, !state) == 0) {
229 g_gen_item_data[index].chk_status = !state;
230 elm_genlist_item_update(g_gen_item_data[index].gen_item);
232 LOGW("Failed to set enable ime : %s\n", g_ime_info_list[index].appid);
235 evas_object_del(cb_data->popup);
238 static void _popup_back_cb(void *data, Evas_Object *obj, void *event_info)
240 eext_object_event_callback_del(obj, EEXT_CALLBACK_BACK, _popup_back_cb);
241 popup_cb_data *cb_data = (popup_cb_data *)data;
244 int index = (int)reinterpret_cast<long>(cb_data->data);
245 if (index < 0 || index >= (int)g_ime_info_list.size()) {
246 LOGW("Wrong value. index : %d, g_ime_info_list.size() : %zu\n", index, g_ime_info_list.size());
250 if (g_gen_item_data[index].chk_status) {
251 im_setting_list_check_popup_cancel_cb(data, NULL, NULL);
253 evas_object_del(cb_data->popup);
257 static void _popup_del_cb(void *data, Evas *e, Evas_Object *obj, void *event_info)
259 popup_cb_data *cb_data = (popup_cb_data *)data;
266 static void set_popup_message(Evas_Object *obj, int index)
268 char chFormatMsg[255] = {'\0'};
269 char chPopupMsg[255] = {'\0'};
270 snprintf(chFormatMsg, sizeof(chFormatMsg), "%s", IM_SETTING_LIST_POPUP_TEXT);
271 snprintf(chPopupMsg, sizeof(chPopupMsg), chFormatMsg, g_ime_info_list[index].label);
272 elm_object_text_set(obj, chPopupMsg);
275 static void popup_lang_changed(void *data, Evas_Object *obj, void *event_info)
277 int index = (int)data;
278 set_popup_message(obj, index);
281 static void im_setting_list_show_popup(void *data, Evas_Object *obj, popup_ok_cb ime_setting_list_ok_callback, popup_cancel_cb ime_setting_list_cancel_callback)
283 int index = (int)reinterpret_cast<long>(data);
284 if (index < 0 || index >= (int)g_ime_info_list.size()) {
285 LOGW("Wrong value. index : %d, g_ime_info_list.size() : %zu\n", index, g_ime_info_list.size());
289 Evas_Object *top_widget = elm_object_top_widget_get(obj);
290 Evas_Object *popup = elm_popup_add(top_widget);
291 elm_popup_align_set(popup, ELM_NOTIFY_ALIGN_FILL, 1.0);
292 elm_object_domain_translatable_part_text_set(popup, "title,text", PACKAGE, IM_SETTING_LIST_TURNON_KEYBOARD);
293 evas_object_smart_callback_add(popup, "language,changed", popup_lang_changed, (void *)index);
295 set_popup_message(popup, index);
297 popup_cb_data *cb_data = new popup_cb_data;
298 cb_data->popup = popup;
299 cb_data->data = data;
301 Evas_Object *btn_cancel = elm_button_add(popup);
302 elm_object_domain_translatable_text_set(btn_cancel, PACKAGE, IM_SETTING_LIST_POPUP_CANCEL);
303 elm_object_part_content_set(popup, "button1", btn_cancel);
304 evas_object_smart_callback_add(btn_cancel, "clicked", ime_setting_list_cancel_callback, cb_data);
306 Evas_Object *btn_ok = elm_button_add(popup);
307 elm_object_domain_translatable_text_set(btn_ok, PACKAGE, IM_SETTING_LIST_TURNON);
308 elm_object_part_content_set(popup, "button2", btn_ok);
309 evas_object_smart_callback_add(btn_ok, "clicked", ime_setting_list_ok_callback, cb_data);
311 eext_object_event_callback_add(popup, EEXT_CALLBACK_BACK, _popup_back_cb, cb_data);
312 evas_object_event_callback_add(popup, EVAS_CALLBACK_DEL, _popup_del_cb, cb_data);
313 evas_object_show(popup);
316 static void im_setting_list_check_button_change_cb(void *data, Evas_Object *obj, void *event_info)
318 /*save the checked ime*/
319 int index = (int)reinterpret_cast<long>(data);
320 if (index < 0 || index >= (int)g_ime_info_list.size()) {
321 LOGW("Wrong value. index : %d, g_ime_info_list.size() : %zu\n", index, g_ime_info_list.size());
325 Eina_Bool state = g_gen_item_data[index].chk_status;
328 if (isf_control_set_enable_ime(g_ime_info_list[index].appid, state) != 0)
329 LOGW("Failed to set enable ime : %s\n", g_ime_info_list[index].appid);
331 im_setting_list_show_popup(data, obj, im_setting_list_check_popup_ok_cb, im_setting_list_check_popup_cancel_cb);
336 im_setting_list_popup_ok_cb(void *data, Evas_Object *obj, void *event_info)
338 popup_cb_data *cb_data = (popup_cb_data *)data;
341 int index = (int)reinterpret_cast<long>(cb_data->data);
342 if (index < 0 || index >= (int)g_ime_info_list.size()) {
343 LOGW("Wrong value. index : %d, g_ime_info_list.size() : %zu\n", index, g_ime_info_list.size());
347 Eina_Bool state = g_gen_item_data[index].chk_status;
348 if (isf_control_set_enable_ime(g_ime_info_list[index].appid, !state) == 0) {
349 g_gen_item_data[index].chk_status = !state;
350 Evas_Object *ck = elm_object_item_part_content_get(g_gen_item_data[index].gen_item, "elm.swallow.end");
352 ck = elm_object_item_part_content_get(g_gen_item_data[index].gen_item, "elm.icon");
356 elm_object_signal_emit(ck, "elm,activate,check,on", "elm");
357 elm_check_state_set(ck, !state);
360 LOGW("Failed to set enable ime : %s\n", g_ime_info_list[index].appid);
362 evas_object_del(cb_data->popup);
366 im_setting_list_popup_cancel_cb(void *data, Evas_Object *obj, void *event_info)
368 popup_cb_data *cb_data = (popup_cb_data *)data;
371 evas_object_del(cb_data->popup);
374 static void im_setting_list_item_sel_cb(void *data, Evas_Object *obj, void *event_info)
376 Elm_Object_Item *item = (Elm_Object_Item *)event_info;
377 elm_genlist_item_selected_set(item, EINA_FALSE);
379 int index = (int)reinterpret_cast<long>(data);
380 if (index < 0 || index >= (int)g_ime_info_list.size()) {
381 LOGW("Wrong value. index : %d, g_ime_info_list.size() : %zu\n", index, g_ime_info_list.size());
385 if (g_ime_info_list[index].is_preinstalled || (index == g_active_ime_index))
390 Evas_Object *ck = elm_object_item_part_content_get(item, "elm.swallow.end");
392 ck = elm_object_item_part_content_get(item, "elm.icon");
394 Eina_Bool state = g_gen_item_data[index].chk_status;
397 if (isf_control_set_enable_ime(g_ime_info_list[index].appid, !state) == 0) {
399 elm_object_signal_emit(ck, "elm,activate,check,off", "elm");
400 elm_check_state_set(ck, !state);
402 g_gen_item_data[index].chk_status = !state;
404 LOGW("Failed to set enable ime : %s\n", g_ime_info_list[index].appid);
407 im_setting_list_show_popup(data, obj, im_setting_list_popup_ok_cb, im_setting_list_popup_cancel_cb);
411 static void im_setting_list_set_default_keyboard_item_sel_cb(void *data, Evas_Object *obj, void *event_info)
413 Elm_Object_Item *item = (Elm_Object_Item *)event_info;
415 elm_genlist_item_selected_set(item, EINA_FALSE);
416 im_setting_list_popup_view_create(data);
419 static void im_setting_list_keyboard_setting_item_sel_cb(void *data, Evas_Object *obj, void *event_info)
421 appdata *ad = (appdata *)data;
422 if (ad->app_state == APP_STATE_PAUSE)
425 Elm_Object_Item *item = (Elm_Object_Item *)event_info;
426 elm_genlist_item_selected_set(item, EINA_FALSE);
427 isf_control_open_ime_option_window();
431 _elm_win_resize_cb(void *data, Evas *e, Evas_Object *obj, void *event_info)
433 Evas_Coord w = -1, h = -1;
434 Evas_Object *conform = (Evas_Object*)data;
436 evas_object_geometry_get(obj, NULL, NULL, &w, &h);
437 if (w > 0 && h > 0) {
438 evas_object_resize(conform, w, h);
443 static Evas_Object *im_setting_list_conform_create(Evas_Object *parentWin)
445 Evas_Object *conform = elm_conformant_add(parentWin);
446 elm_win_indicator_mode_set(parentWin, ELM_WIN_INDICATOR_SHOW);
447 elm_win_indicator_opacity_set(parentWin, ELM_WIN_INDICATOR_OPAQUE);
448 evas_object_size_hint_weight_set(conform, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
449 evas_object_size_hint_align_set(conform, EVAS_HINT_FILL, EVAS_HINT_FILL);
451 Evas_Object *bg = elm_bg_add(conform);
452 elm_object_style_set(bg, "indicator/headerbg");
453 elm_object_part_content_set(conform, "elm.swallow.indicator_bg", bg);
454 evas_object_show(bg);
456 Evas_Coord w = -1, h = -1;
457 elm_win_screen_size_get(parentWin, NULL, NULL, &w, &h);
458 if (w > 0 && h > 0) {
459 evas_object_resize(conform, w, h);
461 evas_object_event_callback_add(parentWin, EVAS_CALLBACK_RESIZE, _elm_win_resize_cb, conform);
462 evas_object_show(conform);
466 static Evas_Object *im_setting_list_naviframe_create(Evas_Object* parent)
468 Evas_Object *naviframe = elm_naviframe_add(parent);
469 elm_naviframe_prev_btn_auto_pushed_set(naviframe, EINA_TRUE);
470 eext_object_event_callback_add(naviframe, EEXT_CALLBACK_BACK, eext_naviframe_back_cb, NULL);
471 evas_object_size_hint_weight_set(naviframe, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
472 evas_object_size_hint_align_set(naviframe, EVAS_HINT_FILL, EVAS_HINT_FILL);
473 elm_object_part_content_set(parent, "elm.swallow.content", naviframe);
474 evas_object_show(naviframe);
478 static void gl_lang_changed(void *data, Evas_Object *obj, void *event_info)
480 /* Reload ime list for getting translated IME name */
481 im_setting_list_load_ime_info();
483 /* Set translated active IME name */
484 snprintf(item_text[0].sub_text, sizeof(item_text[0].sub_text), "%s", g_ime_info_list[g_active_ime_index].label);
486 elm_genlist_realized_items_update(obj);
489 static Evas_Object *im_setting_list_genlist_create(appdata *ad)
491 Evas_Object *genlist = elm_genlist_add(ad->naviframe);
492 elm_genlist_mode_set(genlist, ELM_LIST_COMPRESS);
494 /* Circle Surface Creation */
495 if (ad->circle_surface == NULL)
496 ad->circle_surface = eext_circle_surface_conformant_add(ad->conform);
497 ad->main_circle_genlist = eext_circle_object_genlist_add(genlist, ad->circle_surface);
498 eext_rotary_object_event_activated_set(ad->main_circle_genlist, EINA_TRUE);
500 evas_object_smart_callback_add(genlist, "language,changed", gl_lang_changed, NULL);
501 evas_object_show(genlist);
505 static char *im_setting_list_genlist_group_label_get(void *data, Evas_Object *obj, const char *part)
507 char *text = (char *)data;
510 if (!strcmp(part, "elm.text")) {
511 return strdup(dgettext(PACKAGE, text));
517 im_setting_list_genlist_keyboard_list_item_del(void *data, Evas_Object *obj)
519 Item_Data *id = (Item_Data *)data;
523 static char *im_setting_list_genlist_keyboard_list_item_label_get(void *data, Evas_Object *obj, const char *part)
525 Item_Data *id = (Item_Data *)data;
526 int index = id->index;
527 if (index < 0 || index >= (int)g_ime_info_list.size()) {
528 LOGW("Wrong value. index : %d, g_ime_info_list.size() : %zu\n", index, g_ime_info_list.size());
532 if (!strcmp(part, "elm.text.main.left.top") ||
533 !strcmp(part, "elm.text.main.left") ||
534 !strcmp(part, "elm.text.main") ||
535 !strcmp(part, "elm.text") ||
536 !strcmp(part, "elm.text.1")) {
537 return strdup(g_ime_info_list[index].label);
543 static char *im_setting_list_genlist_title_label_get(void *data, Evas_Object *obj, const char *part)
545 if (!strcmp(part, "elm.text")) {
546 return strdup(dgettext(PACKAGE, IM_SETTING_LIST_TITLE));
552 static Evas_Object *im_setting_list_genlist_keyboard_list_item_icon_get(void *data, Evas_Object *obj, const char *part)
554 Item_Data *id = (Item_Data *)data;
555 int index = id->index;
557 if (index < 0 || index >= (int)g_ime_info_list.size()) {
558 LOGW("Wrong value. index : %d, g_ime_info_list.size() : %zu\n", index, g_ime_info_list.size());
562 if (!strcmp(part, "elm.swallow.end") ||
563 !strcmp(part, "elm.icon")) {
564 Evas_Object *ck = elm_check_add(obj);
565 elm_object_style_set(ck, "on&off");
566 elm_check_state_set(ck, g_gen_item_data[index].chk_status);
567 elm_object_disabled_set(ck, g_ime_info_list[index].is_preinstalled || (index == g_active_ime_index));
569 elm_object_disabled_set(ck, EINA_TRUE);
571 evas_object_propagate_events_set(ck, EINA_FALSE);
572 evas_object_size_hint_align_set(ck, EVAS_HINT_FILL, EVAS_HINT_FILL);
573 evas_object_size_hint_weight_set(ck, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
574 elm_check_state_pointer_set(ck, (Eina_Bool *)(&(g_gen_item_data[index].chk_status)));
575 evas_object_pass_events_set(ck, EINA_TRUE);
576 evas_object_smart_callback_add(ck, "changed", im_setting_list_check_button_change_cb, (void *)(unsigned long int)(index));
577 evas_object_show(ck);
579 elm_atspi_accessible_relationship_append(ck, ELM_ATSPI_RELATION_CONTROLLED_BY, id->item);
580 elm_atspi_accessible_relationship_append(id->item, ELM_ATSPI_RELATION_CONTROLLER_FOR, ck);
581 elm_atspi_accessible_relationship_append(id->item, ELM_ATSPI_RELATION_DESCRIBED_BY, ck);
588 static char *im_setting_list_genlist_item_label_get(void *data, Evas_Object *obj, const char *part)
590 list_item_text *item_text = (list_item_text *)data;
594 if (!strcmp(part, "elm.text.main.left.top") ||
595 !strcmp(part, "elm.text.main.left") ||
596 !strcmp(part, "elm.text.main") ||
597 !strcmp(part, "elm.text")) {
598 return strdup(dgettext(PACKAGE, item_text->main_text));
600 if (!strcmp(part, "elm.text.sub") ||
601 !strcmp(part, "elm.text.sub.left.bottom") ||
602 !strcmp(part, "elm.text.multiline") ||
603 !strcmp(part, "elm.text.1") ||
604 !strcmp(part, "elm.text.2")) {
605 return strdup(dgettext(PACKAGE, item_text->sub_text));
610 static char *im_setting_list_genlist_item_one_line_label_get(void *data, Evas_Object *obj, const char *part)
612 list_item_text *item_text = (list_item_text *)data;
615 if (!strcmp(part, "elm.text.main.left.top") ||
616 !strcmp(part, "elm.text.main.left") ||
617 !strcmp(part, "elm.text.main") ||
618 !strcmp(part, "elm.text") ||
619 !strcmp(part, "elm.text.1")) {
620 return strdup(dgettext(PACKAGE, item_text->main_text));
625 static void im_setting_list_genlist_item_class_create(int app_type)
627 if (NULL == itc_im_list_group)
629 itc_im_list_group = elm_genlist_item_class_new();
630 if (itc_im_list_group)
633 itc_im_list_group->item_style = "groupindex";
635 itc_im_list_group->item_style = "group_index";
637 itc_im_list_group->func.text_get = im_setting_list_genlist_group_label_get;
638 itc_im_list_group->func.content_get = NULL;
639 itc_im_list_group->func.state_get = NULL;
640 itc_im_list_group->func.del = NULL;
644 if (NULL == itc_im_list_keyboard_list)
646 itc_im_list_keyboard_list = elm_genlist_item_class_new();
647 if (itc_im_list_keyboard_list)
650 itc_im_list_keyboard_list->item_style = "1text.1icon.1";
652 itc_im_list_keyboard_list->item_style = "type1";
654 itc_im_list_keyboard_list->func.text_get = im_setting_list_genlist_keyboard_list_item_label_get;
655 itc_im_list_keyboard_list->func.content_get = im_setting_list_genlist_keyboard_list_item_icon_get;
656 itc_im_list_keyboard_list->func.state_get = NULL;
657 itc_im_list_keyboard_list->func.del = im_setting_list_genlist_keyboard_list_item_del;
662 if (NULL == itc_im_list_title)
664 itc_im_list_title = elm_genlist_item_class_new();
665 if (itc_im_list_title)
667 itc_im_list_title->item_style = "title";
668 itc_im_list_title->func.text_get = im_setting_list_genlist_title_label_get;
673 if (app_type == APP_TYPE_SETTING || app_type == APP_TYPE_SETTING_NO_ROTATION)
675 if (NULL == itc_im_list_item)
677 itc_im_list_item = elm_genlist_item_class_new();
678 if (itc_im_list_item)
681 itc_im_list_item->item_style = "2text";
683 itc_im_list_item->item_style = "type1";
685 itc_im_list_item->func.text_get = im_setting_list_genlist_item_label_get;
686 itc_im_list_item->func.content_get = NULL;
687 itc_im_list_item->func.state_get = NULL;
688 itc_im_list_item->func.del = NULL;
692 if (NULL == itc_im_list_item_one_line)
694 itc_im_list_item_one_line = elm_genlist_item_class_new();
695 if (itc_im_list_item_one_line)
698 itc_im_list_item_one_line->item_style = "1text";
700 itc_im_list_item_one_line->item_style = "type1";
702 itc_im_list_item_one_line->func.text_get = im_setting_list_genlist_item_one_line_label_get;
703 itc_im_list_item_one_line->func.content_get = NULL;
704 itc_im_list_item_one_line->func.state_get = NULL;
705 itc_im_list_item_one_line->func.del = NULL;
711 static void im_setting_list_add_ime(void *data) {
712 appdata *ad = (appdata *)data;
715 im_setting_list_genlist_item_class_create(ad->app_type);
717 if (NULL != ad->genlist)
719 elm_genlist_clear(ad->genlist);
722 g_active_ime_index = im_setting_list_get_active_ime_index();
723 if (g_active_ime_index < 0 || g_active_ime_index >= (int)g_ime_info_list.size()) {
724 LOGW("Wrong value. g_active_ime_index : %d, g_ime_info_list.size() : %zu\n", g_active_ime_index, g_ime_info_list.size());
729 /* Add scrollable title area in wearable profile */
730 elm_genlist_item_append(ad->genlist, itc_im_list_title, NULL, NULL, ELM_GENLIST_ITEM_NONE, NULL, NULL);
733 memset(&item_text, 0, sizeof(item_text));
734 if (ad->app_type == APP_TYPE_SETTING || ad->app_type == APP_TYPE_SETTING_NO_ROTATION)
736 /* Default keyboard selector */
737 snprintf(item_text[0].main_text, sizeof(item_text[0].main_text), "%s", IM_SETTING_LIST_DEFAULT_KEYBOARD);
738 snprintf(item_text[0].sub_text, sizeof(item_text[0].sub_text), "%s", g_ime_info_list[g_active_ime_index].label);
739 Elm_Object_Item *item = elm_genlist_item_append(ad->genlist,
741 (void *)&item_text[0],
743 ELM_GENLIST_ITEM_NONE,
744 im_setting_list_set_default_keyboard_item_sel_cb,
747 elm_object_item_domain_text_translatable_set(item, PACKAGE, EINA_TRUE);
750 if (g_ime_info_list.size() <= 1) {
751 LOGD("The number of IME : %zu\n", g_ime_info_list.size());
752 elm_object_item_disabled_set(item, EINA_TRUE);
756 /* Keyboard settings */
757 snprintf(item_text[1].main_text, sizeof(item_text[1].main_text), "%s", IM_SETTING_LIST_KEYBOARD_SETTING);
758 item = elm_genlist_item_append(ad->genlist,
759 itc_im_list_item_one_line,
760 (void *)&item_text[1],
762 ELM_GENLIST_ITEM_NONE,
763 im_setting_list_keyboard_setting_item_sel_cb,
765 elm_object_item_domain_text_translatable_set(item, PACKAGE, EINA_TRUE);
767 elm_object_item_disabled_set(item, !(g_ime_info_list[g_active_ime_index].has_option));
770 /* Keyboards group */
771 Elm_Object_Item *group_header_item = NULL;
772 group_header_item = elm_genlist_item_append(ad->genlist,
774 IM_SETTING_LIST_KEYBOARD_HEADER,
776 ELM_GENLIST_ITEM_GROUP,
779 elm_genlist_item_select_mode_set(group_header_item, ELM_OBJECT_SELECT_MODE_DISPLAY_ONLY);
780 elm_object_item_domain_text_translatable_set(group_header_item, PACKAGE, EINA_TRUE);
785 if (ad->app_type == APP_TYPE_NORMAL)
788 Item_Data *id = NULL;
791 int info_list_size = g_ime_info_list.size();
792 for (int i = 0; i < info_list_size; i++) {
793 gen_item_data item_data;
795 if (g_ime_info_list[i].is_preinstalled || (i == g_active_ime_index)) {
796 item_data.chk_status = EINA_TRUE;
798 item_data.chk_status = g_ime_info_list[i].is_enabled;
800 g_gen_item_data.push_back(item_data);
802 id = (Item_Data *)calloc(sizeof(Item_Data), 1);
806 id->item = elm_genlist_item_append(ad->genlist,
807 itc_im_list_keyboard_list,
810 ELM_GENLIST_ITEM_NONE,
811 im_setting_list_item_sel_cb,
812 (void *)(unsigned long int)(i));
814 if (g_ime_info_list[i].is_preinstalled || (i == g_active_ime_index)) {
815 elm_object_item_disabled_set(id->item, EINA_TRUE);
818 g_gen_item_data[i].gen_item = id->item;
824 im_setting_list_add_padding(ad->genlist);
828 static Eina_Bool im_setting_list_navi_item_pop_cb(void *data, Elm_Object_Item *it)
830 static bool in_exit = false;
840 static void im_setting_list_navi_back_btn_call_cb(void *data, Evas_Object *obj, void *event_info)
842 evas_object_smart_callback_del(obj, "clicked", im_setting_list_navi_back_btn_call_cb);
846 void im_setting_list_add_padding(Evas_Object *genlist)
848 /* Add padding area in wearable circle profile */
849 Elm_Genlist_Item_Class *ptc = elm_genlist_item_class_new();
850 Elm_Object_Item *item;
853 ptc->item_style = "padding";
854 item = elm_genlist_item_append(genlist, ptc, NULL, NULL, ELM_GENLIST_ITEM_NONE, NULL, NULL);
855 elm_atspi_accessible_role_set(item, ELM_ATSPI_ROLE_REDUNDANT_OBJECT);
856 elm_genlist_item_class_free(ptc);
859 Evas_Object *im_setting_list_list_create(void *data)
861 appdata *ad = (appdata *)data;
864 ad->conform = im_setting_list_conform_create(ad->win);
865 ad->naviframe = im_setting_list_naviframe_create(ad->conform);
866 ad->genlist = im_setting_list_genlist_create(ad);
867 im_setting_list_add_ime(ad);
869 /* Add genlist to naviframe */
870 Evas_Object *back_btn = NULL;
871 const char *title = NULL;
872 const char *item_style = NULL;
874 item_style = "empty";
876 title = IM_SETTING_LIST_TITLE;
878 back_btn = elm_button_add(ad->naviframe);
879 elm_object_style_set(back_btn, "naviframe/back_btn/default");
880 evas_object_smart_callback_add(back_btn, "clicked", im_setting_list_navi_back_btn_call_cb, NULL);
883 Elm_Object_Item *nf_main_item = elm_naviframe_item_push(ad->naviframe,
890 elm_object_item_domain_text_translatable_set(nf_main_item, PACKAGE, EINA_TRUE);
892 elm_naviframe_item_title_enabled_set(nf_main_item, EINA_TRUE, EINA_TRUE);
893 elm_naviframe_item_pop_cb_set(nf_main_item, im_setting_list_navi_item_pop_cb, ad);
894 elm_object_content_set(ad->conform, ad->naviframe);
899 void im_setting_list_app_terminate(void *data)
901 g_ime_info_list.clear();
902 g_gen_item_data.clear();
903 if (NULL != itc_im_list_keyboard_list)
905 elm_genlist_item_class_free(itc_im_list_keyboard_list);
906 itc_im_list_keyboard_list = NULL;
909 if (NULL != itc_im_list_group)
911 elm_genlist_item_class_free(itc_im_list_group);
912 itc_im_list_group = NULL;
915 if (NULL != itc_im_list_item)
917 elm_genlist_item_class_free(itc_im_list_item);
918 itc_im_list_item = NULL;
921 if (NULL != itc_im_list_title)
923 elm_genlist_item_class_free(itc_im_list_title);
924 itc_im_list_title = NULL;
928 package_manager_destroy(pkgmgr);
933 void im_setting_list_update_window(void *data)
935 appdata *ad = (appdata *)data;
938 im_setting_list_load_ime_info();
939 im_setting_list_add_ime(ad);
942 static void _package_manager_event_cb(const char *type, const char *package, package_manager_event_type_e event_type, package_manager_event_state_e event_state, int progress, package_manager_error_e error, void *user_data)
944 appdata *ad = (appdata *)user_data;
946 if (!package || !type)
949 if (event_state != PACKAGE_MANAGER_EVENT_STATE_COMPLETED)
952 if (event_type == PACKAGE_MANAGER_EVENT_TYPE_INSTALL ||
953 event_type == PACKAGE_MANAGER_EVENT_TYPE_UNINSTALL ||
954 event_type == PACKAGE_MANAGER_EVENT_TYPE_UPDATE) {
955 LOGD("PACKAGE_MANAGER_EVENT type : %d", event_type);
956 /* Wait for updating IME package list in ISF */
958 im_setting_list_popup_view_del(ad);
959 im_setting_list_popup_view_create(ad);
964 im_setting_list_app_create(void *data)
966 appdata *ad = (appdata *)data;
969 im_setting_list_text_domain_set();
970 ad->win = im_setting_list_main_window_create(PACKAGE, ad->app_type);
971 im_setting_list_bg_create(ad->win);
972 im_setting_list_load_ime_info();
975 int ret = package_manager_create(&pkgmgr);
976 if (ret == PACKAGE_MANAGER_ERROR_NONE) {
977 ret = package_manager_set_event_cb(pkgmgr, _package_manager_event_cb, ad);
978 if (ret == PACKAGE_MANAGER_ERROR_NONE) {
979 LOGD("package_manager_set_event_cb succeeded.\n");
981 LOGD("package_manager_set_event_cb failed(%d)\n", ret);
984 LOGD("package_manager_create failed(%d)\n", ret);
988 im_setting_list_list_create(ad);
989 evas_object_show(ad->win);
993 im_setting_list_app_resume(void *data)
995 appdata *ad = (appdata *)data;
999 isf_control_resume_ime_option_window();