diff options
Diffstat (limited to 'lib/speed/ph-speeddial-view.c')
-rwxr-xr-x | lib/speed/ph-speeddial-view.c | 588 |
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; +} |