--- /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