4 * Copyright (c) 2000 - 2015 Samsung Electronics Co., Ltd. All rights reserved.
6 * Licensed under the Apache License, Version 2.0 (the "License");
7 * you may not use this file except in compliance with the License.
8 * You may obtain a copy of the License at
10 * http://www.apache.org/licenses/LICENSE-2.0
12 * Unless required by applicable law or agreed to in writing, software
13 * distributed under the License is distributed on an "AS IS" BASIS,
14 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15 * See the License for the specific language governing permissions and
16 * limitations under the License.
21 #include <appcore-efl.h>
22 #include <Elementary.h>
34 #define KEY_BACK "XF86Back"
35 #define PRIVATE_DATA_KEY_LIST_TIMER "pri_list_tm"
37 static main_s main_info = {
48 //main_h main_info_h = &main_info;
52 extern main_h main_get_info(void)
59 static Eina_Bool _back_key_pressed(void *data, Evas_Object *obj, Evas_Object *src, Evas_Callback_Type type, void *event_info)
62 Evas_Event_Key_Down *ev = event_info;
64 if (type == EVAS_CALLBACK_KEY_DOWN && strncmp(KEY_BACK, ev->key, strlen(KEY_BACK)) == 0) {
65 _D("KEY PRESSED: %s", ev->key);
76 static task_mgr_error_e _create_layout(Evas_Object *parent)
79 Evas_Object *layout = NULL;
80 Evas_Object *rect = NULL;
81 Eina_Bool ret = EINA_FALSE;
84 layout = elm_layout_add(parent);
85 goto_if (!layout, ERROR);
87 ret = elm_layout_file_set(layout, LAYOUT, "layout");
88 goto_if(EINA_FALSE == ret, ERROR);
90 evas_object_size_hint_weight_set(layout, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
91 evas_object_move(layout, 0, 0);
92 evas_object_resize(layout, main_info.root_w, main_info.root_h);
93 evas_object_show(layout);
95 main_info.layout = layout;
98 rect = evas_object_rectangle_add(evas_object_evas_get(layout));
99 evas_object_size_hint_min_set(rect, main_info.root_w, main_info.root_h);
100 evas_object_size_hint_weight_set(rect, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
101 evas_object_resize(rect, main_info.root_w, main_info.root_h);
102 evas_object_color_set(rect, 0, 0, 0, BG_COLOR);
103 evas_object_show(rect);
104 elm_object_part_content_set(layout, BG_PART_NAME, rect);
107 main_info.scroller = scroller_create(layout);
108 goto_if(!main_info.scroller, ERROR);
110 return TASK_MGR_ERROR_NONE;
113 if (layout) evas_object_del(layout);
114 evas_object_del(main_info.win);
115 return TASK_MGR_ERROR_FAIL;
120 static void _destroy_layout(void)
122 Evas_Object *rect = NULL;
124 if (main_info.layout) {
125 rect = elm_object_part_content_unset(main_info.layout, BG_PART_NAME);
127 evas_object_del(rect);
129 evas_object_del(main_info.layout);
130 main_info.layout = NULL;
136 static Eina_Bool _list_timer_cb(void *data)
139 Evas_Object *clear_item = NULL;
140 task_mgr_error_e ret = TASK_MGR_ERROR_NONE;
142 if (main_info.pkg_list) {
143 _D("Already loaded");
147 clear_item = item_clear_all_create(main_info.scroller);
149 _E("Fail to create clear all button");
150 return ECORE_CALLBACK_CANCEL;
152 scroller_push_item(main_info.scroller, clear_item);
154 ret = list_create(&main_info.pkg_list);
155 elm_object_part_text_set(main_info.layout, "no,apps,txt", _("IDS_TASKMGR_NPBODY_NO_APPLICATIONS_ABB2"));
156 if (TASK_MGR_ERROR_NO_DATA == ret) {
157 _D("There is no application");
158 item_clear_set_disable(main_info.scroller);
159 } else if (TASK_MGR_ERROR_NONE != ret) {
160 _E("Fail to create pkglist");
164 goto_if(TASK_MGR_ERROR_NONE != scroller_push_all_item(main_info.scroller, main_info.pkg_list), END);
167 evas_object_data_del(main_info.win, PRIVATE_DATA_KEY_LIST_TIMER);
168 return ECORE_CALLBACK_CANCEL;
173 static bool _create_cb(void *data)
177 Ecore_Timer *timer = NULL;
179 main_info.win = elm_win_add(NULL, "Task-mgr", ELM_WIN_BASIC);
180 retv_if(!main_info.win, false);
182 elm_app_base_scale_set(2.6);
183 elm_win_screen_size_get(main_info.win, NULL, NULL, &main_info.root_w, &main_info.root_h);
184 _D("screen size is (%d, %d)", main_info.root_w, main_info.root_h);
186 elm_object_event_callback_add(main_info.win, _back_key_pressed, NULL);
188 elm_win_alpha_set(main_info.win, EINA_TRUE);
189 elm_win_indicator_mode_set(main_info.win, ELM_WIN_INDICATOR_SHOW);
190 elm_win_indicator_opacity_set(main_info.win, ELM_WIN_INDICATOR_TRANSPARENT);
192 elm_win_borderless_set(main_info.win, EINA_TRUE);
193 evas_object_show(main_info.win);
195 main_info.e = evas_object_evas_get(main_info.win);
197 if (_create_layout(main_info.win) != TASK_MGR_ERROR_NONE) {
198 _E("Failed to create a layout");
203 timer = evas_object_data_get(main_info.win, PRIVATE_DATA_KEY_LIST_TIMER);
205 ecore_timer_del(timer);
208 timer = ecore_timer_add(0.001f, _list_timer_cb, NULL);
210 evas_object_data_set(main_info.win, PRIVATE_DATA_KEY_LIST_TIMER, timer);
212 _E("Cannot add a create list timer");
220 static void _terminate_cb(void *data)
225 list_destroy(main_info.pkg_list);
226 evas_object_data_del(main_info.win, PRIVATE_DATA_KEY_LIST_TIMER);
228 elm_cache_all_flush();
230 appcore_flush_memory();
232 scroller_destroy(main_info.scroller);
236 * Even though the window is deleted automatically,
237 * It is good habit to delete window explicitly by your hands.
241 evas_object_del(main_info.win);
242 main_info.win = NULL;
248 static void _app_control(app_control_h service, void *data)
257 static void _pause_cb(void *data)
267 static void _language_changed(app_event_info_h event_info, void *data)
274 int main(int argc, char **argv)
277 ui_app_lifecycle_callback_s lifecycle_callback = {0, };
278 app_event_handler_h event_handlers[5] = {NULL, };
280 lifecycle_callback.create = _create_cb;
281 lifecycle_callback.terminate = _terminate_cb;
282 lifecycle_callback.pause = _pause_cb;
283 lifecycle_callback.resume = NULL;
284 lifecycle_callback.app_control = _app_control;
286 ui_app_add_event_handler(&event_handlers[APP_EVENT_LOW_BATTERY], APP_EVENT_LOW_BATTERY, NULL, NULL);
287 ui_app_add_event_handler(&event_handlers[APP_EVENT_LOW_MEMORY], APP_EVENT_LOW_MEMORY, NULL, NULL);
288 ui_app_add_event_handler(&event_handlers[APP_EVENT_DEVICE_ORIENTATION_CHANGED], APP_EVENT_DEVICE_ORIENTATION_CHANGED, NULL, NULL);
289 ui_app_add_event_handler(&event_handlers[APP_EVENT_LANGUAGE_CHANGED], APP_EVENT_LANGUAGE_CHANGED, _language_changed, NULL);
290 ui_app_add_event_handler(&event_handlers[APP_EVENT_REGION_FORMAT_CHANGED], APP_EVENT_REGION_FORMAT_CHANGED, NULL, NULL);
292 ret = ui_app_main(argc, argv, &lifecycle_callback, &main_info);