bluetoothengine/btui/btcpplugin/btcpuideviceview.cpp
branchRCL_3
changeset 22 613943a21004
--- /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 <QtGui/QGraphicsLinearLayout>
+#include <HbInstance>
+#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 "btcpuimainview.h"
+#include <btabstractdelegate.h>
+#include <btdelegatefactory.h>
+#include <QModelIndex>
+#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<HbGroupBox *>( 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<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" );
+    
+    
+    mConnectionCombobox = 0;
+    mConnectionCombobox = qobject_cast<HbDataForm *>( 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<HbPushButton *>( 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<HbPushButton *>( 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<HbPushButton *>( 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<QModelIndex>();
+    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;
+                    
+            QList<QVariant>list;
+            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
+    { 
+        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::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;
+    }
+    
+    
+}