gssettingsuis/Gs/GSCallBarringPlugin/Src/GSCellularCallBarringView.cpp
changeset 68 13e71d907dc3
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/gssettingsuis/Gs/GSCallBarringPlugin/Src/GSCellularCallBarringView.cpp	Thu Nov 04 13:38:47 2010 +0800
@@ -0,0 +1,576 @@
+/*
+* Copyright (c) 2002-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:  View for the Barring folder
+*
+*/
+
+ 
+// INCLUDE FILES
+#include "GSCellularCallBarringView.h"  //for CGSSettListBarringView
+#include "GSCellularCallBarringContainer.h"//for CGSBaseContainer
+#include "GSPhoneSettingConstants.h"  //for constant values
+#include "GSCallBarringPlugin.h"            //for plugin UID
+#include "GsLogger.h"
+#include "LocalViewIds.h"           //for KTellBarringViewId
+
+#include <gscommon.hrh>
+#include <coeaui.h>
+#include <hlplch.h>             // For HlpLauncher
+#include <e32base.h>
+#include <featmgr.h>
+#include <gscallbarringpluginrsc.rsg>      //for resource IDs
+#include <exterror.h>               //for extended error codes
+#include <StringLoader.h>           //for StringLoader
+#include <PsetContainer.h>          //for CPsetContainer
+#include <PsuiContainer.h>          //for CPsuiContainer
+#include <eikmenup.h>               //for menu bar
+#include <secuicodequerydialog.h>
+#include <nwdefs.h>
+#include <aknViewAppUi.h>
+#include <gsfwviewuids.h>
+#if defined(__VOIP) && defined(RD_VOIP_REL_2_2)
+#include <spsettings.h>
+#endif // __VOIP && RD_VOIP_REL_2_2
+ 
+// ========================= MEMBER FUNCTIONS ================================
+// ---------------------------------------------------------------------------
+// 
+// C++ constructor.
+// 
+// ---------------------------------------------------------------------------
+CGSSettListBarringView::CGSSettListBarringView()
+    {
+    }
+
+// ---------------------------------------------------------------------------
+// 
+// Symbian OS two-phased constructor (second phase)
+// 
+// ---------------------------------------------------------------------------
+void CGSSettListBarringView::ConstructL()
+    {
+    __GSLOGSTRING("[GS]--> CGSSettListBarringView::ConstructL");
+    BaseConstructL( R_GS_BARRING_VIEW );
+
+    iSettings = CPsetContainer::NewL();
+    iObsContainer = CPsuiContainer::NewL();
+    iCbObserver = iObsContainer->CreateCBObsL();
+    iBarring = iSettings->CreateCBObjectL( *iCbObserver );
+    iRockerPress = EFalse;
+    iContextMenuInitialized = EFalse;
+    __GSLOGSTRING("[GS] <--CGSSettListBarringView::ConstructL");
+    }
+
+
+// ---------------------------------------------------------------------------
+// CGSSettListBarringView::NewL()
+// Symbian OS two-phased constructor
+// 
+// ---------------------------------------------------------------------------
+CGSSettListBarringView* CGSSettListBarringView::NewL()
+    {
+    CGSSettListBarringView* self = NewLC();
+    CleanupStack::Pop( self );
+    return self;
+    }
+
+
+// ---------------------------------------------------------------------------
+// 
+// Symbian OS two-phased constructor (first phase)
+// 
+// ---------------------------------------------------------------------------
+CGSSettListBarringView* CGSSettListBarringView::NewLC()
+    {
+    __GSLOGSTRING("[GS]--> CGSSettListBarringView::NewLC");
+    CGSSettListBarringView* self = new ( ELeave ) CGSSettListBarringView;
+    CleanupStack::PushL( self );
+    self->ConstructL();
+
+    __GSLOGSTRING("[GS] <--CGSSettListBarringView::NewLC");
+    return self;
+    }
+ 
+// ---------------------------------------------------------------------------
+// 
+// C++ destructor
+// 
+// ---------------------------------------------------------------------------
+CGSSettListBarringView::~CGSSettListBarringView()
+    {
+    delete iBarring;
+    delete iSettings;
+    delete iObsContainer;
+    delete iCbObserver;
+    iRockerPress = EFalse;
+
+    }
+ 
+// ---------------------------------------------------------------------------
+// 
+// Returns Id of the Barring view.
+// 
+// ---------------------------------------------------------------------------
+TUid CGSSettListBarringView::Id() const
+    {
+    return KCallBarringViewId;
+    }
+ 
+// ---------------------------------------------------------------------------
+// 
+// Handles other than list box events.
+// 
+// ---------------------------------------------------------------------------
+void CGSSettListBarringView::HandleCommandL( TInt aCommand )
+    {
+    __GSLOGSTRING("[GS]--> CGSSettListBarringView::HandleCommandL");
+    iRockerPress = EFalse;
+
+    TCallBarringSetting barringSetting;
+    iCurrentItem = iContainer->iListBox->CurrentItemIndex();
+    SetBarringType( 
+        aCommand, 
+        barringSetting, 
+        static_cast <TGSBarringSetting> (iCurrentItem) );
+#if defined(__VOIP) && defined(RD_VOIP_REL_2_2)
+    CSPSettings* spSettings = CSPSettings::NewL();
+    TBool showVoipFeatures( EFalse );
+    if ( spSettings->IsFeatureSupported( ESupportVoIPFeature ) &&
+        spSettings->IsFeatureSupported( ESupportVoIPSSFeature ) )
+        {
+        showVoipFeatures = ETrue;
+        }
+    delete spSettings;
+#endif // __VOIP && RD_VOIP_REL_2_2
+    
+    switch ( aCommand )
+        {
+        case EGSCmdAppChange:
+            iRockerPress = EFalse;
+            HandleListBoxEventL( iContainer->iListBox, EEventEnterKeyPressed );
+            break;
+        case EAknSoftkeyBack:
+#if defined(__VOIP) && defined(RD_VOIP_REL_2_2)
+            if ( showVoipFeatures )
+                {
+                iAppUi->ActivateLocalViewL( KCallMainBarringViewId );
+                }
+            else
+                {
+                iAppUi->ActivateLocalViewL( KGSTelPluginUid );
+                }
+#else // __VOIP && RD_VOIP_REL_2_2
+            if ( FeatureManager::FeatureSupported( KFeatureIdCommonVoip ) )
+                {
+                iAppUi->ActivateLocalViewL( KCallMainBarringViewId );
+                }
+            else
+                {
+                iAppUi->ActivateLocalViewL( KGSTelPluginUid );
+                }
+#endif // __VOIP && RD_VOIP_REL_2_2
+            break;
+        case EGSCmdBarringActivate:
+            barringSetting.iSetting = EActivateBarring;
+            HandleBarringOperationL( barringSetting, EAllTeleAndBearer );
+            break;
+        case EGSCmdBarringCancel:
+            barringSetting.iSetting = ECancelBarring;
+            HandleBarringOperationL( barringSetting, EAllTeleAndBearer );
+            break;
+        case EGSCmdBarringInquiry:
+            iBarring->GetBarringStatusL( EServiceGroupVoice, 
+                barringSetting.iType );             
+            break;
+        case EGSCmdBarringChangePwd:
+            ChangeBarringPwdL();            
+            break;
+        case EGSCmdBarringCancelAll:
+            CancelAllBarringsL();            
+            break;
+        case EAknCmdHelp:
+            {
+            if( FeatureManager::FeatureSupported( KFeatureIdHelp ) )
+                {
+                HlpLauncher::LaunchHelpApplicationL(
+                    iEikonEnv->WsSession(), iAppUi->AppHelpContextL() );
+                }
+            break;
+            }
+        default:
+            iAppUi->HandleCommandL( aCommand );
+            break;
+        }
+    __GSLOGSTRING("[GS] <--CGSSettListBarringView::HandleCommandL");
+    }
+  
+// ---------------------------------------------------------------------------
+// 
+// Activates view.
+// 
+// ---------------------------------------------------------------------------
+void CGSSettListBarringView::DoActivateL( const TVwsViewId& aPrevViewId,
+                                          TUid aCustomMessageId,
+                                          const TDesC8& aCustomMessage )
+    {
+    __GSLOGSTRING("[GS]--> CGSSettListBarringView::DoActivateL");
+    CGSLocalBaseView::DoActivateL( aPrevViewId, aCustomMessageId, 
+                                   aCustomMessage );
+
+    iContainer->iListBox->SetTopItemIndex(iTopItemIndex);
+
+    if (iCurrentItem >= 0 && 
+        iCurrentItem < iContainer->iListBox->Model()->NumberOfItems())
+        {
+        iContainer->iListBox->SetCurrentItemIndexAndDraw(iCurrentItem);
+        }
+    __GSLOGSTRING("[GS] <--CGSSettListBarringView::DoActivateL");
+    }
+ 
+// ---------------------------------------------------------------------------
+// 
+// Deactivates view.
+// 
+// ---------------------------------------------------------------------------
+void CGSSettListBarringView::DoDeactivate()
+    {
+    __GSLOGSTRING("[GS]--> CGSSettListBarringView::DoDeactivate");
+    if ( iContainer )
+        {
+        iCurrentItem = iContainer->iListBox->CurrentItemIndex();
+        iTopItemIndex = iContainer->iListBox->TopItemIndex();
+ 
+        iAppUi->RemoveFromViewStack( *this, iContainer );
+        delete iContainer;
+        iContainer = NULL;
+        }
+    __GSLOGSTRING("[GS] <--CGSSettListBarringView::DoDeactivate");
+    }
+ 
+ 
+ // -----------------------------------------------------------------------------
+// CGSSettListBarringView::ProcessCommandL
+// -----------------------------------------------------------------------------
+void CGSSettListBarringView::ProcessCommandL( TInt aCommand )
+    {
+    // Context menu is needed to be initialized only if selection key
+    // is pressed. Initialization need to be performed only once.
+    if( aCommand == EAknSoftkeyContextOptions &&
+            !iContextMenuInitialized )
+            {
+            MenuBar()->SetContextMenuTitleResourceId(
+                    R_CALL_BARRING_MSK_CONTEXTMENUBAR );
+            iContextMenuInitialized = ETrue;
+            }
+    
+    // Call base class
+    CAknView::ProcessCommandL( aCommand );
+    }
+// ---------------------------------------------------------------------------
+// 
+// Before showing a options menu, delete options key specific settings if 
+// rocker key has been pressed.
+// ---------------------------------------------------------------------------
+//
+void CGSSettListBarringView::DynInitMenuPaneL( TInt aResourceId, 
+                                              CEikMenuPane* aMenuPane )
+    {
+    __GSLOGSTRING("[GS]--> CGSSettListBarringView::DynInitMenuPaneL");
+    CEikMenuBar* menuBar = MenuBar();
+    // show or hide the 'help' menu item when supported
+    if( aResourceId == R_GS_MENU_ITEM_HELP )
+        {
+        if ( FeatureManager::FeatureSupported( KFeatureIdHelp ) )
+            {
+            aMenuPane->SetItemDimmed( EAknCmdHelp, EFalse );
+            }
+        else
+            {
+            aMenuPane->SetItemDimmed( EAknCmdHelp, ETrue );
+            }
+        }
+        
+    if ( iRockerPress )
+        {
+        // always hide 'help' & 'exit' menu items when rocker key is pressed
+        if( aResourceId == R_GS_MENU_ITEM_EXIT )
+            {
+            aMenuPane->SetItemDimmed( EAknCmdExit, ETrue );
+            }
+        else if ( aResourceId == R_GS_MENU_ITEM_HELP )
+            {
+            aMenuPane->SetItemDimmed( EAknCmdHelp, ETrue );
+            }
+        else if ( aResourceId == R_GS_BARRING_VIEW_MENU )
+            {
+            // these options are not initialized in restricted call barring
+            if ( !FeatureManager::FeatureSupported( KFeatureIdRestrictedCallBarring ) )
+                {
+                aMenuPane->SetItemDimmed( EGSCmdBarringCancelAll, ETrue );
+                aMenuPane->SetItemDimmed( EGSCmdBarringChangePwd, ETrue );
+                }
+            }
+        }
+	else if (aResourceId == R_GS_BARRING_VIEW_MENU)
+		{
+		if (!menuBar->ItemSpecificCommandsEnabled() && menuBar->GetMenuType()
+				== CEikMenuBar::EMenuOptions)
+			{
+			aMenuPane->SetItemDimmed(EGSCmdBarringActivate, ETrue);
+			aMenuPane->SetItemDimmed(EGSCmdBarringCancel, ETrue);
+			aMenuPane->SetItemDimmed(EGSCmdBarringInquiry, ETrue);
+			}
+		}
+    __GSLOGSTRING("[GS] <--CGSSettListBarringView::DynInitMenuPaneL");
+    }
+
+// ---------------------------------------------------------------------------
+// 
+// Queries password from the user.
+// 
+// ---------------------------------------------------------------------------
+//
+TInt CGSSettListBarringView::BarringPasswordQueryL( 
+    TBarringPassword& aBarringPassword,
+    const TInt& aTitleID )
+    {
+    __GSLOGSTRING("[GS]--> CGSSettListBarringView::BarringPasswordQueryL");
+    TBool continueLoop = ETrue;
+
+    while ( continueLoop )
+        {
+        aBarringPassword = KNullDesC;
+        CCodeQueryDialog* dlg = new (ELeave)
+            CCodeQueryDialog( aBarringPassword, KGSBarringPasswordLength, 
+            KGSBarringPasswordLength, ESecUiNone );
+        dlg->PrepareLC( R_BARRING_PASSWORD_DLG );
+
+        HBufC* string = NULL;
+        string = StringLoader::LoadLC( aTitleID );        
+        dlg->SetPromptL( *string );
+        CleanupStack::PopAndDestroy( string );        
+
+        TInt res = dlg->RunLD();
+        dlg = NULL;
+
+        if ( res )
+            {
+            if ( aBarringPassword.Length() == KGSBarringPasswordLength )
+                {
+                continueLoop = EFalse;
+                }
+            }
+        else
+            {
+            __GSLOGSTRING("[GS]    BarringPasswordQueryL: EAknSoftkeyCancel returned");
+            __GSLOGSTRING("[GS] <--CGSSettListBarringView::BarringPasswordQueryL");
+            return EAknSoftkeyCancel;
+            }        
+    }
+    __GSLOGSTRING("[GS]    BarringPasswordQueryL: EAknSoftkeyOk returned");
+    __GSLOGSTRING("[GS] <--CGSSettListBarringView::BarringPasswordQueryL");
+    return EAknSoftkeyOk;
+ }
+ 
+// ---------------------------------------------------------------------------
+// 
+// Adds given item to a given list
+// 
+// ---------------------------------------------------------------------------
+void CGSSettListBarringView::AppendItemL( 
+    CDesCArrayFlat& aList, const TInt aItem )
+    {
+    HBufC* string = NULL;
+    string = StringLoader::LoadLC( aItem );
+    aList.AppendL( *string );
+    CleanupStack::PopAndDestroy( string );
+    }
+
+// ---------------------------------------------------------------------------
+// 
+// Handles barring operation requests.
+// 
+// ---------------------------------------------------------------------------
+void CGSSettListBarringView::HandleBarringOperationL( 
+    TCallBarringSetting aBarringSetting, TBasicServiceGroups aBsc )
+    {
+    __GSLOGSTRING("[GS]--> CGSSettListBarringView::HandleBarringOperationL");
+    TInt ret = KErrNone;
+    ret = BarringPasswordQueryL( 
+        aBarringSetting.iPassword, R_BARRING_PASSWORD );
+    if ( ret == EAknSoftkeyOk )
+         {
+         iBarring->SetBarringL( aBarringSetting, aBsc );
+         }
+    __GSLOGSTRING("[GS] <--CGSSettListBarringView::HandleBarringOperationL");
+    }
+
+// ---------------------------------------------------------------------------
+// 
+// Sets barring type. Switches from GS internal values, to values
+// shared by phone/phonesettings.
+// ---------------------------------------------------------------------------
+void CGSSettListBarringView::SetBarringType( TInt& aCommand,
+    TCallBarringSetting& aBarringSetting, 
+    TGSBarringSetting aType )
+    {
+    __GSLOGSTRING("[GS]--> CGSSettListBarringView::SetBarringType");
+    if ( aCommand != EGSCmdBarringActivate &&
+         aCommand != EGSCmdBarringCancel &&
+         aCommand != EGSCmdBarringInquiry &&
+         aCommand != EGSCmdBarringChangePwd &&
+         aCommand != EGSCmdBarringCancelAll )
+        {
+        __GSLOGSTRING("[GS]    SetBarringType: No barring variables set");
+        return; //in case of exit do not set barring variables.
+        }
+
+    aBarringSetting.iServiceGroup = EServiceGroupVoice;
+
+    switch ( aType )
+        {
+        case EGSCBOutgoing:
+            aBarringSetting.iType = EBarringTypeAllOutgoing;
+            break;    
+        case EGSCBInternational:
+            aBarringSetting.iType = EBarringTypeOutgoingInternational;
+            break;
+        case EGSCBInternationalExceptHome:
+            aBarringSetting.iType = 
+                EBarringTypeOutgoingInternationalExceptToHomeCountry;
+            break;
+        case EGSCBIncoming:
+            aBarringSetting.iType = EBarringTypeAllIncoming;
+            break;
+        case EGSCBAbroad:
+            aBarringSetting.iType = EBarringTypeIncomingWhenRoaming;
+            break;
+        default:
+            aBarringSetting.iType = EBarringTypeAllBarrings;
+            break;
+        }
+        
+    if ( FeatureManager::FeatureSupported( KFeatureIdRestrictedCallBarring ) )
+        {
+        // Restricted call barring only support EBarringTypeIncomingWhenRoaming
+        aBarringSetting.iType = EBarringTypeIncomingWhenRoaming;
+        }    
+
+    __GSLOGSTRING("[GS] <--CGSSettListBarringView::SetBarringType");
+    }
+
+// ---------------------------------------------------------------------------
+// 
+// Creates a request to cancel all barrings.
+// 
+// ---------------------------------------------------------------------------
+void CGSSettListBarringView::CancelAllBarringsL()
+    {
+    __GSLOGSTRING("[GS]--> CGSSettListBarringView::CancelAllBarringsL");
+    TCallBarringSetting cancelAllCB;       
+
+    TInt retValue = KErrNone; 
+    retValue = BarringPasswordQueryL( cancelAllCB.iPassword, 
+        R_BARRING_PASSWORD );
+    if ( retValue == EAknSoftkeyOk )
+        { 
+        cancelAllCB.iSetting = ECancelBarring;
+        cancelAllCB.iType = EBarringTypeAllBarrings;
+        cancelAllCB.iServiceGroup = EServiceGroupVoice;
+        iBarring->SetBarringL( cancelAllCB, EAllTeleAndBearer );
+        }
+    __GSLOGSTRING("[GS] <--CGSSettListBarringView::CancelAllBarringsL");
+    }
+
+// ---------------------------------------------------------------------------
+// 
+// Handles changing of barring password.
+// 
+// ---------------------------------------------------------------------------
+void CGSSettListBarringView::ChangeBarringPwdL()
+    {
+    __GSLOGSTRING("[GS]--> CGSSettListBarringView::ChangeBarringPwdL");
+    TInt returnValue = KErrNone;
+    RMobilePhone::TMobilePhonePasswordChangeV2 pwd;
+
+    returnValue = BarringPasswordQueryL( 
+        pwd.iOldPassword, R_CURRENT_BARRING_PASSWORD );
+
+    if ( returnValue != EAknSoftkeyOk ) //cancelled or error
+        {
+        __GSLOGSTRING("[GS]    ChangeBarringPwdL: Current PW cancelled/error");
+        return;
+        }
+    returnValue = BarringPasswordQueryL( pwd.iNewPassword, 
+        R_NEW_BARRING_PASSWORD );
+    if ( returnValue != EAknSoftkeyOk ) //cancelled or error
+        {
+        __GSLOGSTRING("[GS]    ChangeBarringPwdL: New PW cancelled/error");
+        return;
+        }
+    returnValue = BarringPasswordQueryL( pwd.iVerifiedPassword , 
+                                         R_VERIFY_NEW_BARRING_PASSWORD );
+    if ( returnValue != EAknSoftkeyOk )
+        {
+        __GSLOGSTRING("[GS]    ChangeBarringPwdL: Verify PW1 cancelled/error");
+        return;
+        }            
+    // check if newpw and verifypw do not 
+    // match->password error->return to query            
+    while ( pwd.iNewPassword.Compare( pwd.iVerifiedPassword ) != 0 )
+        {
+        iCbObserver->HandleBarringErrorL( KErrGsmSSNegativePasswordCheck );
+
+        returnValue = BarringPasswordQueryL( pwd.iVerifiedPassword, 
+                                             R_VERIFY_NEW_BARRING_PASSWORD );
+        if ( returnValue != EAknSoftkeyOk ) //cancelled or error
+            {
+            __GSLOGSTRING("[GS]    ChangeBarringPwdL: Verify PW2 cancelled/error");
+            return;
+            }
+        }
+    iBarring->ChangePasswordL( pwd, ETrue );
+    __GSLOGSTRING("[GS] <--CGSSettListBarringView::ChangeBarringPwdL");
+    }
+
+// ---------------------------------------------------------------------------
+// 
+// Creates new iContainer.
+// 
+// ---------------------------------------------------------------------------
+void CGSSettListBarringView::NewContainerL()
+    {
+    iContainer = new (ELeave) CGSSettListBarringContainer;
+    }
+
+// ---------------------------------------------------------------------------
+// 
+// Handles listbox selection
+// 
+// ---------------------------------------------------------------------------
+void CGSSettListBarringView::HandleListBoxSelectionL()
+    {
+    iRockerPress = ETrue;
+    CEikMenuBar* menuBar = this->MenuBar();
+    menuBar->SetMenuType( CEikMenuBar::EMenuContext );
+    menuBar->SetContextMenuTitleResourceId(R_CALL_BARRING_MSK_CONTEXTMENUBAR);
+    // Display menu bar.
+    menuBar->TryDisplayContextMenuBarL();
+    iRockerPress = EFalse;
+    menuBar->SetMenuType( CEikMenuBar::EMenuOptions );
+    iContextMenuInitialized = ETrue;
+    }
+
+
+ // End of file