uifw/AvKon/src/AknSettingCache.cpp
changeset 0 2f259fa3e83a
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/uifw/AvKon/src/AknSettingCache.cpp	Tue Feb 02 01:00:49 2010 +0200
@@ -0,0 +1,375 @@
+/*
+* Copyright (c) 2002-2006 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 cache contains certain system settings that are regularly
+*                needed in UI controls.
+*                AknEnv owns an instance of the cache.
+*                Values of the cached settings are initialized when read for the
+*                first time.
+*                CEikAppUi updates the cache before forwarding change events
+*                to application controls, which can then read them from cache.
+*
+*
+*/
+
+
+// INCLUDE FILES
+#include <e32svr.h>
+#include "AknSettingCache.h"
+#include "AknPanic.h"
+#include <AknUtils.h>
+
+#include <e32property.h>
+#include <UikonInternalPSKeys.h>    // KUikLayoutState, KUikPreferredOrientation
+
+#include <centralrepository.h>
+#include <AvkonInternalCRKeys.h>    // KAknLayoutId
+#include <AknFepInternalCRKeys.h>   // KAknFepInputTxtLang
+
+#include <eikdef.h> // event UIDs
+#include <languages.hrh>
+#include <AknDef.h>
+#include "AknDebug.h"
+
+#include <featmgr.h>
+// CONSTANTS
+
+// ============================ MEMBER FUNCTIONS ===============================
+
+// -----------------------------------------------------------------------------
+// CAknSettingCache::NewL()
+// -----------------------------------------------------------------------------
+//
+CAknSettingCache* CAknSettingCache::NewL()
+    {
+    return new(ELeave) CAknSettingCache;
+    }
+
+// -----------------------------------------------------------------------------
+// CAknSettingCache::~CAknSettingCache()
+// -----------------------------------------------------------------------------
+//
+CAknSettingCache::~CAknSettingCache()
+    {
+    iPlugins.Reset();
+    }
+
+// -----------------------------------------------------------------------------
+// CAknSettingCache::InputLanguage()
+// -----------------------------------------------------------------------------
+//
+EXPORT_C TLanguage CAknSettingCache::InputLanguage()
+    {
+    if (!(iFlags & EInputLanguage))
+        {
+        UpdateFromCenRep(KCRUidAknFep, KAknFepInputTxtLang, (TInt&)iInputLanguage, EInputLanguage);
+        }
+
+    return iInputLanguage;
+    }
+
+// -----------------------------------------------------------------------------
+// CAknSettingCache::LayoutId()
+// -----------------------------------------------------------------------------
+//
+EXPORT_C TAknLayoutId CAknSettingCache::LayoutId()
+    {
+    if (!(iFlags & ELayoutId))
+        {
+        UpdateFromCenRep(KCRUidAvkon, KAknLayoutId, (TInt&)iLayoutId, ELayoutId);
+        }
+
+    return iLayoutId;
+    }
+
+// -----------------------------------------------------------------------------
+// CAknSettingCache::HardwareLayoutState()
+// -----------------------------------------------------------------------------
+//
+EXPORT_C TInt CAknSettingCache::HardwareLayoutState()
+    {
+    if (!(iFlags & EHardwareLayout))
+        {
+        UpdateFromPubSub(KPSUidUikon, KUikLayoutState, (TInt&)iHardwareLayout, EHardwareLayout);
+        }
+
+    return iHardwareLayout;
+    }
+
+// -----------------------------------------------------------------------------
+// CAknSettingCache::PreferredOrientation()
+// -----------------------------------------------------------------------------
+//
+EXPORT_C TInt CAknSettingCache::PreferredOrientation()
+    {
+    if (!(iFlags & EPreferredOrientation))
+        {
+        UpdateFromPubSub(KPSUidUikon, KUikPreferredOrientation,
+            (TInt&)iPreferredOrientation, EPreferredOrientation);
+        }
+        
+    return iPreferredOrientation;
+    }
+
+// -----------------------------------------------------------------------------
+// CAknSettingCache::GlobalUiZoom()
+// -----------------------------------------------------------------------------
+//
+EXPORT_C TAknUiZoom CAknSettingCache::GlobalUiZoom()
+    {
+    if (!(iFlags & EGlobalUiZoom))
+        {
+        UpdateFromCenRep(KCRUidAvkon, KAknGlobalUiZoom, (TInt&)iGlobalUiZoom, EGlobalUiZoom);
+        }
+
+    return iGlobalUiZoom;
+    }
+
+
+// -----------------------------------------------------------------------------
+// CAknSettingCache::Update()
+// -----------------------------------------------------------------------------
+//
+EXPORT_C TBool CAknSettingCache::Update(TInt aEventId)
+    {
+    TBool changed(EFalse);
+
+    switch (aEventId)
+        {
+        case KEikInputLanguageChange:
+            {
+            changed = UpdateFromCenRep(KCRUidAknFep, KAknFepInputTxtLang, (TInt&)iInputLanguage, EInputLanguage);
+            break;
+            }
+
+        case KEikDynamicLayoutVariantSwitch:
+            {
+            changed = UpdateFromCenRep(KCRUidAvkon, KAknLayoutId, (TInt&)iLayoutId, ELayoutId);
+            changed |= UpdateFromCenRep(KCRUidAvkon, KAknGlobalUiZoom, (TInt&)iGlobalUiZoom, EGlobalUiZoom);
+            break;
+            }
+
+        case KAknHardwareLayoutSwitch:
+            {
+            changed = UpdateFromPubSub(KPSUidUikon, KUikLayoutState, (TInt&)iHardwareLayout, EHardwareLayout);            
+            changed |= UpdateFromPubSub(KPSUidUikon, KUikPreferredOrientation, (TInt&)iPreferredOrientation, EPreferredOrientation);
+            break;
+            }
+
+        default:
+            {
+            break;
+            }
+        }
+
+    // only listen to the topmost plugin for a given event
+    TBool topMost = ETrue;
+    // search in reverse order, as most recent registrations take precedence
+    TInt count = iPlugins.Count();
+    for(TInt ii = count - 1; ii >= 0; ii--)
+        {
+        MAknSettingCacheUpdatePlugin* pPlugin = iPlugins[ii];
+        if(pPlugin->HandlesEvent(aEventId))
+            {
+            // update all the plugins, as some or all of them may need to update some cached data
+            TBool updated = pPlugin->Update(aEventId);
+            if(topMost)
+                {
+                changed = updated;
+                topMost = EFalse;
+                }
+            }
+        }
+
+    return changed;
+    }
+
+// -----------------------------------------------------------------------------
+// CAknSettingCache::RegisterPlugin
+// -----------------------------------------------------------------------------
+EXPORT_C void CAknSettingCache::RegisterPluginL(MAknSettingCacheUpdatePlugin* aPlugin)
+    {
+    iPlugins.AppendL(aPlugin);
+    }
+
+// -----------------------------------------------------------------------------
+// CAknSettingCache::DeRegisterPlugin
+// -----------------------------------------------------------------------------
+EXPORT_C void CAknSettingCache::DeRegisterPlugin(MAknSettingCacheUpdatePlugin* aPlugin)
+    {
+    TInt index = iPlugins.Find(aPlugin);
+    if(index != KErrNotFound)
+        {
+        iPlugins.Remove(index);
+        }
+    }
+
+// -----------------------------------------------------------------------------
+// CAknSettingCache::PluginValue
+// -----------------------------------------------------------------------------
+EXPORT_C TInt CAknSettingCache::PluginValue(TInt aEventId, TInt& aValue)
+    {
+    // search in reverse order, as most recent registrations take precedence
+    TInt count = iPlugins.Count();
+    for(TInt ii = count - 1; ii >= 0; ii--)
+        {
+        MAknSettingCacheUpdatePlugin* pPlugin = iPlugins[ii];
+        if(pPlugin->HandlesEvent(aEventId))
+            {
+            // only listen to the topmost plugin for a given event
+            return pPlugin->GetValue(aEventId, aValue);
+            }
+        }
+    return KErrNotFound;
+    }
+
+// -----------------------------------------------------------------------------
+// CAknSettingCache::TransparencyEnabled()
+// -----------------------------------------------------------------------------
+//  
+EXPORT_C TBool CAknSettingCache::TransparencyEnabled()
+    {
+    if ( !( iFlags & ETransparencyEnabled ) )
+        {
+        UpdateFromCenRep( KCRUidAvkon, KAknAvkonTransparencyEnabled, 
+                          (TInt&)iTransparencyEnabled, ETransparencyEnabled );    
+        }
+    return iTransparencyEnabled == 1 ? ETrue : EFalse;      
+    }
+
+// -----------------------------------------------------------------------------
+// CAknSettingCache::CAknSettingCache()
+// -----------------------------------------------------------------------------
+//
+CAknSettingCache::CAknSettingCache() :
+    // default values used only in case INI-files do not exist
+    iInputLanguage(ELangEnglish), iLayoutId(EAknLayoutIdELAF), iGlobalUiZoom(EAknUiZoomAutomatic)
+    {
+    }
+
+// -----------------------------------------------------------------------------
+// CAknSettingCache::UpdateFromSharedData()
+// -----------------------------------------------------------------------------
+//
+TBool CAknSettingCache::UpdateFromPubSub(const TUid aUid, TUint32 aKey, TInt& aValue, TCacheFlag aFlag)
+    {
+    TBool changed = EFalse;
+    TInt newValue = 0;
+    
+    TInt err = RProperty::Get(aUid, aKey, newValue);
+    
+#ifdef AVKON_RDEBUG_INFO
+    RDebug::Print(_L("xxxx CAknSettingCache::UpdateFromPubSub err=%d value=%d"), err, newValue);
+#endif
+    
+    if (err == KErrNone)
+        {
+        // cache updated
+        iFlags |= aFlag;
+        
+        if (aValue != newValue)
+            {
+            changed = ETrue;
+            aValue = newValue;
+            }
+        }
+    
+    return changed;
+    }
+
+TBool CAknSettingCache::UpdateFromCenRep(const TUid aUid, TUint32 aKey, TInt& aValue, TCacheFlag aFlag)
+    {
+    CRepository* repository = NULL;
+    TBool changed = EFalse;
+    TInt newValue = 0;
+    
+    TRAPD(err, repository = CRepository::NewL(aUid));
+    
+    if (err == KErrNone)
+        {
+        err = repository->Get(aKey, newValue);
+        }
+    
+    // Special case: automatic detection of the layout ID
+    // based on UI language is done here.
+    
+    // Value -1 is used to indicate 'automatic' layout ID detection.
+    
+    if ((err == KErrNotFound || newValue == -1) &&
+        aUid == KCRUidAvkon &&
+        aKey == KAknLayoutId)
+        {
+        TLanguage uiLanguage = AknLangUtils::UserLanguage();
+        switch(uiLanguage)
+            {
+            case ELangArabic:
+            case ELangHebrew:
+            case ELangFarsi:
+            case ELangUrdu:
+                {
+                newValue = EAknLayoutIdABRW;
+                break;
+                }
+            case ELangTaiwanChinese:
+            case ELangHongKongChinese:
+            case ELangPrcChinese:
+            case ELangJapanese:
+            case KLangTaiwanEnglish:
+            case KLangHongKongEnglish:
+            case KLangPrcEnglish:
+            case KLangJapaneseEnglish:
+            case KLangApacMalay:
+            case KLangApacEnglish:
+            case KLangApacIndonesian:
+                {
+                newValue = EAknLayoutIdAPAC;
+                break;
+                }
+            default: // all others use ELAF. Thai moved to Elaf since 3.2 release.
+                {
+                if( FeatureManager::FeatureSupported(KFeatureIdAvkonApac) )
+                    { /* If APAC layout is enabled */
+                    newValue = EAknLayoutIdAPAC;
+                    }
+                else
+                    { /* Else ELAF */
+                newValue = EAknLayoutIdELAF;
+                    }
+                break;
+                }
+            }
+        
+        if (repository)
+            {
+            err = repository->Set(aKey, newValue);
+            }
+        }
+    
+    delete repository;
+    
+    if (err == KErrNone)
+        {
+        // cache updated
+        iFlags |= aFlag;
+        
+        if (aValue != newValue)
+            {
+            changed = ETrue;
+            aValue = newValue;
+            }
+        }
+    
+    return changed;
+    }
+
+//  End of File