cpsecplugins/devicelockplugin/src/cpdevicelockpluginview.cpp
author Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
Fri, 14 May 2010 16:43:26 +0300
changeset 19 098e361762d2
child 22 6b63ca65093a
permissions -rw-r--r--
Revision: 201017 Kit: 201019

/*
 * Copyright (c) 2009 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:  
 *
 */

#include "cpdevicelockpluginview.h"
#include <QStringList>
#include <hblineedit.h>
#include <hbdataform.h>
#include <hbdataformmodel.h>
#include <hbdataformmodelitem.h>
#include "cpremotelockdataformviewitem.h"
#include <hblabel.h>
#include <hbpushbutton.h>
#include <hbmessagebox>
#include <hbdataform.h>
#include <QGraphicsLinearLayout>
//#include <seccodeeditdataformviewitem.h>
#include <secuisecuritysettings.h>
#include <secuisecurityhandler.h>
#include <etelmm.h>
#include <rmmcustomapi.h>
#include <hbinputdialog.h>
#include <secui.h>
#include <RemoteLockSettings.h>
#include <e32cmn.h>
#include <centralrepository.h>
#include <settingsinternalcrkeys.h>
#include <hbcombobox.h>
#include<hbaction.h>
#include <RemoteLockSettings.h>
#include "debug.h"
#include <qapplication.h>
#include <qtranslator.h>

   
        
/*
 *****************************************************************
 * Name        : CpDeviceLockPluginView()
 * Parameters  : QGraphicsItem*
 * Return value: None
 * Description : constructor
 *****************************************************************
 */
