+/*
+ * 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 <Elementary.h>
+#include <ui-gadget-module.h>
+#include <contacts-svc.h>
+#include <vconf.h>
+#include "cst-common.h"
+#include "cst-common-string.h"
+#include "cst-widget.h"
+#include "cst-call-setting.h"
+#include "cst-delete-list.h"
+#include "cst-autoreject.h"
+#include "cst-autoreject-ime.h"
+#include "cst-util.h"
+
+static Elm_Genlist_Item_Class *itc_list = NULL;
+static Elm_Genlist_Item_Class *itc_2text_1icon = NULL;
+Elm_Object_Item *ec_item[3];
+
+static void __cst_auto_reject_back_to_prev(CstUgData_t *ugd);
+
+static void __cst_update_reject_active(const int reject_id, int reject_active, CstUgData_t *ugd)
+{
+ ret_if(ugd == NULL);
+ int ret = phone_misc_block_update(ugd->reject_handle, reject_id, PH_MISC_BLOCK_ROW_ACTIVATE,
+ reject_active, PH_MISC_BLOCK_ROW_NONE);
+ if (ret < 0) {
+ DBG("phone_misc_block_update() Failed(%d)", ret);
+ }
+}
+
+static int __cst_get_list_cb(const ph_misc_block_info *row_data, void *user_data)
+{
+ retv_if(user_data == NULL, -1);
+ CstUgData_t *ugd = (CstUgData_t *)user_data;
+ CstRejectInfo_t *reject_item = NULL;
+
+ reject_item = calloc(1, sizeof(CstRejectInfo_t));
+ reject_item->reject_id = phone_misc_block_info_get_id(row_data);
+ snprintf(reject_item->reject_number, sizeof(reject_item->reject_number),
+ "%s", phone_misc_block_info_get_number(row_data));
+ reject_item->is_activate = phone_misc_block_info_get_activate(row_data);
+ reject_item->rule = phone_misc_block_info_get_matching_rule(row_data);
+ ugd->load_list = eina_list_append(ugd->load_list, reject_item);
+ DBG("number : %s, act : %d, rule : %d", reject_item->reject_number, reject_item->is_activate, reject_item->rule);
+ return 0;
+}
+
+static int __cst_load_reject_list(CstUgData_t *ugd)
+{
+ retv_if(ugd == NULL, -1);
+ int ret = phone_misc_block_get_list(ugd->reject_handle, __cst_get_list_cb, ugd);
+ if (ret < 0) {
+ DBG("phone_misc_block_get_list() Failed(%d)", ret);
+ }
+ return ret;
+}
+
+static void __cst_back_btn_clicked_cb(void *data, Evas_Object *obj, void *event_info)
+{
+ ENTER(__cst_back_btn_clicked_cb);
+ CstUgData_t *ugd = (CstUgData_t *)data;
+ ret_if(ugd == NULL);
+
+ if (ugd->reject_list) {
+ ugd->reject_list = eina_list_free(ugd->reject_list);
+ ugd->reject_list = NULL;
+ }
+
+ if (ugd->backup_genlist)
+ ugd->backup_genlist = NULL;
+
+ if (ugd->backup_layout)
+ ugd->backup_layout = NULL;
+ _cst_del_selectinfo(ugd);
+
+ if (ugd->ug_req_type == CST_UG_REQ_AUTO_REJECT)
+ ug_destroy_me(ugd->ug);
+}
+
+int _cst_get_num_of_reject_list(CstUgData_t *ugd)
+{
+ retv_if(ugd == NULL, 0);
+
+ int list_cnt = eina_list_count(ugd->reject_list);
+ return list_cnt;
+}
+
+char *_cst_get_reject_list_text(Eina_List *list, int index)
+{
+ ENTER(_cst_get_reject_list_text);
+
+ CstGlItemData_t *item;
+ item = (CstGlItemData_t *)eina_list_nth(list, index);
+
+ return item->text;
+}
+
+int _cst_get_reject_list_id(Eina_List *list, int index)
+{
+ ENTER(_cst_get_reject_list_id);
+
+ CstGlItemData_t *item;
+ item = (CstGlItemData_t *)eina_list_nth(list, index);
+
+ return item->reject_id;
+}
+
+void _cst_set_num_of_reject_list(int i)
+{
+ if (ec_item[1] != NULL) {
+ if (i == 0) {
+ elm_object_item_disabled_set(ec_item[1], EINA_TRUE);
+ } else {
+ elm_object_item_disabled_set(ec_item[1], EINA_FALSE);
+ }
+ }
+ if (ec_item[0] != NULL) {
+ if (i == 30) {
+ elm_object_item_disabled_set(ec_item[0], EINA_TRUE);
+ } else {
+ elm_object_item_disabled_set(ec_item[0], EINA_FALSE);
+ }
+ }
+}
+
+static void __cst_on_click_reject_entry(void *data)
+{
+ ret_if(!data);
+
+ CstGlItemData_t *item_data = (CstGlItemData_t *)data;
+ CstUgData_t *ugd = (CstUgData_t *)item_data->ugd;
+ Eina_Bool is_activated;
+
+ is_activated = elm_check_state_get(item_data->eo_check);
+ __cst_update_reject_active(item_data->reject_id, !is_activated, ugd);
+
+ item_data->is_activated = !is_activated;
+ elm_genlist_item_update(item_data->gl_item);
+}
+
+static void __cst_on_click_unknown_entry(void *data)
+{
+ ret_if(!data);
+
+ CstGlItemData_t *item_data = (CstGlItemData_t *)data;
+ Eina_Bool state;
+
+ state = elm_check_state_get(item_data->eo_check);
+ _cst_vconf_set_bool(VCONFKEY_CISSAPPL_AUTO_REJECT_UNKNOWN_BOOL, !state);
+ elm_genlist_item_update(item_data->gl_item);
+}
+
+static void __cst_on_changed_reject_entry_chk(void *data, Evas_Object *obj, void *event_info)
+{
+ ret_if(!data);
+
+ CstGlItemData_t *item = (CstGlItemData_t *)data;
+ CstUgData_t *ugd = (CstUgData_t *)item->ugd;
+ Eina_Bool is_activated;
+
+ is_activated = elm_check_state_get(obj);
+ __cst_update_reject_active(item->reject_id, is_activated, ugd);
+
+ item->is_activated = is_activated;
+}
+
+static void __cst_on_changed_unknown_entry_chk(void *data, Evas_Object *obj, void *event_info)
+{
+ Eina_Bool is_reject_unknown;
+
+ is_reject_unknown = elm_check_state_get(obj);
+ _cst_vconf_set_bool(VCONFKEY_CISSAPPL_AUTO_REJECT_UNKNOWN_BOOL, is_reject_unknown);
+}
+
+static char *__cst_gl_label_get_reject_list(void *data, Evas_Object *obj, const char *part)
+{
+ retv_if(NULL == data, NULL);
+
+ CstGlItemData_t *item_data = (CstGlItemData_t *)data;
+
+ if (!strcmp(part, "elm.text") ||
+ !strcmp(part, "elm.text.1")) {
+ return strdup(item_data->text);
+ } else if (strcmp(part, "elm.text.2") == 0) {
+ int str_id = CST_SYS_STRING;
+
+ switch (item_data->reject_rule) {
+ case PH_MISC_BLOCK_RULE_EXACTLY:
+ str_id = CST_STR_EXACTLY_THE_SAME_AS;
+ break;
+ case PH_MISC_BLOCK_RULE_START:
+ str_id = CST_STR_START_WITH;
+ break;
+ case PH_MISC_BLOCK_RULE_INCLUDE:
+ str_id = CST_STR_INCLUDE;
+ break;
+ default:
+ DBG("Rule is not exist : %d", item_data->reject_rule);
+ break;
+ }
+ return strdup(T_(str_id));
+ }
+
+ return NULL;
+}
+
+static void __cst_gl_sel_reject_list(void *data, Evas_Object *obj, void *event_info)
+{
+ ENTER(__cst_gl_sel_reject_list);
+ retm_if(event_info == NULL, "Invalid argument: event info is NULL");
+ Elm_Object_Item *it = (Elm_Object_Item *)event_info;
+ CstGlItemData_t *item_data = (CstGlItemData_t *)elm_object_item_data_get(it);
+
+ elm_genlist_item_selected_set(it, 0);
+
+ if (item_data->is_unknown == EINA_TRUE) {
+ __cst_on_click_unknown_entry(item_data);
+ } else {
+ __cst_on_click_reject_entry(item_data);
+ }
+
+ return;
+}
+
+static Evas_Object *__cst_gl_icon_get_list_onoff(void *data, Evas_Object *obj, const char *part)
+{
+ retv_if(NULL == data, NULL);
+ CstGlItemData_t *item_data = (CstGlItemData_t *)data;
+ CstUgData_t *ugd = (CstUgData_t *)item_data->ugd;
+
+ if (!strcmp(part, "elm.icon")) {
+ int value = 0;
+ if (item_data->is_unknown == EINA_TRUE) {
+ _cst_vconf_get_bool(VCONFKEY_CISSAPPL_AUTO_REJECT_UNKNOWN_BOOL, &value);
+ item_data->eo_check = _cst_create_onoff_button(obj, value,
+ __cst_on_changed_unknown_entry_chk, ugd);
+ } else {
+ item_data->eo_check = _cst_create_onoff_button(obj, item_data->is_activated,
+ __cst_on_changed_reject_entry_chk, item_data);
+ }
+ return item_data->eo_check;
+ }
+ return NULL;
+}
+
+static void __cst_gl_del_reject_list(void *data, Evas_Object *obj)
+{
+ ENTER(__cst_gl_del_reject_list);
+
+ CstGlItemData_t *item_data = (CstGlItemData_t *)data;
+ if (item_data) {
+ free(item_data);
+ }
+}
+
+static void __cst_add_reject_number(const char *number, void *data)
+{
+ ENTER(__cst_add_reject_number);
+ ret_if(!data);
+
+ CstUgData_t *ugd = (CstUgData_t *) data;
+
+ int log_ret = phone_misc_block_insert(ugd->reject_handle, ugd->reject_rule, number);
+ if (log_ret < 0) {
+ DBG("phone_misc_block_insert() Failed(%d)", log_ret);
+ return;
+ }
+
+ elm_genlist_clear(ugd->backup_genlist);
+ ugd->reject_list = eina_list_free(ugd->reject_list);
+ ugd->reject_list = NULL;
+ _cst_genlist_append_auto_reject_list_item(ugd, ugd->backup_genlist);
+}
+
+static void __cst_click_autoreject_create_done(void *data, Evas_Object *obj, void *event_info)
+{
+ ENTER(__cst_click_autoreject_create_done);
+ ret_if(!data);
+
+ CstUgData_t *ugd = (CstUgData_t *)data;
+ char buffer[CST_MAX_PHONE_NUMBER_LEN + 1];
+
+ if (_cst_get_reject_number(buffer, ugd) > 0) {
+
+ DBG(" Add a reject number, %s", buffer);
+ __cst_add_reject_number(buffer, ugd);
+
+ memset(ugd->c_item, 0, sizeof(ugd->c_item));
+ __cst_auto_reject_back_to_prev(ugd);
+ ugd->back_button = _cst_get_navifr_prev_btn(ugd->nf);
+ }
+}
+
+static void __cst_click_autoreject_create_cancel(void *data, Evas_Object *obj, void *event_info)
+{
+ ENTER(__cst_click_autoreject_create_cancel);
+ ret_if(!data);
+
+ CstUgData_t *ugd = (CstUgData_t *)data;
+
+ memset(ugd->c_item, 0, sizeof(ugd->c_item));
+ __cst_auto_reject_back_to_prev(ugd);
+}
+
+static void __cst_on_click_autoreject_add_button(void *data, Evas_Object *obj, void *event_info)
+{
+ ENTER(__cst_on_click_autoreject_add_button);
+ ret_if(!data);
+
+ CstUgData_t *ugd = (CstUgData_t *)data;
+ Evas_Object *eo;
+ Elm_Object_Item *navi_it;
+ Evas_Object *btn;
+
+ ugd->popup = NULL;
+ ugd->reject_rule = PH_MISC_BLOCK_RULE_EXACTLY;
+ eo = _cst_create_autoreject_ime(ugd->nf, NULL, ugd);
+ evas_object_show(eo);
+
+ _cst_remove_naviframe(ugd->nf);
+ navi_it = elm_naviframe_item_push(ugd->nf, T_(CST_STR_ENTER_NUMBER_TO_REJECT),
+ NULL, NULL, eo, "1line");
+
+ btn = _cst_create_title_btn(ugd->nf, (char *)T_(CST_STR_CANCEL),
+ __cst_click_autoreject_create_cancel, (void *)ugd);
+ elm_object_item_part_content_set(navi_it, "title_right_btn", btn);
+
+ btn = _cst_create_title_btn(ugd->nf, (char *)T_(CST_STR_SAVE),
+ __cst_click_autoreject_create_done, (void *)ugd);
+ elm_object_item_part_content_set(navi_it, "title_left_btn", btn);
+ elm_object_disabled_set(btn, EINA_TRUE);
+}
+
+void _cst_genlist_append_auto_reject_list_item(CstUgData_t *ugd, Evas_Object *genlist)
+{
+ int ret_value;
+ int list_cnt = -1;
+ int index;
+ Elm_Object_Item *gl_item;
+
+ CstGlItemData_t *item = NULL;
+
+ _cst_create_genlist_separator(genlist, EINA_TRUE);
+
+ /* Create Unknown list */
+ item = (CstGlItemData_t *)malloc(sizeof(CstGlItemData_t));
+ ret_if(item == NULL);
+ memset(item, 0, sizeof(CstGlItemData_t));
+ item->is_unknown = EINA_TRUE;
+ snprintf(item->text, CST_MAX_ITEM_TEXT_BUFFER_LEN, "%s", T_(CST_STR_UNKNOWN));
+
+ item->ugd = ugd;
+ gl_item = elm_genlist_item_append(genlist, itc_list,
+ item, NULL, ELM_GENLIST_ITEM_NONE,
+ __cst_gl_sel_reject_list, ugd);
+ item->gl_item = gl_item;
+
+ ret_value = __cst_load_reject_list(ugd);
+ list_cnt = eina_list_count(ugd->load_list);
+ DBG("list_cnt : %d\n", list_cnt);
+
+ for (index = 0; index < list_cnt; index++) {
+ CstRejectInfo_t *reject_item = (CstRejectInfo_t *)eina_list_nth(ugd->load_list, index);
+ if (reject_item) {
+ DBG("reject list i=%d number=%s active=%d",
+ index, reject_item->reject_number, reject_item->is_activate);
+ item = (CstGlItemData_t *)malloc(sizeof(CstGlItemData_t));
+ ret_if(item == NULL);
+ memset(item, 0, sizeof(CstGlItemData_t));
+ item->is_unknown = EINA_FALSE;
+ item->index = index;
+ item->reject_rule = reject_item->rule;
+ item->reject_id = reject_item->reject_id;
+ snprintf(item->text, CST_MAX_ITEM_TEXT_BUFFER_LEN + 1, "%s", reject_item->reject_number);
+
+ item->is_activated = reject_item->is_activate;
+ item->ugd = ugd;
+ ugd->reject_list = eina_list_append(ugd->reject_list, item);
+
+ gl_item = elm_genlist_item_append(genlist, itc_2text_1icon,
+ item, NULL, ELM_GENLIST_ITEM_NONE,
+ __cst_gl_sel_reject_list, ugd);
+ item->gl_item = gl_item;
+ } else {
+ DBG("reject_item is null\n");
+ }
+ }
+ _cst_create_genlist_separator_no_line(genlist);
+
+ edje_object_signal_emit(_EDJ(ugd->backup_layout), "show,content1", "code");
+ ugd->load_list = eina_list_free(ugd->load_list);
+}
+
+static void __cst_set_genlist_item_styles_reject_list(void)
+{
+ if (!itc_list)
+ itc_list = elm_genlist_item_class_new();
+
+ if (!itc_2text_1icon)
+ itc_2text_1icon = elm_genlist_item_class_new();
+
+ itc_list->item_style = "dialogue/1text.1icon";
+ itc_list->func.text_get = __cst_gl_label_get_reject_list;
+ itc_list->func.content_get = __cst_gl_icon_get_list_onoff;
+ itc_list->func.state_get = NULL;
+ itc_list->func.del = __cst_gl_del_reject_list;
+
+ itc_2text_1icon->item_style = "dialogue/2text.1icon.6";
+ itc_2text_1icon->func.text_get = __cst_gl_label_get_reject_list;
+ itc_2text_1icon->func.content_get = __cst_gl_icon_get_list_onoff;
+ itc_2text_1icon->func.state_get = NULL;
+ itc_2text_1icon->func.del = __cst_gl_del_reject_list;
+
+ return;
+}
+
+static Evas_Object *__cst_create_genlist_reject_list(CstUgData_t *ugd)
+{
+ ENTER(__cst_create_genlist_reject_list);
+
+ Evas_Object *genlist;
+ genlist = elm_genlist_add(ugd->nf);
+
+ retv_if(NULL == genlist, NULL);
+ elm_object_style_set(genlist, "dialogue");
+
+ elm_genlist_tree_effect_enabled_set(genlist, EINA_TRUE);
+ evas_object_size_hint_weight_set(genlist, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ evas_object_size_hint_align_set(genlist, EVAS_HINT_FILL, EVAS_HINT_FILL);
+
+ _cst_genlist_append_auto_reject_list_item(ugd, genlist);
+
+ return genlist;
+}
+
+static void __cst_create_reject_list(Evas_Object *parent, void *data)
+{
+ ENTER(__cst_create_reject_list);
+
+ Evas_Object *layout, *back_btn, *cbar;
+ CstUgData_t *ugd = (CstUgData_t *)data;
+ Elm_Object_Item *navi_it;
+
+ ret_if(ugd == NULL);
+
+ __cst_set_genlist_item_styles_reject_list();
+ ugd->backup_genlist = __cst_create_genlist_reject_list(ugd);
+ ugd->kind_of_delete_list = CST_DL_AUTO_REJECT;
+
+ layout = elm_layout_add(ugd->nf);
+ ugd->backup_layout = layout;
+ elm_layout_file_set(layout, EDJ_NAME, "toolbar");
+ evas_object_size_hint_weight_set(layout, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ evas_object_size_hint_align_set(layout, EVAS_HINT_FILL, EVAS_HINT_FILL);
+ elm_object_part_content_set(layout, "elm.swallow.contents", ugd->backup_genlist);
+
+ if (ugd->ug_req_type == CST_UG_REQ_AUTO_REJECT) {
+ back_btn = elm_button_add(ugd->nf);
+ navi_it = elm_naviframe_item_push(ugd->nf, T_(CST_STR_AUTO_REJECT_LIST),
+ back_btn, NULL, layout, "1line");
+ elm_object_style_set(back_btn, "naviframe/back_btn/default");
+
+ } else {
+ navi_it = elm_naviframe_item_push(ugd->nf, T_(CST_STR_AUTO_REJECT_LIST),
+ NULL, NULL, layout, "1line");
+ back_btn = elm_object_item_part_content_get(navi_it, "prev_btn");
+ }
+ evas_object_smart_callback_add(back_btn, "clicked",
+ __cst_back_btn_clicked_cb, ugd);
+
+ cbar = _cst_create_navi_control_bar(ugd->nf,
+ (char *)T_(CST_STR_ADD), CST_CTRL_ICON_CREATE,
+ __cst_on_click_autoreject_add_button,
+ (char *)T_(CST_STR_DELETE), CST_CTRL_ICON_EDIT,
+ _cst_create_delete_list,
+ (void *)ugd, navi_it,
+ ec_item);
+ ret_if(NULL == cbar);
+ _cst_set_num_of_reject_list(_cst_get_num_of_reject_list(ugd));
+}
+
+void _cst_on_click_reject_list(void *data, Evas *evas, Evas_Object *obj, void *event_info)
+{
+ ENTER(_cst_on_click_reject_list);
+ ret_if(NULL == data);
+ CstUgData_t *ugd = (CstUgData_t *)data;
+ Evas_Event_Mouse_Up *ev = (Evas_Event_Mouse_Up *)event_info;
+
+ if (ev->event_flags & EVAS_EVENT_FLAG_ON_HOLD) {
+ return;
+ }
+
+ __cst_create_reject_list(ugd->nf, ugd);
+}
+
+void _cst_create_auto_reject_ug(void *data)
+{
+ ENTER(_cst_create_auto_reject_ug);
+
+ ret_if(NULL == data);
+ CstUgData_t *ugd = (CstUgData_t *)data;
+
+ __cst_create_reject_list(ugd->nf, ugd);
+}
+
+void _cst_auto_reject_input_panel_event_callback(void *data, Ecore_IMF_Context *imf_context, int value)
+{
+ ENTER(_cst_auto_reject_input_panel_event_callback);
+ ret_if(!data);
+ CstUgData_t *ugd = (CstUgData_t *)data;
+ Evas_Object *btn;
+
+ Elm_Object_Item *top_it = elm_naviframe_top_item_get(ugd->nf);
+
+ if(value == ECORE_IMF_INPUT_PANEL_STATE_SHOW) {
+
+ DBG("ECORE_IMF_INPUT_PANEL_STATE_SHOW");
+ btn = _cst_create_title_btn(ugd->nf, (char *)T_(CST_STR_CANCEL),
+ __cst_click_autoreject_create_cancel, (void *)ugd);
+ elm_object_item_part_content_set(top_it, "title_right_btn", btn);
+
+ btn = _cst_create_title_btn(ugd->nf, (char *)T_(CST_STR_SAVE),
+ __cst_click_autoreject_create_done, (void *)ugd);
+ elm_object_item_part_content_set(top_it, "title_left_btn", btn);
+
+
+ } else if(value == ECORE_IMF_INPUT_PANEL_STATE_HIDE) {
+ Evas_Object *cbar;
+ DBG("ECORE_IMF_INPUT_PANEL_STATE_HIDE");
+ elm_object_item_part_content_set(top_it, "title_right_btn", NULL);
+ elm_object_item_part_content_set(top_it, "title_left_btn", NULL);
+ cbar = _cst_create_navi_control_bar(ugd->nf,
+ (char *)T_(CST_STR_SAVE), NULL,
+ __cst_click_autoreject_create_done,
+ (char *)T_(CST_STR_CANCEL), NULL,
+ __cst_click_autoreject_create_cancel,
+ (void *)ugd, top_it,
+ ec_item);
+ }
+}
+
+static void __cst_auto_reject_back_to_prev(CstUgData_t *ugd)
+{
+ ret_if(!ugd);
+ Evas_Object *cbar;
+ Ecore_IMF_Context *imf_context = elm_entry_imf_context_get(ugd->dg_entry);
+ Elm_Object_Item *top_it = NULL;
+
+ elm_naviframe_item_pop(ugd->nf);
+
+ top_it = elm_naviframe_top_item_get(ugd->nf);
+
+ if (imf_context) {
+ ecore_imf_context_input_panel_event_callback_del (imf_context, ECORE_IMF_INPUT_PANEL_STATE_EVENT, _cst_auto_reject_input_panel_event_callback);
+ }
+
+ cbar = _cst_create_navi_control_bar(ugd->nf,
+ (char *)T_(CST_STR_ADD), CST_CTRL_ICON_CREATE,
+ __cst_on_click_autoreject_add_button,
+ (char *)T_(CST_STR_DELETE), CST_CTRL_ICON_EDIT,
+ _cst_create_delete_list,
+ (void *)ugd, top_it,
+ ec_item);
+ _cst_set_num_of_reject_list(_cst_get_num_of_reject_list(ugd));
+}
+