gssettingsuis/Gs/GSDisplayPlugin/Src/GSDisplayPluginModel.cpp
author Pat Downey <patd@symbian.org>
Wed, 01 Sep 2010 12:20:44 +0100
branchRCL_3
changeset 54 7e0eff37aedb
permissions -rw-r--r--
Revert incorrect RCL_3 drop: Revision: 201033 Kit: 201035

/*
* 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:  Display Settings model implementation.
*
*/


// INCLUDE FILES
#include "GSDisplayPluginModel.h"

#include <hal.h>
#include <e32math.h>
#include <featmgr.h>
#include <generalsettingsvariant.hrh>

#include <settingsinternalcrkeys.h>
#include <startupdomaincrkeys.h>
#include <ScreensaverInternalCRKeys.h>
#include <hwrmlightdomaincrkeys.h>
#include <coreapplicationuisdomainpskeys.h>
#include <AvkonInternalCRKeys.h> // for zooming
#include <AknDef.hrh>
#include "GsLogger.h"
#include "SettingsPrivateCRKeys.h"

// Used for OperatorLogo
#include <commdb.h>
#include <telephonydomainpskeys.h>
#include "GSDisplayPluginContainer.h"
#include "GsDisplayPlugin.hrh"

// EXTERNAL DATA STRUCTURES

// EXTERNAL FUNCTION PROTOTYPES

// CONSTANTS

// MACROS

// LOCAL CONSTANTS AND MACROS

// MODULE DATA STRUCTURES

// LOCAL FUNCTION PROTOTYPES

// FORWARD DECLARATIONS

// ============================= LOCAL FUNCTIONS ==============================

// ========================= MEMBER FUNCTIONS =================================

// ----------------------------------------------------------------------------
// CGSDisplayPluginModel::NewL
//
// Symbian OS two-phased constructor
// ----------------------------------------------------------------------------
//
CGSDisplayPluginModel* CGSDisplayPluginModel::NewL()
    {
    return CGSDisplayPluginModel::NewL( ETrue );
    }


// ----------------------------------------------------------------------------
// CGSDisplayPluginModel::NewL
//
// Symbian OS two-phased constructor
// ----------------------------------------------------------------------------
//
CGSDisplayPluginModel* CGSDisplayPluginModel::NewL( TBool aInitBackgroundApi )
    {
    CGSDisplayPluginModel* self = new( ELeave ) CGSDisplayPluginModel;
    CleanupStack::PushL( self );
    self->ConstructL( aInitBackgroundApi );

    CleanupStack::Pop( self );
    return self;
    }


// ----------------------------------------------------------------------------
// CGSDisplayPluginModel::CGSDisplayPluginModel
//
//
// C++ default constructor can NOT contain any code, that might leave.
// ----------------------------------------------------------------------------
//
CGSDisplayPluginModel::CGSDisplayPluginModel()
    {
    }


// ----------------------------------------------------------------------------
// CGSDisplayPluginModel::ConstructL
//
// EPOC default constructor can leave.
// ----------------------------------------------------------------------------
//
void CGSDisplayPluginModel::ConstructL( TBool aInitBackgroundApi )
    {
    //__GSENGINELOGSTRING("CGSDisplayPluginModel::ConstructL begin");
    FeatureManager::InitializeLibL();
    
    InitializeCentralRepositoryL();

    //Background image DLL initializing
    if( aInitBackgroundApi ) iBackgroundApi = CGSBackgroundImage::NewL();

    User::LeaveIfError( iGSVariationRepository->Get(
                        KSettingsVariationFlags, iLocalVariationValues ) );
    }


// ----------------------------------------------------------------------------
// CGSDisplayPluginModel::~CGSDisplayPluginModel
//
// Destructor
// ----------------------------------------------------------------------------
//
CGSDisplayPluginModel::~CGSDisplayPluginModel()
    {
    UninitializeCentralRepository();
    FeatureManager::UnInitializeLib();
    if( iBackgroundApi ) delete iBackgroundApi;
    }


