hotspotfw/hsbrowser/src/hsbrowsercontainer.cpp
changeset 0 56b72877c1cb
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspotfw/hsbrowser/src/hsbrowsercontainer.cpp	Thu Dec 17 09:20:28 2009 +0200
@@ -0,0 +1,687 @@
+/*
+* Copyright (c) 2007 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 the container control for HotSpot Browser Application.
+*
+*/
+
+// INCLUDE FILES
+#include <eiklabel.h>
+#include <avkon.hrh>
+#include <hsbrowser.rsg>
+#include <brctlinterface.h>
+#include <charconv.h>
+#include <gdi.h>
+#include <bitdev.h>
+#include <eikenv.h> 
+#include <AknDef.h>
+#include <AknUtils.h>
+#include <apgtask.h>
+#include <es_enum.h>
+#include <coecobs.h>
+#include <coecntrl.h>
+#include <apgwgnam.h>
+#include <aknnavi.h> 
+#include <AknIndicatorContainer.h>
+#include <aknnavilabel.h> 
+#include <aknnavide.h>
+#include <aknappui.h>
+#include <aknnotewrappers.h> 
+#include <StringLoader.h>
+#include <bautils.h>
+#include <data_caging_path_literals.hrh>
+#include <AknGlobalNote.h>
+#include <hlplch.h>
+
+#include "hotspotclientserver.h"
+#include "hsbrowsercontainer.h"
+#include "hsbrowserloadeventobserver.h"
+#include "hsbrowserloadeventobserver.h"
+#include "hsbrowserspecialloadobserver.h"
+#include "hsbrowserictsobserver.h"
+#include "hsbrowserhssrvnotifs.h"
+#include "hsbrowsermodel.h"
+#include "hsbrowsercommon.h"
+#include "am_debug.h"
+
+// ================= MEMBER FUNCTIONS =======================
+
+// ---------------------------------------------------------
+// CHsBrowserContainer::CHsBrowserContainer()
+// Constructor.
+// ---------------------------------------------------------
+//
+CHsBrowserContainer::CHsBrowserContainer( CHsBrowserModel* aModel ) :
+    iModel( aModel ),
+    iNaviPane( NULL ),
+    iEditorIndicatorContainer( NULL),
+    iIndiContainer( NULL ),
+    iResource( 0 ),
+    iActiveInputBox( EFalse )
+	{
+	DEBUG( "CHsBrowserContainer::CHsBrowserContainer()" );
+	}
+
+
+// ---------------------------------------------------------
+// CHsBrowserContainer::ConstructL(const TRect& aRect)
+// EPOC two phased constructor
+// ---------------------------------------------------------
+//
+void CHsBrowserContainer::ConstructL( const TRect& aRect )
+    {
+    DEBUG( "CHsBrowserContainer::ConstructL()" );
+    CreateWindowL();
+        
+    // create observers
+    iHsBrowserSpecialLoadObserver = CHsBrowserSpecialLoadObserver::NewL();
+    iHsBrowserLoadEventObserver = CHsBrowserLoadEventObserver::NewL( this );
+    iHsBrowserIctsObserver = CHsBrowserIctsObserver::NewL( this );
+    iHsBrowserHsSrvNotifs = CHsBrowserHsSrvNotifs::NewL( this );
+    
+    iCommandBase = TBrCtlDefs::ECommandIdBase;
+    TUint brCtlCapabilities = TBrCtlDefs::ECapabilityLoadHttpFw |
+                              TBrCtlDefs::ECapabilityDisplayScrollBar |
+                              TBrCtlDefs::ECapabilityCursorNavigation;
+    iBrCtlInterface = CreateBrowserControlL(
+        this, 
+        aRect, 
+        brCtlCapabilities,
+        iCommandBase, 
+        NULL,  // softkey observer
+        NULL,  // link resolver
+        iHsBrowserSpecialLoadObserver,
+        NULL,  // layout observer
+        NULL,  // dialog provider
+        NULL,  // window observer
+        NULL );// download observer 
+      
+    // disable ESettingsSecurityWarnings setting,
+    // or implement MBrCtlDialogsProvider interface
+    // reason: default implementation of MBrCtlDialogsProvider::DialogConfirmL
+    // returns EFalse and page is not loaded.
+    iBrCtlInterface->SetBrowserSettingL(
+        TBrCtlDefs::ESettingsSecurityWarnings, EFalse );
+   
+    // auto load on
+    iBrCtlInterface->SetBrowserSettingL ( 
+            TBrCtlDefs::ESettingsAutoLoadImages, 
+            ETrue);
+
+    iBrCtlInterface->SetBrowserSettingL ( 
+            TBrCtlDefs::ESettingsCookiesEnabled, 
+            ETrue);
+    
+    iBrCtlInterface->SetBrowserSettingL ( 
+            TBrCtlDefs::ESettingsCSSFetchEnabled, 
+            ETrue);
+     
+     iBrCtlInterface->SetBrowserSettingL ( 
+            TBrCtlDefs::ESettingsECMAScriptEnabled, 
+            ETrue);
+
+    // this observer can be added and removed dynamically
+    iBrCtlInterface->AddLoadEventObserverL( iHsBrowserLoadEventObserver );     
+    
+    // init navi pane indicators
+    InitNaviPaneL();
+            
+    // load resource file
+    TFileName fileName;           
+    fileName.Append( KDriveZ );
+    fileName.Append( KDC_APP_RESOURCE_DIR );   
+    fileName.Append( KResourceFile );
+    BaflUtils::NearestLanguageFile( CCoeEnv::Static()->FsSession(),
+                                    fileName );
+    iResource = CCoeEnv::Static()->AddResourceFileL( fileName );
+    
+    HBufC* title = StringLoader::LoadL( R_QTN_NETW_CONSET_WBA_STATIC_TITLE );
+
+    iModel->SetStaticTitle( *title );
+    delete title;
+    
+    // activate WLAN MGMT API notifications,
+    // we need to know when network is lost
+    iMgtClient = CWlanMgmtClient::NewL();
+    iMgtClient->ActivateNotificationsL( *iHsBrowserHsSrvNotifs );
+    
+    SetRect( aRect ); // set the size
+    ActivateL(); // activate the window
+    SetFocus( ETrue );
+    }
+
+// ---------------------------------------------------------
+// CHsBrowserContainer::~CHsBrowserContainer()
+// Destructor.
+// ---------------------------------------------------------
+//
+CHsBrowserContainer::~CHsBrowserContainer()
+    {
+    DEBUG( "CHsBrowserContainer::~CHsBrowserContainer()" );
+    if ( iMgtClient )
+        {
+        iMgtClient->CancelNotifications();
+        delete iMgtClient;
+        }
+    
+    iBrCtlInterface->RemoveLoadEventObserver( iHsBrowserLoadEventObserver );
+    delete iBrCtlInterface;
+    
+    // delete observers
+    delete iHsBrowserSpecialLoadObserver;
+    delete iHsBrowserLoadEventObserver;
+    delete iHsBrowserIctsObserver;
+    
+    // cancels also notifications
+    delete iHsBrowserHsSrvNotifs;
+    
+    if ( iResource )
+        {
+        CCoeEnv::Static()->DeleteResourceFile( iResource );        
+        }
+    
+    delete iEditorIndicatorContainer;      
+    DEBUG( "CHsBrowserContainer::~CHsBrowserContainer() DONE" );
+    }
+
+
+// ---------------------------------------------------------
+// CHsBrowserContainer::InitNaviPaneL()
+// Initializes the indicators in the navi pane.
+// ---------------------------------------------------------
+//
+void CHsBrowserContainer::InitNaviPaneL()
+	{
+    DEBUG( "CHsBrowserContainer::InitNaviPaneL()" );
+    if ( !iEditorIndicatorContainer )
+        {
+        CEikStatusPane* statusPane = iAvkonAppUi->StatusPane();        
+        if ( statusPane )
+            {
+            iNaviPane = (CAknNavigationControlContainer*)
+                statusPane->ControlL( TUid::Uid( EEikStatusPaneUidNavi ) );
+            if ( iNaviPane )
+            	{
+            	iEditorIndicatorContainer =
+            	    iNaviPane->CreateEditorIndicatorContainerL();
+            	}
+            }
+        }
+
+   	if ( !iIndiContainer && iEditorIndicatorContainer )
+        {
+        iIndiContainer = (CAknIndicatorContainer*) iEditorIndicatorContainer->DecoratedControl();
+    	}
+    
+    if ( iNaviPane && iEditorIndicatorContainer )
+    	{
+    	iNaviPane->PushL( *iEditorIndicatorContainer );
+    	}
+        	
+	}
+
+// ---------------------------------------------------------
+// CHsBrowserContainer::SizeChanged()
+// Called by framework when the view size is changed
+// ---------------------------------------------------------
+//
+void CHsBrowserContainer::SizeChanged()
+    {
+    DEBUG( "CHsBrowserContainer::SizeChanged()" );
+    iBrCtlInterface->SetRect(Rect());
+    }
+
+// ---------------------------------------------------------
+// CHsBrowserContainer::CountComponentControls() const
+// ---------------------------------------------------------
+//
+TInt CHsBrowserContainer::CountComponentControls() const
+    {
+    return KComponentsNumber;
+    }
+
+// ---------------------------------------------------------
+// CHsBrowserContainer::ComponentControl(TInt aIndex) const
+// ---------------------------------------------------------
+//
+CCoeControl* CHsBrowserContainer::ComponentControl(TInt aIndex) const
+    {
+    switch ( aIndex )
+        {
+        case KBrCtlComponentIndex:
+            return iBrCtlInterface;
+        default:
+            return NULL;
+        }
+    }
+
+
+// ------------------------------------------------------------------
+// CHsBrowserContainer::UpdateNaviPane( TNaviPaneEvent aUpdateEvent )
+// ------------------------------------------------------------------
+//
+void CHsBrowserContainer::UpdateNaviPane( TNaviPaneEvent aUpdateEvent )
+	{
+	DEBUG( "CHsBrowserContainer::UpdateNaviPane()" );
+	
+    iIndiContainer->SetIndicatorState(
+        TUid::Uid( EAknNaviPaneEditorIndicatorMessageInfo ),
+        EAknIndicatorStateOn );
+                
+	switch( aUpdateEvent )
+        {
+        case ELoadingLoginPage:
+            {
+            TRAP_IGNORE( iIndiContainer->SetIndicatorValueL(
+                TUid::Uid( EAknNaviPaneEditorIndicatorMessageInfo ),
+                *iModel->StaticTitle() ) );
+            iIndiContainer->SetIndicatorState(
+                TUid::Uid( EAknNaviPaneEditorIndicatorWaitBar ),  
+                EAknIndicatorStateAnimate );
+            break;
+            }
+        case ELoadingUrl:
+            {
+            iIndiContainer->SetIndicatorState(
+                TUid::Uid( EAknNaviPaneEditorIndicatorWaitBar ),  
+                EAknIndicatorStateAnimate );
+            break;
+            }
+        case EPageTitleAvailable:
+            {
+            TRAP_IGNORE( iIndiContainer->SetIndicatorValueL(
+                TUid::Uid( EAknNaviPaneEditorIndicatorMessageInfo ),
+                *iModel->PageTitle() ) );
+            break;
+            }
+        case ELoadingFinished:
+            {
+            iIndiContainer->SetIndicatorState(
+                TUid::Uid( EAknNaviPaneEditorIndicatorWaitBar ),  
+                EAknIndicatorStateOff );
+            break;
+            }
+        }
+        
+        iIndiContainer->DrawNow();
+	}
+
+// ----------------------------------------------------
+// CHsBrowserContainer::HandleCommandL(TInt aCommand)
+// ----------------------------------------------------
+//
+void CHsBrowserContainer::HandleCommandL(TInt aCommand)
+    {
+    DEBUG1( "CHsBrowserContainer::HandleCommandL() aCommand=%d", aCommand );
+    switch ( aCommand )
+        {
+        case EAknSoftkeyNext:
+            ShowLoginCompleteNote();
+            SendToBackground();
+            break;
+        case EAknSoftkeyCancel:
+        case EAknSoftkeyBack:
+        case EAknSoftkeyExit:
+        case EEikCmdExit:
+            {
+            iBrCtlInterface->HandleCommandL( 
+                    TBrCtlDefs::ECommandCancelFetch + 
+                    TBrCtlDefs::ECommandIdBase );
+            iModel->SetState( EHsBrowserUiClosed, ETrue );
+            break;
+            }
+        case EAknCmdHelp:
+            {
+            HlpLauncher::LaunchHelpApplicationL( iEikonEnv->WsSession(),
+                    iEikonEnv->EikAppUi()->AppHelpContextL());
+            break;
+            }
+        default:
+            if ( aCommand >= iCommandBase &&
+                    aCommand < iCommandBase + TBrCtlDefs::ECommandIdRange )
+                {
+                iBrCtlInterface->HandleCommandL( aCommand );
+                }              
+            break;      
+        }    
+    }
+
+// ----------------------------------------------------
+// CHsBrowserContainer::HandleKeyEventL(
+//     const TKeyEvent& aKeyEvent,TEventCode /*aType*/)
+// ----------------------------------------------------
+//
+TKeyResponse CHsBrowserContainer::HandleKeyEventL(
+    const TKeyEvent& /*aKeyEvent*/,TEventCode /*aType*/)
+    {
+    return EKeyWasNotConsumed;
+    }
+
+// ----------------------------------------------------
+// CHsBrowserContainer::SendToForeground()
+// ----------------------------------------------------
+//
+void CHsBrowserContainer::SendToForeground()
+	{
+	DEBUG( "CHsBrowserContainer::SendToForeground()" );
+	    
+    // because "Connecting via..." note hides hsbrowser,
+    // send hsbrowser to foreground
+    CCoeEnv::Static()->RootWin().SetOrdinalPosition( 0,
+    		ECoeWinPriorityNormal );
+    CCoeEnv::Static()->WsSession().Flush();  
+	}
+
+// ----------------------------------------------------
+// CHsBrowserContainer::RestorePositionAndPriority()
+// ----------------------------------------------------
+//
+void CHsBrowserContainer::RestorePositionAndPriority()
+	{
+	DEBUG( "CHsBrowserContainer::RestorePositionAndPriority()" );
+
+    RWindowGroup& wg = CEikonEnv::Static()->RootWin();
+	
+    // because "Connecting via..." note hides hsbrowser,
+    // it was assigned ECoeWinPriorityAlwaysAtFront priority,
+    // restore original now
+    if ( wg.OrdinalPriority() == ECoeWinPriorityAlwaysAtFront )
+    	{	
+    	CCoeEnv::Static()->RootWin().SetOrdinalPosition(
+    	        iModel->Position(), iModel->Priority() ); 	    	
+	    }
+	}
+
+// ---------------------------------------------------------
+// CHsBrowserContainer::SendToBackground
+// ---------------------------------------------------------
+//
+void CHsBrowserContainer::SendToBackground()
+	{
+	DEBUG( "CHsBrowserContainer::SendToBackground()" );
+
+    RWindowGroup& wg = CEikonEnv::Static()->RootWin();
+    
+    // Construct en empty TApaTask object
+    // giving it a reference to the Window Server session    
+    TApaTask task( CEikonEnv::Static()->WsSession() );
+                
+    // Initialise the object with the window group id of
+    // our application (so that it represent our app)
+    task.SetWgId( wg.Identifier() );
+
+    // Request window server to bring our application
+    // to foreground
+    DEBUG("CHsBrowserContainer::SendToBackground() sending to background" );
+    task.SendToBackground();	  
+	}
+
+// ----------------------------------------------------
+// CHsBrowserContainer::ProcessForegroundEvent()
+// ----------------------------------------------------
+//
+void CHsBrowserContainer::ProcessForegroundEvent( TBool aForeground )
+	{
+	DEBUG1( "CHsBrowserContainer::ProcessForegroundEvent() aForeground = %d", aForeground );
+	iModel->SetForeground( aForeground );
+	UpdateSoftkeys();
+	}
+
+// ----------------------------------------------------
+// CHsBrowserContainer::OfferKeyEventL(const 
+//               TKeyEvent& aKeyEvent,TEventCode aType)
+// ----------------------------------------------------
+//
+TKeyResponse 
+CHsBrowserContainer::OfferKeyEventL(const TKeyEvent& aKeyEvent,TEventCode aType)
+    {
+    DEBUG( "CHsBrowserContainer::OfferKeyEventL()" );
+  
+    TUint state = iModel->State();
+    TBrCtlDefs::TBrCtlElementType elem = iBrCtlInterface->FocusedElementType();
+    DEBUG1( "CHsBrowserContainer::OfferKeyEventL() type: %d", elem);
+
+    if ( elem == TBrCtlDefs::EElementActivatedInputBox || elem == TBrCtlDefs::EElementInputBox )
+    {
+        if ( !iActiveInputBox && state != EHsBrowserUiAuthenticatedOk )
+        {
+            // change softkey
+            CEikButtonGroupContainer* cba = CEikonEnv::Static()->
+            AppUiFactory()->Cba();
+            if ( cba )
+            {
+                cba->SetCommandSetL( R_HSBROWSER_SOFTKEYS_CANCEL );
+                cba->DrawNow();
+            }
+        }
+        iActiveInputBox = EFalse;
+    }
+    else 
+    {
+        CEikButtonGroupContainer* cba = CEikonEnv::Static()->
+        AppUiFactory()->Cba();
+        if ( cba && state != EHsBrowserUiAuthenticatedOk )
+        {
+            cba->SetCommandSetL( R_AVKON_SOFTKEYS_CANCEL );
+            cba->DrawNow();
+        }
+    }
+    DEBUG( "CHsBrowserContainer::OfferKeyEventL() done to iBrCtl" );
+    return iBrCtlInterface->OfferKeyEventL(aKeyEvent, aType);
+    }
+
+// ----------------------------------------------------
+// CHsBrowserContainer::HandleResourceChange()
+// ----------------------------------------------------
+//
+void CHsBrowserContainer::HandleResourceChange( TInt aType )
+    {
+    DEBUG( "CHsBrowserContainer::HandleResourceChange" );
+    CCoeControl::HandleResourceChange( aType );
+ 
+    // Adjust Browser size to screen when screen layout is changed
+    // Vertical vs. horizontal
+    if ( aType == KEikDynamicLayoutVariantSwitch )
+        {
+        DEBUG( "CHsBrowserContainer::HandleResourceChange = KEikDynamicLayoutVariantSwitch" );
+        TRect mainPaneRect;
+        AknLayoutUtils::LayoutMetricsRect( AknLayoutUtils::EMainPane, 
+                                           mainPaneRect );
+        SetRect( mainPaneRect );
+        DrawDeferred();
+        }
+    }
+
+
+// ----------------------------------------------------
+// CHsBrowserContainer::UpdateSoftkeys()
+// ----------------------------------------------------
+//
+void CHsBrowserContainer::UpdateSoftkeys()
+	{
+	DEBUG( "CHsBrowserContainer::UpdateSoftkeys()" );
+	
+	TBool foreground = iModel->Foreground();
+	TUint state = iModel->State();
+
+	if ( !foreground && state == EHsBrowserUiAuthenticatedOk )
+	    {
+	    // R_HSBROWSER_SOFTKEYS_CONTINUE_EXIT
+	    CEikButtonGroupContainer* cba = CEikonEnv::Static()->AppUiFactory()->Cba();
+	    if ( cba )
+	        {
+	        TRAP_IGNORE( cba->SetCommandSetL( R_HSBROWSER_SOFTKEYS_CONTINUE_EXIT ) );
+	        cba->DrawNow();
+	        }
+	    }        
+	}
+
+// ----------------------------------------------------
+// CHsBrowserContainer::LoadRedirect
+// ----------------------------------------------------
+//
+TInt CHsBrowserContainer::LoadRedirect( const TPtrC& aUrl,
+    TInt aIapId, TInt aNetId )
+    {
+    DEBUG( "CHsBrowserContainer::LoadRedirect()" );
+    
+    TInt err = KErrNone;
+    
+    UpdateNaviPane( ELoadingLoginPage );
+    
+    // init model
+    iModel->SetIapId( aIapId );
+    iModel->SetNetId( aNetId );
+    iModel->SetUrl( aUrl ); 	
+    // attach
+    err = iModel->Attach();
+    if ( err != KErrNone )
+        {
+        DEBUG1( "CHsBrowserContainer::LoadRedirect() Attach() err=%d", err );	
+        }        
+    else    
+        {
+        TInt connPtr = REINTERPRET_CAST( TInt, &iModel->Connection() );
+        if ( iHsBrowserSpecialLoadObserver )
+            {
+            iHsBrowserSpecialLoadObserver->SetConnectionPtr( connPtr );
+            iHsBrowserSpecialLoadObserver->SetSockSvrHandle(
+                    iModel->SocketServ().Handle() );            	
+            }
+        }
+
+    if ( err == KErrNone )
+    	{
+    	TRAP( err, iBrCtlInterface->LoadUrlL( aUrl ) );
+    	DEBUG1( "CHsBrowserContainer::LoadRedirect() iBrCtlInterface->\
+            LoadUrlL() err=%d", err );
+    	}
+    return err;
+    }
+    
+// ---------------------------------------------------------
+// CHsBrowserContainer::ProcessWlanConnModeNotConnected
+// ---------------------------------------------------------
+//
+void CHsBrowserContainer::ProcessWlanConnModeNotConnected()
+	{
+	DEBUG( "CHsBrowserContainer::ProcessWlanConnModeNotConnected()" );
+	
+	// Workaround for "WLAN login application closed" error:
+	TRAP_IGNORE( iBrCtlInterface->HandleCommandL( 
+            TBrCtlDefs::ECommandCancelFetch + 
+            TBrCtlDefs::ECommandIdBase ));
+
+	ShowConnClosedNote();
+	iAvkonAppUi->Exit();
+	}
+    
+// ---------------------------------------------------------
+// CHsBrowserContainer::ShowLoginCompleteNote
+// ---------------------------------------------------------
+//
+void CHsBrowserContainer::ShowLoginCompleteNote()
+    {
+    TBool noteShown = iModel->LoginCompleteNoteShown();
+    DEBUG1( "CHsBrowserContainer::ShowLoginCompleteNote() noteShown=%d", noteShown );
+
+    TInt pos = CCoeEnv::Static()->RootWin().OrdinalPosition();
+    DEBUG1( "CHsBrowserContainer::ShowLoginCompleteNote() pos=%d", pos );
+
+    if ( !noteShown && pos == 0 )		
+        {
+        DEBUG( "CHsBrowserContainer::ShowLoginCompleteNote() showing note" );
+
+        HBufC* message = NULL;
+        TRAPD( err, message = StringLoader::LoadLC( R_QTN_NETW_CONSET_WBA_INFO_COMPLETE ); CleanupStack::Pop( message ) ); 
+        if (err == KErrNone)
+            {
+            // Global note needed here, because CAknInformationNote was sometimes causing chrashes
+            CAknGlobalNote* note = NULL;
+            TRAP( err, note = CAknGlobalNote::NewLC(); CleanupStack::Pop( note ) );
+            if (err == KErrNone)
+                {            
+                TRAP( err, note->ShowNoteL( EAknGlobalInformationNote, *message ) );
+                if (err == KErrNone)
+                    {
+                    DEBUG( "CHsBrowserContainer::ShowLoginCompleteNote(): Showing note DONE" );
+                    }
+                delete note;
+                }
+            delete message;
+            }
+        iModel->SetLoginCompleteNoteShown( ETrue );
+        }
+    }
+
+// ----------------------------------------------------
+// CHsBrowserContainer::ShowConnClosedNote
+// ----------------------------------------------------
+//
+void CHsBrowserContainer::ShowConnClosedNote()
+	{
+	DEBUG( "CHsBrowserContainer::ShowConnClosedNote()" );
+    if ( IsForeground() )
+        {
+        DEBUG( "CHsBrowserContainer::ShowConnClosedNote() Foreground" );
+	    HBufC* message = NULL;
+        TRAPD( err, message = StringLoader::LoadLC( R_QTN_NETW_CONSET_WBA_INFO_CLOSED ); CleanupStack::Pop( message ) );
+ 	    if (err == KErrNone)
+ 	        {
+ 	        // use global note here, otherwise overlap problem
+ 	        // appears with "Wlan network lost" note, which is
+ 	        // also a global note.
+ 	        CAknGlobalNote* note = NULL;
+ 	        TRAP( err, note = CAknGlobalNote::NewLC(); CleanupStack::Pop( note ) );
+ 	        if (err == KErrNone)
+ 	            { 	        
+ 	            TRAP( err, note->ShowNoteL( EAknGlobalInformationNote, *message ) );
+ 	            if (err == KErrNone)
+ 	                {
+ 	                DEBUG( "CHsBrowserContainer::ShowConnClosedNote(): Showing note DONE" );
+ 	                }
+ 	            delete note;
+ 	            }
+ 	        delete message;
+ 	        }
+		}
+	}
+
+// ----------------------------------------------------
+// CHsBrowserContainer::IsForeground()
+// ----------------------------------------------------
+//
+TBool CHsBrowserContainer::IsForeground()
+	{
+	DEBUG( "CHsBrowserContainer::IsForeground()" );
+	TInt32 foregroundUid(0);
+    RWsSession ws;
+    TInt ret = ws.Connect();
+    if ( KErrNone == ret )
+    	{
+    	TApaTaskList taskList = TApaTaskList( ws );
+    	TApaTask foregroundTask = taskList.FindByPos( 0 );
+    
+    	CApaWindowGroupName* wgName = NULL;
+    	TRAPD( err, wgName = CApaWindowGroupName::NewLC( ws, foregroundTask.WgId() ); CleanupStack::Pop( wgName ) );
+    	if (err == KErrNone)
+    	    {
+            foregroundUid = wgName->AppUid().iUid;
+            delete wgName;
+    	    }
+        ws.Close();
+    	}
+    return foregroundUid == KUidHsBrowserApp.iUid;
+	}
+
+// End of File