CpDeviceLockPluginView::CpDeviceLockPluginView(QGraphicsItem *parent /*= 0*/)
: CpBaseSettingView(0,parent)
{
        QTranslator *translator = new QTranslator();
        QString lang = QLocale::system().name();
        QString path = "Z:/resource/qt/translations/";
        bool fine = translator->load("devicelocking_en.qm", path);
        if (fine)
            qApp->installTranslator(translator);

        QTranslator *commontranslator = new QTranslator();

        fine = commontranslator->load("common_" + lang, path);
        if (fine)
            qApp->installTranslator(commontranslator);


    
    TSecUi::InitializeLibL();
    mUiSecuSettings = CSecuritySettings::NewL();
    mRemoteLockSettings = CRemoteLockSettings::NewL();
    iALPeriodRep = CRepository::NewL( KCRUidSecuritySettings );  
    
    
    mRemoteLockSettingClicked = false;
    mHack = 0; 
	if (HbDataForm *form = settingForm()) 
	    {
        QGraphicsLinearLayout *layout = new QGraphicsLinearLayout(Qt::Vertical);
		QList<HbAbstractViewItem *> protoTypeList = form->itemPrototypes();
		protoTypeList.append(new CpRemoteLockDataFormViewItem());
        form->setItemPrototypes(protoTypeList);
        form->setHeading(hbTrId("txt_cp_dblist_device_lock"));
        
        //DataFormModel
		formModel = new HbDataFormModel();
		
		
		//lockcode
		HbDataFormModelItem *lockCodeItem = new HbDataFormModelItem(
		        static_cast<HbDataFormModelItem::DataItemType>(CpRemoteLockDataFormViewItem::CpCodeEditItem),
		        hbTrId("txt_devicelocking_dialog_lock_code"));		
		lockCodeItem->setContentWidgetData("echomode",HbLineEdit::Password);
		lockCodeItem->setContentWidgetData("text","1234");
		lockCodeItem->setContentWidgetData("readonly",true);
		form->addConnection(lockCodeItem,SIGNAL(clicked()),this,SLOT(onLockCodeClicked()));
		formModel->appendDataFormItem(lockCodeItem);
	
		
		//Autolock period
		mAutolockPeriodItem= new HbDataFormModelItem(HbDataFormModelItem::ComboBoxItem,
                                                        hbTrId("txt_devicelocking_formlabel_automatic_locking"));
		TInt autoLockVal;
		TInt err = iALPeriodRep->Get(KSettingsAutoLockTime, autoLockVal);
		TInt index = GetAutoLockIndex(autoLockVal);
		Dprint((_L("Current AL period value %d"),autoLockVal));
		//TODO: need to set autoLockVal in editor
		QStringList autolockPeriodList;
		autolockPeriodList<< hbTrId("txt_devicelocking_button_off")
		                  << hbTrId("txt_devicelocking_setlabel_val_when_keys_screen")
		                  << hbTrId("txt_devicelocking_setlabel_val_5_minutes")
		                  << hbTrId("txt_devicelocking_setlabel_val_30_minutes")
		                  << hbTrId("txt_devicelocking_setlabel_val_60_minutes");
		mAutolockPeriodItem->setContentWidgetData(QString("items"),autolockPeriodList);
		mAutolockPeriodItem->setContentWidgetData(QString("currentIndex"),index);
		mAutolockPeriodItem->setContentWidgetData(QString("editable"),true);		
		QVariant themeComboData = mAutolockPeriodItem->contentWidgetData(QString("currentIndex"));
		mThemeComboPrevIndex = themeComboData.toInt();
		
		form->addConnection(mAutolockPeriodItem,SIGNAL(currentIndexChanged(int)),this,SLOT(onAutoLockChanged(int)));
		//form->addConnection(mAutolockPeriodItem,SIGNAL(editTextChanged(const QString&)), this, SLOT(onAutoTextChanged(const QString&)));
		formModel->appendDataFormItem(mAutolockPeriodItem);
		
		
		//LockWhenSimChange
		mLockWhenSimChangeItem = new HbDataFormModelItem(HbDataFormModelItem::ToggleValueItem,
                                                  hbTrId("txt_devicelocking_formlabel_lock_when_sim_changed"));
    	TBool lockVal = mUiSecuSettings->IsLockEnabledL(RMobilePhone::ELockPhoneToICC);
    	Dprint((_L("LockWhenSimChange enabled %d"),lockVal));
		if(lockVal)
		    {
            mLockWhenSimChangeItem->setContentWidgetData("text",hbTrId("txt_remotelocking_button_sim_changed_on"));
            mLockWhenSimChangeItem->setContentWidgetData("additionalText",
                                                            hbTrId("txt_devicelocking_button_sim_changed_off"));
		    }
		else
		    {
            mLockWhenSimChangeItem->setContentWidgetData("text",hbTrId("txt_devicelocking_button_sim_changed_off"));
		    mLockWhenSimChangeItem->setContentWidgetData("additionalText",
                                                            hbTrId("txt_remotelocking_button_sim_changed_on"));
		    }
		mLockWhenSimChangeItem->setContentWidgetData("readonly",true);
		mPrevSIMLockData = mLockWhenSimChangeItem->contentWidgetData(QString("text"));
		
		connect(formModel,SIGNAL(dataChanged(QModelIndex, QModelIndex)),
                                     this,SLOT(onSIMLockDataChanged(QModelIndex,QModelIndex)));
		formModel->appendDataFormItem(mLockWhenSimChangeItem);
		
		
		
		//Remote Lock Setting
		TBool enabled = true;
		TBool val = mRemoteLockSettings->GetEnabled(enabled);
		Dprint((_L("Remote Lock Setting enabled %d"),val));
		mDeviceRemoteLockItem = new HbDataFormModelItem(HbDataFormModelItem::ToggleValueItem,
                                                            hbTrId("txt_devicelocking_subhead_remote_locking"));

		if(val && enabled)
		    {
            mDeviceRemoteLockItem->setContentWidgetData("text",hbTrId("txt_devicelocking_button_remote_on"));
            mDeviceRemoteLockItem->setContentWidgetData("additionalText",hbTrId("txt_devicelocking_button_remote_off"));
		    }
		else
		    {
            mDeviceRemoteLockItem->setContentWidgetData("text",hbTrId("txt_devicelocking_button_remote_off"));
            mDeviceRemoteLockItem->setContentWidgetData("additionalText",hbTrId("txt_devicelocking_button_remote_on"));
	        }		    

		mPrevRemLockData = mDeviceRemoteLockItem->contentWidgetData(QString("text"));
		QString s = mPrevRemLockData.toString();
        connect(formModel,SIGNAL(dataChanged(QModelIndex, QModelIndex)),this,SLOT(onRemoteLockDataChanged(QModelIndex,QModelIndex)));
		formModel->appendDataFormItem(mDeviceRemoteLockItem);	
		
		//Remote lock message
		mRemoteLockMessageItem = new HbDataFormModelItem(
		        static_cast<HbDataFormModelItem::DataItemType>(CpRemoteLockDataFormViewItem::CpCodeEditItem),
		        hbTrId("txt_devicelocking_formlabel_locking_message"));
		mRemoteLockMessageItem->setContentWidgetData("echoMode",HbLineEdit::Password);
		mRemoteLockMessageItem->setContentWidgetData("text","1111");
		mRemoteLockMessageItem->setContentWidgetData("readOnly",true);
		
		if(mPrevRemLockData.toString()== hbTrId("txt_devicelocking_button_remote_on"))
		    mRemoteLockMessageItem->setEnabled(true);
		else
		    mRemoteLockMessageItem->setEnabled(false);
		
		form->addConnection(mRemoteLockMessageItem,SIGNAL(clicked()),this,SLOT(onLockMessageClicked()));
		formModel->appendDataFormItem(mRemoteLockMessageItem);
		
		form->setModel(formModel);
		layout->addItem(form);
		setLayout(layout);
	}
}


