--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/bluetoothengine/btui/Ecom/src/BTUIMainView.cpp Mon Jan 18 20:28:57 2010 +0200
@@ -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 <aknViewAppUi.h> // AVKON components
+#include <avkon.hrh>
+#include <akntitle.h>
+#include <featmgr.h> // 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 <BtuiViewResources.rsg> // Compiled resource ids
+#include <AknGlobalNote.h>
+#include <aknnotewrappers.h>
+#include <aknradiobuttonsettingpage.h>
+#include <akntextsettingpage.h>
+#include <StringLoader.h> // Series 60 localisation stringloader
+#include <aknslidersettingpage.h> //visibility time setting page
+#include <data_caging_path_literals.hrh>
+#include <bautils.h> // BAFL utils (for language file)
+#include <btui.mbg> // application icon for General Setting
+#include <AknMediatorFacade.h>
+#include <AknUtils.h> // For char filter
+#include <CoreApplicationUIsSDKCRKeys.h>
+#include <hlplch.h> // Help launcher
+#include <SecondaryDisplay/BtuiSecondaryDisplayAPI.h>
+#include <btengprivatecrkeys.h>
+#include <gstabhelper.h>
+#include <gsfwviewuids.h>
+#include <gsparentplugin.h>
+#include <utf.h> // CnvUtfConverter
+#include <btfeaturescfg.h> // For EnterpriseEnablementL()
+#include <btnotif.h>
+
+// ---------------------------------------------------------
+// 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<MGSTabbedView>( 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<TBool>( !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<CBTUIMainView*>(aMainView)->AskBTLocalNameQueryL();
+ if( errorCode != KErrNone )
+ {
+ CAknNoteDialog* dlg = new (ELeave) CAknNoteDialog( CAknNoteDialog::EErrorTone,
+ CAknNoteDialog::ELongTimeout );
+ if(static_cast<CBTUIMainView*>(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<CGSParentPlugin*>(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<MGSTabbedView>* 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;
+ }
+