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.
20 #include <AppCommon.h>
23 #include "song_info.h"
24 #include "album_info.h"
25 #include "music-controller.h"
26 #include "volume-control.h"
28 #include "common-ui.h"
29 #include "playback-view.h"
30 #include "context-view.h"
31 #include "HandleVolume.h"
32 #include "PlaySettingCtxPopup.h"
34 #include "SliderWidget.h"
35 #include "PlaybackController.h"
38 #define TOTAL_CONTROL_BTNS 6
39 #define TOTAL_EDIT_BTNS 3
48 Elm_Object_Item *item;
55 struct SPlaybackView {
59 Evas_Object *eoPlaylist;
61 Elm_Object_Item *focused_item;
63 CPlaybackController *pPlaybackController;
64 // These are reference values.
65 Evas_Object *eoBtnControl[TOTAL_CONTROL_BTNS];
66 Evas_Object *eoBtnEdit[TOTAL_EDIT_BTNS];
68 Evas_Object *eoAlbumCover;
69 CSliderWidget *pSliderWidget;
72 CMusicController *pController; //! NOT NULL
76 SContentInfo *ctxtinfo;
78 CHandleVolume *pHandleVolume;
81 memset(this, 0, sizeof(SPlaybackView));
86 void CPlaybackView::sm_CbCtxtUpdate(void *dt, enum EActionType type, int lid)
88 CPlaybackView *root = (CPlaybackView *)dt;
90 root->m_OnCtxtUpdate(type, lid);
94 void CPlaybackView::m_OnCtxtUpdate(EActionType type, int lid)
96 SItemInfo *itinfo = NULL;
97 Elm_Object_Item *focusedItem = NULL;
99 if (!m->ctxtinfo || !m->ctxtinfo->context)
102 itinfo = m_FindItemInfoFromSong(m->elInfo,
103 (CSongInfo *)m->ctxtinfo->context);
105 _ERR(" Unable to find song in the list ");
109 if (type == ACTION_TYPE_DELETE) {
110 itinfo->check_status = true;
111 m_DeleteSelectedItems();
113 if (!m->mgr->PopView()) {
114 _ERR("CViewMgr::PopView failed");
119 memset(&parcel, 0, sizeof(SParcel));
120 parcel.updateType = E_PLAYLIST_UPDATE;
123 focusedItem = m->cs_itinfo->item;
125 else { // ACTION_TYPE_PLAY
126 if (m->ctxtinfo->status == PLAY_STATUS_PLAY)
129 if (itinfo == m->cs_itinfo)
132 m_HandleGenlistItemActivated(m->eoPlaylist, itinfo->item);
135 if (!m->mgr->PopView()) {
136 _ERR("CViewMgr::PopView failed");
140 focusedItem = m->focused_item;
143 if (!CViewMgr::GetInstance()->HideView(MUSIC_BASE_VIEW))
144 _ERR("CViewMgr::HideView failed");
149 elm_genlist_item_show(focusedItem, ELM_GENLIST_ITEM_SCROLLTO_IN);
150 elm_object_item_focus_set(focusedItem, EINA_TRUE);
155 void CPlaybackView::sm_CbCtxtClose(void *dt)
157 CPlaybackView *root = (CPlaybackView *)dt;
159 root->m_OnCtxtClose();
163 void CPlaybackView::m_OnCtxtClose(void)
165 if (!m->mgr->PopView()) {
166 _ERR("CViewMgr::PopView failed");
170 elm_object_item_focus_set(m->focused_item, EINA_TRUE);
174 int CPlaybackView::sm_CbCurrentSongCount(void *cookie)
176 CPlaybackView *root = (CPlaybackView *)cookie;
179 ret = root->m_CbCurrentSongCount();
185 int CPlaybackView::m_CbCurrentSongCount(void)
187 return eina_list_count(m->elInfo);
191 void CPlaybackView::m_ChangeEditmodeAll(Eina_List *list, bool flag)
193 SItemInfo *itinfo = NULL;
197 EINA_LIST_FOREACH(list, l, obj) {
198 itinfo = (SItemInfo *)obj;
199 itinfo->edit_mode = flag;
204 void CPlaybackView::m_DisableCheckAll(Eina_List *list)
206 SItemInfo *itinfo = NULL;
210 EINA_LIST_FOREACH(list, l, obj) {
211 itinfo = (SItemInfo *)obj;
212 itinfo->check_status = false;
217 void CPlaybackView::m_SelectItem(SItemInfo *pItemInfo)
219 if (!pItemInfo || !pItemInfo->item)
222 elm_genlist_item_bring_in(pItemInfo->item, ELM_GENLIST_ITEM_SCROLLTO_IN);
223 elm_object_item_signal_emit(pItemInfo->item, MUSIC_SIGNAL_SELECT_ITEM, MUSIC_PLAYBACK_VIEW);
225 pItemInfo->select_status = true;
229 void CPlaybackView::m_UnselectItem(SItemInfo *pItemInfo)
231 if (!pItemInfo || !pItemInfo->item)
234 elm_object_item_signal_emit(pItemInfo->item, MUSIC_SIGNAL_UNSELECT_ITEM,
235 MUSIC_PLAYBACK_VIEW);
237 pItemInfo->select_status = false;
241 void CPlaybackView::m_UpdateCurrentSongThumbnail(void)
244 char buf[MAX_LENGTH];
246 if (!m->cs_itinfo || !m->cs_itinfo->sinfo)
249 path = m->cs_itinfo->sinfo->ThumbnailPath();
251 elm_image_file_set(m->eoAlbumCover, path, NULL);
253 snprintf(buf, sizeof(buf), "%s/%s", IMAGEDIR,
254 MUSIC_IMAGE_DEFAULT_THUMB_450);
255 elm_image_file_set(m->eoAlbumCover, buf, NULL);
260 void CPlaybackView::m_UpdateCurrentSongLabels(void)
262 char buf[MAX_LENGTH];
267 elm_object_part_text_set(m->eoBase, MUSIC_PART_SONG_TITLE,
270 snprintf(buf, sizeof(buf), "%s - %s", m->csinfo->Artist(),
273 elm_object_part_text_set(m->eoBase, MUSIC_PART_ARTIST_ALBUM, buf);
277 void CPlaybackView::m_UpdateEmptySongInfo(void)
279 char buf[MAX_LENGTH];
281 m->pSliderWidget->Init();
283 elm_object_part_text_set(m->eoBase, MUSIC_PART_SONG_TITLE,
284 _(NO_PLAYLIST_MESSAGE));
285 elm_object_part_text_set(m->eoBase, MUSIC_PART_ARTIST_ALBUM,
286 _(NO_PLAYLIST_MESSAGE_SUB));
287 snprintf(buf, sizeof(buf), "%s/%s", IMAGEDIR,
288 MUSIC_IMAGE_DEFAULT_THUMB_450);
289 elm_image_file_set(m->eoAlbumCover, buf, NULL);
290 m->pController->SetPlayState(PLAY_STATUS_INITIAL);
294 void CPlaybackView::m_UpdateCtxtView(int playStatus)
296 if (!m->cs_itinfo || !m->ctxtinfo)
299 if (!m->mgr->CheckTop(MUSIC_CONTEXT_VIEW))
302 if (m->cs_itinfo->sinfo == m->ctxtinfo->context) {
303 m->ctxtinfo->status = (EPlayStatus)playStatus;
306 memset(&parcel, 0, sizeof(SParcel));
307 parcel.updateType = E_SONG_UPDATE;
308 m->mgr->UpdateView((const char *)MUSIC_CONTEXT_VIEW, &parcel);
313 void CPlaybackView::m_UpdateCurrentSongItem(int index)
315 SItemInfo *pItemInfo = NULL;
318 m_UnselectItem(m->cs_itinfo);
319 m_UpdateCtxtView(PLAY_STATUS_PAUSE);
322 pItemInfo = (SItemInfo *)eina_list_nth(m->elInfo, index);
325 m->cs_itinfo = pItemInfo;
326 if (m->pController->PlayState() == PLAY_STATUS_STOP) {
327 elm_genlist_item_bring_in(pItemInfo->item,
328 ELM_GENLIST_ITEM_SCROLLTO_IN);
331 m_SelectItem(pItemInfo);
332 m_UpdateCtxtView(PLAY_STATUS_PLAY);
338 void CPlaybackView::m_UpdateEditmodeFocusSequence(void)
340 elm_object_focus_next_object_set(m->eoPlaylist, m->eoBtnEdit[EDIT_BTN_CANCEL], ELM_FOCUS_LEFT);
341 elm_object_focus_next_object_set(m->eoBtnEdit[EDIT_BTN_CANCEL], m->eoPlaylist, ELM_FOCUS_RIGHT);
342 elm_object_focus_next_object_set(m->pSliderWidget->Base(), m->eoBtnEdit[EDIT_BTN_CANCEL], ELM_FOCUS_DOWN);
346 void CPlaybackView::m_UpdatePlaymodeFocusSequence(void)
348 switch (m->pController->PlayState()) {
349 case PLAY_STATUS_INITIAL:
353 case PLAY_STATUS_STOP:
354 elm_object_focus_next_object_set(m->eoPlaylist, m->eoBtnControl[CTRL_BTN_PLAY], ELM_FOCUS_LEFT);
355 elm_object_focus_next_object_set(m->eoBtnControl[CTRL_BTN_PLAY], m->eoPlaylist, ELM_FOCUS_RIGHT);
356 elm_object_focus_next_object_set(m->eoBtnControl[CTRL_BTN_PLAY], m->eoBtnControl[CTRL_BTN_REPEAT], ELM_FOCUS_LEFT);
357 elm_object_focus_next_object_set(m->eoBtnControl[CTRL_BTN_REPEAT], m->eoBtnControl[CTRL_BTN_PLAY], ELM_FOCUS_RIGHT);
358 elm_object_signal_emit(m->eoBtnControl[CTRL_BTN_PLAY], MUSIC_SIGNAL_PAUSE, MUSIC_PLAYBACK_VIEW);
361 case PLAY_STATUS_PLAY:
362 case PLAY_STATUS_PAUSE:
363 elm_object_focus_next_object_set(m->eoPlaylist,
364 m->eoBtnControl[CTRL_BTN_FORWARD], ELM_FOCUS_LEFT);
365 elm_object_focus_next_object_set(m->eoBtnControl[CTRL_BTN_FORWARD],
366 m->eoPlaylist, ELM_FOCUS_RIGHT);
367 elm_object_focus_next_object_set(m->eoBtnControl[CTRL_BTN_PLAY],
368 m->eoBtnControl[CTRL_BTN_FORWARD], ELM_FOCUS_RIGHT);
369 elm_object_focus_next_object_set(m->eoBtnControl[CTRL_BTN_PLAY],
370 m->eoBtnControl[CTRL_BTN_REWIND], ELM_FOCUS_LEFT);
371 elm_object_focus_next_object_set(m->eoBtnControl[CTRL_BTN_REPEAT],
372 m->eoBtnControl[CTRL_BTN_REWIND], ELM_FOCUS_RIGHT);
376 ASSERT(!"Invalid State");
382 void CPlaybackView::m_UpdateCurrentSongInfo(void)
384 CSongInfo *sinfo = NULL;
387 if (eina_list_count(m->elInfo) == 0) {
388 m_UpdateEmptySongInfo();
392 if (!m->pController->GetCurrentSongIndex(&index)) {
393 _ERR(" music get current song index failed ");
397 if (!m->pController->GetSonginfoFromIndex(index, &sinfo)) {
398 _ERR(" music get songinfo failed ");
403 m_UpdateCurrentSongItem(index);
404 m_UpdateCurrentSongLabels();
405 m_UpdateCurrentSongThumbnail();
406 m->pPlaybackController->Update();
407 m_UpdatePlaymodeFocusSequence();
411 void CPlaybackView::m_DisableEditButtons(bool flag)
413 /* flag - 1 means disable edit buttons and 0 means enable */
415 elm_object_focus_set(m->eoBtnEdit[EDIT_BTN_CANCEL], EINA_TRUE);
417 elm_object_disabled_set(m->eoBtnEdit[EDIT_BTN_DELETE], (Eina_Bool)flag);
418 elm_object_disabled_set(m->eoBtnEdit[EDIT_BTN_DESELECT], (Eina_Bool)flag);
420 m_UpdateEditmodeFocusSequence();
421 elm_object_focus_set(m->eoBtnEdit[EDIT_BTN_CANCEL], EINA_TRUE);
424 elm_object_focus_next_object_set(m->eoBtnEdit[EDIT_BTN_CANCEL], m->eoBtnEdit[EDIT_BTN_DESELECT], ELM_FOCUS_RIGHT);
425 elm_object_focus_next_object_set(m->eoBtnEdit[EDIT_BTN_DELETE], m->eoPlaylist, ELM_FOCUS_RIGHT);
426 elm_object_focus_next_object_set(m->eoPlaylist, m->eoBtnEdit[EDIT_BTN_DELETE], ELM_FOCUS_LEFT);
431 void CPlaybackView::m_FromEditToPlaybackMode(void)
433 if (m->pController->PlayState() == PLAY_STATUS_STOP) {
434 elm_genlist_item_bring_in(m->cs_itinfo->item,
435 ELM_GENLIST_ITEM_SCROLLTO_IN);
438 m_SelectItem(m->cs_itinfo);
440 elm_object_signal_emit(m->eoBase, MUSIC_SIGNAL_PLAYBACK_MODE,
441 MUSIC_PLAYBACK_VIEW);
442 elm_object_focus_set(m->eoBtnControl[CTRL_BTN_SETTINGS], EINA_TRUE);
444 m_ChangeEditmodeAll(m->elInfo, false);
446 elm_genlist_realized_items_update(m->eoPlaylist);
448 m_UpdatePlaymodeFocusSequence();
452 void CPlaybackView::m_FromPlaybackToEditMode(void)
454 elm_object_signal_emit(m->eoBase, MUSIC_SIGNAL_EDIT_MODE,
455 MUSIC_PLAYBACK_VIEW);
457 m_DisableEditButtons(true);
459 elm_object_focus_set(m->eoBtnEdit[EDIT_BTN_CANCEL], EINA_TRUE);
461 m_ChangeEditmodeAll(m->elInfo, true);
463 elm_genlist_realized_items_update(m->eoPlaylist);
465 m_UpdateEditmodeFocusSequence();
469 void CPlaybackView::m_DeleteSelectedItems(void)
471 Eina_List *l = NULL, *l_next = NULL;
472 SItemInfo *pItemInfo = NULL;
474 bool updateFlag = false;
477 m_DisableEditButtons(true);
478 EINA_LIST_FOREACH_SAFE(m->elInfo, l, l_next, obj) {
479 pItemInfo = (SItemInfo *)obj;
480 if (pItemInfo->check_status) {
481 if (m->cs_itinfo == pItemInfo) {
483 m_UnselectItem(m->cs_itinfo);
485 m->pController->SetPlayState(PLAY_STATUS_STOP);
486 m->pController->Stop();
488 index = elm_genlist_item_index_get(pItemInfo->item);
489 m->pController->RemoveSong(pItemInfo->sinfo, index);
491 m->elInfo = eina_list_remove(m->elInfo, pItemInfo);
492 elm_object_item_del(pItemInfo->item);
496 if (eina_list_count(m->elInfo) == 0) {
497 m_UpdateEmptySongInfo();
498 elm_genlist_realized_items_update(m->eoPlaylist);
499 elm_object_focus_set(m->eoBtnEdit[EDIT_BTN_CANCEL], EINA_TRUE);
504 m_UpdateCurrentSongInfo();
506 elm_genlist_realized_items_update(m->eoPlaylist);
507 elm_object_focus_set(m->eoBtnEdit[EDIT_BTN_CANCEL], EINA_TRUE);
511 void CPlaybackView::m_KeyBackPress(void)
515 if (!CViewMgr::GetInstance()->ShowView(MUSIC_BASE_VIEW))
516 _ERR("CViewMgr::ShowView failed");
518 if (CViewMgr::GetInstance()->CheckTop(MUSIC_CONTEXT_VIEW)) {
519 if (!CViewMgr::GetInstance()->UpdateView(MUSIC_CONTEXT_VIEW, NULL))
520 _ERR("CViewMgr::UpdateView failed");
522 if (!CViewMgr::GetInstance()->ShowView(MUSIC_CONTEXT_VIEW))
523 _ERR("CViewMgr::ShowView failed");
528 void CPlaybackView::m_KeyExitPress(void)
530 m->pController->Stop();
535 void CPlaybackView::m_KeyPlayPress(void)
539 if (elm_object_disabled_get(m->eoBtnControl[CTRL_BTN_PLAY]))
542 state = m->pController->PlayState();
543 if (state == PLAY_STATUS_PAUSE) {
544 m->pController->Resume();
545 elm_object_signal_emit(m->eoBtnControl[CTRL_BTN_PLAY],
546 MUSIC_SIGNAL_PLAY, MUSIC_PLAYBACK_VIEW);
548 else if (state != PLAY_STATUS_PLAY) {
549 m->pController->Start();
554 void CPlaybackView::m_KeyPausePress(void)
558 if (elm_object_disabled_get(m->eoBtnControl[CTRL_BTN_PLAY]))
561 state = m->pController->PlayState();
562 if (state == PLAY_STATUS_PLAY) {
563 elm_object_signal_emit(m->eoBtnControl[CTRL_BTN_PLAY],
564 MUSIC_SIGNAL_PAUSE, MUSIC_PLAYBACK_VIEW);
565 m->pController->Pause();
570 void CPlaybackView::m_KeyNextPress(void)
572 if (elm_object_disabled_get(m->eoBtnControl[CTRL_BTN_FORWARD]))
575 m->pController->HandleRemoteButtons(m->eoBtnControl[CTRL_BTN_FORWARD], EVENT_PRESSED);
579 void CPlaybackView::m_KeyPreviousPress(void)
581 if (elm_object_disabled_get(m->eoBtnControl[CTRL_BTN_REWIND]))
584 m->pController->HandleRemoteButtons(m->eoBtnControl[CTRL_BTN_REWIND], EVENT_PRESSED);
588 void CPlaybackView::m_KeyNextUnpress(void)
590 if (elm_object_disabled_get(m->eoBtnControl[CTRL_BTN_FORWARD]))
593 m->pController->HandleRemoteButtons(m->eoBtnControl[CTRL_BTN_FORWARD], EVENT_UNPRESSED);
597 void CPlaybackView::m_KeyPreviousUnpress(void)
599 if (elm_object_disabled_get(m->eoBtnControl[CTRL_BTN_REWIND]))
602 m->pController->HandleRemoteButtons(m->eoBtnControl[CTRL_BTN_REWIND], EVENT_UNPRESSED);
606 void CPlaybackView::m_HandleKeyPress(char *keyname)
608 if (!strcmp(keyname, (char *)KEY_EXIT))
610 else if (!strcmp(keyname, (char *)KEY_BACK) ||
611 !strcmp(keyname, (char *)KEY_BACK_REMOTE))
613 else if (!strcmp(keyname, (char *)KEY_PLAY))
615 else if (!strcmp(keyname, (char *)KEY_PAUSE))
617 else if (!strcmp(keyname, (char *)KEY_NEXT))
619 else if (!strcmp(keyname, (char *)KEY_PREVIOUS))
620 m_KeyPreviousPress();
621 else if (!strcmp(keyname, (char *)KEY_VOLUMEUP) ||
622 !strcmp(keyname, (char *)KEY_VOLUMEUP_REMOTE))
623 m->pHandleVolume->Up();
624 else if (!strcmp(keyname, (char *)KEY_VOLUMEDOWN) ||
625 !strcmp(keyname, (char *)KEY_VOLUMEDOWN_REMOTE))
626 m->pHandleVolume->Down();
627 else if (!strcmp(keyname, (char *)KEY_MUTE) ||
628 !strcmp(keyname, (char *)KEY_MUTE_REMOTE))
629 m->pHandleVolume->Mute();
633 void CPlaybackView::m_HandleKeyUnpress(char *keyname)
635 if (!strcmp(keyname, KEY_PREVIOUS))
636 m_KeyPreviousUnpress();
637 else if (!strcmp(keyname, KEY_NEXT))
642 void CPlaybackView::m_AddAlbumCover(void)
644 Evas_Object *eoAlbumCover = NULL;
646 eoAlbumCover = elm_image_add(m->eoBase);
650 evas_object_size_hint_weight_set(eoAlbumCover, EVAS_HINT_EXPAND,
652 elm_image_aspect_fixed_set(eoAlbumCover, EINA_FALSE);
654 elm_object_part_content_set(m->eoBase, MUSIC_PART_ALBUMCOVER,
656 evas_object_show(eoAlbumCover);
657 m->eoAlbumCover = eoAlbumCover;
662 void CPlaybackView::m_AddCurrentSonginfo(void)
666 m->pSliderWidget = new CSliderWidget;
667 m->pSliderWidget->Create(m->eoBase);
671 SItemInfo *CPlaybackView::m_FindItemInfoFromSong(Eina_List *list, CSongInfo *sinfo)
674 SItemInfo *itinfo = NULL;
677 EINA_LIST_FOREACH(list, l, obj) {
678 itinfo = (SItemInfo *)obj;
679 if (itinfo->sinfo == sinfo)
687 SItemInfo *CPlaybackView::m_FindItemInfoFromItem(Eina_List *list, Elm_Object_Item *item)
690 SItemInfo *itinfo = NULL;
693 EINA_LIST_FOREACH(list, l, obj) {
694 itinfo = (SItemInfo *)obj;
695 if (itinfo->item == item)
703 void CPlaybackView::m_UpdateItemCheck(SItemInfo *itinfo)
706 _ERR(" No item info to Update check ");
710 if (itinfo->check_status) {
711 elm_object_item_signal_emit(itinfo->item,
712 MUSIC_SIGNAL_CHECK_OFF, MUSIC_PLAYBACK_VIEW);
713 itinfo->check_status = false;
717 elm_object_item_signal_emit(itinfo->item,
718 MUSIC_SIGNAL_CHECK_ON, MUSIC_PLAYBACK_VIEW);
719 itinfo->check_status = true;
723 class CElmGenlistItemClass {
725 static char *sm_CbTextGet(void *data, Evas_Object *obj, const char *part)
727 CSongInfo *sinfo = NULL;
728 SItemInfo *pItemInfo = (SItemInfo *)data;
729 char buf[MAX_LENGTH];
730 char *timestr = NULL;
734 if (!pItemInfo || !obj)
737 sinfo = pItemInfo->sinfo;
739 snprintf(buf, sizeof(buf), "%s", MUSIC_STR_EMPTY);
741 if (!strcmp(part, "elm.text0")) {
742 index = elm_genlist_item_index_get(pItemInfo->item);
743 snprintf(buf, sizeof(buf), "%d", index);
745 else if (!strcmp(part, "elm.text1"))
746 snprintf(buf, sizeof(buf), "%s", sinfo->Name());
747 else if (!strcmp(part, "elm.text2"))
748 snprintf(buf, sizeof(buf), "%s - %s",
751 else if (!strcmp(part, "elm.text3")) {
752 duration = sinfo->Duration();
753 timestr = CCommonUI::TimeStrFromMilSeconds(duration);
755 snprintf(buf, sizeof(buf), "%s", timestr);
760 if (strcmp(buf, MUSIC_STR_EMPTY))
765 static Evas_Object *sm_CbContentGet(void *data, Evas_Object *obj, const char *part)
767 CSongInfo *sinfo = NULL;
768 SItemInfo *pItemInfo = (SItemInfo *)data;
769 Evas_Object *img = NULL;
771 char buf[MAX_LENGTH];
773 if (!pItemInfo || !obj)
776 sinfo = pItemInfo->sinfo;
778 img = elm_image_add(obj);
782 elm_image_aspect_fixed_set(img, EINA_FALSE);
784 if (!strcmp(part, "elm.swallow.icon")) {
785 path = sinfo->ThumbnailPath();
787 elm_image_file_set(img, path, "NULL");
789 snprintf(buf, sizeof(buf), "%s/%s", IMAGEDIR,
790 MUSIC_IMAGE_DEFAULT_THUMB_126);
791 elm_image_file_set(img, buf, "NULL");
798 static void sm_CbDel(void *data, Evas_Object *obj)
805 Elm_Genlist_Item_Class *CPlaybackView::m_GetItemClass(void)
807 Elm_Genlist_Item_Class *list_item = NULL;
809 list_item = elm_genlist_item_class_new();
811 _ERR(" elm_genlist_item_class_new failed ");
815 list_item->item_style = MUSIC_STYLE_PLAYLIST;
816 list_item->func.text_get = CElmGenlistItemClass::sm_CbTextGet;
817 list_item->func.content_get = CElmGenlistItemClass::sm_CbContentGet;
818 list_item->func.state_get = NULL;
819 list_item->func.del = CElmGenlistItemClass::sm_CbDel;
825 void CPlaybackView::m_AddGenlist(void)
827 Evas_Object *genlist = NULL;
828 Evas_Object *eoBase = NULL;
831 genlist = elm_genlist_add(eoBase);
835 elm_genlist_homogeneous_set(genlist, EINA_TRUE);
836 evas_object_size_hint_weight_set(genlist,
837 EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
838 elm_object_part_content_set(eoBase, MUSIC_PART_PLAYLIST, genlist);
839 elm_genlist_select_mode_set(genlist, ELM_OBJECT_SELECT_MODE_ALWAYS);
840 elm_genlist_multi_select_set(genlist, EINA_FALSE);
842 Connect(genlist, EO_PLAYLIST, TYPE_REALIZED | TYPE_MOUSE_MOVE |
843 TYPE_KEY_DOWN | TYPE_ACTIVATED);
845 evas_object_show(genlist);
846 m->eoPlaylist = genlist;
850 void CPlaybackView::m_AddPlaylist(void)
852 Elm_Genlist_Item_Class *list_item = NULL;
855 CSongInfo *sinfo = NULL;
856 Elm_Object_Item *item = NULL;
857 SItemInfo *pItemInfo = NULL;
863 list_item = m_GetItemClass();
865 evas_object_del(m->eoPlaylist);
869 if (!m->pController->GetTotalSongs(&ts)) {
870 _ERR(" music get total songs failed ");
874 if (!m->pController->GetCurrentSongIndex(&index))
875 _ERR(" music get current song index failed ");
877 for (i = 0; i < ts; i++) {
878 if (!m->pController->GetSonginfoFromIndex(i, &sinfo)) {
879 _ERR(" music get songinfo failed ");
882 pItemInfo = (SItemInfo *)calloc(1, sizeof(*pItemInfo));
885 pItemInfo->sinfo = sinfo;
886 pItemInfo->edit_mode = false;
887 pItemInfo->check_status = false;
888 pItemInfo->select_status = false;
890 // event handling will be done in OnActivated function
891 item = elm_genlist_item_append(m->eoPlaylist, list_item,
892 pItemInfo, NULL, ELM_GENLIST_ITEM_NONE,
894 pItemInfo->item = item;
897 pItemInfo->select_status = true;
898 m->cs_itinfo = pItemInfo;
900 m->elInfo = eina_list_append(m->elInfo, pItemInfo);
905 void CPlaybackView::m_RemovePlaylist(void)
908 elm_genlist_clear(m->eoPlaylist);
909 m->eoPlaylist = NULL;
913 eina_list_free(m->elInfo);
919 void CPlaybackView::m_HandleGenlistItemActivated(Evas_Object *obj, Elm_Object_Item *genListItem)
922 SItemInfo *itinfo = NULL;
924 if (!obj || !genListItem)
927 itinfo = m_FindItemInfoFromItem(m->elInfo, genListItem);
929 _ERR(" no item info found ");
933 if (itinfo->edit_mode) {
934 m_UpdateItemCheck(itinfo);
935 m_DisableEditButtons(false);
939 index = elm_genlist_item_index_get(genListItem);
941 m->pController->PlayIndexSong(--index);
945 bool CPlaybackView::Create(void *data)
949 CPlaybackController::SCallback cb;
952 _CHECK(m = new SPlaybackView)
953 _CHECK(m->mgr = CViewMgr::GetInstance())
954 _CHECK(m->eoWin = m->mgr->Window())
955 _CHECK(m->pController = new CMusicController)
956 _CHECK(m->pController->Create())
957 _CHECK(m->eoBase = CCommonUI::AddBase(m->eoWin, MUSIC_PLAYBACK_VIEW))
958 _CHECK(CBaseView::Create(data))
959 _CHECK(CTimer::Create());
960 _CHECK(m->pController->AddListener(this))
961 _CHECK(m->pPlaybackController = new CPlaybackController)
962 _COMMAND{ cb.cookie = this; cb.OnCurrentSongCount = sm_CbCurrentSongCount; }
963 _CHECK(m->pPlaybackController->Create(m->eoBase, &cb))
966 evas_object_data_set(m->eoBase, PLAYBACK_VIEW_DATA, m);
968 m_AddCurrentSonginfo();
972 for (i = 0; i < TOTAL_CONTROL_BTNS; i++)
973 m->eoBtnControl[i] = m->pPlaybackController->ControlBtnsObject((EPlayerControlBtns)i);
975 for (i = 0; i < TOTAL_EDIT_BTNS; i++)
976 m->eoBtnEdit[i] = m->pPlaybackController->EditBtnsObject((EPlayerEditBtns)i);
978 m->pHandleVolume = new CHandleVolume;
979 m->pHandleVolume->Create(m->eoBase);
980 m_UpdatePlaymodeFocusSequence();
982 Connect(m->eoBase, EO_BASE, TYPE_KEY_DOWN | TYPE_KEY_UP);
985 _CHECK_FAIL{ m->pPlaybackController->Destroy(); }
986 _CHECK_FAIL{ delete m->pPlaybackController; }
987 _CHECK_FAIL{ m->pController->RemoveListener(this); }
988 _CHECK_FAIL{ CTimer::Destroy(); }
989 _CHECK_FAIL{ CBaseView::Destroy(); }
990 _CHECK_FAIL{ evas_object_del(m->eoBase); }
991 _CHECK_FAIL{ m->pController->Destroy(); }
992 _CHECK_FAIL{ delete m->pController; }
993 _CHECK_FAIL{ /* mgr->Window() */ }
994 _CHECK_FAIL{ /* CViewerMgr::GetInstance() */}
995 _CHECK_FAIL{ delete m; m = NULL; }
996 }_CREATE_END_AND_CATCH{ return false; }
1002 void CPlaybackView::Destroy(void)
1006 Disconnect(m->eoBase);
1008 m->pPlaybackController->Destroy();
1009 delete m->pPlaybackController;
1011 m->pController->RemoveListener(this);
1013 m->pSliderWidget->Destroy();
1014 delete m->pSliderWidget;
1016 m->pHandleVolume->Destroy();
1017 delete m->pHandleVolume;
1018 CBaseView::Destroy();
1019 evas_object_del(m->eoBase);
1027 Evas_Object* CPlaybackView::Base(void)
1035 void CPlaybackView::t_OnShow(void)
1041 m_UpdateCurrentSongInfo();
1043 state = m->pController->PlayState();
1044 if (state == PLAY_STATUS_INITIAL || state == PLAY_STATUS_STOP) {
1047 m->pController->Start();
1051 elm_genlist_item_show(m->cs_itinfo->item, ELM_GENLIST_ITEM_SCROLLTO_IN);
1052 elm_object_item_focus_set(m->cs_itinfo->item, EINA_TRUE);
1055 evas_object_show(m->eoBase);
1059 void CPlaybackView::t_OnUpdate(void *data)
1063 SParcel *parcel = (SParcel *)data;
1065 char *keyEvent = NULL;
1068 updateType = E_PLAYLIST_UPDATE;
1070 updateType = parcel->updateType;
1071 keyEvent = (char *)parcel->keyEvent;
1074 switch (updateType) {
1075 case E_PLAYLIST_UPDATE:
1078 elm_object_disabled_set(m->eoBtnControl[CTRL_BTN_FORWARD], EINA_FALSE);
1079 elm_object_disabled_set(m->eoBtnControl[CTRL_BTN_REWIND], EINA_FALSE);
1080 elm_object_disabled_set(m->eoBtnControl[CTRL_BTN_PLAY], EINA_FALSE);
1081 elm_object_focus_next_object_set(m->eoBtnControl[CTRL_BTN_REPEAT],
1082 m->eoBtnControl[CTRL_BTN_REWIND], ELM_FOCUS_RIGHT);
1083 m_FromEditToPlaybackMode();
1087 m_HandleKeyPress(keyEvent);
1091 m_HandleKeyUnpress(keyEvent);
1100 void CPlaybackView::t_OnTimer(int id)
1105 void CPlaybackView::t_OnHide(void)
1109 evas_object_hide(m->eoBase);
1113 void CPlaybackView::OnKeyDown(int id, Evas *e, Evas_Object *obj, Evas_Event_Key_Down *ev)
1117 m_HandleKeyPress(ev->keyname);
1122 Elm_Object_Item *it = NULL;
1123 SContentInfo *ctxtinfo = NULL;
1124 SItemInfo *itinfo = NULL;
1127 if (!strcmp(ev->keyname, KEY_MENU) ||
1128 !strcmp(ev->keyname, KEY_MENU_REMOTE)) {
1129 it = elm_object_focused_item_get(obj);
1131 _ERR(" unable to get focused item ");
1134 m->focused_item = it;
1141 ctxtinfo = (SContentInfo *)calloc(1, sizeof(*ctxtinfo));
1145 itinfo = m_FindItemInfoFromItem(m->elInfo, it);
1151 if (m->pController->PlayState() == PLAY_STATUS_PLAY &&
1152 itinfo == m->cs_itinfo)
1153 ctxtinfo->status = PLAY_STATUS_PLAY;
1155 ctxtinfo->status = PLAY_STATUS_PAUSE;
1157 ctxtinfo->cbdata = this;
1158 ctxtinfo->update = sm_CbCtxtUpdate;
1159 ctxtinfo->close = sm_CbCtxtClose;
1160 ctxtinfo->type = CONTEXT_TYPE_PLAYSONG;
1161 ctxtinfo->context = itinfo->sinfo;
1163 m->ctxtinfo = ctxtinfo;
1165 memset(&parcel, 0, sizeof(SParcel));
1166 parcel.ctxtInfo = ctxtinfo;
1167 if (!m->mgr->PushView(MUSIC_CONTEXT_VIEW, &parcel))
1168 _ERR("viewmgr push view MUSIC_CONTEXT_VIEW failed");
1178 void CPlaybackView::OnKeyUp(int id, Evas *e, Evas_Object *obj, Evas_Event_Key_Up *ev)
1182 m_HandleKeyUnpress(ev->keyname);
1191 void CPlaybackView::OnMouseMove(int id, Evas *e, Evas_Object *obj, Evas_Event_Mouse_Move *ev)
1196 Elm_Object_Item *item;
1198 item = elm_genlist_at_xy_item_get(obj, ev->cur.canvas.x,
1199 ev->cur.canvas.y, NULL);
1203 if (!elm_object_item_focus_get(item))
1204 elm_object_item_focus_set(item, EINA_TRUE);
1214 void CPlaybackView::OnRealized(int id, Evas_Object *obj, Elm_Object_Item *item)
1219 int index = elm_genlist_item_index_get(item);
1220 if ((index & 1) == 1)
1221 elm_object_item_signal_emit(item,
1222 MUSIC_SIGNAL_EVEN_ROW, MUSIC_PLAYBACK_VIEW);
1224 elm_object_item_signal_emit(item,
1225 MUSIC_SIGNAL_ODD_ROW, MUSIC_PLAYBACK_VIEW);
1227 SItemInfo *itInfo = m_FindItemInfoFromItem(m->elInfo, item);
1228 if (itInfo->select_status)
1229 elm_object_item_signal_emit(item,
1230 MUSIC_SIGNAL_SELECT_ITEM, MUSIC_PLAYBACK_VIEW);
1232 elm_object_item_signal_emit(item,
1233 MUSIC_SIGNAL_UNSELECT_ITEM, MUSIC_PLAYBACK_VIEW);
1235 if (itInfo->edit_mode) {
1236 elm_object_item_signal_emit(item,
1237 MUSIC_SIGNAL_EDITMODE_ON, MUSIC_PLAYBACK_VIEW);
1238 if (itInfo->check_status) {
1239 elm_object_item_signal_emit(item,
1240 MUSIC_SIGNAL_CHECK_ON, MUSIC_PLAYBACK_VIEW);
1243 elm_object_item_signal_emit(item,
1244 MUSIC_SIGNAL_CHECK_OFF, MUSIC_PLAYBACK_VIEW);
1247 elm_object_item_signal_emit(item,
1248 MUSIC_SIGNAL_EDITMODE_OFF, MUSIC_PLAYBACK_VIEW);
1258 void CPlaybackView::OnActivated(int id, Evas_Object *obj, Elm_Object_Item *item)
1262 m_HandleGenlistItemActivated(obj, item);
1271 void CPlaybackView::OnComplete(void)
1273 m_UpdateCurrentSongInfo();
1277 void CPlaybackView::OnError(void)
1282 void CPlaybackView::OnUsbStatusChanged(SUsbStorageStatus status)
1287 void CPlaybackView::OnUpdateContent(void)
1292 void CPlaybackView::OnStartPlayback(void)
1294 m_UpdateCurrentSongInfo();
1298 void CPlaybackView::OnStopPlayback(void)
1303 void CPlaybackView::OnEmptyPlaylist(void)
1305 eina_list_free(m->elInfo);
1307 elm_genlist_clear(m->eoPlaylist);
1308 m_UpdateEmptySongInfo();
1312 void CPlaybackView::OnPlayerModeChanged(EPlayerMode mode)
1315 case MODE_PLAYLIST_EDIT:
1316 m_FromPlaybackToEditMode();
1320 m_FromEditToPlaybackMode();
1324 ASSERT(!"Invalid Player Mode");
1330 void CPlaybackView::OnEditButtonsPressed(EPlayerEditBtns editBtns)
1333 case EDIT_BTN_CANCEL:
1334 m_DisableCheckAll(m->elInfo);
1335 m_DisableEditButtons(true);
1338 case EDIT_BTN_DESELECT:
1339 m_DisableCheckAll(m->elInfo);
1340 m_DisableEditButtons(true);
1341 elm_genlist_realized_items_update(m->eoPlaylist);
1344 case EDIT_BTN_DELETE:
1345 m_DeleteSelectedItems();
1349 ASSERT(!"Invalid Edit Button");