/*
 *****************************************************************
 * Name        : ~CpDeviceLockPluginView()
 * Parameters  : None
 * Return value: None
 * Description : destructor
 *****************************************************************
 */
CpDeviceLockPluginView::~CpDeviceLockPluginView()
{
    TSecUi::UnInitializeLib();
}


/*
 *****************************************************************
 * Name        : onLockCodeClicked()
 * Parameters  : None
 * Return value: None
 * Description : Enables user to change the lock code
 *****************************************************************
 */
void CpDeviceLockPluginView::onLockCodeClicked()
{
    Dprint(_L("CpDeviceLockPluginView::onLockCodeClicked()..Enter"));
    mUiSecuSettings->ChangeSecCodeL();
    Dprint(_L("CpDeviceLockPluginView::onLockCodeClicked()..Exit"));
}


/*
 ************************************************************************
 * Name        : onAutoLockChanged()
 * Parameters  : int
 * Return value: None
 * Description : handles the data when automatic lock timings are changed
 ************************************************************************
 */
void CpDeviceLockPluginView::onAutoLockChanged(int index)
    {
    Dprint(_L("CpDeviceLockPluginView::onAutoLockChanged()..Enter"));
    if (index != mThemeComboPrevIndex)
        {
        //TODO: need to set user entered/selected value
        TInt lockValue = GetValueAtIndex(index);
        TInt newAutoLockVal = mUiSecuSettings->ChangeAutoLockPeriodL(
                lockValue);
        if (newAutoLockVal == lockValue)
            {
        Dprint(_L("onAutoLockChanged().AL setting success !!"));
            TInt err = iALPeriodRep->Set(KSettingsAutoLockTime, lockValue);
            mThemeComboPrevIndex = index;
            }
        else
            {
            Dprint(_L("onAutoLockChanged()..Setting to previous value"));
            QVariant data(mThemeComboPrevIndex);
            mAutolockPeriodItem->setContentWidgetData(
                    QString("currentIndex"), data);
            }

        }
    Dprint(_L("CpDeviceLockPluginView::onAutoLockChanged()..Exit"));
}


/*
 *************************************************************************
 * Name        : onLockMessageClicked()
 * Parameters  : None
 * Return value: None
 * Description : verifies security code and enables user to change the lock 
 *               message
 **************************************************************************
 */
void CpDeviceLockPluginView::onLockMessageClicked()
    {
    Dprint(_L("CpDeviceLockPluginView::onLockMessageClicked()..Exit"));
    TBuf<KRLockMaxLockCodeLength> remoteLockCode;
    TBool remoteLockStatus(EFalse);
    TInt retVal = KErrNone;
    TInt autoLockVal = -1;
    retVal = mUiSecuSettings->ChangeRemoteLockStatusL(remoteLockStatus,
            remoteLockCode, autoLockVal);
    if (retVal)
        {
        Dprint(_L("CpDeviceLockPluginView::onLockMessageClicked()..ChangeRemoteLockStatusL sucess"));
        }
    else
        {
        Dprint(_L("CpDeviceLockPluginView::onLockMessageClicked()..ChangeRemoteLockStatusL failed"));
        }
    Dprint(_L("CpDeviceLockPluginView::onLockMessageClicked()..Exit"));
    }


/*
 *************************************************************************
 * Name        : onAutoTextChanged()
 * Parameters  : QString&
 * Return value: None
 * Description :  
  **************************************************************************
 */
/*
 *This slot can be enabled once fix from obit team for this siganl is available 
 */

