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"
34 #include "AlbumCover.h"
35 #include "SongTitleLabel.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 CAlbumCover *pAlbumCover;
69 CSliderWidget *pSliderWidget;
70 CSongTitleLabel *pSongTitleLabel;
73 CMusicController *pController; //! NOT NULL
77 SContentInfo *ctxtinfo;
79 CHandleVolume *pHandleVolume;
84 memset(this, 0, sizeof(SPlaybackView));
89 void CPlaybackView::sm_CbCtxtUpdate(void *dt, enum EActionType type, int lid)
91 CPlaybackView *root = (CPlaybackView *)dt;
93 root->m_OnCtxtUpdate(type, lid);
97 void CPlaybackView::m_OnCtxtUpdate(EActionType type, int lid)
99 SItemInfo *itinfo = NULL;
100 Elm_Object_Item *focusedItem = NULL;
102 if (!m->ctxtinfo || !m->ctxtinfo->context)
105 itinfo = m_FindItemInfoFromSong(m->elInfo,
106 (CSongInfo *)m->ctxtinfo->context);
108 _ERR(" Unable to find song in the list ");
112 if (type == ACTION_TYPE_DELETE) {
113 itinfo->check_status = true;
114 m_DeleteSelectedItems();
116 if (!m->mgr->PopView()) {
117 _ERR("CViewMgr::PopView failed");
122 memset(&parcel, 0, sizeof(SParcel));
123 parcel.updateType = E_PLAYLIST_UPDATE;
126 focusedItem = m->cs_itinfo->item;
128 else { // ACTION_TYPE_PLAY
129 if (m->ctxtinfo->status == PLAY_STATUS_PLAY)
132 if (itinfo == m->cs_itinfo)
135 m_HandleGenlistItemActivated(m->eoPlaylist, itinfo->item);
138 if (!m->mgr->PopView()) {
139 _ERR("CViewMgr::PopView failed");
143 focusedItem = m->focused_item;
146 if (!CViewMgr::GetInstance()->HideView(MUSIC_BASE_VIEW))
147 _ERR("CViewMgr::HideView failed");
152 elm_genlist_item_show(focusedItem, ELM_GENLIST_ITEM_SCROLLTO_IN);
153 elm_object_item_focus_set(focusedItem, EINA_TRUE);
158 void CPlaybackView::sm_CbCtxtClose(void *dt)
160 CPlaybackView *root = (CPlaybackView *)dt;
162 root->m_OnCtxtClose();
166 void CPlaybackView::m_OnCtxtClose(void)
168 if (!m->mgr->PopView()) {
169 _ERR("CViewMgr::PopView failed");
173 elm_object_item_focus_set(m->focused_item, EINA_TRUE);
177 int CPlaybackView::sm_CbCurrentSongCount(void *cookie)
179 CPlaybackView *root = (CPlaybackView *)cookie;
182 ret = root->m_CbCurrentSongCount();
188 int CPlaybackView::m_CbCurrentSongCount(void)
190 return eina_list_count(m->elInfo);
194 void CPlaybackView::m_ChangeEditmodeAll(Eina_List *list, bool flag)
196 SItemInfo *itinfo = NULL;
200 EINA_LIST_FOREACH(list, l, obj) {
201 itinfo = (SItemInfo *)obj;
202 itinfo->edit_mode = flag;
207 void CPlaybackView::m_DisableCheckAll(Eina_List *list)
209 SItemInfo *itinfo = NULL;
213 EINA_LIST_FOREACH(list, l, obj) {
214 itinfo = (SItemInfo *)obj;
215 itinfo->check_status = false;
218 m->numCheckedItem = 0;
222 void CPlaybackView::m_SelectItem(SItemInfo *pItemInfo)
224 if (!pItemInfo || !pItemInfo->item)
227 elm_genlist_item_bring_in(pItemInfo->item, ELM_GENLIST_ITEM_SCROLLTO_IN);
228 elm_object_item_signal_emit(pItemInfo->item, MUSIC_SIGNAL_SELECT_ITEM, MUSIC_PLAYBACK_VIEW);
230 pItemInfo->select_status = true;
234 void CPlaybackView::m_UnselectItem(SItemInfo *pItemInfo)
236 if (!pItemInfo || !pItemInfo->item)
239 elm_object_item_signal_emit(pItemInfo->item, MUSIC_SIGNAL_UNSELECT_ITEM,
240 MUSIC_PLAYBACK_VIEW);
242 pItemInfo->select_status = false;
246 void CPlaybackView::m_UpdateEmptySongInfo(void)
248 m->pController->SetPlayState(PLAY_STATUS_INITIAL);
252 void CPlaybackView::m_UpdateCtxtView(int playStatus)
254 if (!m->cs_itinfo || !m->ctxtinfo)
257 if (!m->mgr->CheckTop(MUSIC_CONTEXT_VIEW))
260 if (m->cs_itinfo->sinfo == m->ctxtinfo->context) {
261 m->ctxtinfo->status = (EPlayStatus)playStatus;
264 memset(&parcel, 0, sizeof(SParcel));
265 parcel.updateType = E_SONG_UPDATE;
266 m->mgr->UpdateView((const char *)MUSIC_CONTEXT_VIEW, &parcel);
271 void CPlaybackView::m_UpdateCurrentSongItem(int index)
273 SItemInfo *pItemInfo = NULL;
276 m_UnselectItem(m->cs_itinfo);
277 m_UpdateCtxtView(PLAY_STATUS_PAUSE);
280 pItemInfo = (SItemInfo *)eina_list_nth(m->elInfo, index);
283 m->cs_itinfo = pItemInfo;
284 if (m->pController->PlayState() == PLAY_STATUS_STOP) {
285 elm_genlist_item_bring_in(pItemInfo->item,
286 ELM_GENLIST_ITEM_SCROLLTO_IN);
289 m_SelectItem(pItemInfo);
290 m_UpdateCtxtView(PLAY_STATUS_PLAY);
296 void CPlaybackView::m_UpdateEditmodeFocusSequence(void)
298 elm_object_focus_next_object_set(m->eoPlaylist, m->eoBtnEdit[EDIT_BTN_CANCEL], ELM_FOCUS_LEFT);
299 elm_object_focus_next_object_set(m->eoBtnEdit[EDIT_BTN_CANCEL], m->eoPlaylist, ELM_FOCUS_RIGHT);
300 elm_object_focus_next_object_set(m->pSliderWidget->Base(), m->eoBtnEdit[EDIT_BTN_CANCEL], ELM_FOCUS_DOWN);
304 void CPlaybackView::m_UpdatePlaymodeFocusSequence(void)
306 switch (m->pController->PlayState()) {
307 case PLAY_STATUS_INITIAL:
311 case PLAY_STATUS_STOP:
312 elm_object_focus_next_object_set(m->eoPlaylist, m->eoBtnControl[CTRL_BTN_PLAY], ELM_FOCUS_LEFT);
313 elm_object_focus_next_object_set(m->eoBtnControl[CTRL_BTN_PLAY], m->eoPlaylist, ELM_FOCUS_RIGHT);
314 elm_object_focus_next_object_set(m->eoBtnControl[CTRL_BTN_PLAY], m->eoBtnControl[CTRL_BTN_REPEAT], ELM_FOCUS_LEFT);
315 elm_object_focus_next_object_set(m->eoBtnControl[CTRL_BTN_REPEAT], m->eoBtnControl[CTRL_BTN_PLAY], ELM_FOCUS_RIGHT);
316 elm_object_signal_emit(m->eoBtnControl[CTRL_BTN_PLAY], MUSIC_SIGNAL_PAUSE, MUSIC_PLAYBACK_VIEW);
319 case PLAY_STATUS_PLAY:
320 case PLAY_STATUS_PAUSE:
321 elm_object_focus_next_object_set(m->eoPlaylist,
322 m->eoBtnControl[CTRL_BTN_FORWARD], ELM_FOCUS_LEFT);
323 elm_object_focus_next_object_set(m->eoBtnControl[CTRL_BTN_FORWARD],
324 m->eoPlaylist, ELM_FOCUS_RIGHT);
325 elm_object_focus_next_object_set(m->eoBtnControl[CTRL_BTN_PLAY],
326 m->eoBtnControl[CTRL_BTN_FORWARD], ELM_FOCUS_RIGHT);
327 elm_object_focus_next_object_set(m->eoBtnControl[CTRL_BTN_PLAY],
328 m->eoBtnControl[CTRL_BTN_REWIND], ELM_FOCUS_LEFT);
329 elm_object_focus_next_object_set(m->eoBtnControl[CTRL_BTN_REPEAT],
330 m->eoBtnControl[CTRL_BTN_REWIND], ELM_FOCUS_RIGHT);
334 ASSERT(!"Invalid State");
340 void CPlaybackView::m_UpdateCurrentSongInfo(void)
342 CSongInfo *sinfo = NULL;
345 if (eina_list_count(m->elInfo) == 0) {
346 m->pController->EmptyPlaylist();
350 if (!m->pController->GetCurrentSongIndex(&index)) {
351 _ERR(" music get current song index failed ");
355 if (!m->pController->GetSonginfoFromIndex(index, &sinfo)) {
356 _ERR(" music get songinfo failed ");
361 m_UpdateCurrentSongItem(index);
362 m->pController->UpdatePlayerUI();
363 m_UpdatePlaymodeFocusSequence();
367 void CPlaybackView::m_DisableEditButtons(bool flag)
369 /* flag - 1 means disable edit buttons and 0 means enable */
371 elm_object_focus_set(m->eoBtnEdit[EDIT_BTN_CANCEL], EINA_TRUE);
373 elm_object_disabled_set(m->eoBtnEdit[EDIT_BTN_DELETE], (Eina_Bool)flag);
374 elm_object_disabled_set(m->eoBtnEdit[EDIT_BTN_DESELECT], (Eina_Bool)flag);
376 m_UpdateEditmodeFocusSequence();
377 elm_object_focus_set(m->eoBtnEdit[EDIT_BTN_CANCEL], EINA_TRUE);
380 elm_object_focus_next_object_set(m->eoBtnEdit[EDIT_BTN_CANCEL], m->eoBtnEdit[EDIT_BTN_DESELECT], ELM_FOCUS_RIGHT);
381 elm_object_focus_next_object_set(m->eoBtnEdit[EDIT_BTN_DELETE], m->eoPlaylist, ELM_FOCUS_RIGHT);
382 elm_object_focus_next_object_set(m->eoPlaylist, m->eoBtnEdit[EDIT_BTN_DELETE], ELM_FOCUS_LEFT);
387 void CPlaybackView::m_FromEditToPlaybackMode(void)
389 if (m->pController->PlayState() == PLAY_STATUS_STOP) {
390 elm_genlist_item_bring_in(m->cs_itinfo->item,
391 ELM_GENLIST_ITEM_SCROLLTO_IN);
394 m_SelectItem(m->cs_itinfo);
396 elm_object_signal_emit(m->eoBase, MUSIC_SIGNAL_PLAYBACK_MODE,
397 MUSIC_PLAYBACK_VIEW);
398 elm_object_focus_set(m->eoBtnControl[CTRL_BTN_SETTINGS], EINA_TRUE);
400 m_ChangeEditmodeAll(m->elInfo, false);
402 elm_genlist_realized_items_update(m->eoPlaylist);
404 m_UpdatePlaymodeFocusSequence();
408 void CPlaybackView::m_FromPlaybackToEditMode(void)
410 elm_object_signal_emit(m->eoBase, MUSIC_SIGNAL_EDIT_MODE,
411 MUSIC_PLAYBACK_VIEW);
413 m_DisableEditButtons(true);
415 elm_object_focus_set(m->eoBtnEdit[EDIT_BTN_CANCEL], EINA_TRUE);
417 m_ChangeEditmodeAll(m->elInfo, true);
419 elm_genlist_realized_items_update(m->eoPlaylist);
421 m_UpdateEditmodeFocusSequence();
425 void CPlaybackView::m_DeleteSelectedItems(void)
427 Eina_List *l = NULL, *l_next = NULL;
428 SItemInfo *pItemInfo = NULL;
430 bool updateFlag = false;
433 m_DisableEditButtons(true);
434 m->numCheckedItem = 0;
435 EINA_LIST_FOREACH_SAFE(m->elInfo, l, l_next, obj) {
436 pItemInfo = (SItemInfo *)obj;
437 if (pItemInfo->check_status) {
438 if (m->cs_itinfo == pItemInfo) {
440 m_UnselectItem(m->cs_itinfo);
442 m->pController->SetPlayState(PLAY_STATUS_STOP);
443 m->pController->Stop();
445 index = elm_genlist_item_index_get(pItemInfo->item);
446 m->pController->RemoveSong(pItemInfo->sinfo, index);
448 m->elInfo = eina_list_remove(m->elInfo, pItemInfo);
449 elm_object_item_del(pItemInfo->item);
453 if (eina_list_count(m->elInfo) == 0) {
454 m->pController->EmptyPlaylist();
455 elm_genlist_realized_items_update(m->eoPlaylist);
456 elm_object_focus_set(m->eoBtnEdit[EDIT_BTN_CANCEL], EINA_TRUE);
461 m_UpdateCurrentSongInfo();
463 elm_genlist_realized_items_update(m->eoPlaylist);
464 elm_object_focus_set(m->eoBtnEdit[EDIT_BTN_CANCEL], EINA_TRUE);
468 void CPlaybackView::m_KeyBackPress(void)
472 if (!CViewMgr::GetInstance()->ShowView(MUSIC_BASE_VIEW))
473 _ERR("CViewMgr::ShowView failed");
475 if (CViewMgr::GetInstance()->CheckTop(MUSIC_CONTEXT_VIEW)) {
476 if (!CViewMgr::GetInstance()->UpdateView(MUSIC_CONTEXT_VIEW, NULL))
477 _ERR("CViewMgr::UpdateView failed");
479 if (!CViewMgr::GetInstance()->ShowView(MUSIC_CONTEXT_VIEW))
480 _ERR("CViewMgr::ShowView failed");
485 void CPlaybackView::m_KeyExitPress(void)
487 m->pController->Stop();
492 void CPlaybackView::m_KeyPlayPress(void)
496 if (elm_object_disabled_get(m->eoBtnControl[CTRL_BTN_PLAY]))
499 state = m->pController->PlayState();
500 if (state == PLAY_STATUS_PAUSE) {
501 m->pController->Resume();
502 elm_object_signal_emit(m->eoBtnControl[CTRL_BTN_PLAY],
503 MUSIC_SIGNAL_PLAY, MUSIC_PLAYBACK_VIEW);
505 else if (state != PLAY_STATUS_PLAY) {
506 m->pController->Start();
511 void CPlaybackView::m_KeyPausePress(void)
515 if (elm_object_disabled_get(m->eoBtnControl[CTRL_BTN_PLAY]))
518 state = m->pController->PlayState();
519 if (state == PLAY_STATUS_PLAY) {
520 elm_object_signal_emit(m->eoBtnControl[CTRL_BTN_PLAY],
521 MUSIC_SIGNAL_PAUSE, MUSIC_PLAYBACK_VIEW);
522 m->pController->Pause();
527 void CPlaybackView::m_KeyNextPress(void)
529 if (elm_object_disabled_get(m->eoBtnControl[CTRL_BTN_FORWARD]))
532 m->pController->HandleRemoteButtons(m->eoBtnControl[CTRL_BTN_FORWARD], EVENT_PRESSED);
536 void CPlaybackView::m_KeyPreviousPress(void)
538 if (elm_object_disabled_get(m->eoBtnControl[CTRL_BTN_REWIND]))
541 m->pController->HandleRemoteButtons(m->eoBtnControl[CTRL_BTN_REWIND], EVENT_PRESSED);
545 void CPlaybackView::m_KeyNextUnpress(void)
547 if (elm_object_disabled_get(m->eoBtnControl[CTRL_BTN_FORWARD]))
550 m->pController->HandleRemoteButtons(m->eoBtnControl[CTRL_BTN_FORWARD], EVENT_UNPRESSED);
554 void CPlaybackView::m_KeyPreviousUnpress(void)
556 if (elm_object_disabled_get(m->eoBtnControl[CTRL_BTN_REWIND]))
559 m->pController->HandleRemoteButtons(m->eoBtnControl[CTRL_BTN_REWIND], EVENT_UNPRESSED);
563 void CPlaybackView::m_HandleKeyPress(ESKey skey)
587 m_KeyPreviousPress();
591 m->pHandleVolume->Up();
594 case SKEY_VOLUME_DOWN:
595 m->pHandleVolume->Down();
599 m->pHandleVolume->Mute();
608 void CPlaybackView::m_HandleKeyUnpress(ESKey skey)
612 m_KeyPreviousUnpress();
625 void CPlaybackView::m_AddCurrentSonginfo(void)
627 m->pSongTitleLabel = new CSongTitleLabel;
628 m->pSongTitleLabel->Create(m->eoBase);
630 m->pAlbumCover = new CAlbumCover;
631 m->pAlbumCover->Create(m->eoBase);
633 m->pSliderWidget = new CSliderWidget;
634 m->pSliderWidget->Create(m->eoBase);
638 SItemInfo *CPlaybackView::m_FindItemInfoFromSong(Eina_List *list, CSongInfo *sinfo)
641 SItemInfo *itinfo = NULL;
644 EINA_LIST_FOREACH(list, l, obj) {
645 itinfo = (SItemInfo *)obj;
646 if (itinfo->sinfo == sinfo)
654 SItemInfo *CPlaybackView::m_FindItemInfoFromItem(Eina_List *list, Elm_Object_Item *item)
657 SItemInfo *itinfo = NULL;
660 EINA_LIST_FOREACH(list, l, obj) {
661 itinfo = (SItemInfo *)obj;
662 if (itinfo->item == item)
670 void CPlaybackView::m_UpdateItemCheck(SItemInfo *itinfo)
673 _ERR(" No item info to Update check ");
677 if (itinfo->check_status) {
678 elm_object_item_signal_emit(itinfo->item,
679 MUSIC_SIGNAL_CHECK_OFF, MUSIC_PLAYBACK_VIEW);
680 itinfo->check_status = false;
684 elm_object_item_signal_emit(itinfo->item,
685 MUSIC_SIGNAL_CHECK_ON, MUSIC_PLAYBACK_VIEW);
686 itinfo->check_status = true;
692 class CElmGenlistItemClass {
694 static char *sm_CbTextGet(void *data, Evas_Object *obj, const char *part)
696 CSongInfo *sinfo = NULL;
697 SItemInfo *pItemInfo = (SItemInfo *)data;
698 char buf[MAX_LENGTH];
699 char *timestr = NULL;
703 if (!pItemInfo || !obj)
706 sinfo = pItemInfo->sinfo;
708 snprintf(buf, sizeof(buf), "%s", MUSIC_STR_EMPTY);
710 if (!strcmp(part, "elm.text0")) {
711 index = elm_genlist_item_index_get(pItemInfo->item);
712 snprintf(buf, sizeof(buf), "%d", index);
714 else if (!strcmp(part, "elm.text1"))
715 snprintf(buf, sizeof(buf), "%s", sinfo->Name());
716 else if (!strcmp(part, "elm.text2"))
717 snprintf(buf, sizeof(buf), "%s - %s",
720 else if (!strcmp(part, "elm.text3")) {
721 duration = sinfo->Duration();
722 timestr = CCommonUI::TimeStrFromMilSeconds(duration);
724 snprintf(buf, sizeof(buf), "%s", timestr);
729 if (strcmp(buf, MUSIC_STR_EMPTY))
734 static Evas_Object *sm_CbContentGet(void *data, Evas_Object *obj, const char *part)
736 CSongInfo *sinfo = NULL;
737 SItemInfo *pItemInfo = (SItemInfo *)data;
738 Evas_Object *img = NULL;
740 char buf[MAX_LENGTH];
742 if (!pItemInfo || !obj)
745 sinfo = pItemInfo->sinfo;
747 img = elm_image_add(obj);
751 elm_image_aspect_fixed_set(img, EINA_FALSE);
753 if (!strcmp(part, "elm.swallow.icon")) {
754 path = sinfo->ThumbnailPath();
756 elm_image_file_set(img, path, "NULL");
758 snprintf(buf, sizeof(buf), "%s/%s", IMAGEDIR,
759 MUSIC_IMAGE_DEFAULT_THUMB_126);
760 elm_image_file_set(img, buf, "NULL");
767 static void sm_CbDel(void *data, Evas_Object *obj)
774 Elm_Genlist_Item_Class *CPlaybackView::m_GetItemClass(void)
776 Elm_Genlist_Item_Class *list_item = NULL;
778 list_item = elm_genlist_item_class_new();
780 _ERR(" elm_genlist_item_class_new failed ");
784 list_item->item_style = MUSIC_STYLE_PLAYLIST;
785 list_item->func.text_get = CElmGenlistItemClass::sm_CbTextGet;
786 list_item->func.content_get = CElmGenlistItemClass::sm_CbContentGet;
787 list_item->func.state_get = NULL;
788 list_item->func.del = CElmGenlistItemClass::sm_CbDel;
794 void CPlaybackView::m_AddGenlist(void)
796 Evas_Object *genlist = NULL;
797 Evas_Object *eoBase = NULL;
800 genlist = elm_genlist_add(eoBase);
804 elm_genlist_homogeneous_set(genlist, EINA_TRUE);
805 evas_object_size_hint_weight_set(genlist,
806 EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
807 elm_object_part_content_set(eoBase, MUSIC_PART_PLAYLIST, genlist);
808 elm_genlist_select_mode_set(genlist, ELM_OBJECT_SELECT_MODE_ALWAYS);
809 elm_genlist_multi_select_set(genlist, EINA_FALSE);
811 Connect(genlist, EO_PLAYLIST, TYPE_REALIZED | TYPE_MOUSE_MOVE |
812 TYPE_KEY_DOWN | TYPE_ACTIVATED);
814 evas_object_show(genlist);
815 m->eoPlaylist = genlist;
819 void CPlaybackView::m_AddPlaylist(void)
821 Elm_Genlist_Item_Class *list_item = NULL;
824 CSongInfo *sinfo = NULL;
825 Elm_Object_Item *item = NULL;
826 SItemInfo *pItemInfo = NULL;
832 list_item = m_GetItemClass();
834 evas_object_del(m->eoPlaylist);
838 if (!m->pController->GetTotalSongs(&ts)) {
839 _ERR(" music get total songs failed ");
843 if (!m->pController->GetCurrentSongIndex(&index))
844 _ERR(" music get current song index failed ");
846 for (i = 0; i < ts; i++) {
847 if (!m->pController->GetSonginfoFromIndex(i, &sinfo)) {
848 _ERR(" music get songinfo failed ");
851 pItemInfo = (SItemInfo *)calloc(1, sizeof(*pItemInfo));
854 pItemInfo->sinfo = sinfo;
855 pItemInfo->edit_mode = false;
856 pItemInfo->check_status = false;
857 pItemInfo->select_status = false;
859 // event handling will be done in OnActivated function
860 item = elm_genlist_item_append(m->eoPlaylist, list_item,
861 pItemInfo, NULL, ELM_GENLIST_ITEM_NONE,
863 pItemInfo->item = item;
866 pItemInfo->select_status = true;
867 m->cs_itinfo = pItemInfo;
869 m->elInfo = eina_list_append(m->elInfo, pItemInfo);
871 m->numCheckedItem = 0;
875 void CPlaybackView::m_RemovePlaylist(void)
878 elm_genlist_clear(m->eoPlaylist);
879 m->eoPlaylist = NULL;
883 eina_list_free(m->elInfo);
889 void CPlaybackView::m_HandleGenlistItemActivated(Evas_Object *obj, Elm_Object_Item *genListItem)
892 SItemInfo *itinfo = NULL;
894 if (!obj || !genListItem)
897 itinfo = m_FindItemInfoFromItem(m->elInfo, genListItem);
899 _ERR(" no item info found ");
903 if (itinfo->edit_mode) {
904 m_UpdateItemCheck(itinfo);
905 if (m->numCheckedItem > 0)
906 m_DisableEditButtons(false);
908 m_DisableEditButtons(true);
912 index = elm_genlist_item_index_get(genListItem);
914 m->pController->PlayIndexSong(--index);
918 bool CPlaybackView::Create(void *data)
922 CPlaybackController::SCallback cb;
925 _CHECK(m = new SPlaybackView)
926 _CHECK(m->mgr = CViewMgr::GetInstance())
927 _CHECK(m->eoWin = m->mgr->Window())
928 _CHECK(m->pController = new CMusicController)
929 _CHECK(m->pController->Create())
930 _CHECK(m->eoBase = CCommonUI::AddBase(m->eoWin, MUSIC_PLAYBACK_VIEW))
931 _CHECK(CBaseView::Create(NULL))
932 _CHECK(CTimer::Create());
933 _CHECK(m->pController->AddListener(this))
934 _CHECK(m->pPlaybackController = new CPlaybackController)
935 _COMMAND{ cb.cookie = this; cb.OnCurrentSongCount = sm_CbCurrentSongCount; }
936 _CHECK(m->pPlaybackController->Create(m->eoBase, &cb))
939 evas_object_data_set(m->eoBase, PLAYBACK_VIEW_DATA, m);
941 m_AddCurrentSonginfo();
945 for (i = 0; i < TOTAL_CONTROL_BTNS; i++)
946 m->eoBtnControl[i] = m->pPlaybackController->ControlBtnsObject((EPlayerControlBtns)i);
948 for (i = 0; i < TOTAL_EDIT_BTNS; i++)
949 m->eoBtnEdit[i] = m->pPlaybackController->EditBtnsObject((EPlayerEditBtns)i);
951 m->pHandleVolume = new CHandleVolume;
952 m->pHandleVolume->Create(m->eoBase);
954 m_UpdatePlaymodeFocusSequence();
956 Connect(m->eoBase, EO_BASE, TYPE_KEY_DOWN | TYPE_KEY_UP);
959 _CHECK_FAIL{ m->pPlaybackController->Destroy(); }
960 _CHECK_FAIL{ delete m->pPlaybackController; }
961 _CHECK_FAIL{ m->pController->RemoveListener(this); }
962 _CHECK_FAIL{ CTimer::Destroy(); }
963 _CHECK_FAIL{ CBaseView::Destroy(); }
964 _CHECK_FAIL{ evas_object_del(m->eoBase); }
965 _CHECK_FAIL{ m->pController->Destroy(); }
966 _CHECK_FAIL{ delete m->pController; }
967 _CHECK_FAIL{ /* mgr->Window() */ }
968 _CHECK_FAIL{ /* CViewerMgr::GetInstance() */}
969 _CHECK_FAIL{ delete m; m = NULL; }
970 }_CREATE_END_AND_CATCH{ return false; }
976 void CPlaybackView::Destroy(void)
980 Disconnect(m->eoBase);
982 m->pPlaybackController->Destroy();
983 delete m->pPlaybackController;
985 m->pController->RemoveListener(this);
987 m->pSliderWidget->Destroy();
988 delete m->pSliderWidget;
990 m->pAlbumCover->Destroy();
991 delete m->pAlbumCover;
993 m->pSongTitleLabel->Destroy();
994 delete m->pSongTitleLabel;
996 m->pHandleVolume->Destroy();
997 delete m->pHandleVolume;
998 CBaseView::Destroy();
999 evas_object_del(m->eoBase);
1007 Evas_Object* CPlaybackView::Base(void)
1015 void CPlaybackView::t_OnShow(void)
1021 m_UpdateCurrentSongInfo();
1023 state = m->pController->PlayState();
1024 if (state == PLAY_STATUS_INITIAL || state == PLAY_STATUS_STOP) {
1027 m->pController->Start();
1031 elm_genlist_item_show(m->cs_itinfo->item, ELM_GENLIST_ITEM_SCROLLTO_IN);
1032 elm_object_item_focus_set(m->cs_itinfo->item, EINA_TRUE);
1035 evas_object_show(m->eoBase);
1039 void CPlaybackView::t_OnUpdate(void *data)
1043 SParcel *parcel = (SParcel *)data;
1045 ESKey keyEvent = SKEY_MAX;
1048 updateType = E_PLAYLIST_UPDATE;
1050 updateType = parcel->updateType;
1051 keyEvent = parcel->keyEvent;
1054 switch (updateType) {
1055 case E_PLAYLIST_UPDATE:
1058 elm_object_disabled_set(m->eoBtnControl[CTRL_BTN_FORWARD], EINA_FALSE);
1059 elm_object_disabled_set(m->eoBtnControl[CTRL_BTN_REWIND], EINA_FALSE);
1060 elm_object_disabled_set(m->eoBtnControl[CTRL_BTN_PLAY], EINA_FALSE);
1061 elm_object_focus_next_object_set(m->eoBtnControl[CTRL_BTN_REPEAT],
1062 m->eoBtnControl[CTRL_BTN_REWIND], ELM_FOCUS_RIGHT);
1063 m_FromEditToPlaybackMode();
1067 m_HandleKeyPress(keyEvent);
1071 m_HandleKeyUnpress(keyEvent);
1080 void CPlaybackView::t_OnTimer(int id)
1085 void CPlaybackView::t_OnHide(void)
1089 evas_object_hide(m->eoBase);
1093 void CPlaybackView::OnSKeyDown(int id, Evas *e, Evas_Object *obj, Evas_Event_SKey_Down *ev)
1097 m_HandleKeyPress(ev->skey);
1102 Elm_Object_Item *it = NULL;
1103 it = elm_object_focused_item_get(obj);
1105 _ERR(" unable to get focused item ");
1108 m->focused_item = it;
1113 SContentInfo *ctxtinfo = NULL;
1114 SItemInfo *itinfo = NULL;
1122 ctxtinfo = (SContentInfo *)calloc(1, sizeof(*ctxtinfo));
1126 itinfo = m_FindItemInfoFromItem(m->elInfo, it);
1132 if (m->pController->PlayState() == PLAY_STATUS_PLAY &&
1133 itinfo == m->cs_itinfo)
1134 ctxtinfo->status = PLAY_STATUS_PLAY;
1136 ctxtinfo->status = PLAY_STATUS_PAUSE;
1138 ctxtinfo->cbdata = this;
1139 ctxtinfo->update = sm_CbCtxtUpdate;
1140 ctxtinfo->close = sm_CbCtxtClose;
1141 ctxtinfo->type = CONTEXT_TYPE_PLAYSONG;
1142 ctxtinfo->context = itinfo->sinfo;
1144 m->ctxtinfo = ctxtinfo;
1146 memset(&parcel, 0, sizeof(SParcel));
1147 parcel.ctxtInfo = ctxtinfo;
1148 if (!m->mgr->PushView(MUSIC_CONTEXT_VIEW, &parcel))
1149 _ERR("viewmgr push view MUSIC_CONTEXT_VIEW failed");
1165 void CPlaybackView::OnSKeyUp(int id, Evas *e, Evas_Object *obj, Evas_Event_SKey_Up *ev)
1169 m_HandleKeyUnpress(ev->skey);
1178 void CPlaybackView::OnMouseMove(int id, Evas *e, Evas_Object *obj, Evas_Event_Mouse_Move *ev)
1183 Elm_Object_Item *item;
1185 item = elm_genlist_at_xy_item_get(obj, ev->cur.canvas.x,
1186 ev->cur.canvas.y, NULL);
1190 if (!elm_object_item_focus_get(item))
1191 elm_object_item_focus_set(item, EINA_TRUE);
1201 void CPlaybackView::OnRealized(int id, Evas_Object *obj, Elm_Object_Item *item)
1206 int index = elm_genlist_item_index_get(item);
1207 if ((index & 1) == 1)
1208 elm_object_item_signal_emit(item,
1209 MUSIC_SIGNAL_EVEN_ROW, MUSIC_PLAYBACK_VIEW);
1211 elm_object_item_signal_emit(item,
1212 MUSIC_SIGNAL_ODD_ROW, MUSIC_PLAYBACK_VIEW);
1214 SItemInfo *itInfo = m_FindItemInfoFromItem(m->elInfo, item);
1215 if (itInfo->select_status)
1216 elm_object_item_signal_emit(item,
1217 MUSIC_SIGNAL_SELECT_ITEM, MUSIC_PLAYBACK_VIEW);
1219 elm_object_item_signal_emit(item,
1220 MUSIC_SIGNAL_UNSELECT_ITEM, MUSIC_PLAYBACK_VIEW);
1222 if (itInfo->edit_mode) {
1223 elm_object_item_signal_emit(item,
1224 MUSIC_SIGNAL_EDITMODE_ON, MUSIC_PLAYBACK_VIEW);
1225 if (itInfo->check_status) {
1226 elm_object_item_signal_emit(item,
1227 MUSIC_SIGNAL_CHECK_ON, MUSIC_PLAYBACK_VIEW);
1230 elm_object_item_signal_emit(item,
1231 MUSIC_SIGNAL_CHECK_OFF, MUSIC_PLAYBACK_VIEW);
1234 elm_object_item_signal_emit(item,
1235 MUSIC_SIGNAL_EDITMODE_OFF, MUSIC_PLAYBACK_VIEW);
1245 void CPlaybackView::OnActivated(int id, Evas_Object *obj, Elm_Object_Item *item)
1249 m_HandleGenlistItemActivated(obj, item);
1258 void CPlaybackView::OnComplete(void)
1260 m_UpdateCurrentSongInfo();
1264 void CPlaybackView::OnError(void)
1269 void CPlaybackView::OnUsbStatusChanged(SUsbStorageStatus status)
1274 void CPlaybackView::OnUpdateContent(void)
1279 void CPlaybackView::OnStartPlayback(void)
1281 m_UpdateCurrentSongInfo();
1285 void CPlaybackView::OnStopPlayback(void)
1290 void CPlaybackView::OnEmptyPlaylist(void)
1292 eina_list_free(m->elInfo);
1294 elm_genlist_clear(m->eoPlaylist);
1295 m_UpdateEmptySongInfo();
1299 void CPlaybackView::OnPlayerModeChanged(EPlayerMode mode)
1302 case MODE_PLAYLIST_EDIT:
1303 m_FromPlaybackToEditMode();
1307 m_FromEditToPlaybackMode();
1311 ASSERT(!"Invalid Player Mode");
1317 void CPlaybackView::OnEditButtonsPressed(EPlayerEditBtns editBtns)
1320 case EDIT_BTN_CANCEL:
1321 m_DisableCheckAll(m->elInfo);
1322 m_DisableEditButtons(true);
1325 case EDIT_BTN_DESELECT:
1326 m_DisableCheckAll(m->elInfo);
1327 m_DisableEditButtons(true);
1328 elm_genlist_realized_items_update(m->eoPlaylist);
1331 case EDIT_BTN_DELETE:
1332 m_DeleteSelectedItems();
1336 ASSERT(!"Invalid Edit Button");