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 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 = _get_timestr_from_milseconds(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::m_RemoveTimer(int timer_code)
322 ETimers timerCode = (ETimers)timer_code;
327 ecore_timer_del(m->etSlider);
334 ecore_timer_del(m->etWait);
339 case TIMER_LONGPRESS:
340 if (m->etLongPress) {
341 ecore_timer_del(m->etLongPress);
342 m->etLongPress = NULL;
347 m->pHandleVolume->RemoveTimer();
351 _ERR(" invalid value ");
357 void CPlaybackView::m_PlaybackPause(void)
359 m->hMusicController->Pause();
362 ecore_timer_freeze(m->etSlider);
366 void CPlaybackView::m_PlaybackResume(void)
368 m->hMusicController->Resume();
371 ecore_timer_thaw(m->etSlider);
375 void CPlaybackView::m_ChangeEditmodeAll(Eina_List *list, bool flag)
377 SItemInfo *itinfo = NULL;
381 EINA_LIST_FOREACH(list, l, obj) {
382 itinfo = (SItemInfo *)obj;
383 itinfo->edit_mode = flag;
388 void CPlaybackView::m_DisableCheckAll(Eina_List *list)
390 SItemInfo *itinfo = NULL;
394 EINA_LIST_FOREACH(list, l, obj) {
395 itinfo = (SItemInfo *)obj;
396 itinfo->check_status = false;
401 void CPlaybackView::m_SelectItem(SItemInfo *pItemInfo)
403 if (!pItemInfo || !pItemInfo->item)
406 elm_genlist_item_bring_in(pItemInfo->item, ELM_GENLIST_ITEM_SCROLLTO_IN);
407 elm_object_item_signal_emit(pItemInfo->item, MUSIC_SIGNAL_SELECT_ITEM, MUSIC_PLAYBACK_VIEW);
409 pItemInfo->select_status = true;
413 void CPlaybackView::m_UnselectItem(SItemInfo *pItemInfo)
415 if (!pItemInfo || !pItemInfo->item)
418 elm_object_item_signal_emit(pItemInfo->item, MUSIC_SIGNAL_UNSELECT_ITEM,
419 MUSIC_PLAYBACK_VIEW);
421 pItemInfo->select_status = false;
425 void CPlaybackView::m_UpdateControlBtns(void)
429 state = m->hMusicController->PlayState();
430 if (state != PLAY_STATUS_STOP) {
431 elm_object_disabled_set(m->eoBtnControl[BTN_FORWARD], EINA_FALSE);
432 elm_object_disabled_set(m->eoBtnControl[BTN_REWIND], EINA_FALSE);
436 elm_object_focus_set(m->eoBtnControl[BTN_PLAY], EINA_TRUE);
437 elm_object_disabled_set(m->eoBtnControl[BTN_FORWARD], EINA_TRUE);
438 elm_object_disabled_set(m->eoBtnControl[BTN_REWIND], EINA_TRUE);
441 if (state == PLAY_STATUS_PLAY) {
442 elm_object_signal_emit(m->eoBtnControl[BTN_PLAY], MUSIC_SIGNAL_PLAY, MUSIC_PLAYBACK_VIEW);
445 elm_object_signal_emit(m->eoBtnControl[BTN_PLAY], MUSIC_SIGNAL_PAUSE, MUSIC_PLAYBACK_VIEW);
448 state = m->hMusicController->ShuffleState();
449 if (state == SHUFFLE_STATUS_OFF) {
450 elm_object_signal_emit(m->eoBtnControl[BTN_SHUFFLE], MUSIC_SIGNAL_SHUFFLE_OFF, MUSIC_PLAYBACK_VIEW);
453 elm_object_signal_emit(m->eoBtnControl[BTN_SHUFFLE], MUSIC_SIGNAL_SHUFFLE_ON, MUSIC_PLAYBACK_VIEW);
456 state = m->hMusicController->RepeatState();
457 if (state == REPEAT_STATUS_NONE) {
458 elm_object_signal_emit(m->eoBtnControl[BTN_REPEAT], MUSIC_SIGNAL_REPEAT_OFF, MUSIC_PLAYBACK_VIEW);
460 else if (state == REPEAT_STATUS_ALL) {
461 elm_object_signal_emit(m->eoBtnControl[BTN_REPEAT], MUSIC_SIGNAL_REPEAT_ALL, MUSIC_PLAYBACK_VIEW);
464 elm_object_signal_emit(m->eoBtnControl[BTN_REPEAT], MUSIC_SIGNAL_REPEAT_ONE, MUSIC_PLAYBACK_VIEW);
469 void CPlaybackView::m_UpdateCurrentSongProgressbar(void)
472 char *timestr = NULL;
479 elm_slider_value_set(m->eoSlider, 0);
480 elm_object_part_text_set(m->eoBase, MUSIC_PART_PROGRESSTIME, "00:00");
482 state = m->hMusicController->PlayState();
484 if (state == PLAY_STATUS_STOP) {
485 elm_object_disabled_set(m->eoSlider, EINA_TRUE);
486 m_RemoveTimer(TIMER_SLIDER);
490 elm_object_disabled_set(m->eoSlider, EINA_FALSE);
492 duration = m->csinfo->Duration();
494 m_RemoveTimer(TIMER_SLIDER);
495 m->etSlider = ecore_timer_add(S_INTERVAL,
496 sm_CbUpdateSlider, m);
498 elm_slider_min_max_set(m->eoSlider, 0, duration);
499 timestr = _get_timestr_from_milseconds(duration);
501 elm_object_part_text_set(m->eoBase,
502 MUSIC_PART_FULLTIME, timestr);
506 step = (double)SLIDER_STEP / (double)duration;
507 elm_slider_step_set(m->eoSlider, step);
512 void CPlaybackView::m_UpdateCurrentSongThumbnail(void)
515 char buf[MAX_LENGTH];
517 if (!m->cs_itinfo || !m->cs_itinfo->sinfo)
520 path = m->cs_itinfo->sinfo->ThumbnailPath();
522 elm_image_file_set(m->eoAlbumCover, path, NULL);
524 snprintf(buf, sizeof(buf), "%s/%s", IMAGEDIR,
525 MUSIC_IMAGE_DEFAULT_THUMB_450);
526 elm_image_file_set(m->eoAlbumCover, buf, NULL);
531 void CPlaybackView::m_UpdateCurrentSongLabels(void)
533 char buf[MAX_LENGTH];
538 elm_object_part_text_set(m->eoBase, MUSIC_PART_SONG_TITLE,
541 snprintf(buf, sizeof(buf), "%s - %s", m->csinfo->Artist(),
544 elm_object_part_text_set(m->eoBase, MUSIC_PART_ARTIST_ALBUM, buf);
548 void CPlaybackView::m_UpdateEmptySongInfo(void)
550 char buf[MAX_LENGTH];
552 elm_object_signal_emit(m->eoBtnControl[BTN_PLAY],
553 MUSIC_SIGNAL_PAUSE, MUSIC_PLAYBACK_VIEW);
554 elm_object_focus_set(m->eoBtnControl[BTN_SETTINGS], EINA_TRUE);
555 elm_object_focus_next_object_set(m->eoBtnControl[BTN_REPEAT],
556 m->eoBtnControl[BTN_REPEAT], ELM_FOCUS_RIGHT);
557 elm_object_disabled_set(m->eoBtnControl[BTN_FORWARD], EINA_TRUE);
558 elm_object_disabled_set(m->eoBtnControl[BTN_REWIND], EINA_TRUE);
559 elm_object_disabled_set(m->eoBtnControl[BTN_PLAY], EINA_TRUE);
560 elm_object_disabled_set(m->eoSlider, EINA_TRUE);
561 elm_object_part_text_set(m->eoBase, MUSIC_PART_FULLTIME, "00:00");
562 elm_object_part_text_set(m->eoBase, MUSIC_PART_PROGRESSTIME, "00:00");
563 elm_slider_value_set(m->eoSlider, 0);
564 elm_object_part_text_set(m->eoBase, MUSIC_PART_SONG_TITLE,
565 _(NO_PLAYLIST_MESSAGE));
566 elm_object_part_text_set(m->eoBase, MUSIC_PART_ARTIST_ALBUM,
567 _(NO_PLAYLIST_MESSAGE_SUB));
568 snprintf(buf, sizeof(buf), "%s/%s", IMAGEDIR,
569 MUSIC_IMAGE_DEFAULT_THUMB_450);
570 elm_image_file_set(m->eoAlbumCover, buf, NULL);
571 m->hMusicController->SetPlayState(PLAY_STATUS_INITIAL);
575 void CPlaybackView::m_UpdateCtxtView(int playStatus)
577 if (!m->cs_itinfo || !m->ctxtinfo)
580 if (!m->mgr->CheckTop(MUSIC_CONTEXT_VIEW))
583 if (m->cs_itinfo->sinfo == m->ctxtinfo->context) {
584 m->ctxtinfo->status = (EPlayStatus)playStatus;
587 parcel.ctxtInfo = NULL;
588 parcel.updateType = E_SONG_UPDATE;
589 parcel.layoutId = NULL;
590 parcel.keyEvent = NULL;
591 m->mgr->UpdateView((const char *)MUSIC_CONTEXT_VIEW, &parcel);
596 void CPlaybackView::m_UpdateCurrentSongItem(int index)
598 SItemInfo *pItemInfo = NULL;
601 m_UnselectItem(m->cs_itinfo);
602 m_UpdateCtxtView(PLAY_STATUS_PAUSE);
605 pItemInfo = (SItemInfo *)eina_list_nth(m->elInfo, index);
608 m->cs_itinfo = pItemInfo;
609 if (m->hMusicController->PlayState() == PLAY_STATUS_STOP) {
610 elm_genlist_item_bring_in(pItemInfo->item,
611 ELM_GENLIST_ITEM_SCROLLTO_IN);
614 m_SelectItem(pItemInfo);
615 m_UpdateCtxtView(PLAY_STATUS_PLAY);
621 void CPlaybackView::m_UpdateEditmodeFocusSequence(void)
623 elm_object_focus_next_object_set(m->eoPlaylist,
624 m->eoBtnEdit[BTN_CANCEL], ELM_FOCUS_LEFT);
625 elm_object_focus_next_object_set(m->eoBtnEdit[BTN_CANCEL],
626 m->eoPlaylist, ELM_FOCUS_RIGHT);
627 elm_object_focus_next_object_set(m->eoSlider, m->eoBtnEdit[BTN_CANCEL],
632 void CPlaybackView::m_UpdatePlaymodeFocusSequence(void)
634 elm_object_focus_next_object_set(m->eoSlider, m->eoPlaylist,
636 elm_object_focus_next_object_set(m->eoSlider, m->eoBtnControl[BTN_PLAY],
638 if (m->hMusicController->PlayState() == PLAY_STATUS_STOP) {
639 elm_object_focus_next_object_set(m->eoPlaylist,
640 m->eoBtnControl[BTN_PLAY], ELM_FOCUS_LEFT);
641 elm_object_focus_next_object_set(m->eoBtnControl[BTN_PLAY],
642 m->eoPlaylist, ELM_FOCUS_RIGHT);
645 elm_object_focus_next_object_set(m->eoPlaylist,
646 m->eoBtnControl[BTN_FORWARD], ELM_FOCUS_LEFT);
647 elm_object_focus_next_object_set(m->eoBtnControl[BTN_FORWARD],
648 m->eoPlaylist, ELM_FOCUS_RIGHT);
649 elm_object_focus_next_object_set(m->eoBtnControl[BTN_PLAY],
650 m->eoBtnControl[BTN_FORWARD], ELM_FOCUS_RIGHT);
655 void CPlaybackView::m_UpdateCurrentSongInfo(void)
657 CSongInfo *sinfo = NULL;
660 if (eina_list_count(m->elInfo) == 0) {
661 m_UpdateEmptySongInfo();
665 if (!m->hMusicController->GetCurrentSongIndex(&index)) {
666 _ERR(" music get current song index failed ");
670 if (!m->hMusicController->GetSonginfoFromIndex(index, &sinfo)) {
671 _ERR(" music get songinfo failed ");
676 m_UpdateCurrentSongItem(index);
677 m_UpdateCurrentSongLabels();
678 m_UpdateCurrentSongThumbnail();
679 m_UpdateCurrentSongProgressbar();
680 m_UpdateControlBtns();
681 m_UpdatePlaymodeFocusSequence();
685 void CPlaybackView::m_DisableEditButtons(bool flag)
687 /* flag - 1 means disable edit buttons and 0 means enable */
689 elm_object_focus_set(m->eoBtnEdit[BTN_CANCEL], EINA_TRUE);
691 elm_object_disabled_set(m->eoBtnEdit[BTN_DELETE], (Eina_Bool)flag);
692 elm_object_disabled_set(m->eoBtnEdit[BTN_DESELECT], (Eina_Bool)flag);
694 m_UpdateEditmodeFocusSequence();
695 elm_object_focus_set(m->eoBtnEdit[BTN_CANCEL], EINA_TRUE);
698 elm_object_focus_next_object_set(m->eoBtnEdit[BTN_CANCEL],
699 m->eoBtnEdit[BTN_DESELECT], ELM_FOCUS_RIGHT);
700 elm_object_focus_next_object_set(m->eoBtnEdit[BTN_DELETE],
701 m->eoPlaylist, ELM_FOCUS_RIGHT);
702 elm_object_focus_next_object_set(m->eoPlaylist,
703 m->eoBtnEdit[BTN_DELETE], ELM_FOCUS_LEFT);
708 void CPlaybackView::m_CreateErrorPopup(void)
710 Evas_Object *popup = NULL, *btn = NULL, *label = NULL;
712 popup = elm_popup_add(m->eoBase);
716 elm_object_style_set(popup, MUSIC_STYLE_ERROR_POPUP);
717 evas_object_show(popup);
719 label = elm_label_add(popup);
721 evas_object_del(popup);
725 elm_object_style_set(label, MUSIC_STYLE_ERROR_LABEL);
726 elm_object_text_set(label, MUSIC_TEXT_PLAYBACK_ERROR);
727 elm_object_content_set(popup, label);
729 btn = elm_button_add(popup);
731 evas_object_del(popup);
735 elm_object_style_set(btn, MUSIC_STYLE_EDIT_BTN);
736 elm_object_text_set(btn, MUSIC_TEXT_OK);
737 elm_object_part_content_set(popup, MUSIC_PART_POPUP_BUTTON, btn);
739 m->eoErrPopup = popup;
741 Connect(btn, EO_ERROR_POPUP_BUTTON, TYPE_CLICKED | TYPE_KEY_DOWN);
743 elm_object_focus_set(btn, EINA_TRUE);
749 void CPlaybackView::m_DestroyErrorPopup(void)
754 evas_object_del(m->eoErrPopup);
755 m->eoErrPopup = NULL;
759 void CPlaybackView::m_CreateSettingsPopup(void)
761 Evas_Object *box = NULL;
762 Evas_Object *eoCtxPopup = NULL;
765 SBtnInfo btninfo[TOTAL_SETTING_BTNS];
767 btninfo[BTN_EDIT].txt = MUSIC_TEXT_EDIT_PLAYLIST;
768 btninfo[BTN_EDIT].type = EO_EDIT_PLAYLIST;
770 btninfo[BTN_CLEAR].txt = MUSIC_TEXT_CLEAR_PLAYLIST;
771 btninfo[BTN_CLEAR].type = EO_CLEAR_PLAYLIST;
773 eoCtxPopup = elm_ctxpopup_add(m->eoWin);
777 box = _add_box(eoCtxPopup);
779 evas_object_del(eoCtxPopup);
783 for (i = 0; i < TOTAL_SETTING_BTNS; i++) {
784 m->eoBtnSetting[i] = elm_button_add(box);
785 if (!m->eoBtnSetting[i])
788 elm_object_style_set(m->eoBtnSetting[i],
789 MUSIC_STYLE_SETTING_BTN_T);
792 elm_object_style_set(m->eoBtnSetting[i],
793 MUSIC_STYLE_SETTING_BTN_B);
795 evas_object_size_hint_weight_set(m->eoBtnSetting[i],
796 EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
797 elm_box_pack_end(box, m->eoBtnSetting[i]);
798 elm_object_text_set(m->eoBtnSetting[i], _(btninfo[i].txt));
800 Connect(m->eoBtnSetting[i], btninfo[i].type, TYPE_CLICKED | TYPE_MOUSE_MOVE);
802 evas_object_show(m->eoBtnSetting[i]);
805 elm_object_style_set(eoCtxPopup, MUSIC_STYLE_SETTING_POPUP);
806 elm_object_content_set(eoCtxPopup, box);
808 scale = elm_config_scale_get();
809 Connect(box, EO_BOX, TYPE_KEY_DOWN);
810 elm_object_part_content_set(m->eoBase, MUSIC_PART_SETTINGS_POPUP, eoCtxPopup);
812 /* If list empty disable these options */
813 if (eina_list_count(m->elInfo) == 0) {
814 elm_object_disabled_set(m->eoBtnSetting[BTN_EDIT], EINA_TRUE);
815 elm_object_disabled_set(m->eoBtnSetting[BTN_CLEAR], EINA_TRUE);
818 elm_object_focus_set(m->eoBtnSetting[BTN_EDIT], EINA_TRUE);
820 m->eoCtxPopup = eoCtxPopup;
824 void CPlaybackView::m_DestroySettingsPopup(void)
829 evas_object_del(m->eoCtxPopup);
830 m->eoCtxPopup = NULL;
834 void CPlaybackView::m_FromEditToPlaybackMode(void)
836 if (m->hMusicController->PlayState() == PLAY_STATUS_STOP) {
837 elm_genlist_item_bring_in(m->cs_itinfo->item,
838 ELM_GENLIST_ITEM_SCROLLTO_IN);
841 m_SelectItem(m->cs_itinfo);
843 elm_object_signal_emit(m->eoBase, MUSIC_SIGNAL_PLAYBACK_MODE,
844 MUSIC_PLAYBACK_VIEW);
845 elm_object_focus_set(m->eoBtnControl[BTN_SETTINGS], EINA_TRUE);
847 m_ChangeEditmodeAll(m->elInfo, false);
849 elm_genlist_realized_items_update(m->eoPlaylist);
851 m_UpdatePlaymodeFocusSequence();
855 void CPlaybackView::m_FromPlaybackToEditMode(void)
857 elm_object_signal_emit(m->eoBase, MUSIC_SIGNAL_EDIT_MODE,
858 MUSIC_PLAYBACK_VIEW);
860 m_DisableEditButtons(true);
862 elm_object_focus_set(m->eoBtnEdit[BTN_CANCEL], EINA_TRUE);
864 m_ChangeEditmodeAll(m->elInfo, true);
866 elm_genlist_realized_items_update(m->eoPlaylist);
868 m_UpdateEditmodeFocusSequence();
872 void CPlaybackView::m_HandleOnRepeated(void)
874 Evas_Object *obj = NULL;
877 char *timestr = NULL;
879 if (!m->eoPressedObj)
882 obj = m->eoPressedObj;
884 value = elm_slider_value_get(m->eoSlider);
885 duration = m->cs_itinfo->sinfo->Duration();
887 if (obj == m->eoBtnControl[BTN_REWIND]) {
889 m_RemoveTimer(TIMER_LONGPRESS);
892 value = value - LP_CHANGE;
897 if (value == duration) {
898 if (m->hMusicController->PlayNextSong())
899 m_UpdateCurrentSongInfo();
901 _ERR(" music play next song failed ");
903 m->press_status = PRESS_LONG_PAUSE;
904 elm_object_signal_emit(m->eoBtnControl[BTN_PLAY], MUSIC_SIGNAL_PAUSE,
905 MUSIC_PLAYBACK_VIEW);
907 m_RemoveTimer(TIMER_LONGPRESS);
911 value = value + LP_CHANGE;
912 if (value >= duration)
916 m->hMusicController->SetPosition(value);
917 elm_slider_value_set(m->eoSlider, value);
918 timestr = _get_timestr_from_milseconds(value);
920 elm_object_part_text_set(m->eoBase, MUSIC_PART_PROGRESSTIME,
929 void CPlaybackView::m_DeleteSelectedItems(void)
931 Eina_List *l = NULL, *l_next = NULL;
932 SItemInfo *pItemInfo = NULL;
937 m_DisableEditButtons(true);
938 EINA_LIST_FOREACH_SAFE(m->elInfo, l, l_next, obj) {
939 pItemInfo = (SItemInfo *)obj;
940 if (pItemInfo->check_status) {
941 if (m->cs_itinfo == pItemInfo) {
943 m_UnselectItem(m->cs_itinfo);
944 m_RemoveTimer(TIMER_SLIDER);
946 m->hMusicController->SetPlayState(PLAY_STATUS_STOP);
947 m->hMusicController->Stop();
949 index = elm_genlist_item_index_get(pItemInfo->item);
950 m->hMusicController->RemoveSong(pItemInfo->sinfo, index);
952 m->elInfo = eina_list_remove(m->elInfo,
954 elm_object_item_del(pItemInfo->item);
958 if (eina_list_count(m->elInfo) == 0) {
959 m_UpdateEmptySongInfo();
960 elm_genlist_realized_items_update(m->eoPlaylist);
961 elm_object_focus_set(m->eoBtnEdit[BTN_CANCEL], EINA_TRUE);
966 m_UpdateCurrentSongInfo();
968 elm_genlist_realized_items_update(m->eoPlaylist);
969 elm_object_focus_set(m->eoBtnEdit[BTN_CANCEL], EINA_TRUE);
973 void CPlaybackView::m_KeyBackPress(void)
976 m_DestroySettingsPopup();
977 elm_object_focus_set(m->eoBtnControl[BTN_SETTINGS], EINA_FALSE);
978 elm_object_focus_set(m->eoBtnControl[BTN_SETTINGS], EINA_TRUE);
983 m->mgr->PushView(MUSIC_BASE_VIEW, NULL);
987 void CPlaybackView::m_KeyExitPress(void)
989 m_RemoveTimer(TIMER_SLIDER);
990 m->hMusicController->Stop();
995 void CPlaybackView::m_KeyPlayPress(void)
999 if (elm_object_disabled_get(m->eoBtnControl[BTN_PLAY]))
1002 state = m->hMusicController->PlayState();
1003 if (state == PLAY_STATUS_PAUSE) {
1005 elm_object_signal_emit(m->eoBtnControl[BTN_PLAY],
1006 MUSIC_SIGNAL_PLAY, MUSIC_PLAYBACK_VIEW);
1008 else if (state != PLAY_STATUS_PLAY) {
1009 if (m->hMusicController)
1010 m->hMusicController->Start();
1012 m_UpdateCurrentSongInfo();
1017 void CPlaybackView::m_KeyPausePress(void)
1021 if (elm_object_disabled_get(m->eoBtnControl[BTN_PLAY]))
1024 state = m->hMusicController->PlayState();
1025 if (state == PLAY_STATUS_PLAY) {
1026 elm_object_signal_emit(m->eoBtnControl[BTN_PLAY],
1027 MUSIC_SIGNAL_PAUSE, MUSIC_PLAYBACK_VIEW);
1033 void CPlaybackView::m_KeyNextPress(void)
1035 if (elm_object_disabled_get(m->eoBtnControl[BTN_FORWARD]))
1038 m_HandleOnPressed(m->eoBtnControl[BTN_FORWARD]);
1042 void CPlaybackView::m_KeyPreviousPress(void)
1044 if (elm_object_disabled_get(m->eoBtnControl[BTN_REWIND]))
1047 m_HandleOnPressed(m->eoBtnControl[BTN_REWIND]);
1051 void CPlaybackView::m_KeyNextUnpress(void)
1053 if (elm_object_disabled_get(m->eoBtnControl[BTN_FORWARD]))
1056 m_HandleOnUnpressed(m->eoBtnControl[BTN_FORWARD]);
1060 void CPlaybackView::m_KeyPreviousUnpress(void)
1062 if (elm_object_disabled_get(m->eoBtnControl[BTN_REWIND]))
1065 m_HandleOnUnpressed(m->eoBtnControl[BTN_REWIND]);
1069 void CPlaybackView::m_HandleKeyPress(char *keyname)
1071 if (strcmp(keyname, (char*)KEY_EXIT) == 0)
1073 else if (strcmp(keyname, (char*)KEY_BACK) == 0)
1075 else if (strcmp(keyname, (char*)KEY_PLAY) == 0)
1077 else if (strcmp(keyname, (char*)KEY_PAUSE) == 0)
1079 else if (strcmp(keyname, (char*)KEY_NEXT) == 0)
1081 else if (strcmp(keyname, (char*)KEY_PREVIOUS) == 0)
1082 m_KeyPreviousPress();
1083 else if (strcmp(keyname, (char*)KEY_VOLUMEUP) == 0)
1084 m->pHandleVolume->Up();
1085 else if (strcmp(keyname, (char*)KEY_VOLUMEDOWN) == 0)
1086 m->pHandleVolume->Down();
1087 else if (strcmp(keyname, (char*)KEY_MUTE) == 0)
1088 m->pHandleVolume->Mute();
1092 void CPlaybackView::m_HandleKeyUnpress(char *keyname)
1094 if (!strcmp(keyname, KEY_PREVIOUS))
1095 m_KeyPreviousUnpress();
1096 else if (!strcmp(keyname, KEY_NEXT))
1101 void CPlaybackView::m_AddSlider(void)
1103 Evas_Object *eoSlider = NULL;
1105 eoSlider = elm_slider_add(m->eoBase);
1109 elm_slider_indicator_show_set(eoSlider, EINA_FALSE);
1110 elm_slider_indicator_show_on_focus_set(eoSlider, EINA_FALSE);
1111 elm_object_style_set(eoSlider, MUSIC_STYLE_SLIDER);
1112 elm_slider_horizontal_set(eoSlider, EINA_TRUE);
1113 elm_object_part_content_set(m->eoBase, MUSIC_PART_PROGRESSBAR, eoSlider);
1115 Connect(eoSlider, EO_SLIDER, TYPE_CHANGED | TYPE_MOUSE_MOVE);
1117 evas_object_show(eoSlider);
1118 m->eoSlider = eoSlider;
1122 void CPlaybackView::m_AddAlbumCover(void)
1124 Evas_Object *eoAlbumCover = NULL;
1126 eoAlbumCover = elm_image_add(m->eoBase);
1130 evas_object_size_hint_weight_set(eoAlbumCover, EVAS_HINT_EXPAND,
1132 elm_image_aspect_fixed_set(eoAlbumCover, EINA_FALSE);
1134 elm_object_part_content_set(m->eoBase, MUSIC_PART_ALBUMCOVER,
1136 evas_object_show(eoAlbumCover);
1137 m->eoAlbumCover = eoAlbumCover;
1142 void CPlaybackView::m_AddCurrentSonginfo(void)
1149 void CPlaybackView::m_AddEditPlaylistButtons(void)
1151 Evas_Object *box = NULL;
1153 SBtnInfo btninfo[TOTAL_EDIT_BTNS];
1155 btninfo[BTN_CANCEL].txt = MUSIC_TEXT_CANCEL;
1156 btninfo[BTN_CANCEL].type = EO_CANCEL;
1158 btninfo[BTN_DESELECT].txt = MUSIC_TEXT_DESELECT;
1159 btninfo[BTN_DESELECT].type = EO_DESELECT;
1161 btninfo[BTN_DELETE].txt = MUSIC_TEXT_DELETE;
1162 btninfo[BTN_DELETE].type = EO_DELETE;
1164 box = _add_box(m->eoBase);
1168 elm_box_horizontal_set(box, EINA_TRUE);
1169 elm_box_padding_set(box,
1170 MUSIC_EDIT_BTNS_PADDING * elm_config_scale_get(), 0);
1172 for (i = 0; i < TOTAL_EDIT_BTNS; i++) {
1173 m->eoBtnEdit[i] = elm_button_add(m->eoBase);
1174 if (!m->eoBtnEdit[i])
1177 elm_object_style_set(m->eoBtnEdit[i],
1178 MUSIC_STYLE_EDIT_BTN);
1179 evas_object_size_hint_weight_set(m->eoBtnEdit[i],
1180 EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
1181 elm_box_pack_end(box, m->eoBtnEdit[i]);
1182 elm_object_text_set(m->eoBtnEdit[i], _(btninfo[i].txt));
1184 Connect(m->eoBtnEdit[i], btninfo[i].type, TYPE_CLICKED | TYPE_MOUSE_MOVE);
1186 evas_object_show(m->eoBtnEdit[i]);
1188 elm_object_part_content_set(m->eoBase, MUSIC_PART_EDITBTNS, box);
1189 elm_object_signal_emit(m->eoBase, MUSIC_SIGNAL_PLAYBACK_MODE,
1190 MUSIC_PLAYBACK_VIEW);
1194 void CPlaybackView::m_AddControlButtons(void)
1196 Evas_Object *box = NULL;
1198 SBtnInfo btninfo[TOTAL_CONTROL_BTNS];
1200 btninfo[BTN_SETTINGS].txt = MUSIC_STYLE_BTN_SETTINGS;
1201 btninfo[BTN_SETTINGS].type = EO_BTN_SETTINGS;
1203 btninfo[BTN_SHUFFLE].txt = MUSIC_STYLE_BTN_SHUFFLE;
1204 btninfo[BTN_SHUFFLE].type = EO_BTN_SHUFFLE;
1206 btninfo[BTN_REPEAT].txt = MUSIC_STYLE_BTN_REPEAT;
1207 btninfo[BTN_REPEAT].type = EO_BTN_REPEAT;
1209 btninfo[BTN_REWIND].txt = MUSIC_STYLE_BTN_REWIND;
1210 btninfo[BTN_REWIND].type = EO_BTN_REWIND;
1212 btninfo[BTN_PLAY].txt = MUSIC_STYLE_BTN_PLAY;
1213 btninfo[BTN_PLAY].type = EO_BTN_PLAY;
1215 btninfo[BTN_FORWARD].txt = MUSIC_STYLE_BTN_FORWARD;
1216 btninfo[BTN_FORWARD].type = EO_BTN_FORWARD;
1218 box = elm_box_add(m->eoBase);
1222 evas_object_size_hint_weight_set(box, EVAS_HINT_EXPAND, 0);
1223 evas_object_size_hint_align_set(box, EVAS_HINT_FILL, 0);
1224 elm_box_horizontal_set(box, EINA_TRUE);
1225 elm_box_padding_set(box,
1226 MUSIC_CONTROL_BTNS_PADDING * elm_config_scale_get(), 0);
1228 for (i = 0; i < TOTAL_CONTROL_BTNS; i++) {
1229 m->eoBtnControl[i] = elm_button_add(m->eoBase);
1230 if (!m->eoBtnControl[i])
1233 elm_object_style_set(m->eoBtnControl[i], btninfo[i].txt);
1234 evas_object_size_hint_weight_set(m->eoBtnControl[i],
1235 EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
1236 elm_box_pack_end(box, m->eoBtnControl[i]);
1238 if (i == BTN_REWIND || i == BTN_FORWARD) {
1239 Connect(m->eoBtnControl[i], btninfo[i].type, TYPE_PRESSED | TYPE_UNPRESSED | TYPE_MOUSE_MOVE);
1242 Connect(m->eoBtnControl[i], btninfo[i].type, TYPE_CLICKED | TYPE_MOUSE_MOVE);
1244 evas_object_show(m->eoBtnControl[i]);
1247 elm_object_part_content_set(m->eoBase, MUSIC_PART_CONTROLBTNS, box);
1251 SItemInfo *CPlaybackView::m_FindItemInfoFromSong(Eina_List *list, CSongInfo *sinfo)
1253 Eina_List *l = NULL;
1254 SItemInfo *itinfo = NULL;
1257 EINA_LIST_FOREACH(list, l, obj) {
1258 itinfo = (SItemInfo *)obj;
1259 if (itinfo->sinfo == sinfo)
1267 SItemInfo *CPlaybackView::m_FindItemInfoFromItem(Eina_List *list, Elm_Object_Item *item)
1269 Eina_List *l = NULL;
1270 SItemInfo *itinfo = NULL;
1273 EINA_LIST_FOREACH(list, l, obj) {
1274 itinfo = (SItemInfo *)obj;
1275 if (itinfo->item == item)
1283 void CPlaybackView::m_UpdateItemCheck(SItemInfo *itinfo)
1286 _ERR(" No item info to Update check ");
1290 if (itinfo->check_status) {
1291 elm_object_item_signal_emit(itinfo->item,
1292 MUSIC_SIGNAL_CHECK_OFF, MUSIC_PLAYBACK_VIEW);
1293 itinfo->check_status = false;
1297 elm_object_item_signal_emit(itinfo->item,
1298 MUSIC_SIGNAL_CHECK_ON, MUSIC_PLAYBACK_VIEW);
1299 itinfo->check_status = true;
1303 class CElmGenlistItemClass {
1305 static char *sm_CbTextGet(void *data, Evas_Object *obj, const char *part)
1307 CSongInfo *sinfo = NULL;
1308 SItemInfo *pItemInfo = (SItemInfo *)data;
1309 char buf[MAX_LENGTH];
1310 char *timestr = NULL;
1314 if (!pItemInfo || !obj)
1317 sinfo = pItemInfo->sinfo;
1319 snprintf(buf, sizeof(buf), "%s", MUSIC_STR_EMPTY);
1321 if (!strcmp(part, "elm.text0")) {
1322 index = elm_genlist_item_index_get(pItemInfo->item);
1323 snprintf(buf, sizeof(buf), "%d", index + 1);
1324 if ((index & 1) == 1) {
1325 elm_object_item_signal_emit(pItemInfo->item,
1326 MUSIC_SIGNAL_EVEN_ROW, MUSIC_PLAYBACK_VIEW);
1329 elm_object_item_signal_emit(pItemInfo->item,
1330 MUSIC_SIGNAL_ODD_ROW, MUSIC_PLAYBACK_VIEW);
1333 else if (!strcmp(part, "elm.text1"))
1334 snprintf(buf, sizeof(buf), "%s", sinfo->Name());
1335 else if (!strcmp(part, "elm.text2"))
1336 snprintf(buf, sizeof(buf), "%s - %s",
1339 else if (!strcmp(part, "elm.text3")) {
1340 duration = sinfo->Duration();
1341 timestr = _get_timestr_from_milseconds(duration);
1343 snprintf(buf, sizeof(buf), "%s", timestr);
1348 if (strcmp(buf, MUSIC_STR_EMPTY))
1353 static Evas_Object *sm_CbContentGet(void *data, Evas_Object *obj, const char *part)
1355 CSongInfo *sinfo = NULL;
1356 SItemInfo *pItemInfo = (SItemInfo *)data;
1357 Evas_Object *img = NULL;
1359 char buf[MAX_LENGTH];
1361 if (!pItemInfo || !obj)
1364 sinfo = pItemInfo->sinfo;
1366 img = elm_image_add(obj);
1370 elm_image_aspect_fixed_set(img, EINA_FALSE);
1372 if (!strcmp(part, "elm.swallow.icon")) {
1373 path = sinfo->ThumbnailPath();
1375 elm_image_file_set(img, path, "NULL");
1377 snprintf(buf, sizeof(buf), "%s/%s", IMAGEDIR,
1378 MUSIC_IMAGE_DEFAULT_THUMB_126);
1379 elm_image_file_set(img, buf, "NULL");
1383 if (pItemInfo->select_status) {
1384 elm_object_item_signal_emit(pItemInfo->item,
1385 MUSIC_SIGNAL_SELECT_ITEM, MUSIC_PLAYBACK_VIEW);
1388 elm_object_item_signal_emit(pItemInfo->item,
1389 MUSIC_SIGNAL_UNSELECT_ITEM,
1390 MUSIC_PLAYBACK_VIEW);
1393 if (pItemInfo->edit_mode) {
1394 elm_object_item_signal_emit(pItemInfo->item,
1395 MUSIC_SIGNAL_EDITMODE_ON, MUSIC_PLAYBACK_VIEW);
1396 if (pItemInfo->check_status) {
1397 elm_object_item_signal_emit(pItemInfo->item,
1398 MUSIC_SIGNAL_CHECK_ON,
1399 MUSIC_PLAYBACK_VIEW);
1402 elm_object_item_signal_emit(pItemInfo->item,
1403 MUSIC_SIGNAL_CHECK_OFF, MUSIC_PLAYBACK_VIEW);
1407 elm_object_item_signal_emit(pItemInfo->item,
1408 MUSIC_SIGNAL_EDITMODE_OFF, MUSIC_PLAYBACK_VIEW);
1414 static void sm_CbDel(void *data, Evas_Object *obj)
1421 Elm_Genlist_Item_Class *CPlaybackView::m_GetItemClass(void)
1423 Elm_Genlist_Item_Class *list_item = NULL;
1425 list_item = elm_genlist_item_class_new();
1427 _ERR(" elm_genlist_item_class_new failed ");
1431 list_item->item_style = MUSIC_STYLE_PLAYLIST;
1432 list_item->func.text_get = CElmGenlistItemClass::sm_CbTextGet;
1433 list_item->func.content_get = CElmGenlistItemClass::sm_CbContentGet;
1434 list_item->func.state_get = NULL;
1435 list_item->func.del = CElmGenlistItemClass::sm_CbDel;
1441 void CPlaybackView::m_AddGenlist(void)
1443 Evas_Object *genlist = NULL;
1444 Evas_Object *eoBase = NULL;
1447 genlist = elm_genlist_add(eoBase);
1451 elm_genlist_homogeneous_set(genlist, EINA_TRUE);
1452 evas_object_size_hint_weight_set(genlist,
1453 EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
1454 elm_object_part_content_set(eoBase, MUSIC_PART_PLAYLIST, genlist);
1455 elm_genlist_select_mode_set(genlist, ELM_OBJECT_SELECT_MODE_ALWAYS);
1456 elm_genlist_multi_select_set(genlist, EINA_FALSE);
1458 Connect(genlist, EO_PLAYLIST, TYPE_REALIZED | TYPE_UNREALIZED | TYPE_MOUSE_MOVE | TYPE_KEY_DOWN | TYPE_ACTIVATED);
1460 evas_object_show(genlist);
1461 m->eoPlaylist = genlist;
1465 void CPlaybackView::m_AddPlaylist(void)
1467 Elm_Genlist_Item_Class *list_item = NULL;
1470 CSongInfo *sinfo = NULL;
1471 Elm_Object_Item *item = NULL;
1472 SItemInfo *pItemInfo = NULL;
1478 list_item = m_GetItemClass();
1480 evas_object_del(m->eoPlaylist);
1484 if (!m->hMusicController->GetTotalSongs(&ts)) {
1485 _ERR(" music get total songs failed ");
1489 if (!m->hMusicController->GetCurrentSongIndex(&index))
1490 _ERR(" music get current song index failed ");
1492 for (i = 0; i < ts; i++) {
1493 if (!m->hMusicController->GetSonginfoFromIndex(i, &sinfo)) {
1494 _ERR(" music get songinfo failed ");
1497 pItemInfo = (SItemInfo *)calloc(1, sizeof(*pItemInfo));
1500 pItemInfo->sinfo = sinfo;
1501 pItemInfo->edit_mode = false;
1502 pItemInfo->check_status = false;
1503 pItemInfo->select_status = false;
1505 item = elm_genlist_item_append(m->eoPlaylist, list_item,
1506 pItemInfo, NULL, ELM_GENLIST_ITEM_NONE,
1507 sm_CbItemSelect, m);
1508 pItemInfo->item = item;
1511 pItemInfo->select_status = true;
1512 m->cs_itinfo = pItemInfo;
1514 m->elInfo = eina_list_append(m->elInfo, pItemInfo);
1519 void CPlaybackView::m_RemovePlaylist(void)
1521 if (m->eoPlaylist) {
1522 elm_genlist_clear(m->eoPlaylist);
1523 m->eoPlaylist = NULL;
1527 eina_list_free(m->elInfo);
1533 void CPlaybackView::m_HandleRewindBtnClicked(Evas_Object *obj)
1535 elm_object_signal_emit(obj, MUSIC_SIGNAL_BTN_CLICKED,
1536 MUSIC_PLAYBACK_VIEW);
1538 if (m->hMusicController->PlayState() == PLAY_STATUS_STOP)
1541 if (!m->hMusicController->PlayPreviousSong()){
1542 _ERR(" music play previous song failed ");
1546 m_UpdateCurrentSongInfo();
1550 void CPlaybackView::m_HandleForwardBtnClicked(Evas_Object *obj)
1552 elm_object_signal_emit(obj, MUSIC_SIGNAL_BTN_CLICKED,
1553 MUSIC_PLAYBACK_VIEW);
1555 if (m->hMusicController->PlayState() == PLAY_STATUS_STOP)
1558 if (!m->hMusicController->PlayNextSong()) {
1559 _ERR(" music play next song failed ");
1563 m_UpdateCurrentSongInfo();
1567 void CPlaybackView::m_HandleOnPressed(Evas_Object *obj)
1569 m->press_status = PRESS_SHORT;
1570 m->eoPressedObj = obj;
1572 m->etWait = ecore_timer_add(WAIT_INTERVAL, sm_CbWaitTimer, m);
1576 void CPlaybackView::m_HandleOnUnpressed(Evas_Object *obj)
1578 m_RemoveTimer(TIMER_WAIT);
1579 m_RemoveTimer(TIMER_LONGPRESS);
1581 if (m->press_status == PRESS_SHORT) {
1582 /* Handle song change */
1583 if (m->hMusicController->PlayState() == PLAY_STATUS_PLAY)
1586 if (obj == m->eoBtnControl[BTN_FORWARD])
1587 m_HandleForwardBtnClicked(obj);
1589 m_HandleRewindBtnClicked(obj);
1591 if (m->hMusicController->PlayState() != PLAY_STATUS_PLAY)
1594 else if (m->press_status == PRESS_LONG) {
1595 if (m->hMusicController->PlayState() != PLAY_STATUS_PLAY)
1599 m->press_status = PRESS_SHORT;
1603 void CPlaybackView::m_HandleGenlistItemActivated(Evas_Object *obj, Elm_Object_Item *genListItem)
1606 SItemInfo *itinfo = NULL;
1608 if (!obj || !genListItem)
1611 itinfo = m_FindItemInfoFromItem(m->elInfo, genListItem);
1613 _ERR(" no item info found ");
1617 if (itinfo->edit_mode) {
1618 m_UpdateItemCheck(itinfo);
1619 m_DisableEditButtons(false);
1623 index = elm_genlist_item_index_get(genListItem);
1625 m->hMusicController->PlayIndexSong(index);
1626 m_UpdateCurrentSongInfo();
1630 bool CPlaybackView::Create(void *data)
1635 _CHECK(m = new SPlaybackView)
1636 _CHECK(m->mgr = CViewMgr::GetInstance())
1637 _CHECK(m->eoWin = m->mgr->Window())
1638 _CHECK(m->hMusicController = CMusicController::GetInstance())
1639 _CHECK(m->eoBase = _add_base(m->eoWin, MUSIC_PLAYBACK_VIEW))
1640 _CHECK(CBaseView::Create(data))
1642 _CHECK_FAIL{ CBaseView::Destroy(); }
1643 _CHECK_FAIL{ evas_object_del(m->eoBase); }
1644 _CHECK_FAIL{ /* CMusicController::GetInstance())*/ }
1645 _CHECK_FAIL{ /* mgr->Window() */ }
1646 _CHECK_FAIL{ /* CViewerMgr::GetInstance() */}
1647 _CHECK_FAIL{ delete m; m = NULL; }
1648 }_CREATE_END_AND_CATCH{ return false; }
1650 m->press_status = PRESS_SHORT;
1653 evas_object_data_set(m->eoBase, PLAYBACK_VIEW_DATA, m);
1655 m_AddControlButtons();
1656 m_AddEditPlaylistButtons();
1657 m_AddCurrentSonginfo();
1660 m->pHandleVolume->Create(m->eoBase);
1661 m_UpdatePlaymodeFocusSequence();
1663 Connect(m->eoBase, EO_BASE, TYPE_KEY_DOWN | TYPE_KEY_UP);
1665 m->hMusicController->AddListener(this);
1671 void CPlaybackView::Destroy(void)
1675 m->hMusicController->RemoveListener(this);
1677 m_DestroyErrorPopup();
1679 m_RemoveTimer(TIMER_SLIDER);
1680 m_RemoveTimer(TIMER_WAIT);
1681 m_RemoveTimer(TIMER_LONGPRESS);
1682 m_DestroySettingsPopup();
1684 m->pHandleVolume->Destroy();
1685 CBaseView::Destroy();
1686 evas_object_del(m->eoBase);
1694 Evas_Object* CPlaybackView::Base(void)
1702 void CPlaybackView::t_OnClickedSettings(Evas_Object *obj)
1704 elm_object_signal_emit(obj, MUSIC_SIGNAL_BTN_CLICKED, MUSIC_PLAYBACK_VIEW);
1706 if (eina_list_count(m->elInfo) == 0)
1709 elm_object_signal_emit(obj, MUSIC_SIGNAL_CONTROL_SELECTED, MUSIC_PLAYBACK_VIEW);
1710 m_DestroySettingsPopup();
1711 m_CreateSettingsPopup();
1715 void CPlaybackView::t_OnClickedShuffle(Evas_Object *obj)
1717 elm_object_signal_emit(obj, MUSIC_SIGNAL_BTN_CLICKED, MUSIC_PLAYBACK_VIEW);
1719 switch (m->hMusicController->ShuffleState()) {
1720 case SHUFFLE_STATUS_OFF:
1721 m->hMusicController->SetShuffleState(SHUFFLE_STATUS_ON);
1722 elm_object_signal_emit(obj, MUSIC_SIGNAL_SHUFFLE_ON, MUSIC_PLAYBACK_VIEW);
1726 m->hMusicController->SetShuffleState(SHUFFLE_STATUS_OFF);
1727 elm_object_signal_emit(obj, MUSIC_SIGNAL_SHUFFLE_OFF, MUSIC_PLAYBACK_VIEW);
1733 void CPlaybackView::t_OnClickedRepeat(Evas_Object *obj)
1735 elm_object_signal_emit(obj, MUSIC_SIGNAL_BTN_CLICKED, MUSIC_PLAYBACK_VIEW);
1737 switch (m->hMusicController->RepeatState()) {
1738 case REPEAT_STATUS_NONE:
1739 m->hMusicController->SetRepeatState(REPEAT_STATUS_ALL);
1740 elm_object_signal_emit(obj, MUSIC_SIGNAL_REPEAT_ALL, MUSIC_PLAYBACK_VIEW);
1743 case REPEAT_STATUS_ALL:
1744 m->hMusicController->SetRepeatState(REPEAT_STATUS_ONE);
1745 elm_object_signal_emit(obj, MUSIC_SIGNAL_REPEAT_ONE, MUSIC_PLAYBACK_VIEW);
1749 m->hMusicController->SetRepeatState(REPEAT_STATUS_NONE);
1750 elm_object_signal_emit(obj, MUSIC_SIGNAL_REPEAT_OFF, MUSIC_PLAYBACK_VIEW);
1756 void CPlaybackView::t_OnClickedPlay(Evas_Object *obj)
1758 elm_object_signal_emit(obj, MUSIC_SIGNAL_BTN_CLICKED, MUSIC_PLAYBACK_VIEW);
1760 switch (m->hMusicController->PlayState()) {
1761 case PLAY_STATUS_PAUSE:
1763 elm_object_signal_emit(obj, MUSIC_SIGNAL_PLAY, MUSIC_PLAYBACK_VIEW);
1766 case PLAY_STATUS_PLAY:
1767 elm_object_signal_emit(obj, MUSIC_SIGNAL_PAUSE, MUSIC_PLAYBACK_VIEW);
1772 if (m->hMusicController)
1773 m->hMusicController->Start();
1774 m_UpdateCurrentSongInfo();
1780 void CPlaybackView::t_OnShow(void)
1787 elm_genlist_item_show(m->cs_itinfo->item,
1788 ELM_GENLIST_ITEM_SCROLLTO_IN);
1789 elm_object_item_focus_set(m->cs_itinfo->item, EINA_TRUE);
1792 state = m->hMusicController->PlayState();
1793 if (state == PLAY_STATUS_INITIAL || state == PLAY_STATUS_STOP) {
1796 m->hMusicController->Start();
1797 m_UpdateCurrentSongInfo();
1800 evas_object_show(m->eoBase);
1804 void CPlaybackView::t_OnUpdate(void *data)
1811 SParcel *parcel = (SParcel *)data;
1812 int updateType = parcel->updateType;
1813 char *key = (char *)parcel->keyEvent;
1815 switch (updateType) {
1816 case E_PLAYLIST_UPDATE:
1819 elm_object_disabled_set(m->eoBtnControl[BTN_FORWARD], EINA_FALSE);
1820 elm_object_disabled_set(m->eoBtnControl[BTN_REWIND], EINA_FALSE);
1821 elm_object_disabled_set(m->eoBtnControl[BTN_PLAY], EINA_FALSE);
1822 elm_object_focus_next_object_set(m->eoBtnControl[BTN_REPEAT],
1823 m->eoBtnControl[BTN_REWIND], ELM_FOCUS_RIGHT);
1824 m_FromEditToPlaybackMode();
1828 m_HandleKeyPress(key);
1832 m_HandleKeyUnpress(key);
1841 void CPlaybackView::t_OnHide(void)
1845 evas_object_hide(m->eoBase);
1849 void CPlaybackView::OnKeyDown(int id, Evas *e, Evas_Object *obj, Evas_Event_Key_Down *ev)
1853 m_HandleKeyPress(ev->keyname);
1856 case EO_ERROR_POPUP_BUTTON:
1857 if (!strcmp(ev->keyname, KEY_BACK)) {
1858 m_DestroyErrorPopup();
1859 elm_object_focus_set(m->eoBtnControl[BTN_PLAY], EINA_TRUE);
1865 Elm_Object_Item *it = NULL;
1866 SContentInfo *ctxtinfo = NULL;
1867 SItemInfo *itinfo = NULL;
1869 if (strcmp(ev->keyname, KEY_MENU))
1872 it = elm_object_focused_item_get(obj);
1874 _ERR(" unable to get focused item ");
1877 m->focused_item = it;
1884 ctxtinfo = (SContentInfo *)calloc(1, sizeof(*ctxtinfo));
1888 itinfo = m_FindItemInfoFromItem(m->elInfo, it);
1894 if (m->hMusicController->PlayState() == PLAY_STATUS_PLAY &&
1895 itinfo == m->cs_itinfo)
1896 ctxtinfo->status = PLAY_STATUS_PLAY;
1898 ctxtinfo->status = PLAY_STATUS_PAUSE;
1900 ctxtinfo->cbdata = m;
1901 ctxtinfo->update = sm_CbCtxtUpdate;
1902 ctxtinfo->close = sm_CbCtxtClose;
1903 ctxtinfo->type = CONTEXT_TYPE_PLAYSONG;
1904 ctxtinfo->context = itinfo->sinfo;
1906 m->ctxtinfo = ctxtinfo;
1909 parcel.ctxtInfo = ctxtinfo;
1910 if (!m->mgr->PushView(MUSIC_CONTEXT_VIEW, &parcel))
1911 _ERR("viewmgr push view MUSIC_CONTEXT_VIEW failed");
1915 if (!strcmp(ev->keyname, KEY_BACK)) {
1916 _ERR("eoCtxPopup BACK key pressed ");
1917 m_DestroySettingsPopup();
1918 elm_object_focus_set(m->eoBtnControl[BTN_SETTINGS], EINA_TRUE);
1921 else if (!strcmp(ev->keyname, KEY_EXIT)) {
1922 _ERR("eoCtxPopup EXIT key pressed ");
1923 m_DestroySettingsPopup();
1924 m_RemoveTimer(TIMER_SLIDER);
1925 m->hMusicController->Stop();
1936 void CPlaybackView::OnKeyUp(int id, Evas *e, Evas_Object *obj, Evas_Event_Key_Up *ev)
1940 m_HandleKeyUnpress(ev->keyname);
1949 void CPlaybackView::OnMouseClicked(int id, Evas_Object *obj)
1952 case EO_ERROR_POPUP_BUTTON:
1953 m_DestroyErrorPopup();
1954 elm_object_focus_set(m->eoBtnControl[BTN_PLAY], EINA_TRUE);
1957 case EO_EDIT_PLAYLIST:
1958 m_DestroySettingsPopup();
1959 m_FromPlaybackToEditMode();
1962 case EO_CLEAR_PLAYLIST:
1963 m->hMusicController->Stop();
1964 m->hMusicController->EmptyPlaylist();
1966 eina_list_free(m->elInfo);
1969 elm_genlist_clear(m->eoPlaylist);
1971 m_DestroySettingsPopup();
1972 m_UpdateEmptySongInfo();
1976 m_DisableCheckAll(m->elInfo);
1977 m_DisableEditButtons(true);
1978 m_FromEditToPlaybackMode();
1982 m_DisableCheckAll(m->elInfo);
1983 m_DisableEditButtons(true);
1984 elm_genlist_realized_items_update(m->eoPlaylist);
1985 elm_object_focus_set(m->eoBtnEdit[BTN_CANCEL], EINA_TRUE);
1989 m_DeleteSelectedItems();
1992 case EO_BTN_SETTINGS:
1993 t_OnClickedSettings(obj);
1996 case EO_BTN_SHUFFLE:
1997 t_OnClickedShuffle(obj);
2001 t_OnClickedRepeat(obj);
2005 t_OnClickedPlay(obj);
2014 void CPlaybackView::OnMouseMove(int id, Evas *e, Evas_Object *obj, Evas_Event_Mouse_Move *ev)
2021 case EO_BTN_FORWARD:
2025 case EO_BTN_SETTINGS:
2026 case EO_BTN_SHUFFLE:
2027 case EO_EDIT_PLAYLIST:
2028 case EO_CLEAR_PLAYLIST:
2029 if (!elm_object_focus_get(obj))
2030 elm_object_focus_set(obj, EINA_TRUE);
2035 Elm_Object_Item *item;
2037 item = elm_genlist_at_xy_item_get(obj, ev->cur.canvas.x,
2038 ev->cur.canvas.y, NULL);
2042 if (!elm_object_item_focus_get(item))
2043 elm_object_item_focus_set(item, EINA_TRUE);
2053 void CPlaybackView::OnPressed(int id, Evas_Object *obj)
2056 case EO_BTN_FORWARD:
2058 m_HandleOnPressed(obj);
2067 void CPlaybackView::OnUnpressed(int id, Evas_Object *obj)
2070 case EO_BTN_FORWARD:
2072 m_HandleOnUnpressed(obj);
2081 void CPlaybackView::OnChanged(int id, Evas_Object *obj)
2086 char *timestr = NULL;
2089 if (m->hMusicController->PlayState() == PLAY_STATUS_PLAY) {
2091 ecore_timer_freeze(m->etSlider);
2094 value = elm_slider_value_get(obj);
2095 m->hMusicController->SetPosition(value);
2096 timestr = _get_timestr_from_milseconds(value);
2098 elm_object_part_text_set(m->eoBase, MUSIC_PART_PROGRESSTIME,
2103 if (m->hMusicController->PlayState() == PLAY_STATUS_PLAY) {
2105 ecore_timer_thaw(m->etSlider);
2116 void CPlaybackView::OnRealized(int id, Evas_Object *obj, Elm_Object_Item *item)
2120 elm_object_item_signal_callback_add(item,
2121 MUSIC_SIGNAL_CHECK_CLICKED, MUSIC_PLAYBACK_VIEW,
2122 sm_CbGenlistItemCheckClicked, this);
2131 void CPlaybackView::OnUnrealized(int id, Evas_Object *obj, Elm_Object_Item *item)
2135 elm_object_item_signal_callback_del(item,
2136 MUSIC_SIGNAL_CHECK_CLICKED, MUSIC_PLAYBACK_VIEW,
2137 sm_CbGenlistItemCheckClicked);
2146 void CPlaybackView::OnActivated(int id, Evas_Object *obj, Elm_Object_Item *item)
2150 m_HandleGenlistItemActivated(obj, item);
2159 void CPlaybackView::t_OnComplete(void)
2161 m_UpdateCurrentSongInfo();
2165 void CPlaybackView::t_OnError(void)
2167 m_CreateErrorPopup();
2171 void CPlaybackView::t_OnUsbConnected(void)
2176 void CPlaybackView::t_OnUpdateContent(void)