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"
23 #include <InputHandler.h>
24 #include "song_info.h"
25 #include "album_info.h"
26 #include "music-controller.h"
27 #include "volume-control.h"
30 #include "common-ui.h"
33 #include "playback-view.h"
34 #include "context-view.h"
35 #include "HandleVolume.h"
36 #include <app-res-defines.h>
37 #include "PlaySettingCtxPopup.h"
41 #define ARRAY_SIZE(array) (sizeof(array) / sizeof(array[0]))
42 #define TITLE_FONT_SIZE 50
43 #define ARTIST_FONT_SIZE 30
44 #define TOTAL_CONTROL_BTNS 6
45 #define TOTAL_EDIT_BTNS 3
46 #define S_INTERVAL 1 /* seconds */
47 #define LP_INTERVAL 0.5 /* seconds */
48 #define WAIT_INTERVAL 0.5 /* seconds */
49 #define SLIDER_STEP 5000 /* milli seconds */
50 #define LP_CHANGE 10000 /* milli seconds */
51 #define S_INCREMENT 1000 /* milli seconds */
57 EO_ERROR_POPUP_BUTTON,
61 EO_DELETE, // TOTAL_EDIT_BTNS
68 EO_BTN_FORWARD, // TOTAL_CONTROL_BTNS
79 Elm_Object_Item *item;
86 struct SPlaybackView {
90 CPlaySettingCtxPopup *eoCtxPopup;
91 Evas_Object *eoErrPopup;
92 Evas_Object *eoPlaylist;
94 Elm_Object_Item *focused_item;
96 Evas_Object *eoBtnControl[TOTAL_CONTROL_BTNS];
97 Evas_Object *eoBtnEdit[TOTAL_EDIT_BTNS];
99 Evas_Object *eoAlbumCover;
100 Evas_Object *eoSlider;
101 Evas_Object *eoPressedObj;
104 Ecore_Timer *etSlider;
105 Ecore_Timer *etLongPress;
107 CMusicController *hMusicController; //! NOT NULL
110 SItemInfo *cs_itinfo;
111 SContentInfo *ctxtinfo;
114 CPlaybackView *parent;
115 CHandleVolume *pHandleVolume;
118 memset(this, 0, sizeof(SPlaybackView));
119 pHandleVolume = new CHandleVolume;
122 delete pHandleVolume;
167 Eina_Bool CPlaybackView::sm_CbUpdateSlider(void *dt)
169 SPlaybackView *m = (SPlaybackView *)dt;
170 char *timestr = NULL;
175 return ECORE_CALLBACK_CANCEL;
177 if (!m->hMusicController->GetPosition(&value)) {
179 return ECORE_CALLBACK_CANCEL;
182 duration = m->csinfo->Duration();
184 value = value + S_INCREMENT;
185 if (value > duration) {
187 return ECORE_CALLBACK_CANCEL;
190 elm_slider_value_set(m->eoSlider, value);
191 timestr = CCommonUI::TimeStrFromMilSeconds(value);
193 elm_object_part_text_set(m->eoBase, MUSIC_PART_PROGRESSTIME,
198 return ECORE_CALLBACK_RENEW;
202 Eina_Bool CPlaybackView::sm_CbLongpressTimer(void *dt)
204 SPlaybackView *m = (SPlaybackView *)dt;
206 m->parent->m_HandleOnRepeated();
208 return ECORE_CALLBACK_RENEW;
212 Eina_Bool CPlaybackView::sm_CbWaitTimer(void *dt)
214 SPlaybackView *m = (SPlaybackView *)dt;
216 m->press_status = PRESS_LONG;
217 if (m->hMusicController->PlayState() == PLAY_STATUS_PLAY) {
218 /* Handle long press */
219 m->parent->m_PlaybackPause();
220 m->etLongPress = ecore_timer_add(LP_INTERVAL, sm_CbLongpressTimer, m);
223 m->press_status = PRESS_LONG_PAUSE;
227 return ECORE_CALLBACK_CANCEL;
231 void CPlaybackView::sm_CbItemSelect(void *data, Evas_Object *obj, void *event_info)
236 void CPlaybackView::sm_CbGenlistItemCheckClicked(void *data, Elm_Object_Item *it, const char *emission, const char *source)
238 CPlaybackView *root = (CPlaybackView*)data;
240 root->m_OnGenlistItemCheckClicked(it, emission, source);
244 void CPlaybackView::m_OnGenlistItemCheckClicked(Elm_Object_Item *it, const char *emission, const char *source)
246 SItemInfo *itinfo = NULL;
248 if (!it || !emission)
251 itinfo = m_FindItemInfoFromItem(m->elInfo, it);
253 _ERR(" no item info found ");
257 if (itinfo->edit_mode) {
258 m_UpdateItemCheck(itinfo);
259 m_DisableEditButtons(false);
264 void CPlaybackView::sm_CbCtxtUpdate(void *dt, enum EActionType type, int lid)
266 SPlaybackView *m = (SPlaybackView *)dt;
267 SItemInfo *itinfo = NULL;
272 if (!m->ctxtinfo || !m->ctxtinfo->context)
275 itinfo = m->parent->m_FindItemInfoFromSong(m->elInfo,
276 (CSongInfo *)m->ctxtinfo->context);
278 _ERR(" Unable to find song in the list ");
282 if (type == ACTION_TYPE_DELETE) {
283 itinfo->check_status = true;
284 m->parent->m_DeleteSelectedItems();
286 else if (type == ACTION_TYPE_PLAY) {
287 if (m->ctxtinfo->status == PLAY_STATUS_PLAY)
288 m->parent->m_KeyPausePress();
290 if (itinfo == m->cs_itinfo)
291 m->parent->m_KeyPlayPress();
293 m->parent->m_HandleGenlistItemActivated(m->eoPlaylist, itinfo->item);
297 _ERR(" Wrong ctxt add type in plaback view ");
299 if (!m->mgr->PushView(MUSIC_PLAYBACK_VIEW, NULL)) {
300 _ERR(" viewmgr show failed ");
303 elm_object_item_focus_set(m->focused_item, EINA_TRUE);
307 void CPlaybackView::sm_CbCtxtClose(void *dt)
309 SPlaybackView *m = (SPlaybackView *)dt;
315 m->mgr->PushView(MUSIC_PLAYBACK_VIEW, NULL);
316 elm_object_item_focus_set(m->focused_item, EINA_TRUE);
320 void CPlaybackView::sm_CbCtxPopupBtnSelected(void* cookie, CCtxPopup* instance, const char* text)
322 CPlaybackView *root = (CPlaybackView *)cookie;
324 root->m_CbCtxPopupBtnSelected(instance, text);
328 void CPlaybackView::m_CbCtxPopupBtnSelected(CCtxPopup* instance, const char* text)
330 int type = CInfo::PlaybackSettingType();
334 m_FromPlaybackToEditMode();
338 m->hMusicController->Stop();
339 m->hMusicController->EmptyPlaylist();
340 eina_list_free(m->elInfo);
342 elm_genlist_clear(m->eoPlaylist);
343 m_UpdateEmptySongInfo();
352 void CPlaybackView::m_RemoveTimer(int timer_code)
354 ETimers timerCode = (ETimers)timer_code;
359 ecore_timer_del(m->etSlider);
366 ecore_timer_del(m->etWait);
371 case TIMER_LONGPRESS:
372 if (m->etLongPress) {
373 ecore_timer_del(m->etLongPress);
374 m->etLongPress = NULL;
379 m->pHandleVolume->RemoveTimer();
383 _ERR(" invalid value ");
389 void CPlaybackView::m_PlaybackPause(void)
391 m->hMusicController->Pause();
394 ecore_timer_freeze(m->etSlider);
398 void CPlaybackView::m_PlaybackResume(void)
400 m->hMusicController->Resume();
403 ecore_timer_thaw(m->etSlider);
407 void CPlaybackView::m_ChangeEditmodeAll(Eina_List *list, bool flag)
409 SItemInfo *itinfo = NULL;
413 EINA_LIST_FOREACH(list, l, obj) {
414 itinfo = (SItemInfo *)obj;
415 itinfo->edit_mode = flag;
420 void CPlaybackView::m_DisableCheckAll(Eina_List *list)
422 SItemInfo *itinfo = NULL;
426 EINA_LIST_FOREACH(list, l, obj) {
427 itinfo = (SItemInfo *)obj;
428 itinfo->check_status = false;
433 void CPlaybackView::m_SelectItem(SItemInfo *pItemInfo)
435 if (!pItemInfo || !pItemInfo->item)
438 elm_genlist_item_bring_in(pItemInfo->item, ELM_GENLIST_ITEM_SCROLLTO_IN);
439 elm_object_item_signal_emit(pItemInfo->item, MUSIC_SIGNAL_SELECT_ITEM, MUSIC_PLAYBACK_VIEW);
441 pItemInfo->select_status = true;
445 void CPlaybackView::m_UnselectItem(SItemInfo *pItemInfo)
447 if (!pItemInfo || !pItemInfo->item)
450 elm_object_item_signal_emit(pItemInfo->item, MUSIC_SIGNAL_UNSELECT_ITEM,
451 MUSIC_PLAYBACK_VIEW);
453 pItemInfo->select_status = false;
457 void CPlaybackView::m_UpdateControlBtns(void)
461 state = m->hMusicController->PlayState();
462 if (state != PLAY_STATUS_STOP) {
463 elm_object_disabled_set(m->eoBtnControl[BTN_FORWARD], EINA_FALSE);
464 elm_object_disabled_set(m->eoBtnControl[BTN_REWIND], EINA_FALSE);
468 elm_object_focus_set(m->eoBtnControl[BTN_PLAY], EINA_TRUE);
469 elm_object_disabled_set(m->eoBtnControl[BTN_FORWARD], EINA_TRUE);
470 elm_object_disabled_set(m->eoBtnControl[BTN_REWIND], EINA_TRUE);
473 if (state == PLAY_STATUS_PLAY) {
474 elm_object_signal_emit(m->eoBtnControl[BTN_PLAY], MUSIC_SIGNAL_PLAY, MUSIC_PLAYBACK_VIEW);
477 elm_object_signal_emit(m->eoBtnControl[BTN_PLAY], MUSIC_SIGNAL_PAUSE, MUSIC_PLAYBACK_VIEW);
480 state = m->hMusicController->ShuffleState();
481 if (state == SHUFFLE_STATUS_OFF) {
482 elm_object_signal_emit(m->eoBtnControl[BTN_SHUFFLE], MUSIC_SIGNAL_SHUFFLE_OFF, MUSIC_PLAYBACK_VIEW);
485 elm_object_signal_emit(m->eoBtnControl[BTN_SHUFFLE], MUSIC_SIGNAL_SHUFFLE_ON, MUSIC_PLAYBACK_VIEW);
488 state = m->hMusicController->RepeatState();
489 if (state == REPEAT_STATUS_NONE) {
490 elm_object_signal_emit(m->eoBtnControl[BTN_REPEAT], MUSIC_SIGNAL_REPEAT_OFF, MUSIC_PLAYBACK_VIEW);
492 else if (state == REPEAT_STATUS_ALL) {
493 elm_object_signal_emit(m->eoBtnControl[BTN_REPEAT], MUSIC_SIGNAL_REPEAT_ALL, MUSIC_PLAYBACK_VIEW);
496 elm_object_signal_emit(m->eoBtnControl[BTN_REPEAT], MUSIC_SIGNAL_REPEAT_ONE, MUSIC_PLAYBACK_VIEW);
501 void CPlaybackView::m_UpdateCurrentSongProgressbar(void)
504 char *timestr = NULL;
511 elm_slider_value_set(m->eoSlider, 0);
512 elm_object_part_text_set(m->eoBase, MUSIC_PART_PROGRESSTIME, "00:00");
514 state = m->hMusicController->PlayState();
516 if (state == PLAY_STATUS_STOP) {
517 elm_object_disabled_set(m->eoSlider, EINA_TRUE);
518 m_RemoveTimer(TIMER_SLIDER);
522 elm_object_disabled_set(m->eoSlider, EINA_FALSE);
524 duration = m->csinfo->Duration();
526 m_RemoveTimer(TIMER_SLIDER);
527 m->etSlider = ecore_timer_add(S_INTERVAL,
528 sm_CbUpdateSlider, m);
530 elm_slider_min_max_set(m->eoSlider, 0, duration);
531 timestr = CCommonUI::TimeStrFromMilSeconds(duration);
533 elm_object_part_text_set(m->eoBase,
534 MUSIC_PART_FULLTIME, timestr);
538 step = (double)SLIDER_STEP / (double)duration;
539 elm_slider_step_set(m->eoSlider, step);
544 void CPlaybackView::m_UpdateCurrentSongThumbnail(void)
547 char buf[MAX_LENGTH];
549 if (!m->cs_itinfo || !m->cs_itinfo->sinfo)
552 path = m->cs_itinfo->sinfo->ThumbnailPath();
554 elm_image_file_set(m->eoAlbumCover, path, NULL);
556 snprintf(buf, sizeof(buf), "%s/%s", IMAGEDIR,
557 MUSIC_IMAGE_DEFAULT_THUMB_450);
558 elm_image_file_set(m->eoAlbumCover, buf, NULL);
563 void CPlaybackView::m_UpdateCurrentSongLabels(void)
565 char buf[MAX_LENGTH];
570 elm_object_part_text_set(m->eoBase, MUSIC_PART_SONG_TITLE,
573 snprintf(buf, sizeof(buf), "%s - %s", m->csinfo->Artist(),
576 elm_object_part_text_set(m->eoBase, MUSIC_PART_ARTIST_ALBUM, buf);
580 void CPlaybackView::m_UpdateEmptySongInfo(void)
582 char buf[MAX_LENGTH];
584 elm_object_signal_emit(m->eoBtnControl[BTN_PLAY],
585 MUSIC_SIGNAL_PAUSE, MUSIC_PLAYBACK_VIEW);
586 elm_object_focus_set(m->eoBtnControl[BTN_SETTINGS], EINA_TRUE);
587 elm_object_focus_next_object_set(m->eoBtnControl[BTN_REPEAT],
588 m->eoBtnControl[BTN_REPEAT], ELM_FOCUS_RIGHT);
589 elm_object_disabled_set(m->eoBtnControl[BTN_FORWARD], EINA_TRUE);
590 elm_object_disabled_set(m->eoBtnControl[BTN_REWIND], EINA_TRUE);
591 elm_object_disabled_set(m->eoBtnControl[BTN_PLAY], EINA_TRUE);
592 elm_object_disabled_set(m->eoSlider, EINA_TRUE);
593 elm_object_part_text_set(m->eoBase, MUSIC_PART_FULLTIME, "00:00");
594 elm_object_part_text_set(m->eoBase, MUSIC_PART_PROGRESSTIME, "00:00");
595 elm_slider_value_set(m->eoSlider, 0);
596 elm_object_part_text_set(m->eoBase, MUSIC_PART_SONG_TITLE,
597 _(NO_PLAYLIST_MESSAGE));
598 elm_object_part_text_set(m->eoBase, MUSIC_PART_ARTIST_ALBUM,
599 _(NO_PLAYLIST_MESSAGE_SUB));
600 snprintf(buf, sizeof(buf), "%s/%s", IMAGEDIR,
601 MUSIC_IMAGE_DEFAULT_THUMB_450);
602 elm_image_file_set(m->eoAlbumCover, buf, NULL);
603 m->hMusicController->SetPlayState(PLAY_STATUS_INITIAL);
607 void CPlaybackView::m_UpdateCtxtView(int playStatus)
609 if (!m->cs_itinfo || !m->ctxtinfo)
612 if (!m->mgr->CheckTop(MUSIC_CONTEXT_VIEW))
615 if (m->cs_itinfo->sinfo == m->ctxtinfo->context) {
616 m->ctxtinfo->status = (EPlayStatus)playStatus;
619 parcel.ctxtInfo = NULL;
620 parcel.updateType = E_SONG_UPDATE;
621 parcel.layoutId = NULL;
622 parcel.keyEvent = NULL;
623 m->mgr->UpdateView((const char *)MUSIC_CONTEXT_VIEW, &parcel);
628 void CPlaybackView::m_UpdateCurrentSongItem(int index)
630 SItemInfo *pItemInfo = NULL;
633 m_UnselectItem(m->cs_itinfo);
634 m_UpdateCtxtView(PLAY_STATUS_PAUSE);
637 pItemInfo = (SItemInfo *)eina_list_nth(m->elInfo, index);
640 m->cs_itinfo = pItemInfo;
641 if (m->hMusicController->PlayState() == PLAY_STATUS_STOP) {
642 elm_genlist_item_bring_in(pItemInfo->item,
643 ELM_GENLIST_ITEM_SCROLLTO_IN);
646 m_SelectItem(pItemInfo);
647 m_UpdateCtxtView(PLAY_STATUS_PLAY);
653 void CPlaybackView::m_UpdateEditmodeFocusSequence(void)
655 elm_object_focus_next_object_set(m->eoPlaylist,
656 m->eoBtnEdit[BTN_CANCEL], ELM_FOCUS_LEFT);
657 elm_object_focus_next_object_set(m->eoBtnEdit[BTN_CANCEL],
658 m->eoPlaylist, ELM_FOCUS_RIGHT);
659 elm_object_focus_next_object_set(m->eoSlider, m->eoBtnEdit[BTN_CANCEL],
664 void CPlaybackView::m_UpdatePlaymodeFocusSequence(void)
666 elm_object_focus_next_object_set(m->eoSlider, m->eoPlaylist,
668 elm_object_focus_next_object_set(m->eoSlider, m->eoBtnControl[BTN_PLAY],
670 if (m->hMusicController->PlayState() == PLAY_STATUS_STOP) {
671 elm_object_focus_next_object_set(m->eoPlaylist,
672 m->eoBtnControl[BTN_PLAY], ELM_FOCUS_LEFT);
673 elm_object_focus_next_object_set(m->eoBtnControl[BTN_PLAY],
674 m->eoPlaylist, ELM_FOCUS_RIGHT);
677 elm_object_focus_next_object_set(m->eoPlaylist,
678 m->eoBtnControl[BTN_FORWARD], ELM_FOCUS_LEFT);
679 elm_object_focus_next_object_set(m->eoBtnControl[BTN_FORWARD],
680 m->eoPlaylist, ELM_FOCUS_RIGHT);
681 elm_object_focus_next_object_set(m->eoBtnControl[BTN_PLAY],
682 m->eoBtnControl[BTN_FORWARD], ELM_FOCUS_RIGHT);
687 void CPlaybackView::m_UpdateCurrentSongInfo(void)
689 CSongInfo *sinfo = NULL;
692 if (eina_list_count(m->elInfo) == 0) {
693 m_UpdateEmptySongInfo();
697 if (!m->hMusicController->GetCurrentSongIndex(&index)) {
698 _ERR(" music get current song index failed ");
702 if (!m->hMusicController->GetSonginfoFromIndex(index, &sinfo)) {
703 _ERR(" music get songinfo failed ");
708 m_UpdateCurrentSongItem(index);
709 m_UpdateCurrentSongLabels();
710 m_UpdateCurrentSongThumbnail();
711 m_UpdateCurrentSongProgressbar();
712 m_UpdateControlBtns();
713 m_UpdatePlaymodeFocusSequence();
717 void CPlaybackView::m_DisableEditButtons(bool flag)
719 /* flag - 1 means disable edit buttons and 0 means enable */
721 elm_object_focus_set(m->eoBtnEdit[BTN_CANCEL], EINA_TRUE);
723 elm_object_disabled_set(m->eoBtnEdit[BTN_DELETE], (Eina_Bool)flag);
724 elm_object_disabled_set(m->eoBtnEdit[BTN_DESELECT], (Eina_Bool)flag);
726 m_UpdateEditmodeFocusSequence();
727 elm_object_focus_set(m->eoBtnEdit[BTN_CANCEL], EINA_TRUE);
730 elm_object_focus_next_object_set(m->eoBtnEdit[BTN_CANCEL],
731 m->eoBtnEdit[BTN_DESELECT], ELM_FOCUS_RIGHT);
732 elm_object_focus_next_object_set(m->eoBtnEdit[BTN_DELETE],
733 m->eoPlaylist, ELM_FOCUS_RIGHT);
734 elm_object_focus_next_object_set(m->eoPlaylist,
735 m->eoBtnEdit[BTN_DELETE], ELM_FOCUS_LEFT);
740 void CPlaybackView::m_CreateErrorPopup(void)
742 Evas_Object *popup = NULL, *btn = NULL, *label = NULL;
744 popup = elm_popup_add(m->eoBase);
748 elm_object_style_set(popup, MUSIC_STYLE_ERROR_POPUP);
749 evas_object_show(popup);
751 label = elm_label_add(popup);
753 evas_object_del(popup);
757 elm_object_style_set(label, MUSIC_STYLE_ERROR_LABEL);
758 elm_object_text_set(label, MUSIC_TEXT_PLAYBACK_ERROR);
759 elm_object_content_set(popup, label);
761 btn = elm_button_add(popup);
763 evas_object_del(popup);
767 elm_object_style_set(btn, MUSIC_STYLE_EDIT_BTN);
768 elm_object_text_set(btn, MUSIC_TEXT_OK);
769 elm_object_part_content_set(popup, MUSIC_PART_POPUP_BUTTON, btn);
771 m->eoErrPopup = popup;
773 Connect(btn, EO_ERROR_POPUP_BUTTON, TYPE_CLICKED | TYPE_KEY_DOWN);
775 elm_object_focus_set(btn, EINA_TRUE);
781 void CPlaybackView::m_DestroyErrorPopup(void)
786 evas_object_del(m->eoErrPopup);
787 m->eoErrPopup = NULL;
791 void CPlaybackView::m_CreateSettingsPopup(void)
793 CPlaySettingCtxPopup *eoCtxPopup = new CPlaySettingCtxPopup;
794 CCtxPopup::SCallback cb;
796 cb.onSelected = sm_CbCtxPopupBtnSelected;
798 eoCtxPopup->Create(m->eoWin, &cb);
800 m->eoCtxPopup = eoCtxPopup;
804 void CPlaybackView::m_DestroySettingsPopup(void)
809 if (m->eoCtxPopup->FlagCreate())
810 m->eoCtxPopup->Destroy();
812 delete m->eoCtxPopup;
813 m->eoCtxPopup = NULL;
817 void CPlaybackView::m_FromEditToPlaybackMode(void)
819 if (m->hMusicController->PlayState() == PLAY_STATUS_STOP) {
820 elm_genlist_item_bring_in(m->cs_itinfo->item,
821 ELM_GENLIST_ITEM_SCROLLTO_IN);
824 m_SelectItem(m->cs_itinfo);
826 elm_object_signal_emit(m->eoBase, MUSIC_SIGNAL_PLAYBACK_MODE,
827 MUSIC_PLAYBACK_VIEW);
828 elm_object_focus_set(m->eoBtnControl[BTN_SETTINGS], EINA_TRUE);
830 m_ChangeEditmodeAll(m->elInfo, false);
832 elm_genlist_realized_items_update(m->eoPlaylist);
834 m_UpdatePlaymodeFocusSequence();
838 void CPlaybackView::m_FromPlaybackToEditMode(void)
840 elm_object_signal_emit(m->eoBase, MUSIC_SIGNAL_EDIT_MODE,
841 MUSIC_PLAYBACK_VIEW);
843 m_DisableEditButtons(true);
845 elm_object_focus_set(m->eoBtnEdit[BTN_CANCEL], EINA_TRUE);
847 m_ChangeEditmodeAll(m->elInfo, true);
849 elm_genlist_realized_items_update(m->eoPlaylist);
851 m_UpdateEditmodeFocusSequence();
855 void CPlaybackView::m_HandleOnRepeated(void)
857 Evas_Object *obj = NULL;
860 char *timestr = NULL;
862 if (!m->eoPressedObj)
865 obj = m->eoPressedObj;
867 value = elm_slider_value_get(m->eoSlider);
868 duration = m->cs_itinfo->sinfo->Duration();
870 if (obj == m->eoBtnControl[BTN_REWIND]) {
872 m_RemoveTimer(TIMER_LONGPRESS);
875 value = value - LP_CHANGE;
880 if (value == duration) {
881 if (m->hMusicController->PlayNextSong())
882 m_UpdateCurrentSongInfo();
884 _ERR(" music play next song failed ");
886 m->press_status = PRESS_LONG_PAUSE;
887 elm_object_signal_emit(m->eoBtnControl[BTN_PLAY], MUSIC_SIGNAL_PAUSE,
888 MUSIC_PLAYBACK_VIEW);
890 m_RemoveTimer(TIMER_LONGPRESS);
894 value = value + LP_CHANGE;
895 if (value >= duration)
899 m->hMusicController->SetPosition(value);
900 elm_slider_value_set(m->eoSlider, value);
901 timestr = CCommonUI::TimeStrFromMilSeconds(value);
903 elm_object_part_text_set(m->eoBase, MUSIC_PART_PROGRESSTIME,
912 void CPlaybackView::m_DeleteSelectedItems(void)
914 Eina_List *l = NULL, *l_next = NULL;
915 SItemInfo *pItemInfo = NULL;
920 m_DisableEditButtons(true);
921 EINA_LIST_FOREACH_SAFE(m->elInfo, l, l_next, obj) {
922 pItemInfo = (SItemInfo *)obj;
923 if (pItemInfo->check_status) {
924 if (m->cs_itinfo == pItemInfo) {
926 m_UnselectItem(m->cs_itinfo);
927 m_RemoveTimer(TIMER_SLIDER);
929 m->hMusicController->SetPlayState(PLAY_STATUS_STOP);
930 m->hMusicController->Stop();
932 index = elm_genlist_item_index_get(pItemInfo->item);
933 m->hMusicController->RemoveSong(pItemInfo->sinfo, index);
935 m->elInfo = eina_list_remove(m->elInfo,
937 elm_object_item_del(pItemInfo->item);
941 if (eina_list_count(m->elInfo) == 0) {
942 m_UpdateEmptySongInfo();
943 elm_genlist_realized_items_update(m->eoPlaylist);
944 elm_object_focus_set(m->eoBtnEdit[BTN_CANCEL], EINA_TRUE);
949 m_UpdateCurrentSongInfo();
951 elm_genlist_realized_items_update(m->eoPlaylist);
952 elm_object_focus_set(m->eoBtnEdit[BTN_CANCEL], EINA_TRUE);
956 void CPlaybackView::m_KeyBackPress(void)
959 m_DestroySettingsPopup();
960 elm_object_focus_set(m->eoBtnControl[BTN_SETTINGS], EINA_FALSE);
961 elm_object_focus_set(m->eoBtnControl[BTN_SETTINGS], EINA_TRUE);
966 m->mgr->PushView(MUSIC_BASE_VIEW, NULL);
970 void CPlaybackView::m_KeyExitPress(void)
972 m_RemoveTimer(TIMER_SLIDER);
973 m->hMusicController->Stop();
978 void CPlaybackView::m_KeyPlayPress(void)
982 if (elm_object_disabled_get(m->eoBtnControl[BTN_PLAY]))
985 state = m->hMusicController->PlayState();
986 if (state == PLAY_STATUS_PAUSE) {
988 elm_object_signal_emit(m->eoBtnControl[BTN_PLAY],
989 MUSIC_SIGNAL_PLAY, MUSIC_PLAYBACK_VIEW);
991 else if (state != PLAY_STATUS_PLAY) {
992 if (m->hMusicController)
993 m->hMusicController->Start();
995 m_UpdateCurrentSongInfo();
1000 void CPlaybackView::m_KeyPausePress(void)
1004 if (elm_object_disabled_get(m->eoBtnControl[BTN_PLAY]))
1007 state = m->hMusicController->PlayState();
1008 if (state == PLAY_STATUS_PLAY) {
1009 elm_object_signal_emit(m->eoBtnControl[BTN_PLAY],
1010 MUSIC_SIGNAL_PAUSE, MUSIC_PLAYBACK_VIEW);
1016 void CPlaybackView::m_KeyNextPress(void)
1018 if (elm_object_disabled_get(m->eoBtnControl[BTN_FORWARD]))
1021 m_HandleOnPressed(m->eoBtnControl[BTN_FORWARD]);
1025 void CPlaybackView::m_KeyPreviousPress(void)
1027 if (elm_object_disabled_get(m->eoBtnControl[BTN_REWIND]))
1030 m_HandleOnPressed(m->eoBtnControl[BTN_REWIND]);
1034 void CPlaybackView::m_KeyNextUnpress(void)
1036 if (elm_object_disabled_get(m->eoBtnControl[BTN_FORWARD]))
1039 m_HandleOnUnpressed(m->eoBtnControl[BTN_FORWARD]);
1043 void CPlaybackView::m_KeyPreviousUnpress(void)
1045 if (elm_object_disabled_get(m->eoBtnControl[BTN_REWIND]))
1048 m_HandleOnUnpressed(m->eoBtnControl[BTN_REWIND]);
1052 void CPlaybackView::m_HandleKeyPress(char *keyname)
1054 if (!strcmp(keyname, (char *)KEY_EXIT))
1056 else if (!strcmp(keyname, (char *)KEY_BACK) ||
1057 !strcmp(keyname, (char *)KEY_BACK_REMOTE))
1059 else if (!strcmp(keyname, (char *)KEY_PLAY))
1061 else if (!strcmp(keyname, (char *)KEY_PAUSE))
1063 else if (!strcmp(keyname, (char *)KEY_NEXT))
1065 else if (!strcmp(keyname, (char *)KEY_PREVIOUS))
1066 m_KeyPreviousPress();
1067 else if (!strcmp(keyname, (char *)KEY_VOLUMEUP))
1068 m->pHandleVolume->Up();
1069 else if (!strcmp(keyname, (char *)KEY_VOLUMEDOWN))
1070 m->pHandleVolume->Down();
1071 else if (!strcmp(keyname, (char *)KEY_MUTE))
1072 m->pHandleVolume->Mute();
1076 void CPlaybackView::m_HandleKeyUnpress(char *keyname)
1078 if (!strcmp(keyname, KEY_PREVIOUS))
1079 m_KeyPreviousUnpress();
1080 else if (!strcmp(keyname, KEY_NEXT))
1085 void CPlaybackView::m_AddSlider(void)
1087 Evas_Object *eoSlider = NULL;
1089 eoSlider = elm_slider_add(m->eoBase);
1093 elm_slider_indicator_show_set(eoSlider, EINA_FALSE);
1094 elm_slider_indicator_show_on_focus_set(eoSlider, EINA_FALSE);
1095 elm_object_style_set(eoSlider, MUSIC_STYLE_SLIDER);
1096 elm_slider_horizontal_set(eoSlider, EINA_TRUE);
1097 elm_object_part_content_set(m->eoBase, MUSIC_PART_PROGRESSBAR, eoSlider);
1099 Connect(eoSlider, EO_SLIDER, TYPE_CHANGED | TYPE_MOUSE_MOVE);
1101 evas_object_show(eoSlider);
1102 m->eoSlider = eoSlider;
1106 void CPlaybackView::m_AddAlbumCover(void)
1108 Evas_Object *eoAlbumCover = NULL;
1110 eoAlbumCover = elm_image_add(m->eoBase);
1114 evas_object_size_hint_weight_set(eoAlbumCover, EVAS_HINT_EXPAND,
1116 elm_image_aspect_fixed_set(eoAlbumCover, EINA_FALSE);
1118 elm_object_part_content_set(m->eoBase, MUSIC_PART_ALBUMCOVER,
1120 evas_object_show(eoAlbumCover);
1121 m->eoAlbumCover = eoAlbumCover;
1126 void CPlaybackView::m_AddCurrentSonginfo(void)
1133 void CPlaybackView::m_AddEditPlaylistButtons(void)
1135 Evas_Object *box = NULL;
1137 SBtnInfo btninfo[TOTAL_EDIT_BTNS];
1139 btninfo[BTN_CANCEL].txt = MUSIC_TEXT_CANCEL;
1140 btninfo[BTN_CANCEL].type = EO_CANCEL;
1142 btninfo[BTN_DESELECT].txt = MUSIC_TEXT_DESELECT;
1143 btninfo[BTN_DESELECT].type = EO_DESELECT;
1145 btninfo[BTN_DELETE].txt = MUSIC_TEXT_DELETE;
1146 btninfo[BTN_DELETE].type = EO_DELETE;
1148 box = CCommonUI::AddBox(m->eoBase);
1152 elm_box_horizontal_set(box, EINA_TRUE);
1153 elm_box_padding_set(box,
1154 MUSIC_EDIT_BTNS_PADDING * elm_config_scale_get(), 0);
1156 for (i = 0; i < TOTAL_EDIT_BTNS; i++) {
1157 m->eoBtnEdit[i] = elm_button_add(m->eoBase);
1158 if (!m->eoBtnEdit[i])
1161 elm_object_style_set(m->eoBtnEdit[i],
1162 MUSIC_STYLE_EDIT_BTN);
1163 evas_object_size_hint_weight_set(m->eoBtnEdit[i],
1164 EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
1165 elm_box_pack_end(box, m->eoBtnEdit[i]);
1166 elm_object_text_set(m->eoBtnEdit[i], _(btninfo[i].txt));
1168 Connect(m->eoBtnEdit[i], btninfo[i].type, TYPE_CLICKED | TYPE_MOUSE_MOVE);
1170 evas_object_show(m->eoBtnEdit[i]);
1172 elm_object_part_content_set(m->eoBase, MUSIC_PART_EDITBTNS, box);
1173 elm_object_signal_emit(m->eoBase, MUSIC_SIGNAL_PLAYBACK_MODE,
1174 MUSIC_PLAYBACK_VIEW);
1178 void CPlaybackView::m_AddControlButtons(void)
1180 Evas_Object *box = NULL;
1182 SBtnInfo btninfo[TOTAL_CONTROL_BTNS];
1184 btninfo[BTN_SETTINGS].txt = MUSIC_STYLE_BTN_SETTINGS;
1185 btninfo[BTN_SETTINGS].type = EO_BTN_SETTINGS;
1187 btninfo[BTN_SHUFFLE].txt = MUSIC_STYLE_BTN_SHUFFLE;
1188 btninfo[BTN_SHUFFLE].type = EO_BTN_SHUFFLE;
1190 btninfo[BTN_REPEAT].txt = MUSIC_STYLE_BTN_REPEAT;
1191 btninfo[BTN_REPEAT].type = EO_BTN_REPEAT;
1193 btninfo[BTN_REWIND].txt = MUSIC_STYLE_BTN_REWIND;
1194 btninfo[BTN_REWIND].type = EO_BTN_REWIND;
1196 btninfo[BTN_PLAY].txt = MUSIC_STYLE_BTN_PLAY;
1197 btninfo[BTN_PLAY].type = EO_BTN_PLAY;
1199 btninfo[BTN_FORWARD].txt = MUSIC_STYLE_BTN_FORWARD;
1200 btninfo[BTN_FORWARD].type = EO_BTN_FORWARD;
1202 box = elm_box_add(m->eoBase);
1206 evas_object_size_hint_weight_set(box, EVAS_HINT_EXPAND, 0);
1207 evas_object_size_hint_align_set(box, EVAS_HINT_FILL, 0);
1208 elm_box_horizontal_set(box, EINA_TRUE);
1209 elm_box_padding_set(box,
1210 MUSIC_CONTROL_BTNS_PADDING * elm_config_scale_get(), 0);
1212 for (i = 0; i < TOTAL_CONTROL_BTNS; i++) {
1213 m->eoBtnControl[i] = elm_button_add(m->eoBase);
1214 if (!m->eoBtnControl[i])
1217 elm_object_style_set(m->eoBtnControl[i], btninfo[i].txt);
1218 evas_object_size_hint_weight_set(m->eoBtnControl[i],
1219 EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
1220 elm_box_pack_end(box, m->eoBtnControl[i]);
1222 if (i == BTN_REWIND || i == BTN_FORWARD) {
1223 Connect(m->eoBtnControl[i], btninfo[i].type, TYPE_PRESSED | TYPE_UNPRESSED | TYPE_MOUSE_MOVE);
1226 Connect(m->eoBtnControl[i], btninfo[i].type, TYPE_CLICKED | TYPE_MOUSE_MOVE);
1228 evas_object_show(m->eoBtnControl[i]);
1231 elm_object_part_content_set(m->eoBase, MUSIC_PART_CONTROLBTNS, box);
1235 SItemInfo *CPlaybackView::m_FindItemInfoFromSong(Eina_List *list, CSongInfo *sinfo)
1237 Eina_List *l = NULL;
1238 SItemInfo *itinfo = NULL;
1241 EINA_LIST_FOREACH(list, l, obj) {
1242 itinfo = (SItemInfo *)obj;
1243 if (itinfo->sinfo == sinfo)
1251 SItemInfo *CPlaybackView::m_FindItemInfoFromItem(Eina_List *list, Elm_Object_Item *item)
1253 Eina_List *l = NULL;
1254 SItemInfo *itinfo = NULL;
1257 EINA_LIST_FOREACH(list, l, obj) {
1258 itinfo = (SItemInfo *)obj;
1259 if (itinfo->item == item)
1267 void CPlaybackView::m_UpdateItemCheck(SItemInfo *itinfo)
1270 _ERR(" No item info to Update check ");
1274 if (itinfo->check_status) {
1275 elm_object_item_signal_emit(itinfo->item,
1276 MUSIC_SIGNAL_CHECK_OFF, MUSIC_PLAYBACK_VIEW);
1277 itinfo->check_status = false;
1281 elm_object_item_signal_emit(itinfo->item,
1282 MUSIC_SIGNAL_CHECK_ON, MUSIC_PLAYBACK_VIEW);
1283 itinfo->check_status = true;
1287 class CElmGenlistItemClass {
1289 static char *sm_CbTextGet(void *data, Evas_Object *obj, const char *part)
1291 CSongInfo *sinfo = NULL;
1292 SItemInfo *pItemInfo = (SItemInfo *)data;
1293 char buf[MAX_LENGTH];
1294 char *timestr = NULL;
1298 if (!pItemInfo || !obj)
1301 sinfo = pItemInfo->sinfo;
1303 snprintf(buf, sizeof(buf), "%s", MUSIC_STR_EMPTY);
1305 if (!strcmp(part, "elm.text0")) {
1306 index = elm_genlist_item_index_get(pItemInfo->item);
1307 snprintf(buf, sizeof(buf), "%d", index);
1308 if ((index & 1) == 1) {
1309 elm_object_item_signal_emit(pItemInfo->item,
1310 MUSIC_SIGNAL_EVEN_ROW, MUSIC_PLAYBACK_VIEW);
1313 elm_object_item_signal_emit(pItemInfo->item,
1314 MUSIC_SIGNAL_ODD_ROW, MUSIC_PLAYBACK_VIEW);
1317 else if (!strcmp(part, "elm.text1"))
1318 snprintf(buf, sizeof(buf), "%s", sinfo->Name());
1319 else if (!strcmp(part, "elm.text2"))
1320 snprintf(buf, sizeof(buf), "%s - %s",
1323 else if (!strcmp(part, "elm.text3")) {
1324 duration = sinfo->Duration();
1325 timestr = CCommonUI::TimeStrFromMilSeconds(duration);
1327 snprintf(buf, sizeof(buf), "%s", timestr);
1332 if (strcmp(buf, MUSIC_STR_EMPTY))
1337 static Evas_Object *sm_CbContentGet(void *data, Evas_Object *obj, const char *part)
1339 CSongInfo *sinfo = NULL;
1340 SItemInfo *pItemInfo = (SItemInfo *)data;
1341 Evas_Object *img = NULL;
1343 char buf[MAX_LENGTH];
1345 if (!pItemInfo || !obj)
1348 sinfo = pItemInfo->sinfo;
1350 img = elm_image_add(obj);
1354 elm_image_aspect_fixed_set(img, EINA_FALSE);
1356 if (!strcmp(part, "elm.swallow.icon")) {
1357 path = sinfo->ThumbnailPath();
1359 elm_image_file_set(img, path, "NULL");
1361 snprintf(buf, sizeof(buf), "%s/%s", IMAGEDIR,
1362 MUSIC_IMAGE_DEFAULT_THUMB_126);
1363 elm_image_file_set(img, buf, "NULL");
1367 if (pItemInfo->select_status) {
1368 elm_object_item_signal_emit(pItemInfo->item,
1369 MUSIC_SIGNAL_SELECT_ITEM, MUSIC_PLAYBACK_VIEW);
1372 elm_object_item_signal_emit(pItemInfo->item,
1373 MUSIC_SIGNAL_UNSELECT_ITEM,
1374 MUSIC_PLAYBACK_VIEW);
1377 if (pItemInfo->edit_mode) {
1378 elm_object_item_signal_emit(pItemInfo->item,
1379 MUSIC_SIGNAL_EDITMODE_ON, MUSIC_PLAYBACK_VIEW);
1380 if (pItemInfo->check_status) {
1381 elm_object_item_signal_emit(pItemInfo->item,
1382 MUSIC_SIGNAL_CHECK_ON,
1383 MUSIC_PLAYBACK_VIEW);
1386 elm_object_item_signal_emit(pItemInfo->item,
1387 MUSIC_SIGNAL_CHECK_OFF, MUSIC_PLAYBACK_VIEW);
1391 elm_object_item_signal_emit(pItemInfo->item,
1392 MUSIC_SIGNAL_EDITMODE_OFF, MUSIC_PLAYBACK_VIEW);
1398 static void sm_CbDel(void *data, Evas_Object *obj)
1405 Elm_Genlist_Item_Class *CPlaybackView::m_GetItemClass(void)
1407 Elm_Genlist_Item_Class *list_item = NULL;
1409 list_item = elm_genlist_item_class_new();
1411 _ERR(" elm_genlist_item_class_new failed ");
1415 list_item->item_style = MUSIC_STYLE_PLAYLIST;
1416 list_item->func.text_get = CElmGenlistItemClass::sm_CbTextGet;
1417 list_item->func.content_get = CElmGenlistItemClass::sm_CbContentGet;
1418 list_item->func.state_get = NULL;
1419 list_item->func.del = CElmGenlistItemClass::sm_CbDel;
1425 void CPlaybackView::m_AddGenlist(void)
1427 Evas_Object *genlist = NULL;
1428 Evas_Object *eoBase = NULL;
1431 genlist = elm_genlist_add(eoBase);
1435 elm_genlist_homogeneous_set(genlist, EINA_TRUE);
1436 evas_object_size_hint_weight_set(genlist,
1437 EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
1438 elm_object_part_content_set(eoBase, MUSIC_PART_PLAYLIST, genlist);
1439 elm_genlist_select_mode_set(genlist, ELM_OBJECT_SELECT_MODE_ALWAYS);
1440 elm_genlist_multi_select_set(genlist, EINA_FALSE);
1442 Connect(genlist, EO_PLAYLIST, TYPE_REALIZED | TYPE_UNREALIZED | TYPE_MOUSE_MOVE | TYPE_KEY_DOWN | TYPE_ACTIVATED);
1444 evas_object_show(genlist);
1445 m->eoPlaylist = genlist;
1449 void CPlaybackView::m_AddPlaylist(void)
1451 Elm_Genlist_Item_Class *list_item = NULL;
1454 CSongInfo *sinfo = NULL;
1455 Elm_Object_Item *item = NULL;
1456 SItemInfo *pItemInfo = NULL;
1462 list_item = m_GetItemClass();
1464 evas_object_del(m->eoPlaylist);
1468 if (!m->hMusicController->GetTotalSongs(&ts)) {
1469 _ERR(" music get total songs failed ");
1473 if (!m->hMusicController->GetCurrentSongIndex(&index))
1474 _ERR(" music get current song index failed ");
1476 for (i = 0; i < ts; i++) {
1477 if (!m->hMusicController->GetSonginfoFromIndex(i, &sinfo)) {
1478 _ERR(" music get songinfo failed ");
1481 pItemInfo = (SItemInfo *)calloc(1, sizeof(*pItemInfo));
1484 pItemInfo->sinfo = sinfo;
1485 pItemInfo->edit_mode = false;
1486 pItemInfo->check_status = false;
1487 pItemInfo->select_status = false;
1489 item = elm_genlist_item_append(m->eoPlaylist, list_item,
1490 pItemInfo, NULL, ELM_GENLIST_ITEM_NONE,
1491 sm_CbItemSelect, m);
1492 pItemInfo->item = item;
1495 pItemInfo->select_status = true;
1496 m->cs_itinfo = pItemInfo;
1498 m->elInfo = eina_list_append(m->elInfo, pItemInfo);
1503 void CPlaybackView::m_RemovePlaylist(void)
1505 if (m->eoPlaylist) {
1506 elm_genlist_clear(m->eoPlaylist);
1507 m->eoPlaylist = NULL;
1511 eina_list_free(m->elInfo);
1517 void CPlaybackView::m_HandleRewindBtnClicked(Evas_Object *obj)
1519 elm_object_signal_emit(obj, MUSIC_SIGNAL_BTN_CLICKED,
1520 MUSIC_PLAYBACK_VIEW);
1522 if (m->hMusicController->PlayState() == PLAY_STATUS_STOP)
1525 if (!m->hMusicController->PlayPreviousSong()){
1526 _ERR(" music play previous song failed ");
1530 m_UpdateCurrentSongInfo();
1534 void CPlaybackView::m_HandleForwardBtnClicked(Evas_Object *obj)
1536 elm_object_signal_emit(obj, MUSIC_SIGNAL_BTN_CLICKED,
1537 MUSIC_PLAYBACK_VIEW);
1539 if (m->hMusicController->PlayState() == PLAY_STATUS_STOP)
1542 if (!m->hMusicController->PlayNextSong()) {
1543 _ERR(" music play next song failed ");
1547 m_UpdateCurrentSongInfo();
1551 void CPlaybackView::m_HandleOnPressed(Evas_Object *obj)
1553 m->press_status = PRESS_SHORT;
1554 m->eoPressedObj = obj;
1556 m->etWait = ecore_timer_add(WAIT_INTERVAL, sm_CbWaitTimer, m);
1560 void CPlaybackView::m_HandleOnUnpressed(Evas_Object *obj)
1562 m_RemoveTimer(TIMER_WAIT);
1563 m_RemoveTimer(TIMER_LONGPRESS);
1565 if (m->press_status == PRESS_SHORT) {
1566 /* Handle song change */
1567 if (m->hMusicController->PlayState() == PLAY_STATUS_PLAY)
1570 if (obj == m->eoBtnControl[BTN_FORWARD])
1571 m_HandleForwardBtnClicked(obj);
1573 m_HandleRewindBtnClicked(obj);
1575 if (m->hMusicController->PlayState() != PLAY_STATUS_PLAY)
1578 else if (m->press_status == PRESS_LONG) {
1579 if (m->hMusicController->PlayState() != PLAY_STATUS_PLAY)
1583 m->press_status = PRESS_SHORT;
1587 void CPlaybackView::m_HandleGenlistItemActivated(Evas_Object *obj, Elm_Object_Item *genListItem)
1590 SItemInfo *itinfo = NULL;
1592 if (!obj || !genListItem)
1595 itinfo = m_FindItemInfoFromItem(m->elInfo, genListItem);
1597 _ERR(" no item info found ");
1601 if (itinfo->edit_mode) {
1602 m_UpdateItemCheck(itinfo);
1603 m_DisableEditButtons(false);
1607 index = elm_genlist_item_index_get(genListItem);
1609 m->hMusicController->PlayIndexSong(--index);
1610 m_UpdateCurrentSongInfo();
1614 bool CPlaybackView::Create(void *data)
1619 _CHECK(m = new SPlaybackView)
1620 _CHECK(m->mgr = CViewMgr::GetInstance())
1621 _CHECK(m->eoWin = m->mgr->Window())
1622 _CHECK(m->hMusicController = CMusicController::GetInstance())
1623 _CHECK(m->eoBase = CCommonUI::AddBase(m->eoWin, MUSIC_PLAYBACK_VIEW))
1624 _CHECK(CBaseView::Create(data))
1626 _CHECK_FAIL{ CBaseView::Destroy(); }
1627 _CHECK_FAIL{ evas_object_del(m->eoBase); }
1628 _CHECK_FAIL{ /* CMusicController::GetInstance())*/ }
1629 _CHECK_FAIL{ /* mgr->Window() */ }
1630 _CHECK_FAIL{ /* CViewerMgr::GetInstance() */}
1631 _CHECK_FAIL{ delete m; m = NULL; }
1632 }_CREATE_END_AND_CATCH{ return false; }
1634 m->press_status = PRESS_SHORT;
1637 evas_object_data_set(m->eoBase, PLAYBACK_VIEW_DATA, m);
1639 m_AddControlButtons();
1640 m_AddEditPlaylistButtons();
1641 m_AddCurrentSonginfo();
1644 m->pHandleVolume->Create(m->eoBase);
1645 m_UpdatePlaymodeFocusSequence();
1647 Connect(m->eoBase, EO_BASE, TYPE_KEY_DOWN | TYPE_KEY_UP);
1649 m->hMusicController->AddListener(this);
1655 void CPlaybackView::Destroy(void)
1659 m->hMusicController->RemoveListener(this);
1661 m_DestroyErrorPopup();
1663 m_RemoveTimer(TIMER_SLIDER);
1664 m_RemoveTimer(TIMER_WAIT);
1665 m_RemoveTimer(TIMER_LONGPRESS);
1666 m_DestroySettingsPopup();
1668 m->pHandleVolume->Destroy();
1669 CBaseView::Destroy();
1670 evas_object_del(m->eoBase);
1678 Evas_Object* CPlaybackView::Base(void)
1686 void CPlaybackView::t_OnClickedSettings(Evas_Object *obj)
1688 elm_object_signal_emit(obj, MUSIC_SIGNAL_BTN_CLICKED, MUSIC_PLAYBACK_VIEW);
1690 if (eina_list_count(m->elInfo) == 0)
1693 elm_object_signal_emit(obj, MUSIC_SIGNAL_CONTROL_SELECTED, MUSIC_PLAYBACK_VIEW);
1694 m_DestroySettingsPopup();
1695 m_CreateSettingsPopup();
1699 void CPlaybackView::t_OnClickedShuffle(Evas_Object *obj)
1701 elm_object_signal_emit(obj, MUSIC_SIGNAL_BTN_CLICKED, MUSIC_PLAYBACK_VIEW);
1703 switch (m->hMusicController->ShuffleState()) {
1704 case SHUFFLE_STATUS_OFF:
1705 m->hMusicController->SetShuffleState(SHUFFLE_STATUS_ON);
1706 elm_object_signal_emit(obj, MUSIC_SIGNAL_SHUFFLE_ON, MUSIC_PLAYBACK_VIEW);
1710 m->hMusicController->SetShuffleState(SHUFFLE_STATUS_OFF);
1711 elm_object_signal_emit(obj, MUSIC_SIGNAL_SHUFFLE_OFF, MUSIC_PLAYBACK_VIEW);
1717 void CPlaybackView::t_OnClickedRepeat(Evas_Object *obj)
1719 elm_object_signal_emit(obj, MUSIC_SIGNAL_BTN_CLICKED, MUSIC_PLAYBACK_VIEW);
1721 switch (m->hMusicController->RepeatState()) {
1722 case REPEAT_STATUS_NONE:
1723 m->hMusicController->SetRepeatState(REPEAT_STATUS_ALL);
1724 elm_object_signal_emit(obj, MUSIC_SIGNAL_REPEAT_ALL, MUSIC_PLAYBACK_VIEW);
1727 case REPEAT_STATUS_ALL:
1728 m->hMusicController->SetRepeatState(REPEAT_STATUS_ONE);
1729 elm_object_signal_emit(obj, MUSIC_SIGNAL_REPEAT_ONE, MUSIC_PLAYBACK_VIEW);
1733 m->hMusicController->SetRepeatState(REPEAT_STATUS_NONE);
1734 elm_object_signal_emit(obj, MUSIC_SIGNAL_REPEAT_OFF, MUSIC_PLAYBACK_VIEW);
1740 void CPlaybackView::t_OnClickedPlay(Evas_Object *obj)
1742 elm_object_signal_emit(obj, MUSIC_SIGNAL_BTN_CLICKED, MUSIC_PLAYBACK_VIEW);
1744 switch (m->hMusicController->PlayState()) {
1745 case PLAY_STATUS_PAUSE:
1747 elm_object_signal_emit(obj, MUSIC_SIGNAL_PLAY, MUSIC_PLAYBACK_VIEW);
1750 case PLAY_STATUS_PLAY:
1751 elm_object_signal_emit(obj, MUSIC_SIGNAL_PAUSE, MUSIC_PLAYBACK_VIEW);
1756 if (m->hMusicController)
1757 m->hMusicController->Start();
1758 m_UpdateCurrentSongInfo();
1764 void CPlaybackView::t_OnShow(void)
1771 elm_genlist_item_show(m->cs_itinfo->item,
1772 ELM_GENLIST_ITEM_SCROLLTO_IN);
1773 elm_object_item_focus_set(m->cs_itinfo->item, EINA_TRUE);
1776 state = m->hMusicController->PlayState();
1777 if (state == PLAY_STATUS_INITIAL || state == PLAY_STATUS_STOP) {
1780 m->hMusicController->Start();
1781 m_UpdateCurrentSongInfo();
1784 evas_object_show(m->eoBase);
1788 void CPlaybackView::t_OnUpdate(void *data)
1795 SParcel *parcel = (SParcel *)data;
1796 int updateType = parcel->updateType;
1797 char *key = (char *)parcel->keyEvent;
1799 switch (updateType) {
1800 case E_PLAYLIST_UPDATE:
1803 elm_object_disabled_set(m->eoBtnControl[BTN_FORWARD], EINA_FALSE);
1804 elm_object_disabled_set(m->eoBtnControl[BTN_REWIND], EINA_FALSE);
1805 elm_object_disabled_set(m->eoBtnControl[BTN_PLAY], EINA_FALSE);
1806 elm_object_focus_next_object_set(m->eoBtnControl[BTN_REPEAT],
1807 m->eoBtnControl[BTN_REWIND], ELM_FOCUS_RIGHT);
1808 m_FromEditToPlaybackMode();
1812 m_HandleKeyPress(key);
1816 m_HandleKeyUnpress(key);
1825 void CPlaybackView::t_OnHide(void)
1829 evas_object_hide(m->eoBase);
1833 void CPlaybackView::OnKeyDown(int id, Evas *e, Evas_Object *obj, Evas_Event_Key_Down *ev)
1837 m_HandleKeyPress(ev->keyname);
1840 case EO_ERROR_POPUP_BUTTON:
1841 if (!strcmp(ev->keyname, KEY_BACK) ||
1842 !strcmp(ev->keyname, KEY_BACK_REMOTE)) {
1843 m_DestroyErrorPopup();
1844 elm_object_focus_set(m->eoBtnControl[BTN_PLAY], EINA_TRUE);
1850 Elm_Object_Item *it = NULL;
1851 SContentInfo *ctxtinfo = NULL;
1852 SItemInfo *itinfo = NULL;
1854 if (strcmp(ev->keyname, KEY_MENU) &&
1855 strcmp(ev->keyname, KEY_MENU_REMOTE))
1858 it = elm_object_focused_item_get(obj);
1860 _ERR(" unable to get focused item ");
1863 m->focused_item = it;
1870 ctxtinfo = (SContentInfo *)calloc(1, sizeof(*ctxtinfo));
1874 itinfo = m_FindItemInfoFromItem(m->elInfo, it);
1880 if (m->hMusicController->PlayState() == PLAY_STATUS_PLAY &&
1881 itinfo == m->cs_itinfo)
1882 ctxtinfo->status = PLAY_STATUS_PLAY;
1884 ctxtinfo->status = PLAY_STATUS_PAUSE;
1886 ctxtinfo->cbdata = m;
1887 ctxtinfo->update = sm_CbCtxtUpdate;
1888 ctxtinfo->close = sm_CbCtxtClose;
1889 ctxtinfo->type = CONTEXT_TYPE_PLAYSONG;
1890 ctxtinfo->context = itinfo->sinfo;
1892 m->ctxtinfo = ctxtinfo;
1895 parcel.ctxtInfo = ctxtinfo;
1896 if (!m->mgr->PushView(MUSIC_CONTEXT_VIEW, &parcel))
1897 _ERR("viewmgr push view MUSIC_CONTEXT_VIEW failed");
1901 if (!strcmp(ev->keyname, KEY_BACK) ||
1902 !strcmp(ev->keyname, KEY_BACK_REMOTE)) {
1903 _ERR("eoCtxPopup BACK key pressed ");
1904 m_DestroySettingsPopup();
1905 elm_object_focus_set(m->eoBtnControl[BTN_SETTINGS], EINA_TRUE);
1908 else if (!strcmp(ev->keyname, KEY_EXIT)) {
1909 _ERR("eoCtxPopup EXIT key pressed ");
1910 m_DestroySettingsPopup();
1911 m_RemoveTimer(TIMER_SLIDER);
1912 m->hMusicController->Stop();
1923 void CPlaybackView::OnKeyUp(int id, Evas *e, Evas_Object *obj, Evas_Event_Key_Up *ev)
1927 m_HandleKeyUnpress(ev->keyname);
1936 void CPlaybackView::OnMouseClicked(int id, Evas_Object *obj)
1939 case EO_ERROR_POPUP_BUTTON:
1940 m_DestroyErrorPopup();
1941 elm_object_focus_set(m->eoBtnControl[BTN_PLAY], EINA_TRUE);
1945 m_DisableCheckAll(m->elInfo);
1946 m_DisableEditButtons(true);
1947 m_FromEditToPlaybackMode();
1951 m_DisableCheckAll(m->elInfo);
1952 m_DisableEditButtons(true);
1953 elm_genlist_realized_items_update(m->eoPlaylist);
1954 elm_object_focus_set(m->eoBtnEdit[BTN_CANCEL], EINA_TRUE);
1958 m_DeleteSelectedItems();
1961 case EO_BTN_SETTINGS:
1962 t_OnClickedSettings(obj);
1965 case EO_BTN_SHUFFLE:
1966 t_OnClickedShuffle(obj);
1970 t_OnClickedRepeat(obj);
1974 t_OnClickedPlay(obj);
1983 void CPlaybackView::OnMouseMove(int id, Evas *e, Evas_Object *obj, Evas_Event_Mouse_Move *ev)
1990 case EO_BTN_FORWARD:
1994 case EO_BTN_SETTINGS:
1995 case EO_BTN_SHUFFLE:
1996 if (!elm_object_focus_get(obj))
1997 elm_object_focus_set(obj, EINA_TRUE);
2002 Elm_Object_Item *item;
2004 item = elm_genlist_at_xy_item_get(obj, ev->cur.canvas.x,
2005 ev->cur.canvas.y, NULL);
2009 if (!elm_object_item_focus_get(item))
2010 elm_object_item_focus_set(item, EINA_TRUE);
2020 void CPlaybackView::OnPressed(int id, Evas_Object *obj)
2023 case EO_BTN_FORWARD:
2025 m_HandleOnPressed(obj);
2034 void CPlaybackView::OnUnpressed(int id, Evas_Object *obj)
2037 case EO_BTN_FORWARD:
2039 m_HandleOnUnpressed(obj);
2048 void CPlaybackView::OnChanged(int id, Evas_Object *obj)
2053 char *timestr = NULL;
2056 if (m->hMusicController->PlayState() == PLAY_STATUS_PLAY) {
2058 ecore_timer_freeze(m->etSlider);
2061 value = elm_slider_value_get(obj);
2062 m->hMusicController->SetPosition(value);
2063 timestr = CCommonUI::TimeStrFromMilSeconds(value);
2065 elm_object_part_text_set(m->eoBase, MUSIC_PART_PROGRESSTIME,
2070 if (m->hMusicController->PlayState() == PLAY_STATUS_PLAY) {
2072 ecore_timer_thaw(m->etSlider);
2083 void CPlaybackView::OnRealized(int id, Evas_Object *obj, Elm_Object_Item *item)
2087 elm_object_item_signal_callback_add(item,
2088 MUSIC_SIGNAL_CHECK_CLICKED, MUSIC_PLAYBACK_VIEW,
2089 sm_CbGenlistItemCheckClicked, this);
2098 void CPlaybackView::OnUnrealized(int id, Evas_Object *obj, Elm_Object_Item *item)
2102 elm_object_item_signal_callback_del(item,
2103 MUSIC_SIGNAL_CHECK_CLICKED, MUSIC_PLAYBACK_VIEW,
2104 sm_CbGenlistItemCheckClicked);
2113 void CPlaybackView::OnActivated(int id, Evas_Object *obj, Elm_Object_Item *item)
2117 m_HandleGenlistItemActivated(obj, item);
2126 void CPlaybackView::t_OnComplete(void)
2128 m_UpdateCurrentSongInfo();
2132 void CPlaybackView::t_OnError(void)
2134 m_CreateErrorPopup();
2138 void CPlaybackView::t_OnUsbConnected(void)
2143 void CPlaybackView::t_OnUpdateContent(void)