#if 0
void CpDeviceLockPluginView::onAutoTextChanged(const QString& aText)
    {
    Dprint(_L("CpDeviceLockPluginView::onAutoTextChanged()..Enter"));
    //TBool ret = DisplaySecurityDialog(); 
    Dprint(_L("CpDeviceLockPluginView::onAutoTextChanged()..Exit"));
    
    }
#endif

/*
 *************************************************************************
 * Name        : onRemoteLockDataChanged()
 * Parameters  : QModelIndex
 * Return value: None
 * Description : handles the data when remote lock settings is changed
 **************************************************************************
 */
void CpDeviceLockPluginView::onRemoteLockDataChanged(QModelIndex aStartIn,QModelIndex aEndIn)
    {
    Q_UNUSED(aEndIn);
    Dprint(_L("CpDeviceLockPluginView::onRemoteLockDataChanged..Enter"));
    HbDataFormModelItem *item = formModel->itemFromIndex(aStartIn);

    if ((item->type() == HbDataFormModelItem::ToggleValueItem)
            && (item->data(HbDataFormModelItem::LabelRole).toString()
                    == hbTrId("txt_devicelocking_subhead_remote_locking")))
        {

        //The following If-Else condition should be removed once orbit team fix the issue with datachanged() signal
        /****************************************************************************************************************/
        if ((mHack % 2) == 0) //need to capture second datachanged() signal , not first one.
            {
            mHack++;
            return;
            }
        else
            {
            mHack++;
            }
        /****************************************************************************************************************/
        TInt autoLockVal;
        TInt retVal = KErrNone;
        TBuf<KRLockMaxLockCodeLength> remoteLockCode;
        TBool remoteLockStatus(EFalse);
        CRemoteLockSettings *remoteLockSetting = CRemoteLockSettings::NewL();
        TInt err = iALPeriodRep->Get(KSettingsAutoLockTime, autoLockVal);
        QVariant remLockData = mDeviceRemoteLockItem->contentWidgetData(
                QString("text"));
        if (remLockData.toString() == hbTrId("txt_devicelocking_button_remote_on"))
            {
            remoteLockStatus = ETrue;
            retVal = mUiSecuSettings->ChangeRemoteLockStatusL(
                    remoteLockStatus, remoteLockCode, autoLockVal);
            }
        else
            {
            remoteLockStatus = EFalse;
            retVal = mUiSecuSettings->ChangeRemoteLockStatusL(
                    remoteLockStatus, remoteLockCode, autoLockVal);
            }
        if (retVal == KErrNone)
            {
            if (remoteLockStatus)
                {
                if (remoteLockSetting->SetEnabledL(remoteLockCode))
                    {
                    Dprint(_L("CpDeviceLockPluginView::onRemoteLockDataChanged..remoteLockSetting->SetEnabledL success"));
                    mPrevRemLockData
                            = mDeviceRemoteLockItem->contentWidgetData(
                                    QString("text"));
                    }
                else
                    {
                    RollbackRemoteLockSettingState();
                    Dprint(_L("CpDeviceLockPluginView::onRemoteLockDataChanged..remoteLockSetting->SetEnabledL failed"));
                    }
                }
            else
                {
                if (mRemoteLockSettings->SetDisabled())
                    {
                    Dprint(_L("CpDeviceLockPluginView::onRemoteLockDataChanged..remoteLockSetting->SetDisabled success"));
                    mPrevRemLockData
                            = mDeviceRemoteLockItem->contentWidgetData(
                                    QString("text"));
                    }
                else
                    {
                    RollbackRemoteLockSettingState();
                    Dprint(_L("CpDeviceLockPluginView::onRemoteLockDataChanged..remoteLockSetting->SetDisabled failed"));
                    }
                }
            }
        else
            {
            Dprint(_L("CpDeviceLockPluginView::onRemoteLockDataChanged..RollbackRemoteLockSettingState"));
            RollbackRemoteLockSettingState();
            }
        delete remoteLockSetting;
        }
    Dprint(_L("CpDeviceLockPluginView::onRemoteLockDataChanged..Exit"));
}


/*
 *************************************************************************
 * Name        : onSIMLockDataChanged()
 * Parameters  : QModelIndex
 * Return value: None
 * Description : handles the data afer Lock when SIM changed settings is 
 *               changed
 **************************************************************************
 */
