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 7
48 #define KEY_VOLUMEUP_REMOTE "XF86AudioRaiseVolume"
49 #define KEY_VOLUMEDOWN_REMOTE "XF86AudioLowerVolume"
51 static const char *_control_name[] = {
61 typedef void (*btn_event_cb)(void *dt);
71 CVideoController *control;
73 CMediaData *mediadata;
75 timeout_handler *timeout_handle;
78 Ecore_Timer *drawanim_timer;
100 void CPlayerView::m_UpdateInfoBar(void)
109 name = m->mediadata->GetName();
111 elm_object_part_text_set(m->base, PART_TITLETEXT, name);
114 video_time = m->mediadata->GetTime();
116 if (video_time > 0) {
117 localtime_r(&video_time, &tm);
118 strftime(buf, sizeof(buf), "%Y.%m.%d", &tm);
120 snprintf(buf, sizeof(buf), "%s", _(TEXT_NODATE));
123 elm_object_part_text_set(m->base, PART_DATETEXT, buf);
126 /* FIXME: when usb path is decided, this logic should be changed */
127 if (!strncmp(m->mediadata->GetPath(), SOURCE_TV_PATH, SOURCE_PATH_LEN))
131 elm_object_part_text_set(m->base, PART_SOURCETEXT, _(source));
134 playermgr_get_play_count(m->player, buf, sizeof(buf));
135 elm_object_part_text_set(m->base, PART_CURRENTTEXT, buf);
138 snprintf(buf, sizeof(buf), "%dx%d", m->mediadata->GetWidth(),
139 m->mediadata->GetHeight());
141 m->duration = m->mediadata->GetDuration();
142 m->position = m->mediadata->GetPosition();
144 elm_object_part_text_set(m->base, PART_RESOLUTIONTEXT, buf);
147 bool CPlayerView::m_PlayerInit(void)
152 r = playermgr_play_video(m->player);
156 path = playermgr_get_video_path(m->player);
158 m->mediadata->Create(path);
160 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 = playermgr_set_rew(data->player, 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 = playermgr_set_ff(data->player, 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 playermgr_stop_ffrew(data->player);
220 playermgr_set_prev_video(data->player);
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 playermgr_stop_ffrew(data->player);
237 playermgr_set_next_video(data->player, EINA_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_EvtSettingBtn(void *dt)
271 void CPlayerView::sm_EvtPlayBtn(void *dt)
274 player_state_e state;
280 data = (SPlayerView *)dt;
282 if (playermgr_get_ffrew(data->player)) {
283 playermgr_stop_ffrew(data->player);
284 playermgr_resume(data->player);
285 data->slider->Resume();
289 r = playermgr_get_state(data->player, &state);
294 case PLAYER_STATE_PLAYING:
295 playermgr_pause(data->player);
296 data->slider->Pause();
299 case PLAYER_STATE_PAUSED:
300 playermgr_resume(data->player);
301 data->slider->Resume();
308 void CPlayerView::sm_EvtControlBtn(void *dt, const char *ev)
311 btn_event_cb cbs[] = {
325 data = (SPlayerView *)dt;
327 for (i = 0; i < CONTROL_BTNS; i++) {
328 if (!strcmp(_control_name[i], ev))
333 void CPlayerView::sm_CbPlayComplete(void *dt)
336 update_action action;
342 data = (SPlayerView *)dt;
345 if (data->repeat == E_REPEAT_NONE)
346 r = playermgr_set_next_video(data->player, EINA_FALSE);
347 else if (data->repeat == E_REPEAT_ALL)
348 r = playermgr_set_next_video(data->player, EINA_TRUE);
355 action = ACTION_INIT;
356 CViewMgr::GetInstance()->UpdateView(data->id, (void *)&action);
359 void CPlayerView::sm_CbShowViewFinish(void *dt, Evas_Object *obj,
360 const char *emission, const char *source)
367 data = (SPlayerView *)dt;
369 data->control->Show();
372 void CPlayerView::m_ShowBar(void)
377 elm_object_signal_emit(m->base, SIG_SHOW_VIEW, "");
378 m->bar_hidden = false;
383 void CPlayerView::m_HideBar(void)
385 elm_object_signal_emit(m->base, SIG_HIDE_VIEW, "");
386 m->bar_hidden = true;
392 void CPlayerView::sm_CbTimeoutEvent(void *dt, int type, void *ev)
395 update_action action;
400 data = (SPlayerView *)dt;
402 action = ACTION_HIDE;
403 CViewMgr::GetInstance()->UpdateView(data->id, (void *)&action);
406 void CPlayerView::sm_EvtBack(void *dt, Evas_Object *obj, void *ev)
413 data = (SPlayerView *)dt;
415 if (data->bar_hidden) {
416 update_action action;
418 action = ACTION_SHOW;
419 CViewMgr::GetInstance()->UpdateView(data->id, (void *)&action);
425 void CPlayerView::sm_EvtVolume(SPlayerView *data, int val)
427 if (!data->bar_hidden) {
428 update_action action;
430 action = ACTION_HIDE;
431 CViewMgr::GetInstance()->UpdateView(data->id, (void *)&action);
434 data->volume->Show((volume_val)val);
437 void CPlayerView::sm_CbEcoreEvent(void *dt, int type, void *ei)
445 data = (SPlayerView *)dt;
448 if (type == ECORE_EVENT_KEY_UP) {
449 Evas_Event_Key_Up *ev;
451 ev = (Evas_Event_Key_Up *)ei;
455 if (!strcmp(ev->keyname, KEY_VOLUMEUP) ||
456 !strcmp(ev->keyname, KEY_VOLUMEUP_REMOTE))
457 sm_EvtVolume(data, E_VOLUME_UP);
458 else if (!strcmp(ev->keyname, KEY_VOLUMEDOWN) ||
459 !strcmp(ev->keyname, KEY_VOLUMEDOWN_REMOTE))
460 sm_EvtVolume(data, E_VOLUME_DOWN);
461 else if (!strcmp(ev->keyname, KEY_MUTE))
462 sm_EvtVolume(data, E_VOLUME_MUTE);
465 } else if (type == ECORE_EVENT_MOUSE_MOVE) {
470 update_action action;
472 action = ACTION_SHOW;
473 CViewMgr::GetInstance()->UpdateView(data->id, (void *)&action);
477 bool CPlayerView::m_AddControls(void)
479 if (!m->control->Create(m->base, _control_name, CONTROL_BTNS))
482 m->repeat = E_REPEAT_ALL;
484 m->control->AddHandler(sm_EvtControlBtn, m);
486 if (!m->slider->Create(m->base, m->player))
489 if (!m->volume->Create(m->win))
492 m->timeout_handle = timeout_handler_init(TIMEOUT_VIDEOPLAYER,
493 sm_CbTimeoutEvent, m, sm_CbEcoreEvent, m);
495 eext_object_event_callback_add(m->base,
496 EEXT_CALLBACK_BACK, sm_EvtBack, m);
498 if (!m->timeout_handle)
504 Eina_Bool CPlayerView::sm_CbDrawAnimation(void *dt)
509 return ECORE_CALLBACK_CANCEL;
511 data = (SPlayerView *)dt;
513 elm_object_signal_emit(data->base, SIG_SHOW_VIEW, "");
514 data->control->Focus(E_PLAYPAUSE_BTN, EINA_TRUE);
516 data->drawanim_timer = NULL;
518 return ECORE_CALLBACK_CANCEL;
521 void CPlayerView::m_ControlInit(SPlayerParam *param)
523 m->mediadata = new CMediaData;
525 _ERR("mediadata init failed");
528 m->id = strdup(param->id);
530 m->player = playermgr_init(m->win, param->filepath, param->playlist);
532 _ERR("player init 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 playermgr_set_completed_cb(m->player, 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 if (m->drawanim_timer)
636 ecore_timer_del(m->drawanim_timer);
637 m->drawanim_timer = NULL;
642 playermgr_fini(m->player);
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_OnHide(void)
692 evas_object_hide(m->base);
695 void CPlayerView::t_OnPause(void)
700 void CPlayerView::t_OnUpdate(void *dt)
702 update_action *action;
707 action = (update_action *)dt;
717 playermgr_resume(m->player);
721 playermgr_pause(m->player);