mpx/tsrc/public/basic/common/testviewframework/src/testplaybackview.cpp
author hgs
Tue, 21 Sep 2010 11:25:55 -0500
changeset 62 b276843a15ba
permissions -rw-r--r--
201037

/*
* Copyright (c) 2002 - 2007 Nokia Corporation and/or its subsidiary(-ies).
* All rights reserved.
* This component and the accompanying materials are made available
* under the terms of "Eclipse Public License v1.0"
* which accompanies this distribution, and is available
* at the URL "http://www.eclipse.org/legal/epl-v10.html".
*
* Initial Contributors:
* Nokia Corporation - initial contribution.
*
* Contributors:
*
* Description:  A view displaying basic playback state and feature
*
*/

#include <stiflogger.h>
#include <e32const.h>
#include "testplaybackviewobserver.h"
#include "testplaybackview.h"

// CONSTANTS
_LIT(KSpacer,           " ");
_LIT(KPlay,             " Play-1 ");
_LIT(KPlaySel,          "(Play-1)");
_LIT(KBackward,         " <<-2 ");
_LIT(KForward,          " >>-3 ");
_LIT(KStop,             " Stop-4 ");
_LIT(KStopSel,          "(Stop-4)");
_LIT(KFastRewind,       " FR-5 ");
_LIT(KFastRewindSel,    "(FR-5)");
_LIT(KFastForward,      " FF-6 ");
_LIT(KFastForwardSel,   "(FF-6)");
_LIT(KPause,            " Pause-7 ");
_LIT(KPauseSel,         "(Pause-7)");
    
_LIT(KExit,             "Exit-Esc"  );

const TInt KSongInfoYOffset = 10;
const TInt KDisplayScreenWidthOffset = 10;

// ======== MEMBER FUNCTIONS ========

// ---------------------------------------------------------------------------
// Symbian 2-phrase constructor
// ---------------------------------------------------------------------------
//
EXPORT_C CTestPlaybackView* CTestPlaybackView::NewL(CConsoleMain* aConsoleMain,
                                            CTestBaseView* aParent,
                                            const TDesC& aName,
                                            CStifLogger* aLogger)
    {
    CTestPlaybackView* self = new (ELeave) CTestPlaybackView(aConsoleMain,
                                                             aParent,
                                                             aName,
                                                             aLogger);
    CleanupStack::PushL(self);
    self->ConstructL();
    CleanupStack::Pop(self);
    return self;
    
    }

// ---------------------------------------------------------------------------
// C++ destructor
// ---------------------------------------------------------------------------
//
EXPORT_C CTestPlaybackView::~CTestPlaybackView()
    {
    }

// ---------------------------------------------------------------------------
// Add observer
// ---------------------------------------------------------------------------
//
EXPORT_C void CTestPlaybackView::AddObserver(MTestPlaybackViewObserver* aObs)
    {
    iTestPlaybackViewObs = aObs;
    }

// ---------------------------------------------------------------------------
// Update current index
// ---------------------------------------------------------------------------
//
EXPORT_C void CTestPlaybackView::UpdateItemIndex(TInt aIndex, TInt aTotalItem)
    {
    iCurrentStatus.iItemIndex = aIndex;
    iCurrentStatus.iMaxItems = aTotalItem;
    RedrawIndex();
    }
    
// ---------------------------------------------------------------------------
// Update position in the song
// ---------------------------------------------------------------------------
//
EXPORT_C void CTestPlaybackView::UpdateProgress(TInt aPosition, TInt aDuration)
    {
    iCurrentStatus.iProgressPos = aPosition;
    iCurrentStatus.iProgressDur = aDuration;
    RedrawProgress();
    }
    
// ---------------------------------------------------------------------------
// Update volume
// ---------------------------------------------------------------------------
//
EXPORT_C void CTestPlaybackView::UpdateVolume(TInt aVolume, TInt aMaxVolume)
    {
    iCurrentStatus.iVolume = aVolume;
    iCurrentStatus.iMaxVolume = aMaxVolume;
    RedrawVolume();
    }
    
// ---------------------------------------------------------------------------
// Update artist and song name
// ---------------------------------------------------------------------------
//
EXPORT_C void CTestPlaybackView::UpdateSongInfo(const TDesC& aArtist, 
                                       const TDesC& aSongName)
    {
    TInt y = iDisplaySize.iHeight/ 2 - 2;
    //erase previous text
    for(TInt i = 0; i < iDisplaySize.iWidth; i++)
        {
        iConsole->SetPos(i,y);
        iConsole->Printf(_L(" "));
        iConsole->SetPos(i,y+1);
        iConsole->Printf(_L(" "));
        }
    iConsole->SetPos(
                Max((iDisplaySize.iWidth - aArtist.Length())/2, 0), y++);
    iConsole->Printf(_L("%S"), &aArtist);
    iConsole->SetPos(
                Max((iDisplaySize.iWidth - aSongName.Length())/2, 0), y);
    iConsole->Printf(_L("%S"), &aSongName);
    //DisplayViewL();
    }

