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 "music-controller.h"
26 #include "volume-control.h"
29 #include "common-ui.h"
32 #include "playback-view.h"
33 #include "context-view.h"
34 #include "HandleVolume.h"
37 #define ARRAY_SIZE(array) (sizeof(array) / sizeof(array[0]))
38 #define TITLE_FONT_SIZE 50
39 #define ARTIST_FONT_SIZE 30
40 #define TOTAL_CONTROL_BTNS 6
41 #define TOTAL_SETTING_BTNS 2
42 #define TOTAL_EDIT_BTNS 3
43 #define S_INTERVAL 1 /* seconds */
44 #define LP_INTERVAL 0.5 /* seconds */
45 #define WAIT_INTERVAL 0.5 /* seconds */
46 #define SLIDER_STEP 5000 /* milli seconds */
47 #define LP_CHANGE 10000 /* milli seconds */
48 #define S_INCREMENT 1000 /* milli seconds */
54 EO_ERROR_POPUP_BUTTON,
57 EO_CLEAR_PLAYLIST, // TOTAL_SETTING_BTNS
61 EO_DELETE, // TOTAL_EDIT_BTNS
68 EO_BTN_FORWARD, // TOTAL_CONTROL_BTNS
79 Elm_Object_Item *item;
86 struct SPlaybackView {
90 Evas_Object *eoCtxPopup; /*settings popup*/
91 Evas_Object *eoErrPopup;
92 Evas_Object *eoPlaylist;
94 Elm_Object_Item *focused_item;
96 Evas_Object *eoBtnControl[TOTAL_CONTROL_BTNS];
97 Evas_Object *eoBtnSetting[TOTAL_SETTING_BTNS];
98 Evas_Object *eoBtnEdit[TOTAL_EDIT_BTNS];
100 Evas_Object *eoAlbumCover;
101 Evas_Object *eoSlider;
102 Evas_Object *eoPressedObj;
105 Ecore_Timer *etSlider;
106 Ecore_Timer *etLongPress;
108 CMusicController *hMusicController; //! NOT NULL
111 SItemInfo *cs_itinfo;
112 SContentInfo *ctxtinfo;
115 CPlaybackView *parent;
116 CHandleVolume *pHandleVolume;
119 memset(this, 0, sizeof(SPlaybackView));
120 pHandleVolume = new CHandleVolume;
123 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 if (!song_info_get_duration(m->csinfo, &duration)) {
184 return ECORE_CALLBACK_CANCEL;
187 value = value + S_INCREMENT;
188 if (value > duration) {
190 return ECORE_CALLBACK_CANCEL;
193 elm_slider_value_set(m->eoSlider, value);
194 timestr = _get_timestr_from_milseconds(value);
196 elm_object_part_text_set(m->eoBase, MUSIC_PART_PROGRESSTIME,
201 return ECORE_CALLBACK_RENEW;
205 Eina_Bool CPlaybackView::sm_CbLongpressTimer(void *dt)
207 SPlaybackView *m = (SPlaybackView *)dt;
209 m->parent->m_HandleOnRepeated();
211 return ECORE_CALLBACK_RENEW;
215 Eina_Bool CPlaybackView::sm_CbWaitTimer(void *dt)
217 SPlaybackView *m = (SPlaybackView *)dt;
219 m->press_status = PRESS_LONG;
220 if (m->hMusicController->PlayState() == PLAY_STATUS_PLAY) {
221 /* Handle long press */
222 m->parent->m_PlaybackPause();
223 m->etLongPress = ecore_timer_add(LP_INTERVAL, sm_CbLongpressTimer, m);
226 m->press_status = PRESS_LONG_PAUSE;
230 return ECORE_CALLBACK_CANCEL;
234 void CPlaybackView::sm_CbItemSelect(void *data, Evas_Object *obj, void *event_info)
239 void CPlaybackView::sm_CbGenlistItemCheckClicked(void *data, Elm_Object_Item *it, const char *emission, const char *source)
241 CPlaybackView *root = (CPlaybackView*)data;
243 root->m_OnGenlistItemCheckClicked(it, emission, source);
247 void CPlaybackView::m_OnGenlistItemCheckClicked(Elm_Object_Item *it, const char *emission, const char *source)
249 SItemInfo *itinfo = NULL;
251 if (!it || !emission)
254 itinfo = m_FindItemInfoFromItem(m->elInfo, it);
256 _ERR(" no item info found ");
260 if (itinfo->edit_mode) {
261 m_UpdateItemCheck(itinfo);
262 m_DisableEditButtons(false);
267 void CPlaybackView::sm_CbCtxtUpdate(void *dt, enum EActionType type, int lid)
269 SPlaybackView *m = (SPlaybackView *)dt;
270 SItemInfo *itinfo = NULL;
275 if (!m->ctxtinfo || !m->ctxtinfo->context)
278 itinfo = m->parent->m_FindItemInfoFromSong(m->elInfo,
279 (SSongInfo *)m->ctxtinfo->context);
281 _ERR(" Unable to find song in the list ");
285 if (type == ACTION_TYPE_DELETE) {
286 itinfo->check_status = true;
287 m->parent->m_DeleteSelectedItems();
289 else if (type == ACTION_TYPE_PLAY) {
290 if (m->ctxtinfo->status == PLAY_STATUS_PLAY)
291 m->parent->m_KeyPausePress();
293 if (itinfo == m->cs_itinfo)
294 m->parent->m_KeyPlayPress();
296 m->parent->m_HandleGenlistItemActivated(m->eoPlaylist, itinfo->item);
300 _ERR(" Wrong ctxt add type in plaback view ");
302 if (!m->mgr->PushView(MUSIC_PLAYBACK_VIEW, NULL)) {
303 _ERR(" viewmgr show failed ");
306 elm_object_item_focus_set(m->focused_item, EINA_TRUE);
310 void CPlaybackView::sm_CbCtxtClose(void *dt)
312 SPlaybackView *m = (SPlaybackView *)dt;
318 m->mgr->PushView(MUSIC_PLAYBACK_VIEW, NULL);
319 elm_object_item_focus_set(m->focused_item, EINA_TRUE);
323 void CPlaybackView::m_RemoveTimer(int timer_code)
325 ETimers timerCode = (ETimers)timer_code;
330 ecore_timer_del(m->etSlider);
337 ecore_timer_del(m->etWait);
342 case TIMER_LONGPRESS:
343 if (m->etLongPress) {
344 ecore_timer_del(m->etLongPress);
345 m->etLongPress = NULL;
350 m->pHandleVolume->RemoveTimer();
354 _ERR(" invalid value ");
360 void CPlaybackView::m_PlaybackPause(void)
362 m->hMusicController->Pause();
365 ecore_timer_freeze(m->etSlider);
369 void CPlaybackView::m_PlaybackResume(void)
371 m->hMusicController->Resume();
374 ecore_timer_thaw(m->etSlider);
378 void CPlaybackView::m_ChangeEditmodeAll(Eina_List *list, bool flag)
380 SItemInfo *itinfo = NULL;
384 EINA_LIST_FOREACH(list, l, obj) {
385 itinfo = (SItemInfo *)obj;
386 itinfo->edit_mode = flag;
391 void CPlaybackView::m_DisableCheckAll(Eina_List *list)
393 SItemInfo *itinfo = NULL;
397 EINA_LIST_FOREACH(list, l, obj) {
398 itinfo = (SItemInfo *)obj;
399 itinfo->check_status = false;
404 void CPlaybackView::m_SelectItem(SItemInfo *pItemInfo)
406 if (!pItemInfo || !pItemInfo->item)
409 elm_genlist_item_bring_in(pItemInfo->item, ELM_GENLIST_ITEM_SCROLLTO_IN);
410 elm_object_item_signal_emit(pItemInfo->item, MUSIC_SIGNAL_SELECT_ITEM, MUSIC_PLAYBACK_VIEW);
412 pItemInfo->select_status = true;
416 void CPlaybackView::m_UnselectItem(SItemInfo *pItemInfo)
418 if (!pItemInfo || !pItemInfo->item)
421 elm_object_item_signal_emit(pItemInfo->item, MUSIC_SIGNAL_UNSELECT_ITEM,
422 MUSIC_PLAYBACK_VIEW);
424 pItemInfo->select_status = false;
428 void CPlaybackView::m_UpdateControlBtns(void)
432 state = m->hMusicController->PlayState();
433 if (state != PLAY_STATUS_STOP) {
434 elm_object_disabled_set(m->eoBtnControl[BTN_FORWARD], EINA_FALSE);
435 elm_object_disabled_set(m->eoBtnControl[BTN_REWIND], EINA_FALSE);
439 elm_object_focus_set(m->eoBtnControl[BTN_PLAY], EINA_TRUE);
440 elm_object_disabled_set(m->eoBtnControl[BTN_FORWARD], EINA_TRUE);
441 elm_object_disabled_set(m->eoBtnControl[BTN_REWIND], EINA_TRUE);
444 if (state == PLAY_STATUS_PLAY) {
445 elm_object_signal_emit(m->eoBtnControl[BTN_PLAY], MUSIC_SIGNAL_PLAY, MUSIC_PLAYBACK_VIEW);
448 elm_object_signal_emit(m->eoBtnControl[BTN_PLAY], MUSIC_SIGNAL_PAUSE, MUSIC_PLAYBACK_VIEW);
451 state = m->hMusicController->ShuffleState();
452 if (state == SHUFFLE_STATUS_OFF) {
453 elm_object_signal_emit(m->eoBtnControl[BTN_SHUFFLE], MUSIC_SIGNAL_SHUFFLE_OFF, MUSIC_PLAYBACK_VIEW);
456 elm_object_signal_emit(m->eoBtnControl[BTN_SHUFFLE], MUSIC_SIGNAL_SHUFFLE_ON, MUSIC_PLAYBACK_VIEW);
459 state = m->hMusicController->RepeatState();
460 if (state == REPEAT_STATUS_NONE) {
461 elm_object_signal_emit(m->eoBtnControl[BTN_REPEAT], MUSIC_SIGNAL_REPEAT_OFF, MUSIC_PLAYBACK_VIEW);
463 else if (state == REPEAT_STATUS_ALL) {
464 elm_object_signal_emit(m->eoBtnControl[BTN_REPEAT], MUSIC_SIGNAL_REPEAT_ALL, MUSIC_PLAYBACK_VIEW);
467 elm_object_signal_emit(m->eoBtnControl[BTN_REPEAT], MUSIC_SIGNAL_REPEAT_ONE, MUSIC_PLAYBACK_VIEW);
472 void CPlaybackView::m_UpdateCurrentSongProgressbar(void)
475 char *timestr = NULL;
482 elm_slider_value_set(m->eoSlider, 0);
483 elm_object_part_text_set(m->eoBase, MUSIC_PART_PROGRESSTIME, "00:00");
485 state = m->hMusicController->PlayState();
487 if (state == PLAY_STATUS_STOP) {
488 elm_object_disabled_set(m->eoSlider, EINA_TRUE);
489 m_RemoveTimer(TIMER_SLIDER);
493 elm_object_disabled_set(m->eoSlider, EINA_FALSE);
495 if (song_info_get_duration(m->csinfo, &duration)) {
496 m_RemoveTimer(TIMER_SLIDER);
497 m->etSlider = ecore_timer_add(S_INTERVAL,
498 sm_CbUpdateSlider, m);
500 elm_slider_min_max_set(m->eoSlider, 0, duration);
501 timestr = _get_timestr_from_milseconds(duration);
503 elm_object_part_text_set(m->eoBase,
504 MUSIC_PART_FULLTIME, timestr);
508 step = (double)SLIDER_STEP / (double)duration;
509 elm_slider_step_set(m->eoSlider, step);
514 void CPlaybackView::m_UpdateCurrentSongThumbnail(void)
517 char buf[MAX_LENGTH];
519 if (!m->cs_itinfo || !m->cs_itinfo->sinfo)
522 path = song_info_get_thumb(m->cs_itinfo->sinfo);
524 elm_image_file_set(m->eoAlbumCover, path, NULL);
526 snprintf(buf, sizeof(buf), "%s/%s", IMAGEDIR,
527 MUSIC_IMAGE_DEFAULT_THUMB_450);
528 elm_image_file_set(m->eoAlbumCover, buf, NULL);
533 void CPlaybackView::m_UpdateCurrentSongLabels(void)
535 char buf[MAX_LENGTH];
540 elm_object_part_text_set(m->eoBase, MUSIC_PART_SONG_TITLE,
541 song_info_get_title(m->csinfo));
543 snprintf(buf, sizeof(buf), "%s - %s", song_info_get_artist(m->csinfo),
544 song_info_get_album(m->csinfo));
546 elm_object_part_text_set(m->eoBase, MUSIC_PART_ARTIST_ALBUM, buf);
550 void CPlaybackView::m_UpdateEmptySongInfo(void)
552 char buf[MAX_LENGTH];
554 elm_object_signal_emit(m->eoBtnControl[BTN_PLAY],
555 MUSIC_SIGNAL_PAUSE, MUSIC_PLAYBACK_VIEW);
556 elm_object_focus_set(m->eoBtnControl[BTN_SETTINGS], EINA_TRUE);
557 elm_object_focus_next_object_set(m->eoBtnControl[BTN_REPEAT],
558 m->eoBtnControl[BTN_REPEAT], ELM_FOCUS_RIGHT);
559 elm_object_disabled_set(m->eoBtnControl[BTN_FORWARD], EINA_TRUE);
560 elm_object_disabled_set(m->eoBtnControl[BTN_REWIND], EINA_TRUE);
561 elm_object_disabled_set(m->eoBtnControl[BTN_PLAY], EINA_TRUE);
562 elm_object_disabled_set(m->eoSlider, EINA_TRUE);
563 elm_object_part_text_set(m->eoBase, MUSIC_PART_FULLTIME, "00:00");
564 elm_object_part_text_set(m->eoBase, MUSIC_PART_PROGRESSTIME, "00:00");
565 elm_slider_value_set(m->eoSlider, 0);
566 elm_object_part_text_set(m->eoBase, MUSIC_PART_SONG_TITLE,
567 _(NO_PLAYLIST_MESSAGE));
568 elm_object_part_text_set(m->eoBase, MUSIC_PART_ARTIST_ALBUM,
569 _(NO_PLAYLIST_MESSAGE_SUB));
570 snprintf(buf, sizeof(buf), "%s/%s", IMAGEDIR,
571 MUSIC_IMAGE_DEFAULT_THUMB_450);
572 elm_image_file_set(m->eoAlbumCover, buf, NULL);
573 m->hMusicController->SetPlayState(PLAY_STATUS_INITIAL);
577 void CPlaybackView::m_UpdateCtxtView(int playStatus)
579 if (!m->cs_itinfo || !m->ctxtinfo)
582 if (!m->mgr->CheckTop(MUSIC_CONTEXT_VIEW))
585 if (m->cs_itinfo->sinfo == m->ctxtinfo->context) {
586 m->ctxtinfo->status = (EPlayStatus)playStatus;
589 parcel.ctxtInfo = NULL;
590 parcel.updateType = E_SONG_UPDATE;
591 parcel.layoutId = NULL;
592 parcel.keyEvent = NULL;
593 m->mgr->UpdateView((const char *)MUSIC_CONTEXT_VIEW, &parcel);
598 void CPlaybackView::m_UpdateCurrentSongItem(int index)
600 SItemInfo *pItemInfo = NULL;
603 m_UnselectItem(m->cs_itinfo);
604 m_UpdateCtxtView(PLAY_STATUS_PAUSE);
607 pItemInfo = (SItemInfo *)eina_list_nth(m->elInfo, index);
610 m->cs_itinfo = pItemInfo;
611 if (m->hMusicController->PlayState() == PLAY_STATUS_STOP) {
612 elm_genlist_item_bring_in(pItemInfo->item,
613 ELM_GENLIST_ITEM_SCROLLTO_IN);
616 m_SelectItem(pItemInfo);
617 m_UpdateCtxtView(PLAY_STATUS_PLAY);
623 void CPlaybackView::m_UpdateEditmodeFocusSequence(void)
625 elm_object_focus_next_object_set(m->eoPlaylist,
626 m->eoBtnEdit[BTN_CANCEL], ELM_FOCUS_LEFT);
627 elm_object_focus_next_object_set(m->eoBtnEdit[BTN_CANCEL],
628 m->eoPlaylist, ELM_FOCUS_RIGHT);
629 elm_object_focus_next_object_set(m->eoSlider, m->eoBtnEdit[BTN_CANCEL],
634 void CPlaybackView::m_UpdatePlaymodeFocusSequence(void)
636 elm_object_focus_next_object_set(m->eoSlider, m->eoPlaylist,
638 elm_object_focus_next_object_set(m->eoSlider, m->eoBtnControl[BTN_PLAY],
640 if (m->hMusicController->PlayState() == PLAY_STATUS_STOP) {
641 elm_object_focus_next_object_set(m->eoPlaylist,
642 m->eoBtnControl[BTN_PLAY], ELM_FOCUS_LEFT);
643 elm_object_focus_next_object_set(m->eoBtnControl[BTN_PLAY],
644 m->eoPlaylist, ELM_FOCUS_RIGHT);
647 elm_object_focus_next_object_set(m->eoPlaylist,
648 m->eoBtnControl[BTN_FORWARD], ELM_FOCUS_LEFT);
649 elm_object_focus_next_object_set(m->eoBtnControl[BTN_FORWARD],
650 m->eoPlaylist, ELM_FOCUS_RIGHT);
651 elm_object_focus_next_object_set(m->eoBtnControl[BTN_PLAY],
652 m->eoBtnControl[BTN_FORWARD], ELM_FOCUS_RIGHT);
657 void CPlaybackView::m_UpdateCurrentSongInfo(void)
659 SSongInfo *sinfo = NULL;
662 if (eina_list_count(m->elInfo) == 0) {
663 m_UpdateEmptySongInfo();
667 if (!m->hMusicController->GetCurrentSongIndex(&index)) {
668 _ERR(" music get current song index failed ");
672 if (!m->hMusicController->GetSonginfoFromIndex(index, &sinfo)) {
673 _ERR(" music get songinfo failed ");
678 m_UpdateCurrentSongItem(index);
679 m_UpdateCurrentSongLabels();
680 m_UpdateCurrentSongThumbnail();
681 m_UpdateCurrentSongProgressbar();
682 m_UpdateControlBtns();
683 m_UpdatePlaymodeFocusSequence();
687 void CPlaybackView::m_DisableEditButtons(bool flag)
689 /* flag - 1 means disable edit buttons and 0 means enable */
691 elm_object_focus_set(m->eoBtnEdit[BTN_CANCEL], EINA_TRUE);
693 elm_object_disabled_set(m->eoBtnEdit[BTN_DELETE], (Eina_Bool)flag);
694 elm_object_disabled_set(m->eoBtnEdit[BTN_DESELECT], (Eina_Bool)flag);
696 m_UpdateEditmodeFocusSequence();
697 elm_object_focus_set(m->eoBtnEdit[BTN_CANCEL], EINA_TRUE);
700 elm_object_focus_next_object_set(m->eoBtnEdit[BTN_CANCEL],
701 m->eoBtnEdit[BTN_DESELECT], ELM_FOCUS_RIGHT);
702 elm_object_focus_next_object_set(m->eoBtnEdit[BTN_DELETE],
703 m->eoPlaylist, ELM_FOCUS_RIGHT);
704 elm_object_focus_next_object_set(m->eoPlaylist,
705 m->eoBtnEdit[BTN_DELETE], ELM_FOCUS_LEFT);
710 void CPlaybackView::m_CreateErrorPopup(void)
712 Evas_Object *popup = NULL, *btn = NULL, *label = NULL;
714 popup = elm_popup_add(m->eoBase);
718 elm_object_style_set(popup, MUSIC_STYLE_ERROR_POPUP);
719 evas_object_show(popup);
721 label = elm_label_add(popup);
723 evas_object_del(popup);
727 elm_object_style_set(label, MUSIC_STYLE_ERROR_LABEL);
728 elm_object_text_set(label, MUSIC_TEXT_PLAYBACK_ERROR);
729 elm_object_content_set(popup, label);
731 btn = elm_button_add(popup);
733 evas_object_del(popup);
737 elm_object_style_set(btn, MUSIC_STYLE_EDIT_BTN);
738 elm_object_text_set(btn, MUSIC_TEXT_OK);
739 elm_object_part_content_set(popup, MUSIC_PART_POPUP_BUTTON, btn);
741 m->eoErrPopup = popup;
743 Connect(btn, EO_ERROR_POPUP_BUTTON, TYPE_CLICKED | TYPE_KEY_DOWN);
745 elm_object_focus_set(btn, EINA_TRUE);
751 void CPlaybackView::m_DestroyErrorPopup(void)
756 evas_object_del(m->eoErrPopup);
757 m->eoErrPopup = NULL;
761 void CPlaybackView::m_CreateSettingsPopup(void)
763 Evas_Object *box = NULL;
764 Evas_Object *eoCtxPopup = NULL;
767 SBtnInfo btninfo[TOTAL_SETTING_BTNS];
769 btninfo[BTN_EDIT].txt = MUSIC_TEXT_EDIT_PLAYLIST;
770 btninfo[BTN_EDIT].type = EO_EDIT_PLAYLIST;
772 btninfo[BTN_CLEAR].txt = MUSIC_TEXT_CLEAR_PLAYLIST;
773 btninfo[BTN_CLEAR].type = EO_CLEAR_PLAYLIST;
775 eoCtxPopup = elm_ctxpopup_add(m->eoWin);
779 box = _add_box(eoCtxPopup);
781 evas_object_del(eoCtxPopup);
785 for (i = 0; i < TOTAL_SETTING_BTNS; i++) {
786 m->eoBtnSetting[i] = elm_button_add(box);
787 if (!m->eoBtnSetting[i])
790 elm_object_style_set(m->eoBtnSetting[i],
791 MUSIC_STYLE_SETTING_BTN_T);
794 elm_object_style_set(m->eoBtnSetting[i],
795 MUSIC_STYLE_SETTING_BTN_B);
797 evas_object_size_hint_weight_set(m->eoBtnSetting[i],
798 EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
799 elm_box_pack_end(box, m->eoBtnSetting[i]);
800 elm_object_text_set(m->eoBtnSetting[i], _(btninfo[i].txt));
802 Connect(m->eoBtnSetting[i], btninfo[i].type, TYPE_CLICKED | TYPE_MOUSE_MOVE);
804 evas_object_show(m->eoBtnSetting[i]);
807 elm_object_style_set(eoCtxPopup, MUSIC_STYLE_SETTING_POPUP);
808 elm_object_content_set(eoCtxPopup, box);
810 scale = elm_config_scale_get();
811 Connect(box, EO_BOX, TYPE_KEY_DOWN);
812 elm_object_part_content_set(m->eoBase, MUSIC_PART_SETTINGS_POPUP, eoCtxPopup);
814 /* If list empty disable these options */
815 if (eina_list_count(m->elInfo) == 0) {
816 elm_object_disabled_set(m->eoBtnSetting[BTN_EDIT], EINA_TRUE);
817 elm_object_disabled_set(m->eoBtnSetting[BTN_CLEAR], EINA_TRUE);
820 elm_object_focus_set(m->eoBtnSetting[BTN_EDIT], EINA_TRUE);
822 m->eoCtxPopup = eoCtxPopup;
826 void CPlaybackView::m_DestroySettingsPopup(void)
831 evas_object_del(m->eoCtxPopup);
832 m->eoCtxPopup = NULL;
836 void CPlaybackView::m_FromEditToPlaybackMode(void)
838 if (m->hMusicController->PlayState() == PLAY_STATUS_STOP) {
839 elm_genlist_item_bring_in(m->cs_itinfo->item,
840 ELM_GENLIST_ITEM_SCROLLTO_IN);
843 m_SelectItem(m->cs_itinfo);
845 elm_object_signal_emit(m->eoBase, MUSIC_SIGNAL_PLAYBACK_MODE,
846 MUSIC_PLAYBACK_VIEW);
847 elm_object_focus_set(m->eoBtnControl[BTN_SETTINGS], EINA_TRUE);
849 m_ChangeEditmodeAll(m->elInfo, false);
851 elm_genlist_realized_items_update(m->eoPlaylist);
853 m_UpdatePlaymodeFocusSequence();
857 void CPlaybackView::m_FromPlaybackToEditMode(void)
859 elm_object_signal_emit(m->eoBase, MUSIC_SIGNAL_EDIT_MODE,
860 MUSIC_PLAYBACK_VIEW);
862 m_DisableEditButtons(true);
864 elm_object_focus_set(m->eoBtnEdit[BTN_CANCEL], EINA_TRUE);
866 m_ChangeEditmodeAll(m->elInfo, true);
868 elm_genlist_realized_items_update(m->eoPlaylist);
870 m_UpdateEditmodeFocusSequence();
874 void CPlaybackView::m_HandleOnRepeated(void)
876 Evas_Object *obj = NULL;
879 char *timestr = NULL;
881 if (!m->eoPressedObj)
884 obj = m->eoPressedObj;
886 value = elm_slider_value_get(m->eoSlider);
887 if (!song_info_get_duration(m->cs_itinfo->sinfo, &duration)) {
888 _ERR("can not get duration ");
892 if (obj == m->eoBtnControl[BTN_REWIND]) {
894 m_RemoveTimer(TIMER_LONGPRESS);
897 value = value - LP_CHANGE;
902 if (value == duration) {
903 if (m->hMusicController->PlayNextSong())
904 m_UpdateCurrentSongInfo();
906 _ERR(" music play next song failed ");
908 m->press_status = PRESS_LONG_PAUSE;
909 elm_object_signal_emit(m->eoBtnControl[BTN_PLAY], MUSIC_SIGNAL_PAUSE,
910 MUSIC_PLAYBACK_VIEW);
912 m_RemoveTimer(TIMER_LONGPRESS);
916 value = value + LP_CHANGE;
917 if (value >= duration)
921 m->hMusicController->SetPosition(value);
922 elm_slider_value_set(m->eoSlider, value);
923 timestr = _get_timestr_from_milseconds(value);
925 elm_object_part_text_set(m->eoBase, MUSIC_PART_PROGRESSTIME,
934 void CPlaybackView::m_DeleteSelectedItems(void)
936 Eina_List *l = NULL, *l_next = NULL;
937 SItemInfo *pItemInfo = NULL;
942 m_DisableEditButtons(true);
943 EINA_LIST_FOREACH_SAFE(m->elInfo, l, l_next, obj) {
944 pItemInfo = (SItemInfo *)obj;
945 if (pItemInfo->check_status) {
946 if (m->cs_itinfo == pItemInfo) {
948 m_UnselectItem(m->cs_itinfo);
949 m_RemoveTimer(TIMER_SLIDER);
951 m->hMusicController->SetPlayState(PLAY_STATUS_STOP);
952 m->hMusicController->Stop();
954 index = elm_genlist_item_index_get(pItemInfo->item);
955 m->hMusicController->RemoveSong(pItemInfo->sinfo, index);
957 m->elInfo = eina_list_remove(m->elInfo,
959 elm_object_item_del(pItemInfo->item);
963 if (eina_list_count(m->elInfo) == 0) {
964 m_UpdateEmptySongInfo();
965 elm_genlist_realized_items_update(m->eoPlaylist);
966 elm_object_focus_set(m->eoBtnEdit[BTN_CANCEL], EINA_TRUE);
971 m_UpdateCurrentSongInfo();
973 elm_genlist_realized_items_update(m->eoPlaylist);
974 elm_object_focus_set(m->eoBtnEdit[BTN_CANCEL], EINA_TRUE);
978 void CPlaybackView::m_KeyBackPress(void)
981 m_DestroySettingsPopup();
982 elm_object_focus_set(m->eoBtnControl[BTN_SETTINGS], EINA_FALSE);
983 elm_object_focus_set(m->eoBtnControl[BTN_SETTINGS], EINA_TRUE);
988 m->mgr->PushView(MUSIC_BASE_VIEW, NULL);
992 void CPlaybackView::m_KeyExitPress(void)
994 m_RemoveTimer(TIMER_SLIDER);
995 m->hMusicController->Stop();
1000 void CPlaybackView::m_KeyPlayPress(void)
1004 if (elm_object_disabled_get(m->eoBtnControl[BTN_PLAY]))
1007 state = m->hMusicController->PlayState();
1008 if (state == PLAY_STATUS_PAUSE) {
1010 elm_object_signal_emit(m->eoBtnControl[BTN_PLAY],
1011 MUSIC_SIGNAL_PLAY, MUSIC_PLAYBACK_VIEW);
1013 else if (state != PLAY_STATUS_PLAY) {
1014 if (m->hMusicController)
1015 m->hMusicController->Start();
1017 m_UpdateCurrentSongInfo();
1022 void CPlaybackView::m_KeyPausePress(void)
1026 if (elm_object_disabled_get(m->eoBtnControl[BTN_PLAY]))
1029 state = m->hMusicController->PlayState();
1030 if (state == PLAY_STATUS_PLAY) {
1031 elm_object_signal_emit(m->eoBtnControl[BTN_PLAY],
1032 MUSIC_SIGNAL_PAUSE, MUSIC_PLAYBACK_VIEW);
1038 void CPlaybackView::m_KeyNextPress(void)
1040 if (elm_object_disabled_get(m->eoBtnControl[BTN_FORWARD]))
1043 m_HandleOnPressed(m->eoBtnControl[BTN_FORWARD]);
1047 void CPlaybackView::m_KeyPreviousPress(void)
1049 if (elm_object_disabled_get(m->eoBtnControl[BTN_REWIND]))
1052 m_HandleOnPressed(m->eoBtnControl[BTN_REWIND]);
1056 void CPlaybackView::m_KeyNextUnpress(void)
1058 if (elm_object_disabled_get(m->eoBtnControl[BTN_FORWARD]))
1061 m_HandleOnUnpressed(m->eoBtnControl[BTN_FORWARD]);
1065 void CPlaybackView::m_KeyPreviousUnpress(void)
1067 if (elm_object_disabled_get(m->eoBtnControl[BTN_REWIND]))
1070 m_HandleOnUnpressed(m->eoBtnControl[BTN_REWIND]);
1074 void CPlaybackView::m_HandleKeyPress(char *keyname)
1076 if (strcmp(keyname, (char*)KEY_EXIT) == 0)
1078 else if (strcmp(keyname, (char*)KEY_BACK) == 0)
1080 else if (strcmp(keyname, (char*)KEY_PLAY) == 0)
1082 else if (strcmp(keyname, (char*)KEY_PAUSE) == 0)
1084 else if (strcmp(keyname, (char*)KEY_NEXT) == 0)
1086 else if (strcmp(keyname, (char*)KEY_PREVIOUS) == 0)
1087 m_KeyPreviousPress();
1088 else if (strcmp(keyname, (char*)KEY_VOLUMEUP) == 0)
1089 m->pHandleVolume->Up();
1090 else if (strcmp(keyname, (char*)KEY_VOLUMEDOWN) == 0)
1091 m->pHandleVolume->Down();
1092 else if (strcmp(keyname, (char*)KEY_MUTE) == 0)
1093 m->pHandleVolume->Mute();
1097 void CPlaybackView::m_HandleKeyUnpress(char *keyname)
1099 if (!strcmp(keyname, KEY_PREVIOUS))
1100 m_KeyPreviousUnpress();
1101 else if (!strcmp(keyname, KEY_NEXT))
1106 void CPlaybackView::m_AddSlider(void)
1108 Evas_Object *eoSlider = NULL;
1110 eoSlider = elm_slider_add(m->eoBase);
1114 elm_slider_indicator_show_set(eoSlider, EINA_FALSE);
1115 elm_slider_indicator_show_on_focus_set(eoSlider, EINA_FALSE);
1116 elm_object_style_set(eoSlider, MUSIC_STYLE_SLIDER);
1117 elm_slider_horizontal_set(eoSlider, EINA_TRUE);
1118 elm_object_part_content_set(m->eoBase, MUSIC_PART_PROGRESSBAR, eoSlider);
1120 Connect(eoSlider, EO_SLIDER, TYPE_CHANGED | TYPE_MOUSE_MOVE);
1122 evas_object_show(eoSlider);
1123 m->eoSlider = eoSlider;
1127 void CPlaybackView::m_AddAlbumCover(void)
1129 Evas_Object *eoAlbumCover = NULL;
1131 eoAlbumCover = elm_image_add(m->eoBase);
1135 evas_object_size_hint_weight_set(eoAlbumCover, EVAS_HINT_EXPAND,
1137 elm_image_aspect_fixed_set(eoAlbumCover, EINA_FALSE);
1139 elm_object_part_content_set(m->eoBase, MUSIC_PART_ALBUMCOVER,
1141 evas_object_show(eoAlbumCover);
1142 m->eoAlbumCover = eoAlbumCover;
1147 void CPlaybackView::m_AddCurrentSonginfo(void)
1154 void CPlaybackView::m_AddEditPlaylistButtons(void)
1156 Evas_Object *box = NULL;
1158 SBtnInfo btninfo[TOTAL_EDIT_BTNS];
1160 btninfo[BTN_CANCEL].txt = MUSIC_TEXT_CANCEL;
1161 btninfo[BTN_CANCEL].type = EO_CANCEL;
1163 btninfo[BTN_DESELECT].txt = MUSIC_TEXT_DESELECT;
1164 btninfo[BTN_DESELECT].type = EO_DESELECT;
1166 btninfo[BTN_DELETE].txt = MUSIC_TEXT_DELETE;
1167 btninfo[BTN_DELETE].type = EO_DELETE;
1169 box = _add_box(m->eoBase);
1173 elm_box_horizontal_set(box, EINA_TRUE);
1174 elm_box_padding_set(box,
1175 MUSIC_EDIT_BTNS_PADDING * elm_config_scale_get(), 0);
1177 for (i = 0; i < TOTAL_EDIT_BTNS; i++) {
1178 m->eoBtnEdit[i] = elm_button_add(m->eoBase);
1179 if (!m->eoBtnEdit[i])
1182 elm_object_style_set(m->eoBtnEdit[i],
1183 MUSIC_STYLE_EDIT_BTN);
1184 evas_object_size_hint_weight_set(m->eoBtnEdit[i],
1185 EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
1186 elm_box_pack_end(box, m->eoBtnEdit[i]);
1187 elm_object_text_set(m->eoBtnEdit[i], _(btninfo[i].txt));
1189 Connect(m->eoBtnEdit[i], btninfo[i].type, TYPE_CLICKED | TYPE_MOUSE_MOVE);
1191 evas_object_show(m->eoBtnEdit[i]);
1193 elm_object_part_content_set(m->eoBase, MUSIC_PART_EDITBTNS, box);
1194 elm_object_signal_emit(m->eoBase, MUSIC_SIGNAL_PLAYBACK_MODE,
1195 MUSIC_PLAYBACK_VIEW);
1199 void CPlaybackView::m_AddControlButtons(void)
1201 Evas_Object *box = NULL;
1203 SBtnInfo btninfo[TOTAL_CONTROL_BTNS];
1205 btninfo[BTN_SETTINGS].txt = MUSIC_STYLE_BTN_SETTINGS;
1206 btninfo[BTN_SETTINGS].type = EO_BTN_SETTINGS;
1208 btninfo[BTN_SHUFFLE].txt = MUSIC_STYLE_BTN_SHUFFLE;
1209 btninfo[BTN_SHUFFLE].type = EO_BTN_SHUFFLE;
1211 btninfo[BTN_REPEAT].txt = MUSIC_STYLE_BTN_REPEAT;
1212 btninfo[BTN_REPEAT].type = EO_BTN_REPEAT;
1214 btninfo[BTN_REWIND].txt = MUSIC_STYLE_BTN_REWIND;
1215 btninfo[BTN_REWIND].type = EO_BTN_REWIND;
1217 btninfo[BTN_PLAY].txt = MUSIC_STYLE_BTN_PLAY;
1218 btninfo[BTN_PLAY].type = EO_BTN_PLAY;
1220 btninfo[BTN_FORWARD].txt = MUSIC_STYLE_BTN_FORWARD;
1221 btninfo[BTN_FORWARD].type = EO_BTN_FORWARD;
1223 box = elm_box_add(m->eoBase);
1227 evas_object_size_hint_weight_set(box, EVAS_HINT_EXPAND, 0);
1228 evas_object_size_hint_align_set(box, EVAS_HINT_FILL, 0);
1229 elm_box_horizontal_set(box, EINA_TRUE);
1230 elm_box_padding_set(box,
1231 MUSIC_CONTROL_BTNS_PADDING * elm_config_scale_get(), 0);
1233 for (i = 0; i < TOTAL_CONTROL_BTNS; i++) {
1234 m->eoBtnControl[i] = elm_button_add(m->eoBase);
1235 if (!m->eoBtnControl[i])
1238 elm_object_style_set(m->eoBtnControl[i], btninfo[i].txt);
1239 evas_object_size_hint_weight_set(m->eoBtnControl[i],
1240 EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
1241 elm_box_pack_end(box, m->eoBtnControl[i]);
1243 if (i == BTN_REWIND || i == BTN_FORWARD) {
1244 Connect(m->eoBtnControl[i], btninfo[i].type, TYPE_PRESSED | TYPE_UNPRESSED | TYPE_MOUSE_MOVE);
1247 Connect(m->eoBtnControl[i], btninfo[i].type, TYPE_CLICKED | TYPE_MOUSE_MOVE);
1249 evas_object_show(m->eoBtnControl[i]);
1252 elm_object_part_content_set(m->eoBase, MUSIC_PART_CONTROLBTNS, box);
1256 SItemInfo *CPlaybackView::m_FindItemInfoFromSong(Eina_List *list, SSongInfo *sinfo)
1258 Eina_List *l = NULL;
1259 SItemInfo *itinfo = NULL;
1262 EINA_LIST_FOREACH(list, l, obj) {
1263 itinfo = (SItemInfo *)obj;
1264 if (itinfo->sinfo == sinfo)
1272 SItemInfo *CPlaybackView::m_FindItemInfoFromItem(Eina_List *list, Elm_Object_Item *item)
1274 Eina_List *l = NULL;
1275 SItemInfo *itinfo = NULL;
1278 EINA_LIST_FOREACH(list, l, obj) {
1279 itinfo = (SItemInfo *)obj;
1280 if (itinfo->item == item)
1288 void CPlaybackView::m_UpdateItemCheck(SItemInfo *itinfo)
1291 _ERR(" No item info to Update check ");
1295 if (itinfo->check_status) {
1296 elm_object_item_signal_emit(itinfo->item,
1297 MUSIC_SIGNAL_CHECK_OFF, MUSIC_PLAYBACK_VIEW);
1298 itinfo->check_status = false;
1302 elm_object_item_signal_emit(itinfo->item,
1303 MUSIC_SIGNAL_CHECK_ON, MUSIC_PLAYBACK_VIEW);
1304 itinfo->check_status = true;
1308 class CElmGenlistItemClass {
1310 static char *sm_CbTextGet(void *data, Evas_Object *obj, const char *part)
1312 SSongInfo *sinfo = NULL;
1313 SItemInfo *pItemInfo = (SItemInfo *)data;
1314 char buf[MAX_LENGTH];
1315 char *timestr = NULL;
1319 if (!pItemInfo || !obj)
1322 sinfo = pItemInfo->sinfo;
1324 snprintf(buf, sizeof(buf), "%s", MUSIC_STR_EMPTY);
1326 if (!strcmp(part, "elm.text0")) {
1327 index = elm_genlist_item_index_get(pItemInfo->item);
1328 snprintf(buf, sizeof(buf), "%d", index + 1);
1329 if ((index & 1) == 1) {
1330 elm_object_item_signal_emit(pItemInfo->item,
1331 MUSIC_SIGNAL_EVEN_ROW, MUSIC_PLAYBACK_VIEW);
1334 elm_object_item_signal_emit(pItemInfo->item,
1335 MUSIC_SIGNAL_ODD_ROW, MUSIC_PLAYBACK_VIEW);
1338 else if (!strcmp(part, "elm.text1"))
1339 snprintf(buf, sizeof(buf), "%s", song_info_get_title(sinfo));
1340 else if (!strcmp(part, "elm.text2"))
1341 snprintf(buf, sizeof(buf), "%s - %s",
1342 song_info_get_artist(sinfo),
1343 song_info_get_album(sinfo));
1344 else if (!strcmp(part, "elm.text3")) {
1345 if (song_info_get_duration(sinfo, &duration)) {
1346 timestr = _get_timestr_from_milseconds(duration);
1348 snprintf(buf, sizeof(buf), "%s", timestr);
1354 if (strcmp(buf, MUSIC_STR_EMPTY))
1359 static Evas_Object *sm_CbContentGet(void *data, Evas_Object *obj, const char *part)
1361 SSongInfo *sinfo = NULL;
1362 SItemInfo *pItemInfo = (SItemInfo *)data;
1363 Evas_Object *img = NULL;
1365 char buf[MAX_LENGTH];
1367 if (!pItemInfo || !obj)
1370 sinfo = pItemInfo->sinfo;
1372 img = elm_image_add(obj);
1376 elm_image_aspect_fixed_set(img, EINA_FALSE);
1378 if (!strcmp(part, "elm.swallow.icon")) {
1379 path = song_info_get_thumb(sinfo);
1381 elm_image_file_set(img, path, "NULL");
1383 snprintf(buf, sizeof(buf), "%s/%s", IMAGEDIR,
1384 MUSIC_IMAGE_DEFAULT_THUMB_126);
1385 elm_image_file_set(img, buf, "NULL");
1389 if (pItemInfo->select_status) {
1390 elm_object_item_signal_emit(pItemInfo->item,
1391 MUSIC_SIGNAL_SELECT_ITEM, MUSIC_PLAYBACK_VIEW);
1394 elm_object_item_signal_emit(pItemInfo->item,
1395 MUSIC_SIGNAL_UNSELECT_ITEM,
1396 MUSIC_PLAYBACK_VIEW);
1399 if (pItemInfo->edit_mode) {
1400 elm_object_item_signal_emit(pItemInfo->item,
1401 MUSIC_SIGNAL_EDITMODE_ON, MUSIC_PLAYBACK_VIEW);
1402 if (pItemInfo->check_status) {
1403 elm_object_item_signal_emit(pItemInfo->item,
1404 MUSIC_SIGNAL_CHECK_ON,
1405 MUSIC_PLAYBACK_VIEW);
1408 elm_object_item_signal_emit(pItemInfo->item,
1409 MUSIC_SIGNAL_CHECK_OFF, MUSIC_PLAYBACK_VIEW);
1413 elm_object_item_signal_emit(pItemInfo->item,
1414 MUSIC_SIGNAL_EDITMODE_OFF, MUSIC_PLAYBACK_VIEW);
1420 static void sm_CbDel(void *data, Evas_Object *obj)
1427 Elm_Genlist_Item_Class *CPlaybackView::m_GetItemClass(void)
1429 Elm_Genlist_Item_Class *list_item = NULL;
1431 list_item = elm_genlist_item_class_new();
1433 _ERR(" elm_genlist_item_class_new failed ");
1437 list_item->item_style = MUSIC_STYLE_PLAYLIST;
1438 list_item->func.text_get = CElmGenlistItemClass::sm_CbTextGet;
1439 list_item->func.content_get = CElmGenlistItemClass::sm_CbContentGet;
1440 list_item->func.state_get = NULL;
1441 list_item->func.del = CElmGenlistItemClass::sm_CbDel;
1447 void CPlaybackView::m_AddGenlist(void)
1449 Evas_Object *genlist = NULL;
1450 Evas_Object *eoBase = NULL;
1453 genlist = elm_genlist_add(eoBase);
1457 elm_genlist_homogeneous_set(genlist, EINA_TRUE);
1458 evas_object_size_hint_weight_set(genlist,
1459 EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
1460 elm_object_part_content_set(eoBase, MUSIC_PART_PLAYLIST, genlist);
1461 elm_genlist_select_mode_set(genlist, ELM_OBJECT_SELECT_MODE_ALWAYS);
1462 elm_genlist_multi_select_set(genlist, EINA_FALSE);
1464 Connect(genlist, EO_PLAYLIST, TYPE_REALIZED | TYPE_UNREALIZED | TYPE_MOUSE_MOVE | TYPE_KEY_DOWN | TYPE_ACTIVATED);
1466 evas_object_show(genlist);
1467 m->eoPlaylist = genlist;
1471 void CPlaybackView::m_AddPlaylist(void)
1473 Elm_Genlist_Item_Class *list_item = NULL;
1476 struct SSongInfo *sinfo = NULL;
1477 Elm_Object_Item *item = NULL;
1478 SItemInfo *pItemInfo = NULL;
1484 list_item = m_GetItemClass();
1486 evas_object_del(m->eoPlaylist);
1490 if (!m->hMusicController->GetTotalSongs(&ts)) {
1491 _ERR(" music get total songs failed ");
1495 if (!m->hMusicController->GetCurrentSongIndex(&index))
1496 _ERR(" music get current song index failed ");
1498 for (i = 0; i < ts; i++) {
1499 if (!m->hMusicController->GetSonginfoFromIndex(i, &sinfo)) {
1500 _ERR(" music get songinfo failed ");
1503 pItemInfo = (SItemInfo *)calloc(1, sizeof(*pItemInfo));
1506 pItemInfo->sinfo = sinfo;
1507 pItemInfo->edit_mode = false;
1508 pItemInfo->check_status = false;
1509 pItemInfo->select_status = false;
1511 item = elm_genlist_item_append(m->eoPlaylist, list_item,
1512 pItemInfo, NULL, ELM_GENLIST_ITEM_NONE,
1513 sm_CbItemSelect, m);
1514 pItemInfo->item = item;
1517 pItemInfo->select_status = true;
1518 m->cs_itinfo = pItemInfo;
1520 m->elInfo = eina_list_append(m->elInfo, pItemInfo);
1525 void CPlaybackView::m_RemovePlaylist(void)
1527 if (m->eoPlaylist) {
1528 elm_genlist_clear(m->eoPlaylist);
1529 m->eoPlaylist = NULL;
1533 eina_list_free(m->elInfo);
1539 void CPlaybackView::m_HandleRewindBtnClicked(Evas_Object *obj)
1541 elm_object_signal_emit(obj, MUSIC_SIGNAL_BTN_CLICKED,
1542 MUSIC_PLAYBACK_VIEW);
1544 if (m->hMusicController->PlayState() == PLAY_STATUS_STOP)
1547 if (!m->hMusicController->PlayPreviousSong()){
1548 _ERR(" music play previous song failed ");
1552 m_UpdateCurrentSongInfo();
1556 void CPlaybackView::m_HandleForwardBtnClicked(Evas_Object *obj)
1558 elm_object_signal_emit(obj, MUSIC_SIGNAL_BTN_CLICKED,
1559 MUSIC_PLAYBACK_VIEW);
1561 if (m->hMusicController->PlayState() == PLAY_STATUS_STOP)
1564 if (!m->hMusicController->PlayNextSong()) {
1565 _ERR(" music play next song failed ");
1569 m_UpdateCurrentSongInfo();
1573 void CPlaybackView::m_HandleOnPressed(Evas_Object *obj)
1575 m->press_status = PRESS_SHORT;
1576 m->eoPressedObj = obj;
1578 m->etWait = ecore_timer_add(WAIT_INTERVAL, sm_CbWaitTimer, m);
1582 void CPlaybackView::m_HandleOnUnpressed(Evas_Object *obj)
1584 m_RemoveTimer(TIMER_WAIT);
1585 m_RemoveTimer(TIMER_LONGPRESS);
1587 if (m->press_status == PRESS_SHORT) {
1588 /* Handle song change */
1589 if (m->hMusicController->PlayState() == PLAY_STATUS_PLAY)
1592 if (obj == m->eoBtnControl[BTN_FORWARD])
1593 m_HandleForwardBtnClicked(obj);
1595 m_HandleRewindBtnClicked(obj);
1597 if (m->hMusicController->PlayState() != PLAY_STATUS_PLAY)
1600 else if (m->press_status == PRESS_LONG) {
1601 if (m->hMusicController->PlayState() != PLAY_STATUS_PLAY)
1605 m->press_status = PRESS_SHORT;
1609 void CPlaybackView::m_HandleGenlistItemActivated(Evas_Object *obj, Elm_Object_Item *genListItem)
1612 SItemInfo *itinfo = NULL;
1614 if (!obj || !genListItem)
1617 itinfo = m_FindItemInfoFromItem(m->elInfo, genListItem);
1619 _ERR(" no item info found ");
1623 if (itinfo->edit_mode) {
1624 m_UpdateItemCheck(itinfo);
1625 m_DisableEditButtons(false);
1629 index = elm_genlist_item_index_get(genListItem);
1631 m->hMusicController->PlayIndexSong(index);
1632 m_UpdateCurrentSongInfo();
1636 bool CPlaybackView::Create(void *data)
1641 _CHECK(m = new SPlaybackView)
1642 _CHECK(m->mgr = CViewMgr::GetInstance())
1643 _CHECK(m->eoWin = m->mgr->Window())
1644 _CHECK(m->hMusicController = CMusicController::GetInstance())
1645 _CHECK(m->eoBase = _add_base(m->eoWin, MUSIC_PLAYBACK_VIEW))
1646 _CHECK(CBaseView::Create(data))
1648 _CHECK_FAIL{ CBaseView::Destroy(); }
1649 _CHECK_FAIL{ evas_object_del(m->eoBase); }
1650 _CHECK_FAIL{ /* CMusicController::GetInstance())*/ }
1651 _CHECK_FAIL{ /* mgr->Window() */ }
1652 _CHECK_FAIL{ /* CViewerMgr::GetInstance() */}
1653 _CHECK_FAIL{ delete m; m = NULL; }
1654 }_CREATE_END_AND_CATCH{ return false; }
1656 m->press_status = PRESS_SHORT;
1659 evas_object_data_set(m->eoBase, PLAYBACK_VIEW_DATA, m);
1661 m_AddControlButtons();
1662 m_AddEditPlaylistButtons();
1663 m_AddCurrentSonginfo();
1666 m->pHandleVolume->Create(m->eoBase);
1667 m_UpdatePlaymodeFocusSequence();
1669 Connect(m->eoBase, EO_BASE, TYPE_KEY_DOWN | TYPE_KEY_UP);
1671 m->hMusicController->AddListener(this);
1677 void CPlaybackView::Destroy(void)
1681 m->hMusicController->RemoveListener(this);
1683 m_DestroyErrorPopup();
1685 m_RemoveTimer(TIMER_SLIDER);
1686 m_RemoveTimer(TIMER_WAIT);
1687 m_RemoveTimer(TIMER_LONGPRESS);
1688 m_DestroySettingsPopup();
1690 m->pHandleVolume->Destroy();
1691 CBaseView::Destroy();
1692 evas_object_del(m->eoBase);
1700 Evas_Object* CPlaybackView::Base(void)
1708 void CPlaybackView::t_OnClickedSettings(Evas_Object *obj)
1710 elm_object_signal_emit(obj, MUSIC_SIGNAL_BTN_CLICKED, MUSIC_PLAYBACK_VIEW);
1712 if (eina_list_count(m->elInfo) == 0)
1715 elm_object_signal_emit(obj, MUSIC_SIGNAL_CONTROL_SELECTED, MUSIC_PLAYBACK_VIEW);
1716 m_DestroySettingsPopup();
1717 m_CreateSettingsPopup();
1721 void CPlaybackView::t_OnClickedShuffle(Evas_Object *obj)
1723 elm_object_signal_emit(obj, MUSIC_SIGNAL_BTN_CLICKED, MUSIC_PLAYBACK_VIEW);
1725 switch (m->hMusicController->ShuffleState()) {
1726 case SHUFFLE_STATUS_OFF:
1727 m->hMusicController->SetShuffleState(SHUFFLE_STATUS_ON);
1728 elm_object_signal_emit(obj, MUSIC_SIGNAL_SHUFFLE_ON, MUSIC_PLAYBACK_VIEW);
1732 m->hMusicController->SetShuffleState(SHUFFLE_STATUS_OFF);
1733 elm_object_signal_emit(obj, MUSIC_SIGNAL_SHUFFLE_OFF, MUSIC_PLAYBACK_VIEW);
1739 void CPlaybackView::t_OnClickedRepeat(Evas_Object *obj)
1741 elm_object_signal_emit(obj, MUSIC_SIGNAL_BTN_CLICKED, MUSIC_PLAYBACK_VIEW);
1743 switch (m->hMusicController->RepeatState()) {
1744 case REPEAT_STATUS_NONE:
1745 m->hMusicController->SetRepeatState(REPEAT_STATUS_ALL);
1746 elm_object_signal_emit(obj, MUSIC_SIGNAL_REPEAT_ALL, MUSIC_PLAYBACK_VIEW);
1749 case REPEAT_STATUS_ALL:
1750 m->hMusicController->SetRepeatState(REPEAT_STATUS_ONE);
1751 elm_object_signal_emit(obj, MUSIC_SIGNAL_REPEAT_ONE, MUSIC_PLAYBACK_VIEW);
1755 m->hMusicController->SetRepeatState(REPEAT_STATUS_NONE);
1756 elm_object_signal_emit(obj, MUSIC_SIGNAL_REPEAT_OFF, MUSIC_PLAYBACK_VIEW);
1762 void CPlaybackView::t_OnClickedPlay(Evas_Object *obj)
1764 elm_object_signal_emit(obj, MUSIC_SIGNAL_BTN_CLICKED, MUSIC_PLAYBACK_VIEW);
1766 switch (m->hMusicController->PlayState()) {
1767 case PLAY_STATUS_PAUSE:
1769 elm_object_signal_emit(obj, MUSIC_SIGNAL_PLAY, MUSIC_PLAYBACK_VIEW);
1772 case PLAY_STATUS_PLAY:
1773 elm_object_signal_emit(obj, MUSIC_SIGNAL_PAUSE, MUSIC_PLAYBACK_VIEW);
1778 if (m->hMusicController)
1779 m->hMusicController->Start();
1780 m_UpdateCurrentSongInfo();
1786 void CPlaybackView::t_OnShow(void)
1793 elm_genlist_item_show(m->cs_itinfo->item,
1794 ELM_GENLIST_ITEM_SCROLLTO_IN);
1795 elm_object_item_focus_set(m->cs_itinfo->item, EINA_TRUE);
1798 state = m->hMusicController->PlayState();
1799 if (state == PLAY_STATUS_INITIAL || state == PLAY_STATUS_STOP) {
1802 m->hMusicController->Start();
1803 m_UpdateCurrentSongInfo();
1806 evas_object_show(m->eoBase);
1810 void CPlaybackView::t_OnUpdate(void *data)
1817 SParcel *parcel = (SParcel *)data;
1818 int updateType = parcel->updateType;
1819 char *key = (char *)parcel->keyEvent;
1821 switch (updateType) {
1822 case E_PLAYLIST_UPDATE:
1825 elm_object_disabled_set(m->eoBtnControl[BTN_FORWARD], EINA_FALSE);
1826 elm_object_disabled_set(m->eoBtnControl[BTN_REWIND], EINA_FALSE);
1827 elm_object_disabled_set(m->eoBtnControl[BTN_PLAY], EINA_FALSE);
1828 elm_object_focus_next_object_set(m->eoBtnControl[BTN_REPEAT],
1829 m->eoBtnControl[BTN_REWIND], ELM_FOCUS_RIGHT);
1830 m_FromEditToPlaybackMode();
1834 m_HandleKeyPress(key);
1838 m_HandleKeyUnpress(key);
1847 void CPlaybackView::t_OnHide(void)
1851 evas_object_hide(m->eoBase);
1855 void CPlaybackView::OnKeyDown(int id, Evas *e, Evas_Object *obj, Evas_Event_Key_Down *ev)
1859 m_HandleKeyPress(ev->keyname);
1862 case EO_ERROR_POPUP_BUTTON:
1863 if (!strcmp(ev->keyname, KEY_BACK)) {
1864 m_DestroyErrorPopup();
1865 elm_object_focus_set(m->eoBtnControl[BTN_PLAY], EINA_TRUE);
1871 Elm_Object_Item *it = NULL;
1872 SContentInfo *ctxtinfo = NULL;
1873 SItemInfo *itinfo = NULL;
1875 if (strcmp(ev->keyname, KEY_MENU))
1878 it = elm_object_focused_item_get(obj);
1880 _ERR(" unable to get focused item ");
1883 m->focused_item = it;
1890 ctxtinfo = (SContentInfo *)calloc(1, sizeof(*ctxtinfo));
1894 itinfo = m_FindItemInfoFromItem(m->elInfo, it);
1900 if (m->hMusicController->PlayState() == PLAY_STATUS_PLAY &&
1901 itinfo == m->cs_itinfo)
1902 ctxtinfo->status = PLAY_STATUS_PLAY;
1904 ctxtinfo->status = PLAY_STATUS_PAUSE;
1906 ctxtinfo->cbdata = m;
1907 ctxtinfo->update = sm_CbCtxtUpdate;
1908 ctxtinfo->close = sm_CbCtxtClose;
1909 ctxtinfo->type = CONTEXT_TYPE_PLAYSONG;
1910 ctxtinfo->context = itinfo->sinfo;
1912 m->ctxtinfo = ctxtinfo;
1915 parcel.ctxtInfo = ctxtinfo;
1916 if (!m->mgr->PushView(MUSIC_CONTEXT_VIEW, &parcel))
1917 _ERR("viewmgr push view MUSIC_CONTEXT_VIEW failed");
1921 if (!strcmp(ev->keyname, KEY_BACK)) {
1922 _ERR("eoCtxPopup BACK key pressed ");
1923 m_DestroySettingsPopup();
1924 elm_object_focus_set(m->eoBtnControl[BTN_SETTINGS], EINA_TRUE);
1927 else if (!strcmp(ev->keyname, KEY_EXIT)) {
1928 _ERR("eoCtxPopup EXIT key pressed ");
1929 m_DestroySettingsPopup();
1930 m_RemoveTimer(TIMER_SLIDER);
1931 m->hMusicController->Stop();
1942 void CPlaybackView::OnKeyUp(int id, Evas *e, Evas_Object *obj, Evas_Event_Key_Up *ev)
1946 m_HandleKeyUnpress(ev->keyname);
1955 void CPlaybackView::OnMouseClicked(int id, Evas_Object *obj)
1958 case EO_ERROR_POPUP_BUTTON:
1959 m_DestroyErrorPopup();
1960 elm_object_focus_set(m->eoBtnControl[BTN_PLAY], EINA_TRUE);
1963 case EO_EDIT_PLAYLIST:
1964 m_DestroySettingsPopup();
1965 m_FromPlaybackToEditMode();
1968 case EO_CLEAR_PLAYLIST:
1969 m->hMusicController->Stop();
1970 m->hMusicController->EmptyPlaylist();
1972 eina_list_free(m->elInfo);
1975 elm_genlist_clear(m->eoPlaylist);
1977 m_DestroySettingsPopup();
1978 m_UpdateEmptySongInfo();
1982 m_DisableCheckAll(m->elInfo);
1983 m_DisableEditButtons(true);
1984 m_FromEditToPlaybackMode();
1988 m_DisableCheckAll(m->elInfo);
1989 m_DisableEditButtons(true);
1990 elm_genlist_realized_items_update(m->eoPlaylist);
1991 elm_object_focus_set(m->eoBtnEdit[BTN_CANCEL], EINA_TRUE);
1995 m_DeleteSelectedItems();
1998 case EO_BTN_SETTINGS:
1999 t_OnClickedSettings(obj);
2002 case EO_BTN_SHUFFLE:
2003 t_OnClickedShuffle(obj);
2007 t_OnClickedRepeat(obj);
2011 t_OnClickedPlay(obj);
2020 void CPlaybackView::OnMouseMove(int id, Evas *e, Evas_Object *obj, Evas_Event_Mouse_Move *ev)
2027 case EO_BTN_FORWARD:
2031 case EO_BTN_SETTINGS:
2032 case EO_BTN_SHUFFLE:
2033 case EO_EDIT_PLAYLIST:
2034 case EO_CLEAR_PLAYLIST:
2036 if (!elm_object_focus_get(obj))
2037 elm_object_focus_set(obj, EINA_TRUE);
2046 void CPlaybackView::OnPressed(int id, Evas_Object *obj)
2049 case EO_BTN_FORWARD:
2051 m_HandleOnPressed(obj);
2060 void CPlaybackView::OnUnpressed(int id, Evas_Object *obj)
2063 case EO_BTN_FORWARD:
2065 m_HandleOnUnpressed(obj);
2074 void CPlaybackView::OnChanged(int id, Evas_Object *obj)
2079 char *timestr = NULL;
2082 if (m->hMusicController->PlayState() == PLAY_STATUS_PLAY) {
2084 ecore_timer_freeze(m->etSlider);
2087 value = elm_slider_value_get(obj);
2088 m->hMusicController->SetPosition(value);
2089 timestr = _get_timestr_from_milseconds(value);
2091 elm_object_part_text_set(m->eoBase, MUSIC_PART_PROGRESSTIME,
2096 if (m->hMusicController->PlayState() == PLAY_STATUS_PLAY) {
2098 ecore_timer_thaw(m->etSlider);
2109 void CPlaybackView::OnRealized(int id, Evas_Object *obj, Elm_Object_Item *item)
2113 elm_object_item_signal_callback_add(item,
2114 MUSIC_SIGNAL_CHECK_CLICKED, MUSIC_PLAYBACK_VIEW,
2115 sm_CbGenlistItemCheckClicked, this);
2124 void CPlaybackView::OnUnrealized(int id, Evas_Object *obj, Elm_Object_Item *item)
2128 elm_object_item_signal_callback_del(item,
2129 MUSIC_SIGNAL_CHECK_CLICKED, MUSIC_PLAYBACK_VIEW,
2130 sm_CbGenlistItemCheckClicked);
2139 void CPlaybackView::OnActivated(int id, Evas_Object *obj, Elm_Object_Item *item)
2143 m_HandleGenlistItemActivated(obj, item);
2152 void CPlaybackView::t_OnComplete(void)
2154 m_UpdateCurrentSongInfo();
2158 void CPlaybackView::t_OnError(void)
2160 m_CreateErrorPopup();
2164 void CPlaybackView::t_OnUsbConnected(void)
2169 void CPlaybackView::t_OnUpdateContent(void)