diff -r 000000000000 -r 79c6a41cd166 idlefw/src/idleint/aiuiidleintegration.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/idlefw/src/idleint/aiuiidleintegration.cpp Thu Dec 17 08:54:17 2009 +0200 @@ -0,0 +1,401 @@ +/* +* Copyright (c) 2006-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: Window server plug-in manager. +* +*/ + + +#include "aiuiidleintegrationimpl.h" +#include "aifweventhandler.h" + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "aistate.h" +#include "aifwpanic.h" +#include "activeidle2domainpskeys.h" + +#include + +#include + +// ======== MEMBER FUNCTIONS ======== + +// ---------------------------------------------------------------------------- +// CAiUiIdleIntegrationImpl::NewL() +// ---------------------------------------------------------------------------- +// +CAiUiIdleIntegrationImpl* CAiUiIdleIntegrationImpl::NewL( CEikonEnv& aEikEnv, + const TAiIdleKeySoundConfig& aKeySoundConfig, + MAiFwEventHandler* aAiFwEventHandler ) + { + CAiUiIdleIntegrationImpl* self = + new ( ELeave ) CAiUiIdleIntegrationImpl( aEikEnv, aAiFwEventHandler ); + + CleanupStack::PushL( self ); + self->ConstructL( aKeySoundConfig ); + CleanupStack::Pop( self ); + return self; + } + +// ---------------------------------------------------------------------------- +// CAiUiIdleIntegrationImpl::~CAiUiIdleIntegrationImpl() +// ---------------------------------------------------------------------------- +// +CAiUiIdleIntegrationImpl::~CAiUiIdleIntegrationImpl() + { + delete iActiveIdleState; + + delete iIncallBubble; + + Release( iSystemStateObserver ); + + Release( iUiStartupStateObserver ); + + Release( iCallStatusObserver ); + } + +// ---------------------------------------------------------------------------- +// CAiUiIdleIntegrationImpl::CAiUiIdleIntegrationImpl() +// ---------------------------------------------------------------------------- +// +CAiUiIdleIntegrationImpl::CAiUiIdleIntegrationImpl( CEikonEnv& aEikEnv, + MAiFwEventHandler* aAiFwEventHandler ) + : iEikEnv( aEikEnv ), + iAiFwEventHandler( aAiFwEventHandler ) + { + } + +// ---------------------------------------------------------------------------- +// CAiUiIdleIntegrationImpl::ConstructL() +// ---------------------------------------------------------------------------- +// +void CAiUiIdleIntegrationImpl::ConstructL( + const TAiIdleKeySoundConfig& aKeySoundConfig ) + { + iIncallBubble = CAknIncallBubble::NewL(); + + iActiveIdleState = CActiveIdleState::NewL(); + + // Set up keysounds + if( aKeySoundConfig.iKeySounds ) + { + aKeySoundConfig.iKeySounds + ->PushContextL( aKeySoundConfig.iContextResId ); + } + + // Set Active Idle application to be system application and disable + // priority switching performed by window server. + iEikEnv.SetSystem( ETrue ); + iEikEnv.WsSession().ComputeMode( RWsSession::EPriorityControlDisabled ); + + // Eikon server window group + iThisApplicationWgId = iEikEnv.RootWin().Identifier(); + + iEikEnv.RootWin().EnableFocusChangeEvents(); + iEikEnv.RootWin().EnableGroupChangeEvents(); + + CApaWindowGroupName::FindByAppUid( KAknCapServerUid, + iEikEnv.WsSession(), + iEikonServerWgId ); + + iActiveIdleState->SetIsIdleForeground( iThisApplicationForeground ); + + iSystemStateObserver = AiUtility::CreatePSPropertyObserverL( + TCallBack( HandleSystemStateChange, this ), + KPSUidStartup, + KPSGlobalSystemState ); + + iUiStartupStateObserver = AiUtility::CreatePSPropertyObserverL( + TCallBack( HandleUiStartupStateChange, this ), + KPSUidStartup, + KPSStartupUiPhase ); + + iCallStatusObserver = AiUtility::CreatePSPropertyObserverL( + TCallBack( HandleCallEvent, this ), + KPSUidCtsyCallInformation, + KCTsyCallState ); + + // Update state flags. + CAiUiIdleIntegrationImpl::HandleSystemStateChange( this ); + CAiUiIdleIntegrationImpl::HandleUiStartupStateChange( this ); + } + +// ---------------------------------------------------------------------------- +// CAiUiIdleIntegrationImpl::ActivateUI() +// ---------------------------------------------------------------------------- +// +void CAiUiIdleIntegrationImpl::ActivateUI() + { + if( iUiStartupPhaseOk && iSystemStateOk ) + { + RWsSession& wsSession( iEikEnv.WsSession() ); + + TInt focusWgId( wsSession.GetFocusWindowGroup() ); + + if( iThisApplicationWgId != focusWgId ) + { + TApaTaskList taskList( wsSession ); + + TApaTask task( taskList.FindApp( TUid::Uid( AI_UID3_AIFW_EXE ) ) ); + + task.SendSystemEvent( EApaSystemEventBroughtToForeground ); + } + + iAiFwEventHandler->HandleActivateUI(); + } + } + +// ---------------------------------------------------------------------------- +// CAiUiIdleIntegrationImpl::HandleWsEventL() +// ---------------------------------------------------------------------------- +// +void CAiUiIdleIntegrationImpl::HandleWsEventL( const TWsEvent& aEvent, + CCoeControl* /*aDestination*/ ) + { + if( !iSystemStateOk || !iUiStartupPhaseOk ) + { + return; + } + + switch ( aEvent.Type() ) + { + case KAknFullOrPartialForegroundGained: + { + if ( !iThisApplicationForeground ) + { + iThisApplicationForeground = ETrue; + iActiveIdleState->SetIsIdleForeground( ETrue ); + SetCallBubbleIfNeededL(); + } + break; + } + + case KAknFullOrPartialForegroundLost: + { + if ( iThisApplicationForeground ) + { + iThisApplicationForeground = EFalse; + iActiveIdleState->SetIsIdleForeground( EFalse ); + ClearCallBubbleL(); + } + break; + } + + case EEventKeyDown: + { + if( aEvent.Key()->iScanCode == EStdKeyDevice0 ) + { + TBool isDialog( iEikEnv.AppUi()->IsDisplayingMenuOrDialog() ); + + if( isDialog || iAiFwEventHandler->QueryIsMenuOpen() ) + { + RProperty::Set( + KPSUidAiInformation, + KActiveIdlePopupState, + EPSAiDisplayingMenuOrDialog ); + } + else + { + RProperty::Set( + KPSUidAiInformation, + KActiveIdlePopupState, + EPSAiNotDisplayingMenuOrDialog ); + } + } + break; + } + + default: + { + break; + } + } + } + +// ---------------------------------------------------------------------------- +// CAiUiIdleIntegrationImpl::SetCallBubbleIfNeededL() +// ---------------------------------------------------------------------------- +// +void CAiUiIdleIntegrationImpl::SetCallBubbleIfNeededL() + { + if( !iIncallBubbleAllowed ) + { + TInt callStatus( 0 ); + + TInt err( RProperty::Get( KPSUidCtsyCallInformation, + KCTsyCallState, + callStatus ) ); + + // Call ongoing => show bubble + if( err == KErrNone && callStatus > EPSCTsyCallStateNone ) + { + iIncallBubble->SetIncallBubbleAllowedInIdleL( ETrue ); + iIncallBubbleAllowed = ETrue; + } + } + } + +// ---------------------------------------------------------------------------- +// CAiUiIdleIntegrationImpl::ClearCallBubbleL() +// ---------------------------------------------------------------------------- +// +void CAiUiIdleIntegrationImpl::ClearCallBubbleL() + { + if( iIncallBubbleAllowed ) + { + iIncallBubble->SetIncallBubbleAllowedInIdleL( EFalse ); + iIncallBubbleAllowed = EFalse; + } + } + +// ---------------------------------------------------------------------------- +// CAiUiIdleIntegration::NewL() +// ---------------------------------------------------------------------------- +// +EXPORT_C CAiUiIdleIntegration* CAiUiIdleIntegration::NewL( CEikonEnv& aEikEnv, + const TAiIdleKeySoundConfig& aKeySoundConfig, + MAiFwEventHandler* aAiFwEventHandler ) + { + return CAiUiIdleIntegrationImpl::NewL( aEikEnv, aKeySoundConfig, + aAiFwEventHandler ); + } + +// ---------------------------------------------------------------------------- +// CAiUiIdleIntegrationImpl::HandleSystemStateChange() +// ---------------------------------------------------------------------------- +// +TInt CAiUiIdleIntegrationImpl::HandleSystemStateChange( TAny* aPtr ) + { + __ASSERT_DEBUG( aPtr, + AiFwPanic::Panic( AiFwPanic::EAiFwPanic_NullPointerReference ) ); + + CAiUiIdleIntegrationImpl* self = + static_cast( aPtr ); + + if( !self->iSystemStateOk ) + { + TInt state( 0 ); + + self->iSystemStateObserver->Get( state ); + + if ( state == ESwStateCriticalPhaseOK || + state == ESwStateNormalRfOn || + state == ESwStateNormalRfOff || + state == ESwStateNormalBTSap ) + { + self->iSystemStateOk = ETrue; + self->ActivateUI(); + } + } + + return KErrNone; + } + +// ---------------------------------------------------------------------------- +// CAiUiIdleIntegrationImpl::HandleUiStartupStateChange() +// ---------------------------------------------------------------------------- +// +TInt CAiUiIdleIntegrationImpl::HandleUiStartupStateChange( TAny *aPtr ) + { + __ASSERT_DEBUG( aPtr, + AiFwPanic::Panic( AiFwPanic::EAiFwPanic_NullPointerReference ) ); + + CAiUiIdleIntegrationImpl* self = + static_cast( aPtr ); + + if( !self->iUiStartupPhaseOk ) + { + TInt state( 0 ); + + self->iUiStartupStateObserver->Get( state ); + + if( state == EStartupUiPhaseAllDone ) + { + self->iUiStartupPhaseOk = ETrue; + + self->ActivateUI(); + } + } + + return KErrNone; + } + +// ---------------------------------------------------------------------------- +// CAiUiIdleIntegrationImpl::HandleCallEvent() +// ---------------------------------------------------------------------------- +// +TInt CAiUiIdleIntegrationImpl::HandleCallEvent( TAny* aPtr ) + { + __ASSERT_DEBUG( aPtr, + AiFwPanic::Panic( AiFwPanic::EAiFwPanic_NullPointerReference ) ); + + CAiUiIdleIntegrationImpl* self = + static_cast( aPtr ); + + TInt callStatus( EPSCTsyCallStateNone ); + + TInt err( self->iCallStatusObserver->Get( callStatus ) ); + + if( err == KErrNone ) + { + // Call ongoing => show bubble if not showing already + TBool allowed = EFalse; + + if( !self->iIncallBubbleAllowed && + self->iThisApplicationForeground && + ( callStatus > EPSCTsyCallStateNone ) ) + { + allowed = ETrue; + + TRAP( err, + self->iIncallBubble->SetIncallBubbleAllowedInIdleL( allowed ) ); + + + if( err == KErrNone ) + { + self->iIncallBubbleAllowed = allowed; + } + } + // No call ongoing => hide if bubble is visible + else if( self->iIncallBubbleAllowed && callStatus <= EPSCTsyCallStateNone ) + { + allowed = EFalse; + + TRAP( err, + self->iIncallBubble->SetIncallBubbleAllowedInIdleL( allowed ) ); + + if( err == KErrNone ) + { + self->iIncallBubbleAllowed = allowed; + } + } + } + + return err; + } + +// End of file. +