phonebookui/Phonebook2/ccapplication/ccadetailsviewplugin/src/ccappdetailsviewplugin.cpp
changeset 0 e686773b3f54
child 23 5586b4d2ec3e
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/phonebookui/Phonebook2/ccapplication/ccadetailsviewplugin/src/ccappdetailsviewplugin.cpp	Tue Feb 02 10:12:17 2010 +0200
@@ -0,0 +1,676 @@
+/*
+* 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:  Implementation of details view plugin
+*  Version     : %version: he1s60#23.1.1.2.16 %
+*
+*/
+
+
+#include <bautils.h>
+#include <AknIconUtils.h>
+#include <AiwServiceHandler.h>
+#include <AknsUtils.h>
+#include <aknViewAppUi.h>
+
+#include <mccapppluginparameter.h>
+#include "ccaparameter.h"
+#include "mccaparameter.h"
+
+#include <CVPbkContactManager.h>
+#include <CPbk2StoreConfiguration.h>
+#include <CVPbkContactStoreUriArray.h>
+#include <CVPbkContactLinkArray.h>
+#include <CPbk2ApplicationServices.h>
+#include <CPbk2StoreManager.h>
+#include <TVPbkContactStoreUriPtr.h>
+#include <VPbkContactStoreUris.h>
+#include <mccappengine.h>
+#include <ccacontactorservice.h>
+
+#include <Pbk2DataCaging.hrh>
+
+#include "ccappdetailsviewplugin.h"
+#include "ccappdetailsviewlistboxmodel.h"
+#include "ccappdetailsviewcontainer.h"
+#include "ccappdetailsviewmenuhandler.h"
+#include "ccappdetailsviewdefs.h"
+#include "ccappdetailsviewpluginuids.hrh"
+#include "ccappdetailsview.hrh"
+
+#include <ccappdetailsviewpluginrsc.rsg>
+#include <ccappdetailsviewplugin.mbg>
+
+#include <CVPbkContactManager.h>
+
+// cms engine
+#include "cmscontactfield.h"
+#include "cmscontactfieldinfo.h"
+#include "cmscontactfielditem.h"
+#include "cmssession.h"
+#include "cmscontact.h"
+#include "ccacontactorservice.h"
+#include <VPbkFieldTypeSelectorFactory.h>
+#include "cmspresencedata.h"
+
+#include "ccacmscontactfetcherwrapper.h"
+
+// Consts
+_LIT(KCCAppDetailsViewResourceFileName, "\\resource\\ccappdetailsviewpluginrsc.rsc");
+_LIT(KCCAppDetailsViewIconFileName,     "\\resource\\apps\\ccappdetailsviewplugin.mif");
+
+_LIT(KPbk2CommandsDllResFileName,   "Pbk2Commands.rsc");
+_LIT(KPbk2UiControlsDllResFileName, "Pbk2UiControls.rsc");
+_LIT(KPbk2CommonUiDllResFileName,   "Pbk2CommonUi.rsc"  );
+
+// ======== MEMBER FUNCTIONS ========
+
+// ---------------------------------------------------------------------------
+// CCCAppDetailsViewPlugin::NewL
+// ---------------------------------------------------------------------------
+//
+CCCAppDetailsViewPlugin* CCCAppDetailsViewPlugin::NewL()
+{
+    CCCAppDetailsViewPlugin* self = new(ELeave) CCCAppDetailsViewPlugin();
+    CleanupStack::PushL(self);
+    self->ConstructL();
+    CleanupStack::Pop(self);
+
+    return self;
+}
+
+// ---------------------------------------------------------------------------
+// CCCAppDetailsViewPlugin::~CCCAppDetailsViewPlugin
+// ---------------------------------------------------------------------------
+//
+CCCAppDetailsViewPlugin::~CCCAppDetailsViewPlugin()
+{
+    //CCA_DP(KDetailsViewLogFile, CCA_L(">>> CCCAppDetailsViewPlugin::~CCCAppDetailsViewPlugin()"));
+    
+    //BG task for checking the visibility of this plugin
+    if (iBgTaskForCheckingVisibility)
+    {
+        iBgTaskForCheckingVisibility->Cancel();
+        delete iBgTaskForCheckingVisibility;
+    }
+
+    if (AppEngine())
+    {
+        AppEngine()->RemoveObserver(*this);
+    }
+
+    if (iAppServices)
+    {
+        iAppServices->StoreManager().DeregisterStoreEvents(*this);
+    }
+
+    delete iMenuHandler;
+    delete iContactorService;
+
+    Release(iAppServices);
+
+    iCommandsResourceFile.Close();
+    iUiControlsResourceFile.Close();
+    iCommonUiResourceFile.Close();
+
+    if(iCmsWrapper)
+        {
+        iCmsWrapper->Release();
+        }
+
+    //CCA_DP(KDetailsViewLogFile, CCA_L("<<< CCCAppDetailsViewPlugin::~CCCAppDetailsViewPlugin()"));
+}
+
+// ---------------------------------------------------------------------------
+// CCCAppDetailsViewPlugin::CCCAppDetailsViewPlugin()
+// ---------------------------------------------------------------------------
+//
+CCCAppDetailsViewPlugin::CCCAppDetailsViewPlugin() :
+    iFocusedListIndex(0),
+    iCommandsResourceFile(*iCoeEnv),
+    iUiControlsResourceFile(*iCoeEnv),
+    iCommonUiResourceFile(*iCoeEnv),
+    iVisible(EFalse) // By default this plugin is not visible
+{
+}
+
+// ---------------------------------------------------------------------------
+// CCCAppDetailsViewPlugin::ConstructL
+// ---------------------------------------------------------------------------
+//
+void CCCAppDetailsViewPlugin::ConstructL()
+{
+    CCA_DP(KDetailsViewLogFile, CCA_L(">>> CCCAppDetailsViewPlugin::ConstructL()"));
+
+    // ConstructL should be as light as possible.
+
+    /*
+    CPbk2ApplicationServices& pbk2AppServices = GetPbk2AppServicesL();
+    // Add phone memory to cnt manager loaded stores even if current configuration
+    // contains only SIM memory so that top contacts can be opened
+    // from e.g. home screen widget.
+    pbk2AppServices.ContactManager().LoadContactStoreL(
+        VPbkContactStoreUris::DefaultCntDbUri() );
+    */
+
+    iCmsWrapper = CCCAppCmsContactFetcherWrapper::InstanceL(); 
+    // Create the BG Task which will help us in checking the visibility of this plugin
+    iBgTaskForCheckingVisibility = CIdle::NewL(CActive::EPriorityStandard);
+
+    CCA_DP(KDetailsViewLogFile, CCA_L("iFocusedListIndex = %d"), iFocusedListIndex);
+
+    CCA_DP(KDetailsViewLogFile, CCA_L("<<< CCCAppDetailsViewPlugin::ConstructL()"));
+}
+
+// ---------------------------------------------------------------------------
+// CCCAppDetailsViewPlugin::PreparePluginViewL
+// ---------------------------------------------------------------------------
+//
+void CCCAppDetailsViewPlugin::PreparePluginViewL(
+    MCCAppPluginParameter& /*aPluginParameter*/)
+{
+
+    PrepareViewResourcesL();
+
+    // Get the PBK2AppServices
+    CPbk2ApplicationServices& pbk2AppServices = GetPbk2AppServicesL();
+
+    if (AppEngine())
+    {
+        AppEngine()->AddObserverL(*this);
+    }
+    CPbk2StoreManager& storeManager = pbk2AppServices.StoreManager();
+    storeManager.RegisterStoreEventsL(*this);
+    storeManager.OpenStoresL();
+
+    iSchedulerWait.Start();
+
+    BaseConstructL(R_CCAPPDETAILSVIEW_MAINVIEW);
+}
+
+// ---------------------------------------------------------------------------
+// CCCAppDetailsViewPlugin::ProvideBitmapL
+// ---------------------------------------------------------------------------
+//
+void CCCAppDetailsViewPlugin::ProvideBitmapL(
+    TCCAppIconType aIconType, CAknIcon& aIcon)
+{
+    if (ECCAppTabIcon == aIconType)
+    {
+        CFbsBitmap* bmp = NULL;
+        CFbsBitmap* bmpMask = NULL;
+
+        AknsUtils::CreateIconL(
+            AknsUtils::SkinInstance(),
+            KAknsIIDDefault,//todo; get a proper skin
+            bmp,
+            bmpMask,
+            KCCAppDetailsViewIconFileName,
+            EMbmCcappdetailsviewpluginQgn_prop_contact_detail_tab2,
+            EMbmCcappdetailsviewpluginQgn_prop_contact_detail_tab2_mask);
+
+        aIcon.SetBitmap(bmp);
+        aIcon.SetMask(bmpMask);
+    }
+}
+
+// ---------------------------------------------------------------------------
+// CCCAppDetailsViewPlugin::NewContainerL
+// ---------------------------------------------------------------------------
+//
+void CCCAppDetailsViewPlugin::NewContainerL()
+{
+    iContainer = new(ELeave) CCCAppDetailsViewContainer(Id(), *this);
+
+    // Get the PBK2AppServices
+    CPbk2ApplicationServices& pbk2AppServices = GetPbk2AppServicesL();
+
+    static_cast<CCCAppDetailsViewContainer*>
+        (iContainer)->SetApplicationServices(&pbk2AppServices);
+}
+
+// --------------------------------------------------------------------------
+// CCCAppDetailsViewPlugin::HandleStatusPaneSizeChange
+// --------------------------------------------------------------------------
+//
+void CCCAppDetailsViewPlugin::HandleStatusPaneSizeChange()
+{
+    // Resize the container to fill the client rectangle
+    if (iContainer)
+    {
+        iContainer->SetRect(ClientRect());
+    }
+}
+
+// ---------------------------------------------------------------------------
+// CCCAppDetailsViewPlugin::DynInitMenuPaneL
+// ---------------------------------------------------------------------------
+//
+void CCCAppDetailsViewPlugin::DynInitMenuPaneL(TInt aResourceId,
+    CEikMenuPane* aMenuPane)
+{
+    EnsureMenuHandlerCreatedL();
+    iMenuHandler->DynInitMenuPaneL(aResourceId, aMenuPane);
+}
+
+// ---------------------------------------------------------------------------
+// CCCAppDetailsViewPlugin::EnsureMenuHandlerCreatedL
+// ---------------------------------------------------------------------------
+//
+void CCCAppDetailsViewPlugin::EnsureMenuHandlerCreatedL()
+{
+    if (!iMenuHandler)
+    {
+        iMenuHandler = CCCAppDetailsViewMenuHandler::NewL(*this);
+        iMenuHandler->SetAppEngine(AppEngine());
+    }
+}
+
+// ---------------------------------------------------------------------------
+// CCCAppDetailsViewPlugin::HandleEditRequestL
+// ---------------------------------------------------------------------------
+//
+void CCCAppDetailsViewPlugin::HandleEditRequestL()
+{
+    /* Note: We do not need to check if contact is editable, as this is called
+     * from CCCAppDetailsViewListBoxModel::HandleEditRequestL(), which checks
+     * if the contact is editable or not.
+     */
+    EnsureMenuHandlerCreatedL();
+    iMenuHandler->HandleCommandL(ECCAppDetailsViewEditItemCmd);
+}
+
+// ---------------------------------------------------------------------------
+// CCCAppDetailsViewPlugin::HandleDeleteRequestL
+// ---------------------------------------------------------------------------
+//
+void CCCAppDetailsViewPlugin::HandleDeleteRequestL()
+{
+    /* Note: We do not need to check if contact is editable, as this is called
+     * from CCCAppDetailsViewListBoxModel::HandleDeleteRequestL(), which checks
+     * if the contact is editable or not.
+     */
+    EnsureMenuHandlerCreatedL();
+    iMenuHandler->HandleCommandL(ECCAppDetailsViewDeleteCmd);
+}
+
+// ---------------------------------------------------------------------------
+// CCCAppDetailsViewPlugin::HandleCommandL
+// ---------------------------------------------------------------------------
+//
+void CCCAppDetailsViewPlugin::HandleCommandL(TInt aCommand)
+{
+    // CCApp handles the "Exit"- and "Back"-commands,
+    // rest to menuhandler
+    CCCAppViewPluginAknView::HandleCommandL(aCommand);
+
+    if (iContainer)
+    {
+        iFocusedListIndex = static_cast<CCCAppDetailsViewContainer*>
+            (iContainer)->ListBoxModel().FocusedListIndex();
+    }
+
+    // Rest to menuhandler
+    EnsureMenuHandlerCreatedL();
+    iMenuHandler->HandleCommandL(aCommand);
+}
+
+// ---------------------------------------------------------------------------
+// CCCAppDetailsViewPlugin::Id
+// ---------------------------------------------------------------------------
+//
+TUid CCCAppDetailsViewPlugin::Id() const
+{
+    return TUid::Uid(KCCADetailsViewPluginImplmentationUid);
+}
+
+// ---------------------------------------------------------------------------
+// CCCAppDetailsViewPlugin::PrepareViewResourcesL
+// ---------------------------------------------------------------------------
+//
+void CCCAppDetailsViewPlugin::PrepareViewResourcesL()
+{
+    // preparing resources for use
+    TFileName fileName(KCCAppDetailsViewResourceFileName);
+    BaflUtils::NearestLanguageFile(iCoeEnv->FsSession(), fileName);
+    iResourceLoader.OpenL(fileName);
+}
+
+// ---------------------------------------------------------------------------
+// CCCAppDetailsViewPlugin::DoActivateL
+// ---------------------------------------------------------------------------
+//
+void CCCAppDetailsViewPlugin::DoActivateL(
+    const TVwsViewId& aPrevViewId,
+    TUid aCustomMessageId,
+    const TDesC8& aCustomMessage)
+{
+    CCCAppViewPluginAknView::DoActivateL(aPrevViewId, aCustomMessageId,
+        aCustomMessage);
+
+    GetContactDataL();
+
+    static_cast<CCCAppDetailsViewContainer*>
+        (iContainer)->SetAppEngine(AppEngine());
+
+    if ( iMenuHandler != NULL )
+        {
+        iMenuHandler->Activate();
+        }
+    
+    if ( iContactorService == NULL )
+        {
+        iContactorService = CCAContactorService::NewL();
+        }
+}
+
+// ---------------------------------------------------------------------------
+// CCCAppDetailsViewPlugin::DoDeactivate
+// ---------------------------------------------------------------------------
+//
+void CCCAppDetailsViewPlugin::DoDeactivate()
+{
+    if (iContainer)
+    {
+        iFocusedListIndex = static_cast<CCCAppDetailsViewContainer*>
+            (iContainer)->ListBoxModel().FocusedListIndex();
+    }
+
+    if ( iMenuHandler != NULL )
+        {
+        iMenuHandler->Reset();
+        }
+
+    CCCAppViewPluginAknView::DoDeactivate();
+}
+
+// --------------------------------------------------------------------------
+// CCCAppDetailsViewPlugin::GetContactDataL
+// --------------------------------------------------------------------------
+//
+void CCCAppDetailsViewPlugin::GetContactDataL()
+{
+    CCA_DP(KDetailsViewLogFile, CCA_L(">>> CCCAppDetailsViewPlugin::GetContactDataL()"));
+
+    if (iContainer)    
+    {        
+        // Get the PBK2AppServices
+        CPbk2ApplicationServices& pbk2AppServices = GetPbk2AppServicesL();
+
+        HBufC8* contactLinkArrayDes = iCmsWrapper->ContactIdentifierLC();        
+        CVPbkContactLinkArray* links = CVPbkContactLinkArray::NewLC(*contactLinkArrayDes,
+            pbk2AppServices.ContactManager().ContactStoresL());
+
+        CCA_DP(KDetailsViewLogFile, CCA_L("iFocusedListIndex = %d"), iFocusedListIndex);
+        
+        
+        static_cast<CCCAppDetailsViewContainer*>
+            (iContainer)->ListBoxModel().SetLinks(links); // takes ownership of links.
+        CleanupStack::Pop(links); 
+        CleanupStack::PopAndDestroy(contactLinkArrayDes);
+        
+        static_cast<CCCAppDetailsViewContainer*>
+            (iContainer)->ListBoxModel().SetInitialFocusIndex(iFocusedListIndex);
+        iContainer->DrawDeferred();
+    }
+
+    CCA_DP(KDetailsViewLogFile, CCA_L("<<< CCCAppDetailsViewPlugin::GetContactDataL()"));
+}
+
+// --------------------------------------------------------------------------
+// CCCAppDetailsViewPlugin::OpenComplete
+// --------------------------------------------------------------------------
+//
+void CCCAppDetailsViewPlugin::OpenComplete()
+{
+    if (iSchedulerWait.IsStarted())
+    {
+        iSchedulerWait.AsyncStop();
+    }
+}
+
+// --------------------------------------------------------------------------
+// CCCAppDetailsViewPlugin::StoreReady
+// --------------------------------------------------------------------------
+//
+void CCCAppDetailsViewPlugin::StoreReady(MVPbkContactStore& /*aContactStore*/)
+{
+    if (iSchedulerWait.IsStarted())
+    {
+        iSchedulerWait.AsyncStop();
+    }
+}
+
+// --------------------------------------------------------------------------
+// CCCAppDetailsViewPlugin::StoreUnavailable
+// --------------------------------------------------------------------------
+//
+void CCCAppDetailsViewPlugin::StoreUnavailable(
+    MVPbkContactStore& /*aContactStore*/,
+    TInt /*aReason*/)
+{
+    if (iSchedulerWait.IsStarted())
+    {
+        iSchedulerWait.AsyncStop();
+    }
+}
+
+// --------------------------------------------------------------------------
+// CCCAppDetailsViewPlugin::HandleStoreEventL
+// --------------------------------------------------------------------------
+//
+void CCCAppDetailsViewPlugin::HandleStoreEventL(
+    MVPbkContactStore& /*aContactStore*/,
+    TVPbkContactStoreEvent aStoreEvent)
+{
+    if (iSchedulerWait.IsStarted())
+    {
+        iSchedulerWait.AsyncStop();
+    }
+
+    switch (aStoreEvent.iEventType)
+    {
+    case TVPbkContactStoreEvent::EContactChanged:
+        GetContactDataL();
+        break;
+
+    case TVPbkContactStoreEvent::EContactDeleted:
+        break;
+
+    default:
+        break;
+    }
+}
+
+// ---------------------------------------------------------------------------
+// CCCAppDetailsViewPlugin::SetTitleL
+// ---------------------------------------------------------------------------
+//
+void CCCAppDetailsViewPlugin::SetTitleL(const TDesC& aTitle)
+{
+    // Forward the SetTitleL-call to base-class
+    CCCAppViewPluginAknView::SetTitleL(aTitle);
+}
+
+// ---------------------------------------------------------------------------
+// CCCAppDetailsViewPlugin::CheckVisibilityL
+// ---------------------------------------------------------------------------
+//
+TBool CCCAppDetailsViewPlugin::CheckVisibilityL(MCCAppPluginParameter& /*aPluginParameter*/)
+{    
+    // Start checking the visibility of this plugin in the background
+    CheckVisibilityInBackgroundL();
+    return iVisible;
+}
+
+// ---------------------------------------------------------------------------
+// CCCAppDetailsViewPlugin::CCCAppViewPluginBaseExtension
+// ---------------------------------------------------------------------------
+//
+TAny* CCCAppDetailsViewPlugin::CCCAppViewPluginBaseExtension( TUid aExtensionUid )
+    {
+    if ( aExtensionUid == KMCCAppViewPluginBaseExtension2Uid )
+        {
+        return static_cast<MCCAppViewPluginBase2*>( this );
+        }
+    return NULL;
+    }
+
+// --------------------------------------------------------------------------
+// CCCAppDetailsViewPlugin::UpdateMSKinCbaL
+// Sets CBA with empty MSK or MSK with text "Edit" when contact is editable.
+// --------------------------------------------------------------------------
+//
+void CCCAppDetailsViewPlugin::UpdateMSKinCbaL(TBool aEditable)
+{
+    CEikButtonGroupContainer* cba = Cba();
+
+    if (cba)
+    {
+        cba->SetCommandSetL(aEditable
+            ? R_CCAPPDETAILSVIEW_SOFTKEYS_OPTIONS_BACK_EDIT
+            : R_CCAPPDETAILSVIEW_SOFTKEYS_OPTIONS_BACK_EMPTY);
+
+        cba->DrawDeferred();
+    }
+}
+
+// ---------------------------------------------------------------------------
+// CCCAppDetailsViewPlugin::CheckValidityOfContactInfoL
+// ---------------------------------------------------------------------------
+//
+void CCCAppDetailsViewPlugin::CheckValidityOfContactInfoL()
+{
+   TBool validContact = EFalse;   
+   HBufC8* contactLinkArrayDes = iCmsWrapper->ContactIdentifierLC();   
+
+   if (contactLinkArrayDes)
+   {
+       // Get the PBK2AppServices
+       CPbk2ApplicationServices& pbk2AppServices = GetPbk2AppServicesL();
+       CVPbkContactLinkArray* contactLinkArray = CVPbkContactLinkArray::NewLC(*contactLinkArrayDes,
+           pbk2AppServices.ContactManager().ContactStoresL());       
+       if (contactLinkArray->Count())
+       {
+           // Valid contact
+           validContact = ETrue;           
+       }       
+       CleanupStack::PopAndDestroy(contactLinkArray);
+   }
+   CleanupStack::PopAndDestroy(contactLinkArrayDes);   
+   
+    if (validContact)
+    {
+        MakeMeVisibleL();
+    }
+}
+
+// ---------------------------------------------------------------------------
+// CCCAppDetailsViewPlugin::CheckVisibilityInBackgroundL
+// ---------------------------------------------------------------------------
+//
+void CCCAppDetailsViewPlugin::CheckVisibilityInBackgroundL()
+{
+    // Start checking the visibility of this plugin in the background
+    if (!iBgTaskForCheckingVisibility->IsActive())
+    {
+        iBgTaskForCheckingVisibility->Start(TCallBack(CheckVisibilityCallbackL , this));
+    }
+}
+
+// ---------------------------------------------------------------------------
+// CCCAppDetailsViewPlugin::CheckVisibilityCallbackL
+// ---------------------------------------------------------------------------
+//
+
+TInt CCCAppDetailsViewPlugin::CheckVisibilityCallbackL(TAny* aContainer)
+{
+    CCCAppDetailsViewPlugin* container = static_cast<CCCAppDetailsViewPlugin*>(aContainer);
+    container->CheckValidityOfContactInfoL();
+    return KErrNone;
+}
+
+
+// ---------------------------------------------------------------------------
+// CCCAppDetailsViewPlugin::MakeMeVisibleL
+// ---------------------------------------------------------------------------
+//
+void CCCAppDetailsViewPlugin::MakeMeVisibleL()
+{
+    // Set this plugin as visible
+    iVisible = ETrue;
+    // Call the below API to make yourself visible in the CCA Tabs
+    ShowPluginL();
+}
+
+
+// ---------------------------------------------------------------------------
+// CCCAppDetailsViewPlugin::GetPbk2AppServicesL
+// ---------------------------------------------------------------------------
+//
+CPbk2ApplicationServices& CCCAppDetailsViewPlugin::GetPbk2AppServicesL()
+{
+    // create only if iAppServices is NULL
+    if (!iAppServices)
+    {
+        //Required for creating the instance of CPbk2ApplicationServices
+        iCommandsResourceFile.OpenL(
+            KPbk2RomFileDrive, KDC_RESOURCE_FILES_DIR, KPbk2CommandsDllResFileName);
+        iUiControlsResourceFile.OpenL(
+            KPbk2RomFileDrive, KDC_RESOURCE_FILES_DIR, KPbk2UiControlsDllResFileName);
+        iCommonUiResourceFile.OpenL(
+            KPbk2RomFileDrive, KDC_RESOURCE_FILES_DIR, KPbk2CommonUiDllResFileName);
+
+        iAppServices = CPbk2ApplicationServices::InstanceL();
+    }
+
+    return *iAppServices;
+}
+
+// ---------------------------------------------------------------------------
+// CCCAppDetailsViewPlugin::NotifyPluginOfContactEventL
+// ---------------------------------------------------------------------------
+//
+void  CCCAppDetailsViewPlugin::NotifyPluginOfContactEventL()
+{
+    //If a contact has e.g. relocated from sim to phone memory we need to
+	//continue using relocated contact instead of old
+    iCmsWrapper->RefetchContactL();
+}
+
+// ---------------------------------------------------------------------------
+// CCCAppDetailsViewPlugin::ContactorService()
+// ---------------------------------------------------------------------------
+//
+CCAContactorService* CCCAppDetailsViewPlugin::ContactorService()
+    {
+    return iContactorService;
+    }
+
+// ---------------------------------------------------------------------------
+// CCCAppDetailsViewPlugin::PluginBusy()
+// ---------------------------------------------------------------------------
+//
+TBool CCCAppDetailsViewPlugin::PluginBusy()
+    {
+    TBool ret = EFalse;
+    
+    if ( iContactorService != NULL )
+       {
+       ret = iContactorService->IsBusy();
+       }
+    return ret;
+    }
+
+
+// End of File