Tizen release 1.0
[apps/home/settings.git] / setting-profile / src / setting-profile-sound-main.c
1 /*
2  * setting
3  *
4  * Copyright (c) 2000 - 2012 Samsung Electronics Co., Ltd All Rights Reserved 
5  *
6  * This file is part of org.tizen.setting
7  * Written by Hyejin Kim <hyejin0906.kim@samsung.com>
8  *
9  * PROPRIETARY/CONFIDENTIAL
10  * 
11  * This software is the confidential and proprietary information of 
12  * SAMSUNG ELECTRONICS ("Confidential Information"). You shall not
13  * disclose such Confidential Information and shall use it only in
14  * accordance with the terms of the license agreement you entered
15  * into with SAMSUNG ELECTRONICS.
16  *
17  * SAMSUNG make no representations or warranties about the suitability 
18  * of the software, either express or implied, including but not limited
19  * to the implied warranties of merchantability, fitness for a particular
20  * purpose, or non-infringement. SAMSUNG shall not be liable for any
21  * damages suffered by licensee as a result of using, modifying or
22  * distributing this software or its derivatives.
23  *
24  */
25 #include <setting-profile-sound-main.h>
26 #include <setting-common-resource.h>
27
28
29 #define SOUND_DESC "IDS_ST_BODY_ADJUST_VOLUME_AND_INTENSITY_FOR_SOUNDS_WHEN_MSG"
30
31 static int setting_profile_sound_main_create(void *cb);
32 static int setting_profile_sound_main_destroy(void *cb);
33 static int setting_profile_sound_main_update(void *cb);
34 static int setting_profile_sound_main_cleanup(void *cb);
35
36 setting_view setting_view_profile_sound_main = {
37         .create = setting_profile_sound_main_create,
38         .destroy = setting_profile_sound_main_destroy,
39         .update = setting_profile_sound_main_update,
40         .cleanup = setting_profile_sound_main_cleanup,
41 };
42
43 /* ***************************************************
44  *
45  *basic func
46  *
47  ***************************************************/
48 void __change_state_of_sliderbars(void *data)
49 {
50         ret_if(data == NULL);
51         SettingProfileUG *ad = (SettingProfileUG *) data;
52
53         int sound_on = TRUE;
54         int vibration_on = TRUE;
55
56         if (vconf_get_bool(VCONFKEY_SETAPPL_SOUND_STATUS_BOOL, &sound_on) == 0) {
57                 if (sound_on == FALSE) {
58                         /*  disable slider bar of call ringtone, notification, media, and system volume */
59                         if (ad->data_call_volume) {
60                                 setting_disable_genlist_item(ad->data_call_volume->item);
61                         }
62                         if (ad->data_noti_volume) {
63                                 setting_disable_genlist_item(ad->data_noti_volume->item);
64                         }
65                         if (ad->data_media_volume) {
66                                 setting_disable_genlist_item(ad->data_media_volume->item);
67                         }
68                         if (ad->data_touch_volume) {
69                                 setting_disable_genlist_item(ad->data_touch_volume->item);
70                         }
71                 }
72         }
73
74         if (vconf_get_bool(VCONFKEY_SETAPPL_VIBRATION_STATUS_BOOL, &vibration_on) == 0) {
75                 if (vibration_on == FALSE) {
76                         /*  disable slider bar of notification and system vibration */
77                         if (ad->data_vib_volume) {
78                                 setting_disable_genlist_item(ad->data_vib_volume->item);
79                         }
80                         if (ad->data_touch_vib) {
81                                 setting_disable_genlist_item(ad->data_touch_vib->item);
82                         }
83                 }
84         }
85 }
86
87 void __sound_sub_list_sel_cb(void *data, Evas_Object *obj, void *event_info)
88 {
89         /* error check */
90         retm_if(event_info == NULL, "Invalid argument: event info is NULL");
91         retm_if(data == NULL, "Invalid argument: data is NULL");
92         
93         SettingProfileUG *ad = (SettingProfileUG *) data;
94         Elm_Object_Item *subitem = (Elm_Object_Item *) event_info;
95         Elm_Object_Item *parentItem = elm_genlist_item_parent_get(subitem);
96         elm_genlist_item_selected_set(subitem, 0);
97         Setting_GenGroupItem_Data *data_subItem = elm_object_item_data_get(subitem);
98         Setting_GenGroupItem_Data *data_parentItem = elm_object_item_data_get(parentItem);
99         if (NULL == data_subItem || NULL == data_parentItem)
100                 return;
101
102         elm_radio_value_set(data_subItem->rgd, data_subItem->chk_status);
103         int err;
104         setting_set_int_slp_key(data_parentItem->int_slp_setting_binded,
105                                 data_subItem->chk_status, &err);
106
107         if (data_parentItem) {
108                 data_parentItem->sub_desc =
109                     (char *)g_strdup(_(data_subItem->keyStr));
110                 elm_object_item_data_set(data_parentItem->item, data_parentItem);
111                 elm_genlist_item_update(data_parentItem->item);
112         }
113
114         if (data_parentItem->int_slp_setting_binded ==
115             INT_SLP_SETTING_CALL_ALERT_VIB) {
116                 if (device_haptic_stop_play(ad->hnd_hpt) != 0) {
117                         SETTING_TRACE("ERROR device_haptic_stop_play");
118                 }
119                 setting_profile_play_vibration(ad,
120                                                setting_profile_get_call_playing_vib_by_vconf_value
121                                                (data_subItem->chk_status));
122         }
123 }
124
125 static bool __mm_player_msg_cb(int message, MMMessageParamType *param, void *user_param)
126 {
127         retv_if(user_param == NULL, FALSE);
128         SettingProfileUG *ad = (SettingProfileUG *)user_param;
129         switch(message)
130         {
131                 case MM_MESSAGE_END_OF_STREAM:
132                         SETTING_TRACE_DEBUG("End of Stream");
133                         setting_profile_close_all_mm_players(ad);
134                         return TRUE;
135                 default:
136                         return FALSE;
137         }
138 }
139 Eina_Bool __volume_timer_cb(void *data)
140 {
141         SETTING_TRACE_BEGIN;
142         retv_if(data == NULL, EINA_FALSE);
143         SettingProfileUG *ad = (SettingProfileUG *)data;
144         double value = 0.0;
145
146         SETTING_TRACE_DEBUG("cur_vol_type : %d", ad->cur_vol_type);
147
148         switch(ad->cur_vol_type)
149         {
150                 case SETTING_VOL_TYPE_RINGTONE:
151                         if(ad->data_call_volume)
152                         {
153                                 value = elm_slider_value_get(ad->data_call_volume->eo_check);
154                                 mm_sound_volume_set_value(VOLUME_TYPE_RINGTONE, (unsigned int)(value+0.5));
155                         }
156                         break;
157                 case SETTING_VOL_TYPE_NOTIFICATION:
158                         if(ad->data_noti_volume)
159                         {
160                                 value = elm_slider_value_get(ad->data_noti_volume->eo_check);
161                                 mm_sound_volume_set_value(VOLUME_TYPE_NOTIFICATION, (unsigned int)(value+0.5));
162                         }
163                         break;
164                 case SETTING_VOL_TYPE_MEDIA:
165                         if(ad->data_media_volume)
166                         {
167                                 value = elm_slider_value_get(ad->data_media_volume->eo_check);
168                                 mm_sound_volume_set_value(VOLUME_TYPE_MEDIA, (unsigned int)(value+0.5));
169                         }
170                         break;
171                 case SETTING_VOL_TYPE_SYSTEM:
172                         if(ad->data_touch_volume)
173                         {
174                                 value = elm_slider_value_get(ad->data_touch_volume->eo_check);
175                                 mm_sound_volume_set_value(VOLUME_TYPE_SYSTEM, (unsigned int)(value+0.5));
176                         }
177                         break;
178                 case SETTING_VOL_TYPE_NOTI_VIB:
179                         if(ad->data_vib_volume)
180                         {
181                                 value = elm_slider_value_get(ad->data_vib_volume->eo_check);
182                                 vconf_set_int(VCONFKEY_SETAPPL_NOTI_VIBRATION_LEVEL_INT, (unsigned int)(value+0.5));
183                         }
184                         break;
185                 case SETTING_VOL_TYPE_HAPTIC_VIB:
186                         if(ad->data_touch_vib)
187                         {
188                                 value = elm_slider_value_get(ad->data_touch_vib->eo_check);
189                                 vconf_set_int(VCONFKEY_SETAPPL_TOUCH_FEEDBACK_VIBRATION_LEVEL_INT, (unsigned int)(value+0.5));
190                         }
191                         break;
192                 default:
193                         break;
194
195         }
196         return ECORE_CALLBACK_RENEW;
197 }
198
199 void __create_volume_timer(void *data, setting_volume_types type)
200 {
201         SETTING_TRACE_BEGIN;
202         ret_if(data == NULL);
203
204         SettingProfileUG *ad = (SettingProfileUG *)data;
205
206         if(ad->volume_timer)
207         {
208                 ecore_timer_del(ad->volume_timer);
209                 ad->volume_timer = NULL;
210                 SETTING_TRACE_DEBUG("[AA] volume timer is deleted");
211         }
212         ad->volume_timer = ecore_timer_add(SETTING_SOUND_VOLUME_TIMER_INTERVAL, (Ecore_Task_Cb)__volume_timer_cb, ad);
213 }
214
215 void __ringtone_start_change_cb(void *data, Evas_Object *obj, void *event_info)
216 {
217         ret_if(data == NULL);
218
219         Setting_GenGroupItem_Data *list_item = (Setting_GenGroupItem_Data *) data;
220         SettingProfileUG *ad = list_item->userdata;
221
222         ad->cur_vol_type = SETTING_VOL_TYPE_RINGTONE;
223         setting_profile_close_other_mm_players_but_type(ad, VOLUME_TYPE_RINGTONE);
224 }
225 void __noti_start_change_cb(void *data, Evas_Object *obj, void *event_info)
226 {
227         ret_if(data == NULL);
228
229         Setting_GenGroupItem_Data *list_item = (Setting_GenGroupItem_Data *) data;
230         SettingProfileUG *ad = list_item->userdata;
231
232         ad->cur_vol_type = SETTING_VOL_TYPE_NOTIFICATION;
233         setting_profile_close_other_mm_players_but_type(ad, VOLUME_TYPE_NOTIFICATION);
234 }
235 void __media_start_change_cb(void *data, Evas_Object *obj, void *event_info)
236 {
237         ret_if(data == NULL);
238
239         Setting_GenGroupItem_Data *list_item = (Setting_GenGroupItem_Data *) data;
240         SettingProfileUG *ad = list_item->userdata;
241
242         ad->cur_vol_type = SETTING_VOL_TYPE_MEDIA;
243         setting_profile_close_other_mm_players_but_type(ad, VOLUME_TYPE_MEDIA);
244 }
245 void __system_start_change_cb(void *data, Evas_Object *obj, void *event_info)
246 {
247         ret_if(data == NULL);
248
249         Setting_GenGroupItem_Data *list_item = (Setting_GenGroupItem_Data *) data;
250         SettingProfileUG *ad = list_item->userdata;
251
252         ad->cur_vol_type = SETTING_VOL_TYPE_SYSTEM;
253         setting_profile_close_other_mm_players_but_type(ad, VOLUME_TYPE_SYSTEM);
254 }
255
256 void __noti_vib_start_change_cb(void *data, Evas_Object *obj, void *event_info)
257 {
258         ret_if(data == NULL);
259
260         Setting_GenGroupItem_Data *list_item = (Setting_GenGroupItem_Data *) data;
261         SettingProfileUG *ad = list_item->userdata;
262
263         ad->cur_vol_type = SETTING_VOL_TYPE_NOTI_VIB;
264         setting_profile_close_all_mm_players(ad);
265 }
266         
267 void __haptic_vib_start_change_cb(void *data, Evas_Object *obj, void *event_info)
268 {
269         SETTING_TRACE_BEGIN;
270         ret_if(data == NULL);
271
272         Setting_GenGroupItem_Data *list_item = (Setting_GenGroupItem_Data *) data;
273         SettingProfileUG *ad = list_item->userdata;
274
275         ad->cur_vol_type = SETTING_VOL_TYPE_HAPTIC_VIB;
276         setting_profile_close_all_mm_players(ad);
277 }
278
279 void __volume_stop_change_cb(void *data, Evas_Object *obj, void *event_info)
280 {
281         SETTING_TRACE_BEGIN;
282         ret_if(data == NULL);
283
284         Setting_GenGroupItem_Data *list_item = (Setting_GenGroupItem_Data *) data;
285         SettingProfileUG *ad = list_item->userdata;
286
287         char                    *pa_tone_path = NULL;
288         MMHandleType    **player = NULL;
289
290         double                  value = elm_slider_value_get(obj);
291
292         switch(ad->cur_vol_type)
293         {
294                 case SETTING_VOL_TYPE_RINGTONE:
295                         mm_sound_volume_set_value(VOLUME_TYPE_RINGTONE, (unsigned int)(value+0.5));
296                         player = &(ad->mp_ringtone);
297                         if(*player != NULL)
298                                 return;
299                         SETTING_TRACE_DEBUG("ringtone player will be created");
300                         pa_tone_path = vconf_get_str(VCONFKEY_SETAPPL_CALL_RINGTONE_PATH_STR);
301                         if(pa_tone_path == NULL)
302                 {
303                                 pa_tone_path = SETTING_DEFAULT_CALL_TONE;
304                                 if(vconf_set_str(VCONFKEY_SETAPPL_CALL_RINGTONE_PATH_STR, SETTING_DEFAULT_CALL_TONE) < 0)
305                                 return; 
306                 }
307                         setting_profile_play_sound_origin(player, ad, __mm_player_msg_cb,
308                                                                                                 pa_tone_path,
309                                                                                                 (float)value,
310                                                                                                 MM_SOUND_VOLUME_TYPE_RINGTONE);
311                         break;
312                 case SETTING_VOL_TYPE_NOTIFICATION:
313                         mm_sound_volume_set_value(VOLUME_TYPE_NOTIFICATION, (unsigned int)(value+0.5));
314                         player = &(ad->mp_noti);
315                         if(*player != NULL)
316                                 return;
317                         SETTING_TRACE_DEBUG("noti player will be created");
318                         pa_tone_path = vconf_get_str(VCONFKEY_SETAPPL_NOTI_MSG_RINGTONE_PATH_STR);
319                         if(pa_tone_path == NULL)
320                         {
321                                 pa_tone_path = SETTING_DEFAULT_MSG_TONE;
322                                 if(vconf_set_str(VCONFKEY_SETAPPL_NOTI_MSG_RINGTONE_PATH_STR, SETTING_DEFAULT_MSG_TONE) < 0)
323                                         return;
324                         }
325                         setting_profile_play_sound_origin(player, ad, __mm_player_msg_cb,
326                                                                                                 pa_tone_path,
327                                                                                                 (float)value,
328                                                                                                 MM_SOUND_VOLUME_TYPE_NOTIFICATION);
329                         break;
330                 case SETTING_VOL_TYPE_MEDIA:
331                         mm_sound_volume_set_value(VOLUME_TYPE_MEDIA, (unsigned int)(value+0.5));
332                         player = &(ad->mp_media);
333                         if(*player != NULL)
334                                 return; 
335                         SETTING_TRACE_DEBUG("media player will be created");
336                         pa_tone_path = vconf_get_str(VCONFKEY_SETAPPL_MEDIA_TONE_PATH_STR);
337                         if(pa_tone_path == NULL)
338                         {
339                                 pa_tone_path = SETTING_DEFAULT_CALL_TONE;
340                                 if(vconf_set_str(VCONFKEY_SETAPPL_MEDIA_TONE_PATH_STR, SETTING_DEFAULT_CALL_TONE) < 0)
341                                         return;
342                         }
343                         setting_profile_play_sound_origin(player, ad, __mm_player_msg_cb,
344                                                                                                 pa_tone_path,
345                                                                                                 (float)value,
346                                                                                                 MM_SOUND_VOLUME_TYPE_MEDIA);
347                         break;
348                 case SETTING_VOL_TYPE_SYSTEM:
349                         mm_sound_volume_set_value(VOLUME_TYPE_SYSTEM, (unsigned int)(value+0.5));
350                         player = &(ad->mp_sys);
351                         if(*player != NULL)
352                                 return;
353                         SETTING_TRACE_DEBUG("ringtone player will be created");
354                         char pattern_file[MAX_COMMON_BUFFER_LEN] = {0,};
355                         svi_get_path(SVI_TYPE_SND, SVI_SND_OPERATION_VIBRATION, pattern_file, sizeof(pattern_file));
356
357                         setting_profile_play_sound_origin(player, ad, __mm_player_msg_cb,
358                                                                                                 pattern_file,
359                                                                                                 (float)value,
360                                                                                                 MM_SOUND_VOLUME_TYPE_SYSTEM);
361                         break;
362                 default:
363                         return; 
364         }
365         
366         __create_volume_timer(ad, ad->cur_vol_type);
367         FREE(pa_tone_path);
368
369         SETTING_TRACE_END;
370 }
371
372 void __vibration_stop_change_cb(void *data, Evas_Object *obj, void *event_info)
373 {
374         ret_if(data == NULL);
375
376         Setting_GenGroupItem_Data *list_item = (Setting_GenGroupItem_Data *) data;
377         SettingProfileUG *ad = list_item->userdata;
378
379         if (device_haptic_stop_play(ad->hnd_hpt) != 0) {
380                 SETTING_TRACE("ERROR device_haptic_stop_play");
381                 /* return; */
382         }
383
384         double value = 0.0;
385         switch(ad->cur_vol_type)
386         {
387                 case SETTING_VOL_TYPE_NOTI_VIB:
388                         if(ad->data_vib_volume)
389                         {
390                                 value = elm_slider_value_get(ad->data_vib_volume->eo_check);
391                                 vconf_set_int(VCONFKEY_SETAPPL_NOTI_VIBRATION_LEVEL_INT, (unsigned int)(value+0.5));
392                         }
393                         break;
394                 case SETTING_VOL_TYPE_HAPTIC_VIB:
395                         if(ad->data_touch_vib)
396                         {
397                                 value = elm_slider_value_get(ad->data_touch_vib->eo_check);
398                                 vconf_set_int(VCONFKEY_SETAPPL_TOUCH_FEEDBACK_VIBRATION_LEVEL_INT, (unsigned int)(value+0.5));
399                         }
400                         break;
401                 default:
402                         break;
403         }
404         ad->cur_vol_type = SETTING_VOL_TYPE_MAX;
405         SETTING_TRACE_END;
406 }
407
408 static Evas_Object *__get_main_list(void *data)
409 {
410         retv_if(data == NULL, NULL);
411         
412         SettingProfileUG *ad = (SettingProfileUG *) data;
413 #ifdef SUPPORT_TAB
414         if(ad->sub_view[SETTING_PROF_VIEW_VOL])
415                 return ad->sub_view[SETTING_PROF_VIEW_VOL];
416 #endif
417         Evas_Object *genlist = elm_genlist_add(ad->navi_bar);
418         retvm_if(genlist == NULL, NULL,
419                  "Cannot set genlist object as contento of layout");
420         elm_genlist_clear(genlist);     /* first to clear list */
421
422         int vconf_value = 0;
423         unsigned int mm_value = 0;
424
425         Elm_Object_Item *item = elm_genlist_item_append(genlist, 
426                                                                 &(ad->itc_seperator), NULL, NULL,
427                                                                 ELM_GENLIST_ITEM_NONE, NULL, NULL);
428         elm_genlist_item_select_mode_set(item, ELM_OBJECT_SELECT_MODE_DISPLAY_ONLY);
429         
430         /* a.use sound */
431         if (vconf_get_bool(VCONFKEY_SETAPPL_SOUND_STATUS_BOOL, &vconf_value) < 0)
432                 vconf_value = TRUE;     /*  default value of sound : on */
433         ad->data_sound =
434             setting_create_Gendial_field_def(genlist, &(ad->itc_1text_1icon),
435                                              setting_profile_sound_main_mouse_up_Gendial_list_cb,
436                                              ad, SWALLOW_Type_1TOGGLE, NULL,
437                                              NULL, vconf_value,
438                                              SETTING_SOUND_TEXT_SOUND, NULL,
439                                              setting_profile_sound_main_Gendial_chk_cb);
440         if (ad->data_sound) {
441                 ad->data_sound->userdata = ad;
442         } else {
443                 SETTING_TRACE_ERROR("ad->data_sound is NULL");
444         }
445         /* b.use vib */
446         if (vconf_get_bool(VCONFKEY_SETAPPL_VIBRATION_STATUS_BOOL, &vconf_value) < 0)
447                 vconf_value = TRUE;     /*  default value of vibration : on */
448         ad->data_vibration =
449             setting_create_Gendial_field_def(genlist, &(ad->itc_1text_1icon),
450                                              setting_profile_sound_main_mouse_up_Gendial_list_cb,
451                                              ad, SWALLOW_Type_1TOGGLE, NULL,
452                                              NULL, vconf_value,
453                                              SETTING_SOUND_TEXT_VIBRATION, NULL,
454                                              setting_profile_sound_main_Gendial_chk_cb);
455         if (ad->data_vibration) {
456                 ad->data_vibration->userdata = ad;
457         } else {
458                 SETTING_TRACE_ERROR("ad->data_vibration is NULL");
459         }
460
461         (void)setting_create_Gendial_field_titleItem(genlist,
462                                                      &(ad->itc_group_item),
463                                                      "IDS_ST_BODY_VOLUME", NULL);
464
465         /* d.call volumn. */
466         if(mm_sound_volume_get_value(VOLUME_TYPE_RINGTONE, &mm_value) < 0)
467                 mm_value = SETTING_DEFAULT_RINGTONE_VOL_INT;
468         ad->data_call_volume =
469             setting_create_Gendial_field_def(genlist, &(ad->itc_layout), NULL,
470                                              NULL,
471                                              SWALLOW_Type_LAYOUT_SLIDER_WITH_TITLE,
472                                              IMG_SLIDER_BTN_VOLUME01,
473                                              IMG_SLIDER_BTN_VOLUME02, mm_value,
474                                              SETTING_SOUND_TEXT_INCOMING_CALL,
475                                              NULL,
476                                              setting_profile_sound_main_call_ringtone_sound_slider_value_change_cb);
477         if (ad->data_call_volume) {
478                 ad->data_call_volume->win_main = ad->win_main_layout;
479                 ad->data_call_volume->evas = ad->evas;
480                 ad->data_call_volume->slider_min = 0;
481                 ad->data_call_volume->slider_max = SETTING_SOUND_VOL_MAX;
482                 ad->data_call_volume->userdata = ad;
483                 ad->data_call_volume->start_change_cb = __ringtone_start_change_cb;
484                 ad->data_call_volume->stop_change_cb = __volume_stop_change_cb;
485                 ad->data_call_volume->belongs_to = SETTING_VOL_SOUND_GROUP;
486         } else {
487                 SETTING_TRACE_ERROR("ad->data_call_volume is NULL");
488         }
489
490         /* e.noti volumn */
491         if(mm_sound_volume_get_value(VOLUME_TYPE_NOTIFICATION, &mm_value) < 0)
492                 mm_value = SETTING_DEFAULT_NOTI_VOL_INT;
493         ad->data_noti_volume =
494             setting_create_Gendial_field_def(genlist, &(ad->itc_layout), NULL,
495                                              NULL,
496                                              SWALLOW_Type_LAYOUT_SLIDER_WITH_TITLE,
497                                              IMG_SLIDER_BTN_VOLUME01,
498                                              IMG_SLIDER_BTN_VOLUME02, mm_value,
499                                              SETTING_SOUND_TEXT_NOTIFICATION,
500                                              NULL,
501                                              setting_profile_sound_main_noti_sound_slider_value_change_cb);
502         if (ad->data_noti_volume) {
503                 ad->data_noti_volume->win_main = ad->win_main_layout;
504                 ad->data_noti_volume->evas = ad->evas;
505                 ad->data_noti_volume->slider_min = 0;
506                 ad->data_noti_volume->slider_max = SETTING_SOUND_VOL_MAX;
507                 ad->data_noti_volume->userdata = ad;
508                 ad->data_noti_volume->start_change_cb = __noti_start_change_cb;
509                 ad->data_noti_volume->stop_change_cb = __volume_stop_change_cb;
510                 ad->data_noti_volume->belongs_to = SETTING_VOL_SOUND_GROUP;
511         } else {
512                 SETTING_TRACE_ERROR("ad->data_noti_volume is NULL");
513         }
514
515         /* g.media volume */
516         if(mm_sound_volume_get_value(VOLUME_TYPE_MEDIA, &mm_value) < 0)
517                 mm_value = SETTING_DEFAULT_MEDIA_VOL_INT;
518         ad->data_media_volume =
519             setting_create_Gendial_field_def(genlist, &(ad->itc_layout), NULL,
520                                              NULL,
521                                              SWALLOW_Type_LAYOUT_SLIDER_WITH_TITLE,
522                                              IMG_SLIDER_BTN_VOLUME01,
523                                              IMG_SLIDER_BTN_VOLUME02, mm_value,
524                                              SETTING_SOUND_TEXT_MEDIA, NULL,
525                                              setting_profile_sound_main_media_sound_slider_value_change_cb);
526         if (ad->data_media_volume) {
527                 ad->data_media_volume->win_main = ad->win_main_layout;
528                 ad->data_media_volume->evas = ad->evas;
529                 ad->data_media_volume->slider_min = 0;
530                 ad->data_media_volume->slider_max = SETTING_SOUND_VOL_MAX;
531                 ad->data_media_volume->userdata = ad;
532                 ad->data_media_volume->start_change_cb = __media_start_change_cb;
533                 ad->data_media_volume->stop_change_cb = __volume_stop_change_cb;
534                 ad->data_media_volume->belongs_to = SETTING_VOL_SOUND_GROUP;
535         } else {
536                 SETTING_TRACE_ERROR("ad->data_media_volume is NULL");
537         }
538
539         /* h.system volume */
540         if(mm_sound_volume_get_value(VOLUME_TYPE_SYSTEM, &mm_value) < 0)
541                 mm_value = SETTING_DEFAULT_SYSTEM_VOL_INT;
542         ad->data_touch_volume =
543             setting_create_Gendial_field_def(genlist, &(ad->itc_layout), NULL,
544                                              NULL,
545                                              SWALLOW_Type_LAYOUT_SLIDER_WITH_TITLE,
546                                              IMG_SLIDER_BTN_VOLUME01,
547                                              IMG_SLIDER_BTN_VOLUME02, mm_value,
548                                              SETTING_SOUND_TEXT_SYSTEM, NULL,
549                                              settings_profile_sound_main_sys_sound_slider_value_change_cb);
550         if (ad->data_touch_volume) {
551                 ad->data_touch_volume->win_main = ad->win_main_layout;
552                 ad->data_touch_volume->evas = ad->evas;
553                 ad->data_touch_volume->slider_min = 0;
554                 ad->data_touch_volume->slider_max = SETTING_SOUND_VOL_MAX;
555                 ad->data_touch_volume->userdata = ad;
556                 ad->data_touch_volume->start_change_cb = __system_start_change_cb;
557                 ad->data_touch_volume->stop_change_cb = __volume_stop_change_cb;
558                 ad->data_touch_volume->belongs_to = SETTING_VOL_SOUND_GROUP;
559         } else {
560                 SETTING_TRACE_ERROR("ad->data_touch_volume is NULL");
561         }
562
563         (void)setting_create_Gendial_field_titleItem(genlist,
564                                                      &(ad->itc_group_item),
565                                                      "IDS_ST_BODY_CALLALERTTYPE_VIBRATION", NULL);
566
567         /* f.noti vib */
568         if (vconf_get_int(VCONFKEY_SETAPPL_NOTI_VIBRATION_LEVEL_INT, &vconf_value) <
569             0)
570                 vconf_value = SETTING_DEFAULT_NOTI_VIB_INT;     /*  default value of notification vibration volume : 5 */
571         ad->data_vib_volume =
572             setting_create_Gendial_field_def(genlist, &(ad->itc_layout), NULL,
573                                              NULL,
574                                              SWALLOW_Type_LAYOUT_SLIDER_WITH_TITLE,
575                                              IMG_VIBRATION_ICON_01,
576                                              IMG_VIBRATION_ICON_02, vconf_value,
577                                              SETTING_SOUND_TEXT_NOTIFICATION,
578                                              NULL,
579                                              setting_profile_sound_main_vib_sound_slider_value_change_cb);
580         if (ad->data_vib_volume) {
581                 ad->data_vib_volume->win_main = ad->win_main_layout;
582                 ad->data_vib_volume->evas = ad->evas;
583                 ad->data_vib_volume->slider_min = 0;
584                 ad->data_vib_volume->slider_max = SETTING_VIB_VOL_MAX;
585                 ad->data_vib_volume->userdata = ad;
586                 ad->data_vib_volume->start_change_cb = __noti_vib_start_change_cb;
587                 ad->data_vib_volume->stop_change_cb = __vibration_stop_change_cb;
588                 ad->data_vib_volume->belongs_to = SETTING_VOL_VIBRATION_GROUP;
589         } else {
590                 SETTING_TRACE_ERROR("ad->data_vib_volume is NULL");
591         }
592
593         /* i.haptic vib */
594         if (vconf_get_int
595             (VCONFKEY_SETAPPL_TOUCH_FEEDBACK_VIBRATION_LEVEL_INT, &vconf_value) < 0)
596                 vconf_value = SETTING_DEFAULT_HAPTIC_VIB_INT;   /*  default value of haptic vibration volume : 3 */
597         ad->data_touch_vib =
598             setting_create_Gendial_field_def(genlist, &(ad->itc_layout), NULL,
599                                              NULL,
600                                              SWALLOW_Type_LAYOUT_SLIDER_WITH_TITLE,
601                                              IMG_VIBRATION_ICON_01,
602                                              IMG_VIBRATION_ICON_02, vconf_value,
603                                              "IDS_ST_BODY_SOUNDFEEDBACK_HAPTIC_FEEDBACK", NULL,
604                                              setting_profile_sound_main_touchVib_sound_slider_value_change_cb);
605         if (ad->data_touch_vib) {
606                 ad->data_touch_vib->win_main = ad->win_main_layout;
607                 ad->data_touch_vib->evas = ad->evas;
608                 ad->data_touch_vib->slider_min = 0;
609                 ad->data_touch_vib->slider_max = SETTING_VIB_VOL_MAX;
610                 ad->data_touch_vib->userdata = ad;
611                 ad->data_touch_vib->start_change_cb = __haptic_vib_start_change_cb;
612                 ad->data_touch_vib->stop_change_cb = __vibration_stop_change_cb;
613                 ad->data_touch_vib->belongs_to = SETTING_VOL_VIBRATION_GROUP;
614         } else {
615                 SETTING_TRACE_ERROR("ad->data_touch_vib is NULL");
616         }
617
618         setting_create_Gendial_field_def(genlist, &(ad->itc_bg_1icon),
619                                          NULL, ad,
620                                          SWALLOW_Type_LAYOUT_SPECIALIZTION_X,
621                                          NULL, NULL, 0, SOUND_DESC, NULL, NULL);
622
623         __change_state_of_sliderbars(ad);
624
625         return genlist;
626
627 }
628
629 static int setting_profile_sound_main_create(void *cb)
630 {
631         retv_if(cb == NULL, SETTING_GENERAL_ERR_NULL_DATA_PARAMETER);
632
633         SettingProfileUG *ad = (SettingProfileUG *) cb;
634
635         ad->ly_main = setting_create_win_layout(ad->win_main_layout, ad->win_get);
636         ad->navi_bar = setting_create_navi_bar(ad->ly_main);
637
638 #ifdef SUPPORT_TAB
639         Evas_Object *tabbar= elm_toolbar_add(ad->navi_bar);
640         if(tabbar == NULL)
641                 return SETTING_RETURN_FAIL;
642
643         ad->ctrl_bar = tabbar;
644         elm_toolbar_shrink_mode_set(tabbar, ELM_TOOLBAR_SHRINK_EXPAND);
645         elm_object_style_set(tabbar, "top");
646         elm_toolbar_select_mode_set(tabbar, ELM_OBJECT_SELECT_MODE_ALWAYS);
647
648         ad->ctrl_item[0] = elm_toolbar_item_append(tabbar,
649                                         NULL,
650                                         VOLUME_STR, __view_change_cb, ad);
651         
652         ad->ctrl_item[1] = elm_toolbar_item_append(tabbar,
653                                         NULL,
654                                         RINGTONE_STR, __view_change_cb, ad);
655
656         elm_toolbar_item_selected_set(ad->ctrl_item[0], EINA_TRUE);
657
658         Evas_Object *ug_back_btn = elm_button_add(ad->navi_bar);
659         elm_object_style_set(ug_back_btn, NAVI_BACK_BUTTON_STYLE);
660         evas_object_smart_callback_add(ug_back_btn, "clicked", setting_profile_sound_main_click_softkey_cancel_cb, ad);
661         
662         Elm_Object_Item *navi_it = elm_naviframe_item_push(ad->navi_bar, NULL, ug_back_btn, NULL, ad->ctrl_bar, "tabbar");
663         elm_naviframe_item_title_visible_set(navi_it, EINA_FALSE);
664 #else
665         Evas_Object *genlist = __get_main_list(ad);
666         
667         Evas_Object *ug_back_btn = elm_button_add(ad->navi_bar);
668         elm_object_style_set(ug_back_btn, NAVI_BACK_BUTTON_STYLE);
669         evas_object_smart_callback_add(ug_back_btn, "clicked", setting_profile_sound_main_click_softkey_cancel_cb, ad);
670         
671         Elm_Object_Item *navi_it = elm_naviframe_item_push(ad->navi_bar, _(KeyStr_Sounds), ug_back_btn, NULL, genlist, NULL);
672         elm_naviframe_item_title_visible_set(navi_it, EINA_TRUE);
673 #endif
674
675         setting_view_profile_sound_main.is_create = TRUE;
676
677         return SETTING_RETURN_SUCCESS;
678 }
679
680 static int setting_profile_sound_main_destroy(void *cb)
681 {
682         /* error check */
683         retv_if(cb == NULL, SETTING_GENERAL_ERR_NULL_DATA_PARAMETER);
684
685         SettingProfileUG *ad = (SettingProfileUG *) cb;
686
687         if (ad->ly_main != NULL) {
688                 evas_object_del(ad->ly_main);
689                 setting_view_profile_sound_main.is_create = FALSE;
690         }
691         return SETTING_RETURN_SUCCESS;
692 }
693
694 static int setting_profile_sound_main_update(void *cb)
695 {
696         /* error check */
697         retv_if(cb == NULL, SETTING_GENERAL_ERR_NULL_DATA_PARAMETER);
698
699         SettingProfileUG *ad = (SettingProfileUG *) cb;
700
701         if (ad->ly_main != NULL) {
702                 evas_object_show(ad->ly_main);
703         }
704
705         return SETTING_RETURN_SUCCESS;
706 }
707
708 static int setting_profile_sound_main_cleanup(void *cb)
709 {
710         /* error check */
711         retv_if(cb == NULL, SETTING_GENERAL_ERR_NULL_DATA_PARAMETER);
712
713         SettingProfileUG *ad = (SettingProfileUG *) cb;
714
715         if (ad->ly_main != NULL) {
716                 evas_object_hide(ad->ly_main);
717         }
718
719         return SETTING_RETURN_SUCCESS;
720 }
721
722 /* ***************************************************
723  *
724  *general func
725  *
726  ***************************************************/
727
728 /* ***************************************************
729  *
730  *call back func
731  *
732  ***************************************************/
733
734 static void
735 setting_profile_sound_main_click_softkey_cancel_cb(void *data,
736                                                    Evas_Object *obj,
737                                                    void *event_info)
738 {
739         /* error check */
740         ret_if(data == NULL);
741
742         SettingProfileUG *ad = (SettingProfileUG *) data;
743         
744         /* close mm plaer */
745         setting_profile_close_all_mm_players(ad);
746         /* close vibration */
747         if (device_haptic_stop_play(ad->hnd_hpt) != 0) {
748                 SETTING_TRACE("ERROR device_haptic_stop_play");
749                 /* return; */
750         }
751
752         /* Send destroy request */
753         ug_destroy_me(ad->ug);
754
755         return;
756 }
757
758
759
760 static void
761 setting_profile_sound_main_Gendial_chk_cb(void *data, Evas_Object *obj,
762                                           void *event_info)
763 {
764         /* error check */
765         ret_if(data == NULL);
766
767         Setting_GenGroupItem_Data *list_item = (Setting_GenGroupItem_Data *) data;
768         SettingProfileUG *ad = list_item->userdata;
769
770         int state = list_item->chk_status = elm_check_state_get(obj);   /*  for genlist update status */
771
772         /* restore the selected check status */
773         list_item->chk_status = state;
774         elm_check_state_set(list_item->eo_check, state);
775
776         if (!safeStrCmp(SETTING_SOUND_TEXT_SOUND, list_item->keyStr)) {
777                 if (vconf_set_bool(VCONFKEY_SETAPPL_SOUND_STATUS_BOOL, list_item->chk_status) < 0) {
778                         list_item->chk_status = !state;
779                         elm_check_state_set(list_item->eo_check, list_item->chk_status);
780                 }
781
782                 if (list_item->chk_status) {
783                         setting_enable_genlist_item(ad->data_call_volume->item);
784                         setting_enable_genlist_item(ad->data_noti_volume->item);
785                         setting_enable_genlist_item(ad->data_media_volume->item);
786                         setting_enable_genlist_item(ad->data_touch_volume->item);
787                 } else {
788                         setting_profile_close_all_mm_players(ad);
789                         setting_disable_genlist_item(ad->data_call_volume->item);
790                         setting_disable_genlist_item(ad->data_noti_volume->item);
791                         setting_disable_genlist_item(ad->data_media_volume->item);
792                         setting_disable_genlist_item(ad->data_touch_volume->item);
793                 }
794         } else if (!safeStrCmp(SETTING_SOUND_TEXT_VIBRATION, list_item->keyStr)) {
795                 if (vconf_set_bool(VCONFKEY_SETAPPL_VIBRATION_STATUS_BOOL, list_item->chk_status) < 0) {
796                         list_item->chk_status = !state;
797                         elm_check_state_set(list_item->eo_check, list_item->chk_status);
798                 }
799                 if (list_item->chk_status) {
800                         setting_enable_genlist_item(ad->data_vib_volume->item);
801                         setting_enable_genlist_item(ad->data_touch_vib->item);
802                 } else {
803                         if (device_haptic_stop_play(ad->hnd_hpt) != 0) {
804                                 SETTING_TRACE("ERROR device_haptic_stop_play");
805                         }
806                         setting_disable_genlist_item(ad->data_vib_volume->item);
807                         setting_disable_genlist_item(ad->data_touch_vib->item);
808                 }
809         }
810 }
811
812 static void
813 setting_profile_sound_main_mouse_up_Gendial_list_cb(void *data,
814                                                     Evas_Object *obj,
815                                                     void *event_info)
816 {
817         /* error check */
818         ret_if(data == NULL);
819         retm_if(event_info == NULL, "Invalid argument: event info is NULL");
820
821         Elm_Object_Item *item = (Elm_Object_Item *) event_info;
822         elm_genlist_item_selected_set(item, 0);
823         Setting_GenGroupItem_Data *list_item =
824             (Setting_GenGroupItem_Data *) elm_object_item_data_get(item);
825
826         SettingProfileUG *ad = data;
827
828         if(ad->hnd_hpt)
829                         device_haptic_stop_play(ad->hnd_hpt); 
830
831         SETTING_TRACE("clicking item[%s]", _(list_item->keyStr));
832
833         if (!safeStrCmp(SETTING_SOUND_TEXT_SOUND, list_item->keyStr)) {
834                 int old_status = elm_check_state_get(list_item->eo_check);
835                 if (vconf_set_bool(VCONFKEY_SETAPPL_SOUND_STATUS_BOOL, !old_status) == 0) {
836                         /* new status */
837                         list_item->chk_status = !old_status;
838                         elm_check_state_set(list_item->eo_check, list_item->chk_status);
839                         if (list_item->chk_status) {
840                                 setting_enable_genlist_item(ad->data_call_volume->item);
841                                 setting_enable_genlist_item(ad->data_noti_volume->item);
842                                 setting_enable_genlist_item(ad->data_media_volume->item);
843                                 setting_enable_genlist_item(ad->data_touch_volume->item);
844                         } else {
845                                 setting_profile_close_all_mm_players(ad);
846                                 setting_disable_genlist_item(ad->data_call_volume->item);
847                                 setting_disable_genlist_item(ad->data_noti_volume->item);
848                                 setting_disable_genlist_item(ad->data_media_volume->item);
849                                 setting_disable_genlist_item(ad->data_touch_volume->item);
850                         }
851                 }
852                 return;
853         } else if (!safeStrCmp(SETTING_SOUND_TEXT_VIBRATION, list_item->keyStr)) {
854                 int old_status = elm_check_state_get(list_item->eo_check);
855                 if (vconf_set_bool(VCONFKEY_SETAPPL_VIBRATION_STATUS_BOOL, !old_status) == 0) {
856                         /* new status */
857                         list_item->chk_status = !old_status;
858                         elm_check_state_set(list_item->eo_check, list_item->chk_status);
859                         if (list_item->chk_status) {
860                                 setting_enable_genlist_item(ad->data_vib_volume->item);
861                                 setting_enable_genlist_item(ad->data_touch_vib->item);
862                         } else {
863                                 if (device_haptic_stop_play(ad->hnd_hpt) != 0) {
864                                         SETTING_TRACE("ERROR device_haptic_stop_play");
865                                 }
866                                 setting_disable_genlist_item(ad->data_vib_volume->item);
867                                 setting_disable_genlist_item(ad->data_touch_vib->item);
868                         }
869                 }
870                 return;
871         }
872 }
873
874 static void
875 setting_profile_sound_main_call_ringtone_sound_slider_value_change_cb(void *data,
876                                                                       Evas_Object *obj,
877                                                                       void *event_info)
878 {
879         /* error check */
880         ret_if(data == NULL);
881
882         double val = elm_slider_value_get(obj);
883
884         Setting_GenGroupItem_Data *list_item = (Setting_GenGroupItem_Data *) data;
885         SettingProfileUG *ad = list_item->userdata;
886
887         if(ad->mp_ringtone == NULL)
888                 return;
889         
890         if(list_item->chk_status != (int)(val+0.5))
891         {
892                 list_item->chk_status = (int)(val+0.5);
893                 SETTING_TRACE_DEBUG("ringtone volume is %d, %f", list_item->chk_status, val);
894         }
895 }
896
897 static void
898 setting_profile_sound_main_noti_sound_slider_value_change_cb(void *data,
899                                                              Evas_Object *obj,
900                                                              void *event_info)
901 {
902         /* error check */
903         ret_if(data == NULL);
904
905         double val = elm_slider_value_get(obj);
906
907         Setting_GenGroupItem_Data *list_item = (Setting_GenGroupItem_Data *) data;
908         SettingProfileUG *ad = list_item->userdata;
909         
910         if(ad->mp_noti == NULL)
911                 return;
912         
913         if(list_item->chk_status != (int)(val+0.5))
914         {
915                 list_item->chk_status = val;
916         }
917 }
918
919 static void
920 setting_profile_sound_main_media_sound_slider_value_change_cb(void *data,
921                                                               Evas_Object *obj,
922                                                               void *event_info)
923 {
924         /* error check */
925         ret_if(data == NULL);
926
927         double val = elm_slider_value_get(obj);
928
929         Setting_GenGroupItem_Data *list_item = (Setting_GenGroupItem_Data *) data;
930         SettingProfileUG *ad = list_item->userdata;
931
932         if(ad->mp_media == NULL)
933                 return;
934         if(list_item->chk_status != (int)(val+0.5))
935         {
936                 list_item->chk_status = val;
937         }
938 }
939
940 static void
941 settings_profile_sound_main_sys_sound_slider_value_change_cb(void *data,
942                                                             Evas_Object *obj,
943                                                             void *event_info)
944 {
945         /* error check */
946         ret_if(data == NULL);
947
948         double val = elm_slider_value_get(obj);
949
950         Setting_GenGroupItem_Data *list_item = (Setting_GenGroupItem_Data *) data;
951         SettingProfileUG *ad = list_item->userdata;
952
953         if(ad->mp_sys == NULL)
954                 return;
955
956         if(list_item->chk_status != (int)(val+0.5))
957         {
958                 list_item->chk_status = val;
959         }
960 }
961
962 static void
963 setting_profile_sound_main_vib_sound_slider_value_change_cb(void *data,
964                                                             Evas_Object *obj,
965                                                             void *event_info)
966 {
967         /* error check */
968         ret_if(data == NULL);
969
970         static double priv_val_db = 5.0;
971         static int priv_val_int = 0;
972         double val = elm_slider_value_get(obj);
973         SETTING_TRACE("val = %f", val);
974         Setting_GenGroupItem_Data *list_item = (Setting_GenGroupItem_Data *) data;
975         SettingProfileUG *ad = list_item->userdata;
976         list_item->chk_status = val;
977
978         int value;
979         int err;
980
981         value = (int)(val + 0.5);       /*  to sync displayed value on slider */
982         if (value != priv_val_int) {
983                 int vib_volume = value;
984                 char pattern_file[MAX_COMMON_BUFFER_LEN] = {0,};
985                 svi_get_path(SVI_TYPE_VIB, SVI_VIB_NOTIFICATION_GENERAL, pattern_file, sizeof(pattern_file));
986                 device_haptic_stop_play(ad->hnd_hpt);
987                 err = device_haptic_play_file(ad->hnd_hpt, pattern_file, 1, vib_volume);
988
989                 if (err < 0)
990                         SETTING_TRACE("Failed to play haptic monotone");
991                 priv_val_int = value;
992         }
993         priv_val_db = val;
994
995 }
996
997 static void
998 setting_profile_sound_main_touchVib_sound_slider_value_change_cb(void *data,
999                                                                  Evas_Object *
1000                                                                  obj, void
1001                                                                  *event_info)
1002 {
1003         /* error check */
1004         ret_if(data == NULL);
1005
1006         static double priv_val_db = 3.0;
1007         static int priv_val_int = 0;
1008         double val = elm_slider_value_get(obj);
1009         SETTING_TRACE("val = %f", val);
1010         Setting_GenGroupItem_Data *list_item =
1011             (Setting_GenGroupItem_Data *) data;
1012         SettingProfileUG *ad = list_item->userdata;
1013         list_item->chk_status = val;
1014
1015         int value;
1016         int err;
1017
1018         value = (int)(val + 0.5);       /*  to sync displayed value on slider */
1019         if (value != priv_val_int) {
1020
1021                 int vib_volume = value; /* SETTING_VIB_VOL_MAX; */
1022                 char pattern_file[MAX_COMMON_BUFFER_LEN] = {0,};
1023                 svi_get_path(SVI_TYPE_VIB, SVI_VIB_OPERATION_VIBRATION, pattern_file, sizeof(pattern_file));
1024                 device_haptic_stop_play(ad->hnd_hpt);
1025                 err = device_haptic_play_file(ad->hnd_hpt, pattern_file, 1, vib_volume);
1026
1027                 if (err < 0)
1028                         SETTING_TRACE("Failed to play haptic monotone");
1029                 priv_val_int = value;
1030         }
1031         priv_val_db = val;
1032 }
1033