Refactoring of Playback View 06/38406/5
authorKim Tae Soo <taesoo46.kim@samsung.com>
Mon, 20 Apr 2015 12:26:58 +0000 (21:26 +0900)
committerKim Tae Soo <taesoo46.kim@samsung.com>
Mon, 20 Apr 2015 13:22:12 +0000 (22:22 +0900)
Change-Id: I38df5736e68767641328bef0e72090138b955c12
Signed-off-by: Kim Tae Soo <taesoo46.kim@samsung.com>
20 files changed:
CMakeLists.txt
include/Timer.h [new file with mode: 0644]
include/common.h
include/music-controller.h
include/playback-view.h
src/data/FolderStorage.cpp
src/data/SongStorage.cpp
src/playback/MusicControllerImpl.cpp
src/playback/MusicControllerImpl.h
src/playback/music-controller.cpp
src/playback/volume-control.cpp
src/views/ErrorPopupWindow.cpp [new file with mode: 0644]
src/views/ErrorPopupWindow.h [new file with mode: 0644]
src/views/PlaybackController.cpp [new file with mode: 0644]
src/views/PlaybackController.h [new file with mode: 0644]
src/views/RemovePopupWindow.cpp
src/views/SliderWidget.cpp [new file with mode: 0644]
src/views/SliderWidget.h [new file with mode: 0644]
src/views/Timer.cpp [new file with mode: 0644]
src/views/playback-view.cpp

index 2ce4e77..063b29a 100644 (file)
@@ -76,6 +76,10 @@ SET(SRCS src/main.cpp
         src/views/PlaySettingCtxPopup.cpp
         src/views/PlayListCtxPopup.cpp
         src/views/RemovePopupWindow.cpp
+        src/views/PlaybackController.cpp
+        src/views/SliderWidget.cpp
+        src/views/Timer.cpp
+        src/views/ErrorPopupWindow.cpp
         src/playback/playlist-mgr.cpp
         src/playback/music-controller.cpp
         src/playback/MusicControllerImpl.cpp
diff --git a/include/Timer.h b/include/Timer.h
new file mode 100644 (file)
index 0000000..262ffd1
--- /dev/null
@@ -0,0 +1,41 @@
+/*
+* Copyright (c) 2014 Samsung Electronics Co., Ltd All Rights Reserved
+*
+* Licensed under the Apache License, Version 2.0 (the License);
+* you may not use this file except in compliance with the License.
+* You may obtain a copy of the License at
+*
+* http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing, software
+* distributed under the License is distributed on an AS IS BASIS,
+* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+* See the License for the specific language governing permissions and
+* limitations under the License.
+*/
+
+#ifndef __TIMER_H__
+#define __TIMER_H__
+
+class CTimer {
+private:
+       struct STimer *m;
+
+private:
+       static Eina_Bool sm_CbTimer(void *data);
+
+protected:
+       virtual void t_OnTimer(int id);
+
+public:
+       CTimer() : m(0) {}
+       virtual ~CTimer() {}
+
+       bool Create(void);
+       virtual void Destroy(void);
+
+       bool SetTimer(int id, int ms);
+       void KillTimer(int id);
+};
+
+#endif // __TIMER_H__
\ No newline at end of file
index b0f77fa..7a6e5b3 100644 (file)
@@ -69,6 +69,31 @@ enum ERepeatStatus {
        REPEAT_STATUS_ONE
 };
 
+enum EPlayerMode {
+       MODE_PLAYBACK = 0,
+       MODE_PLAYLIST_EDIT
+};
+
+enum EPlayerControlBtns {
+       CTRL_BTN_SETTINGS,
+       CTRL_BTN_SHUFFLE,
+       CTRL_BTN_REPEAT,
+       CTRL_BTN_REWIND,
+       CTRL_BTN_PLAY,
+       CTRL_BTN_FORWARD
+};
+
+enum EPlayerEditBtns {
+       EDIT_BTN_CANCEL,
+       EDIT_BTN_DESELECT,
+       EDIT_BTN_DELETE
+};
+
+enum EPlayerBtnsEvent {
+       EVENT_PRESSED,
+       EVENT_UNPRESSED
+};
+
 enum update_type {
        E_KEY_PRESS,
        E_KEY_RELEASE,
index ff32a36..cdf36d0 100644 (file)
@@ -45,6 +45,14 @@ public:
        virtual void OnResumePlayback(void) {}
        //!
        virtual void OnPosition(int milsec) {}
+       //!
+       virtual void OnEmptyPlaylist(void) {}
+       //!
+       virtual void OnPlayerModeChanged(EPlayerMode mode) {}
+       //!
+       virtual void OnEditButtonsPressed(EPlayerEditBtns editBtns) {}
+       //!
+       virtual void OnRemoteButtonEvent(Evas_Object *eoBtn, EPlayerBtnsEvent ev) {}
 };
 
 
@@ -106,6 +114,10 @@ public:
 
        bool SetRepeatState(ERepeatStatus state);
        ERepeatStatus RepeatState(void);
+
+       void ChangePlayerMode(EPlayerMode mode);
+       void HandlePlaylistEditButtons(EPlayerEditBtns btnId);
+       void HandleRemoteButtons(Evas_Object *eoBtn, EPlayerBtnsEvent ev);
 };
 
 
index cdb7445..33985aa 100644 (file)
 #ifndef __PLAYBACK_VIEW_H__
 #define __PLAYBACK_VIEW_H__
 
-
+#include "Timer.h"
 #include "common.h"
 
 struct SItemInfo;
 
-class CSliderWidget : 
-       public CListenerMgr,
-       public IMusicControllerListener,
-       public IMouseMoveListener,
-       public IChangedListener {
-private:
-       struct SSliderWidget *m;
-
-private:
-       static Eina_Bool sm_CbUpdateSlider(void *dt);
-       Eina_Bool m_OnUpdateSlider(void);
-
-       bool m_AddSlider(void);
-       void m_RemoveTimer(void);
-
-       void m_UpdateSongInfo(void);
-
-public:
-       CSliderWidget() : 
-               IMouseMoveListener(this),
-               IChangedListener(this),
-               m(0) {}
-       virtual ~CSliderWidget() {}
-
-       bool Create(Evas_Object *eoParent);
-       virtual void Destroy(void);
-
-       Evas_Object* Base(void);
-
-       void Init(void);
-
-       //! This function is invoked when playback is complete.
-       virtual void OnComplete(void);
-       //! This function is invoked when new song is played.
-       virtual void OnStartPlayback(void);
-       //!
-       virtual void OnStopPlayback(void);
-       //! This function is invoked when playback is paused.
-       virtual void OnPausePlayback(void);
-       //! This function is invoked when playback is resumed.
-       virtual void OnResumePlayback(void);
-       //!
-       virtual void OnPosition(int milsec);
-
-       virtual void OnChanged(int id, Evas_Object *obj);
-       virtual void OnMouseMove(int id, Evas *e, Evas_Object *obj, Evas_Event_Mouse_Move *ev);
-};
-
-
-class CTimer {
-private:
-       struct STimer *m;
-
-private:
-       static Eina_Bool sm_CbTimer(void *data);
-
-protected:
-       virtual void t_OnTimer(int id);
-
-public:
-       CTimer() : m(0) {}
-       virtual ~CTimer() {}
-
-       bool Create(void);
-       virtual void Destroy(void);
-
-       bool SetTimer(int id, int ms);
-       void KillTimer(int id);
-};
-
-
 class CPlaybackView : public CBaseView,
-       public IMouseClickedListener,
        public IMouseMoveListener,
-       public IPressedListener,
-       public IUnpressedListener,
        public IRealizedListener,
        public IActivatedListener,
        public IMusicControllerListener,
@@ -118,8 +44,8 @@ private:
        static void sm_CbCtxtClose(void *dt);
        void m_OnCtxtClose(void);
 
-       static void sm_CbCtxPopupBtnSelected(void* cookie, CContextPopup* instance, const char* text);
-       void m_CbCtxPopupBtnSelected(CContextPopup* instance, const char* text);
+       static int sm_CbCurrentSongCount(void *cookie);
+       int m_CbCurrentSongCount(void);
 
 private:
        void m_HandleKeyPress(char *keyname);
@@ -135,15 +61,10 @@ private:
        void m_KeyNextUnpress(void);
        void m_KeyPreviousUnpress(void);
 
-       void m_RemoveTimer(int timer_code);
-       void m_PlaybackPause(void);
-       void m_PlaybackResume(void);
        void m_ChangeEditmodeAll(Eina_List *list, bool flag);
        void m_DisableCheckAll(Eina_List *list);
        void m_SelectItem(SItemInfo *it_info);
        void m_UnselectItem(SItemInfo *it_info);
-       void m_UpdateControlBtns(void);
-       void m_UpdateCurrentSongProgressbar(void);
        void m_UpdateCurrentSongThumbnail(void);
        void m_UpdateCurrentSongLabels(void);
        void m_UpdateEmptySongInfo(void);
@@ -153,49 +74,33 @@ private:
        void m_UpdatePlaymodeFocusSequence(void);
        void m_UpdateCurrentSongInfo(void);
        void m_DisableEditButtons(bool flag);
-       void m_CreateErrorPopup(void);
-       void m_DestroyErrorPopup(void);
-       void m_CreateSettingsPopup(void);
-       void m_DestroySettingsPopup(void);
        void m_FromEditToPlaybackMode(void);
        void m_FromPlaybackToEditMode(void);
-       void m_HandleOnRepeated(void);
        void m_DeleteSelectedItems(void);
 
        void m_AddAlbumCover(void);
        void m_AddCurrentSonginfo(void);
-       void m_AddEditPlaylistButtons(void);
-       void m_AddControlButtons(void);
-       struct SItemInfo *m_FindItemInfoFromSong(Eina_List *list, CSongInfo *sinfo);
-       struct SItemInfo *m_FindItemInfoFromItem(Eina_List *list, Elm_Object_Item *item);
+       SItemInfo *m_FindItemInfoFromSong(Eina_List *list, CSongInfo *sinfo);
+       SItemInfo *m_FindItemInfoFromItem(Eina_List *list, Elm_Object_Item *item);
        void m_UpdateItemCheck(SItemInfo *itinfo);
        Elm_Genlist_Item_Class *m_GetItemClass();
        void m_AddGenlist(void);
        void m_AddPlaylist(void);
        void m_RemovePlaylist(void);
-       void m_HandleRewindBtnClicked(Evas_Object *obj);
-       void m_HandleForwardBtnClicked(Evas_Object *obj);
-       void m_HandleOnPressed(Evas_Object *obj);
-       void m_HandleOnUnpressed(Evas_Object *obj);
        void m_HandleGenlistItemActivated(Evas_Object *obj, Elm_Object_Item *genListItem);
 
 protected:
-       // When button is clicked.
-       void t_OnClickedSettings(Evas_Object *obj);
-       void t_OnClickedShuffle(Evas_Object *obj);
-       void t_OnClickedRepeat(Evas_Object *obj);
-       void t_OnClickedPlay(Evas_Object *obj);
-
-protected:
        virtual void t_OnShow(void);
        virtual void t_OnHide(void);
        virtual void t_OnUpdate(void* data);
+       virtual void t_OnTimer(int id);
 
 public:
-       CPlaybackView(const char *pViewId) : CBaseView(pViewId), 
-               IMouseClickedListener(this), IMouseMoveListener(this),
-               IPressedListener(this), IUnpressedListener(this),
-               IRealizedListener(this), IActivatedListener(this),
+       CPlaybackView(const char *pViewId) :
+               CBaseView(pViewId), 
+               IMouseMoveListener(this),
+               IRealizedListener(this),
+               IActivatedListener(this),
                m(0) {}
        virtual ~CPlaybackView() {}
 
@@ -207,10 +112,7 @@ public:
        // Listener virtual function
        virtual void OnKeyDown(int id, Evas *e, Evas_Object *obj, Evas_Event_Key_Down *ev);
        virtual void OnKeyUp(int id, Evas *e, Evas_Object *obj, Evas_Event_Key_Up *ev);
-       virtual void OnMouseClicked(int id, Evas_Object *obj);
        virtual void OnMouseMove(int id, Evas *e, Evas_Object *obj, Evas_Event_Mouse_Move *ev);
-       virtual void OnPressed(int id, Evas_Object *obj);
-       virtual void OnUnpressed(int id, Evas_Object *obj);
        virtual void OnRealized(int id, Evas_Object *obj, Elm_Object_Item *item);
        virtual void OnActivated(int id, Evas_Object *obj, Elm_Object_Item *item);
 
@@ -220,6 +122,9 @@ public:
        virtual void OnUpdateContent(void);
        virtual void OnStartPlayback(void);
        virtual void OnStopPlayback(void);
+       virtual void OnEmptyPlaylist(void);
+       virtual void OnPlayerModeChanged(EPlayerMode mode);
+       virtual void OnEditButtonsPressed(EPlayerEditBtns editBtns);
 };
 
 
index dc47a70..e64264c 100644 (file)
@@ -15,7 +15,6 @@
  */
 
 
-#include <Eina.h>
 #include <media_content.h>
 #include <sys/time.h>
 #include <stdlib.h>
index aeeec0c..1565eb7 100644 (file)
@@ -14,8 +14,6 @@
  * limitations under the License.
  */
 
-
-#include <Eina.h>
 #include <media_content.h>
 #include <sys/time.h>
 #include <stdlib.h>
index 0108e9d..d8fd311 100644 (file)
@@ -532,6 +532,16 @@ bool CMusicControllerImpl::EmptyPlaylist(void)
 
        m->pPlaylist->Destroy();
 
+       Eina_List *l;
+       IMusicControllerListener *mcListener;
+       void * obj;
+
+       EINA_LIST_FOREACH(m->elListener, l, obj) {
+               mcListener = (IMusicControllerListener *)obj;
+               if (mcListener)
+                       mcListener->OnEmptyPlaylist();
+       }
+
        return true;
 }
 
@@ -767,6 +777,54 @@ ERepeatStatus CMusicControllerImpl::RepeatState(void)
 }
 
 
+void CMusicControllerImpl::ChangePlayerMode(EPlayerMode mode)
+{
+       ASSERT(m);
+
+       Eina_List *l;
+       IMusicControllerListener *mcListener;
+       void * obj;
+
+       EINA_LIST_FOREACH(m->elListener, l, obj) {
+               mcListener = (IMusicControllerListener *)obj;
+               if (mcListener)
+                       mcListener->OnPlayerModeChanged(mode);
+       }
+}
+
+
+void CMusicControllerImpl::HandlePlaylistEditButtons(EPlayerEditBtns btnId)
+{
+       ASSERT(m);
+
+       Eina_List *l;
+       IMusicControllerListener *mcListener;
+       void * obj;
+
+       EINA_LIST_FOREACH(m->elListener, l, obj) {
+               mcListener = (IMusicControllerListener *)obj;
+               if (mcListener)
+                       mcListener->OnEditButtonsPressed(btnId);
+       }
+}
+
+
+void CMusicControllerImpl::HandleRemoteButtons(Evas_Object *eoBtn, EPlayerBtnsEvent ev)
+{
+       ASSERT(m);
+
+       Eina_List *l;
+       IMusicControllerListener *mcListener;
+       void * obj;
+
+       EINA_LIST_FOREACH(m->elListener, l, obj) {
+               mcListener = (IMusicControllerListener *)obj;
+               if (mcListener)
+                       mcListener->OnRemoteButtonEvent(eoBtn, ev);
+       }
+}
+
+
 void CMusicControllerImpl::OnStatusChanged(SUsbHostDeviceInfo *changedDevice,
        SUsbHostDeviceStatus status)
 {
index 6db31e8..e9ba9f2 100644 (file)
@@ -98,6 +98,10 @@ public:
        bool SetRepeatState(ERepeatStatus state);
        ERepeatStatus RepeatState(void);
 
+       void ChangePlayerMode(EPlayerMode mode);
+       void HandlePlaylistEditButtons(EPlayerEditBtns btnId);
+       void HandleRemoteButtons(Evas_Object *eoBtn, EPlayerBtnsEvent ev);
+
 public:
        virtual void OnStatusChanged(SUsbHostDeviceInfo *changedDevice,
                SUsbHostDeviceStatus status);
index e11ed1c..fc05009 100644 (file)
@@ -324,4 +324,25 @@ ERepeatStatus CMusicController::RepeatState(void)
 }
 
 
