bluetoothengine/btui/btcpplugin/btcpuideviceview.cpp
author hgs
Wed, 13 Oct 2010 13:15:31 +0300
changeset 67 16e4b9007960
parent 57 5ebadcda06cb
child 70 f5508c13dfe0
permissions -rw-r--r--
201039_4

/*
 * Copyright (c) 2010 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 "btcpuideviceview.h"
#include "btuiviewutil.h"
#include <QtGui/QGraphicsLinearLayout>
#include <hbmainwindow.h>
#include <hbdocumentloader.h>
#include <hbdataform.h>
#include <hbdataformmodel.h>
#include <hbdataformmodelitem.h>
#include <hbgroupbox.h>
#include <hbpushbutton.h>
#include <hblabel.h>
#include <hbicon.h>
#include <hblineedit.h>
#include <hblistview.h>
#include <hbmenu.h>
#include <QString>
#include <QStringList>
#include <QDebug>
#include <bluetoothuitrace.h>
#include <btabstractdelegate.h>
#include <btdelegatefactory.h>
#include "btuiiconutil.h"
#include "btuidevtypemap.h"
#include "btqtconstants.h"
#include "btcpuidevicedetail.h"
#include "btcpuiviewmgr.h"

// docml to load
const char* BTUI_DEVICEVIEW_DOCML = ":/docml/bt-device-view.docml";


// ToDo:  should use base class delegate instead of mAbstractDelegate, also base class createDelegate()
// and createExecuteDelegate()

BtcpuiDeviceView::BtcpuiDeviceView(BtSettingModel &settingModel, 
        BtDeviceModel &deviceModel, 
        QGraphicsItem *parent) :
    BtcpuiBaseView(settingModel,deviceModel,parent),
    mComboboxIndex(-1), mAbstractDelegate(0), mDeviceDetail(0)
{
    mDeviceIndex = QModelIndex(); // initialize to zero

    // read view info from docml file

    // Create view for the application.
    // Set the name for the view. The name should be same as the view's
    // name in docml.
    setObjectName("bt_device_view");

    mLoader = new HbDocumentLoader();
    // Pass the view to documentloader. Document loader uses this view
    // when docml is parsed, instead of creating new view.
    QObjectList objectList;
    objectList.append(this);
    mLoader->setObjectTree(objectList);
    
    bool ret = false;

    mLoader->load( BTUI_DEVICEVIEW_DOCML, &ret );
    // Exit if the file format is invalid
    BTUI_ASSERT_X( ret, "bt-device-view", "Invalid docml file" );
    // listen for orientation changes
    ret = connect(mMainWindow, SIGNAL(orientationChanged(Qt::Orientation)),
            this, SLOT(changeOrientation(Qt::Orientation)));
    BTUI_ASSERT_X( ret, "BtCpUiDeviceView::BtCpUiDeviceView()", "connect orientationChanged() failed");
    
    // assign automatically created widgets to local variables
    
    mDeviceIcon=0;
    mDeviceIcon = qobject_cast<HbLabel *>( mLoader->findWidget( "deviceIcon" ) );  
    BTUI_ASSERT_X( mDeviceIcon != 0, "bt-device-view", "Device Icon not found" );
    
    mDeviceName=0;
    mDeviceName = qobject_cast<HbLineEdit *>( mLoader->findWidget( "deviceName" ) );
    BTUI_ASSERT_X( mDeviceName != 0, "bt-device-view", "Device Name not found" );
    ret = connect(mDeviceName, SIGNAL(editingFinished ()), this, SLOT(changeBtDeviceName()));
    
    mDeviceCategory=0;
    mDeviceCategory = qobject_cast<HbLabel *>( mLoader->findWidget( "deviceCategory" ) );  
    BTUI_ASSERT_X( mDeviceCategory != 0, "bt-device-view", "Device Category not found" );
    
    mDeviceStatus=0;
    mDeviceStatus = qobject_cast<HbLabel *>( mLoader->findWidget( "deviceStatus" ) );  
    BTUI_ASSERT_X( mDeviceStatus != 0, "bt-device-view", "Device status not found" );
    
    
    mConnectionDataForm = 0;
    mConnectionDataForm = qobject_cast<HbDataForm *>( mLoader->findWidget( "connectionCombobox" ) );
    BTUI_ASSERT_X( mConnectionDataForm != 0, "bt-device-view", "connection combobox not found" );
    
    mConnectionComboboxModel = new HbDataFormModel( this );
    
    mPair_Unpair=0;
    mPair_Unpair = qobject_cast<HbPushButton *>( mLoader->findWidget( "devicePairUnpair" ) );
    BTUI_ASSERT_X( mPair_Unpair != 0, "bt-device-view", "pair/unpair button not found" );
 
    mConnect_Disconnect=0;
    mConnect_Disconnect = qobject_cast<HbPushButton *>( mLoader->findWidget( "deviceConnectDisconnect" ) );
    BTUI_ASSERT_X( mConnect_Disconnect != 0, "bt-device-view", "connect/disconnect button not found" );
      
    mDeviceSetting = 0;
    mDeviceSetting = qobject_cast<HbPushButton *>( mLoader->findWidget( "deviceSettings" ) );
    BTUI_ASSERT_X( mDeviceSetting != 0, "bt-device-view", "settings button not found" );
    ret = connect(mDeviceSetting, SIGNAL(clicked()), this,
            SLOT(handleDeviceSetting()));
    BTUI_ASSERT_X( ret, "Btui, BtcpuiDeviceView::BtcpuiDeviceView", "clicked() connect failed");

    setConnectionCombobox();
}

BtcpuiDeviceView::~BtcpuiDeviceView()
{
    BOstraceFunctionEntry1( DUMMY_DEVLIST, this );
    delete mLoader; // Also deletes all widgets that it constructed.
    delete mAbstractDelegate;
    unloadDeviceDetails();
    BOstraceFunctionExit0(DUMMY_DEVLIST);
}

void BtcpuiDeviceView::backToPreviousView()
{
    BtcpuiBaseView::backToPreviousView();
    unloadDeviceDetails();
}

void BtcpuiDeviceView::loadDeviceDetails()
{
    BOstraceFunctionEntry1( DUMMY_DEVLIST, this );
    bool ret(false);
    unloadDeviceDetails();  // ToDo: is it necessary to delete the device view every time there is a change?
    mDeviceDetail = new BtCpUiDeviceDetail();
    ret=connect(mDeviceDetail, SIGNAL(deviceSettingsChanged(bool)),
           this, SLOT(handleDeviceSettingsChange(bool)));
    BTUI_ASSERT_X( ret, "Btui, BtcpuiDeviceView::loadDeviceDetails", "deviceSettingsChanged() connect failed");

    QString btAddr = mDeviceBdAddr.toString();
    QString deviceName = mDeviceName->text();
    mDeviceDetail->loadDeviceDetailPlugins(btAddr, deviceName);
    BOstraceFunctionExit0(DUMMY_DEVLIST);
}

void BtcpuiDeviceView::unloadDeviceDetails()
{
    BOstraceFunctionEntry1( DUMMY_DEVLIST, this );
    if(mDeviceDetail) {
        mDeviceDetail->sendCloseEvent();
        delete mDeviceDetail;
        mDeviceDetail = 0;
    }
    BOstraceFunctionExit0(DUMMY_DEVLIST);
}

void BtcpuiDeviceView::activateView( const QVariant& value, bool backNavi)
{
    BOstraceFunctionEntry1( DUMMY_DEVLIST, this );
    Q_UNUSED( backNavi ); 
    // get bluetooth address of device in question
    QModelIndex index = value.value<QModelIndex>();
    mDeviceBdAddr = (mDeviceModel->data(index, BtDeviceModel::ReadableBdaddrRole));
    QModelIndex start = mDeviceModel->index(0,0);
    QModelIndexList indexList = mDeviceModel->match(start,BtDeviceModel::ReadableBdaddrRole, mDeviceBdAddr);
    mDeviceIndex = indexList.at(0);
    
    bool ret = false;
    if (mMainWindow->orientation() == Qt::Horizontal) {
        //mLoader->load(BTUI_DEVICEVIEW_DOCML, "landscape", &ret);
        //BTUI_ASSERT_X( ret, "bt-device-view", "Invalid docml file: landscape section problem" );
        int majorRole = (mDeviceModel->data(mDeviceIndex,BtDeviceModel::MajorPropertyRole)).toInt();
        if (majorRole & BtuiDevProperty::Connectable ) {
            mLoader->load( BTUI_DEVICEVIEW_DOCML, "landscape", &ret );
            BTUI_ASSERT_X( ret, "bt-device-view", "Invalid docml file: landscape section problem" );  
        }
        else{
            mLoader->load( BTUI_DEVICEVIEW_DOCML, "landscape2", &ret );
            BTUI_ASSERT_X( ret, "bt-device-view", "Invalid docml file: landscape2 section problem" );  
        }
    }
    else {
        mLoader->load(BTUI_DEVICEVIEW_DOCML, "portrait", &ret);
        BTUI_ASSERT_X( ret, "bt-device-view", "Invalid docml file: portrait section problem" );
            
              
    }
    
    updateDeviceData();
    
    mDeviceSetting->setVisible(false);
    loadDeviceDetails();    
    ret = false;
    ret=connect(mDeviceModel, SIGNAL(dataChanged(QModelIndex,QModelIndex)),
           this, SLOT(updateDeviceData()));
    BTUI_ASSERT_X( ret, "Btui, BtCpUiDeviceView::activateView", "dataChanged() connect failed");
    BOstraceFunctionExit0(DUMMY_DEVLIST);
}

void BtcpuiDeviceView::deactivateView()
{
    BOstraceFunctionEntry1( DUMMY_DEVLIST, this );
    disconnect(mDeviceModel, 0, this, 0);
    unloadDeviceDetails();
    BOstraceFunctionExit0(DUMMY_DEVLIST);
}

void BtcpuiDeviceView::handleDeviceSettingsChange(bool status)
{
    BOstraceFunctionEntry1( DUMMY_DEVLIST, this );
    mDeviceSetting->setVisible(status);
    mDeviceSetting->setStretched(true);
    BOstraceFunctionExit0(DUMMY_DEVLIST);
}

void BtcpuiDeviceView::handleDeviceSetting()
{
    BOstraceFunctionEntry1( DUMMY_DEVLIST, this );
    if(mDeviceDetail) {
        mDeviceDetail->loadDeviceDetailsView();
    }
    BOstraceFunctionExit0(DUMMY_DEVLIST);
}


// called due to real orientation change event coming from main window
void BtcpuiDeviceView::changeOrientation( Qt::Orientation orientation )
{
    BOstraceFunctionEntry1( DUMMY_DEVLIST, this );
    bool ok = false;
    int majorRole = (mDeviceModel->data(mDeviceIndex,BtDeviceModel::MajorPropertyRole)).toInt();
    if( orientation == Qt::Vertical ) {
        // load "portrait" section
        mLoader->load( BTUI_DEVICEVIEW_DOCML, "portrait", &ok );
        BTUI_ASSERT_X( ok, "bt-device-view", "Invalid docml file: portrait section problem" );
    } else {
        // load "landscape" section
        //mLoader->load( BTUI_DEVICEVIEW_DOCML, "landscape", &ok );
        //BTUI_ASSERT_X( ok, "bt-device-view", "Invalid docml file: landscape section problem" );
        if (majorRole & BtuiDevProperty::Connectable ) {
            mLoader->load( BTUI_DEVICEVIEW_DOCML, "landscape", &ok );
            BTUI_ASSERT_X( ok, "bt-device-view", "Invalid docml file: landscape section problem" );  
        }
        else{
            mLoader->load( BTUI_DEVICEVIEW_DOCML, "landscape2", &ok );
            BTUI_ASSERT_X( ok, "bt-device-view", "Invalid docml file: landscape2 section problem" );  
        }
    }
    setTextAndVisibilityOfButtons(majorRole);
    BOstraceFunctionExit0(DUMMY_DEVLIST);
}

void BtcpuiDeviceView::clearViewData()
{
    BOstraceFunctionEntry1( DUMMY_DEVLIST, this );
    mDeviceIcon->clear();
    mDeviceCategory->clear();
    mDeviceStatus->clear();
    BOstraceFunctionExit0(DUMMY_DEVLIST);
}

void BtcpuiDeviceView::updateDeviceData()
{
    BOstraceFunctionEntry1( DUMMY_DEVLIST, this );
    clearViewData();
    //Get the QModelIndex of the device using the device BDAddress
    QModelIndex start = mDeviceModel->index(0,0);
    QModelIndexList indexList = mDeviceModel->match(start,BtDeviceModel::ReadableBdaddrRole, mDeviceBdAddr);
    mDeviceIndex = indexList.at(0);
    
    //populate device view with device data fetched from UiModel
    QString deviceName = (mDeviceModel->data(mDeviceIndex, 
             BtDeviceModel::NameAliasRole)).toString(); 
    mDeviceName->setText(deviceName);
     
    int cod = (mDeviceModel->data(mDeviceIndex,BtDeviceModel::CoDRole)).toInt();
     
    int majorRole = (mDeviceModel->data(mDeviceIndex,BtDeviceModel::MajorPropertyRole)).toInt();
    
	setDeviceCategory(cod, majorRole);
    setDeviceStatus(majorRole);
    setTextAndVisibilityOfButtons(majorRole);
    BOstraceFunctionExit0(DUMMY_DEVLIST);
}

void BtcpuiDeviceView::setDeviceCategory(int cod,int majorRole)
{
    BOstraceFunctionEntry1( DUMMY_DEVLIST, this );
    mDeviceCategory->setPlainText( getDeviceTypeString( cod ));
    HbIcon icon =
    getBadgedDeviceTypeIcon(cod, majorRole,
                            BtuiBottomLeft | BtuiBottomRight | BtuiTopLeft | BtuiTopRight );
    mDeviceIcon->setIcon(icon);
    BOstraceFunctionExit0(DUMMY_DEVLIST);
}

void BtcpuiDeviceView::setDeviceStatus(int majorRole)
{
    BOstraceFunctionEntry1( DUMMY_DEVLIST, this );
    QString deviceStatus;
    // Avoid unnecessary actions:
    // The device model has been modified and need to be reflected
    // in the UI however if we don't disable the signal before the UI update
    // the connectionPreferenceChanged function will be called and trigger
    // unnecessary update of the model by the device view.
    mConnectionDataForm->removeConnection(mCombobox, SIGNAL(currentIndexChanged (int)), 
            this, SLOT(connectionPreferenceChanged(int)));
    if (majorRole & BtuiDevProperty::Bonded && 
        majorRole & BtuiDevProperty::Trusted &&
        majorRole & BtuiDevProperty::Connected ) {
        mDeviceStatus->setPlainText(hbTrId("txt_bt_info_paired_trused_connected"));
        mCombobox->setContentWidgetData("currentIndex", ConnectionAutomatic );
        mComboboxIndex = ConnectionAutomatic;
    } 
    else if (majorRole & BtuiDevProperty::Bonded && 
             majorRole & BtuiDevProperty::Connected ) {
        mDeviceStatus->setPlainText(hbTrId("txt_bt_info_paired_connected"));
        mCombobox->setContentWidgetData("currentIndex", ConnectionAlwaysAsk );
        mComboboxIndex = ConnectionAlwaysAsk;
    }
    else if (majorRole & BtuiDevProperty::Bonded && 
             majorRole & BtuiDevProperty::Trusted ) {
        mDeviceStatus->setPlainText(hbTrId("txt_bt_info_paired_trusted"));
        mCombobox->setContentWidgetData("currentIndex", ConnectionAutomatic );
        mComboboxIndex = ConnectionAutomatic;
    } 
    else if (majorRole & BtuiDevProperty::Connected && 
             majorRole & BtuiDevProperty::Trusted ) {
        mDeviceStatus->setPlainText(hbTrId("Trusted, Connected"));  // ToDo: missing textId!
        mCombobox->setContentWidgetData("currentIndex", ConnectionAutomatic );
        mComboboxIndex = ConnectionAutomatic;
    } 
    else if (majorRole & BtuiDevProperty::Trusted ) {
        mDeviceStatus->setPlainText(hbTrId("Trusted"));  // ToDo: missing textId!
        mCombobox->setContentWidgetData("currentIndex", ConnectionAutomatic );
        mComboboxIndex = ConnectionAutomatic;
    } 
    else if (majorRole & BtuiDevProperty::Bonded) {
        mDeviceStatus->setPlainText(hbTrId("txt_bt_info_paired"));
        mCombobox->setContentWidgetData("currentIndex", ConnectionAlwaysAsk );
        mComboboxIndex = ConnectionAlwaysAsk;
    }
    else if (majorRole & BtuiDevProperty::Connected) {
        mDeviceStatus->setPlainText(hbTrId("txt_bt_info_connected"));
        mCombobox->setContentWidgetData("currentIndex", ConnectionAlwaysAsk );
        mComboboxIndex = ConnectionAlwaysAsk;
    }
    else if (majorRole & BtuiDevProperty::Blocked) {
        mDeviceStatus->setPlainText(hbTrId("txt_bt_info_blocked"));
        mCombobox->setContentWidgetData("currentIndex", ConnectionBlocked );
        mComboboxIndex = ConnectionBlocked;
    }
    else {
        // device not paired, connected, trusted or blocked.  
        mDeviceStatus->setPlainText(" ");
        mCombobox->setContentWidgetData("currentIndex", ConnectionAlwaysAsk );
        mComboboxIndex = ConnectionAlwaysAsk;
    }
    mConnectionDataForm->addConnection(mCombobox, SIGNAL(currentIndexChanged (int)), 
            this, SLOT(connectionPreferenceChanged(int)));
    BOstraceFunctionExit0(DUMMY_DEVLIST);
}

void BtcpuiDeviceView::setConnectionCombobox()
{
    BOstraceFunctionEntry1( DUMMY_DEVLIST, this );
    //create a model class
    mCombobox = mConnectionComboboxModel->appendDataFormItem(
    HbDataFormModelItem::ComboBoxItem, hbTrId("txt_bt_setlabel_connection"), 
        mConnectionComboboxModel->invisibleRootItem());
    
    QStringList connList;
    connList.append( hbTrId("txt_bt_setlabel_bluetooth_val_automatic") );
    connList.append( hbTrId("txt_bt_setlabel_bluetooth_val_always_ask") );
    connList.append( hbTrId("txt_bt_setlabel_bluetooth_val_blocked") );
    mCombobox->setContentWidgetData( "items", connList );

    //set the model to the view, once model and data class are created
    mConnectionDataForm->setModel(mConnectionComboboxModel);
    mConnectionDataForm->addConnection(mCombobox, SIGNAL(currentIndexChanged (int)), 
            this, SLOT(connectionPreferenceChanged(int)));
    BOstraceFunctionExit0(DUMMY_DEVLIST);    
}

void BtcpuiDeviceView::setTextAndVisibilityOfButtons(int majorProperty)
{
    BOstraceFunctionEntry1( DUMMY_DEVLIST, this );
    disconnect(mPair_Unpair, 0, 0, 0);
    disconnect(mConnect_Disconnect, 0, 0, 0);
    
    if (majorProperty & BtuiDevProperty::Blocked) {
        mPair_Unpair->setVisible(false);
        mConnect_Disconnect->setVisible(false);
        mDeviceSetting->setVisible(false);
        return;
    }
    bool ret;
    mPair_Unpair->setVisible(true);
    mPair_Unpair->setStretched(true);
    if (majorProperty & BtuiDevProperty::Bonded) {
        updateButton(mPair_Unpair, "qtg_mono_bt_unpair", hbTrId("txt_bt_button_unpair"));
        ret =  connect(mPair_Unpair, SIGNAL(clicked()), this, SLOT(unpairDevice()));
        BTUI_ASSERT_X( ret, "BtcpuiDeviceView::BtcpuiDeviceView", "can't connect unpair button" );
    }
    else {
        updateButton(mPair_Unpair, "qtg_mono_bt_pair", hbTrId("txt_bt_button_pair"));
        ret =  connect(mPair_Unpair, SIGNAL(clicked()), this, SLOT(pairDevice()));
        BTUI_ASSERT_X( ret, "BtcpuiDeviceView::BtcpuiDeviceView", "can't connect pair button" );        
    }
    
    if (majorProperty & BtuiDevProperty::Connectable ) {
        mConnect_Disconnect->setVisible(true);
        mConnect_Disconnect->setStretched(true);
        if (majorProperty & BtuiDevProperty::Connected) {
            updateButton(mConnect_Disconnect, "qtg_mono_speaker_off", hbTrId("txt_bt_button_disconnect"));
            ret =  connect(mConnect_Disconnect, SIGNAL(clicked()), this, SLOT(disconnectDevice()));
            BTUI_ASSERT_X( ret, "BtcpuiDeviceView::BtcpuiDeviceView", "can't connect disconnect button" );
        }
        else {
            updateButton(mConnect_Disconnect, "qtg_mono_speaker", hbTrId("txt_bt_button_connect"));
            ret =  connect(mConnect_Disconnect, SIGNAL(clicked()), this, SLOT(connectDevice()));
            BTUI_ASSERT_X( ret, "BtcpuiDeviceView::BtcpuiDeviceView", "can't connect connect button" );
        }
    }
    else {
        //it is not possible to connect, set the button invisible
        mConnect_Disconnect->setVisible(false);
    }
    BOstraceFunctionExit0(DUMMY_DEVLIST);
}

void BtcpuiDeviceView::connectionPreferenceChanged(int index)
{
    BOstraceFunctionEntry1( DUMMY_DEVLIST, this );
    if ((index >= ConnectionAutomatic)&&(index != mComboboxIndex)) {
        switch ( index )
        {
        case ConnectionAutomatic:
            setDeviceAuthorised();
            break;
        case ConnectionAlwaysAsk:
            setDeviceAlwaysAsk();
            break;
        case ConnectionBlocked:
            setDeviceBlocked();
            break;
        default: 
            BTUI_ASSERT_X( 0, "BtCpUiDeviceView::connectionPreferenceChanged()", "wrong index" );
        }
    }
    BOstraceFunctionExit0(DUMMY_DEVLIST);
}

void BtcpuiDeviceView::setDeviceAuthorised()
{
    BOstraceFunctionEntry1( DUMMY_DEVLIST, this );
    if (!mAbstractDelegate){
        //if there is no other delegate running
        QList<QVariant>list;
        list.append(mDeviceBdAddr);
        
        if (mComboboxIndex != ConnectionAutomatic) { // transition: (always ask|blocked) --> automatic
            // unblock the device
            list.append(QVariant(BtAuthorize));
        }
        else {
            // do nothing, state is already correct
            return;
        }
        mAbstractDelegate = BtDelegateFactory::newDelegate(
                BtDelegate::TrustDevice, mSettingModel, mDeviceModel); 
        connect( mAbstractDelegate, SIGNAL(delegateCompleted(int,BtAbstractDelegate*)), 
                this, SLOT(unpairDelegateCompleted(int)) );
        mAbstractDelegate->exec(QVariant(list));
    }   
    BOstraceFunctionExit0(DUMMY_DEVLIST);  
}

void BtcpuiDeviceView::setDeviceAlwaysAsk()
{
    BOstraceFunctionEntry1( DUMMY_DEVLIST, this );
    if (!mAbstractDelegate){
        //if there is no other delegate running
        QList<QVariant>list;
        BtDelegate::EditorType type;
        list.append(mDeviceBdAddr);
        if (mComboboxIndex == ConnectionAutomatic) { // transition: automatic --> always ask
            // unauthorize the device
            list.append(QVariant(BtUnauthorize));
            type = BtDelegate::UntrustDevice;
        }
        else if (mComboboxIndex == ConnectionBlocked) { // transition: blocked --> always ask 
            // unblock the device
            list.append(QVariant(BtUnblock));
            type = BtDelegate::UnblockDevice;
        }
        else {
            // do nothing, state is already correct
            return;
        }
        
        mAbstractDelegate = BtDelegateFactory::newDelegate(
                type, mSettingModel, mDeviceModel); 
        connect( mAbstractDelegate, SIGNAL(delegateCompleted(int,BtAbstractDelegate*)), 
                this, SLOT(unpairDelegateCompleted(int)) );
        mAbstractDelegate->exec(QVariant(list));
    }   
    BOstraceFunctionExit0(DUMMY_DEVLIST);
}

void BtcpuiDeviceView::setDeviceBlocked()
{
    BOstraceFunctionEntry1( DUMMY_DEVLIST, this );
    //simple version of the delegate
    //TODO: disconnect after blocking
    if (!mAbstractDelegate){
        //if there is no other delegate running
        QList<QVariant> list;
        list.append(mDeviceBdAddr);
        
        if ( mComboboxIndex == ConnectionAutomatic || 
            mComboboxIndex == ConnectionAlwaysAsk ) {  // transition: automatic|always ask --> blocked
            // to unauthorized the device
            list.append(QVariant(BtBlock));
        }
        else{
            // do nothing, state is already correct
            return;
        }
        mAbstractDelegate = BtDelegateFactory::newDelegate(
                BtDelegate::BlockDevice, mSettingModel, mDeviceModel); 
        connect( mAbstractDelegate, SIGNAL(delegateCompleted(int,BtAbstractDelegate*)), 
                this, SLOT(unpairDelegateCompleted(int)) );
        mAbstractDelegate->exec(QVariant(list));
    }
    BOstraceFunctionExit0(DUMMY_DEVLIST);
}

void BtcpuiDeviceView::pairDevice()
{
    BOstraceFunctionEntry1( DUMMY_DEVLIST, this );
    if (!mAbstractDelegate)//if there is no other delegate running
    { 
        QVariant params;
        params.setValue(mDeviceIndex);
        mAbstractDelegate = BtDelegateFactory::newDelegate(
                BtDelegate::PairDevice, mSettingModel, mDeviceModel); 
        connect( mAbstractDelegate, SIGNAL(delegateCompleted(int,BtAbstractDelegate*)), this, SLOT(pairDelegateCompleted(int)) );
        mAbstractDelegate->exec(params);
    }
    BOstraceFunctionExit0(DUMMY_DEVLIST);
}

void BtcpuiDeviceView::pairDelegateCompleted(int status)
{
    BOstraceFunctionEntryExt( DUMMY_DEVLIST, this, status );
    Q_UNUSED(status);
    //TODO: handle the error here
    if (mAbstractDelegate)
    {
        delete mAbstractDelegate;
        mAbstractDelegate = 0;
    }
    BOstraceFunctionExit0(DUMMY_DEVLIST);
}

void BtcpuiDeviceView::unpairDevice()
{
    BOstraceFunctionEntry1( DUMMY_DEVLIST, this );
    if (!mAbstractDelegate)//if there is no other delegate running
    { 
        QList<QVariant>list;
        list.append(mDeviceBdAddr);
        list.append(QVariant(BtUnpair));
        
        mAbstractDelegate = BtDelegateFactory::newDelegate(
                BtDelegate::UnpairDevice, mSettingModel, mDeviceModel); 
        connect( mAbstractDelegate, SIGNAL(delegateCompleted(int,BtAbstractDelegate*)), this, 
                SLOT(unpairDelegateCompleted(int)) );
        mAbstractDelegate->exec(QVariant(list));
    }
    BOstraceFunctionExit0(DUMMY_DEVLIST); 
}

void BtcpuiDeviceView::unpairDelegateCompleted(int status)
{
    BOstraceFunctionEntry1( DUMMY_DEVLIST, this );
    Q_UNUSED(status);
    //TODO: handle the error here 
    if (mAbstractDelegate)
    {
        delete mAbstractDelegate;
        mAbstractDelegate = 0;
    }
    BOstraceFunctionExit0(DUMMY_DEVLIST);
}

void BtcpuiDeviceView::connectDevice()
{
    BOstraceFunctionEntry1( DUMMY_DEVLIST, this );

    if (!mAbstractDelegate) { //if there is no other delegate running
        QVariant params;
        params.setValue(mDeviceIndex);
        mAbstractDelegate = BtDelegateFactory::newDelegate(
                BtDelegate::ConnectService, mSettingModel, mDeviceModel); 
        connect( mAbstractDelegate, SIGNAL(delegateCompleted(int,BtAbstractDelegate*)), this, SLOT(connectDelegateCompleted(int)) );
        mAbstractDelegate->exec(params);
    }
    BOstraceFunctionExit0(DUMMY_DEVLIST);       
}

void BtcpuiDeviceView::connectDelegateCompleted(int status)
{
    BOstraceFunctionEntry1( DUMMY_DEVLIST, this );
    Q_UNUSED(status);
    if (mAbstractDelegate) {
        delete mAbstractDelegate;
        mAbstractDelegate = 0;
    }   
    BOstraceFunctionExit0(DUMMY_DEVLIST);
}

void BtcpuiDeviceView::disconnectDevice()
{
    BOstraceFunctionEntry1( DUMMY_DEVLIST, this );
    if (!mAbstractDelegate) { //if there is no other delegate running 
        QList<QVariant>list;
        list.append(QVariant(ServiceLevel));
        list.append(mDeviceBdAddr);
        
        mAbstractDelegate = BtDelegateFactory::newDelegate(
                BtDelegate::DisconnectService, mSettingModel, mDeviceModel); 
        // todo: check return value of connect
        connect( mAbstractDelegate, SIGNAL(delegateCompleted(int,BtAbstractDelegate*)), this, 
                SLOT(disconnectDelegateCompleted(int)) );
        mAbstractDelegate->exec(QVariant(list));
    }
    BOstraceFunctionExit0(DUMMY_DEVLIST);
}

void BtcpuiDeviceView::disconnectDelegateCompleted(int status)
{
    BOstraceFunctionEntry1( DUMMY_DEVLIST, this );
    Q_UNUSED(status);
    if (mAbstractDelegate)
    {
        delete mAbstractDelegate;
        mAbstractDelegate = 0;
    }
    BOstraceFunctionExit0(DUMMY_DEVLIST);
}

void BtcpuiDeviceView::setPrevBtDeviceName()
{
    BOstraceFunctionEntry1( DUMMY_DEVLIST, this );
    QString deviceName = (mDeviceModel->data(mDeviceIndex, 
                BtDeviceModel::NameAliasRole)).toString(); 
   mDeviceName->setText(deviceName);
    BOstraceFunctionExit0(DUMMY_DEVLIST);
}

void BtcpuiDeviceView::changeBtDeviceName()
{
    BOstraceFunctionEntry1( DUMMY_DEVLIST, this );
    if (!mAbstractDelegate){
        //if there is no other delegate running
        QList<QVariant>list;
        
        QVariant index;
        index.setValue(mDeviceIndex);
        
        QVariant name;
        name.setValue(mDeviceName->text());
        
        list.append(index);
        list.append(name);
        
        QVariant params;
        params.setValue(list);
        
        mAbstractDelegate = BtDelegateFactory::newDelegate(
                BtDelegate::ChangeDeviceFriendlyName, mSettingModel, mDeviceModel); 
        connect( mAbstractDelegate, SIGNAL(delegateCompleted(int,BtAbstractDelegate*)), 
                this, SLOT(changeDevNameDelegateCompleted(int, QVariant)) );
        mAbstractDelegate->exec(params);
    }
    else {
        setPrevBtDeviceName();
    }
    BOstraceFunctionExit0(DUMMY_DEVLIST);
}

void BtcpuiDeviceView::changeDevNameDelegateCompleted(int status)
{   
    BOstraceFunctionEntry1( DUMMY_DEVLIST, this );
    if(KErrNone != status) {
        setPrevBtDeviceName();
    }
 
    if (mAbstractDelegate){
        delete mAbstractDelegate;
        mAbstractDelegate = 0;
    }   
    BOstraceFunctionExit0(DUMMY_DEVLIST);
}

void BtcpuiDeviceView::updateButton(HbPushButton *button, const QString &iconName, const QString &text)
{
    HbIcon icon(iconName);
    icon.setIconName(iconName);
    button->setIcon(icon);
    button->setText(text);
}