emailuis/emailui/src/FreestyleEmailUiWizardObserver.cpp
branchRCL_3
changeset 25 3533d4323edc
child 26 968773a0b6ef
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/emailuis/emailui/src/FreestyleEmailUiWizardObserver.cpp	Wed Sep 01 12:28:57 2010 +0100
@@ -0,0 +1,440 @@
+/*
+* Copyright (c) 2007-2008 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:  Handles interaction with setup wizard implementation
+*
+*/
+
+
+// SYSTEM INCLUDE FILES
+#include "emailtrace.h"
+#include <FreestyleEmailUi.rsg>
+#include <aknnotewrappers.h>
+#include <centralrepository.h>
+#include <StringLoader.h>
+//<cmail>
+#include "cfsmailclient.h"
+//</cmail>
+
+// INTERNAL INCLUDE FILES
+#include "FreestyleEmailUiWizardObserver.h"
+#include "FreestyleEmailUiLauncherGridVisualiser.h"
+#include "freestyleemailcenrephandler.h"
+#include "FreestyleEmailUiUtilities.h"
+
+
+// CONSTANT VALUES
+
+
+// ================= MEMBER FUNCTIONS ==========================================
+// -----------------------------------------------------------------------------
+// CFSEmailUiWizardObserver::CFSEmailUiWizardObserver
+// -----------------------------------------------------------------------------
+CFSEmailUiWizardObserver::CFSEmailUiWizardObserver( 
+    CFreestyleEmailUiAppUi* aAppUi,
+    CFSEmailUiLauncherGridVisualiser* aMainUiGridVisualiser )
+    : iAppUi( aAppUi ), iMainUiGridVisualiser( aMainUiGridVisualiser ),
+      iProcessComplete( ETrue ), iForegroundAfterWizardMessage( EFalse ), 
+      iInformAboutParams( EFalse ), iNewMailboxEventHandlingAllowed( EFalse ),
+      iNewMailboxCreated( EFalse )
+    {
+    FUNC_LOG;
+    
+    }
+
+// -----------------------------------------------------------------------------
+// CFSMailPluginManager::~CFSMailPluginManager
+// -----------------------------------------------------------------------------
+CFSEmailUiWizardObserver::~CFSEmailUiWizardObserver()
+    {
+    FUNC_LOG;
+    // just in case: dismiss possible wait note
+    if ( iMainUiGridVisualiser )
+        {
+        iMainUiGridVisualiser->SetWizardWaitnoteShown( EFalse );
+        }
+    
+    delete iWaitNote;
+    iWaitNote = NULL;
+	}
+
+
+// -----------------------------------------------------------------------------
+// CFreestyleEmailUiWizardObserver::NewLC
+// -----------------------------------------------------------------------------
+CFSEmailUiWizardObserver* CFSEmailUiWizardObserver::NewLC( 
+    CFreestyleEmailUiAppUi* aAppUi,
+    CFSEmailUiLauncherGridVisualiser* aMainUiGridVisualiser )
+    {
+    FUNC_LOG;
+    CFSEmailUiWizardObserver* self = 
+        new (ELeave) CFSEmailUiWizardObserver( aAppUi, aMainUiGridVisualiser );
+    CleanupStack:: PushL( self );
+    self->ConstructL();
+    return self;
+    } 
+
+// -----------------------------------------------------------------------------
+// CFSEmailUiWizardObserver::NewL
+// -----------------------------------------------------------------------------
+CFSEmailUiWizardObserver* CFSEmailUiWizardObserver::NewL( 
+    CFreestyleEmailUiAppUi* aAppUi,
+    CFSEmailUiLauncherGridVisualiser* aMainUiGridVisualiser )
+    {
+    FUNC_LOG;
+    CFSEmailUiWizardObserver* self = 
+        CFSEmailUiWizardObserver::NewLC( aAppUi, aMainUiGridVisualiser );
+    CleanupStack:: Pop( self );
+    return self;
+    }
+
+// -----------------------------------------------------------------------------
+// CFSEmailUiWizardObserver::ConstructL
+// -----------------------------------------------------------------------------
+void CFSEmailUiWizardObserver::ConstructL()
+    {
+    FUNC_LOG;
+    
+    }
+
+// -----------------------------------------------------------------------------
+// CFSEmailUiWizardObserver::DoWizardStartupActionsL()
+//
+// Check if there are some params set by a setup wizard in the centrep
+// location (meaning that we have been launched by a setup wizard) and
+// inform FW about in that case
+// -----------------------------------------------------------------------------
+void CFSEmailUiWizardObserver::DoWizardStartupActionsL()
+    {
+    FUNC_LOG;
+    
+    // In this case we are not interested of the actual content of the cenrep,
+    // our only interest is that is there something in the specified keys or
+    // not. So to avoid unneccessary stack usage, we keep the size of
+    // accountType buffer in minimum -> cenrep handler returns KErrOverflow
+    // if there is something (and it doesn't fit to buffer).
+    TBuf<1> accountType = KNullDesC();
+    TBuf<KMaxUidName> centrepStartKey = KNullDesC();
+
+    CFSEmailCRHandler* crHandler = iAppUi->GetCRHandler();
+    if ( !crHandler )
+        {
+        return;
+        }
+    
+    TInt accountTypeError = crHandler->SetupWizAccountType( accountType );
+    TInt startKeyError = crHandler->SetupWizCentrepStartKey( centrepStartKey );
+    
+
+
+    // IF accountType had some content and it didn't fit to buffer OR
+    //    accountType had some content and it fit to buffer
+    // ==> there was something in accountType
+    // AND
+    // IF startKey had some content and it didn't fit to buffer OR
+    //    startKey had some content and it fit to buffer
+    // ==> there was something in startKey
+    if ( ( accountTypeError == KErrOverflow ||
+           ( accountTypeError == KErrNone && accountType.Length() > 0 ) ) &&
+         ( startKeyError == KErrOverflow ||
+           ( startKeyError == KErrNone && centrepStartKey.Length() > 0 ) ) )
+        {
+        
+        // Launches the "Creating mailbox" wait note - 
+        // execution continues in the method StepL() after that.
+        StartWaitNoteL();
+        }
+    else
+        {
+        }
+    
+    }
+
+void CFSEmailUiWizardObserver::HandleMessage( TUint32 /*aClientHandleOfTargetWindowGroup*/,
+                                              TUid /*aMessageUid*/,
+                                              const TDesC8& aMessageParameters )
+    {
+    FUNC_LOG;
+    
+    if ( aMessageParameters.Compare( KNullDesC8 ) == 0 )
+        {
+        
+        TApaTaskList taskList( CEikonEnv::Static()->WsSession() );
+        TApaTask task = taskList.FindApp( KFSEmailUiUid );
+        if ( task.Exists() )
+            {
+            if ( !iAppUi->IsForeground() )
+                {
+                // Bring Email UI to foreground
+                
+                iForegroundAfterWizardMessage = ETrue;
+                task.BringToForeground();
+                }
+            else
+                {
+                // Launches the "Creating mailbox" wait note - 
+                // execution continues in the method StepL() after that.
+                TRAPD( err, StartWaitNoteL() );
+                if ( err != KErrNone )
+                	{
+                	}
+                }
+            }
+        }
+    
+    }
+
+void CFSEmailUiWizardObserver::HandleForegroundEventL( TBool aForeground )
+    {
+    FUNC_LOG;
+        
+    // iForegroundAfterWizardMessage flag is turned into ETrue when we have received 
+    // a KNullDesC message from mailbox setup wizard in HandleMessage() and if UI is
+    // brought to foreground after that.
+    if ( iForegroundAfterWizardMessage && aForeground )
+        {
+        iForegroundAfterWizardMessage = EFalse;
+        
+        // launches the "Creating mailbox" wait note - 
+        // execution continues in the method StepL() after that.
+        StartWaitNoteL();
+        }
+        
+    }
+
+void CFSEmailUiWizardObserver::StartWaitNoteL()
+    {
+    FUNC_LOG;
+    
+    // This wait note will be dismissed in callback method EventL()
+    iProcessComplete = EFalse;
+    iInformAboutParams = ETrue;
+    iMainUiGridVisualiser->SetWizardWaitnoteShown( ETrue );
+    
+    TRAPD( waitNoteError,
+        {
+        if ( !iWaitNote )
+            {
+            iWaitNote = CAknWaitNoteWrapper::NewL();
+            }
+        
+        iWaitNote->ExecuteL( R_FSE_CREATING_MAILBOX_DIALOG, *this );
+        // after ExecuteL the execution continues in StepL()
+        } );
+    
+    if ( waitNoteError != KErrNone )
+        {
+        
+        // Only reason for the wait note showing to fail should be if we run
+        // out of memory, so there's not much we can do, except give up. So
+        // first reset our internal variables and clear the cenrep data so
+        // that the user data is not left there.
+        iProcessComplete = ETrue;
+        iInformAboutParams = EFalse;
+        iMainUiGridVisualiser->SetWizardWaitnoteShown( EFalse );
+
+        iAppUi->GetCRHandler()->ClearWizardParams();
+        
+        // Our own error note showing is probably not working either,
+        // but let's try it anyway
+        TRAPD( errorNoteError,
+            {
+            TFsEmailUiUtility::ShowGlobalErrorNoteL( R_FREESTYLE_EMAIL_UI_LOGIN_INFO_NOTE_ERROR_MAILBOX_SETUP_TRY_AGAIN );
+            } );
+
+        // If our own error note showing failed, then we leave and let
+        // the system show it's own error note
+        if ( errorNoteError != KErrNone )
+            {
+            User::Leave( waitNoteError );
+            }
+        }
+    
+    }
+
+void CFSEmailUiWizardObserver::InformFrameworkAboutParamsL()
+    {
+    FUNC_LOG;
+    
+    TInt mailboxConfigError( KErrNone );
+    // tell framework - and thus the plugin - to check the parameters from centrep
+    TRAPD( wDataAvailableError,
+        {
+        mailboxConfigError = iAppUi->GetMailClient()->WizardDataAvailableL();
+        } );
+    
+    // clears the two centrep keys that were passed as parameters to plugins
+    iAppUi->GetCRHandler()->ClearWizardParams();
+    
+    // The error filtering logic was moved here from CFSMailClient::WizardDataAvailableL.
+    // if an error is received, some called plugin didn't support the mailbox 
+    // creation process, or the parameters couldn't be read from central repository.
+    if ( mailboxConfigError != KErrNone || wDataAvailableError != KErrNone )
+        {
+        
+        // dismiss the wait note
+        iProcessComplete = ETrue;
+        iMainUiGridVisualiser->SetWizardWaitnoteShown( EFalse );
+        
+        // show an error note
+        TRAP_IGNORE(
+            {
+            TFsEmailUiUtility::ShowGlobalErrorNoteL( R_FREESTYLE_EMAIL_UI_LOGIN_INFO_NOTE_ERROR_MAILBOX_SETUP_TRY_AGAIN );
+            });
+        }
+    else
+        {
+        iNewMailboxEventHandlingAllowed = ETrue;
+        }
+    
+    }
+
+void CFSEmailUiWizardObserver::EventL( TFSMailEvent aEvent, TFSMailMsgId aMailbox, 
+                                       TAny* /*aParam1*/, TAny* /*aParam2*/, TAny* /*aParam3*/ )
+    {
+    FUNC_LOG;
+    
+    switch ( aEvent )
+    	{
+    	case TFSEventNewMailbox:
+    		{
+            // update grid view now when we have new mailbox created
+            iMainUiGridVisualiser->RefreshLauncherViewL();
+    		
+            if ( iNewMailboxEventHandlingAllowed )
+                {
+                iNewMailboxEventHandlingAllowed = EFalse; //reset the boolean
+                
+                // dismiss the wait note
+                iProcessComplete = ETrue;
+                iMainUiGridVisualiser->SetWizardWaitnoteShown( EFalse );
+                        
+                // clears the two centrep keys that were passed as parameters to plugins
+                iAppUi->GetCRHandler()->ClearWizardParams();
+                
+                // <cmail>
+                // new mailbox created -> open its Inbox folder after the 
+                // wait dialog is dismissed -> continued in 
+                // DialogDismissedL method.
+                // This code needed to be moved because Wait dialog is 
+                // still open and prevents the active view from receiving 
+                // events. That's why the grid view was not deactivated. 
+                iNewMailboxCreated = ETrue;
+                iNewlyCreatedMailboxId = aMailbox;
+                // </cmail>
+                }
+            else
+                {
+                }
+            }
+    		break;
+   		
+   		case TFSEventMailboxCreationFailure:
+    		{
+    		
+	         // dismiss the wait note
+	        iProcessComplete = ETrue;
+	        iMainUiGridVisualiser->SetWizardWaitnoteShown( EFalse );
+	        
+	        // clears the two centrep keys that were passed as parameters to plugins
+	        iAppUi->GetCRHandler()->ClearWizardParams();
+	        
+	        TRAP_IGNORE(
+	            {
+	            TFsEmailUiUtility::ShowGlobalErrorNoteL( R_FREESTYLE_EMAIL_UI_LOGIN_INFO_NOTE_ERROR_MAILBOX_SETUP_TRY_AGAIN );
+	            });
+	        }
+    		break;
+   		}           
+    
+    }
+
+//
+// MAknBackgroundProcess methods
+//
+void CFSEmailUiWizardObserver::StepL()
+    {
+    FUNC_LOG;
+    // Tell framework that there are parameters in the centrep 
+    // with which it can create a new mail account.
+    if ( iInformAboutParams )
+        {
+        iInformAboutParams = EFalse;  //reset the value
+        InformFrameworkAboutParamsL();
+        }
+    }
+
+TBool CFSEmailUiWizardObserver::IsProcessDone() const
+    {
+    FUNC_LOG;
+    return iProcessComplete;
+    }
+
+void CFSEmailUiWizardObserver::ProcessFinished()
+    {
+    FUNC_LOG;
+    // nothing here
+    }
+
+void CFSEmailUiWizardObserver::DialogDismissedL( TInt aButtonId )
+    {
+    FUNC_LOG;
+    // <cmail>
+    if ( iNewMailboxCreated ) 
+        {
+        // new mailbox created -> open its Inbox folder if Cancel button 
+        // not pressed
+        iNewMailboxCreated = EFalse;
+        if ( aButtonId != EAknSoftkeyCancel )
+            {
+            CFSMailBox* mailBox = iAppUi->GetMailClient()->GetMailBoxByUidL( 
+                iNewlyCreatedMailboxId );
+            CleanupStack::PushL( mailBox );
+            if ( mailBox )
+                {
+                TFSMailMsgId inboxFolderId = mailBox->GetStandardFolderId( 
+                        EFSInbox );
+            
+                // launch the inbox of the new mailbox
+                TMailListActivationData tmp;    
+                tmp.iFolderId = inboxFolderId; 
+                tmp.iMailBoxId = iNewlyCreatedMailboxId; 
+                const TPckgBuf<TMailListActivationData> pkgOut( tmp );
+                // The App might have been, say, in Attachments list of some 
+                // other mailbox but we should not return there with 'Back' 
+                // button - it should go to the launcher grid.  So first
+                // switch to launcher grid (which should unwind the history
+                // back to the launcher grid, which should be the view at
+                // the bottom of the stack) and then erase the history just
+                // to make sure it's really all gone.
+                iAppUi->EnterFsEmailViewL( AppGridId );
+                iAppUi->EraseViewHistory();
+                // Now switch to the mail list.
+                iAppUi->EnterFsEmailViewL( MailListId, KStartListWithFolderId, 
+                        pkgOut );
+                }
+                
+            CleanupStack::PopAndDestroy( mailBox );
+            }
+        }
+    // </cmail>
+    }
+
+TInt CFSEmailUiWizardObserver::CycleError( TInt /*aError*/ )
+    {
+    FUNC_LOG;
+    return KErrNone;
+    }
+
+// End of file
+