phoneapp/phoneuiview/src/cphonenotecontroller.cpp
changeset 0 5f000ab63145
child 15 2a26698d78ba
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/phoneapp/phoneuiview/src/cphonenotecontroller.cpp	Mon Jan 18 20:18:27 2010 +0200
@@ -0,0 +1,608 @@
+/*
+* Copyright (c) 2005 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: Implementation of CPhoneNoteController class.
+*
+*/
+
+
+// INCLUDE FILES
+#include "cphonenotecontroller.h"
+
+#include <eikenv.h>
+#include <eikappui.h>
+#include <eikprogi.h>
+#include <StringLoader.h>
+#include <aknnotedialog.h> // for CAknNoteDialog
+#include <AknGlobalNote.h> // for CAknGlobalNote
+
+#include "phoneui.pan"
+#include "tphonecommandparam.h"
+#include "tphonecmdparamnote.h"
+#include "tphonecmdparamboolean.h"
+#include "tphonecmdparamprogressnote.h" 
+#include "tphonecmdparamglobalnote.h"
+#include "tphonecmdparaminteger.h"
+#include "phoneconstants.h"
+#include "cphonemainresourceresolver.h"
+#include "phonerssbase.h"
+#include "phonelogger.h"
+#include "cphonetimer.h"
+#include "cphonenote.h"
+#include "cphonedtmfsendingnote.h"
+#include "cphoneuidisablednote.h"
+
+// CONSTANTS
+const TInt KPhoneIntervalDivider = 100;
+// ================= MEMBER FUNCTIONS =======================
+// C++ default constructor can NOT contain any code, that
+// might leave.
+//
+CPhoneNoteController::CPhoneNoteController( CEikonEnv& aEikEnv ) : iGlobalNoteId( KErrNotFound ), 
+                                                                   iEikEnv( aEikEnv ),
+                                                                   iNoteText( NULL )
+    {
+    }
+
+// ---------------------------------------------------------
+// CPhoneNoteController::NewL()
+// Two-phased constructor
+// (other items were commented in a header).
+// ---------------------------------------------------------
+CPhoneNoteController* CPhoneNoteController::NewL( CEikonEnv& aEikEnv )
+    {   
+    CPhoneNoteController* self = 
+        new( ELeave ) CPhoneNoteController( aEikEnv );
+    
+    return self;
+    }
+
+// ---------------------------------------------------------
+// Destructor
+// ---------------------------------------------------------
+// 
+CPhoneNoteController::~CPhoneNoteController()
+    {
+    __LOGMETHODSTARTEND(EPhoneUIView, "CPhoneNoteController::~CPhoneNoteController");
+    DestroyNote();
+    DestroyProgressNote();
+    }
+
+// ---------------------------------------------------------
+// CPhoneNoteController::CreateNoteL
+// ---------------------------------------------------------
+//
+void CPhoneNoteController::CreateNoteL( 
+    TPhoneCommandParam* aCommandParam )
+    {
+    __LOGMETHODSTARTEND(EPhoneUIView, "CPhoneNoteController::CreateNoteL");
+    TInt resourceId = 0;
+    CAknNoteDialog::TTone tone = CAknNoteDialog::ENoTone;
+    CAknNoteDialog::TTimeout timeout = CAknNoteDialog::ENoTimeout;
+
+    TPhoneCmdParamNote* noteParam = static_cast<TPhoneCmdParamNote*>(
+        aCommandParam );
+    
+    if( iNote && noteParam->Type() == EPhoneNoteDtmfSending )
+        {
+        // Dtmf sending ongoing.
+        UpdateNoteTextL( aCommandParam );
+        return;
+        }
+    
+    // Delete the existing note
+    DestroyNote();
+
+    // Setup parameters according to the type of note
+    switch ( noteParam->Type() )
+        {
+        case EPhoneNoteError:
+            resourceId = CPhoneMainResourceResolver::Instance()->
+                ResolveResourceID( EPhoneInformationErrorNote );
+            timeout = CAknNoteDialog::ELongTimeout;
+            tone = CAknNoteDialog::EErrorTone;
+            break;
+            
+        case EPhoneNoteWarning:
+            resourceId = CPhoneMainResourceResolver::Instance()->
+                ResolveResourceID( EPhoneInformationWarningNote );
+            timeout = CAknNoteDialog::ELongTimeout;
+            tone = CAknNoteDialog::EWarningTone;
+            break;
+            
+        case EPhoneNoteConfirmation:
+            resourceId = CPhoneMainResourceResolver::Instance()->
+                ResolveResourceID( EPhoneInformationConfirmationNote );
+            timeout = CAknNoteDialog::EShortTimeout;
+            tone = CAknNoteDialog::EConfirmationTone;
+            break;
+            
+        case EPhoneNoteInformation:
+            resourceId = CPhoneMainResourceResolver::Instance()->
+                ResolveResourceID( EPhoneInformationNote );
+            timeout = CAknNoteDialog::ELongTimeout;
+            tone = CAknNoteDialog::ENoTone;
+            break;
+        
+        case EPhoneNoteSecurity:
+        case EPhoneNoteCustom: // Fall through
+        case EPhoneNotePermanent:
+        case EPhoneNoteDtmfSending:
+            // Use the specified values
+            resourceId = noteParam->ResourceId();
+            timeout = noteParam->Timeout();
+            tone = noteParam->Tone();
+            break;
+
+        case EPhoneNoteUIDisabled:
+            // Use the specified values
+            resourceId = noteParam->ResourceId();
+            timeout = CAknNoteDialog::ENoTimeout;
+            tone = CAknNoteDialog::ENoTone;
+            break;
+            
+        default:
+            Panic( EPhoneViewCaseNotHandled );
+            break;
+        }
+
+	// Create correct note
+	if( noteParam->Type() == EPhoneNoteDtmfSending )
+		{
+		iNote = new ( ELeave ) CPhoneDtmfSendingNote( reinterpret_cast<CEikDialog**>( &iNote ), *iEikEnv.EikAppUi() );						
+		}
+	else if( noteParam->Type() == EPhoneNoteUIDisabled )
+        {
+        iNote = new ( ELeave ) CPhoneUIDisabledNote( reinterpret_cast<CEikDialog**>( &iNote ), *iEikEnv.EikAppUi() );
+        }
+	else
+		{
+		iNote = new ( ELeave ) CPhoneNote( reinterpret_cast<CEikDialog**>( &iNote ), *iEikEnv.EikAppUi() );			
+		}
+
+    // Override text if specified
+    if ( noteParam->Text().Length() )
+        {
+        if( !iNoteText )
+            {
+			iNoteText = noteParam->Text().AllocL();	            	
+            }
+        iNote->SetTextL( *iNoteText );
+        }
+    else if ( noteParam->TextResourceId() )
+        {
+        // Get the text associated with the resource Id
+        TBuf<KPhoneMaxCharsInNote> noteText;
+        StringLoader::Load( 
+            noteText, 
+            noteParam->TextResourceId(), 
+            &iEikEnv );
+
+        iNote->SetTextL( noteText );
+        }
+
+    // Override tone if specified
+    if ( tone != CAknNoteDialog::ENoTone )
+        {
+        iNote->SetTone( tone );
+        }
+
+    // Override timeout if specified
+    if ( timeout != CAknNoteDialog::ENoTimeout )
+        {
+        iNote->SetTimeout( timeout );
+        }
+    
+    iNote->SetNoteType( noteParam->Type() );
+ 
+    // Display the note
+	iNote->ExecuteLD( resourceId );
+    }
+
+// ---------------------------------------------------------
+// CPhoneNoteController::DestroyNote
+// ---------------------------------------------------------
+//
+void CPhoneNoteController::DestroyNote()
+    {
+    __LOGMETHODSTARTEND(EPhoneUIView, "CPhoneNoteController::DestroyNote");
+    
+    // Delete note text if exists
+    if( iNoteText )
+        {
+        delete iNoteText;
+        iNoteText = NULL;            
+        }
+    
+    // Delete the note if it exists
+    if ( iNote )
+        {
+        delete iNote;
+        iNote = NULL;
+        }
+    }
+
+// ---------------------------------------------------------
+// CPhoneNoteController::DestroyDTMFNote
+// ---------------------------------------------------------
+//
+void CPhoneNoteController::DestroyDTMFNote()
+    {
+    __LOGMETHODSTARTEND(EPhoneUIView, "CPhoneNoteController::DestroyDTMFNote");
+   
+    // Delete DTFM note if exists
+    if ( iNote && ( iNote->NoteType() == EPhoneNoteDtmfSending ) )
+        {
+        // Delete note text if exists
+        if( iNoteText )
+            {
+            delete iNoteText;
+            iNoteText = NULL;            
+            }
+        delete iNote;
+        iNote = NULL;
+        }
+    }
+
+
+// ---------------------------------------------------------
+// CPhoneNoteController::DestroyGlobalNoteL
+// ---------------------------------------------------------
+//
+void CPhoneNoteController::DestroyGlobalNoteL()
+    {
+    __LOGMETHODSTARTEND(EPhoneUIView, "CPhoneNoteController::DestroyGlobalNoteL");
+    if( iGlobalNoteId != KErrNotFound )
+        {
+        CAknGlobalNote* glbNote = CAknGlobalNote::NewLC();
+        glbNote->CancelNoteL( iGlobalNoteId );
+        CleanupStack::PopAndDestroy( glbNote );        
+        }
+    }
+
+// ---------------------------------------------------------
+// CPhoneNoteController::CreateGlobalNoteL
+// ---------------------------------------------------------
+//
+void CPhoneNoteController::CreateGlobalNoteL(
+    TPhoneCommandParam* aCommandParam )
+    {
+    __LOGMETHODSTARTEND(EPhoneUIView, "CPhoneNoteController::CreateGlobalNoteL");
+    TPhoneCmdParamGlobalNote* globalNoteParam = 
+        static_cast<TPhoneCmdParamGlobalNote*>( aCommandParam );
+    TBuf<KPhoneMaxCharsInNote> noteText;
+
+    // Check if the resource Id is specified
+    if ( globalNoteParam->TextResourceId() )
+        {
+        if ( globalNoteParam->Text().Length() )
+            {
+            HBufC* loadedText = StringLoader::LoadL( 
+                globalNoteParam->TextResourceId(), 
+                globalNoteParam->Text(), 
+                CCoeEnv::Static() );
+            noteText.Copy( *loadedText );
+            delete loadedText;
+            }
+        else
+            {
+            StringLoader::Load( 
+                noteText, 
+                globalNoteParam->TextResourceId(), 
+                &iEikEnv );
+            }
+        }
+    else if ( globalNoteParam->Text() != KNullDesC )
+        {
+        noteText.Copy( globalNoteParam->Text() );
+        }
+
+    if ( noteText.Length() > 0 )
+        {
+        CAknGlobalNote* glbNote = CAknGlobalNote::NewLC();
+
+        // Set the tone
+        glbNote->SetTone( globalNoteParam->Tone() );
+        if ( globalNoteParam->Softkeys())
+            {
+            glbNote->SetSoftkeys(  globalNoteParam->Softkeys() );   
+            }
+
+        // Show the global note
+        
+        if ( globalNoteParam->WaitForReady() )
+            {
+            TRequestStatus NoteReady;
+            iGlobalNoteId = glbNote->ShowNoteL( NoteReady, globalNoteParam->Type(), noteText );
+            User::WaitForRequest( NoteReady );
+            }
+        else
+            {
+            iGlobalNoteId = glbNote->ShowNoteL( globalNoteParam->Type(), noteText );
+            }
+        CleanupStack::PopAndDestroy( glbNote );
+        }
+    }
+
+// ---------------------------------------------------------
+// CPhoneNoteController::CreateProgressNoteL
+// ---------------------------------------------------------
+//
+void CPhoneNoteController::CreateProgressNoteL(
+    TPhoneCommandParam* aCommandParam )
+    {
+    __LOGMETHODSTARTEND(EPhoneUIView, "CPhoneNoteController::CreateProgressNoteL");
+    TPhoneCmdParamProgressNote* noteParam = static_cast<
+        TPhoneCmdParamProgressNote*>(aCommandParam );
+
+    TInt resourceId = noteParam->ResourceId();
+    iStartTime.UniversalTime();
+    
+    TTimeIntervalMicroSeconds32 waitTime =
+        noteParam->WaitTime();
+        
+    if( !iProgressUpdateTimer )
+        {
+        iProgressUpdateTimer = CPhoneTimer::NewL();            
+        }
+
+    iWaitTime = waitTime.Int();
+    
+    TInt final = waitTime.Int();
+    iInterval = final / KPhoneIntervalDivider;
+    iProgressBarCount = 0;
+        
+    iProgressUpdateTimer->After( iInterval, this );
+        
+    CPhoneProgressNote* dlg = 
+        new ( ELeave ) CPhoneProgressNote(
+             ( reinterpret_cast< CEikDialog** >( &iProgressNote )),
+             static_cast<MEikCommandObserver*>( iEikEnv.EikAppUi() ) );
+
+    iProgressNote = dlg;
+    dlg->PrepareLC( resourceId );
+
+    CEikProgressInfo* info = dlg->GetProgressInfoL();
+    
+    if ( info )
+        {
+        info->SetFinalValue( KPhoneIntervalDivider );
+        }
+    
+    dlg->RunLD();        
+    }
+    
+// ---------------------------------------------------------
+// CPhoneNoteController::DestroyProgressBar
+// ---------------------------------------------------------
+//
+void CPhoneNoteController::DestroyProgressNote()
+    {
+    __LOGMETHODSTARTEND(EPhoneUIView, "CPhoneNoteController::DestroyProgressNote");
+
+    // Delete the progress note if it exists
+    if ( iProgressNote )
+        {
+        delete iProgressNote;
+        iProgressNote = NULL;
+        }
+    if ( iProgressUpdateTimer )
+        {
+        if( iProgressUpdateTimer->IsActive() )
+            {
+            iProgressUpdateTimer->CancelTimer();                
+            }
+            
+        delete iProgressUpdateTimer;
+        iProgressUpdateTimer = NULL;            
+        }
+    iProgressBarCount = 0; 
+    }
+    
+// ---------------------------------------------------------
+// CPhoneNoteController::HandleTimeOutL
+// ---------------------------------------------------------
+//
+void CPhoneNoteController::HandleTimeOutL()
+    {
+    __LOGMETHODSTARTEND(EPhoneUIView, "CPhoneNoteController::HandleTimeOutL");
+
+    if ( iProgressNote )
+        {
+        TTime current;
+        current.UniversalTime();
+        
+        CEikProgressInfo* info = iProgressNote->GetProgressInfoL();           
+
+        if ( info )
+            {
+            TTime current;
+            current.UniversalTime();
+            TInt64 timeDelta = 
+                    current.MicroSecondsFrom( iStartTime ).Int64();
+                    
+            iProgressBarCount = ( timeDelta / iInterval )+1 ;
+            if ( iProgressBarCount > KPhoneIntervalDivider )
+                {
+                 iProgressBarCount = KPhoneIntervalDivider;           
+                }
+            info->SetAndDraw( iProgressBarCount );                     
+            }        
+        
+        if ( !iProgressUpdateTimer->IsActive() )
+            {
+            iProgressUpdateTimer->After( iInterval, this );
+            }
+        }
+    else
+        {         
+        if( iProgressUpdateTimer->IsActive() )
+            {
+            iProgressUpdateTimer->CancelTimer();                
+            }
+            
+        delete iProgressUpdateTimer;
+        iProgressUpdateTimer = NULL;
+        iProgressBarCount = 0;            
+        }
+    }
+
+// ---------------------------------------------------------
+// CPhoneNoteController::IsNoteVisible
+// ---------------------------------------------------------
+//
+void CPhoneNoteController::IsNoteVisible( TPhoneCommandParam* aCommandParam )
+    {
+    __LOGMETHODSTARTEND(EPhoneUIView, "CPhoneNoteController::IsNoteVisible");
+
+    TPhoneCmdParamBoolean* booleanParam = 
+        static_cast<TPhoneCmdParamBoolean*>( aCommandParam );
+
+    if( iNote )
+        {
+        if( iNote->IsVisible() )
+            {
+            booleanParam->SetBoolean( ETrue );                
+            }
+        }
+    else
+        {
+        booleanParam->SetBoolean( EFalse );                
+        }
+    }
+
+// ---------------------------------------------------------
+// CPhoneNoteController::IsProgressNoteVisible
+// ---------------------------------------------------------
+//
+void CPhoneNoteController::IsProgressNoteVisible( TPhoneCommandParam* aCommandParam )
+    {
+    __LOGMETHODSTARTEND( EPhoneUIView, "CPhoneNoteController::IsProgressNoteVisible");
+
+    TPhoneCmdParamBoolean* booleanParam = 
+        static_cast<TPhoneCmdParamBoolean*>( aCommandParam );
+
+    if( iProgressNote )
+        {
+        if( iProgressNote->IsVisible() )
+            {
+            booleanParam->SetBoolean( ETrue );
+            }
+        }
+    else
+        {
+        booleanParam->SetBoolean( EFalse );                
+        }
+    }
+
+// ---------------------------------------------------------
+// CPhoneNoteController::IsNoteActive
+// ---------------------------------------------------------
+//
+void CPhoneNoteController::IsNoteActive( TPhoneCommandParam* aCommandParam )
+    {
+    __LOGMETHODSTARTEND( EPhoneUIView, "CPhoneNoteController::IsNote");
+
+    TPhoneCmdParamBoolean* booleanParam = 
+        static_cast<TPhoneCmdParamBoolean*>( aCommandParam );
+
+    if( iProgressNote || iNote )
+        {
+        booleanParam->SetBoolean( ETrue );                
+        }
+    else 
+        {
+        booleanParam->SetBoolean( EFalse );    
+        }
+    }
+
+// ---------------------------------------------------------
+// CPhoneNoteController::IsActiveNoteDissmissableByKeyEvent
+// ---------------------------------------------------------
+//
+void CPhoneNoteController::IsActiveNoteDissmissableByKeyEvent( TPhoneCommandParam* aCommandParam )
+    {
+    __LOGMETHODSTARTEND( EPhoneUIView, "CPhoneNoteController::IsActiveNoteDissmissableByKeyEvent");
+
+    TPhoneCmdParamBoolean* booleanParam = 
+        static_cast<TPhoneCmdParamBoolean*>( aCommandParam );
+    // check first that iNote is created. 
+    if( ( iNote ) &&
+        ( iNote->NoteType() == EPhoneNoteSecurity ) )
+        {
+        booleanParam->SetBoolean( ETrue );                
+        }
+    else 
+        {
+        booleanParam->SetBoolean( EFalse );    
+        }
+    }
+
+// ---------------------------------------------------------
+// CPhoneNoteController::UpdateNoteTextL
+// ---------------------------------------------------------
+//
+void CPhoneNoteController::UpdateNoteTextL( TPhoneCommandParam* aCommandParam )
+    {
+    TPhoneCmdParamNote* noteParam = static_cast<TPhoneCmdParamNote*>(
+           aCommandParam );
+    
+    // Delete note text if exists
+    if( iNoteText )
+        {
+        delete iNoteText;
+        iNoteText = NULL;           
+        }
+    
+    if ( iNote )
+        {
+        // Override text if specified
+        if ( noteParam->Text().Length() )
+            {
+            if( !iNoteText )
+                {
+                iNoteText = noteParam->Text().Alloc();                  
+                }
+            iNote->SetTextL( *iNoteText );
+            }
+        else if ( noteParam->TextResourceId() )
+            {
+            // Get the text associated with the resource Id
+            TBuf<KPhoneMaxCharsInNote> noteText;
+            StringLoader::Load( 
+                noteText, 
+                noteParam->TextResourceId(), 
+                &iEikEnv );
+
+            iNote->SetTextL( noteText );
+            }
+        }
+    }
+
+// ---------------------------------------------------------
+// CPhoneNoteController::UpdateNoteSoftkeysL
+// ---------------------------------------------------------
+//
+void CPhoneNoteController::UpdateNoteSoftkeysL( TPhoneCommandParam* aCommandParam )
+    {
+     
+    TPhoneCmdParamInteger* integerParam = 
+            static_cast<TPhoneCmdParamInteger*>( aCommandParam );
+    
+    if ( iNote )
+        {
+        iNote->UpdateSoftkeysL( integerParam->Integer() );
+        }
+    }
+
+// End of File