diff options
Diffstat (limited to 'phone/phone.c')
-rwxr-xr-x | phone/phone.c | 333 |
1 files changed, 333 insertions, 0 deletions
diff --git a/phone/phone.c b/phone/phone.c new file mode 100755 index 0000000..a162967 --- /dev/null +++ b/phone/phone.c @@ -0,0 +1,333 @@ +/* +* 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 <appcore-efl.h> +#include <Ecore_X.h> +#include "phone.h" +#include "phone-common.h" +#include "ph-front.h" + +#include <system_info.h> + +struct phone_data +{ + Evas_Object *win; + ph_phoneui_data *phoneui_d; +#ifdef _PHONE_CONTACTS_DESKTOP_MODE_ + Evas_Object *prev_btn; +#endif + /* add more variables here */ +}; + +static void phapp_win_del(void *data, Evas_Object *obj, void *event) +{ + elm_exit(); +} + +static Evas_Object* phapp_create_win(const char *name) +{ + Evas_Object *eo; + int w, h; + + eo = elm_win_add(NULL, name, ELM_WIN_BASIC); + if (eo) { + elm_win_title_set(eo, name); +#ifdef _PHONE_CONTACTS_DESKTOP_MODE_ +#else + elm_win_borderless_set(eo, EINA_TRUE); +#endif + evas_object_smart_callback_add(eo, "delete,request", phapp_win_del, NULL); + ecore_x_window_size_get(ecore_x_window_root_first_get(), &w, &h); + evas_object_resize(eo, w, h); + elm_win_indicator_mode_set(eo, ELM_WIN_INDICATOR_SHOW); + } + elm_win_conformant_set(eo, EINA_TRUE); + return eo; +} + +static void phapp_region_changed(void *data) +{ + PH_FN_CALL; + ph_phoneui_data *phoneui_d = data; + phone_front_view_region_changed(phoneui_d); + ug_send_event(UG_EVENT_REGION_CHANGE); + return; +} + +static void phapp_language_changed(void *data) +{ + PH_FN_CALL; + struct phone_data *ad = data; + ph_phoneui_data *phoneui_d = ad->phoneui_d; + phone_front_view_language_changed(phoneui_d); + ug_send_event(UG_EVENT_LANG_CHANGE); +} + + +static int phapp_open(void *data) +{ + PH_FN_CALL; + struct phone_data *ad = data; + ph_phoneui_data *phoneui_d = ad->phoneui_d; + if (TRUE == phone_front_view_show_call_app(phoneui_d)) + return -1; + return 0; +} + +#ifdef _PHONE_CONTACTS_DESKTOP_MODE_ +static Evas_Object* _set_win_icon(struct phone_data *ad) +{ + Evas_Object *image = evas_object_image_add(evas_object_evas_get(ad->win)); + evas_object_image_file_set(image, "/usr/share/icons/default/small/org.tizen.phone.png", NULL); + elm_win_icon_object_set(ad->win, image); + + return image; +} + +static void __win_profile_changed_cb(void *data, Evas_Object *obj, void *event_info) +{ + struct phone_data *ad = data; + p_retm_if(NULL == ad || NULL == ad->phoneui_d, "data is null"); + + const char *profile = elm_config_profile_get(); + + if(!strcmp(profile, "desktop")) { + Elm_Object_Item *navi_item = elm_naviframe_bottom_item_get(ad->phoneui_d->navi); + ad->prev_btn = elm_object_item_part_content_unset(navi_item, "prev_btn"); + ad->phoneui_d->is_desktop_mode = true; + elm_win_indicator_mode_set(ad->win, ELM_WIN_INDICATOR_HIDE); + if(!ad->phoneui_d->icon) + ad->phoneui_d->icon = _set_win_icon(ad); + } + else { + Elm_Object_Item *selected_it = elm_toolbar_selected_item_get(ad->phoneui_d->tabbar); + ad->phoneui_d->is_desktop_mode = false; + + if (selected_it != ad->phoneui_d->item[PH_VIEW_DIALER]) { + Elm_Object_Item *navi_item = elm_naviframe_bottom_item_get(ad->phoneui_d->navi); + if (ad->prev_btn) { + elm_object_item_part_content_set(navi_item, "prev_btn", ad->prev_btn); + ad->prev_btn = NULL; + } + } + + elm_win_indicator_mode_set(ad->win, ELM_WIN_INDICATOR_SHOW); + } +} +#endif + +static bool phapp_create(void *data) +{ + PH_FN_CALL; + contacts_error_e err = CONTACTS_ERROR_NONE; + Evas_Object *win; + struct phone_data *ad = data; + + { + // Emulator does not support Dial/Log + char *pszModelName = NULL; + int ret = SYSTEM_INFO_ERROR_NONE; + ret = system_info_get_value_string(SYSTEM_INFO_KEY_MODEL, &pszModelName); + if (ret == SYSTEM_INFO_ERROR_NONE && pszModelName != NULL) + { + PH_DBG("SYSTEM_INFO_KEY_MODEL : %s", pszModelName); + + if(strcasestr(pszModelName, "Emulator") != NULL) + { + free(pszModelName); + return false; + } + free(pszModelName); + } + } + + + /* create window */ + win = phapp_create_win(PACKAGE); + p_retvm_if(NULL == win, -1, "phapp_create_win() Failed"); + ad->win = win; + + evas_object_show(win); +#ifdef _PHONE_CONTACTS_DESKTOP_MODE_ + evas_object_smart_callback_add(ad->win, "profile,changed", __win_profile_changed_cb, ad); +#endif + bindtextdomain(PACKAGE, LOCALEDIR); + + err = contacts_connect2(); + if (CONTACTS_ERROR_NONE != err) { + Evas_Object *popup; + ERR("contacts_connect2() Failed(%d)", err); + popup = elm_popup_add(win); + evas_object_size_hint_weight_set(popup, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_show(popup); + elm_object_text_set(popup, T_(PH_GET_TEXT_BASIC, PHTEXT_INITIALIZING)); + elm_popup_timeout_set(popup, 1.5); + evas_object_smart_callback_add(popup, "timeout", phapp_win_del, NULL); + return true; + } + + UG_INIT_EFL(ad->win, UG_OPT_INDICATOR_ENABLE); + ad->phoneui_d = phone_front_view_create(ad->win); + + appcore_set_open_cb(phapp_open, data); + + return true; +} + +static void phapp_terminate(void *data) +{ + PH_FN_CALL; + contacts_error_e err = CONTACTS_ERROR_NONE; + struct phone_data *ad = data; + + //ug_destroy_all(); + if (NULL != ad->win) + evas_object_del(ad->win); + err = contacts_disconnect2(); + p_warn_if(CONTACTS_ERROR_NONE != err, "contacts_disconnect2() Failed(%d)", err); + return; +} + +static void phapp_pause(void *data) +{ + PH_FN_CALL; + struct phone_data *ad = data; + phone_front_view_pause(ad->phoneui_d); + ug_pause(); + return; +} + +static void phapp_resume(void *data) +{ + PH_FN_CALL; + // update missed log info + struct phone_data *ad = data; + phone_front_view_resume(ad->phoneui_d); + ug_resume(); + return; +} + +static void phapp_service(service_h service, void *data) +{ + PH_FN_CALL; + struct phone_data *ad = data; + ph_phoneui_data *phoneui_d; + char* val = NULL; + int ret; + + p_retm_if(NULL == ad || NULL == ad->phoneui_d, "data is null"); + phoneui_d = ad->phoneui_d; + + ret = service_get_operation(service, &val); + p_warn_if(SERVICE_ERROR_NONE != ret, "service_get_operation is failed(%d)", ret); + + if (val){ + if (0 == strcmp(val, SERVICE_OPERATION_DIAL)) { + PH_DBG("operation : %s", val); + free(val); + val = NULL; + ret = service_get_uri(service, &val); + p_warn_if(SERVICE_ERROR_NONE != ret, "service_get_uri is failed(%d)", ret); + if (val && 0 == strncmp(val, "tel:", 4)) { + phone_front_view_reset(phoneui_d, PH_VIEW_DIALER, PH_FRONT_DIALER_WITH_NUM, service); + free(val); + } + return; + } else { + PH_DBG("operation : %s", val); + free(val); + val = NULL; + } + } else { + PH_DBG("no operation."); + } + + ret = service_get_extra_data(service, "MMICHECK_SEND", &val); + p_warn_if(SERVICE_ERROR_NONE != ret, "service_get_extra_data is failed(%d)", ret); + if (val && 0 == strcmp(val, "1")) { + PH_DBG("MMICHECK_SEND detected"); + phone_front_view_reset(phoneui_d, PH_VIEW_DIALER, PH_FRONT_DIALER_WITH_SEND_KEY, NULL); + free(val); + return; + } + + // missed_call : show log main view, from idle_lock, quickpanel + ret = service_get_extra_data(service, "logs", &val); + p_warn_if(SERVICE_ERROR_NONE != ret, "service_get_extra_data is failed(%d)", ret); + PH_DBG("logs : %s", SAFE_STR(val)); + if (val && 0 == strcmp(val, "missed_call")) { + phone_front_view_reset(phoneui_d, PH_VIEW_LOG, PH_FRONT_LOG_MISSED, NULL); + free(val); + return; + } + + ret = service_get_extra_data(service, "launch_type", &val); + p_warn_if(SERVICE_ERROR_NONE != ret, "service_get_extra_data is failed(%d)", ret); + PH_DBG("launch_type : %s", SAFE_STR(val)); + if (val && *val) { + if (0 == strcmp(val, "log")) + phone_front_view_reset(phoneui_d, PH_VIEW_LOG, -1, NULL); + else if (0 == strcmp(val, "favorite")) + phone_front_view_reset(phoneui_d, PH_VIEW_FAVORITE, -1, NULL); + else if (0 == strcmp(val, "dialer")) { + if (phone_front_view_show_call_app(phoneui_d)) { + if(phoneui_d->select_tab < PH_VIEW_DIALER) + elm_exit(); + } + else + phone_front_view_reset(phoneui_d, PH_VIEW_DIALER, -1, NULL); + } + else + phone_front_view_reset(phoneui_d, PH_VIEW_DIALER, -1, NULL); + free(val); + return; + } + + ret = service_get_extra_data(service, "tab", &val); + p_warn_if(SERVICE_ERROR_NONE != ret, "service_get_extra_data is failed(%d)", ret); + PH_DBG("tab : %s", SAFE_STR(val)); + if (val && *val) { + if (!strcmp(val, "dialer")) { + phone_front_view_reset(phoneui_d, PH_VIEW_DIALER, -1, NULL); + free(val); + return; + } + } + + elm_win_lower(phoneui_d->win); + return; +} + +API int main(int argc, char *argv[]) +{ + struct phone_data ad = {0}; + app_event_callback_s event_callback = {0,}; + + event_callback.create = phapp_create; + event_callback.terminate = phapp_terminate; + event_callback.pause = phapp_pause; + event_callback.resume = phapp_resume; + event_callback.service = phapp_service; + event_callback.low_memory = NULL; + event_callback.low_battery = NULL; + event_callback.region_format_changed = phapp_region_changed; + event_callback.language_changed = phapp_language_changed; + event_callback.device_orientation = NULL; + + return app_efl_main(&argc, &argv, &event_callback, &ad); +} + |