Make TIZEN 2.0
[apps/home/call.git] / call-engine / voice-call-device.c
1 /*
2  * Copyright 2012  Samsung Electronics Co., Ltd
3  *
4  * Licensed under the Flora License, Version 1.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  * http://www.tizenopensource.org/license
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16
17
18 #include "voice-call-device.h"
19 #include "voice-call-dbus.h"
20 #include "voice-call-core.h"
21 #include "voice-call-sound.h"
22 #include "voice-call-bt.h"
23 #include "voice-call-core.h"
24 #include "voice-call-engine-msg.h"
25
26 #include "vc-core-callagent.h"
27 #include "vc-core-engine-types.h"
28 #include "vc-core-util.h"
29
30 #include <pmapi.h>
31 #include <sensor.h>
32
33 static gboolean __voicecall_dvc_earjack_status_cb(keynode_t *node, call_vc_core_state_t *pcall_core);
34 static gboolean __voicecall_dvc_earjackkey_status_cb(keynode_t *node, call_vc_core_state_t *pcall_core);
35
36 /**
37  * This function handles earjack event
38  *
39  * @return              Returns TRUE on success or FALSE on failure
40  * @param[in]           node                            vconf node
41  * @param[in]           pcall_core                      Handle to voicecall core
42  */
43 static gboolean __voicecall_dvc_earjack_status_cb(keynode_t *node, call_vc_core_state_t *pcall_core)
44 {
45         int earjack_status;
46
47         CALL_ENG_DEBUG(ENG_DEBUG, "..");
48
49         earjack_status = vconf_keynode_get_int(node);
50
51         CALL_ENG_DEBUG(ENG_DEBUG, "Earjack Status: %d", earjack_status);
52
53         vc_engine_headset_status_type event_data;
54
55         /*Change path only if outgoing call or connected call exists */
56         if ((TRUE == voicecall_core_is_outgoing_call_exists(pcall_core->pcall_engine))
57         || (TRUE == voicecall_core_is_connected_call_exist(pcall_core->pcall_engine))) {
58                 if (earjack_status != FALSE) {
59                         voicecall_snd_set_path_status(pcall_core->papp_snd, VOICE_CALL_SND_PATH_RECEIVER_EARJACK);
60                         voicecall_snd_change_path(pcall_core->papp_snd);
61                         memset(&event_data, 0, sizeof(event_data));
62                         event_data.bstatus = earjack_status;
63                         vcall_engine_send_event_to_client(VC_ENGINE_MSG_EARJACK_STATUS_TO_UI, (void *)&event_data);
64                 } else {
65                         if (voicecall_snd_get_path_status(pcall_core->papp_snd) == VOICE_CALL_SND_PATH_RECEIVER_EARJACK) {
66                                 if (_vc_bt_is_bt_connected(pcall_core) == TRUE) {
67                                         voicecall_snd_set_path_status(pcall_core->papp_snd, VOICE_CALL_SND_PATH_BT);
68                                         /*_vc_bt_send_response_to_bt(pcall_core, BT_AG_RES_SWITCH_TO_HEADSET, -1, NULL);*/
69                                         _vc_bt_request_switch_headset_path(pcall_core, TRUE);
70                                 } else {
71                                         voicecall_snd_set_path_status(pcall_core->papp_snd, VOICE_CALL_SND_PATH_RECEIVER_EARJACK);
72                                         voicecall_snd_change_path(pcall_core->papp_snd);
73                                 }
74                                 memset(&event_data, 0, sizeof(event_data));
75                                 event_data.bstatus = earjack_status;
76                                 vcall_engine_send_event_to_client(VC_ENGINE_MSG_EARJACK_STATUS_TO_UI, (void *)&event_data);
77                         } else {
78                                 CALL_ENG_DEBUG(ENG_DEBUG, "No path change");
79                         }
80                 }
81         }
82         return TRUE;
83 }
84
85 /**
86  * This function handles earjack key event
87  *
88  * @return              Returns TRUE on success or FALSE on failure
89  * @param[in]           node                            vconf node
90  * @param[in]           pcall_core                      Handle to voicecall core
91  */
92 static gboolean __voicecall_dvc_earjackkey_status_cb(keynode_t *node, call_vc_core_state_t *pcall_core)
93 {
94         int key_value;
95
96         CALL_ENG_DEBUG(ENG_DEBUG, "..");
97
98         key_value = vconf_keynode_get_int(node);
99
100         CALL_ENG_DEBUG(ENG_DEBUG, "key_value: %d", key_value);
101
102         if (key_value > 0) {
103                 if (voicecall_core_is_connected_call_exist(pcall_core->pcall_engine)) {
104                         voicecall_core_end_all_calls(pcall_core);
105                 } else if (voicecall_core_is_incoming_call_exists(pcall_core->pcall_engine)) {
106                         voicecall_snd_set_path_status(pcall_core->papp_snd, VOICE_CALL_SND_PATH_RECEIVER_EARJACK);
107                         voicecall_core_answer_call(pcall_core, FALSE);
108                 } else if (voicecall_core_is_outgoing_call_exists(pcall_core->pcall_engine)) {
109                         voicecall_core_cancel_call(pcall_core);
110                 }
111         }
112
113         return TRUE;
114 }
115
116 /**
117  * This function initialize earjack event.
118  *
119  * @return              Returns TRUE on success or FALSE on failure
120  * @param[in]           pcall_core                      Handle to voicecall core
121  */
122 gboolean _voicecall_dvc_earjack_init(call_vc_core_state_t *pcall_core)
123 {
124         vconf_notify_key_changed(VCONFKEY_SYSMAN_EARJACK, (void *)__voicecall_dvc_earjack_status_cb, pcall_core);
125         vconf_notify_key_changed(VCONFKEY_SYSMAN_EARJACKKEY, (void *)__voicecall_dvc_earjackkey_status_cb, pcall_core);
126         return TRUE;
127 }
128
129 void _voicecall_dvc_get_earjack_status(call_vc_core_state_t *pcall_core)
130 {
131         int earjack_status = -1;
132         if (!vconf_get_int(VCONFKEY_SYSMAN_EARJACK, &earjack_status)) {
133                 CALL_ENG_DEBUG(ENG_DEBUG, "earjack_status:[%d]", earjack_status);
134                 if (earjack_status == VCONFKEY_SYSMAN_EARJACK_REMOVED) {
135                         voicecall_snd_set_status(pcall_core->papp_snd, VOICE_CALL_AUDIO_RECEIVER_EARJACK, FALSE);
136                         CALL_ENG_DEBUG(ENG_DEBUG, "*****************VOICE_CALL_AUDIO_RECEIVER_EARJACK = FALSE **********");
137                 } else {
138                         voicecall_snd_set_status(pcall_core->papp_snd, VOICE_CALL_AUDIO_RECEIVER_EARJACK, TRUE);
139                         CALL_ENG_DEBUG(ENG_DEBUG, "*****************VOICE_CALL_AUDIO_RECEIVER_EARJACK = TRUE **********");
140                 }
141         } else {
142                 CALL_ENG_DEBUG(ENG_ERR, "vconf_get_int failed..");
143                 voicecall_snd_set_status(pcall_core->papp_snd, VOICE_CALL_AUDIO_RECEIVER_EARJACK, FALSE);
144         }
145 }
146
147 gboolean _voicecall_dvc_get_earjack_connected()
148 {
149         int earjack_status = -1;
150         if (!vconf_get_int(VCONFKEY_SYSMAN_EARJACK, &earjack_status)) {
151                 CALL_ENG_DEBUG(ENG_DEBUG, "earjack_status:[%d]", earjack_status);
152                 if (earjack_status == VCONFKEY_SYSMAN_EARJACK_REMOVED) {
153                         return FALSE;
154                 } else {
155                         return TRUE;
156                 }
157         } else {
158                 CALL_ENG_DEBUG(ENG_ERR, "vconf_get_int failed..");
159                 return FALSE;
160         }
161 }
162
163 void _voicecall_dvc_control_lcd_state(voicecall_lcd_control_t state)
164 {
165         CALL_ENG_DEBUG(ENG_DEBUG, "[%d]", state);
166         switch (state) {
167         case VC_LCD_OFF:
168                 pm_change_state(LCD_OFF);
169                 break;
170
171         case VC_LCD_ON:
172                 pm_change_state(LCD_NORMAL);
173                 break;
174
175         case VC_LCD_ON_LOCK:
176                 pm_lock_state(LCD_NORMAL, GOTO_STATE_NOW, 0);
177                 break;
178
179         case VC_LCD_ON_UNLOCK:
180                 pm_unlock_state(LCD_NORMAL, PM_RESET_TIMER);
181                 break;
182
183         default:
184                 break;
185         }
186 }
187