3 * * Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd.
5 * Contact: MyoungJune Park <mj2004.park@samsung.com>
7 * Licensed under the Apache License, Version 2.0 (the "License");
8 * you may not use this file except in compliance with the License.
9 * You may obtain a copy of the License at
11 * http://www.apache.org/licenses/LICENSE-2.0
13 * Unless required by applicable law or agreed to in writing, software
14 * distributed under the License is distributed on an "AS IS" BASIS,
15 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16 * See the License for the specific language governing permissions and
17 * limitations under the License.
22 #include <sound_manager.h>
24 #include <appcore-common.h>
28 #include <app_preference.h>
30 #include "setting-helper.h"
31 #include "setting-main.h"
32 #include <setting-cfg.h>
34 #include <setting-common-search.h>
35 #include <elm_object.h>
39 #include <system_settings.h>
40 #include <bundle_internal.h>
42 /*#define SUPPORT_UG_MESSAGE */
45 #define SETTING_SOUND_VOL_MAX 15
46 #define SETTING_DEFAULT_RINGTONE_VOL_INT 11
47 #define SETTING_DEFAULT_NOTI_VOL_INT 11
48 #define SETTING_DEFAULT_MEDIA_VOL_INT 9
50 int g_geometry_x, g_geometry_y, g_geometry_w, g_geometry_h;
51 extern int aul_listen_app_dead_signal(int (*func)(int signal, void *data), void *data);
53 /* This API is defined in <app_service_private.h>. But, cannot include and it is not a managed API.
54 The way to resolve : 1. Add extern.
55 2. Use bundle pointer originally
56 At first, choose No.1 */
57 extern int app_control_create_request(bundle *data, app_control_h *service);
59 setting_main_appdata *g_main_ad;
61 void termination_handler(int signum)
64 /* do something for signal handling */
65 /*SETTING_TRACE_DEBUG(">>>>>>>>>>>>>>>>> SIGTERM >>>>>>>>>>>>>>> SETTING "); */
71 #if LOW_BATTERY_DO_NOTHING
73 /* in case of low battery, don't terminate itself.*/
76 * The event process when battery becomes low.
78 static void setting_main_low_battery_cb(app_event_info_h event_info, void *data)
81 retm_if(!data, "Invalid argument: data is NULL");
82 setting_main_appdata *ad = data;
85 ug_send_event(UG_EVENT_LOW_BATTERY);
91 #if SUPPORT_APP_ROATION
92 static void _rot_changed_cb(void *data, Evas_Object *obj, void *event_info)
95 setting_main_appdata *ad = (setting_main_appdata *)data;
96 if (ad == NULL || ad->win_main == NULL) {
99 int change_ang = elm_win_rotation_get(ad->win_main);
100 SETTING_TRACE_DEBUG("....change_ang:%d", change_ang);
101 SETTING_TRACE_DEBUG("current_rotation:%d", ad->current_rotation);
102 /*Send the rotation event to UGs.. */
103 enum ug_event event = UG_EVENT_ROTATE_PORTRAIT;
104 switch (change_ang) {
105 case APP_DEVICE_ORIENTATION_0:
106 event = UG_EVENT_ROTATE_PORTRAIT;
108 case APP_DEVICE_ORIENTATION_180:
109 event = UG_EVENT_ROTATE_PORTRAIT_UPSIDEDOWN;
111 case APP_DEVICE_ORIENTATION_270:
112 event = UG_EVENT_ROTATE_LANDSCAPE;
114 case APP_DEVICE_ORIENTATION_90:
115 event = UG_EVENT_ROTATE_LANDSCAPE_UPSIDEDOWN;
120 SETTING_TRACE_DEBUG("diff:%d", elm_win_rotation_get(ad->win_main) - ad->current_rotation);
122 if (change_ang != ad->current_rotation) {
123 int diff = change_ang - ad->current_rotation;
128 * @todo if app didn't launch UG, is the call required to invoke?
130 ug_send_event(event);
134 ad->current_rotation = change_ang;
141 * The event process when region is changes.
143 static void setting_main_region_changed_cb(app_event_info_h event_info, void *data)
145 retm_if(!data, "Invalid argument: data is NULL");
146 setting_main_appdata *ad = data;
149 ug_send_event(UG_EVENT_REGION_CHANGE);
154 * The event process when win object is destroyed
156 static void setting_main_del_win(void *data, Evas_Object *obj, void *event)
162 * To create a win object, the win is shared between the App and all its UGs
164 static Evas_Object *setting_main_create_win(const char *name)
171 eo = (Evas_Object *) elm_win_add(NULL, name, ELM_WIN_BASIC);
173 eo = elm_win_util_standard_add(name, name);
175 /* elm_win_util_standard_add creates bg inside */
184 evas_object_size_hint_weight_set(bg, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
185 elm_win_resize_object_add(eo, bg);
186 evas_object_show(bg);
189 elm_win_title_set(eo, name);
190 evas_object_smart_callback_add(eo, "delete,request", setting_main_del_win, NULL);
191 ecore_x_window_size_get(ecore_x_window_root_first_get(),
193 evas_object_resize(eo, w, h);
195 LAUNCH_SETTING_OUT();
201 * exceptional process, reset the env vars by Setting vconf VCONFKEY_LANGSET
203 static void setting_main_lang_changed_cb(app_event_info_h event_info, void *data)
206 retm_if(!data, "Invalid argument: data is NULL");
207 /*FIX the crash when switch from Portrait mode to landscape mode, */
208 /*It is so strange the data is no longer correct */
209 /*and ....why it is invoked */
210 /*setting_main_appdata *ad = data; */
211 setting_main_appdata *ad = g_main_ad;
214 elm_object_item_part_text_set(ad->navibar_main_it, "elm.text.title", _("IDS_ST_OPT_SETTINGS"));
215 //setting_navi_items_update(ad->navibar_main);
217 char* localeLanguage = NULL;
218 system_settings_get_value_string(SYSTEM_SETTINGS_KEY_LOCALE_LANGUAGE, &localeLanguage);
219 elm_language_set(localeLanguage);
220 free(localeLanguage);
222 if (ad->isInUGMode && ad->ug) {
224 Evas_Object *layout = (Evas_Object *)ug_get_layout(ad->ug);
226 Evas_Object *navi_bar = NULL;
227 navi_bar = elm_object_part_content_get(layout, "elm.swallow.content");
228 setting_navi_items_update(navi_bar);
231 ug_send_event(UG_EVENT_LANG_CHANGE);
236 * the event process when other VCONFS changes
238 static void setting_other_vconf_change_cb(keynode_t *key, void *data)
240 setting_main_appdata *ad = data;
241 retm_if(!data, "Invalid argument: data is NULL");
243 Setting_GenGroupItem_Data *item_to_update = NULL;
244 char *vconf_name = vconf_keynode_get_name(key);
245 SETTING_TRACE("the value of [ %s ] just changed", vconf_name);
248 if (!safeStrCmp(vconf_name, VCONFKEY_SETAPPL_DEVELOPER_OPTION_STATE)) {
249 #ifndef BINARY_RELEASE_TYPE_ENG
250 /*for user binary: need to check develop_option_state vconf value*/
251 if (ad->sub_view[SETTING_TAB_VIEW_GENERAL]) {
252 SETTING_TRACE("redraw Gernel Tab");
253 evas_object_del(ad->sub_view[SETTING_TAB_VIEW_GENERAL]);
254 ad->sub_view[SETTING_TAB_VIEW_GENERAL] = NULL;
256 setting_search_genlist_update(ad);
262 * the event process when int VCONFS changes
263 * @todo code clean - it has big if-else structure
265 static void setting_int_vconf_change_cb(keynode_t *key, void *data)
267 setting_main_appdata *ad = data;
268 retm_if(!data, "Invalid argument: data is NULL");
270 int status = vconf_keynode_get_int(key);
271 char *vconf_name = vconf_keynode_get_name(key);
272 SETTING_TRACE("Enter %s(%s=%d)", __FUNCTION__, vconf_name, status);
278 * the event process when string VCONFS changes
280 static void setting_string_vconf_change_cb(keynode_t *key, void *data)
282 setting_main_appdata *ad = data;
283 retm_if(!data, "Invalid argument: data is NULL");
285 char *value = vconf_keynode_get_str(key);
286 char *vconf_name = vconf_keynode_get_name(key);
287 SETTING_TRACE("Enter %s(%s=%s)", __FUNCTION__, vconf_name, value);
292 * The function is called to create Setting view widgets
294 static bool setting_main_app_create(void *data)
298 SETTING_TRACE_DEBUG("[TIME] 3. it taked %d msec from main to setting_main_app_create ", appcore_measure_time());
299 appcore_measure_start();
301 /*elm_config_accel_preference_set("3d"); */
302 ug_create_cb(setting_ug_create_cb, NULL);
305 setenv("EVAS_DRI_SWAPBUF", "1", 1);
308 setting_main_appdata *ad = data;
309 /* regitering sigterm */
310 if (signal(SIGTERM, termination_handler) == SIG_IGN) {
311 signal(SIGTERM, SIG_IGN);
314 app_event_handler_h handlers[5] = {NULL, };
315 #if LOW_BATTERY_DO_NOTHING
316 ui_app_add_event_handler(&handlers[APP_EVENT_LOW_BATTERY], APP_EVENT_LOW_BATTERY, setting_main_low_battery_cb, ad);
318 ui_app_add_event_handler(&handlers[APP_EVENT_LANGUAGE_CHANGED], APP_EVENT_LANGUAGE_CHANGED, setting_main_lang_changed_cb, ad);
319 ui_app_add_event_handler(&handlers[APP_EVENT_REGION_FORMAT_CHANGED], APP_EVENT_REGION_FORMAT_CHANGED, setting_main_region_changed_cb, ad);
320 ui_app_add_event_handler(&handlers[APP_EVENT_DEVICE_ORIENTATION_CHANGED], APP_EVENT_DEVICE_ORIENTATION_CHANGED, NULL, NULL); /* no callback */
325 app_control_create(&svc);
326 /*app_control_create_request(b, &svc); */
327 /*ad->is_searchmode = setting_main_sfinder_handler(svc, ad, NULL); */
328 app_control_destroy(svc);
331 /*--------------------------------------------------------------------------------------------- */
333 elm_app_base_scale_set(2.4);
336 ad->win_main = setting_main_create_win(SETTING_PACKAGE);
337 setting_retvm_if(ad->win_main == NULL, SETTING_RETURN_FAIL, "window is null");
338 UG_INIT_EFL(ad->win_main, UG_OPT_INDICATOR_ENABLE);
339 ad->evas = evas_object_evas_get(ad->win_main);
340 ad->current_rotation = elm_win_rotation_get(ad->win_main);
341 SETTING_TRACE_DEBUG("ad->current_rotation:%d", ad->current_rotation);
342 if (elm_win_wm_rotation_supported_get(ad->win_main)) {
343 int rots[4] = { 0, 90, 180, 270 }; /* rotation value that app may want */
344 elm_win_wm_rotation_available_rotations_set(ad->win_main, rots, 4);
346 evas_object_smart_callback_add(ad->win_main, "wm,rotation,changed", _rot_changed_cb, ad);
348 /* load config file */
349 int cfg_operation_ret = setting_cfg_init();
350 /*PLUGIN_INIT(ad); */
351 /*if ( ! ad->is_searchmode) */
353 elm_theme_extension_add(NULL, SETTING_THEME_EDJ_NAME);
354 elm_theme_extension_add(NULL, SETTING_NEWUX_EDJ_NAME);
355 elm_theme_extension_add(NULL, SETTING_GENLIST_EDJ_NAME);
356 elm_theme_extension_add(NULL, SETTING_NEW_GENLIST_EDJ_NAME);
357 elm_theme_extension_add(NULL, SETTING_SLIDER_EDJ_NAME);
360 elm_win_indicator_mode_set(ad->win_main, ELM_WIN_INDICATOR_SHOW);
361 elm_win_indicator_opacity_set(ad->win_main, ELM_WIN_INDICATOR_OPAQUE);
363 evas_object_show(ad->win_main);
366 setting_view_create(&setting_view_main, ad);
369 if (Cfg_Error_Type_Sucess != cfg_operation_ret) {
370 SETTING_TRACE_ERROR("cfg_operation_ret: %d", cfg_operation_ret);
371 const char *notifyStr = NULL;
372 switch (cfg_operation_ret) {
374 case Cfg_Error_Type_CreateCfg_Failed: {
375 notifyStr = _("failed to create config file, <br>re-install org.tizen.setting please");
378 case Cfg_Error_Type_Mkdir_Failed: {
379 notifyStr = _("file system missed<br>/opt/usr/data/setting, <br>re-install org.tizen.setting please");
382 case Cfg_Error_Type_RemoveCfg_Failed: {
383 notifyStr = _("config file size 0 byte<br>and failed to re-create it.<br>try to startup the app again");
386 case Cfg_Error_Type_ReadCfg_Failed: {
387 notifyStr = _("failed to read config file, <br>try to startup the app again");
390 case Cfg_Error_Type_DirPermissionDenied: {
392 _("the dir of config file permission denied");
395 case Cfg_Error_Type_FilePermissionDenied: {
396 notifyStr = _("config file permission denied");
400 notifyStr = _("Invalid Result, try to startup the app again");
404 setting_create_popup(ad, ad->win_main, NULL, (char *)notifyStr, NULL, 10, FALSE, FALSE, 0);
405 return SETTING_RETURN_FAIL;
409 SETTING_TRACE_DEBUG("[TIME] 4. setting_main_app_create taked %d msec ", appcore_measure_time());
410 appcore_measure_start();
411 LAUNCH_SETTING_OUT();
416 * The function is called when Setting is terminated
418 static void setting_main_app_terminate(void *data)
421 setting_main_appdata *ad = data;
422 vconf_set_bool(VCONFKEY_SETAPPL_ROTATE_HOLD_BOOL, FALSE);
423 evas_object_smart_callback_del(ad->win_main, "wm,rotation,changed", _rot_changed_cb);
427 clear_system_service_data();
432 ug_create_cb(NULL , NULL);
434 SETTING_TRACE_DEBUG("%s*** SETTING APPLICATION CLOSED ***%s", SETTING_FONT_BGREEN, SETTING_FONT_BLACK);
435 DEREGISTER_VCONFS(ad->listened_list);
438 setting_view_destroy(&setting_view_main, ad);
440 SETTING_TRACE_DEBUG("!!! After setting_view_destroy");
442 evas_object_del(ad->win_main);
456 * The function is called when Setting begins run in background from forground
458 static void setting_main_app_pause(void *data)
461 setting_main_appdata *ad = data;
468 * The function is called when Setting begins run in forground from background
470 static void setting_main_app_resume(void *data)
473 setting_main_appdata *ad = data;
475 _rot_changed_cb(ad, ad->win_main, NULL);/*to fix P131121-02103 */
477 if (ad->is_searchmode % 10 == Cfg_Item_AppLauncher_Node) {
478 /* app-launching exit */
482 if (!(ad->isInUGMode && ad->ug)) { /* top-level view is not on UG */
483 SETTING_TRACE("update main genlist in resuming app without UG");
484 Eina_Bool is_freezed = evas_object_freeze_events_get(ad->navibar_main);
485 SETTING_TRACE_DEBUG("is_freezed : %d", is_freezed);
487 evas_object_freeze_events_set(ad->navibar_main, EINA_FALSE);
496 * The function is called by app-fwk after app_create. It always do the process which cost much time.
498 static void setting_main_app_reset(app_control_h service, void *data)
501 setting_main_appdata *ad = data;
503 if (is_searchmode_app(ad->is_searchmode)) {
504 evas_object_hide(ad->view_layout);
506 evas_object_show(ad->view_layout);
508 vconf_callback_fn cb = NULL;
510 cb = setting_int_vconf_change_cb;
511 REGISTER_VCONF_NODE(ad->listened_list, VCONFKEY_BT_STATUS, cb, data);
512 REGISTER_VCONF_NODE(ad->listened_list, VCONFKEY_WIFI_STATE, cb, ad);
514 REGISTER_VCONF_NODE(ad->listened_list, VCONFKEY_SETAPPL_BRIGHTNESS_AUTOMATIC_INT, cb, data);
515 REGISTER_VCONF_NODE(ad->listened_list, VCONFKEY_SETAPPL_LCD_TIMEOUT_NORMAL, cb, data);
516 REGISTER_VCONF_NODE(ad->listened_list, VCONFKEY_SETAPPL_ACCESSIBILITY_FONT_SIZE, cb, data);
517 REGISTER_VCONF_NODE(ad->listened_list, VCONFKEY_SYSMAN_BATTERY_CAPACITY, cb, data);
519 cb = setting_string_vconf_change_cb;
520 REGISTER_VCONF_NODE(ad->listened_list, VCONFKEY_WIFI_CONNECTED_AP_NAME, cb, ad);
521 REGISTER_VCONF_NODE(ad->listened_list, VCONFKEY_SETAPPL_SCREENMODE_SELNAME, cb, ad);
522 REGISTER_VCONF_NODE(ad->listened_list, VCONFKEY_BGSET, cb, ad);
523 REGISTER_VCONF_NODE(ad->listened_list, VCONFKEY_IDLE_LOCK_BGSET, cb, ad);
525 cb = setting_other_vconf_change_cb;
526 REGISTER_VCONF_NODE(ad->listened_list, VCONFKEY_SETAPPL_USB_MODE_INT, cb, ad);
527 REGISTER_VCONF_NODE(ad->listened_list, VCONFKEY_SETAPPL_AUTO_ROTATE_SCREEN_BOOL, cb, ad);
528 REGISTER_VCONF_NODE(ad->listened_list, VCONFKEY_TELEPHONY_FLIGHT_MODE, cb, ad);
529 REGISTER_VCONF_NODE(ad->listened_list, VCONFKEY_SETAPPL_SOUND_STATUS_BOOL, cb, ad);
530 REGISTER_VCONF_NODE(ad->listened_list, VCONFKEY_SETAPPL_VIBRATION_STATUS_BOOL, cb, ad);
531 #ifndef BINARY_RELEASE_TYPE_ENG
532 REGISTER_VCONF_NODE(ad->listened_list, VCONFKEY_SETAPPL_DEVELOPER_OPTION_STATE, cb, ad);
535 /*---------------------------------------------------------------------------------- */
537 /*---------------------------------------------------------------------------------- */
540 elm_win_activate(ad->win_main);
543 /* Disable data_network if flight mode is ON */
545 vconf_get_bool(VCONFKEY_TELEPHONY_FLIGHT_MODE, &flight_mode);
547 if (ad->data_network) setting_disable_genlist_item(ad->data_network->item);
552 int main(int argc, char *argv[])
555 setting_main_appdata ad;
557 SETTING_TRACE_DEBUG("[TIME] 1. aul_launch -> main :: Setting main : %d msec ", appcore_measure_time_from("APP_START_TIME"));
558 appcore_measure_start();
561 ui_app_lifecycle_callback_s ops = {
562 .create = setting_main_app_create,
563 .terminate = setting_main_app_terminate,
564 .pause = setting_main_app_pause,
565 .resume = setting_main_app_resume,
566 .app_control = setting_main_app_reset,
568 memset(&ad, 0x00, sizeof(setting_main_appdata));
571 b = bundle_import_from_argv(argc, argv);
574 SETTING_TRACE_DEBUG("[TIME] 2. main : %d msec ", appcore_measure_time());
575 appcore_measure_start();
576 r = ui_app_main(argc, argv, &ops, &ad);
577 retv_if(r == -1, -1);