--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/bluetoothengine/btui/Ecom/src/BTUIPairedDevicesView.cpp Wed Sep 01 12:20:04 2010 +0100
@@ -0,0 +1,1904 @@
+/*
+* Copyright (c) 2002,2007 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: This is view that handles listing and
+ * unblocking blocked devices view.
+ *
+*/
+
+#include <avkon.hrh> // AVKON components
+#include <akntitle.h>
+#include <aknViewAppUi.h>
+#include <BtuiViewResources.rsg> // Compiled resource ids
+#include <featmgr.h> // Feature Manager
+
+#include <AknGlobalNote.h>
+#include <aknnotewrappers.h>
+#include <StringLoader.h> // Series 60 localisation stringloader
+#include <AknMediatorFacade.h>
+#include <aknmessagequerydialog.h>
+#include <aknnotewrappers.h>
+#include <aknnavi.h>
+#include <hlplch.h> // Help launcher
+#include <btengdiscovery.h> // for device search
+
+#include <ctsydomainpskeys.h>
+#include <bt_subscribe.h>
+#include <btengsettings.h>
+#include <centralrepository.h>
+#include <CoreApplicationUIsSDKCRKeys.h>
+#include <bamdesca.h>
+
+#include "debug.h"
+#include "btui.h" // Global declarations
+#include "BTUIPairedDevicesView.h"
+#include "BTUIDeviceContainer.h"
+#include <SecondaryDisplay/BtuiSecondaryDisplayAPI.h>
+#include <csxhelp/bt.hlp.hrh> // Help IDs
+
+#include <gstabhelper.h>
+#include <btui.mbg> // Tab icon for General Setting
+#include <bluetoothuiutil.h>
+#include "BTUIMainView.h" // base View.
+
+
+const TInt KAutoConnect2ndTry = 1;
+const TUint32 SetExcludePairedDeviceMask = 0x800000;
+
+// ================= MEMBER FUNCTIONS =======================
+
+// ---------------------------------------------------------
+// CBTUIPairedDevicesView::NewL
+// Two phased constructor called by BT AppUI when serve as part of btui.exe
+// ---------------------------------------------------------
+//
+CBTUIPairedDevicesView* CBTUIPairedDevicesView::NewL(MBtuiPluginViewActivationObserver* aObserver)
+ {
+ CBTUIPairedDevicesView* self = new (ELeave) CBTUIPairedDevicesView(aObserver);
+ CleanupStack::PushL(self);
+
+ self->iConstructAsGsPlugin = EFalse;
+ self->ConstructL();
+ CleanupStack::Pop(self);
+ return self;
+ }
+
+// ---------------------------------------------------------
+// CBTUIPairedDevicesView::NewLC
+// Two phased constructor called by mainView when serve as GS Plugin.
+// ---------------------------------------------------------
+//
+CBTUIPairedDevicesView* CBTUIPairedDevicesView::NewLC(CBTUIMainView* aBaseView, CArrayPtrFlat<MGSTabbedView>* aTabViewArray)
+ {
+ CBTUIPairedDevicesView* self = new (ELeave) CBTUIPairedDevicesView();
+ CleanupStack::PushL( self );
+
+ self->iConstructAsGsPlugin = ETrue;
+ self->ConstructL( aBaseView, aTabViewArray );
+
+ return self;
+ }
+
+
+// ---------------------------------------------------------
+// CBTUIPairedDevicesView::ConstructL
+// Symbian 2nd phase constructor can leave.
+// ---------------------------------------------------------
+//
+void CBTUIPairedDevicesView::ConstructL()
+ {
+ TRACE_FUNC_ENTRY
+
+ BaseConstructL(R_BTUI_OTHER_DEVICES_VIEW);
+
+ iCoverDisplayEnabled = FeatureManager::FeatureSupported(KFeatureIdCoverDisplay);
+ iHelpEnabled = FeatureManager::FeatureSupported(KFeatureIdHelp);
+
+ iDeviceSearcher = CBTEngDiscovery::NewL(this);
+ iBtEngSettings = CBTEngSettings::NewL(this);
+ iBTPluginMan = CBTUIPluginMan::NewL( AppUi() );
+ iIsAlreadyConnected = EFalse;
+ iExpectedCallBack = 0;
+ TRACE_INFO(_L("Initial iIsAlreadyConnected -> False"))
+ TRACE_FUNC_EXIT
+ }
+
+void CBTUIPairedDevicesView::ConstructL( CBTUIMainView* aBaseView, CArrayPtrFlat<MGSTabbedView>* aTabViewArray )
+ {
+ TRACE_FUNC_ENTRY
+
+ iBaseView = aBaseView,
+ iTabHelper = CGSTabHelper::NewL();
+ aTabViewArray->AppendL(this);
+
+ BaseConstructL(R_BTUI_OTHER_DEVICES_VIEW_GS);
+ iCoverDisplayEnabled = FeatureManager::FeatureSupported(KFeatureIdCoverDisplay);
+ iHelpEnabled = FeatureManager::FeatureSupported(KFeatureIdHelp);
+
+ iDeviceSearcher = CBTEngDiscovery::NewL(this);
+ iBtEngSettings=CBTEngSettings::NewL(this);
+ iBTPluginMan = CBTUIPluginMan::NewL( AppUi() );
+ iIsAlreadyConnected = EFalse;
+ TRACE_INFO(_L("Initial iIsAlreadyConnected = False"))
+ iExpectedCallBack = 0;
+
+ TRACE_FUNC_EXIT
+ }
+
+// ---------------------------------------------------------
+// CBTUIBlockedDevicesView::CBTUIBlockedDevicesView
+// ---------------------------------------------------------
+
+CBTUIPairedDevicesView::CBTUIPairedDevicesView( MBtuiPluginViewActivationObserver* aObserver )
+ : iActivationObserver(aObserver)
+ {
+ }
+
+// ---------------------------------------------------------
+// Destructor
+// ---------------------------------------------------------
+//
+CBTUIPairedDevicesView::~CBTUIPairedDevicesView()
+ {
+ TRACE_FUNC_ENTRY
+
+ //close dialogs if any
+ TRAP_IGNORE(
+ DialogDismissedL(EAknSoftkeyCancel);
+ );
+
+ delete iActive;
+
+ if (iContainer)
+ {
+ AppUi()->RemoveFromViewStack(*this, iContainer);
+ delete iContainer;
+ iContainer = NULL;
+ }
+
+ if(iDeviceSearcher)
+ {
+ // Canceling devicesearches is done by DialogDismissedL(),
+ // so it is not done here
+ delete iDeviceSearcher;
+ iDeviceSearcher = NULL ;
+ }
+ delete iConnectDevice;
+ iConnectDevice=NULL;
+
+ delete iPairingDevice;
+ delete iBtEngSettings;
+ delete iBTPluginMan;
+
+ if(iConstructAsGsPlugin)
+ delete iTabHelper;
+
+ CancelDisconnectQueryDlg();
+
+ TRACE_FUNC_EXIT
+ }
+
+// ---------------------------------------------------------
+// From CAknView
+// CBTUIPairedDevicesView::Id
+// ---------------------------------------------------------
+//
+TUid CBTUIPairedDevicesView::Id() const
+ {
+ TRACE_FUNC_ENTRY
+ return KBtuiPluginUidPairedDevicesView;//KBTOtherDevicesViewId;
+ }
+
+
+
+
+// ---------------------------------------------------------
+// From CAknView
+// CBTUIPairedDevicesView::HandleCommandL
+// Redirects commands to the appui class.
+// ---------------------------------------------------------
+//
+void CBTUIPairedDevicesView::HandleCommandL(TInt aCommand)
+ {
+ TRACE_FUNC_ENTRY
+
+ switch (aCommand)
+ {
+
+ case EAknSoftkeyBack:
+ // do not exit if devicechange is in progress.
+ if(iModel->DeviceChangeInProgress() )
+ return;
+ AppUi()->ActivateLocalViewL(iBaseView->GetParentView().iViewUid );
+ break;
+
+ case EAknSoftkeyExit:
+ {
+ TRACE_INFO(_L("EAknSoftkeyExit"))
+ // do not exit if devicechange or bt discovery is in progress.
+ if(iModel->DeviceChangeInProgress()
+ || iSearchOngoing )
+ {
+ TRACE_INFO(_L("exit denied, due to operation"))
+ return;
+ }
+
+ TRACE_INFO(_L("exit in progress"))
+ AppUi()->ProcessCommandL(EEikCmdExit);
+ break;
+ }
+
+ case EAknCmdHelp:
+ {
+ #ifdef __SERIES60_HELP
+ HlpLauncher::LaunchHelpApplicationL(iEikonEnv->WsSession(),AppUi()->AppHelpContextL());
+ #endif
+ break;
+ }
+
+ case EBTUICmdNewPairedDevice:
+ {
+ iSearchOngoing=ETrue;
+ NewPairedDeviceDlgL();
+ break;
+ }
+
+ case EBTUICmdDelete:
+ {
+ DeleteDeviceDlgL();
+ break;
+ }
+
+ case EBTUICmdDeleteAll:
+ {
+ DeleteAllDevicesDlgL();
+ break;
+ }
+
+ case EBTUICmdGiveNickname:
+ {
+ RenameDeviceDlgL();
+ break;
+ }
+
+ case EBTUICmdSetTrusted:
+ {
+ ChangeDeviceSecurityL(ETrue);
+ break;
+ }
+
+ case EBTUICmdSetUnTrusted:
+ {
+ ChangeDeviceSecurityL(EFalse);
+ break;
+ }
+
+ case EBTUICmdConnect:
+ case EBTUICmdConnectAudio:
+ {
+ TBTDevice device;
+ device.iIndex = iContainer->CurrentItemIndex();
+ iModel->GetDevice(device);
+ if ( device.iStatus & EStatusBtuiConnected )
+ {
+ // If device is already connected, we do nothing here.
+ break;
+ }
+ device.iOperation = EOpConnect;
+ ConnectL( device, ETrue );
+ break;
+ }
+
+ case EBTUICmdDisconnect:
+ {
+ DisconnectL();
+ break;
+ }
+
+ case EBTUICmdSetBlocked:
+ {
+ BlockDeviceDlgL();
+ break;
+ }
+
+ case EBTUICmdSettings:
+ {
+ LaunchSettingViewL();
+ break;
+ }
+
+ default:
+ {
+ AppUi()->HandleCommandL(aCommand);
+ break;
+ }
+ }
+ TRACE_FUNC_EXIT
+ }
+
+
+// ---------------------------------------------------------
+// From CAknView
+// CBTUIPairedDevicesView::DoActivateL
+// ---------------------------------------------------------
+//
+void CBTUIPairedDevicesView::DoActivateL(const TVwsViewId& /*aPrevViewId*/,
+ TUid /*aCustomMessageId*/,
+ const TDesC8& /*aCustomMessage*/)
+ {
+ TRACE_FUNC_ENTRY
+
+ iModel = CBTDevModel::NewL(EGroupPaired, this);
+ iContainer = CBTUiDeviceContainer::NewL(ClientRect(), this, EGroupPaired, this);
+ iContainer->SetMopParent(this); // MObjectProvider
+
+ // Setup title
+ HBufC* btTitlePairedDevices =
+ iCoeEnv->AllocReadResourceLC(R_BT_TITLE_PAIRED_DEV);
+ CEikStatusPane* statusPane = StatusPane();
+ CAknTitlePane* titlePane;
+ titlePane = (CAknTitlePane*) statusPane->ControlL(
+ TUid::Uid(EEikStatusPaneUidTitle));
+ titlePane->SetTextL(btTitlePairedDevices->Des());
+ CleanupStack::PopAndDestroy(btTitlePairedDevices); // btTitlePairedDevices
+ btTitlePairedDevices = NULL;
+
+ AppUi()->AddToStackL(*this, iContainer);
+
+ if( iBaseView && iConstructAsGsPlugin)
+ {
+ iTabHelper->CreateTabGroupL( Id(),
+ static_cast<CArrayPtrFlat<MGSTabbedView>*>
+ (iBaseView->TabbedViews()) );
+ }
+
+ // MSK menu is added here.
+ // the left key menu is added by resources.
+ MenuBar()->SetContextMenuTitleResourceId(
+ R_BTUI_MENUBAR_OTHER_DEVICES_VIEW_CONTEXT);
+ // notify observer
+ if( iActivationObserver && iConstructAsGsPlugin == EFalse)
+ {
+ iActivationObserver->PluginViewActivated(EPairedDevicesViewId);
+ }
+
+ TRACE_FUNC_EXIT
+ }
+
+// ---------------------------------------------------------
+// From CAknView
+// CBTUIPairedDevicesView::DoDeactivate
+// ---------------------------------------------------------
+//
+void CBTUIPairedDevicesView::DoDeactivate()
+ {
+ TRACE_FUNC_ENTRY
+
+ if (iContainer)
+ {
+ AppUi()->RemoveFromStack(iContainer);
+ delete iContainer;
+ iContainer = NULL;
+ }
+ if ( iDeviceSearcher )
+ {
+ iDeviceSearcher->CancelSearchRemoteDevice();
+ }
+ delete iModel;
+ iModel=NULL;
+ if(iConstructAsGsPlugin)
+ iTabHelper->RemoveTabGroup();
+ delete iActive;
+ iActive = NULL;
+ iIsPairConnect = EFalse;
+ TRACE_FUNC_EXIT
+ }
+
+// ---------------------------------------------------------
+// From CAknView
+// CBTUIPairedDevicesView::DynInitMenuPaneL
+// Shows only options supported for selected device, if any.
+// If not show only options supported regardless of selected
+// device
+// ---------------------------------------------------------
+//
+void CBTUIPairedDevicesView::DynInitMenuPaneL(TInt aResId, CEikMenuPane* aMenu)
+ {
+ TRACE_FUNC_ENTRY
+
+ // dim help if it exists and is not supported
+ TInt tmp;
+ if ( aMenu->MenuItemExists(EAknCmdHelp,tmp ) )
+ {
+ aMenu->SetItemDimmed(EAknCmdHelp,
+ !FeatureManager::FeatureSupported( KFeatureIdHelp ) );
+ }
+
+ if ( aResId == R_BTUI_OTHER_DEVICES_VIEW_MENU )
+ {
+
+ TInt index = iContainer->CurrentItemIndex();
+
+ if ( index < 0 ) // No devices at list. Hide all device related commands.
+ {
+ aMenu->SetItemDimmed(EBTUICmdDeleteAll, ETrue);
+ }
+ else
+ {
+ SetupMenuCmd(index, aMenu);
+ }
+ }
+
+ if ( aResId == R_BTUI_OTHER_DEVICES_VIEW_MENU_CONTEXT )
+ {
+ iActiveMenuPane = aMenu;
+ TInt index = iContainer->CurrentItemIndex();
+
+ // If user is fast enough to click the RSK option between
+ // bt discovery view and device found view, bt ui will crash.
+ // Therefore, we disable commands if bt discovery is onging.
+ //
+ if(iSearchOngoing)
+ {
+ aMenu->SetItemDimmed(EBTUICmdGiveNickname, ETrue);
+ aMenu->SetItemDimmed(EBTUICmdSetTrusted, ETrue);
+ aMenu->SetItemDimmed(EBTUICmdSetUnTrusted, ETrue);
+ aMenu->SetItemDimmed(EBTUICmdSetBlocked, ETrue);
+ aMenu->SetItemDimmed(EBTUICmdDelete, ETrue);
+ aMenu->SetItemDimmed(EBTUICmdConnect, ETrue);
+ aMenu->SetItemDimmed(EBTUICmdConnectAudio, ETrue);
+ aMenu->SetItemDimmed(EBTUICmdDisconnect, ETrue);
+ aMenu->SetItemDimmed(EBTUICmdNewPairedDevice, ETrue);
+ return;
+ }
+
+ if(index < 0) // No devices at list. Hide all device related commands.
+ {
+ TRACE_INFO(_L("no devices in list"))
+
+ aMenu->SetItemDimmed(EBTUICmdGiveNickname, ETrue);
+ aMenu->SetItemDimmed(EBTUICmdSetTrusted, ETrue);
+ aMenu->SetItemDimmed(EBTUICmdSetUnTrusted, ETrue);
+ aMenu->SetItemDimmed(EBTUICmdSetBlocked, ETrue);
+ aMenu->SetItemDimmed(EBTUICmdDelete, ETrue);
+ aMenu->SetItemDimmed(EBTUICmdConnect, ETrue);
+ aMenu->SetItemDimmed(EBTUICmdConnectAudio, ETrue);
+ aMenu->SetItemDimmed(EBTUICmdDisconnect, ETrue);
+ aMenu->SetItemDimmed(EBTUICmdSettings, ETrue);
+ }
+ else // There are devices at list
+ {
+ SetupMenuCmd(index, aMenu);
+ //Hide New pair device in context menu
+ aMenu->SetItemDimmed(EBTUICmdNewPairedDevice, ETrue);
+ }
+ }
+ TRACE_FUNC_EXIT
+ }
+
+
+// ----------------------------------------------------------
+// CBTUIPairedDevicesView::RenameDeviceDlgL
+// ----------------------------------------------------------
+//
+void CBTUIPairedDevicesView::RenameDeviceDlgL()
+ {
+ TRACE_FUNC_ENTRY
+
+ TInt index = iContainer->CurrentItemIndex();
+ if(index == KErrNotFound) return;
+
+ TBTDevice device;
+ device.iIndex = index;
+ iModel->GetDevice(device);
+ TBTDeviceName name = device.iName;
+
+ CAknTextQueryDialog* dlg = CAknTextQueryDialog::NewL(device.iName);
+ TInt keypress = dlg->ExecuteLD(R_BT_ENTER_NICKNAME_QUERY);
+
+ if(keypress) // User has accepted the dialog
+ {
+ if(device.iName != name) // Check if the user really changed the name
+ {
+ device.iOperation = EOpChangeName;
+ // Remove trouble making control chars
+ AknTextUtils::StripCharacters(device.iName, KAknStripListControlChars);
+ device.iName.TrimAll(); // Remove extra spaces
+ iModel->ChangeDevice(device);
+ }
+ }
+ TRACE_FUNC_EXIT
+ }
+
+
+// ----------------------------------------------------------
+// CBTUIPairedDevicesView::NewPairedDeviceDlgL
+//
+// Initiate bonding (pairing) by opening the search dialog.
+// DeviceSearchComplete is called after that.
+// ----------------------------------------------------------
+//
+void CBTUIPairedDevicesView::NewPairedDeviceDlgL()
+ {
+ TRACE_FUNC_ENTRY
+ // we must not have other pairing in progress.
+ // we maight issue an error, but none is defined by
+ // ui spec. Anyhow this should be possible
+ // only by pressing everything roo rapidly.
+ if(iPairingDevice!=NULL)
+ return;
+ iPairingDevice = CBTDevice::NewL();
+
+ // Here we use last bit in device class to inform bt inquiry notifier
+ // not to display the device which is already paired and in the paired
+ // device list.
+
+ // We use DeviceClass to tell btnotif not to show paired device in
+ // bt discovery notifier through bteng.
+ // Set bit 24 to 1 ( bit 24 is not used for any other purpose currently )
+ iPairingDevice->SetDeviceClass(iPairingDevice->DeviceClass().DeviceClass() | SetExcludePairedDeviceMask );
+ TInt err = iDeviceSearcher->SearchRemoteDevice(iPairingDevice,
+ &iPairingDevNameEntry,
+ iPairingDevice->DeviceClass().DeviceClass());
+
+
+ if(err != KErrNone)
+ {
+ delete iPairingDevice;
+ iPairingDevice=NULL;
+ TBTUIViewsCommonUtils::ShowGeneralErrorNoteL();
+ }
+ TRACE_FUNC_EXIT
+ }
+
+// ----------------------------------------------------------
+// CBTUIPairedDevicesView::DeleteDeviceDlgL
+// ----------------------------------------------------------
+//
+void CBTUIPairedDevicesView::DeleteDeviceDlgL()
+ {
+ TRACE_FUNC_ENTRY
+
+ iExpectedCallBack = 0;
+ TInt index = iContainer->CurrentItemIndex();
+ if(index == KErrNotFound) return;
+
+ TBTDevice device;
+ device.iIndex = index;
+ iModel->GetDevice(device);
+
+ RBuf stringholder;
+ CleanupClosePushL( stringholder );
+
+ TInt tmp=EStatusBtuiConnected|EStatusPhysicallyConnected;
+ // Choose confirmation phrase
+ TInt resourceId = ( device.iStatus & tmp ) ? R_BT_WARN_ERASE_CONNECTED :
+ R_BT_WARN_ERASE;
+ BluetoothUiUtil::LoadResourceAndSubstringL(
+ stringholder, resourceId, device.iName, 0 );
+
+ // Create confirmation query
+ //
+ CAknQueryDialog* dlg = CAknQueryDialog::NewL();
+
+ if(iCoverDisplayEnabled)
+ {
+ CleanupStack::PushL(dlg);
+ dlg->PublishDialogL(ECmdShowBtWarnEraseNote, KUidCoverUiCategoryBtui);
+ // initializes cover support
+ CleanupStack::Pop(dlg);
+
+ CAknMediatorFacade* covercl = AknMediatorFacade(dlg); // uses MOP, so control provided
+ if (covercl) // returns null if __COVER_DISPLAY is not defined
+ {
+ covercl->BufStream() << BTDeviceNameConverter::ToUTF8L(device.iName) ;// takes copy so consts are ok too
+ covercl->BufStream().CommitL(); // no more data to send so commit buf
+ }
+ }
+ TInt keypress = dlg->ExecuteLD(R_BT_WARN_ERASE_QUERY, stringholder);
+
+ CleanupStack::PopAndDestroy(&stringholder); // stringholder
+
+ if(keypress) // User has accepted the dialog
+ {
+ // If device is connected we need to first to disconnect
+ // then unpair, otherwise unpairing does not succeed.
+ if((device.iStatus & EStatusBtuiConnected) == EStatusBtuiConnected)
+ {
+ iExpectedCallBack++;
+ DisconnectWithoutQuery();
+ return;
+ }
+ device.iOperation = EOpUnpair;
+ iModel->ChangeDevice(device);
+ }
+
+ TRACE_FUNC_EXIT
+ }
+
+// ----------------------------------------------------------
+// CBTUIPairedDevicesView::DeleteAllDevicesDlgL
+// ----------------------------------------------------------
+//
+void CBTUIPairedDevicesView::DeleteAllDevicesDlgL()
+ {
+ TRACE_FUNC_ENTRY
+
+ iExpectedCallBack = 0;
+ CAknQueryDialog* dlg = CAknQueryDialog::NewL();
+ TInt keypress = KErrNone;
+
+ CleanupStack::PushL(dlg);
+
+ // Choose and execute confirmation query
+ //
+ if (iModel->IsAnyDeviceConnected())
+ {
+ if(iCoverDisplayEnabled)
+ {
+ dlg->PublishDialogL(ECmdShowBtWarnEraseAllConnectedQuery, KUidCoverUiCategoryBtui); // initializes cover support
+ }
+
+ keypress = dlg->ExecuteLD(R_BT_WARN_ERASE_ALL_CONNECTED_QUERY);
+ }
+ else
+ {
+ if(iCoverDisplayEnabled)
+ {
+ dlg->PublishDialogL(ECmdShowBtWarnEraseAllQuery, KUidCoverUiCategoryBtui); // initializes cover support
+ }
+
+ keypress = dlg->ExecuteLD(R_BT_WARN_ERASE_ALL_QUERY);
+ }
+ CleanupStack::Pop(dlg);
+
+ if(keypress) // User has accepted the dialog
+ {
+ TInt count = iContainer->CountItems();
+ for (TInt i = 0; i < count; i++)
+ {
+ // If device is connected we need to first to disconnect
+ // then unpair, otherwise unpairing does not succeed.
+ TBTDevice device;
+ device.iIndex = i;
+ iModel->GetDevice(device);
+ if((device.iStatus & EStatusBtuiConnected) == EStatusBtuiConnected)
+ {
+ iExpectedCallBack++;
+ }
+ }
+ TRACE_INFO((_L("iExpectedCallBack %d"), iExpectedCallBack ))
+
+ for (TInt i = 0; i < count; i++)
+ {
+ // If device is connected we need to first to disconnect
+ // then unpair, otherwise unpairing does not succeed.
+ TBTDevice device;
+ device.iIndex = i;
+ iModel->GetDevice(device);
+
+ if((device.iStatus & EStatusBtuiConnected) == EStatusBtuiConnected)
+ {
+ //disconnect it first, removal will be done in
+ //callback NotifyChangeDeviceCompleteL for ChangeDevice() below
+ TRACE_INFO((_L("EOpDisconnect issued for %d"), i ))
+ device.iOperation = EOpDisconnect;
+ iModel->ChangeDevice(device);
+ }
+ else
+ {
+ //otherwise, just remove it from the paired view
+ device.iOperation = EOpUnpair;
+ iModel->ChangeDevice(device);
+ }
+ }
+ }
+
+ TRACE_FUNC_EXIT
+ }
+// ----------------------------------------------------------
+// CBTUIPairedDevicesView::BlockDeviceDlgL
+// ----------------------------------------------------------
+void CBTUIPairedDevicesView::BlockDeviceDlgL()
+ {
+ TRACE_FUNC_ENTRY
+
+ TInt index = iContainer->CurrentItemIndex();
+ if(index == KErrNotFound) return;
+
+ TBTDevice device;
+ device.iIndex = index;
+ iModel->GetDevice(device);
+
+ //check if this is connected device
+
+ HBufC* header= iCoeEnv->AllocReadResourceLC(R_BT_OPTION_BLOCK_DEVICE_HEADER);
+
+ RBuf stringHolder;
+ CleanupClosePushL( stringHolder );
+ TInt resouseId;
+ if (device.iStatus & (EStatusBtuiConnected|EStatusPhysicallyConnected) )
+ {
+ resouseId = iHelpEnabled? R_BT_OPTION_BLOCK_PAIRED_DEVICE_HELP :
+ R_BT_OPTION_BLOCK_PAIRED_DEVICE_NOHELP;
+ }
+ else
+ {
+ resouseId = iHelpEnabled ? R_BT_OPTION_BLOCK_PAIRED_DEVICE_HELP :
+ R_BT_OPTION_BLOCK_PAIRED_DEVICE_NOHELP;
+ }
+ BluetoothUiUtil::LoadResourceAndSubstringL(
+ stringHolder, resouseId, device.iName, 0 );
+
+ CAknMessageQueryDialog *queryDialog = CAknMessageQueryDialog::NewL (stringHolder,
+ CAknQueryDialog::EConfirmationTone);
+ queryDialog->PrepareLC(R_BT_MESSAGE_QUERY);
+
+ (queryDialog)->Heading()->SetTextL(*header);
+ queryDialog->SetFocus(ETrue);
+
+ TInt keypress=EFalse;
+#ifdef __SERIES60_HELP
+ if (iHelpEnabled)
+ {
+ HBufC* queryLink = StringLoader::LoadL(R_BT_BLOCK_DEVICE_LINK);
+ TCoeHelpContext hc(KBtuiUid3,KBT_HLP_BLOCKED);
+ TCallBack helpCallBack(CBTUIPairedDevicesView::LaunchHelp , &hc);
+
+ TRAPD(err,
+ static_cast<CAknMessageQueryDialog*>(queryDialog)->SetLinkTextL(*queryLink);
+ static_cast<CAknMessageQueryDialog*>(queryDialog)->SetLink(helpCallBack););
+ if(err==KErrNone)
+ {
+ keypress = queryDialog->RunLD();
+ }
+
+ delete queryLink;
+ queryLink = NULL;
+ }
+ else
+#endif
+ {
+ keypress = queryDialog->RunLD();
+ }
+
+ CleanupStack::PopAndDestroy(&stringHolder);
+ CleanupStack::PopAndDestroy(header);
+
+ if(keypress)
+ {
+ device.iOperation = EOpBlock;
+ iModel->ChangeDevice(device);
+ }
+ TRACE_FUNC_EXIT
+ }
+// ----------------------------------------------------------
+// CBTUIPairedDevicesView::ChangeDeviceSecurityL
+// ----------------------------------------------------------
+//
+void CBTUIPairedDevicesView::ChangeDeviceSecurityL(TBool aTrusted)
+ {
+ TRACE_FUNC_ENTRY
+
+ TInt index = iContainer->CurrentItemIndex();
+ if(index == KErrNotFound) return;
+
+ TBTDevice device;
+ device.iIndex = index;
+ iModel->GetDevice(device);
+
+ if(aTrusted)
+ {
+ // set to trusted
+ CAknQueryDialog* dlg = CAknQueryDialog::NewL();
+
+ if(iCoverDisplayEnabled)
+ {
+ CleanupStack::PushL(dlg);
+ dlg->PublishDialogL(ECmdShowBtAuthConfirmQuery, KUidCoverUiCategoryBtui); // initializes cover support
+ CleanupStack::Pop(dlg);
+ }
+ TInt keypress = dlg->ExecuteLD(R_BT_SET_TRUSTED_QUERY);
+
+ if(keypress) // User has accepted the dialog
+ {
+ device.iOperation = EOpTrust;
+ iModel->ChangeDevice(device);
+ }
+ }
+ else
+ {
+ device.iOperation = EOpUntrust;
+ iModel->ChangeDevice(device);
+ }
+ TRACE_FUNC_EXIT
+ }
+
+// ----------------------------------------------------
+// CBTUIMainView::VisibilityModeChanged
+// ----------------------------------------------------
+//
+void CBTUIPairedDevicesView::VisibilityModeChanged( TBTVisibilityMode )
+ {
+ TRACE_FUNC_ENTRY
+
+
+ TRACE_FUNC_EXIT
+ }
+
+
+// ----------------------------------------------------
+// CBTUIMainView::PowerStateChanged
+// ----------------------------------------------------
+//
+void CBTUIPairedDevicesView::PowerStateChanged( TBTPowerStateValue )
+ {
+ TRACE_FUNC_ENTRY
+
+ if ( iIsConnectDevice )
+ {
+ iModel->ChangeDevice(*iConnectDevice);
+ iIsConnectDevice = EFalse; // reset flag
+ }
+
+ TRACE_FUNC_EXIT
+ }
+
+// ----------------------------------------------------------
+// CBTUIPairedDevicesView::ConnectL
+// ----------------------------------------------------------
+//
+void CBTUIPairedDevicesView::ConnectL(
+ const TBTDevice& aDevice, TBool aNewWaitNote )
+ {
+ TRACE_FUNC_ENTRY
+
+ iIsAlreadyConnected = EFalse;
+ TRACE_INFO(_L("Set iIsAlreadyConnected -> False"))
+ //Check that there is not more than max amount of connections allready.
+ TInt connNum = 0;
+ RProperty::Get(KPropertyUidBluetoothCategory, KPropertyKeyBluetoothPHYCount, connNum);
+ if(connNum > KBtUiMaxConnections)
+ {
+ ConnectCompleteL(KErrServerBusy, aDevice);
+ }
+ else if(CallOnGoing()&& connNum > 1)
+ {
+ CAknNoteDialog* dlg = new (ELeave) CAknNoteDialog(CAknNoteDialog::ENoTone,
+ CAknNoteDialog::ELongTimeout);
+ if(iCoverDisplayEnabled)
+ {
+ CleanupStack::PushL(dlg);
+ dlg->PublishDialogL(ECmdShowBtImpossibleIncallNote, KUidCoverUiCategoryBtui); // initializes cover support
+ CleanupStack::Pop(dlg);
+ }
+
+ dlg->ExecuteLD(R_BT_NOT_INCALL_NOTE);
+ }
+ else
+ {
+ if(TBTUIViewsCommonUtils::TurnBTOnIfNeededL(iBtEngSettings,iCoverDisplayEnabled)!= KErrNone)
+ return;
+
+ TInt errorCode = KErrNone;
+ TBTPowerStateValue currentPowerMode;
+ errorCode=iBtEngSettings->GetPowerState(currentPowerMode);
+
+ if(errorCode)
+ {
+ // handle the error code
+ return;
+ }
+ if ( aNewWaitNote )
+ {
+ // Launch wait note
+ OpenWaitNoteL(iWaitForConnectDlg,R_BT_CONNECTING_TO_WAIT_NOTE,R_BT_CONNECTING_TO ,
+ ECmdShowBtWaitConnectingToNote,aDevice.iName);
+ }
+ iConnectDevice=new(ELeave) TBTDevice(aDevice);
+ iConnectDevice->iOperation=EOpConnect;
+
+ if( currentPowerMode == EBTPowerOff )
+ {
+ // turn on the flag IsConnectDevice
+ //
+ iIsConnectDevice = ETrue;
+ }
+ else
+ {
+ // connect device
+ //
+ iModel->ChangeDevice(*iConnectDevice);
+
+ // reset IsConnectDevice flag
+ iIsConnectDevice = EFalse;
+ }
+ }
+ TRACE_FUNC_EXIT
+ }
+
+// ----------------------------------------------------------
+// CBTUIPairedDevicesView::OpenWaitNoteL
+// ----------------------------------------------------------
+void CBTUIPairedDevicesView::OpenWaitNoteL(CAknWaitDialog*& aWaitDialog,TUint aNoteResource,TUint aNoteTextResource,
+ TSecondaryDisplayBtuiDialogs aSec,const TDesC& aDevName)
+ {
+ TRAPD(err,
+ RBuf stringholder;
+ CleanupClosePushL( stringholder );
+ BluetoothUiUtil::LoadResourceAndSubstringL(
+ stringholder, aNoteTextResource, aDevName, 0 );
+ aWaitDialog = new (ELeave) CAknWaitDialog(
+ reinterpret_cast<CEikDialog**>(&aWaitDialog), ETrue);
+ aWaitDialog->PrepareLC(aNoteResource);
+ aWaitDialog->SetTextL(stringholder);
+
+ if(iCoverDisplayEnabled)
+ {
+ aWaitDialog->PublishDialogL(
+ aSec, KUidCoverUiCategoryBtui); // initializes cover support
+ CAknMediatorFacade* covercl = AknMediatorFacade(aWaitDialog); // uses MOP, so control provided
+ if (covercl) // returns null if __COVER_DISPLAY is not defined
+ {
+ covercl->BufStream() << BTDeviceNameConverter::ToUTF8L(aDevName);// takes copy so consts are ok too
+ covercl->BufStream().CommitL(); // no more data to send so commit buf
+ }
+ }
+ aWaitDialog->SetCallback(this); // for capturing Cancel keypress
+ aWaitDialog->RunLD();
+
+ CleanupStack::PopAndDestroy(&stringholder); // stringholder
+ );
+ // if the above functions leaves the iWaitNote is deleted, but
+ // not set to NULL. This will cause a problem, when
+ // the items may be deleted again, since it has to
+ // be a member variable, in order to be closed
+ // programmatically.
+ if(err!=KErrNone)
+ {
+ // that is why we set it to NULL here and
+ // continue leaving further.
+ aWaitDialog=NULL;
+ User::Leave(err);
+ }
+ }
+
+// ----------------------------------------------------------
+// CBTUIPairedDevicesView::LaunchSettingViewL
+// ----------------------------------------------------------
+//
+void CBTUIPairedDevicesView::LaunchSettingViewL()
+ {
+ TRACE_FUNC_ENTRY
+
+ TInt index = iContainer->CurrentItemIndex();
+ if(index == KErrNotFound) return;
+ TBTDevice device;
+ device.iIndex = index;
+ iModel->GetDevice(device);
+
+ CAknView* settingView = iBTPluginMan->GetSettingViewL(device);
+ if(settingView != NULL)
+ {
+ TUid viewId = settingView->Id();
+ if(( device.iStatus & EStatusBtuiConnected) == EStatusBtuiConnected )
+ {
+ TBuf8<KMaxBCBluetoothNameLen> DeviceName;
+ DeviceName.Copy(device.iName);
+ AppUi()->ActivateLocalViewL( viewId, KNullUid, DeviceName);
+ }
+ else
+ {
+ AppUi()->ActivateLocalViewL( viewId );
+ }
+ }
+ else
+ {
+ User::Leave(KErrNotFound);
+ }
+
+ TRACE_FUNC_EXIT
+ }
+
+// ----------------------------------------------------------
+// CBTUIPairedDevicesView::DisconnectL
+// ----------------------------------------------------------
+//
+void CBTUIPairedDevicesView::DisconnectL()
+ {
+ TRACE_FUNC_ENTRY
+
+ TInt index = iContainer->CurrentItemIndex();
+ if(index == KErrNotFound) return;
+
+ TBTDevice device;
+ device.iIndex = index;
+ iModel->GetDevice(device);
+
+ if ( !( device.iStatus & EStatusBtuiConnected) )
+ {
+ // If device is already disconnected, return immediately.
+ return;
+ }
+
+ iDisconnectQueryDevice = device;//remember device related with query dialog
+
+ // Create confirmation query
+ RBuf stringholder;
+ CleanupClosePushL( stringholder );
+ BluetoothUiUtil::LoadResourceAndSubstringL(
+ stringholder, R_BT_DISCONNECT_FROM, device.iName, 0 );
+ if ( !iDisconnectQueryDlg )
+ {
+ iDisconnectQueryDlg = CAknQueryDialog::NewL();
+ }
+
+ if(iCoverDisplayEnabled)
+ {
+ iDisconnectQueryDlg->PublishDialogL(ECmdShowDisconnectQuery, KUidCoverUiCategoryBtui); // initializes cover support
+
+ CAknMediatorFacade* covercl = AknMediatorFacade(iDisconnectQueryDlg); // uses MOP, so control provided
+ if (covercl) // returns null if __COVER_DISPLAY is not defined
+ {
+ covercl->BufStream() << BTDeviceNameConverter::ToUTF8L(device.iName);// takes copy so consts are ok too
+ covercl->BufStream().CommitL(); // no more data to send so commit buf
+ }
+ }
+
+ TInt keypress = iDisconnectQueryDlg->ExecuteLD(R_BT_DISCONNECT_FROM_QUERY, stringholder);
+
+ CleanupStack::PopAndDestroy(&stringholder); // stringholder
+
+ iDisconnectQueryDlg = NULL;
+ if(keypress) // User has accepted the dialog
+ {
+ device.iOperation = EOpDisconnect;
+ iModel->ChangeDevice(device);
+ }
+ TRACE_FUNC_EXIT
+ }
+
+// ----------------------------------------------------------
+// CBTUIPairedDevicesView::CancelDisconnectQueryDlgL
+// ----------------------------------------------------------
+//
+void CBTUIPairedDevicesView::CancelDisconnectQueryDlg()
+{
+ TRACE_FUNC_ENTRY
+
+ if(iDisconnectQueryDlg)
+ {
+ delete iDisconnectQueryDlg;
+ iDisconnectQueryDlg = NULL;
+ }
+
+ TRACE_FUNC_EXIT
+}
+
+// ----------------------------------------------------------
+// CBTUIPairedDevicesView::DisconnectWithoutQuery
+// ----------------------------------------------------------
+//
+void CBTUIPairedDevicesView::DisconnectWithoutQuery()
+{
+ TRACE_FUNC_ENTRY
+
+ TInt index = iContainer->CurrentItemIndex();
+ if(index == KErrNotFound) return;
+
+ TBTDevice device;
+ device.iIndex = index;
+ iModel->GetDevice(device);
+ device.iOperation = EOpDisconnect;
+ iModel->ChangeDevice(device);
+}
+// ----------------------------------------------------------
+// CBTUIPairedDevicesView::ConnectCompleteL
+// ----------------------------------------------------------
+//
+void CBTUIPairedDevicesView::ConnectCompleteL(TInt aError,const TBTDevice& aDevice,
+ const RBTDevNameArray* aConflictingDeviceNames)
+ {
+ TRACE_FUNC_ENTRY
+
+ // Dismiss wait note
+ //
+ if(iConnectDevice)
+ {
+ delete iConnectDevice;
+ iConnectDevice=NULL;
+ }
+
+ if ( iIsPairConnect )
+ {
+ iIsPairConnect = EFalse;
+ if ( aError != KErrNone &&
+ aError != KErrCancel &&
+ aError != KErrNotSupported &&
+ aError != KErrAlreadyExists &&
+ aError != KErrServerBusy )
+ {
+ // It is possible that we started connecting too soon before the
+ // device moves to conntable mode from pairing mode. Let's try
+ // once more:
+ if ( !iActive )
+ {
+ iActive = CBTUIActive::NewL(
+ this, KAutoConnect2ndTry, CActive::EPriorityStandard );
+ }
+ iActive->RequestStatus() = KRequestPending;
+ iActive->GoActive();
+ TRequestStatus* stptr = &( iActive->RequestStatus() );
+ User::RequestComplete( stptr, KErrNone );
+ TRACE_INFO( _L("CBTUIPairedDevicesView, sceadule auto connect 2nd try") )
+ return;
+ }
+ }
+
+ if(iWaitForConnectDlg)
+ {
+ TRACE_INFO(_L("waiting dialog is active, dismiss it"))
+ iWaitForConnectDlg->ProcessFinishedL();
+ }
+
+ switch (aError)
+ {
+ case KErrCancel:
+ TRACE_INFO(_L("aError = KErrCancel"))
+ break;
+ case KErrAlreadyExists: // connection exists allready
+ {
+ RBuf stringholder;
+ CleanupClosePushL( stringholder );
+ if(aConflictingDeviceNames && aConflictingDeviceNames->Count()> 0)
+ {
+ if(aConflictingDeviceNames->Count() == 1)
+ {
+ BluetoothUiUtil::LoadResourceAndSubstringL( stringholder,
+ R_BT_DISCONNECT_FIRST_PROMPT,
+ *(*aConflictingDeviceNames)[0], 0 );
+ }
+ else
+ {
+ BluetoothUiUtil::LoadResourceAndSubstringL( stringholder,
+ R_BT_DISCONNECT_FIRST_STEREO_PROMPT,
+ *(*aConflictingDeviceNames)[0], 0 );
+ BluetoothUiUtil::AddSubstringL( stringholder, *(*aConflictingDeviceNames)[1], 1 );
+ }
+ TRACE_INFO(_L("KErrAllreadyExists"))
+ }
+ else
+ {
+ // Showing a note in this case would always show a note with "%U" in it
+ // so the note is not shown at all
+ TRACE_INFO(_L("KErrAlreadyExists, but no device given, not showing a notification"))
+ CleanupStack::PopAndDestroy(&stringholder);
+ break;
+ }
+
+ CAknInformationNote* note = new (ELeave) CAknInformationNote();
+
+ if(iCoverDisplayEnabled)
+ {
+ CleanupStack::PushL(note);
+ note->PublishDialogL(ECmdShowBtDisconnectFirstNote, KUidCoverUiCategoryBtui); // initializes cover support
+ CleanupStack::Pop(note);
+
+ CAknMediatorFacade* covercl = AknMediatorFacade(note); // uses MOP, so control provided
+ if (covercl) // returns null if __COVER_DISPLAY is not defined
+ {
+ if(aConflictingDeviceNames && aConflictingDeviceNames->Count()> 0)
+ {
+ covercl->BufStream() << BTDeviceNameConverter::ToUTF8L(*(*aConflictingDeviceNames)[0]);
+ }
+ covercl->BufStream().CommitL(); // no more data to send so commit buf
+ }
+ }
+
+ note->ExecuteLD(stringholder);
+ CleanupStack::PopAndDestroy(&stringholder);
+ }
+ break;
+ case KErrServerBusy:
+ {
+ CAknNoteDialog* dlg = new (ELeave) CAknNoteDialog(
+ CAknNoteDialog::ENoTone,CAknNoteDialog::ELongTimeout);
+ if(iCoverDisplayEnabled)
+ {
+ CleanupStack::PushL(dlg);
+ dlg->PublishDialogL(ECmdBtuiShowBtBusyNote, KUidCoverUiCategoryBtui); // initializes cover support
+ CleanupStack::Pop(dlg);
+ }
+
+ dlg->ExecuteLD(R_BT_BUSY);
+ }
+ break;
+ case KErrNone:
+ {
+
+ TRACE_INFO(_L("aError = KErrNone"))
+ // Create note
+ //
+ CAknInformationNote* notePtr = new (ELeave) CAknInformationNote();
+
+ RBuf stringHolder;
+ CleanupClosePushL( stringHolder );
+
+ BluetoothUiUtil::LoadResourceAndSubstringL( stringHolder,
+ R_BT_CONF_CONNECTED_PROMPT, aDevice.iName, 0 );
+
+ if(iCoverDisplayEnabled)
+ {
+ CleanupStack::PushL(notePtr);
+ notePtr->PublishDialogL(ECmdBtuiShowBtConfConnected, KUidCoverUiCategoryBtui); // initializes cover support
+ CleanupStack::Pop(notePtr);
+
+ CAknMediatorFacade* covercl = AknMediatorFacade(notePtr); // uses MOP, so control provided
+ if (covercl) // returns null if __COVER_DISPLAY is not defined
+ {
+ covercl->BufStream() << BTDeviceNameConverter::ToUTF8L(aDevice.iName);
+ covercl->BufStream().CommitL(); // no more data to send so commit buf
+ }
+ }
+
+ notePtr->ExecuteLD(stringHolder);
+ CleanupStack::PopAndDestroy(&stringHolder);
+ }
+
+ TRAP_IGNORE(LaunchSettingViewL();)
+ break;
+
+ case KErrNotSupported:
+ {
+ TRACE_INFO(_L("error = KErrNotSupported"))
+
+ RBuf stringHolder;
+ CleanupClosePushL( stringHolder );
+
+ BluetoothUiUtil::LoadResourceAndSubstringL( stringHolder,
+ R_BT_DEVICE_NOT_SUPPORTED, aDevice.iName, 0 );
+
+ // create note
+ //
+ CAknInformationNote* note = new (ELeave) CAknInformationNote();
+
+ if(iCoverDisplayEnabled)
+ {
+ CleanupStack::PushL(note);
+ note->PublishDialogL(ECmdBtuiShowBtDeviceNotSupported, KUidCoverUiCategoryBtui); // initializes cover support
+ CleanupStack::Pop(note);
+
+ CAknMediatorFacade* covercl = AknMediatorFacade(note); // uses MOP, so control provided
+ if (covercl) // returns null if __COVER_DISPLAY is not defined
+ {
+ covercl->BufStream() << BTDeviceNameConverter::ToUTF8L(aDevice.iName);
+ covercl->BufStream().CommitL(); // no more data to send so commit buf
+ }
+ }
+ note->ExecuteLD(stringHolder);
+ CleanupStack::PopAndDestroy(&stringHolder);
+ }
+ break;
+
+ default:
+ {
+ // Create note
+ CAknInformationNote* note = new (ELeave) CAknInformationNote();
+ HBufC* stringHolder=StringLoader::LoadLC(R_BT_DEVICE_NOT_AVAIL_NOTE );
+
+ if(iCoverDisplayEnabled)
+ {
+ CleanupStack::PushL(note);
+ note->PublishDialogL(ECmdBtuiShowBtDeviceNotAvail, KUidCoverUiCategoryBtui); // initializes cover support
+ CleanupStack::Pop(note);
+
+ }
+
+ note->ExecuteLD(*stringHolder);
+ CleanupStack::PopAndDestroy(stringHolder);
+ TRACE_INFO(_L("default error note BT-not-available"))
+ }
+ break;
+ }
+ TRACE_FUNC_EXIT
+ }
+
+// ------------------------------------------------------
+// CBTUIPairedDevicesView::LaunchHelp
+// static help launching function for TCallback
+// ------------------------------------------------------
+TInt CBTUIPairedDevicesView::LaunchHelp(TAny* aCoeHelpContext)
+ {
+#ifdef __SERIES60_HELP
+ //TRACE_FUNC_ENTRY
+ TCoeHelpContext hc;
+
+ if(aCoeHelpContext==NULL)
+ hc = TCoeHelpContext(KBtuiUid3,KBT_HLP_BLOCKED);
+ else
+ hc = *static_cast<TCoeHelpContext*>(aCoeHelpContext);
+ TRAPD(err,
+ CArrayFix< TCoeHelpContext >* array=new (ELeave) CArrayFixFlat< TCoeHelpContext >(1);
+ array->AppendL(hc);
+ CleanupStack::PushL(array);
+ // codescan will complain about CCoeEnv::Static(), however it is not reasonable
+ // avoidable, since this is static funtion.
+ HlpLauncher::LaunchHelpApplicationL(CCoeEnv::Static()->WsSession() , array);
+ CleanupStack::Pop(array);
+ );
+
+ // the array is not deleted, since deleting it will result
+ // to E32User-CBase 3. It is assumed that HlpLancher is taking care of it.
+ // however this has not been documented.
+ //TRACE_FUNC_EXIT
+ return err;
+#else
+ return KErrNone;
+#endif
+ }
+
+// ------------------------------------------------------
+// CBTUIPairedDevicesView::CallOnGoing
+// ------------------------------------------------------
+TBool CBTUIPairedDevicesView::CallOnGoing()
+ {
+ TRACE_FUNC_ENTRY
+ TInt callState;
+ // Try to get the call state property
+
+ TInt err = RProperty::Get(KPSUidCtsyCallInformation,
+ KCTsyCallState, callState); //KPSUidTelephonyCallInformation should be used // Check also,if retrieving the property value succeeded
+ return (err == KErrNone) ?
+ (callState != EPSCTsyCallStateNone &&
+ callState != EPSCTsyCallStateUninitialized) :
+ EFalse;
+ }
+// ----------------------------------------------------------
+// From MProgressDialogCallback
+// CBTUIPairedDevicesView::DialogDismissedL
+//
+// Cancels pairing/connection operation if user has pressed Cancel softkey.
+// Does nothing if the dialog has been dismissed by this program.
+// ----------------------------------------------------------
+//
+void CBTUIPairedDevicesView::DialogDismissedL(TInt aButtonId )
+ {
+ TRACE_FUNC_ENTRY
+
+ // it was not canceled, but dialog was closed
+ // because it ended normally, so there is nothing to clean up.
+ if( aButtonId != EAknSoftkeyCancel )
+ return;
+
+ // Cancel ongoing operations if any
+ //
+ if ( iWaitForConnectDlg)
+ {
+ if( iConnectDevice )
+ {
+ iModel->CancelChange(*iConnectDevice);
+ delete iConnectDevice;
+ iConnectDevice=NULL;
+ iIsPairConnect = EFalse;
+ }
+ iWaitForConnectDlg = NULL;
+ }
+ if ( iWaitForPairingDlg )
+ {
+ if( iPairingDevice )
+ {
+ TBTDevice device;
+ device.iAddr = iPairingDevice->BDAddr();
+ device.iOperation = EOpPair;
+
+ iDeviceSearcher->CancelSearchRemoteDevice();
+
+ iModel->CancelChange(device);
+
+ delete iPairingDevice;
+ iPairingDevice=NULL;
+ }
+ // The dialog has already been deleted by UI framework and
+ // must not be deleted manually.
+ iWaitForPairingDlg = NULL;
+ }
+
+ TRACE_FUNC_EXIT
+ }
+// ------------------------------------------------------
+// From MBTEngSdpResultReceiver
+// CBTUIPairedDevicesView::ServiceSearchComplete
+// not used and implemented as empty
+// ------------------------------------------------------
+void CBTUIPairedDevicesView::ServiceSearchComplete(const RSdpRecHandleArray& , TUint , TInt)
+ {
+ TRACE_FUNC_ENTRY
+ }
+// ------------------------------------------------------
+// From MBTEngSdpResultReceiver
+// CBTUIPairedDevicesView::AttributeSearchComplete
+// not used and implemented as empty
+// ------------------------------------------------------
+void CBTUIPairedDevicesView::AttributeSearchComplete(TSdpServRecordHandle,
+ const RSdpResultArray& ,TInt)
+ {
+ TRACE_FUNC_ENTRY
+ }
+// ------------------------------------------------------
+// From MBTEngSdpResultReceiver
+// CBTUIPairedDevicesView::AttributeSearchComplete
+// not used and implemented as empty
+// ------------------------------------------------------
+void CBTUIPairedDevicesView::ServiceAttributeSearchComplete(TSdpServRecordHandle ,
+ const RSdpResultArray& ,TInt )
+ {
+ TRACE_FUNC_ENTRY
+ }
+// ------------------------------------------------------
+// From MBTEngSdpResultReceiver
+// CBTUIPairedDevicesView::DeviceSearchComplete
+// ------------------------------------------------------
+void CBTUIPairedDevicesView::DeviceSearchComplete(CBTDevice* aDevice, TInt aErr)
+ {
+ TRACE_FUNC_ENTRY
+
+ TRAPD(err, DeviceSearchCompleteL(aDevice, NULL, aErr);
+ );
+ // something went wrong.
+ if(err != KErrNone)
+ {
+ TRAP_IGNORE( TBTUIViewsCommonUtils::ShowGeneralErrorNoteL(); );
+ }
+ iSearchOngoing=EFalse;
+ TRACE_FUNC_EXIT
+ }
+
+// ------------------------------------------------------
+// From MBTEngSdpResultReceiver
+// CBTUIPairedDevicesView::DeviceSearchComplete
+// ------------------------------------------------------
+void CBTUIPairedDevicesView::DeviceSearchComplete( CBTDevice* aDevice,
+ TNameEntry* aNameEntry, TInt aErr )
+ {
+ TRACE_FUNC_ENTRY
+
+ TRAPD(err, DeviceSearchCompleteL(aDevice, aNameEntry, aErr);
+ );
+ // something went wrong.
+ if(err != KErrNone)
+ {
+ TRAP_IGNORE( TBTUIViewsCommonUtils::ShowGeneralErrorNoteL(); );
+ }
+ iSearchOngoing=EFalse;
+ TRACE_FUNC_EXIT
+ }
+
+// ------------------------------------------------------
+// CBTUIPairedDevicesView::DeviceSearchCompleteL
+// Leaving version of DeviceSearchComplete
+// ------------------------------------------------------
+
+void CBTUIPairedDevicesView::DeviceSearchCompleteL(CBTDevice* aDevice,
+ TNameEntry* aNameEntry, TInt aErr)
+ {
+ TRACE_FUNC_ENTRY
+ iSearchOngoing=EFalse;
+ if ( !iPairingDevice )
+ {
+ delete iModel;
+ iModel = NULL;
+ return;
+ }
+ // we must not have multiple pairings at the same time
+ __ASSERT_DEBUG(aDevice->BDAddr() == iPairingDevice->BDAddr(),
+ PANIC(EBTPanicTwoPairingAttemptsAtTheSameTime) );
+
+ // other error condition, most likely dialog cancel.
+ if(aErr != KErrNone && (aErr != KErrAlreadyExists))
+ {
+ delete iPairingDevice;
+ iPairingDevice=NULL;
+ return;
+ }
+
+ // In case user switches the view fast enough before searching starts,
+ // It crashes the whole btui by iModel is null value.
+ // We add an extra check here
+ //
+ if ( !iModel )
+ {
+ delete iPairingDevice;
+ iPairingDevice=NULL;
+ return;
+ }
+
+ TBTDevice *tmpDevice=iModel->CreateDeviceL(aDevice, aNameEntry);
+ CleanupStack::PushL(tmpDevice);
+ if(tmpDevice->iStatus & (EStatusPhysicallyConnected|EStatusBtuiConnected|EStatusPaired))
+ {
+ ShowDisconnecNoteL(tmpDevice);
+ CleanupStack::PopAndDestroy(tmpDevice);
+ delete iPairingDevice;
+ iPairingDevice=NULL;
+ return;
+ }
+ else
+ {
+ // Launch wait note
+ OpenWaitNoteL(iWaitForPairingDlg,R_BT_WAITING,R_BT_WAITING_PROMPT,
+ ECmdShowBtWaitingNote,tmpDevice->iName);
+
+ CleanupStack::PopAndDestroy(tmpDevice);
+ tmpDevice=NULL;
+ // and start the pairing
+ iModel->ChangeDevice(aDevice, aNameEntry, EOpPair);
+ // aDevice is not deleted, since it points to iPairingDevice and it is still used
+ // after this
+ }
+ TRACE_FUNC_EXIT
+ }
+
+
+// ------------------------------------------------------
+// CBTUIPairedDevicesView::ShowDisconnecNote
+// ------------------------------------------------------
+void CBTUIPairedDevicesView::ShowDisconnecNoteL(TBTDevice *aDevice)
+ {
+ RBuf stringholder;
+ CleanupClosePushL( stringholder );
+ BluetoothUiUtil::LoadResourceAndSubstringL(
+ stringholder, R_BT_DISCONNECT_FIRST_PROMPT, aDevice->iName, 0 );
+ // Launch a waiting confirmation note
+ //
+ CAknConfirmationNote* note = new (ELeave) CAknConfirmationNote(ETrue);
+
+ if(iCoverDisplayEnabled)
+ {
+ CleanupStack::PushL(note);
+ note->PublishDialogL(ECmdShowBtSuccesfullyPairedNote,
+ KUidCoverUiCategoryBtui); // initializes cover support
+ CAknMediatorFacade* covercl = AknMediatorFacade(note); // uses MOP, so control provided
+ if (covercl) // returns null if __COVER_DISPLAY is not defined
+ {
+ covercl->BufStream() << BTDeviceNameConverter::ToUTF8L(aDevice->iName);// takes copy so consts are ok too
+ covercl->BufStream().CommitL(); // no more data to send so commit buf
+ }
+ CleanupStack::Pop(note);
+ }
+
+ note->ExecuteLD(stringholder);
+
+ CleanupStack::PopAndDestroy(&stringholder); // stringholder
+
+ }
+
+void CBTUIPairedDevicesView::ConnectIfNeededAfterPairL( TInt aCount )
+ {
+ TRACE_FUNC_ENTRY
+ TBTDevice device;
+ device.iAddr = iPairConnectAddr;
+ iModel->GetDevice(device);
+ device.iOperation = EOpConnect;
+ ConnectL( device, ( aCount ) ? EFalse : ETrue );
+ TRACE_FUNC_EXIT
+ }
+
+// ------------------------------------------------------
+// CBTUIPairedDevicesView::BondingCompleted
+// called by NotifyChangeDeviceComplete
+// ------------------------------------------------------
+void CBTUIPairedDevicesView::BondingCompleteL(TInt aError, const TBTDevice& aDevice)
+ {
+ TRACE_INFO((_L("aError=%d"), aError))
+ // We need to make a copy of the device, since it may be cleaned up
+ // by device refresh.
+ TBTDevice bDevice= aDevice;
+
+ // this may look useless, however if the device has a given shortName it is listed with it
+ // all the time. If you omnit this line it will be shown with its original deviceName,
+ // dispite it will be listed with the given name
+ iModel->GetDevice(bDevice);
+
+ delete iPairingDevice;
+ iPairingDevice=NULL;
+
+ // Dismiss wait note
+ if(iWaitForPairingDlg)
+ {
+ iWaitForPairingDlg->ProcessFinishedL();
+ iWaitForPairingDlg = NULL;
+ }
+
+ // Error handling
+ switch(aError)
+ {
+ case KErrCancel:
+ break;
+ case KErrAlreadyExists: // This is a legal return value
+ case KErrNone:
+ case KHCIErrorBase:
+ {
+ if( (bDevice.iStatus & EStatusConnectable)
+ && (bDevice.iDeviceClass.MajorDeviceClass() != EMajorDeviceComputer))
+ // Only automatically query for a connectable device but not a computer
+ {
+ iPairConnectAddr = aDevice.iAddr;
+ iIsPairConnect = ETrue;
+ ConnectIfNeededAfterPairL( 0 );
+ }
+ break;
+ }
+ default:
+ {
+ break;
+ }
+ }
+ TRACE_FUNC_EXIT
+ }
+
+// -----------------------------------------------
+// From MBTDeviceObserver
+// CBTUIPairedDevicesView::RefreshDeviceList
+// calls the container to refresh the deviceList
+// -----------------------------------------------
+void CBTUIPairedDevicesView::RefreshDeviceList(const RDeviceArray* aDevices,
+ TInt aSelectedItemIndex)
+ {
+ TRACE_FUNC_ENTRY
+ TRAPD(err,
+ if(iContainer)
+ {
+ iContainer->RefreshDeviceListL(aDevices,aSelectedItemIndex);
+ }
+ );
+ if (iActiveMenuPane && iActiveMenuPane->NumberOfItemsInPane()>0 )
+ {
+ TInt index = iContainer->CurrentItemIndex();
+ if ( index >=0 )
+ {
+ TBTDevice device;
+ device.iIndex = index;
+ iModel->GetDevice(device);
+ if ( iMenuDevice.iAddr == device.iAddr &&
+ ( ( iMenuDevice.iStatus & EStatusBtuiConnected ) != ( device.iStatus & EStatusBtuiConnected ) ) )
+ {
+ TRACE_INFO(_L("Device status changed, update menupane"));
+ iMenuDevice = device;
+ iActiveMenuPane->Close();
+ TRAP_IGNORE( this->ProcessCommandL(EAknSoftkeyContextOptions) );
+ }
+ }
+ }
+ if(err!= KErrNone)
+ {
+ TRAP_IGNORE( TBTUIViewsCommonUtils::ShowGeneralErrorNoteL(); );
+ }
+ TRACE_FUNC_EXIT
+ }
+
+
+// -----------------------------------------------
+//
+// -----------------------------------------------
+void CBTUIPairedDevicesView::RequestCompletedL( CBTUIActive* aActive, TInt aId,
+ TInt aStatus )
+ {
+ TRACE_INFO( ( _L("CBTUIPairedDevicesView::RequestCompletedL err %d"), aStatus ) )
+ (void) aActive;
+ (void) aId;
+ (void) aStatus;
+ TRACE_INFO( _L("CBTUIPairedDevicesView, auto connect 2nd try ... ") )
+ ConnectIfNeededAfterPairL( 1 );
+ }
+
+// -----------------------------------------------
+//
+// -----------------------------------------------
+void CBTUIPairedDevicesView::HandleError( CBTUIActive* aActive, TInt aId,
+ TInt aError )
+ {
+ (void) aActive;
+ (void) aId;
+ (void) aError;
+ iIsPairConnect = EFalse;
+ }
+
+// ---------------------------------------------------------
+// From MBTDeviceObserver
+// CBTUIPairedDevicesView::NotifyChangeDeviceComplete
+// This function implement the functionality of command complete.
+// The lists of shown devices are refreshed by RefreshDeviceList,
+// not by this function
+// ---------------------------------------------------------
+//
+void CBTUIPairedDevicesView::NotifyChangeDeviceComplete(const TInt aErr,
+ const TBTDevice& aDevice, const RBTDevNameArray* aDevNameArray)
+ {
+ TRACE_FUNC_ENTRY
+ TBTDevice tmpDevice=aDevice;
+ TRAPD(err,NotifyChangeDeviceCompleteL(aErr,tmpDevice,aDevNameArray
+ ););
+ if(err!= KErrNone)
+ {
+ TRAP_IGNORE( TBTUIViewsCommonUtils::ShowGeneralErrorNoteL(); );
+ }
+ TRACE_FUNC_EXIT
+ }
+// ---------------------------------------------------------
+// CBTUIPairedDevicesView::NotifyChangeDeviceCompleteL
+// Leaving version of notifyChangeDevice
+// ---------------------------------------------------------
+
+void CBTUIPairedDevicesView::NotifyChangeDeviceCompleteL(const TInt aErr,
+ const TBTDevice& aDevice, const RBTDevNameArray* aDevNameArray)
+ {
+ TRACE_FUNC_ENTRY
+ if(iContainer == NULL) return;
+
+ TRACE_INFO((_L("aErr=%d"), aErr))
+ TRACE_INFO((_L("aDevice.iOperation=%d"), aDevice.iOperation))
+ TRACE_INFO((_L("aDevice.iStatus=%d"), aDevice.iStatus))
+ TRACE_INFO((_L("iIsAlreadyConnected=%d"), iIsAlreadyConnected))
+
+ if (aDevice.iOperation == EOpDisconnect && iExpectedCallBack>0 )
+ {
+ TBTDevice device;
+ device.iIndex = aDevice.iIndex;
+ iModel->GetDevice(device);
+ device.iOperation = EOpUnpair;
+ iModel->ChangeDevice(device);
+ iExpectedCallBack--;
+ }
+
+ if( aDevice.iOperation == EOpConnect )
+ {
+ if( aErr == KErrNone && iIsAlreadyConnected )
+ {
+ TRACE_INFO(_L("Don't show notes several times for the same device with different profile connections"))
+ return;
+ }
+ ConnectCompleteL(aErr, aDevice, aDevNameArray );
+ iIsAlreadyConnected = ETrue;
+ TRACE_INFO(_L("iIsAlreadyConnected False -> True"))
+ return;
+ }
+ if(aDevice.iOperation == EOpPair)
+ {
+ BondingCompleteL(aErr, aDevice);
+ }
+ if(aErr != KErrNone)
+ {
+ // The user tried to rename to a name that allready exists.
+ if(aDevice.iOperation == EOpChangeName && aErr == KErrAlreadyExists)
+ {
+ CAknNoteDialog* dlg2 = new (ELeave) CAknNoteDialog(CAknNoteDialog::EErrorTone,
+ CAknNoteDialog::ELongTimeout);
+ dlg2->ExecuteLD(R_BT_NAME_EXISTS_NOTE);
+
+ RenameDeviceDlgL();
+ return;
+ }
+ // Need to properly handle situation when "Disconnect from xxx" query
+ // has been shown and paired device has been turned off simultaneously.
+ // CancelDisconnectQuery dialog need to be closed.
+ if(aErr == KErrDisconnected)
+ {
+ if(iDisconnectQueryDlg && aDevice.iAddr == iDisconnectQueryDevice.iAddr)
+ CancelDisconnectQueryDlg();
+
+ TRACE_FUNC_EXIT
+ return;
+ }
+ // show general error if any of these failed
+ if( aDevice.iOperation== EOpTrust ||
+ aDevice.iOperation== EOpUntrust ||
+ aDevice.iOperation== EOpBlock ||
+ aDevice.iOperation== EOpChangeName)
+ {
+ TBTUIViewsCommonUtils::ShowGeneralErrorNoteL();
+ }
+ return;
+ }
+
+ if(aDevice.iOperation == EOpUntrust)
+ {
+ // Unauthorise ok note,
+ CAknNoteDialog* dlg = new (ELeave) CAknNoteDialog(CAknNoteDialog::EConfirmationTone,
+ CAknNoteDialog::ELongTimeout);
+
+ if(iCoverDisplayEnabled)
+ {
+ CleanupStack::PushL(dlg);
+ dlg->PublishDialogL(ECmdShowBtDevSetAsUntrustNote, KUidCoverUiCategoryBtui);
+ // initializes cover support
+ CleanupStack::Pop(dlg);
+ }
+ dlg->ExecuteLD( R_BT_DEVICE_UNTRUSTED_NOTE );
+ }
+ TRACE_FUNC_EXIT
+ }
+
+// ---------------------------------------------------------------------------
+// CBTUIPairedDevicesView::CreateTabIconL()
+// Creates icon for tab.
+// ---------------------------------------------------------------------------
+//
+CGulIcon* CBTUIPairedDevicesView::CreateTabIconL()
+ {
+ TFileName bmpFilename;
+ bmpFilename += KBitmapFileDrive;
+ bmpFilename += KDC_APP_BITMAP_DIR;
+ bmpFilename += KBtuiBmpFileName;
+
+ CGulIcon* icon = AknsUtils::CreateGulIconL(
+ AknsUtils::SkinInstance(),
+ KAknsIIDQgnPropBtDevicesTab3,
+ bmpFilename,
+ EMbmBtuiQgn_prop_bt_devices_tab3,
+ EMbmBtuiQgn_prop_bt_devices_tab3_mask );
+
+ return icon;
+ }
+
+
+void CBTUIPairedDevicesView::SetupMenuCmd(TInt aIndex, CEikMenuPane* aMenu)
+ {
+ TBTDevice device;
+ device.iIndex = aIndex;
+ iModel->GetDevice(device);
+ iMenuDevice = device;
+
+ TRACE_INFO(_L("there are device in list"))
+
+ TBool dim = (device.iStatus & EStatusTrusted) == EStatusTrusted;
+
+ aMenu->SetItemDimmed(EBTUICmdSetTrusted, dim);
+ aMenu->SetItemDimmed(EBTUICmdSetUnTrusted, !dim);
+
+ // Check if device can be connected or disconnected
+ dim = (! (device.iStatus & EStatusConnectable)
+ || device.iStatus & EStatusBtuiConnected);
+
+ if (dim)
+ {
+ aMenu->SetItemDimmed(EBTUICmdConnect, dim);
+ aMenu->SetItemDimmed(EBTUICmdConnectAudio, dim);
+ }
+ else
+ {
+ if ( device.iDeviceClass.MajorDeviceClass() == EMajorDeviceComputer)
+ {
+ aMenu->SetItemDimmed(EBTUICmdConnect, ETrue);
+ }
+ else
+ {
+ aMenu->SetItemDimmed(EBTUICmdConnectAudio, ETrue);
+ }
+ }
+ dim = (device.iStatus & EStatusBtuiConnected) != EStatusBtuiConnected;
+ aMenu->SetItemDimmed(EBTUICmdDisconnect, dim);
+
+ if ( !iBTPluginMan->IsPluginAvaiable(device.iDeviceClass) )
+ {
+ aMenu->SetItemDimmed(EBTUICmdSettings, ETrue);
+ }
+ else
+ {
+ dim = (device.iStatus & EStatusBtuiConnected) != EStatusBtuiConnected;
+ aMenu->SetItemDimmed(EBTUICmdSettings, dim);
+ }
+ }
+
+
+// End of File
+