apply FSL(Flora Software License)
[apps/home/call.git] / ui / vcui-view-common.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-application.h"
19 #include "vcui-view-common.h"
20
21 #include "vcui-view-dialing.h"
22 #include "vcui-view-incoming.h"
23 #include "vcui-view-single-call.h"
24 #include "vcui-view-multi-call-split.h"
25 #include "vcui-view-multi-call-conf.h"
26 #include "vcui-view-multi-call-list.h"
27 #include "vcui-view-keypad.h"
28 #include "vcui-view-callend.h"
29
30 static vcui_view_common_t gincall_common_data;
31
32 void _vcui_view_common_init()
33 {
34         memset(&gincall_common_data, 0, sizeof(vcui_view_common_t));
35 }
36
37 static vcui_view_common_t *__vcui_view_common_get_common_data()
38 {
39         return &gincall_common_data;
40 }
41
42 static Eina_Bool __vcui_view_common_timer_cb(void *data)
43 {
44         //voice_call_view_data_t *vd = (voice_call_view_data_t *)data;
45         //vcui_app_call_data_t *ad = vd->app_data;
46         vcui_view_common_t *common_data = __vcui_view_common_get_common_data();
47         char dur[TIME_BUF_LEN];
48         static int end_count = 0;
49
50         if (common_data->timer_flag == 1) {
51                 if (common_data->time_end_flag == TIME_END_START) {
52                         end_count = 0;
53                         return 1;
54                 } else if (common_data->time_end_flag == TIME_END_NO) {
55                         end_count++;
56                         if (end_count == 1) {
57                                 return 1;
58                         }
59                 }
60         }
61         common_data->current_call_time = time(NULL);
62
63         if (common_data->timer_flag == 1) {
64                 if (common_data->current_call_time > common_data->start_call_time) {
65                         time_t call_time = common_data->current_call_time - common_data->start_call_time;
66                         struct tm loctime;
67
68                         gmtime_r((const time_t *)&call_time, &loctime);
69                         snprintf(dur, TIME_BUF_LEN, "%02d:%02d:%02d", loctime.tm_hour, loctime.tm_min, loctime.tm_sec);
70
71                         _vcui_view_common_set_text_time(dur);
72                 }
73         }
74
75         return 1;
76 }
77
78 static Eina_Bool __vcui_view_common_timer_end_cb(void *data)
79 {
80         vcui_view_common_t *common_data = __vcui_view_common_get_common_data();
81         int end_type = common_data->end_type;
82         char dur[TIME_BUF_LEN];
83
84         if ((common_data->timer_flag == 1) && (common_data->time_end_flag == TIME_END_START)) {
85                 snprintf(dur, TIME_BUF_LEN, "%02d:%02d:%02d", common_data->hour, common_data->min, common_data->sec);
86                 if (common_data->time_count == 0) {
87                         _vcui_view_common_set_text_time(dur);
88                 } else if (common_data->time_count == 1) {
89                         _vcui_view_common_set_text_time(_(" "));
90                 } else if (common_data->time_count == 2) {
91                         _vcui_view_common_set_text_time(dur);
92                 } else if (common_data->time_count == 3) {
93                         _vcui_view_common_set_text_time(_(" "));
94                 } else if (common_data->time_count == 4) {
95                         char data[VC_DATA_LENGTH_MAX] = { 0, };
96                         _vcui_view_common_set_text_time(_vcui_get_endcause_string(end_type, data));
97                 }
98
99                 common_data->time_count++;
100                 if (common_data->time_count == TIME_END_MAX_SHOW) {
101                         common_data->time_end_flag = TIME_END_NO;
102                         common_data->time_count = 0;
103
104                         if (common_data->tm_end) {
105                                 ecore_timer_del(common_data->tm_end);
106                                 common_data->tm_end = NULL;
107                         }
108
109                         _vcui_view_common_call_terminate_or_view_change();
110                 }
111         }
112         return 1;
113 }
114
115 static Eina_Bool __vcui_view_common_timer_end_dialing_cb(void *data)
116 {
117         CALL_UI_DEBUG("..");
118         vcui_view_common_t *common_data = __vcui_view_common_get_common_data();
119         vcui_app_call_data_t *ad = _vcui_get_app_data();
120
121         if (common_data->tm_end_dialing) {
122                 ecore_timer_del(common_data->tm_end_dialing);
123                 common_data->tm_end_dialing = NULL;
124         }
125
126         if (common_data->bredial == EINA_TRUE) {
127                 /*_vcui_view_all_hide();*/
128                 _vcui_engine_interface_process_auto_redial(EINA_TRUE);
129                 _vcui_view_popup_load_redial();
130                 _vcui_view_dialing_draw_txt_dialing(ad->view_st[VIEW_DIALLING_VIEW]);
131         } else {
132                 _vcui_view_common_call_terminate_or_view_change();
133         }
134
135         return 1;
136 }
137
138 static Eina_Bool __vcui_view_common_timer_end_force_cb(void *data)
139 {
140         CALL_UI_DEBUG("..");
141         vcui_view_common_t *common_data = __vcui_view_common_get_common_data();
142
143         if (common_data->tm_end_force) {
144                 ecore_timer_del(common_data->tm_end_force);
145                 common_data->tm_end_force = NULL;
146         }
147
148         _vcui_view_common_call_terminate_or_view_change();
149
150         return 1;
151 }
152
153 void _vcui_view_common_set_text_time(char *time_dur)
154 {
155         vcui_app_call_data_t *ad = _vcui_get_app_data();
156         voice_call_view_data_t *data = ad->view_st[ad->view_top];
157         int valid = 0;
158
159         if (data != NULL) {
160                 if (data->type == VIEW_INCALL_ONECALL_VIEW) {
161                         if (data->priv) {
162                                 incall_one_view_priv_t *priv = data->priv;
163                                 if (priv->contents) {
164                                         /* ============ Check valid Evas Object ============= */
165                                         valid = _vcui_check_valid_eo(priv->contents, "ONEVIEW");
166                                         if (valid == -1) {
167                                                 CALL_UI_DEBUG("[========== ONEVIEW : Invalid Evas Object, priv->contents : %p ==========]", priv->contents);
168                                                 return;
169                                         }
170                                         /* ============ Check valid Evas Object ============= */
171                                         edje_object_part_text_set(_EDJ(priv->contents), "txt_timer", _(time_dur));      //TODO
172                                 } else {
173                                         CALL_UI_DEBUG("ERR : Null Evas_Object priv->contents");
174                                 }
175
176                         }
177                 } else if (data->type == VIEW_INCALL_MULTICALL_SPLIT_VIEW) {
178                         if (data->priv) {
179                                 incall_multi_view_split_priv_t *priv = data->priv;
180                                 /* ============ Check valid Evas Object ============= */
181                                 valid = _vcui_check_valid_eo(priv->contents, "MULTIVIEWSPLIT");
182                                 if (valid == -1) {
183                                         CALL_UI_DEBUG("[========== MULTIVIEWSPLIT : Invalid Evas Object, priv->contents : %p ==========]", priv->contents);
184                                         return;
185                                 }
186                                 /* ============ Check valid Evas Object ============= */
187                                 edje_object_part_text_set(_EDJ(priv->contents), "txt_timer", _(time_dur));      //TODO
188                         } else {
189                                 CALL_UI_DEBUG("ERR : Null Evas_Object data->layout");
190                         }
191                 } else if (data->type == VIEW_INCALL_MULTICALL_CONF_VIEW) {
192                         if (data->priv) {
193                                 vcui_view_multi_call_conf_priv_t *priv = data->priv;
194                                 /* ============ Check valid Evas Object ============= */
195                                 valid = _vcui_check_valid_eo(priv->contents, "MULTIVIEWCONF");
196                                 if (valid == -1) {
197                                         CALL_UI_DEBUG("[========== MULTIVIEWCONF : Invalid Evas Object, priv->contents : %p ==========]", priv->contents);
198                                         return;
199                                 }
200                                 /* ============ Check valid Evas Object ============= */
201                                 edje_object_part_text_set(_EDJ(priv->contents), "txt_timer", _(time_dur));      //TODO
202                         } else {
203                                 CALL_UI_DEBUG("ERR : Null Evas_Object data->layout");
204                         }
205                 } else if (data->type == VIEW_INCALL_MULTICALL_LIST_VIEW) {
206                         if (data->priv) {
207                                 vcui_view_multi_call_list_priv_t *priv = data->priv;
208                                 /* ============ Check valid Evas Object ============= */
209                                 valid = _vcui_check_valid_eo(priv->contents, "MULTIVIEWLIST");
210                                 if (valid == -1) {
211                                         CALL_UI_DEBUG("[========== MULTIVIEWLIST : Invalid Evas Object, priv->contents : %p ==========]", priv->contents);
212                                         return;
213                                 }
214                                 /* ============ Check valid Evas Object ============= */
215                                 edje_object_part_text_set(_EDJ(priv->contents), "txt_timer", _(time_dur));      //TODO
216                         } else {
217                                 CALL_UI_DEBUG("ERR : Null Evas_Object data->layout");
218                         }
219                 } else if (data->type == VIEW_INCALL_KEYPAD_VIEW) {
220                         if (data->priv) {
221                                 vcui_view_keypad_priv_t *priv = data->priv;
222                                 /* ============ Check valid Evas Object ============= */
223                                 valid = _vcui_check_valid_eo(priv->contents, "KEYPADVIEW");
224                                 if (valid == -1) {
225                                         CALL_UI_DEBUG("[========== KEYPADVIEW : Invalid Evas Object, priv->contents : %p ==========]", priv->contents);
226                                         return;
227                                 }
228                                 /* ============ Check valid Evas Object ============= */
229                                 edje_object_part_text_set(_EDJ(priv->contents), "txt_timer", _(time_dur));      //TODO
230                         } else {
231                                 CALL_UI_DEBUG("ERR : Null Evas_Object data->layout");
232                         }
233                 } else if (data->type == VIEW_ENDCALL_VIEW) {
234                         if (data->priv) {
235                                 endcall_view_priv_t *priv = data->priv;
236                                 /* ============ Check valid Evas Object ============= */
237                                 valid = _vcui_check_valid_eo(priv->contents, "ENDCALLVIEW");
238                                 if (valid == -1) {
239                                         CALL_UI_DEBUG("[========== KEYPADVIEW : Invalid Evas Object, priv->contents : %p ==========]", priv->contents);
240                                         return;
241                                 }
242                                 /* ============ Check valid Evas Object ============= */
243                                 edje_object_part_text_set(_EDJ(priv->contents), "txt_timer", _(time_dur));      //TODO
244                         } else {
245                                 CALL_UI_DEBUG("ERR : Null Evas_Object data->layout");
246                         }
247                 } else {
248                         /*to do nothing in case of other view.*/
249                 }
250         }
251  }
252
253 void _vcui_view_common_set_each_time(time_t starttime)
254 {
255         time_t curr_time;
256         //char call_duration[9];
257         unsigned long call_duration_in_sec = 0;
258         unsigned long sec = 0;
259         unsigned long min = 0;
260         unsigned long hr = 0;
261
262         curr_time = time(&curr_time);
263         call_duration_in_sec = curr_time - starttime;
264         sec = call_duration_in_sec % 60;
265         min = (call_duration_in_sec / 60) % 60;
266         hr = call_duration_in_sec / 3600;
267
268         vcui_view_common_t *common_data = __vcui_view_common_get_common_data();
269
270         // set the start time for every call
271         common_data->start_call_time = starttime;
272         CALL_UI_DEBUG(" common_data->start_call_time %lu", (unsigned long)common_data->start_call_time);
273
274         CALL_UI_DEBUG(" _vcui_view_common_set_each_time curr_time %d starttime %d", (int)curr_time, (int)starttime);
275
276         common_data->sec = sec;
277         common_data->min = min;
278         common_data->hour = hr;
279
280         char dur[TIME_BUF_LEN];
281         snprintf(dur, TIME_BUF_LEN, "%02d:%02d:%02d", common_data->hour, common_data->min, common_data->sec);
282         if (common_data->timer_flag == 1)
283                 _vcui_view_common_set_text_time(dur);
284
285         CALL_UI_DEBUG(" complete input time");
286
287 }
288
289 void _vcui_view_common_timer_text_init()
290 {
291         vcui_view_common_t *common_data = __vcui_view_common_get_common_data();
292
293         if (!common_data->tm) {
294                 if (common_data->timer_flag == 0) {
295                         common_data->sec = 0;
296                         common_data->min = 0;
297                         common_data->hour = 0;
298                         common_data->timer_flag = 1;
299                 }
300                 common_data->tm = ecore_timer_add(TIMER_TIMEOUT_1_SEC, __vcui_view_common_timer_cb, NULL);
301         }
302 }
303
304 void _vcui_view_common_timer_destroy()
305 {
306         vcui_view_common_t *common_data = __vcui_view_common_get_common_data();
307         if (common_data->tm) {
308                 ecore_timer_del(common_data->tm);
309                 common_data->tm = NULL;
310         }
311 }
312
313 void _vcui_view_common_timer_end_destroy()
314 {
315         vcui_view_common_t *common_data = __vcui_view_common_get_common_data();
316         if (common_data->tm_end) {
317                 ecore_timer_del(common_data->tm_end);
318                 common_data->tm_end = NULL;
319         }
320 }
321
322 void _vcui_view_common_timer_end_dialing_destroy()
323 {
324         vcui_view_common_t *common_data = __vcui_view_common_get_common_data();
325         if (common_data->tm_end_dialing) {
326                 ecore_timer_del(common_data->tm_end_dialing);
327                 common_data->tm_end_dialing = NULL;
328         }
329 }
330
331 void _vcui_view_common_timer_redial_reset()
332 {
333         CALL_UI_DEBUG("..");
334         vcui_view_common_t *common_data = __vcui_view_common_get_common_data();
335
336         _vcui_view_common_timer_end_destroy();
337         _vcui_view_common_timer_end_dialing_destroy();
338         common_data->time_end_flag = TIME_END_NO;
339 }
340
341 void _vcui_view_common_call_end_show_dialing(int end_type, int bredial)
342 {
343         CALL_UI_DEBUG("end_type:[%d]", end_type);
344         vcui_app_call_data_t *ad = _vcui_get_app_data();
345         vcui_view_common_t *common_data = __vcui_view_common_get_common_data();
346         char data[VC_DATA_LENGTH_MAX] = { 0, };
347
348         if (ad->call_end_type == CALL_END_TYPE_NONE) {
349                 _vcui_view_dialing_draw_txt_ended(ad->view_st[ad->view_top], end_type);
350         } else if (ad->call_end_type == CALL_END_TYPE_SINGLE_CALL) {
351                 common_data->time_end_flag = TIME_END_START;    // to stop timer from updating the call end screen
352                 _vcui_view_common_set_text_time(_vcui_get_endcause_string(end_type, data));
353         }
354
355         if (common_data->tm_end_dialing) {
356                 ecore_timer_del(common_data->tm_end_dialing);
357                 common_data->tm_end_dialing = NULL;
358         }
359         common_data->bredial = bredial;
360         common_data->tm_end_dialing = ecore_timer_add(TIMER_TIMEOUT_2_SEC, __vcui_view_common_timer_end_dialing_cb, NULL);
361
362 }
363
364 void _vcui_view_common_call_end_show(time_t start_time, int end_type)
365 {
366         CALL_UI_DEBUG("end_type:[%d]", end_type);
367         vcui_view_common_t *common_data = __vcui_view_common_get_common_data();
368
369         if (common_data->tm_end) {
370                 ecore_timer_del(common_data->tm_end);
371                 common_data->tm_end = NULL;
372         }
373         common_data->time_end_flag = TIME_END_START;
374         _vcui_view_common_set_each_time(start_time);
375
376         common_data->end_type = end_type;
377         common_data->tm_end = ecore_timer_add(TIMER_TIMEOUT_0_3_SEC, __vcui_view_common_timer_end_cb, NULL);
378 }
379
380 void _vcui_view_common_call_end_timer_reset(void)
381 {
382         CALL_UI_DEBUG("..");
383         vcui_view_common_t *common_data = __vcui_view_common_get_common_data();
384         if (common_data->tm_end) {
385                 ecore_timer_del(common_data->tm_end);
386                 common_data->tm_end = NULL;
387         }
388
389         if (common_data->tm_end_dialing) {
390                 ecore_timer_del(common_data->tm_end_dialing);
391                 common_data->tm_end_dialing = NULL;
392         }
393
394         common_data->tm_end_force = ecore_timer_add(TIMER_TIMEOUT_2_SEC, __vcui_view_common_timer_end_force_cb, NULL);
395 }
396
397 int _vcui_view_common_call_terminate_or_view_change(void)
398 {
399         CALL_UI_DEBUG("..");
400         vcui_app_call_data_t *ad = _vcui_get_app_data();
401
402         if (_vcui_doc_get_count() == 0) {
403                 if (ad->contact_ug == NULL) {
404                         CALL_UI_DEBUG("EXIT - contact ug is closed");
405                         elm_exit();
406                 } else {
407                         CALL_UI_DEBUG("show contact ug");
408                         CALL_UI_DEBUG("hide & destory [%d]", ad->view_top);
409                         if (ad->view_top != -1) {
410                                 ad->view_st[ad->view_top]->onHide(ad->view_st[ad->view_top]);
411                                 ad->view_st[ad->view_top]->onDestroy(ad->view_st[ad->view_top]);
412                                 ad->view_top = -1;
413                         }
414                         evas_object_show((Evas_Object *)ug_get_layout(ad->contact_ug));
415                 }
416         } else {
417                 _vcui_view_auto_change();
418         }
419         return VC_NO_ERROR;
420 }