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.
23 #include <sys/types.h>
34 #include "animation.h"
39 static struct animation {
43 Evas_Object *display_block;
52 .display_block = NULL,
59 static void win_del(void *data, Evas_Object * obj, void *event_info)
61 __D("Window delete event received");
65 static void __block_display(void)
67 Evas_Object *display_block = NULL;
68 display_block = evas_object_rectangle_add(evas_object_evas_get(s_animation.win));
69 elm_win_resize_object_add(s_animation.win, display_block);
70 evas_object_color_set(display_block, 0, 0, 0, 255);
71 evas_object_show(display_block);
73 s_animation.display_block = display_block;
76 static Eina_Bool __end_cb(void *data)
78 int type = (int) data;
80 if (type == TYPE_OFF) {
81 __D("EXIT on SHUTDOWN");
82 /* Delete Previous Layout */
83 if (s_animation.layout) {
84 evas_object_del(s_animation.layout);
85 s_animation.layout = NULL;
88 /* boot-animation do not terminate on shutdown, so flush log now */
94 __D("EXIT on BOOTING");
95 if (vconf_set_int(VCONFKEY_BOOT_ANIMATION_FINISHED, 1) != 0) {
96 __E("Failed to set finished set");
100 return ECORE_CALLBACK_CANCEL;
103 static void __animation_finished_cb(void *d, Evas_Object * obj, const char *e, const char *s)
105 if (s_animation.state == TYPE_OFF) {
107 if (vconf_set_int(VCONFKEY_BOOT_ANIMATION_FINISHED, 1) != 0) {
108 __E("Failed to set finished set");
110 ecore_timer_add(1, __end_cb, (void *)TYPE_OFF);
113 __end_cb((void *)TYPE_ON);
117 static void __fini_layout(void)
119 if (s_animation.display_block) {
120 evas_object_del(s_animation.display_block);
121 s_animation.display_block = NULL;
124 if (s_animation.layout) {
125 evas_object_del(s_animation.layout);
126 s_animation.layout = NULL;
129 if (s_animation.txt) {
130 evas_object_del(s_animation.txt);
131 s_animation.txt = NULL;
135 Evas_Object *create_window(void)
137 __D("Create Window");
141 win = elm_win_add(NULL, "BOOT_ANIMATION", ELM_WIN_NOTIFICATION);
143 __E("Failed to create a new window");
146 elm_win_aux_hint_add(win, "wm.comp.win.always.selective.mode", "1");
147 elm_win_role_set(win, "alert");
148 efl_util_set_notification_window_level(win, EFL_UTIL_NOTIFICATION_LEVEL_HIGH);
149 evas_object_smart_callback_add(win, "delete-request", win_del, NULL);
151 elm_win_screen_size_get(win, NULL, NULL, &s_animation.w, &s_animation.h);
152 elm_win_borderless_set(win, EINA_TRUE);
153 elm_win_indicator_mode_set(win, ELM_WIN_INDICATOR_HIDE);
154 evas_object_move(win, 0, 0);
155 evas_object_show(win);
160 char *get_layout_file_name(int state, int w, int h)
162 char file_name[1024];
165 if (state == TYPE_OFF) {
166 snprintf(file_name, sizeof(file_name), FILE_PATH"%dx%d_PowerOff.edj", w, h);
168 snprintf(file_name, sizeof(file_name), FILE_PATH"%dx%d_PowerOn.edj", w, h);
170 __D("File name for Animation is: %s", file_name);
172 ret = access(file_name, 0);
175 __E("There's no Image same with [%s], So set Default[720x1280] image", file_name);
176 if (state == TYPE_OFF) {
177 snprintf(file_name, sizeof(file_name), "%s", DEFAULT_OFF);
179 snprintf(file_name, sizeof(file_name), "%s", DEFAULT_ON);
182 ret = access(file_name, 0);
184 __E("There's no Image file[%s] on target", file_name);
189 return strdup(file_name);
192 Eina_Bool is_layout_file_exist(const char *file_name)
196 ret = access(file_name, 0);
204 Evas_Object *create_layout(Evas_Object *win, const char *file_name)
206 Evas_Object *layout = elm_layout_add(win);
208 __E("Failed to create layout");
211 evas_object_size_hint_weight_set(layout, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
212 elm_win_resize_object_add(s_animation.win, layout);
213 elm_layout_signal_callback_add(layout, "end", "animation", __animation_finished_cb, NULL);
215 if (!elm_layout_file_set(layout, file_name, GRP_ANIM)) {
216 __E("Failed to layout file set");
220 evas_object_show(layout);
225 int init_animation(int state)
227 __D("Init animation");
229 s_animation.state = state;
231 s_animation.win = create_window();
232 if (!s_animation.win) {
233 __E("Failed to create a new window");
237 char *layout_file_name = NULL;
238 layout_file_name = get_layout_file_name(state, s_animation.w, s_animation.h);
239 if (!layout_file_name) {
240 __E("Failed to get layout file name");
244 if (!is_layout_file_exist(layout_file_name)) {
245 __E("This file is not exist");
246 free(layout_file_name);
250 s_animation.layout = create_layout(s_animation.win, layout_file_name);
251 if (!s_animation.layout) {
252 __E("Failed to create layout");
253 free(layout_file_name);
254 evas_object_del(s_animation.win);
258 free(layout_file_name);
263 int fini_animation(void)
266 evas_object_del(s_animation.win);
274 Evas_Object *__t__get_window(void)
276 return s_animation.win;
279 Evas_Object *__t__get_layout(void)
281 return s_animation.layout;
284 Evas_Object *__t__get_display_block(void)
286 return s_animation.display_block;