diff -r fb3763350a08 -r 4d54b72983ae taskswitcher/taskswitcherui/taskswitcherapp/src/tsdevicestate.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/taskswitcher/taskswitcherui/taskswitcherapp/src/tsdevicestate.cpp Tue Jan 26 11:48:23 2010 +0200 @@ -0,0 +1,272 @@ +/* +* Copyright (c) 2008 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: Device state (touch mode, screen orientation) handler + * +*/ + + +#include "tsdevicestate.h" +#include "tsapplogging.h" + +#include +#include + +// ----------------------------------------------------------------------------- +// CTsDeviceState::NewL +// ----------------------------------------------------------------------------- +// +CTsDeviceState* CTsDeviceState::NewL() + { + CTsDeviceState* self = new ( ELeave ) CTsDeviceState; + CleanupStack::PushL( self ); + self->ConstructL(); + CleanupStack::Pop( self ); + return self; + } + +// ----------------------------------------------------------------------------- +// CTsDeviceState::CTsDeviceState +// ----------------------------------------------------------------------------- +// +CTsDeviceState::CTsDeviceState() + { + } + +// ----------------------------------------------------------------------------- +// CTsDeviceState::ConstructL +// ----------------------------------------------------------------------------- +// +void CTsDeviceState::ConstructL() + { + iFlipStatusObserver = new ( ELeave ) CTsPropertyListener(KPSUidHWRM, + KHWRMFlipStatus, *this); + // check if touch is enabled or not + CheckTouchState(); + // are we in portrait or landscape + CheckOrientation(); + // checks the qwerty input mode. + CheckDeviceType(); + } + +// ----------------------------------------------------------------------------- +// CTsDeviceState::~CTsDeviceState +// ----------------------------------------------------------------------------- +// +CTsDeviceState::~CTsDeviceState() + { + iObservers.Close(); + delete iFlipStatusObserver; + } + +// -------------------------------------------------------------------------- +// CTsDeviceState::HandleResourceChange +// -------------------------------------------------------------------------- +// +void CTsDeviceState::HandleResourceChange( TInt aType ) + { + TSLOG_CONTEXT( HandleResourceChange, TSLOG_LOCAL ); + TSLOG2_IN( "aType = %d (active count = %d)", aType, iResChangeActiveCount ); + + // increase function entrance count + ++iResChangeActiveCount; + // if we are still in a previous call then do nothing else + if ( iResChangeActiveCount == 1 ) + { + // the active count may increase during execution of the body of the loop + // (if some observers have active scheduler waits, for example) + while ( iResChangeActiveCount > 0 ) + { + if ( aType == KEikDynamicLayoutVariantSwitch ) + { + TSLOG0( TSLOG_INFO, "dyn layout var switch" ); + // This might be a screen orientation or touch-nontouch switch, + // so let's check the situation and notify observers if needed. + CheckTouchState(); + CheckOrientation(); + } + else if ( aType == KAknsMessageSkinChange ) + { + TSLOG0( TSLOG_INFO, "skin change" ); + NotifyObservers( MTsDeviceStateObserver::ESkin ); + } + --iResChangeActiveCount; + } + } + + TSLOG_OUT(); + } + +// -------------------------------------------------------------------------- +// CTsDeviceState::PropertyChanged +// -------------------------------------------------------------------------- +// +void CTsDeviceState::PropertyChanged(TUid aCategory, TUint aKey) + { + TSLOG_CONTEXT( PropertyChanged, TSLOG_LOCAL ); + TSLOG2_IN( "aKey = %d aNewValue = %d", aCategory, aKey ); + CheckDeviceType(); + TSLOG_OUT(); + } + +// -------------------------------------------------------------------------- +// CTsDeviceState::CheckTouchState +// -------------------------------------------------------------------------- +// +void CTsDeviceState::CheckTouchState() + { + TSLOG_CONTEXT( CheckTouchState, TSLOG_LOCAL ); + TSLOG_IN(); + + TTouchState oldValue = iTouchState; + iTouchState = AknLayoutUtils::PenEnabled() ? ETouchEnabled : ETouchDisabled; + if ( iTouchState != oldValue ) + { + NotifyObservers( MTsDeviceStateObserver::ETouchState ); + } + + TSLOG1_OUT( "new value for iTouchState: %d", iTouchState ); + } + +// -------------------------------------------------------------------------- +// CTsDeviceState::CheckOrientation +// -------------------------------------------------------------------------- +// +void CTsDeviceState::CheckOrientation() + { + TSLOG_CONTEXT( CheckOrientation, TSLOG_LOCAL ); + TSLOG_IN(); + + TRect rect; + AknLayoutUtils::LayoutMetricsRect ( AknLayoutUtils::EScreen, rect ); + TOrientation oldValue = iOrientation; + iOrientation = rect.Width() > rect.Height() ? ELandscape : EPortrait; + if ( iOrientation != oldValue ) + { + NotifyObservers( MTsDeviceStateObserver::EOrientation ); + } + + TSLOG1_OUT( "new value for iOrientation: %d", iOrientation ); + } + +// -------------------------------------------------------------------------- +// CTsDeviceState::DeviceType +// -------------------------------------------------------------------------- +// +void CTsDeviceState::CheckDeviceType() + { + TSLOG_CONTEXT( CheckQwerty, TSLOG_LOCAL ); + TSLOG_IN(); + + TInt oldDeviceType = iDeviceType; + TInt value( 0 ); + if( RProperty::Get( KPSUidHWRM, KHWRMFlipStatus, value ) == KErrNone ) + { + iDeviceType = (value == EPSHWRMFlipOpen ? EHybrid : EFullTouch); + } + + if( iDeviceType != oldDeviceType ) + { + NotifyObservers( MTsDeviceStateObserver::EDeviceType); + } + + TSLOG1_OUT( "new value for iDeviceType: %d", iDeviceType ); + } + +// -------------------------------------------------------------------------- +// CTsDeviceState::TouchState +// -------------------------------------------------------------------------- +// +CTsDeviceState::TTouchState CTsDeviceState::TouchState() const + { + return iTouchState; + } + +// -------------------------------------------------------------------------- +// CTsDeviceState::Orientation +// -------------------------------------------------------------------------- +// +CTsDeviceState::TOrientation CTsDeviceState::Orientation() const + { + return iOrientation; + } + +// -------------------------------------------------------------------------- +// CTsDeviceState::Qwerty +// -------------------------------------------------------------------------- +// +CTsDeviceState::TDeviceType CTsDeviceState::DeviceType() const + { + return iDeviceType; + } + +// -------------------------------------------------------------------------- +// CTsDeviceState::ObserverIdentity +// -------------------------------------------------------------------------- +// +TBool CTsDeviceState::ObserverIdentity( const SObserver& aA, + const SObserver& aB ) + { + return aA.iObserver == aB.iObserver; + } + +// -------------------------------------------------------------------------- +// CTsDeviceState::AddDeviceStateObserverL +// -------------------------------------------------------------------------- +// +void CTsDeviceState::AddObserverL( MTsDeviceStateObserver& aObserver, + TInt aMask ) + { + iObservers.AppendL( SObserver( aMask, &aObserver ) ); + } + +// -------------------------------------------------------------------------- +// CTsDeviceState::RemoveObserver +// -------------------------------------------------------------------------- +// +void CTsDeviceState::RemoveObserver( MTsDeviceStateObserver& aObserver ) + { + for ( ; ; ) + { + TInt pos = iObservers.Find( SObserver( MTsDeviceStateObserver::EAny, + &aObserver ), ObserverIdentity ); + if ( pos >= 0 ) + { + iObservers.Remove( pos ); + } + else + { + break; + } + } + } + +// -------------------------------------------------------------------------- +// CTsDeviceState::NotifyObservers +// -------------------------------------------------------------------------- +// +void CTsDeviceState::NotifyObservers( + MTsDeviceStateObserver::TChangeType aType ) + { + for ( TInt i = 0, ie = iObservers.Count(); i != ie; ++i ) + { + const SObserver& obs( iObservers[i] ); + if ( obs.iMask & aType ) + { + obs.iObserver->HandleDeviceStateChanged( aType ); + } + } + } + + +// end of file