2 * Copyright (c) 2014 Samsung Electronics Co., Ltd All Rights Reserved
4 * Licensed under the Apache License, Version 2.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.apache.org/licenses/LICENSE-2.0
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 <Elementary.h>
19 #include <efl_extension.h>
20 #include <AppCommon.h>
23 #include <InputHandler.h>
24 #include <media_content.h>
28 #include "playermgr.h"
29 #include "timeout_handler.h"
30 #include "mediadata.h"
34 #include "view_player.h"
36 #define BTN_ID "BTN_ID"
38 #define TEXT_NODATE N_("----.--.--")
40 #define SOURCE_PATH_LEN 6
41 #define SOURCE_TV_PATH "/home/"
42 #define SOURCE_TV N_("TV")
43 #define SOURCE_USB N_("USB")
45 #define CONTROL_BTNS 6
47 static const char *_control_name[] = {
56 typedef void (*btn_event_cb)(void *dt);
65 CVideoController *control;
67 CMediaData *mediadata;
69 timeout_handler *timeout_handle;
72 Ecore_Timer *drawanim_timer;
93 void CPlayerView::m_UpdateInfoBar(void)
103 name = m->mediadata->GetName();
105 elm_object_part_text_set(m->base, PART_TITLETEXT, name);
108 video_time = m->mediadata->GetTime();
110 if (video_time > 0) {
111 localtime_r(&video_time, &tm);
112 strftime(buf, sizeof(buf), "%Y.%m.%d", &tm);
114 snprintf(buf, sizeof(buf), "%s", _(TEXT_NODATE));
117 elm_object_part_text_set(m->base, PART_DATETEXT, buf);
120 /* FIXME: when usb path is decided, this logic should be changed */
121 path = m->mediadata->GetPath();
122 if (!strncmp(path, SOURCE_TV_PATH, SOURCE_PATH_LEN))
126 elm_object_part_text_set(m->base, PART_SOURCETEXT, _(source));
129 snprintf(buf, sizeof(buf), "%d/%d",
130 m->player->GetCurrent() + 1, m->player->GetTotal());
131 elm_object_part_text_set(m->base, PART_CURRENTTEXT, buf);
134 snprintf(buf, sizeof(buf), "%dx%d", m->mediadata->GetWidth(),
135 m->mediadata->GetHeight());
137 m->duration = m->mediadata->GetDuration();
138 m->position = m->mediadata->GetPosition();
140 elm_object_part_text_set(m->base, PART_RESOLUTIONTEXT, buf);
143 bool CPlayerView::m_PlayerInit(void)
148 r = m->player->Play();
150 path = m->player->GetPath();
152 r = m->mediadata->Create(path);
155 m->mediadata->Destroy();
158 m->slider->Reset(m->duration, m->position);
159 m->control->Signal(E_PLAYPAUSE_BTN, SIG_SET_PAUSE, "");
163 timeout_handler_reset(m->timeout_handle);
169 void CPlayerView::sm_EvtRewindBtn(void *dt)
177 data = (SPlayerView *)dt;
179 r = data->player->SetRew(data->duration);
182 data->slider->Pause();
183 data->control->Signal(E_PLAYPAUSE_BTN, SIG_SET_PLAY, "");
187 void CPlayerView::sm_EvtForwardBtn(void *dt)
195 data = (SPlayerView *)dt;
197 r = data->player->SetFF(data->duration);
200 data->slider->Pause();
201 data->control->Signal(E_PLAYPAUSE_BTN, SIG_SET_PLAY, "");
205 void CPlayerView::sm_EvtPrevBtn(void *dt)
208 update_action action;
213 data = (SPlayerView *)dt;
215 data->player->StopFFRew();
216 data->player->Prev();
218 action = ACTION_INIT;
219 CViewMgr::GetInstance()->UpdateView(data->id, (void *)&action);
222 void CPlayerView::sm_EvtNextBtn(void *dt)
225 update_action action;
230 data = (SPlayerView *)dt;
232 data->player->StopFFRew();
233 data->player->Next(true);
235 action = ACTION_INIT;
236 CViewMgr::GetInstance()->UpdateView(data->id, (void *)&action);
239 void CPlayerView::sm_EvtReapeatBtn(void *dt)
246 data = (SPlayerView *)dt;
248 switch (data->repeat) {
250 data->repeat = E_REPEAT_ONE;
253 data->repeat = E_REPEAT_NONE;
256 data->repeat = E_REPEAT_ALL;
263 void CPlayerView::sm_EvtPlayBtn(void *dt)
266 player_state_e state;
272 data = (SPlayerView *)dt;
274 if (data->player->GetFFRew()) {
275 data->player->StopFFRew();
276 data->player->Resume();
277 data->slider->Resume();
281 r = data->player->GetState(&state);
286 case PLAYER_STATE_PLAYING:
287 data->player->Pause();
288 data->slider->Pause();
291 case PLAYER_STATE_PAUSED:
292 data->player->Resume();
293 data->slider->Resume();
300 void CPlayerView::sm_EvtControlBtn(void *dt, const char *ev)
303 btn_event_cb cbs[] = {
316 data = (SPlayerView *)dt;
318 for (i = 0; i < CONTROL_BTNS; i++) {
319 if (!strcmp(_control_name[i], ev))
324 void CPlayerView::sm_CbPlayComplete(void *dt)
327 update_action action;
333 data = (SPlayerView *)dt;
336 if (data->repeat != E_REPEAT_ONE)
337 r = data->player->Next(!data->repeat);
344 action = ACTION_INIT;
345 CViewMgr::GetInstance()->UpdateView(data->id, (void *)&action);
348 void CPlayerView::sm_CbShowViewFinish(void *dt, Evas_Object *obj,
349 const char *emission, const char *source)
356 data = (SPlayerView *)dt;
358 data->control->Show();
361 void CPlayerView::m_ShowBar(void)
366 elm_object_signal_emit(m->base, SIG_SHOW_VIEW, "");
367 m->bar_hidden = false;
372 void CPlayerView::m_HideBar(void)
374 elm_object_signal_emit(m->base, SIG_HIDE_VIEW, "");
375 m->bar_hidden = true;
381 void CPlayerView::sm_CbTimeoutEvent(void *dt, int type, void *ev)
384 update_action action;
389 data = (SPlayerView *)dt;
391 action = ACTION_HIDE;
392 CViewMgr::GetInstance()->UpdateView(data->id, (void *)&action);
395 void CPlayerView::sm_EvtBack(void *dt, Evas_Object *obj, void *ev)
402 data = (SPlayerView *)dt;
404 if (data->bar_hidden) {
405 update_action action;
407 action = ACTION_SHOW;
408 CViewMgr::GetInstance()->UpdateView(data->id, (void *)&action);
414 void CPlayerView::sm_EvtVolume(SPlayerView *data, int val)
416 if (!data->bar_hidden) {
417 update_action action;
419 action = ACTION_HIDE;
420 CViewMgr::GetInstance()->UpdateView(data->id, (void *)&action);
423 data->volume->Show((volume_val)val);
426 void CPlayerView::sm_CbEcoreEvent(void *dt, int type, void *ei)
434 data = (SPlayerView *)dt;
437 if (type == ECORE_EVENT_KEY_UP) {
438 Evas_Event_Key_Up *ev;
440 ev = (Evas_Event_Key_Up *)ei;
444 if (!strcmp(ev->keyname, KEY_VOLUMEUP) ||
445 !strcmp(ev->keyname, KEY_VOLUMEUP_REMOTE))
446 sm_EvtVolume(data, E_VOLUME_UP);
447 else if (!strcmp(ev->keyname, KEY_VOLUMEDOWN) ||
448 !strcmp(ev->keyname, KEY_VOLUMEDOWN_REMOTE))
449 sm_EvtVolume(data, E_VOLUME_DOWN);
450 else if (!strcmp(ev->keyname, KEY_MUTE) ||
451 !strcmp(ev->keyname, KEY_MUTE_REMOTE))
452 sm_EvtVolume(data, E_VOLUME_MUTE);
455 } else if (type == ECORE_EVENT_MOUSE_MOVE) {
460 update_action action;
462 action = ACTION_SHOW;
463 CViewMgr::GetInstance()->UpdateView(data->id, (void *)&action);
467 bool CPlayerView::m_AddControls(void)
469 if (!m->control->Create(m->base, _control_name, CONTROL_BTNS))
472 m->repeat = E_REPEAT_ALL;
474 m->control->AddHandler(sm_EvtControlBtn, m);
476 if (!m->slider->Create(m->base, m->player)) {
477 m->control->Destroy();
481 if (!m->volume->Create(m->win)) {
482 m->control->Destroy();
483 m->slider->Destroy();
487 m->timeout_handle = timeout_handler_init(TIMEOUT_VIDEOPLAYER,
488 sm_CbTimeoutEvent, m, sm_CbEcoreEvent, m);
489 if (!m->timeout_handle) {
490 m->control->Destroy();
491 m->slider->Destroy();
492 m->volume->Destroy();
496 eext_object_event_callback_add(m->base,
497 EEXT_CALLBACK_BACK, sm_EvtBack, m);
502 Eina_Bool CPlayerView::sm_CbDrawAnimation(void *dt)
507 return ECORE_CALLBACK_CANCEL;
509 data = (SPlayerView *)dt;
511 elm_object_signal_emit(data->base, SIG_SHOW_VIEW, "");
512 data->control->Focus(E_PLAYPAUSE_BTN, EINA_TRUE);
514 data->drawanim_timer = NULL;
516 return ECORE_CALLBACK_CANCEL;
519 bool CPlayerView::m_ControlInit(SPlayerParam *param)
521 m->mediadata = new CMediaData;
523 _ERR("mediadata init failed");
528 m->id = strdup(param->id);
530 m->player = new CPlayer;
532 _ERR("player init failed");
536 m->control = new CVideoController;
538 _ERR("control init failed");
542 m->volume = new CVolume;
544 _ERR("volume init failed");
548 m->slider = new CVideoSlider;
550 _ERR("slider init failed");
557 bool CPlayerView::m_UiInit(void)
561 base = elm_layout_add(m->win);
563 _ERR("failed to add layout");
569 if (!elm_layout_file_set(base, EDJEFILE, GRP_VIDEO_PLAYER)) {
570 _ERR("failed to layout file set");
574 if (!m_AddControls()) {
575 _ERR("failed to add controls");
579 evas_object_size_hint_weight_set(base,
580 EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
582 elm_win_resize_object_add(m->win, base);
584 evas_object_show(base);
586 elm_object_focus_allow_set(base, EINA_FALSE);
591 bool CPlayerView::Create(void *data)
600 win = CViewMgr::GetInstance()->Window();
605 _ERR("alloc failed");
615 m->timeout_handle = NULL;
616 m->drawanim_timer = NULL;
618 param = (SPlayerParam *)data;
620 r = m_ControlInit(param);
622 _ERR("failed to init Controls");
628 _ERR("failed to init UI");
632 r = m->player->Create(m->win, param->filepath, param->playlist);
634 _ERR("player creation failed");
640 _ERR("failed to play video");
644 m->player->SetCompletedCb(sm_CbPlayComplete, m);
646 elm_object_signal_callback_add(m->base, "show,view,finish", "",
647 sm_CbShowViewFinish, m);
649 m->drawanim_timer = ecore_timer_add(0.8, sm_CbDrawAnimation, m);
650 if (!m->drawanim_timer) {
651 _ERR("failed to add draw timer");
655 CBaseView::Create(NULL);
660 m->player->Destroy();
662 m->control->Destroy();
663 m->slider->Destroy();
664 m->volume->Destroy();
670 void CPlayerView::m_Fini(void)
672 ecore_timer_del(m->drawanim_timer);
676 timeout_handler_fini(m->timeout_handle);
689 void CPlayerView::Destroy(void)
693 CBaseView::Destroy();
695 m->player->Destroy();
696 m->volume->Destroy();
697 m->control->Destroy();
698 m->slider->Destroy();
703 Evas_Object *CPlayerView::Base(void)
710 void CPlayerView::t_OnShow(void)
714 evas_object_show(m->base);
717 void CPlayerView::t_OnPause(void)
722 void CPlayerView::t_OnUpdate(void *dt)
724 update_action *action;
729 action = (update_action *)dt;
741 m->control->Signal(E_PLAYPAUSE_BTN, SIG_SET_PAUSE, "");
742 timeout_handler_reset(m->timeout_handle);
747 m->control->Signal(E_PLAYPAUSE_BTN, SIG_SET_PLAY, "");
748 timeout_handler_reset(m->timeout_handle);