securitydialogs/simlockui/src/SimLockUIAppui.cpp
changeset 1 d5423fbb4f29
child 5 3b17fc5c9564
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/securitydialogs/simlockui/src/SimLockUIAppui.cpp	Tue Feb 02 00:44:34 2010 +0200
@@ -0,0 +1,417 @@
+/*
+ * ============================================================================
+ *  Name        : SimLockUIAppUi.cpp
+ *  Part of     : Sim Lock UI Application
+ *  Description : Implementation of Sim Lock UI Application UI Methods
+ *  Version     : 
+ *  
+* Copyright (c) 2005-2010 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:   Build info file for Ado domain appinstall 
+* ============================================================================
+*/
+
+// Platform Includes
+#include <avkon.hrh>
+#include <aknnotewrappers.h>    // CAknNoteDialog
+#include <stringloader.h>       // StringLoader
+#include <exterror.h>           // KErrGsm0707OperationNotAllowed
+#include <eikspane.h>     // CEikStatusPane
+#include <aknmessagequerydialog.h> // CAknMessageQueryDialog
+#include <e32base.h>
+#include <e32property.h> //Rproperty
+// Local Includes
+#include "SimLockISAServerDefinitions.h"
+#include "SimLockUI.pan"
+#include "SimLockUIAppUi.h"
+#include "SimLockUIBackgroundControl.h"
+#include "SimLockUI.hrh"
+#include "SimLockDataHandlingDelegate.h"
+#include "SimLockTelephonyProxy.h"
+#include "SimLockUiKeys.h"
+
+// Resource Includes
+#include <SimLockUI.rsg>
+
+// ---------------------------------------------------------------------------
+// CSimLockUIAppUi::CSimLockUIAppUi
+// ---------------------------------------------------------------------------
+CSimLockUIAppUi::CSimLockUIAppUi(
+        CSimLockDataHandlingDelegate& aSimLockDelegate) :
+    iSimLockDelegate(aSimLockDelegate), iFirstRun(ETrue)
+    {
+    // no implementation required
+    }
+
+// ---------------------------------------------------------------------------
+// CSimLockUIAppUi::ConstructL
+// ---------------------------------------------------------------------------
+void CSimLockUIAppUi::ConstructL()
+    {
+    BaseConstructL(EAknEnableSkin | EAknEnableMSK);
+
+    // Used to get status of phone call
+    iTelephonyProxy = CSimLockTelephonyProxy::NewL();
+    //Define RProperty to Publish Keys for SimLockUi
+    TInt ret = RProperty::Define(KSimLockProperty, ESimLockActiveStatus,
+            RProperty::EInt);
+    }
+
+// ---------------------------------------------------------------------------
+// CSimLockUIAppUi::~CSimLockUIAppUi
+// ---------------------------------------------------------------------------
+CSimLockUIAppUi::~CSimLockUIAppUi()
+    {
+
+    delete iTelephonyProxy;
+
+    if (iBackgroundControl)
+        {
+        RemoveFromStack(iBackgroundControl);
+        delete iBackgroundControl;
+        }
+    //Sets SimLock Ui P&S keys to show that SimLock Ui is exiting
+    RProperty::Set(KSimLockProperty, ESimLockActiveStatus, KSimLockStatusDone);
+
+    }
+
+// ---------------------------------------------------------------------------
+// CSimLockUIAppUi::HandleCommandL
+// ---------------------------------------------------------------------------
+void CSimLockUIAppUi::HandleCommandL(TInt aCommand)
+    {
+    switch (aCommand)
+        {
+        case EEikCmdExit:
+        case EAknSoftkeyExit:
+            Exit();
+            break;
+
+        default:
+            Panic(ESimLockUIBasicUi);
+            break;
+        }
+    }
+
+// ---------------------------------------------------------------------------
+// CSimLockUIAppUi::HandleForegroundEventL
+// ---------------------------------------------------------------------------
+void CSimLockUIAppUi::HandleForegroundEventL(TBool aForeground)
+    {
+    CAknAppUi::HandleForegroundEventL(aForeground);
+
+    // When the app switches to the foreground for the first time, display
+    // series of dialogs.
+    if (aForeground && iFirstRun)
+        {
+        iFirstRun = EFalse;   
+        ProcessSimUnlockDialogsL();
+        PrepareToExit();
+        Exit();
+        }
+    }
+
+// ---------------------------------------------------------------------------
+// CSimLockUIAppUi::ProcessSimUnlockDialogsL
+// ---------------------------------------------------------------------------
+TBool CSimLockUIAppUi::ProcessSimUnlockDialogsL()
+    {
+    TBool keepLooping = ETrue;
+
+    TBuf<SEC_ATT_PASSWORD_MAX_BUFFER> password;
+
+    // Loop until flag is set
+    do
+        {
+        // Create background if not already there
+        if (!iBackgroundControl)
+            {
+            CreateBackgroundControlL();
+            }
+        // Display Introduction Dialog/Prompt
+        if (!DisplayIntroductionDialogL())
+            {
+            return EFalse;
+            }
+        // Prompt for password and attempt to unlock Sim
+        if (!PromptForPasswordL(password))
+            {
+            // skip next iteration
+            continue;
+            }        
+        // Set only if no dialogs are ever dismissed
+         keepLooping = AttemptToUnlockSimL(password);
+
+        // Continue to loop while indicated to start over and dialog
+        // has not been dismissed
+        }
+    while (keepLooping);
+    
+  return keepLooping;
+    }
+
+// ---------------------------------------------------------------------------
+// CSimLockUIAppUi::CreateBackgroundControlL
+// ---------------------------------------------------------------------------
+void CSimLockUIAppUi::CreateBackgroundControlL()
+    {
+    CEikStatusPane* statusPane = StatusPane();
+
+    // Remove status pane
+    // Crop background pane to reveal idle status pane
+    TRect background = ClientRect();
+    statusPane->ReduceRect(background);
+    statusPane->SwitchLayoutL(R_AVKON_STATUS_PANE_LAYOUT_EMPTY);
+
+    iBackgroundControl = CSimLockUIBackgroundControl::NewL(background);
+    AddToStackL(iBackgroundControl);
+    }
+
+// ---------------------------------------------------------------------------
+// CSimLockUIAppUi::DisplayIntroductionDialogL
+// ---------------------------------------------------------------------------
+TBool CSimLockUIAppUi::DisplayIntroductionDialogL()
+    {
+    SetBackgroundTextL(EBackgroundTextEmpty);
+
+    HBufC* displayText = StringLoader::LoadLC(R_SIM_INFO_WELCOME_NOTE_TEXT);
+    CAknMessageQueryDialog* query = new (ELeave) CAknMessageQueryDialog(
+            CAknMessageQueryDialog::ENoTone);
+    CleanupStack::PushL(query);
+    query->SetMessageTextL(*displayText);
+    TInt executeResult = query->ExecuteLD(R_SIM_INFO_WELCOME_NOTE);
+    CleanupStack::Pop(query);
+    CleanupStack::PopAndDestroy(displayText);
+    return executeResult;
+
+    }
+
+// ---------------------------------------------------------------------------
+// CSimLockUIAppUi::PromptForPasswordL
+// ---------------------------------------------------------------------------
+TBool CSimLockUIAppUi::PromptForPasswordL(TDes& aPassword)
+    {
+    TBuf<SEC_ATT_PASSWORD_MAX_BUFFER> newPassword;
+
+    // Prompt for password twice.  Loop until passwords match.
+    do
+        {
+        aPassword.Zero();
+
+        // Ask for password
+        CAknTextQueryDialog* dialog = CAknTextQueryDialog::NewL(aPassword);
+       // dialog->SetMaxLength(SEC_ATT_PASSWORD_MAX_LENGTH);
+
+        if (!dialog->ExecuteLD(R_SIM_INFO_ENTER_PASSWORD))
+            {
+            return EFalse;
+            }
+
+        // Ask to re-enter password and verify there is no call in progress
+        if (!CompletePromptForPasswordL(aPassword, newPassword))
+            {
+            return EFalse;
+            }
+        }
+    while (newPassword.Compare(aPassword));
+
+    return ETrue;
+    }
+
+// ---------------------------------------------------------------------------
+// CSimLockUIAppUi::CompletePromptForPasswordL
+// ---------------------------------------------------------------------------
+TBool CSimLockUIAppUi::CompletePromptForPasswordL(const TDesC& aPassword,
+        TDes& aNewPassword)
+    {
+    TBool callInProgress = EFalse;
+
+    aNewPassword.Zero();
+
+    do // Loop until no call in progress
+        {
+        // Display dialog to ask to re-enter password
+        CAknTextQueryDialog* dialog = CAknTextQueryDialog::NewL(aNewPassword);
+        if (!dialog->ExecuteLD(R_SIM_INFO_REENTER_PASSWORD))
+            {
+             return EFalse;
+            }
+
+        // Check to see if passwords match
+        if (aNewPassword.Compare(aPassword))
+            {
+            // Create message query dialog to indicate that codes do not match
+            CAknMessageQueryDialog* query =
+                    new (ELeave) CAknMessageQueryDialog(
+                            CAknMessageQueryDialog::ENoTone);
+            return query->ExecuteLD(R_SIM_INFO_CODES_NOT_MATCH);            
+            }
+
+        // If there is a call in progress, show note and return to "re-enter password" prompt
+        if (!iTelephonyProxy->IsCallInProgress())
+            {
+            return ETrue;
+            }
+
+        // Do not allow Sim unlocking, return to password prompt
+        ShowInformationNoteL(R_SIM_UNLOCK_MESSAGE_END_CALL);
+        callInProgress = ETrue;
+        }
+    while (callInProgress);
+
+    return ETrue;
+    }
+
+// ---------------------------------------------------------------------------
+// CSimLockUIAppUi::AttemptToUnlockSimL
+// ---------------------------------------------------------------------------
+TBool CSimLockUIAppUi::AttemptToUnlockSimL(const TDesC& aPassword)
+    {
+    
+const TDesC& password =  aPassword;
+
+#ifdef __WINS__
+    // In WINS (Emulator) builds, call to OpenSimLock will just time out
+    TInt unlockResult = KErrGsm0707IncorrectPassword;
+#else
+    // Attempt to unlock SIM
+    TInt unlockResult = iSimLockDelegate.OpenSimLock( password );
+#endif
+
+    CAknMessageQueryDialog* query = new (ELeave) CAknMessageQueryDialog(
+            CAknMessageQueryDialog::ENoTone);
+
+    switch (unlockResult)
+        {
+        case KErrAlreadyExists:
+            // Should not happen!  This indicates that the phone was already unlocked,
+            // which it shouldn't be if we got this far.
+            ASSERT( 0 );
+
+            // Fall Through
+
+        case KErrNone:
+            SetBackgroundTextL(EBackgroundTextUnlockComplete);
+            ShowInformationNoteL(R_SIM_PHONE_UNLOCKED);
+            return EFalse;
+
+        default:
+            // Oops, we missed one.
+            ASSERT( 0 );
+        case KErrGsm0707OperationNotAllowed:
+        case KErrLocked:
+            // Permanently locked
+            SetBackgroundTextL(EBackgroundTextEmpty);
+            query->ExecuteLD(R_SIM_UNLOCK_FINAL);
+            return EFalse;
+        case KErrTimedOut:
+        case KErrGeneral:        
+        case KErrArgument:
+        case KErrGsm0707IncorrectPassword:
+            // Not permanently locked
+            return HandleUnlockFailedL();
+
+
+        }//switch
+    }
+// ---------------------------------------------------------------------------
+// CSimLockUIAppUi::HandleUnlockFailedL
+// ---------------------------------------------------------------------------
+TBool CSimLockUIAppUi::HandleUnlockFailedL()
+    {
+    TBuf<SEC_ATT_PASSWORD_MAX_BUFFER> password;
+    // Otherwise, prompt user to try again
+    SetBackgroundTextL(EBackgroundTextEmpty);
+
+    // Show "Code Incorrect" and prompt user to continue or not
+    CAknMessageQueryDialog* query = new (ELeave) CAknMessageQueryDialog(
+            CAknMessageQueryDialog::ENoTone);
+    if (query->ExecuteLD(R_SIM_INFO_CODE_INCORRECT))
+        {
+        if ( PromptForPasswordL(password) )
+            {
+            return AttemptToUnlockSimL(password);    
+            }
+        else
+            {
+            // Set flag indicating to keep looping            
+            return ETrue;
+            }
+        }
+    else
+        {
+        // display intro popup
+        return ETrue;
+        }
+    }
+
+// ---------------------------------------------------------------------------
+// CSimLockUIAppUi::ShowInformationNoteL
+// ---------------------------------------------------------------------------
+TInt CSimLockUIAppUi::ShowInformationNoteL(TInt aResourceId) const
+    {
+    TInt executeResult;
+
+    // Show note with the provided resource id
+    HBufC* displayText = StringLoader::LoadLC(aResourceId);
+
+    CAknInformationNote* dialog = new (ELeave) CAknInformationNote(ETrue);
+    executeResult = dialog->ExecuteLD(*displayText);
+    CleanupStack::PopAndDestroy(displayText);
+    return executeResult;
+    }
+
+// ---------------------------------------------------------------------------
+// CSimLockUIAppUi::SetBackgroundTextL
+// ---------------------------------------------------------------------------
+void CSimLockUIAppUi::SetBackgroundTextL(TBackgroundText aText)
+    {
+    HBufC* displayText = NULL;
+
+    // Load resource and set text in background control based on provided info
+    switch (aText)
+        {
+        case EBackgroundTextEmpty:
+            displayText = KNullDesC().AllocL();
+            break;
+
+        case EBackgroundTextMain:
+            displayText = StringLoader::LoadL(
+                    R_SIMLOCK_UI_BACKGROUND_TEXT_MAIN);
+            break;
+
+        case EBackgroundTextUnlockComplete:
+            displayText = StringLoader::LoadL(
+                    R_SIMLOCK_UI_BACKGROUND_TEXT_UNLOCK_COMPLETE);
+            break;
+
+        case EBackgroundTextUnlockFailed:
+            displayText = StringLoader::LoadL(
+                    R_SIMLOCK_UI_BACKGROUND_TEXT_UNLOCK_FAILED);
+            break;
+
+        case EBackgroundTextUnlockIncorrect:
+            displayText = StringLoader::LoadL(
+                    R_SIMLOCK_UI_BACKGROUND_TEXT_UNLOCK_INCORRECT);
+            break;
+
+        default:
+            ASSERT( 0 );
+            break;
+        }
+
+    // Transfer ownership to iBackgroundControl
+    iBackgroundControl->SetBackgroundText(displayText);
+    }
+
+// End of file.