--- a/idlehomescreen/nativeuicontroller/src/aidialogrenderer.cpp Fri Feb 19 22:42:37 2010 +0200
+++ b/idlehomescreen/nativeuicontroller/src/aidialogrenderer.cpp Fri Mar 12 15:41:49 2010 +0200
@@ -1,5 +1,5 @@
/*
-* Copyright (c) 2005-2007 Nokia Corporation and/or its subsidiary(-ies).
+* 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"
@@ -32,6 +32,54 @@
#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 ========
@@ -44,6 +92,7 @@
{
CAiDialogRenderer* self = new( ELeave ) CAiDialogRenderer;
CleanupStack::PushL( self );
+ self->ConstructL();
return self;
}
@@ -54,6 +103,45 @@
//
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;
}
@@ -66,14 +154,36 @@
CAiDialogRenderer::CAiDialogRenderer()
{
}
-
-// ----------------------------------------------------------------------------
-// CAiDialogRenderer::DoPublishL()
-//
-// ----------------------------------------------------------------------------
-//
-void CAiDialogRenderer::DoPublishL( CHsContentPublisher& aPlugin,
- TInt aContent, TInt aResource, TInt /*aIndex*/ )
+
+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() );
@@ -108,21 +218,42 @@
}
if ( idleState == EPSAiForeground )
{
- ShowDialogL();
+ 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 );
+ User::Leave( KErrNotFound );
}
}
@@ -193,4 +324,419 @@
}
}
+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