2 * Copyright 2012 Samsung Electronics Co., Ltd
4 * Licensed under the Flora License, Version 1.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.tizenopensource.org/license
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.
18 #define UG_MODULE_API __attribute__ ((visibility("default")))
22 #include "gallery-efl.h"
24 #include "ge-albums.h"
25 #include "ge-gridview.h"
27 #include "ge-ui-util.h"
29 #include "ge-ext-ug-load.h"
30 #include "ge-strings.h"
32 static ge_view_mode g_view_mode = GE_AlbumsView_Mode;
33 #define GE_BG_COLOR_DEFAULT 255
34 #define GE_BG_ALPHA_DEFAULT 255
37 ge_view_mode _ge_get_view_mode(void)
42 void _ge_set_view_mode(ge_view_mode mode)
47 static int _ge_create_ly_view(ge_ugdata *ugd)
49 GE_CHECK_VAL(ugd, -1);
50 GE_CHECK_VAL(ugd->navi_bar, -1);
53 * If failed, records couldn't be got from DB, cluster list is emty.
54 * Show warning message instead of return -1;
56 if(_ge_data_init(ugd) != 0)
58 ge_dbgW("_ge_data_init failed!");
61 * Get cluster list from DB.
62 * If cluster list is empty, GE_DB_FAILED returned,
63 * "No contents" view would be created and showed.
64 * Show warning message instead of return -1;
66 if(_ge_data_get_clusters_list(ugd) != 0)
67 ge_dbgW("Get clusters list failed!");
69 /* Create layout of albums view */
70 ugd->albums_view_ly = ge_albums_create_ly(ugd->navi_bar);
71 GE_CHECK_VAL(ugd->albums_view_ly, -1);
72 /* Create albums view */
73 ugd->albums_view = ge_albums_create_view(ugd, ugd->albums_view_ly);
74 GE_CHECK_VAL(ugd->albums_view, -1);
75 elm_object_part_content_set(ugd->albums_view_ly, "contents",
78 ge_ui_create_title_and_push(ugd, ugd->navi_bar, ugd->albums_view_ly,
79 AlbumsView_Title, ugd->albums_view_title);
83 static Evas_Object *_ge_create_bg(Evas_Object *parent)
86 GE_CHECK_NULL(parent);
87 Evas_Object *bg = NULL;
89 bg = elm_bg_add(parent);
90 /* Show special color(48,48,48,255) of background */
91 elm_bg_color_set(bg, GE_BG_COLOR_DEFAULT,
92 GE_BG_COLOR_DEFAULT, GE_BG_COLOR_DEFAULT);
94 evas_object_size_hint_weight_set(bg, EVAS_HINT_EXPAND,
96 evas_object_size_hint_align_set(bg, EVAS_HINT_FILL, EVAS_HINT_FILL);
97 /* elm_win_resize_object_add(parent, bg); */
103 static int _ge_init_view(ge_ugdata *ugd)
106 GE_CHECK_VAL(ugd, -1);
109 ugd->ly_main = ge_ui_create_main_ly(ugd, ugd->win);
110 GE_CHECK_VAL(ugd->ly_main, -1);
112 ugd->bg = _ge_create_bg(ugd->ly_main);
113 GE_CHECK_VAL(ugd->bg, -1);
114 /* Pack bg to swallow */
115 elm_object_part_content_set(ugd->ly_main, "elm.swallow.bg", ugd->bg);
118 ugd->navi_bar = ge_ui_create_navibar(ugd, ugd->ly_main);
119 GE_CHECK_VAL(ugd->navi_bar, -1);
121 /* Albums view and its layout */
122 if(_ge_create_ly_view(ugd) != 0)
124 ge_dbgE("Create albums view and layout failed!");
131 static int _ge_create_view(ge_ugdata *ugd)
134 GE_CHECK_VAL(ugd, -1);
135 /* Set inited flag as TRUE */
136 ugd->b_inited_view = true;
138 ugd->th = elm_theme_new();
139 GE_CHECK_VAL(ugd->th, -1);
140 elm_theme_ref_set(ugd->th, NULL);
141 elm_theme_extension_add(ugd->th, GE_EDJ_FILE);
143 /* Initialize gallery ug view */
144 if(_ge_init_view(ugd) != 0)
146 ge_dbgE("Initialize view failed!");
150 /* Register MMC changed callback */
151 if(ge_reg_db_update_noti(ugd) != 0) {
152 ge_dbgE("ge_reg_db_update_noti failed!");
159 static int _ge_close_view(ge_ugdata *ugd)
161 GE_CHECK_VAL(ugd, -1);
163 GE_IF_DEL_OBJ(ugd->popup)
165 GE_IF_FREE_MEM(ugd->file_setas_callid_path)
166 GE_IF_FREE_MEM(ugd->file_setas_homescreen_path)
167 GE_IF_FREE_MEM(ugd->file_setas_lockscreen_path)
168 GE_IF_FREE_MEM(ugd->file_setas_callid_size)
169 GE_IF_FREE_MEM(ugd->file_setas_image_path)
170 GE_IF_FREE_MEM(ugd->file_setas_crop_image_path)
172 if(ugd->b_inited_view) {
173 /* Destroy UG called by me */
174 if (ugd->ug_called_by_me) {
175 ge_dbg("Destroy ug_called_by_me");
176 ug_destroy(ugd->ug_called_by_me);
177 ugd->ug_called_by_me = NULL;
180 GE_IF_DEL_TIMER(ugd->del_timer)
181 GE_IF_DEL_TIMER(ugd->thumbs_clicked_timer)
182 GE_IF_DEL_IDLER(ugd->grid_append_idler)
184 ge_dereg_db_update_noti();
186 ge_grid_del_callbacks(ugd);
187 ge_albums_del_callbacks(ugd);
189 GE_IF_DEL_OBJ(ugd->navi_bar)
190 GE_IF_DEL_OBJ(ugd->bg)
191 GE_IF_DEL_OBJ(ugd->ly_main)
193 ge_albums_free_cover_thumbs(ugd);
195 /* Disconnet with libmedia-info */
196 _ge_data_finalize(ugd);
198 elm_theme_extension_del(ugd->th, GE_EDJ_FILE);
199 elm_theme_free(ugd->th);
202 ugd->b_inited_view = false;
206 service_destroy(ugd->service);
213 static int __ge_parse_param_launch_type_setas(ge_ugdata *ugd, service_h service)
215 GE_CHECK_VAL(ugd, -1);
216 GE_CHECK_VAL(service, -1);
217 char *setas_type = NULL;
218 char *callerid_size = NULL;
219 char *callerid_path = NULL;
220 char *wallpaper_path = NULL;
221 char *lockscreen_path = NULL;
223 service_get_extra_data(service, GE_BUNDLE_SETAS_TYPE, &setas_type);
224 if(setas_type == NULL) {
225 ge_dbgW("setas-type NULL");
229 if (!strcasecmp(setas_type, GE_FILE_SELECT_SETAS_WALLPALER)) {
230 ugd->file_select_setas_mode = GE_File_Select_Setas_Wallpaper;
231 g_strlcpy(ugd->albums_view_title, GE_TITLE_CHANGE_WALLPAPER,
232 GE_ALBUM_NAME_LEN_MAX);
234 service_get_extra_data(service, GE_BUNDLE_HOMESCREEN_PATH,
236 if (wallpaper_path) {
237 ge_dbg("path:%s", wallpaper_path);
238 ugd->file_setas_homescreen_path = wallpaper_path;
241 service_get_extra_data(service, GE_BUNDLE_LOCKSCREEN_PATH,
243 if (lockscreen_path) {
244 ge_dbg("path:%s", lockscreen_path);
245 ugd->file_setas_lockscreen_path = lockscreen_path;
247 } else if (!strcasecmp(setas_type, GE_FILE_SELECT_SETAS_CROP_WALLPALER)) {
248 ugd->file_select_setas_mode = GE_FILE_SELECT_SETAS_MODE_CROP_WALLPAPER;
249 g_strlcpy(ugd->albums_view_title, GE_TITLE_CHANGE_WALLPAPER,
250 GE_ALBUM_NAME_LEN_MAX);
251 } else if (!strcasecmp(setas_type, GE_FILE_SELECT_SETAS_CALLERID)) {
252 ugd->file_select_setas_mode = GE_File_Select_Setas_CallerID;
253 g_strlcpy(ugd->albums_view_title, GE_TITLE_CHANGE_CALLER_ID,
254 GE_ALBUM_NAME_LEN_MAX);
256 service_get_extra_data(service, GE_BUNDLE_CALLERID_SIZE,
259 ge_dbg("size:%s", callerid_size);
260 ugd->file_setas_callid_size = callerid_size;
263 service_get_extra_data(service, GE_BUNDLE_CALLERID_PATH,
266 ge_dbg("path:%s", callerid_path);
267 ugd->file_setas_callid_path = callerid_path;
271 GE_FREE_MEM(setas_type);
275 static int __ge_parse_param_file_type(ge_ugdata *ugd, service_h service)
277 GE_CHECK_VAL(ugd, -1);
278 GE_CHECK_VAL(service, -1);
280 char *file_type = NULL;
281 char file_type_str[GE_ALBUM_NAME_LEN_MAX] = {0,};
282 bool b_singular = true;
284 if(ugd->file_select_mode == GE_File_Select_Multiple)
288 service_get_extra_data(service, GE_BUNDLE_FILE_TYPE, &file_type);
289 if(file_type == NULL) {
290 ge_dbgW("file_type is empty!");
291 goto GE_DEFAULT_FILE_TYPE;
293 ge_dbg("file_type: %s", file_type);
295 if (!strcasecmp(file_type, GE_FILE_SELECT_TYPE_IMAGE)) {
296 ugd->file_type_mode = GE_File_Select_Type_Image;
298 g_strlcat(ugd->albums_view_title, GE_TITLE_IMAGE,
299 sizeof(ugd->albums_view_title));
301 g_strlcat(ugd->albums_view_title, GE_TITLE_IMAGES,
302 sizeof(ugd->albums_view_title));
305 GE_FREE_MEM(file_type);
307 } else if (!strcasecmp(file_type, GE_FILE_SELECT_TYPE_VIDEO)) {
308 ugd->file_type_mode = GE_File_Select_Type_Video;
310 g_strlcat(ugd->albums_view_title, GE_TITLE_VIDEO,
311 sizeof(ugd->albums_view_title));
313 g_strlcat(ugd->albums_view_title, GE_TITLE_VIDEOS,
314 sizeof(ugd->albums_view_title));
317 GE_FREE_MEM(file_type);
322 GE_DEFAULT_FILE_TYPE:
324 ge_dbg("file type is default, set default type(ALL).");
325 ugd->file_type_mode = GE_File_Select_Type_All;
327 g_strlcpy(file_type_str, GE_TITLE_FILE, sizeof(file_type_str));
329 g_strlcpy(file_type_str, GE_TITLE_FILES, sizeof(file_type_str));
332 g_strlcat(ugd->albums_view_title, file_type_str,
333 sizeof(ugd->albums_view_title));
338 /* analysis parameters */
339 static int _ge_parse_param(ge_ugdata *ugd, service_h service)
341 GE_CHECK_VAL(ugd, -1);
342 GE_CHECK_VAL(service, -1);
343 char *launch_type = NULL;
345 service_get_extra_data(service, GE_BUNDLE_LAUNCH_TYPE, &launch_type);
346 if (launch_type == NULL) {
347 ge_dbg("launch-type == NULL");
350 ge_dbg("launch-type [%s]", launch_type);
352 if(!strcasecmp(launch_type, GE_ALBUM_SELECT_ONE)) {
353 ugd->album_select_mode = GE_Album_Select_One;
354 g_strlcpy(ugd->albums_view_title, GE_TITLE_ALBUMS,
355 GE_ALBUM_NAME_LEN_MAX);
356 } else if (!strcasecmp(launch_type, GE_FILE_SELECT_SETAS)) {
357 ugd->file_select_mode = GE_File_Select_Setas;
358 __ge_parse_param_launch_type_setas(ugd, service);
359 /* Checkme: Only image type is offered in SETAS case */
360 ugd->file_type_mode = GE_File_Select_Type_Image;
362 g_strlcpy(ugd->albums_view_title, GE_TITLE_ADD,
363 GE_ALBUM_NAME_LEN_MAX);
364 g_strlcat(ugd->albums_view_title, " ", GE_ALBUM_NAME_LEN_MAX);
366 if (!strcasecmp(launch_type, GE_FILE_SELECT_ONE))
367 ugd->file_select_mode = GE_File_Select_One;
368 else if (!strcasecmp(launch_type, GE_FILE_SELECT_MULTIPLE))
369 ugd->file_select_mode = GE_File_Select_Multiple;
371 ge_dbgE("Wrong launch type!");
373 __ge_parse_param_file_type(ugd, service);
376 GE_FREE_MEM(launch_type);
390 static void * _ge_create(ui_gadget_h ug, enum ug_mode mode, service_h service, void *priv)
393 Evas_Object *parent = NULL;
394 ge_ugdata *ugd = NULL;
397 GE_CHECK_NULL(service);
399 ge_dbgW("Gallery UG start...");
401 ugd = (ge_ugdata *)priv;
404 parent = (Evas_Object *)ug_get_window();
405 GE_CHECK_NULL(parent);
407 /* Bind text domain for internalization */
408 bindtextdomain("ug-gallery-efl" , "/opt/ug/res/locale");
409 /* Reset inited flag, it would be set as TRUE if albums view created */
410 ugd->b_inited_view = false;
412 _ge_set_view_mode(GE_AlbumsView_Mode);
414 Ecore_X_Window x_win = ecore_x_window_focus_get();
415 GE_CHECK_NULL(x_win);
416 Ecore_X_Window root_win = ecore_x_window_root_get(x_win);
417 GE_CHECK_NULL(root_win);
418 ugd->win_scale = elm_scale_get();
420 service_clone(&(ugd->service), service);
422 /* Parse parameters passed from parent */
423 if(_ge_parse_param(ugd, service) != 0) {
424 ge_dbgE("Failed to parse parameters!");
428 if ((ugd->file_select_mode == GE_File_Select_Setas) ||
429 (ugd->file_select_mode != GE_File_Select_None) ||
430 (ugd->album_select_mode != GE_Album_Select_None)) {
431 /* create gallery UG */
432 if(_ge_create_view(ugd) != 0) {
433 ge_dbgE("Failed to create Gallery UG view!");
437 ge_dbgE("Wrong file_select_mode[%d] or album_select_mode[%d]",
438 ugd->file_select_mode, ugd->album_select_mode);
451 static void _ge_start(ui_gadget_h ug, service_h service, void *priv)
462 static void _ge_pause(ui_gadget_h ug, service_h service, void *priv)
474 static void _ge_resume(ui_gadget_h ug, service_h service, void *priv)
478 ge_ugdata *ugd = (ge_ugdata *)priv;
480 if (!_ge_ug_iv_get())
482 ge_update_view(ugd, GE_UPDATE_NONE);
493 static void _ge_destroy(ui_gadget_h ug, service_h service, void *priv)
498 ge_ugdata *ugd = (ge_ugdata *)priv;
501 ge_dbgW("End of the gallery UG!");
512 static void _ge_message(ui_gadget_h ug, service_h msg, service_h service, void *priv)
525 static void _ge_event(ui_gadget_h ug, enum ug_event event, service_h service, void *priv)
528 ge_ugdata *ugd = (ge_ugdata *)priv;
529 int rotate_mode = GE_ROTATE_NONE;
533 case UG_EVENT_LOW_MEMORY:
534 ge_dbg("UG_EVENT_LOW_MEMORY");
537 case UG_EVENT_LOW_BATTERY:
538 ge_dbg("UG_EVENT_LOW_BATTERY");
541 case UG_EVENT_LANG_CHANGE:
542 ge_dbg("UG_EVENT_LANG_CHANGE");
545 case UG_EVENT_ROTATE_PORTRAIT:
546 ge_dbg("UG_EVENT_ROTATE_PORTRAIT");
547 rotate_mode = GE_ROTATE_PORTRAIT;
548 goto UG_ROTATE_EVENT;
551 case UG_EVENT_ROTATE_PORTRAIT_UPSIDEDOWN:
552 ge_dbg("UG_EVENT_ROTATE_PORTRAIT_UPSIDEDOWN");
553 rotate_mode = GE_ROTATE_PORTRAIT_UPSIDEDOWN;
554 goto UG_ROTATE_EVENT;
557 case UG_EVENT_ROTATE_LANDSCAPE:
558 ge_dbg("UG_EVENT_ROTATE_LANDSCAPE");
559 rotate_mode = GE_ROTATE_LANDSCAPE;
560 goto UG_ROTATE_EVENT;
563 case UG_EVENT_ROTATE_LANDSCAPE_UPSIDEDOWN:
564 ge_dbg("UG_EVENT_ROTATE_LANDSCAPE_UPSIDEDOWN");
565 rotate_mode = GE_ROTATE_LANDSCAPE_UPSIDEDOWN;
566 goto UG_ROTATE_EVENT;
577 ge_ui_set_rotate_angle(rotate_mode);
579 if((ugd->file_select_mode == GE_File_Select_Multiple) &&
580 (_ge_get_view_mode() == GE_ThumbnailEdit_Mode))
582 ge_ui_rotate_selinfo(ugd);
586 static void _ge_key_event(ui_gadget_h ug, enum ug_key_event event, service_h service, void *priv)
592 case UG_KEY_EVENT_END:
593 ge_dbg("Receive key end event");
609 UG_MODULE_API int UG_MODULE_INIT(struct ug_module_ops *ops)
611 ge_dbgW("UG_MODULE_INIT");
612 ge_ugdata *ugd = NULL;
613 GE_CHECK_VAL(ops, -1);
615 ugd = calloc(1, sizeof(ge_ugdata));
616 GE_CHECK_VAL(ugd, -1);
618 ops->create = _ge_create;
619 ops->start = _ge_start;
620 ops->pause = _ge_pause;
621 ops->resume = _ge_resume;
622 ops->destroy = _ge_destroy;
623 ops->message = _ge_message;
624 ops->event = _ge_event;
625 ops->key_event = _ge_key_event;
627 ops->opt = UG_OPT_INDICATOR_ENABLE;
639 UG_MODULE_API void UG_MODULE_EXIT(struct ug_module_ops *ops)
641 struct ug_data *ugd = NULL;
650 ge_dbgW("UG_MODULE_EXIT");