apply FSL(Flora Software License)
[apps/home/call.git] / ui / vcui-app-window.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 "vcui-app-window.h"
19
20 static void __vcui_app_win_focus_in_cb(void *data, Evas_Object *obj, void *event_info);
21 static void __vcui_app_win_focus_out_cb(void *data, Evas_Object *obj, void *event_info);
22 static void __vcui_app_win_main_win_del_cb(void *data, Evas_Object *obj, void *event);
23 static Eina_Bool __vcui_app_win_hard_key_down_cb(void *data, int type, void *event);
24 static Eina_Bool __vcui_app_win_hard_key_up_cb(void *data, int type, void *event);
25 static Eina_Bool __vcui_app_win_mouse_down_cb(void *data, int type, void *event);
26 static Eina_Bool __vcui_app_win_longpress_mute_timer_cb(void *data);
27 static Eina_Bool __vcui_app_win_volup_key_longpress_timer_cb(void *data);
28 static Eina_Bool __vcui_app_win_voldown_key_longpress_timer_cb(void *data);
29
30 Evas_Object *_vcui_app_win_create_main(vcui_app_call_data_t *ad, const char *name)
31 {
32         Evas_Object *eo;
33
34         eo = elm_win_add(NULL, name, ELM_WIN_BASIC);
35         if (eo) {
36                 elm_win_title_set(eo, name);
37                 elm_win_borderless_set(eo, EINA_TRUE);
38                 evas_object_smart_callback_add(eo, "delete,request", __vcui_app_win_main_win_del_cb, NULL);
39                 ecore_x_window_size_get(ecore_x_window_root_first_get(), &ad->root_w, &ad->root_h);
40                 evas_object_resize(eo, ad->root_w, ad->root_h);
41                 elm_win_indicator_mode_set(eo, ELM_WIN_INDICATOR_SHOW);
42                 evas_object_smart_callback_add(eo, "focus-in", __vcui_app_win_focus_in_cb, ad);
43                 evas_object_smart_callback_add(eo, "focus-out", __vcui_app_win_focus_out_cb, ad);
44         }
45
46         return eo;
47 }
48
49 static void __vcui_app_win_focus_in_cb(void *data, Evas_Object *obj, void *event_info)
50 {
51         CALL_UI_DEBUG("..");
52 }
53
54 static void __vcui_app_win_focus_out_cb(void *data, Evas_Object *obj, void *event_info)
55 {
56         CALL_UI_DEBUG("..");
57 }
58
59 static void __vcui_app_win_main_win_del_cb(void *data, Evas_Object *obj, void *event)
60 {
61         CALL_UI_DEBUG("..");
62         elm_exit();
63 }
64
65 static Eina_Bool __vcui_app_win_hard_key_down_cb(void *data, int type, void *event)
66 {
67         CALL_UI_DEBUG("..");
68
69         vcui_app_call_data_t *ad = (vcui_app_call_data_t *) data;
70         Ecore_Event_Key *ev = event;
71
72         retvm_if(ev == NULL, 0, "ERROR!!! ========= Event is NULL!!!");
73
74         if (ad->view_top == -1) {
75                 CALL_UI_DEBUG("ad->view_top is -1.");
76 #ifndef END_KEY_PROCESSING
77                 if ((ad->contact_ug != NULL) && (!strcmp(ev->keyname, KEY_END))) {
78                         CALL_UI_DEBUG("send end key to contact ug.");
79                         ug_send_key_event(UG_KEY_EVENT_END);
80                 }
81 #endif
82                 return EINA_FALSE;
83         }
84
85         if (!strcmp(ev->keyname, KEY_VOLUMEUP)) {
86                 CALL_UI_DEBUG("[KEY]KEY_VOLUMEUP pressed");
87                 if ((ad->view_st[ad->view_top]->type == VIEW_INCOMING_VIEW) || (ad->view_st[ad->view_top]->type == VIEW_INCOMING_LOCK_VIEW)) {
88                         _vcui_engine_interface_process_mute_alert();
89                         ad->bmute_ringtone = EINA_TRUE;
90                 } else {
91                         ad->vol_longpress_cnt = 0;
92                         if (_voicecall_dvc_get_proximity_sensor_state() != VCALL_SENSOR_NEAR)
93                                 _voicecall_dvc_control_lcd_state(VC_LCD_ON);
94                         _vcui_set_volume(VAL_VOL_UP);
95                         ad->volup_key_longpress_timer = ecore_timer_add(VOLUME_KEY_LONG_PRESS_TIMEOUT, __vcui_app_win_volup_key_longpress_timer_cb, ad);
96                 }
97         } else if (!strcmp(ev->keyname, KEY_VOLUMEDOWN)) {
98                 CALL_UI_DEBUG("[KEY]KEY_VOLUMEDOWN pressed");
99                 if ((ad->view_st[ad->view_top]->type == VIEW_INCOMING_VIEW) || (ad->view_st[ad->view_top]->type == VIEW_INCOMING_LOCK_VIEW)) {
100                         _vcui_engine_interface_process_mute_alert();
101                         ad->bmute_ringtone = EINA_TRUE;
102                 } else {
103                         ad->vol_longpress_cnt = 0;
104                         if (_voicecall_dvc_get_proximity_sensor_state() != VCALL_SENSOR_NEAR)
105                                 _voicecall_dvc_control_lcd_state(VC_LCD_ON);
106                         _vcui_set_volume(VAL_VOL_DOWN);
107                         ad->voldown_key_longpress_timer = ecore_timer_add(VOLUME_KEY_LONG_PRESS_TIMEOUT, __vcui_app_win_voldown_key_longpress_timer_cb, ad);
108                 }
109         }
110
111         CALL_UI_DEBUG("End..");
112         return EINA_FALSE;
113 }
114
115 static Eina_Bool __vcui_app_win_hard_key_up_cb(void *data, int type, void *event)
116 {
117         CALL_UI_DEBUG("..");
118
119         vcui_app_call_data_t *ad = (vcui_app_call_data_t *) data;
120         Ecore_Event_Key *ev = event;
121
122         retvm_if(ev == NULL, 0, "ERROR!!! ========= Event is NULL!!!");
123
124         if (0 == strcmp(ev->keyname, KEY_VOLUMEDOWN)) {
125                 if (ad->ringtone_longpress_mute_timer) {
126                         ecore_timer_del(ad->ringtone_longpress_mute_timer);
127                         ad->ringtone_longpress_mute_timer = NULL;
128                 }
129         }
130
131         ad->vol_longpress_cnt = 0;
132
133         if (ad->volup_key_longpress_timer) {
134                 ecore_timer_del(ad->volup_key_longpress_timer);
135                 ad->volup_key_longpress_timer = NULL;
136         }
137
138         if (ad->voldown_key_longpress_timer) {
139                 ecore_timer_del(ad->voldown_key_longpress_timer);
140                 ad->voldown_key_longpress_timer = NULL;
141         }
142
143         return EINA_FALSE;
144 }
145
146 static Eina_Bool __vcui_app_win_mouse_down_cb(void *data, int type, void *event)
147 {
148         /*CALL_UI_DEBUG("..");*/
149
150         vcui_app_call_data_t *ad = (vcui_app_call_data_t *) data;
151         Ecore_Event_Mouse_Button *ev = event;
152
153         ad->touch_x = ev->x;
154         ad->touch_y = ev->y;
155         return EINA_FALSE;
156 }
157
158 void _vcui_app_win_key_grab(vcui_app_call_data_t *ad)
159 {
160         int result = 0;
161         CALL_UI_KPI("_vcui_app_win_key_grab start");
162
163         /* Key Grab */
164         ad->disp = ecore_x_display_get();
165         ad->win = elm_win_xwindow_get(ad->win_main);
166
167         result = utilx_grab_key(ad->disp, ad->win, KEY_VOLUMEUP, EXCLUSIVE_GRAB);
168         if (result)
169                 CALL_UI_DEBUG("KEY_VOLUMEUP key grab failed");
170
171         result = utilx_grab_key(ad->disp, ad->win, KEY_VOLUMEDOWN, EXCLUSIVE_GRAB);
172         if (result)
173                 CALL_UI_DEBUG("KEY_VOLUMEDOWN key grab failed");
174
175         if (ad->downkey_handler == NULL)
176                 ad->downkey_handler = ecore_event_handler_add(ECORE_EVENT_KEY_DOWN, __vcui_app_win_hard_key_down_cb, ad);
177         if (ad->upkey_handler == NULL)
178                 ad->upkey_handler = ecore_event_handler_add(ECORE_EVENT_KEY_UP, __vcui_app_win_hard_key_up_cb, ad);     /* (for long press)*/
179         if (ad->mouse_evnt_handler == NULL)
180                 ad->mouse_evnt_handler = ecore_event_handler_add(ECORE_EVENT_MOUSE_BUTTON_DOWN, __vcui_app_win_mouse_down_cb, ad);      /*for ctxpopup*/
181
182         CALL_UI_KPI("_vcui_app_win_key_grab done");
183 }
184
185 static Eina_Bool __vcui_app_win_longpress_mute_timer_cb(void *data)
186 {
187         CALL_UI_DEBUG("..");
188
189         vcui_app_call_data_t *ad = (vcui_app_call_data_t *) data;
190         call_data_t *call_data = _vcui_doc_get_recent_mt();
191
192         if (call_data == NULL)
193                 return ECORE_CALLBACK_CANCEL;
194
195         if (ad->ringtone_longpress_mute_timer) {
196                 ecore_timer_del(ad->ringtone_longpress_mute_timer);
197                 ad->ringtone_longpress_mute_timer = NULL;
198         }
199
200         ad->vol_longpress_cnt = 0;
201
202         if (ad->volup_key_longpress_timer) {
203                 ecore_timer_del(ad->volup_key_longpress_timer);
204                 ad->volup_key_longpress_timer = NULL;
205         }
206
207         if (ad->voldown_key_longpress_timer) {
208                 ecore_timer_del(ad->voldown_key_longpress_timer);
209                 ad->voldown_key_longpress_timer = NULL;
210         }
211
212         _vcui_view_popup_unload(ad->vol_ringtone_popup_eo);
213
214         _vcui_engine_interface_process_mute_alert();
215         ad->bmute_ringtone = EINA_TRUE;
216
217         return ECORE_CALLBACK_CANCEL;
218 }
219
220 static Eina_Bool __vcui_app_win_volup_key_longpress_timer_cb(void *data)
221 {
222         CALL_UI_DEBUG("..");
223
224         vcui_app_call_data_t *ad = (vcui_app_call_data_t *) data;
225
226         if ((ad->view_st[ad->view_top]->type == VIEW_INCOMING_VIEW || ad->view_st[ad->view_top]->type == VIEW_INCOMING_LOCK_VIEW)) {
227                 if((ad->ringtone_val == RINGTONE_MAX) || (ad->bmute_ringtone == EINA_TRUE)){
228                         if (ad->volup_key_longpress_timer) {
229                                 ecore_timer_del(ad->volup_key_longpress_timer);
230                                 ad->volup_key_longpress_timer = NULL;
231                         }
232                         return ECORE_CALLBACK_CANCEL;
233                 }
234         } else if (ad->headset_status == EINA_TRUE) {
235                 if(ad->bt_vol_val== BT_VOL_MAX) {
236                         if (ad->volup_key_longpress_timer) {
237                                 ecore_timer_del(ad->volup_key_longpress_timer);
238                                 ad->volup_key_longpress_timer = NULL;
239                         }
240                         return ECORE_CALLBACK_CANCEL;
241                 }
242         } else {
243                 if(ad->voice_vol_val == VOICE_VOL_MAX) {
244                         if (ad->volup_key_longpress_timer) {
245                                 ecore_timer_del(ad->volup_key_longpress_timer);
246                                 ad->volup_key_longpress_timer = NULL;
247                         }
248                         return ECORE_CALLBACK_CANCEL;
249                 }
250         }
251
252         ad->vol_longpress_cnt++;
253
254         if ((ad->vol_longpress_cnt % 3) == 0) {
255                 _vcui_set_volume(VAL_VOL_UP);
256         }
257
258         return ECORE_CALLBACK_RENEW;
259 }
260
261 static Eina_Bool __vcui_app_win_voldown_key_longpress_timer_cb(void *data)
262 {
263         CALL_UI_DEBUG("..");
264
265         vcui_app_call_data_t *ad = (vcui_app_call_data_t *) data;
266
267         if ((ad->view_st[ad->view_top]->type == VIEW_INCOMING_VIEW || ad->view_st[ad->view_top]->type == VIEW_INCOMING_LOCK_VIEW)) {
268                 if((ad->ringtone_val == RINGTONE_MAX) || (ad->bmute_ringtone == EINA_TRUE)) {
269                         if (ad->voldown_key_longpress_timer) {
270                                 ecore_timer_del(ad->voldown_key_longpress_timer);
271                                 ad->voldown_key_longpress_timer = NULL;
272                         }
273                         return ECORE_CALLBACK_CANCEL;
274                 }
275         } else if (ad->headset_status == EINA_TRUE) {
276                 if(ad->bt_vol_val == BT_VOL_MIN) {
277                         if (ad->voldown_key_longpress_timer) {
278                                 ecore_timer_del(ad->voldown_key_longpress_timer);
279                                 ad->voldown_key_longpress_timer = NULL;
280                         }
281                         return ECORE_CALLBACK_CANCEL;
282                 }
283         } else {
284                 if(ad->voice_vol_val == VOICE_VOL_MIN) {
285                         if (ad->voldown_key_longpress_timer) {
286                                 ecore_timer_del(ad->voldown_key_longpress_timer);
287                                 ad->voldown_key_longpress_timer = NULL;
288                         }
289                         return ECORE_CALLBACK_CANCEL;
290                 }
291         }
292
293         ad->vol_longpress_cnt++;
294
295         if((ad->vol_longpress_cnt % 3) == 0) {
296                 _vcui_set_volume(VAL_VOL_DOWN);
297         }
298
299         return ECORE_CALLBACK_RENEW;
300 }
301
302 void _vcui_app_win_set_noti_type(int bwin_noti)
303 {
304         Ecore_X_Window xwin;
305         vcui_app_call_data_t *ad = _vcui_get_app_data();
306
307         /* Get x-window */
308         xwin = elm_win_xwindow_get(ad->win_main);
309
310         if (bwin_noti == EINA_FALSE) {
311                 CALL_UI_DEBUG("window type: NORMAL");
312                 /* Set Normal window */
313                 ecore_x_netwm_window_type_set(xwin, ECORE_X_WINDOW_TYPE_NORMAL);
314         } else {
315                 CALL_UI_DEBUG("window type: NOTI-HIGH");
316                 /* Set Notification window */
317                 ecore_x_netwm_window_type_set(xwin, ECORE_X_WINDOW_TYPE_NOTIFICATION);
318                 /* Set Notification's priority to LEVEL_HIGH */
319                 utilx_set_system_notification_level(ecore_x_display_get(), xwin, UTILX_NOTIFICATION_LEVEL_HIGH);
320         }
321         return;
322 }
323