/* * 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://www.tizenopensource.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 #include #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 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_item_disabled_set(speed_d->ctrl_item, EINA_TRUE); else elm_object_item_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 = contacts_svc_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; 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 = contacts_svc_begin_trans(); p_retm_if(CTS_SUCCESS != ret, "contacts_svc_begin_trans() Failed(%d)", ret); contacts_svc_unset_speeddial(speed_d->cur_dial_num); ret = contacts_svc_set_speeddial(speed_d->cur_dial_num, *number_id); if (CTS_SUCCESS != ret) { ret = contacts_svc_end_trans(false); phone_show_popup(speed_d->navi, S_(PH_SYS_POP_ALREDY_EXISTS), 1.5); } else ret = contacts_svc_end_trans(true); p_warn_if(ret < CTS_SUCCESS, "contacts_svc_end_trans() Failed(%d)", ret); } 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; int ret; ph_speeddial_data *speed_d = data; speed_popup_response_cb(speed_d, NULL, NULL); ret = contacts_svc_unset_speeddial(speed_d->cur_dial_num); if (CTS_SUCCESS != ret) 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(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); contacts_svc_unset_speeddial(s_info->dial_number); deleted = true; } } if (deleted) 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->navi); 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_tickernoti(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); 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->navi); 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 *toolbar; Evas_Object *l_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"); toolbar = elm_object_item_part_content_get(navi_it, "controlbar"); if (toolbar) phone_cbar_item_clear(toolbar); else { toolbar = elm_toolbar_add(speed_d->navi); elm_toolbar_shrink_mode_set(toolbar, ELM_TOOLBAR_SHRINK_EXPAND); elm_object_item_part_content_set(navi_it, "controlbar", toolbar); } switch (mode) { case PH_SPEED_MODE_DEFAULT: speed_d->ctrl_item = elm_toolbar_item_append(toolbar, PH_IMG_ICON_DELETE, NULL, speed_edit_btn_cb, speed_d); break; case PH_SPEED_MODE_EDIT: speed_d->ctrl_item = elm_toolbar_item_append(toolbar, PH_IMG_ICON_DELETE, NULL, speed_del_btn_cb, speed_d); l_btn = phone_create_navi_btn(speed_d->navi, S_(PH_SYS_SK_CANCEL)); evas_object_smart_callback_add(l_btn, "clicked", speed_edit_back_btn_cb, speed_d); elm_object_item_part_content_set(speed_d->navi_item, "prev_btn", l_btn); break; default: return; } phone_toolbar_disabled_item_append(toolbar, 3); 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, hy/5); 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; p_retm_if(NULL == speed_d, "speed data is null"); contacts_svc_unsubscribe_change_with_data(CTS_SUBSCRIBE_CONTACT_CHANGE, speed_data_list_changed_cb, speed_d); contacts_svc_unsubscribe_change_with_data(CTS_SUBSCRIBE_SPEEDDIAL_CHANGE, speed_data_list_changed_cb, speed_d); 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 *gengrid; layout = phone_create_base_layout(speed_d->navi, false); p_retvm_if(NULL == layout, 0, "fail : phone_create_base_layout"); speed_d->layout = layout; 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) { Evas_Object *back_btn; Elm_Theme *th; int ret; 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"); 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); speed_d->navi_item = elm_naviframe_item_push(speed_d->navi, T_(PH_GET_TEXT_BASIC, PHTEXT_SPEEDDIAL), back_btn, NULL, speed_d->layout, NULL); elm_object_style_set(back_btn, "naviframe/back_btn/default"); speed_navi_set(PH_SPEED_MODE_DEFAULT, speed_d); contacts_svc_subscribe_change(CTS_SUBSCRIBE_CONTACT_CHANGE, speed_data_list_changed_cb, speed_d); contacts_svc_subscribe_change(CTS_SUBSCRIBE_SPEEDDIAL_CHANGE, speed_data_list_changed_cb, speed_d); return speed_d->layout; }