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