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>
20 #include "AppCommon.h"
21 #include <InputHandler.h>
26 #include "song_info.h"
27 #include "album_info.h"
28 #include "music-controller.h"
29 #include "volume-control.h"
31 #include "common-ui.h"
34 #include "playback-view.h"
35 #include "context-view.h"
36 #include "HandleVolume.h"
37 #include <app-res-defines.h>
38 #include "PlaySettingCtxPopup.h"
42 #define ARRAY_SIZE(array) (sizeof(array) / sizeof(array[0]))
43 #define TITLE_FONT_SIZE 50
44 #define ARTIST_FONT_SIZE 30
45 #define TOTAL_CONTROL_BTNS 6
46 #define TOTAL_EDIT_BTNS 3
47 #define S_INTERVAL 1 /* seconds */
48 #define LP_INTERVAL 0.5 /* seconds */
49 #define WAIT_INTERVAL 0.5 /* seconds */
50 #define SLIDER_STEP 5000 /* milli seconds */
51 #define LP_CHANGE 10000 /* milli seconds */
52 #define S_INCREMENT 1000 /* milli seconds */
55 ////////////////////////////////////////////////////////////////////////////////
57 struct SSliderWidget {
58 Evas_Object *eoSlider;
61 Ecore_Timer *etSlider;
65 CMusicController controller;
76 Eina_Bool CSliderWidget::sm_CbUpdateSlider(void *dt)
78 CSliderWidget *root = (CSliderWidget*)dt;
79 Eina_Bool ret = ECORE_CALLBACK_CANCEL;
82 ret = root->m_OnUpdateSlider();
88 Eina_Bool CSliderWidget::m_OnUpdateSlider(void)
94 if (!m->controller.GetPosition(&value)) {
96 return ECORE_CALLBACK_CANCEL;
101 duration = m->pSongInfo->Duration();
103 value = value + S_INCREMENT;
104 if (value > duration) {
106 return ECORE_CALLBACK_CANCEL;
109 elm_slider_value_set(m->eoSlider, value);
110 timestr = CCommonUI::TimeStrFromMilSeconds(value);
112 elm_object_part_text_set(m->eoBase, MUSIC_PART_PROGRESSTIME,
117 return ECORE_CALLBACK_RENEW;
121 bool CSliderWidget::m_AddSlider(void)
123 Evas_Object *eoSlider = NULL;
125 eoSlider = elm_slider_add(m->eoBase);
129 elm_slider_indicator_show_set(eoSlider, EINA_FALSE);
130 elm_slider_indicator_show_on_focus_set(eoSlider, EINA_FALSE);
131 elm_object_style_set(eoSlider, MUSIC_STYLE_SLIDER);
132 elm_slider_horizontal_set(eoSlider, EINA_TRUE);
133 elm_object_part_content_set(m->eoBase, MUSIC_PART_PROGRESSBAR, eoSlider);
135 Connect(eoSlider, TYPE_CHANGED | TYPE_MOUSE_MOVE);
137 evas_object_show(eoSlider);
138 m->eoSlider = eoSlider;
144 void CSliderWidget::m_RemoveTimer(void)
147 ecore_timer_del(m->etSlider);
153 void CSliderWidget::m_UpdateSongInfo(void)
155 CSongInfo *sinfo = NULL;
158 if (!m->controller.GetCurrentSongIndex(&index)) {
159 _ERR(" music get current song index failed ");
163 if (!m->controller.GetSonginfoFromIndex(index, &sinfo)) {
164 _ERR(" music get songinfo failed ");
167 m->pSongInfo = sinfo;
171 bool CSliderWidget::Create(Evas_Object *eoBase)
176 _CHECK(m = new SSliderWidget)
177 _COMMAND{ m->eoBase = eoBase; }
178 _CHECK(m->controller.Create())
179 _CHECK(m->controller.AddListener(this))
180 _CHECK(m_AddSlider())
183 _CHECK_FAIL{ m->controller.RemoveListener(this); }
184 _CHECK_FAIL{ m->controller.Destroy(); }
185 _CHECK_FAIL{ delete m; m = NULL; }
186 } _CREATE_END_AND_CATCH{ return false; }
192 void CSliderWidget::Destroy(void)
196 m->controller.RemoveListener(this);
204 Evas_Object* CSliderWidget::Base(void)
212 void CSliderWidget::Init(void)
214 elm_object_disabled_set(m->eoSlider, EINA_TRUE);
215 elm_slider_value_set(m->eoSlider, 0);
219 void CSliderWidget::OnComplete(void)
224 void CSliderWidget::OnStartPlayback(void)
227 char *timestr = NULL;
230 elm_slider_value_set(m->eoSlider, 0);
231 elm_object_part_text_set(m->eoBase, MUSIC_PART_PROGRESSTIME, "00:00");
233 elm_object_disabled_set(m->eoSlider, EINA_FALSE);
236 duration = m->pSongInfo->Duration();
239 m->etSlider = ecore_timer_add(S_INTERVAL, sm_CbUpdateSlider, this);
241 elm_slider_min_max_set(m->eoSlider, 0, duration);
242 timestr = CCommonUI::TimeStrFromMilSeconds(duration);
244 elm_object_part_text_set(m->eoBase,
245 MUSIC_PART_FULLTIME, timestr);
249 step = (double)SLIDER_STEP / (double)duration;
250 elm_slider_step_set(m->eoSlider, step);
254 void CSliderWidget::OnStopPlayback(void)
256 elm_slider_value_set(m->eoSlider, 0);
257 elm_object_part_text_set(m->eoBase, MUSIC_PART_PROGRESSTIME, "00:00");
259 elm_object_disabled_set(m->eoSlider, EINA_TRUE);
264 void CSliderWidget::OnPausePlayback(void)
267 ecore_timer_freeze(m->etSlider);
271 void CSliderWidget::OnResumePlayback(void)
274 ecore_timer_thaw(m->etSlider);
278 void CSliderWidget::OnPosition(int milsec)
280 elm_slider_value_set(m->eoSlider, milsec);
284 void CSliderWidget::OnChanged(int id, Evas_Object *obj)
286 char *timestr = NULL;
289 if (m->controller.PlayState() == PLAY_STATUS_PLAY) {
291 ecore_timer_freeze(m->etSlider);
294 value = elm_slider_value_get(obj);
295 m->controller.SetPosition(value);
296 timestr = CCommonUI::TimeStrFromMilSeconds(value);
298 elm_object_part_text_set(m->eoBase, MUSIC_PART_PROGRESSTIME,
303 if (m->controller.PlayState() == PLAY_STATUS_PLAY) {
305 ecore_timer_thaw(m->etSlider);
310 void CSliderWidget::OnMouseMove(int id, Evas *e, Evas_Object *obj, Evas_Event_Mouse_Move *ev)
312 if (!elm_object_focus_get(obj))
313 elm_object_focus_set(obj, EINA_TRUE);
316 ////////////////////////////////////////////////////////////////////////////////
323 Ecore_Timer *etTimer;
326 SCookie(CTimer *timer, int _id) {
336 Eina_Bool CTimer::sm_CbTimer(void *data)
338 STimer::SCookie *cookie = (STimer::SCookie*)data;
341 cookie->root->t_OnTimer(cookie->id);
343 cookie->root->m->elList = eina_list_remove(cookie->root->m->elList, cookie);
351 void CTimer::t_OnTimer(int id)
356 bool CTimer::Create(void)
370 void CTimer::Destroy(void)
379 bool CTimer::SetTimer(int id, int ms)
384 STimer::SCookie *cookie = new STimer::SCookie(this, id);
388 m->elList = eina_list_append(m->elList, cookie);
389 cookie->etTimer = ecore_timer_add(ms, sm_CbTimer, cookie);
394 void CTimer::KillTimer(int id)
409 EO_ERROR_POPUP_BUTTON,
413 EO_DELETE, // TOTAL_EDIT_BTNS
420 EO_BTN_FORWARD, // TOTAL_CONTROL_BTNS
427 Elm_Object_Item *item;
443 struct SPlaybackView {
447 CPlaySettingCtxPopup *eoCtxPopup;
448 Evas_Object *eoErrPopup;
449 Evas_Object *eoPlaylist;
451 Elm_Object_Item *focused_item;
453 Evas_Object *eoBtnControl[TOTAL_CONTROL_BTNS];
454 Evas_Object *eoBtnEdit[TOTAL_EDIT_BTNS];
456 Evas_Object *eoAlbumCover;
457 CSliderWidget *pSliderWidget;
458 Evas_Object *eoPressedObj;
461 Ecore_Timer *etLongPress;
463 CMusicController *pController; //! NOT NULL
466 SItemInfo *cs_itinfo;
467 SContentInfo *ctxtinfo;
468 EPressTypes press_status;
470 CHandleVolume *pHandleVolume;
473 memset(this, 0, sizeof(SPlaybackView));
514 Eina_Bool CPlaybackView::sm_CbLongpressTimer(void *dt)
516 CPlaybackView *root = (CPlaybackView *)dt;
518 root->m_OnLongpressTimer();
520 return ECORE_CALLBACK_RENEW;
524 void CPlaybackView::m_OnLongpressTimer(void)
526 m_HandleOnRepeated();
530 Eina_Bool CPlaybackView::sm_CbWaitTimer(void *dt)
532 CPlaybackView *root = (CPlaybackView *)dt;
534 root->m_OnWaitTimer();
536 return ECORE_CALLBACK_CANCEL;
540 void CPlaybackView::m_OnWaitTimer(void)
542 m->press_status = PRESS_LONG;
543 if (m->pController->PlayState() == PLAY_STATUS_PLAY) {
544 /* Handle long press */
546 m->etLongPress = ecore_timer_add(LP_INTERVAL, sm_CbLongpressTimer, this);
549 m->press_status = PRESS_LONG_PAUSE;
556 void CPlaybackView::sm_CbCtxtUpdate(void *dt, enum EActionType type, int lid)
558 CPlaybackView *root = (CPlaybackView *)dt;
560 root->m_OnCtxtUpdate(type, lid);
564 void CPlaybackView::m_OnCtxtUpdate(EActionType type, int lid)
566 SItemInfo *itinfo = NULL;
567 Elm_Object_Item *focusedItem = NULL;
569 if (!m->ctxtinfo || !m->ctxtinfo->context)
572 itinfo = m_FindItemInfoFromSong(m->elInfo,
573 (CSongInfo *)m->ctxtinfo->context);
575 _ERR(" Unable to find song in the list ");
579 if (type == ACTION_TYPE_DELETE) {
580 itinfo->check_status = true;
581 m_DeleteSelectedItems();
583 if (!m->mgr->PopView()) {
584 _ERR("CViewMgr::PopView failed");
589 memset(&parcel, 0, sizeof(SParcel));
590 parcel.updateType = E_PLAYLIST_UPDATE;
593 focusedItem = m->cs_itinfo->item;
595 else { // ACTION_TYPE_PLAY
596 if (m->ctxtinfo->status == PLAY_STATUS_PLAY)
599 if (itinfo == m->cs_itinfo)
602 m_HandleGenlistItemActivated(m->eoPlaylist, itinfo->item);
605 if (!m->mgr->PopView()) {
606 _ERR("CViewMgr::PopView failed");
610 focusedItem = m->focused_item;
613 if (!CViewMgr::GetInstance()->HideView(MUSIC_BASE_VIEW))
614 _ERR("CViewMgr::HideView failed");
619 elm_genlist_item_show(focusedItem, ELM_GENLIST_ITEM_SCROLLTO_IN);
620 elm_object_item_focus_set(focusedItem, EINA_TRUE);
625 void CPlaybackView::sm_CbCtxtClose(void *dt)
627 CPlaybackView *root = (CPlaybackView *)dt;
629 root->m_OnCtxtClose();
633 void CPlaybackView::m_OnCtxtClose(void)
635 if (!m->mgr->PopView()) {
636 _ERR("CViewMgr::PopView failed");
640 elm_object_item_focus_set(m->focused_item, EINA_TRUE);
644 void CPlaybackView::sm_CbCtxPopupBtnSelected(void* cookie, CCtxPopup* instance, const char* text)
646 CPlaybackView *root = (CPlaybackView *)cookie;
648 root->m_CbCtxPopupBtnSelected(instance, text);
652 void CPlaybackView::m_CbCtxPopupBtnSelected(CCtxPopup* instance, const char* text)
654 int type = CInfo::PlaybackSettingType();
658 m_FromPlaybackToEditMode();
662 m->pController->Stop();
663 m->pController->EmptyPlaylist();
664 eina_list_free(m->elInfo);
666 elm_genlist_clear(m->eoPlaylist);
667 m_UpdateEmptySongInfo();
676 void CPlaybackView::m_RemoveTimer(int timer_code)
678 ETimers timerCode = (ETimers)timer_code;
683 ecore_timer_del(m->etWait);
688 case TIMER_LONGPRESS:
689 if (m->etLongPress) {
690 ecore_timer_del(m->etLongPress);
691 m->etLongPress = NULL;
696 m->pHandleVolume->RemoveTimer();
700 _ERR(" invalid value ");
706 void CPlaybackView::m_PlaybackPause(void)
708 m->pController->Pause();
712 void CPlaybackView::m_PlaybackResume(void)
714 m->pController->Resume();
718 void CPlaybackView::m_ChangeEditmodeAll(Eina_List *list, bool flag)
720 SItemInfo *itinfo = NULL;
724 EINA_LIST_FOREACH(list, l, obj) {
725 itinfo = (SItemInfo *)obj;
726 itinfo->edit_mode = flag;
731 void CPlaybackView::m_DisableCheckAll(Eina_List *list)
733 SItemInfo *itinfo = NULL;
737 EINA_LIST_FOREACH(list, l, obj) {
738 itinfo = (SItemInfo *)obj;
739 itinfo->check_status = false;
744 void CPlaybackView::m_SelectItem(SItemInfo *pItemInfo)
746 if (!pItemInfo || !pItemInfo->item)
749 elm_genlist_item_bring_in(pItemInfo->item, ELM_GENLIST_ITEM_SCROLLTO_IN);
750 elm_object_item_signal_emit(pItemInfo->item, MUSIC_SIGNAL_SELECT_ITEM, MUSIC_PLAYBACK_VIEW);
752 pItemInfo->select_status = true;
756 void CPlaybackView::m_UnselectItem(SItemInfo *pItemInfo)
758 if (!pItemInfo || !pItemInfo->item)
761 elm_object_item_signal_emit(pItemInfo->item, MUSIC_SIGNAL_UNSELECT_ITEM,
762 MUSIC_PLAYBACK_VIEW);
764 pItemInfo->select_status = false;
768 void CPlaybackView::m_UpdateControlBtns(void)
772 state = m->pController->PlayState();
774 case PLAY_STATUS_INITIAL:
775 // Initial State, Do nothing
778 case PLAY_STATUS_STOP:
780 elm_object_focus_set(m->eoBtnControl[BTN_PLAY], EINA_TRUE);
781 elm_object_disabled_set(m->eoBtnControl[BTN_FORWARD], EINA_TRUE);
782 elm_object_disabled_set(m->eoBtnControl[BTN_REWIND], EINA_TRUE);
785 case PLAY_STATUS_PLAY:
786 elm_object_disabled_set(m->eoBtnControl[BTN_FORWARD], EINA_FALSE);
787 elm_object_disabled_set(m->eoBtnControl[BTN_REWIND], EINA_FALSE);
788 elm_object_signal_emit(m->eoBtnControl[BTN_PLAY],
789 MUSIC_SIGNAL_PLAY, MUSIC_PLAYBACK_VIEW);
792 case PLAY_STATUS_PAUSE:
793 elm_object_disabled_set(m->eoBtnControl[BTN_FORWARD], EINA_FALSE);
794 elm_object_disabled_set(m->eoBtnControl[BTN_REWIND], EINA_FALSE);
795 elm_object_signal_emit(m->eoBtnControl[BTN_PLAY],
796 MUSIC_SIGNAL_PAUSE, MUSIC_PLAYBACK_VIEW);
800 ASSERT(!"Invalid State");
804 state = m->pController->ShuffleState();
806 case SHUFFLE_STATUS_OFF:
807 elm_object_signal_emit(m->eoBtnControl[BTN_SHUFFLE],
808 MUSIC_SIGNAL_SHUFFLE_OFF, MUSIC_PLAYBACK_VIEW);
811 case SHUFFLE_STATUS_ON:
812 elm_object_signal_emit(m->eoBtnControl[BTN_SHUFFLE],
813 MUSIC_SIGNAL_SHUFFLE_ON, MUSIC_PLAYBACK_VIEW);
817 ASSERT(!"Invalid State");
821 state = m->pController->RepeatState();
823 case REPEAT_STATUS_NONE:
824 elm_object_signal_emit(m->eoBtnControl[BTN_REPEAT],
825 MUSIC_SIGNAL_REPEAT_OFF, MUSIC_PLAYBACK_VIEW);
828 case REPEAT_STATUS_ALL:
829 elm_object_signal_emit(m->eoBtnControl[BTN_REPEAT],
830 MUSIC_SIGNAL_REPEAT_ALL, MUSIC_PLAYBACK_VIEW);
833 case REPEAT_STATUS_ONE:
834 elm_object_signal_emit(m->eoBtnControl[BTN_REPEAT],
835 MUSIC_SIGNAL_REPEAT_ONE, MUSIC_PLAYBACK_VIEW);
839 ASSERT(!"Invalid State");
845 void CPlaybackView::m_UpdateCurrentSongThumbnail(void)
848 char buf[MAX_LENGTH];
850 if (!m->cs_itinfo || !m->cs_itinfo->sinfo)
853 path = m->cs_itinfo->sinfo->ThumbnailPath();
855 elm_image_file_set(m->eoAlbumCover, path, NULL);
857 snprintf(buf, sizeof(buf), "%s/%s", IMAGEDIR,
858 MUSIC_IMAGE_DEFAULT_THUMB_450);
859 elm_image_file_set(m->eoAlbumCover, buf, NULL);
864 void CPlaybackView::m_UpdateCurrentSongLabels(void)
866 char buf[MAX_LENGTH];
871 elm_object_part_text_set(m->eoBase, MUSIC_PART_SONG_TITLE,
874 snprintf(buf, sizeof(buf), "%s - %s", m->csinfo->Artist(),
877 elm_object_part_text_set(m->eoBase, MUSIC_PART_ARTIST_ALBUM, buf);
881 void CPlaybackView::m_UpdateEmptySongInfo(void)
883 char buf[MAX_LENGTH];
885 elm_object_signal_emit(m->eoBtnControl[BTN_PLAY],
886 MUSIC_SIGNAL_PAUSE, MUSIC_PLAYBACK_VIEW);
887 elm_object_focus_set(m->eoBtnControl[BTN_SETTINGS], EINA_TRUE);
888 elm_object_focus_next_object_set(m->eoBtnControl[BTN_REPEAT],
889 m->eoBtnControl[BTN_REPEAT], ELM_FOCUS_RIGHT);
890 elm_object_disabled_set(m->eoBtnControl[BTN_FORWARD], EINA_TRUE);
891 elm_object_disabled_set(m->eoBtnControl[BTN_REWIND], EINA_TRUE);
892 elm_object_disabled_set(m->eoBtnControl[BTN_PLAY], EINA_TRUE);
893 elm_object_part_text_set(m->eoBase, MUSIC_PART_FULLTIME, "00:00");
894 elm_object_part_text_set(m->eoBase, MUSIC_PART_PROGRESSTIME, "00:00");
896 m->pSliderWidget->Init();
898 elm_object_part_text_set(m->eoBase, MUSIC_PART_SONG_TITLE,
899 _(NO_PLAYLIST_MESSAGE));
900 elm_object_part_text_set(m->eoBase, MUSIC_PART_ARTIST_ALBUM,
901 _(NO_PLAYLIST_MESSAGE_SUB));
902 snprintf(buf, sizeof(buf), "%s/%s", IMAGEDIR,
903 MUSIC_IMAGE_DEFAULT_THUMB_450);
904 elm_image_file_set(m->eoAlbumCover, buf, NULL);
905 m->pController->SetPlayState(PLAY_STATUS_INITIAL);
909 void CPlaybackView::m_UpdateCtxtView(int playStatus)
911 if (!m->cs_itinfo || !m->ctxtinfo)
914 if (!m->mgr->CheckTop(MUSIC_CONTEXT_VIEW))
917 if (m->cs_itinfo->sinfo == m->ctxtinfo->context) {
918 m->ctxtinfo->status = (EPlayStatus)playStatus;
921 memset(&parcel, 0, sizeof(SParcel));
922 parcel.updateType = E_SONG_UPDATE;
923 m->mgr->UpdateView((const char *)MUSIC_CONTEXT_VIEW, &parcel);
928 void CPlaybackView::m_UpdateCurrentSongItem(int index)
930 SItemInfo *pItemInfo = NULL;
933 m_UnselectItem(m->cs_itinfo);
934 m_UpdateCtxtView(PLAY_STATUS_PAUSE);
937 pItemInfo = (SItemInfo *)eina_list_nth(m->elInfo, index);
940 m->cs_itinfo = pItemInfo;
941 if (m->pController->PlayState() == PLAY_STATUS_STOP) {
942 elm_genlist_item_bring_in(pItemInfo->item,
943 ELM_GENLIST_ITEM_SCROLLTO_IN);
946 m_SelectItem(pItemInfo);
947 m_UpdateCtxtView(PLAY_STATUS_PLAY);
953 void CPlaybackView::m_UpdateEditmodeFocusSequence(void)
955 elm_object_focus_next_object_set(m->eoPlaylist, m->eoBtnEdit[BTN_CANCEL], ELM_FOCUS_LEFT);
956 elm_object_focus_next_object_set(m->eoBtnEdit[BTN_CANCEL], m->eoPlaylist, ELM_FOCUS_RIGHT);
957 elm_object_focus_next_object_set(m->pSliderWidget->Base(), m->eoBtnEdit[BTN_CANCEL], ELM_FOCUS_DOWN);
961 void CPlaybackView::m_UpdatePlaymodeFocusSequence(void)
963 elm_object_focus_next_object_set(m->pSliderWidget->Base(), m->eoPlaylist, ELM_FOCUS_UP);
964 elm_object_focus_next_object_set(m->pSliderWidget->Base(), m->eoBtnControl[BTN_PLAY], ELM_FOCUS_DOWN);
965 switch (m->pController->PlayState()) {
966 case PLAY_STATUS_INITIAL:
970 case PLAY_STATUS_STOP:
971 elm_object_focus_next_object_set(m->eoPlaylist, m->eoBtnControl[BTN_PLAY], ELM_FOCUS_LEFT);
972 elm_object_focus_next_object_set(m->eoBtnControl[BTN_PLAY], m->eoPlaylist, ELM_FOCUS_RIGHT);
973 elm_object_focus_next_object_set(m->eoBtnControl[BTN_PLAY], m->eoBtnControl[BTN_REPEAT], ELM_FOCUS_LEFT);
974 elm_object_focus_next_object_set(m->eoBtnControl[BTN_REPEAT], m->eoBtnControl[BTN_PLAY], ELM_FOCUS_RIGHT);
975 elm_object_signal_emit(m->eoBtnControl[BTN_PLAY], MUSIC_SIGNAL_PAUSE, MUSIC_PLAYBACK_VIEW);
978 case PLAY_STATUS_PLAY:
979 case PLAY_STATUS_PAUSE:
980 elm_object_focus_next_object_set(m->eoPlaylist,
981 m->eoBtnControl[BTN_FORWARD], ELM_FOCUS_LEFT);
982 elm_object_focus_next_object_set(m->eoBtnControl[BTN_FORWARD],
983 m->eoPlaylist, ELM_FOCUS_RIGHT);
984 elm_object_focus_next_object_set(m->eoBtnControl[BTN_PLAY],
985 m->eoBtnControl[BTN_FORWARD], ELM_FOCUS_RIGHT);
989 ASSERT(!"Invalid State");
995 void CPlaybackView::m_UpdateCurrentSongInfo(void)
997 CSongInfo *sinfo = NULL;
1000 if (eina_list_count(m->elInfo) == 0) {
1001 m_UpdateEmptySongInfo();
1005 if (!m->pController->GetCurrentSongIndex(&index)) {
1006 _ERR(" music get current song index failed ");
1010 if (!m->pController->GetSonginfoFromIndex(index, &sinfo)) {
1011 _ERR(" music get songinfo failed ");
1016 m_UpdateCurrentSongItem(index);
1017 m_UpdateCurrentSongLabels();
1018 m_UpdateCurrentSongThumbnail();
1019 m_UpdateControlBtns();
1020 m_UpdatePlaymodeFocusSequence();
1024 void CPlaybackView::m_DisableEditButtons(bool flag)
1026 /* flag - 1 means disable edit buttons and 0 means enable */
1028 elm_object_focus_set(m->eoBtnEdit[BTN_CANCEL], EINA_TRUE);
1030 elm_object_disabled_set(m->eoBtnEdit[BTN_DELETE], (Eina_Bool)flag);
1031 elm_object_disabled_set(m->eoBtnEdit[BTN_DESELECT], (Eina_Bool)flag);
1033 m_UpdateEditmodeFocusSequence();
1034 elm_object_focus_set(m->eoBtnEdit[BTN_CANCEL], EINA_TRUE);
1037 elm_object_focus_next_object_set(m->eoBtnEdit[BTN_CANCEL], m->eoBtnEdit[BTN_DESELECT], ELM_FOCUS_RIGHT);
1038 elm_object_focus_next_object_set(m->eoBtnEdit[BTN_DELETE], m->eoPlaylist, ELM_FOCUS_RIGHT);
1039 elm_object_focus_next_object_set(m->eoPlaylist, m->eoBtnEdit[BTN_DELETE], ELM_FOCUS_LEFT);
1044 void CPlaybackView::m_CreateErrorPopup(void)
1046 Evas_Object *popup = NULL, *btn = NULL, *label = NULL;
1048 popup = elm_popup_add(m->eoBase);
1052 elm_object_style_set(popup, MUSIC_STYLE_ERROR_POPUP);
1053 evas_object_show(popup);
1055 label = elm_label_add(popup);
1057 evas_object_del(popup);
1061 elm_object_style_set(label, MUSIC_STYLE_ERROR_LABEL);
1062 elm_object_text_set(label, MUSIC_TEXT_PLAYBACK_ERROR);
1063 elm_object_content_set(popup, label);
1065 btn = elm_button_add(popup);
1067 evas_object_del(popup);
1071 elm_object_style_set(btn, MUSIC_STYLE_EDIT_BTN);
1072 elm_object_text_set(btn, MUSIC_TEXT_OK);
1073 elm_object_part_content_set(popup, MUSIC_PART_POPUP_BUTTON, btn);
1075 m->eoErrPopup = popup;
1077 Connect(btn, EO_ERROR_POPUP_BUTTON, TYPE_CLICKED | TYPE_KEY_DOWN);
1079 elm_object_focus_set(btn, EINA_TRUE);
1085 void CPlaybackView::m_DestroyErrorPopup(void)
1090 evas_object_del(m->eoErrPopup);
1091 m->eoErrPopup = NULL;
1095 void CPlaybackView::m_CreateSettingsPopup(void)
1097 CCtxPopup::SCallback cb;
1099 cb.onSelected = sm_CbCtxPopupBtnSelected;
1101 m->eoCtxPopup = new CPlaySettingCtxPopup;
1102 m->eoCtxPopup->Create(m->eoWin, &cb);
1106 void CPlaybackView::m_DestroySettingsPopup(void)
1111 if (m->eoCtxPopup->FlagCreate())
1112 m->eoCtxPopup->Destroy();
1114 delete m->eoCtxPopup;
1115 m->eoCtxPopup = NULL;
1119 void CPlaybackView::m_FromEditToPlaybackMode(void)
1121 if (m->pController->PlayState() == PLAY_STATUS_STOP) {
1122 elm_genlist_item_bring_in(m->cs_itinfo->item,
1123 ELM_GENLIST_ITEM_SCROLLTO_IN);
1126 m_SelectItem(m->cs_itinfo);
1128 elm_object_signal_emit(m->eoBase, MUSIC_SIGNAL_PLAYBACK_MODE,
1129 MUSIC_PLAYBACK_VIEW);
1130 elm_object_focus_set(m->eoBtnControl[BTN_SETTINGS], EINA_TRUE);
1132 m_ChangeEditmodeAll(m->elInfo, false);
1134 elm_genlist_realized_items_update(m->eoPlaylist);
1136 m_UpdatePlaymodeFocusSequence();
1140 void CPlaybackView::m_FromPlaybackToEditMode(void)
1142 elm_object_signal_emit(m->eoBase, MUSIC_SIGNAL_EDIT_MODE,
1143 MUSIC_PLAYBACK_VIEW);
1145 m_DisableEditButtons(true);
1147 elm_object_focus_set(m->eoBtnEdit[BTN_CANCEL], EINA_TRUE);
1149 m_ChangeEditmodeAll(m->elInfo, true);
1151 elm_genlist_realized_items_update(m->eoPlaylist);
1153 m_UpdateEditmodeFocusSequence();
1157 void CPlaybackView::m_HandleOnRepeated(void)
1159 Evas_Object *obj = NULL;
1162 char *timestr = NULL;
1164 if (!m->eoPressedObj)
1167 obj = m->eoPressedObj;
1170 m->pController->GetPosition(&value);
1171 duration = m->cs_itinfo->sinfo->Duration();
1173 if (obj == m->eoBtnControl[BTN_REWIND]) {
1175 m_RemoveTimer(TIMER_LONGPRESS);
1178 value = value - LP_CHANGE;
1183 if (value == duration) {
1184 m->pController->PlayNextSong();
1186 m->press_status = PRESS_LONG_PAUSE;
1187 elm_object_signal_emit(m->eoBtnControl[BTN_PLAY], MUSIC_SIGNAL_PAUSE,
1188 MUSIC_PLAYBACK_VIEW);
1190 m_RemoveTimer(TIMER_LONGPRESS);
1194 value = value + LP_CHANGE;
1195 if (value >= duration)
1199 m->pController->SetPosition(value);
1200 timestr = CCommonUI::TimeStrFromMilSeconds(value);
1202 elm_object_part_text_set(m->eoBase, MUSIC_PART_PROGRESSTIME,
1211 void CPlaybackView::m_DeleteSelectedItems(void)
1213 Eina_List *l = NULL, *l_next = NULL;
1214 SItemInfo *pItemInfo = NULL;
1216 bool updateFlag = false;
1219 m_DisableEditButtons(true);
1220 EINA_LIST_FOREACH_SAFE(m->elInfo, l, l_next, obj) {
1221 pItemInfo = (SItemInfo *)obj;
1222 if (pItemInfo->check_status) {
1223 if (m->cs_itinfo == pItemInfo) {
1225 m_UnselectItem(m->cs_itinfo);
1226 m->cs_itinfo = NULL;
1227 m->pController->SetPlayState(PLAY_STATUS_STOP);
1228 m->pController->Stop();
1230 index = elm_genlist_item_index_get(pItemInfo->item);
1231 m->pController->RemoveSong(pItemInfo->sinfo, index);
1233 m->elInfo = eina_list_remove(m->elInfo, pItemInfo);
1234 elm_object_item_del(pItemInfo->item);
1238 if (eina_list_count(m->elInfo) == 0) {
1239 m_UpdateEmptySongInfo();
1240 elm_genlist_realized_items_update(m->eoPlaylist);
1241 elm_object_focus_set(m->eoBtnEdit[BTN_CANCEL], EINA_TRUE);
1246 m_UpdateCurrentSongInfo();
1248 elm_genlist_realized_items_update(m->eoPlaylist);
1249 elm_object_focus_set(m->eoBtnEdit[BTN_CANCEL], EINA_TRUE);
1253 void CPlaybackView::m_KeyBackPress(void)
1255 if (m->eoCtxPopup) {
1256 m_DestroySettingsPopup();
1257 elm_object_focus_set(m->eoBtnControl[BTN_SETTINGS], EINA_TRUE);
1263 if (!CViewMgr::GetInstance()->ShowView(MUSIC_BASE_VIEW))
1264 _ERR("CViewMgr::ShowView failed");
1266 if (CViewMgr::GetInstance()->CheckTop(MUSIC_CONTEXT_VIEW)) {
1267 if (!CViewMgr::GetInstance()->UpdateView(MUSIC_CONTEXT_VIEW, NULL))
1268 _ERR("CViewMgr::UpdateView failed");
1270 if (!CViewMgr::GetInstance()->ShowView(MUSIC_CONTEXT_VIEW))
1271 _ERR("CViewMgr::ShowView failed");
1276 void CPlaybackView::m_KeyExitPress(void)
1278 m->pController->Stop();
1283 void CPlaybackView::m_KeyPlayPress(void)
1287 if (elm_object_disabled_get(m->eoBtnControl[BTN_PLAY]))
1290 state = m->pController->PlayState();
1291 if (state == PLAY_STATUS_PAUSE) {
1293 elm_object_signal_emit(m->eoBtnControl[BTN_PLAY],
1294 MUSIC_SIGNAL_PLAY, MUSIC_PLAYBACK_VIEW);
1296 else if (state != PLAY_STATUS_PLAY) {
1297 m->pController->Start();
1302 void CPlaybackView::m_KeyPausePress(void)
1306 if (elm_object_disabled_get(m->eoBtnControl[BTN_PLAY]))
1309 state = m->pController->PlayState();
1310 if (state == PLAY_STATUS_PLAY) {
1311 elm_object_signal_emit(m->eoBtnControl[BTN_PLAY],
1312 MUSIC_SIGNAL_PAUSE, MUSIC_PLAYBACK_VIEW);
1318 void CPlaybackView::m_KeyNextPress(void)
1320 if (elm_object_disabled_get(m->eoBtnControl[BTN_FORWARD]))
1323 m_HandleOnPressed(m->eoBtnControl[BTN_FORWARD]);
1327 void CPlaybackView::m_KeyPreviousPress(void)
1329 if (elm_object_disabled_get(m->eoBtnControl[BTN_REWIND]))
1332 m_HandleOnPressed(m->eoBtnControl[BTN_REWIND]);
1336 void CPlaybackView::m_KeyNextUnpress(void)
1338 if (elm_object_disabled_get(m->eoBtnControl[BTN_FORWARD]))
1341 m_HandleOnUnpressed(m->eoBtnControl[BTN_FORWARD]);
1345 void CPlaybackView::m_KeyPreviousUnpress(void)
1347 if (elm_object_disabled_get(m->eoBtnControl[BTN_REWIND]))
1350 m_HandleOnUnpressed(m->eoBtnControl[BTN_REWIND]);
1354 void CPlaybackView::m_HandleKeyPress(char *keyname)
1356 if (!strcmp(keyname, (char *)KEY_EXIT))
1358 else if (!strcmp(keyname, (char *)KEY_BACK) ||
1359 !strcmp(keyname, (char *)KEY_BACK_REMOTE))
1361 else if (!strcmp(keyname, (char *)KEY_PLAY))
1363 else if (!strcmp(keyname, (char *)KEY_PAUSE))
1365 else if (!strcmp(keyname, (char *)KEY_NEXT))
1367 else if (!strcmp(keyname, (char *)KEY_PREVIOUS))
1368 m_KeyPreviousPress();
1369 else if (!strcmp(keyname, (char *)KEY_VOLUMEUP))
1370 m->pHandleVolume->Up();
1371 else if (!strcmp(keyname, (char *)KEY_VOLUMEDOWN))
1372 m->pHandleVolume->Down();
1373 else if (!strcmp(keyname, (char *)KEY_MUTE))
1374 m->pHandleVolume->Mute();
1378 void CPlaybackView::m_HandleKeyUnpress(char *keyname)
1380 if (!strcmp(keyname, KEY_PREVIOUS))
1381 m_KeyPreviousUnpress();
1382 else if (!strcmp(keyname, KEY_NEXT))
1387 void CPlaybackView::m_AddAlbumCover(void)
1389 Evas_Object *eoAlbumCover = NULL;
1391 eoAlbumCover = elm_image_add(m->eoBase);
1395 evas_object_size_hint_weight_set(eoAlbumCover, EVAS_HINT_EXPAND,
1397 elm_image_aspect_fixed_set(eoAlbumCover, EINA_FALSE);
1399 elm_object_part_content_set(m->eoBase, MUSIC_PART_ALBUMCOVER,
1401 evas_object_show(eoAlbumCover);
1402 m->eoAlbumCover = eoAlbumCover;
1407 void CPlaybackView::m_AddCurrentSonginfo(void)
1411 m->pSliderWidget = new CSliderWidget;
1412 m->pSliderWidget->Create(m->eoBase);
1416 void CPlaybackView::m_AddEditPlaylistButtons(void)
1418 Evas_Object *box = NULL;
1420 SBtnInfo btninfo[TOTAL_EDIT_BTNS];
1422 btninfo[BTN_CANCEL].txt = MUSIC_TEXT_CANCEL;
1423 btninfo[BTN_CANCEL].type = EO_CANCEL;
1425 btninfo[BTN_DESELECT].txt = MUSIC_TEXT_DESELECT;
1426 btninfo[BTN_DESELECT].type = EO_DESELECT;
1428 btninfo[BTN_DELETE].txt = MUSIC_TEXT_DELETE;
1429 btninfo[BTN_DELETE].type = EO_DELETE;
1431 box = CCommonUI::AddBox(m->eoBase);
1435 elm_box_horizontal_set(box, EINA_TRUE);
1436 elm_box_padding_set(box, MUSIC_EDIT_BTNS_PADDING * elm_config_scale_get(), 0);
1438 for (i = 0; i < TOTAL_EDIT_BTNS; i++) {
1439 m->eoBtnEdit[i] = elm_button_add(m->eoBase);
1440 if (!m->eoBtnEdit[i])
1443 elm_object_style_set(m->eoBtnEdit[i], MUSIC_STYLE_EDIT_BTN);
1444 evas_object_size_hint_weight_set(m->eoBtnEdit[i], EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
1445 elm_box_pack_end(box, m->eoBtnEdit[i]);
1446 elm_object_text_set(m->eoBtnEdit[i], _(btninfo[i].txt));
1448 Connect(m->eoBtnEdit[i], btninfo[i].type, TYPE_CLICKED | TYPE_MOUSE_MOVE);
1450 evas_object_show(m->eoBtnEdit[i]);
1452 elm_object_part_content_set(m->eoBase, MUSIC_PART_EDITBTNS, box);
1453 elm_object_signal_emit(m->eoBase, MUSIC_SIGNAL_PLAYBACK_MODE, MUSIC_PLAYBACK_VIEW);
1457 void CPlaybackView::m_AddControlButtons(void)
1459 Evas_Object *box = NULL;
1461 SBtnInfo btninfo[TOTAL_CONTROL_BTNS];
1463 btninfo[BTN_SETTINGS].txt = MUSIC_STYLE_BTN_SETTINGS;
1464 btninfo[BTN_SETTINGS].type = EO_BTN_SETTINGS;
1466 btninfo[BTN_SHUFFLE].txt = MUSIC_STYLE_BTN_SHUFFLE;
1467 btninfo[BTN_SHUFFLE].type = EO_BTN_SHUFFLE;
1469 btninfo[BTN_REPEAT].txt = MUSIC_STYLE_BTN_REPEAT;
1470 btninfo[BTN_REPEAT].type = EO_BTN_REPEAT;
1472 btninfo[BTN_REWIND].txt = MUSIC_STYLE_BTN_REWIND;
1473 btninfo[BTN_REWIND].type = EO_BTN_REWIND;
1475 btninfo[BTN_PLAY].txt = MUSIC_STYLE_BTN_PLAY;
1476 btninfo[BTN_PLAY].type = EO_BTN_PLAY;
1478 btninfo[BTN_FORWARD].txt = MUSIC_STYLE_BTN_FORWARD;
1479 btninfo[BTN_FORWARD].type = EO_BTN_FORWARD;
1481 box = elm_box_add(m->eoBase);
1485 evas_object_size_hint_weight_set(box, EVAS_HINT_EXPAND, 0);
1486 evas_object_size_hint_align_set(box, EVAS_HINT_FILL, 0);
1487 elm_box_horizontal_set(box, EINA_TRUE);
1488 elm_box_padding_set(box,
1489 MUSIC_CONTROL_BTNS_PADDING * elm_config_scale_get(), 0);
1491 for (i = 0; i < TOTAL_CONTROL_BTNS; i++) {
1492 m->eoBtnControl[i] = elm_button_add(m->eoBase);
1493 if (!m->eoBtnControl[i])
1496 elm_object_style_set(m->eoBtnControl[i], btninfo[i].txt);
1497 evas_object_size_hint_weight_set(m->eoBtnControl[i],
1498 EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
1499 elm_box_pack_end(box, m->eoBtnControl[i]);
1501 if (i == BTN_REWIND || i == BTN_FORWARD) {
1502 Connect(m->eoBtnControl[i], btninfo[i].type, TYPE_PRESSED | TYPE_UNPRESSED | TYPE_MOUSE_MOVE);
1505 Connect(m->eoBtnControl[i], btninfo[i].type, TYPE_CLICKED | TYPE_MOUSE_MOVE);
1507 evas_object_show(m->eoBtnControl[i]);
1510 elm_object_part_content_set(m->eoBase, MUSIC_PART_CONTROLBTNS, box);
1514 SItemInfo *CPlaybackView::m_FindItemInfoFromSong(Eina_List *list, CSongInfo *sinfo)
1516 Eina_List *l = NULL;
1517 SItemInfo *itinfo = NULL;
1520 EINA_LIST_FOREACH(list, l, obj) {
1521 itinfo = (SItemInfo *)obj;
1522 if (itinfo->sinfo == sinfo)
1530 SItemInfo *CPlaybackView::m_FindItemInfoFromItem(Eina_List *list, Elm_Object_Item *item)
1532 Eina_List *l = NULL;
1533 SItemInfo *itinfo = NULL;
1536 EINA_LIST_FOREACH(list, l, obj) {
1537 itinfo = (SItemInfo *)obj;
1538 if (itinfo->item == item)
1546 void CPlaybackView::m_UpdateItemCheck(SItemInfo *itinfo)
1549 _ERR(" No item info to Update check ");
1553 if (itinfo->check_status) {
1554 elm_object_item_signal_emit(itinfo->item,
1555 MUSIC_SIGNAL_CHECK_OFF, MUSIC_PLAYBACK_VIEW);
1556 itinfo->check_status = false;
1560 elm_object_item_signal_emit(itinfo->item,
1561 MUSIC_SIGNAL_CHECK_ON, MUSIC_PLAYBACK_VIEW);
1562 itinfo->check_status = true;
1566 class CElmGenlistItemClass {
1568 static char *sm_CbTextGet(void *data, Evas_Object *obj, const char *part)
1570 CSongInfo *sinfo = NULL;
1571 SItemInfo *pItemInfo = (SItemInfo *)data;
1572 char buf[MAX_LENGTH];
1573 char *timestr = NULL;
1577 if (!pItemInfo || !obj)
1580 sinfo = pItemInfo->sinfo;
1582 snprintf(buf, sizeof(buf), "%s", MUSIC_STR_EMPTY);
1584 if (!strcmp(part, "elm.text0")) {
1585 index = elm_genlist_item_index_get(pItemInfo->item);
1586 snprintf(buf, sizeof(buf), "%d", index);
1588 else if (!strcmp(part, "elm.text1"))
1589 snprintf(buf, sizeof(buf), "%s", sinfo->Name());
1590 else if (!strcmp(part, "elm.text2"))
1591 snprintf(buf, sizeof(buf), "%s - %s",
1594 else if (!strcmp(part, "elm.text3")) {
1595 duration = sinfo->Duration();
1596 timestr = CCommonUI::TimeStrFromMilSeconds(duration);
1598 snprintf(buf, sizeof(buf), "%s", timestr);
1603 if (strcmp(buf, MUSIC_STR_EMPTY))
1608 static Evas_Object *sm_CbContentGet(void *data, Evas_Object *obj, const char *part)
1610 CSongInfo *sinfo = NULL;
1611 SItemInfo *pItemInfo = (SItemInfo *)data;
1612 Evas_Object *img = NULL;
1614 char buf[MAX_LENGTH];
1616 if (!pItemInfo || !obj)
1619 sinfo = pItemInfo->sinfo;
1621 img = elm_image_add(obj);
1625 elm_image_aspect_fixed_set(img, EINA_FALSE);
1627 if (!strcmp(part, "elm.swallow.icon")) {
1628 path = sinfo->ThumbnailPath();
1630 elm_image_file_set(img, path, "NULL");
1632 snprintf(buf, sizeof(buf), "%s/%s", IMAGEDIR,
1633 MUSIC_IMAGE_DEFAULT_THUMB_126);
1634 elm_image_file_set(img, buf, "NULL");
1641 static void sm_CbDel(void *data, Evas_Object *obj)
1648 Elm_Genlist_Item_Class *CPlaybackView::m_GetItemClass(void)
1650 Elm_Genlist_Item_Class *list_item = NULL;
1652 list_item = elm_genlist_item_class_new();
1654 _ERR(" elm_genlist_item_class_new failed ");
1658 list_item->item_style = MUSIC_STYLE_PLAYLIST;
1659 list_item->func.text_get = CElmGenlistItemClass::sm_CbTextGet;
1660 list_item->func.content_get = CElmGenlistItemClass::sm_CbContentGet;
1661 list_item->func.state_get = NULL;
1662 list_item->func.del = CElmGenlistItemClass::sm_CbDel;
1668 void CPlaybackView::m_AddGenlist(void)
1670 Evas_Object *genlist = NULL;
1671 Evas_Object *eoBase = NULL;
1674 genlist = elm_genlist_add(eoBase);
1678 elm_genlist_homogeneous_set(genlist, EINA_TRUE);
1679 evas_object_size_hint_weight_set(genlist,
1680 EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
1681 elm_object_part_content_set(eoBase, MUSIC_PART_PLAYLIST, genlist);
1682 elm_genlist_select_mode_set(genlist, ELM_OBJECT_SELECT_MODE_ALWAYS);
1683 elm_genlist_multi_select_set(genlist, EINA_FALSE);
1685 Connect(genlist, EO_PLAYLIST, TYPE_REALIZED | TYPE_MOUSE_MOVE |
1686 TYPE_KEY_DOWN | TYPE_ACTIVATED);
1688 evas_object_show(genlist);
1689 m->eoPlaylist = genlist;
1693 void CPlaybackView::m_AddPlaylist(void)
1695 Elm_Genlist_Item_Class *list_item = NULL;
1698 CSongInfo *sinfo = NULL;
1699 Elm_Object_Item *item = NULL;
1700 SItemInfo *pItemInfo = NULL;
1706 list_item = m_GetItemClass();
1708 evas_object_del(m->eoPlaylist);
1712 if (!m->pController->GetTotalSongs(&ts)) {
1713 _ERR(" music get total songs failed ");
1717 if (!m->pController->GetCurrentSongIndex(&index))
1718 _ERR(" music get current song index failed ");
1720 for (i = 0; i < ts; i++) {
1721 if (!m->pController->GetSonginfoFromIndex(i, &sinfo)) {
1722 _ERR(" music get songinfo failed ");
1725 pItemInfo = (SItemInfo *)calloc(1, sizeof(*pItemInfo));
1728 pItemInfo->sinfo = sinfo;
1729 pItemInfo->edit_mode = false;
1730 pItemInfo->check_status = false;
1731 pItemInfo->select_status = false;
1733 // event handling will be done in OnActivated function
1734 item = elm_genlist_item_append(m->eoPlaylist, list_item,
1735 pItemInfo, NULL, ELM_GENLIST_ITEM_NONE,
1737 pItemInfo->item = item;
1740 pItemInfo->select_status = true;
1741 m->cs_itinfo = pItemInfo;
1743 m->elInfo = eina_list_append(m->elInfo, pItemInfo);
1748 void CPlaybackView::m_RemovePlaylist(void)
1750 if (m->eoPlaylist) {
1751 elm_genlist_clear(m->eoPlaylist);
1752 m->eoPlaylist = NULL;
1756 eina_list_free(m->elInfo);
1762 void CPlaybackView::m_HandleRewindBtnClicked(Evas_Object *obj)
1764 elm_object_signal_emit(obj, MUSIC_SIGNAL_BTN_CLICKED,
1765 MUSIC_PLAYBACK_VIEW);
1767 if (m->pController->PlayState() == PLAY_STATUS_STOP)
1770 if (!m->pController->PlayPreviousSong()){
1771 _ERR(" music play previous song failed ");
1777 void CPlaybackView::m_HandleForwardBtnClicked(Evas_Object *obj)
1779 elm_object_signal_emit(obj, MUSIC_SIGNAL_BTN_CLICKED,
1780 MUSIC_PLAYBACK_VIEW);
1782 if (m->pController->PlayState() == PLAY_STATUS_STOP)
1785 if (!m->pController->PlayNextSong()) {
1786 _ERR(" music play next song failed ");
1792 void CPlaybackView::m_HandleOnPressed(Evas_Object *obj)
1794 m->press_status = PRESS_SHORT;
1795 m->eoPressedObj = obj;
1797 m->etWait = ecore_timer_add(WAIT_INTERVAL, sm_CbWaitTimer, this);
1801 void CPlaybackView::m_HandleOnUnpressed(Evas_Object *obj)
1803 m_RemoveTimer(TIMER_WAIT);
1804 m_RemoveTimer(TIMER_LONGPRESS);
1806 if (m->press_status == PRESS_SHORT) {
1807 /* Handle song change */
1808 if (m->pController->PlayState() == PLAY_STATUS_PLAY)
1811 if (obj == m->eoBtnControl[BTN_FORWARD])
1812 m_HandleForwardBtnClicked(obj);
1814 m_HandleRewindBtnClicked(obj);
1816 if (m->pController->PlayState() != PLAY_STATUS_PLAY)
1819 else if (m->press_status == PRESS_LONG) {
1820 if (m->pController->PlayState() != PLAY_STATUS_PLAY)
1824 m->press_status = PRESS_SHORT;
1828 void CPlaybackView::m_HandleGenlistItemActivated(Evas_Object *obj, Elm_Object_Item *genListItem)
1831 SItemInfo *itinfo = NULL;
1833 if (!obj || !genListItem)
1836 itinfo = m_FindItemInfoFromItem(m->elInfo, genListItem);
1838 _ERR(" no item info found ");
1842 if (itinfo->edit_mode) {
1843 m_UpdateItemCheck(itinfo);
1844 m_DisableEditButtons(false);
1848 index = elm_genlist_item_index_get(genListItem);
1850 m->pController->PlayIndexSong(--index);
1854 bool CPlaybackView::Create(void *data)
1859 _CHECK(m = new SPlaybackView)
1860 _CHECK(m->mgr = CViewMgr::GetInstance())
1861 _CHECK(m->eoWin = m->mgr->Window())
1862 _CHECK(m->pController = new CMusicController)
1863 _CHECK(m->pController->Create())
1864 _CHECK(m->eoBase = CCommonUI::AddBase(m->eoWin, MUSIC_PLAYBACK_VIEW))
1865 _CHECK(CBaseView::Create(data))
1866 _CHECK(CTimer::Create());
1867 _CHECK(m->pController->AddListener(this))
1870 m->press_status = PRESS_SHORT;
1871 evas_object_data_set(m->eoBase, PLAYBACK_VIEW_DATA, m);
1873 m_AddControlButtons();
1874 m_AddEditPlaylistButtons();
1875 m_AddCurrentSonginfo();
1878 m->pHandleVolume = new CHandleVolume;
1879 m->pHandleVolume->Create(m->eoBase);
1880 m_UpdatePlaymodeFocusSequence();
1882 Connect(m->eoBase, EO_BASE, TYPE_KEY_DOWN | TYPE_KEY_UP);
1885 _CHECK_FAIL{ m->pController->RemoveListener(this); }
1886 _CHECK_FAIL{ CTimer::Destroy(); }
1887 _CHECK_FAIL{ CBaseView::Destroy(); }
1888 _CHECK_FAIL{ evas_object_del(m->eoBase); }
1889 _CHECK_FAIL{ m->pController->Destroy(); }
1890 _CHECK_FAIL{ delete m->pController; }
1891 _CHECK_FAIL{ /* mgr->Window() */ }
1892 _CHECK_FAIL{ /* CViewerMgr::GetInstance() */}
1893 _CHECK_FAIL{ delete m; m = NULL; }
1894 }_CREATE_END_AND_CATCH{ return false; }
1900 void CPlaybackView::Destroy(void)
1904 Disconnect(m->eoBase);
1905 m->pController->RemoveListener(this);
1907 m_DestroyErrorPopup();
1909 m->pSliderWidget->Destroy();
1911 m_RemoveTimer(TIMER_WAIT);
1912 m_RemoveTimer(TIMER_LONGPRESS);
1913 m_DestroySettingsPopup();
1915 m->pHandleVolume->Destroy();
1916 delete m->pHandleVolume;
1917 CBaseView::Destroy();
1918 evas_object_del(m->eoBase);
1926 Evas_Object* CPlaybackView::Base(void)
1934 void CPlaybackView::t_OnClickedSettings(Evas_Object *obj)
1936 elm_object_signal_emit(obj, MUSIC_SIGNAL_BTN_CLICKED, MUSIC_PLAYBACK_VIEW);
1938 if (eina_list_count(m->elInfo) == 0)
1941 elm_object_signal_emit(obj, MUSIC_SIGNAL_CONTROL_SELECTED, MUSIC_PLAYBACK_VIEW);
1942 m_DestroySettingsPopup();
1943 m_CreateSettingsPopup();
1947 void CPlaybackView::t_OnClickedShuffle(Evas_Object *obj)
1949 elm_object_signal_emit(obj, MUSIC_SIGNAL_BTN_CLICKED, MUSIC_PLAYBACK_VIEW);
1951 switch (m->pController->ShuffleState()) {
1952 case SHUFFLE_STATUS_OFF:
1953 m->pController->SetShuffleState(SHUFFLE_STATUS_ON);
1954 elm_object_signal_emit(obj, MUSIC_SIGNAL_SHUFFLE_ON, MUSIC_PLAYBACK_VIEW);
1958 m->pController->SetShuffleState(SHUFFLE_STATUS_OFF);
1959 elm_object_signal_emit(obj, MUSIC_SIGNAL_SHUFFLE_OFF, MUSIC_PLAYBACK_VIEW);
1965 void CPlaybackView::t_OnClickedRepeat(Evas_Object *obj)
1967 elm_object_signal_emit(obj, MUSIC_SIGNAL_BTN_CLICKED, MUSIC_PLAYBACK_VIEW);
1969 switch (m->pController->RepeatState()) {
1970 case REPEAT_STATUS_NONE:
1971 m->pController->SetRepeatState(REPEAT_STATUS_ALL);
1972 elm_object_signal_emit(obj, MUSIC_SIGNAL_REPEAT_ALL, MUSIC_PLAYBACK_VIEW);
1975 case REPEAT_STATUS_ALL:
1976 m->pController->SetRepeatState(REPEAT_STATUS_ONE);
1977 elm_object_signal_emit(obj, MUSIC_SIGNAL_REPEAT_ONE, MUSIC_PLAYBACK_VIEW);
1981 m->pController->SetRepeatState(REPEAT_STATUS_NONE);
1982 elm_object_signal_emit(obj, MUSIC_SIGNAL_REPEAT_OFF, MUSIC_PLAYBACK_VIEW);
1988 void CPlaybackView::t_OnClickedPlay(Evas_Object *obj)
1990 elm_object_signal_emit(obj, MUSIC_SIGNAL_BTN_CLICKED, MUSIC_PLAYBACK_VIEW);
1992 switch (m->pController->PlayState()) {
1993 case PLAY_STATUS_PAUSE:
1995 elm_object_signal_emit(obj, MUSIC_SIGNAL_PLAY, MUSIC_PLAYBACK_VIEW);
1998 case PLAY_STATUS_PLAY:
1999 elm_object_signal_emit(obj, MUSIC_SIGNAL_PAUSE, MUSIC_PLAYBACK_VIEW);
2005 m->pController->Start();
2011 void CPlaybackView::t_OnShow(void)
2017 m_UpdateCurrentSongInfo();
2019 state = m->pController->PlayState();
2020 if (state == PLAY_STATUS_INITIAL || state == PLAY_STATUS_STOP) {
2023 m->pController->Start();
2027 elm_genlist_item_show(m->cs_itinfo->item, ELM_GENLIST_ITEM_SCROLLTO_IN);
2028 elm_object_item_focus_set(m->cs_itinfo->item, EINA_TRUE);
2031 evas_object_show(m->eoBase);
2035 void CPlaybackView::t_OnUpdate(void *data)
2039 SParcel *parcel = (SParcel *)data;
2041 char *keyEvent = NULL;
2044 updateType = E_PLAYLIST_UPDATE;
2046 updateType = parcel->updateType;
2047 keyEvent = (char *)parcel->keyEvent;
2050 switch (updateType) {
2051 case E_PLAYLIST_UPDATE:
2054 elm_object_disabled_set(m->eoBtnControl[BTN_FORWARD], EINA_FALSE);
2055 elm_object_disabled_set(m->eoBtnControl[BTN_REWIND], EINA_FALSE);
2056 elm_object_disabled_set(m->eoBtnControl[BTN_PLAY], EINA_FALSE);
2057 elm_object_focus_next_object_set(m->eoBtnControl[BTN_REPEAT],
2058 m->eoBtnControl[BTN_REWIND], ELM_FOCUS_RIGHT);
2059 m_FromEditToPlaybackMode();
2063 m_HandleKeyPress(keyEvent);
2067 m_HandleKeyUnpress(keyEvent);
2076 void CPlaybackView::t_OnHide(void)
2080 evas_object_hide(m->eoBase);
2084 void CPlaybackView::OnKeyDown(int id, Evas *e, Evas_Object *obj, Evas_Event_Key_Down *ev)
2088 m_HandleKeyPress(ev->keyname);
2091 case EO_ERROR_POPUP_BUTTON:
2092 if (!strcmp(ev->keyname, KEY_BACK) ||
2093 !strcmp(ev->keyname, KEY_BACK_REMOTE)) {
2094 m_DestroyErrorPopup();
2095 elm_object_focus_set(m->eoBtnControl[BTN_PLAY], EINA_TRUE);
2101 Elm_Object_Item *it = NULL;
2102 SContentInfo *ctxtinfo = NULL;
2103 SItemInfo *itinfo = NULL;
2105 if (strcmp(ev->keyname, KEY_MENU) &&
2106 strcmp(ev->keyname, KEY_MENU_REMOTE))
2109 it = elm_object_focused_item_get(obj);
2111 _ERR(" unable to get focused item ");
2114 m->focused_item = it;
2121 ctxtinfo = (SContentInfo *)calloc(1, sizeof(*ctxtinfo));
2125 itinfo = m_FindItemInfoFromItem(m->elInfo, it);
2131 if (m->pController->PlayState() == PLAY_STATUS_PLAY &&
2132 itinfo == m->cs_itinfo)
2133 ctxtinfo->status = PLAY_STATUS_PLAY;
2135 ctxtinfo->status = PLAY_STATUS_PAUSE;
2137 ctxtinfo->cbdata = this;
2138 ctxtinfo->update = sm_CbCtxtUpdate;
2139 ctxtinfo->close = sm_CbCtxtClose;
2140 ctxtinfo->type = CONTEXT_TYPE_PLAYSONG;
2141 ctxtinfo->context = itinfo->sinfo;
2143 m->ctxtinfo = ctxtinfo;
2146 memset(&parcel, 0, sizeof(SParcel));
2147 parcel.ctxtInfo = ctxtinfo;
2148 if (!m->mgr->PushView(MUSIC_CONTEXT_VIEW, &parcel))
2149 _ERR("viewmgr push view MUSIC_CONTEXT_VIEW failed");
2158 void CPlaybackView::OnKeyUp(int id, Evas *e, Evas_Object *obj, Evas_Event_Key_Up *ev)
2162 m_HandleKeyUnpress(ev->keyname);
2171 void CPlaybackView::OnMouseClicked(int id, Evas_Object *obj)
2174 case EO_ERROR_POPUP_BUTTON:
2175 m_DestroyErrorPopup();
2176 elm_object_focus_set(m->eoBtnControl[BTN_PLAY], EINA_TRUE);
2180 m_DisableCheckAll(m->elInfo);
2181 m_DisableEditButtons(true);
2182 m_FromEditToPlaybackMode();
2186 m_DisableCheckAll(m->elInfo);
2187 m_DisableEditButtons(true);
2188 elm_genlist_realized_items_update(m->eoPlaylist);
2189 elm_object_focus_set(m->eoBtnEdit[BTN_CANCEL], EINA_TRUE);
2193 m_DeleteSelectedItems();
2196 case EO_BTN_SETTINGS:
2197 t_OnClickedSettings(obj);
2200 case EO_BTN_SHUFFLE:
2201 t_OnClickedShuffle(obj);
2205 t_OnClickedRepeat(obj);
2209 t_OnClickedPlay(obj);
2218 void CPlaybackView::OnMouseMove(int id, Evas *e, Evas_Object *obj, Evas_Event_Mouse_Move *ev)
2224 case EO_BTN_FORWARD:
2228 case EO_BTN_SETTINGS:
2229 case EO_BTN_SHUFFLE:
2230 if (!elm_object_focus_get(obj))
2231 elm_object_focus_set(obj, EINA_TRUE);
2236 Elm_Object_Item *item;
2238 item = elm_genlist_at_xy_item_get(obj, ev->cur.canvas.x,
2239 ev->cur.canvas.y, NULL);
2243 if (!elm_object_item_focus_get(item))
2244 elm_object_item_focus_set(item, EINA_TRUE);
2254 void CPlaybackView::OnPressed(int id, Evas_Object *obj)
2257 case EO_BTN_FORWARD:
2259 m_HandleOnPressed(obj);
2268 void CPlaybackView::OnUnpressed(int id, Evas_Object *obj)
2271 case EO_BTN_FORWARD:
2273 m_HandleOnUnpressed(obj);
2282 void CPlaybackView::OnRealized(int id, Evas_Object *obj, Elm_Object_Item *item)
2287 int index = elm_genlist_item_index_get(item);
2288 if ((index & 1) == 1)
2289 elm_object_item_signal_emit(item,
2290 MUSIC_SIGNAL_EVEN_ROW, MUSIC_PLAYBACK_VIEW);
2292 elm_object_item_signal_emit(item,
2293 MUSIC_SIGNAL_ODD_ROW, MUSIC_PLAYBACK_VIEW);
2295 SItemInfo *itInfo = m_FindItemInfoFromItem(m->elInfo, item);
2296 if (itInfo->select_status)
2297 elm_object_item_signal_emit(item,
2298 MUSIC_SIGNAL_SELECT_ITEM, MUSIC_PLAYBACK_VIEW);
2300 elm_object_item_signal_emit(item,
2301 MUSIC_SIGNAL_UNSELECT_ITEM, MUSIC_PLAYBACK_VIEW);
2303 if (itInfo->edit_mode) {
2304 elm_object_item_signal_emit(item,
2305 MUSIC_SIGNAL_EDITMODE_ON, MUSIC_PLAYBACK_VIEW);
2306 if (itInfo->check_status) {
2307 elm_object_item_signal_emit(item,
2308 MUSIC_SIGNAL_CHECK_ON, MUSIC_PLAYBACK_VIEW);
2311 elm_object_item_signal_emit(item,
2312 MUSIC_SIGNAL_CHECK_OFF, MUSIC_PLAYBACK_VIEW);
2315 elm_object_item_signal_emit(item,
2316 MUSIC_SIGNAL_EDITMODE_OFF, MUSIC_PLAYBACK_VIEW);
2326 void CPlaybackView::OnActivated(int id, Evas_Object *obj, Elm_Object_Item *item)
2330 m_HandleGenlistItemActivated(obj, item);
2339 void CPlaybackView::OnComplete(void)
2341 m_UpdateCurrentSongInfo();
2345 void CPlaybackView::OnError(void)
2347 m_CreateErrorPopup();
2351 void CPlaybackView::OnUsbStatusChanged(SUsbStorageStatus status)
2356 void CPlaybackView::OnUpdateContent(void)
2361 void CPlaybackView::OnStartPlayback(void)
2363 m_UpdateCurrentSongInfo();
2367 void CPlaybackView::OnStopPlayback(void)