diff -r 613943a21004 -r 9386f31cc85b bluetoothengine/btui/Ecom/src/BTUIMainView.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/bluetoothengine/btui/Ecom/src/BTUIMainView.cpp Wed Sep 01 12:20:04 2010 +0100 @@ -0,0 +1,1402 @@ +/* +* 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 the settings view of btui. +* +*/ + +#include // AVKON components +#include +#include +#include // Feature Manager API + +#include "btui.hrh" // Menu commands +#include "btui.h" +#include "BTUIMainView.h" +#include "BTUIMainContainer.h" +#include "debug.h" +#include "BTUIKeyWatcher.h" +#include "BTUIPairedDevicesView.h" +#include "BTUIBlockedDevicesView.h" + +#include // Compiled resource ids +#include +#include +#include +#include +#include // Series 60 localisation stringloader +#include //visibility time setting page +#include +#include // BAFL utils (for language file) +#include // application icon for General Setting +#include +#include // For char filter +#include +#include // Help launcher +#include +#include +#include +#include +#include +#include // CnvUtfConverter +#include // For EnterpriseEnablementL() +#include + +// --------------------------------------------------------- +// CBTUIMainView::NewL +// Two phased constructor +// --------------------------------------------------------- +// +CBTUIMainView* CBTUIMainView::NewL(MBtuiPluginViewActivationObserver* aObserver) + { + //TRACE_FUNC_ENTRY + + CBTUIMainView* self = new (ELeave) CBTUIMainView(aObserver); + + // Set construction type, before ConstructL(). + self->iConstructAsGsPlugin = EFalse; + + CleanupStack::PushL( self ); + self->ConstructL(); + CleanupStack::Pop(self); + + //TRACE_FUNC_EXIT + return self; + } + + +// --------------------------------------------------------- +// CBTUIMainView::NewL +// Two phased constructor +// --------------------------------------------------------- +// +CBTUIMainView* CBTUIMainView::NewGsPluginL() + { + //TRACE_FUNC_ENTRY + + CBTUIMainView* self = new (ELeave) CBTUIMainView(NULL); + + // Set construction type, before ConstructL(). + self->iConstructAsGsPlugin = ETrue; + + CleanupStack::PushL( self ); + self->ConstructL(); + + CleanupStack::Pop( self ); + + //TRACE_FUNC_EXIT + return self; + } + + +// --------------------------------------------------------- +// CBTUIMainView::CBTUIMainView +// --------------------------------------------------------- + +CBTUIMainView::CBTUIMainView(MBtuiPluginViewActivationObserver* aObserver ) + :iConstructAsGsPlugin(EFalse), iActivationObserver(aObserver) + { + } +// --------------------------------------------------------- +// CBTUIMainView::ConstructL +// Symbian 2nd phase constructor can leave. +// --------------------------------------------------------- +// +void CBTUIMainView::ConstructL() + { + TRACE_FUNC_ENTRY + + // Plugin load resource manually. + // These resources are needed by BaseConstructL + + iEikEnv = CEikonEnv::Static(); + + TFileName filename; + filename += KFileDrive; + filename += KDC_RESOURCE_FILES_DIR; + filename += KResourceFileName; + + BaflUtils::NearestLanguageFile(iEikEnv->FsSession(),filename); + iResourceFileFlag=iEikEnv->AddResourceFileL(filename); + + // According to Construction type, different softkey resource will be used. + // + if(iConstructAsGsPlugin) + { + iViewArray = new CArrayPtrFlat( 3 ); + iTabHelper = CGSTabHelper::NewL(); + iViewArray->AppendL(this); + iParentViewNotSetYet = ETrue; + + iKeyWatcher = CBTUIKeyWatcher::NewL(this, KBTUIPHYCountWatcher); + + // Construct OtherDeviceView + // + CAknView* pairedDeviceView = CBTUIPairedDevicesView::NewLC( this, iViewArray ); + iAppUi->AddViewL( pairedDeviceView ); // Transfer ownership to CAknViewAppUi + CleanupStack::Pop(pairedDeviceView ); + + // Construct BlockDeviceView + // + CAknView* blockedDeviceView = CBTUIBlockedDevicesView::NewLC( this, iViewArray ); + iAppUi->AddViewL( blockedDeviceView ); // Transfer ownership to CAknViewAppUi + CleanupStack::Pop(blockedDeviceView ); + + BaseConstructL( R_BTUI_MAIN_VIEW_GS_PLUGIN ); + } + else + { + BaseConstructL( R_BTUI_MAIN_VIEW ); + } + + iBtEngSettings = CBTEngSettings::NewL(this); + + // Sets up TLS, must be done before FeatureManager is used. + FeatureManager::InitializeLibL(); + iCoverDisplayEnabled = FeatureManager::FeatureSupported(KFeatureIdCoverDisplay); + + + TRACE_FUNC_EXIT + } + +// --------------------------------------------------------- +// --------------------------------------------------------- +// Destructor. +// --------------------------------------------------------- +// +CBTUIMainView::~CBTUIMainView() + { + TRACE_FUNC_ENTRY + + iEikEnv->DeleteResourceFile(iResourceFileFlag); + + if ( iContainer ) + { + AppUi()->RemoveFromViewStack( *this, iContainer ); + } + + delete iBtEngSettings; + delete iContainer; + delete iIdle; + + if(iConstructAsGsPlugin) + { + if ( iViewArray ) + { + iViewArray->Reset(); + delete iViewArray; + } + + delete iTabHelper; + delete iKeyWatcher; + } + + // Frees the TLS. Must be done after FeatureManager is used. + FeatureManager::UnInitializeLib(); + + + TRACE_FUNC_EXIT + } + +// ---------------------------------------------------- +// CBTUIMainView::PowerStateChanged +// ---------------------------------------------------- +// +void CBTUIMainView::PowerStateChanged( TBTPowerStateValue ) + { + TRACE_FUNC_ENTRY + if(iContainer) + { + iContainer->SettingChanged(EBTMainListItemPowerMode); + } + + if( iConstructAsGsPlugin ) + { + UpdateParentView(); + } + TRACE_FUNC_EXIT + } +// ---------------------------------------------------- +// CBTUIMainView::VisibilityModeChanged +// ---------------------------------------------------- +// +void CBTUIMainView::VisibilityModeChanged( TBTVisibilityMode ) + { + TRACE_FUNC_ENTRY + if(iContainer) + { + iContainer->SettingChanged(EBTMainListItemVisibilityMode); + } + + if( iConstructAsGsPlugin ) + { + UpdateParentView(); + } + } + +// --------------------------------------------------------- +// From CAknView +// CBTUIMainView::Id +// --------------------------------------------------------- +// +TUid CBTUIMainView::Id() const + { + TRACE_FUNC_ENTRY + if(iConstructAsGsPlugin) + { + return KGsBtuiPluginUid; //same as ecom impl UID, required by GS interface. + } + else + { + return KBtuiPluginUidMainView; //view id + } + } +// --------------------------------------------------------- +// CBTUIMainView::HandleMiddleSoftkey +// Handles middle soft key +// --------------------------------------------------------- +// +void CBTUIMainView::HandleMiddleSoftkey() + { + TRACE_FUNC_ENTRY + if( iContainer == NULL ) return; + + TInt currentHighLightPosition= iContainer->CurrentItemIndex(); + switch(currentHighLightPosition) + { + case EBTMainListItemPowerMode: + HandleCommand( EBTUICmdChangePowerStateSelect ); + break; + case EBTMainListItemVisibilityMode: + HandleCommand( EBTUICmdChangeVisibilitySelect ); + break; + case EBTMainListItemNameSetting: + HandleCommand( EBTUICmdChangeBTNameSelect ); + break; + + // For Bluetooth SIM Access Profile feature + // + case EBTMainListItemSapMode: + HandleCommand( EBTUICmdChangeSapStateSelect ); + break; + default: + break; + } + TRACE_FUNC_EXIT + } +// --------------------------------------------------------- +// TUid CBTUIMainView::HandleCommand +// --------------------------------------------------------- +// +void CBTUIMainView::HandleCommand(TInt aCommand) +{ + TRAP_IGNORE(HandleCommandL(aCommand)); +} +// --------------------------------------------------------- +// CBTUIMainView::HandleCommandL +// Redirects commands to the appui class. +// --------------------------------------------------------- +// +void CBTUIMainView::HandleCommandL(TInt aCommand) + { + TRACE_INFO((_L(">> CBTUIMainView::HandleCommandL: %d"), aCommand)) + switch ( aCommand ) + { + //middle soft key is handled here + case EBTUICmdMSK: + HandleMiddleSoftkey(); + break; + case EAknSoftkeyBack: + AppUi()->ActivateLocalViewL(iParentView.iViewUid); + break; + + case EAknSoftkeyExit: + { + AppUi()->ProcessCommandL(EEikCmdExit); + break; + } + +#ifdef __SERIES60_HELP + case EAknCmdHelp: + { + HlpLauncher::LaunchHelpApplicationL( + iEikonEnv->WsSession(), AppUi()->AppHelpContextL()); + break; + } +#endif + case EBTUICmdChangePowerStateMenu: + { + AskPowerModeDlgL(); + break; + } + + case EBTUICmdChangePowerStateSelect: + { + TBTPowerStateValue powerState; + iBtEngSettings->GetPowerState(powerState); + if(powerState==EBTPowerOn) + { + SetPowerStatusL( EFalse ); + } + else + { + SetPowerStatusL( ETrue ); + } + break; + } + + case EBTUICmdChangeVisibilitySelect: // now both select key and menu command will triger the setting page. + case EBTUICmdChangeVisibilityMenu: + { + AskVisibilityDlgL(); + break; + } + + case EBTUICmdChangeBTNameMenu: + case EBTUICmdChangeBTNameSelect: + { + AskNewBtNameDlgL(); + iContainer->SettingChanged(TBTMainListItemIndexes(iContainer->CurrentItemIndex())); + break; + } + + // For Bluetooth SIM Access Profile feature + case EBTUICmdChangeSapStateSelect: + { + + if ( BluetoothFeatures::EnterpriseEnablementL() == BluetoothFeatures::EDataProfilesDisabled ) + { + RNotifier notifier; + User::LeaveIfError(notifier.Connect()); + CleanupClosePushL(notifier); + User::LeaveIfError(notifier.StartNotifier(KBTEnterpriseItSecurityInfoNotifierUid, KNullDesC8 )); + CleanupStack::PopAndDestroy(¬ifier); + } + else + { + TInt sapStatus; + CRepository* repository = CRepository::NewL(KCRUidBTEngPrivateSettings); + CleanupStack::PushL(repository); + repository->Get(KBTSapEnabled, sapStatus); + CleanupStack::PopAndDestroy(repository); + + if(sapStatus==EBTSapEnabled) + { + SetSapStatusL( EBTSapDisabled ); + } + else + { + SetSapStatusL( EBTSapEnabled ); + } + iContainer->SettingChanged( + TBTMainListItemIndexes(iContainer->CurrentItemIndex())); + } + break; + } + + // For Bluetooth SIM Access Profile feature + case EBTUICmdChangeSapStateMenu: + { + AskSapModeDlgL(); + iContainer->SettingChanged( + TBTMainListItemIndexes(iContainer->CurrentItemIndex())); + break; + } + + default: + { + AppUi()->HandleCommandL( aCommand ); + iContainer->SettingChanged( + TBTMainListItemIndexes(iContainer->CurrentItemIndex())); + break; + } + } + TRACE_FUNC_EXIT + } + + +// --------------------------------------------------------- +// From CAknView +// CBTUIMainView::DoActivateL +// --------------------------------------------------------- +// +void CBTUIMainView::DoActivateL( const TVwsViewId& aPrevViewId, + TUid /*aCustomMessageId*/, + const TDesC8& /*aCustomMessage*/) + { + TRACE_FUNC_ENTRY + + + if ( BluetoothFeatures::EnterpriseEnablementL() == BluetoothFeatures::EDisabled ) + { + RNotifier notifier; + User::LeaveIfError(notifier.Connect()); + CleanupClosePushL(notifier); + User::LeaveIfError(notifier.StartNotifier(KBTEnterpriseItSecurityInfoNotifierUid, KNullDesC8 )); + CleanupStack::PopAndDestroy(¬ifier); + + AppUi()->ActivateLocalViewL(aPrevViewId.iViewUid); //go back straight away + return; + } + + + if( iConstructAsGsPlugin ) + { + // Only set parent view when entering BT GS setting. + // since tab change chould make aPrevViewId assign to non-parent views. e.g. paired or blocked view. + if(iParentViewNotSetYet) + { + iParentView = aPrevViewId; + iParentViewNotSetYet = EFalse; + } + + // Setup tab group + iTabHelper->CreateTabGroupL( Id(), iViewArray ); + } + + iContainer = new (ELeave) CBTUIMainContainer; + iContainer->SetMopParent(this); // MObjectProvider + iContainer->ConstructL( ClientRect(), this ); + + // Setup the title + // + HBufC* btTitleMain = iCoeEnv->AllocReadResourceLC(R_BT_TITLE_BLUETOOTH); + CEikStatusPane* statusPane = StatusPane(); + CAknTitlePane* titlePane; + titlePane = (CAknTitlePane*) statusPane->ControlL(TUid::Uid(EEikStatusPaneUidTitle)); + titlePane->SetTextL(btTitleMain->Des()); + CleanupStack::PopAndDestroy(btTitleMain); // btTitleMain + btTitleMain = NULL; + + AppUi()->AddToStackL( *this, iContainer ); + + //Check if the local name has been set. If not ask user to set name + + TBool nameStatus = EFalse; + TInt err = IsLocalNameModifiedL( nameStatus ); + + if( err || nameStatus == EBTLocalNameDefault ) + { + InitiateBTLocalNameQueryL(); // Ask local Bluetooth name if not given yet. + } + + // notify observer + if( iActivationObserver && iConstructAsGsPlugin == EFalse) + { + iActivationObserver->PluginViewActivated(EMainViewId); + } + + TRACE_FUNC_EXIT + } + +// --------------------------------------------------------- +// From CAknView +// CBTUIMainView::DoDeactivate +// --------------------------------------------------------- +// +void CBTUIMainView::DoDeactivate() + { + TRACE_FUNC_ENTRY + + if ( iContainer ) + { + AppUi()->RemoveFromStack( iContainer ); + } + + delete iContainer; + iContainer = NULL; + + if(iConstructAsGsPlugin) + { + iTabHelper->RemoveTabGroup(); + CGSBaseView::DoDeactivate(); + } + TRACE_FUNC_EXIT + + } + +// --------------------------------------------------------- +// From CAknView +// CBTUIMainView::DynInitMenuPaneL +// Shows selected item's context sensitive options menu. +// --------------------------------------------------------- +// +void CBTUIMainView::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_MAIN_VIEW_MENU ) + { + // Set all menus dimmed at first(hide them all) + // + aMenu->SetItemDimmed(EBTUICmdChangePowerStateMenu, ETrue); + aMenu->SetItemDimmed(EBTUICmdChangeVisibilityMenu, ETrue); + aMenu->SetItemDimmed(EBTUICmdChangeBTNameMenu, ETrue); + if ( FeatureManager::FeatureSupported( KFeatureIdBtSap ) ) + aMenu->SetItemDimmed(EBTUICmdChangeSapStateMenu, ETrue); + + } + TRACE_FUNC_EXIT + } + +// --------------------------------------------------------- +// CBTUIMainView::SettingChangedL +// Redraws the BT Name field. +// --------------------------------------------------------- +// +void CBTUIMainView::SettingChangedL( TBTMainListItemIndexes aListItem ) + { + TRACE_FUNC_ENTRY + if(iContainer) + { + iContainer->SettingChanged(aListItem); + } + + } + +// ---------------------------------------------------- +// CBTUIMainView::SetPowerStatusL +// ---------------------------------------------------- +// +TInt CBTUIMainView::SetPowerStatusL( TBool aValue ) + { + TRACE_FUNC_ENTRY + + TInt errorCode = KErrNone; + TBTPowerStateValue previousPowerMode; + errorCode=iBtEngSettings->GetPowerState(previousPowerMode); + if(errorCode) + return errorCode; + + TBool legalToChange = ETrue; + + if ( ( previousPowerMode==EBTPowerOn ) && ( !aValue )) // power ON -> OFF + { + TRACE_INFO(_L("power ON -> OFF")) + + // Check active connections before query + if( TBTUIViewsCommonUtils::IsAnyDeviceConnectedL()) + { + CAknQueryDialog* dlg = CAknQueryDialog::NewL(); + + if(iCoverDisplayEnabled) + { + CleanupStack::PushL(dlg); + dlg->PublishDialogL(ECmdShowBtSwitchOffAnywayQuery, KUidCoverUiCategoryBtui); // initializes cover support + CleanupStack::Pop(dlg); + } + + TInt keypress = dlg->ExecuteLD( R_BT_SWITCH_OFF_ANYWAY_QUERY ); + if( !keypress ) // User has not accepted the dialog + { + legalToChange = EFalse; + } + } + TRACE_INFO((_L("power ON -> OFF, legalToChange = %d"), legalToChange)) + + } + else if ( ( !previousPowerMode ) && ( aValue ) ) // power OFF -> ON + { + TRACE_INFO(_L("power OFF -> ON")) + + TInt offlineModeOff = 0; // possible values are 0 and 1 + TInt activationEnabled = 0; // possible values are 0 and 1 + + CRepository* repository = CRepository::NewL(KCRUidCoreApplicationUIs); + CleanupStack::PushL(repository); + repository->Get(KCoreAppUIsNetworkConnectionAllowed, offlineModeOff); + // Closing connection: + CleanupStack::PopAndDestroy(repository); + repository =NULL; + repository = CRepository::NewL(KCRUidBluetoothEngine); + // Check activation enabled + CleanupStack::PushL(repository); + repository->Get(KBTEnabledInOffline, activationEnabled); + // Closing connection: + CleanupStack::PopAndDestroy(repository); + + + TRACE_INFO((_L("power OFF -> ON, offlineModeOff = %d"), offlineModeOff )) + TRACE_INFO((_L("power OFF -> ON, activationEnabled = %d"), activationEnabled )) + + // Is offline mode on + // + if ( !offlineModeOff ) + { + // Choose user interaction + // + if ( activationEnabled ) + { + // Create and show query + // + CAknQueryDialog* dlg = CAknQueryDialog::NewL(); + + if(iCoverDisplayEnabled) + { + CleanupStack::PushL(dlg); + dlg->PublishDialogL(ECmdShowBtActivateInOfflineQuery, KUidCoverUiCategoryBtui); // initializes cover support + CleanupStack::Pop(dlg); + } + + TInt keypress = dlg->ExecuteLD( R_BT_ACTIVATE_IN_OFFLINE_QUERY ); + if( !keypress ) // User has not accepted the dialog + { + legalToChange = EFalse; + } + } + else + { + legalToChange = EFalse; + + // Load a string, create and show a note + // + HBufC* stringHolder = StringLoader::LoadLC( R_BT_OFFLINE_DISABLED ); + CAknInformationNote* note = new (ELeave) CAknInformationNote(); + + if(iCoverDisplayEnabled) + { + CleanupStack::PushL(note); + note->PublishDialogL(ECmdShowBtOfflineDisabledNote, KUidCoverUiCategoryBtui); // initializes cover support + CleanupStack::Pop(note); + } + + note->ExecuteLD( *stringHolder ); + CleanupStack::PopAndDestroy(stringHolder); //stringHolder + } + } + } + + TRACE_INFO((_L("legalToChange = %d"), legalToChange)) + + // Switch powermode + // + if ( legalToChange ) + { + + TInt errorCode = KErrNone; + TBTPowerStateValue powerMode; + if(aValue) + { + powerMode=EBTPowerOn; + } + else + { + powerMode=EBTPowerOff; + } + + errorCode=iBtEngSettings->SetPowerState(powerMode); + + if( (errorCode == KErrNone ) && (aValue)) + + { + //Check the visibility mode + TBTVisibilityMode visiMode; + errorCode=iBtEngSettings->GetVisibilityMode(visiMode); + if(errorCode==KErrNone) + { + if (visiMode == EBTVisibilityModeHidden) + { + //Show note + CAknNoteDialog* dlg = new (ELeave) CAknNoteDialog( CAknNoteDialog::EConfirmationTone, + CAknNoteDialog::ELongTimeout ); + if(iCoverDisplayEnabled) + { + CleanupStack::PushL(dlg); + dlg->PublishDialogL(ECmdBtuiShowBtHiddenFromOthersNote, KUidCoverUiCategoryBtui); // initializes cover support + CleanupStack::Pop(dlg); + } + + dlg->ExecuteLD( R_BT_HIDDEN_FROM_OTHERS ); + } + } + } + if ( errorCode != KErrNone && errorCode != KErrAlreadyExists ) + { + TRAP_IGNORE(TBTUIViewsCommonUtils::ShowGeneralErrorNoteL()); + } + + } + + TRACE_INFO((_L("SetPowerStatusL() complete. errorCode = %d"), errorCode)) + return errorCode; + } + +// ---------------------------------------------------------- +// CBTUIMainView::SetVisibilityStatusL +// ---------------------------------------------------------- +// +void CBTUIMainView::SetVisibilityStatusL( TBTVisibilityMode aMode ) + { + TRACE_FUNC_ENTRY + + TInt errorCode = KErrNone; + + switch( aMode ) + { + case EBTVisibilityModeGeneral: + { + errorCode = iBtEngSettings->SetVisibilityMode(aMode); + + if(errorCode == KErrNone) + { + CAknNoteDialog* dlg = new (ELeave) CAknNoteDialog( CAknNoteDialog::EConfirmationTone, + CAknNoteDialog::ELongTimeout ); + + if(iCoverDisplayEnabled) + { + CleanupStack::PushL(dlg); + dlg->PublishDialogL(ECmdShowBtPhoneVisibToAllNote, KUidCoverUiCategoryBtui); // initializes cover support + CleanupStack::Pop(dlg); + } + dlg->ExecuteLD( R_BT_PHONE_VISIB_TO_OTH_NOTE ); + } + } + break; + + case EBTVisibilityModeHidden: + { + errorCode = iBtEngSettings->SetVisibilityMode(aMode); + + if(errorCode == KErrNone) + { + CAknNoteDialog* dlg = new (ELeave) CAknNoteDialog( CAknNoteDialog::EConfirmationTone, + CAknNoteDialog::ELongTimeout ); + + if(iCoverDisplayEnabled) + { + CleanupStack::PushL(dlg); + dlg->PublishDialogL(ECmdBtuiShowBtHiddenFromOthersNote, KUidCoverUiCategoryBtui); // initializes cover support + CleanupStack::Pop(dlg); + } + dlg->ExecuteLD( R_BT_HIDDEN_FROM_OTHERS ); + } + } + break; + + case EBTVisibilityModeTemporary: + { + // Asks user to turn on Bluetooth, if temporary visibility is chosen. + if( TBTUIViewsCommonUtils::TurnBTOnIfNeededL(iBtEngSettings,iCoverDisplayEnabled) != KErrNone) + { + return; + } + TInt sliderValue = 1; + CAknSettingPage* dlg = + new(ELeave) CAknSliderSettingPage(R_VISIBILITY_TIME_SETTING_PAGE, + sliderValue); + + if (dlg->ExecuteLD(CAknSettingPage::EUpdateWhenChanged)) + { + errorCode = iBtEngSettings->SetVisibilityMode( aMode, sliderValue ); + } + } + break; + + default: + break; + } + + if((errorCode != KErrNone) && (errorCode != KErrAlreadyExists)) + { + TRAP_IGNORE(TBTUIViewsCommonUtils::ShowGeneralErrorNoteL()); + } + TRACE_FUNC_EXIT + } + +// ---------------------------------------------------------- +// CBTUIMainView::GetBTLocalName +// ---------------------------------------------------------- +// +TDesC* CBTUIMainView::GetBTLocalName() + { + TRACE_FUNC_ENTRY + + iTempNameBuffer.Zero(); // Empty Local BT device name + TInt err=iBtEngSettings->GetLocalName( iTempNameBuffer );// Store name into member variable + if(err!=KErrNone) + TRAP_IGNORE(TBTUIViewsCommonUtils::ShowGeneralErrorNoteL()); + + // Cut the excess part of the name away. The query can handle only + // KBTUIMaxNameLength characters. + // + if( iTempNameBuffer.Length() > KBTUIMaxNameLength ) + { + iTempNameBuffer.SetLength( KBTUIMaxNameLength ); + } + TRACE_FUNC_EXIT + return &iTempNameBuffer; // And return reference for it + } + +// ---------------------------------------------------------- +// CBTUIMainView::AskNewBtNameDlgL +// ---------------------------------------------------------- +// +void CBTUIMainView::AskNewBtNameDlgL() + { + TRACE_FUNC_ENTRY + + // Cut the excess part of the name away. The query can handle only + // KBTUIMaxNameLength characters. + // + if( iTempNameBuffer.Length() > KBTUIMaxNameLength ) + { + iTempNameBuffer.SetLength( KBTUIMaxNameLength ); + } + + FOREVER + { + CAknTextSettingPage* dlg = new( ELeave )CAknTextSettingPage( R_BT_NAME_SETTING_PAGE, + iTempNameBuffer ); + if( dlg->ExecuteLD( CAknSettingPage::EUpdateWhenChanged )) + { + // Remove trouble making control chars + AknTextUtils::StripCharacters(iTempNameBuffer, KAknStripListControlChars); + + iTempNameBuffer.TrimAll(); // Remove spaces and check what is left.. + if( iTempNameBuffer.Length() > 0 ) + { + + if(iBtEngSettings->SetLocalName(iTempNameBuffer) != KErrNone) + { + TBTUIViewsCommonUtils::ShowGeneralErrorNoteL(); + } + TRACE_FUNC_EXIT + return; + } + } + else + { + TRACE_FUNC_EXIT + return; // User has cancelled this operation + } + } + + } + +// ---------------------------------------------------------- +// CBTUIMainView::AskPowerModeDlgL +// ---------------------------------------------------------- +// +void CBTUIMainView::AskPowerModeDlgL() + { + TRACE_FUNC_ENTRY + + CDesCArrayFlat* items = iCoeEnv->ReadDesCArrayResourceL( R_BT_POWER_MODES ); + CleanupStack::PushL(items); + TBTPowerStateValue powerState; + iBtEngSettings->GetPowerState(powerState); + TInt currentItem = !powerState; // Implicit cast from Not-TBool to int (inverted) + + CAknRadioButtonSettingPage* dlg = new ( ELeave )CAknRadioButtonSettingPage( + R_BT_POWER_SETTING_PAGE, currentItem, items ); + if( dlg->ExecuteLD( CAknSettingPage::EUpdateWhenChanged )) + { + SetPowerStatusL( static_cast( !currentItem )); // Cast it back (invert again) + } + CleanupStack::PopAndDestroy(items); // items + TRACE_FUNC_EXIT + } + +// ---------------------------------------------------------- +// CBTUIMainView::AskVisibilityDlgL +// ---------------------------------------------------------- +// +void CBTUIMainView::AskVisibilityDlgL() + { + TRACE_FUNC_ENTRY + + CDesCArrayFlat* items = iCoeEnv->ReadDesCArrayResourceL( R_BT_VISIBILITY_MODES ); + CleanupStack::PushL(items); + + TInt currentItem = 0; // Current position at radio button setting page + TBTVisibilityMode currentMode; + TInt errorCode(iBtEngSettings->GetVisibilityMode(currentMode)); + if(errorCode==KErrNone) + { + + switch( currentMode ) // Map from mode to radio button position at setting page + { + case EBTVisibilityModeGeneral: + currentItem = 0; + break; + case EBTVisibilityModeTemporary: // temp visible + currentItem = 1; + break; + case EBTVisibilityModeHidden: + currentItem = 1+1; + break; + default: + break; + } + + // Ask new mode from user + + CAknRadioButtonSettingPage* dlg = new ( ELeave )CAknRadioButtonSettingPage( + R_BT_VISIBILITY_SETTING_PAGE, currentItem, items ); + if( dlg->ExecuteLD( CAknSettingPage::EUpdateWhenChanged )) + { + switch( currentItem ) // Map it back from radio button position to mode at setting page + { + case 0: + SetVisibilityStatusL( EBTVisibilityModeGeneral ); + break; + + case 1: + SetVisibilityStatusL( EBTVisibilityModeTemporary ); + break; + + case 1+1: + SetVisibilityStatusL( EBTVisibilityModeHidden ); + break; + + default: + break; + } + } + } + else + TBTUIViewsCommonUtils::ShowGeneralErrorNoteL(); + + + CleanupStack::PopAndDestroy(items); // items + } + + +// ---------------------------------------------------- +// CBTUIMainView::GetBtSettingsReference +// +// This method returns the reference to the settings class +// ---------------------------------------------------- +// +CBTEngSettings* CBTUIMainView::GetBtSettingsReference() + { + TRACE_FUNC + return iBtEngSettings; + } + +// ---------------------------------------------------- +// CBTUIMainView::InitiateBTLocalNameQueryL +// +// Initiate BT local name query after Symbian OS has entered +// idle state. +// ---------------------------------------------------- +// +void CBTUIMainView::InitiateBTLocalNameQueryL() + { + TRACE_FUNC + + + __ASSERT_DEBUG( !iIdle, PANIC(EBTPanicClassMemberVariableNotNull) ); + + // Launch idle time regognition and execute local BT name query when ready + iIdle = CIdle::NewL(CActive::EPriorityIdle); + iIdle->Start(TCallBack(LaunchBTLocalNameQueryL, this)); + } + +// ---------------------------------------------------- +// CBTUIMainView::LaunchBTLocalNameQueryL +// +// Execute BT local name query. Symbian OS has entered +// idle state now. +// ---------------------------------------------------- +// +TInt CBTUIMainView::LaunchBTLocalNameQueryL(TAny* aMainView) + { + //TRACE_FUNC + + TInt errorCode = static_cast(aMainView)->AskBTLocalNameQueryL(); + if( errorCode != KErrNone ) + { + CAknNoteDialog* dlg = new (ELeave) CAknNoteDialog( CAknNoteDialog::EErrorTone, + CAknNoteDialog::ELongTimeout ); + if(static_cast(aMainView)->iCoverDisplayEnabled) + { + CleanupStack::PushL(dlg); + dlg->PublishDialogL(ECmdShowBtGeneralErrorNote, KUidCoverUiCategoryBtui); // initializes cover support} + CleanupStack::Pop(dlg); + } + dlg->ExecuteLD( R_BT_GENERAL_ERROR_NOTE ); + } + return KErrNone; + } + +// ---------------------------------------------------- +// CBTUIMainView::AskBTLocalNameQueryL +// ---------------------------------------------------- +// +TInt CBTUIMainView::AskBTLocalNameQueryL() + { + TRACE_FUNC_ENTRY + + TInt errorCode = KErrNone; + iTempNameBuffer.Zero(); // Empty Local BT device name + + //Get default name if given by e.g. phone product + errorCode = RProperty::Get( KPropertyUidBluetoothCategory, KPropertyKeyBluetoothSetDeviceName, iTempNameBuffer ); + + if( errorCode || !iTempNameBuffer.Length() ) + { + errorCode = RProperty::Get( KPropertyUidBluetoothCategory, KPropertyKeyBluetoothGetDeviceName, iTempNameBuffer ); + + if( errorCode || !iTempNameBuffer.Length() ) + { + RBTRegServ btRegServ; + RBTLocalDevice btReg; + TBTLocalDevice localDev; + + errorCode = btRegServ.Connect(); + + if( !errorCode ) + { + errorCode = btReg.Open( btRegServ ); + + if( !errorCode ) + { + // Read the BT local name from BT Registry. + errorCode = btReg.Get( localDev ); + + if( !errorCode ) + { + // The error can be > 0 if there are unconverted characters. + errorCode = CnvUtfConverter::ConvertToUnicodeFromUtf8( iTempNameBuffer, localDev.DeviceName() ); + } + } + } + + btReg.Close(); + btRegServ.Close(); + } + } + + if(errorCode==KErrNone) + { + + // Cut the excess part of the name away. The query can handle only + // KBTUIMaxNameLength characters. + // + if( iTempNameBuffer.Length() > KBTUIMaxNameLength ) + { + iTempNameBuffer.SetLength( KBTUIMaxNameLength ); + } + + CAknTextQueryDialog* dlg = CAknTextQueryDialog::NewL( iTempNameBuffer ); + TInt keypress = dlg->ExecuteLD( R_BT_ENTER_LOCAL_NAME_QUERY ); + + if( keypress ) // User has accepted the dialog + { + // Remove trouble making control chars + AknTextUtils::StripCharacters(iTempNameBuffer, KAknStripListControlChars); + + iTempNameBuffer.TrimAll(); // Remove extra spaces + errorCode = iBtEngSettings->SetLocalName(iTempNameBuffer); + + this->SettingChangedL(EBTMainListItemNameSetting); // Redraw BT name + } + } + + delete iIdle; iIdle = NULL; + TRACE_FUNC_EXIT + return errorCode; + } + +//--------------------------------------------------------------------- +// CBTUIMainView::GetCaption +//---------------------------------------------------------------------- +// +void CBTUIMainView::GetCaptionL( TDes& aCaption ) const + { + TRACE_FUNC + + // the resource file is already opened. + HBufC* result = StringLoader::LoadL( R_GS_BTUI_VIEW_CAPTION ); + aCaption.Copy( *result ); + delete result; + } + + +//--------------------------------------------------------------------- +// CBTUIMainView::CreateIconL +//---------------------------------------------------------------------- +// +CGulIcon* CBTUIMainView::CreateIconL( const TUid aIconType ) + { + TRACE_FUNC_ENTRY + + RefreshSettingsStatusL(); + CGulIcon* icon = NULL; + TFileName bmpFilename; + bmpFilename += KBitmapFileDrive; + bmpFilename += KDC_APP_BITMAP_DIR; + bmpFilename += KBtuiBmpFileName; + + if(aIconType == KGSIconTypeLbxItem) + { + + switch(iBtState) + { + case EBTOff: + icon = AknsUtils::CreateGulIconL( + AknsUtils::SkinInstance(), + KAknsIIDQgnPropSetAppsBtOff, + bmpFilename, + EMbmBtuiQgn_prop_set_apps_bt_off, + EMbmBtuiQgn_prop_set_apps_bt_off_mask ); + break; + case EBTOnShown: + icon = AknsUtils::CreateGulIconL( + AknsUtils::SkinInstance(), + KAknsIIDQgnPropSetAppsBtOnShown, + bmpFilename, + EMbmBtuiQgn_prop_set_apps_bt_on_shown, + EMbmBtuiQgn_prop_set_apps_bt_on_shown_mask ); + break; + case EBTOnHidden: + icon = AknsUtils::CreateGulIconL( + AknsUtils::SkinInstance(), + KAknsIIDQgnPropSetAppsBtOnHidden, + bmpFilename, + EMbmBtuiQgn_prop_set_apps_bt_on_hidden, + EMbmBtuiQgn_prop_set_apps_bt_on_hidden_mask ); + break; + case EBTConnectedShown: + icon = AknsUtils::CreateGulIconL( + AknsUtils::SkinInstance(), + KAknsIIDQgnPropSetAppsBtConnShown, + bmpFilename, + EMbmBtuiQgn_prop_set_apps_bt_conn_shown, + EMbmBtuiQgn_prop_set_apps_bt_conn_shown_mask ); + break; + case EBTConnectedHidden: + icon = AknsUtils::CreateGulIconL( + AknsUtils::SkinInstance(), + KAknsIIDQgnPropSetAppsBtConnHidden, + bmpFilename, + EMbmBtuiQgn_prop_set_apps_bt_conn_hidden, + EMbmBtuiQgn_prop_set_apps_bt_conn_hidden_mask ); + break; + } + } + else + { + icon = CGSPluginInterface::CreateIconL( aIconType ); + } + + return icon; + } + + +// --------------------------------------------------------------------------- +// CBTUIMainView::GetValue() +// Get 2nd row text for parent Connectivity View. +// --------------------------------------------------------------------------- +// +void CBTUIMainView::GetValue( const TGSPluginValueKeys aKey, TDes& aValue ) + { + TRACE_FUNC_ENTRY + + TRAP_IGNORE( GetValueL(aKey, aValue) ); + } + +// --------------------------------------------------------------------------- +// CBTUIMainView::GetValueL() +// --------------------------------------------------------------------------- +// +void CBTUIMainView::GetValueL( const TGSPluginValueKeys aKey, TDes& aValue ) + { + if(aKey == EGSPluginKeySettingsItemValueString) + { + HBufC* secondary = NULL; + RefreshSettingsStatusL(); + switch(iBtState) + { + case EBTOff: + secondary = StringLoader::LoadL( R_CP_DETAIL_BT_OFF ); + break; + case EBTOnShown: + secondary = StringLoader::LoadL( R_CP_DETAIL_BT_ON_SHOWN ); + break; + case EBTOnHidden: + secondary = StringLoader::LoadL( R_CP_DETAIL_BT_ON_HIDDEN ); + break; + case EBTConnectedShown: + secondary = StringLoader::LoadL( R_CP_DETAIL_BT_CONN_SHOWN ); + break; + case EBTConnectedHidden: + secondary = StringLoader::LoadL( R_CP_DETAIL_BT_CONN_HIDDEN ); + break; + } + aValue.Copy( *secondary ); + delete secondary; + } + } + +// --------------------------------------------------------------------------- +// CBTUIMainView::CreateTabIconL() +// Creates icon for tab. +// --------------------------------------------------------------------------- +// +CGulIcon* CBTUIMainView::CreateTabIconL() + { + TFileName bmpFilename; + bmpFilename += KBitmapFileDrive; + bmpFilename += KDC_APP_BITMAP_DIR; + bmpFilename += KBtuiBmpFileName; + + CGulIcon* icon = AknsUtils::CreateGulIconL( + AknsUtils::SkinInstance(), + KAknsIIDQgnPropBtSetTab3, + bmpFilename, + EMbmBtuiQgn_prop_bt_set_tab3, + EMbmBtuiQgn_prop_bt_set_tab3_mask ); + + return icon; + } + +// --------------------------------------------------------------------------- +// CBTUIMainView::RefreshSettingsStatusL() +// Get the current BT settings: power, visibility and connection. +// --------------------------------------------------------------------------- +// +void CBTUIMainView::RefreshSettingsStatusL() + { + + if ( BluetoothFeatures::EnterpriseEnablementL() == BluetoothFeatures::EDisabled ) + { + iBtState = EBTOff; + } + else + { + TBTPowerStateValue powerState; + iBtEngSettings->GetPowerState(powerState); + + TBTVisibilityMode currentMode; + iBtEngSettings->GetVisibilityMode(currentMode); + + TBool connected = TBTUIViewsCommonUtils::IsAnyDeviceConnectedL(); + + if(powerState == EBTPowerOff) + iBtState = EBTOff; + else + { + if( !connected && (currentMode == EBTVisibilityModeGeneral || + currentMode == EBTVisibilityModeTemporary)) + iBtState = EBTOnShown; + + else if(!connected && currentMode == EBTVisibilityModeHidden) + iBtState = EBTOnHidden; + + else if(connected && (currentMode == EBTVisibilityModeGeneral || + currentMode == EBTVisibilityModeTemporary)) + iBtState = EBTConnectedShown; + + else if(connected && currentMode == EBTVisibilityModeHidden) + iBtState = EBTConnectedHidden; + } + } + } + +// ---------------------------------------------------- +// CBTUIMainView::UpdateParentView +// +// Update Connectivity View when it's the current +// active view and the key watched is changed. +// ---------------------------------------------------- +void CBTUIMainView::UpdateParentView() + { + if(iConstructAsGsPlugin) + { + CGSParentPlugin* parent = static_cast(AppUi()->View( KGSConPluginUid )); + if( parent ) + { + parent->UpdateView(); + } + } + } + +// --------------------------------------------------------------------------- +// CBTUIMainView::NewContainerL +// Creates new iContainer. +// --------------------------------------------------------------------------- +// +void CBTUIMainView::NewContainerL() + { + //As a transparent view, do nothing here. + } + +// --------------------------------------------------------------------------- +// CBTUIMainView::HandleListBoxSelectionL +// Handle any user actions while in the list view. +// --------------------------------------------------------------------------- +// +void CBTUIMainView::HandleListBoxSelectionL() + { + //As a base-view, it's transparent, so do nothing here. + } + +// --------------------------------------------------------------------------- +// CBTUIMainView::GetParentView +// --------------------------------------------------------------------------- +// +TVwsViewId CBTUIMainView::GetParentView() + { + return iParentView; + } + +// --------------------------------------------------------------------------- +// CBTUIMainView::TabbedViews() +// Returns pointer to tabbed views of application. +// --------------------------------------------------------------------------- +// +CArrayPtrFlat* CBTUIMainView::TabbedViews() + { + return iViewArray; + } + + +// --------------------------------------------------------------------------- +// CBTUIMainView::IsLocalNameModified +// Checks from central repository whether the Bluetooth friendly name +// has been modified . +// --------------------------------------------------------------------------- +// +TInt CBTUIMainView::IsLocalNameModifiedL( TBool& aStatus ) + { + TRACE_FUNC_ENTRY + + aStatus = (TBool) EBTLocalNameDefault; + + TInt val = 0; + CRepository* cenRep = NULL; + TInt err = KErrNone; + TRAP_IGNORE(cenRep = CRepository::NewL( KCRUidBTEngPrivateSettings )); + + err = cenRep->Get( KBTLocalNameChanged, val ); + + if ( val != 0 ) + { + aStatus = (TBool) EBTLocalNameSet; + } + delete cenRep; + cenRep = NULL; + TRACE_FUNC_EXIT + return err; + } +