+void CMusicController::ChangePlayerMode(EPlayerMode mode)
+{
+       ASSERT(m);
+
+       m->ref.ChangePlayerMode(mode);
+}
+
+
+void CMusicController::HandlePlaylistEditButtons(EPlayerEditBtns editBtn)
+{
+       ASSERT(m);
+
+       m->ref.HandlePlaylistEditButtons(editBtn);
+}
+
+
+void CMusicController::HandleRemoteButtons(Evas_Object *eoBtn, EPlayerBtnsEvent ev)
+{
+       ASSERT(m);
 
+       m->ref.HandleRemoteButtons(eoBtn, ev);
+}
\ No newline at end of file
index 339f4b8..2d4da2f 100644 (file)
  */
 
 #include <stdlib.h>
-#include <app.h>
 #include <media/sound_manager.h>
 #include <volume-control.h>
 #include "dbg.h"
+#include <AppCommon.h>
 
 
 #define VOLUME_MUTE    1
diff --git a/src/views/ErrorPopupWindow.cpp b/src/views/ErrorPopupWindow.cpp
new file mode 100644 (file)
index 0000000..27283ca
--- /dev/null
@@ -0,0 +1,46 @@
+/*
+* Copyright (c) 2014 Samsung Electronics Co., Ltd All Rights Reserved
+*
+* Licensed under the Apache License, Version 2.0 (the License);
+* you may not use this file except in compliance with the License.
+* You may obtain a copy of the License at
+*
+* http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing, software
+* distributed under the License is distributed on an AS IS BASIS,
+* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+* See the License for the specific language governing permissions and
+* limitations under the License.
+*/
+
+#include "i18n.h"
+#include "define.h"
+#include "dbg.h"
+#include <AppCommon.h>
+#include "common.h"
+#include "ErrorPopupWindow.h"
+
+
+#define NUM_BTNS 1
+
+static const char *btnText[NUM_BTNS] = {
+       _(MUSIC_TEXT_OK),
+};
+
+void CErrorPopupWindow::t_OnConfiguration(void)
+{
+       t_SetParams(_("Error"), NULL, _(m_msg), NUM_BTNS, (const char **)btnText);
+}
+
+bool CErrorPopupWindow::Create(Evas_Object* base, const SCallback* callback, const char *msg)
+{
+       m_msg = msg;
+
+       if (!CMessagePopup::Create(base, callback)) {
+               _ERR("Creation of remove popup failed");
+               return false;
+       }
+
+       return true;
+}
\ No newline at end of file
diff --git a/src/views/ErrorPopupWindow.h b/src/views/ErrorPopupWindow.h
new file mode 100644 (file)
index 0000000..9cbb9fb
--- /dev/null
@@ -0,0 +1,33 @@
+/*
+ * Copyright (c) 2014 Samsung Electronics Co., Ltd All Rights Reserved
+ *
+ * Licensed under the Apache License, Version 2.0 (the License);
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an AS IS BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+
+#ifndef __ERROR_POPUP_WINDOW_H__
+#define __ERROR_POPUP_WINDOW_H__
+
+class CErrorPopupWindow : public CMessagePopup {
+private:
+       const char *m_msg;
+
+protected:
+       virtual void t_OnConfiguration(void);
+
+public:
+       bool Create(Evas_Object* base, const SCallback* callback, const char *msg);
+};
+
+
+#endif // __REMOVE_POPUP_WINDOW_H__
\ No newline at end of file
diff --git a/src/views/PlaybackController.cpp b/src/views/PlaybackController.cpp
new file mode 100644 (file)
index 0000000..7221ef4
--- /dev/null
@@ -0,0 +1,843 @@
+/*
+* Copyright (c) 2014 Samsung Electronics Co., Ltd All Rights Reserved
+*
+* Licensed under the Apache License, Version 2.0 (the License);
+* you may not use this file except in compliance with the License.
+* You may obtain a copy of the License at
+*
+* http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing, software
+* distributed under the License is distributed on an AS IS BASIS,
+* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+* See the License for the specific language governing permissions and
+* limitations under the License.
+*/
+
+#include "define.h"
+#include "common.h"
+#include "dbg.h"
+#include <AppCommon.h>
+
+#include "song_info.h"
+#include "music-controller.h"
+#include "i18n.h"
+#include "common-ui.h"
+#include "PlaySettingCtxPopup.h"
+#include "ErrorPopupWindow.h"
+#include "Info.h"
+#include "PlaybackController.h"
+
+
+#define TOTAL_CONTROL_BTNS 6
+#define TOTAL_EDIT_BTNS    3
+#define LP_INTERVAL        0.5   /* seconds */
+#define WAIT_INTERVAL      0.5   /* seconds */
+#define LP_CHANGE          10000 /* milli seconds */
+
+enum EEvasObject {
+       EO_CANCEL,
+       EO_DESELECT,
+       EO_DELETE,           // TOTAL_EDIT_BTNS
+
+       EO_BTN_SETTINGS,
+       EO_BTN_SHUFFLE,
+       EO_BTN_REPEAT,
+       EO_BTN_REWIND,
+       EO_BTN_PLAY,
+       EO_BTN_FORWARD,      // TOTAL_CONTROL_BTNS
+};
+
+struct SBtnInfo {
+       const char *txt;
+       const char *part;
+       EEvasObject type;
+};
+
+enum ESettingBtns {
+       BTN_EDIT,
+       BTN_CLEAR
+};
+
+enum ETimers {
+       TIMER_WAIT,
+       TIMER_LONGPRESS,
+       TIMER_VOLUME
+};
+
+enum EPressTypes {
+       PRESS_SHORT,
+       PRESS_SHORT_PAUSE,
+       PRESS_LONG,
+       PRESS_LONG_PAUSE,
+};
+
+struct SPlaybackController {
+       Evas_Object *eoBase;
+       CPlaySettingCtxPopup *eoCtxPopup;
+       CErrorPopupWindow *eoErrPopup;
+       Evas_Object *eoPressedObj;
+
+       Evas_Object *eoBtnControl[TOTAL_CONTROL_BTNS];
+       Evas_Object *eoBtnEdit[TOTAL_EDIT_BTNS];
+
+       Ecore_Timer *etWait;
+       Ecore_Timer *etLongPress;
+
+       CMusicController controller;
+       EPressTypes press_status;
+
+       CPlaybackController::SCallback cb;
+
+       CSongInfo *pSongInfo;
+       int duration;
+
+       SPlaybackController() {
+               memset(this, 0, sizeof(SPlaybackController));
+       }
+};
+
+
+void CPlaybackController::sm_CbCtxPopupBtnSelected(void* cookie, CContextPopup* instance, const char* text)
+{
+       CPlaybackController *root = (CPlaybackController *)cookie;
+       if (root)
+               root->m_OnCtxPopupBtnSelected(instance, text);
+}
+
+
+void CPlaybackController::m_OnCtxPopupBtnSelected(CContextPopup* instance, const char* text)
+{
+       int type = CInfo::PlaybackSettingType();
+
+       switch (type) {
+       case BTN_EDIT:
+               m->controller.ChangePlayerMode(MODE_PLAYLIST_EDIT);
+               break;
+
+       case BTN_CLEAR:
+               m->controller.Stop();
+               m->controller.EmptyPlaylist();
+               break;
+
+       default:
+               break;
+       }
+}
+
+
+void CPlaybackController::sm_CbErrorPopupBtnSelected(void* cookie, CMessagePopup *instance)
+{
+       CPlaybackController *root = (CPlaybackController *)cookie;
+       if (root)
+               root->m_OnErrorPopupBtnSelected(instance);
+}
+
+
+void CPlaybackController::m_OnErrorPopupBtnSelected(CMessagePopup *instance)
+{
+       m_DestroyErrorPopup();
+       elm_object_focus_set(m->eoBtnControl[CTRL_BTN_PLAY], EINA_TRUE);
+}
+
+
+Eina_Bool CPlaybackController::sm_CbWaitTimer(void *dt)
+{
+       CPlaybackController *root = (CPlaybackController *)dt;
+       if (root)
+               root->m_OnWaitTimer();
+
+       return ECORE_CALLBACK_CANCEL;
+}
+
+
+void CPlaybackController::m_OnWaitTimer(void)
+{
+       m->press_status = PRESS_LONG;
+       if (m->controller.PlayState() == PLAY_STATUS_PLAY) {
+               /* Handle long press */
+               m->controller.Pause();
+               m->etLongPress = ecore_timer_add(LP_INTERVAL, sm_CbLongpressTimer, this);
+       }
+       else {
+               m->press_status = PRESS_LONG_PAUSE;
+       }
+
+       m->etWait = NULL;
+}
+
+
+Eina_Bool CPlaybackController::sm_CbLongpressTimer(void *dt)
+{
+       CPlaybackController *root = (CPlaybackController *)dt;
+       if (root)
+               root->m_OnLongpressTimer();
+
+       return ECORE_CALLBACK_RENEW;
+}
+
+
+void CPlaybackController::m_OnLongpressTimer(void)
+{
+       m_HandleOnRepeated();
+}
+
+
+void CPlaybackController::m_AddControlButtons(void)
+{
+       Evas_Object *box = NULL;
+       int i;
+       SBtnInfo btninfo[TOTAL_CONTROL_BTNS];
+
+       btninfo[CTRL_BTN_SETTINGS].txt = MUSIC_STYLE_BTN_SETTINGS;
+       btninfo[CTRL_BTN_SETTINGS].type = EO_BTN_SETTINGS;
+
+       btninfo[CTRL_BTN_SHUFFLE].txt = MUSIC_STYLE_BTN_SHUFFLE;
+       btninfo[CTRL_BTN_SHUFFLE].type = EO_BTN_SHUFFLE;
+
+       btninfo[CTRL_BTN_REPEAT].txt = MUSIC_STYLE_BTN_REPEAT;
+       btninfo[CTRL_BTN_REPEAT].type = EO_BTN_REPEAT;
+
+       btninfo[CTRL_BTN_REWIND].txt = MUSIC_STYLE_BTN_REWIND;
+       btninfo[CTRL_BTN_REWIND].type = EO_BTN_REWIND;
+
+       btninfo[CTRL_BTN_PLAY].txt = MUSIC_STYLE_BTN_PLAY;
+       btninfo[CTRL_BTN_PLAY].type = EO_BTN_PLAY;
+
+       btninfo[CTRL_BTN_FORWARD].txt = MUSIC_STYLE_BTN_FORWARD;
+       btninfo[CTRL_BTN_FORWARD].type = EO_BTN_FORWARD;
+
+       box = elm_box_add(m->eoBase);
+       if (!box)
+               return;
+
+       evas_object_size_hint_weight_set(box, EVAS_HINT_EXPAND, 0);
+       evas_object_size_hint_align_set(box, EVAS_HINT_FILL, 0);
+       elm_box_horizontal_set(box, EINA_TRUE);
+       elm_box_padding_set(box,
+               MUSIC_CONTROL_BTNS_PADDING * elm_config_scale_get(), 0);
+
+       for (i = 0; i < TOTAL_CONTROL_BTNS; i++) {
+               m->eoBtnControl[i] = elm_button_add(m->eoBase);
+               if (!m->eoBtnControl[i])
+                       continue;
+
+               elm_object_style_set(m->eoBtnControl[i], btninfo[i].txt);
+               evas_object_size_hint_weight_set(m->eoBtnControl[i],
+                       EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+               elm_box_pack_end(box, m->eoBtnControl[i]);
+
+               if (i == CTRL_BTN_REWIND || i == CTRL_BTN_FORWARD) {
+                       Connect(m->eoBtnControl[i], btninfo[i].type, TYPE_PRESSED | TYPE_UNPRESSED | TYPE_MOUSE_MOVE);
+               }
+               else {
+                       Connect(m->eoBtnControl[i], btninfo[i].type, TYPE_CLICKED | TYPE_MOUSE_MOVE);
+               }
+               evas_object_show(m->eoBtnControl[i]);
+       }
+
+       elm_object_part_content_set(m->eoBase, MUSIC_PART_CONTROLBTNS, box);
+}
+
+
+void CPlaybackController::m_AddEditPlaylistButtons(void)
+{
+       Evas_Object *box = NULL;
+       int i;
+       SBtnInfo btninfo[TOTAL_EDIT_BTNS];
+
+       btninfo[EDIT_BTN_CANCEL].txt = MUSIC_TEXT_CANCEL;
+       btninfo[EDIT_BTN_CANCEL].type = EO_CANCEL;
+
+       btninfo[EDIT_BTN_DESELECT].txt = MUSIC_TEXT_DESELECT;
+       btninfo[EDIT_BTN_DESELECT].type = EO_DESELECT;
+
+       btninfo[EDIT_BTN_DELETE].txt = MUSIC_TEXT_DELETE;
+       btninfo[EDIT_BTN_DELETE].type = EO_DELETE;
+
+       box = CCommonUI::AddBox(m->eoBase);
+       if (!box)
+               return;
+
+       elm_box_horizontal_set(box, EINA_TRUE);
+       elm_box_padding_set(box, MUSIC_EDIT_BTNS_PADDING * elm_config_scale_get(), 0);
+
+       for (i = 0; i < TOTAL_EDIT_BTNS; i++) {
+               m->eoBtnEdit[i] = elm_button_add(m->eoBase);
+               if (!m->eoBtnEdit[i])
+                       continue;
+
+               elm_object_style_set(m->eoBtnEdit[i], MUSIC_STYLE_EDIT_BTN);
+               evas_object_size_hint_weight_set(m->eoBtnEdit[i], EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+               elm_box_pack_end(box, m->eoBtnEdit[i]);
+               elm_object_text_set(m->eoBtnEdit[i], _(btninfo[i].txt));
+
+               Connect(m->eoBtnEdit[i], btninfo[i].type, TYPE_CLICKED | TYPE_MOUSE_MOVE);
+
+               evas_object_show(m->eoBtnEdit[i]);
+       }
+       elm_object_part_content_set(m->eoBase, MUSIC_PART_EDITBTNS, box);
+       elm_object_signal_emit(m->eoBase, MUSIC_SIGNAL_PLAYBACK_MODE, MUSIC_PLAYBACK_VIEW);
+}
+
+
+void CPlaybackController::m_UpdateForEmptySong(void)
+{
+       elm_object_signal_emit(m->eoBtnControl[CTRL_BTN_PLAY],
+               MUSIC_SIGNAL_PAUSE, MUSIC_PLAYBACK_VIEW);
+       elm_object_focus_set(m->eoBtnControl[CTRL_BTN_SETTINGS], EINA_TRUE);
+       elm_object_focus_next_object_set(m->eoBtnControl[CTRL_BTN_REPEAT],
+               m->eoBtnControl[CTRL_BTN_REPEAT], ELM_FOCUS_RIGHT);
+       elm_object_disabled_set(m->eoBtnControl[CTRL_BTN_FORWARD], EINA_TRUE);
+       elm_object_disabled_set(m->eoBtnControl[CTRL_BTN_REWIND], EINA_TRUE);
+       elm_object_disabled_set(m->eoBtnControl[CTRL_BTN_PLAY], EINA_TRUE);
+}
+
+
+void CPlaybackController::m_CreateErrorPopup(void)
+{
+       CMessagePopup::SCallback cb;
+       cb.cookie = this;
+       cb.onBtn1Pressed = sm_CbErrorPopupBtnSelected;
+
+       m->eoErrPopup = new CErrorPopupWindow;
+       m->eoErrPopup->Create(m->eoBase, &cb, MUSIC_TEXT_PLAYBACK_ERROR);
+
+
+       return;
+}
+
+
+void CPlaybackController::m_DestroyErrorPopup(void)
+{
+       if (!m->eoErrPopup)
+               return;
+
+       if (m->eoErrPopup->FlagCreate())
+               m->eoErrPopup->Destroy();
+
+       delete m->eoErrPopup;
+       m->eoErrPopup = NULL;
+}
+
+
+void CPlaybackController::m_CreateSettingsPopup(void)
+{
+       CContextPopup::SCallback cb;
+       cb.cookie = this;
+       cb.onSelected = sm_CbCtxPopupBtnSelected;
+
+       m->eoCtxPopup = new CPlaySettingCtxPopup;
+       m->eoCtxPopup->Create(m->eoBase, &cb);
+}
+
+
+void CPlaybackController::m_DestroySettingsPopup(void)
+{
+       if (!m->eoCtxPopup)
+               return;
+
+       if (m->eoCtxPopup->FlagCreate())
+               m->eoCtxPopup->Destroy();
+
+       delete m->eoCtxPopup;
+       m->eoCtxPopup = NULL;
+}
+
+
+void CPlaybackController::m_HandleForwardBtnClicked(Evas_Object *obj)
+{
+       elm_object_signal_emit(obj, MUSIC_SIGNAL_BTN_CLICKED,
+               MUSIC_PLAYBACK_VIEW);
+
+       if (m->controller.PlayState() == PLAY_STATUS_STOP)
+               return;
+
+       if (!m->controller.PlayNextSong()) {
+               _ERR(" music play next song failed ");
+               return;
+       }
+}
+
+
+void CPlaybackController::m_HandleRewindBtnClicked(Evas_Object *obj)
+{
+       elm_object_signal_emit(obj, MUSIC_SIGNAL_BTN_CLICKED,
+               MUSIC_PLAYBACK_VIEW);
+
+       if (m->controller.PlayState() == PLAY_STATUS_STOP)
+               return;
+
+       if (!m->controller.PlayPreviousSong()) {
+               _ERR(" music play previous song failed ");
+               return;
+       }
+}
+
+
+void CPlaybackController::m_HandleOnRepeated(void)
+{
+       Evas_Object *obj = NULL;
+       int value;
+       char *timestr = NULL;
+
+       if (!m->eoPressedObj)
+               return;
+
+       obj = m->eoPressedObj;
+
+
+       m->controller.GetPosition(&value);
+
+       if (obj == m->eoBtnControl[CTRL_BTN_REWIND]) {
+               if (value == 0) {
+                       m_RemoveTimer(TIMER_LONGPRESS);
+                       return;
+               }
+               value = value - LP_CHANGE;
+               if (value <= 0)
+                       value = 0;
+       }
+       else {
+               if (value == m->duration) {
+                       m->controller.PlayNextSong();
+
+                       m->press_status = PRESS_LONG_PAUSE;
+                       elm_object_signal_emit(m->eoBtnControl[CTRL_BTN_PLAY], MUSIC_SIGNAL_PAUSE,
+                               MUSIC_PLAYBACK_VIEW);
+                       m->controller.Pause();
+                       m_RemoveTimer(TIMER_LONGPRESS);
+
+                       return;
+               }
+               value = value + LP_CHANGE;
+               if (value >= m->duration)
+                       value = m->duration;
+       }
+
+       m->controller.SetPosition(value);
+       timestr = CCommonUI::TimeStrFromMilSeconds(value);
+       if (timestr) {
+               elm_object_part_text_set(m->eoBase, MUSIC_PART_PROGRESSTIME,
+                       timestr);
+               free(timestr);
+       }
+
+       return;
+}
+
+
+void CPlaybackController::m_RemoveTimer(int timer_code)
+{
+       ETimers timerCode = (ETimers)timer_code;
+
+       switch (timerCode) {
+       case TIMER_WAIT:
+               if (m->etWait) {
+                       ecore_timer_del(m->etWait);
+                       m->etWait = NULL;
+               }
+               break;
+
+       case TIMER_LONGPRESS:
+               if (m->etLongPress) {
+                       ecore_timer_del(m->etLongPress);
+                       m->etLongPress = NULL;
+               }
+               break;
+
+       default:
+               _ERR(" invalid value ");
+               break;
+       }
+}
+
+
+void CPlaybackController::m_UpdateSongInfo(void)
+{
+       CSongInfo *sinfo = NULL;
+       int index;
+
+       if (!m->controller.GetCurrentSongIndex(&index)) {
+               _ERR(" music get current song index failed ");
+               return;
+       }
+
+       if (!m->controller.GetSonginfoFromIndex(index, &sinfo)) {
+               _ERR(" music get songinfo failed ");
+               return;
+       }
+       m->pSongInfo = sinfo;
+}
+
+
+void CPlaybackController::m_HandleOnPressed(Evas_Object *obj)
+{
+       m->press_status = PRESS_SHORT;
+       m->eoPressedObj = obj;
+
+       m->etWait = ecore_timer_add(WAIT_INTERVAL, sm_CbWaitTimer, this);
+}
+
+
+void CPlaybackController::m_HandleOnUnpressed(Evas_Object *obj)
+{
+       m_RemoveTimer(TIMER_WAIT);
+       m_RemoveTimer(TIMER_LONGPRESS);
+
+       if (m->press_status == PRESS_SHORT) {
+               /* Handle song change */
+               if (m->controller.PlayState() == PLAY_STATUS_PLAY)
+                       m->controller.Pause();
+
+               if (obj == m->eoBtnControl[CTRL_BTN_FORWARD])
+                       m_HandleForwardBtnClicked(obj);
+               else
+                       m_HandleRewindBtnClicked(obj);
+
+               if (m->controller.PlayState() != PLAY_STATUS_PLAY)
+                       m->controller.Resume();
+       }
+       else if (m->press_status == PRESS_LONG) {
+               if (m->controller.PlayState() != PLAY_STATUS_PLAY)
+                       m->controller.Resume();
+       }
+
+       m->press_status = PRESS_SHORT;
+}
+
+
+bool CPlaybackController::Create(Evas_Object *eoBase, SCallback *cb)
+{
+       ASSERT(!m);
+
+       _CREATE_BEGIN{
+               _CHECK(m = new SPlaybackController)
+               _COMMAND{ m->eoBase = eoBase; }
+               _CHECK(m->controller.Create())
+               _CHECK(m->controller.AddListener(this))
+
+               _WHEN_SUCCESS{
+                       m_AddControlButtons();
+                       m_AddEditPlaylistButtons();
+                       m->cb = *cb;
+                       m->press_status = PRESS_SHORT;
+               }
+
+               _CHECK_FAIL{ m->controller.RemoveListener(this); }
+               _CHECK_FAIL{ m->controller.Destroy(); }
+
+               _CHECK_FAIL{ delete m; m = NULL; }
+       } _CREATE_END_AND_CATCH{ return false; }
+
+       return true;
+}
+
+
+void CPlaybackController::Destroy(void)
+{
+       ASSERT(m);
+
+       m_DestroyErrorPopup();
+       m_DestroySettingsPopup();
+       m->controller.RemoveListener(this);
+
+       delete m;
+       m = NULL;
+}
+
+
+void CPlaybackController::Update(void)
+{
+       int state;
+
+       state = m->controller.PlayState();
+       switch (state) {
+       case PLAY_STATUS_INITIAL:
+               // Initial State, Do nothing
+               break;
+
+       case PLAY_STATUS_STOP:
+               if (!m->eoErrPopup)
+                       elm_object_focus_set(m->eoBtnControl[CTRL_BTN_PLAY], EINA_TRUE);
+               elm_object_disabled_set(m->eoBtnControl[CTRL_BTN_FORWARD], EINA_TRUE);
+               elm_object_disabled_set(m->eoBtnControl[CTRL_BTN_REWIND], EINA_TRUE);
+               break;
+
+       case PLAY_STATUS_PLAY:
+               elm_object_disabled_set(m->eoBtnControl[CTRL_BTN_FORWARD], EINA_FALSE);
+               elm_object_disabled_set(m->eoBtnControl[CTRL_BTN_REWIND], EINA_FALSE);
+               elm_object_signal_emit(m->eoBtnControl[CTRL_BTN_PLAY],
+                       MUSIC_SIGNAL_PLAY, MUSIC_PLAYBACK_VIEW);
+               break;
+
+       case PLAY_STATUS_PAUSE:
+               elm_object_disabled_set(m->eoBtnControl[CTRL_BTN_FORWARD], EINA_FALSE);
+               elm_object_disabled_set(m->eoBtnControl[CTRL_BTN_REWIND], EINA_FALSE);
+               elm_object_signal_emit(m->eoBtnControl[CTRL_BTN_PLAY],
+                       MUSIC_SIGNAL_PAUSE, MUSIC_PLAYBACK_VIEW);
+               break;
+
+       default:
+               ASSERT(!"Invalid State");
+               break;
+       }
+
+       state = m->controller.ShuffleState();
+       switch (state) {
+       case SHUFFLE_STATUS_OFF:
+               elm_object_signal_emit(m->eoBtnControl[CTRL_BTN_SHUFFLE],
+                       MUSIC_SIGNAL_SHUFFLE_OFF, MUSIC_PLAYBACK_VIEW);
+               break;
+
+       case SHUFFLE_STATUS_ON:
+               elm_object_signal_emit(m->eoBtnControl[CTRL_BTN_SHUFFLE],
+                       MUSIC_SIGNAL_SHUFFLE_ON, MUSIC_PLAYBACK_VIEW);
+               break;
+
+       default:
+               ASSERT(!"Invalid State");
+               break;
+       }
+
+       state = m->controller.RepeatState();
+       switch (state) {
+       case REPEAT_STATUS_NONE:
+               elm_object_signal_emit(m->eoBtnControl[CTRL_BTN_REPEAT],
+                       MUSIC_SIGNAL_REPEAT_OFF, MUSIC_PLAYBACK_VIEW);
+               break;
+
+       case REPEAT_STATUS_ALL:
+               elm_object_signal_emit(m->eoBtnControl[CTRL_BTN_REPEAT],
+                       MUSIC_SIGNAL_REPEAT_ALL, MUSIC_PLAYBACK_VIEW);
+               break;
+
+       case REPEAT_STATUS_ONE:
+               elm_object_signal_emit(m->eoBtnControl[CTRL_BTN_REPEAT],
+                       MUSIC_SIGNAL_REPEAT_ONE, MUSIC_PLAYBACK_VIEW);
+               break;
+
+       default:
+               ASSERT(!"Invalid State");
+               break;
+       }
+}
+
+
+Evas_Object *CPlaybackController::ControlBtnsObject(EPlayerControlBtns id)
+{
+       ASSERT(m);
+       return m->eoBtnControl[id];
+}
+
+
+Evas_Object *CPlaybackController::EditBtnsObject(EPlayerEditBtns id)
+{
+       ASSERT(m);
+       return m->eoBtnEdit[id];
+}
+
+
+void CPlaybackController::OnComplete(void)
+{
+}
+
+
+void CPlaybackController::OnStartPlayback(void)
+{
+       m_UpdateSongInfo();
+       m->duration = m->pSongInfo->Duration();
+}
+
+
+void CPlaybackController::OnStopPlayback(void)
+{
+}
+
+
+void CPlaybackController::OnPausePlayback(void)
+{
+}
+
+
+void CPlaybackController::OnResumePlayback(void)
+{
+}
+
+
+void CPlaybackController::OnPosition(int milsec)
+{
+}
+
+
+void CPlaybackController::OnError(void)
+{
+       m_CreateErrorPopup();
+}
+
+
+void CPlaybackController::OnEmptyPlaylist(void)
+{
+       m_UpdateForEmptySong();
+}
+
+
+void CPlaybackController::OnRemoteButtonEvent(Evas_Object *eoBtn, EPlayerBtnsEvent ev)
+{
+       switch (ev) {
+       case EVENT_PRESSED:
+               m_HandleOnPressed(eoBtn);
+               break;
+
+       case EVENT_UNPRESSED:
+               m_HandleOnUnpressed(eoBtn);
+               break;
+
+       default:
+               ASSERT(!"Invalid Event.");
+               break;
+       }
+}
+
+
+void CPlaybackController::OnPressed(int id, Evas_Object *obj)
+{
+       switch (id) {
+       case EO_BTN_FORWARD:
+       case EO_BTN_REWIND:
+               m_HandleOnPressed(obj);
+               break;
+
+       default:
+               break;
+       }
+}
+
+
+void CPlaybackController::OnUnpressed(int id, Evas_Object *obj)
+{
+       switch (id) {
+       case EO_BTN_FORWARD:
+       case EO_BTN_REWIND:
+               m_HandleOnUnpressed(obj);
+               break;
+
+       default:
+               break;
+       }
+}
+
+
+void CPlaybackController::OnMouseMove(int id, Evas *e, Evas_Object *obj, Evas_Event_Mouse_Move *ev)
+{
+       switch (id) {
+       case EO_CANCEL:
+       case EO_DESELECT:
+       case EO_DELETE:
+       case EO_BTN_FORWARD:
+       case EO_BTN_PLAY:
+       case EO_BTN_REPEAT:
+       case EO_BTN_REWIND:
+       case EO_BTN_SETTINGS:
+       case EO_BTN_SHUFFLE:
+               if (!elm_object_focus_get(obj))
+                       elm_object_focus_set(obj, EINA_TRUE);
+               break;
+
+       default:
+               break;
+       }
+}
+
+
+void CPlaybackController::OnMouseClicked(int id, Evas_Object *obj)
+{
+       switch (id) {
+       case EO_CANCEL:
+               m->controller.HandlePlaylistEditButtons(EDIT_BTN_CANCEL);
+               m->controller.ChangePlayerMode(MODE_PLAYBACK);
+
+               break;
+
+       case EO_DESELECT:
+               m->controller.HandlePlaylistEditButtons(EDIT_BTN_DESELECT);
+               elm_object_focus_set(m->eoBtnEdit[EDIT_BTN_CANCEL], EINA_TRUE);
+               break;
+
+       case EO_DELETE:
+               m->controller.HandlePlaylistEditButtons(EDIT_BTN_DELETE);
+               break;
+
+       case EO_BTN_SETTINGS:
+               elm_object_signal_emit(obj, MUSIC_SIGNAL_BTN_CLICKED, MUSIC_PLAYBACK_VIEW);
+
+               if (m->cb.OnCurrentSongCount &&
+                       m->cb.OnCurrentSongCount(m->cb.cookie) == 0)
+                       return;
+
+               elm_object_signal_emit(obj, MUSIC_SIGNAL_CONTROL_SELECTED, MUSIC_PLAYBACK_VIEW);
+               m_DestroySettingsPopup();
+               m_CreateSettingsPopup();
+               break;
+
+       case EO_BTN_SHUFFLE:
+               elm_object_signal_emit(obj, MUSIC_SIGNAL_BTN_CLICKED, MUSIC_PLAYBACK_VIEW);
+
+               switch (m->controller.ShuffleState()) {
+               case SHUFFLE_STATUS_OFF:
+                       m->controller.SetShuffleState(SHUFFLE_STATUS_ON);
+                       elm_object_signal_emit(obj, MUSIC_SIGNAL_SHUFFLE_ON, MUSIC_PLAYBACK_VIEW);
+                       break;
+
+               default:
+                       m->controller.SetShuffleState(SHUFFLE_STATUS_OFF);
+                       elm_object_signal_emit(obj, MUSIC_SIGNAL_SHUFFLE_OFF, MUSIC_PLAYBACK_VIEW);
+                       break;
+               }
+               break;
+
+       case EO_BTN_REPEAT:
+               elm_object_signal_emit(obj, MUSIC_SIGNAL_BTN_CLICKED, MUSIC_PLAYBACK_VIEW);
+
+               switch (m->controller.RepeatState()) {
+               case REPEAT_STATUS_NONE:
+                       m->controller.SetRepeatState(REPEAT_STATUS_ALL);
+                       elm_object_signal_emit(obj, MUSIC_SIGNAL_REPEAT_ALL, MUSIC_PLAYBACK_VIEW);
+                       break;
+
+               case REPEAT_STATUS_ALL:
+                       m->controller.SetRepeatState(REPEAT_STATUS_ONE);
+                       elm_object_signal_emit(obj, MUSIC_SIGNAL_REPEAT_ONE, MUSIC_PLAYBACK_VIEW);
+                       break;
+
+               default:
+                       m->controller.SetRepeatState(REPEAT_STATUS_NONE);
+                       elm_object_signal_emit(obj, MUSIC_SIGNAL_REPEAT_OFF, MUSIC_PLAYBACK_VIEW);
+                       break;
+               }
+               break;
+
+       case EO_BTN_PLAY:
+               elm_object_signal_emit(obj, MUSIC_SIGNAL_BTN_CLICKED, MUSIC_PLAYBACK_VIEW);
+
+               switch (m->controller.PlayState()) {
+               case PLAY_STATUS_PAUSE:
+                       m->controller.Resume();
+                       elm_object_signal_emit(obj, MUSIC_SIGNAL_PLAY, MUSIC_PLAYBACK_VIEW);
+                       break;
+
+               case PLAY_STATUS_PLAY:
+                       elm_object_signal_emit(obj, MUSIC_SIGNAL_PAUSE, MUSIC_PLAYBACK_VIEW);
+                       m->controller.Pause();
+                       break;
+
+               default:
+                       m->controller.Start();
+                       break;
+               }
+               break;
+
+       default:
+               break;
+       }
+}
\ No newline at end of file
diff --git a/src/views/PlaybackController.h b/src/views/PlaybackController.h
new file mode 100644 (file)
index 0000000..e9dbd9e
--- /dev/null
@@ -0,0 +1,101 @@
+/*
+* Copyright (c) 2014 Samsung Electronics Co., Ltd All Rights Reserved
+*
+* Licensed under the Apache License, Version 2.0 (the License);
+* you may not use this file except in compliance with the License.
+* You may obtain a copy of the License at
+*
+* http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing, software
+* distributed under the License is distributed on an AS IS BASIS,
+* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+* See the License for the specific language governing permissions and
+* limitations under the License.
+*/
+
+#ifndef __PLAYBACK_CONTROLLER_H__
+#define __PLAYBACK_CONTROLLER_H__
+
+class CPlaybackController :
+       public CListenerMgr,
+       public IMusicControllerListener,
+       public IPressedListener,
+       public IUnpressedListener,
+       public IMouseMoveListener,
+       public IMouseClickedListener {
+public:
+       struct SCallback {
+               void *cookie;
+               int(*OnCurrentSongCount)(void *cookie);
+       };
+
+private:
+       struct SPlaybackController *m;
+
+private:
+       static void sm_CbCtxPopupBtnSelected(void* cookie, CContextPopup* instance, const char* text);
+       void m_OnCtxPopupBtnSelected(CContextPopup* instance, const char* text);
+
+       static void sm_CbErrorPopupBtnSelected(void* cookie, CMessagePopup *instance);
+       void m_OnErrorPopupBtnSelected(CMessagePopup *instance);
+
+       static Eina_Bool sm_CbWaitTimer(void *dt);
+       void m_OnWaitTimer(void);
+
+       static Eina_Bool sm_CbLongpressTimer(void *dt);
+       void m_OnLongpressTimer(void);
+
+private:
+       void m_AddControlButtons(void);
+       void m_AddEditPlaylistButtons(void);
+       void m_CreateErrorPopup(void);
+       void m_DestroyErrorPopup(void);
+       void m_CreateSettingsPopup(void);
+       void m_DestroySettingsPopup(void);
+       void m_UpdateForEmptySong(void);
+
+       void m_HandleForwardBtnClicked(Evas_Object *obj);
+       void m_HandleRewindBtnClicked(Evas_Object *obj);
+       void m_HandleOnRepeated(void);
+       void m_HandleOnPressed(Evas_Object *obj);
+       void m_HandleOnUnpressed(Evas_Object *obj);
+
+       void m_RemoveTimer(int timer_code);
+       void m_UpdateSongInfo(void);
+
+public:
+       CPlaybackController() :
+               IPressedListener(this),
+               IUnpressedListener(this),
+               IMouseMoveListener(this),
+               IMouseClickedListener(this),
+               m(0) {}
+       virtual ~CPlaybackController() {}
+
+       bool Create(Evas_Object *eoBase, SCallback *cb);
+       virtual void Destroy(void);
+
+       void Update(void);
+
+       Evas_Object *ControlBtnsObject(EPlayerControlBtns id);
+       Evas_Object *EditBtnsObject(EPlayerEditBtns id);
+
+public:
+       virtual void OnComplete(void);
+       virtual void OnStartPlayback(void);
+       virtual void OnStopPlayback(void);
+       virtual void OnPausePlayback(void);
+       virtual void OnResumePlayback(void);
+       virtual void OnPosition(int milsec);
+       virtual void OnError(void);
+       virtual void OnEmptyPlaylist(void);
+       virtual void OnRemoteButtonEvent(Evas_Object *eoBtn, EPlayerBtnsEvent ev);
+
+       virtual void OnPressed(int id, Evas_Object *obj);
+       virtual void OnUnpressed(int id, Evas_Object *obj);
+       virtual void OnMouseMove(int id, Evas *e, Evas_Object *obj, Evas_Event_Mouse_Move *ev);
+       virtual void OnMouseClicked(int id, Evas_Object *obj);
+};
+
+#endif // __PLAYBACK_CONTROLLER_H__
\ No newline at end of file
index 0775e45..8ca93e0 100644 (file)
@@ -24,7 +24,7 @@
 
 #define NUM_BTNS 2
 
-const char *btnText[NUM_BTNS] = {
+static const char *btnText[NUM_BTNS] = {
        _(MUSIC_TEXT_REMOVE),
        _(MUSIC_TEXT_CANCEL)
 };
diff --git a/src/views/SliderWidget.cpp b/src/views/SliderWidget.cpp
new file mode 100644 (file)
index 0000000..b3362d7
--- /dev/null
@@ -0,0 +1,293 @@
+/*
+* Copyright (c) 2014 Samsung Electronics Co., Ltd All Rights Reserved
+*
+* Licensed under the Apache License, Version 2.0 (the License);
+* you may not use this file except in compliance with the License.
+* You may obtain a copy of the License at
+*
+* http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing, software
+* distributed under the License is distributed on an AS IS BASIS,
+* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+* See the License for the specific language governing permissions and
+* limitations under the License.
+*/
+
+#include "define.h"
+#include "common.h"
+#include "dbg.h"
+#include <AppCommon.h>
+
+#include "song_info.h"
+#include "music-controller.h"
+#include "i18n.h"
+#include "common-ui.h"
+#include "SliderWidget.h"
+
+
+#define S_INCREMENT        1000  /* milli seconds */
+#define S_INTERVAL         1     /* seconds */
+#define SLIDER_STEP        5000  /* milli seconds */
+
+
+struct SSliderWidget {
+       Evas_Object *eoSlider;
+       Evas_Object *eoBase;
+
+       Ecore_Timer *etSlider;
+
+       CSongInfo *pSongInfo;
+
+       CMusicController controller;
+
+       SSliderWidget() {
+               eoSlider = NULL;
+               eoBase = NULL;
+               etSlider = NULL;
+               pSongInfo = NULL;
+       }
+};
+
+
+Eina_Bool CSliderWidget::sm_CbUpdateSlider(void *dt)
+{
+       CSliderWidget *root = (CSliderWidget*)dt;
+       Eina_Bool ret = ECORE_CALLBACK_CANCEL;
+
+       if (root)
+               ret = root->m_OnUpdateSlider();
+
+       return ret;
+}
+
+
+Eina_Bool CSliderWidget::m_OnUpdateSlider(void)
+{
+       char *timestr = NULL;
+       int value;
+       int duration;
+
+       if (!m->controller.GetPosition(&value)) {
+               m->etSlider = NULL;
+               return ECORE_CALLBACK_CANCEL;
+       }
+
+       m_UpdateSongInfo();
+
+       duration = m->pSongInfo->Duration();
+
+       value = value + S_INCREMENT;
+       if (value > duration) {
+               m->etSlider = NULL;
+               return ECORE_CALLBACK_CANCEL;
+       }
+
+       elm_slider_value_set(m->eoSlider, value);
+       timestr = CCommonUI::TimeStrFromMilSeconds(value);
+       if (timestr) {
+               elm_object_part_text_set(m->eoBase, MUSIC_PART_PROGRESSTIME,
+                       timestr);
+               free(timestr);
+       }
+
+       return ECORE_CALLBACK_RENEW;
+}
+
+
+bool CSliderWidget::m_AddSlider(void)
+{
+       Evas_Object *eoSlider = NULL;
+
+       eoSlider = elm_slider_add(m->eoBase);
+       if (!eoSlider)
+               return false;
+
+       elm_slider_indicator_show_set(eoSlider, EINA_FALSE);
+       elm_slider_indicator_show_on_focus_set(eoSlider, EINA_FALSE);
+       elm_object_style_set(eoSlider, MUSIC_STYLE_SLIDER);
+       elm_slider_horizontal_set(eoSlider, EINA_TRUE);
+       elm_object_part_content_set(m->eoBase, MUSIC_PART_PROGRESSBAR, eoSlider);
+
+       Connect(eoSlider, TYPE_CHANGED | TYPE_MOUSE_MOVE);
+
+       evas_object_show(eoSlider);
+       m->eoSlider = eoSlider;
+
+       return true;
+}
+
+
+void CSliderWidget::m_RemoveTimer(void)
+{
+       if (m->etSlider) {
+               ecore_timer_del(m->etSlider);
+               m->etSlider = NULL;
+       }
+}
+
+
+void CSliderWidget::m_UpdateSongInfo(void)
+{
+       CSongInfo *sinfo = NULL;
+       int index;
+
+       if (!m->controller.GetCurrentSongIndex(&index)) {
+               _ERR(" music get current song index failed ");
+               return;
+       }
+
+       if (!m->controller.GetSonginfoFromIndex(index, &sinfo)) {
+               _ERR(" music get songinfo failed ");
+               return;
+       }
+       m->pSongInfo = sinfo;
+}
+
+
+bool CSliderWidget::Create(Evas_Object *eoBase)
+{
+       ASSERT(!m);
+
+       _CREATE_BEGIN{
+               _CHECK(m = new SSliderWidget)
+               _COMMAND{ m->eoBase = eoBase; }
+               _CHECK(m->controller.Create())
+                       _CHECK(m->controller.AddListener(this))
+                       _CHECK(m_AddSlider())
+
+                       _CHECK_FAIL{}
+               _CHECK_FAIL{ m->controller.RemoveListener(this); }
+               _CHECK_FAIL{ m->controller.Destroy(); }
+               _CHECK_FAIL{ delete m; m = NULL; }
+       } _CREATE_END_AND_CATCH{ return false; }
+
+       return true;
+}
+
+
+void CSliderWidget::Destroy(void)
+{
+       ASSERT(m);
+
+       m->controller.RemoveListener(this);
+       m_RemoveTimer();
+
+       delete m;
+       m = NULL;
+}
+
+
+Evas_Object* CSliderWidget::Base(void)
+{
+       ASSERT(m);
+
+       return m->eoSlider;
+}
+
+
+void CSliderWidget::Init(void)
+{
+       elm_object_disabled_set(m->eoSlider, EINA_TRUE);
+       elm_slider_value_set(m->eoSlider, 0);
+       elm_object_part_text_set(m->eoBase, MUSIC_PART_FULLTIME, "00:00");
+       elm_object_part_text_set(m->eoBase, MUSIC_PART_PROGRESSTIME, "00:00");
+}
+
+
+void CSliderWidget::OnComplete(void)
+{
+}
+
+
+void CSliderWidget::OnStartPlayback(void)
+{
+       int duration;
+       char *timestr = NULL;
+       double step;
+
+       elm_slider_value_set(m->eoSlider, 0);
+       elm_object_part_text_set(m->eoBase, MUSIC_PART_PROGRESSTIME, "00:00");
+
+       elm_object_disabled_set(m->eoSlider, EINA_FALSE);
+
+       m_UpdateSongInfo();
+       duration = m->pSongInfo->Duration();
+
+       m_RemoveTimer();
+       m->etSlider = ecore_timer_add(S_INTERVAL, sm_CbUpdateSlider, this);
+
+       elm_slider_min_max_set(m->eoSlider, 0, duration);
+       timestr = CCommonUI::TimeStrFromMilSeconds(duration);
+       if (timestr) {
+               elm_object_part_text_set(m->eoBase,
+                       MUSIC_PART_FULLTIME, timestr);
+               free(timestr);
+       }
+
+       step = (double)SLIDER_STEP / (double)duration;
+       elm_slider_step_set(m->eoSlider, step);
+}
+
+
+void CSliderWidget::OnStopPlayback(void)
+{
+       elm_slider_value_set(m->eoSlider, 0);
+       elm_object_part_text_set(m->eoBase, MUSIC_PART_PROGRESSTIME, "00:00");
+
+       elm_object_disabled_set(m->eoSlider, EINA_TRUE);
+       m_RemoveTimer();
+}
+
+
+void CSliderWidget::OnPausePlayback(void)
+{
+       if (m->etSlider)
+               ecore_timer_freeze(m->etSlider);
+}
+
+
+void CSliderWidget::OnResumePlayback(void)
+{
+       if (m->etSlider)
+               ecore_timer_thaw(m->etSlider);
+}
+
+
+void CSliderWidget::OnPosition(int milsec)
+{
+       elm_slider_value_set(m->eoSlider, milsec);
+}
+
+
+void CSliderWidget::OnChanged(int id, Evas_Object *obj)
+{
+       char *timestr = NULL;
+       int value;
+
+       if (m->controller.PlayState() == PLAY_STATUS_PLAY) {
+               if (m->etSlider)
+                       ecore_timer_freeze(m->etSlider);
+       }
+
+       value = elm_slider_value_get(obj);
+       m->controller.SetPosition(value);
+       timestr = CCommonUI::TimeStrFromMilSeconds(value);
+       if (timestr) {
+               elm_object_part_text_set(m->eoBase, MUSIC_PART_PROGRESSTIME,
+                       timestr);
+               free(timestr);
+       }
+
+       if (m->controller.PlayState() == PLAY_STATUS_PLAY) {
+               if (m->etSlider)
+                       ecore_timer_thaw(m->etSlider);
+       }
+}
+
+
+void CSliderWidget::OnMouseMove(int id, Evas *e, Evas_Object *obj, Evas_Event_Mouse_Move *ev)
+{
+       if (!elm_object_focus_get(obj))
+               elm_object_focus_set(obj, EINA_TRUE);
+}
\ No newline at end of file
diff --git a/src/views/SliderWidget.h b/src/views/SliderWidget.h
new file mode 100644 (file)
index 0000000..78637ff
--- /dev/null
@@ -0,0 +1,68 @@
+/*
+* Copyright (c) 2014 Samsung Electronics Co., Ltd All Rights Reserved
+*
+* Licensed under the Apache License, Version 2.0 (the License);
+* you may not use this file except in compliance with the License.
+* You may obtain a copy of the License at
+*
+* http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing, software
+* distributed under the License is distributed on an AS IS BASIS,
+* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+* See the License for the specific language governing permissions and
+* limitations under the License.
+*/
+
+#ifndef __SLIDER_WIDGET_H__
+#define __SLIDER_WIDGET_H__
+
+class CSliderWidget :
+       public CListenerMgr,
+       public IMusicControllerListener,
+       public IMouseMoveListener,
+       public IChangedListener {
+private:
+       struct SSliderWidget *m;
+
+private:
+       static Eina_Bool sm_CbUpdateSlider(void *dt);
+       Eina_Bool m_OnUpdateSlider(void);
+
+       bool m_AddSlider(void);
+       void m_RemoveTimer(void);
+
+       void m_UpdateSongInfo(void);
+
+public:
+       CSliderWidget() :
+               IMouseMoveListener(this),
+               IChangedListener(this),
+               m(0) {}
+       virtual ~CSliderWidget() {}
+
+       bool Create(Evas_Object *eoParent);
+       virtual void Destroy(void);
+
+       Evas_Object* Base(void);
+
+       void Init(void);
+
+       //! This function is invoked when playback is complete.
+       virtual void OnComplete(void);
+       //! This function is invoked when new song is played.
+       virtual void OnStartPlayback(void);
+       //!
+       virtual void OnStopPlayback(void);
+       //! This function is invoked when playback is paused.
+       virtual void OnPausePlayback(void);
+       //! This function is invoked when playback is resumed.
+       virtual void OnResumePlayback(void);
+       //!
+       virtual void OnPosition(int milsec);
+
+       virtual void OnChanged(int id, Evas_Object *obj);
+       virtual void OnMouseMove(int id, Evas *e, Evas_Object *obj, Evas_Event_Mouse_Move *ev);
+};
+
+#endif // __PLAYBACK_VIEW_H__
\ No newline at end of file
diff --git a/src/views/Timer.cpp b/src/views/Timer.cpp
new file mode 100644 (file)
index 0000000..efde40a
--- /dev/null
@@ -0,0 +1,103 @@
+/*
+* Copyright (c) 2014 Samsung Electronics Co., Ltd All Rights Reserved
+*
+* Licensed under the Apache License, Version 2.0 (the License);
+* you may not use this file except in compliance with the License.
+* You may obtain a copy of the License at
+*
+* http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing, software
+* distributed under the License is distributed on an AS IS BASIS,
+* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+* See the License for the specific language governing permissions and
+* limitations under the License.
+*/
+
+
+#include "define.h"
+#include "common.h"
+#include "dbg.h"
+#include <AppCommon.h>
+#include "Timer.h"
+
+
+struct STimer {
+       int count;
+       int s, e;
+       struct SCookie {
+               Ecore_Timer *etTimer;
+               CTimer *root;
+               int     id;
+               SCookie(CTimer *timer, int _id) {
+                       root = timer;
+                       id = _id;
+               }
+       };
+
+       Eina_List *elList;
+};
+
+
+Eina_Bool CTimer::sm_CbTimer(void *data)
+{
+       STimer::SCookie *cookie = (STimer::SCookie*)data;
+
+       if (cookie->root)
+               cookie->root->t_OnTimer(cookie->id);
+
+       cookie->root->m->elList = eina_list_remove(cookie->root->m->elList, cookie);
+
+       delete cookie;
+
+       return EINA_FALSE;
+}
+
+
+void CTimer::t_OnTimer(int id)
+{
+}
+
+
+bool CTimer::Create(void)
+{
+       ASSERT(!m);
+
+       m = new STimer;
+       if (!m)
+               return false;
+
+       m->elList = NULL;
+
+       return true;
+}
+
+
+void CTimer::Destroy(void)
+{
+       ASSERT(m);
+
+       delete m;
+       m = NULL;
+}
+
+
+bool CTimer::SetTimer(int id, int ms)
+{
+       ASSERT(m);
+
+
+       STimer::SCookie *cookie = new STimer::SCookie(this, id);
+       if (!cookie)
+               return false;
+
+       m->elList = eina_list_append(m->elList, cookie);
+       cookie->etTimer = ecore_timer_add(ms, sm_CbTimer, cookie);
+       return true;
+}
+
+
+void CTimer::KillTimer(int id)
+{
+       ASSERT(m);
+}
index f052b2a..e0b7f07 100644 (file)
@@ -19,6 +19,7 @@
 #include "dbg.h"
 #include <AppCommon.h>
 
+#include "Timer.h"
 #include "song_info.h"
 #include "album_info.h"
 #include "music-controller.h"
 #include "HandleVolume.h"
 #include "PlaySettingCtxPopup.h"
 #include "Info.h"
+#include "SliderWidget.h"
+#include "PlaybackController.h"
 
 
 #define TOTAL_CONTROL_BTNS 6
 #define TOTAL_EDIT_BTNS    3
-#define S_INTERVAL         1     /* seconds */
-#define LP_INTERVAL        0.5   /* seconds */
-#define WAIT_INTERVAL      0.5   /* seconds */
-#define SLIDER_STEP        5000  /* milli seconds */
-#define LP_CHANGE          10000 /* milli seconds */
-#define S_INCREMENT        1000  /* milli seconds */
 
 
-// SSliderWidget
-struct SSliderWidget {
-       Evas_Object *eoSlider;
-       Evas_Object *eoBase;
-
-       Ecore_Timer *etSlider;
-
-       CSongInfo *pSongInfo;
-
-       CMusicController controller;
-
-       SSliderWidget() {
-               eoSlider = NULL;
-               eoBase = NULL;
-               etSlider = NULL;
-               pSongInfo = NULL;
-       }
-};
-
-
-Eina_Bool CSliderWidget::sm_CbUpdateSlider(void *dt)
-{
-       CSliderWidget *root = (CSliderWidget*)dt;
-       Eina_Bool ret = ECORE_CALLBACK_CANCEL;
-
-       if (root)
-               ret = root->m_OnUpdateSlider();
-
-       return ret;
-}
-
-
-Eina_Bool CSliderWidget::m_OnUpdateSlider(void)
-{
-       char *timestr = NULL;
-       int value;
-       int duration;
-
-       if (!m->controller.GetPosition(&value)) {
-               m->etSlider = NULL;
-               return ECORE_CALLBACK_CANCEL;
-       }
-
-       m_UpdateSongInfo();
-
-       duration = m->pSongInfo->Duration();
-
-       value = value + S_INCREMENT;
-       if (value > duration) {
-               m->etSlider = NULL;
-               return ECORE_CALLBACK_CANCEL;
-       }
-
-       elm_slider_value_set(m->eoSlider, value);
-       timestr = CCommonUI::TimeStrFromMilSeconds(value);
-       if (timestr) {
-               elm_object_part_text_set(m->eoBase, MUSIC_PART_PROGRESSTIME,
-                       timestr);
-               free(timestr);
-       }
-
-       return ECORE_CALLBACK_RENEW;
-}
-
-
-bool CSliderWidget::m_AddSlider(void)
-{
-       Evas_Object *eoSlider = NULL;
-
-       eoSlider = elm_slider_add(m->eoBase);
-       if (!eoSlider)
-               return false;
-
-       elm_slider_indicator_show_set(eoSlider, EINA_FALSE);
-       elm_slider_indicator_show_on_focus_set(eoSlider, EINA_FALSE);
-       elm_object_style_set(eoSlider, MUSIC_STYLE_SLIDER);
-       elm_slider_horizontal_set(eoSlider, EINA_TRUE);
-       elm_object_part_content_set(m->eoBase, MUSIC_PART_PROGRESSBAR, eoSlider);
-
-       Connect(eoSlider, TYPE_CHANGED | TYPE_MOUSE_MOVE);
-
-       evas_object_show(eoSlider);
-       m->eoSlider = eoSlider;
-
-       return true;
-}
-
-
-void CSliderWidget::m_RemoveTimer(void)
-{
-       if (m->etSlider) {
-               ecore_timer_del(m->etSlider);
-               m->etSlider = NULL;
-       }
-}
-
-
-void CSliderWidget::m_UpdateSongInfo(void)
-{
-       CSongInfo *sinfo = NULL;
-       int index;
-
-       if (!m->controller.GetCurrentSongIndex(&index)) {
-               _ERR(" music get current song index failed ");
-               return;
-       }
-
-       if (!m->controller.GetSonginfoFromIndex(index, &sinfo)) {
-               _ERR(" music get songinfo failed ");
-               return;
-       }
-       m->pSongInfo = sinfo;
-}
-
-
-bool CSliderWidget::Create(Evas_Object *eoBase)
-{
-       ASSERT(!m);
-
-       _CREATE_BEGIN{
-               _CHECK(m = new SSliderWidget)
-               _COMMAND{ m->eoBase = eoBase; }
-               _CHECK(m->controller.Create())
-               _CHECK(m->controller.AddListener(this))
-               _CHECK(m_AddSlider())
-
-               _CHECK_FAIL{}
-               _CHECK_FAIL{ m->controller.RemoveListener(this); }
-               _CHECK_FAIL{ m->controller.Destroy(); }
-               _CHECK_FAIL{ delete m; m = NULL; }
-       } _CREATE_END_AND_CATCH{ return false; }
-
-       return true;
-}
-
-
-void CSliderWidget::Destroy(void)
-{
-       ASSERT(m);
-
-       m->controller.RemoveListener(this);
-       m_RemoveTimer();
-
-       delete m;
-       m = NULL;
-}
-
-
-Evas_Object* CSliderWidget::Base(void)
-{
-       ASSERT(m);
-
-       return m->eoSlider;
-}
-
-
-void CSliderWidget::Init(void)
-{
-       elm_object_disabled_set(m->eoSlider, EINA_TRUE);
-       elm_slider_value_set(m->eoSlider, 0);
-}
-
-
-void CSliderWidget::OnComplete(void)
-{
-}
-
-
-void CSliderWidget::OnStartPlayback(void)
-{
-       int duration;
-       char *timestr = NULL;
-       double step;
-
-       elm_slider_value_set(m->eoSlider, 0);
-       elm_object_part_text_set(m->eoBase, MUSIC_PART_PROGRESSTIME, "00:00");
-
-       elm_object_disabled_set(m->eoSlider, EINA_FALSE);
-
-       m_UpdateSongInfo();
-       duration = m->pSongInfo->Duration();
-
-       m_RemoveTimer();
-       m->etSlider = ecore_timer_add(S_INTERVAL, sm_CbUpdateSlider, this);
-
-       elm_slider_min_max_set(m->eoSlider, 0, duration);
-       timestr = CCommonUI::TimeStrFromMilSeconds(duration);
-       if (timestr) {
-               elm_object_part_text_set(m->eoBase,
-                       MUSIC_PART_FULLTIME, timestr);
-               free(timestr);
-       }
-
-       step = (double)SLIDER_STEP / (double)duration;
-       elm_slider_step_set(m->eoSlider, step);
-}
-
-
-void CSliderWidget::OnStopPlayback(void)
-{
-       elm_slider_value_set(m->eoSlider, 0);
-       elm_object_part_text_set(m->eoBase, MUSIC_PART_PROGRESSTIME, "00:00");
-
-       elm_object_disabled_set(m->eoSlider, EINA_TRUE);
-       m_RemoveTimer();
-}
-
-
-void CSliderWidget::OnPausePlayback(void)
-{
-       if (m->etSlider)
-               ecore_timer_freeze(m->etSlider);
-}
-
-
-void CSliderWidget::OnResumePlayback(void)
-{
-       if (m->etSlider)
-               ecore_timer_thaw(m->etSlider);
-}
-
-
-void CSliderWidget::OnPosition(int milsec)
-{
-       elm_slider_value_set(m->eoSlider, milsec);
-}
-
-
-void CSliderWidget::OnChanged(int id, Evas_Object *obj)
-{
-       char *timestr = NULL;
-       int value;
-
-       if (m->controller.PlayState() == PLAY_STATUS_PLAY) {
-               if (m->etSlider)
-                       ecore_timer_freeze(m->etSlider);
-       }
-
-       value = elm_slider_value_get(obj);
-       m->controller.SetPosition(value);
-       timestr = CCommonUI::TimeStrFromMilSeconds(value);
-       if (timestr) {
-               elm_object_part_text_set(m->eoBase, MUSIC_PART_PROGRESSTIME,
-                       timestr);
-               free(timestr);
-       }
-
-       if (m->controller.PlayState() == PLAY_STATUS_PLAY) {
-               if (m->etSlider)
-                       ecore_timer_thaw(m->etSlider);
-       }
-}
-
-
-void CSliderWidget::OnMouseMove(int id, Evas *e, Evas_Object *obj, Evas_Event_Mouse_Move *ev)
-{
-       if (!elm_object_focus_get(obj))
-               elm_object_focus_set(obj, EINA_TRUE);
-}
-
-
-// STimer
-struct STimer {
-       int count;
-       int s, e;
-       struct SCookie {
-               Ecore_Timer *etTimer;
-               CTimer *root;
-               int     id;
-               SCookie(CTimer *timer, int _id) {
-                       root = timer;
-                       id = _id;
-               }
-       };
-
-       Eina_List *elList;
-};
-
-
-Eina_Bool CTimer::sm_CbTimer(void *data)
-{
-       STimer::SCookie *cookie = (STimer::SCookie*)data;
-
-       if (cookie->root)
-               cookie->root->t_OnTimer(cookie->id);
-
-       cookie->root->m->elList = eina_list_remove(cookie->root->m->elList, cookie);
-
-       delete cookie;
-
-       return EINA_FALSE;
-}
-
-
-void CTimer::t_OnTimer(int id)
-{
-}
-
-
-bool CTimer::Create(void)
-{
-       ASSERT(!m);
-
-       m = new STimer;
-       if (!m)
-               return false;
-
-       m->elList = NULL;
-
-       return true;
-}
-
-
-void CTimer::Destroy(void)
-{
-       ASSERT(m);
-
-       delete m;
-       m = NULL;
-}
-
-
-bool CTimer::SetTimer(int id, int ms)
-{
-       ASSERT(m);
-
-
-       STimer::SCookie *cookie = new STimer::SCookie(this, id);
-       if (!cookie)
-               return false;
-
-       m->elList = eina_list_append(m->elList, cookie);
-       cookie->etTimer = ecore_timer_add(ms, sm_CbTimer, cookie);
-       return true;
-}
-
-
-void CTimer::KillTimer(int id)
-{
-       ASSERT(m);
-}
-
-
-// CPlaybackView
 enum EEvasObject {
        EO_BASE,
-
-       EO_ERROR_POPUP_BUTTON,
-
-       EO_CANCEL,
-       EO_DESELECT,
-       EO_DELETE,           // TOTAL_EDIT_BTNS
-
-       EO_BTN_SETTINGS,
-       EO_BTN_SHUFFLE,
-       EO_BTN_REPEAT,
-       EO_BTN_REWIND,
-       EO_BTN_PLAY,
-       EO_BTN_FORWARD,   // TOTAL_CONTROL_BTNS
-
        EO_PLAYLIST,
 };
 
-
-enum EControlBtns {
-       BTN_SETTINGS,
-       BTN_SHUFFLE,
-       BTN_REPEAT,
-       BTN_REWIND,
-       BTN_PLAY,
-       BTN_FORWARD
-};
-
-enum ESettingBtns {
-       BTN_EDIT,
-       BTN_CLEAR
-};
-
-enum EEditBtns {
-       BTN_CANCEL,
-       BTN_DESELECT,
-       BTN_DELETE
-};
-
-enum ETimers {
-       TIMER_WAIT,
-       TIMER_LONGPRESS,
-       TIMER_VOLUME
-};
-
-enum EPressTypes {
-       PRESS_SHORT,
-       PRESS_SHORT_PAUSE,
-       PRESS_LONG,
-       PRESS_LONG_PAUSE,
-};
-
 struct SItemInfo {
        Elm_Object_Item *item;
        CSongInfo *sinfo;
@@ -451,28 +56,24 @@ struct SPlaybackView {
        Evas_Object *eoWin;
 
        Evas_Object *eoBase;
-       CPlaySettingCtxPopup *eoCtxPopup;
-       Evas_Object *eoErrPopup;
        Evas_Object *eoPlaylist;
 
        Elm_Object_Item *focused_item;
 
+       CPlaybackController *pPlaybackController;
+       // These are reference values.
        Evas_Object *eoBtnControl[TOTAL_CONTROL_BTNS];
        Evas_Object *eoBtnEdit[TOTAL_EDIT_BTNS];
 
        Evas_Object *eoAlbumCover;
        CSliderWidget *pSliderWidget;
-       Evas_Object *eoPressedObj;
 
-       Eina_List   *elInfo;
-       Ecore_Timer *etLongPress;
-       Ecore_Timer *etWait;
+       Eina_List *elInfo;
        CMusicController *pController; //! NOT NULL
        CSongInfo *csinfo;
        CViewMgr *mgr;
        SItemInfo *cs_itinfo;
        SContentInfo *ctxtinfo;
-       EPressTypes press_status;
 
        CHandleVolume *pHandleVolume;
 
@@ -481,54 +82,6 @@ struct SPlaybackView {
        }
 };
 
-struct SBtnInfo {
-       const char *txt;
-       const char *part;
-       EEvasObject type;
-};
-
-
-Eina_Bool CPlaybackView::sm_CbLongpressTimer(void *dt)
-{
-       CPlaybackView *root = (CPlaybackView *)dt;
-       if (root)
-               root->m_OnLongpressTimer();
-
-       return ECORE_CALLBACK_RENEW;
-}
-
-
-void CPlaybackView::m_OnLongpressTimer(void)
-{
-       m_HandleOnRepeated();
-}
-
-
-Eina_Bool CPlaybackView::sm_CbWaitTimer(void *dt)
-{
-       CPlaybackView *root = (CPlaybackView *)dt;
-       if (root)
-               root->m_OnWaitTimer();
-
-       return ECORE_CALLBACK_CANCEL;
-}
-
-
-void CPlaybackView::m_OnWaitTimer(void)
-{
-       m->press_status = PRESS_LONG;
-       if (m->pController->PlayState() == PLAY_STATUS_PLAY) {
-               /* Handle long press */
-               m_PlaybackPause();
-               m->etLongPress = ecore_timer_add(LP_INTERVAL, sm_CbLongpressTimer, this);
-       }
-       else {
-               m->press_status = PRESS_LONG_PAUSE;
-       }
-
-       m->etWait = NULL;
-}
-
 
 void CPlaybackView::sm_CbCtxtUpdate(void *dt, enum EActionType type, int lid)
 {
@@ -618,77 +171,20 @@ void CPlaybackView::m_OnCtxtClose(void)
 }
 
 
-void CPlaybackView::sm_CbCtxPopupBtnSelected(void* cookie, CContextPopup* instance, const char* text)
+int CPlaybackView::sm_CbCurrentSongCount(void *cookie)
 {
        CPlaybackView *root = (CPlaybackView *)cookie;
+       int ret = 0;
        if (root)
-               root->m_CbCtxPopupBtnSelected(instance, text);
-}
-
-
-void CPlaybackView::m_CbCtxPopupBtnSelected(CContextPopup* instance, const char* text)
-{
-       int type = CInfo::PlaybackSettingType();
-
-       switch (type) {
-       case BTN_EDIT:
-               m_FromPlaybackToEditMode();
-               break;
-
-       case BTN_CLEAR:
-               m->pController->Stop();
-               m->pController->EmptyPlaylist();
-               eina_list_free(m->elInfo);
-               m->elInfo = NULL;
-               elm_genlist_clear(m->eoPlaylist);
-               m_UpdateEmptySongInfo();
-               break;
-
-       default:
-               break;
-       }
-}
+               ret = root->m_CbCurrentSongCount();
 
-
-void CPlaybackView::m_RemoveTimer(int timer_code)
-{
-       ETimers timerCode = (ETimers)timer_code;
-
-       switch (timerCode) {
-       case TIMER_WAIT:
-               if (m->etWait) {
-                       ecore_timer_del(m->etWait);
-                       m->etWait = NULL;
-               }
-               break;
-
-       case TIMER_LONGPRESS:
-               if (m->etLongPress) {
-                       ecore_timer_del(m->etLongPress);
-                       m->etLongPress = NULL;
-               }
-               break;
-
-       case TIMER_VOLUME:
-               m->pHandleVolume->RemoveTimer();
-               break;
-
-       default:
-               _ERR(" invalid value ");
-               break;
-       }
-}
-
-
-void CPlaybackView::m_PlaybackPause(void)
-{
-       m->pController->Pause();
+       return ret;
 }
 
 
-void CPlaybackView::m_PlaybackResume(void)
+int CPlaybackView::m_CbCurrentSongCount(void)
 {
-       m->pController->Resume();
+       return eina_list_count(m->elInfo);
 }
 
 
@@ -742,83 +238,6 @@ void CPlaybackView::m_UnselectItem(SItemInfo *pItemInfo)
 }
 
 
-void CPlaybackView::m_UpdateControlBtns(void)
-{
-       int state;
-
-       state = m->pController->PlayState();
-       switch (state) {
-       case PLAY_STATUS_INITIAL:
-               // Initial State, Do nothing
-               break;
-
-       case PLAY_STATUS_STOP:
-               if (!m->eoErrPopup)
-                       elm_object_focus_set(m->eoBtnControl[BTN_PLAY], EINA_TRUE);
-               elm_object_disabled_set(m->eoBtnControl[BTN_FORWARD], EINA_TRUE);
-               elm_object_disabled_set(m->eoBtnControl[BTN_REWIND], EINA_TRUE);
-               break;
-
-       case PLAY_STATUS_PLAY:
-               elm_object_disabled_set(m->eoBtnControl[BTN_FORWARD], EINA_FALSE);
-               elm_object_disabled_set(m->eoBtnControl[BTN_REWIND], EINA_FALSE);
-               elm_object_signal_emit(m->eoBtnControl[BTN_PLAY],
-                       MUSIC_SIGNAL_PLAY, MUSIC_PLAYBACK_VIEW);
-               break;
-
-       case PLAY_STATUS_PAUSE:
-               elm_object_disabled_set(m->eoBtnControl[BTN_FORWARD], EINA_FALSE);
-               elm_object_disabled_set(m->eoBtnControl[BTN_REWIND], EINA_FALSE);
-               elm_object_signal_emit(m->eoBtnControl[BTN_PLAY],
-                       MUSIC_SIGNAL_PAUSE, MUSIC_PLAYBACK_VIEW);
-               break;
-
-       default:
-               ASSERT(!"Invalid State");
-               break;
-       }
-
-       state = m->pController->ShuffleState();
-       switch (state) {
-       case SHUFFLE_STATUS_OFF:
-               elm_object_signal_emit(m->eoBtnControl[BTN_SHUFFLE],
-                       MUSIC_SIGNAL_SHUFFLE_OFF, MUSIC_PLAYBACK_VIEW);
-               break;
-
-       case SHUFFLE_STATUS_ON:
-               elm_object_signal_emit(m->eoBtnControl[BTN_SHUFFLE],
-                       MUSIC_SIGNAL_SHUFFLE_ON, MUSIC_PLAYBACK_VIEW);
-               break;
-
-       default:
-               ASSERT(!"Invalid State");
-               break;
-       }
-
-       state = m->pController->RepeatState();
-       switch (state) {
-       case REPEAT_STATUS_NONE:
-               elm_object_signal_emit(m->eoBtnControl[BTN_REPEAT],
-                       MUSIC_SIGNAL_REPEAT_OFF, MUSIC_PLAYBACK_VIEW);
-               break;
-
-       case REPEAT_STATUS_ALL:
-               elm_object_signal_emit(m->eoBtnControl[BTN_REPEAT],
-                       MUSIC_SIGNAL_REPEAT_ALL, MUSIC_PLAYBACK_VIEW);
-               break;
-
-       case REPEAT_STATUS_ONE:
-               elm_object_signal_emit(m->eoBtnControl[BTN_REPEAT],
-                       MUSIC_SIGNAL_REPEAT_ONE, MUSIC_PLAYBACK_VIEW);
-               break;
-
-       default:
-               ASSERT(!"Invalid State");
-               break;
-       }
-}
-
-
 void CPlaybackView::m_UpdateCurrentSongThumbnail(void)
 {
        char *path = NULL;
@@ -859,17 +278,6 @@ void CPlaybackView::m_UpdateEmptySongInfo(void)
 {
        char buf[MAX_LENGTH];
 
-       elm_object_signal_emit(m->eoBtnControl[BTN_PLAY],
-               MUSIC_SIGNAL_PAUSE, MUSIC_PLAYBACK_VIEW);
-       elm_object_focus_set(m->eoBtnControl[BTN_SETTINGS], EINA_TRUE);
-       elm_object_focus_next_object_set(m->eoBtnControl[BTN_REPEAT],
-               m->eoBtnControl[BTN_REPEAT], ELM_FOCUS_RIGHT);
-       elm_object_disabled_set(m->eoBtnControl[BTN_FORWARD], EINA_TRUE);
-       elm_object_disabled_set(m->eoBtnControl[BTN_REWIND], EINA_TRUE);
-       elm_object_disabled_set(m->eoBtnControl[BTN_PLAY], EINA_TRUE);
-       elm_object_part_text_set(m->eoBase, MUSIC_PART_FULLTIME, "00:00");
-       elm_object_part_text_set(m->eoBase, MUSIC_PART_PROGRESSTIME, "00:00");
-
        m->pSliderWidget->Init();
 
        elm_object_part_text_set(m->eoBase, MUSIC_PART_SONG_TITLE,
@@ -929,37 +337,39 @@ void CPlaybackView::m_UpdateCurrentSongItem(int index)
 
 void CPlaybackView::m_UpdateEditmodeFocusSequence(void)
 {
-       elm_object_focus_next_object_set(m->eoPlaylist, m->eoBtnEdit[BTN_CANCEL], ELM_FOCUS_LEFT);
-       elm_object_focus_next_object_set(m->eoBtnEdit[BTN_CANCEL], m->eoPlaylist, ELM_FOCUS_RIGHT);
-       elm_object_focus_next_object_set(m->pSliderWidget->Base(), m->eoBtnEdit[BTN_CANCEL], ELM_FOCUS_DOWN);
+       elm_object_focus_next_object_set(m->eoPlaylist, m->eoBtnEdit[EDIT_BTN_CANCEL], ELM_FOCUS_LEFT);
+       elm_object_focus_next_object_set(m->eoBtnEdit[EDIT_BTN_CANCEL], m->eoPlaylist, ELM_FOCUS_RIGHT);
+       elm_object_focus_next_object_set(m->pSliderWidget->Base(), m->eoBtnEdit[EDIT_BTN_CANCEL], ELM_FOCUS_DOWN);
 }
 
 
 void CPlaybackView::m_UpdatePlaymodeFocusSequence(void)
 {
-       elm_object_focus_next_object_set(m->pSliderWidget->Base(), m->eoPlaylist,             ELM_FOCUS_UP);
-       elm_object_focus_next_object_set(m->pSliderWidget->Base(), m->eoBtnControl[BTN_PLAY], ELM_FOCUS_DOWN);
        switch (m->pController->PlayState()) {
        case PLAY_STATUS_INITIAL:
                // Do nothing
                break;
 
        case PLAY_STATUS_STOP:
-               elm_object_focus_next_object_set(m->eoPlaylist, m->eoBtnControl[BTN_PLAY], ELM_FOCUS_LEFT);
-               elm_object_focus_next_object_set(m->eoBtnControl[BTN_PLAY], m->eoPlaylist, ELM_FOCUS_RIGHT);
-               elm_object_focus_next_object_set(m->eoBtnControl[BTN_PLAY], m->eoBtnControl[BTN_REPEAT], ELM_FOCUS_LEFT);
-               elm_object_focus_next_object_set(m->eoBtnControl[BTN_REPEAT], m->eoBtnControl[BTN_PLAY], ELM_FOCUS_RIGHT);
-               elm_object_signal_emit(m->eoBtnControl[BTN_PLAY], MUSIC_SIGNAL_PAUSE, MUSIC_PLAYBACK_VIEW);
+               elm_object_focus_next_object_set(m->eoPlaylist, m->eoBtnControl[CTRL_BTN_PLAY], ELM_FOCUS_LEFT);
+               elm_object_focus_next_object_set(m->eoBtnControl[CTRL_BTN_PLAY], m->eoPlaylist, ELM_FOCUS_RIGHT);
+               elm_object_focus_next_object_set(m->eoBtnControl[CTRL_BTN_PLAY], m->eoBtnControl[CTRL_BTN_REPEAT], ELM_FOCUS_LEFT);
+               elm_object_focus_next_object_set(m->eoBtnControl[CTRL_BTN_REPEAT], m->eoBtnControl[CTRL_BTN_PLAY], ELM_FOCUS_RIGHT);
+               elm_object_signal_emit(m->eoBtnControl[CTRL_BTN_PLAY], MUSIC_SIGNAL_PAUSE, MUSIC_PLAYBACK_VIEW);
                break;
 
        case PLAY_STATUS_PLAY:
        case PLAY_STATUS_PAUSE:
                elm_object_focus_next_object_set(m->eoPlaylist,
-                       m->eoBtnControl[BTN_FORWARD], ELM_FOCUS_LEFT);
-               elm_object_focus_next_object_set(m->eoBtnControl[BTN_FORWARD],
+                       m->eoBtnControl[CTRL_BTN_FORWARD], ELM_FOCUS_LEFT);
+               elm_object_focus_next_object_set(m->eoBtnControl[CTRL_BTN_FORWARD],
                        m->eoPlaylist, ELM_FOCUS_RIGHT);
-               elm_object_focus_next_object_set(m->eoBtnControl[BTN_PLAY],
-                       m->eoBtnControl[BTN_FORWARD], ELM_FOCUS_RIGHT);
+               elm_object_focus_next_object_set(m->eoBtnControl[CTRL_BTN_PLAY],
+                       m->eoBtnControl[CTRL_BTN_FORWARD], ELM_FOCUS_RIGHT);
+               elm_object_focus_next_object_set(m->eoBtnControl[CTRL_BTN_PLAY],
+                       m->eoBtnControl[CTRL_BTN_REWIND], ELM_FOCUS_LEFT);
+               elm_object_focus_next_object_set(m->eoBtnControl[CTRL_BTN_REPEAT],
+                       m->eoBtnControl[CTRL_BTN_REWIND], ELM_FOCUS_RIGHT);
                break;
 
        default:
@@ -992,104 +402,29 @@ void CPlaybackView::m_UpdateCurrentSongInfo(void)
 
        m_UpdateCurrentSongItem(index);
        m_UpdateCurrentSongLabels();
-       m_UpdateCurrentSongThumbnail();
-       m_UpdateControlBtns();
-       m_UpdatePlaymodeFocusSequence();
-}
-
-
-void CPlaybackView::m_DisableEditButtons(bool flag)
-{
-       /* flag - 1 means disable edit buttons and 0 means enable */
-       if (flag)
-               elm_object_focus_set(m->eoBtnEdit[BTN_CANCEL], EINA_TRUE);
-
-       elm_object_disabled_set(m->eoBtnEdit[BTN_DELETE], (Eina_Bool)flag);
-       elm_object_disabled_set(m->eoBtnEdit[BTN_DESELECT], (Eina_Bool)flag);
-       if (flag) {
-               m_UpdateEditmodeFocusSequence();
-               elm_object_focus_set(m->eoBtnEdit[BTN_CANCEL], EINA_TRUE);
-       }
-       else {
-               elm_object_focus_next_object_set(m->eoBtnEdit[BTN_CANCEL], m->eoBtnEdit[BTN_DESELECT], ELM_FOCUS_RIGHT);
-               elm_object_focus_next_object_set(m->eoBtnEdit[BTN_DELETE], m->eoPlaylist,              ELM_FOCUS_RIGHT);
-               elm_object_focus_next_object_set(m->eoPlaylist,            m->eoBtnEdit[BTN_DELETE],   ELM_FOCUS_LEFT);
-       }
-}
-
-
-void CPlaybackView::m_CreateErrorPopup(void)
-{
-       Evas_Object *popup = NULL, *btn = NULL, *label = NULL;
-
-       popup = elm_popup_add(m->eoBase);
-       if (!popup)
-               return;
-
-       elm_object_style_set(popup, MUSIC_STYLE_ERROR_POPUP);
-       evas_object_show(popup);
-
-       label = elm_label_add(popup);
-       if (!label) {
-               evas_object_del(popup);
-               return;
-       }
-
-       elm_object_style_set(label, MUSIC_STYLE_ERROR_LABEL);
-       elm_object_text_set(label, MUSIC_TEXT_PLAYBACK_ERROR);
-       elm_object_content_set(popup, label);
-
-       btn = elm_button_add(popup);
-       if (!btn) {
-               evas_object_del(popup);
-               return;
-       }
-
-       elm_object_style_set(btn, MUSIC_STYLE_EDIT_BTN);
-       elm_object_text_set(btn, MUSIC_TEXT_OK);
-       elm_object_part_content_set(popup, MUSIC_PART_POPUP_BUTTON, btn);
-
-       m->eoErrPopup = popup;
-
-       Connect(btn, EO_ERROR_POPUP_BUTTON, TYPE_CLICKED | TYPE_KEY_DOWN);
-
-       elm_object_focus_set(btn, EINA_TRUE);
-
-       return;
-}
-
-
-void CPlaybackView::m_DestroyErrorPopup(void)
-{
-       if (!m->eoErrPopup)
-               return;
-
-       evas_object_del(m->eoErrPopup);
-       m->eoErrPopup = NULL;
-}
-
-
-void CPlaybackView::m_CreateSettingsPopup(void)
-{
-       CContextPopup::SCallback cb;
-       cb.cookie = this;
-       cb.onSelected = sm_CbCtxPopupBtnSelected;
-
-       m->eoCtxPopup = new CPlaySettingCtxPopup;
-       m->eoCtxPopup->Create(m->eoWin, &cb);
+       m_UpdateCurrentSongThumbnail();
+       m->pPlaybackController->Update();
+       m_UpdatePlaymodeFocusSequence();
 }
 
 
-void CPlaybackView::m_DestroySettingsPopup(void)
+void CPlaybackView::m_DisableEditButtons(bool flag)
 {
-       if (!m->eoCtxPopup)
-               return;
-
-       if (m->eoCtxPopup->FlagCreate())
-               m->eoCtxPopup->Destroy();
+       /* flag - 1 means disable edit buttons and 0 means enable */
+       if (flag)
+               elm_object_focus_set(m->eoBtnEdit[EDIT_BTN_CANCEL], EINA_TRUE);
 
-       delete m->eoCtxPopup;
-       m->eoCtxPopup = NULL;
+       elm_object_disabled_set(m->eoBtnEdit[EDIT_BTN_DELETE], (Eina_Bool)flag);
+       elm_object_disabled_set(m->eoBtnEdit[EDIT_BTN_DESELECT], (Eina_Bool)flag);
+       if (flag) {
+               m_UpdateEditmodeFocusSequence();
+               elm_object_focus_set(m->eoBtnEdit[EDIT_BTN_CANCEL], EINA_TRUE);
+       }
+       else {
+               elm_object_focus_next_object_set(m->eoBtnEdit[EDIT_BTN_CANCEL], m->eoBtnEdit[EDIT_BTN_DESELECT], ELM_FOCUS_RIGHT);
+               elm_object_focus_next_object_set(m->eoBtnEdit[EDIT_BTN_DELETE], m->eoPlaylist, ELM_FOCUS_RIGHT);
+               elm_object_focus_next_object_set(m->eoPlaylist, m->eoBtnEdit[EDIT_BTN_DELETE], ELM_FOCUS_LEFT);
+       }
 }
 
 
@@ -1104,7 +439,7 @@ void CPlaybackView::m_FromEditToPlaybackMode(void)
 
        elm_object_signal_emit(m->eoBase, MUSIC_SIGNAL_PLAYBACK_MODE,
                MUSIC_PLAYBACK_VIEW);
-       elm_object_focus_set(m->eoBtnControl[BTN_SETTINGS], EINA_TRUE);
+       elm_object_focus_set(m->eoBtnControl[CTRL_BTN_SETTINGS], EINA_TRUE);
 
        m_ChangeEditmodeAll(m->elInfo, false);
 
@@ -1121,7 +456,7 @@ void CPlaybackView::m_FromPlaybackToEditMode(void)
 
        m_DisableEditButtons(true);
 
-       elm_object_focus_set(m->eoBtnEdit[BTN_CANCEL], EINA_TRUE);
+       elm_object_focus_set(m->eoBtnEdit[EDIT_BTN_CANCEL], EINA_TRUE);
 
        m_ChangeEditmodeAll(m->elInfo, true);
 
@@ -1131,60 +466,6 @@ void CPlaybackView::m_FromPlaybackToEditMode(void)
 }
 
 
-void CPlaybackView::m_HandleOnRepeated(void)
-{
-       Evas_Object *obj = NULL;
-       int value;
-       int duration;
-       char *timestr = NULL;
-
-       if (!m->eoPressedObj)
-               return;
-
-       obj = m->eoPressedObj;
-
-
-       m->pController->GetPosition(&value);
-       duration = m->cs_itinfo->sinfo->Duration();
-
-       if (obj == m->eoBtnControl[BTN_REWIND]) {
-               if (value == 0) {
-                       m_RemoveTimer(TIMER_LONGPRESS);
-                       return;
-               }
-               value = value - LP_CHANGE;
-               if (value <= 0)
-                       value = 0;
-       }
-       else {
-               if (value == duration) {
-                       m->pController->PlayNextSong();
-
-                       m->press_status = PRESS_LONG_PAUSE;
-                       elm_object_signal_emit(m->eoBtnControl[BTN_PLAY], MUSIC_SIGNAL_PAUSE,
-                               MUSIC_PLAYBACK_VIEW);
-                       m_PlaybackPause();
-                       m_RemoveTimer(TIMER_LONGPRESS);
-
-                       return;
-               }
-               value = value + LP_CHANGE;
-               if (value >= duration)
-                       value = duration;
-       }
-
-       m->pController->SetPosition(value);
-       timestr = CCommonUI::TimeStrFromMilSeconds(value);
-       if (timestr) {
-               elm_object_part_text_set(m->eoBase, MUSIC_PART_PROGRESSTIME,
-                       timestr);
-               free(timestr);
-       }
-
-       return;
-}
-
-
 void CPlaybackView::m_DeleteSelectedItems(void)
 {
        Eina_List *l = NULL, *l_next = NULL;
@@ -1215,7 +496,7 @@ void CPlaybackView::m_DeleteSelectedItems(void)
        if (eina_list_count(m->elInfo) == 0) {
                m_UpdateEmptySongInfo();
                elm_genlist_realized_items_update(m->eoPlaylist);
-               elm_object_focus_set(m->eoBtnEdit[BTN_CANCEL], EINA_TRUE);
+               elm_object_focus_set(m->eoBtnEdit[EDIT_BTN_CANCEL], EINA_TRUE);
                return;
        }
 
@@ -1223,18 +504,12 @@ void CPlaybackView::m_DeleteSelectedItems(void)
                m_UpdateCurrentSongInfo();
 
        elm_genlist_realized_items_update(m->eoPlaylist);
-       elm_object_focus_set(m->eoBtnEdit[BTN_CANCEL], EINA_TRUE);
+       elm_object_focus_set(m->eoBtnEdit[EDIT_BTN_CANCEL], EINA_TRUE);
 }
 
 
 void CPlaybackView::m_KeyBackPress(void)
 {
-       if (m->eoCtxPopup) {
-               m_DestroySettingsPopup();
-               elm_object_focus_set(m->eoBtnControl[BTN_SETTINGS], EINA_TRUE);
-               return;
-       }
-
        t_OnHide();
 
        if (!CViewMgr::GetInstance()->ShowView(MUSIC_BASE_VIEW))
@@ -1261,13 +536,13 @@ void CPlaybackView::m_KeyPlayPress(void)
 {
        int state;
 
-       if (elm_object_disabled_get(m->eoBtnControl[BTN_PLAY]))
+       if (elm_object_disabled_get(m->eoBtnControl[CTRL_BTN_PLAY]))
                return;
 
        state = m->pController->PlayState();
        if (state == PLAY_STATUS_PAUSE) {
-               m_PlaybackResume();
-               elm_object_signal_emit(m->eoBtnControl[BTN_PLAY],
+               m->pController->Resume();
+               elm_object_signal_emit(m->eoBtnControl[CTRL_BTN_PLAY],
                        MUSIC_SIGNAL_PLAY, MUSIC_PLAYBACK_VIEW);
        }
        else if (state != PLAY_STATUS_PLAY) {
@@ -1280,51 +555,51 @@ void CPlaybackView::m_KeyPausePress(void)
 {
        int state;
 
-       if (elm_object_disabled_get(m->eoBtnControl[BTN_PLAY]))
+       if (elm_object_disabled_get(m->eoBtnControl[CTRL_BTN_PLAY]))
                return;
 
        state = m->pController->PlayState();
        if (state == PLAY_STATUS_PLAY) {
-               elm_object_signal_emit(m->eoBtnControl[BTN_PLAY],
+               elm_object_signal_emit(m->eoBtnControl[CTRL_BTN_PLAY],
                        MUSIC_SIGNAL_PAUSE, MUSIC_PLAYBACK_VIEW);
-               m_PlaybackPause();
+               m->pController->Pause();
        }
 }
 
 
 void CPlaybackView::m_KeyNextPress(void)
 {
-       if (elm_object_disabled_get(m->eoBtnControl[BTN_FORWARD]))
+       if (elm_object_disabled_get(m->eoBtnControl[CTRL_BTN_FORWARD]))
                return;
 
-       m_HandleOnPressed(m->eoBtnControl[BTN_FORWARD]);
+       m->pController->HandleRemoteButtons(m->eoBtnControl[CTRL_BTN_FORWARD], EVENT_PRESSED);
 }
 
 
 void CPlaybackView::m_KeyPreviousPress(void)
 {
-       if (elm_object_disabled_get(m->eoBtnControl[BTN_REWIND]))
+       if (elm_object_disabled_get(m->eoBtnControl[CTRL_BTN_REWIND]))
                return;
 
-       m_HandleOnPressed(m->eoBtnControl[BTN_REWIND]);
+       m->pController->HandleRemoteButtons(m->eoBtnControl[CTRL_BTN_REWIND], EVENT_PRESSED);
 }
 
 
 void CPlaybackView::m_KeyNextUnpress(void)
 {
-       if (elm_object_disabled_get(m->eoBtnControl[BTN_FORWARD]))
+       if (elm_object_disabled_get(m->eoBtnControl[CTRL_BTN_FORWARD]))
                return;
 
-       m_HandleOnUnpressed(m->eoBtnControl[BTN_FORWARD]);
+       m->pController->HandleRemoteButtons(m->eoBtnControl[CTRL_BTN_FORWARD], EVENT_UNPRESSED);
 }
 
 
 void CPlaybackView::m_KeyPreviousUnpress(void)
 {
-       if (elm_object_disabled_get(m->eoBtnControl[BTN_REWIND]))
+       if (elm_object_disabled_get(m->eoBtnControl[CTRL_BTN_REWIND]))
                return;
 
-       m_HandleOnUnpressed(m->eoBtnControl[BTN_REWIND]);
+       m->pController->HandleRemoteButtons(m->eoBtnControl[CTRL_BTN_REWIND], EVENT_UNPRESSED);
 }
 
 
@@ -1343,11 +618,14 @@ void CPlaybackView::m_HandleKeyPress(char *keyname)
                m_KeyNextPress();
        else if (!strcmp(keyname, (char *)KEY_PREVIOUS))
                m_KeyPreviousPress();
-       else if (!strcmp(keyname, (char *)KEY_VOLUMEUP))
+       else if (!strcmp(keyname, (char *)KEY_VOLUMEUP) ||
+               !strcmp(keyname, (char *)KEY_VOLUMEUP_REMOTE))
                m->pHandleVolume->Up();
-       else if (!strcmp(keyname, (char *)KEY_VOLUMEDOWN))
+       else if (!strcmp(keyname, (char *)KEY_VOLUMEDOWN) ||
+               !strcmp(keyname, (char *)KEY_VOLUMEDOWN_REMOTE))
                m->pHandleVolume->Down();
-       else if (!strcmp(keyname, (char *)KEY_MUTE))
+       else if (!strcmp(keyname, (char *)KEY_MUTE) ||
+               !strcmp(keyname, (char *)KEY_MUTE_REMOTE))
                m->pHandleVolume->Mute();
 }
 
@@ -1390,104 +668,6 @@ void CPlaybackView::m_AddCurrentSonginfo(void)
 }
 
 
-void CPlaybackView::m_AddEditPlaylistButtons(void)
-{
-       Evas_Object *box = NULL;
-       int i;
-       SBtnInfo btninfo[TOTAL_EDIT_BTNS];
-
-       btninfo[BTN_CANCEL].txt = MUSIC_TEXT_CANCEL;
-       btninfo[BTN_CANCEL].type = EO_CANCEL;
-
-       btninfo[BTN_DESELECT].txt = MUSIC_TEXT_DESELECT;
-       btninfo[BTN_DESELECT].type = EO_DESELECT;
-
-       btninfo[BTN_DELETE].txt = MUSIC_TEXT_DELETE;
-       btninfo[BTN_DELETE].type = EO_DELETE;
-
-       box = CCommonUI::AddBox(m->eoBase);
-       if (!box)
-               return;
-
-       elm_box_horizontal_set(box, EINA_TRUE);
-       elm_box_padding_set(box, MUSIC_EDIT_BTNS_PADDING * elm_config_scale_get(), 0);
-
-       for (i = 0; i < TOTAL_EDIT_BTNS; i++) {
-               m->eoBtnEdit[i] = elm_button_add(m->eoBase);
-               if (!m->eoBtnEdit[i])
-                       continue;
-
-               elm_object_style_set(m->eoBtnEdit[i], MUSIC_STYLE_EDIT_BTN);
-               evas_object_size_hint_weight_set(m->eoBtnEdit[i], EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
-               elm_box_pack_end(box, m->eoBtnEdit[i]);
-               elm_object_text_set(m->eoBtnEdit[i], _(btninfo[i].txt));
-
-               Connect(m->eoBtnEdit[i], btninfo[i].type, TYPE_CLICKED | TYPE_MOUSE_MOVE);
-
-               evas_object_show(m->eoBtnEdit[i]);
-       }
-       elm_object_part_content_set(m->eoBase, MUSIC_PART_EDITBTNS, box);
-       elm_object_signal_emit(m->eoBase, MUSIC_SIGNAL_PLAYBACK_MODE, MUSIC_PLAYBACK_VIEW);
-}
-
-
-void CPlaybackView::m_AddControlButtons(void)
-{
-       Evas_Object *box = NULL;
-       int i;
-       SBtnInfo btninfo[TOTAL_CONTROL_BTNS];
-
-       btninfo[BTN_SETTINGS].txt = MUSIC_STYLE_BTN_SETTINGS;
-       btninfo[BTN_SETTINGS].type = EO_BTN_SETTINGS;
-
-       btninfo[BTN_SHUFFLE].txt = MUSIC_STYLE_BTN_SHUFFLE;
-       btninfo[BTN_SHUFFLE].type = EO_BTN_SHUFFLE;
-
-       btninfo[BTN_REPEAT].txt = MUSIC_STYLE_BTN_REPEAT;
-       btninfo[BTN_REPEAT].type = EO_BTN_REPEAT;
-
-       btninfo[BTN_REWIND].txt = MUSIC_STYLE_BTN_REWIND;
-       btninfo[BTN_REWIND].type = EO_BTN_REWIND;
-
-       btninfo[BTN_PLAY].txt = MUSIC_STYLE_BTN_PLAY;
-       btninfo[BTN_PLAY].type = EO_BTN_PLAY;
-
-       btninfo[BTN_FORWARD].txt = MUSIC_STYLE_BTN_FORWARD;
-       btninfo[BTN_FORWARD].type = EO_BTN_FORWARD;
-
-       box = elm_box_add(m->eoBase);
-       if (!box)
-               return;
-
-       evas_object_size_hint_weight_set(box, EVAS_HINT_EXPAND, 0);
-       evas_object_size_hint_align_set(box, EVAS_HINT_FILL, 0);
-       elm_box_horizontal_set(box, EINA_TRUE);
-       elm_box_padding_set(box,
-               MUSIC_CONTROL_BTNS_PADDING * elm_config_scale_get(), 0);
-
-       for (i = 0; i < TOTAL_CONTROL_BTNS; i++) {
-               m->eoBtnControl[i] = elm_button_add(m->eoBase);
-               if (!m->eoBtnControl[i])
-                       continue;
-
-               elm_object_style_set(m->eoBtnControl[i], btninfo[i].txt);
-               evas_object_size_hint_weight_set(m->eoBtnControl[i],
-                       EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
-               elm_box_pack_end(box, m->eoBtnControl[i]);
-
-               if (i == BTN_REWIND || i == BTN_FORWARD) {
-                       Connect(m->eoBtnControl[i], btninfo[i].type, TYPE_PRESSED | TYPE_UNPRESSED | TYPE_MOUSE_MOVE);
-               }
-               else {
-                       Connect(m->eoBtnControl[i], btninfo[i].type, TYPE_CLICKED | TYPE_MOUSE_MOVE);
-               }
-               evas_object_show(m->eoBtnControl[i]);
-       }
-
-       elm_object_part_content_set(m->eoBase, MUSIC_PART_CONTROLBTNS, box);
-}
-
-
 SItemInfo *CPlaybackView::m_FindItemInfoFromSong(Eina_List *list, CSongInfo *sinfo)
 {
        Eina_List *l = NULL;
@@ -1736,72 +916,6 @@ void CPlaybackView::m_RemovePlaylist(void)
 }
 
 
-void CPlaybackView::m_HandleRewindBtnClicked(Evas_Object *obj)
-{
-       elm_object_signal_emit(obj, MUSIC_SIGNAL_BTN_CLICKED,
-               MUSIC_PLAYBACK_VIEW);
-
-       if (m->pController->PlayState() == PLAY_STATUS_STOP)
-               return;
-
-       if (!m->pController->PlayPreviousSong()){
-               _ERR(" music play previous song failed ");
-               return;
-       }
-}
-
-
-void CPlaybackView::m_HandleForwardBtnClicked(Evas_Object *obj)
-{
-       elm_object_signal_emit(obj, MUSIC_SIGNAL_BTN_CLICKED,
-               MUSIC_PLAYBACK_VIEW);
-
-       if (m->pController->PlayState() == PLAY_STATUS_STOP)
-               return;
-
-       if (!m->pController->PlayNextSong()) {
-               _ERR(" music play next song failed ");
-               return;
-       }
-}
-
-
-void CPlaybackView::m_HandleOnPressed(Evas_Object *obj)
-{
-       m->press_status = PRESS_SHORT;
-       m->eoPressedObj = obj;
-
-       m->etWait = ecore_timer_add(WAIT_INTERVAL, sm_CbWaitTimer, this);
-}
-
-
-void CPlaybackView::m_HandleOnUnpressed(Evas_Object *obj)
-{
-       m_RemoveTimer(TIMER_WAIT);
-       m_RemoveTimer(TIMER_LONGPRESS);
-
-       if (m->press_status == PRESS_SHORT) {
-               /* Handle song change */
-               if (m->pController->PlayState() == PLAY_STATUS_PLAY)
-                       m_PlaybackPause();
-
-               if (obj == m->eoBtnControl[BTN_FORWARD])
-                       m_HandleForwardBtnClicked(obj);
-               else
-                       m_HandleRewindBtnClicked(obj);
-
-               if (m->pController->PlayState() != PLAY_STATUS_PLAY)
-                       m_PlaybackResume();
-       }
-       else if (m->press_status == PRESS_LONG) {
-               if (m->pController->PlayState() != PLAY_STATUS_PLAY)
-                       m_PlaybackResume();
-       }
-
-       m->press_status = PRESS_SHORT;
-}
-
-
 void CPlaybackView::m_HandleGenlistItemActivated(Evas_Object *obj, Elm_Object_Item *genListItem)
 {
        int index;
@@ -1832,6 +946,8 @@ bool CPlaybackView::Create(void *data)
 {
        ASSERT(!m);
 
+       CPlaybackController::SCallback cb;
+
        _CREATE_BEGIN{
                _CHECK(m = new SPlaybackView)
                _CHECK(m->mgr = CViewMgr::GetInstance())
@@ -1842,16 +958,23 @@ bool CPlaybackView::Create(void *data)
                _CHECK(CBaseView::Create(data))
                _CHECK(CTimer::Create());
                _CHECK(m->pController->AddListener(this))
+               _CHECK(m->pPlaybackController = new CPlaybackController)
+               _COMMAND{ cb.cookie = this; cb.OnCurrentSongCount = sm_CbCurrentSongCount; }
+               _CHECK(m->pPlaybackController->Create(m->eoBase, &cb))
 
                _WHEN_SUCCESS{
-                       m->press_status = PRESS_SHORT;
                        evas_object_data_set(m->eoBase, PLAYBACK_VIEW_DATA, m);
 
-                       m_AddControlButtons();
-                       m_AddEditPlaylistButtons();
                        m_AddCurrentSonginfo();
                        m_AddPlaylist();
 
+                       int i;
+                       for (i = 0; i < TOTAL_CONTROL_BTNS; i++)
+                               m->eoBtnControl[i] = m->pPlaybackController->ControlBtnsObject((EPlayerControlBtns)i);
+
+                       for (i = 0; i < TOTAL_EDIT_BTNS; i++)
+                               m->eoBtnEdit[i] = m->pPlaybackController->EditBtnsObject((EPlayerEditBtns)i);
+
                        m->pHandleVolume = new CHandleVolume;
                        m->pHandleVolume->Create(m->eoBase);
                        m_UpdatePlaymodeFocusSequence();
@@ -1859,6 +982,8 @@ bool CPlaybackView::Create(void *data)
                        Connect(m->eoBase, EO_BASE, TYPE_KEY_DOWN | TYPE_KEY_UP);
                }
 
+               _CHECK_FAIL{ m->pPlaybackController->Destroy(); }
+               _CHECK_FAIL{ delete m->pPlaybackController; }
                _CHECK_FAIL{ m->pController->RemoveListener(this); }
                _CHECK_FAIL{ CTimer::Destroy(); }
                _CHECK_FAIL{ CBaseView::Destroy(); }
@@ -1879,15 +1004,14 @@ void CPlaybackView::Destroy(void)
        ASSERT(m);
 
        Disconnect(m->eoBase);
-       m->pController->RemoveListener(this);
 
-       m_DestroyErrorPopup();
+       m->pPlaybackController->Destroy();
+       delete m->pPlaybackController;
 
-       m->pSliderWidget->Destroy();
+       m->pController->RemoveListener(this);
 
-       m_RemoveTimer(TIMER_WAIT);
-       m_RemoveTimer(TIMER_LONGPRESS);
-       m_DestroySettingsPopup();
+       m->pSliderWidget->Destroy();
+       delete m->pSliderWidget;
 
        m->pHandleVolume->Destroy();
        delete m->pHandleVolume;
@@ -1908,83 +1032,6 @@ Evas_Object* CPlaybackView::Base(void)
 }
 
 
-void CPlaybackView::t_OnClickedSettings(Evas_Object *obj)
-{
-       elm_object_signal_emit(obj, MUSIC_SIGNAL_BTN_CLICKED, MUSIC_PLAYBACK_VIEW);
-
-       if (eina_list_count(m->elInfo) == 0)
-               return;
-
-       elm_object_signal_emit(obj, MUSIC_SIGNAL_CONTROL_SELECTED, MUSIC_PLAYBACK_VIEW);
-       m_DestroySettingsPopup();
-       m_CreateSettingsPopup();
-}
-
-
-void CPlaybackView::t_OnClickedShuffle(Evas_Object *obj)
-{
-       elm_object_signal_emit(obj, MUSIC_SIGNAL_BTN_CLICKED, MUSIC_PLAYBACK_VIEW);
-
-       switch (m->pController->ShuffleState()) {
-       case SHUFFLE_STATUS_OFF:
-               m->pController->SetShuffleState(SHUFFLE_STATUS_ON);
-               elm_object_signal_emit(obj, MUSIC_SIGNAL_SHUFFLE_ON, MUSIC_PLAYBACK_VIEW);
-               break;
-
-       default:
-               m->pController->SetShuffleState(SHUFFLE_STATUS_OFF);
-               elm_object_signal_emit(obj, MUSIC_SIGNAL_SHUFFLE_OFF, MUSIC_PLAYBACK_VIEW);
-               break;
-       }
-}
-
-
-void CPlaybackView::t_OnClickedRepeat(Evas_Object *obj)
-{
-       elm_object_signal_emit(obj, MUSIC_SIGNAL_BTN_CLICKED, MUSIC_PLAYBACK_VIEW);
-
-       switch (m->pController->RepeatState()) {
-       case REPEAT_STATUS_NONE:
-               m->pController->SetRepeatState(REPEAT_STATUS_ALL);
-               elm_object_signal_emit(obj, MUSIC_SIGNAL_REPEAT_ALL, MUSIC_PLAYBACK_VIEW);
-               break;
-
-       case REPEAT_STATUS_ALL:
-               m->pController->SetRepeatState(REPEAT_STATUS_ONE);
-               elm_object_signal_emit(obj, MUSIC_SIGNAL_REPEAT_ONE, MUSIC_PLAYBACK_VIEW);
-               break;
-
-       default:
-               m->pController->SetRepeatState(REPEAT_STATUS_NONE);
-               elm_object_signal_emit(obj, MUSIC_SIGNAL_REPEAT_OFF, MUSIC_PLAYBACK_VIEW);
-               break;
-       }
-}
-
-
-void CPlaybackView::t_OnClickedPlay(Evas_Object *obj)
-{
-       elm_object_signal_emit(obj, MUSIC_SIGNAL_BTN_CLICKED, MUSIC_PLAYBACK_VIEW);
-
-       switch (m->pController->PlayState()) {
-       case PLAY_STATUS_PAUSE:
-               m_PlaybackResume();
-               elm_object_signal_emit(obj, MUSIC_SIGNAL_PLAY, MUSIC_PLAYBACK_VIEW);
-               break;
-
-       case PLAY_STATUS_PLAY:
-               elm_object_signal_emit(obj, MUSIC_SIGNAL_PAUSE, MUSIC_PLAYBACK_VIEW);
-               m_PlaybackPause();
-               break;
-
-       default:
-               if (m->pController)
-                       m->pController->Start();
-               break;
-       }
-}
-
-
 void CPlaybackView::t_OnShow(void)
 {
        ASSERT(m);
@@ -2028,11 +1075,11 @@ void CPlaybackView::t_OnUpdate(void *data)
        case E_PLAYLIST_UPDATE:
                m_RemovePlaylist();
                m_AddPlaylist();
-               elm_object_disabled_set(m->eoBtnControl[BTN_FORWARD], EINA_FALSE);
-               elm_object_disabled_set(m->eoBtnControl[BTN_REWIND], EINA_FALSE);
-               elm_object_disabled_set(m->eoBtnControl[BTN_PLAY], EINA_FALSE);
-               elm_object_focus_next_object_set(m->eoBtnControl[BTN_REPEAT],
-                       m->eoBtnControl[BTN_REWIND], ELM_FOCUS_RIGHT);
+               elm_object_disabled_set(m->eoBtnControl[CTRL_BTN_FORWARD], EINA_FALSE);
+               elm_object_disabled_set(m->eoBtnControl[CTRL_BTN_REWIND], EINA_FALSE);
+               elm_object_disabled_set(m->eoBtnControl[CTRL_BTN_PLAY], EINA_FALSE);
+               elm_object_focus_next_object_set(m->eoBtnControl[CTRL_BTN_REPEAT],
+                       m->eoBtnControl[CTRL_BTN_REWIND], ELM_FOCUS_RIGHT);
                m_FromEditToPlaybackMode();
                break;
 
@@ -2050,6 +1097,11 @@ void CPlaybackView::t_OnUpdate(void *data)
 }
 
 
+void CPlaybackView::t_OnTimer(int id)
+{
+}
+
+
 void CPlaybackView::t_OnHide(void)
 {
        ASSERT(m);
@@ -2065,14 +1117,6 @@ void CPlaybackView::OnKeyDown(int id, Evas *e, Evas_Object *obj, Evas_Event_Key_
                m_HandleKeyPress(ev->keyname);
                break;
 
-       case EO_ERROR_POPUP_BUTTON:
-               if (!strcmp(ev->keyname, KEY_BACK) ||
-                       !strcmp(ev->keyname, KEY_BACK_REMOTE)) {
-                       m_DestroyErrorPopup();
-                       elm_object_focus_set(m->eoBtnControl[BTN_PLAY], EINA_TRUE);
-               }
-               break;
-
        case EO_PLAYLIST:
                {
                        Elm_Object_Item *it = NULL;
@@ -2144,69 +1188,9 @@ void CPlaybackView::OnKeyUp(int id, Evas *e, Evas_Object *obj, Evas_Event_Key_Up
 }
 
 
-void CPlaybackView::OnMouseClicked(int id, Evas_Object *obj)
-{
-       switch (id) {
-       case EO_ERROR_POPUP_BUTTON:
-               m_DestroyErrorPopup();
-               elm_object_focus_set(m->eoBtnControl[BTN_PLAY], EINA_TRUE);
-               break;
-
-       case EO_CANCEL:
-               m_DisableCheckAll(m->elInfo);
-               m_DisableEditButtons(true);
-               m_FromEditToPlaybackMode();
-               break;
-
-       case EO_DESELECT:
-               m_DisableCheckAll(m->elInfo);
-               m_DisableEditButtons(true);
-               elm_genlist_realized_items_update(m->eoPlaylist);
-               elm_object_focus_set(m->eoBtnEdit[BTN_CANCEL], EINA_TRUE);
-               break;
-
-       case EO_DELETE:
-               m_DeleteSelectedItems();
-               break;
-
-       case EO_BTN_SETTINGS:
-               t_OnClickedSettings(obj);
-               break;
-
-       case EO_BTN_SHUFFLE:
-               t_OnClickedShuffle(obj);
-               break;
-
-       case EO_BTN_REPEAT:
-               t_OnClickedRepeat(obj);
-               break;
-
-       case EO_BTN_PLAY:
-               t_OnClickedPlay(obj);
-               break;
-
-       default:
-               break;
-       }
-}
-
-
 void CPlaybackView::OnMouseMove(int id, Evas *e, Evas_Object *obj, Evas_Event_Mouse_Move *ev)
 {
        switch (id) {
-       case EO_CANCEL:
-       case EO_DESELECT:
-       case EO_DELETE:
-       case EO_BTN_FORWARD:
-       case EO_BTN_PLAY:
-       case EO_BTN_REPEAT:
-       case EO_BTN_REWIND:
-       case EO_BTN_SETTINGS:
-       case EO_BTN_SHUFFLE:
-               if (!elm_object_focus_get(obj))
-                       elm_object_focus_set(obj, EINA_TRUE);
-               break;
-
        case EO_PLAYLIST:
                {
                        Elm_Object_Item *item;
@@ -2227,34 +1211,6 @@ void CPlaybackView::OnMouseMove(int id, Evas *e, Evas_Object *obj, Evas_Event_Mo
 }
 
 
-void CPlaybackView::OnPressed(int id, Evas_Object *obj)
-{
-       switch (id) {
-       case EO_BTN_FORWARD:
-       case EO_BTN_REWIND:
-               m_HandleOnPressed(obj);
-               break;
-
-       default:
-               break;
-       }
-}
-
-
-void CPlaybackView::OnUnpressed(int id, Evas_Object *obj)
-{
-       switch (id) {
-       case EO_BTN_FORWARD:
-       case EO_BTN_REWIND:
-               m_HandleOnUnpressed(obj);
-               break;
-
-       default:
-               break;
-       }
-}
-
-
 void CPlaybackView::OnRealized(int id, Evas_Object *obj, Elm_Object_Item *item)
 {
        switch (id) {
@@ -2320,7 +1276,6 @@ void CPlaybackView::OnComplete(void)
 
 void CPlaybackView::OnError(void)
 {
-       m_CreateErrorPopup();
 }
 
 
@@ -2343,3 +1298,55 @@ void CPlaybackView::OnStartPlayback(void)
 void CPlaybackView::OnStopPlayback(void)
 {
 }
+
+
+void CPlaybackView::OnEmptyPlaylist(void)
+{
+       eina_list_free(m->elInfo);
+       m->elInfo = NULL;
+       elm_genlist_clear(m->eoPlaylist);
+       m_UpdateEmptySongInfo();
+}
+
+
+void CPlaybackView::OnPlayerModeChanged(EPlayerMode mode)
+{
+       switch (mode) {
+       case MODE_PLAYLIST_EDIT:
+               m_FromPlaybackToEditMode();
+               break;
+
+       case MODE_PLAYBACK:
+               m_FromEditToPlaybackMode();
+               break;
+
+       default:
+               ASSERT(!"Invalid Player Mode");
+               break;
+       }
+}
+
+
+void CPlaybackView::OnEditButtonsPressed(EPlayerEditBtns editBtns)
+{
+       switch (editBtns) {
+       case EDIT_BTN_CANCEL:
+               m_DisableCheckAll(m->elInfo);
+               m_DisableEditButtons(true);
+               break;
+
+       case EDIT_BTN_DESELECT:
+               m_DisableCheckAll(m->elInfo);
+               m_DisableEditButtons(true);
+               elm_genlist_realized_items_update(m->eoPlaylist);
+               break;
+
+       case EDIT_BTN_DELETE:
+               m_DeleteSelectedItems();
+               break;
+
+       default:
+               ASSERT(!"Invalid Edit Button");
+               break;
+       }
+}
\ No newline at end of file