--- a/bluetoothengine/btnotif/src/BTNInqUI.cpp Thu Aug 19 10:05:41 2010 +0300
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,1434 +0,0 @@
-/*
-* Copyright (c) 2002 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: Declares Bluetooth device inquiry user interface class.
-*
-*/
-
-
-// INCLUDE FILES
-#include <avkon.hrh> // AVKON components
-#include <AknIconArray.h>
-#include <aknlists.h>
-#include <aknPopup.h>
-#include <avkon.mbg>
-#include <wlaninternalpskeys.h> // For WLAN state checking
-#include <ctsydomainpskeys.h>
-#include <AknNotiferAppServerApplication.h>
-#include <barsread.h> // Resource reader
-#include <BTNotif.rsg> // Own resources
-#include <bt_subscribe.h>
-#include <btnotif.mbg>
-#include <wlanplugin.mbg> // Borrow WLan signal strenth bar to show RSSI
-#include <devui_const.h>
-#include <btengutil.h>
-#include <bluetoothuiutil.h>
-#include "btninqui.h" // Own class definition
-#include "btNotifDebug.h" // Debugging macros
-#include "btnotifnameutils.h"
-
-
-const TInt KBTAllPurposeBufferLength = 266;
-const TInt KBTNotifNonPairedUsedDevicesMaxNumber= 5;
-// RSSI value range: -127dB ~ +20dB
-const TInt KRssiRangeOffset = 127 + 1; // Offset for getting a non-zero positive value
-const TInt KMinimumStrength = 1;
-const TInt KMediumStrength = 53;
-const TInt KHighStrength = 82;
-const TUint32 ExcludePairedDeviceMask = 0x800000;
-const TUint32 ResetExcludePairedDeviceMask = 0xFF7FFFFF;
-_LIT(KBtnotifBmpFileName,"btnotif.mbm");
-_LIT(KWLanBmpFileName,"wlanplugin.mif");
-
-// ================= MEMBER FUNCTIONS =======================
-
-// ----------------------------------------------------------
-// CBTInqUI::CBTInqUI
-// C++ default constructor can NOT contain any code, that
-// might leave.
-// ----------------------------------------------------------
-//
-CBTInqUI::CBTInqUI( MBTNDeviceSearchObserver* aObserver,
- CBTNotifUIUtil* aUtil,
- const TBTDeviceClass& aDesiredDevClass):
- iUiUtil (aUtil),
- iEikonEnvRef( iUiUtil->LocalEikonEnv() ),
- iDevicesFound (EFalse),
- iBroughtForwards (EFalse),
- iDesiredDeviceClass (aDesiredDevClass),
- iSystemCancel (EFalse),
- iPageForName ( EFalse ),
- iCurrentlyResolvingUnnamedDeviceIndex (0),
- iDevSearchObserver (aObserver)
- {
- iBTRegistryQueryState=ENoQuery;
- }
-
-// ----------------------------------------------------------
-// CBTInqUI::ConstructL
-// Symbian 2nd phase constructor can leave.
-// Creates first device list (not shown yet) and initializes
-// couple of member variables with default values.
-// ----------------------------------------------------------
-//
-void CBTInqUI::ConstructL()
- {
- FLOG(_L("[BTNOTIF]\t CBTInqUI::ConstructL()"));
-
- // Read default device names to an array
- iDefaultDeviceNamesArray = iEikonEnvRef.ReadDesCArrayResourceL( R_BT_DEFAULT_DEVICE_NAMES );
-
- // create the timer
- iPeriodicTimer = CPeriodic::NewL(CActive::EPriorityIdle);
-
- // Create device array
- //
- iDeviceListRows = new(ELeave) CDesCArrayFlat(1);
-
- iPairedDevicesArray = new (ELeave) CBTDeviceArray(1);
- iLastUsedDevicesArray = new(ELeave) CBTDeviceArray(1);
- iLastSeenDevicesArray = new(ELeave) CBTDeviceArray(1);
- iAdjustedUsedDeviceArray = new(ELeave) CBTDeviceArray(1);
-
- iDevMan=CBTEngDevMan::NewL(this);
-
- iExcludePairedDevices = iDesiredDeviceClass.DeviceClass() & ExcludePairedDeviceMask ?
- ETrue : EFalse;
- if ( iExcludePairedDevices )
- {
- FLOG (_L("[BTNOTIF]\t CBTInqUI::ConstrucL Excluding paired devices"));
- iDesiredDeviceClass = iDesiredDeviceClass.DeviceClass() & ResetExcludePairedDeviceMask;
- }
- // Retrieve paired devices to a local array
- RetrievePairedDevices();
-
- FLOG(_L("[BTNOTIF]\t CBTInqUI::ConstructL() completed"));
- }
-
-// ----------------------------------------------------------
-// CBTInqUI::RetrieveUsedDevices- Substitute
-// ----------------------------------------------------------
-//
-void CBTInqUI::RetrieveUsedDevices()
- {
- FLOG(_L("[BTNOTIF]\t CBTInqUI::RetrieveUsedDevicesL()"));
-
- TBTRegistrySearch searchPattern;
- searchPattern.FindAll();
-
- //Ignore this error. Continue device search.
- TInt err=iDevMan->GetDevices( searchPattern, iLastUsedDevicesArray );
- if(err)
- {
- TRAP_IGNORE(AdjustDeviceArrayL(iAdjustedUsedDeviceArray));
- DoDeviceFrontListSelection();
- FTRACE(FPrint(_L("[BTNOTIF]\t CBTInqUI: get useddevice err %d"), err));
- }
- else
- {
- iBTRegistryQueryState=EQueryUsed;
- }
- FLOG(_L("[BTNOTIF]\t CBTInqUI::RetrieveUsedDevicesL() returned"));
- }
-
-//---------------------------------------------------------------
-// CBTInqUI::RetrievePairedDevices
-//---------------------------------------------------------------
-void CBTInqUI::RetrievePairedDevices()
- {
- FLOG(_L("[BTNOTIF]\t CBTInqUI::RetrievePairedDevicesL()"));
-
- TBTRegistrySearch searchPattern;
- searchPattern.FindBonded();
-
- TInt err= iDevMan->GetDevices( searchPattern, iPairedDevicesArray );
- FTRACE(FPrint(_L("[BTNOTIF]\t CBTInqUI: get paireddevice err %d"), err));
- if(err)
- {
- //Next: try to get used devices
- RetrieveUsedDevices();
- }
- else
- {
- iBTRegistryQueryState=EQueryPaired;
- }
- FLOG(_L("[BTNOTIF]\t CBTInqUI::RetrievePairedDevicesL() returned"));
- }
-
-// ----------------------------------------------------------
-// CBTInqUI::HandleGetDevicesComplete
-// ----------------------------------------------------------
-//
-void CBTInqUI::HandleGetDevicesComplete(TInt aErr, CBTDeviceArray* /*aDeviceArray*/)
- {
- FTRACE(FPrint(_L("[BTNOTIF]\t CBTInqUI::HandleGetDevicesComplete() err: %d"), aErr));
- (void) aErr;
- switch(iBTRegistryQueryState)
- {
- case EQueryPaired:
- // If a device is paired in Just Works model but without user awareness,
- // This device won't be shown in UI paired view, so we have to
- // remove it from this array so that it will be shown to user
- // in the last used device list.
- for (int i = iPairedDevicesArray->Count() - 1; i >= 0; --i )
- {
- if ( !IsUserAwarePaired( iPairedDevicesArray->At( i )->AsNamelessDevice() ) )
- {
- delete iPairedDevicesArray->At( i );
- iPairedDevicesArray->Delete( i );
- }
- }
- RetrieveUsedDevices();
- break;
- case EQueryUsed:
- // fill in the list of last seen devices, so it can be shown
- TRAP_IGNORE(AdjustDeviceArrayL(iAdjustedUsedDeviceArray));
- DoDeviceFrontListSelection();
- break;
- default:
- break;
- }
-
- FLOG(_L("[BTNOTIF]\t CBTInqUI::HandleGetDevicesComplete() Complete"));
- }
-
-// ----------------------------------------------------------
-// Destructor
-// ----------------------------------------------------------
-//
-CBTInqUI::~CBTInqUI()
- {
- FLOG(_L("[BTNOTIF]\t CBTInqUI::~CBTInqUI()"));
-
- if( iBroughtForwards )
- {
- iEikonEnvRef.BringForwards(EFalse);
- iBroughtForwards = EFalse;
- }
-
- if( iPairedDevicesArray )
- {
- iPairedDevicesArray->ResetAndDestroy();
- delete iPairedDevicesArray;
- }
- if( iLastUsedDevicesArray )
- {
- iLastUsedDevicesArray->ResetAndDestroy();
- delete iLastUsedDevicesArray;
- }
- if( iLastSeenDevicesArray )
- {
- iLastSeenDevicesArray->ResetAndDestroy();
- delete iLastSeenDevicesArray;
- }
-
- iLastSeenDevicesNameComplete.Close();
-
- if( iAdjustedUsedDeviceArray )
- {
- iAdjustedUsedDeviceArray->ResetAndDestroy();
- delete iAdjustedUsedDeviceArray;
- }
- if( iDefaultDeviceNamesArray )
- {
- iDefaultDeviceNamesArray->Reset();
- delete iDefaultDeviceNamesArray;
- }
-
- delete iDevMan;
- delete iDeviceListBox;
- delete iDeviceListRows;
- delete iPeriodicTimer;
-
- FLOG(_L("[BTNOTIF]\t CBTInqUI::~CBTInqUI() completed"));
- }
-
-// ----------------------------------------------------------
-// CBTInqUI::Cancel
-// ----------------------------------------------------------
-//
-void CBTInqUI::Cancel()
- {
- FLOG(_L("[BTNOTIF]\t CBTInqUI::Cancel()"));
-
- iSystemCancel = ETrue;
- if(iDevMan)
- {
- iDevMan->Cancel();
- }
-
- if( iSearchFilterPopupList )
- {
- iSearchFilterPopupList->CancelPopup();
- }
-
- if(iPeriodicTimer)
- {
- iPeriodicTimer->Cancel();
- }
-
- RemoveScanner();
- InquiryComplete(KErrCancel);
-
- FLOG(_L("[BTNOTIF]\t CBTInqUI::Cancel() completed"));
- }
-
-// ----------------------------------------------------------
-// CBTInqUI::DisplayDevicesFrontListL
-// Display last seen devices popuplist
-// ----------------------------------------------------------
-//
-void CBTInqUI::DisplayDevicesFrontListL()
- {
- FLOG(_L("[BTNOTIF]\t CBTInqUI::DisplayDevicesFrontListL()"));
-
-
- if ( iAdjustedUsedDeviceArray->Count() <= 0 )
- {
- SelectSearchCategoryL();
- return;
- }
-
- if( !iBroughtForwards )
- {
- iEikonEnvRef.BringForwards(ETrue); // Destructor will release this later on
- iBroughtForwards = ETrue;
- }
-
- // Create the devices popuplist
- CreatePopupListL( R_AVKON_SOFTKEYS_SELECT_CANCEL__SELECT , R_BT_LAST_USED_DEVS_POPUP_TITLE );
-
- // Add devices into device list.
- for( TInt index = 0; index < iAdjustedUsedDeviceArray->Count(); index++ )
- {
- AddToDeviceListBoxL ( iAdjustedUsedDeviceArray->At(index) );
- }
-
- // Add "more devices" command as first item of list
- HBufC* formatString = HBufC::NewLC( KBTAllPurposeBufferLength );
- formatString->Des().Copy( TPtrC(KDeviceIconFormatTable[EDeviceIconBlank].iFormat ) );
- HBufC* moreDevicesString = iEikonEnvRef.AllocReadResourceLC( R_BT_MORE_DEVICES_ITEM );
- formatString->Des().Append( *moreDevicesString );
- CleanupStack::PopAndDestroy(); // moreDevicesString
- iDeviceListRows->InsertL( 0, *formatString );
- CleanupStack::Pop(); // formatString
-
- // Launch popup list and wait for user input
- AllowDialerAndAppKeyPress( EFalse );
- TInt popupRetVal = iDevicePopupList->ExecuteLD();
- iDevicePopupList = NULL;
- AllowDialerAndAppKeyPress( ETrue );
-
- if( !popupRetVal )
- {
- // query cancelled by user or system, complete device search:
- iDevSearchObserver->NotifyDeviceSearchCompleted(KErrCancel);
- return;
- }
- TInt currentDeviceIndex = iDeviceListBox->CurrentItemIndex();
-
- // Delete device list box and reset device items array
- delete iDeviceListBox;
- iDeviceListBox = NULL;
- iDeviceListRows->Reset();
-
- if( currentDeviceIndex > 0 ) // User selected "a used device"
- {
- HandleDeviceSelectionL( iAdjustedUsedDeviceArray->At( currentDeviceIndex - 1 ) );
- return;
- }
-
- // user selected more devices.
- SelectSearchCategoryL();
- FLOG(_L("[BTNOTIF]\t CBTInqUI::DisplayDevicesFrontListL() completed"));
- }
-
-// ----------------------------------------------------------
-// CBTInqUI::DeviceSearchUiL
-// Execute bluetooth device search/inquiry.
-// Parameters:
-// OUT: aDevice - selected device after inquiry
-// IN: aObexOnly - flag if OBEX capable devices is requested
-// ----------------------------------------------------------
-//
-void CBTInqUI::DeviceSearchUiL()
- {
- FLOG(_L("[BTNOTIF]\t CBTInqUI::DeviceSearchUiL()"));
-
- TSearchFlowState searchFlow;
- TInt err;
- AllowDialerAndAppKeyPress( EFalse );
- do
- {
- searchFlow = InitInquiryL(err);
- } while (searchFlow == ESearchAgain);
-
- if (searchFlow == ESearchCompleted)
- {
- // search completed caused by either user cancel or failure
- iDevSearchObserver->NotifyDeviceSearchCompleted(err);
- AllowDialerAndAppKeyPress( ETrue );
- return;
- }
-
- FLOG(_L("[BTNOTIF]\t CBTInqUI, Displaying devices already found"));
-
- TInt keypress(0);
- // Show devices popup list for received devices while
- // inquiry is still active and list may be updated.
- if( !iInquiryComplete )
- {
- CreatePopupListL( R_BT_SOFTKEYS_SELECT_STOP, R_BT_SEARCH_DEVS_POPUP_TITLE );
-
- // Set animation
- iDevicePopupList->Heading()->SetHeaderAnimationL( R_BT_ANIMATION_FOR_POPUPLIST );
-
- // Launch popup list and wait for user input
- keypress = iDevicePopupList->ExecuteLD();
- iDevicePopupList = NULL;
- }
-
- // If Cancel() is called while DoInquery() is still running,
- // such as taking out MMC while bt devices discovery or user pressed redkey.
- // In such cases, We need to dismiss anything and function returns immediately.
- //
- if (iSystemCancel )
- {
- FLOG(_L("[BTNOTIF]\t inquiry was canncelled by the system!"));
- iSystemCancel = EFalse;
- AllowDialerAndAppKeyPress( ETrue );
- iDevSearchObserver->NotifyDeviceSearchCompleted(KErrCancel);
- return;
- }
-
- // Cancel inquiry
- RemoveScanner();
-
- // Store the highlighted device index and destroy list box
- iHighLightedItemIndex = 0;
- if( iDeviceListBox )
- {
- iHighLightedItemIndex = iDeviceListBox->CurrentItemIndex();
- delete iDeviceListBox;
- iDeviceListBox = NULL;
- }
-
- // user selected a device during active inquiry
- if (keypress)
- {
- AllowDialerAndAppKeyPress( ETrue );
- HandleDeviceSelectionL( iLastSeenDevicesArray->At( iHighLightedItemIndex ) );
- return;
- }
-
- // Error encountered in inquiry
- if (iInquiryStatus)
- {
- AllowDialerAndAppKeyPress( ETrue );
- iDevSearchObserver->NotifyDeviceSearchCompleted(iInquiryStatus);
- return;
- }
-
- // Inquiry completed, show final device list
- FLOG(_L("[BTNOTIF]\t CBTInqUI::DeviceSearchUiL Displaying final devicelist"));
- CreatePopupListL( R_AVKON_SOFTKEYS_SELECT_CANCEL__SELECT, R_BT_FOUND_DEVS_POPUP_TITLE );
-
- //cancel iPeriodicTimer after the final list is shown
- iPeriodicTimer->Cancel();
- User::ResetInactivityTime();
- // Set highlight on top of same device as it was in previous popuplist
- if( iHighLightedItemIndex >= 0 )
- {
- iDeviceListBox->HandleItemAdditionL();
- iDeviceListBox->SetCurrentItemIndex(iHighLightedItemIndex);
- }
-
- // Launch popup list and wait for user input
- keypress = iDevicePopupList->ExecuteLD();
- iDevicePopupList = NULL;
- AllowDialerAndAppKeyPress( ETrue );
- // If dialog is cancelled by system:
- if( !keypress)
- {
- iDevSearchObserver->NotifyDeviceSearchCompleted(KErrCancel);
- return;
- }
-
- // Get user selection
- TInt index = iDeviceListBox->CurrentItemIndex();
- delete iDeviceListBox;
- iDeviceListBox = NULL;
-
- HandleDeviceSelectionL( iLastSeenDevicesArray->At( index ) );
-
- FLOG(_L("[BTNOTIF]\t CBTInqUI::DeviceSearchUiL() complete"));
- }
-
-TSearchFlowState CBTInqUI::InitInquiryL(TInt& aReason)
- {
- FLOG(_L("[BTNOTIF]\t CBTInqUI::InitInquiryL"));
- if (IsActiveVoIPOverWLAN())
- {
- iUiUtil->ShowInfoNoteL( R_BT_NO_DEVICE_DISCOVERY_VOIP, ECmdBTnotifUnavailable );
- aReason = KErrInUse;
- return ESearchCompleted;
- }
-
- // starting the timer
- iPeriodicTimer->Cancel();
- iPeriodicTimer->Start(KPeriodicTimerInterval4Sec, KPeriodicTimerInterval4Sec,
- TCallBack(PeriodicTimerCallBack, this));
-
- // Prepare for using hostresolver to search devices
- CreateScannerL();
-
- iInquiryStatus = KErrCancel; // Give a initial value (for end key handling)
- iDevicesFound = EFalse;
- iInquiryComplete = EFalse;
- iSystemCancel = EFalse;
-
- // Show wait note until dialog is dismissed by inquirey result callbacks or user cancel
- TInt ret = iUiUtil->ShowWaitDlgL( R_BT_SEARCHING_DEVICES_NOTE );
-
- // If user cancels searching, ret will be KerrNone.
- // According to Description of Eikdialog, ShowWaitDlgL() returns zero
- // if it was the cancel button (@c EEikBidCancel).
- if( ret == KErrNone || iSystemCancel )
- {
- FLOG(_L("[BTNOTIF]\t CBTInqUI, User cancelled waiting note"));
- RemoveScanner();
- aReason = KErrCancel;
- return ESearchCompleted;
- }
-
- if( !iDevicesFound ) // No devices found at all
- {
- FLOG(_L("[BTNOTIF]\t CBTInqUI no devices found at all"));
- RemoveScanner(); // Cancel inquiry
-
- if( iInquiryStatus != KErrNone )
- {
- aReason = iInquiryStatus;
- return ESearchCompleted;
- }
-
- // Show try again query
- TBool keypress(0);
- keypress = iUiUtil->ShowQueryL( KErrNone, R_BT_TRY_AGAIN_QUERY, ECmdBTnotifUnavailable );
- if( !keypress ) // User has not requested new inquiry
- {
- aReason = KErrCancel;
- return ESearchCompleted;
- }
- else
- {
- FLOG(_L("[BTNOTIF]\t CBTInqUI user wanted to try again"));
- return ESearchAgain;
- }
- }
- return ESearchFirstDeviceFound;
- }
-
-// ----------------------------------------------------------
-// CBTInqUI::DeviceAvailableL
-// Bluetooth device has been received.
-// ----------------------------------------------------------
-//
-void CBTInqUI::DeviceAvailableL( const TNameRecord& aNameRecord, const TDesC& aDevName, TBool aIsNameComplete )
- {
- FLOG(_L("[BTNOTIF]\t CBTInqUI::DeviceAvailableL()"));
-
- if( !iDevicesFound )
- {
- FLOG(_L("[BTNOTIF]\t CBTInqUI::DeviceAvailableL() first found, clear last seen devices array"));
- iLastSeenDevicesArray->ResetAndDestroy(); // Remove previous inquiry results
- iDevicesFound = ETrue;
- iInquiryStatus = KErrNone;
- }
-
- iUiUtil->CompleteWaitDlgL();
-
- TInquirySockAddr& sa = TInquirySockAddr::Cast( aNameRecord.iAddr );
-
- // Create device object with received CoD information
- CBTDevice* newDevice = CBTDevice::NewLC( sa.BTAddr() );
- TBTDeviceClass cod( sa.MajorServiceClass(), sa.MajorClassOfDevice(), sa.MinorClassOfDevice() );
- newDevice->SetDeviceClass( cod );
- FTRACE(FPrint(_L("[BTNOTIF]\t CoD %b"), cod.DeviceClass() ));
- TInt rssi = 0;
- if( sa.ResultFlags() & TInquirySockAddr::ERssiValid )
- {
- rssi = sa.Rssi() + KRssiRangeOffset;
- }
-
- TBTDeviceName name(aDevName);
- if (!aIsNameComplete)
- {
- // Append a little "..." to partial names.
- _LIT(KToBeContd, "...");
- if (name.MaxLength() - name.Length() >= KToBeContd().Length())
- {
- name.Append(KToBeContd);
- }
- }
- BtNotifNameUtils::SetDeviceNameL(name, *newDevice);
-
- // Append newDevice in the bottom of the "last seen" device array.
- iLastSeenDevicesArray->AppendL(newDevice);
- iLastSeenDevicesNameComplete.AppendL(aIsNameComplete);
- CleanupStack::Pop(); // new device is under iLastSeenDevicesArray control now
-
- __ASSERT_DEBUG(iLastSeenDevicesArray->Count() == iLastSeenDevicesNameComplete.Count(),
- User::Panic(_L("BTNotifInqUI - device array and name resolution status array out of sync"), KErrCorrupt));
-
- // Update device popup list with newDevice
- AddToDeviceListBoxL( newDevice, rssi );
-
- __ASSERT_DEBUG(iLastSeenDevicesArray->Count() == iDeviceListRows->Count(),
- User::Panic(_L("BTNotifInqUI - device array and UI list out of sync"), KErrCorrupt));
-
- FLOG(_L("[BTNOTIF]\t CBTInqUI::DeviceAvailableL() completed"));
- }
-
-void CBTInqUI::DeviceNameUpdatedL(const TNameRecord& aNameRecord, TInt aLastSeenIndex)
- {
- FTRACE(FPrint(_L("[BTNOTIF]\t CBTInqUI::DeviceUpdatedL() Name found: %S"), &(aNameRecord.iName) ));
-
- TInquirySockAddr& sa = TInquirySockAddr::Cast( iEntry().iAddr );
-
- TInt rssi = 0;
- if( sa.ResultFlags() & TInquirySockAddr::ERssiValid )
- {
- rssi = sa.Rssi() + KRssiRangeOffset;
- }
-
- BtNotifNameUtils::SetDeviceNameL(aNameRecord.iName, *iLastSeenDevicesArray->At(aLastSeenIndex));
- DeviceUpdatedL(rssi, aLastSeenIndex);
-
- FLOG(_L("[BTNOTIF]\t CBTInqUI::DeviceUpdatedL() completed"));
- }
-
-void CBTInqUI::PageTimeoutOnDeviceWithPartialNameL(TInt aLastSeenIndex)
- {
- FLOG(_L("[BTNOTIF]\t CBTInqUI::PageTimeoutOnDeviceWithPartialNameL()"));
- DeviceUpdatedL(KMinimumStrength, aLastSeenIndex);
- FLOG(_L("[BTNOTIF]\t CBTInqUI::PageTimeoutOnDeviceWithPartialNameL() completed"));
- }
-
-
-void CBTInqUI::DeviceUpdatedL(TInt aSignalStrength, TInt aLastSeenIndex)
- {
- FLOG(_L("[BTNOTIF]\t CBTInqUI::DeviceUpdatedL()"));
-
- HBufC* formatString = HBufC::NewLC( KBTAllPurposeBufferLength );
- FormatListBoxEntryL(*iLastSeenDevicesArray->At(aLastSeenIndex), aSignalStrength, formatString->Des());
-
- // The assumption here is that iLastSeenDevicesArray is always accurately reflected
- // in iDeviceListRows so device indexes match.
- __ASSERT_DEBUG(iLastSeenDevicesArray->Count() == iDeviceListRows->Count(),
- User::Panic(_L("BTNotifInqUI - device array and UI dev list out of sync not created"), KErrCorrupt));
-
- iDeviceListRows->Delete(aLastSeenIndex);
- iDeviceListRows->InsertL(aLastSeenIndex, *formatString);
- CleanupStack::PopAndDestroy(); // formatString
-
- __ASSERT_DEBUG(iDeviceListBox,
- User::Panic(_L("BTNotifInqUI - UI list non-existant on name update"), KErrCorrupt));
- iDeviceListBox->HandleItemAdditionL();
-
- FLOG(_L("[BTNOTIF]\t CBTInqUI::DeviceUpdatedL()"));
- }
-
-void CBTInqUI::FormatListBoxEntryL(CBTDevice& aDevice, const TInt aSignalStrength, TPtr aFormatString)
- {
- FLOG(_L("[BTNOTIF]\t CBTInqUI::FormatListBoxEntryL()"));
-
- TInt iconIndex (EDeviceIconDefault);
- TInt defNameIndex (EBTDeviceNameIndexDefault);
-
- // Check whether the device is already in registry.
- TInt index = LookupFromDevicesArray(iPairedDevicesArray, &aDevice );
- if( index >= 0 )
- {
- // Update device's link key and friendly name
- // with those found from registry.
- aDevice.UpdateL( *( iPairedDevicesArray->At( index ) ) );
- }
-
- for (TInt i = 0; i < KDeviceRowLayoutTableSize; i++)
- {
- if ( ( aDevice.DeviceClass().MajorDeviceClass() == KDeviceRowLayoutTable[i].iMajorDevClass ) &&
- ( (aDevice.DeviceClass().MinorDeviceClass() == KDeviceRowLayoutTable[i].iMinorDevClass ) ||
- KDeviceRowLayoutTable[i].iMinorDevClass == 0 ) )
- {
- iconIndex = KDeviceRowLayoutTable[i].iIconIndex;
- defNameIndex = KDeviceRowLayoutTable[i].iDefaultNameIndex;
- break;
- }
- }
-
- if ( !aDevice.IsValidFriendlyName() && !aDevice.IsValidDeviceName() )
- {
- BtNotifNameUtils::SetDeviceNameL(iDefaultDeviceNamesArray->MdcaPoint(defNameIndex), aDevice);
- }
-
- //Convert device name to Unocode for display
- if ( aDevice.IsValidFriendlyName() )
- {
- aFormatString.Copy( aDevice.FriendlyName() );
- }
- else
- {
- aFormatString.Copy( BTDeviceNameConverter::ToUnicodeL(aDevice.DeviceName()));
- }
-
- TPtrC iconFormat (KDeviceIconFormatTable[iconIndex].iFormat);
-
- aFormatString.Insert( 0, iconFormat );
-
- if( aSignalStrength > 0)
- {
- if( aSignalStrength <= KMediumStrength )
- {
- aFormatString.Append( TPtrC(KDeviceIconFormatTable[EDeviceIconRssiLow].iFormat ) );
- }
- else if( aSignalStrength <= KHighStrength )
- {
- aFormatString.Append( TPtrC(KDeviceIconFormatTable[EDeviceIconRssiMed].iFormat ) );
- }
- else
- {
- aFormatString.Append( TPtrC(KDeviceIconFormatTable[EDeviceIconRssiGood].iFormat ) );
- }
- }
-
- // If the device is paired, add paired icon to format list
- // Paired device using JustWork file transfering mode is not shown as paired here.
- if( index >= 0 && IsUserAwarePaired ( aDevice.AsNamelessDevice() ) )
- {
- aFormatString.Append( TPtrC(KDeviceIconFormatTable[EDeviceIconPaired].iFormat ) );
- }
- else
- {
- // if device is blocked, add blocked icon to format list
-
- TInt indexB = LookupFromDevicesArray(iLastUsedDevicesArray, &aDevice );
-
- if ( indexB>=0 && iLastUsedDevicesArray->At( indexB )->GlobalSecurity().Banned())
- {
- aFormatString.Append( TPtrC(KDeviceIconFormatTable[EDeviceIconBlocked].iFormat ) );
- }
- }
- FLOG(_L("[BTNOTIF]\t CBTInqUI::FormatListBoxEntryL() completed"));
- }
-
-
-// ----------------------------------------------------------
-// CBTInqUI::InquiryComplete
-// Inquiry has been completed.
-// ----------------------------------------------------------
-//
-void CBTInqUI::InquiryComplete( TInt aError )
- {
- FTRACE(FPrint(_L("[BTNOTIF]\t CBTInqUI::InquiryComplete() status = %d: %d devices found"), aError, iLastSeenDevicesArray->Count() ));
- iInquiryComplete = ETrue;
- // Remove popup list if any devices exists
- if( iDevicePopupList )
- {
- iDevicePopupList->CancelPopup();
- iDevicePopupList = NULL;
- }
-
- TRAP_IGNORE( iUiUtil->CompleteWaitDlgL() );
-
- if ( aError == KErrNone || aError == KErrCancel || aError == KErrEof )
- {
- iInquiryStatus = (aError == KErrEof ) ? KErrNone : aError;
- }
- else
- {
- iLastSeenDevicesArray->ResetAndDestroy(); // Remove previous inquiry results
- }
-
- FLOG(_L("[BTNOTIF]\t CBTInqUI::InquiryComplete() completed"));
- }
-
-// ----------------------------------------------------------
-// CBTInqUI::PeriodicTimerCallBack(TAny* aAny)
-// The call back function
-// ----------------------------------------------------------
-//
-TInt CBTInqUI::PeriodicTimerCallBack(TAny* /*aAny*/)
- {
- User::ResetInactivityTime();
- return KErrNone; // Return value ignored by CPeriodic
- }
-
-// ----------------------------------------------------------
-// CBTInqUI::RemoveScanner
-// Remove scanner active object if still exists.
-// ----------------------------------------------------------
-//
-void CBTInqUI::RemoveScanner()
- {
- FLOG(_L("[BTNOTIF]\t CBTInqUI::RemoveScanner()"));
- if( iScanner )
- {
- iScanner->CancelRequest();
- iHostResolver.Close();
- iSocketServer.Close();
- delete iScanner;
- iScanner = NULL;
- }
- iDevsWithoutName.Close();
- FLOG(_L("[BTNOTIF]\t CBTInqUI::RemoveScanner() completed"));
- }
-
-// ----------------------------------------------------------
-// CBTInqUI::CreatePopupListL
-// ----------------------------------------------------------
-//
-void CBTInqUI::CreatePopupListL(TInt aSoftkeysResourceId, TInt aTitleResourceId )
- {
- FLOG(_L("[BTNOTIF]\t CBTInqUI::CreatePopupListL()"));
-
- __ASSERT_DEBUG( !iDeviceListBox, User::Panic(_L("BTNotifInqUI - iDeviceListBox not released!" ), KErrAlreadyExists));
- __ASSERT_DEBUG( !iDevicePopupList, User::Panic(_L("BTNotifInqUI - iDevicePopupList not released!"),KErrAlreadyExists));
-
- // Create listbox for devices
- iDeviceListBox = new(ELeave) CAknSingleGraphicPopupMenuStyleListBox;
-
- // Create popup list
- iDevicePopupList = CAknPopupList::NewL( iDeviceListBox, aSoftkeysResourceId, AknPopupLayouts::EDynMenuWindow );
-
- iDeviceListBox->ConstructL(iDevicePopupList, EAknListBoxMenuList );
- iDeviceListBox->CreateScrollBarFrameL(ETrue);
- iDeviceListBox->ScrollBarFrame()->SetScrollBarVisibilityL( CEikScrollBarFrame::EOff, CEikScrollBarFrame::EAuto);
-
- // Read title from resources
- HBufC* popupListTitle = iEikonEnvRef.AllocReadResourceLC( aTitleResourceId );
- iDevicePopupList->SetTitleL(*popupListTitle);
- CleanupStack::PopAndDestroy(); // popupListTitle
-
- // Create list box model for devices
- CTextListBoxModel* model = iDeviceListBox->Model();
- model->SetItemTextArray(iDeviceListRows);
- model->SetOwnershipType(ELbmDoesNotOwnItemArray); // Do not destroy items
-
- // Set up filename for Avkon bitmap
- TFileName avkonbmpFilename = AknIconUtils::AvkonIconFileName();
-
- // Setup graphic items list for BT devices listbox
- CAknIconArray* iconList = new(ELeave) CAknIconArray(KDeviceIconCount);
- 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( KAknsIIDQgnStatBtBlank, avkonbmpFilename,
- EMbmAvkonQgn_stat_bt_blank,
- EMbmAvkonQgn_stat_bt_blank, 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);
-
- GetColorIconL( avkonbmpFilename, KAknsIIDQgnIndiBtPairedAdd,
- EMbmAvkonQgn_indi_bt_paired_add,
- EMbmAvkonQgn_indi_bt_paired_add_mask, iconList );
-
-
- TFileName bmpFilename;
- bmpFilename += KFileDrive;
- bmpFilename += KDC_BITMAP_DIR;
- bmpFilename += KBtnotifBmpFileName;
-
- GetColorIconL( bmpFilename, KAknsIIDQgnIndiBtBlocked,
- EMbmBtnotifQgn_indi_bt_blocked,
- EMbmBtnotifQgn_indi_bt_blocked_mask, iconList );
-
- bmpFilename.Zero();
- bmpFilename.Append( KFileDrive );
- bmpFilename.Append( KDC_APP_BITMAP_DIR );
- bmpFilename.Append( KWLanBmpFileName );
-
- GetColorIconL( bmpFilename, KAknsIIDQgnIndiWlanSignalLowAdd,
- EMbmWlanpluginQgn_indi_wlan_signal_low_add,
- EMbmWlanpluginQgn_indi_wlan_signal_low_add_mask, iconList);
-
- GetColorIconL( bmpFilename, KAknsIIDQgnIndiWlanSignalMedAdd,
- EMbmWlanpluginQgn_indi_wlan_signal_med_add,
- EMbmWlanpluginQgn_indi_wlan_signal_med_add_mask, iconList );
-
- GetColorIconL( bmpFilename, KAknsIIDQgnIndiWlanSignalGoodAdd,
- EMbmWlanpluginQgn_indi_wlan_signal_good_add,
- EMbmWlanpluginQgn_indi_wlan_signal_good_add_mask, iconList );
-
- // Transfer iconlist ownership to the listbox
- //
- iDeviceListBox->ItemDrawer()->ColumnData()->SetIconArray(iconList);
- CleanupStack::Pop(); // iconList
-
- FLOG(_L("[BTNOTIF]\t CBTInqUI::CreatePopupListL() completed"));
- }
-
-// ----------------------------------------------------------
-// CBTInqUI::UpdateDeviceListL
-// ----------------------------------------------------------
-//
-void CBTInqUI::AddToDeviceListBoxL( CBTDevice* aDevice, const TInt aSignalStrength )
- {
- FLOG(_L("[BTNOTIF]\t CBTInqUI::AddToDeviceListBoxL()"));
-
- HBufC* formatString = HBufC::NewLC( KBTAllPurposeBufferLength );
- FormatListBoxEntryL(*aDevice, aSignalStrength, formatString->Des());
-
- // Add device format string into device items
- //
- TInt deviceCount = iDeviceListRows->Count();
- iDeviceListRows->InsertL( deviceCount, *formatString );
- CleanupStack::PopAndDestroy(); // formatString
-
- TInt currentItemIndex = 0;
- if(deviceCount != 0 && iDeviceListBox)
- {
- // Store temporarily the highlighted device and destroy list box
- //
- currentItemIndex = iDeviceListBox->CurrentItemIndex();
- }
-
- if( iDeviceListBox )
- {
- iDeviceListBox->HandleItemAdditionL();
-
- if(deviceCount != 0 )
- {
- //set highligh back to user selected one.
- iDeviceListBox->SetCurrentItemIndex(currentItemIndex);
- }
-
- // Adjust top item index in order to "scroll up" the list.
- // If current highlight device is not the top one and the listbox's visible slots are full(at least 5 devices are listed),
- // to make the newly discovered device visible, the list needs to be scrolled up.
- //
- TInt topIndex = iDeviceListBox->TopItemIndex();
- deviceCount = iDeviceListRows->Count();
-
- if( (currentItemIndex != topIndex && deviceCount > 5 ) && (currentItemIndex+1 < deviceCount ) )
- {
- iDeviceListBox->SetTopItemIndex( topIndex+1 ); //scroll up
- }
- }
-
- FLOG(_L("[BTNOTIF]\t CBTInqUI::AddToDeviceListBoxL() completed"));
- }
-
-// ----------------------------------------------------------
-// CBTInqUI::LookupFromDevicesArrayL
-// Check if the BT device is paired devices array
-// ----------------------------------------------------------
-//
-TInt CBTInqUI::LookupFromDevicesArray(const CBTDeviceArray* aDeviceArray, const CBTDevice* aDevice ) const
- {
- FLOG(_L("[BTNOTIF]\t CBTInqUI::LookupFromDevicesArray()"));
-
- __ASSERT_DEBUG( aDeviceArray, User::Panic(_L("BTNotifInqUI - aDeviceArray not created"), KErrNotFound ));
-
- for( TInt index = 0; index < aDeviceArray->Count(); index++ )
- {
- // Try to find device by its address.
- if ( aDeviceArray->At( index )->BDAddr() == aDevice->BDAddr() )
- {
- FTRACE(FPrint(_L("[BTNOTIF]\t CBTInqUI::LookupFromDevicesArrayL()idx %d"), index));
- return index; // Return index to the device at array
- }
- }
- return KErrNotFound;
- }
-
-// ----------------------------------------------------
-// CBTInqUI::CreateAndAppendIconL
-// ----------------------------------------------------
-void CBTInqUI::CreateAndAppendIconL( const TAknsItemID& aID,
- const TDesC& aFileName,
- const TInt aBitmapId,
- const TInt aMaskId,
- CAknIconArray* aIconList)
- {
- CGulIcon* icon = AknsUtils::CreateGulIconL(AknsUtils::SkinInstance(), aID, aFileName, aBitmapId, aMaskId);
-
- CleanupStack::PushL(icon);
- aIconList->AppendL( icon );
- CleanupStack::Pop(); // icon
- }
-
-// ---------------------------------------------------------
-// CBTInqUI::AdjustDeviceArrayL
-// Applend max 5 lately used non-paird devices plus all the
-// paired devices to the input parameter by the order of
-// the last used time stamp.
-// ---------------------------------------------------------
-//
-void CBTInqUI::AdjustDeviceArrayL(CBTDeviceArray* aDeviceArray)
- {
- FLOG(_L("[BTNOTIF]\t CBTInqUI::AdjustDeviceArrayL()"));
-
- TInt lSize = iLastUsedDevicesArray->Count();
-
- if (lSize <= 0)
- {
- return;
- }
-
- TInt pSize = iPairedDevicesArray->Count();
- TInt nonPairedUsedDevicesNumber = lSize - pSize;
-
- // Pickup 5 latest used devices (paired devices are excluded)
- //
- TInt count(0);
-
- if (nonPairedUsedDevicesNumber <= KBTNotifNonPairedUsedDevicesMaxNumber)
- count = nonPairedUsedDevicesNumber;
- else
- count = KBTNotifNonPairedUsedDevicesMaxNumber;
-
- for(TInt i=0; i < count; i++ )
- {
- TInt targetDeviceIndex = 0;
-
- //go through iLastUsedDevicesArray, compare each device's time stamp and, find the latest used one.
- for(TInt k=0; k < lSize; k++)
- {
- if(iLastUsedDevicesArray->At(targetDeviceIndex)->Used() < iLastUsedDevicesArray->At(k)->Used())
- {
- targetDeviceIndex = k;
- }
- }
-
- //if result is not a paired device, add it to the adjuested device array.
- if( LookupFromDevicesArray(iPairedDevicesArray, iLastUsedDevicesArray->At(targetDeviceIndex)) == KErrNotFound )
- {
- aDeviceArray->AppendL(iLastUsedDevicesArray->At(targetDeviceIndex)->CopyL());
- }
- //if result is a paired device, ignore this search round and step-back counter i to make sure this
- //search round won't be count.
- else
- {
- i--;
- }
-
- //set the time stamp to -1, in order to ignore this device during next search round.
- iLastUsedDevicesArray->At(targetDeviceIndex)->SetUsed(-1);
- }
-
- // Add paired devices to the adjusted list(if paired device exist),
- // by the order of last used time.
- //
- if(pSize > 0)
- {
- for( TInt i = 0; i < pSize; i++ )
- {
- //count size in the beginning of each loop, since the size could grow,
- //if new item has been appended in last loop round.
- TInt sSize = aDeviceArray->Count();
-
- TInt j = 0;
- for (; j < sSize ; j++)
- {
- //check if this paired device alreay on the list jump out this loop
- if (iPairedDevicesArray->At(i)->BDAddr() == aDeviceArray->At(j)->BDAddr())
- {
- break;
- }
-
- // We do not add device still valid paired into list if iExcludePairedDevices is set.
- if ( IsUserAwarePaired( iPairedDevicesArray->At(i)->AsNamelessDevice() ) &&
- iExcludePairedDevices )
- {
- break;
- }
-
- //if this device is not on the list and it is used later then current comparing
- //device, insert the paired device to aDeviceArray at suitable position.
- TTime pTime = iPairedDevicesArray->At(i)->Used();
- TTime sTime = aDeviceArray->At(j)->Used();
-
- if ( pTime > sTime)
- {
- aDeviceArray->InsertL(j, iPairedDevicesArray->At(i)->CopyL());
- break;
- }
- }
-
- //if this paired device is not on the sorted list(it is older then all the devices on the list),
- //append it to the end of the list.
- if (j == sSize)
- {
- if ( iExcludePairedDevices )
- {
- // Add device to list if device is not paired and iExcludePairedDevices is not set.
- if ( !IsUserAwarePaired( iPairedDevicesArray->At(i)->AsNamelessDevice() ) )
- {
- aDeviceArray->AppendL(iPairedDevicesArray->At(i)->CopyL());
- }
- }
- else
- {
- aDeviceArray->AppendL(iPairedDevicesArray->At(i)->CopyL());
- }
- }
- }
- }
-
- FLOG(_L("[BTNOTIF]\t CBTInqUI::AdjustDeviceArrayL() Complete."));
- }
-
-//----------------------------------------------------------
-// CBTInqUI::QueryUnblockDeviceL
-//----------------------------------------------------------
-TInt CBTInqUI::QueryUnblockDeviceL(CBTDevice* aDevice)
- {
- FLOG(_L("[BTNOTIF]\t CBTInqUI::QueryUnblockDeviceL()"));
- RBuf stringholder;
- stringholder.CleanupClosePushL();
- TBTDeviceName name;
- BtNotifNameUtils::GetDeviceDisplayName( name, aDevice );
- BluetoothUiUtil::LoadResourceAndSubstringL(
- stringholder, R_BT_UNBLOCK_DEVICE, name, 0 );
- TInt keypress(0);
- keypress = iUiUtil->ShowQueryL( stringholder, R_BT_UNBLOCK_QUERY,
- ECmdBTnotifUnavailable, name, CAknQueryDialog::EConfirmationTone );
- CleanupStack::PopAndDestroy(); // stringholder
- FTRACE(FPrint(_L("[BTNOTIF]\t CBTInqUI::QueryUnblockDeviceL() keypress= %d"),keypress));
-
- return keypress;
- }
-
-// ----------------------------------------------------------
-// CBTInqUI::UnblockDevice
-// Unblock device by modifying registry
-//-----------------------------------------------------------
-//
-TInt CBTInqUI::UnblockDevice(TInt aIndex)
- {
- TInt returnValue = KErrNone;
- TBTDeviceSecurity deviceSecuritySettings = iLastUsedDevicesArray->At(aIndex)->GlobalSecurity();
- deviceSecuritySettings.SetBanned(EFalse);
- iLastUsedDevicesArray->At(aIndex)->DeleteLinkKey();
- //DeleteLinkKey() invalidates the LinkKey and IsPaired entries in Lisbon, so...
- iLastUsedDevicesArray->At(aIndex)->SetGlobalSecurity(deviceSecuritySettings);
- returnValue = iDevMan->ModifyDevice(*iLastUsedDevicesArray->At(aIndex));
- if (!returnValue)
- {
- iBTRegistryQueryState = ESetDeviceUnblocked;
- }
- return returnValue;
- }
-
-// ---------------------------------------------------------
-// CBTInqUI::HandleDevManComplete
-// CBTEngDevMan callback
-// ---------------------------------------------------------
-//
-void CBTInqUI::HandleDevManComplete(TInt aErr)
- {
- FTRACE(FPrint(_L("[BTNOTIF]\t CBTInqUI::HandleDevManComplete() aErr= %d"),aErr));
-
- switch(iBTRegistryQueryState)
- {
- case ESetDeviceUnblocked:
- FTRACE(FPrint(_L("[BTNOTIF]\t CBTInqUI::HandleDevManComplete() EModifyDevice")));
- iDevSearchObserver->NotifyDeviceSearchCompleted(aErr, iDevParams);
- break;
- }
-
- FTRACE(FPrint(_L("[BTNOTIF]\t CBTInqUI::HandleDevManComplete() complete")));
- }
-
-//----------------------------------------------------------------
-// CBTInqUI: DeviceSearchFilter
-//----------------------------------------------------------------
-void CBTInqUI::SelectSearchCategoryL()
- {
- FLOG(_L("[BTNOTIF]\t CBTInqUI::SelectSearchCategoryL()"));
-
- if( !(iDesiredDeviceClass == TBTDeviceClass(0)) )
- {
- // Notifier caller passed specified COD to search device, not need to show filter query.
- DeviceSearchUiL();
- FLOG(_L("[BTNOTIF]\t CBTInqUI::SelectSearchCategoryL() complete: not show filter query"));
- return;
- }
- // Create listbox for devices
- //
- CEikTextListBox* searchFilterListBox = new(ELeave) CAknSinglePopupMenuStyleListBox;
- CleanupStack::PushL(searchFilterListBox);
-
- // Create popup list
- //
- iSearchFilterPopupList = CAknPopupList::NewL(
- searchFilterListBox,
- R_AVKON_SOFTKEYS_SELECT_CANCEL__SELECT,
- AknPopupLayouts::EDynMenuWindow );
-
- searchFilterListBox->ConstructL(iSearchFilterPopupList, EAknListBoxMenuList );
- searchFilterListBox->CreateScrollBarFrameL(ETrue);
- searchFilterListBox->ScrollBarFrame()->SetScrollBarVisibilityL(
- CEikScrollBarFrame::EOff, CEikScrollBarFrame::EAuto);
-
- // Read title from resources
- //
- HBufC* popupListTitle = iEikonEnvRef.AllocReadResourceLC( R_BT_SEARCH_FILTER_POPUP_TITLE );
- iSearchFilterPopupList->SetTitleL(*popupListTitle);
- CleanupStack::PopAndDestroy(); // popupListTitle
-
- // reuse iDeviceListRows for serch filter items
- iDeviceListRows->Reset();
-
- // Create list box model for devices
- //
-
- CTextListBoxModel* model = searchFilterListBox->Model();
- model->SetItemTextArray(iDeviceListRows);
- model->SetOwnershipType(ELbmDoesNotOwnItemArray); // Do not destroy items
-
-
- // Add itms of filter to popuplist
- // Order must be same as in enum EBTSerchFilterItem
- //
-
- AddItemToSearchFilterL(R_BT_SEARCH_FOR_ALL);
- AddItemToSearchFilterL(R_BT_SEARCH_FOR_AUDIO);
- AddItemToSearchFilterL(R_BT_SEARCH_FOR_PHONE);
- AddItemToSearchFilterL(R_BT_SEARCH_FOR_COMPUTER);
- AddItemToSearchFilterL(R_BT_SEARCH_FOR_INPUT);
-
- // Launch popup list and wait for user input, disable other Ui key presses first:
- AllowDialerAndAppKeyPress( EFalse );
- // After input, destroy popup list
- //
- TInt popupRetVal = iSearchFilterPopupList->ExecuteLD();
- iSearchFilterPopupList = NULL;
- AllowDialerAndAppKeyPress( ETrue );
-
- if( popupRetVal )
- {
- TInt currentDeviceIndex = searchFilterListBox->CurrentItemIndex();
- switch(currentDeviceIndex)
- {
- case EBTSearchForAll:
- iDesiredDeviceClass = TBTDeviceClass(0,0,0);
- break;
- case EBTSearchForAudio:
- iDesiredDeviceClass = TBTDeviceClass(0,EMajorDeviceAV,0);
- break;
-
- case EBTSearchForPhone:
- iDesiredDeviceClass = TBTDeviceClass(0,EMajorDevicePhone,0);
- break;
-
- case EBTSearchForComputer:
- iDesiredDeviceClass = TBTDeviceClass(0,EMajorDeviceComputer,0);
- break;
-
- case EBTSearchForInput:
- iDesiredDeviceClass = TBTDeviceClass(0,EMajorDevicePeripheral,0);
- break;
-
- default:
- break;
- }
- }
-
- CleanupStack::PopAndDestroy(); //searchFilterListBox
- iDeviceListRows->Reset();
-
- if( !popupRetVal )
- {
- iDevSearchObserver->NotifyDeviceSearchCompleted(KErrCancel);
- }
- else
- {
- DeviceSearchUiL();
- }
-
- FLOG(_L("[BTNOTIF]\t CBTInqUI::SelectSearchCategoryL() complete"));
- }
-
-//------------------------------------------------------------------------------
-// CBTInqUI: AddItemToSearchFilterL
-//------------------------------------------------------------------------------
-void CBTInqUI::AddItemToSearchFilterL ( TInt aResourceId )
- {
- HBufC* formatString = HBufC::NewLC( KBTAllPurposeBufferLength );
- HBufC* string = iEikonEnvRef.AllocReadResourceLC( aResourceId );
- formatString->Des().Append( *string );
- CleanupStack::PopAndDestroy(); // string
- iDeviceListRows->AppendL( *formatString );
- CleanupStack::Pop(); // formatString
- }
-
-void CBTInqUI::GetColorIconL( TFileName& aFilename, TAknsItemID aItemID,
- TInt aPic, TInt aPicmask, CAknIconArray* aIconList )
- {
- CFbsBitmap* bitmap = NULL;
- CFbsBitmap* mask = NULL;
-
- AknsUtils::CreateColorIconLC(AknsUtils::SkinInstance(), aItemID,
- KAknsIIDQsnIconColors,
- EAknsCIQsnIconColorsCG13,
- bitmap, mask, aFilename, aPic, aPicmask, KRgbBlack);
-
- CGulIcon* icon = CGulIcon::NewL(bitmap, mask);
- CleanupStack::Pop(2); // bitmap, mask;
- CleanupStack::PushL(icon);
- aIconList->AppendL( icon );
- CleanupStack::Pop(); // icon
- }
-
-TBool CBTInqUI::IsActiveVoIPOverWLAN()
- {
- TInt error = KErrNone;
-
- // check VoIP over WLAN is on going or not:
- //
- TInt wlanStatus = 0;
- error = RProperty::Get(KPSUidWlan, KPSWlanIndicator, wlanStatus);
- FTRACE( FPrint( _L( "CBTInqNotifier::CheckActivationOfVoIPOverWLAN() WLAN state: %d (error %d)" ), wlanStatus, error ) );
- if (error)
- {
- return EFalse;
- }
-
- TInt callState = 0;
- error = RProperty::Get( KPSUidCtsyCallInformation, KCTsyCallType, callState );
- FTRACE( FPrint( _L( "CBTInqNotifier::CheckActivationOfVoIPOverWLAN() call state: %d (error %d)" ), callState, error ) );
- if( error == KErrNone &&
- (wlanStatus == EPSWlanIndicatorActive || wlanStatus == EPSWlanIndicatorActiveSecure)&&
- callState == EPSCTsyCallTypeVoIP )
- {
- FTRACE( FPrint( _L( " VoIP call ongoing, do not allow inquiry!" ) ) );
- return ETrue;
- }
- return EFalse;
- }
-
-void CBTInqUI::DoDeviceFrontListSelection()
- {
- TRAPD(err, DisplayDevicesFrontListL());
- if (err)
- {
- iDevSearchObserver->NotifyDeviceSearchCompleted(err);
- }
- }
-
-void CBTInqUI::HandleDeviceSelectionL(CBTDevice* aDev)
- {
- iDevParams = TBTDeviceResponseParams();
- iDevParams.SetDeviceAddress( aDev->BDAddr());
- iDevParams.SetDeviceClass( aDev->DeviceClass());
- if( aDev->IsValidFriendlyName())
- {
- iDevParams.SetDeviceName( aDev->FriendlyName());
- }
- else if( aDev->IsValidDeviceName())
- {
- iDevParams.SetDeviceName( BTDeviceNameConverter::ToUnicodeL( aDev->DeviceName() ) );
- }
- //check if this device is blocked
- TInt index = LookupFromDevicesArray(iLastUsedDevicesArray, aDev);
- TBool blocked = ( index >= 0 && iLastUsedDevicesArray->At( index )->GlobalSecurity().Banned() );
- if (!blocked)
- {
- iDevSearchObserver->NotifyDeviceSearchCompleted(KErrNone, iDevParams);
- return;
- }
-
- TInt toUnblk = QueryUnblockDeviceL(aDev);
- if (!toUnblk)
- {
- iDevSearchObserver->NotifyDeviceSearchCompleted(KErrCancel);
- return;
- }
- TInt err = UnblockDevice( index );
- if (err)
- {
- iDevSearchObserver->NotifyDeviceSearchCompleted(err);
- }
- // otherwise NotifyDeviceSearchCompleted will be called after unblock is really done.
- }
-
-void CBTInqUI::AllowDialerAndAppKeyPress( TBool aAllow )
- {
- CEikAppUi* const eikAppUi = CEikonEnv::Static()->EikAppUi();
- if ( aAllow)
- {
- // Enable dialer
- static_cast<CAknAppUi*>( eikAppUi )->SetKeyEventFlags( 0x00 );
- // Activate apps key.
- // Ignore the return error code as we can do nothing if this operation fails
- (void) static_cast<CAknNotifierAppServerAppUi*>(eikAppUi)->SuppressAppSwitching(EFalse);
- }
- else
- {
- // Disable dialer
- static_cast<CAknAppUi*>( eikAppUi )->SetKeyEventFlags( CAknAppUiBase::EDisableSendKeyShort |
- CAknAppUiBase::EDisableSendKeyLong);
- // Deactivate apps key
- (void) static_cast<CAknNotifierAppServerAppUi*>(eikAppUi)->SuppressAppSwitching(ETrue);
- }
- FTRACE( FPrint( _L( "CBTInqUI::AllowDialerAndAppKeyPress : %d" ), aAllow ) );
- }
-
-TBool CBTInqUI::HaveDevsWithPartialName(TInt& aFirstFoundIndex )
- {
- FLOG(_L("[BTNOTIF]\t CBTInqUI::HaveDevsWithPartialName()."));
- for (TInt i = 0; i < iLastSeenDevicesNameComplete.Count(); i++)
- {
- if (!iLastSeenDevicesNameComplete[i])
- {
- FTRACE(FPrint(_L("[BTNOTIF]\t CBTInqUI::HaveDevsWithPartialName() index %d is partial."), i));
-
- aFirstFoundIndex = i;
- return ETrue;
- }
- }
- return EFalse;
- }
-
-// End of File