bluetoothengine/btui/btcpplugin/btcpuidevicedetail.cpp
branchRCL_3
changeset 22 613943a21004
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/bluetoothengine/btui/btcpplugin/btcpuidevicedetail.cpp	Tue Aug 31 15:25:10 2010 +0300
@@ -0,0 +1,230 @@
+/*
+ * 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 "btcpuidevicedetail.h"
+#include "btcpuideviceview.h"
+#include "btcpuidevicedetailsview.h"
+
+#include <btdevsettingpluginloader.h>
+#include <bluetoothuitrace.h>
+#include <HbInstance>
+
+
+BtCpUiDeviceDetail::BtCpUiDeviceDetail(QObject *parent) :
+    QObject(parent), mDeviceDetailView(0)
+{
+    mMainWindow = hbInstance->allMainWindows().first();
+}
+
+BtCpUiDeviceDetail::~BtCpUiDeviceDetail()
+{
+    clearDeviceDetailList();
+    delete mDeviceDetailView;
+}
+
+void BtCpUiDeviceDetail::loadDeviceDetailPlugins(QString deviceAddress, QString deviceName)
+{
+    QList<BtDevSettingInterface*> interfaces;
+    BtAbstractDevSetting *devSetting;
+    
+    clearDeviceDetailList();
+    interfaces = BtDevSettingPluginLoader::loadDevSettingInterfaces();
+    QList<BtDevSettingInterface*>::const_iterator i;
+    
+    for (i = interfaces.constBegin(); i != interfaces.constEnd(); ++i) {
+        devSetting = 0;
+        devSetting = (*i)->createDevSetting( deviceAddress );
+        if(devSetting) {
+            appendDeviceToList(devSetting);
+        }
+    }
+
+    for (int i = interfaces.count() - 1; i >= 0; --i ) {
+        delete interfaces.at(i);
+    }
+    
+    createDeviceDetailsView(deviceName);
+    notifyDeviceDetailStatus();
+    
+}
+
+void BtCpUiDeviceDetail::appendDeviceToList(BtAbstractDevSetting *devSetting)
+{
+    bool ret = false;
+    BtDeviceDetails devicedetails;
+    devicedetails.mSetting = 0;
+    devicedetails.mSettingForm = 0;
+    devicedetails.mSettingAvailable = false;
+    
+    devicedetails.mSetting = devSetting;
+    devicedetails.mSettingAvailable = devSetting->isSettingAvailable();
+    devicedetails.mSettingForm = devSetting->getSettingWidget();
+    
+    mDeviceDetailList.append(devicedetails);
+    
+    ret = connect(devicedetails.mSetting, SIGNAL(settingAvailabilityChanged(BtAbstractDevSetting *, bool)),
+            this, SLOT(handleSettingChange(BtAbstractDevSetting *, bool)));
+    BTUI_ASSERT_X( ret, "BtCpUiDeviceDetail::appendDeviceToList", "connect settingAvailabilityChanged() failed");
+
+}
+
+void BtCpUiDeviceDetail::handleSettingChange(BtAbstractDevSetting *setting, bool available)
+{
+    QList<BtDeviceDetails>::iterator i;
+       
+    for (i = mDeviceDetailList.begin(); i != mDeviceDetailList.end(); ++i) {
+        if((setting == (*i).mSetting) && mDeviceDetailView) {
+            (*i).mSettingAvailable = available;
+            if(available) {
+                if(((*i).mSettingForm)) {
+                    //If item already exists, remove it first.
+                    mDeviceDetailView->removeItem((*i).mSettingForm);
+                }
+                (*i).mSettingForm = setting->getSettingWidget();
+                //add widget
+                mDeviceDetailView->addItem((*i).mSettingForm);
+            }
+            else {
+                if((*i).mSettingForm) {
+                    //remove widget
+                    mDeviceDetailView->removeItem((*i).mSettingForm);
+                    (*i).mSettingForm = 0;
+                    checkDeviceDetailSettings();
+                }
+            }
+            notifyDeviceDetailStatus();
+        }
+    }
+}
+
+
+void BtCpUiDeviceDetail::checkDeviceDetailSettings()
+{
+    QList<BtDeviceDetails>::const_iterator i;
+    bool devicedetail = false;
+    
+    for (i = mDeviceDetailList.constBegin(); i != mDeviceDetailList.constEnd(); ++i) {
+        if((*i).mSettingForm) {
+            devicedetail = true;
+            break;
+        }
+    }
+    //If no setting is available and current view is device detail 
+    //view move to previous view.
+    if((!devicedetail) && (mMainWindow->currentView() == mDeviceDetailView)) {
+        mMainWindow->removeView(mDeviceDetailView); 
+        mMainWindow->setCurrentView( mPreviousView );
+    }
+}
+
+void BtCpUiDeviceDetail::notifyDeviceDetailStatus()
+{
+    QList<BtDeviceDetails>::const_iterator i;
+    bool devicedetail = false;
+    
+    for (i = mDeviceDetailList.constBegin(); i != mDeviceDetailList.constEnd(); ++i) {
+        if(((*i).mSettingAvailable == true) && ((*i).mSettingForm) ) {
+            devicedetail = true;
+            break;
+        }
+    }
+    emit deviceSettingsChanged(devicedetail);
+}
+
+void BtCpUiDeviceDetail::clearDeviceDetailList()
+{
+    QList<BtDeviceDetails>::const_iterator i;
+    
+    for (i = mDeviceDetailList.constBegin(); i != mDeviceDetailList.constEnd(); ++i) {
+        if((*i).mSetting ) {
+            disconnect((*i).mSetting);
+            delete (*i).mSetting;
+        }
+    }
+    mDeviceDetailList.clear();
+}
+
+void BtCpUiDeviceDetail::createDeviceDetailsView(QString deviceName)
+{
+    bool ret = false;
+    //Launch Device Detail View.
+    mDeviceDetailView = new BtCpUiDeviceDetailsView();
+    mDeviceDetailView->setDeviceName(deviceName);
+    
+    ret = connect(mDeviceDetailView, SIGNAL(aboutToClose()), this,
+            SLOT(handleDeviceDetailViewClose()));
+    BTUI_ASSERT_X( ret, "BtCpUiDeviceDetail::loadDeviceDetailsView", "connect deviceDetailViewClosed() failed");
+
+    QList<BtDeviceDetails>::const_iterator i;
+    
+    for (i = mDeviceDetailList.constBegin(); i != mDeviceDetailList.constEnd(); ++i) {
+        if((*i).mSettingForm) {
+            mDeviceDetailView->addItem((*i).mSettingForm);
+        }
+    }
+}
+
+void BtCpUiDeviceDetail::loadDeviceDetailsView()
+{
+
+    mPreviousView = mMainWindow->currentView();
+    mMainWindow->addView(mDeviceDetailView);
+    
+    notifyViewStatusToPlugins(AboutToShow);
+    
+    mMainWindow->setCurrentView( mDeviceDetailView );
+}
+
+void BtCpUiDeviceDetail::handleDeviceDetailViewClose()
+{
+    notifyViewStatusToPlugins(AboutToHide);
+    
+    mMainWindow->removeView(mDeviceDetailView);
+    
+    mMainWindow->setCurrentView( mPreviousView );
+
+}
+
+void BtCpUiDeviceDetail::notifyViewStatusToPlugins(BtCpUiDeviceDetail::NotifyType type)
+{
+    QList<BtDeviceDetails>::const_iterator i;
+    BtAbstractDevSetting *deviceSetting = 0;
+    for (i = mDeviceDetailList.constBegin(); i != mDeviceDetailList.constEnd(); ++i) {
+        deviceSetting = (*i).mSetting;
+        if(deviceSetting) {
+            switch(type) {
+                case AboutToShow:
+                    deviceSetting->aboutToForeground();
+                    break;
+                case AboutToHide:
+                    deviceSetting->aboutToBackground();
+                    break;
+                case AboutToClose:
+                    deviceSetting->aboutToClose();
+                    break;
+            }
+        }
+    }
+
+}
+
+void BtCpUiDeviceDetail::sendCloseEvent()
+{
+    notifyViewStatusToPlugins(AboutToClose);
+}
+
+