diff -r 000000000000 -r f63038272f30 bluetoothengine/btui/Ecom/src/BTUIDeviceContainer.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/bluetoothengine/btui/Ecom/src/BTUIDeviceContainer.cpp Mon Jan 18 20:28:57 2010 +0200 @@ -0,0 +1,669 @@ +/* +* Copyright (c) 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 the implementation of device list container. It contains +* all necessary AVKON components and handles user inputs +* for paired and blocked devices view. +* +*/ + + +#include // Compiled resource ids +#include +#include // For Extended skinning icons +#include +#include // For char filter +#include +#include // AVKON icons +#include // Help IDs + +#include "BTUIDeviceContainer.h" +#include "BTUIListedDevicesView.h" +#include "debug.h" +#include "btui.h" // Global declarations + +const TInt KBTNumberOfIcons = 13; // Number of class of device icons + +_LIT( DEV_TYPE_COMPUTER,"0\t"); +_LIT( DEV_TYPE_PHONE,"1\t"); +_LIT( DEV_TYPE_AUDIO,"2\t"); +_LIT( DEV_TYPE_DEFAULT,"3\t"); +_LIT( DEV_TYPE_KEYBOARD,"4\t"); +_LIT( DEV_TYPE_MOUSE,"5\t"); +_LIT( DEV_TYPE_PRINTER,"6\t"); +_LIT( DEV_TYPE_CARKIT,"7\t"); +_LIT( DEV_TYPE_AUDIO_CONNECT,"8\t"); +_LIT( DEV_TYPE_COMPUTER_CONNECT,"9\t"); +_LIT( DEV_TYPE_KEYBOARD_CONNECT,"10\t"); +_LIT( DEV_TYPE_CARKIT_CONNECT,"11\t"); +_LIT( DEV_TYPE_MOUSE_CONNECT,"12\t"); + +_LIT(DEV_STATUS_NORMAL, "\t" ); // blocked in blocked devices view, paired in pairred devices view +_LIT(DEV_STATUS_AUTHORIZED, "\t13" ); // autorized in paired devices view + + + +// ================= MEMBER FUNCTIONS ======================= + +// --------------------------------------------------------- +// CBTUiDeviceContainer::ConstructL +// --------------------------------------------------------- +void CBTUiDeviceContainer::ConstructL(const TRect& aRect, + CBTUIListedDevicesView* aView, TBTDeviceGroup aGroup) + { + TRACE_FUNC_ENTRY + + CreateWindowL(); + + iView = aView; + iGroup = aGroup; + // Create new list for other paired bt-devices + // + iDeviceList = new (ELeave) CAknSingleGraphicStyleListBox; + iDeviceList->SetContainerWindowL(*this); + iDeviceList->ConstructL(this, EAknListBoxSelectionList); + + iDeviceList->SetListBoxObserver( this ); + + // Set the empty text at basis of the list + HBufC* devEmptyText = NULL ; + if(iGroup ==EGroupPaired) + { + devEmptyText=iCoeEnv->AllocReadResourceLC( R_BT_NO_PAIRED_DEVICES); + } + else + { + devEmptyText=iCoeEnv->AllocReadResourceLC( R_BT_NO_BLOCKED_DEVICES); + } + iDeviceList->View()->SetListEmptyTextL(*devEmptyText ); + CleanupStack::PopAndDestroy(devEmptyText); + + // Set up filenames for Btui and Avkon bitmaps + TFileName bmpFilename; + bmpFilename += KBitmapFileDrive; + bmpFilename += KDC_APP_BITMAP_DIR; + bmpFilename += KBtuiBmpFileName; + + // The avkon bitmap we will get from AknIconUtils::AvkonIconFileName() + TFileName avkonbmpFilename = AknIconUtils::AvkonIconFileName(); + + // Setup graphic items list for BT devices listbox + CAknIconArray* iconList = new(ELeave) CAknIconArray(KBTNumberOfIcons); + CleanupStack::PushL( iconList ); + + + CreateAndAppendIconL( KAknsIIDQgnPropBtComputer, + avkonbmpFilename, + EMbmAvkonQgn_prop_bt_computer, + EMbmAvkonQgn_prop_bt_computer_mask, + iconList); + + CreateAndAppendIconL( KAknsIIDQgnPropBtPhone, + avkonbmpFilename, + EMbmAvkonQgn_prop_bt_phone, + EMbmAvkonQgn_prop_bt_phone_mask, + iconList); + + CreateAndAppendIconL( KAknsIIDQgnPropBtAudio, + avkonbmpFilename, + EMbmAvkonQgn_prop_bt_audio, + EMbmAvkonQgn_prop_bt_audio_mask, + iconList); + + CreateAndAppendIconL( KAknsIIDQgnPropBtMisc, + avkonbmpFilename, + EMbmAvkonQgn_prop_bt_misc, + EMbmAvkonQgn_prop_bt_misc_mask, + iconList); + + CreateAndAppendIconL( KAknsIIDQgnPropBtKeyboard, + avkonbmpFilename, + EMbmAvkonQgn_prop_bt_keyboard, + EMbmAvkonQgn_prop_bt_keyboard_mask, + iconList); + + CreateAndAppendIconL( KAknsIIDQgnPropBtMouse, + avkonbmpFilename, + EMbmAvkonQgn_prop_bt_mouse, + EMbmAvkonQgn_prop_bt_mouse_mask, + iconList); + + CreateAndAppendIconL( KAknsIIDQgnPropBtPrinter, + avkonbmpFilename, + EMbmAvkonQgn_prop_bt_printer, + EMbmAvkonQgn_prop_bt_printer_mask, + iconList); + + CreateAndAppendIconL( KAknsIIDQgnPropBtCarKit, + avkonbmpFilename, + EMbmAvkonQgn_prop_bt_carkit, + EMbmAvkonQgn_prop_bt_carkit_mask, + iconList); + + CreateAndAppendIconL( KAknsIIDQgnPropBtAudioConnect, + bmpFilename, + EMbmBtuiQgn_prop_bt_audio_connect, + EMbmBtuiQgn_prop_bt_audio_connect_mask, + iconList); + + CreateAndAppendIconL( KAknsIIDQgnPropBtComputerConnect, + bmpFilename, + EMbmBtuiQgn_prop_bt_computer_connect, + EMbmBtuiQgn_prop_bt_computer_connect_mask, + iconList); + + CreateAndAppendIconL( KAknsIIDQgnPropBtKeyboardConnect, + bmpFilename, + EMbmBtuiQgn_prop_bt_keyboard_connect, + EMbmBtuiQgn_prop_bt_keyboard_connect_mask, + iconList); + + CreateAndAppendIconL( KAknsIIDQgnPropBtCarKitConnect, + bmpFilename, + EMbmBtuiQgn_prop_bt_car_kit_connect, + EMbmBtuiQgn_prop_bt_car_kit_connect_mask, + iconList); + + CreateAndAppendIconL( KAknsIIDQgnPropBtMouseConnect, + bmpFilename, + EMbmBtuiQgn_prop_bt_mouse_connect, + EMbmBtuiQgn_prop_bt_mouse_connect_mask, + iconList); + + CFbsBitmap* bitmap = NULL; + CFbsBitmap* mask = NULL; + AknsUtils::CreateColorIconLC(AknsUtils::SkinInstance(), + KAknsIIDQgnIndiBtTrustedAdd, + KAknsIIDQsnIconColors, + EAknsCIQsnIconColorsCG13, + bitmap, mask, + avkonbmpFilename, + EMbmAvkonQgn_indi_bt_trusted_add, + EMbmAvkonQgn_indi_bt_trusted_add_mask, + KRgbBlack); + CGulIcon* icon = CGulIcon::NewL(bitmap, mask); + + CleanupStack::Pop(mask); + CleanupStack::Pop(bitmap); + + CleanupStack::PushL(icon); + iconList->AppendL( icon ); + CleanupStack::Pop(icon); + + + // Transfer iconlist ownership to the listbox + iDeviceList->ItemDrawer()->ColumnData()->SetIconArray(iconList); + CleanupStack::Pop(iconList); + + // Create scrollbars + iDeviceList->CreateScrollBarFrameL(ETrue); + iDeviceList->ScrollBarFrame()->SetScrollBarVisibilityL( + CEikScrollBarFrame::EOn, CEikScrollBarFrame::EAuto); + + SetRect(aRect); + ActivateL(); + + TRACE_FUNC_EXIT + } + +// --------------------------------------------------------- +// CBTUiDeviceContainer::NewL +// --------------------------------------------------------- +CBTUiDeviceContainer* CBTUiDeviceContainer::NewL(const TRect& aRect, + CBTUIListedDevicesView* aView, TBTDeviceGroup aGroup, MObjectProvider* aParent) + { + CBTUiDeviceContainer* self = new (ELeave) CBTUiDeviceContainer(); + self->SetMopParent(aParent); + CleanupStack::PushL(self); + self->ConstructL(aRect, aView, aGroup); + CleanupStack::Pop(self); + return self; + } +// --------------------------------------------------------- +// destructor +// --------------------------------------------------------- + +CBTUiDeviceContainer::~CBTUiDeviceContainer() + { + TRACE_FUNC_ENTRY + delete iDeviceList; + TRACE_FUNC_EXIT + } + +// --------------------------------------------------------- +// CBTUiDeviceContainer::RefreshDeviceListL +// This function will refresh only the changed parts of the +// screen, if any. +// --------------------------------------------------------- +void CBTUiDeviceContainer::RefreshDeviceListL(const RDeviceArray* aDeviceArray,TInt selectedItem) + { + TRACE_FUNC_ENTRY + + MDesCArray* itemTextArray = iDeviceList->Model()->ItemTextArray(); + CDesCArray* itemArray = (CDesCArray*) itemTextArray; + TBool removal=EFalse; + TBool addition=EFalse; + TInt previouslySelected=CurrentItemIndex(); + TBTDeviceName listItem; + TInt deviceCount = aDeviceArray->Count(); + TInt i = 0; + for( ; i < deviceCount; i++) + { + TBTDevice device = *(*aDeviceArray)[i]; + CreateListItemL(device, listItem); + if(itemArray->Count()<=i) + { + itemArray->AppendL(listItem); + addition=ETrue; + } + else + if(listItem != (*itemArray)[i] ) + { + itemArray->Delete(i); + itemArray->InsertL(i,listItem); + + removal=ETrue; + addition=ETrue; + } + + } + if(itemArray->Count()-i>=0) + { + itemArray->Delete(i,itemArray->Count()-i); + removal=ETrue; + } + + + if(removal) + iDeviceList->HandleItemRemovalL(); + if(addition) + iDeviceList->HandleItemAdditionL(); + + if(deviceCount >0 ) + iDeviceList->SetCurrentItemIndex( Max(selectedItem,0 )) ; + + if(addition | removal | previouslySelected!=selectedItem) + iDeviceList->DrawDeferred(); + TRACE_FUNC_EXIT + } + +// --------------------------------------------------------- +// CBTUiDeviceContainer::CountItems +// --------------------------------------------------------- +TInt CBTUiDeviceContainer::CountItems() + { + return iDeviceList->Model()->ItemTextArray()->MdcaCount(); + } + +// --------------------------------------------------------- +// CBTUiDeviceContainer::CreateListItemL +// --------------------------------------------------------- +void CBTUiDeviceContainer::CreateListItemL(const TBTDevice& aDevice, TBTDeviceName& aListItem) + { + TRACE_FUNC_ENTRY + aListItem.Zero(); // may not needed + + TInt iconIndex = (TInt)(aDevice.iType); + + switch( iconIndex) + { + case EDeviceComputer: + if(( aDevice.iStatus & EStatusBtuiConnected) == EStatusBtuiConnected) + { + aListItem.Append(DEV_TYPE_COMPUTER_CONNECT); + } + else + { + aListItem.Append(DEV_TYPE_COMPUTER); + } + break; + + case EDevicePhone: + aListItem.Append(DEV_TYPE_PHONE); + break; + + case EDeviceAudio: + if(( aDevice.iStatus & EStatusBtuiConnected) == EStatusBtuiConnected) + { + aListItem.Append(DEV_TYPE_AUDIO_CONNECT); + } + else + { + aListItem.Append(DEV_TYPE_AUDIO); + } + break ; + case EDeviceCarkit: + if(( aDevice.iStatus & EStatusBtuiConnected) == EStatusBtuiConnected) + { + aListItem.Append(DEV_TYPE_CARKIT_CONNECT); + } + else + { + aListItem.Append(DEV_TYPE_CARKIT); + } + break ; + + case EDevicePrinter: + aListItem.Append(DEV_TYPE_PRINTER); + break; + + case EDeviceKeyboard: + + if(( aDevice.iStatus & EStatusBtuiConnected) == EStatusBtuiConnected) + { + aListItem.Append(DEV_TYPE_KEYBOARD_CONNECT); + } + else + { + aListItem.Append(DEV_TYPE_KEYBOARD); + } + break ; + + case EDeviceMice: + + if(( aDevice.iStatus & EStatusBtuiConnected) == EStatusBtuiConnected) + { + aListItem.Append(DEV_TYPE_MOUSE_CONNECT); + } + else + { + aListItem.Append(DEV_TYPE_MOUSE); + } + break; + + case EDeviceDefault: + aListItem.Append(DEV_TYPE_DEFAULT); + break; + + default: + aListItem.Append('\t'); + break; + } + + aListItem.Append(aDevice.iName); + + if((aDevice.iStatus & EStatusTrusted) == EStatusTrusted && iGroup ==EGroupPaired ) + { + aListItem.Append(DEV_STATUS_AUTHORIZED); + } + else + { + aListItem.Append( DEV_STATUS_NORMAL ); + } + TRACE_FUNC_EXIT + } + + +// --------------------------------------------------------- +// From CCoeControl +// CBTUiDeviceContainer::OfferKeyEventL +// --------------------------------------------------------- +TKeyResponse CBTUiDeviceContainer::OfferKeyEventL(const TKeyEvent& aKeyEvent, + TEventCode aType) + { + TRACE_FUNC_ENTRY + // Inform model where we are now + TInt bItemIndex = CurrentItemIndex(); + + // Shortcut for deleting a device + if ((aKeyEvent.iCode == EKeyBackspace) && (bItemIndex >= 0)) + { + iView->HandleCommandL( EBTUICmdDelete ); + return EKeyWasConsumed; + } + + // Show popup commands window if selection or enter key is pressed. + // It should not go to here, unless | EAknEnableMSK is not set + if ((aKeyEvent.iCode == EKeyDevice3) || (aKeyEvent.iCode == EKeyEnter)) + { + iView->ProcessCommandL(EAknSoftkeyContextOptions); + return EKeyWasConsumed; + } + + if ((aKeyEvent.iCode != EKeyLeftArrow) && + (aKeyEvent.iCode != EKeyRightArrow)) + { + TRACE_FUNC_EXIT + return iDeviceList->OfferKeyEventL(aKeyEvent, aType); + } + else + { + // BTRegistry operations are not done in atomic way + // so we cannot allow them to be interrupted + if(iView->DeviceChangeInProgress()) + return EKeyWasConsumed; + + TRACE_FUNC_EXIT + return EKeyWasNotConsumed; + } + } + +// ---------------------------------------------------- +// CBTUiDeviceContainer::CreateAndAppendIconL +// ---------------------------------------------------- +void CBTUiDeviceContainer::CreateAndAppendIconL( + const TAknsItemID& aID, + const TDesC& aFileName, + const TInt aBitmapId, + const TInt aMaskId, + CAknIconArray* aIconList) + { + TRACE_FUNC_ENTRY + + CGulIcon* icon = AknsUtils::CreateGulIconL(AknsUtils::SkinInstance(), + aID, aFileName, aBitmapId, aMaskId); + + CleanupStack::PushL(icon); + aIconList->AppendL(icon); + CleanupStack::Pop(icon); + } + +// --------------------------------------------------------- +// From CCoeControl +// CBTUiDeviceContainer::GetHelpContext +// --------------------------------------------------------- +void CBTUiDeviceContainer::GetHelpContext(TCoeHelpContext& aContext) const + { + TRACE_FUNC_ENTRY +#ifdef __SERIES60_HELP + + aContext.iMajor = KBtuiUid3; + if( iGroup ==EGroupPaired) + aContext.iContext = KBT_HLP_PAIRED; + else + aContext.iContext = KBT_HLP_BLOCKED ; +#else +#endif + } + +// --------------------------------------------------------- +// From CCoeControl +// CBTUiDeviceContainer::SizeChanged +// Called by framework when the view size is changed +// --------------------------------------------------------- +void CBTUiDeviceContainer::SizeChanged() + { + TRACE_FUNC_ENTRY + iDeviceList->SetRect(Rect()); // Mandatory, otherwise not drawn + } + +// --------------------------------------------------------- +// From CCoeControl +// CBTUiDeviceContainer::CountComponentControls +// --------------------------------------------------------- +TInt CBTUiDeviceContainer::CountComponentControls() const + { + TRACE_FUNC_ENTRY + // return number of controls inside this container + return 1; + } + +// --------------------------------------------------------- +// From CCoeControl +// CBTUiDeviceContainer::ComponentControl +// --------------------------------------------------------- +CCoeControl* CBTUiDeviceContainer::ComponentControl(TInt aIndex) const + { + TRACE_FUNC_ENTRY + if(aIndex == 0) + { + return iDeviceList ; + } + else + { + return NULL; + } + } + +// ---------------------------------------------------- +// CBTUiDeviceContainer::CurrentItemIndex +// ---------------------------------------------------- +TInt CBTUiDeviceContainer::CurrentItemIndex() + { + TRACE_FUNC_ENTRY + + return iDeviceList->CurrentItemIndex(); + } + +// --------------------------------------------------------- +// From CCoeControl +// CBTUiDeviceContainer::Draw +// --------------------------------------------------------- +void CBTUiDeviceContainer::Draw( const TRect& /* aRect */ ) const + { + } + +// --------------------------------------------------------- +// From MCoeControlObserver +// CBTUiDeviceContainer::HandleControlEventL +// --------------------------------------------------------- +void CBTUiDeviceContainer::HandleControlEventL( CCoeControl* /* aControl */, TCoeEvent /* aEventType */ ) + { + TRACE_FUNC_ENTRY + } + +// --------------------------------------------------------- +// From CCoeControl +// CBTUiDeviceContainer::HandleResourceChange +// --------------------------------------------------------- +void CBTUiDeviceContainer::HandleResourceChange( TInt aType ) + { + TRACE_FUNC_ENTRY + CCoeControl::HandleResourceChange(aType); + TRAP_IGNORE(HandleResourceChangeL(aType)); + TRACE_FUNC_EXIT + } + +// --------------------------------------------------------- +// Internal Leave function +// CBTUiDeviceContainer::HandleResourceChangeL +// --------------------------------------------------------- +void CBTUiDeviceContainer::HandleResourceChangeL( TInt aType ) + { + TRACE_FUNC_ENTRY + + //Handle change in layout orientation + if (aType == KEikDynamicLayoutVariantSwitch || aType == KAknsMessageSkinChange ) + { + TRect mainPaneRect; + AknLayoutUtils::LayoutMetricsRect(AknLayoutUtils::EMainPane, mainPaneRect); + + // Because the trailing icons are not changed properly after theme is changed. + // we refresh those icons in the iconlist from iDeviceList manually. + + // Get iconlist from listbox + CAknIconArray* iconList = static_cast(iDeviceList->ItemDrawer()->ColumnData()->IconArray()); + + CleanupStack::PushL( iconList ); + // remove the last two icons which will not be updated properly by theme changing. + iconList->Delete(KBTNumberOfIcons-1); + + // The avkon bitmap we will get from AknIconUtils::AvkonIconFileName() + TFileName avkonbmpFilename = AknIconUtils::AvkonIconFileName(); + + + + CFbsBitmap* bitmap = NULL; + CFbsBitmap* mask = NULL; + AknsUtils::CreateColorIconLC(AknsUtils::SkinInstance(), + KAknsIIDQgnIndiBtTrustedAdd, + KAknsIIDQsnIconColors, + EAknsCIQsnIconColorsCG13, + bitmap, mask, + avkonbmpFilename, + EMbmAvkonQgn_indi_bt_trusted_add, + EMbmAvkonQgn_indi_bt_trusted_add_mask, + KRgbBlack); + + + CGulIcon* icon = CGulIcon::NewL(bitmap, mask); + + CleanupStack::Pop(2); // bitmap, mask; + + CleanupStack::PushL(icon); + + iconList->AppendL( icon ); + CleanupStack::Pop(icon); + + + // Transfer iconlist ownership back to the listbox + iDeviceList->ItemDrawer()->ColumnData()->SetIconArray(iconList); + CleanupStack::Pop(iconList); + + SetRect(mainPaneRect); + DrawDeferred(); + } + TRACE_FUNC_EXIT + } + +// --------------------------------------------------------- +// From CCoeControl +// CBTUiDeviceContainer::FocusChanged +// --------------------------------------------------------- +void CBTUiDeviceContainer::FocusChanged(TDrawNow /*aDrawNow*/) + { + TRACE_FUNC_ENTRY + iDeviceList->SetFocus(IsFocused()); + TRACE_FUNC_EXIT + } +// --------------------------------------------------------- +// From CCoeControl +// CBTUiDeviceContainer::HandleListBoxEventL +// +// Handle touch screen singleclick as MSK devent to paired view or +// as delete key event to blocked devices view. +// --------------------------------------------------------- +// +void CBTUiDeviceContainer::HandleListBoxEventL(CEikListBox* /*aListBox*/, TListBoxEvent aEventType) + { + TRACE_FUNC_ENTRY + // this is no longer called, unless MSK is disabled. + // if msk is not disabled, then + // BTMainView::HandleCommand(EBTUICmdMSK) is called instead + if( aEventType == EEventEnterKeyPressed + || aEventType == EEventItemSingleClicked) // Selection key pressed, or item clicked + { + // msk open context options in paired devices view. + // it will unblock the selected blocked device in blocked devices view. + if(iGroup==EGroupPaired) + { + iView->ProcessCommandL( EAknSoftkeyContextOptions); + } + else + { + iView->ProcessCommandL( EBTUICmdUnblock); + } + + } + TRACE_FUNC_EXIT + }