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://floralicense.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.
17 #include "ivug-common.h"
18 #include "ivug-parameter.h"
20 #include "ivug-slideshow-view.h"
23 #include <vconf-keys.h>
24 #include <utilX.h> // Key event
25 #include <ui-gadget-module.h> // ug_send_result
27 #include "ivug-filter.h"
29 #include "ivug-popup.h"
33 #define LOG_LVL DBG_MSG_LVL_MED
36 #define LOG_CAT "IV-SLIDESHOW"
39 #define IVUG_SS_EDJ EDJ_PATH"/ivug-slideshow-view.edj"
43 _on_slideshow_finished(void *data, Evas_Object *obj, void *event_info);
46 _send_result(ui_gadget_h ug, const char *key1, const char *val1, const char *key2, const char *val2)
51 service_create(&service);
55 MSG_HIGH("Bundle 1 : [%s = %s]", key1, val1);
56 service_add_extra_data(service, key1, val1);
60 MSG_HIGH("Bundle 2 : [%s = %s]", key2, val2);
61 service_add_extra_data(service, key2, val2);
63 ug_send_result(gGetUGHandle(), service);
65 service_destroy(service);
69 static bool _destory_slideshow_and_ug(Ivug_SlideShowView *pSSView,
73 IV_ASSERT(pSSView != NULL);
74 evas_object_smart_callback_del_full(ivug_ss_object_get(pSSView->ssHandle),
75 "slideshow,finished", _on_slideshow_finished, pSSView);
78 /* send msg to caller */
79 if(state == SLIDE_SHOW_STOPPED)
81 _send_result(gGetUGHandle(), "EXIT", "NORMAL", NULL, NULL);
83 /*from gallery ablum*/
85 if (pSSView->ssHandle )
87 MSG_HIGH("image viewer end cause slide show ended");
88 ivug_ss_delete(pSSView->ssHandle);
90 pSSView->ssHandle = NULL;
96 static Eina_Bool __stop_slideshow_cb(void *data)
98 Ivug_SlideShowView *pSSView = (Ivug_SlideShowView *)data;
99 if (pSSView && (pSSView->ssHandle)) {
100 if(pSSView->homekey_idler)
102 ecore_idler_del(pSSView->homekey_idler);
103 pSSView->homekey_idler = NULL;
105 ivug_ss_stop(pSSView->ssHandle);
107 return ECORE_CALLBACK_CANCEL;
110 static Eina_Bool _on_key_down(void *user_data, int type, void *event)
113 MSG_IMAGEVIEW_ERROR("user data is NULL");
114 return ECORE_CALLBACK_PASS_ON;
117 Ivug_SlideShowView *pSSView = static_cast<Ivug_SlideShowView *>(user_data);
119 Ecore_Event_Key *key_event = (Ecore_Event_Key *) event;
121 if (!strcmp(key_event->keyname, KEY_END))
123 MSG_IMAGEVIEW_HIGH("Bakc(End) key");
125 else if (!strcmp(key_event->keyname, KEY_SELECT))
127 MSG_IMAGEVIEW_HIGH("Home key");
128 /*home key,we need to stop slideshow also*/
129 if (pSSView->homekey_idler == NULL) {
130 pSSView->homekey_idler = ecore_idler_add(__stop_slideshow_cb, pSSView);
133 else if (!strcmp(key_event->keyname, KEY_POWER))
135 MSG_IMAGEVIEW_HIGH("Power key");
136 if ( pSSView->ssHandle )
138 ivug_ss_stop(pSSView->ssHandle);
142 MSG_IMAGEVIEW_LOW("Key down : %s", key_event->keyname);
144 return ECORE_CALLBACK_PASS_ON;
148 _on_slideshow_finished(void *data, Evas_Object *obj, void *event_info)
150 MSG_HIGH("_on_slideshow_finished");
151 IV_ASSERT(data != NULL);
153 Ivug_SlideShowView *pSSView = static_cast<Ivug_SlideShowView *>(data);
155 int ss_state = (int)event_info;
156 bool bDestoryed = false;
157 bDestoryed = _destory_slideshow_and_ug(pSSView, ss_state, false);
160 static void _on_resize(void *data, Evas *e, Evas_Object *obj, void *event_info)
162 Ivug_SlideShowView *pSSView = static_cast<Ivug_SlideShowView *>(data);
163 IV_ASSERT(pSSView != NULL);
166 evas_object_geometry_get(obj, &x, &y, &w, &h);
169 * during slideshow, after rotation, resize cb of slideshow obj cannot be invoked,
170 so invoke it manually
172 if(pSSView->ssHandle)
173 ivug_ss_resize(pSSView->ssHandle);
175 MSG_HIGH("SlideshowView resized geomtery XYWH(%d,%d,%d,%d) Rotate=%d", x, y, w, h, gGetRotationDegree());
178 void _ivug_slideshow_view_on_mmc_state_changed(keynode_t* node, void *data)
180 Ivug_SlideShowView *pSSView = static_cast<Ivug_SlideShowView *>(data);
181 IV_ASSERT(pSSView != NULL);
183 //ivug_timeout_popup_show(ivug_ss_object_get(pSSView->ssHandle), NULL, NULL, IDS_ERROR, IDS_SD_CARD_REMOVED);
184 ivug_ss_set_stop(pSSView->ssHandle);
185 _destory_slideshow_and_ug(pSSView, SLIDE_SHOW_STOPPED, true);
188 static char * _ivug_get_folder_name(char *filepath)
190 char *folder = ecore_file_dir_get(filepath);
194 name = strrchr(folder, '/');
195 if ( (name != NULL) && ((name+1) != NULL) )
197 return strdup(name + 1);
205 ivug_slideshow_view_set_list(Ivug_SlideShowView *pSSView, ivug_parameter *ivug_param)
207 MSG_HIGH("Load media list.");
209 IV_ASSERT(pSSView != NULL);
211 PERF_CHECK_BEGIN(LVL2, "create media list");
213 Media_List *mlist = ivug_medialist_create();
216 MSG_ERROR("Creating media list failed");
219 PERF_CHECK_END(LVL2, "create media list");
221 PERF_CHECK_BEGIN(LVL2, "create filter");
223 Filter_struct *filter = ivug_param_create_filter(ivug_param);
226 MSG_ERROR("Creating filter failed");
227 ivug_medialist_del(mlist);
231 PERF_CHECK_END(LVL2, "create filter");
233 Media_Item *current = NULL;
234 Media_Data *pData = NULL;
237 PERF_CHECK_BEGIN(LVL2, "media list load");
238 current = ivug_medialist_load(mlist, filter);
239 PERF_CHECK_END(LVL2, "media list load");
244 MSG_ERROR("Media list load failed");
245 goto LOAD_LIST_FAILED;
248 pData = ivug_medialist_get_data(current);
251 MSG_ERROR("current data is NULL");
252 goto LOAD_LIST_FAILED;
255 if(pData->fileurl == NULL)
257 MSG_ERROR("current fileurl is NULL");
258 goto LOAD_LIST_FAILED;
261 #ifdef USE_RESCAN_FILE_PATH_AT_LIST
262 if(strncmp(pData->fileurl, ivug_param->filepath, strlen(pData->fileurl)) != 0)
264 current = ivug_medialist_find_item_by_filename(mlist, ivug_param->filepath);
267 MSG_ERROR("Media list load failed, %s is not exist at list", ivug_param->filepath);
268 goto LOAD_LIST_FAILED;
273 if(ivug_param->view_by == IVUG_VIEW_BY_ALL)
275 pSSView->album_name = strdup(IDS_ALL_ALBUMS);
277 else if(ivug_param->view_by == IVUG_VIEW_BY_FOLDER)
280 media_handle m_handle = ivug_db_get_folder_handle(ecore_file_dir_get(ivug_param->filepath));
283 MSG_IVUG_FATAL("View by Folder. but media handle is NULL" );
287 pMainView->album_name = ivug_db_get_folder_name(m_handle);
289 pSSView->album_name = _ivug_get_folder_name(ivug_param->filepath);
290 if(pSSView->album_name == NULL)
292 pSSView->album_name = strdup(IDS_NO_NAME);
296 pSSView->mList = mlist;
297 PERF_CHECK_BEGIN(LVL2, "media list set");
299 pSSView->ss_curItem = current;
301 PERF_CHECK_END(LVL2, "media list set");
303 ivug_data_filter_delete(filter);
310 ivug_data_filter_delete(filter);
313 ivug_medialist_del(mlist);
315 pSSView->mList = NULL;
320 ivug_slideshow_view_create(Evas_Object* parent, ivug_mode mode, ivug_view_by view_by)
322 IV_ASSERT(parent != NULL);
324 MSG_HIGH("Creating slideshow view. Parent=0x%08x Mode=%d ViewBy=%d", parent, mode, view_by);
326 PERF_CHECK_BEGIN(LVL2, "Create layout");
328 //create main view layout
329 Ivug_SlideShowView *pSSView = (Ivug_SlideShowView *)calloc(1, sizeof(Ivug_SlideShowView) );
330 IV_ASSERT(pSSView != NULL);
333 pSSView->parent = parent;
334 pSSView->view_by = view_by;
337 layout = elm_layout_add(parent);
338 if ( layout == NULL) //if failed
340 MSG_ERROR("main layout create failed");
345 pSSView->layout = layout;
346 evas_object_name_set(pSSView->layout, "SlideShow Layout");
349 if (elm_layout_file_set(layout, IVUG_SS_EDJ, "ssview") == EINA_FALSE)
351 MSG_MAIN_ERROR("edj loading fail, file=%s group=%s", IVUG_SS_EDJ, IVUG_SS_EDJ);
352 evas_object_del(layout);
357 evas_object_event_callback_add(pSSView->layout, EVAS_CALLBACK_RESIZE, _on_resize, pSSView);
359 pSSView->keydown_handler = ecore_event_handler_add(ECORE_EVENT_KEY_DOWN, _on_key_down, (void *)pSSView);
361 MSG_HIGH("Main View Created");
368 ivug_slideshow_view_object_get(Ivug_SlideShowView *pSSView)
370 IV_ASSERT(pSSView != NULL);
372 return pSSView->layout;
377 ivug_slideshow_view_start(Ivug_SlideShowView *pSSView)
379 IV_ASSERT(pSSView != NULL);
381 MSG_HIGH("Slide show running");
383 Media_Item *current = pSSView->ss_curItem;
385 ivug_prohibit_lcd_off();
386 //ivug_main_view_hide_menu_bar(pMainView);
388 pSSView->ssHandle = ivug_ss_create(pSSView->layout);
391 evas_object_smart_callback_add(ivug_ss_object_get(pSSView->ssHandle), "slideshow,finished", _on_slideshow_finished, pSSView);
393 elm_win_indicator_mode_set((Evas_Object *)ug_get_window(), ELM_WIN_INDICATOR_HIDE);
395 ivug_ss_start(pSSView->ssHandle, current, pSSView->mList, EINA_FALSE);
402 ivug_slideshow_view_resume(Ivug_SlideShowView *pSSView)
404 IV_ASSERT(pSSView != NULL);
406 MSG_HIGH("Slideshow View Resumed");
408 Media_Item *mitem = pSSView->ss_curItem;
409 Media_Data *mdata = ivug_medialist_get_data(mitem);
411 IV_ASSERT(mdata != NULL);
413 if (mdata->slide_type == SLIDE_TYPE_IMAGE || mdata->slide_type == SLIDE_TYPE_VIDEO )
415 if(mdata->filepath && ecore_file_exists(mdata->filepath)) // Current file is not deleted
417 MSG_HIGH("Current filepath : %s", mdata->filepath);
421 /*if file is not exist ug terminated temporally */
422 MSG_ERROR("Center file is not exist. stype=%d name=%s", mdata->slide_type, mdata->filepath);
429 MSG_ERROR("Unhandled slide type : %d", mdata->slide_type);
435 ivug_slideshow_view_pause(Ivug_SlideShowView *pSSView)
437 IV_ASSERT(pSSView != NULL);
439 if ( pSSView->ssHandle )
441 ivug_ss_stop(pSSView->ssHandle);
444 // Stop photocam If AGIF
449 ivug_slideshow_view_destroy(Ivug_SlideShowView *pSSView)
451 IV_ASSERT(pSSView != NULL);
453 MSG_HIGH("ENTER : SlideShow View Destroy. pMainView=0x%08x", pSSView);
455 MSG_HIGH("Unregister system notifications");
456 if (pSSView->layout) {
457 evas_object_del(pSSView->layout);
458 pSSView->layout = NULL;
460 if(pSSView->keydown_handler)
462 ecore_event_handler_del(pSSView->keydown_handler);
463 pSSView->keydown_handler = NULL;
465 if(pSSView->homekey_idler)
467 ecore_idler_del(pSSView->homekey_idler);
468 pSSView->homekey_idler = NULL;
471 if ( pSSView->mList )
473 MSG_MAIN_HIGH("Remove media list");
474 ivug_medialist_del(pSSView->mList); // ivug_medialist_del() is not working on destroy cb.
475 pSSView->mList = NULL;
477 if(pSSView->album_name)
479 free(pSSView->album_name);
480 pSSView->album_name = NULL;
482 EFL::dump_obj(pSSView->parent, 0);
485 MSG_HIGH("LEAVE : SlideShow View Destroy.");