2ebe10795ce2c6cf16e8f81bc0e47c1ad61651af
[apps/native/sample/adventure.git] / src / main_view.c
1 #include <Elementary.h>
2 #include <time.h>
3 #include <app_control.h>
4
5 #include "main.h"
6 #include "main_view.h"
7 #include "log.h"
8 #include "scroller.h"
9 #include "city.h"
10 #include "util.h"
11 #include "item.h"
12 #include "conf.h"
13 #include "group_info.h"
14 #include "db.h"
15 #include "map.h"
16
17 const char *const MAIN_VIEW_EDJE = "momentic.edj";
18 const char *const ENTRY_EDJE = "entry.edj";
19 const char *const PREDICT_ITEM_EDJE = "predict_item.edj";
20
21 static void _append_item_to_predict_scroller(Evas_Object *predict_scroller, Evas_Object *item)
22 {
23         Evas_Object *box = NULL;
24
25         ret_if(!predict_scroller);
26         ret_if(!item);
27
28         box = elm_object_content_get(predict_scroller);
29         ret_if(!box);
30
31         elm_box_pack_end(box, item);
32 }
33
34 static void _remove_item_in_predict_scroller(Evas_Object *predict_scroller, Evas_Object *item)
35 {
36         Evas_Object *box = NULL;
37
38         ret_if(!predict_scroller);
39         ret_if(!item);
40
41         box = elm_object_content_get(predict_scroller);
42         ret_if(!box);
43
44         elm_box_unpack(box, item);
45 }
46
47 static void _clean_predict_scroller(Evas_Object *predict_scroller)
48 {
49         Evas_Object *box = NULL;
50         Evas_Object *predict_item = NULL;
51         Eina_List *list = NULL;
52
53         ret_if(!predict_scroller);
54
55         box = elm_object_content_get(predict_scroller);
56         ret_if(!box);
57
58         list = elm_box_children_get(box);
59         ret_if(!list);
60
61         EINA_LIST_FREE(list, predict_item) {
62                 item_destroy_typing(predict_item);
63         }
64 }
65
66 static void _update_predict_scroller(Evas_Object *predict_scroller, const char *str, main_view_s *main_view_info)
67 {
68         city_s *city_info = NULL;
69         register int i = 0;
70
71         ret_if(!predict_scroller);
72
73         _clean_predict_scroller(predict_scroller);
74
75         city_info = city_get();
76         ret_if(!city_info);
77
78         for (; i < CITY_MAX; i++) {
79                 int matched = 0;
80                 if (city_info[i].name && strstr(city_info[i].name, str))
81                         matched = 1;
82                 else if (city_info[i].nation && strstr(city_info[i].nation, str))
83                         matched = 1;
84
85                 if (matched) {
86                         Evas_Object *predict_item = NULL;
87                         predict_item = item_create_typing(predict_scroller, i, main_view_info);
88                         if (predict_item)
89                                 _append_item_to_predict_scroller(predict_scroller, predict_item);
90                 }
91         }
92         elm_object_signal_emit(main_view_info->main_view, "show", "entry_result");
93 }
94
95 static void _change_entry_cb(void *data, Evas_Object *obj, void *event_info)
96 {
97         main_view_s *main_view_info = data;
98         Evas_Object *entry = obj;
99         const char *str = NULL;
100
101         ret_if(!main_view_info);
102
103         _D("Entry is changed");
104
105         str = elm_entry_entry_get(entry);
106         if (!str
107                 || (str && !strlen(str))) {
108                 _clean_predict_scroller(main_view_info->predict_scroller);
109                 elm_object_signal_emit(main_view_info->main_view, "momentic,state,searchlist,hide", "");
110                 return;
111         }
112
113         _update_predict_scroller(main_view_info->predict_scroller, str, main_view_info);
114         elm_object_signal_emit(main_view_info->main_view, "momentic,state,searchlist,show", "");
115 }
116
117 static void _focus_entry_cb(void *data, Evas_Object *obj, void *event_info)
118 {
119         main_view_s *main_view_info = data;
120         Evas_Object *entry = obj;
121         const char *str = NULL;
122
123         ret_if(!main_view_info);
124
125         _D("Entry is focused");
126
127         str = elm_entry_entry_get(entry);
128         if (!str)
129                 return;
130
131         _update_predict_scroller(main_view_info->predict_scroller, str, main_view_info);
132 }
133
134 static void _unfocus_entry_cb(void *data, Evas_Object *obj, void *event_info)
135 {
136         main_view_s *main_view_info = data;
137
138         ret_if(!main_view_info);
139         ret_if(!main_view_info->predict_scroller);
140
141         _D("Entry is unfocused");
142
143         elm_object_signal_emit(main_view_info->main_view, "hide", "entry_result");
144         //_clean_predict_scroller(main_view_info->predict_scroller);
145 }
146
147 static void _resize_cb(void *data, Evas *e, Evas_Object *obj, void *event_info)
148 {
149         int x, y, w, h;
150         evas_object_geometry_get(obj, &x, &y, &w, &h);
151         _D("%s (%d:%d:%d:%d)", data, x, y, w, h);
152 }
153
154 static void _delete_down_cb(void *data, Evas_Object *obj, const char *emission, const char *source)
155 {
156         _D("Delete button is down");
157 }
158
159 static void _delete_up_cb(void *data, Evas_Object *obj, const char *emission, const char *source)
160 {
161         Evas_Object *entry = obj;
162         Evas_Object *entry_obj = NULL;
163         main_view_s *main_view_info = data;
164
165         ret_if(!entry);
166         ret_if(!main_view_info);
167         ret_if(!main_view_info->predict_scroller);
168
169         _D("Delete button is up");
170
171         entry_obj = elm_object_part_content_get(entry, "entry");
172         if (entry_obj)
173                 elm_entry_entry_set(entry_obj, "");
174
175         _clean_predict_scroller(main_view_info->predict_scroller);
176 }
177
178 static Evas_Object *_create_search_entry(Evas_Object *parent, main_view_s *main_view_info)
179 {
180         Evas_Object *entry = NULL;
181         Evas_Object *entry_obj = NULL;
182
183         char *path = NULL;
184         char full_path[PATH_LEN] = {0, };
185
186         retv_if(!parent, NULL);
187
188         path = app_get_resource_path();
189         retv_if(!path, NULL);
190
191         snprintf(full_path, sizeof(full_path), "%s/edje/%s", path, ENTRY_EDJE);
192         free(path);
193
194         entry = elm_layout_add(parent);
195         retv_if(!entry, NULL);
196
197         elm_layout_file_set(entry, full_path, "main");
198         elm_object_signal_callback_add(entry, "delete,down", "entry", _delete_down_cb, main_view_info);
199         elm_object_signal_callback_add(entry, "delete,up", "entry", _delete_up_cb, main_view_info);
200
201         evas_object_size_hint_weight_set(entry, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
202         evas_object_size_hint_align_set(entry, EVAS_HINT_FILL, EVAS_HINT_FILL);
203         evas_object_show(entry);
204
205         entry_obj = elm_entry_add(parent);
206         retv_if(!entry_obj, NULL);
207
208         elm_entry_single_line_set(entry_obj, EINA_TRUE);
209         elm_entry_scrollable_set(entry_obj, EINA_TRUE);
210         elm_entry_cnp_mode_set(entry_obj, ELM_CNP_MODE_PLAINTEXT);
211         elm_entry_text_style_user_push(entry_obj, "DEFAULT='font_size=20'");
212         elm_object_part_text_set(entry_obj, "elm.guide", "<font_size=20>Search</font_size>");
213
214         evas_object_size_hint_weight_set(entry_obj, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
215         evas_object_size_hint_align_set(entry_obj, EVAS_HINT_FILL, EVAS_HINT_FILL);
216
217         evas_object_smart_callback_add(entry_obj, "changed", _change_entry_cb, main_view_info);
218         evas_object_smart_callback_add(entry_obj, "focused", _focus_entry_cb, main_view_info);
219         evas_object_smart_callback_add(entry_obj, "unfocused", _unfocus_entry_cb, main_view_info);
220
221         evas_object_show(entry_obj);
222         elm_object_part_content_set(entry, "entry", entry_obj);
223
224         return entry;
225 }
226
227 static void _destroy_search_entry(Evas_Object *entry)
228 {
229         Evas_Object *entry_obj = NULL;
230
231         ret_if(!entry);
232
233         entry_obj = elm_object_part_content_unset(entry, "entry");
234         if (entry_obj)
235                 evas_object_del(entry_obj);
236
237         evas_object_del(entry);
238 }
239
240 static void _click_result_button_cb(void *data, Evas_Object *obj, void *event_info)
241 {
242         main_view_s *main_view_info = data;
243         Evas_Object *box = NULL;
244         Evas_Object *item = NULL;
245         Eina_List *list = NULL;
246         struct tm *global_time = NULL;
247         struct tm *local_time = NULL;
248         time_t t;
249         city_s *city_info = NULL;
250         int cur_timezone = 0;
251
252         ret_if(!main_view_info);
253         ret_if(!main_view_info->selected_scroller);
254         ret_if(!main_view_info->result_scroller);
255
256         _D("result button is clicked");
257
258         scroller_clear_item(main_view_info->result_scroller);
259
260         city_info = city_get();
261         ret_if(!city_info);
262
263         time(&t);
264         global_time = gmtime(&t);
265         local_time = localtime(&t);
266
267         cur_timezone = (int) local_time->tm_gmtoff / 3600;
268
269         box = elm_object_content_get(main_view_info->selected_scroller);
270         ret_if(!box);
271
272         list = elm_box_children_get(box);
273         ret_if(!list);
274
275         EINA_LIST_FREE(list, item) {
276                 selecting_info_s *selecting_info = NULL;
277                 Evas_Object *item_result = NULL;
278                 int start = 0, end = 0;
279                 int tmp_timezone = 0;
280
281                 selecting_info = evas_object_data_get(item, DATA_KEY_SELECTING);
282                 continue_if(!selecting_info);
283
284                 tmp_timezone = city_info[selecting_info->city].timezone;
285                 if (tmp_timezone < cur_timezone)
286                         tmp_timezone += 24;
287
288                 start = tmp_timezone - cur_timezone + BEST_START_TIME;
289                 end = (start + (BEST_END_TIME - BEST_START_TIME)) % 24;
290
291                 item_result = item_create_result(main_view_info->result_scroller
292                                 , selecting_info->city
293                                 , selecting_info->color
294                                 , start
295                                 , end
296                                 , global_time);
297
298                 scroller_append_item(main_view_info->result_scroller, item_result);
299         }
300
301         elm_object_signal_emit(main_view_info->main_view, "momentic,state,page2", "");
302 }
303
304 static Evas_Object *_create_result_button(Evas_Object *parent, main_view_s *main_view_info)
305 {
306         Evas_Object *result_button = NULL;
307         Evas_Object *icon = NULL;
308         char *path = NULL;
309         char full_path[PATH_LEN] = {0, };
310
311         retv_if(!parent, NULL);
312
313         path = app_get_resource_path();
314         retv_if(!path, NULL);
315
316         snprintf(full_path, sizeof(full_path), "%s/images/next_btn.png", path);
317         free(path);
318
319         result_button = elm_button_add(parent);
320         retv_if(!result_button, NULL);
321         evas_object_smart_callback_add(result_button, "clicked", _click_result_button_cb, main_view_info);
322
323         icon = elm_image_add(result_button);
324         if (icon) {
325                 elm_image_file_set(icon, full_path, NULL);
326                 elm_object_content_set(result_button, icon);
327         }
328
329         return result_button;
330 }
331
332 static void _destroy_result_button(Evas_Object *result_button)
333 {
334         ret_if(!result_button);
335         evas_object_del(result_button);
336 }
337
338 static Evas_Object *_create_selected_scroller(Evas_Object *parent)
339 {
340         Evas_Object *selected_scroller = NULL;
341
342         retv_if(!parent, NULL);
343
344         selected_scroller = scroller_create(parent);
345         retv_if(!selected_scroller, NULL);
346
347         return selected_scroller;
348 }
349
350 static void _destroy_selected_scroller(Evas_Object *selected_scroller)
351 {
352         Evas_Object *box = NULL;
353         Evas_Object *item = NULL;
354         Eina_List *list = NULL;
355
356         ret_if(!selected_scroller);
357
358         box = elm_object_content_get(selected_scroller);
359         ret_if(!box);
360
361         list = elm_box_children_get(box);
362         ret_if(!list);
363
364         EINA_LIST_FREE(list, item) {
365                 evas_object_del(item);
366         }
367
368         evas_object_del(box);
369         evas_object_del(selected_scroller);
370 }
371
372 static void _click_plus_button_cb(void *data, Evas_Object *obj, void *event_info)
373 {
374         main_view_s *main_view_info = data;
375
376         _D("Add button is clicked");
377
378         ret_if(!main_view_info);
379         ret_if(!main_view_info->main_view);
380
381         elm_object_signal_emit(main_view_info->main_view, "momentic,state,page1", "");
382
383 }
384
385 static Evas_Object *_create_plus_button(Evas_Object *parent, main_view_s *main_view_info)
386 {
387         Evas_Object *plus_button = NULL;
388         Evas_Object *icon = NULL;
389         char *path = NULL;
390         char full_path[PATH_LEN] = {0, };
391
392         retv_if(!parent, NULL);
393
394         path = app_get_resource_path();
395         retv_if(!path, NULL);
396
397         snprintf(full_path, sizeof(full_path), "%s/images/add_btn.png", path);
398         free(path);
399
400         plus_button = elm_button_add(parent);
401         retv_if(!plus_button, NULL);
402         elm_object_style_set(plus_button, "transparent");
403         evas_object_smart_callback_add(plus_button, "clicked", _click_plus_button_cb, main_view_info);
404
405         icon = elm_image_add(plus_button);
406         if (icon) {
407                 elm_image_file_set(icon, full_path, NULL);
408                 elm_object_content_set(plus_button, icon);
409         }
410
411         return plus_button;
412 }
413
414 static void _destroy_plus_button(Evas_Object *plus_button)
415 {
416         ret_if(!plus_button);
417         evas_object_del(plus_button);
418 }
419
420 static void _click_save_button_cb(void *data, Evas_Object *obj, void *event_info)
421 {
422         main_view_s *main_view_info = data;
423         moment_info_s *moment_info = main_view_info->moment_info;
424         Evas_Object *box = NULL;
425         Evas_Object *item = NULL;
426         Eina_List *list = NULL;
427         group_info_s *group_info = NULL;
428         int city[MAXIMUM_SELECTED_CITY] = {0, };
429         int i = 0;
430         long time = 0l;
431
432         _D("Save button is clicked");
433
434         ret_if(!main_view_info);
435         ret_if(!main_view_info->result_scroller);
436
437         box = elm_object_content_get(main_view_info->result_scroller);
438         ret_if(!box);
439
440         list = elm_box_children_get(box);
441         ret_if(!list);
442
443         EINA_LIST_FREE(list, item) {
444                 result_info_s *result_info = NULL;
445
446                 result_info = evas_object_data_get(item, DATA_KEY_RESULT);
447                 continue_if(!result_info);
448
449                 city[i] = result_info->city;
450                 i++;
451         }
452
453         time = db_insert_group(moment_info->db
454                         , "Momentic time"
455                         , city[0] 
456                         , city[1]
457                         , city[2]
458                         , city[3]
459                         , city[4]);
460         group_info = group_info_create(time
461                         , "Momentic time"
462                         , city[0] 
463                         , city[1]
464                         , city[2]
465                         , city[3]
466                         , city[4]);
467         moment_info->group_list = eina_list_append(moment_info->group_list, group_info);
468 }
469
470 static Evas_Object *_create_save_button(Evas_Object *parent, moment_info_s *moment_info)
471 {
472         Evas_Object *save_button = NULL;
473
474         retv_if(!parent, NULL);
475
476         save_button = elm_button_add(parent);
477         retv_if(!save_button, NULL);
478
479         elm_object_text_set(save_button, "Save");
480         evas_object_size_hint_weight_set(save_button, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
481         evas_object_size_hint_align_set(save_button, EVAS_HINT_FILL, EVAS_HINT_FILL);
482         evas_object_smart_callback_add(save_button, "clicked", _click_save_button_cb, moment_info);
483
484         return save_button;
485 }
486
487 static void _destroy_save_button(Evas_Object *save_button)
488 {
489         ret_if(!save_button);
490         evas_object_del(save_button);
491 }
492
493 static Evas_Object *_create_predict_scroller(Evas_Object *parent)
494 {
495         Evas_Object *predict_scroller = NULL;
496
497         retv_if(!parent, NULL);
498
499         predict_scroller = scroller_create(parent);
500         retv_if(!predict_scroller, NULL);
501
502         return predict_scroller;
503 }
504
505 static void _destroy_predict_scroller(Evas_Object *predict_scroller)
506 {
507         Evas_Object *box = NULL;
508         Evas_Object *item = NULL;
509         Eina_List *list = NULL;
510
511         ret_if(!predict_scroller);
512
513         box = elm_object_content_get(predict_scroller);
514         ret_if(!box);
515
516         list = elm_box_children_get(box);
517         ret_if(!list);
518
519         EINA_LIST_FREE(list, item) {
520                 evas_object_del(item);
521         }
522
523         evas_object_del(box);
524         evas_object_del(predict_scroller);
525 }
526
527 static Evas_Object *_create_result_scroller(Evas_Object *parent)
528 {
529         Evas_Object *result_scroller = NULL;
530
531         retv_if(!parent, NULL);
532
533         result_scroller = scroller_create(parent);
534         retv_if(!result_scroller, NULL);
535
536         return result_scroller;
537 }
538
539 static void _destroy_result_scroller(Evas_Object *result_scroller)
540 {
541         Evas_Object *box = NULL;
542         Evas_Object *item = NULL;
543         Eina_List *list = NULL;
544
545         ret_if(!result_scroller);
546
547         box = elm_object_content_get(result_scroller);
548         ret_if(!box);
549
550         list = elm_box_children_get(box);
551         ret_if(!list);
552
553         EINA_LIST_FREE(list, item) {
554                 evas_object_del(item);
555         }
556
557         evas_object_del(box);
558         evas_object_del(result_scroller);
559 }
560
561 static Evas_Object *_create_group_scroller(Evas_Object *parent, Eina_List *list, main_view_s *main_view_info)
562 {
563         Evas_Object *group_scroller = NULL;
564         group_info_s *group_info = NULL;
565         const Eina_List *l = NULL;
566
567         retv_if(!parent, NULL);
568
569         group_scroller = scroller_create(parent);
570         retv_if(!group_scroller, NULL);
571
572         EINA_LIST_FOREACH(list, l, group_info) {
573                 Evas_Object *item_group = item_create_group(group_scroller
574                                 , group_info->title
575                                 , main_view_info);
576                 scroller_append_item(group_scroller, item_group);
577         }
578
579         return group_scroller;
580 }
581
582 static void _destroy_group_scroller(Evas_Object *group_scroller)
583 {
584         Evas_Object *box = NULL;
585         Evas_Object *item = NULL;
586         Eina_List *list = NULL;
587
588         ret_if(!group_scroller);
589
590         box = elm_object_content_get(group_scroller);
591         ret_if(!box);
592
593         list = elm_box_children_get(box);
594         ret_if(!list);
595
596         EINA_LIST_FREE(list, item) {
597                 evas_object_del(item);
598         }
599
600         evas_object_del(box);
601         evas_object_del(group_scroller);
602 }
603
604 Evas_Object *main_view_create(Evas_Object *parent, moment_info_s *moment_info)
605 {
606         main_view_s *main_view_info = NULL;
607         char *path = NULL;
608         char full_path[PATH_LEN] = {0, };
609
610         retv_if(!parent, NULL);
611
612         path = app_get_resource_path();
613         retv_if(!path, NULL);
614
615         snprintf(full_path, sizeof(full_path), "%s/edje/%s", path, MAIN_VIEW_EDJE);
616         free(path);
617
618         _D("main_view is created with %s", full_path);
619
620         main_view_info = calloc(1, sizeof(main_view_s));
621         retv_if(!main_view_info, NULL);
622         main_view_info->moment_info = moment_info;
623
624         main_view_info->main_view = create_momentic_layout(parent, full_path);
625         if (!main_view_info->main_view) {
626                 free(main_view_info);
627                 return NULL;
628         }
629
630         elm_layout_file_set(main_view_info->main_view, full_path, "main");
631         evas_object_size_hint_weight_set(main_view_info->main_view, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
632         evas_object_size_hint_align_set(main_view_info->main_view, EVAS_HINT_FILL, EVAS_HINT_FILL);
633         evas_object_show(main_view_info->main_view);
634         evas_object_data_set(main_view_info->main_view, DATA_KEY_INFO, main_view_info);
635         evas_object_event_callback_add(main_view_info->main_view, EVAS_CALLBACK_RESIZE, _resize_cb, "main_view");
636
637         elm_object_part_text_set(main_view_info->main_view, "title", "No cities");
638         elm_object_part_text_set(main_view_info->main_view, "description", "After you add cities, they will be shown here.");
639
640         main_view_info->entry = _create_search_entry(main_view_info->main_view, main_view_info);
641         if (main_view_info->entry)
642                 elm_object_part_content_set(main_view_info->main_view, "searchbar", main_view_info->entry);
643
644         main_view_info->result_button = _create_result_button(main_view_info->main_view, main_view_info);
645         if (main_view_info->result_button)
646                 elm_object_part_content_set(main_view_info->main_view, "next_btn", main_view_info->result_button);
647
648         main_view_info->selected_scroller = _create_selected_scroller(main_view_info->main_view);
649         if (main_view_info->selected_scroller)
650                 elm_object_part_content_set(main_view_info->main_view, "city_list", main_view_info->selected_scroller);
651
652         main_view_info->plus_button = _create_plus_button(main_view_info->main_view, main_view_info);
653         if (main_view_info->plus_button)
654                 elm_object_part_content_set(main_view_info->main_view, "add_btn", main_view_info->plus_button);
655
656         main_view_info->predict_scroller = _create_predict_scroller(main_view_info->main_view);
657         if (main_view_info->predict_scroller)
658                 elm_object_part_content_set(main_view_info->main_view, "searchlist", main_view_info->predict_scroller);
659
660         main_view_info->result_scroller = _create_result_scroller(main_view_info->main_view);
661         if (main_view_info->result_scroller)
662                 elm_object_part_content_set(main_view_info->main_view, "result_list", main_view_info->result_scroller);
663
664         main_view_info->group_scroller = _create_group_scroller(main_view_info->main_view, moment_info->group_list, main_view_info);
665         if (main_view_info->group_scroller)
666                 evas_object_hide(main_view_info->group_scroller);
667                 //elm_object_part_content_set(main_view_info->main_view, "group_scroller", main_view_info->group_scroller);
668
669         return main_view_info->main_view;
670 }
671
672 void main_view_destroy(Evas_Object *main_view)
673 {
674         Evas_Object *button = NULL;
675         main_view_s *main_view_info = NULL;
676
677         ret_if(!main_view);
678
679         main_view_info = evas_object_data_del(main_view_info->main_view, DATA_KEY_INFO);
680         ret_if(!main_view_info);
681
682         if (main_view_info->group_scroller)
683                 _destroy_group_scroller(main_view_info->group_scroller);
684
685         if (main_view_info->result_scroller)
686                 _destroy_result_scroller(main_view_info->result_scroller);
687
688         if (main_view_info->predict_scroller)
689                 _destroy_predict_scroller(main_view_info->predict_scroller);
690
691         if (main_view_info->plus_button)
692                 _destroy_plus_button(main_view_info->plus_button);
693
694         if (main_view_info->selected_scroller)
695                 _destroy_selected_scroller(main_view_info->selected_scroller);
696
697         if (main_view_info->result_button)
698                 _destroy_result_button(button);
699
700         if (main_view_info->entry)
701                 _destroy_search_entry(main_view_info->entry);
702
703         free(main_view_info);
704
705         evas_object_del(main_view);
706 }
707
708 static void _get_best_time(double *timezone, int size, double *start, double *end)
709 {
710         register int i = 1;
711
712         ret_if(!timezone);
713         ret_if(!start);
714         ret_if(!end);
715
716         *start = timezone[0];
717         *end = timezone[0] + BEST_DURING_TIME;
718
719         for (; i < size; i++) {
720                 double tmp = timezone[i];
721
722                 if (tmp < *start) {
723                         if (tmp + BEST_DURING_TIME <= *start) {
724                                 _D("No matched time");
725                                 *start = 0;
726                                 *end = 0;
727                                 return;
728                         } else {
729                                 *end = tmp + BEST_DURING_TIME;
730                         }
731                 } else if (tmp > *start) {
732                         if (tmp >= *end) {
733                                 _D("No matched time");
734                                 *start = 0;
735                                 *end = 0;
736                                 return;
737                         } else {
738                                 *start = tmp;
739                         }
740                 } else
741                         continue;
742         }
743 }
744
745 static void _reply_cb(app_control_h request, app_control_h reply, app_control_result_e result, void *user_data)
746 {
747         _D("Result callback is called");
748 }
749
750 static void _launch_calendar_edit(int start, int end)
751 {
752         app_control_h app_control = NULL;
753         time_t t;
754         struct tm *local_time = NULL;
755         int ret;
756
757         char start_str[PATH_LEN] = {0, };
758         char end_str[PATH_LEN] = {0, };
759
760         ret = app_control_create(&app_control);
761         ret_if(APP_CONTROL_ERROR_NONE != ret);
762
763         local_time = localtime(&t);
764
765         snprintf(start_str, sizeof(start_str), "%4d-%2d-%2d %2d:%2d:%2d"
766                         , local_time->tm_year + 1900
767                         , local_time->tm_mon + 1
768                         , local_time->tm_mday
769                         , start
770                         , 0
771                         , 0);
772
773         snprintf(start_str, sizeof(start_str), "%4d-%2d-%2d %2d:%2d:%2d"
774                         , local_time->tm_year + 1900
775                         , local_time->tm_mon + 1
776                         , local_time->tm_mday
777                         , end
778                         , 0
779                         , 0);
780
781         app_control_set_app_id(app_control, "com.samsung.calendar-lite-edit");
782         app_control_set_operation(app_control, "http://tizen.org/appcontrol/operation/edit");
783         app_control_add_extra_data(app_control, "start_time", start_str);
784         app_control_add_extra_data(app_control, "end_time", end_str);
785
786         app_control_send_launch_request(app_control, _reply_cb, NULL);
787         app_control_destroy(app_control);
788 }
789
790
791