33bfa27b1c3faf1003365d4fb582abf94311e630
[apps/native/boot-animation.git] / src / animation.c
1 /*
2  * Copyright (c) 2009-2015 Samsung Electronics Co., Ltd All Rights Reserved
3  *
4  * Licensed under the Apache License, Version 2.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.apache.org/licenses/LICENSE-2.0
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 <stdio.h>
19 #include <stdlib.h>
20 #include <string.h>
21 #include <errno.h>
22 #include <fcntl.h>
23 #include <sys/types.h>
24 #include <sys/stat.h>
25 #include <sys/wait.h>
26 #include <sys/time.h>
27 #include <unistd.h>
28 #include <dirent.h>
29
30 #include <vconf.h>
31
32 #include <Elementary.h>
33
34 #include <boot.h>
35 #include <animation.h>
36
37 #include "log.h"
38
39 #define OVER_COUNT 19
40
41 static struct animation {
42         Evas_Object *win;
43         Evas_Coord w;
44         Evas_Coord h;
45         int t;
46         Evas *evas;
47         Ecore_Evas *ee;
48         Evas_Object *layout;
49         int state;
50         Evas_Object *txt;
51 } s_animation = {
52         .txt = NULL,};
53
54 static void win_del(void *data, Evas_Object * obj, void *event_info)
55 {
56         _D("Window delete event received");
57         elm_exit();
58 }
59
60 static Eina_Bool _end_cb(void *data)
61 {
62         _D("_end_cb is invoked");
63         printf("_end_cb is invoked\n");
64         if (vconf_set_int(VCONFKEY_BOOT_ANIMATION_FINISHED, 1) != 0)
65                 _E("Failed to set finished set");
66         elm_exit();
67         return ECORE_CALLBACK_CANCEL;
68 }
69
70 static void _edje_cb(void *d, Evas_Object * obj, const char *e, const char *s)
71 {
72         _D("edje callback is invoked");
73
74         if (s_animation.state == TYPE_OFF || s_animation.state == TYPE_OFF_WITH_MSG) {
75                 _D("TYPE OFF");
76                 if (vconf_set_int(VCONFKEY_BOOT_ANIMATION_FINISHED, 1) != 0)
77                         _E("Failed to set finished set");
78                 if (s_animation.txt) {
79                         Evas_Coord w;
80                         Evas_Coord h;
81
82                         evas_object_size_hint_weight_set(s_animation.txt,
83                                                          EVAS_HINT_EXPAND,
84                                                          EVAS_HINT_EXPAND);
85                         evas_object_size_hint_fill_set(s_animation.txt,
86                                                        EVAS_HINT_FILL,
87                                                        EVAS_HINT_FILL);
88                         evas_object_resize(s_animation.txt, s_animation.w,
89                                            s_animation.h);
90                         evas_object_color_set(s_animation.txt, 255, 255, 255,
91                                               255);
92                         evas_object_text_font_set(s_animation.txt,
93                                                   "SLP:style=medium", 30);
94                         evas_object_geometry_get(s_animation.txt, NULL, NULL,
95                                                  &w, &h);
96                         evas_object_move(s_animation.txt,
97                                          (s_animation.w - w) >> 1,
98                                          (s_animation.h - h) >> 1);
99                         evas_object_show(s_animation.txt);
100                 }
101                 ecore_timer_add(1, _end_cb, NULL);
102         } else
103                 _D("TYPE_ON");
104                 _end_cb(NULL);
105 }
106
107 #define DEFAULT_W 480
108 static void layout_file_set(int state)
109 {
110         _D("Layout file set according to resolution");
111         _D("Screen Width: %d, DEFAULT_WIDTH: %d", s_animation.w, DEFAULT_W);
112
113         switch(s_animation.w)
114         {
115                 case 360:
116                         _D("Resolution is %dx%d", s_animation.w, s_animation.h);
117                         if (state == TYPE_ON) {
118                                 elm_layout_file_set(s_animation.layout, WEARABLE_POWER_ON, GRP_ON);
119                         } else {
120                                 elm_layout_file_set(s_animation.layout, WEARABLE_POWER_OFF, GRP_OFF);
121                         }
122                         break;
123                 case 480:
124                         _D("Resolution is %dx%d", s_animation.w, s_animation.h);
125                         if (state == TYPE_ON) {
126                                 elm_layout_file_set(s_animation.layout, WVGA_POWER_ON, GRP_ON);
127                         } else {
128                                 elm_layout_file_set(s_animation.layout, WVGA_POWER_OFF, GRP_OFF);
129                         }
130                         break;
131                 case 720:
132                         _D("Resolution is %dx%d", s_animation.w, s_animation.h);
133                         if (state == TYPE_ON) {
134                                 elm_layout_file_set(s_animation.layout, HD_POWER_ON, GRP_ON);
135                         } else {
136                                 elm_layout_file_set(s_animation.layout, HD_POWER_OFF, GRP_OFF);
137                         }
138                         break;
139                 default:
140                         _D("This is Strange resolution, Plz check, %dx%d", s_animation.w, s_animation.h);
141                         if (state == TYPE_ON) {
142                                 elm_layout_file_set(s_animation.layout, HD_POWER_ON, GRP_ON);
143                         } else {
144                                 elm_layout_file_set(s_animation.layout, HD_POWER_ON, GRP_OFF);
145                         }
146                         break;
147         }
148 }
149
150 static int init_layout(const char *msg)
151 {
152         s_animation.layout = elm_layout_add(s_animation.win);
153         if (!s_animation.layout) {
154                 _E("Failed to create layout");
155                 return EXIT_FAILURE;
156         }
157
158         layout_file_set(s_animation.state);
159
160         evas_object_size_hint_weight_set(s_animation.layout, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
161         _D("[Boot-ani] Start animation: %d mode", s_animation.state);
162         elm_win_resize_object_add(s_animation.win, s_animation.layout);
163         edje_object_signal_callback_add(elm_layout_edje_get(s_animation.layout), "end", "animation", _edje_cb, NULL);
164         evas_object_show(s_animation.layout);
165
166         if (msg) {
167                 if (!s_animation.txt) {
168                         s_animation.txt = evas_object_text_add(s_animation.evas);
169                         if (!s_animation.txt) {
170                                 _E("Failed to add text");
171                                 evas_object_del(s_animation.layout);
172                                 return EXIT_FAILURE;
173                         }
174                 }
175
176                 evas_object_text_text_set(s_animation.txt, msg);
177                 evas_object_hide(s_animation.txt);
178         }
179
180         return EXIT_SUCCESS;
181 }
182
183 static void fini_layout(void)
184 {
185         if (s_animation.layout) {
186                 evas_object_del(s_animation.layout);
187         }
188
189         if (s_animation.txt) {
190                 evas_object_del(s_animation.txt);
191                 s_animation.txt = NULL;
192         }
193 }
194
195 static int create_window(void)
196 {
197         _D("Create Window");
198         printf("Create Window\n");
199
200         int x, y = 0;
201
202         s_animation.win = elm_win_add(NULL, "BOOT_ANIMATION", ELM_WIN_NOTIFICATION);
203         elm_win_role_set(s_animation.win, "alert");
204         if (!s_animation.win) {
205                 _E("Failed to create a new window");
206                 printf("Failed to create a new window\n");
207                 return EXIT_FAILURE;
208         }
209         if (s_animation.state == TYPE_OFF || s_animation.state == TYPE_OFF_WITH_MSG) {
210                 _D("We are turning off the Tizen");
211                 elm_win_alpha_set(s_animation.win, EINA_TRUE);
212         }
213         evas_object_smart_callback_add(s_animation.win, "delete-request", win_del, NULL);
214
215         s_animation.evas = evas_object_evas_get(s_animation.win);
216         if (!s_animation.evas) {
217                 evas_object_del(s_animation.win);
218                 _E("Failed to get the evas object");
219                 return EXIT_FAILURE;
220         }
221         elm_win_screen_size_get(s_animation.win, &x, &y, &s_animation.w, &s_animation.h);
222         _D("Window size is x: %d, y: %d, w: %d, h: %d", x, y, s_animation.w, s_animation.h);
223         elm_win_borderless_set(s_animation.win, 1);
224         elm_win_indicator_mode_set(s_animation.win, ELM_WIN_INDICATOR_HIDE);
225         evas_object_move(s_animation.win, 0, 0);
226
227 /*      if (s_animation.w > s_animation.h) {
228                 int t;
229                 elm_win_rotation_with_resize_set(s_animation.win, 90);
230                 t = s_animation.w;
231                 s_animation.w = s_animation.h;
232                 s_animation.h = t;
233         }*/
234
235         evas_object_show(s_animation.win);
236
237         s_animation.ee = ecore_evas_ecore_evas_get(s_animation.evas);
238         if (!s_animation.ee) {
239                 evas_object_del(s_animation.win);
240                 _E("Failed to get the ecore evas object");
241                 return EXIT_FAILURE;
242         }
243
244         return EXIT_SUCCESS;
245 }
246
247 int init_animation(int state, const char *msg)
248 {
249         _D("Init animation");
250         printf("Init animation\n");
251
252         Ecore_Timer *timer = NULL;
253
254         s_animation.state = state;
255
256         if (create_window() == EXIT_FAILURE) {
257                 _E("Failed to create a new window");
258                 printf("Failed to create a new window\n");
259                 return EXIT_FAILURE;
260         }
261
262         if (init_layout(msg) == EXIT_FAILURE) {
263                 _E("Failed to init the layout object");
264                 if (msg) {
265                         evas_object_del(s_animation.txt);
266                 }
267                 evas_object_del(s_animation.win);
268         }
269
270         return EXIT_SUCCESS;
271 }
272
273 int fini_animation(void)
274 {
275         fini_layout();
276         evas_object_del(s_animation.win);
277         fflush(stdout);
278         close(1);
279         return EXIT_SUCCESS;
280 }