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();
123 if (!strncmp(path, SOURCE_TV_PATH, SOURCE_PATH_LEN))
127 elm_object_part_text_set(m->base, PART_SOURCETEXT, _(source));
131 snprintf(buf, sizeof(buf), "%d/%d",
132 m->player->GetCurrent() + 1, m->player->GetTotal());
133 elm_object_part_text_set(m->base, PART_CURRENTTEXT, buf);
136 snprintf(buf, sizeof(buf), "%dx%d", m->mediadata->GetWidth(),
137 m->mediadata->GetHeight());
139 m->duration = m->mediadata->GetDuration();
140 m->position = m->mediadata->GetPosition();
142 elm_object_part_text_set(m->base, PART_RESOLUTIONTEXT, buf);
145 bool CPlayerView::m_PlayerInit(void)
150 r = m->player->Play();
154 path = m->player->GetPath();
156 r = m->mediadata->Create(path);
159 m->mediadata->Destroy();
162 m->slider->Reset(m->duration, m->position);
163 m->control->Signal(E_PLAYPAUSE_BTN, SIG_SET_PAUSE, "");
167 timeout_handler_reset(m->timeout_handle);
173 void CPlayerView::sm_EvtRewindBtn(void *dt)
181 data = (SPlayerView *)dt;
183 r = data->player->SetRew(data->duration);
186 data->slider->Pause();
187 data->control->Signal(E_PLAYPAUSE_BTN, SIG_SET_PLAY, "");
191 void CPlayerView::sm_EvtForwardBtn(void *dt)
199 data = (SPlayerView *)dt;
201 r = data->player->SetFF(data->duration);
204 data->slider->Pause();
205 data->control->Signal(E_PLAYPAUSE_BTN, SIG_SET_PLAY, "");
209 void CPlayerView::sm_EvtPrevBtn(void *dt)
212 update_action action;
217 data = (SPlayerView *)dt;
219 data->player->StopFFRew();
220 data->player->Prev();
222 action = ACTION_INIT;
223 CViewMgr::GetInstance()->UpdateView(data->id, (void *)&action);
226 void CPlayerView::sm_EvtNextBtn(void *dt)
229 update_action action;
234 data = (SPlayerView *)dt;
236 data->player->StopFFRew();
237 data->player->Next(true);
239 action = ACTION_INIT;
240 CViewMgr::GetInstance()->UpdateView(data->id, (void *)&action);
243 void CPlayerView::sm_EvtReapeatBtn(void *dt)
250 data = (SPlayerView *)dt;
252 switch (data->repeat) {
254 data->repeat = E_REPEAT_ONE;
257 data->repeat = E_REPEAT_NONE;
260 data->repeat = E_REPEAT_ALL;
267 void CPlayerView::sm_EvtPlayBtn(void *dt)
270 player_state_e state;
276 data = (SPlayerView *)dt;
278 if (data->player->GetFFRew()) {
279 data->player->StopFFRew();
280 data->player->Resume();
281 data->slider->Resume();
285 r = data->player->GetState(&state);
290 case PLAYER_STATE_PLAYING:
291 data->player->Pause();
292 data->slider->Pause();
295 case PLAYER_STATE_PAUSED:
296 data->player->Resume();
297 data->slider->Resume();
304 void CPlayerView::sm_EvtControlBtn(void *dt, const char *ev)
307 btn_event_cb cbs[] = {
320 data = (SPlayerView *)dt;
322 for (i = 0; i < CONTROL_BTNS; i++) {
323 if (!strcmp(_control_name[i], ev))
328 void CPlayerView::sm_CbPlayComplete(void *dt)
331 update_action action;
337 data = (SPlayerView *)dt;
340 if (data->repeat != E_REPEAT_ONE)
341 r = data->player->Next(!data->repeat);
348 action = ACTION_INIT;
349 CViewMgr::GetInstance()->UpdateView(data->id, (void *)&action);
352 void CPlayerView::sm_CbShowViewFinish(void *dt, Evas_Object *obj,
353 const char *emission, const char *source)
360 data = (SPlayerView *)dt;
362 data->control->Show();
365 void CPlayerView::m_ShowBar(void)
370 elm_object_signal_emit(m->base, SIG_SHOW_VIEW, "");
371 m->bar_hidden = false;
376 void CPlayerView::m_HideBar(void)
378 elm_object_signal_emit(m->base, SIG_HIDE_VIEW, "");
379 m->bar_hidden = true;
385 void CPlayerView::sm_CbTimeoutEvent(void *dt, int type, void *ev)
388 update_action action;
393 data = (SPlayerView *)dt;
395 action = ACTION_HIDE;
396 CViewMgr::GetInstance()->UpdateView(data->id, (void *)&action);
399 void CPlayerView::sm_EvtBack(void *dt, Evas_Object *obj, void *ev)
406 data = (SPlayerView *)dt;
408 if (data->bar_hidden) {
409 update_action action;
411 action = ACTION_SHOW;
412 CViewMgr::GetInstance()->UpdateView(data->id, (void *)&action);
418 void CPlayerView::sm_EvtVolume(SPlayerView *data, int val)
420 if (!data->bar_hidden) {
421 update_action action;
423 action = ACTION_HIDE;
424 CViewMgr::GetInstance()->UpdateView(data->id, (void *)&action);
427 data->volume->Show((volume_val)val);
430 void CPlayerView::sm_CbEcoreEvent(void *dt, int type, void *ei)
438 data = (SPlayerView *)dt;
441 if (type == ECORE_EVENT_KEY_UP) {
442 Evas_Event_Key_Up *ev;
444 ev = (Evas_Event_Key_Up *)ei;
448 if (!strcmp(ev->keyname, KEY_VOLUMEUP) ||
449 !strcmp(ev->keyname, KEY_VOLUMEUP_REMOTE))
450 sm_EvtVolume(data, E_VOLUME_UP);
451 else if (!strcmp(ev->keyname, KEY_VOLUMEDOWN) ||
452 !strcmp(ev->keyname, KEY_VOLUMEDOWN_REMOTE))
453 sm_EvtVolume(data, E_VOLUME_DOWN);
454 else if (!strcmp(ev->keyname, KEY_MUTE) ||
455 !strcmp(ev->keyname, KEY_MUTE_REMOTE))
456 sm_EvtVolume(data, E_VOLUME_MUTE);
459 } else if (type == ECORE_EVENT_MOUSE_MOVE) {
464 update_action action;
466 action = ACTION_SHOW;
467 CViewMgr::GetInstance()->UpdateView(data->id, (void *)&action);
471 bool CPlayerView::m_AddControls(void)
473 if (!m->control->Create(m->base, _control_name, CONTROL_BTNS))
476 m->repeat = E_REPEAT_ALL;
478 m->control->AddHandler(sm_EvtControlBtn, m);
480 if (!m->slider->Create(m->base, m->player))
483 if (!m->volume->Create(m->win))
486 m->timeout_handle = timeout_handler_init(TIMEOUT_VIDEOPLAYER,
487 sm_CbTimeoutEvent, m, sm_CbEcoreEvent, m);
489 eext_object_event_callback_add(m->base,
490 EEXT_CALLBACK_BACK, sm_EvtBack, m);
492 if (!m->timeout_handle)
498 Eina_Bool CPlayerView::sm_CbDrawAnimation(void *dt)
503 return ECORE_CALLBACK_CANCEL;
505 data = (SPlayerView *)dt;
507 elm_object_signal_emit(data->base, SIG_SHOW_VIEW, "");
508 data->control->Focus(E_PLAYPAUSE_BTN, EINA_TRUE);
510 data->drawanim_timer = NULL;
512 return ECORE_CALLBACK_CANCEL;
515 void CPlayerView::m_ControlInit(SPlayerParam *param)
519 m->mediadata = new CMediaData;
521 _ERR("mediadata init failed");
524 m->id = strdup(param->id);
526 m->player = new CPlayer;
528 _ERR("player init failed");
530 r = m->player->Create(m->win, param->filepath, param->playlist);
532 _ERR("player creation failed");
534 m->control = new CVideoController;
536 _ERR("control init failed");
538 m->volume = new CVolume;
540 _ERR("volume init failed");
542 m->slider = new CVideoSlider;
544 _ERR("slider init failed");
547 bool CPlayerView::m_UiInit(void)
551 base = elm_layout_add(m->win);
553 _ERR("failed to add layout");
559 if (!elm_layout_file_set(base, EDJEFILE, GRP_VIDEO_PLAYER)) {
560 _ERR("failed to layout file set");
564 if (!m_AddControls()) {
565 _ERR("failed to add controls");
569 evas_object_size_hint_weight_set(base,
570 EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
572 elm_win_resize_object_add(m->win, base);
574 evas_object_show(base);
576 elm_object_focus_allow_set(base, EINA_FALSE);
581 bool CPlayerView::Create(void *data)
589 win = CViewMgr::GetInstance()->Window();
594 _ERR("alloc failed");
600 m_ControlInit((SPlayerParam *)data);
604 _ERR("failed to init UI");
608 if (!m_PlayerInit()) {
609 _ERR("failed to play video");
613 m->player->SetCompletedCb(sm_CbPlayComplete, m);
615 elm_object_signal_callback_add(m->base, "show,view,finish", "",
616 sm_CbShowViewFinish, m);
618 m->drawanim_timer = ecore_timer_add(0.8, sm_CbDrawAnimation, m);
619 if (!m->drawanim_timer) {
620 _ERR("failed to add draw timer");
624 CBaseView::Create(NULL);
633 void CPlayerView::m_Fini(void)
635 ecore_timer_del(m->drawanim_timer);
636 m->drawanim_timer = NULL;
641 m->player->Destroy();
645 timeout_handler_fini(m->timeout_handle);
646 m->timeout_handle = NULL;
651 m->volume->Destroy();
655 m->control->Destroy();
659 m->slider->Destroy();
667 void CPlayerView::Destroy(void)
671 CBaseView::Destroy();
676 Evas_Object *CPlayerView::Base(void)
683 void CPlayerView::t_OnShow(void)
687 evas_object_show(m->base);
690 void CPlayerView::t_OnPause(void)
695 void CPlayerView::t_OnUpdate(void *dt)
697 update_action *action;
702 action = (update_action *)dt;
714 m->control->Signal(E_PLAYPAUSE_BTN, SIG_SET_PAUSE, "");
715 timeout_handler_reset(m->timeout_handle);
720 m->control->Signal(E_PLAYPAUSE_BTN, SIG_SET_PLAY, "");
721 timeout_handler_reset(m->timeout_handle);