// ----------------------------------------------------------------------------
// CGSDisplayPluginModel::InitializeCentralRepositoryL
//
// Creating and setting keys for the Central Repository
// ----------------------------------------------------------------------------
//
void CGSDisplayPluginModel::InitializeCentralRepositoryL()
    {
    iStartupConfRepository = CRepository::NewL( KCRUidStartupConf );
    iScreensaverRepository = CRepository::NewL( KCRUidScreenSaver );
    iPersonalizationRepository =
            CRepository::NewL( KCRUidPersonalizationSettings );
    iLightRepository = CRepository::NewL( KCRUidLightSettings );
    iSecurityRepository = CRepository::NewL( KCRUidSecuritySettings );
    iGSVariationRepository = CRepository::NewL( KCRUidSettingsVariation );
    iAvkonRepository = CRepository::NewL( KCRUidAvkon );
    
    // start listening to CenRep key changes for Operator Logo on/off
    iNotifyHandlerForOpLogo = CCenRepNotifyHandler::NewL( *this, 
                           *iPersonalizationRepository,
                           CCenRepNotifyHandler::EIntKey, 
                           KSettingsDisplayOperatorLogo );
    iNotifyHandlerForOpLogo->StartListeningL();
    iNotifyHandlerForOpLogoVisible = CCenRepNotifyHandler::NewL( *this, 
                           *iPersonalizationRepository,
                           CCenRepNotifyHandler::EIntKey, 
                           KSettingsShowOperatorLogoSetting );
    iNotifyHandlerForOpLogoVisible->StartListeningL();
    }

// ----------------------------------------------------------------------------
// CGSDisplayPluginModel::UninitializeCentralRepositoryL
//
// Removes Central Repository objects
// ----------------------------------------------------------------------------
//
void CGSDisplayPluginModel::UninitializeCentralRepository()
    {
    if ( iStartupConfRepository )
        {
        delete iStartupConfRepository;
        iStartupConfRepository = NULL;
        }
    if ( iScreensaverRepository )
        {
        delete iScreensaverRepository;
        iScreensaverRepository = NULL;
        }
    if ( iNotifyHandlerForOpLogo )
        {
        iNotifyHandlerForOpLogo->StopListening();
        delete iNotifyHandlerForOpLogo;
        }
    if ( iNotifyHandlerForOpLogoVisible )
        {
        iNotifyHandlerForOpLogoVisible->StopListening();
        delete iNotifyHandlerForOpLogoVisible;
        }
    if ( iPersonalizationRepository )
        {
        delete iPersonalizationRepository;
        iPersonalizationRepository = NULL;
        }
    if ( iLightRepository )
        {
        delete iLightRepository;
        iLightRepository = NULL;
        }
    if ( iGSVariationRepository )
        {
        delete iGSVariationRepository;
        iGSVariationRepository = NULL;
        }
    if ( iAvkonRepository )
        {
        delete iAvkonRepository;
        iAvkonRepository = NULL;
        }
    delete iSecurityRepository;
    iSecurityRepository = NULL;
    }


// ----------------------------------------------------------------------------
// CGSDisplayPluginModel::WelcomeNoteTypeL
//
// Returns user welcome note type.
// ----------------------------------------------------------------------------
//
TInt CGSDisplayPluginModel::WelcomeNoteTypeL()
    {
    TInt type;
    User::LeaveIfError( iStartupConfRepository->Get( KStartupWelcomeNoteType,
                                                     type ) );

    return type;
    }

// ----------------------------------------------------------------------------
// CGSDisplayPluginModel::SetWelcomeNoteTypeL
//
// Sets user welcome note type.
// ----------------------------------------------------------------------------
//
void CGSDisplayPluginModel::SetWelcomeNoteTypeL( const TInt aType )
    {
    User::LeaveIfError( iStartupConfRepository->
                        Set( KStartupWelcomeNoteType, aType ) );

    if ( aType != KGSWelcomeNoteTypeImage )
        {
        // It doesn't matter much if the image deletion fails,
        // so no need to handle the error.
        TRAP_IGNORE( iBackgroundApi->DeleteImageL( KGSWelcomeNoteImgPath ) );
        }
    }

