Bug fix TIVI-839 ,change the design and permit operation of the music player while...
[profile/ivi/ico-uxf-homescreen.git] / src / status_bar.c
1 /*
2  * Copyright (c) 2013, TOYOTA MOTOR CORPORATION.
3  *
4  * This program is licensed under the terms and conditions of the
5  * Apache License, version 2.0.  The full text of the Apache License is at
6  * http://www.apache.org/licenses/LICENSE-2.0
7  *
8  */
9 /**
10  * @brief   statusbar application
11  *
12  * @date    Feb-15-2013
13  */
14
15 #include <stdio.h>
16 #include <time.h>
17 #include <pthread.h>
18
19 #include <libwebsockets.h>
20
21 #include <Ecore.h>
22 #include <Ecore_Wayland.h>
23 #include <Ecore_Evas.h>
24
25 #include "ico_uxf.h"
26 #include "ico_uxf_conf.h"
27 #include "ico_uxf_conf_ecore.h"
28
29 #include "home_screen.h"
30 #include "home_screen_res.h"
31 #include "home_screen_conf.h"
32
33 /*============================================================================*/
34 /* Define data types                                                          */
35 /*============================================================================*/
36 #define ICO_SB_TIME_AM        (10) /* f_name in sb_time_data */
37 #define ICO_SB_TIME_PM        (11) /* f_name in sb_time_data */
38 #define ICO_SB_TIME_IMG_PARTS (12) /* total counts of sb_time_data */
39 #define ICO_SB_TIMEOUT        (0.2)
40
41 #define ICO_SB_WS_TIMEOUT     (0.05)
42 #define ICO_SB_WS_ADDRESS     "127.0.0.1"
43 #define ICO_SB_WS_PROTOCOL_NAME   ICO_HS_PROTOCOL_SB
44 #define ICO_SB_BUF_SIZE       (1024)
45 #define ICO_SB_VERTICAL       (1)
46 #define ICO_SB_HORIZONTAL     (2)
47
48 #define ICO_SB_POS_Y          (0)
49 #define ICO_SB_POS_COLON_X    (689)
50 #define ICO_SB_POS_COLON_Y    (30)
51 #define ICO_SB_POS_AMPM_X     (582)
52 #define ICO_SB_POS_AMPM_Y     (27)
53 #define ICO_SB_POS_HOUR1_X    (640)
54 #define ICO_SB_POS_HOUR1_Y    (18)
55 #define ICO_SB_POS_HOUR2_X    (662)
56 #define ICO_SB_POS_HOUR2_Y    (18)
57 #define ICO_SB_POS_MIN1_X     (703)
58 #define ICO_SB_POS_MIN1_Y     (18)
59 #define ICO_SB_POS_MIN2_X     (725)
60 #define ICO_SB_POS_MIN2_Y     (18)
61
62 #define ICO_SB_SIZE_SHTCT_W   (ICO_HS_SIZE_SB_HEIGHT)
63
64 #define ICO_SB_POS_LIST_X     (ICO_HS_SIZE_SB_HEIGHT * 5)
65 #define ICO_SB_POS_SHTCT1_X   (ICO_SB_POS_LIST_X + ICO_HS_SIZE_SB_HEIGHT + ICO_HS_SIZE_SB_HEIGHT * 2 / 2)
66 #define ICO_SB_POS_SHTCT2_X   (ICO_SB_POS_SHTCT1_X + ICO_HS_SIZE_SB_HEIGHT + ICO_HS_SIZE_SB_HEIGHT * 1 / 2)
67
68 #define ICO_SB_SIZE_COLON_W   (6)
69 #define ICO_SB_SIZE_COLON_H   (17)
70 #define ICO_SB_SIZE_NUM_W     (20)
71 #define ICO_SB_SIZE_NUM_H     (30)
72 #define ICO_SB_SIZE_AMPM_W    (47)
73 #define ICO_SB_SIZE_AMPM_H    (27)
74
75 #define ICO_SB_CHTCT_MAX      (5)
76
77 #define ICO_SB_NO_WAIT        (1)
78 #define ICO_SB_WAIT_REPLY     (2)
79
80 #define ICO_SB_APPLIST_OFFICON "applist_off.png"
81 #define ICO_SB_APPLIST_ONICON "applist_on.png"
82 #define ICO_SB_HOME_OFFICON "home_off.png"
83 #define ICO_SB_HOME_ONICON "home_on.png"
84
85 /*============================================================================*/
86 /* static(internal) functions prototype                                       */
87 /*============================================================================*/
88 static void sb_on_destroy(Ecore_Evas *ee);
89 static int sb_callback_http(struct libwebsocket_context *context,
90               struct libwebsocket *wsi,
91               enum libwebsocket_callback_reasons reason, void *user, void *in,
92               size_t len);
93 static int sb_callback_statusbar(struct libwebsocket_context *context,
94                    struct libwebsocket *wsi,
95                    enum libwebsocket_callback_reasons reason, void *user,
96                    void *in, size_t len);
97 static void sb_create_ws_context(void);
98 static void sb_time_hour(struct tm *t_st);
99 static void sb_time_min(struct tm *t_st);
100 static Eina_Bool sb_time_show(void* thread_data);
101 static void sb_touch_up_escathion(void *data, Evas *evas, Evas_Object *obj, void *event_info);
102 static void sb_touch_down_escathion(void *data, Evas *evas, Evas_Object *obj, void *event_info);
103 static void sb_touch_up_applist(void *data, Evas *evas, Evas_Object *obj, void *event_info);
104 static void sb_touch_down_applist(void *data, Evas *evas, Evas_Object *obj, void *event_info);
105 static void sb_clock_display_fixation(Evas *canvas);
106 static void sb_touch_up_shortcut(void *data, Evas *evas, Evas_Object *obj, void *event_info);
107 static void sb_config_event(const char *appid, int type);
108 static void sb_add_shortcut(Evas *canvas);
109
110 /*============================================================================*/
111 /* variabe & table                                                            */
112 /*============================================================================*/
113 static Evas *sb_canvas;
114 static Eina_List *sb_shtct_list = NULL;
115 static int sb_wait_reply = ICO_SB_NO_WAIT;
116 static int sb_ws_port = ICO_HS_WS_PORT;
117 static int sb_ws_connected = 0;
118 static struct libwebsocket_context *sb_ws_context;
119 static struct libwebsocket *sb_wsi_mirror;
120
121 static int sb_width = 0;
122 static char sb_respath[ICO_SB_BUF_SIZE];
123 static struct tm sb_st_buf;
124 static Evas_Object *sb_ampm;
125 static Evas_Object *sb_hour1;
126 static Evas_Object *sb_hour2;
127 static Evas_Object *sb_min1;
128 static Evas_Object *sb_min2;
129
130 struct _sb_time_data {
131     char f_name[64];
132     Evas_Object *time_img;
133 };
134
135 struct _sb_time_data sb_time_data[ICO_SB_TIME_IMG_PARTS] = {
136        {fname_num0, }, {fname_num1, },
137        {fname_num2, }, {fname_num3, },
138        {fname_num4, }, {fname_num5, },
139        {fname_num6, }, {fname_num7, },
140        {fname_num8, }, {fname_num9, },
141        {fname_am, }, {fname_pm, }
142 };
143
144 static struct libwebsocket_protocols ws_protocols[] = {
145     {
146         "http-only",
147         sb_callback_http,
148         0
149     },
150     {
151         "statusbar-protocol",
152         sb_callback_statusbar,
153         0,
154     },
155     {
156         /* end of list */
157         NULL,
158         NULL,
159         0
160     }
161 };
162
163 /*============================================================================*/
164 /* functions                                                                  */
165 /*============================================================================*/
166 /*--------------------------------------------------------------------------*/
167 /*
168  * @brief   sb_on_destroy
169  *          callback function called by EFL when ecore destroyed.
170  *          exit ecore main loop.
171  *
172  * @param[in]   ee                  ecore evas object
173  * @return      none
174  */
175 /*--------------------------------------------------------------------------*/
176 static void
177 sb_on_destroy(Ecore_Evas *ee)
178 {
179     /* Quits the main loop */
180     ecore_main_loop_quit();
181 }
182
183 /*--------------------------------------------------------------------------*/
184 /*
185  * @brief   sb_callback_http
186  *          Connection status is notified from libwebsockets.
187  *
188  * @param[in]   context             libwebsockets context
189  * @param[in]   wsi                 libwebsockets management table
190  * @param[in]   reason              event type
191  * @param[in]   user                intact
192  * @param[in]   in                  receive message
193  * @param[in]   len                 message size[BYTE]
194  * @return      result
195  * @retval      =0                  success
196  * @retval      =1                  error
197  */
198 /*--------------------------------------------------------------------------*/
199 static int
200 sb_callback_http(struct libwebsocket_context *context, struct libwebsocket *wsi,
201               enum libwebsocket_callback_reasons reason, void *user, void *in,
202               size_t len)
203 {
204     uifw_trace("sb_callback_http %p", context);
205     uifw_trace("SB-REASON %d", reason);
206     return 0;
207 }
208
209 /*--------------------------------------------------------------------------*/
210 /*
211  * @brief   sb_callback_statusbar
212  *          this callback function is notified from libwebsockets
213  *          statusbar protocol
214  *
215  * @param[in]   context             libwebsockets context
216  * @param[in]   wsi                 libwebsockets management table
217  * @param[in]   reason              event type
218  * @param[in]   user                intact
219  * @param[in]   in                  receive message
220  * @param[in]   len                 message size[BYTE]
221  * @return      result
222  * @retval      =0                  success
223  * @retval      =1                  error
224  */
225 /*--------------------------------------------------------------------------*/
226 static int
227 sb_callback_statusbar(struct libwebsocket_context *context,
228                    struct libwebsocket *wsi,
229                    enum libwebsocket_callback_reasons reason, void *user,
230                    void *in, size_t len)
231 {
232     int n = 0;
233     unsigned char buf[LWS_SEND_BUFFER_PRE_PADDING + 512
234             + LWS_SEND_BUFFER_POST_PADDING];
235     unsigned char *p = &buf[LWS_SEND_BUFFER_PRE_PADDING];
236
237     uifw_trace("sb_callback_statusbar %p", context);
238
239     switch (reason) {
240     case LWS_CALLBACK_CLIENT_ESTABLISHED:
241         uifw_trace("SB-ESTABLISHED %x", wsi);
242         sb_wsi_mirror = wsi;
243         n = sprintf((char *)p, "%s", "ANS HELLO");
244         break;
245     case LWS_CALLBACK_CLIENT_RECEIVE:
246         uifw_trace("SB-RECEIVE[%d] %s", len, in);
247         sb_wsi_mirror = wsi;
248         if (strncmp("RECEIVE OK", in, 10) == 0) {
249             sb_wait_reply = ICO_SB_NO_WAIT;
250         }
251         else {
252             n = sprintf((char *)p, "ANS %s OK", (char *)in);
253         }
254         break;
255     case LWS_CALLBACK_CLOSED:
256         uifw_trace("SB-CLOSE");
257         sb_wsi_mirror = NULL;
258         break;
259     default:
260         uifw_trace("SB-REASON %d", reason);
261         break;
262     }
263
264     if (n != 0) {
265         n = libwebsocket_write(wsi, p, n, LWS_WRITE_TEXT);
266     }
267
268     return 0;
269 }
270
271 /*--------------------------------------------------------------------------*/
272 /**
273  * @brief   sb_create_ws_context
274  *          connect to the homescreen using websocket.
275  *
276  * @param[in]   none
277  * @return      none
278  */
279 /*--------------------------------------------------------------------------*/
280 static void
281 sb_create_ws_context(void)
282 {
283     sb_ws_context
284             = libwebsocket_create_context(CONTEXT_PORT_NO_LISTEN, NULL,
285                                           ws_protocols,
286                                           libwebsocket_internal_extensions,
287                                           NULL, NULL, -1, -1, 0);
288     uifw_trace("sb_create_ws_context ctx = %p", sb_ws_context);
289
290     sb_ws_connected = 0;
291     if (sb_ws_context == NULL) {
292         uifw_trace("libwebsocket_create_context failed.");
293     }
294     else {
295         sb_wsi_mirror
296                 = libwebsocket_client_connect(sb_ws_context, ICO_SB_WS_ADDRESS,
297                                               sb_ws_port, 0, "/",
298                                               ICO_SB_WS_ADDRESS, NULL,
299                                               ICO_SB_WS_PROTOCOL_NAME, -1);
300         uifw_trace("sb_create_ws_context wsi = %p", sb_wsi_mirror);
301         if (sb_wsi_mirror != NULL) {
302             sb_ws_connected = 1;
303         }
304     }
305 }
306
307 /*--------------------------------------------------------------------------*/
308 /**
309  * @brief   sb_ecore_event
310  *          timer handler called by Ecore.
311  *
312  * @param[in]   data                user data
313  * @return      call back setting
314  * @retval      ECORE_CALLBACK_RENEW    set callback
315  */
316 /*--------------------------------------------------------------------------*/
317 static Eina_Bool
318 sb_ecore_event(void *data)
319 {
320     if (sb_ws_connected) {
321         libwebsocket_service(sb_ws_context, 0);
322     }
323     else {
324         if (sb_ws_context != NULL) {
325             libwebsocket_context_destroy(sb_ws_context);
326         }
327         sb_ws_context
328                 = libwebsocket_create_context(CONTEXT_PORT_NO_LISTEN, NULL,
329                                               ws_protocols,
330                                               libwebsocket_internal_extensions,
331                                               NULL, NULL, -1, -1, 0);
332         if (sb_ws_context == NULL) {
333             uifw_trace("libwebsocket_create_context failed.");
334         }
335         else {
336             sb_wsi_mirror
337                     = libwebsocket_client_connect(sb_ws_context,
338                                                   ICO_SB_WS_ADDRESS,
339                                                   sb_ws_port, 0, "/",
340                                                   ICO_SB_WS_ADDRESS, NULL,
341                                                   ICO_SB_WS_PROTOCOL_NAME, -1);
342             if (sb_wsi_mirror != NULL) {
343                 sb_ws_connected = 1;
344             }
345         }
346     }
347     return ECORE_CALLBACK_RENEW;
348 }
349
350 /*--------------------------------------------------------------------------*/
351 /**
352  * @brief   sb_time_hour
353  *          show the clock's hour image on statubar
354  *
355  * @param[in]   tm                  time data
356  * @return      none
357  */
358 /*--------------------------------------------------------------------------*/
359 static void
360 sb_time_hour(struct tm *t_st)
361 {
362     char file[ICO_SB_BUF_SIZE];
363     if (t_st->tm_hour < 12) {
364         sprintf(file, "%s%s", sb_respath, sb_time_data[ICO_SB_TIME_AM].f_name);
365         evas_object_image_file_set(sb_ampm, file, NULL);
366         sprintf(file, "%s%s", sb_respath,
367                 sb_time_data[t_st->tm_hour / 10].f_name);
368         evas_object_image_file_set(sb_hour1, file, NULL);
369         sprintf(file, "%s%s", sb_respath,
370                 sb_time_data[t_st->tm_hour % 10].f_name);
371         evas_object_image_file_set(sb_hour2, file, NULL);
372     }
373     else {
374         sprintf(file, "%s%s", sb_respath, sb_time_data[ICO_SB_TIME_PM].f_name);
375         evas_object_image_file_set(sb_ampm, file, NULL);
376         sprintf(file, "%s%s", sb_respath, sb_time_data[(t_st->tm_hour - 12)
377                 / 10].f_name);
378         evas_object_image_file_set(sb_hour1, file, NULL);
379         sprintf(file, "%s%s", sb_respath, sb_time_data[(t_st->tm_hour - 12)
380                 % 10].f_name);
381         evas_object_image_file_set(sb_hour2, file, NULL);
382     }
383
384     /*Makes the given Evas object visible*/
385     evas_object_show(sb_ampm);
386     evas_object_show(sb_hour1);
387     evas_object_show(sb_hour2);
388 }
389
390 /*--------------------------------------------------------------------------*/
391 /**
392  * @brief   sb_time_hour
393  *          show the clock's minite image on statubar
394  *
395  * @param[in]   tm                  time data
396  * @return      none
397  */
398 /*--------------------------------------------------------------------------*/
399 static void
400 sb_time_min(struct tm *t_st)
401 {
402     char file[ICO_SB_BUF_SIZE];
403     sprintf(file, "%s%s", sb_respath, sb_time_data[t_st->tm_min / 10].f_name);
404     evas_object_image_file_set(sb_min1, file, NULL);
405     sprintf(file, "%s%s", sb_respath, sb_time_data[t_st->tm_min % 10].f_name);
406     evas_object_image_file_set(sb_min2, file, NULL);
407
408     /*Makes the given Evas object visible*/
409     evas_object_show(sb_min1);
410     evas_object_show(sb_min2);
411 }
412
413 /*--------------------------------------------------------------------------*/
414 /**
415  * @brief   sb_time_show
416  *          callback function called by Ecore.
417  *          get time data, and show the clock's image on statubar.
418  *
419  * @param[in]   thread_data         user data
420  * @return      call back setting
421  * @retval      ECORE_CALLBACK_RENEW    set callback
422  */
423 /*--------------------------------------------------------------------------*/
424 static Eina_Bool
425 sb_time_show(void *thread_data)
426 {
427     time_t timer;
428     struct tm *t_st, *old_t_st;
429
430     old_t_st = &sb_st_buf;
431
432     /* get time */
433     time(&timer);
434     t_st = localtime(&timer);
435
436     if (old_t_st->tm_hour != t_st->tm_hour) {
437         /* hour file set */
438         sb_time_hour(t_st);
439     }
440     if (old_t_st->tm_min != t_st->tm_min) {
441         /* min file set */
442         sb_time_min(t_st);
443     }
444     memcpy(old_t_st, t_st, sizeof(struct tm));
445
446     return ECORE_CALLBACK_RENEW;
447 }
448
449 /*--------------------------------------------------------------------------*/
450 /**
451  * @brief   sb_touch_up_shortcut
452  *          processing when application button touch up.
453  *
454  * @param[in]   data                user data
455  * @param[in]   evas                evas of the button
456  * @param[in]   obj                 evas object of the button
457  * @param[in]   event_info          evas event infomation
458  * @return      none
459  */
460 /*--------------------------------------------------------------------------*/
461 static void
462 sb_touch_up_shortcut(void *data, Evas *evas, Evas_Object *obj, void *event_info)
463 {
464     int n = 0;
465     unsigned char buf[LWS_SEND_BUFFER_PRE_PADDING + 512
466             + LWS_SEND_BUFFER_POST_PADDING];
467     unsigned char *p = &buf[LWS_SEND_BUFFER_PRE_PADDING];
468     char *appid = (char *)data;
469
470     if (sb_wait_reply == ICO_SB_NO_WAIT) {
471         if ((sb_wsi_mirror != NULL) && (appid != NULL)) {
472             n = sprintf((char *)p, "SHOW %s %s", appid, getenv("PKG_NAME"));
473             libwebsocket_write(sb_wsi_mirror, p, n,
474                                LWS_WRITE_CLIENT_IGNORE_XOR_MASK | LWS_WRITE_TEXT);
475             uifw_trace("SB: SHOW %s", appid);
476             sb_wait_reply = ICO_SB_WAIT_REPLY;
477         }
478         /* operation sound */
479         hs_snd_play(hs_snd_get_filename(ICO_HS_SND_TYPE_DEFAULT));
480     }
481 }
482
483 /*--------------------------------------------------------------------------*/
484 /**
485  * @brief   sb_touch_down_applist
486  *          processing when application button touch down.
487  *
488  * @param[in]   data                user data
489  * @param[in]   evas                evas of the button
490  * @param[in]   obj                 evas object of the button
491  * @param[in]   event_info          evas event infomation
492  * @return      none
493  */
494 /*--------------------------------------------------------------------------*/
495 static void
496 sb_touch_down_applist(void *data, Evas *evas, Evas_Object *obj, void *event_info)
497 {
498     char img[ICO_HS_TEMP_BUF_SIZE];
499     char path[ICO_HS_TEMP_BUF_SIZE];
500
501     hs_get_image_path(path, sizeof(path));
502     sprintf(img, "%s"ICO_SB_APPLIST_ONICON, path);
503
504     evas_object_image_file_set(obj, img, NULL);
505     evas_object_show(obj);
506 }
507
508 /*--------------------------------------------------------------------------*/
509 /**
510  * @brief   sb_touch_up_applist
511  *          processing when application button touch up.
512  *
513  * @param[in]   data                user data
514  * @param[in]   evas                evas of the button
515  * @param[in]   obj                 evas object of the button
516  * @param[in]   event_info          evas event infomation
517  * @return      none
518  */
519 /*--------------------------------------------------------------------------*/
520 static void
521 sb_touch_up_applist(void *data, Evas *evas, Evas_Object *obj, void *event_info)
522 {
523     int n = 0;
524     unsigned char buf[LWS_SEND_BUFFER_PRE_PADDING + 512
525             + LWS_SEND_BUFFER_POST_PADDING];
526     unsigned char *p = &buf[LWS_SEND_BUFFER_PRE_PADDING];
527     char path[ICO_HS_TEMP_BUF_SIZE];
528     char img[ICO_HS_TEMP_BUF_SIZE];
529
530     hs_get_image_path(path, sizeof(path));
531     sprintf(img, "%s"ICO_SB_APPLIST_OFFICON, path);
532
533     evas_object_image_file_set(obj, img, NULL);
534     evas_object_show(obj);
535
536     if (sb_wait_reply == ICO_SB_NO_WAIT) {
537         if (sb_wsi_mirror != NULL) {
538             hs_get_ons_edj_path(path, sizeof(path));
539             n = sprintf((char *)p, "OPEN %s%s %s", path,
540                     ICO_HS_ONS_APPLI_LIST_NAME, getenv("PKG_NAME"));
541             libwebsocket_write(sb_wsi_mirror, p, n,
542                                LWS_WRITE_CLIENT_IGNORE_XOR_MASK | LWS_WRITE_TEXT);
543             uifw_trace("SB: CLICK APPLIST");
544             sb_wait_reply = ICO_SB_WAIT_REPLY;
545         }
546     }
547 }
548
549 /*--------------------------------------------------------------------------*/
550 /**
551  * @brief   sb_touch_down_escathion
552  *          processing when escathion button touch down.
553  *
554  * @param[in]   data                user data
555  * @param[in]   evas                evas of the button
556  * @param[in]   obj                 evas object of the button
557  * @param[in]   event_info          evas event infomation
558  * @return      none
559  */
560 /*--------------------------------------------------------------------------*/
561 static void
562 sb_touch_down_escathion(void *data, Evas *evas, Evas_Object *obj, void *event_info)
563 {
564     char img[ICO_HS_TEMP_BUF_SIZE];
565     char path[ICO_HS_TEMP_BUF_SIZE];
566
567     hs_get_image_path(path, sizeof(path));
568     sprintf(img, "%s"ICO_SB_HOME_ONICON, path);
569
570     evas_object_image_file_set(obj, img, NULL);
571     evas_object_show(obj);
572 }
573
574 /*--------------------------------------------------------------------------*/
575 /**
576  * @brief   sb_touch_up_escathion
577  *          processing when change button touch up.
578  *
579  * @param[in]   data                user data
580  * @param[in]   evas                evas of the button
581  * @param[in]   obj                 evas object of the button
582  * @param[in]   event_info          evas event infomation
583  * @return      none
584  */
585 /*--------------------------------------------------------------------------*/
586 static void
587 sb_touch_up_escathion(void *data, Evas *evas, Evas_Object *obj, void *event_info)
588 {
589     int n = 0;
590     unsigned char buf[LWS_SEND_BUFFER_PRE_PADDING + 512
591             + LWS_SEND_BUFFER_POST_PADDING];
592     unsigned char *p = &buf[LWS_SEND_BUFFER_PRE_PADDING];
593     char path[ICO_HS_TEMP_BUF_SIZE];
594     char img[ICO_HS_TEMP_BUF_SIZE];
595
596     hs_get_image_path(path, sizeof(path));
597     sprintf(img, "%s"ICO_SB_HOME_OFFICON, path);
598
599     evas_object_image_file_set(obj, img, NULL);
600     evas_object_show(obj);
601
602     if (sb_wait_reply == ICO_SB_NO_WAIT) {
603         if (sb_wsi_mirror != NULL) {
604             n = sprintf((char *)p, "%s", "CLICK ESCUTCHEON 1");
605             libwebsocket_write(sb_wsi_mirror, p, n,
606                                LWS_WRITE_CLIENT_IGNORE_XOR_MASK | LWS_WRITE_TEXT);
607             uifw_trace("SB: CLICK ESCUTCHEON 1");
608             sb_wait_reply = ICO_SB_WAIT_REPLY;
609         }
610     }
611 }
612
613 /*--------------------------------------------------------------------------*/
614 /**
615  * @brief   sb_clock_display_fixation
616  *          set up fixed images on status bar
617  *
618  * @param[in]   canvas              evas to draw
619  * @return      none
620  */
621 /*--------------------------------------------------------------------------*/
622 static void
623 sb_clock_display_fixation(Evas *canvas)
624 {
625     Evas_Object *tile, *colon;
626     int moveH;
627     int escPosX;
628     char file[ICO_SB_BUF_SIZE];
629     char img[ICO_HS_TEMP_BUF_SIZE];
630     char path[ICO_HS_TEMP_BUF_SIZE];
631
632     moveH = sb_width - ICO_HS_SIZE_LAYOUT_WIDTH;
633     escPosX = sb_width / 2 - ICO_HS_SIZE_SB_HEIGHT / 2;
634
635     /* show escutcheon */
636     hs_get_image_path(path, sizeof(path));
637     sprintf(img, "%s"ICO_SB_HOME_OFFICON, path);
638     tile = evas_object_image_filled_add(canvas);
639     evas_object_image_file_set(tile, img, NULL);
640     evas_object_move(tile, escPosX, ICO_SB_POS_Y);
641     evas_object_resize(tile, ICO_HS_SIZE_SB_HEIGHT, ICO_HS_SIZE_SB_HEIGHT);
642     evas_object_event_callback_add(tile, EVAS_CALLBACK_MOUSE_UP,
643                                   sb_touch_up_escathion, NULL);
644     evas_object_event_callback_add(tile, EVAS_CALLBACK_MOUSE_DOWN,
645                                   sb_touch_down_escathion, NULL);
646     evas_object_show(tile);
647
648     /* show app list */
649     hs_get_image_path(path, sizeof(path));
650     sprintf(img, "%s"ICO_SB_APPLIST_OFFICON, path);
651     tile = evas_object_image_filled_add(canvas);
652     evas_object_image_file_set(tile, img, NULL);
653     evas_object_move(tile, ICO_SB_POS_LIST_X, ICO_SB_POS_Y);
654     evas_object_resize(tile, ICO_HS_SIZE_SB_HEIGHT * 3 / 2, ICO_HS_SIZE_SB_HEIGHT);
655     evas_object_event_callback_add(tile, EVAS_CALLBACK_MOUSE_UP,
656                                   sb_touch_up_applist, NULL);
657     evas_object_event_callback_add(tile, EVAS_CALLBACK_MOUSE_DOWN,
658                                   sb_touch_down_applist, NULL);
659     evas_object_show(tile);
660
661     /* shortcut bottun */
662     sb_add_shortcut(canvas);
663
664     /* show clock's colon */
665     /*Creates a new image object*/
666     colon = evas_object_image_filled_add(canvas);
667     /*Set the image file */
668     sprintf(file, "%s%s", sb_respath, fname_colon);
669     evas_object_image_file_set(colon, file, NULL);
670     /*This function will make layout change*/
671     evas_object_move(colon, moveH + ICO_SB_POS_COLON_X, ICO_SB_POS_COLON_Y);
672     /*This function will make size change of a picture*/
673     evas_object_resize(colon, ICO_SB_SIZE_COLON_W, ICO_SB_SIZE_COLON_H);
674     /*Makes the given Evas object visible*/
675     evas_object_show(colon);
676
677     return;
678 }
679
680 /*--------------------------------------------------------------------------*/
681 /**
682  * @brief   sb_add_shortcut
683  *          add shurtcut bottun
684  *
685  * @param[in]   canvas              evas to draw
686  * @return      none
687  */
688 /*--------------------------------------------------------------------------*/
689 static void
690 sb_add_shortcut(Evas *canvas)
691 {
692     Evas_Object *tile;
693     int escPosX;
694     int x, idx;
695     char config[ICO_UXF_MAX_PROCESS_NAME];
696     const char *appid;
697     const Ico_Uxf_conf_application *appconf;
698     Eina_List *l, *l_next;
699
700     escPosX = sb_width / 2 - ICO_HS_SIZE_SB_HEIGHT / 2;
701
702     /* delete shortcut */
703     EINA_LIST_FOREACH_SAFE(sb_shtct_list, l, l_next, tile) {
704         evas_object_del(tile);
705         sb_shtct_list = eina_list_remove_list(sb_shtct_list, l);
706     }
707
708     /* add shortcut */
709     for (idx = 0; idx < ICO_SB_CHTCT_MAX; idx++) {
710         sprintf(config, ICO_SB_CONFIG_SHTCT_APP"%d", idx);
711         x = ICO_SB_POS_SHTCT1_X + (ICO_SB_SIZE_SHTCT_W + ICO_HS_SIZE_SB_HEIGHT * 1 / 2) * idx;
712         if (x > escPosX) {
713             break;
714         }
715         appid = hs_conf_get_string(ICO_HS_CONFIG_STATUBAR, config, NULL);
716         if ((appid != NULL) && (strcmp(appid, "none") != 0)) {
717             appconf = ico_uxf_getAppByAppid(appid);
718             if (appid) {
719                 tile = evas_object_image_filled_add(canvas);
720                 evas_object_image_file_set(tile,
721                         appconf->icon_key_name, NULL);
722                 evas_object_move(tile, x, ICO_SB_POS_Y);
723                 evas_object_resize(tile, ICO_HS_SIZE_SB_HEIGHT, ICO_HS_SIZE_SB_HEIGHT);
724                 evas_object_event_callback_add(tile, EVAS_CALLBACK_MOUSE_UP,
725                                    sb_touch_up_shortcut, appid);
726                 evas_object_show(tile);
727                 sb_shtct_list = eina_list_append(sb_shtct_list, tile);
728             }
729         }
730     }
731
732     return;
733 }
734
735 /*--------------------------------------------------------------------------*/
736 /**
737  * @brief   sb_config_event
738  *          This is a callback function called when the configurations
739  *          is updata.
740  *
741  * @param[in]   appid               application id
742  * @param[in]   type                event type(install/uninstall)
743  * @return      none
744  */
745 /*--------------------------------------------------------------------------*/
746 static void
747 sb_config_event(const char *appid, int type)
748 {
749     uifw_trace("sb_config_event: Enter(appid=%s, type=%d)", appid, type);
750
751     sb_add_shortcut(sb_canvas);
752
753     uifw_trace("sb_config_event: Leave");
754
755     return;
756 }
757
758 /*--------------------------------------------------------------------------*/
759 /*
760  * @brief   status bar application
761  *          main routine
762  *
763  * @param   main() finction's standard parameter (argc,argv)
764  * @return  result
765  * @retval  0       success
766  * @retval  1       failed
767  */
768 /*--------------------------------------------------------------------------*/
769 int
770 main(int argc, char *argv[])
771 {
772     time_t timer;
773     struct tm *t_st;
774     Evas_Object *bg;
775     char file[ICO_SB_BUF_SIZE];
776     int width, height;
777     int moveH = 0;
778     int orientation = ICO_SB_HORIZONTAL;
779     int ii;
780     int ret;
781     static Ecore_Evas *ee;
782
783     /* configure */
784     hs_get_image_path(sb_respath, ICO_SB_BUF_SIZE);
785
786     /* configure */
787     if (getenv("PKG_NAME")) {
788         ico_uxf_log_open(getenv("PKG_NAME"));
789     }
790     else {
791         ico_uxf_log_open(ICO_HS_APPID_DEFAULT_SB);
792
793     }
794
795     /* get argment */
796     for (ii = 1; ii < argc; ii++) {
797         if (argv[ii][0] != '-')
798             continue;
799         if (strncasecmp(argv[ii], "-orientaion=", strlen("-orientaion=")) == 0) {
800             if (strcmp(&argv[ii][strlen("-orientaion=")], "vertical") == 0) {
801                 orientation = ICO_SB_VERTICAL;
802             }
803             else if (strcmp(&argv[ii][strlen("-orientaion=")], "horizontal")
804                     == 0) {
805                 orientation = ICO_SB_HORIZONTAL;
806             }
807         }
808     }
809
810     /* load configuration */
811     ret = initHomeScreenConfig(ICO_STATUSBAR_CONFIG_FILE);
812     if (ret == ICO_HS_OK) {
813         sb_ws_port = hs_conf_get_integer(ICO_HS_CONFIG_STATUBAR,
814                                          ICO_HS_CONFIG_WS_PORT,
815                                          ICO_HS_WS_PORT);
816         orientation = hs_conf_get_integer(ICO_HS_CONFIG_STATUBAR,
817                                           ICO_HS_CONFIG_ORIENTAION,
818                                           orientation);
819     }
820     hs_snd_init();
821
822     /* Initialize a new system of Ecore_Evas */
823     ecore_evas_init();
824
825     /* Generate Ecore_Evas */
826     ee = ecore_evas_new(NULL, 0, 0, 1, 1, "frame=0");
827     if (!ee)
828         goto error;
829
830     ecore_main_loop_iterate();
831     ecore_wl_screen_size_get(&width, &height);
832
833     if (orientation == ICO_SB_VERTICAL) {
834         sb_width = width > height ? height : width;
835         moveH = sb_width - ICO_HS_SIZE_LAYOUT_WIDTH;
836     }
837     else {
838         sb_width = width < height ? height : width;
839         moveH = sb_width - ICO_HS_SIZE_LAYOUT_WIDTH;
840     }
841
842     /* Set the window size of the maximum and minimum */
843     ecore_evas_size_min_set(ee, sb_width, ICO_HS_SIZE_SB_HEIGHT);
844     ecore_evas_size_max_set(ee, sb_width, ICO_HS_SIZE_SB_HEIGHT);
845
846     /* Set a callback for Ecore_Evas delete request events */
847     ecore_evas_callback_delete_request_set(ee, sb_on_destroy);
848
849     /* Set the title of an Ecore_Evas window */
850     /* ecore_evas_title_set(ee, "Ecore_Evas buffer (image) example"); */
851
852     ecore_evas_move(ee, 0, 0);
853     ecore_evas_resize(ee, sb_width, ICO_HS_SIZE_SB_HEIGHT);
854     ecore_evas_show(ee);
855
856     /* Wrapper of Evas */
857     sb_canvas = ecore_evas_get(ee);
858
859     /* BG color set */
860     bg = evas_object_rectangle_add(sb_canvas);
861     evas_object_color_set(bg, 0, 0, 0, 255);
862     evas_object_move(bg, 0, 0);
863     evas_object_resize(bg, sb_width, ICO_HS_SIZE_SB_HEIGHT);
864     evas_object_show(bg);
865
866     /* Call the function */
867     sb_clock_display_fixation(sb_canvas);
868
869     /* ... */
870     sb_ampm = evas_object_image_filled_add(sb_canvas);
871     sb_hour1 = evas_object_image_filled_add(sb_canvas);
872     sb_hour2 = evas_object_image_filled_add(sb_canvas);
873     sb_min1 = evas_object_image_filled_add(sb_canvas);
874     sb_min2 = evas_object_image_filled_add(sb_canvas);
875
876     /* This function will make layout change */
877     evas_object_move(sb_ampm, moveH + ICO_SB_POS_AMPM_X, ICO_SB_POS_AMPM_Y);
878     evas_object_move(sb_hour1, moveH + ICO_SB_POS_HOUR1_X, ICO_SB_POS_HOUR1_Y);
879     evas_object_move(sb_hour2, moveH + ICO_SB_POS_HOUR2_X, ICO_SB_POS_HOUR2_Y);
880
881     /* This function will make size change of picture */
882     evas_object_resize(sb_ampm, ICO_SB_SIZE_AMPM_W, ICO_SB_SIZE_AMPM_H);
883     evas_object_resize(sb_hour1, ICO_SB_SIZE_NUM_W, ICO_SB_SIZE_NUM_H);
884     evas_object_resize(sb_hour2, ICO_SB_SIZE_NUM_W, ICO_SB_SIZE_NUM_H);
885
886     /* Makes the given Evas object visible */
887     evas_object_show(sb_ampm);
888     evas_object_show(sb_hour1);
889     evas_object_show(sb_hour2);
890
891     /* Change default layout of Evas object */
892     evas_object_move(sb_min1, moveH + ICO_SB_POS_MIN1_X, ICO_SB_POS_MIN1_Y);
893     evas_object_move(sb_min2, moveH + ICO_SB_POS_MIN2_X, ICO_SB_POS_MIN2_Y);
894
895     /* Change default size of Evas object */
896     evas_object_resize(sb_min1, ICO_SB_SIZE_NUM_W, ICO_SB_SIZE_NUM_H);
897     evas_object_resize(sb_min2, ICO_SB_SIZE_NUM_W, ICO_SB_SIZE_NUM_H);
898
899     /* Makes the given Evas object visible */
900     evas_object_show(sb_min1);
901     evas_object_show(sb_min2);
902
903     time(&timer);
904     t_st = localtime(&timer);
905     sb_time_hour(t_st);
906     sb_time_min(t_st);
907
908     /* Set the image file */
909     for (ii = 0; ii < ICO_SB_TIME_IMG_PARTS; ii++) {
910         sb_time_data[ii].time_img = evas_object_image_filled_add(sb_canvas);
911         sprintf(file, "%s%s", sb_respath, sb_time_data[ii].f_name);
912         evas_object_image_file_set(sb_time_data[ii].time_img, file, NULL);
913     }
914     ecore_timer_add(ICO_SB_TIMEOUT, sb_time_show, NULL);
915
916     /* Init websockets */
917     sb_create_ws_context();
918     ecore_timer_add(ICO_SB_WS_TIMEOUT, sb_ecore_event, NULL);
919
920     /* add callback to app configuration */
921     ico_uxf_econf_setAppUpdateCb(sb_config_event);
922
923     /* Runs the application main loop */
924     ecore_main_loop_begin();
925     /* Free an Ecore_Evas */
926     ecore_evas_free(ee);
927     /* Shut down the Ecore_Evas system */
928     ecore_evas_shutdown();
929     return 0;
930
931 error:
932     uifw_warn("status_bar: error use ecore")
933     ecore_evas_shutdown();
934     return -1;
935 }
936