diff -r 5f0182e07bfb -r 5456b4e8b3a8 idlehomescreen/nativeuicontroller/src/aidialogrenderer.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/idlehomescreen/nativeuicontroller/src/aidialogrenderer.cpp Wed Sep 01 12:32:46 2010 +0100 @@ -0,0 +1,742 @@ +/* +* 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: Dialog renderer. +* +*/ + +// System includes +#include +#include +#include +#include + +// User includes +#include +#include +#include +#include +#include "aidialogrenderer.h" +#include "ainativeuiplugins.h" +#ifdef __COVER_DISPLAY +#include "aisecondarydisplayapi.h" +#endif + + +// AVKON headers +#include // for Note Wrappers +#include // for Popup menus +#include // for CAknWaitDialog +#include // for StringLoader +#include // for CTextListBoxModel +#include // for AknPopupListEmpty +#include // for BaflUtils + +// Phonesettings headers +#include // for CPsetContainer +#include // for CPsetNetwork +#include // for CPsetSAObserver +#include // for GSM-specific error messages + +#include // for resource IDs +#include // for KCRUidCoreApplicationUIs, TCoreAppUIsNetworkConnectionAllowed +#include + +const TInt KAIAlphaTagIconAdditionalChars = 5; +// Length of long network name. +const TInt KAIAlphaTagLongNameLength = 20; +// Length of short network name. +const TInt KAIAlphaTagShortNameLength = 10; + +// array granularity +const TInt KAINetworkInfoArrayGranularity = 10; + +// Error note type ID - for Net view internal usage only +const TInt KAIPPErrorNote = 5001; +// Confirmation note type ID - for Net view internal usage only +const TInt KAIPPConfirmationNote = 5002; +//Information note type ID - for Net view internal usage only +const TInt KAIPPInformationNote = 5003; + +const TInt KAIPLMNListPopupMenuItems = 3; + +// Some resources defined for GSNetworkPlugin are used +_LIT(KGSNetworkPluginResource, "z:\\resource\\GsNetworkPluginRsc.rsc"); + +enum TGSSoftKeys + { + EGSSoftkeyQuit = 1, + EGSSoftkeyEmpty + }; + + +using namespace AiNativeUiController; + +// ======== MEMBER FUNCTIONS ======== +// ---------------------------------------------------------------------------- +// CAiDialogRenderer::NewLC() +// +// ---------------------------------------------------------------------------- +// +CAiDialogRenderer* CAiDialogRenderer::NewLC() + { + CAiDialogRenderer* self = new( ELeave ) CAiDialogRenderer; + CleanupStack::PushL( self ); + self->ConstructL(); + return self; + } + +// ---------------------------------------------------------------------------- +// CAiDialogRenderer::~CAiDialogRenderer() +// +// ---------------------------------------------------------------------------- +// +CAiDialogRenderer::~CAiDialogRenderer() + { + if ( FeatureManager::FeatureSupported( KFeatureIdFfManualSelectionPopulatedPlmnList ) ) + { + if( iRscIndex ) + { + CEikonEnv::Static()->DeleteResourceFile( iRscIndex ); + } + if ( iNetwork ) + { + if ( iSearchForNetworksActive ) + { + // Reset back to previously used network + iNetwork->ResetNetworkSearch(); + } + delete iNetwork; + } + + if ( iNetworkArray ) + { + iNetworkArray->Reset(); + } + delete iNetworkArray; + + if ( iDlg ) + { + delete iDlg; + } + if ( iNetworkPopupList ) + { + iNetworkPopupList->CancelPopup(); + } + + if ( iSettingsContainer ) + { + delete iSettingsContainer; + } + } + + FeatureManager::UnInitializeLib(); + + delete iDialog; + delete iText; + } + +// ---------------------------------------------------------------------------- +// CAiDialogRenderer::CAiDialogRenderer() +// +// ---------------------------------------------------------------------------- +// +CAiDialogRenderer::CAiDialogRenderer() + { + } + +void CAiDialogRenderer::ConstructL() + { + FeatureManager::InitializeLibL(); + + if ( FeatureManager::FeatureSupported( KFeatureIdFfManualSelectionPopulatedPlmnList ) ) + { + iSettingsContainer = CPsetContainer::NewL(); + iNetwork = iSettingsContainer->CreateNetworkObjectL( *this ); + + iApprovedNetwork = EFalse; + CheckAndCreateDlgL( EFalse ); + iSearchForNetworksActive = EFalse; + iPLMNListPopulateShowIsHandling = EFalse; + + // Open the resource file. Assume that the resource is stored on the same + // drive the DLL is installed on. + TFileName file; + Dll::FileName( file ); + TParse parse; + parse.Set( KGSNetworkPluginResource, &file, NULL ); + file = parse.FullName(); + CEikonEnv* eikonEnv = CEikonEnv::Static(); + BaflUtils::NearestLanguageFile( eikonEnv->FsSession(), file ); + iRscIndex = eikonEnv->AddResourceFileL( file ); + } + } + +void CAiDialogRenderer::DoPublishL( CHsContentPublisher& aPlugin, + TInt aContent, TInt aResource, TInt /*aIndex*/ ) + { + const THsPublisherInfo& info( aPlugin.PublisherInfo() ); + + if( info.Uid() == KDeviceStatusPluginUid ) + { + switch( aContent ) + { + case EAiDeviceStatusContentSIMRegStatus: + { + TInt idleState; + if ( RProperty::Get( + KPSUidAiInformation, + KActiveIdleState, + idleState ) != KErrNone ) + { + idleState = EPSAiBackground; + } + if( aResource == EAiDeviceStatusResourceSIMRegFail ) + { + if( iShowDialog ) + { + break; + } + HBufC* temp = StringLoader::LoadL( + R_ACTIVEIDLE_SIM_REGISTRATION_FAILED ); + delete iText; + iText = temp; +#ifdef __COVER_DISPLAY + iDialogId = EAiSimRegistrationFailed; +#endif + iShowDialog = ETrue; + } + if ( idleState == EPSAiForeground ) + { + ShowDialogL(); + } + break; + } + + case EAiDeviceStatusContentNetRegStatus: + { + MPsetNetworkSelect::TSelectMode mode = + MPsetNetworkSelect::ENetSelectModeAutomatic; + + if ( iNetwork ) + { + iNetwork->GetNetworkSelectMode( mode ); + } + + if ( mode == MPsetNetworkSelect::ENetSelectModeManual ) + { + if ( aResource == EAiDeviceStatusResourceNetRegFail ) + { + PopulatePLMNListL(); + } + } + break; + } + + + default: + { + User::Leave( KErrNotFound ); + break; + } + }; + } + else + { + User::Leave( KErrNotFound ); + } + } + +// ---------------------------------------------------------------------------- +// CAiDialogRenderer::DoCleanL() +// +// ---------------------------------------------------------------------------- +// +void CAiDialogRenderer::DoCleanL( CHsContentPublisher& /*aPlugin*/, + TInt aContent ) + { + switch( aContent ) + { + case EAiDeviceStatusContentSIMRegStatus: + { + delete iDialog; + iDialog = NULL; + iShowDialog = EFalse; + break; + } + default: + { + User::Leave( KErrNotFound ); + break; + } + } + } + +// ---------------------------------------------------------------------------- +// CAiDialogRenderer::ShowDialogL() +// +// ---------------------------------------------------------------------------- +// +void CAiDialogRenderer::ShowDialogL() + { + if ( iDialog ) + { + return; + } + + iDialog = + new (ELeave) CAknNoteDialog( + reinterpret_cast< CEikDialog** >( &iDialog ), + CAknNoteDialog::EConfirmationTone, + CAknNoteDialog::ENoTimeout ); + +#ifdef __COVER_DISPLAY + iDialog->PublishDialogL( iDialogId, KAICategory ); +#endif + + iDialog->PrepareLC( R_AKN_INFORMATION_NOTE_DIALOG ); + + iDialog->ButtonGroupContainer().SetCommandSetL( R_AVKON_SOFTKEYS_OK_EMPTY ); + iDialog->SetTextL( *iText ); + iDialog->RunLD(); + } + +// ---------------------------------------------------------------------------- +// CAiDialogRenderer::FocusObtainedL() +// +// ---------------------------------------------------------------------------- +// +void CAiDialogRenderer::FocusObtainedL() + { + if( iShowDialog ) + { + ShowDialogL(); + } + } + +void CAiDialogRenderer::PopulatePLMNListL() + { + // Ignore any subsequent EAiDeviceStatusResourcePLMNListPopulateShow content while one is handling + if ( iPLMNListPopulateShowIsHandling ) + { + return; + } + + iPLMNListPopulateShowIsHandling = ETrue; + iSearchForNetworksActive = ETrue; + iNetwork->GetAvailableNetworksL(); + } + +// --------------------------------------------------------------------------- +// +// While request to find networks is processed +// +// --------------------------------------------------------------------------- +void CAiDialogRenderer::HandleSearchingNetworksL( + MPsetNetworkInfoObserver::TServiceRequest aRequest ) + { + // Create a network info array if doesn't exist + if ( !iNetworkArray ) + { + iNetworkArray = new ( ELeave ) + CNetworkInfoArray( KAINetworkInfoArrayGranularity ); + } + + if ( aRequest != MPsetNetworkInfoObserver::EServiceRequestNone ) + { + CheckAndCreateDlgL( EFalse ); + iSearchForNetworksActive = ETrue; + TInt res = iDlg->ExecuteLD( R_SEARCHING_NOTE ); + if ( res == EGSSoftkeyQuit ) + { + iNetwork->CancelProcess(); + iPLMNListPopulateShowIsHandling = EFalse; + } + } + else // If EServiceRequestNone received, hide the "Searching..." note + { + delete iDlg; + iDlg = NULL; + } + } + +// --------------------------------------------------------------------------- +// +// Handles network info +// +// --------------------------------------------------------------------------- +void CAiDialogRenderer::HandleNetworkInfoReceivedL( + const CNetworkInfoArray* aInfoArray, const TInt /* aResult */ ) + { + const TInt itemsCount = aInfoArray->Count(); + + // First delete old ones + iNetworkArray->Delete( 0, iNetworkArray->Count() ); + + // Then insert found networks + for ( TInt i = 0; i < itemsCount; i++ ) + { + MPsetNetworkSelect::TNetworkInfo info = aInfoArray->At( i ); + iNetworkArray->InsertL( i, info ); + } + + NetworkListL(); // After search complete, show results + } + +// --------------------------------------------------------------------------- +// +// While request to change network is processed, a note is shown +// +// --------------------------------------------------------------------------- +void CAiDialogRenderer::HandleRequestingSelectedNetworkL( TBool aOngoing ) + { + if ( aOngoing ) + { + CheckAndCreateDlgL( ETrue ); + + if ( iDlg->ExecuteLD( R_REQUESTING_NOTE ) == EGSSoftkeyQuit ) + { + iNetwork->CancelProcess(); + + CAknNoteDialog* dlg = new ( ELeave ) CAknNoteDialog( + CAknNoteDialog::EConfirmationTone, + CAknNoteDialog::EShortTimeout ); + dlg->ExecuteLD( R_REGISTRATION_INTERRUPTED ); + iApprovedNetwork = EFalse; + iPLMNListPopulateShowIsHandling = EFalse; + } + } + else + { + delete iDlg; + iDlg = NULL; + } + } + +// --------------------------------------------------------------------------- +// +// Handle network change +// +// --------------------------------------------------------------------------- +void CAiDialogRenderer::HandleNetworkChangedL( + const MPsetNetworkSelect::TNetworkInfo& aCurrentInfo, + const RMobilePhone::TMobilePhoneRegistrationStatus& aStatus, + const TInt aResult ) + { + switch ( aStatus ) + { + case RMobilePhone::ERegisteredOnHomeNetwork: + { + ShowNoteL( R_HOME_NETWORK_SELECTED, KAIPPConfirmationNote ); + PurgeNetworkList(); + break; + } + case RMobilePhone::ERegisteredRoaming: + { + HBufC* stringholder = NULL; + if ( aCurrentInfo.iLongName.Length() > 0 && + aCurrentInfo.iLongName.Length() <= + MPsetNetworkSelect::ENetLongNameSize ) + { + stringholder = StringLoader::LoadLC( R_NETSL_NETWORKSELECTED, + aCurrentInfo.iLongName ); + } + else if (aCurrentInfo.iShortName.Length() > 0 && + aCurrentInfo.iShortName.Length() <= + MPsetNetworkSelect::ENetShortNameSize ) + { + stringholder = StringLoader::LoadLC( R_NETSL_NETWORKSELECTED, + aCurrentInfo.iShortName ); + } + + CAknConfirmationNote* note = new ( ELeave ) CAknConfirmationNote( ETrue ); + if ( stringholder ) + { + note->ExecuteLD( *stringholder ); + CleanupStack::PopAndDestroy( stringholder ); + } + + //After list has been used, clear it. + PurgeNetworkList(); + break; + } + case RMobilePhone::ERegistrationUnknown: + case RMobilePhone::ENotRegisteredNoService: + case RMobilePhone::ENotRegisteredEmergencyOnly: + case RMobilePhone::ENotRegisteredSearching: + case RMobilePhone::ERegisteredBusy: + case RMobilePhone::ERegistrationDenied: + default: + break; + } + + iPLMNListPopulateShowIsHandling = EFalse; + iSearchForNetworksActive = EFalse; + } + +// --------------------------------------------------------------------------- +// +// Handles errors. +// +// --------------------------------------------------------------------------- +void CAiDialogRenderer::HandleNetworkErrorL( + const MPsetNetworkInfoObserver::TServiceRequest aRequest, + const TInt aError ) + { + TInt resourceTxt = KErrNone; + + switch ( aRequest ) + { + case MPsetNetworkInfoObserver::EServiceRequestGetNetworkInfo: + { + iNetwork->CancelProcess(); + iApprovedNetwork = EFalse; + break; + } + case MPsetNetworkInfoObserver::EServiceRequestSetNetwork: + { + } + default: + { + break; + } + } + + TBool ignore = EFalse; + + switch ( aError ) + { + case KErrGsmNetCauseCallActive: + { + ignore = ETrue; // Do not show an error + break; + } + case KErrGsm0707NoNetworkService: + { + resourceTxt = R_NO_NETWORK_FOUND; + break; + } + case KErrGsmOfflineOpNotAllowed: + { + resourceTxt = R_OFFLINE_MODE; + break; + } + default: + { + resourceTxt = R_NO_NETWORK_ACCESS; + break; + } + } + + if ( !ignore ) + { + ShowNoteL( resourceTxt, KAIPPErrorNote ); + iApprovedNetwork = EFalse; + } + } + +// --------------------------------------------------------------------------- +// +// Creates list of Network providers +// +// --------------------------------------------------------------------------- +void CAiDialogRenderer::NetworkListL() + { + //if no net items were found, do not show list + if ( iNetworkArray->Count() > 0 ) + { + while ( !iApprovedNetwork ) + { + AknPopupListEmpty* list; + list = new ( ELeave ) CAknSinglePopupMenuStyleListBox; + CleanupStack::PushL( list ); + + if ( iNetworkPopupList ) + { + iNetworkPopupList->CancelPopup(); + iNetworkPopupList = NULL; + } // + + iNetworkPopupList = + CAknPopupList::NewL( list, R_AVKON_SOFTKEYS_OK_CANCEL ); + + list->ConstructL( iNetworkPopupList, + CEikListBox::ELeftDownInViewRect ); + list->CreateScrollBarFrameL( ETrue ); + list->ScrollBarFrame()->SetScrollBarVisibilityL( + CEikScrollBarFrame::EOff, CEikScrollBarFrame::EAuto ); + + // Fill in the list texts + CDesCArrayFlat* items = + new ( ELeave ) CDesCArrayFlat( KAIPLMNListPopupMenuItems ); + CleanupStack::PushL( items ); + + const TInt itemsCount = iNetworkArray->Count(); + + for ( TInt loop = 0; loop < itemsCount; loop++ ) + { + HBufC* insertString = + HBufC::NewLC( + KAIAlphaTagLongNameLength + KAIAlphaTagIconAdditionalChars ); + MPsetNetworkSelect::TNetworkInfo info = + iNetworkArray->At( loop ); + + if ( info.iLongName.Length() <= 0 || + info.iLongName.Length() > KAIAlphaTagLongNameLength ) + { + // Short name received + if ( info.iShortName.Length() > 0 && + info.iShortName.Length() <= KAIAlphaTagShortNameLength ) + { + insertString->Des().Append( info.iShortName ); + } // + } // + // Long name received + else + { + insertString->Des().Append( info.iLongName ); + } // + + items->AppendL( *insertString ); + CleanupStack::PopAndDestroy(); + } + + CTextListBoxModel* model = list->Model(); + model->SetItemTextArray( items ); + model->SetOwnershipType( ELbmOwnsItemArray ); + CleanupStack::Pop( items ); // Listbox model now owns this + + // Set title for list + SetTitleToPopupL( *iNetworkPopupList, R_NETSL_FOUNDOPERATORS ); + + TInt res = 0; + // Show the PLMN list + if ( items->Count() ) + { + res = iNetworkPopupList->ExecuteLD(); + } // + + iNetworkPopupList = NULL; + iApprovedNetwork = ETrue; // User might want to quit + TInt selection = list->CurrentItemIndex(); + + CleanupStack::PopAndDestroy( list ); + + if ( res ) + { + MPsetNetworkSelect::TNetworkInfo info = + iNetworkArray->At( selection ); + info.iMode = MPsetNetworkSelect::ENetSelectModeManual; + iNetwork->SelectNetworkL( info ); + } // + else // User selected "Cancel" + { + // Reset back to previously used network + iNetwork->ResetNetworkSearch(); + iSearchForNetworksActive = EFalse; + // After list has been used, clear it + PurgeNetworkList(); + iPLMNListPopulateShowIsHandling = EFalse; + } // + } + } + + iApprovedNetwork = EFalse; // Initialize before new search + } + +// --------------------------------------------------------------------------- +// +// Creates dialog, if it is does not exist yet. +// +// --------------------------------------------------------------------------- +// +void CAiDialogRenderer::CheckAndCreateDlgL( TBool aDelayOff ) + { + if ( !iDlg ) + { + iDlg = new ( ELeave ) CAknWaitDialog( + reinterpret_cast ( &iDlg ), aDelayOff ); + } + } + +// --------------------------------------------------------------------------- +// +// Sets a title to a given popup list. +// +// --------------------------------------------------------------------------- +void CAiDialogRenderer::SetTitleToPopupL( CAknPopupList& aList, TInt aTitleID ) + { + HBufC* text = StringLoader::LoadLC( aTitleID ); + + aList.SetTitleL( *text ); + + CleanupStack::PopAndDestroy( text ); + text = NULL; + } + +// --------------------------------------------------------------------------- +// +// Shows note. +// +// --------------------------------------------------------------------------- +// +void CAiDialogRenderer::ShowNoteL( TInt aResourceId, TInt aType ) + { + HBufC* string = StringLoader::LoadLC( aResourceId ); + + switch ( aType ) + { + case KAIPPErrorNote: + { + CAknErrorNote* note = new ( ELeave ) CAknErrorNote ( ETrue ); + note->ExecuteLD( *string ); + break; + } + case KAIPPConfirmationNote: + { + CAknConfirmationNote* note = + new ( ELeave ) CAknConfirmationNote( ETrue ); + note->ExecuteLD( *string ); + break; + } + case KAIPPInformationNote: + { + CAknInformationNote* note = + new ( ELeave ) CAknInformationNote( ETrue ); + note->ExecuteLD( *string ); + break; + } + default: + break; + } + + CleanupStack::PopAndDestroy( string ); + } + +// --------------------------------------------------------------------------- +// +// Empties fetched network provider's list +// +// --------------------------------------------------------------------------- +// +void CAiDialogRenderer::PurgeNetworkList() + { + if ( iNetworkArray ) + { + iNetworkArray->Reset(); + delete iNetworkArray; + iNetworkArray = NULL; + } + } + +// End of file