2 * Copyright (c) 2009-2015 Samsung Electronics Co., Ltd All Rights Reserved
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
8 * http://www.apache.org/licenses/LICENSE-2.0
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.
22 #include "animation.h"
25 static struct animation {
28 Evas_Object *display_block;
35 .display_block = NULL,
41 static void __visibility_changed_cb(void *data, Evas_Object *obj, void *event)
43 __D("Visibility changed");
44 int visibility = (int)(void *)event;
51 static void __win_del_cb(void *data, Evas_Object * obj, void *event_info)
53 __D("Window delete event received");
57 static Evas_Object *__create_window(void)
63 win = elm_win_add(NULL, "BOOT_ANIMATION", ELM_WIN_NOTIFICATION);
65 __E("Failed to create a new window");
68 elm_win_role_set(win, "alert");
69 efl_util_set_notification_window_level(win, EFL_UTIL_NOTIFICATION_LEVEL_TOP);
70 evas_object_smart_callback_add(s_animation.win, "visibility,changed", __visibility_changed_cb, NULL);
71 elm_win_aux_hint_add(win, "wm.comp.win.always.selective.mode", "0");
72 evas_object_smart_callback_add(win, "delete-request", __win_del_cb, NULL);
74 elm_win_screen_size_get(win, NULL, NULL, &s_animation.win_w, &s_animation.win_h);
75 elm_win_borderless_set(win, EINA_TRUE);
76 elm_win_indicator_mode_set(win, ELM_WIN_INDICATOR_HIDE);
77 evas_object_move(win, 0, 0);
78 evas_object_show(win);
83 static void __block_display(void)
85 Evas_Object *display_block = NULL;
86 display_block = evas_object_rectangle_add(evas_object_evas_get(s_animation.win));
87 elm_win_resize_object_add(s_animation.win, display_block);
88 evas_object_color_set(display_block, 0, 0, 0, 255);
89 evas_object_show(display_block);
91 s_animation.display_block = display_block;
94 static Eina_Bool __end_cb(void *data)
96 int type = (int) data;
98 if (type == TYPE_OFF) {
99 __D("EXIT on SHUTDOWN");
100 /* Delete Previous Layout */
101 if (s_animation.layout) {
102 evas_object_del(s_animation.layout);
103 s_animation.layout = NULL;
106 /* boot-animation do not terminate on shutdown, so flush log now */
112 __D("EXIT on BOOTING");
115 return ECORE_CALLBACK_CANCEL;
118 static void __animation_finished_cb(void *d, Evas_Object * obj, const char *e, const char *s)
120 if (s_animation.animation_type == TYPE_OFF) {
122 ecore_timer_add(1, __end_cb, (void *)TYPE_OFF);
125 efl_util_set_notification_window_level(s_animation.win, EFL_UTIL_NOTIFICATION_LEVEL_NONE);
126 ecore_timer_add(10, __end_cb, (void *)TYPE_ON);
129 if (vconf_set_int(VCONFKEY_BOOT_ANIMATION_FINISHED, 1) != 0)
130 __E("Failed to set finished set");
133 static Evas_Object * __create_layout(Evas_Object *win, const char *file_name)
135 Evas_Object *layout = elm_layout_add(win);
137 __E("Failed to create layout");
140 evas_object_size_hint_weight_set(layout, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
141 elm_win_resize_object_add(s_animation.win, layout);
142 elm_layout_signal_callback_add(layout, "end", "animation", __animation_finished_cb, NULL);
144 if (!elm_layout_file_set(layout, file_name, GRP_ANIM)) {
145 __E("Failed to layout file set");
149 evas_object_show(layout);
154 static void __destroy_layout(void)
156 if (s_animation.display_block) {
157 evas_object_del(s_animation.display_block);
158 s_animation.display_block = NULL;
161 if (s_animation.layout) {
162 evas_object_del(s_animation.layout);
163 s_animation.layout = NULL;
167 static char * __get_layout_file_name(int animation_type, int w, int h)
169 char file_name[1024];
172 if (animation_type == TYPE_OFF)
173 snprintf(file_name, sizeof(file_name), FILE_PATH"%dx%d_PowerOff.edj", w, h);
175 snprintf(file_name, sizeof(file_name), FILE_PATH"%dx%d_PowerOn.edj", w, h);
177 __D("File name for Animation is: %s", file_name);
179 ret = access(file_name, 0);
181 __E("There's no Image same with [%s], So set Default[720x1280] image", file_name);
182 if (animation_type == TYPE_OFF)
183 snprintf(file_name, sizeof(file_name), "%s", DEFAULT_OFF);
185 snprintf(file_name, sizeof(file_name), "%s", DEFAULT_ON);
187 ret = access(file_name, 0);
189 __E("There's no Image file[%s] on target", file_name);
194 return strdup(file_name);
197 static Eina_Bool __is_layout_file_exist(const char *file_name)
201 ret = access(file_name, 0);
208 int animation_init(int animation_type)
210 __D("Init animation");
212 s_animation.animation_type = animation_type;
214 s_animation.win = __create_window();
215 if (!s_animation.win) {
216 __E("Failed to create a new window");
220 char *layout_file_name = NULL;
221 layout_file_name = __get_layout_file_name(animation_type, s_animation.win_w, s_animation.win_h);
222 if (!layout_file_name) {
223 __E("Failed to get layout file name");
227 if (!__is_layout_file_exist(layout_file_name)) {
228 __E("This file is not exist");
229 free(layout_file_name);
233 s_animation.layout = __create_layout(s_animation.win, layout_file_name);
234 if (!s_animation.layout) {
235 __E("Failed to create layout");
236 free(layout_file_name);
237 evas_object_del(s_animation.win);
241 free(layout_file_name);
246 int animation_fini(void)
250 evas_object_del(s_animation.win);
258 Evas_Object *__t__get_window(void)
260 return s_animation.win;
263 Evas_Object *__t__get_layout(void)
265 return s_animation.layout;
268 Evas_Object *__t__get_display_block(void)
270 return s_animation.display_block;
273 Evas_Object * __t__animation_create_layout(Evas_Object *win, const char *file_name)
275 return __create_layout(win, file_name);
278 Evas_Object *__t__animation_create_window(void)
280 return __create_window();
283 char * __t__get_layout_file_name(int animation_type, int w, int h)
285 return __get_layout_file_name(animation_type, w, h);
288 Eina_Bool __t__is_layout_file_exist(const char *file_name)
290 return __is_layout_file_exist(file_name);