idlehomescreen/nativeuicontroller/src/aidialogrenderer.cpp
branchRCL_3
changeset 11 ff572dfe6d86
parent 9 f966699dea19
child 12 9674c1a575e9
--- 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