// ----------------------------------------------------------------------------
// CGSDisplayPluginModel::GetWelcomeNoteTextL
//
// Reads welcome note text from shared data and returns it
// ----------------------------------------------------------------------------
//
void CGSDisplayPluginModel::WelcomeNoteTextL( TDes& aNote )
    {
    User::LeaveIfError( iStartupConfRepository->Get( KStartupWelcomeNoteText,
                                                     aNote ) );
    }

// ----------------------------------------------------------------------------
// CGSDisplayPluginModel::SetWelcomeNoteTextL
//
// Writes welcome note text to shared data
// ----------------------------------------------------------------------------
//
void CGSDisplayPluginModel::SetWelcomeNoteTextL( const TDesC& aNote )
    {
    User::LeaveIfError( iStartupConfRepository->Set( KStartupWelcomeNoteText,
                                                     aNote ) );
    }

// ----------------------------------------------------------------------------
// CGSDisplayPluginModel::ContrastL
//
// Returns contrast value.
// ----------------------------------------------------------------------------
//
TInt CGSDisplayPluginModel::ContrastL()
    {
    TInt contrast = 0;
#ifndef __WINS__
    if( HAL::Get( HAL::EDisplayContrast, contrast ) == KErrNotSupported )
        {
        return KErrNotSupported;
        }
#endif //__WINS__
    return contrast;
    }


// ----------------------------------------------------------------------------
// CGSDisplayPluginModel::SetContrastL
//
// sets contrast value.
// ----------------------------------------------------------------------------
//
void CGSDisplayPluginModel::SetContrastL( const TInt aContrast )
    {
#ifndef __WINS__
    __GSLOGSTRING1("[CGSDisplayPluginModel::SetContrastL(%d)]", aContrast );
    User::LeaveIfError( HAL::Set( HAL::EDisplayContrast, aContrast ) );
#endif //__WINS__
    }


// ----------------------------------------------------------------------------
// CGSDisplayPluginModel::ScreenSaverObjectL
//
// Returns screen saver mode.
// ----------------------------------------------------------------------------
//
TInt CGSDisplayPluginModel::ScreenSaverObjectL()
    {
    TInt object = KErrNone;

    User::LeaveIfError( iScreensaverRepository->Get( KScreenSaverObject,
                                                     object ) );

    return object;
    }

// ----------------------------------------------------------------------------
// CGSDisplayPluginModel::SetScreenSaverObjectL
//
// Sets screen saver mode.
// ----------------------------------------------------------------------------
//
void CGSDisplayPluginModel::SetScreenSaverObjectL( const TInt aObject )
    {
    User::LeaveIfError( iScreensaverRepository->Set( KScreenSaverObject,
                                                     aObject ) );
    }


// ----------------------------------------------------------------------------
// CGSDisplayPluginModel::GetScreenSaverTextL
//
// Reads screen saver text from shared data and returns it.
// ----------------------------------------------------------------------------
//
void CGSDisplayPluginModel::GetScreenSaverTextL( TDes& aText )
    {
    User::LeaveIfError( iScreensaverRepository->Get( KScreenSaverText,
                                                     aText ) );
    }

// ----------------------------------------------------------------------------
// CGSDisplayPluginModel::SetScreenSaverTextL
//
// Writes screen saver text to shared data.
// ----------------------------------------------------------------------------
//
void CGSDisplayPluginModel::SetScreenSaverTextL( const TDesC& aText )
    {
    User::LeaveIfError( iScreensaverRepository->Set( KScreenSaverText,
                                                     aText ) );
    }


// ----------------------------------------------------------------------------
// CGSDisplayPluginModel::ScreenSaverAndKeyguardPeriodL
//
// Reads screen saver period from shared data and returns it.
// ----------------------------------------------------------------------------
//
TInt CGSDisplayPluginModel::ScreenSaverAndKeyguardPeriodL()
    {
    TInt period = KGSSettingOff;
    User::LeaveIfError( iSecurityRepository->
            Get( KSettingsAutomaticKeyguardTime, period ) );

    // period is stored in seconds, but the user setting is in minutes
    return period / 60;
    }

