bluetoothengine/btui/btcpplugin/btcpuidevicedetail.cpp
author Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
Tue, 06 Jul 2010 14:27:09 +0300
changeset 41 0b2439c3e397
child 47 9e2a905b887f
permissions -rw-r--r--
Revision: 201025 Kit: 2010127

/*
 * 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()
{
    notifyViewStatusToPlugins(AboutToClose);
    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);
    }
    
    notifyDeviceDetailStatus();
    createDeviceDetailsView(deviceName);
}

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
                    //todo: In case if no items are there close this view
                    //and disable device settings button.
                    mDeviceDetailView->removeItem((*i).mSettingForm);
                    (*i).mSettingForm = 0; 
                }
            }
            notifyDeviceDetailStatus();
        }
    }
}


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;
            }
        }
    }

}