summaryrefslogtreecommitdiff
path: root/lib/speed/ph-speeddial-view.c
diff options
context:
space:
mode:
Diffstat (limited to 'lib/speed/ph-speeddial-view.c')
-rwxr-xr-xlib/speed/ph-speeddial-view.c588
1 files changed, 588 insertions, 0 deletions
diff --git a/lib/speed/ph-speeddial-view.c b/lib/speed/ph-speeddial-view.c
new file mode 100755
index 0000000..15bbc59
--- /dev/null
+++ b/lib/speed/ph-speeddial-view.c
@@ -0,0 +1,588 @@
+/*
+* Copyright 2012 Samsung Electronics Co., Ltd
+*
+* Licensed under the Flora License, Version 1.0 (the "License");
+* you may not use this file except in compliance with the License.
+* You may obtain a copy of the License at
+*
+* http://floralicense.org/license/
+*
+* Unless required by applicable law or agreed to in writing, software
+* distributed under the License is distributed on an "AS IS" BASIS,
+* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+* See the License for the specific language governing permissions and
+* limitations under the License.
+*/
+
+
+#include <Ecore_X.h>
+#include <ui-gadget-module.h>
+
+#include "phone.h"
+#include "phone-common.h"
+#include "ph-speeddial-view.h"
+
+#define KEY_SPEED_DATA "speed_d"
+#define SPEED_VOICE_MAIL_NUM 1
+
+static Elm_Gengrid_Item_Class grid_itc, grid_itc_empty;
+
+enum{
+ PH_SPEED_MODE_DEFAULT,
+ PH_SPEED_MODE_EDIT,
+};
+
+static void speed_edit_mode_start(ph_speeddial_data * speed_d);
+static void speed_edit_mode_end(ph_speeddial_data * speed_d);
+
+static int speed_set_speeddial(int spdial_num, int number_id)
+{
+ contacts_record_h spd_record = NULL;
+ int ret_id = 0;
+ contacts_error_e err = CONTACTS_ERROR_NONE;
+
+ contacts_record_create( _contacts_speeddial._uri, &spd_record );
+
+ err = contacts_record_set_int(spd_record, _contacts_speeddial.speeddial_number, spdial_num);
+ p_warn_if(CONTACTS_ERROR_NONE != err, "contacts_record_set_int() Failed(%d)", err);
+
+ err = contacts_record_set_int(spd_record, _contacts_speeddial.number_id, number_id);
+ p_warn_if(CONTACTS_ERROR_NONE != err, "contacts_record_set_int() Failed(%d)", err);
+
+ err = contacts_db_insert_record(spd_record, &ret_id);
+ p_warn_if(CONTACTS_ERROR_NONE != err, "contacts_db_insert_record() Failed(%d)", err);
+
+ contacts_record_destroy(spd_record, true);
+ return err;
+}
+
+static int speed_unset_speeddial(int spdial_num)
+{
+ return contacts_db_delete_record( _contacts_speeddial._uri, spdial_num);
+}
+
+static void speed_update_button_status(ph_speeddial_data *speed_d)
+{
+ p_retm_if(NULL == speed_d, "Parameter is null");
+ p_retm_if(NULL == speed_d->ctrl_item, "Navi button is null");
+
+ if ((false == speed_d->is_edit_mode && 0 == speed_d->speeddial_list_count)
+ || (true == speed_d->is_edit_mode && 0 == speed_d->checked_cnt))
+ elm_object_disabled_set(speed_d->ctrl_item, EINA_TRUE);
+ else
+ elm_object_disabled_set(speed_d->ctrl_item, EINA_FALSE);
+}
+
+static void speed_load_list(ph_speeddial_data *speed_d)
+{
+ p_retm_if(NULL == speed_d, "Parameter is null");
+
+ phone_free_speeddial_data(speed_d->speeddial_list);
+ speed_d->speeddial_list_count = 0;
+ speed_d->speeddial_list = phone_load_speeddial_data(&(speed_d->speeddial_list_count));
+}
+
+static void speed_popup_response_cb(void *data, Evas_Object *obj, void *event_info)
+{
+ PH_FN_CALL;
+ ph_speeddial_data *speed_d = data;
+ evas_object_del(speed_d->popup);
+ speed_d->popup = NULL;
+}
+
+static void speed_add_start_cb(void *data, void *data2)
+{
+ PH_FN_CALL;
+ ph_speeddial_data *speed_d = data;
+ int *number_id = data2;
+ int ret;
+
+ p_retm_if(NULL == speed_d, "speed data is null");
+ p_retm_if(*number_id <= 0, "returned number_id is less than 0");
+ p_retm_if(20 < speed_d->cur_dial_num, "current dial num is higher than 20");
+
+ ret = speed_set_speeddial(speed_d->cur_dial_num, *number_id);
+ if (ret < 0)
+ phone_show_popup(speed_d->navi, S_(PH_SYS_POP_ALREDY_EXISTS), 2.0);
+}
+
+static void speed_destroy_child_ug(void *data)
+{
+ ph_speeddial_data *speed_d = data;
+ speed_d->child_ug = NULL;
+}
+
+static void speed_grid_empty_selected(void *data, Evas_Object *obj, void *event_info)
+{
+ ph_speeddial_data * speed_d = evas_object_data_get(obj, KEY_SPEED_DATA);
+ int index = (int)data;
+ p_retm_if(true == speed_d->is_edit_mode, "It is in Edit mode");
+ elm_gengrid_item_selected_set(event_info, EINA_FALSE);
+
+ speed_d->cur_dial_num = index;
+ speed_d->child_ug = phone_launch_contact_list_ug(speed_d->ug, CT_UG_REQUEST_SELECT_NUMBER,
+ speed_add_start_cb, speed_destroy_child_ug, speed_d);
+}
+
+static void speed_change_start_cb(void *data, void *data2)
+{
+ PH_FN_CALL;
+ ph_speeddial_data *speed_d = data;
+ int *number_id = data2;
+ contacts_error_e err = CONTACTS_ERROR_NONE;
+ p_retm_if(NULL == speed_d, "speed data is null");
+ p_retm_if(*number_id <= 0, "returned number_id is less than 0");
+ p_retm_if(20 < speed_d->cur_dial_num, "current dial num is higher than 20");
+ speed_unset_speeddial(speed_d->cur_dial_num);
+ err = speed_set_speeddial(speed_d->cur_dial_num, *number_id);
+ if (CONTACTS_ERROR_NONE != err) {
+ phone_show_popup(speed_d->navi, S_(PH_SYS_POP_ALREDY_EXISTS), 1.5);
+ }
+}
+
+static void speed_grid_change_contact(void *data, Evas_Object *obj, void *event_info)
+{
+ PH_FN_CALL;
+ ph_speeddial_data *speed_d = data;
+ p_retm_if(NULL== speed_d, "Speeddial data is null");
+
+ speed_popup_response_cb(speed_d, NULL, NULL);
+ speed_d->child_ug = phone_launch_contact_list_ug(speed_d->ug, CT_UG_REQUEST_SELECT_NUMBER,
+ speed_change_start_cb, speed_destroy_child_ug, speed_d);
+}
+
+static void speed_grid_remove_speeddial(void *data, Evas_Object *obj, void *event_info)
+{
+ PH_FN_CALL;
+ contacts_error_e err = CONTACTS_ERROR_NONE;
+ ph_speeddial_data *speed_d = data;
+ speed_popup_response_cb(speed_d, NULL, NULL);
+ err = speed_unset_speeddial(speed_d->cur_dial_num);
+ if (CONTACTS_ERROR_NONE != err)
+ phone_show_tickernoti(S_(PH_SYS_POP_FAILED));
+ else
+ phone_show_tickernoti(S_(PH_SYS_POP_REMOVED));
+}
+
+static void speed_grid_item_sel(void *data, Evas_Object *obj, void *event_info)
+{
+ ph_speeddial_info *s_info = data;
+ ph_speeddial_data *speed_d = evas_object_data_get(obj, KEY_SPEED_DATA);
+ Evas_Object *popup;
+ Evas_Object *list;
+ Evas_Object *btn;
+
+ p_retm_if(true == speed_d->is_edit_mode, "It is in Edit mode");
+ elm_gengrid_item_selected_set(event_info, EINA_FALSE);
+
+ p_retm_if(NULL == s_info, "speeddial info is null");
+ if (SPEED_VOICE_MAIL_NUM == s_info->dial_number)
+ return;
+
+ speed_d->cur_dial_num = s_info->dial_number;
+ popup = elm_popup_add(speed_d->win);
+ elm_object_style_set(popup, "min_liststyle");
+ elm_object_part_text_set(popup, "title,text", S_(PH_SYS_SK_EDIT));
+ evas_object_size_hint_weight_set(popup, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+
+ list = elm_list_add(popup);
+ elm_list_item_append(list, T_(PH_GET_TEXT_BASE_OP, PHTEXT_CHANGE_CONTACT),
+ NULL, NULL, speed_grid_change_contact, speed_d);
+ elm_list_item_append(list, S_(PH_SYS_BODY_REMOVE),
+ NULL, NULL, speed_grid_remove_speeddial, speed_d);
+ elm_list_mode_set(list, ELM_LIST_EXPAND);
+ elm_object_content_set(popup, list);
+
+ btn = elm_button_add(popup);
+ elm_object_text_set(btn, S_(PH_SYS_POP_CLOSE));
+ elm_object_part_content_set(popup, "button1", btn);
+ elm_object_style_set(btn, "popup_button/default");
+ evas_object_smart_callback_add(btn, "clicked", speed_popup_response_cb, speed_d);
+
+ speed_d->popup = popup;
+ evas_object_show(popup);
+}
+
+static void speed_fill_gengrid(ph_speeddial_data *speed_d)
+{
+ int i;
+ p_retm_if(NULL == speed_d, "Parameter is null");
+
+ for(i = 1 ; i < 10; i++) {
+ Eina_List *l=NULL;
+ bool is_find = false;
+ ph_speeddial_info *cd = NULL;
+
+ EINA_LIST_FOREACH(speed_d->speeddial_list, l, cd) {
+ if (!cd) continue;
+ if (cd->dial_number == i) {
+ is_find = true;
+ break;
+ }
+ }
+ if (is_find)
+ elm_gengrid_item_append(speed_d->gengrid, &grid_itc, cd, speed_grid_item_sel, cd);
+ else
+ elm_gengrid_item_append(speed_d->gengrid, &grid_itc_empty, (void*)i, speed_grid_empty_selected, (void*)i);
+ }
+ evas_object_show(speed_d->gengrid);
+}
+
+static void speed_data_list_changed_cb(const char* view_uri, void* data)
+{
+ PH_FN_CALL;
+ ph_speeddial_data *speed_d = data;
+ p_retm_if(NULL == speed_d, "Parameter is null");
+ if (speed_d->gengrid) {
+ speed_d->checked_cnt = 0;
+ speed_load_list(speed_d);
+ elm_gengrid_clear(speed_d->gengrid);
+ speed_fill_gengrid(speed_d);
+ speed_update_button_status(speed_d);
+ }
+ PH_FN_END;
+}
+
+static char *speed_grid_empty_label_get(void *data, Evas_Object *obj, const char *part )
+{
+ if (0 == strcmp(part, "elm.text.number")) {
+ int index = (int)data;
+ char buf[PATH_MAX]={0};
+ snprintf(buf, sizeof(buf), "%d", index);
+ return strdup(buf);
+ }
+ return NULL;
+}
+
+static char *speed_grid_label_get(void *data, Evas_Object *obj, const char *part )
+{
+ char buf[PATH_MAX]={0};
+ ph_speeddial_info * s_info = data;
+
+ p_retvm_if(NULL == s_info, NULL, "speeddial info is null");
+
+ if (0 == strcmp(part, "elm.text.number")) {
+ if (SPEED_VOICE_MAIL_NUM == s_info->dial_number)
+ return NULL;
+ snprintf(buf, sizeof(buf), "%d", s_info->dial_number);
+ return strdup(buf);
+ }
+ else if (0 == strcmp(part, "elm.text")) {
+ if (s_info->display && *s_info->display)
+ snprintf(buf, sizeof(buf), "%s", s_info->display);
+ else if (s_info->ph_number && *s_info->ph_number)
+ snprintf(buf, sizeof(buf), "%s", s_info->ph_number);
+ else
+ return NULL;
+ return strdup(buf);
+ }
+ return NULL;
+}
+
+static void speed_del_btn_cb(void *data, Evas_Object *obj, void *event_info)
+{
+ ph_speeddial_data *speed_d = data;
+ ph_speeddial_info *s_info = NULL;
+ Eina_List *l;
+ bool deleted = false;
+
+ EINA_LIST_FOREACH(speed_d->speeddial_list, l, s_info) {
+ if (!s_info) continue;
+ if (EINA_TRUE == s_info->is_checked) {
+ PH_DBG("%d", s_info->dial_number);
+ speed_unset_speeddial(s_info->dial_number);
+ deleted = true;
+ }
+ }
+
+ if (deleted){
+ phone_hide_notify(speed_d->layout);
+ phone_show_tickernoti(S_(PH_SYS_POP_REMOVED));
+ }
+
+ speed_edit_mode_end(speed_d);
+}
+
+static void speed_edit_set_selection_info(void *data)
+{
+ ph_speeddial_data *speed_d = data;
+ p_retm_if(NULL == speed_d, "Selection info is null");
+
+ if (0 == speed_d->checked_cnt)
+ phone_hide_notify(speed_d->layout);
+ else {
+ char info_text[PH_TEXT_SHORT_LEN]={0};
+ snprintf(info_text, sizeof(info_text), "%s (%d)", S_(PH_SYS_POP_SELECTED),
+ speed_d->checked_cnt);
+ phone_show_notify(speed_d->layout, info_text);
+ }
+}
+
+static void speed_edit_check_changed_cb(void *data, Evas_Object *obj, void *event_info)
+{
+ ph_speeddial_data *speed_d = data;
+ if (elm_check_state_get(obj))
+ speed_d->checked_cnt++;
+ else
+ speed_d->checked_cnt--;
+ speed_edit_set_selection_info(speed_d);
+ speed_update_button_status(speed_d);
+}
+
+static Evas_Object *speed_grid_content_get(void *data, Evas_Object *obj, const char *part )
+{
+ ph_speeddial_info *s_info = data;
+ p_retvm_if(NULL == s_info, NULL, "parameter is null");
+ ph_speeddial_data *speed_d = evas_object_data_get(obj, KEY_SPEED_DATA);
+
+ if ((0 == strcmp(part, "elm.thumbnail")) || (0 == strcmp(part, "elm.swallow.icon"))) {
+ Evas_Object *ic;
+ if (s_info->img_path)
+ ic = phone_create_icon_with_img(obj, s_info->img_path);
+ else
+ ic = phone_create_icon_with_img(obj, IMG_DEFAULT);
+ if (SPEED_VOICE_MAIL_NUM == s_info->dial_number)
+ elm_icon_resizable_set(ic, EINA_FALSE, EINA_FALSE);
+ return ic;
+ }
+ else if (0 == strcmp(part, "elm.swallow.check.icon") && speed_d->is_edit_mode) {
+ Evas_Object *btn;
+ if (SPEED_VOICE_MAIL_NUM == s_info->dial_number)
+ return NULL;
+ btn = elm_check_add(obj);
+ elm_object_style_set(btn, "grid");
+ elm_check_state_pointer_set(btn, &(s_info->is_checked));
+ evas_object_smart_callback_add(btn, "changed", speed_edit_check_changed_cb, speed_d);
+ evas_object_propagate_events_set(btn, EINA_FALSE);
+ return btn;
+ }
+ return NULL;
+}
+
+static void speed_edit_back_btn_cb(void *data, Evas_Object *obj, void *event_info)
+{
+ Elm_Object_Item *item;
+ ph_speeddial_data *speed_d = data;
+ ph_speeddial_info *s_info;
+ Eina_List *l;
+
+ EINA_LIST_FOREACH(speed_d->speeddial_list, l, s_info) {
+ if (!s_info) continue;
+ s_info->is_checked = EINA_FALSE;
+ }
+ speed_d->checked_cnt = 0;
+ phone_hide_notify(speed_d->layout);
+ speed_edit_mode_end(speed_d);
+
+ item = elm_gengrid_first_item_get(speed_d->gengrid);
+ while (item) {
+ elm_gengrid_item_update(item);
+ item = elm_gengrid_item_next_get(item);
+ }
+}
+
+static void speed_edit_btn_cb(void *data, Evas_Object *obj, void *event_info)
+{
+ ph_speeddial_data *speed_d = data;
+ speed_edit_mode_start(speed_d);
+}
+
+static void speed_navi_set(int mode, ph_speeddial_data *speed_d)
+{
+ Elm_Object_Item *navi_it;
+ Evas_Object *back_btn, *toolbar_btn;
+
+ p_retm_if(NULL == speed_d, "parameter(controlbar) is NULL");
+
+ navi_it = elm_naviframe_top_item_get(speed_d->navi);
+ p_retm_if(NULL == navi_it, "navi item is NULL");
+
+ if (speed_d->navi) {
+ phone_navi_item_clear(speed_d->navi_item);
+ }
+
+ back_btn = elm_button_add(speed_d->navi);
+ elm_object_item_part_content_set(speed_d->navi_item, "prev_btn", back_btn);
+
+ switch (mode) {
+ case PH_SPEED_MODE_DEFAULT:
+ toolbar_btn = phone_create_toolbar_btn(speed_d->navi, S_(PH_SYS_SK_DELETE), speed_edit_btn_cb, speed_d);
+ elm_object_item_part_content_set(speed_d->navi_item, "toolbar_button1", toolbar_btn);
+ elm_object_style_set(back_btn, "naviframe/back_btn/default");
+ if (speed_d->is_ug)
+ evas_object_smart_callback_add(back_btn, "clicked", phone_ug_destroy_me_cb, speed_d->ug);
+ else
+ evas_object_smart_callback_add(back_btn, "clicked", phone_view_back_btn_cb, speed_d->navi);
+
+ break;
+ case PH_SPEED_MODE_EDIT:
+ toolbar_btn = phone_create_toolbar_btn(speed_d->navi, S_(PH_SYS_SK_DELETE), speed_del_btn_cb, speed_d);
+ elm_object_item_part_content_set(speed_d->navi_item, "toolbar_button1", toolbar_btn);
+ elm_object_style_set(back_btn, "naviframe/back_btn/default");
+ evas_object_smart_callback_add(back_btn, "clicked", speed_edit_back_btn_cb, speed_d);
+ break;
+ default:
+ return;
+ }
+ if(toolbar_btn)
+ speed_d->ctrl_item = toolbar_btn;
+ speed_update_button_status(speed_d);
+}
+
+static void speed_edit_mode_start(ph_speeddial_data *speed_d)
+{
+ Elm_Object_Item *item;
+
+ speed_d->is_edit_mode = true;
+
+ item = elm_gengrid_first_item_get(speed_d->gengrid);
+ while (item) {
+ elm_gengrid_item_update(item);
+ item = elm_gengrid_item_next_get(item);
+ }
+ elm_object_item_part_text_set(speed_d->navi_item, "elm.text.title", T_(PH_GET_TEXT_BASE_OP, PHTEXT_SELECT_SPEED_DIAL_CONTACTS));
+ speed_navi_set(PH_SPEED_MODE_EDIT, speed_d);
+}
+
+static void speed_edit_mode_end(ph_speeddial_data *speed_d)
+{
+ Evas_Object *back_btn;
+
+ speed_d->is_edit_mode = false;
+ back_btn = elm_button_add(speed_d->layout);
+ if (speed_d->is_ug)
+ evas_object_smart_callback_add(back_btn, "clicked", phone_ug_destroy_me_cb, speed_d->ug);
+ else
+ evas_object_smart_callback_add(back_btn, "clicked", phone_view_back_btn_cb, speed_d->navi);
+
+ elm_object_item_part_content_set(speed_d->navi_item, "prev_btn", back_btn);
+ elm_object_style_set(back_btn, "naviframe/back_btn/default");
+
+ elm_object_item_part_text_set(speed_d->navi_item, "elm.text.title", T_(PH_GET_TEXT_BASIC, PHTEXT_SPEEDDIAL));
+ speed_navi_set(PH_SPEED_MODE_DEFAULT, speed_d);
+}
+
+static Evas_Object* speed_create_gengrid(ph_speeddial_data *speed_d, Evas_Object *parent)
+{
+ Evas_Object *gengrid;
+ int wx = 0;
+ int hy = 0;
+
+ p_retvm_if(NULL == speed_d, NULL, "Parameter is null");
+
+ gengrid = elm_gengrid_add(parent);
+ p_retvm_if(NULL == gengrid, NULL, "elm_gengrid_add is failed");
+ elm_object_theme_set(gengrid, speed_d->th);
+
+ ecore_x_window_size_get(ecore_x_window_root_get(ecore_x_window_focus_get()), &wx, &hy);
+ elm_gengrid_item_size_set(gengrid, wx/3, 273);
+ elm_gengrid_align_set(gengrid, 0.5, 0.0);
+ elm_gengrid_horizontal_set(gengrid, EINA_FALSE);
+ elm_gengrid_bounce_set(gengrid, EINA_FALSE, EINA_TRUE);
+ elm_gengrid_multi_select_set(gengrid, EINA_TRUE);
+
+ evas_object_size_hint_weight_set(gengrid, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+
+ grid_itc_empty.item_style = "gridtext_speeddial";
+ grid_itc_empty.func.text_get = speed_grid_empty_label_get;
+ grid_itc_empty.func.content_get = NULL;
+ grid_itc_empty.func.state_get = NULL;
+ grid_itc_empty.func.del = NULL;
+
+ grid_itc.item_style = "gridtext_speeddial";
+ grid_itc.func.text_get = speed_grid_label_get;
+ grid_itc.func.content_get = speed_grid_content_get;
+ grid_itc.func.state_get = NULL;
+ grid_itc.func.del = NULL;
+
+ evas_object_data_set(gengrid, KEY_SPEED_DATA, speed_d);
+
+ return gengrid;
+}
+
+static void speed_view_delete_cb(void *data, Evas *e, Evas_Object *obj, void *event_info)
+{
+ PH_FN_CALL;
+ ph_speeddial_data *speed_d = data;
+ contacts_error_e err = CONTACTS_ERROR_NONE;
+
+ p_retm_if(NULL == speed_d, "speed data is null");
+
+ err = contacts_db_remove_changed_cb(_contacts_person._uri, speed_data_list_changed_cb, speed_d);
+ p_warn_if(CONTACTS_ERROR_NONE != err, "contacts_db_remove_changed_cb() Failed(%d)", err);
+ err = contacts_db_remove_changed_cb(_contacts_speeddial._uri, speed_data_list_changed_cb, speed_d);
+ p_warn_if(CONTACTS_ERROR_NONE != err, "contacts_db_remove_changed_cb() Failed(%d)", err);
+
+ if (speed_d->speeddial_list)
+ phone_free_speeddial_data(speed_d->speeddial_list);
+
+ if (speed_d->th) {
+ elm_theme_extension_del(speed_d->th, SPEEDDIAL_THEME_EDJ);
+ elm_theme_free(speed_d->th);
+ }
+
+ if (speed_d->popup)
+ evas_object_del(speed_d->popup);
+
+ if (!speed_d->ug && speed_d->child_ug)
+ ug_destroy(speed_d->child_ug);
+
+ free(speed_d);
+ PH_FN_END;
+}
+
+static int speed_create_layout(ph_speeddial_data *speed_d)
+{
+ Evas_Object *layout;
+ Evas_Object *base;
+ Evas_Object *gengrid;
+
+ base = elm_layout_add(speed_d->navi);
+ p_retvm_if(NULL == base, 0, "elm_layout_add() return NULL");
+ elm_layout_file_set(base, SELECTION_INFO_EDJ, "selectioninfo_layout");
+
+ layout = phone_create_base_layout(base, false);
+ p_retvm_if(NULL == layout, 0, "fail : phone_create_base_layout");
+ elm_object_part_content_set(base, "contents", layout);
+ speed_d->layout = base;
+
+ gengrid = speed_create_gengrid(speed_d, layout);
+ p_retvm_if(NULL == gengrid, 0, "fail : _create_check_gengrid");
+ speed_d->gengrid = gengrid;
+ elm_object_part_content_set(layout, "elm.swallow.content", gengrid);
+
+ speed_load_list(speed_d);
+ speed_fill_gengrid(speed_d);
+
+ evas_object_event_callback_add(layout, EVAS_CALLBACK_DEL,
+ speed_view_delete_cb, speed_d);
+ return 1;
+}
+
+Evas_Object *ph_speed_create_content(Evas_Object *parent, ph_speeddial_data *speed_d)
+{
+ Elm_Theme *th;
+ int ret;
+ contacts_error_e err = CONTACTS_ERROR_NONE;
+
+ th = elm_theme_new();
+ elm_theme_ref_set(th, NULL);
+ elm_theme_extension_add(th, SPEEDDIAL_THEME_EDJ);
+ speed_d->th = th;
+
+ ret = speed_create_layout(speed_d);
+ p_retvm_if(0 == ret, NULL, "speed_create_layout is failed");
+
+ speed_d->navi_item = elm_naviframe_item_push(speed_d->navi, T_(PH_GET_TEXT_BASIC, PHTEXT_SPEEDDIAL), NULL,
+ NULL, speed_d->layout, NULL);
+
+
+ speed_navi_set(PH_SPEED_MODE_DEFAULT, speed_d);
+
+ err = contacts_db_add_changed_cb(_contacts_person._uri, speed_data_list_changed_cb, speed_d);
+ p_warn_if(CONTACTS_ERROR_NONE != err, "contacts_db_add_changed_cb() Failed(%d)", err);
+ err = contacts_db_add_changed_cb(_contacts_speeddial._uri, speed_data_list_changed_cb, speed_d);
+ p_warn_if(CONTACTS_ERROR_NONE != err, "contacts_db_add_changed_cb() Failed(%d)", err);
+
+ return speed_d->layout;
+}