// ----------------------------------------------------------------------------
// CGSDisplayPluginModel::SetScreenSaverAndKeyguardPeriodL
//
// Writes screen saver text to shared data.
// ----------------------------------------------------------------------------
//
void CGSDisplayPluginModel::SetScreenSaverAndKeyguardPeriodL( const TInt aPeriod )
    {
    // value is in minutes but keyguard uses seconds
    User::LeaveIfError( iSecurityRepository->
            Set( KSettingsAutomaticKeyguardTime, aPeriod * 60 ) );
    }


// ----------------------------------------------------------------------------
// CGSDisplayPluginModel::BacklightPeriodL
//
// Reads backlight timeout value from shared data and returns it.
// ----------------------------------------------------------------------------
//
TInt CGSDisplayPluginModel::BacklightPeriodL()
    {
    TInt period = KGSSettingOff;
    User::LeaveIfError( iLightRepository->
                Get( KDisplayLightsTimeout, period ) );

    return period;
    }

// ----------------------------------------------------------------------------
// CGSDisplayPluginModel::SetBacklightPeriodL
//
// Writes new backlight timeout value to shared data.
// ----------------------------------------------------------------------------
//
void CGSDisplayPluginModel::SetBacklightPeriodL( const TInt aPeriod )
    {
    __GSLOGSTRING1("[CGSDisplayPluginModel::SetBacklightPeriodL(%d)]", aPeriod );
    User::LeaveIfError( iLightRepository->
            Set( KDisplayLightsTimeout, aPeriod ) );
    }


// ----------------------------------------------------------------------------
// CGSDisplayPluginModel::AmbientLightSensorL
//
// Returns Ambient Light Sensor value.
// ----------------------------------------------------------------------------
//
TInt CGSDisplayPluginModel::AmbientLightSensorL()
    {
    TInt ret;
    User::LeaveIfError( iLightRepository->Get( KLightSensorSensitivity,
                                               ret ) );

    return ScaleLightSensorValues( ret, ETrue );
    }


// ----------------------------------------------------------------------------
// CGSDisplayPluginModel::SetAmbientLightSensorL
//
// Sets Ambient Light Sensor value.
// ----------------------------------------------------------------------------
//
void CGSDisplayPluginModel::SetAmbientLightSensorL(
                            const TInt aSensorSensitivity )
    {
    TInt sensitivity;
    sensitivity = ScaleLightSensorValues( aSensorSensitivity, EFalse );

    User::LeaveIfError( iLightRepository->
        Set( KLightSensorSensitivity, sensitivity ) );
    }


// ----------------------------------------------------------------------------
// CGSDisplayPluginModel::ScaleLightSensorValues
//
// Scaling Ambient Light Sensor values
// ----------------------------------------------------------------------------
//
TInt CGSDisplayPluginModel::ScaleLightSensorValues( TInt aValue,
                                                    TBool aDirection )
    {
    TInt coeff = 25;
    TInt ret = 0;

    if( aDirection ) //scaling to slider steps
        {
        ret = ( aValue / coeff ) + 1;
        }
    else //scaling to sensor percentage
        {
        ret = ( aValue - 1 ) * coeff;
        }

    return ret;
    }


// ----------------------------------------------------------------------------
// CGSDisplayPluginModel::HandleNotifyInt
//
// Handle notification from MCenRepNotifyHandlerCallback
// ----------------------------------------------------------------------------
//
void CGSDisplayPluginModel::HandleNotifyInt( TUint32 aId, TInt /*aNewValue*/)
    {
    if ( aId == KSettingsDisplayOperatorLogo ||
         aId == KSettingsShowOperatorLogoSetting )
        {
        iContainer->UpdateListBoxL(EGSSettIdOperatorLogo);
        iContainer->CloseDialog();
        }
    }


// ----------------------------------------------------------------------------
// CGSDisplayPluginModel::ScaleIntensityValues
//
// Converts the slider control steps to Intensity values
// ----------------------------------------------------------------------------
//
TInt CGSDisplayPluginModel::ScaleIntensityValues( TInt aValue, TBool aSample )
    {
    TReal sampledValue;
    TReal intResult;
    TReal sampleCoeff = 3.226; //100 by 31
    TInt aDecimalPlaces = 0;
    TInt32 result;

    if( aSample )
        {
        intResult = sampleCoeff * aValue;
        }
    else
        {
        intResult = aValue / sampleCoeff;
        }

    if( intResult > 1 )
        {
        Math::Round( sampledValue, intResult, aDecimalPlaces );
        Math::Int( result, sampledValue );
        }
    else
        {
        result = 1;
        }
    return result;
    }


