diff -r 7d48bed6ce0c -r 987c9837762f cbs/cbsui/UiSrc/ccbsuisettingsviewcontainer.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/cbs/cbsui/UiSrc/ccbsuisettingsviewcontainer.cpp Wed Sep 01 12:15:03 2010 +0100 @@ -0,0 +1,683 @@ +/* +* Copyright (c) 2002-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: +* Implementation of CCbsUiSettingsViewContainer. +* +* +*/ + + +// INCLUDES +#include // For feature flags +#include // FeatureManager +#include // CAknErrorNote +#include +#include +#include +#include +#include +#include // CRepository +#include // KCRUidCoreApplicationUIs, TCoreAppUIsNetworkConnectionAllowed +#include "CbsUiId.h" +#include +#include // KEikDynamicLayoutVariantSwitch +#include "MCbs.h" +#include "ccbsuisettingsviewcontainer.h" +#include "CCbsUiSettingsView.h" +#include "CbsUiConstants.h" +#include "CCbsUiLanguageSettingPage.h" +#include "CbsUiPanic.h" + + + +// CONSTANTS + +// exact number of items in selection list +const TInt KNumberOfItemsInSelectionPage = 3; + +// There should be only one item in the list box before, which +// is reception. +const TInt KPreciseNumberOfItemsBeforeLanguage = 1; +const TInt KNumberOfOnOfItems = 2; + + + + +// MODULE DATA STRUCTURES +enum TCbsUiSettingValues { EReception, ELanguage, ETopicDetection }; + +// to select right item in setting_items_with_two_available_values +enum TCbsUiSettingOnOff + { + ESettingOn = 0, + ESettingOff + }; + +// ================= MEMBER FUNCTIONS ======================= + +// C++ default constructor can NOT contain any code, that +// might leave. +// +CCbsUiSettingsViewContainer::CCbsUiSettingsViewContainer( + CCbsUiSettingsView& aView, + MCbs& aServer ) + : iView( aView ), iServer( aServer ) + { + } + +// Symbian OS default constructor can leave. +void CCbsUiSettingsViewContainer::ConstructL( const TRect& aRect ) + { + CreateWindowL(); + SetMopParent(&iView); + CreateListBoxL(); + SetRect( aRect ); + + // Prepare FeatureManager, read values to members and uninitialize FeatureManager + FeatureManager::InitializeLibL(); + iOfflineFeatureSupported = FeatureManager::FeatureSupported( KFeatureIdOfflineMode ); + } + +// Two-phased constructor. +CCbsUiSettingsViewContainer* CCbsUiSettingsViewContainer::NewL( + CCbsUiSettingsView& aView, + const TRect& aRect, + MCbs& aServer ) + { + CCbsUiSettingsViewContainer* self = + new (ELeave) CCbsUiSettingsViewContainer(aView, aServer); + + CleanupStack::PushL(self); + self->ConstructL(aRect); + CleanupStack::Pop(); + + return self; + } + +// Destructor +CCbsUiSettingsViewContainer::~CCbsUiSettingsViewContainer() + { + delete iListBox; + FeatureManager::UnInitializeLib(); + } + +// --------------------------------------------------------- +// CCbsUiSettingsViewContainer::CountComponentControls +// +// +// --------------------------------------------------------- +// +TInt CCbsUiSettingsViewContainer::CountComponentControls() const + { + return 1; + } + +// --------------------------------------------------------- +// CCbsUiSettingsViewContainer::ComponentControl +// +// +// --------------------------------------------------------- +// +CCoeControl* CCbsUiSettingsViewContainer::ComponentControl( TInt aIndex ) const + { + CCoeControl* control = NULL; + + switch ( aIndex ) + { + case 0: + control = iListBox; + break; + default: + break; + } + + return control; + } + +// --------------------------------------------------------- +// CCbsUiSettingsViewContainer::OfferKeyEventL +// +// +// --------------------------------------------------------- +// +TKeyResponse CCbsUiSettingsViewContainer::OfferKeyEventL( + const TKeyEvent& aKeyEvent, + TEventCode aType ) + { + return iListBox->OfferKeyEventL( aKeyEvent, aType ); + } + +// --------------------------------------------------------- +// CCbsUiSettingsViewContainer::SizeChanged +// +// +// --------------------------------------------------------- +// +void CCbsUiSettingsViewContainer::SizeChanged() + { + iListBox->SetRect( Rect() ); + } + + +// --------------------------------------------------------- +// CCbsUiSettingsViewContainer::FocusChanged +// --------------------------------------------------------- +// +void CCbsUiSettingsViewContainer::FocusChanged( TDrawNow aDrawNow ) + { + CCoeControl::FocusChanged( aDrawNow ); + if( iListBox ) + { + iListBox->SetFocus( IsFocused(), aDrawNow ); + } + } + + +// --------------------------------------------------------- +// CCbsUiSettingsViewContainer::CreateListBoxL +// +// +// --------------------------------------------------------- +// +void CCbsUiSettingsViewContainer::CreateListBoxL() + { + iListBox = new (ELeave) CAknSettingStyleListBox; + iListBox->SetContainerWindowL( *this ); + iListBox->ConstructL( this, EAknListBoxSelectionListWithShortcuts ); + iListBox->SetListBoxObserver( this ); + iListBox->CreateScrollBarFrameL( ETrue ); + iListBox->ScrollBarFrame()->SetScrollBarVisibilityL( CEikScrollBarFrame::EOff, + CEikScrollBarFrame::EAuto ); + GetSettingsL(); + } + + +// --------------------------------------------------------- +// CCbsUiSettingsViewContainer::GetSettingsL +// +// +// --------------------------------------------------------- +// +void CCbsUiSettingsViewContainer::GetSettingsL() + { + __ASSERT_DEBUG( iListBox, CbsUiPanic(EListBoxNullError) ); + + MDesCArray* itemList = + STATIC_CAST(CEikFormattedCellListBox*, + iListBox)->Model()->ItemTextArray(); + + CDesCArray* itemArray = STATIC_CAST(CDesCArray*, itemList); + + itemArray->Reset(); + + TBool status; + iServer.GetReceptionStatus(status); + + TInt resourceId(R_TEXT_RECEPTION_ON); + + if ( !status ) + { + resourceId = R_TEXT_RECEPTION_OFF; + } + + HBufC* reception = iCoeEnv->AllocReadResourceLC(resourceId); + itemArray->AppendL(*reception); + CleanupStack::PopAndDestroy(); // reception + + // This must be here, don't move; otherwise order + // is different in the list box. + SetLanguageSelectionL(*itemArray); + + iServer.GetTopicDetectionStatus(status); + resourceId = R_TEXT_DETECTION_ON; + + if ( !status ) + { + resourceId = R_TEXT_DETECTION_OFF; + } + + HBufC* detection = iCoeEnv->AllocReadResourceLC(resourceId); + + itemArray->AppendL(*detection); + CleanupStack::PopAndDestroy(); // detection + + iListBox->HandleItemAdditionL(); + + } + + +// --------------------------------------------------------- +// CCbsUiSettingsViewContainer::PrepareLanguageSettingPageL +// +// +// --------------------------------------------------------- +// +void CCbsUiSettingsViewContainer::PrepareLanguageSettingPageL() + { + + CDesCArrayFlat* items = + new (ELeave) CDesCArrayFlat(KNumberOfItemsInSelectionPage); + CleanupStack::PushL(items); + + AddItemsToListL( + R_CBS_LANGUAGE_SETTING_PAGE_ARRAY, *items); + + TInt selected( GetSelected() ); + + LaunchLanguageSettingPageL(*items, selected); + + CleanupStack::PopAndDestroy(); // items + + } + +// --------------------------------------------------------- +// CCbsUiSettingsViewContainer::GetSelected +// +// +// --------------------------------------------------------- +// +TCbsUiLanguageSelectionIndex CCbsUiSettingsViewContainer::GetSelected() + { + TCbsDbLanguages dbLanguages; + iServer.GetLanguages(dbLanguages); + + TCbsUiLanguageSelectionIndex result(ECbsUiSelected); + + if ( dbLanguages.iLanguages[ECbsAll] ) + { + result = ECbsUiAll; + } + else if ( dbLanguages.iLanguages[ECbsOther] ) + { + result = ECbsUiOther; + } + else + { + result = ECbsUiSelected; + } + + return result; + } + +// --------------------------------------------------------- +// CCbsUiSettingsViewContainer::LaunchLanguageSettingPageL +// +// +// --------------------------------------------------------- +// +void CCbsUiSettingsViewContainer::LaunchLanguageSettingPageL( + CDesCArrayFlat& aItems, TInt& aCurrentSelectionIndex ) + { + __ASSERT_DEBUG( + aCurrentSelectionIndex >= ECbsUiAll && + aCurrentSelectionIndex <= ECbsUiOther, + CbsUiPanic(EErrIndexOutOfBounds) ); + __ASSERT_DEBUG( aItems.Count() == 3, CbsUiPanic(EErrInvalidValue) ); + + CCbsUiLanguageSettingPage* languagePage = + new (ELeave) CCbsUiLanguageSettingPage( + R_LANGUAGE_SETTING_PAGE, aCurrentSelectionIndex, + &aItems, iServer); + + languagePage->ExecuteLD(CAknSettingPage::EUpdateWhenChanged); + } + +// --------------------------------------------------------- +// CCbsUiSettingsViewContainer::AddItemsToListL +// +// +// --------------------------------------------------------- +// +void CCbsUiSettingsViewContainer::AddItemsToListL( + TInt aResourceId, + CDesCArrayFlat& aItemList ) const + { + __ASSERT_DEBUG(aResourceId >= 0, CbsUiPanic(EErrInvalidValue) ); + __ASSERT_DEBUG( aItemList.MdcaCount() == 0, CbsUiPanic(EErrInvalidValue) ); + + TResourceReader reader; + iCoeEnv->CreateResourceReaderLC(reader, aResourceId); + TInt count( reader.ReadInt16() ); + + for ( TInt i(0); i < count; i++ ) + { + HBufC* selectableItem = reader.ReadHBufCL(); + + CleanupStack::PushL(selectableItem); + aItemList.AppendL(*selectableItem); + CleanupStack::PopAndDestroy(); // selectableItem + } + + CleanupStack::PopAndDestroy(); // reader + } + + +// --------------------------------------------------------- +// CCbsUiSettingsViewContainer::HandleListViewActionL +// +// +// --------------------------------------------------------- +// +TKeyResponse CCbsUiSettingsViewContainer::HandleListViewActionL( + const CEikListBox* aListBox, TBool aLaunchedFromOptionMenu ) + { + __ASSERT_DEBUG( aListBox, CbsUiPanic(EErrNullPointer) ); + + switch ( aListBox->CurrentItemIndex() ) + { + case EReception: + { + if ( IsPhoneOfflineL() ) + { + // If is in offline mode, don't set reception on or off(Only error note) + HBufC* text = iCoeEnv->AllocReadResourceLC( R_QTN_OFFLINE_NOT_POSSIBLE ); + CAknErrorNote* note = new (ELeave) CAknErrorNote( ETrue ); + note->ExecuteLD( *text ); + CleanupStack::PopAndDestroy( ); //text + } + else + { + TBool reception; + TBool update(ETrue); // if value need to be updated + iServer.GetReceptionStatus(reception); + if ( aLaunchedFromOptionMenu ) + { + LaunchDialogOnOffL(reception, update, R_TEXT_RECEPTION); + } + if ( update ) + { + if ( !reception ) + { + // Reception is off. -> Set reception On + User::LeaveIfError( iServer.SetReceptionStatus( ETrue ) ); + } + else + { + // Reception is On. -> Set reception Off + User::LeaveIfError( iServer.SetReceptionStatus( EFalse ) ); + } + } + } + break; + } + case ELanguage: + { + PrepareLanguageSettingPageL(); + break; + } + case ETopicDetection: + { + TBool detection; + TBool update(ETrue); + + iServer.GetTopicDetectionStatus(detection); + + if ( aLaunchedFromOptionMenu ) + { + LaunchTopicDetectionDialogOnOffL(detection, update, R_TEXT_TOPIC_DETECTION); + } + + if ( update ) + { + User::LeaveIfError( iServer.SetTopicDetectionStatus(!detection) ); + } + break; + } + default: + break; + } + + GetSettingsL(); + + return EKeyWasConsumed; + } + +// --------------------------------------------------------- +// CCbsUiSettingsViewContainer::LaunchDialogOnOffL +// +// +// --------------------------------------------------------- +// +void CCbsUiSettingsViewContainer::LaunchDialogOnOffL( + const TBool& aValue, TBool& aUpdate, TInt aResourceId ) const + { + TInt selected( aValue ? ESettingOn : ESettingOff ); + + CDesCArrayFlat* items = + new (ELeave) CDesCArrayFlat(KNumberOfOnOfItems); + CleanupStack::PushL(items); + + AddItemsToListL(R_CBS_ON_OFF_ARRAY, *items); + + HBufC* settingText = iCoeEnv->AllocReadResourceL(aResourceId); + CleanupStack::PushL(settingText); + + CAknRadioButtonSettingPage* dlg = + new (ELeave) CAknRadioButtonSettingPage( + R_ON_OFF_SETTING_PAGE, selected, items); + + CleanupStack::PushL(dlg); + dlg->SetSettingTextL(*settingText); + CleanupStack::Pop(); // dlg + + dlg->ExecuteLD(CAknSettingPage::EUpdateWhenChanged); + + CleanupStack::PopAndDestroy(); // settingText + + TBool valueNotChanged( + selected == (aValue ? ESettingOn : ESettingOff) ); + if ( valueNotChanged ) + { + aUpdate = EFalse; + } + + CleanupStack::PopAndDestroy(); // items + } + + +// --------------------------------------------------------- +// CCbsUiSettingsViewContainer::LaunchTopicDetectionDialogOnOffL +// +// +// --------------------------------------------------------- +// +void CCbsUiSettingsViewContainer::LaunchTopicDetectionDialogOnOffL( + const TBool& aValue, TBool& aUpdate, TInt aResourceId ) const + { + TInt selected( aValue ? ESettingOn : ESettingOff ); + + CDesCArrayFlat* items = + new (ELeave) CDesCArrayFlat(KNumberOfOnOfItems); + CleanupStack::PushL(items); + + AddItemsToListL(R_CBS_TOPIC_DETECTION_ON_OFF_ARRAY, *items); + + HBufC* settingText = iCoeEnv->AllocReadResourceL(aResourceId); + CleanupStack::PushL(settingText); + + CAknRadioButtonSettingPage* dlg = + new (ELeave) CAknRadioButtonSettingPage( + R_ON_OFF_SETTING_PAGE, selected, items); + + CleanupStack::PushL(dlg); + dlg->SetSettingTextL(*settingText); + CleanupStack::Pop(); // dlg + + dlg->ExecuteLD(CAknSettingPage::EUpdateWhenChanged); + + CleanupStack::PopAndDestroy(); // settingText + + TBool valueNotChanged( + selected == (aValue ? ESettingOn : ESettingOff) ); + if ( valueNotChanged ) + { + aUpdate = EFalse; + } + + CleanupStack::PopAndDestroy(); // items + } + +// --------------------------------------------------------- +// CCbsUiSettingsViewContainer::HandleListViewActiontL +// +// +// --------------------------------------------------------- +// +TKeyResponse CCbsUiSettingsViewContainer::HandleListViewActionL( + TBool aLaunchedFromOptionMenu ) + { + if ( iListBox ) + { + return HandleListViewActionL(iListBox, aLaunchedFromOptionMenu); + } + return EKeyWasNotConsumed; + } + +// --------------------------------------------------------- +// CCbsUiSettingsViewContainer::UpdateSettingsL +// +// +// --------------------------------------------------------- +// +void CCbsUiSettingsViewContainer::UpdateSettingsL() + { + GetSettingsL(); + } + +// --------------------------------------------------------- +// CCbsUiSettingsViewContainer::SetFocusToFirstItem +// +// +// --------------------------------------------------------- +// +void CCbsUiSettingsViewContainer::SetFocusToFirstItem() const + { + __ASSERT_DEBUG( iListBox, CbsUiPanic(EErrNullPointer) ); + iListBox->SetCurrentItemIndexAndDraw(0); + } + +// --------------------------------------------------------- +// CCbsUiSettingsViewContainer::HandleListBoxEventL +// +// +// --------------------------------------------------------- +// +void CCbsUiSettingsViewContainer::HandleListBoxEventL( + CEikListBox* aListBox, + TListBoxEvent aEventType ) + { + if ( EEventEnterKeyPressed == aEventType + || EEventItemSingleClicked == aEventType ) + { + HandleListViewActionL(aListBox, EFalse); + } + } + + +// --------------------------------------------------------- +// CCbsUiSettingsViewContainer::SetLanguageSelectionL +// +// +// --------------------------------------------------------- +// +void CCbsUiSettingsViewContainer::SetLanguageSelectionL( + CDesCArray& aItemArray ) + { + TInt count( aItemArray.MdcaCount() ); + + __ASSERT_ALWAYS( count == KPreciseNumberOfItemsBeforeLanguage, + CbsUiPanic(EErrIndexOutOfBounds) ); + + if ( count == KPreciseNumberOfItemsBeforeLanguage ) + { + TInt textId(R_TEXT_LANGUAGE_ALL); + + switch ( GetSelected() ) + { + case ECbsUiAll: + // do nothing + break; + case ECbsUiSelected: + textId = R_TEXT_LANGUAGE_SELECTED; + break; + case ECbsUiOther: + textId = R_TEXT_LANGUAGE_OTHER; + break; + default: + break; + } + + HBufC* language = iCoeEnv->AllocReadResourceLC(textId); + aItemArray.AppendL(*language); + + CleanupStack::PopAndDestroy(); // language + } + } + + +// --------------------------------------------------------- +// CCbsUiSettingsViewContainer::GetHelpContext +// +// Gets the control's help context. +// --------------------------------------------------------- +// +void CCbsUiSettingsViewContainer::GetHelpContext( + TCoeHelpContext& aContext ) const + { + aContext.iMajor = TUid::Uid(0x100058C5); // Messaging MCE UID + aContext.iContext = KMCE_HLP_SETTINGS_CB; + } + + +// ---------------------------------------------------- +// CCbsUiSettingsViewContainer::HandleResourceChange +// +// ---------------------------------------------------- +void CCbsUiSettingsViewContainer::HandleResourceChange( TInt aType ) + { + CCoeControl::HandleResourceChange( aType ); + + if( aType == KEikDynamicLayoutVariantSwitch ) + { + iView.HandleRectChangeInContainer(); + } + } + + +// --------------------------------------------------------- +// CCbsUiSettingsViewContainer::IsPhoneOfflineL +// +// Checks if phone is in offline mode or not. +// Return ETrue if phone is in offline mode. +// Return EFalse if phone is not in offline mode. +// --------------------------------------------------------- +// +TBool CCbsUiSettingsViewContainer::IsPhoneOfflineL() const + { + if ( iOfflineFeatureSupported ) + { + CRepository* repository = CRepository::NewLC( KCRUidCoreApplicationUIs ); + TInt connAllowed = 1; + repository->Get( KCoreAppUIsNetworkConnectionAllowed, connAllowed ); + CleanupStack::PopAndDestroy(); // repository + if ( !connAllowed ) + { + return ETrue; + } + } + return EFalse; + } + + +// End of File