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 <AppCommon.h>
22 #include "song_info.h"
23 #include "album_info.h"
24 #include "music-controller.h"
25 #include "volume-control.h"
26 #include "common-ui.h"
27 #include "playback-view.h"
28 #include "context-view.h"
29 #include "HandleVolume.h"
30 #include "PlaySettingCtxPopup.h"
32 #include "SliderWidget.h"
33 #include "PlaybackController.h"
36 #define TOTAL_CONTROL_BTNS 6
37 #define TOTAL_EDIT_BTNS 3
46 Elm_Object_Item *item;
53 struct SPlaybackView {
57 Evas_Object *eoPlaylist;
59 Elm_Object_Item *focused_item;
61 CPlaybackController *pPlaybackController;
62 // These are reference values.
63 Evas_Object *eoBtnControl[TOTAL_CONTROL_BTNS];
64 Evas_Object *eoBtnEdit[TOTAL_EDIT_BTNS];
66 Evas_Object *eoAlbumCover;
67 CSliderWidget *pSliderWidget;
70 CMusicController *pController; //! NOT NULL
74 SContentInfo *ctxtinfo;
76 CHandleVolume *pHandleVolume;
79 memset(this, 0, sizeof(SPlaybackView));
84 void CPlaybackView::sm_CbCtxtUpdate(void *dt, enum EActionType type, int lid)
86 CPlaybackView *root = (CPlaybackView *)dt;
88 root->m_OnCtxtUpdate(type, lid);
92 void CPlaybackView::m_OnCtxtUpdate(EActionType type, int lid)
94 SItemInfo *itinfo = NULL;
95 Elm_Object_Item *focusedItem = NULL;
97 if (!m->ctxtinfo || !m->ctxtinfo->context)
100 itinfo = m_FindItemInfoFromSong(m->elInfo,
101 (CSongInfo *)m->ctxtinfo->context);
103 _ERR(" Unable to find song in the list ");
107 if (type == ACTION_TYPE_DELETE) {
108 itinfo->check_status = true;
109 m_DeleteSelectedItems();
111 if (!m->mgr->PopView()) {
112 _ERR("CViewMgr::PopView failed");
117 memset(&parcel, 0, sizeof(SParcel));
118 parcel.updateType = E_PLAYLIST_UPDATE;
121 focusedItem = m->cs_itinfo->item;
123 else { // ACTION_TYPE_PLAY
124 if (m->ctxtinfo->status == PLAY_STATUS_PLAY)
127 if (itinfo == m->cs_itinfo)
130 m_HandleGenlistItemActivated(m->eoPlaylist, itinfo->item);
133 if (!m->mgr->PopView()) {
134 _ERR("CViewMgr::PopView failed");
138 focusedItem = m->focused_item;
141 if (!CViewMgr::GetInstance()->HideView(MUSIC_BASE_VIEW))
142 _ERR("CViewMgr::HideView failed");
147 elm_genlist_item_show(focusedItem, ELM_GENLIST_ITEM_SCROLLTO_IN);
148 elm_object_item_focus_set(focusedItem, EINA_TRUE);
153 void CPlaybackView::sm_CbCtxtClose(void *dt)
155 CPlaybackView *root = (CPlaybackView *)dt;
157 root->m_OnCtxtClose();
161 void CPlaybackView::m_OnCtxtClose(void)
163 if (!m->mgr->PopView()) {
164 _ERR("CViewMgr::PopView failed");
168 elm_object_item_focus_set(m->focused_item, EINA_TRUE);
172 int CPlaybackView::sm_CbCurrentSongCount(void *cookie)
174 CPlaybackView *root = (CPlaybackView *)cookie;
177 ret = root->m_CbCurrentSongCount();
183 int CPlaybackView::m_CbCurrentSongCount(void)
185 return eina_list_count(m->elInfo);
189 void CPlaybackView::m_ChangeEditmodeAll(Eina_List *list, bool flag)
191 SItemInfo *itinfo = NULL;
195 EINA_LIST_FOREACH(list, l, obj) {
196 itinfo = (SItemInfo *)obj;
197 itinfo->edit_mode = flag;
202 void CPlaybackView::m_DisableCheckAll(Eina_List *list)
204 SItemInfo *itinfo = NULL;
208 EINA_LIST_FOREACH(list, l, obj) {
209 itinfo = (SItemInfo *)obj;
210 itinfo->check_status = false;
215 void CPlaybackView::m_SelectItem(SItemInfo *pItemInfo)
217 if (!pItemInfo || !pItemInfo->item)
220 elm_genlist_item_bring_in(pItemInfo->item, ELM_GENLIST_ITEM_SCROLLTO_IN);
221 elm_object_item_signal_emit(pItemInfo->item, MUSIC_SIGNAL_SELECT_ITEM, MUSIC_PLAYBACK_VIEW);
223 pItemInfo->select_status = true;
227 void CPlaybackView::m_UnselectItem(SItemInfo *pItemInfo)
229 if (!pItemInfo || !pItemInfo->item)
232 elm_object_item_signal_emit(pItemInfo->item, MUSIC_SIGNAL_UNSELECT_ITEM,
233 MUSIC_PLAYBACK_VIEW);
235 pItemInfo->select_status = false;
239 void CPlaybackView::m_UpdateCurrentSongThumbnail(void)
242 char buf[MAX_LENGTH];
244 if (!m->cs_itinfo || !m->cs_itinfo->sinfo)
247 path = m->cs_itinfo->sinfo->ThumbnailPath();
249 elm_image_file_set(m->eoAlbumCover, path, NULL);
251 snprintf(buf, sizeof(buf), "%s/%s", IMAGEDIR,
252 MUSIC_IMAGE_DEFAULT_THUMB_450);
253 elm_image_file_set(m->eoAlbumCover, buf, NULL);
258 void CPlaybackView::m_UpdateCurrentSongLabels(void)
260 char buf[MAX_LENGTH];
265 elm_object_part_text_set(m->eoBase, MUSIC_PART_SONG_TITLE,
268 snprintf(buf, sizeof(buf), "%s - %s", m->csinfo->Artist(),
271 elm_object_part_text_set(m->eoBase, MUSIC_PART_ARTIST_ALBUM, buf);
275 void CPlaybackView::m_UpdateEmptySongInfo(void)
277 char buf[MAX_LENGTH];
279 m->pSliderWidget->Init();
281 elm_object_part_text_set(m->eoBase, MUSIC_PART_SONG_TITLE,
282 _(NO_PLAYLIST_MESSAGE));
283 elm_object_part_text_set(m->eoBase, MUSIC_PART_ARTIST_ALBUM,
284 _(NO_PLAYLIST_MESSAGE_SUB));
285 snprintf(buf, sizeof(buf), "%s/%s", IMAGEDIR,
286 MUSIC_IMAGE_DEFAULT_THUMB_450);
287 elm_image_file_set(m->eoAlbumCover, buf, NULL);
288 m->pController->SetPlayState(PLAY_STATUS_INITIAL);
292 void CPlaybackView::m_UpdateCtxtView(int playStatus)
294 if (!m->cs_itinfo || !m->ctxtinfo)
297 if (!m->mgr->CheckTop(MUSIC_CONTEXT_VIEW))
300 if (m->cs_itinfo->sinfo == m->ctxtinfo->context) {
301 m->ctxtinfo->status = (EPlayStatus)playStatus;
304 memset(&parcel, 0, sizeof(SParcel));
305 parcel.updateType = E_SONG_UPDATE;
306 m->mgr->UpdateView((const char *)MUSIC_CONTEXT_VIEW, &parcel);
311 void CPlaybackView::m_UpdateCurrentSongItem(int index)
313 SItemInfo *pItemInfo = NULL;
316 m_UnselectItem(m->cs_itinfo);
317 m_UpdateCtxtView(PLAY_STATUS_PAUSE);
320 pItemInfo = (SItemInfo *)eina_list_nth(m->elInfo, index);
323 m->cs_itinfo = pItemInfo;
324 if (m->pController->PlayState() == PLAY_STATUS_STOP) {
325 elm_genlist_item_bring_in(pItemInfo->item,
326 ELM_GENLIST_ITEM_SCROLLTO_IN);
329 m_SelectItem(pItemInfo);
330 m_UpdateCtxtView(PLAY_STATUS_PLAY);
336 void CPlaybackView::m_UpdateEditmodeFocusSequence(void)
338 elm_object_focus_next_object_set(m->eoPlaylist, m->eoBtnEdit[EDIT_BTN_CANCEL], ELM_FOCUS_LEFT);
339 elm_object_focus_next_object_set(m->eoBtnEdit[EDIT_BTN_CANCEL], m->eoPlaylist, ELM_FOCUS_RIGHT);
340 elm_object_focus_next_object_set(m->pSliderWidget->Base(), m->eoBtnEdit[EDIT_BTN_CANCEL], ELM_FOCUS_DOWN);
344 void CPlaybackView::m_UpdatePlaymodeFocusSequence(void)
346 switch (m->pController->PlayState()) {
347 case PLAY_STATUS_INITIAL:
351 case PLAY_STATUS_STOP:
352 elm_object_focus_next_object_set(m->eoPlaylist, m->eoBtnControl[CTRL_BTN_PLAY], ELM_FOCUS_LEFT);
353 elm_object_focus_next_object_set(m->eoBtnControl[CTRL_BTN_PLAY], m->eoPlaylist, ELM_FOCUS_RIGHT);
354 elm_object_focus_next_object_set(m->eoBtnControl[CTRL_BTN_PLAY], m->eoBtnControl[CTRL_BTN_REPEAT], ELM_FOCUS_LEFT);
355 elm_object_focus_next_object_set(m->eoBtnControl[CTRL_BTN_REPEAT], m->eoBtnControl[CTRL_BTN_PLAY], ELM_FOCUS_RIGHT);
356 elm_object_signal_emit(m->eoBtnControl[CTRL_BTN_PLAY], MUSIC_SIGNAL_PAUSE, MUSIC_PLAYBACK_VIEW);
359 case PLAY_STATUS_PLAY:
360 case PLAY_STATUS_PAUSE:
361 elm_object_focus_next_object_set(m->eoPlaylist,
362 m->eoBtnControl[CTRL_BTN_FORWARD], ELM_FOCUS_LEFT);
363 elm_object_focus_next_object_set(m->eoBtnControl[CTRL_BTN_FORWARD],
364 m->eoPlaylist, ELM_FOCUS_RIGHT);
365 elm_object_focus_next_object_set(m->eoBtnControl[CTRL_BTN_PLAY],
366 m->eoBtnControl[CTRL_BTN_FORWARD], ELM_FOCUS_RIGHT);
367 elm_object_focus_next_object_set(m->eoBtnControl[CTRL_BTN_PLAY],
368 m->eoBtnControl[CTRL_BTN_REWIND], ELM_FOCUS_LEFT);
369 elm_object_focus_next_object_set(m->eoBtnControl[CTRL_BTN_REPEAT],
370 m->eoBtnControl[CTRL_BTN_REWIND], ELM_FOCUS_RIGHT);
374 ASSERT(!"Invalid State");
380 void CPlaybackView::m_UpdateCurrentSongInfo(void)
382 CSongInfo *sinfo = NULL;
385 if (eina_list_count(m->elInfo) == 0) {
386 m_UpdateEmptySongInfo();
390 if (!m->pController->GetCurrentSongIndex(&index)) {
391 _ERR(" music get current song index failed ");
395 if (!m->pController->GetSonginfoFromIndex(index, &sinfo)) {
396 _ERR(" music get songinfo failed ");
401 m_UpdateCurrentSongItem(index);
402 m_UpdateCurrentSongLabels();
403 m_UpdateCurrentSongThumbnail();
404 m->pPlaybackController->Update();
405 m_UpdatePlaymodeFocusSequence();
409 void CPlaybackView::m_DisableEditButtons(bool flag)
411 /* flag - 1 means disable edit buttons and 0 means enable */
413 elm_object_focus_set(m->eoBtnEdit[EDIT_BTN_CANCEL], EINA_TRUE);
415 elm_object_disabled_set(m->eoBtnEdit[EDIT_BTN_DELETE], (Eina_Bool)flag);
416 elm_object_disabled_set(m->eoBtnEdit[EDIT_BTN_DESELECT], (Eina_Bool)flag);
418 m_UpdateEditmodeFocusSequence();
419 elm_object_focus_set(m->eoBtnEdit[EDIT_BTN_CANCEL], EINA_TRUE);
422 elm_object_focus_next_object_set(m->eoBtnEdit[EDIT_BTN_CANCEL], m->eoBtnEdit[EDIT_BTN_DESELECT], ELM_FOCUS_RIGHT);
423 elm_object_focus_next_object_set(m->eoBtnEdit[EDIT_BTN_DELETE], m->eoPlaylist, ELM_FOCUS_RIGHT);
424 elm_object_focus_next_object_set(m->eoPlaylist, m->eoBtnEdit[EDIT_BTN_DELETE], ELM_FOCUS_LEFT);
429 void CPlaybackView::m_FromEditToPlaybackMode(void)
431 if (m->pController->PlayState() == PLAY_STATUS_STOP) {
432 elm_genlist_item_bring_in(m->cs_itinfo->item,
433 ELM_GENLIST_ITEM_SCROLLTO_IN);
436 m_SelectItem(m->cs_itinfo);
438 elm_object_signal_emit(m->eoBase, MUSIC_SIGNAL_PLAYBACK_MODE,
439 MUSIC_PLAYBACK_VIEW);
440 elm_object_focus_set(m->eoBtnControl[CTRL_BTN_SETTINGS], EINA_TRUE);
442 m_ChangeEditmodeAll(m->elInfo, false);
444 elm_genlist_realized_items_update(m->eoPlaylist);
446 m_UpdatePlaymodeFocusSequence();
450 void CPlaybackView::m_FromPlaybackToEditMode(void)
452 elm_object_signal_emit(m->eoBase, MUSIC_SIGNAL_EDIT_MODE,
453 MUSIC_PLAYBACK_VIEW);
455 m_DisableEditButtons(true);
457 elm_object_focus_set(m->eoBtnEdit[EDIT_BTN_CANCEL], EINA_TRUE);
459 m_ChangeEditmodeAll(m->elInfo, true);
461 elm_genlist_realized_items_update(m->eoPlaylist);
463 m_UpdateEditmodeFocusSequence();
467 void CPlaybackView::m_DeleteSelectedItems(void)
469 Eina_List *l = NULL, *l_next = NULL;
470 SItemInfo *pItemInfo = NULL;
472 bool updateFlag = false;
475 m_DisableEditButtons(true);
476 EINA_LIST_FOREACH_SAFE(m->elInfo, l, l_next, obj) {
477 pItemInfo = (SItemInfo *)obj;
478 if (pItemInfo->check_status) {
479 if (m->cs_itinfo == pItemInfo) {
481 m_UnselectItem(m->cs_itinfo);
483 m->pController->SetPlayState(PLAY_STATUS_STOP);
484 m->pController->Stop();
486 index = elm_genlist_item_index_get(pItemInfo->item);
487 m->pController->RemoveSong(pItemInfo->sinfo, index);
489 m->elInfo = eina_list_remove(m->elInfo, pItemInfo);
490 elm_object_item_del(pItemInfo->item);
494 if (eina_list_count(m->elInfo) == 0) {
495 m_UpdateEmptySongInfo();
496 elm_genlist_realized_items_update(m->eoPlaylist);
497 elm_object_focus_set(m->eoBtnEdit[EDIT_BTN_CANCEL], EINA_TRUE);
502 m_UpdateCurrentSongInfo();
504 elm_genlist_realized_items_update(m->eoPlaylist);
505 elm_object_focus_set(m->eoBtnEdit[EDIT_BTN_CANCEL], EINA_TRUE);
509 void CPlaybackView::m_KeyBackPress(void)
513 if (!CViewMgr::GetInstance()->ShowView(MUSIC_BASE_VIEW))
514 _ERR("CViewMgr::ShowView failed");
516 if (CViewMgr::GetInstance()->CheckTop(MUSIC_CONTEXT_VIEW)) {
517 if (!CViewMgr::GetInstance()->UpdateView(MUSIC_CONTEXT_VIEW, NULL))
518 _ERR("CViewMgr::UpdateView failed");
520 if (!CViewMgr::GetInstance()->ShowView(MUSIC_CONTEXT_VIEW))
521 _ERR("CViewMgr::ShowView failed");
526 void CPlaybackView::m_KeyExitPress(void)
528 m->pController->Stop();
533 void CPlaybackView::m_KeyPlayPress(void)
537 if (elm_object_disabled_get(m->eoBtnControl[CTRL_BTN_PLAY]))
540 state = m->pController->PlayState();
541 if (state == PLAY_STATUS_PAUSE) {
542 m->pController->Resume();
543 elm_object_signal_emit(m->eoBtnControl[CTRL_BTN_PLAY],
544 MUSIC_SIGNAL_PLAY, MUSIC_PLAYBACK_VIEW);
546 else if (state != PLAY_STATUS_PLAY) {
547 m->pController->Start();
552 void CPlaybackView::m_KeyPausePress(void)
556 if (elm_object_disabled_get(m->eoBtnControl[CTRL_BTN_PLAY]))
559 state = m->pController->PlayState();
560 if (state == PLAY_STATUS_PLAY) {
561 elm_object_signal_emit(m->eoBtnControl[CTRL_BTN_PLAY],
562 MUSIC_SIGNAL_PAUSE, MUSIC_PLAYBACK_VIEW);
563 m->pController->Pause();
568 void CPlaybackView::m_KeyNextPress(void)
570 if (elm_object_disabled_get(m->eoBtnControl[CTRL_BTN_FORWARD]))
573 m->pController->HandleRemoteButtons(m->eoBtnControl[CTRL_BTN_FORWARD], EVENT_PRESSED);
577 void CPlaybackView::m_KeyPreviousPress(void)
579 if (elm_object_disabled_get(m->eoBtnControl[CTRL_BTN_REWIND]))
582 m->pController->HandleRemoteButtons(m->eoBtnControl[CTRL_BTN_REWIND], EVENT_PRESSED);
586 void CPlaybackView::m_KeyNextUnpress(void)
588 if (elm_object_disabled_get(m->eoBtnControl[CTRL_BTN_FORWARD]))
591 m->pController->HandleRemoteButtons(m->eoBtnControl[CTRL_BTN_FORWARD], EVENT_UNPRESSED);
595 void CPlaybackView::m_KeyPreviousUnpress(void)
597 if (elm_object_disabled_get(m->eoBtnControl[CTRL_BTN_REWIND]))
600 m->pController->HandleRemoteButtons(m->eoBtnControl[CTRL_BTN_REWIND], EVENT_UNPRESSED);
604 void CPlaybackView::m_HandleKeyPress(char *keyname)
606 if (!strcmp(keyname, (char *)KEY_EXIT))
608 else if (!strcmp(keyname, (char *)KEY_BACK) ||
609 !strcmp(keyname, (char *)KEY_BACK_REMOTE))
611 else if (!strcmp(keyname, (char *)KEY_PLAY))
613 else if (!strcmp(keyname, (char *)KEY_PAUSE))
615 else if (!strcmp(keyname, (char *)KEY_NEXT))
617 else if (!strcmp(keyname, (char *)KEY_PREVIOUS))
618 m_KeyPreviousPress();
619 else if (!strcmp(keyname, (char *)KEY_VOLUMEUP) ||
620 !strcmp(keyname, (char *)KEY_VOLUMEUP_REMOTE))
621 m->pHandleVolume->Up();
622 else if (!strcmp(keyname, (char *)KEY_VOLUMEDOWN) ||
623 !strcmp(keyname, (char *)KEY_VOLUMEDOWN_REMOTE))
624 m->pHandleVolume->Down();
625 else if (!strcmp(keyname, (char *)KEY_MUTE) ||
626 !strcmp(keyname, (char *)KEY_MUTE_REMOTE))
627 m->pHandleVolume->Mute();
631 void CPlaybackView::m_HandleKeyUnpress(char *keyname)
633 if (!strcmp(keyname, KEY_PREVIOUS))
634 m_KeyPreviousUnpress();
635 else if (!strcmp(keyname, KEY_NEXT))
640 void CPlaybackView::m_AddAlbumCover(void)
642 Evas_Object *eoAlbumCover = NULL;
644 eoAlbumCover = elm_image_add(m->eoBase);
648 evas_object_size_hint_weight_set(eoAlbumCover, EVAS_HINT_EXPAND,
650 elm_image_aspect_fixed_set(eoAlbumCover, EINA_FALSE);
652 elm_object_part_content_set(m->eoBase, MUSIC_PART_ALBUMCOVER,
654 evas_object_show(eoAlbumCover);
655 m->eoAlbumCover = eoAlbumCover;
660 void CPlaybackView::m_AddCurrentSonginfo(void)
664 m->pSliderWidget = new CSliderWidget;
665 m->pSliderWidget->Create(m->eoBase);
669 SItemInfo *CPlaybackView::m_FindItemInfoFromSong(Eina_List *list, CSongInfo *sinfo)
672 SItemInfo *itinfo = NULL;
675 EINA_LIST_FOREACH(list, l, obj) {
676 itinfo = (SItemInfo *)obj;
677 if (itinfo->sinfo == sinfo)
685 SItemInfo *CPlaybackView::m_FindItemInfoFromItem(Eina_List *list, Elm_Object_Item *item)
688 SItemInfo *itinfo = NULL;
691 EINA_LIST_FOREACH(list, l, obj) {
692 itinfo = (SItemInfo *)obj;
693 if (itinfo->item == item)
701 void CPlaybackView::m_UpdateItemCheck(SItemInfo *itinfo)
704 _ERR(" No item info to Update check ");
708 if (itinfo->check_status) {
709 elm_object_item_signal_emit(itinfo->item,
710 MUSIC_SIGNAL_CHECK_OFF, MUSIC_PLAYBACK_VIEW);
711 itinfo->check_status = false;
715 elm_object_item_signal_emit(itinfo->item,
716 MUSIC_SIGNAL_CHECK_ON, MUSIC_PLAYBACK_VIEW);
717 itinfo->check_status = true;
721 class CElmGenlistItemClass {
723 static char *sm_CbTextGet(void *data, Evas_Object *obj, const char *part)
725 CSongInfo *sinfo = NULL;
726 SItemInfo *pItemInfo = (SItemInfo *)data;
727 char buf[MAX_LENGTH];
728 char *timestr = NULL;
732 if (!pItemInfo || !obj)
735 sinfo = pItemInfo->sinfo;
737 snprintf(buf, sizeof(buf), "%s", MUSIC_STR_EMPTY);
739 if (!strcmp(part, "elm.text0")) {
740 index = elm_genlist_item_index_get(pItemInfo->item);
741 snprintf(buf, sizeof(buf), "%d", index);
743 else if (!strcmp(part, "elm.text1"))
744 snprintf(buf, sizeof(buf), "%s", sinfo->Name());
745 else if (!strcmp(part, "elm.text2"))
746 snprintf(buf, sizeof(buf), "%s - %s",
749 else if (!strcmp(part, "elm.text3")) {
750 duration = sinfo->Duration();
751 timestr = CCommonUI::TimeStrFromMilSeconds(duration);
753 snprintf(buf, sizeof(buf), "%s", timestr);
758 if (strcmp(buf, MUSIC_STR_EMPTY))
763 static Evas_Object *sm_CbContentGet(void *data, Evas_Object *obj, const char *part)
765 CSongInfo *sinfo = NULL;
766 SItemInfo *pItemInfo = (SItemInfo *)data;
767 Evas_Object *img = NULL;
769 char buf[MAX_LENGTH];
771 if (!pItemInfo || !obj)
774 sinfo = pItemInfo->sinfo;
776 img = elm_image_add(obj);
780 elm_image_aspect_fixed_set(img, EINA_FALSE);
782 if (!strcmp(part, "elm.swallow.icon")) {
783 path = sinfo->ThumbnailPath();
785 elm_image_file_set(img, path, "NULL");
787 snprintf(buf, sizeof(buf), "%s/%s", IMAGEDIR,
788 MUSIC_IMAGE_DEFAULT_THUMB_126);
789 elm_image_file_set(img, buf, "NULL");
796 static void sm_CbDel(void *data, Evas_Object *obj)
803 Elm_Genlist_Item_Class *CPlaybackView::m_GetItemClass(void)
805 Elm_Genlist_Item_Class *list_item = NULL;
807 list_item = elm_genlist_item_class_new();
809 _ERR(" elm_genlist_item_class_new failed ");
813 list_item->item_style = MUSIC_STYLE_PLAYLIST;
814 list_item->func.text_get = CElmGenlistItemClass::sm_CbTextGet;
815 list_item->func.content_get = CElmGenlistItemClass::sm_CbContentGet;
816 list_item->func.state_get = NULL;
817 list_item->func.del = CElmGenlistItemClass::sm_CbDel;
823 void CPlaybackView::m_AddGenlist(void)
825 Evas_Object *genlist = NULL;
826 Evas_Object *eoBase = NULL;
829 genlist = elm_genlist_add(eoBase);
833 elm_genlist_homogeneous_set(genlist, EINA_TRUE);
834 evas_object_size_hint_weight_set(genlist,
835 EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
836 elm_object_part_content_set(eoBase, MUSIC_PART_PLAYLIST, genlist);
837 elm_genlist_select_mode_set(genlist, ELM_OBJECT_SELECT_MODE_ALWAYS);
838 elm_genlist_multi_select_set(genlist, EINA_FALSE);
840 Connect(genlist, EO_PLAYLIST, TYPE_REALIZED | TYPE_MOUSE_MOVE |
841 TYPE_KEY_DOWN | TYPE_ACTIVATED);
843 evas_object_show(genlist);
844 m->eoPlaylist = genlist;
848 void CPlaybackView::m_AddPlaylist(void)
850 Elm_Genlist_Item_Class *list_item = NULL;
853 CSongInfo *sinfo = NULL;
854 Elm_Object_Item *item = NULL;
855 SItemInfo *pItemInfo = NULL;
861 list_item = m_GetItemClass();
863 evas_object_del(m->eoPlaylist);
867 if (!m->pController->GetTotalSongs(&ts)) {
868 _ERR(" music get total songs failed ");
872 if (!m->pController->GetCurrentSongIndex(&index))
873 _ERR(" music get current song index failed ");
875 for (i = 0; i < ts; i++) {
876 if (!m->pController->GetSonginfoFromIndex(i, &sinfo)) {
877 _ERR(" music get songinfo failed ");
880 pItemInfo = (SItemInfo *)calloc(1, sizeof(*pItemInfo));
883 pItemInfo->sinfo = sinfo;
884 pItemInfo->edit_mode = false;
885 pItemInfo->check_status = false;
886 pItemInfo->select_status = false;
888 // event handling will be done in OnActivated function
889 item = elm_genlist_item_append(m->eoPlaylist, list_item,
890 pItemInfo, NULL, ELM_GENLIST_ITEM_NONE,
892 pItemInfo->item = item;
895 pItemInfo->select_status = true;
896 m->cs_itinfo = pItemInfo;
898 m->elInfo = eina_list_append(m->elInfo, pItemInfo);
903 void CPlaybackView::m_RemovePlaylist(void)
906 elm_genlist_clear(m->eoPlaylist);
907 m->eoPlaylist = NULL;
911 eina_list_free(m->elInfo);
917 void CPlaybackView::m_HandleGenlistItemActivated(Evas_Object *obj, Elm_Object_Item *genListItem)
920 SItemInfo *itinfo = NULL;
922 if (!obj || !genListItem)
925 itinfo = m_FindItemInfoFromItem(m->elInfo, genListItem);
927 _ERR(" no item info found ");
931 if (itinfo->edit_mode) {
932 m_UpdateItemCheck(itinfo);
933 m_DisableEditButtons(false);
937 index = elm_genlist_item_index_get(genListItem);
939 m->pController->PlayIndexSong(--index);
943 bool CPlaybackView::Create(void *data)
947 CPlaybackController::SCallback cb;
950 _CHECK(m = new SPlaybackView)
951 _CHECK(m->mgr = CViewMgr::GetInstance())
952 _CHECK(m->eoWin = m->mgr->Window())
953 _CHECK(m->pController = new CMusicController)
954 _CHECK(m->pController->Create())
955 _CHECK(m->eoBase = CCommonUI::AddBase(m->eoWin, MUSIC_PLAYBACK_VIEW))
956 _CHECK(CBaseView::Create(data))
957 _CHECK(CTimer::Create());
958 _CHECK(m->pController->AddListener(this))
959 _CHECK(m->pPlaybackController = new CPlaybackController)
960 _COMMAND{ cb.cookie = this; cb.OnCurrentSongCount = sm_CbCurrentSongCount; }
961 _CHECK(m->pPlaybackController->Create(m->eoBase, &cb))
964 evas_object_data_set(m->eoBase, PLAYBACK_VIEW_DATA, m);
966 m_AddCurrentSonginfo();
970 for (i = 0; i < TOTAL_CONTROL_BTNS; i++)
971 m->eoBtnControl[i] = m->pPlaybackController->ControlBtnsObject((EPlayerControlBtns)i);
973 for (i = 0; i < TOTAL_EDIT_BTNS; i++)
974 m->eoBtnEdit[i] = m->pPlaybackController->EditBtnsObject((EPlayerEditBtns)i);
976 m->pHandleVolume = new CHandleVolume;
977 m->pHandleVolume->Create(m->eoBase);
978 m_UpdatePlaymodeFocusSequence();
980 Connect(m->eoBase, EO_BASE, TYPE_KEY_DOWN | TYPE_KEY_UP);
983 _CHECK_FAIL{ m->pPlaybackController->Destroy(); }
984 _CHECK_FAIL{ delete m->pPlaybackController; }
985 _CHECK_FAIL{ m->pController->RemoveListener(this); }
986 _CHECK_FAIL{ CTimer::Destroy(); }
987 _CHECK_FAIL{ CBaseView::Destroy(); }
988 _CHECK_FAIL{ evas_object_del(m->eoBase); }
989 _CHECK_FAIL{ m->pController->Destroy(); }
990 _CHECK_FAIL{ delete m->pController; }
991 _CHECK_FAIL{ /* mgr->Window() */ }
992 _CHECK_FAIL{ /* CViewerMgr::GetInstance() */}
993 _CHECK_FAIL{ delete m; m = NULL; }
994 }_CREATE_END_AND_CATCH{ return false; }
1000 void CPlaybackView::Destroy(void)
1004 Disconnect(m->eoBase);
1006 m->pPlaybackController->Destroy();
1007 delete m->pPlaybackController;
1009 m->pController->RemoveListener(this);
1011 m->pSliderWidget->Destroy();
1012 delete m->pSliderWidget;
1014 m->pHandleVolume->Destroy();
1015 delete m->pHandleVolume;
1016 CBaseView::Destroy();
1017 evas_object_del(m->eoBase);
1025 Evas_Object* CPlaybackView::Base(void)
1033 void CPlaybackView::t_OnShow(void)
1039 m_UpdateCurrentSongInfo();
1041 state = m->pController->PlayState();
1042 if (state == PLAY_STATUS_INITIAL || state == PLAY_STATUS_STOP) {
1045 m->pController->Start();
1049 elm_genlist_item_show(m->cs_itinfo->item, ELM_GENLIST_ITEM_SCROLLTO_IN);
1050 elm_object_item_focus_set(m->cs_itinfo->item, EINA_TRUE);
1053 evas_object_show(m->eoBase);
1057 void CPlaybackView::t_OnUpdate(void *data)
1061 SParcel *parcel = (SParcel *)data;
1063 char *keyEvent = NULL;
1066 updateType = E_PLAYLIST_UPDATE;
1068 updateType = parcel->updateType;
1069 keyEvent = (char *)parcel->keyEvent;
1072 switch (updateType) {
1073 case E_PLAYLIST_UPDATE:
1076 elm_object_disabled_set(m->eoBtnControl[CTRL_BTN_FORWARD], EINA_FALSE);
1077 elm_object_disabled_set(m->eoBtnControl[CTRL_BTN_REWIND], EINA_FALSE);
1078 elm_object_disabled_set(m->eoBtnControl[CTRL_BTN_PLAY], EINA_FALSE);
1079 elm_object_focus_next_object_set(m->eoBtnControl[CTRL_BTN_REPEAT],
1080 m->eoBtnControl[CTRL_BTN_REWIND], ELM_FOCUS_RIGHT);
1081 m_FromEditToPlaybackMode();
1085 m_HandleKeyPress(keyEvent);
1089 m_HandleKeyUnpress(keyEvent);
1098 void CPlaybackView::t_OnTimer(int id)
1103 void CPlaybackView::t_OnHide(void)
1107 evas_object_hide(m->eoBase);
1111 void CPlaybackView::OnKeyDown(int id, Evas *e, Evas_Object *obj, Evas_Event_Key_Down *ev)
1115 m_HandleKeyPress(ev->keyname);
1120 Elm_Object_Item *it = NULL;
1121 SContentInfo *ctxtinfo = NULL;
1122 SItemInfo *itinfo = NULL;
1125 if (!strcmp(ev->keyname, KEY_MENU) ||
1126 !strcmp(ev->keyname, KEY_MENU_REMOTE)) {
1127 it = elm_object_focused_item_get(obj);
1129 _ERR(" unable to get focused item ");
1132 m->focused_item = it;
1139 ctxtinfo = (SContentInfo *)calloc(1, sizeof(*ctxtinfo));
1143 itinfo = m_FindItemInfoFromItem(m->elInfo, it);
1149 if (m->pController->PlayState() == PLAY_STATUS_PLAY &&
1150 itinfo == m->cs_itinfo)
1151 ctxtinfo->status = PLAY_STATUS_PLAY;
1153 ctxtinfo->status = PLAY_STATUS_PAUSE;
1155 ctxtinfo->cbdata = this;
1156 ctxtinfo->update = sm_CbCtxtUpdate;
1157 ctxtinfo->close = sm_CbCtxtClose;
1158 ctxtinfo->type = CONTEXT_TYPE_PLAYSONG;
1159 ctxtinfo->context = itinfo->sinfo;
1161 m->ctxtinfo = ctxtinfo;
1163 memset(&parcel, 0, sizeof(SParcel));
1164 parcel.ctxtInfo = ctxtinfo;
1165 if (!m->mgr->PushView(MUSIC_CONTEXT_VIEW, &parcel))
1166 _ERR("viewmgr push view MUSIC_CONTEXT_VIEW failed");
1176 void CPlaybackView::OnKeyUp(int id, Evas *e, Evas_Object *obj, Evas_Event_Key_Up *ev)
1180 m_HandleKeyUnpress(ev->keyname);
1189 void CPlaybackView::OnMouseMove(int id, Evas *e, Evas_Object *obj, Evas_Event_Mouse_Move *ev)
1194 Elm_Object_Item *item;
1196 item = elm_genlist_at_xy_item_get(obj, ev->cur.canvas.x,
1197 ev->cur.canvas.y, NULL);
1201 if (!elm_object_item_focus_get(item))
1202 elm_object_item_focus_set(item, EINA_TRUE);
1212 void CPlaybackView::OnRealized(int id, Evas_Object *obj, Elm_Object_Item *item)
1217 int index = elm_genlist_item_index_get(item);
1218 if ((index & 1) == 1)
1219 elm_object_item_signal_emit(item,
1220 MUSIC_SIGNAL_EVEN_ROW, MUSIC_PLAYBACK_VIEW);
1222 elm_object_item_signal_emit(item,
1223 MUSIC_SIGNAL_ODD_ROW, MUSIC_PLAYBACK_VIEW);
1225 SItemInfo *itInfo = m_FindItemInfoFromItem(m->elInfo, item);
1226 if (itInfo->select_status)
1227 elm_object_item_signal_emit(item,
1228 MUSIC_SIGNAL_SELECT_ITEM, MUSIC_PLAYBACK_VIEW);
1230 elm_object_item_signal_emit(item,
1231 MUSIC_SIGNAL_UNSELECT_ITEM, MUSIC_PLAYBACK_VIEW);
1233 if (itInfo->edit_mode) {
1234 elm_object_item_signal_emit(item,
1235 MUSIC_SIGNAL_EDITMODE_ON, MUSIC_PLAYBACK_VIEW);
1236 if (itInfo->check_status) {
1237 elm_object_item_signal_emit(item,
1238 MUSIC_SIGNAL_CHECK_ON, MUSIC_PLAYBACK_VIEW);
1241 elm_object_item_signal_emit(item,
1242 MUSIC_SIGNAL_CHECK_OFF, MUSIC_PLAYBACK_VIEW);
1245 elm_object_item_signal_emit(item,
1246 MUSIC_SIGNAL_EDITMODE_OFF, MUSIC_PLAYBACK_VIEW);
1256 void CPlaybackView::OnActivated(int id, Evas_Object *obj, Elm_Object_Item *item)
1260 m_HandleGenlistItemActivated(obj, item);
1269 void CPlaybackView::OnComplete(void)
1271 m_UpdateCurrentSongInfo();
1275 void CPlaybackView::OnError(void)
1280 void CPlaybackView::OnUsbStatusChanged(SUsbStorageStatus status)
1285 void CPlaybackView::OnUpdateContent(void)
1290 void CPlaybackView::OnStartPlayback(void)
1292 m_UpdateCurrentSongInfo();
1296 void CPlaybackView::OnStopPlayback(void)
1301 void CPlaybackView::OnEmptyPlaylist(void)
1303 eina_list_free(m->elInfo);
1305 elm_genlist_clear(m->eoPlaylist);
1306 m_UpdateEmptySongInfo();
1310 void CPlaybackView::OnPlayerModeChanged(EPlayerMode mode)
1313 case MODE_PLAYLIST_EDIT:
1314 m_FromPlaybackToEditMode();
1318 m_FromEditToPlaybackMode();
1322 ASSERT(!"Invalid Player Mode");
1328 void CPlaybackView::OnEditButtonsPressed(EPlayerEditBtns editBtns)
1331 case EDIT_BTN_CANCEL:
1332 m_DisableCheckAll(m->elInfo);
1333 m_DisableEditButtons(true);
1336 case EDIT_BTN_DESELECT:
1337 m_DisableCheckAll(m->elInfo);
1338 m_DisableEditButtons(true);
1339 elm_genlist_realized_items_update(m->eoPlaylist);
1342 case EDIT_BTN_DELETE:
1343 m_DeleteSelectedItems();
1347 ASSERT(!"Invalid Edit Button");