void CpDeviceLockPluginView::onSIMLockDataChanged(QModelIndex aStartIn, QModelIndex aEndIn)
    {
    Q_UNUSED(aEndIn);
    HbDataFormModelItem *item = formModel->itemFromIndex(aStartIn);

    if ((item->type() == HbDataFormModelItem::ToggleValueItem)
            && (item->data(HbDataFormModelItem::LabelRole).toString()
                    == hbTrId("txt_devicelocking_formlabel_lock_when_sim_changed")))
        {
        //The following If-Else condition should be removed once orbit team fix the issue with datachanged() signal
        /****************************************************************************************************************/
        if ((mHack % 2) == 0) //need to capture second datachanged() signal , not first one.
            {
            mHack++;
            return;
            }
        else
            {
            mHack++;
            }
        /****************************************************************************************************************/

        TBool ret = mUiSecuSettings->ChangeSimSecurityL();
        if (!ret)
            {
            /* 
             * disconnect to datachanged() signal as we are not interested in this signal
             * generated as a part of setContentWidgetData() API call below
             */
            disconnect(formModel,SIGNAL(dataChanged(QModelIndex, QModelIndex)), this,SLOT(onSIMLockDataChanged(QModelIndex,QModelIndex)));
            QVariant txt = mLockWhenSimChangeItem->contentWidgetData(QString("text"));
            QVariant additionalText =mLockWhenSimChangeItem->contentWidgetData(QString("additionalText"));

            mLockWhenSimChangeItem->setContentWidgetData(QString("text"),additionalText);
            mLockWhenSimChangeItem->setContentWidgetData(QString("additionalText"), txt);
            /*
             * Now connect back to datachanged() signal .
             */
            connect(formModel, SIGNAL(dataChanged(QModelIndex, QModelIndex)),this, SLOT(onSIMLockDataChanged(QModelIndex,QModelIndex)));
            }
        }
    }


/*
 *************************************************************************
 * Name        : GetAutoLockIndex()
 * Parameters  : TInt
 * Return value: TInt
 * Description : returns corresponding index for the given autolock value
 **************************************************************************
 */
TInt CpDeviceLockPluginView::GetAutoLockIndex(TInt aValue)
    {
        TInt index = 0;
        switch(aValue)
            {
            case 0:
                    index = 0;
                    break;
            case 65535:
                    index = 1;
                    break;
            case 5:
                    index = 2;
                    break;
            case 30:
                    index = 3;
                    break;
            case 60:
                    index = 4;
                    break;
            default:
                    break;
            }  
        
        return index;    
    }


/*
 *************************************************************************
 * Name        : GetValueAtIndex()
 * Parameters  : TInt
 * Return value: TInt
 * Description : returns the corresponding autolock value for the given 
 *               index.
 **************************************************************************
 */
TInt CpDeviceLockPluginView::GetValueAtIndex(TInt aIndex)
    {
        TInt value = 0;
        
        switch(aIndex)
            {
            case 0:
                    value = 0;
                    break;
            case 1:
                    value = 65535;
                    break;
            case 2:
                    value = 5;
                    break;
            case 3:
                    value = 30;
                    break;
            case 4:
                    value = 60;
                    break;
            default:
                    break;
            }
        
        return value;
    }
void CpDeviceLockPluginView::RollbackRemoteLockSettingState()
    {
    /* 
     * disconnect to datachanged() signal as we are not interested in this signal
     * generated as a part of setContentWidgetData() API call below
     */
    disconnect(formModel, SIGNAL(dataChanged(QModelIndex, QModelIndex)),this, SLOT(onRemoteLockDataChanged(QModelIndex,QModelIndex)));

    QVariant txt = mDeviceRemoteLockItem->contentWidgetData(QString("text"));
    QVariant additionaltxt = mDeviceRemoteLockItem->contentWidgetData(QString("additionalText"));
    mDeviceRemoteLockItem->setContentWidgetData(QString("text"),additionaltxt);
    mDeviceRemoteLockItem->setContentWidgetData(QString("additionalText"),txt);
    /*
     * Now connect back to datachanged() signal .
     */
    connect(formModel, SIGNAL(dataChanged(QModelIndex, QModelIndex)), this,SLOT(onRemoteLockDataChanged(QModelIndex,QModelIndex)));

    if (mPrevRemLockData.toString() == hbTrId("txt_devicelocking_button_remote_on"))
        mRemoteLockMessageItem->setEnabled(true);
    else
        mRemoteLockMessageItem->setEnabled(false);

    }