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")))
23 #include "gallery-efl.h"
25 #include "ge-albums.h"
26 #include "ge-gridview.h"
27 #include "ge-db-handler.h"
28 #include "ge-ui-util.h"
30 #include "ge-ext-ug-load.h"
31 #include "ge-strings.h"
33 static ge_view_mode g_view_mode = GE_AlbumsView_Mode;
34 #define GE_BG_COLOR_DEFAULT 45
35 #define GE_BG_ALPHA_DEFAULT 255
38 ge_view_mode _ge_get_view_mode(void)
43 void _ge_set_view_mode(ge_view_mode mode)
48 static int _ge_create_ly_view(ge_ugdata *ugd)
50 GE_CHECK_VAL(ugd, -1);
51 GE_CHECK_VAL(ugd->navi_bar, -1);
55 * If failed, records couldn't be got from DB, cluster list is emty.
56 * Show warning message instead of return -1;
58 if(ge_db_init(ugd) != GE_DB_SUCCESS)
60 ge_dbgW("ge_db_init failed!");
64 * Get cluster list from DB.
65 * If cluster list is empty, GE_DB_FAILED returned,
66 * "No contents" view would be created and showed.
67 * Show warning message instead of return -1;
69 if(ge_db_get_clusters_list(ugd) != GE_DB_SUCCESS)
71 ge_dbgW("ge_db_get_clusters_list failed!");
73 /* Create layout of albums view */
74 ugd->albums_view_ly = ge_albums_create_ly(ugd->navi_bar);
75 GE_CHECK_VAL(ugd->albums_view_ly, -1);
76 /* Create albums view */
77 ugd->albums_view = ge_albums_create_view(ugd, ugd->albums_view_ly);
78 GE_CHECK_VAL(ugd->albums_view, -1);
79 elm_object_part_content_set(ugd->albums_view_ly, "contents", ugd->albums_view);
81 ge_ui_create_title_and_push(ugd, ugd->navi_bar, ugd->albums_view_ly, AlbumsView_Title, ugd->albums_view_title);
82 _ge_set_view_mode( GE_AlbumsView_Mode );
87 static Evas_Object *_ge_create_bg(Evas_Object *parent)
90 GE_CHECK_NULL(parent);
91 Evas_Object *bg = NULL;
93 bg = elm_bg_add(parent);
94 /* Show special color(48,48,48,255) of background */
95 elm_bg_color_set(bg, GE_BG_COLOR_DEFAULT,
96 GE_BG_COLOR_DEFAULT, GE_BG_COLOR_DEFAULT);
98 evas_object_size_hint_weight_set(bg,
99 EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
100 evas_object_size_hint_align_set(bg, EVAS_HINT_FILL, EVAS_HINT_FILL);
101 evas_object_show(bg);
106 static int _ge_init_view(ge_ugdata *ugd)
109 GE_CHECK_VAL(ugd, -1);
112 ugd->ly_main = ge_ui_create_main_ly(ugd, ugd->win);
113 GE_CHECK_VAL(ugd->ly_main, -1);
116 ugd->bg = _ge_create_bg(ugd->ly_main);
117 GE_CHECK_VAL(ugd->bg, -1);
118 /* Pack bg to swallow */
119 elm_object_part_content_set(ugd->ly_main, "elm.swallow.bg", ugd->bg);
122 ugd->navi_bar = ge_ui_create_navibar(ugd, ugd->ly_main);
123 GE_CHECK_VAL(ugd->navi_bar, -1);
125 /* Albums view and its layout */
126 if(_ge_create_ly_view(ugd) != 0)
128 ge_dbgE("Create albums view and layout failed!");
135 static int _ge_create_view(ge_ugdata *ugd)
138 GE_CHECK_VAL(ugd, -1);
140 /* Set inited flag as TRUE */
141 ugd->b_inited_view = true;
143 ugd->th = elm_theme_new();
144 GE_CHECK_VAL(ugd->th, -1);
145 elm_theme_ref_set(ugd->th, NULL);
146 elm_theme_extension_add(ugd->th, GE_EDJ_FILE);
147 elm_theme_extension_add(ugd->th, GALLERY_BLACK_EDJ_FILE);
149 /* Initialize gallery ug view */
150 if(_ge_init_view(ugd) != 0)
152 ge_dbgE("Initialize view failed!");
156 /* Register MMC and UMS changed callback */
157 if(ge_reg_db_update_noti(ugd) != 0) {
158 ge_dbgE("ge_reg_db_update_noti failed!");
161 if(ge_reg_ums_noti(ugd) != 0) {
162 ge_dbgE("ge_reg_ums_noti failed!");
169 static int _ge_close_view(ge_ugdata *ugd)
171 GE_CHECK_VAL(ugd, -1);
173 GE_DEL_OBJ(ugd->popup)
175 GE_FREE_MEM(ugd->file_setas_callid_path)
176 GE_FREE_MEM(ugd->file_setas_homescreen_path)
177 GE_FREE_MEM(ugd->file_setas_lockscreen_path)
178 GE_FREE_MEM(ugd->file_setas_callid_size)
179 GE_FREE_MEM(ugd->file_setas_image_path)
180 GE_FREE_MEM(ugd->file_setas_crop_image_path)
182 if(ugd->b_inited_view) {
183 /* Destroy UG called by me */
184 if (ugd->ug_called_by_me) {
185 ug_destroy(ugd->ug_called_by_me);
186 ugd->ug_called_by_me = NULL;
189 GE_DEL_TIMER(ugd->ums_update_timer)
190 GE_DEL_TIMER(ugd->del_timer)
191 GE_DEL_TIMER(ugd->thumbs_clicked_timer)
192 GE_DEL_IDLER(ugd->grid_append_idler)
194 ge_dereg_db_update_noti();
197 ge_grid_del_callbacks(ugd);
198 ge_albums_del_callbacks(ugd);
200 GE_DEL_OBJ(ugd->navi_bar)
202 GE_DEL_OBJ(ugd->ly_main)
204 ge_albums_free_cover_thumbs(ugd);
206 /* Disconnet with libmedia-info */
209 elm_theme_extension_del(ugd->th, GE_EDJ_FILE);
210 elm_theme_extension_del(ugd->th,
211 GALLERY_BLACK_EDJ_FILE);
212 elm_theme_free(ugd->th);
215 ugd->b_inited_view = false;
221 static void __ge_parse_param_launch_type_setas(ge_ugdata *ugd, bundle *data)
227 const char *setas_type = NULL;
228 const char *callerid_size = NULL;
229 const char *callerid_path = NULL;
230 const char *wallpaper_path = NULL;
231 const char *lockscreen_path = NULL;
233 setas_type = bundle_get_val(b, GE_BUNDLE_SETAS_TYPE);
234 if(setas_type == NULL) {
235 ge_dbg("setas-type NULL");
239 if (!strcasecmp(setas_type, GE_FILE_SELECT_SETAS_WALLPALER)) {
240 ugd->file_select_setas_mode = GE_File_Select_Setas_Wallpaper;
241 g_strlcpy(ugd->albums_view_title, GE_TITLE_CHANGE_WALLPAPER,
242 GE_ALBUM_NAME_LEN_MAX);
244 wallpaper_path = bundle_get_val(b, GE_BUNDLE_HOMESCREEN_PATH);
245 if (wallpaper_path) {
246 ge_dbg("path:%s", wallpaper_path);
247 ugd->file_setas_homescreen_path = strdup(wallpaper_path);
250 lockscreen_path = bundle_get_val(b, GE_BUNDLE_LOCKSCREEN_PATH);
251 if (lockscreen_path) {
252 ge_dbg("path:%s", lockscreen_path);
253 ugd->file_setas_lockscreen_path = strdup(lockscreen_path);
255 } else if (!strcasecmp(setas_type, GE_FILE_SELECT_SETAS_CALLERID))
257 ugd->file_select_setas_mode = GE_File_Select_Setas_CallerID;
258 g_strlcpy(ugd->albums_view_title, GE_TITLE_CHANGE_CALLER_ID,
259 GE_ALBUM_NAME_LEN_MAX);
261 callerid_size = bundle_get_val(b, GE_BUNDLE_CALLERID_SIZE);
263 ge_dbg("size:%s", callerid_size);
264 ugd->file_setas_callid_size = strdup(callerid_size);
267 callerid_path = bundle_get_val(b, GE_BUNDLE_CALLERID_PATH);
269 ge_dbg("path:%s", callerid_path);
270 ugd->file_setas_callid_path = strdup(callerid_path);
275 static void __ge_parse_param_file_type(ge_ugdata *ugd, bundle *data)
281 const char *file_type = NULL;
282 char file_type_str[GE_ALBUM_NAME_LEN_MAX] = {0,};
283 bool b_singular = true;
286 if( (ugd->file_select_mode == GE_File_Select_Multiple) ||
287 (ugd->file_select_mode == GE_File_Select_Imft)) {
292 file_type = bundle_get_val(b, GE_BUNDLE_FILE_TYPE);
293 if(file_type == NULL)
294 goto DEFAULT_FILE_TYPE;
296 if (!strcasecmp(file_type, GE_FILE_SELECT_TYPE_IMAGE)) {
297 ugd->file_type_mode = GE_File_Select_Type_Image;
299 g_strlcat(ugd->albums_view_title, GE_TITLE_IMAGE,
300 sizeof(ugd->albums_view_title));
302 g_strlcat(ugd->albums_view_title, GE_TITLE_IMAGES,
303 sizeof(ugd->albums_view_title));
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));
320 ge_dbg("file type is default, set default type(ALL).");
321 ugd->file_type_mode = GE_File_Select_Type_All;
323 g_strlcpy(file_type_str, GE_TITLE_FILE, sizeof(file_type_str));
325 g_strlcpy(file_type_str, GE_TITLE_FILES, sizeof(file_type_str));
328 g_strlcat(ugd->albums_view_title, file_type_str,
329 sizeof(ugd->albums_view_title));
334 /* analysis parameters */
335 static int _ge_parse_param(ge_ugdata *ugd, bundle *data)
337 GE_CHECK_VAL(ugd, -1);
338 GE_CHECK_VAL(data, -1);
340 const char *launch_type = NULL;
342 launch_type = bundle_get_val(b, GE_BUNDLE_LAUNCH_TYPE);
343 if (launch_type == NULL) {
344 ge_dbg("launch-type == NULL");
347 ge_dbg("launch-type [%s]", launch_type);
349 if(!strcasecmp(launch_type, GE_ALBUM_SELECT_ONE))
351 ugd->album_select_mode = GE_Album_Select_One;
352 g_strlcpy(ugd->albums_view_title, GE_TITLE_ALBUMS,
353 GE_ALBUM_NAME_LEN_MAX);
354 } else if (!strcasecmp(launch_type, GE_FILE_SELECT_SETAS)) {
355 ugd->file_select_mode = GE_File_Select_Setas;
356 __ge_parse_param_launch_type_setas(ugd, data);
357 /* Checkme: Only image type is offered in SETAS case */
358 ugd->file_type_mode = GE_File_Select_Type_Image;
360 g_strlcpy(ugd->albums_view_title, GE_TITLE_ADD,
361 GE_ALBUM_NAME_LEN_MAX);
362 g_strlcat(ugd->albums_view_title," ",GE_ALBUM_NAME_LEN_MAX);
364 if (!strcasecmp(launch_type, GE_FILE_SELECT_ONE)) {
365 ugd->file_select_mode = GE_File_Select_One;
366 } else if (!strcasecmp(launch_type, GE_FILE_SELECT_MULTIPLE)) {
367 ugd->file_select_mode = GE_File_Select_Multiple;
368 } else if (!strcasecmp(launch_type, GE_FILE_SELECT_IMFT)) {
369 ugd->file_select_mode = GE_File_Select_Imft;
371 const char *contact_id = NULL;
372 contact_id = bundle_get_val(b, "contact");
374 ugd->file_select_contact_id = atoi(contact_id);
376 ugd->file_select_mode = GE_File_Select_None;
377 ugd->file_select_contact_id = -1;
378 ge_dbg("Invalid args");
382 ge_dbg("contact_id: %d", ugd->file_select_contact_id);
385 __ge_parse_param_file_type(ugd, data);
402 static void * _ge_create(struct ui_gadget *ug, enum ug_mode mode, bundle *data, void *priv)
405 Evas_Object *parent = NULL;
406 ge_ugdata *ugd = NULL;
413 ge_dbgW("Gallery UG start...");
415 ugd = (ge_ugdata *)priv;
418 parent = (Evas_Object *)ug_get_window();
419 GE_CHECK_NULL(parent);
421 /* Bind text domain for internalization */
422 bindtextdomain("ug-gallery-efl" , "/opt/ug/res/locale");
423 /* Reset inited flag, it would be set as TRUE if albums view created */
424 ugd->b_inited_view = false;
426 ge_get_ums_state(ugd);
428 _ge_set_view_mode(GE_AlbumsView_Mode);
430 Ecore_X_Window x_win = ecore_x_window_focus_get();
431 GE_CHECK_NULL(x_win);
432 Ecore_X_Window root_win = ecore_x_window_root_get(x_win);
433 GE_CHECK_NULL(root_win);
434 ecore_x_window_size_get(root_win, &w, &h);
435 ge_dbg("x_window_w : %d, x_window_h: %d.", w, h);
438 ugd->win_scale = (double)(((double)w)/((double)GE_BASE_WIN_WIDTH));
440 /* Parse parameters passed from parent */
441 if(_ge_parse_param(ugd, data) != 0) {
442 ge_dbgE("Failed to parse parameters!");
446 if ((ugd->file_select_mode == GE_File_Select_Setas) ||
447 (ugd->file_select_mode != GE_File_Select_None) ||
448 (ugd->album_select_mode != GE_Album_Select_None)) {
449 /* create gallery UG */
450 if(_ge_create_view(ugd) != 0) {
451 ge_dbgE("Failed to create Gallery UG view!");
455 ge_dbgE("Wrong file_select_mode[%d] or album_select_mode[%d]",
456 ugd->file_select_mode, ugd->album_select_mode);
469 static void _ge_start(struct ui_gadget *ug, bundle *data, void *priv)
480 static void _ge_pause(struct ui_gadget *ug, bundle *data, void *priv)
492 static void _ge_resume(struct ui_gadget *ug, bundle *data, void *priv)
496 ge_ugdata *ugd = (ge_ugdata *)priv;
498 if (!_ge_ug_iv_get())
500 ge_update_view(ugd, GE_UPDATE_NONE);
511 static void _ge_destroy(struct ui_gadget *ug, bundle *data, void *priv)
516 ge_ugdata *ugd = (ge_ugdata *)priv;
519 ge_dbgW("End of the gallery UG!");
530 static void _ge_message(struct ui_gadget *ug, bundle *msg, bundle *data, void *priv)
543 static void _ge_event(struct ui_gadget *ug, enum ug_event event, bundle *data, void *priv)
549 case UG_EVENT_LOW_MEMORY:
550 ge_dbg("UG_EVENT_LOW_MEMORY");
553 case UG_EVENT_LOW_BATTERY:
554 ge_dbg("UG_EVENT_LOW_BATTERY");
557 case UG_EVENT_LANG_CHANGE:
558 ge_dbg("UG_EVENT_LANG_CHANGE");
567 static void _ge_key_event(struct ui_gadget *ug, enum ug_key_event event, bundle *data, void *priv)
574 case UG_KEY_EVENT_END:
575 ge_dbg("Receive key end event");
591 UG_MODULE_API int UG_MODULE_INIT(struct ug_module_ops *ops)
593 ge_dbgW("UG_MODULE_INIT");
594 ge_ugdata *ugd = NULL;
595 GE_CHECK_VAL(ops, -1);
597 ugd = calloc(1, sizeof(ge_ugdata));
598 GE_CHECK_VAL(ugd, -1);
600 ops->create = _ge_create;
601 ops->start = _ge_start;
602 ops->pause = _ge_pause;
603 ops->resume = _ge_resume;
604 ops->destroy = _ge_destroy;
605 ops->message = _ge_message;
606 ops->event = _ge_event;
607 ops->key_event = _ge_key_event;
609 ops->opt = UG_OPT_INDICATOR_ENABLE;
621 UG_MODULE_API void UG_MODULE_EXIT(struct ug_module_ops *ops)
623 struct ug_data *ugd = NULL;