diff -r 0ba996a9b75d -r 613943a21004 bluetoothengine/btui/btcpplugin/btcpuideviceview.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/bluetoothengine/btui/btcpplugin/btcpuideviceview.cpp Tue Aug 31 15:25:10 2010 +0300 @@ -0,0 +1,672 @@ +/* + * 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 +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include "btcpuimainview.h" +#include +#include +#include +#include "btuiiconutil.h" +#include "btuidevtypemap.h" + +#include "btcpuidevicedetail.h" + +// docml to load +const char* BTUI_DEVICEVIEW_DOCML = ":/docml/bt-device-view.docml"; + + +BtCpUiDeviceView::BtCpUiDeviceView( + BtSettingModel &settingModel, + BtDeviceModel &deviceModel, + QGraphicsItem *parent) : + BtCpUiBaseView(settingModel,deviceModel,parent), + mPairedStatus(false), mConnectedStatus(false),mPreviousConnectedStatus(false), mTrustedStatus(false), + mBlockedStatus(false), mConnectable(false), mAbstractDelegate(0), mDeviceDetail(0) +{ + mDeviceIndex = QModelIndex();//is it needed to initialize mIndex??? + + mMainView = (BtCpUiMainView *) parent; + + mMainWindow = hbInstance->allMainWindows().first(); + + mSoftKeyBackAction = new HbAction(Hb::BackNaviAction, this); + BTUI_ASSERT_X(mSoftKeyBackAction, "BtCpUiBaseView::BtCpUiBaseView", "can't create back action"); + + // 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; + + bool ok = false; + mLoader->load( BTUI_DEVICEVIEW_DOCML, &ok ); + // Exit if the file format is invalid + BTUI_ASSERT_X( ok, "bt-device-view", "Invalid docml file" ); + + mOrientation = mMainWindow->orientation(); + + if (mOrientation == Qt::Horizontal) { + 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, "portrait", &ok); + BTUI_ASSERT_X( ok, "bt-device-view", "Invalid docml file: landscape section problem" ); + } + + // 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 + /* + mGroupBox = 0; + mGroupBox = qobject_cast( mLoader->findWidget( "groupBox_deviceView" ) ); + BTUI_ASSERT_X( mGroupBox != 0, "bt-device-view", "Device groupbox not found" ); + */ + mDeviceIcon=0; + //can't use qobject_cast since HbIcon is not derived from QObject! + mDeviceIcon = qobject_cast( mLoader->findWidget( "deviceIcon" ) ); + BTUI_ASSERT_X( mDeviceIcon != 0, "bt-device-view", "Device Icon not found" ); + + mDeviceName=0; + mDeviceName = qobject_cast( 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( mLoader->findWidget( "deviceCategory" ) ); + BTUI_ASSERT_X( mDeviceCategory != 0, "bt-device-view", "Device Category not found" ); + + mDeviceStatus=0; + mDeviceStatus = qobject_cast( mLoader->findWidget( "deviceStatus" ) ); + BTUI_ASSERT_X( mDeviceStatus != 0, "bt-device-view", "Device status not found" ); + + + mConnectionCombobox = 0; + mConnectionCombobox = qobject_cast( mLoader->findWidget( "connectionCombobox" ) ); + BTUI_ASSERT_X( mConnectionCombobox != 0, "bt-device-view", "connection combobox not found" ); + + mConnectionComboboxModel = new HbDataFormModel(); + + mPair_Unpair=0; + mPair_Unpair = qobject_cast( mLoader->findWidget( "pushButton_0" ) ); + BTUI_ASSERT_X( mPair_Unpair != 0, "bt-device-view", "pair/unpair button not found" ); + ret = connect(mPair_Unpair, SIGNAL(clicked()), this, SLOT(pairUnpair())); + BTUI_ASSERT_X( ret, "BtCpUiDeviceView::BtCpUiDeviceView", "can't connect pair button" ); + + mConnect_Disconnect=0; + mConnect_Disconnect = qobject_cast( mLoader->findWidget( "pushButton_1" ) ); + BTUI_ASSERT_X( mConnect_Disconnect != 0, "bt-device-view", "connect/disconnect button not found" ); + ret = connect(mConnect_Disconnect, SIGNAL(clicked()), this, SLOT(connectDisconnect())); + BTUI_ASSERT_X( ret, "BtCpUiDeviceView::BtCpUiDeviceView", "can't connect disconnect button" ); + + mDeviceSetting = 0; + mDeviceSetting = qobject_cast( mLoader->findWidget( "pushButton_2" ) ); + 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() +{ + delete mLoader; // Also deletes all widgets that it constructed. + + delete mConnectionComboboxModel; + + setNavigationAction(0); + delete mSoftKeyBackAction; + if(mAbstractDelegate) + { + delete mAbstractDelegate; + mAbstractDelegate = 0; + } + +} + + +void BtCpUiDeviceView::setSoftkeyBack() +{ + if (navigationAction() != mSoftKeyBackAction) { + setNavigationAction(mSoftKeyBackAction); + connect( mSoftKeyBackAction, SIGNAL(triggered()), this, SLOT(switchToPreviousView()) ); + } +} + +void BtCpUiDeviceView::switchToPreviousView() +{ + BTUI_ASSERT_X(mMainView, "BtCpUiSearchView::switchToPreviousView", "invalid mMainView"); + mMainView->switchToPreviousView(); + + if(mDeviceDetail) { + mDeviceDetail->sendCloseEvent(); + } + unloadDeviceDetails(); +} + +void BtCpUiDeviceView::loadDeviceDetails() +{ + bool ret(false); + + unloadDeviceDetails(); + + mDeviceDetail = new BtCpUiDeviceDetail(); + + ret=connect(mDeviceDetail, SIGNAL(deviceSettingsChanged(bool)), + this, SLOT(handleDeviceSettingsChange(bool))); + BTUI_ASSERT_X( ret, "Btui, BtCpUiDeviceView::loadDeviceDetails", "deviceSettingsChanged() connect failed"); + + mDeviceDetail->loadDeviceDetailPlugins(mDeviceBdAddr.toString(), mDeviceName->text()); +} + +void BtCpUiDeviceView::unloadDeviceDetails() +{ + if(mDeviceDetail) { + disconnect(mDeviceDetail); + delete mDeviceDetail; + mDeviceDetail = 0; + } +} + +void BtCpUiDeviceView::activateView( const QVariant& value, bool fromBackButton ) +{ + + Q_UNUSED( fromBackButton ); + + mConnectedStatus = false; + setSoftkeyBack(); + + + QModelIndex index = value.value(); + mDeviceBdAddr = (mDeviceModel->data(index, BtDeviceModel::ReadableBdaddrRole)); + + //activate view is called when device is selected + //clearViewData(); + updateDeviceData(); + + mDeviceSetting->setVisible(false); + + bool ret(false); + ret=connect(mDeviceModel, SIGNAL(dataChanged(QModelIndex,QModelIndex)), + this, SLOT(updateDeviceData())); + BTUI_ASSERT_X( ret, "Btui, BtCpUiDeviceView::activateView", "dataChanged() connect failed"); + +} + +void BtCpUiDeviceView::handleDeviceSettingsChange(bool status) +{ + mDeviceSetting->setVisible(status); +} + +void BtCpUiDeviceView::handleDeviceSetting() +{ + if(mDeviceDetail) { + mDeviceDetail->loadDeviceDetailsView(); + } +} + +void BtCpUiDeviceView::deactivateView() +{ +} + +// called due to real orientation change event coming from main window +void BtCpUiDeviceView::changeOrientation( Qt::Orientation orientation ) +{ + bool ok = false; + mOrientation = orientation; + 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" ); + } +} + +void BtCpUiDeviceView::clearViewData() +{ + mDeviceIcon->clear(); + mDeviceCategory->clear(); + mDeviceStatus->clear(); + mConnectable = false; + /* + mPairedStatus = false; + mConnectedStatus = false; + mTrustedStatus = false; + mBlockedStatus = false; + + mConnectable = false; + */ +} + +void BtCpUiDeviceView::updateDeviceData() +{ + clearViewData(); + //Get the QModelIndex of the device using the device BDAddres + 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(); +} + +void BtCpUiDeviceView::setDeviceCategory(int cod,int majorRole) +{ + mDeviceCategory->setPlainText( getDeviceTypeString( cod )); + HbIcon icon = + getBadgedDeviceTypeIcon(cod, majorRole, + BtuiBottomLeft | BtuiBottomRight | BtuiTopLeft | BtuiTopRight ); + mDeviceIcon->setIcon(icon); + + if (majorRole & BtuiDevProperty::Connectable ) { + mConnectable = true; + } +} + +void BtCpUiDeviceView::setDeviceStatus(int majorRole) +{ + QString deviceStatus; + + updateStatusVariables(majorRole); // should we use bitmap instead?? + + if (majorRole & BtuiDevProperty::Bonded && + majorRole & BtuiDevProperty::Trusted && + majorRole & BtuiDevProperty::Connected ) { + mDeviceStatus->setPlainText(hbTrId("txt_bt_info_paired_trused_connected")); + } + else if (majorRole & BtuiDevProperty::Bonded && + majorRole & BtuiDevProperty::Connected ) { + mDeviceStatus->setPlainText(hbTrId("txt_bt_info_paired_connected")); + } + else if (majorRole & BtuiDevProperty::Bonded && + majorRole & BtuiDevProperty::Trusted ) { + mDeviceStatus->setPlainText(hbTrId("txt_bt_info_paired_trusted")); + } + else if (majorRole & BtuiDevProperty::Bonded) { + mDeviceStatus->setPlainText(hbTrId("txt_bt_info_paired")); + } + else if (majorRole & BtuiDevProperty::Connected) { + mDeviceStatus->setPlainText(hbTrId("txt_bt_info_connected")); + } + else if (majorRole & BtuiDevProperty::Blocked) { + mDeviceStatus->setPlainText(hbTrId("txt_bt_info_blocked")); + } + else { + // device not paired, connected, trusted or blocked. is this ok? + } + +} + +void BtCpUiDeviceView::setConnectionCombobox(){ + + //create a model class + + mConnectionComboboxModel->appendDataFormItem( + HbDataFormModelItem::ComboBoxItem, QString("Connection"), mConnectionComboboxModel->invisibleRootItem()); + + //set the model to the view, once model and data class are created + mConnectionCombobox->setModel(mConnectionComboboxModel); + + + +} + + +/*! + * instead of using separate boolean variables we could use bitmap in single variable + */ +void BtCpUiDeviceView::updateStatusVariables(int majorRole) +{ + mPreviousConnectedStatus = mConnectedStatus; + + if (majorRole & BtuiDevProperty::Trusted ) { + mTrustedStatus = true; + } + else { + mTrustedStatus = false; + } + if (majorRole & BtuiDevProperty::Bonded) { + mPairedStatus = true; + } + else { + mPairedStatus = false; + } + if (majorRole & BtuiDevProperty::Connected) { + mConnectedStatus = true; + if (!mPreviousConnectedStatus){ + //Loading device detail plugins after successfull connection. + loadDeviceDetails(); + } + } + else { + mConnectedStatus = false; + } + if (majorRole & BtuiDevProperty::Blocked) { + mBlockedStatus = true; + } + else { + mBlockedStatus = false; + } +} + +void BtCpUiDeviceView::setTextAndVisibilityOfButtons() +{ + mPair_Unpair->setStretched(true); + if (mPairedStatus) + { + HbIcon icon("qtg_mono_bt_unpair"); + icon.setIconName("qtg_mono_bt_unpair"); + mPair_Unpair->setIcon(icon); + mPair_Unpair->setText(hbTrId("txt_bt_button_unpair")); + + } + else + { + HbIcon icon("qtg_mono_bt_pair"); + icon.setIconName("qtg_mono_bt_pair"); + mPair_Unpair->setIcon(icon); + mPair_Unpair->setText(hbTrId("txt_bt_button_pair")); + } + + if (mConnectable) + { + mConnect_Disconnect->setVisible(true); + mConnect_Disconnect->setStretched(true); + if (mConnectedStatus) + { + HbIcon icon("qtg_mono_speaker_off"); + icon.setIconName("qtg_mono_speaker_off"); + mConnect_Disconnect->setIcon(icon); + mConnect_Disconnect->setText(hbTrId("txt_bt_button_disconnect")); + } + else + { + HbIcon icon("qtg_mono_speaker"); + icon.setIconName("qtg_mono_speaker"); + mConnect_Disconnect->setIcon(icon); + mConnect_Disconnect->setText(hbTrId("txt_bt_button_connect")); + } + + } + else + { + //it is not possible to connect, set the button invisible + mConnect_Disconnect->setVisible(false); + } + +} + + +void BtCpUiDeviceView::pairUnpair() +{ + if (mPairedStatus) + { + //if the device is paired, call unpairDevice() when the button is tabbed + unpairDevice(); + } + else + { + //if the device is unpaired, call pairDevice() when the button is tabbed + pairDevice(); + + } + + +} + +void BtCpUiDeviceView::connectDisconnect() +{ + if (mConnectedStatus) + { + //if the device is connected, call disconnectDevice() when the button is tabbed + disconnectDevice(); + } + else + { + //if the device is disconnected, call connectDevice() when the button is tabbed + connectDevice(); + + } +} + +void BtCpUiDeviceView::pairDevice() +{ + if (!mAbstractDelegate)//if there is no other delegate running + { + QVariant params; + params.setValue(mDeviceIndex); + mAbstractDelegate = BtDelegateFactory::newDelegate( + BtDelegate::Pair, mSettingModel, mDeviceModel); + connect( mAbstractDelegate, SIGNAL(commandCompleted(int)), this, SLOT(pairDelegateCompleted(int)) ); + mAbstractDelegate->exec(params); + } + +} + +void BtCpUiDeviceView::pairDelegateCompleted(int status) +{ + Q_UNUSED(status); + //TODO: handle the error here + if (mAbstractDelegate) + { + disconnect(mAbstractDelegate); + delete mAbstractDelegate; + mAbstractDelegate = 0; + } +} + +void BtCpUiDeviceView::unpairDevice() +{ + if (!mAbstractDelegate)//if there is no other delegate running + { + QVariant params; + params.setValue(mDeviceIndex); + mAbstractDelegate = BtDelegateFactory::newDelegate( + BtDelegate::Unpair, mSettingModel, mDeviceModel); + connect( mAbstractDelegate, SIGNAL(commandCompleted(int)), this, SLOT(unpairDelegateCompleted(int)) ); + mAbstractDelegate->exec(params); + } + + +} + +void BtCpUiDeviceView::unpairDelegateCompleted(int status) +{ + Q_UNUSED(status); + //TODO: handle the error here + if (mAbstractDelegate) + { + disconnect(mAbstractDelegate); + delete mAbstractDelegate; + mAbstractDelegate = 0; + } +} + +void BtCpUiDeviceView::connectDevice() +{ + + + if (!mAbstractDelegate)//if there is no other delegate running + { + QVariant params; + params.setValue(mDeviceIndex); + mAbstractDelegate = BtDelegateFactory::newDelegate( + BtDelegate::Connect, mSettingModel, mDeviceModel); + connect( mAbstractDelegate, SIGNAL(commandCompleted(int)), this, SLOT(connectDelegateCompleted(int)) ); + mAbstractDelegate->exec(params); + } + + +} + +void BtCpUiDeviceView::connectDelegateCompleted(int status) +{ + Q_UNUSED(status); + if (mAbstractDelegate) + { + disconnect(mAbstractDelegate); + delete mAbstractDelegate; + mAbstractDelegate = 0; + } +} + +void BtCpUiDeviceView::disconnectDevice() +{ + if (!mAbstractDelegate)//if there is no other delegate running + { + + + DisconnectOption discoOpt = ServiceLevel; + + QListlist; + QVariant paramFirst; + paramFirst.setValue(mDeviceIndex); + + QVariant paramSecond; + paramSecond.setValue((int)discoOpt); + + list.append(paramFirst); + list.append(paramSecond); + + QVariant params; + params.setValue(list); + + + //params.setValue(mDeviceIndex); + mAbstractDelegate = BtDelegateFactory::newDelegate( + BtDelegate::Disconnect, mSettingModel, mDeviceModel); + connect( mAbstractDelegate, SIGNAL(commandCompleted(int)), this, SLOT(disconnectDelegateCompleted(int)) ); + mAbstractDelegate->exec(params); + } + +} + +void BtCpUiDeviceView::disconnectDelegateCompleted(int status) +{ + Q_UNUSED(status); + if (mAbstractDelegate) + { + disconnect(mAbstractDelegate); + delete mAbstractDelegate; + mAbstractDelegate = 0; + } +} + +void BtCpUiDeviceView::setPrevBtDeviceName() +{ + QString deviceName = (mDeviceModel->data(mDeviceIndex, + BtDeviceModel::NameAliasRole)).toString(); + mDeviceName->setText(deviceName); +} + +void BtCpUiDeviceView::changeBtDeviceName(){ + if (!mAbstractDelegate)//if there is no other delegate running + { + QListlist; + + 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::RemoteDevName, mSettingModel, mDeviceModel); + connect( mAbstractDelegate, SIGNAL(commandCompleted(int, QVariant)), this, SLOT(changeDevNameDelegateCompleted(int, QVariant)) ); + mAbstractDelegate->exec(params); + } + else { + setPrevBtDeviceName(); + } + +} + +void BtCpUiDeviceView::changeDevNameDelegateCompleted(int status, QVariant param) +{ + + + if(KErrNone == status) { + mDeviceName->setText(param.toString()); + } + else { + setPrevBtDeviceName(); + } + //TODO:Error handling has to be done. + if (mAbstractDelegate) + { + disconnect(mAbstractDelegate); + delete mAbstractDelegate; + mAbstractDelegate = 0; + } + + +}