// ---------------------------------------------------------------------------
// Handles state changes in playbackutility
// ---------------------------------------------------------------------------
//
EXPORT_C void CTestPlaybackView::StateChanged(TTestPlaybackState aState)
    {
    
    switch(aState)
        {
    case ETPbStateInitialising:
        UpdateSongInfo(KNullDesC, _L("Opening file"));
    case ETPbStateShuttingDown:
    case ETPbStateBuffering:
    case ETPbStateDownloading:
    case ETPbStateStopped:
    case ETPbStateNotInitialised:
        iCurrentStatus.iPlaying = iCurrentStatus.iForwardSeek 
        = iCurrentStatus.iBackwardSeek = iCurrentStatus.iPause = EFalse;
        break;
    case ETPbStatePaused:
        iCurrentStatus.iPlaying = iCurrentStatus.iForwardSeek 
        = iCurrentStatus.iBackwardSeek = EFalse;
        iCurrentStatus.iPause = ETrue;
        break;
    case ETPbStatePlaying:
        iCurrentStatus.iPause = iCurrentStatus.iForwardSeek 
        = iCurrentStatus.iBackwardSeek = EFalse;
        iCurrentStatus.iPlaying = ETrue;
        break;
    case ETPbStateSeekingForward:
        iCurrentStatus.iBackwardSeek = EFalse;
        iCurrentStatus.iForwardSeek = ETrue;
        break;
    case ETPbStateSeekingBackward:
        iCurrentStatus.iForwardSeek = EFalse;
        iCurrentStatus.iBackwardSeek = ETrue;
        break;
        }
    RedrawPlayerStatue();
    }
    
// ---------------------------------------------------------------------------
// From class CTestBaseView.
// Initialization of a view before first time activation
// ---------------------------------------------------------------------------
//
void CTestPlaybackView::InitializeViewL()
    {
    iConsole->ClearScreen();
    RedrawProgress();
    RedrawVolume();
    UpdateSongInfo(KNullDesC, KNullDesC);
    RedrawPlayerStatue();
    }
    
// ---------------------------------------------------------------------------
// From class CTestBaseView.
// Cleanup the child view before deactivate/destroy view
// ---------------------------------------------------------------------------
//
void CTestPlaybackView::CleanupViewL()
    {
    }

// ---------------------------------------------------------------------------
// From class CTestBaseView.
// Display this view 
// ---------------------------------------------------------------------------
//
void CTestPlaybackView::DisplayViewL()
    {
    DisplayViewBase();
    RedrawIndex();
    RedrawProgress();
    RedrawVolume();
    RedrawPlayerStatue();
    }
    
// ---------------------------------------------------------------------------
// From class CTestBaseView.
// Process keypresses on this view - called by ConsoleMain
// ---------------------------------------------------------------------------
//
void CTestPlaybackView::SelectL( TKeyCode aSelection, TBool& aContinue )
    {
    aContinue = ETrue;
    switch(aSelection)
        {
        case '1':
            iTestPlaybackViewObs->HandleUiCommandL(ETPbViewCmdPlay);
            break;
        case '2':
            iTestPlaybackViewObs->HandleUiCommandL(ETPbViewCmdPrevious);
            break;
        case '3':
            iTestPlaybackViewObs->HandleUiCommandL(ETPbViewCmdNext);
            break;
        case '4':
            iTestPlaybackViewObs->HandleUiCommandL(ETPbViewCmdStop);
            break;
        case '5':
            iTestPlaybackViewObs->HandleUiCommandL(iCurrentStatus.iBackwardSeek?
                                                  ETPbViewCmdStopSeeking : 
                                                  ETPbViewCmdStartSeekBackward);
            break;
        case '6':
            iTestPlaybackViewObs->HandleUiCommandL(iCurrentStatus.iForwardSeek?
                                                  ETPbViewCmdStopSeeking : 
                                                  ETPbViewCmdStartSeekForward);
            break;
        case '7':
            iTestPlaybackViewObs->HandleUiCommandL(ETPbViewCmdPause);
            break;
        case '8':
            iTestPlaybackViewObs->HandleUiCommandL(ETPbViewCmdDecreaseVolume);
            break;
        case '9':
            iTestPlaybackViewObs->HandleUiCommandL(ETPbViewCmdIncreaseVolume);
            break;
        case EKeyEscape:
            iTestPlaybackViewObs->HandleUiCommandL(ETPbViewCmdClose);
            aContinue = EFalse;
            CurrentViewDoneL();
            break;
        }
    }

// ---------------------------------------------------------------------------
// From class CTestBaseView.
// Update display from timer - called by ConsoleMain
// ---------------------------------------------------------------------------
//
void CTestPlaybackView::TimerUpdate()
    {
    
    }