// ----------------------------------------------------------------------------
// CGSDisplayPluginModel::SetBackLightValueL
//
// ----------------------------------------------------------------------------
//
void CGSDisplayPluginModel::SetBackLightValueL()
    {
    iCoreAppProperty->Attach( KPSUidCoreApplicationUIs, KLightsControl );

    TLightsControl value = ELightsUninitialized;
    iCoreAppProperty->Set( KPSUidCoreApplicationUIs,
                           KLightsControl, value );

    iCoreAppProperty->Cancel();

    delete iCoreAppProperty;
    iCoreAppProperty = NULL;
    }

// ----------------------------------------------------------------------------
// CGSDisplayPluginModel::IsUWNoteSupportedL
//
// Allow user welcome note item to be disabled, if required
// ----------------------------------------------------------------------------
//
TInt CGSDisplayPluginModel::IsUWNoteSupportedL()
    {
    TInt value = KGSSettingOff;
    User::LeaveIfError( iPersonalizationRepository->
            Get( KSettingsWelcomeNoteSupported, value ) );

    return value;
    }


// ----------------------------------------------------------------------------
// CGSDisplayPluginModel::BrightnessL
//
// Returns brightness value from DosLights.
// ----------------------------------------------------------------------------
//
TInt CGSDisplayPluginModel::BrightnessL()
    {
    if( FeatureManager::FeatureSupported( KFeatureIdBrightnessControl ) )
        {
        TInt brightness;
        User::LeaveIfError( iLightRepository->Get( KLightIntensity,
                                                   brightness ) );

        return ScaleIntensityValues( brightness, EFalse );
        }
    else
        {
        return KErrNotSupported;
        }
    }


// ----------------------------------------------------------------------------
// CGSDisplayPluginModel::SetBrightnessL
//
// Sets brightness value to DosLights.
// ----------------------------------------------------------------------------
//
void CGSDisplayPluginModel::SetBrightnessL( const TInt aBrightness )
    {
    if( FeatureManager::FeatureSupported( KFeatureIdBrightnessControl ) )
        {
        TInt brightness;

        brightness = ScaleIntensityValues( aBrightness, ETrue );
        __GSLOGSTRING1("[CGSDisplayPluginModel::SetBrightnessL(%d)]", aBrightness );
        User::LeaveIfError( iLightRepository->Set( KLightIntensity,
                                                   brightness ) );
        }
    }


// ----------------------------------------------------------------------------
// CGSDisplayPluginModel::DisplayTextSizeL
//
// Return current display text size.
// ----------------------------------------------------------------------------
//
TInt CGSDisplayPluginModel::DisplayTextSizeL()
    {
    TInt textSize = EAknUiZoomNormal;

    if ( FeatureManager::FeatureSupported ( KFeatureIdUiZoom ) )
        {
        User::LeaveIfError( iAvkonRepository->Get( KAknGlobalUiZoom,
                                                   textSize ) );
        }

    return textSize;
    }


// ----------------------------------------------------------------------------
// CGSDisplayPluginModel::SetDisplayTextSizeL
//
// Sets new display text size.
// ----------------------------------------------------------------------------
//
void CGSDisplayPluginModel::SetDisplayTextSizeL( TInt aSize )
    {
    // not checking for feature manager constant to avoid compiler
    // warning for the input parameter.
    User::LeaveIfError( iAvkonRepository->Set( KAknGlobalUiZoom, aSize ) );
    }


// ----------------------------------------------------------------------------
// CGSDisplayPluginModel::PowerSaveLedL
//
// Returns Tracking Transaction state value.
// ----------------------------------------------------------------------------
//
TInt CGSDisplayPluginModel::PowerSaveLedL()
    {
    TInt ret = 0;
    User::LeaveIfError( iPersonalizationRepository->Get(
        KSettingsDisplayTurnoffTimeout, ret ) );
    return ret;
    }


