phonebookui/Phonebook2/NamesListExtension/src/CPbk2NameslistUiControlExtension.cpp
branchRCL_3
changeset 63 f4a778e096c2
child 64 c1e8ba0c2b16
child 68 9da50d567e3c
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/phonebookui/Phonebook2/NamesListExtension/src/CPbk2NameslistUiControlExtension.cpp	Wed Sep 01 12:29:52 2010 +0100
@@ -0,0 +1,417 @@
+/*
+* Copyright (c) 2002-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:  Phonebook 2 Nameslist UI control composite UI extension.
+*
+*/
+
+
+#include "CPbk2NameslistUiControlExtension.h"
+
+#include <CPbk2IconArray.h>
+#include <TPbk2IconId.h>
+#include <Pbk2IconId.hrh>
+#include <Pbk2Commands.hrh>
+#include <Pbk2UID.h>
+#include <MPbk2ContactUiControlUpdate.h>
+#include <MVPbkViewContact.h>
+#include <MVPbkContactLink.h>
+#include <CVPbkContactManager.h>
+#include <MVPbkBaseContactFieldCollection.h>
+#include <MVPbkBaseContactField.h>
+#include <MVPbkFieldType.h>
+#include <MVPbkContactFieldData.h>
+#include <VPbkEng.rsg>
+#include <CVPbkTopContactManager.h>
+#include <Pbk2InternalUID.h>
+#include <mpbk2commanditemupdater.h>
+#include <StringLoader.h>
+#include <Pbk2ExNamesListRes.rsg>
+
+//ECE
+#include <gulicon.h>
+#include <fbs.h>
+#include <AknUtils.h>
+#include <aknlayoutscalable_avkon.cdl.h>
+#include <aknlayoutscalable_apps.cdl.h>
+
+#include "CPbk2UIExtensionInformation.h"
+#include <CPbk2UIExtensionPlugin.h>
+#include <Pbk2UIExtension.hrh>
+#include <TPbk2IconId.h>
+#include "Pbk2NamesListExUID.h"
+#include "CPbk2EcePresenceEngine.h"
+
+enum TNlxPanicCodes
+    {
+    ENlxPanicEmptyPackage,
+    ENlxPanicIconNull,
+    ENlxPanicNoLinks,
+    ENlxPanicStrayIcon,
+    ENlxPanicStrayIconInfo
+    };
+
+/// Unnamed namespace for local definitions
+namespace {
+
+TSize CalculateListIconSize()
+    {
+    TRect mainPane;
+    AknLayoutUtils::LayoutMetricsRect(
+        AknLayoutUtils::EMainPane, mainPane );
+    TAknLayoutRect listLayoutRect;
+    listLayoutRect.LayoutRect(
+        mainPane,
+        AknLayoutScalable_Apps::list_double_large_graphic_phob2_pane_g2( 0 ).LayoutLine() );
+    return listLayoutRect.Rect().Size();
+    }
+}
+
+
+// -----------------------------------------------------------------------------
+// CPbk2NameslistUiControlExtension::CPbk2NameslistUiControlExtension
+// -----------------------------------------------------------------------------
+//
+CPbk2NameslistUiControlExtension::CPbk2NameslistUiControlExtension
+        ( CVPbkContactManager& aContactManager,
+          CSpbContentProvider& aContentProvider,
+          CPbk2MyCard* aMyCard )  :
+            iContactManager( aContactManager ),
+            iContentProvider( aContentProvider ),
+            iMyCard( aMyCard )
+    {
+    }
+
+// -----------------------------------------------------------------------------
+// CPbk2NameslistUiControlExtension::ConstructL
+// -----------------------------------------------------------------------------
+//
+void CPbk2NameslistUiControlExtension::ConstructL()
+    {
+	// if my card is provided
+	if( iMyCard )
+		{
+		// set this to be observer of the my card
+		iMyCard->SetObserverL( *this );
+		// check if the mycard has already a thumbnail
+		iBitmap = iMyCard->MyCardBitmapL();
+		}
+	
+	iPresenceEngine = CPbk2EcePresenceEngine::NewL(
+            iContactManager,
+            *this,
+            CalculateListIconSize() );
+    iContentProvider.AddObserverL( *this );
+    }
+
+// -----------------------------------------------------------------------------
+// CPbk2NameslistUiControlExtension::NewL
+// -----------------------------------------------------------------------------
+//
+CPbk2NameslistUiControlExtension* CPbk2NameslistUiControlExtension::NewL
+        ( CVPbkContactManager& aContactManager,
+          CSpbContentProvider& aContentProvider,
+          CPbk2MyCard* aMyCard )
+    {
+    CPbk2NameslistUiControlExtension* self =
+        new ( ELeave ) CPbk2NameslistUiControlExtension
+            ( aContactManager, aContentProvider, aMyCard );
+    CleanupStack::PushL( self );
+    self->ConstructL();
+    CleanupStack::Pop( self );
+    return self;
+    }
+
+// -----------------------------------------------------------------------------
+// CPbk2NameslistUiControlExtension::~CPbk2NameslistUiControlExtension
+// -----------------------------------------------------------------------------
+//
+CPbk2NameslistUiControlExtension::~CPbk2NameslistUiControlExtension()
+    {
+    delete iPresenceEngine;
+    iDummyArray.Close();
+    iContentProvider.RemoveObserver( *this );
+    // if my card is provided
+    if( iMyCard )
+    	{
+    	iMyCard->RemoveObserver( *this );
+    	}
+    delete iBitmap;
+    }
+
+// -----------------------------------------------------------------------------
+// CPbk2NameslistUiControlExtension::DoRelease
+// -----------------------------------------------------------------------------
+//
+void CPbk2NameslistUiControlExtension::DoRelease()
+    {
+    delete this;
+    }
+
+// -----------------------------------------------------------------------------
+// CPbk2NameslistUiControlExtension::GetDynamicIconsL
+// -----------------------------------------------------------------------------
+//
+const TArray<TPbk2IconId> CPbk2NameslistUiControlExtension::GetDynamicIconsL
+    ( const MVPbkViewContact* aContactHandle )
+    {
+    //Add here the values of TPbk2IconId that are preferred to be shown
+    //in the list. Icons must already be present in the icon array.
+    iDummyArray.Reset();
+
+    if ( aContactHandle )
+        {
+        // first check presence icon, highest priority
+        MVPbkContactLink* link = aContactHandle->CreateLinkLC();
+        if ( link )
+            {
+            // Requests presence notifications, if hasn't already done so.
+            iPresenceEngine->SubscribeContactPresenceL( *link );
+
+            TPbk2IconId iconId;
+            TBool found = iPresenceEngine->GetIconIdForContact( *link, iconId );
+            if ( found )
+                {
+                // The icon has already been fetched from the presence server etc.
+                if ( iIconArray->FindIcon( iconId ) == KErrNotFound )
+                    {
+                    // The icon is not yet in the array. Add it.
+                    CGulIcon* gulIcon = iPresenceEngine->CreateIconCopyLC( iconId );
+                    iIconArray->AppendIconL( gulIcon, iconId );
+                    CleanupStack::Pop( gulIcon );
+                    }
+                iDummyArray.AppendL( iconId );
+                }
+            CleanupStack::PopAndDestroy(); // link
+            }
+
+        //Top contact indicator
+        if ( CVPbkTopContactManager::IsTopContact( *aContactHandle ) )
+            {
+            iDummyArray.AppendL( TPbk2IconId(
+                TUid::Uid(KPbk2UID3), EPbk2qgn_prop_pb_topc ));
+            }
+        }
+
+    //Presence indicator
+    return iDummyArray.Array();
+    }
+
+// -----------------------------------------------------------------------------
+// CPbk2NameslistUiControlExtension::SetContactUiControlUpdate
+// -----------------------------------------------------------------------------
+//
+void CPbk2NameslistUiControlExtension::SetContactUiControlUpdate
+        ( MPbk2ContactUiControlUpdate* aContactUpdator )
+    {
+    //Register observer interface (MPbk2ContactUiControlUpdate) of aContactUpdator
+    //In case changes in data, call  UpdateContact(const MVPbkContactLink& aContactLink )
+    iContactUpdator = aContactUpdator;
+    }
+
+// -----------------------------------------------------------------------------
+// CPbk2NameslistUiControlExtension::ContactUiControlExtensionExtension
+// -----------------------------------------------------------------------------
+//
+TAny* CPbk2NameslistUiControlExtension::ContactUiControlExtensionExtension(
+    TUid aExtensionUid )
+    {
+    if ( aExtensionUid == KMPbk2ContactUiControlExtensionExtension2Uid )
+        {
+        return static_cast<MPbk2ContactUiControlExtension2*>( this );
+        }
+    else if( aExtensionUid == TUid::Uid( KPbk2ContactUiControlExtensionExtensionUID ) ) 
+        {
+        return static_cast<MPbk2ContactUiControlDoubleListboxExtension*>( this );
+        }
+    return NULL;
+    }
+
+// -----------------------------------------------------------------------------
+// CPbk2NameslistUiControlExtension::SetIconArray
+//
+// For use via ContactUiControlExtensionExtension
+// -----------------------------------------------------------------------------
+//
+void CPbk2NameslistUiControlExtension::SetIconArray(CPbk2IconArray& aIconArray)
+    {
+    iIconArray = &aIconArray;
+    // if bitmap is allready set. MyCardEvent - event has come before this one or there was an image on creation
+    if( iBitmap && iMyCard )
+    	{
+		TRAP_IGNORE( AddMyCardThumbnailToIconArrayL() );
+    	}
+    }
+
+// -----------------------------------------------------------------------------
+// CPbk2NameslistUiControlExtension::ContactPresenceChanged
+// -----------------------------------------------------------------------------
+//
+void CPbk2NameslistUiControlExtension::ContactPresenceChanged(
+    const MVPbkContactLink& aLink )
+    {
+    if ( iContactUpdator )
+        {
+        iContactUpdator->UpdateContact( aLink );
+        }
+    }
+
+// -----------------------------------------------------------------------------
+// CPbk2NameslistUiControlExtension::FormatDataL
+// -----------------------------------------------------------------------------
+//
+void CPbk2NameslistUiControlExtension::FormatDataL(
+        const MVPbkContactLink& aContactLink,
+        MPbk2DoubleListboxDataElement& aDataElement )
+    {
+    HBufC* txt = NULL;
+    TPbk2IconId iconId;
+    CSpbContentProvider::TSpbContentType type = CSpbContentProvider::ETypeNone;
+    
+    iContentProvider.GetContentL( 
+            *(const_cast<MVPbkContactLink*>(&aContactLink)), txt, iconId, type );
+
+    // select proper element type based on content type
+    MPbk2DoubleListboxDataElement::TTextDataType elemType = 
+        MPbk2DoubleListboxDataElement::ETypeGenericText;
+    if( type == CSpbContentProvider::ETypePhoneNumber )
+        {
+        elemType = MPbk2DoubleListboxDataElement::ETypePhoneNumber;
+        }
+    else if( type == CSpbContentProvider::ETypePhoneNumberMultiple && txt )
+        {
+        // if we get multiple phone numbers from content provider, then
+        // the string only contains the count (as text). We need to format
+        // that into proper UI text.
+        TInt num = 0;
+        TLex16 lex( *txt );
+        TInt err = lex.Val( num );
+        if( !err )
+            {
+            delete txt;
+            txt = StringLoader::LoadL( R_QTN_PHOB_N_NUMBERS, num );
+            }
+        else
+            {
+            // in case of convert error
+            txt->Des().Zero();
+            }
+        }
+    
+    aDataElement.SetText(
+        MPbk2DoubleListboxDataElement::EStatusText, txt, elemType );
+
+    }
+
+// -----------------------------------------------------------------------------
+// CPbk2NameslistUiControlExtension::SetCommandItemUpdater
+// -----------------------------------------------------------------------------
+//
+void CPbk2NameslistUiControlExtension::SetCommandItemUpdater(
+    MPbk2CommandItemUpdater* aCommandUpdater )
+    {
+    // Register command item updater interface
+    iCommandUpdater = aCommandUpdater;
+    }
+
+// -----------------------------------------------------------------------------
+// CPbk2NameslistUiControlExtension::ContentUpdated
+// -----------------------------------------------------------------------------
+//
+void CPbk2NameslistUiControlExtension::ContentUpdated(
+    MVPbkContactLink& aLink,
+    MSpbContentProviderObserver::TSpbContentEvent aEvent )
+    {
+    if( aEvent == MSpbContentProviderObserver::EContentChanged )
+        {
+        MVPbkContactLink* mylink = iMyCard ? iMyCard->MyCardLink() : NULL;
+        if( mylink && mylink->IsSame( aLink ) )
+            {
+            // mycard updated -> update mycard command item instead of contact
+            if( iCommandUpdater )
+                {
+                iCommandUpdater->UpdateCommandItem( EPbk2CmdOpenMyCard );
+                }
+            }
+        else if( iContactUpdator )
+            {
+            // some other contactB
+            iContactUpdator->UpdateContact( aLink );
+            }
+        }
+    }
+
+// -----------------------------------------------------------------------------
+// CPbk2NameslistUiControlExtension::MyCardEvent
+// -----------------------------------------------------------------------------
+//
+void CPbk2NameslistUiControlExtension::MyCardEvent( TMyCardStatusEvent aEvent )
+	{
+	// thumbnail is loaded
+	if( aEvent == EStateThumbnailLoaded && iMyCard )    
+		{
+		// get bitmap
+        delete iBitmap;
+        iBitmap = NULL;
+        TRAP_IGNORE( iBitmap = iMyCard->MyCardBitmapL() );
+			
+		// if icon array is already set, add icon
+		if( iIconArray )
+			{
+			TRAP_IGNORE( AddMyCardThumbnailToIconArrayL() );
+			}
+		}
+    // Refresh mycard list item if thumbnail has changed
+    if( iCommandUpdater &&
+        ( aEvent == EStateThumbnailLoaded ||
+          aEvent == EStateThumbnailNotFound ) )
+        {
+        iCommandUpdater->UpdateCommandItem( EPbk2CmdOpenMyCard );
+        }
+	}
+
+// -----------------------------------------------------------------------------
+// CPbk2NameslistUiControlExtension::AddThumbnailToIconArrayL
+// -----------------------------------------------------------------------------
+//
+void CPbk2NameslistUiControlExtension::AddMyCardThumbnailToIconArrayL( )
+	{
+	if( !iMyCard )
+		{
+        return;
+		}
+	
+    const TPbk2IconId& iconId = iMyCard->MyCardIconId();
+	// if thumb icon is not created, create it and append to array
+	if( !iThumbIcon )
+		{
+        CGulIcon* icon = CGulIcon::NewLC();
+        icon->SetBitmap( iBitmap );
+		iBitmap = NULL;
+		// takes ownership
+		iIconArray->AppendIconL( icon, iconId );
+        CleanupStack::Pop( icon );
+        iThumbIcon = icon;  // cache icon pointer
+		}
+	    
+	// else change the bitmap. This is to prevent 
+	// thumbnail indexes on thumbnail manager to get out of sync
+	else
+		{
+		iThumbIcon->SetBitmap( iBitmap );
+        iBitmap = NULL;
+		}
+	}
+
+
+// End of File