diff -r 000000000000 -r 2f259fa3e83a uifw/AvKon/src/aknindicatordataobserver.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/uifw/AvKon/src/aknindicatordataobserver.cpp Tue Feb 02 01:00:49 2010 +0200 @@ -0,0 +1,216 @@ +/* +* Copyright (c) 2006-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: This class updates the status indicator container control +* in status pane. +* +*/ + + +// SYSTEM INCLUDE FILES +#include +#include +#include "aknstatuspanedatasubscriber.h" +#include +#include +#include + +// USER INCLUDE FILES +#include "aknindicatordataobserver.h" +#include "aknstatuspanedata.h" +#include "AknIncallStatusBubble.h" + +/** Value used to specify that an indicator is not shown. */ +const TInt KEmpty = 0xFFFFFFFF; + +// ============================ MEMBER FUNCTIONS ============================= + +// --------------------------------------------------------------------------- +// CAknIndicatorDataObserver::CAknIndicatorDataObserver +// C++ default constructor can NOT contain any code, that +// might leave. +// --------------------------------------------------------------------------- +// +CAknIndicatorDataObserver::CAknIndicatorDataObserver( + CAknIndicatorContainer* aIndicatorPane ) + { + iIndicatorPane = aIndicatorPane; + iIndicatorPane->MopGetObject( iDataSubscriber ); + if ( iDataSubscriber ) + { + iDataSubscriber->AddObserver( this ); + } + + iFirstUpdate = ETrue; + } + + +// --------------------------------------------------------------------------- +// Destructor +// --------------------------------------------------------------------------- +// +CAknIndicatorDataObserver::~CAknIndicatorDataObserver() + { + if ( iDataSubscriber ) + { + iDataSubscriber->RemoveObserver( this ); + } + + } + + +// --------------------------------------------------------------------------- +// CAknIndicatorDataObserver::HandleUpdateL +// Update state to UI control. +// --------------------------------------------------------------------------- +// +void CAknIndicatorDataObserver::HandleUpdateL( + const TAknStatusPaneStateData& aData ) + { + if ( !iDataSubscriber ) + { + return; + } + + TAknIndicatorState state = aData.iIndicatorState; + + TBool indicatorPaneIsInCurrentLayout = ETrue; + + // If this pane is not in current layout, no update. + // Update happens when status pane layout is changed. + CEikStatusPaneBase* statusPane = CEikStatusPaneBase::Current(); + if ( !statusPane || + !statusPane->PaneCapabilities( + TUid::Uid( EEikStatusPaneUidIndic ) ).IsInCurrentLayout() ) + { + indicatorPaneIsInCurrentLayout = EFalse; + } + + TBool updateAnimation = + ( !iDataSubscriber->IsBackground() || + iDataSubscriber->RefreshLevel() > CAknStatusPaneDataSubscriber::ERefreshLevelMedium ); + + // Incall bubble is shown when in foreground and in + // the very first update (to avoid flicker). + TBool showIncallBubble = !iDataSubscriber->IsBackground() || iFirstUpdate; + + TBool anyIndicatorChanged = EFalse; + + if ( indicatorPaneIsInCurrentLayout ) + { + // If indicator does not yet exist, set its state + // initially to "off" -> indicator gets created. + for ( TInt j = 0; j < TAknIndicatorState::EMaxVisibleIndicators; j++ ) + { + if ( state.visibleIndicators[j] != KEmpty && + !iIndicatorPane->IndicatorExists( + TUid::Uid( state.visibleIndicators[j] ) ) ) + { + iIndicatorPane->SetIndicatorState( + TUid::Uid( state.visibleIndicators[j] ), + MAknIndicator::EIndicatorOff, + EFalse ); + } + } + + TInt count = iIndicatorPane->iIndicators->Count(); + + for ( TInt ii = 0; ii < count; ii++ ) + { + CAknIndicator* indicator = iIndicatorPane->iIndicators->At( ii ); + TInt indicState = indicator->IndicatorState(); + TInt indicUid = indicator->Uid().iUid; + + TBool shownInCurrentLayoutMode = ( indicator->Priority() != -1 ); + + TBool found = EFalse; + + for ( TInt jj = 0; jj < TAknIndicatorState::EMaxVisibleIndicators; jj++ ) + { + if ( state.visibleIndicators[jj] == KEmpty ) + { + break; + } + else if ( state.visibleIndicators[jj] == indicUid ) + { + found = ETrue; + if ( state.visibleIndicatorStates[jj] != indicState && + shownInCurrentLayoutMode ) + { + anyIndicatorChanged = ETrue; + if ( state.visibleIndicatorStates[jj] == MAknIndicator::EIndicatorAnimate ) + { + if ( updateAnimation ) + { + // Update animations only in foreground (unless forced) + indicator->SetIndicatorState( state.visibleIndicatorStates[jj] ); + indicator->SetAnimateState( iIndicatorPane->iSynchronizingValue ); + } + else + { + // In background just set it on + indicator->SetIndicatorState( MAknIndicator::EIndicatorOn ); + } + + } + else + { + indicator->SetIndicatorState( state.visibleIndicatorStates[jj] ); + } + } + } + } + + // If indicators was not in the list we assume its state to be OFF. + if ( !found ) + { + if ( indicState != MAknIndicator::EIndicatorOff ) + { + anyIndicatorChanged = ETrue; + indicator->SetIndicatorState( MAknIndicator::EIndicatorOff ); + } + } + } + } + + if ( anyIndicatorChanged ) + { + iIndicatorPane->PrioritizeIndicatorsL(); + iIndicatorPane->SizeChanged(); + } + + + // Incall bubble + TInt modifiedFlags = state.iIncallBubbleFlags; + + if ( !showIncallBubble ) + { + modifiedFlags &= ~CIncallStatusBubble::ESBVisible; // Clear visible bit + } + + iIndicatorPane->SetIncallBubbleAllowedInIdle( state.iIncallBubbleAllowedInIdle ); + iIndicatorPane->SetIncallBubbleAllowedInUsual( state.iIncallBubbleAllowedInUsual ); + iIndicatorPane->SetIncallBubbleDisabled( state.iIncallBubbleDisabled ); + + iIndicatorPane->SetIncallBubbleFlags( modifiedFlags ); + + if ( anyIndicatorChanged || showIncallBubble ) + { + iIndicatorPane->DrawDeferred(); + } + + iFirstUpdate = EFalse; + } + + +// End of File