2 * Copyright (c) 2016 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.
18 #include <app_preference.h>
19 #include <Elementary.h>
25 #include <vconf-keys.h>
28 #include "w-input-selector.h"
30 #define RECENT_EMOJI_LIST "recent_emoji_list"
32 #define EMOTICON_CNT 180
35 extern App_Data* app_data;
37 static int is_content_reuse_on = 0;
42 vector <int> recent_emoji_list;
49 static Elm_Object_Item *it_emoticon_empty = NULL;
50 static Elm_Object_Item *it_emoticon_recent_group = NULL;
51 static Elm_Object_Item *it_emoticon_emoji_group = NULL;
52 static Elm_Object_Item *it_last = NULL;
54 static Elm_Genlist_Item_Class *itc_emoticon = NULL;
56 #define INITAL_ITEM_UNIT 24
57 #define LOADING_ITEM_UNIT 27
58 static int loading_done_for_item = 0;
59 Ecore_Timer *lazy_loading_timer_for_items = NULL;
61 #define INITAL_CONTENT_UNIT 51
62 #define LOADING_CONTENT_UNIT 9
63 static int loading_done_for_contents = 0;
64 Ecore_Timer *lazy_loading_timer_for_contents = NULL;
67 typedef struct emoticon_content
74 static emoticon_content_s emoticon_contents_pool[EMOTICON_CNT] = { 0, };
75 static emoticon_content_s emoticon_recents_pool[RECENT_CNT] = { 0, };
78 Emoticon emoticon_info[EMOTICON_CNT] = {
262 //---------------------------------------------------------------------------------------//
264 static Eina_Bool _custom_back_cb2(void *data, Elm_Object_Item *it)
266 PRINTFUNC(DLOG_DEBUG, "");
268 if (is_content_reuse_on) {
271 if (lazy_loading_timer_for_items != NULL) {
272 ecore_timer_del(lazy_loading_timer_for_items);
273 lazy_loading_timer_for_items = NULL;
276 if (lazy_loading_timer_for_contents != NULL) {
277 ecore_timer_del(lazy_loading_timer_for_contents);
278 lazy_loading_timer_for_contents = NULL;
281 //Recent EMOTICONS : the recent emoiton need to be updated whenever emoticon view is generated, so deleted here.
282 for (i=0;i< RECENT_CNT;i++)
284 if (emoticon_recents_pool[i].used == 0 && emoticon_recents_pool[i].content) {
285 evas_object_del(emoticon_recents_pool[i].content);
287 emoticon_recents_pool[i].content = NULL;
291 _back_to_genlist_for_selector();
296 void get_recent_emoticons(vector <int> &emoticon_list)
298 int ret = PREFERENCE_ERROR_NONE;
301 ret = preference_get_string(RECENT_EMOJI_LIST, &str);
302 if (PREFERENCE_ERROR_NONE != ret) {
303 PRINTFUNC(DLOG_ERROR, "preference_get_string error!(%d)", ret);
306 emoticon_list.clear();
308 PRINTFUNC(DLOG_DEBUG, "str = %s", str);
312 tok = strtok_r(str, ",", &ptr);
313 while (tok != NULL) {
314 PRINTFUNC(DLOG_DEBUG, "tok = %s", tok);
315 emoticon_list.push_back(strtol(tok, (char **)NULL, 10));
316 tok = strtok_r(NULL, ",", &ptr);
326 void set_recent_emoticons(vector <int> &emoticon_list, int val)
329 int ret = PREFERENCE_ERROR_NONE;
331 if (emoticon_list.size() > 0) {
332 for (i = 0; i < emoticon_list.size(); i++) {
333 PRINTFUNC(DLOG_DEBUG, "%d == %d", emoticon_list.at(i), val);
335 if (emoticon_list.at(i) == val) {
336 emoticon_list.erase(emoticon_list.begin()+i);
341 if (emoticon_list.size() >= RECENT_CNT) {
342 emoticon_list.erase(emoticon_list.end());
346 emoticon_list.insert(emoticon_list.begin(), val);
349 char str[10] = {0, };
351 for (i = 0; i < emoticon_list.size(); i++) {
352 snprintf(str, sizeof(str), "%d", emoticon_list.at(i));
354 if (i+1 != emoticon_list.size())
358 PRINTFUNC(DLOG_DEBUG, "%s", stored.c_str());
360 ret = preference_set_string(RECENT_EMOJI_LIST, stored.c_str());
361 if (PREFERENCE_ERROR_NONE != ret) {
362 PRINTFUNC(DLOG_ERROR, "preference_set_string error!(%d)", ret);
366 static void _emoticon_item_clicked_cb(void *data, Evas_Object * obj, void *event_info)
368 int index = (uintptr_t)data;
370 PRINTFUNC(DLOG_DEBUG, "index = %d", index);
372 // store in recents list
373 set_recent_emoticons(recent_emoji_list, index);
376 const Eina_Unicode unicode_event[2] = { (Eina_Unicode)emoticon_info[index].code, 0 };
377 char* utf_8 = eina_unicode_unicode_to_utf8(unicode_event, &length);
379 reply_to_sender_by_callback((const char*)utf_8, "emoticon", NULL);
381 PRINTFUNC(SECURE_DEBUG, "[%d]%s", index, utf_8);
388 Evas_Object* get_emoticon_button(Evas_Object* parent, int index){
392 Evas_Object* btn = elm_button_add(parent);
393 elm_object_style_set(btn, "emoticon");
394 evas_object_size_hint_weight_set(btn, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
395 evas_object_size_hint_align_set(btn, EVAS_HINT_FILL, EVAS_HINT_FILL);
398 const Eina_Unicode unicode_event[2] = { (Eina_Unicode)emoticon_info[index].code, 0 };
399 char* utf_8 = eina_unicode_unicode_to_utf8(unicode_event, &length);
400 elm_object_part_text_set(btn, "elm.text", utf_8);
405 evas_object_layer_set(btn, 32000);
407 evas_object_smart_callback_add(btn, "clicked", _emoticon_item_clicked_cb, (void *)(uintptr_t)index);
412 Evas_Object* get_recent_emoticon_button(Evas_Object* parent, int index){
416 Evas_Object* btn = elm_button_add(parent);
417 elm_object_style_set(btn, "emoticon");
418 evas_object_size_hint_weight_set(btn, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
419 evas_object_size_hint_align_set(btn, EVAS_HINT_FILL, EVAS_HINT_FILL);
422 const Eina_Unicode unicode_event[2] = { (Eina_Unicode)emoticon_info[recent_emoji_list.at(index)].code, 0 };
423 char* utf_8 = eina_unicode_unicode_to_utf8(unicode_event, &length);
424 elm_object_part_text_set(btn, "elm.text", utf_8);
426 evas_object_data_set(btn, "index", (void*)(uintptr_t) recent_emoji_list.at(index));
431 evas_object_layer_set(btn, 32000);
432 evas_object_smart_callback_add(btn, "clicked", _emoticon_item_clicked_cb, (void*)(uintptr_t) recent_emoji_list.at(index));
437 static void _emoticon_gl_lang_changed(void *data, Evas_Object *obj, void *event_info)
439 elm_genlist_realized_items_update(obj);
442 static char * __emoticon_gl_text_get(void *data, Evas_Object *obj, const char *part)
444 //PRINTFUNC(DLOG_DEBUG,"part = %s", part);
446 const char* str = (const char*) data;
450 if (!strcmp(part, "elm.text")) {
451 //PRINTFUNC(DLOG_DEBUG,"str = %s", str);
452 return strdup(gettext(str));
457 static void _emoticon_gl_content_unswallowed_cb(void *data, Evas_Object *obj, void *event_info)
459 Elm_Object_Item *it = (Elm_Object_Item *)event_info;
461 const Elm_Genlist_Item_Class *itc = elm_genlist_item_item_class_get(it);
463 // PRINTFUNC(DLOG_DEBUG,"%s - stype[%s]", __func__, itc->item_style);
464 if (!strcmp(itc->item_style, "3button_flat")) {
465 int index = (uintptr_t)elm_object_item_data_get(it);
466 //PRINTFUNC(DLOG_DEBUG,"it = %p", it);
467 PRINTFUNC(DLOG_DEBUG, "index = %d %d %d", index, index+1, index+2);
469 if (index < EMOTICON_CNT) {
470 emoticon_contents_pool[index].used = 0;
472 if (index + 1 < EMOTICON_CNT) {
473 emoticon_contents_pool[index+1].used = 0;
475 if (index + 2 < EMOTICON_CNT) {
476 emoticon_contents_pool[index+2].used = 0;
478 } else if (!strcmp(itc->item_style, "3button_flat_recent")) {
479 unsigned int index = (uintptr_t)elm_object_item_data_get(it);
480 //PRINTFUNC(DLOG_DEBUG,"index = %d",index);
482 if (index < recent_emoji_list.size()) {
483 emoticon_recents_pool[index].used = 0;
485 if (index + 1 < recent_emoji_list.size()) {
486 emoticon_recents_pool[index+1].used = 0;
488 if (index + 2 < recent_emoji_list.size()) {
489 emoticon_recents_pool[index+2].used = 0;
494 static Evas_Object * __emoticon_gl_recent_content_get(void *data, Evas_Object *obj, const char *part)
496 if (is_content_reuse_on) {
497 unsigned int index = (uintptr_t)data;
500 //PRINTFUNC(DLOG_DEBUG,"%s %d", part, index);
501 if (!strcmp(part, "elm.icon.1") || (!strcmp(part, "elm.icon.2")) || (!strcmp(part, "elm.icon.3"))) {
502 if (!strcmp(part, "elm.icon.1")) {
503 if (index >= recent_emoji_list.size()) return NULL;
505 } else if (!strcmp(part, "elm.icon.2")) {
506 if (index + 1 >= recent_emoji_list.size()) return NULL;
507 new_index = index + 1;
508 } else if (!strcmp(part, "elm.icon.3")) {
509 if (index + 2 >= recent_emoji_list.size()) return NULL;
510 new_index = index + 2;
513 Evas_Object* btn = NULL;
514 btn = (Evas_Object*)emoticon_recents_pool[new_index].content;
515 emoticon_recents_pool[new_index].used = 1;
517 } else if (!strcmp(part, "base")) {
518 Evas_Object* btn = elm_button_add(obj);
519 elm_object_style_set(btn, "ime/transparent");
523 unsigned int index = (uintptr_t)data;
526 // PRINTFUNC(DLOG_DEBUG,"%s %d", part, index);
527 if (!strcmp(part, "elm.icon.1") || (!strcmp(part, "elm.icon.2")) || (!strcmp(part, "elm.icon.3"))) {
528 if (!strcmp(part, "elm.icon.1")) {
529 if (index >= recent_emoji_list.size()) return NULL;
531 } else if (!strcmp(part, "elm.icon.2")) {
532 if (index + 1 >= recent_emoji_list.size()) return NULL;
533 new_index = index + 1;
534 } else if (!strcmp(part, "elm.icon.3")) {
535 if (index + 2 >= recent_emoji_list.size()) return NULL;
536 new_index = index + 2;
538 return get_recent_emoticon_button(obj, new_index);
539 } else if (!strcmp(part, "base")) {
540 Evas_Object* btn = elm_button_add(obj);
541 elm_object_style_set(btn, "ime/transparent");
548 static Evas_Object * __emoticon_gl_emoticon_content_get(void *data, Evas_Object *obj, const char *part)
550 //PRINTFUNC(DLOG_DEBUG,"%s", __func__);
552 if (is_content_reuse_on) {
553 int index = (uintptr_t)data;
556 if (!strcmp(part, "elm.icon.1") || (!strcmp(part, "elm.icon.2")) || (!strcmp(part, "elm.icon.3"))) {
557 if (!strcmp(part, "elm.icon.1")) {
558 if (index >= EMOTICON_CNT) return NULL;
560 } else if (!strcmp(part, "elm.icon.2")) {
561 if (index + 1 >= EMOTICON_CNT) return NULL;
562 new_index = index + 1;
563 } else if (!strcmp(part, "elm.icon.3")) {
564 if (index + 2 >= EMOTICON_CNT) return NULL;
565 new_index = index + 2;
568 Evas_Object* btn = NULL;
569 btn = (Evas_Object*)emoticon_contents_pool[new_index].content;
570 emoticon_contents_pool[new_index].used = 1;
572 char utf_8[10] = {0, };
573 snprintf(utf_8, sizeof(utf_8), "%d", new_index);
574 elm_object_part_text_set(btn, "elm.text", strdup(utf_8));
577 const Eina_Unicode unicode_event[2] = { (Eina_Unicode)emoticon_info[new_index].code, 0 };
578 char* utf_8 = eina_unicode_unicode_to_utf8(unicode_event, &length);
579 elm_object_part_text_set(btn, "elm.text", utf_8);
580 evas_object_data_set(btn, "index", (void*)(uintptr_t)new_index);
587 } else if (!strcmp(part, "base")) {
588 Evas_Object* btn = elm_button_add(obj);
589 elm_object_style_set(btn, "ime/transparent");
593 int index = (uintptr_t)data;
596 if (!strcmp(part, "elm.icon.1") || (!strcmp(part, "elm.icon.2")) || (!strcmp(part, "elm.icon.3"))) {
597 if (!strcmp(part, "elm.icon.1")) {
598 if (index >= EMOTICON_CNT) return NULL;
600 } else if (!strcmp(part, "elm.icon.2")) {
601 if (index + 1 >= EMOTICON_CNT) return NULL;
602 new_index = index + 1;
603 } else if (!strcmp(part, "elm.icon.3")) {
604 if (index + 2 >= EMOTICON_CNT) return NULL;
605 new_index = index + 2;
607 return get_emoticon_button(obj, new_index);
608 } else if (!strcmp(part, "base")) {
609 Evas_Object* btn = elm_button_add(obj);
610 elm_object_style_set(btn, "ime/transparent");
618 void _create_reusable_recents(Evas_Object *parent)
621 PRINTFUNC(DLOG_ERROR, "parent is null");
626 for (i = 0; i < recent_emoji_list.size(); i++ ) {
627 emoticon_recents_pool[i].index = i;
628 emoticon_recents_pool[i].content = get_recent_emoticon_button(parent, i);
629 emoticon_recents_pool[i].used = 0;
633 static Eina_Bool _lazy_loader_cb_for_contents(void *data)
635 Evas_Object *gl = (Evas_Object *)data;
637 PRINTFUNC(DLOG_ERROR, "gl is null");
638 lazy_loading_timer_for_contents = NULL;
639 return ECORE_CALLBACK_CANCEL;
642 if (loading_done_for_contents == EMOTICON_CNT) {
643 PRINTFUNC(DLOG_DEBUG, "lazy loading contents done");
644 lazy_loading_timer_for_contents = NULL;
645 return ECORE_CALLBACK_CANCEL;
649 if (loading_done_for_contents + LOADING_CONTENT_UNIT > EMOTICON_CNT) {
650 loading_top = EMOTICON_CNT;
652 loading_top = loading_done_for_contents + LOADING_CONTENT_UNIT;
655 PRINTFUNC(DLOG_DEBUG, "_lazy_loader_cb_for_contents loading_done = %d", loading_done_for_contents);
658 for (i = loading_done_for_contents; i < loading_top; i++) {
659 emoticon_contents_pool[i].index = i;
660 emoticon_contents_pool[i].used = 0;
662 if (emoticon_contents_pool[i].content == NULL) { // reusable
663 emoticon_contents_pool[i].content = get_emoticon_button(gl, i);
667 loading_done_for_contents = loading_top;
669 return ECORE_CALLBACK_RENEW;
672 void create_reusable_button(Evas_Object *parent)
675 PRINTFUNC(DLOG_ERROR, "parent is null");
678 loading_done_for_contents = INITAL_CONTENT_UNIT;
681 for (i = 0; i < INITAL_CONTENT_UNIT; i++ ) {
682 emoticon_contents_pool[i].index = i;
683 emoticon_contents_pool[i].used = 0;
685 if (emoticon_contents_pool[i].content == NULL) { // reusable
686 emoticon_contents_pool[i].content = get_emoticon_button(parent, i);
690 lazy_loading_timer_for_contents = ecore_timer_add(0.25, _lazy_loader_cb_for_contents, (void *)parent);
693 static Eina_Bool _lazy_loader_cb_for_items(void *data)
695 Evas_Object *gl = (Evas_Object *)data;
697 PRINTFUNC(DLOG_ERROR, "gl is null");
698 lazy_loading_timer_for_items = NULL;
699 return ECORE_CALLBACK_CANCEL;
702 if (loading_done_for_item == EMOTICON_CNT) {
703 PRINTFUNC(DLOG_DEBUG, "lazy loading item done");
704 //elm_genlist_realized_items_update(gl);
705 elm_genlist_item_class_free(itc_emoticon);
706 lazy_loading_timer_for_items = NULL;
708 return ECORE_CALLBACK_CANCEL;
712 if (loading_done_for_item + LOADING_ITEM_UNIT > EMOTICON_CNT) {
713 loading_top = EMOTICON_CNT;
715 loading_top = loading_done_for_item + LOADING_ITEM_UNIT;
718 if (loading_top > loading_done_for_contents) {
719 PRINTFUNC(DLOG_DEBUG, "Wait for content loading");
720 return ECORE_CALLBACK_RENEW;
722 PRINTFUNC(DLOG_DEBUG, "_lazy_loader_cb_for_items loading_done_for_item = %d", loading_done_for_item);
725 for (i = loading_done_for_item; i < loading_top; i++ ) {
727 elm_genlist_item_append(gl, itc_emoticon, (void*)(uintptr_t)i, NULL, ELM_GENLIST_ITEM_NONE, NULL, (void *)(uintptr_t)i);
730 loading_done_for_item = loading_top;
731 return ECORE_CALLBACK_RENEW;
734 void _create_reusable_contents(Evas_Object *gl){
736 PRINTFUNC(DLOG_ERROR, "gl is null");
740 loading_done_for_item = INITAL_ITEM_UNIT;
742 for (i = 0; i < INITAL_ITEM_UNIT; i++ ) {
744 elm_genlist_item_append(gl, itc_emoticon, (void*)(uintptr_t)i, NULL, ELM_GENLIST_ITEM_NONE, NULL, (void *)(uintptr_t)i);
747 lazy_loading_timer_for_items = ecore_timer_add(0.1, _lazy_loader_cb_for_items, (void *)gl);
750 Evas_Object* _create_emoticon_genlist(void* data)
752 PRINTFUNC(DLOG_DEBUG, "%s", __func__);
753 App_Data* ad = (App_Data*) data;
757 Evas_Object* genlist = elm_genlist_add(ad->naviframe);
762 Evas_Object* circle_object_genlist = eext_circle_object_genlist_add(genlist, ad->circle_surface);
763 eext_circle_object_genlist_scroller_policy_set(circle_object_genlist, ELM_SCROLLER_POLICY_OFF, ELM_SCROLLER_POLICY_AUTO);
764 evas_object_data_set(genlist, "circle", (void *) circle_object_genlist);
765 eext_rotary_object_event_activated_set(circle_object_genlist, EINA_TRUE);
767 evas_object_size_hint_weight_set(genlist, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
768 evas_object_size_hint_align_set(genlist, EVAS_HINT_FILL, EVAS_HINT_FILL);
769 evas_object_show(genlist);
771 const char *item_style = NULL;
773 item_style = "empty";
774 Elm_Object_Item *nf_emoticon_item = elm_naviframe_item_push(ad->naviframe, NULL, NULL, NULL, genlist, item_style);
776 elm_naviframe_item_pop_cb_set(nf_emoticon_item, _custom_back_cb2, ad);
778 evas_object_smart_callback_add(genlist, "language,changed", _emoticon_gl_lang_changed, genlist);
780 if (is_content_reuse_on) {
781 evas_object_smart_callback_add(genlist, "content,unswallowed", _emoticon_gl_content_unswallowed_cb, NULL);
787 void _update_emoticon_items(void *data)
789 PRINTFUNC(DLOG_DEBUG, "%s", __func__);
790 Evas_Object* gl = (Evas_Object*) data;
795 Elm_Object_Item *it = NULL;
796 Elm_Object_Item *first_it = NULL;
798 Elm_Genlist_Item_Class * itc_dummy = elm_genlist_item_class_new();
799 itc_dummy->item_style = "title";
800 itc_dummy->func.text_get = NULL;
801 itc_dummy->func.content_get = NULL;
802 itc_dummy->func.state_get = NULL;
803 itc_dummy->func.del = NULL;
805 Elm_Genlist_Item_Class *itc_group = elm_genlist_item_class_new();
807 itc_group->item_style = "groupindex";
808 itc_group->func.text_get = __emoticon_gl_text_get;
809 itc_group->func.content_get = NULL;
810 itc_group->func.state_get = NULL;
811 itc_group->func.del = NULL;
813 Elm_Genlist_Item_Class *itc_recent = elm_genlist_item_class_new();
814 if (is_content_reuse_on) {
815 // itc_recent->content_reusable = EINA_TRUE;
817 itc_recent->item_style = "3button_flat_recent";
818 itc_recent->func.text_get = NULL;
819 itc_recent->func.content_get = __emoticon_gl_recent_content_get;
820 itc_recent->func.state_get = NULL;
821 itc_recent->func.del = NULL;
823 itc_emoticon = elm_genlist_item_class_new();
824 if (is_content_reuse_on) {
825 // itc_emoticon->content_reusable = EINA_TRUE;
827 itc_emoticon->item_style = "3button_flat";
828 itc_emoticon->func.text_get = NULL;
829 itc_emoticon->func.content_get = __emoticon_gl_emoticon_content_get;
830 itc_emoticon->func.state_get = NULL;
831 itc_emoticon->func.del = NULL;
833 // dummy title for empty space
834 it_emoticon_empty = elm_genlist_item_append(gl, itc_dummy, NULL, NULL, ELM_GENLIST_ITEM_NONE, NULL, NULL);
836 if (recent_emoji_list.size() > 0) {
837 if (is_content_reuse_on) {
838 _create_reusable_recents(gl);
842 it_emoticon_recent_group = elm_genlist_item_append(gl, itc_group, (void*)"IDS_IME_HEADER_RECENT_M_RECETLY_SENT_EMOJIS_ABB", NULL, ELM_GENLIST_ITEM_NONE, NULL, (void *)2);
843 elm_genlist_item_select_mode_set(it, ELM_OBJECT_SELECT_MODE_DISPLAY_ONLY);
844 if (first_it == NULL)
845 first_it = it_emoticon_recent_group;
847 PRINTFUNC(DLOG_DEBUG, "size = %d", recent_emoji_list.size());
849 for (i=0;i < recent_emoji_list.size();i=i+3)
851 it = elm_genlist_item_append(gl, itc_recent, (void*)(uintptr_t)i, NULL, ELM_GENLIST_ITEM_NONE, NULL, (void *)(uintptr_t)i);
856 it_emoticon_emoji_group = elm_genlist_item_append(gl, itc_group, (void*)"IDS_IME_HEADER_EMOJIS_ABB", NULL, ELM_GENLIST_ITEM_NONE, NULL, (void *)2);
857 elm_genlist_item_select_mode_set(it, ELM_OBJECT_SELECT_MODE_DISPLAY_ONLY);
858 if (first_it == NULL)
859 first_it = it_emoticon_emoji_group;
861 if (is_content_reuse_on) {
862 _create_reusable_contents(gl);
865 for (i=0;i< EMOTICON_CNT;i=i+3) {
866 it = elm_genlist_item_append(gl, itc_emoticon, (void*)(uintptr_t)i, NULL, ELM_GENLIST_ITEM_NONE, NULL, (void *)(uintptr_t)i);
869 elm_genlist_item_class_free(itc_emoticon);
871 it = elm_genlist_item_next_get(first_it);
872 const Elm_Genlist_Item_Class *itc_temp = elm_genlist_item_item_class_get(it);
873 if (itc_temp == itc_group) {
874 it = elm_genlist_item_next_get(it);
876 elm_genlist_item_show(it, ELM_GENLIST_ITEM_SCROLLTO_MIDDLE);
878 elm_genlist_item_class_free(itc_recent);
879 elm_genlist_item_class_free(itc_group);
880 elm_genlist_item_class_free(itc_dummy);
883 void ise_show_emoticon_list(void *data)
885 App_Data* ad = (App_Data*) data;
889 it_emoticon_empty = NULL;
890 it_emoticon_recent_group = NULL;
891 it_emoticon_emoji_group = NULL;
894 get_recent_emoticons(recent_emoji_list);
896 Evas_Object* emoticon_list = NULL;
898 emoticon_list = _create_emoticon_genlist(ad);
900 if (is_content_reuse_on) {
901 create_reusable_button(ad->naviframe); // button object need to survive even if genlist is deleted.
903 _update_emoticon_items(emoticon_list);