// ----------------------------------------------------------------------------
// CGSDisplayPluginModel::SetPowerSaveLedL
//
// Sets Tracking Transaction state value.
// ----------------------------------------------------------------------------
//
void CGSDisplayPluginModel::SetPowerSaveLedL( const TInt aPowerLedState )
    {
    User::LeaveIfError( iPersonalizationRepository->
        Set( KSettingsDisplayTurnoffTimeout, aPowerLedState ) );

    }


// ----------------------------------------------------------------------------
// CGSDisplayPluginModel::CheckPowerSaveLedSupportL
//
// Checks local variation flag for supporting Power Save Led feature.
// ----------------------------------------------------------------------------
//
TInt CGSDisplayPluginModel::CheckPowerSaveLedSupportL()
    {
    TInt value = 0;
    User::LeaveIfError( iGSVariationRepository->Get(
                        KSettingsVariationFlags, value ) );

    TBool supported = EFalse;

    if ( value & EGSConfigPowerSaveLed )
        {
        supported = ETrue;
        }

    return supported;
    }


// ----------------------------------------------------------------------------
// CGSDisplayPluginModel::BackgroundImage
// ----------------------------------------------------------------------------
//
CGSBackgroundImage* CGSDisplayPluginModel::BackgroundImage()
    {
    return iBackgroundApi;
    }


// ----------------------------------------------------------------------------
// CGSDisplayPluginModel::CheckScreenSaverTimeoutSupportL
// 
// Checks ScreenSaver timeout support
// ----------------------------------------------------------------------------
//
TBool CGSDisplayPluginModel::CheckScreenSaverTimeoutSupportL()
    {
    TInt value = 0;
    User::LeaveIfError( iPersonalizationRepository->Get(
                        KSettingsScreensaverTimeoutItemVisibility, value ) );
    
    if ( value )
        {
        return ETrue;
        }
    else
        {
        return EFalse;
        }
    }


// ----------------------------------------------------------------------------
// CGSDisplayPluginModel::ShowOperatorLogoSettingL
//
// Checks if Operator Logo item is to be made visible.
// ----------------------------------------------------------------------------
//
TBool CGSDisplayPluginModel::ShowOperatorLogoSettingL()
    {
    TInt opLogoSettingState = KGSSettingOff;
    TBool showSetting = EFalse;

    User::LeaveIfError( iPersonalizationRepository->
        Get( KSettingsShowOperatorLogoSetting, opLogoSettingState ) );
    switch( opLogoSettingState )
        {
        case KGSSettingOn:
            showSetting = ETrue;
            break;
        case KGSSettingOff:
            showSetting = EFalse;
        default:
            break;
        }
    return showSetting;
    }


// ----------------------------------------------------------------------------
// CGSDisplayPluginModel::OperatorLogoL
//
// Returns operator logo value from shared data.
// ----------------------------------------------------------------------------
//
TInt CGSDisplayPluginModel::OperatorLogoL()
    {
    TInt opLogo = KGSSettingOff;
    User::LeaveIfError( iPersonalizationRepository->
        Get( KSettingsDisplayOperatorLogo, opLogo ) );
    return opLogo;
    }


// ----------------------------------------------------------------------------
// CGSDisplayPluginModel::SetOperatorLogoL
//
// Sets operator logo value to shared data.
// ----------------------------------------------------------------------------
//
void CGSDisplayPluginModel::SetOperatorLogoL( TInt aOperatorLogo )
    {
    User::LeaveIfError( iPersonalizationRepository->
        Set( KSettingsDisplayOperatorLogo, aOperatorLogo ) );
    }

// ----------------------------------------------------------------------------
// CGSDisplayPluginModel::SetOwner
//
// Sets its owner.
// ----------------------------------------------------------------------------
//
void CGSDisplayPluginModel::SetOwner( CGSDisplayPluginContainer* aContainer)
    {
    iContainer = aContainer;
    }

// ========================== OTHER EXPORTED FUNCTIONS =========================

// End of File