uifw/AvKon/src/aknindicatordataobserver.cpp
changeset 0 2f259fa3e83a
child 25 941195f2d488
--- /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 <AknIndicatorContainer.h>
+#include <AknIndicator.h>
+#include "aknstatuspanedatasubscriber.h"
+#include <eikspane.h>
+#include <avkon.hrh>
+#include <AknDef.h>
+
+// 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