// ---------------------------------------------------------------------------
// C++ constructor
// ---------------------------------------------------------------------------
//
CTestPlaybackView::CTestPlaybackView(CConsoleMain* aConsoleMain,
                                      CTestBaseView* aParent,
                                      const TDesC& aName,
                                      CStifLogger* aLogger)
    : CTestBaseView(aConsoleMain, aParent, aName)
    {
    iDisplaySize = iConsole->ScreenSize();
    iDisplaySize.iWidth = iDisplaySize.iWidth - KDisplayScreenWidthOffset;
    iLogger = aLogger;
    }

// ---------------------------------------------------------------------------
// Symbian 2-phrase constructor
// ---------------------------------------------------------------------------
//
void CTestPlaybackView::ConstructL()
    {
    
    iCurrentStatus.iBackwardSeek = EFalse;
    iCurrentStatus.iForwardSeek = EFalse;
    iCurrentStatus.iPlaying = EFalse;
    iCurrentStatus.iPause = EFalse;
    iCurrentStatus.iVolume = 0;
    iCurrentStatus.iMaxVolume = 20; //magic number??
    iCurrentStatus.iProgressPos = 0;
    iCurrentStatus.iProgressDur = KMaxTInt;
    iCurrentStatus.iItemIndex = 0;
    iCurrentStatus.iMaxItems = 0;
    
    InitializeViewL();
    }


// ---------------------------------------------------------------------------
// Redraw index in view
// ---------------------------------------------------------------------------
//
void CTestPlaybackView::RedrawIndex()
    {
    if(iCurrentStatus.iMaxItems <= 0)
        return;
    iConsole->SetPos(iDisplaySize.iWidth - 5, 3);   //##/## format
    iConsole->Printf(_L("     "));                  //clean
    iConsole->SetPos(iDisplaySize.iWidth - 5, 3);
    iConsole->Printf(_L("%d/%d"), iCurrentStatus.iItemIndex, 
                                  iCurrentStatus.iMaxItems);
    
    }
    
// ---------------------------------------------------------------------------
// Redraw progress bar in view
// ---------------------------------------------------------------------------
//
void CTestPlaybackView::RedrawProgress()
    {
    if(iCurrentStatus.iProgressDur <= 0)
        return;
    TInt pos = iCurrentStatus.iProgressPos * 
                    iDisplaySize.iWidth / iCurrentStatus.iProgressDur ;
    iConsole->SetPos(0,  iDisplaySize.iHeight / 2);
    for(TInt x = 1; x <= iDisplaySize.iWidth; x++)
        iConsole->Printf(x<=pos? _L("=") : _L("-"));
    }
    
// ---------------------------------------------------------------------------
// Redraw volume bar in view
// ---------------------------------------------------------------------------
//
void CTestPlaybackView::RedrawVolume()
    {
    if(iCurrentStatus.iMaxVolume <= 0)
        return;
    TInt pos = iCurrentStatus.iVolume * 
                    iCurrentStatus.iMaxVolume / iCurrentStatus.iMaxVolume ;
    iConsole->SetPos(0, 1);
    iConsole->Printf(_L("Volume(8|9):"));
    for(TInt x = 1; x <= iCurrentStatus.iMaxVolume; x++)
        iConsole->Printf(x <= pos? _L("=") : _L("-"));
    iConsole->Printf(_L(" %d/%d"), 
                     iCurrentStatus.iVolume, 
                     iCurrentStatus.iMaxVolume);
    }

// ---------------------------------------------------------------------------
// Redraw status/control part of the view
// ---------------------------------------------------------------------------
//
void CTestPlaybackView::RedrawPlayerStatue()
    {
    TInt linePosY = iDisplaySize.iHeight - KSongInfoYOffset;
    
    //Line 1
    iConsole->SetPos(0, linePosY);
    iConsole->Printf(iCurrentStatus.iPlaying?
                        KStop : KStopSel);
    iConsole->Printf(KSpacer);
    iConsole->Printf(iCurrentStatus.iBackwardSeek?
                        KFastRewindSel : KFastRewind);
    iConsole->Printf(KSpacer);
    iConsole->Printf(iCurrentStatus.iForwardSeek?
                        KFastForwardSel : KFastForward);
    iConsole->Printf(KSpacer);
    iConsole->Printf(iCurrentStatus.iPause?
                        KPauseSel : KPause);
    
    //Line 2
    iConsole->SetPos(0, ++linePosY);
    iConsole->Printf(iCurrentStatus.iPlaying?
                        KPlaySel : KPlay);
    iConsole->Printf(KSpacer);
    iConsole->Printf(KBackward);
    iConsole->Printf(KSpacer);
    iConsole->Printf(KForward);
    
    //Line Exit
    iConsole->SetPos(iDisplaySize.iWidth - KExit().Length(),  
                     iDisplaySize.iHeight - 1);    
    iConsole->Printf(KExit);
    }