remove thumbnail show
[apps/core/preloaded/ug-image-viewer-efl.git] / main / src / slider / ivug-slider-item.cpp
1 /*
2  * Copyright 2012  Samsung Electronics Co., Ltd
3  *
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
7  *
8  *        http://www.tizenopensource.org/license
9  *
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.
15  */
16
17 #include "ivug-common.h"
18
19 #include "EFLUtil.h"
20
21 #include "ivug-slider-item.h"
22
23 #include "ivug-image.h"
24
25 #include "ivug-drm-common.h"
26
27 #include "ivug-config.h"
28
29 #define DEFAULT_THUMBNAIL_PATH                  IMAGE_PATH"/T01_Nocontents_broken.png"
30 #define DRM_NO_RIGHT_IMAGE_PATH                 IMAGE_PATH"/image_drm_no_rights.jpg"
31
32 #define IVUG_SLIDER_EDJ                                 EDJ_PATH"/ivug-slider.edj"
33
34 #define USE_VIDEO_THUMBNAIL
35
36
37 /*
38         Determine whether LIL(Large image layer) loads or not.
39
40         if define this feature, slider does not try to load image. only thumbnail is shown.
41 */
42 #undef DISABLE_LIL_LOADING
43
44 /*
45         Use elm_icon istead of elm_image. elm_icon preserve image ratio. and seems more faster.
46 */
47
48 static bool
49 _show_thumbnail( Slide_Item* si, const char *filepath)
50 {
51         IV_ASSERT(si != NULL);
52
53         if (si->thumbnail == NULL)
54         {
55                 MSG_SITEM_FATAL("slide item or thumbnail object is NULL");
56                 return false;
57         }
58
59         if ( filepath == NULL )
60         {
61                 MSG_SITEM_ERROR("thumbnail path is not exist");
62                 return false;
63         }
64
65         MSG_SITEM_MED("Set thumbnail : %s",  ivug_get_filename(filepath));
66
67         if (ivug_is_file_exist(filepath) == false )
68         {
69                 MSG_SITEM_ERROR("Cannot find thumbnail : %s", filepath);
70                 filepath = DEFAULT_THUMBNAIL_PATH;
71         }
72
73         if (elm_image_file_set(si->thumbnail, filepath, NULL) == EINA_FALSE)
74         {
75                 MSG_SITEM_ERROR("Cannot load thumbnail : %s", filepath);
76                 return false;
77         }
78
79         int iw, ih;
80
81         elm_image_object_size_get(si->thumbnail , &iw, &ih);
82
83         evas_object_repeat_events_set(si->thumbnail, EINA_FALSE);
84         edje_object_signal_emit(_EDJ(si->layout), "elm,state,show_thumbnail", "slider");
85
86         MSG_SITEM_HIGH("Set thumbnail(%dx%d). %s", iw, ih, ivug_get_filename(filepath));
87
88 #ifdef _DEBUG
89         int bx, by, bw, bh;
90         evas_object_geometry_get(si->layout, &bx, &by, &bw, &bh);
91
92         MSG_SITEM_MED("EDJE Geomtetry(%d,%d,%d,%d)", bx, by, bw, bh);
93 #endif
94
95         return true;
96 }
97
98 static bool
99 _hide_thumbnail(Slide_Item* si)
100 {
101         IV_ASSERT(si != NULL);
102
103         evas_object_repeat_events_set(si->thumbnail, EINA_TRUE);
104
105         edje_object_signal_emit(_EDJ(si->layout), "elm,state,hide_thumbnail", "slider");
106
107         return true;
108 }
109
110 static void _show_progressbar(Slide_Item *si)
111 {
112         IV_ASSERT(si != NULL);
113
114         if ( si->progress == NULL )
115         {
116                 //set progress
117                 PERF_CHECK_BEGIN(LVL6, "set progress");
118
119                 PERF_CHECK_BEGIN(LVL7, "elm_progressbar_add");
120                 si->progress = elm_progressbar_add(si->layout);
121                 PERF_CHECK_END(LVL7, "elm_progressbar_add");
122
123                 IV_ASSERT(si->progress != NULL);
124
125                 PERF_CHECK_BEGIN(LVL7, "set style");
126                 elm_object_style_set(si->progress, "list_process");
127                 PERF_CHECK_END(LVL7, "set style");
128
129                 PERF_CHECK_BEGIN(LVL7, "set pulse");
130                 elm_progressbar_pulse(si->progress, EINA_FALSE);
131                 PERF_CHECK_END(LVL7, "set pulse");
132
133                 PERF_CHECK_BEGIN(LVL7, "swallow progress");
134                 elm_object_part_content_set(si->layout, "slider.progress", si->progress);
135                 PERF_CHECK_END(LVL7, "swallow progress");
136
137                 PERF_CHECK_END(LVL6, "set progress");
138         }
139
140         elm_progressbar_pulse(si->progress, EINA_TRUE); //start pulse.
141
142         edje_object_signal_emit(_EDJ(si->layout), "elm,state,show,progress", "slider");
143 }
144
145 static void _hide_progressbar(Slide_Item *si)
146 {
147         IV_ASSERT(si != NULL);
148
149         if ( si->progress )
150         {
151                 elm_progressbar_pulse(si->progress, EINA_FALSE); //stop pulse.
152         }
153         edje_object_signal_emit(_EDJ(si->layout), "elm,state,hide,progress", "slider");
154 }
155
156
157 static void _show_videoicon(Slide_Item *si)
158 {
159         IV_ASSERT(si != NULL);
160
161         edje_object_signal_emit(_EDJ(si->layout), "elm,state,show_icon", "slider"); // Hide video play icon
162 }
163
164 static void _hide_videoicon(Slide_Item *si)
165 {
166         IV_ASSERT(si != NULL);
167
168         edje_object_signal_emit(_EDJ(si->layout), "elm,state,hide_icon", "slider"); // Hide video play icon
169
170 //      edje_object_signal_emit((si->layout), "elm,state,hide_icon", "slider"); // Hide video play icon
171 }
172
173 static sitem_type_t _get_sitem_type(Media_Type mtype)
174 {
175         switch(mtype)
176         {
177         case SLIDE_TYPE_IMAGE:
178                 return SITEM_TYPE_IMAGE;
179
180         case SLIDE_TYPE_VIDEO:
181                 return SITEM_TYPE_VIDEO;
182
183         case SLIDE_TYPE_NONE:
184         case SLIDE_TYPE_UNKNOWN:
185         default:
186                 return SITEM_TYPE_UNKNOWN;
187         }
188
189         return SITEM_TYPE_UNKNOWN;
190 }
191
192 static char *_get_file_name(Slide_Item* si)
193 {
194         Media_Data *mdata = ivug_medialist_get_data(si->mitem);
195
196         if ( mdata == NULL )
197         {
198                 return NULL;
199         }
200
201         return ivug_get_filename(mdata->filepath);
202 }
203
204
205 static bool _set_mitem(Slide_Item* si, Media_Item *item)
206 {
207         Media_Data *mdata = ivug_medialist_get_data(item);
208         IV_ASSERT(mdata != NULL);
209
210         si->mitem = item;
211
212         si->type = _get_sitem_type(mdata->slide_type);
213
214         if ( si->type == SITEM_TYPE_IMAGE )
215         {
216                 _hide_videoicon(si);
217                 elm_object_part_content_set(si->layout, "slider.contents", si->photocam);
218         }
219         else if ( si->type == SITEM_TYPE_VIDEO )
220         {
221                 elm_image_file_set(si->vIcon, EDJ_PATH"/ivug-icons.edj", "btn.video.play");
222                 _show_videoicon(si);
223         }
224         else
225         {
226                 MSG_SITEM_WARN("Unknown type : %s", ivug_get_filename(mdata->filepath));
227                 _hide_videoicon(si);
228         }
229
230         switch(mdata->slide_type)
231         {
232                 case SLIDE_TYPE_IMAGE:
233                         MSG_SITEM_HIGH("Set image. %s", ivug_get_filename(mdata->filepath));
234
235                         if(mdata->bIsDRMContent == EINA_FALSE)
236                         {
237                                 si->state = SLIDE_STATE_READY;
238                         }
239                         else
240                         {
241                                 si->state = SLIDE_STATE_DRM_CHECKING;
242                         }
243                 break;
244
245                 case SLIDE_TYPE_VIDEO:
246                         MSG_SITEM_HIGH("Set video. %s", ivug_get_filename(mdata->filepath));
247
248                         si->state = SLIDE_STATE_READY;  // Video dont need to load photocam
249                         break;
250
251                 case SLIDE_TYPE_UNKNOWN:
252                         MSG_SITEM_ERROR("Unknown image. %s", ivug_get_filename(mdata->filepath));
253
254                         si->state = SLIDE_STATE_ERROR;
255
256                         break;
257
258                 default:
259                         MSG_SITEM_ERROR("slide type invaild. Type=%d", mdata->slide_type);
260                         si->state = SLIDE_STATE_ERROR;
261                         return true;
262                         break;
263
264         }
265
266         return true;
267 }
268
269
270 static bool _unset_mitem(Slide_Item* si)
271 {
272 // Unswallow photocam
273         elm_object_part_content_unset(si->layout, "slider.contents");
274
275         switch(si->type)
276         {
277         case SITEM_TYPE_IMAGE:
278                 evas_object_hide(si->photocam);
279                 ivug_image_unset(si->photocam); //init photocam.
280                 break;
281         case SITEM_TYPE_VIDEO:
282                 break;
283         default:
284                 break;
285         }
286
287         si->state = SLIDE_STATE_NONE;
288
289 // Resetting GUI
290         _hide_progressbar(si);
291         _hide_thumbnail(si);
292         _hide_videoicon(si);
293
294         si->type = SITEM_TYPE_UNKNOWN;
295         si->mitem = NULL;
296
297         MSG_SITEM_HIGH("Slider Item is cleared.");
298
299         return true;
300 }
301
302
303
304 inline
305 void _call_user_callback(Slide_Item* si)
306 {
307         if ( si->cb )
308         {
309                 (si->cb)(si->state, si, si->client_data);
310         }
311 }
312
313
314 static void
315 _photocam_loaded_cb(void *data, Evas_Object *obj, void *event_info)
316 {
317         IV_ASSERT(data != NULL);
318
319         Slide_Item* si = static_cast<Slide_Item*>(data);
320
321 //hide progress.
322         _hide_progressbar(si);
323
324         if ( si->mitem == NULL)
325         {
326                 MSG_SITEM_ERROR("Debug Me! Data item is NULL.");
327                 return;
328         }
329
330         Media_Data* mdata = ivug_medialist_get_data(si->mitem);
331         if(mdata == NULL)
332         {
333                 MSG_SITEM_ERROR("ivug_medialist_get_data failed.");
334                 si->state = SLIDE_STATE_ERROR;
335                 return;
336         }
337
338         if ( si->state != SLIDE_STATE_LOADING )
339         {
340                 // can be STATE_ERROR, STATE_NO_RIGHT
341                 MSG_SITEM_ERROR("Invalid slide state. %s", ivug_get_filename(mdata->filepath));
342                 MSG_SITEM_ERROR("state=%d %s (%d,%d,%d,%d)", si->state, mdata->filepath, si->x, si->y, si->w, si->h);
343         }
344
345 #if 0
346         typedef enum _Evas_Load_Error
347         {
348            EVAS_LOAD_ERROR_NONE = 0, /**< No error on load */
349            EVAS_LOAD_ERROR_GENERIC = 1, /**< A non-specific error occurred */
350            EVAS_LOAD_ERROR_DOES_NOT_EXIST = 2, /**< File (or file path) does not exist */
351            EVAS_LOAD_ERROR_PERMISSION_DENIED = 3, /**< Permission deinied to an existing file (or path) */
352            EVAS_LOAD_ERROR_RESOURCE_ALLOCATION_FAILED = 4, /**< Allocation of resources failure prevented load */
353            EVAS_LOAD_ERROR_CORRUPT_FILE = 5, /**< File corrupt (but was detected as a known format) */
354            EVAS_LOAD_ERROR_UNKNOWN_FORMAT = 6 /**< File is not a known format */
355         } Evas_Load_Error; /**< Load error you can get from loading of files - see evas_load_error_str() too */
356 #endif
357
358         Evas_Load_Error error = static_cast<Evas_Load_Error>(reinterpret_cast<int>(event_info));
359 //      Evas_Load_Error error = evas_object_image_load_error_get(ivug_image_internal_image_get(si->photocam));
360
361         if ( error != EVAS_LOAD_ERROR_NONE )
362         {
363                 MSG_SITEM_ERROR("Image loading failed. Error=%d File=%s", error, mdata->filepath);
364                 si->state = SLIDE_STATE_ERROR;
365
366                 evas_object_hide(si->photocam);
367
368                 if ( error == EVAS_LOAD_ERROR_PERMISSION_DENIED)
369                 {
370                         _show_thumbnail(si, DRM_NO_RIGHT_IMAGE_PATH);
371                 }
372                 else
373                 {
374                         _show_thumbnail(si, DEFAULT_THUMBNAIL_PATH);
375                 }
376
377                 _call_user_callback(si);
378
379                 return ;
380         }
381
382         si->state = SLIDE_STATE_LOADED;
383
384         int w, h;
385
386         ivug_image_image_size_get(si->photocam, &w, &h);
387
388         if (mdata->slide_type == SLIDE_TYPE_VIDEO)      //if slide type is video,
389         {
390                 MSG_SITEM_FATAL("slide type is video. thumbnail image ");
391                 return;
392         }
393
394         evas_object_show(obj);  //photocam show.
395
396         _call_user_callback(si);
397
398         MSG_SITEM_HIGH("Photocam Pre-loaded. File=%s", ivug_get_filename(mdata->filepath));
399 }
400
401 static void _on_event_mouse_down(void *data, Evas *evas, Evas_Object *obj, void *event_info)
402 {
403         MSG_SITEM_HIGH("Event layer clicked : %s Layer=%d", evas_object_name_get(obj), evas_object_layer_get(obj));
404 }
405
406
407 Slide_Item*
408 ivug_slider_item_add(Evas_Object *slider)
409 {
410         Slide_Item* si = NULL;
411
412         PERF_CHECK_BEGIN(LVL6, "init variable");
413
414         //create item
415         si = (Slide_Item*)calloc(1, sizeof (Slide_Item));
416
417         if ( si == NULL )
418         {
419                 MSG_SITEM_FATAL("Cannot allocated memory : %d.", sizeof (Slide_Item));
420                 return NULL;
421         }
422
423         si->state = SLIDE_STATE_NONE;           //set slide state
424         si->type = SITEM_TYPE_UNKNOWN;
425
426         PERF_CHECK_END(LVL6, "init variable");
427
428 //Create the slider item layout
429         PERF_CHECK_BEGIN(LVL6, "create slider item layout");
430
431         Evas_Object *layout = EFL::create_layout(slider, IVUG_SLIDER_EDJ, "slider");
432         if(layout == NULL)
433         {
434                 MSG_SITEM_ERROR("Cannot load file : %s", IVUG_SLIDER_EDJ);
435                 free(si);
436                 return NULL;
437         }
438
439         evas_object_name_set(layout, "Slider item edj");
440         evas_object_event_callback_add(layout, EVAS_CALLBACK_MOUSE_DOWN, _on_event_mouse_down, NULL);
441
442         si->layout = layout;
443
444         PERF_CHECK_END(LVL6, "create slider item layout");
445
446 //set thumbnail.
447         PERF_CHECK_BEGIN(LVL6, "set thumbnail");
448
449         si->thumbnail = elm_icon_add(slider);
450         evas_object_name_set(si->thumbnail, "Thumbnail");
451         elm_image_resizable_set(si->thumbnail, EINA_TRUE, EINA_TRUE);
452         elm_image_preload_disabled_set(si->thumbnail, EINA_FALSE);
453
454         evas_object_event_callback_add(si->thumbnail, EVAS_CALLBACK_MOUSE_DOWN, _on_event_mouse_down, NULL);
455
456         elm_object_part_content_set(si->layout, "slider.thumbnail", si->thumbnail);
457
458         PERF_CHECK_END(LVL6, "set thumbnail");
459
460 //Add the photocam
461         PERF_CHECK_BEGIN(LVL6, "ivug_image_create");
462
463         si->photocam =  ivug_image_create(si->layout);
464         evas_object_name_set(si->photocam, "photocam");
465         evas_object_smart_callback_add(si->photocam, "loaded", _photocam_loaded_cb, si);
466
467         PERF_CHECK_END(LVL6, "ivug_image_create");
468
469         PERF_CHECK_BEGIN(LVL6, "video icon");
470
471 // z-order be decided along added order
472         si->vIcon = elm_icon_add(slider);
473         elm_image_file_set(si->vIcon, EDJ_PATH"/ivug-icons.edj", "btn.video.play");
474
475         evas_object_name_set(si->vIcon, "video icon");
476         evas_object_event_callback_add(si->vIcon, EVAS_CALLBACK_MOUSE_DOWN, _on_event_mouse_down, NULL);
477
478         elm_object_part_content_set(si->layout, "slider.icon", si->vIcon);
479         PERF_CHECK_END(LVL6, "video icon");
480
481         si->bMenuVisible = true;                // Default visibility is true
482
483         evas_object_smart_member_add(si->layout, slider);
484
485         int bx, by, bw, bh;
486         evas_object_geometry_get(si->layout, &bx, &by, &bw, &bh);
487
488         MSG_SITEM_HIGH("Creating sitem(0x%08x): (%d,%d,%d,%d)", si, bx, by, bw, bh);
489
490         return si;
491 }
492
493
494 void
495 ivug_slider_item_resize(Slide_Item* si, int w, int h)
496 {
497         IV_ASSERT(si != NULL );
498
499         if ( si->w == w && si->h == h ) return;
500         MSG_SITEM_HIGH("SLIDER Resize to XYWH(%d,%d,%d,%d)", si->x, si->y, w, h );
501
502 // w,h is not Image's scale, but Object's scale
503         si->w = w;
504         si->h = h;
505
506 //      MSG_SITEM_HIGH("resize layout: %d, %d", si->w, si->h);
507         evas_object_resize(si->layout, si->w, si->h);
508
509 }
510
511
512 void ivug_slider_item_move(Slide_Item* si, int x, int y)
513 {
514         IV_ASSERT(si != NULL );
515
516         MSG_SITEM_MED("SLIDER Move to XYWH(%d,%d,%d,%d)", x, y, si->w, si->h );
517
518         if ( si->x == x && si->y == y) return;
519
520         //photocam
521         si->x = x;
522         si->y = y;
523
524         if ( si->w == 0 || si->h == 0) return;
525
526         evas_object_move(si->layout, x, y);
527
528 // Center align
529 //      evas_object_move();
530 //      si->vIcon
531
532 }
533
534 void ivug_slider_item_del(Slide_Item* si)
535 {
536         IV_ASSERT(si != NULL );
537
538         MSG_SITEM_HIGH("Removing Slider Item");
539
540         ivug_slider_item_stop(si);
541
542         si->mitem = NULL;       // for error handling
543
544         if (si->photocam)
545         {
546                 evas_object_del(si->photocam);
547                 si->photocam = NULL;
548         }
549
550         if (si->thumbnail)
551         {
552                 evas_object_del(si->thumbnail);
553                 si->thumbnail = NULL;
554         }
555
556         if (si->progress)
557         {
558                 evas_object_del(si->progress);
559                 si->progress = NULL;
560         }
561
562         if(si->layout)
563         {
564                 evas_object_del(si->layout);
565                 si->layout = NULL;
566         }
567
568         if ( si->vIcon )
569         {
570                 evas_object_del(si->vIcon);
571                 si->vIcon = NULL;
572         }
573
574         free(si);
575
576         si = NULL;
577
578         MSG_SITEM_HIGH("Removed Slider Item");
579
580 }
581
582 void ivug_slider_item_hide(Slide_Item* si)
583 {
584         IV_ASSERT(si != NULL );
585
586         MSG_SITEM_HIGH("Hide slide item");
587         evas_object_hide(si->layout);
588 }
589
590
591 void ivug_slider_item_show(Slide_Item* si)
592 {
593         IV_ASSERT(si != NULL );
594
595         MSG_SITEM_HIGH("Show slide item");
596         evas_object_show(si->layout);
597 }
598
599
600 void
601 ivug_slider_item_clip_set(Slide_Item* si, Evas_Object *clipper)
602 {
603         IV_ASSERT(si != NULL );
604 // no need to check layout is NULL
605         int x, y, w, h;
606
607         evas_object_geometry_get(clipper, &x, &y, &w, &h);
608
609         MSG_SITEM_MED("SItem clip SET!! Geometry(%d,%d,%d,%d)", x, y, w, h);
610
611         evas_object_clip_set(si->layout, clipper);
612 //      evas_object_clip_set(si->photocam, clipper);
613 }
614
615 void
616 ivug_slider_item_clip_unset(Slide_Item* si)
617 {
618         IV_ASSERT(si != NULL );
619 // no need to check layout is NULL
620         evas_object_clip_unset(si->layout);
621 //      evas_object_clip_unset(si->photocam);
622 }
623
624 bool
625 ivug_slider_item_data_set(Slide_Item* si, Media_Item *item)
626 {
627         IV_ASSERT(si != NULL );
628
629         MSG_SITEM_HIGH("Data set. Item(0x%08x)", item);
630
631         if ( item == NULL )
632         {
633                 if ( si->state == SLIDE_STATE_NONE )
634                 {
635                         MSG_SITEM_WARN("Slide item is already cleared. just return. Mitem=0x%08x", si->mitem);
636                         return true;
637                 }
638
639                 MSG_SITEM_WARN("Set data NULL : %s", _get_file_name(si));
640                 _unset_mitem(si);
641         }
642         else
643         {
644                 if ( si->state != SLIDE_STATE_NONE )
645                 {
646                         MSG_SITEM_WARN("State is %d. Remove old : %s", si->state, _get_file_name(si));
647                         _unset_mitem(si);
648                 }
649
650                 _set_mitem(si, item);
651         }
652
653         return true;
654 }
655
656
657 #ifdef DISABLE_LIL_LOADING
658 Eina_Bool _signal_send_idler(void *data)
659 {
660         Slide_Item *si = (Slide_Item *)data;
661
662         _call_user_callback(si);
663
664         return EINA_FALSE;
665 }
666 #endif
667
668
669 // Ready to Loading
670 bool
671 ivug_slider_item_load(Slide_Item *si)
672 {
673         IV_ASSERT(si != NULL);
674
675         if (si->state != SLIDE_STATE_READY)
676         {
677                 MSG_SITEM_ERROR("Invalid state : %d", si->state);
678                 return false;
679         }
680
681         Media_Data *mdata = ivug_medialist_get_data(si->mitem);
682         IV_ASSERT(mdata != NULL);
683
684         if(mdata->filepath == NULL)
685         {
686                 MSG_SITEM_ERROR("file path is NULL");
687                 return false;
688         }
689
690         MSG_SITEM_HIGH("Load file. %s", ivug_get_filename(mdata->filepath));
691
692         char path[IVUG_MAX_FILE_PATH_LEN] = {0,};
693
694         {
695                 strncpy(path, mdata->filepath, sizeof(path));
696         }
697
698
699 #ifdef DISABLE_LIL_LOADING
700         // For debugging
701         si->state = SLIDE_STATE_LOADED;
702
703         ecore_idler_add(_signal_send_idler, si);
704
705         return true;
706 #endif
707
708         switch(mdata->slide_type)
709         {
710                 case SLIDE_TYPE_IMAGE:
711                 {
712                         si->state = SLIDE_STATE_LOADING;
713
714                         if (ivug_image_file_set(si->photocam, path, NULL) != EVAS_LOAD_ERROR_NONE)
715                         {
716                                 MSG_SITEM_ERROR("Failed photocam to set file file=%s", path);
717                                 si->state = SLIDE_STATE_ERROR;
718
719                                 _show_thumbnail(si, DEFAULT_THUMBNAIL_PATH);
720
721                                 _call_user_callback(si);
722                                 return false;
723                         }
724
725                         return true;
726
727                 }
728                 break;
729         case SLIDE_TYPE_VIDEO:
730                 {
731                         si->state = SLIDE_STATE_LOADED;
732                 }
733
734                 break;
735
736         default:
737                 MSG_SITEM_ERROR("slide type invaild. Type=%d", mdata->slide_type);
738                 return false;
739                 break;
740         }
741
742         return true;
743 }
744
745 void ivug_slider_item_play(Slide_Item* si)
746 {
747         IV_ASSERT(si != NULL );
748
749         Media_Data *mdata = ivug_medialist_get_data(si->mitem);
750         if(mdata == NULL)
751         {
752                 MSG_SITEM_ERROR("current data is NULL");
753                 return;
754         }
755
756         MSG_SITEM_HIGH("Start sitem. Type(%d) State(%d) %s", si->type, si->state, mdata->filepath);
757
758         if ( si->state != SLIDE_STATE_LOADED )
759         {
760                 MSG_SITEM_ERROR("Play. but state is %d", si->state);
761         }
762
763 // Start animation
764         if ( si->type == SITEM_TYPE_IMAGE )
765         {
766                 ivug_image_animated_set(si->photocam, EINA_TRUE);
767         }
768 }
769
770 void ivug_slider_item_stop(Slide_Item* si)
771 {
772         IV_ASSERT(si != NULL );
773
774         if ( si->state != SLIDE_STATE_LOADED )
775         {
776                 // When very first/last image and invalid
777                 return;
778         }
779
780         Media_Data *mdata = ivug_medialist_get_data(si->mitem);
781         MSG_SITEM_HIGH("Stop sitem. %s", mdata->filepath);
782
783         if (si->type == SITEM_TYPE_VIDEO)
784         {
785                 ;
786         }
787         else if ( si->type == SITEM_TYPE_IMAGE )
788         {
789                 ivug_image_animated_set(si->photocam, EINA_FALSE);
790         }
791 }
792
793
794 void ivug_slider_item_pause(Slide_Item* si)
795 {
796         IV_ASSERT(si != NULL );
797
798         if ( si->state != SLIDE_STATE_LOADED )
799         {
800                 // When very first/last image and invalid
801                 return;
802         }
803
804         Media_Data *mdata = ivug_medialist_get_data(si->mitem);
805         MSG_SITEM_HIGH("Pause sitem. %s", mdata->filepath);
806
807         if (si->type == SITEM_TYPE_VIDEO)
808         {
809                 // Reset state.
810         }
811         else if ( si->type == SITEM_TYPE_IMAGE )
812         {
813                 ivug_image_animated_set(si->photocam, EINA_FALSE);
814         }
815 }
816
817 void ivug_slider_item_resume(Slide_Item* si)
818 {
819         IV_ASSERT(si != NULL );
820
821         if ( si->state != SLIDE_STATE_LOADED )
822         {
823                 // When very first/last image and invalid
824                 return;
825         }
826
827         Media_Data *mdata = ivug_medialist_get_data(si->mitem);
828         MSG_SITEM_HIGH("Resume sitem. %s", mdata->filepath);
829
830         if (si->type == SITEM_TYPE_IMAGE)
831         {
832                 ivug_image_animated_set(si->photocam, EINA_TRUE);
833         }
834         else if (si->type == SITEM_TYPE_VIDEO)
835         {
836         }
837 }
838
839 bool
840 ivug_slider_item_set_callback(Slide_Item* si, OnSliderStateChanged cb, void *data)
841 {
842         IV_ASSERT(si != NULL );
843
844         si->cb = cb;
845         si->client_data = data;
846
847         return true;
848 }
849
850
851 const Media_Item *
852 ivug_slider_item_data_get(Slide_Item *si)
853 {
854         IV_ASSERT(si != NULL);
855
856         return si->mitem;
857 }
858
859 // Photocam
860 bool
861 ivug_slider_item_region_size_get(Slide_Item* si, int *x, int *y, int *w, int *h)
862 {
863         IV_ASSERT(si != NULL );
864
865         if ( si->mitem == NULL)
866         {
867                 MSG_SITEM_ERROR("Debug Me! Data item is NULL.");
868                 return false;
869         }
870
871         Media_Data *mdata = ivug_medialist_get_data(si->mitem);
872
873         if ( mdata == NULL )
874         {
875                 MSG_SITEM_ERROR("slide type is NULL. Item=0x%08x", si);
876                 return false;
877         }
878
879         switch(si->type)
880         {
881                 case SITEM_TYPE_IMAGE:
882                 {
883                         ivug_image_region_get(si->photocam, x, y, w, h);
884                 }
885                 break;
886
887                 case SITEM_TYPE_VIDEO:
888                 {
889                         {
890                                 return false;
891                         }
892                 }
893                 break;
894
895                 case SITEM_TYPE_UNKNOWN:
896                         return false;
897                 break;
898
899                 default:
900                         MSG_SITEM_ERROR("Unknwon type: %d", si->type);
901                         return false;
902                 break;
903         }
904
905         return true;
906 }
907
908
909
910 void
911 ivug_slider_item_hold_set(Slide_Item* si, Eina_Bool hold)
912 {
913         IV_ASSERT(si != NULL );
914
915         switch(si->type)
916         {
917                 case SITEM_TYPE_IMAGE:
918                 {
919                         ivug_image_hold_set(si->photocam, hold);
920                 }
921                 break;
922
923                 case SITEM_TYPE_VIDEO:
924                 {
925
926                 }
927                 break;
928
929                 case SITEM_TYPE_UNKNOWN:
930                 default:
931                         MSG_SITEM_ERROR("Unknwon type: %d", si->type);
932                 break;
933         }
934
935
936 }
937
938
939 void
940 ivug_slider_item_zoom_reset(Slide_Item* si, Eina_Bool bAnim, int center_x, int center_y)
941 {
942         IV_ASSERT(si != NULL );
943
944         switch(si->type)
945         {
946                 case SITEM_TYPE_IMAGE:
947                 {
948                         Evas_Point pt;
949
950                         pt.x = center_x;
951                         pt.y = center_y;
952
953                         ivug_image_zoom_reset(si->photocam, &pt);
954                 }
955                 break;
956
957                 case SITEM_TYPE_VIDEO:
958                 {
959
960                 }
961                 break;
962
963                 case SITEM_TYPE_UNKNOWN:
964                 break;
965
966                 default:
967                         MSG_SITEM_ERROR("Unknwon type: %d", si->type);
968                         break;
969
970         }
971
972 }
973
974
975 void
976 ivug_slider_item_zoom_set(Slide_Item* si, double zoom, int center_x, int center_y)
977 {
978         IV_ASSERT(si != NULL );
979
980         switch(si->type)
981         {
982                 case SITEM_TYPE_IMAGE:
983                 {
984                         Evas_Point Center;
985
986                         Center.x = center_x;
987                         Center.y = center_y;
988                         ivug_image_zoom_set(si->photocam, zoom, &Center);
989
990                 }
991                 break;
992
993                 case SITEM_TYPE_VIDEO:
994                 break;
995
996                 case SITEM_TYPE_UNKNOWN:
997                 break;
998
999                 default:
1000                         MSG_SITEM_ERROR("Unknwon type: %d", si->type);
1001                         break;
1002
1003         }
1004
1005 }
1006
1007 double
1008 ivug_slider_item_zoom_get(Slide_Item* si)
1009 {
1010         IV_ASSERT(si != NULL );
1011
1012         double ret = 1.0;
1013
1014         switch(si->type)
1015         {
1016                 case SITEM_TYPE_IMAGE:
1017                 {
1018                         ret = ivug_image_zoom_get(si->photocam);
1019                 }
1020                 break;
1021
1022                 case SITEM_TYPE_VIDEO:
1023                 break;
1024
1025                 case SITEM_TYPE_UNKNOWN:
1026                 break;
1027
1028                 default:
1029                         MSG_SITEM_ERROR("Unknwon type: %d", si->type);
1030                         break;
1031
1032         }
1033
1034
1035         return ret;
1036 }
1037
1038
1039 bool
1040 ivug_slider_item_icon_click_check(Slide_Item *si, int x, int y)
1041 {
1042         MSG_SITEM_HIGH("Check play icon clicked. SI=0x%08x, XY(%d,%d)", si, x, y);
1043
1044         IV_ASSERT(si != NULL );
1045
1046         Media_Data *mdata = ivug_medialist_get_data(si->mitem);
1047
1048         if ( mdata == NULL )
1049         {
1050                 MSG_SITEM_ERROR("Debug Me! Data item is NULL.");
1051                 return false;
1052         }
1053
1054         if ( mdata->slide_type == SLIDE_TYPE_VIDEO )
1055         {
1056                 if (si->vIcon)
1057                 {
1058                         Evas_Coord ix,iy,iw,ih;
1059
1060                         evas_object_geometry_get(si->vIcon, &ix, &iy, &iw, &ih);
1061
1062                         bool bInside =  !(  (x) > (ix + iw) || (x) < (ix)
1063                                                                 || (y) > (iy + iw) || (y) < (iy) );
1064
1065                         MSG_SITEM_HIGH("Item XYWH(%d,%d,%d,%d) XY(%d,%d) bInside=%d", ix,iy,iw,ih, x, y, bInside);
1066
1067                         return bInside;
1068                 }
1069         }
1070
1071         MSG_SITEM_HIGH("Slide type = %d", mdata->slide_type);
1072         return false;
1073 }
1074
1075 drm_data_t * ivug_slider_item_check_drm_constraint(Slide_Item *si)
1076 {
1077         IV_ASSERT(si != NULL);
1078
1079         Media_Data *mdata = ivug_medialist_get_data(si->mitem);
1080         if(mdata == NULL)
1081         {
1082                 MSG_SLIDER_ERROR("mdata is NULL");
1083                 return NULL;
1084         }
1085
1086         if(mdata->bIsDRMContent == EINA_FALSE)
1087         {
1088                 MSG_SITEM_HIGH("It is not DRM file, path = %s", mdata->filepath);
1089                 return NULL;
1090         }
1091
1092         MSG_SITEM_HIGH("before check valid");
1093         if(ivug_drm_has_valid_ro(mdata->filepath) == 0)
1094         {
1095                 MSG_SITEM_HIGH("RO is invalid, path = %s", mdata->filepath);
1096                 si->state = SLIDE_STATE_ERROR;
1097                 _show_thumbnail(si, DRM_NO_RIGHT_IMAGE_PATH);
1098                 evas_object_smart_callback_call(si->photocam, "loaded", (void *)EVAS_LOAD_ERROR_PERMISSION_DENIED);
1099                 //for lauch WAP purchase page
1100                 drm_data_t *result = (drm_data_t *)calloc(1, sizeof(drm_data_t));
1101                 result->constraints = IVUG_DRM_RESULT_LIMITED;
1102                 result->data = -1;
1103                 return result;
1104         }
1105         MSG_SITEM_HIGH("RO is valid, path = %s", mdata->filepath);
1106
1107         return ivug_drm_check_constraint(mdata->filepath);
1108 }
1109
1110
1111
1112 bool
1113 ivug_slider_item_image_rotate_set(Slide_Item *si, int angle)
1114 {
1115         IV_ASSERT(si != NULL);
1116
1117         ivug_image_rotate_set(si->photocam, ( (ivug_image_rotate_get(si->photocam) - angle) % 360 ));
1118
1119         return true;
1120 }
1121
1122
1123 // Video specific APIs
1124
1125 void ivug_slider_item_video_play(Slide_Item* si)
1126 {
1127         IV_ASSERT(si != NULL );
1128
1129         MSG_SITEM_HIGH("Start Video play");
1130
1131         if (si->type == SITEM_TYPE_VIDEO)
1132         {
1133
1134         }
1135
1136 }
1137
1138
1139 void ivug_slider_item_video_pause(Slide_Item* si)
1140 {
1141         IV_ASSERT(si != NULL );
1142
1143         MSG_SITEM_HIGH("Pause Video play");
1144
1145         if (si->type == SITEM_TYPE_VIDEO)
1146         {
1147
1148         }
1149 }
1150
1151 void ivug_slider_item_hide_menu(Slide_Item* si)
1152 {
1153         IV_ASSERT(si != NULL );
1154
1155         MSG_SITEM_HIGH("Hide menu");
1156
1157         si->bMenuVisible = false;
1158
1159 // Item is video and state is playing then hide paused icon
1160         if (si->type == SITEM_TYPE_VIDEO)
1161         {
1162                 _hide_videoicon(si);
1163         }
1164
1165 }
1166
1167
1168 void ivug_slider_item_show_menu(Slide_Item* si)
1169 {
1170         IV_ASSERT(si != NULL );
1171
1172         MSG_SITEM_HIGH("Show menu");
1173
1174         si->bMenuVisible = true;
1175
1176 // Item is video and state is pause then show paused icon
1177         if (si->type == SITEM_TYPE_VIDEO)
1178         {
1179                 _show_videoicon(si);
1180         }
1181 }
1182
1183 Evas_Object *
1184 ivug_slider_item_image_get(Slide_Item* si)
1185 {
1186         IV_ASSERT(si != NULL );
1187
1188         if ( (si->type == SITEM_TYPE_IMAGE) && (si->state == SLIDE_STATE_LOADED) )
1189         {
1190                 return ivug_image_internal_image_get(si->photocam);
1191         }
1192
1193         return NULL;
1194
1195 }
1196
1197
1198 void ivug_slider_item_image_size_get(Slide_Item* si, int *w, int *h)
1199 {
1200         IV_ASSERT(si != NULL );
1201
1202         if ( (si->type == SITEM_TYPE_IMAGE) && (si->state == SLIDE_STATE_LOADED) )
1203         {
1204                 ivug_image_image_size_get(si->photocam, w, h);
1205         }
1206 }
1207
1208