--- /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 <e32property.h>
+#include <aknnotedialog.h>
+#include <avkon.rsg>
+#include <StringLoader.h>
+
+// User includes
+#include <hscontentpublisher.h>
+#include <hspublisherinfo.h>
+#include <activeidle2domainpskeys.h>
+#include <AiNativeUi.rsg>
+#include "aidialogrenderer.h"
+#include "ainativeuiplugins.h"
+#ifdef __COVER_DISPLAY
+#include "aisecondarydisplayapi.h"
+#endif
+
+
+// AVKON headers
+#include <aknnotewrappers.h> // for Note Wrappers
+#include <aknPopup.h> // for Popup menus
+#include <AknWaitDialog.h> // for CAknWaitDialog
+#include <StringLoader.h> // for StringLoader
+#include <eiktxlbm.h> // for CTextListBoxModel
+#include <aknlists.h> // for AknPopupListEmpty
+#include <bautils.h> // for BaflUtils
+
+// Phonesettings headers
+#include <PsetContainer.h> // for CPsetContainer
+#include <PsetNetwork.h> // for CPsetNetwork
+#include <PsetSAObserver.h> // for CPsetSAObserver
+#include <gsmerror.h> // for GSM-specific error messages
+
+#include <GsNetworkPluginRsc.rsg> // for resource IDs
+#include <CoreApplicationUIsSDKCRKeys.h> // for KCRUidCoreApplicationUIs, TCoreAppUIsNetworkConnectionAllowed
+#include <featmgr.h>
+
+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<CEikFormattedCellListBox>* 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<CEikDialog**> ( &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