idlehomescreen/nativeuicontroller/src/nativeuicontroller.cpp
changeset 0 f72a12da539e
child 4 4d54b72983ae
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/idlehomescreen/nativeuicontroller/src/nativeuicontroller.cpp	Thu Dec 17 08:40:49 2009 +0200
@@ -0,0 +1,1070 @@
+/*
+* Copyright (c) 2005-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:  Native UI controller.
+*
+*/
+
+// System includes
+#include <bautils.h>
+#include <e32std.h>
+#include <e32property.h>
+#include <coemain.h>
+#include <avkon.rsg>
+#include <ecom/ecom.h>
+#include <ecom/implementationproxy.h>
+#include <data_caging_path_literals.hrh>
+#include <centralrepository.h>
+#include <activeidle2domainpskeys.h>
+#include <aipspropertyobserver.h>
+#include <eikstart.h>
+#include <AknLayout2ScalableDef.h>
+#include <avkondomainpskeys.h>
+#include <AknDlgShut.h> 
+
+// User includes
+#include "nativeuicontroller.h"
+#include "ainativeui.hrh"
+#include "application.h"
+#include "appui.h"
+#include "aiutility.h"
+#include "aistrparser.h"
+#include "aidevicestatuscontentmodel.h"
+#include "aipropertyextension.h"
+#include "aistatuspanel.h"
+#include "ainativerenderer.h"
+#include "aititlepanerenderer.h"
+#include "ainavipanerenderer.h"
+#include "aidialogrenderer.h"
+#include "aisoftkeyrenderer.h"
+#include "ainotifierrenderer.h"
+#include "aitoolbarrenderer.h"
+#include "ainativeuiplugins.h"
+#include "activeidle2domaincrkeys.h"
+#include "aistatuspanetouchui.h"
+#include "ainativeuistrings.h" // string literals
+#include "aistrcnv.h"
+#include <aiscutplugindomaincrkeys.h>
+
+using namespace AiNativeUiController;
+
+// Constants
+_LIT( KResourceDrive, "Z:" );
+_LIT( KResourceFile, "ainativeui.rsc" );
+_LIT( KSettingsDummyData, "" );
+_LIT( KSettingsIdSeparator, "/" );
+_LIT( KSettings, "Settings" );
+
+const TInt KOneSecondInMicroS = 1000*1000;
+const TInt KAI2CrKeyIncrementBy2 = 2;
+
+#define KResourcePath KDC_APP_RESOURCE_DIR
+
+const TImplementationProxy KImplementationTable[] =
+    {
+    IMPLEMENTATION_PROXY_ENTRY(KImplementationUidNativeUiController, CNativeUiController::NewL)
+    };
+
+
+// ----------------------------------------------------------------------------
+// CNativeUiController::NewL()
+// ----------------------------------------------------------------------------
+//
+CNativeUiController* CNativeUiController::NewL()
+    {
+    CNativeUiController* self = new (ELeave) CNativeUiController;
+
+    CleanupStack::PushL( self );
+    
+    // Set Native UI Controller object to TLS for access in static
+    // CNativeUiController::NewApplication
+    User::LeaveIfError( Dll::SetTls( self ) );
+    CleanupStack::Pop( self );
+
+    return self;
+    }
+
+// ----------------------------------------------------------------------------
+// CNativeUiController::Exit()
+// ----------------------------------------------------------------------------
+//
+void CNativeUiController::Exit()
+    {
+    if ( iExitTimer )
+        {
+        iExitTimer->Cancel();
+        
+        iExitTimer->Start( 0, KOneSecondInMicroS,                       
+           TCallBack( ExitTimerCallBack, this ) );
+        }
+
+    }
+
+// ----------------------------------------------------------------------------
+// CNativeUiController::ExitTimerCallBack()
+// ----------------------------------------------------------------------------
+//
+TInt CNativeUiController::ExitTimerCallBack( TAny *aSelf )
+    {
+    CNativeUiController* self =
+        static_cast<CNativeUiController*>( aSelf );
+        
+    if ( self )
+        {
+        self->iExitTimer->Cancel();
+        self->PrepareToExit();
+        self->iAppUi->Exit();
+        }
+    
+    return KErrNone;
+    }
+
+// ----------------------------------------------------------------------------
+// CNativeUiController::~CNativeUiController()
+// ----------------------------------------------------------------------------
+//
+CNativeUiController::~CNativeUiController()
+    {
+    iPlugins.Close();
+
+    delete iExitTimer;
+
+    PrepareToExit();
+
+    // Reset TLS pointer to this set in NewL
+    Dll::SetTls( NULL );
+    }
+
+// ----------------------------------------------------------------------------
+// CNativeUiController::PrepareToExit()
+// ----------------------------------------------------------------------------
+//
+void CNativeUiController::PrepareToExit()
+    {
+    iRenderers.ResetAndDestroy();
+    
+    delete iStatusPanel;
+    iStatusPanel = NULL;
+    
+    Release( iIdleStatusObserver );
+    iIdleStatusObserver = NULL;
+    
+    Release( iKeylockStatusObserver );
+    iKeylockStatusObserver = NULL;
+	
+    Release( iExtHsPluginConfChange );
+	iExtHsPluginConfChange = NULL;
+	
+    //If we are not the
+    if( !iRunningAsMain && iResourceOffset > 0 )
+        {
+        iCoeEnv->DeleteResourceFile( iResourceOffset );
+        iResourceOffset = KErrNotFound;
+        }
+    }
+
+// ----------------------------------------------------------------------------
+// CNativeUiController::CNativeUiController()
+// ----------------------------------------------------------------------------
+//
+CNativeUiController::CNativeUiController() 
+    : iResourceOffset( KErrNotFound )
+    {
+    }
+
+// ----------------------------------------------------------------------------
+// CNativeUiController::AddRendererL()
+// ----------------------------------------------------------------------------
+//
+void CNativeUiController::AddRendererL( CAiNativeRenderer* aRenderer )
+    {
+    User::LeaveIfError( iRenderers.Append( aRenderer ) );
+    }
+
+// ----------------------------------------------------------------------------
+// CNativeUiController::RemoveRenderer()
+// ----------------------------------------------------------------------------
+//
+TBool CNativeUiController::RemoveRenderer( CAiNativeRenderer *aRenderer, 
+    TBool aDelete )
+    {
+    for ( TInt i = 0; i < iRenderers.Count(); i++ )
+        {
+        if ( aRenderer == iRenderers[i] )
+            {
+            if ( aDelete )
+                {
+                delete aRenderer;
+                }
+            iRenderers.Remove(i);
+    
+            return ETrue;
+            }
+        }
+    
+    return EFalse;
+    }
+
+// ----------------------------------------------------------------------------
+// CNativeUiController::ExitTimerCallBack()
+// ----------------------------------------------------------------------------
+//
+void CNativeUiController::DeleteToolbarRenderer()
+    {
+    if ( iToolbarRenderer )
+        {
+        RemoveRenderer( iToolbarRenderer );
+        delete iToolbarRenderer;
+        iToolbarRenderer = NULL;
+        }
+    }
+
+// ----------------------------------------------------------------------------
+// CNativeUiController::RecreateToolbarRendererL()
+// ----------------------------------------------------------------------------
+//
+TBool CNativeUiController::RecreateToolbarRendererL()
+    {
+    TBool created( EFalse );
+    // Remove the old renderer...
+    DeleteToolbarRenderer();
+
+    CAknToolbar* toolbar( iAvkonAppUi->CurrentFixedToolbar() );
+    // ...and create the new if there is an existing toolbar that
+    // we can use
+    if ( toolbar )
+        {
+        iToolbarRenderer = CAiToolbarRenderer::NewL( *iFwEventHandler, *toolbar);
+        AddRendererL( iToolbarRenderer );
+        created = ETrue;
+        }
+    
+    return created;
+    }
+
+
+// ----------------------------------------------------------------------------
+// CNativeUiController::DoPublish()
+// ----------------------------------------------------------------------------
+//
+template<class T>
+TInt CNativeUiController::DoPublish( MAiPropertyExtension& aPlugin,
+    TInt aContent, T& aData, TInt aIndex )
+    {
+    const TAiPublisherInfo* info( NULL );
+    
+    TRAP_IGNORE( info = aPlugin.PublisherInfoL() );
+       
+    if ( !info || info->iNamespace != KNativeUiNamespace )
+        {
+        return KErrNotSupported;
+        }
+    
+    const TInt count( iRenderers.Count() );
+    TInt err( KErrNone );
+    
+    for( TInt i( 0 ); i < count; i++ )
+        {
+        err = iRenderers[i]->Publish( aPlugin, aContent, aData, aIndex );
+
+        if( err == KErrNone )
+            {
+            //data published
+            return KErrNone;
+            }
+
+        if( err != KErrNotFound )
+            {
+            return err;
+            }
+        }
+    
+    return err;
+    }
+
+// ----------------------------------------------------------------------------
+// CNativeUiController::HandleIdleStateEvent()
+// ----------------------------------------------------------------------------
+//
+TInt CNativeUiController::HandleIdleStateEvent( TAny* aPtr )
+    {
+    CNativeUiController* self = 
+        reinterpret_cast< CNativeUiController* >( aPtr );
+
+    if( self )
+        {
+        TInt idleState = EPSAiBackground;
+        self->iIdleStatusObserver->Get( idleState );
+
+        const TInt count = self->iRenderers.Count();
+
+        if( idleState == EPSAiForeground )
+            {
+            for( TInt i( 0 ); i < count; i++ )
+                {
+                TRAP_IGNORE( self->iRenderers[i]->FocusObtainedL() );
+                }
+            }
+        else
+            {
+            for( TInt j( 0 ); j < count; j++ )
+                {
+                TRAP_IGNORE( self->iRenderers[j]->FocusLostL() );
+                }
+            }
+        }
+
+    return KErrNone;
+    }
+
+// ----------------------------------------------------------------------------
+// CNativeUiController::HandleKeylockStateEvent()
+// ----------------------------------------------------------------------------
+//
+TInt CNativeUiController::HandleKeylockStateEvent( TAny* aPtr )
+    {
+    CNativeUiController* self = 
+        reinterpret_cast< CNativeUiController* >( aPtr );
+
+    if( self )
+        {
+        TInt keylockState = EKeyguardNotActive;
+        self->iKeylockStatusObserver->Get( keylockState );
+
+        const TInt count = self->iRenderers.Count();
+
+        if( keylockState != EKeyguardNotActive )
+            {
+            TRAP_IGNORE(
+                // Run dialog shutter to shut any open dialogs
+                AknDialogShutter::ShutDialogsL( 
+                    *static_cast< CEikonEnv* >( CCoeEnv::Static() ) ); 
+                
+                TKeyEvent key;
+                key.iCode = 0;
+                key.iModifiers = 0;
+                key.iScanCode = EStdKeyNo;
+                CCoeEnv::Static()->SimulateKeyEventL( key, EEventKey );
+                );
+            
+            for( TInt i( 0 ); i < count; i++ )
+                {
+                TRAP_IGNORE( self->iRenderers[i]->KeylockEnabledL() );
+                }
+            }
+        else
+            {
+            for( TInt i( 0 ); i < count; i++ )
+                {
+                TRAP_IGNORE( self->iRenderers[i]->KeylockDisabledL() );
+                }
+            }
+        }
+    
+    return KErrNone;
+	}
+
+// ----------------------------------------------------------------------------
+// CNativeUiController::HandlePluginConfChange()
+// ----------------------------------------------------------------------------
+//
+TInt CNativeUiController::HandlePluginConfChange( TAny* aPtr )
+	{
+	CNativeUiController* self = 
+        reinterpret_cast< CNativeUiController* >( aPtr );
+
+    TInt value( 0 );
+    
+    RProperty::Get( KPSUidAiInformation, 
+        KActiveIdleExtHS_PluginConfChange, value );
+    
+    if( self && value )
+        {
+        self->iAppUi->ExtHSThemeChanged();
+        }
+    
+    return KErrNone;
+	}
+
+// ----------------------------------------------------------------------------
+// CNativeUiController::LoadUIDefinitionL()
+// ----------------------------------------------------------------------------
+//
+void CNativeUiController::LoadUIDefinitionL()
+    {
+    if ( iUiLoaded )
+        {
+        TInt count( iRenderers.Count() );
+    
+        for( TInt i( 0 ); i < count; i++ )
+            {
+            iRenderers[i]->LoadUIDefinitionL();
+            }
+        return;
+        }
+    
+    if ( !iExitTimer )
+        {
+        iExitTimer = CPeriodic::NewL( CActive::EPriorityStandard );
+        }
+    
+    // This method is called upon startup. We'll need to:
+    iRenderers.ResetAndDestroy();
+
+    if( !iStatusPanel )
+        {
+        // 2) Initialize status pane for publishing in general
+        iStatusPanel = CAiStatusPanel::NewL();
+        }
+
+    // 3) Create renderers that handle publishing to title pane...
+    AddRendererL( CAiTitlePaneRenderer::NewLC( *iStatusPanel ) );
+    CleanupStack::Pop();//CAiTitlePaneRenderer
+
+    // ...navi pane...
+    AddRendererL( CAiNaviPaneRenderer::NewLC( *iStatusPanel ) );
+    CleanupStack::Pop();//CAiNaviPaneRenderer
+
+    // ...dialogs and.
+    AddRendererL( CAiDialogRenderer::NewLC() );
+    CleanupStack::Pop();//CAiDialogRenderer
+
+    AddRendererL( CAiNotifierRenderer::NewLC() );
+    CleanupStack::Pop();//CAiNotifierRenderer
+
+    // ...touch ui.
+    AddRendererL( CAiStatusPaneTouchUi::NewLC( *iStatusPanel, *iFwEventHandler ) );
+    CleanupStack::Pop();//CAiStatusPaneTouchUi
+
+    if( iRunningAsMain )
+        {
+        AddRendererL( CAiSoftKeyRenderer::NewLC() );
+        CleanupStack::Pop();//CAiSoftKeyRenderer
+
+        // Toolbar shown only when we are not the main ui controller
+        DeleteToolbarRenderer();
+	    
+	    TRAP_IGNORE(
+	        iAppUi->StartL(); )
+        }
+
+    // We need to load the resource file here if we are not main controller.
+    // If we are the main controller the loading is done in appui
+    // Also the toolbar renderer is loaded here.
+    else
+        {
+        //Load resources file for resource publishing
+        TFullName resourceFile( KResourceDrive );
+        resourceFile.Append( KResourcePath );
+        resourceFile.Append( KResourceFile );
+        BaflUtils::NearestLanguageFile( CCoeEnv::Static()->FsSession(), resourceFile );
+        if( iCoeEnv && iResourceOffset == KErrNotFound )
+            {
+            iResourceOffset = iCoeEnv->AddResourceFileL( resourceFile );
+            }
+        // Create the toolbar renderer
+        RecreateToolbarRendererL();
+        }
+
+    // 4) Add an observer that informs us about the focus transition changes
+    if( !iIdleStatusObserver )
+        {
+        iIdleStatusObserver = AiUtility::CreatePSPropertyObserverL(
+                                    TCallBack( HandleIdleStateEvent, this ),
+                                    KPSUidAiInformation,
+                                    KActiveIdleState );
+        }
+    if( !iKeylockStatusObserver )
+        {
+        iKeylockStatusObserver = AiUtility::CreatePSPropertyObserverL(
+                                    TCallBack( HandleKeylockStateEvent, this ),
+                                    KPSUidAvkonDomain,
+                                    KAknKeyguardStatus );
+        }
+	if( !iExtHsPluginConfChange )
+		{
+		iExtHsPluginConfChange = AiUtility::CreatePSPropertyObserverL( 
+		                            TCallBack( HandlePluginConfChange, this ),
+       		                    	KPSUidAiInformation, 
+       		                    	KActiveIdleExtHS_PluginConfChange );
+		}
+	
+    iUiLoaded = ETrue;
+    }
+
+// ----------------------------------------------------------------------------
+// CNativeUiController::GetPluginsL()
+// ----------------------------------------------------------------------------
+//
+void CNativeUiController::GetPluginsL( RAiPublisherInfoArray& aPlugins )
+    {
+    iPlugins.Reset();
+    
+    if( iRunningAsMain )
+        {               
+        TAiPublisherInfo shortcutPublisherInfo;
+        shortcutPublisherInfo.iUid = KShortcutPluginUid;
+        shortcutPublisherInfo.iName.Copy( KShortcutPluginName );
+        shortcutPublisherInfo.iNamespace.Copy( KNativeUiNamespace );        
+    
+        User::LeaveIfError( iPlugins.Append( shortcutPublisherInfo ) );
+    
+        TAiPublisherInfo deviceStatusPublisherInfo;
+        deviceStatusPublisherInfo.iUid = KDeviceStatusPluginUid;
+        deviceStatusPublisherInfo.iName.Copy( KDeviceStatusPluginName );
+        deviceStatusPublisherInfo.iNamespace.Copy( KNativeUiNamespace );
+        
+        User::LeaveIfError( iPlugins.Append( deviceStatusPublisherInfo ) );
+    
+        TAiPublisherInfo profilePublisherInfo;
+        profilePublisherInfo.iUid = KProfilePluginUid;
+        profilePublisherInfo.iName.Copy( KProfilePluginName );
+        profilePublisherInfo.iNamespace.Copy( KNativeUiNamespace );
+        
+        User::LeaveIfError( iPlugins.Append( profilePublisherInfo ) );
+    
+        // Copy iPlugins to aPlugins
+        aPlugins.ReserveL( aPlugins.Count() + iPlugins.Count() );
+        
+        for( TInt i = 0; i < iPlugins.Count(); ++i )
+            {
+            aPlugins.Append( iPlugins[i] );
+            }
+        }
+    }
+
+// ----------------------------------------------------------------------------
+// CNativeUiController::GetSettingsL()
+// ----------------------------------------------------------------------------
+//
+void CNativeUiController::GetSettingsL( const TAiPublisherInfo& aPubInfo,
+    RAiSettingsItemArray& aSettings )
+    {
+    if ( aPubInfo.iNamespace != KNativeUiNamespace )
+        {
+        return;
+        }
+    
+    if( iRunningAsMain && aPubInfo.iUid == KShortcutPluginUid )        
+        {
+        RProperty::Set( KPSUidAiInformation, KActiveIdleExtHS_PluginConfChange, 0 );
+        
+        MAiPluginSettings* settings = AiUtility::CreatePluginSettingsL();
+        CleanupDeletePushL( settings );
+
+        MAiPluginSettingsItem& item = settings->AiPluginSettingsItem();
+        item.SetPublisherId( aPubInfo.iUid );
+
+        HBufC* appBuf;
+        appBuf = HBufC::NewLC( RProperty::KMaxPropertySize );
+        TPtr appPtr = appBuf->Des();
+        RProperty::Get( KPSUidAiInformation, KActiveIdleExtHS_LSKLocked, appPtr );
+        if( appPtr.Length() > 0 )
+            {
+            item.SetKey( KNativeUiKeyIdLockedLSK );
+            item.SetValueL( appPtr, EFalse );
+            }
+        else
+            {
+            item.SetKey( KNativeUiKeyIdLSK );
+            item.SetValueL( KAiLocalAppAppShell, EFalse );
+            }
+
+        // Append settings into array.
+        // This can not fail because space has been reserved.
+        aSettings.Append( settings );
+
+        CleanupStack::PopAndDestroy( appBuf );
+        appBuf = NULL;
+
+        CleanupStack::Pop( settings );
+
+        settings = AiUtility::CreatePluginSettingsL();
+        CleanupDeletePushL( settings );
+
+        MAiPluginSettingsItem& item2 = settings->AiPluginSettingsItem();
+        item2.SetPublisherId( aPubInfo.iUid );
+
+        HBufC* app2Buf;
+        app2Buf = HBufC::NewLC( RProperty::KMaxPropertySize );
+        TPtr app2Ptr = app2Buf->Des();
+        RProperty::Get( KPSUidAiInformation, KActiveIdleExtHS_RSKLocked, app2Ptr );
+        if( app2Ptr.Length() > 0 )
+            {
+            item2.SetKey( KNativeUiKeyIdLockedRSK );
+            item2.SetValueL( app2Ptr, EFalse );
+            }
+        else
+            {
+            item2.SetKey( KNativeUiKeyIdRSK );
+            item2.SetValueL( KAiLocalAppContacts, EFalse );
+            }
+        
+        // Append settings into array.
+        // This can not fail because space has been reserved.
+        aSettings.Append( settings );
+
+        CleanupStack::PopAndDestroy( app2Buf );
+        app2Buf = NULL;
+        
+        // In case there are settings in the cenrep the settings
+        // here are overwritten by them
+        GetSettingsFromCRL( aPubInfo, aSettings );
+        CleanupStack::Pop( settings );
+        }
+    }
+
+// ----------------------------------------------------------------------------
+// CNativeUiController::GetSettingsFromCRL()
+// ----------------------------------------------------------------------------
+//
+void CNativeUiController::GetSettingsFromCRL( const TAiPublisherInfo& aPubInfo,                            
+    RAiSettingsItemArray &aPluginSettings )
+    {
+    if ( aPubInfo.iNamespace != KNativeUiNamespace )
+        {
+        return;
+        }
+    
+    /*
+    * The settings are stored in the cenrep starting from 0x1000.
+    * 0x1000 is the name of the plugin which this setting belongs to (for example Settings/Shortcut)
+    * 0x1001 is the id of the setting (for example 1)
+    * 0x1002 is the value of the setting (for example localapp:0x012345678)
+    *
+    * So three keys per setting.
+    */
+
+    TUint32 crKey = KAIPluginSettingsKeyRangeStart;
+
+    TBool moreSettings = ETrue;
+
+    HBufC* pluginId = HBufC::NewLC(NCentralRepositoryConstants::KMaxUnicodeStringLength);
+    HBufC* settingValue = HBufC::NewLC(NCentralRepositoryConstants::KMaxUnicodeStringLength);
+    HBufC* settingKey = HBufC::NewLC(NCentralRepositoryConstants::KMaxUnicodeStringLength);
+
+    TPtr pluginIdPtr = pluginId->Des();
+    TPtr settingValuePtr = settingValue->Des();
+    TPtr settingKeyPtr = settingKey->Des();
+
+    TInt32 settingId = 0;
+
+    TInt err = KErrNone;
+    TBool settingFound = EFalse;
+
+    CRepository *settingsRepository = CRepository::NewLC( TUid::Uid( KCRUidActiveIdleLV ) );
+
+    while ( moreSettings )
+        {
+        settingFound = EFalse;
+
+        pluginIdPtr.Zero();
+        settingValuePtr.Zero();
+        settingKeyPtr.Zero();
+        //Get the name of plugin with the Settings/ prefix
+        err = settingsRepository->Get(crKey++, pluginIdPtr);
+
+        // remove the Settings/ prefix if it is located at the start of the string
+        if ( pluginIdPtr.FindC(KSettings) == 0 )
+            {
+
+            pluginIdPtr.Delete(0,
+                KSettingsIdSeparator().Length() +
+                KSettings().Length());
+            }
+
+        // does the setting belong to this plugin
+        if ( err == KErrNone && pluginIdPtr == aPubInfo.iName )
+            {
+            // Get the settings id
+            err = settingsRepository->Get(crKey++, settingKeyPtr);
+            if ( err == KErrNone )
+                {
+                err = AiUtility::ParseInt(settingId,settingKeyPtr);
+                }
+            if ( err == KErrNone )
+                {
+                // Get the actual value of the setting
+                err = settingsRepository->Get(crKey++, settingValuePtr);
+
+                // Ignore possible placeholder data in cenrep
+                if ( err == KErrNone && settingValuePtr.Compare( KSettingsDummyData ) != 0 )
+                    {
+                    // Try to find an existing setting for this
+                    for ( TInt j = 0; j < aPluginSettings.Count(); j++  )
+                        {
+                        MAiPluginSettings *setting = aPluginSettings[j];
+                        MAiPluginSettingsItem& item = setting->AiPluginSettingsItem();
+
+                        // Existing setting found => replace it
+                        if ( item.Key() == settingId && item.PublisherId() == aPubInfo.iUid )
+                            {
+                            item.SetValueL( settingValuePtr, EFalse );
+                            settingFound = ETrue;
+                            break;
+                            }
+                        }
+                    // Existing setting not found => append new one ONLY if we
+                    // are dealing with the icon overrides
+                    if ( !settingFound && ( settingId & KScutFlagBitIconOverride ) )
+                        {
+                        MAiPluginSettings* settings = AiUtility::CreatePluginSettingsL();
+                        CleanupDeletePushL( settings );
+                        MAiPluginSettingsItem& item = settings->AiPluginSettingsItem();
+
+                        item.SetPublisherId( aPubInfo.iUid );
+                        item.SetKey( settingId );
+                        item.SetValueL( settingValuePtr, EFalse );
+                        aPluginSettings.Append( settings );
+
+                        CleanupStack::Pop( settings );
+                        }
+                    }
+                }
+            }
+        // name of the plugin not found => no more settings
+        else if (err != KErrNone )
+            {
+            moreSettings = EFalse;
+
+            }
+        // not the correct setting for this plugin
+        else
+            {
+            crKey += KAI2CrKeyIncrementBy2;
+            }
+        }
+    
+    CleanupStack::PopAndDestroy(settingsRepository);
+    CleanupStack::PopAndDestroy(settingKey);
+    CleanupStack::PopAndDestroy(settingValue);
+    CleanupStack::PopAndDestroy(pluginId);
+    }
+
+// ----------------------------------------------------------------------------
+// CNativeUiController::ActivateUI()
+// ----------------------------------------------------------------------------
+//
+void CNativeUiController::ActivateUI()
+    {
+    if( iAppUi )
+        {        
+        TRAP_IGNORE( iAppUi->StartL() );            
+        }
+    }
+
+// ----------------------------------------------------------------------------
+// CNativeUiController::GetContentObserver()
+// ----------------------------------------------------------------------------
+//
+MAiContentObserver& CNativeUiController::GetContentObserver()
+    {
+    return *this;
+    }
+
+// ----------------------------------------------------------------------------
+// CNativeUiController::SetEventHandler()
+// ----------------------------------------------------------------------------
+//
+void CNativeUiController::SetEventHandler( MAiFwEventHandler& aEventHandler )
+    {
+    iFwEventHandler = &aEventHandler;
+    }
+
+// ----------------------------------------------------------------------------
+// CNativeUiController::FwEventHandler()
+// ----------------------------------------------------------------------------
+//
+MAiFwEventHandler* CNativeUiController::FwEventHandler()
+    {
+    return iFwEventHandler;
+    }
+
+// ----------------------------------------------------------------------------
+// CNativeUiController::RemovePluginFromUI()
+// ----------------------------------------------------------------------------
+//
+void CNativeUiController::RemovePluginFromUI( 
+    MAiPropertyExtension& /*aPlugin*/ )
+    {
+    }
+
+// ----------------------------------------------------------------------------
+// CNativeUiController::MainInterface()
+// ----------------------------------------------------------------------------
+//
+MAiMainUiController* CNativeUiController::MainInterface()
+    {
+    return this;
+    }
+
+// ----------------------------------------------------------------------------
+// CNativeUiController::SecondaryInterface()
+// ----------------------------------------------------------------------------
+//
+MAiSecondaryUiController* CNativeUiController::SecondaryInterface()
+    {
+    return this;
+    }
+
+// ----------------------------------------------------------------------------
+// CNativeUiController::RunApplicationL()
+// ----------------------------------------------------------------------------
+//
+void CNativeUiController::RunApplicationL()
+    {
+    VariateToMainUiController();
+
+    User::LeaveIfError(
+        EikStart::RunApplication( &CNativeUiController::NewApplication ) );
+    }
+
+// ----------------------------------------------------------------------------
+// CNativeUiController::CoeEnv()
+// ----------------------------------------------------------------------------
+//
+CCoeEnv& CNativeUiController::CoeEnv()
+    {
+    return *CCoeEnv::Static();
+    }
+
+// ----------------------------------------------------------------------------
+// CNativeUiController::SetUiFrameworkObserver()
+// ----------------------------------------------------------------------------
+//
+void CNativeUiController::SetUiFrameworkObserver( 
+    MAiUiFrameworkObserver& aObserver )
+    {
+    iUiFrameworkObserver = &aObserver;
+    }
+
+// ----------------------------------------------------------------------------
+// CNativeUiController::IsMenuOpen()
+// ----------------------------------------------------------------------------
+//
+TBool CNativeUiController::IsMenuOpen()
+    {
+    return CoeEnv().AppUi()->IsDisplayingMenuOrDialog();
+    }
+
+// ----------------------------------------------------------------------------
+// CNativeUiController::SetCoeEnv()
+// ----------------------------------------------------------------------------
+//
+void CNativeUiController::SetCoeEnv( CCoeEnv& aCoeEnv )
+    {
+    iCoeEnv = &aCoeEnv;
+    }
+
+// ----------------------------------------------------------------------------
+// CNativeUiController::UiFrameworkObserver()
+// ----------------------------------------------------------------------------
+//
+MAiUiFrameworkObserver* CNativeUiController::UiFrameworkObserver()
+    {
+    return iUiFrameworkObserver;
+    }
+
+// ----------------------------------------------------------------------------
+// CNativeUiController::HandleResourceChange()
+// ----------------------------------------------------------------------------
+//
+void CNativeUiController::HandleResourceChange( TInt /*aType*/ )
+    {
+    }
+
+// ----------------------------------------------------------------------------
+// CNativeUiController::HandleForegroundEvent()
+// ----------------------------------------------------------------------------
+//
+void CNativeUiController::HandleForegroundEvent( TBool /*aForeground*/ )
+    {
+    }
+
+// ----------------------------------------------------------------------------
+// CNativeUiController::StartTransaction()
+// ----------------------------------------------------------------------------
+//
+TInt CNativeUiController::StartTransaction( TInt /*aTxId*/ )
+    {
+    return KErrNone;
+    }
+
+// ----------------------------------------------------------------------------
+// CNativeUiController::Commit()
+// ----------------------------------------------------------------------------
+//
+TInt CNativeUiController::Commit( TInt /*aTxId*/ )
+    {
+    TInt result( KErrNone );
+    const TInt count( iRenderers.Count() );
+    
+    for( TInt i( 0 ); i < count; i++ )
+        {
+        TRAP( result, iRenderers[i]->TransactionCommittedL() );
+        }
+    
+    return result;
+    }
+
+// ----------------------------------------------------------------------------
+// CNativeUiController::CancelTransaction()
+// ----------------------------------------------------------------------------
+//
+TInt CNativeUiController::CancelTransaction( TInt /*aTxId*/ )
+    {
+    return KErrNone;
+    }
+
+// ----------------------------------------------------------------------------
+// CNativeUiController::CanPublish()
+// ----------------------------------------------------------------------------
+//
+TBool CNativeUiController::CanPublish( MAiPropertyExtension& aPlugin,
+    TInt /*aContent*/, TInt /*aIndex*/ )                                      
+    {    
+    const TAiPublisherInfo* info( NULL );
+    
+    TRAP_IGNORE( info = aPlugin.PublisherInfoL() );
+       
+    if ( !info || info->iNamespace != KNativeUiNamespace )
+        {
+        return EFalse;
+        }
+    
+    for( TInt i = 0; i < iPlugins.Count(); i++ )
+        {               
+        if ( iPlugins[i] == *info )
+            {
+            return ETrue;
+            }
+        }
+
+    return EFalse;
+    }
+
+// ----------------------------------------------------------------------------
+// CNativeUiController::Publish()
+// ----------------------------------------------------------------------------
+//
+TInt CNativeUiController::Publish( MAiPropertyExtension& aPlugin,
+    TInt aContent, TInt aResource, TInt aIndex )
+    {
+    TInt err = DoPublish( aPlugin, aContent, aResource, aIndex );
+    return err;
+    }
+
+// ----------------------------------------------------------------------------
+// CNativeUiController::Publish()
+// ----------------------------------------------------------------------------
+//
+TInt CNativeUiController::Publish( MAiPropertyExtension& aPlugin,
+    TInt aContent, const TDesC16& aText, TInt aIndex )        
+    {
+    TInt err = DoPublish( aPlugin, aContent, aText, aIndex );
+    return err;
+    }
+
+// ----------------------------------------------------------------------------
+// CNativeUiController::Publish()
+// ----------------------------------------------------------------------------
+//
+TInt CNativeUiController::Publish( MAiPropertyExtension& aPlugin,
+    TInt aContent, const TDesC8& aBuf, TInt aIndex )
+    {
+    TInt err = DoPublish( aPlugin, aContent, aBuf, aIndex );
+    return err;
+    }
+
+// ----------------------------------------------------------------------------
+// CNativeUiController::Publish()
+// ----------------------------------------------------------------------------
+//
+TInt CNativeUiController::Publish( MAiPropertyExtension& aPlugin,                                     
+    TInt aContent, RFile& aFile, TInt aIndex )                                   
+    {
+    TInt err = DoPublish( aPlugin, aContent, aFile, aIndex );
+    return err;
+    }
+
+// ----------------------------------------------------------------------------
+// CNativeUiController::Clean()
+// ----------------------------------------------------------------------------
+//
+TInt CNativeUiController::Clean( MAiPropertyExtension& aPlugin, 
+    TInt aContent, TInt /*aIndex*/ )
+    {
+    const TInt count( iRenderers.Count() ); 
+    
+    for( TInt i( 0 ); i < count; i++ )
+        {
+        iRenderers[i]->Clean( aPlugin, aContent );
+        }
+
+    return KErrNone;
+    }
+
+// ----------------------------------------------------------------------------
+// CNativeUiController::Extension()
+// ----------------------------------------------------------------------------
+//
+TAny* CNativeUiController::Extension( TUid /*aUid*/ )
+    {
+    return NULL;
+    }
+
+// ----------------------------------------------------------------------------
+// CNativeUiController::RequiresSubscription()
+// ----------------------------------------------------------------------------
+//
+TBool CNativeUiController::RequiresSubscription( 
+    const TAiPublisherInfo& aPublisherInfo ) const
+    {
+    if ( aPublisherInfo.iNamespace == KNativeUiNamespace )
+        {
+        // Targeted to this content renderer
+        return ETrue;
+        }
+    
+    return EFalse;
+    }
+
+// ----------------------------------------------------------------------------
+// CNativeUiController::NewApplication()
+// ----------------------------------------------------------------------------
+//
+CApaApplication* CNativeUiController::NewApplication()
+    {
+    CNativeUiController* self = 
+        static_cast< CNativeUiController* >( Dll::Tls() );
+  
+    return CApplication::New( self );
+    }
+
+// ----------------------------------------------------------------------------
+// CNativeUiController::VariateToMainUiController()
+// ----------------------------------------------------------------------------
+//
+void CNativeUiController::VariateToMainUiController()
+    {
+    iRunningAsMain = ETrue;
+    }
+
+// ======== GLOBAL FUNCTIONS ========
+EXPORT_C const TImplementationProxy* ImplementationGroupProxy( TInt& aTableCount )
+    {
+    aTableCount = sizeof( KImplementationTable ) / sizeof( TImplementationProxy );
+    return KImplementationTable;
+    }
+
+// End of File.