--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/textinput/GSLangPlugin/src/GSLangModel.cpp Wed Sep 01 12:23:33 2010 +0100
@@ -0,0 +1,1458 @@
+/*
+* Copyright (c) 2005 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: Data model for GSLangPlugin.
+*
+*/
+
+// INCLUDE FILES
+
+#include "GSLangModel.h"
+#include "GSLangContainer.h"
+#include "GSLangPlugin.h"
+#include <gslangpluginrsc.rsg>
+
+#include <AknFepInternalCRKeys.h>
+#include <aknnotedialog.h>
+#include <aknradiobuttonsettingpage.h>
+#include <aknViewAppUi.h>
+#include <avkon.rsg>
+#include <CommonEngineDomainCRKeys.h> //Ui language
+#include <e32math.h>
+#include <featmgr.h>
+#include <hal.h>
+#include <PtiEngine.h>
+#include <ScreensaverInternalCRKeys.h> //double declaration of KScreenSaverPluginName
+#include <settingsinternalcrkeys.h>
+#include <startupdomaincrkeys.h>
+#include <ctsydomainpskeys.h>
+#include <languages.hrh>
+
+#include <AknFepGlobalEnums.h> //For chinese input modes
+
+// For Phonetic Input of Hindi
+#include <PtiIndicDefs.h>
+#include <sysutil.h>
+#ifdef RD_INTELLIGENT_TEXT_INPUT
+#include <AvkonInternalCRKeys.h>
+#include <StringLoader.h>
+#include <coemain.h>
+#endif
+
+#include <aknenv.h>
+#include <AknSettingCache.h>
+
+
+//CONSTANTS
+const TInt KGSDiskSpaceLimitForLanguageChange = 300000;
+
+const TInt KFepChineseInputModeLength = 10;
+
+// ================= MEMBER FUNCTIONS =======================
+
+// ----------------------------------------------------------------------------
+// CGSLangModel::NewL
+//
+// EPOC two-phased constructor
+// ----------------------------------------------------------------------------
+//
+CGSLangModel* CGSLangModel::NewL( CGSLangContainer* aContainer )
+ {
+ CGSLangModel* self = new( ELeave ) CGSLangModel( aContainer );
+ CleanupStack::PushL( self );
+ self->ConstructL();
+ CleanupStack::Pop( self );
+ return self;
+ }
+
+
+// ----------------------------------------------------------------------------
+// CGSLangModel::CGSLangModel
+//
+// C++ default constructor can NOT contain any code, that
+// might leave.
+// ----------------------------------------------------------------------------
+//
+CGSLangModel::CGSLangModel( CGSLangContainer* aContainer )
+ : iContainer( aContainer )
+ {
+
+ }
+
+
+// ----------------------------------------------------------------------------
+// CGSLangModel::ConstructL
+//
+// EPOC default constructor can leave.
+// ----------------------------------------------------------------------------
+//
+void CGSLangModel::ConstructL()
+ {
+ InitializeCentralRepositoriesL();
+
+ // start listening to CenRep key changes for ITL
+ iNotifyHandlerForITL = CCenRepNotifyHandler::NewL( *this,
+ *iAknFepRepository,
+ CCenRepNotifyHandler::EIntKey,
+ KAknFepInputTxtLang );
+ iNotifyHandlerForITL->StartListeningL();
+
+ // start listening to CenRep key changes for T9 on/off
+ iNotifyHandlerForT9 = CCenRepNotifyHandler::NewL( *this,
+ *iAknFepRepository,
+ CCenRepNotifyHandler::EIntKey,
+ KAknFepPredTxtFlag );
+ iNotifyHandlerForT9->StartListeningL();
+
+ if ( FeatureManager::FeatureSupported( KFeatureIdJapanese ) )
+ {
+ // start listening to CenRep key changes for Japanese predictive mode
+ iNotifyHandlerForJapanesePredTxt = CCenRepNotifyHandler::NewL( *this,
+ *iAknFepRepository,
+ CCenRepNotifyHandler::EIntKey,
+ KAknFepJapanesePredTxtFlag );
+ iNotifyHandlerForJapanesePredTxt->StartListeningL();
+ }
+
+
+#ifdef RD_INTELLIGENT_TEXT_INPUT
+ // start listening to CenRep key changes for T9 on/off
+ iNotifyHandlerForPredExt = CCenRepNotifyHandler::NewL( *this,
+ *iAknFepRepository,
+ CCenRepNotifyHandler::EIntKey,
+ KAknFepPredTxtFlagExtension );
+ iNotifyHandlerForPredExt->StartListeningL();
+#endif
+
+ }
+
+
+// ----------------------------------------------------------------------------
+// CGSLangModel::~CGSLangModel
+//
+// Destructor
+// ----------------------------------------------------------------------------
+//
+CGSLangModel::~CGSLangModel()
+ {
+ if ( iNotifyHandlerForITL )
+ {
+ iNotifyHandlerForITL->StopListening();
+ }
+ delete iNotifyHandlerForITL;
+
+ if ( iNotifyHandlerForT9 )
+ {
+ iNotifyHandlerForT9->StopListening();
+ }
+ delete iNotifyHandlerForT9;
+
+ if ( iNotifyHandlerForJapanesePredTxt )
+ {
+ iNotifyHandlerForJapanesePredTxt->StopListening();
+ }
+ delete iNotifyHandlerForJapanesePredTxt;
+
+#ifdef RD_INTELLIGENT_TEXT_INPUT
+ if ( iNotifyHandlerForPredExt )
+ {
+ iNotifyHandlerForPredExt->StopListening();
+ }
+ delete iNotifyHandlerForPredExt;
+#endif
+
+
+ CloseCentralRepositories();
+ }
+
+
+// ----------------------------------------------------------------------------
+// CGSLangModel::InitializeCentralRepositoriesL
+//
+// Creating and setting keys for the Central Repository
+// ----------------------------------------------------------------------------
+//
+void CGSLangModel::InitializeCentralRepositoriesL()
+ {
+
+ iPersonalizationRepository =
+ CRepository::NewL( KCRUidPersonalizationSettings );
+ iLocaleRepository = CRepository::NewL( KCRUidLocaleSettings );
+ iStartupConfRepository = CRepository::NewL( KCRUidStartupConf );
+ iAknFepRepository = CRepository::NewL( KCRUidAknFep );
+ iCommonEngineRepository = CRepository::NewL( KCRUidCommonEngineKeys );
+ iScreensaverRepository = CRepository::NewL( KCRUidScreenSaver );
+
+ }
+
+// ----------------------------------------------------------------------------
+// CGSLangModel::CloseCentralRepositoriesL
+//
+// Creating and setting keys for the Central Repository
+// ----------------------------------------------------------------------------
+//
+void CGSLangModel::CloseCentralRepositories()
+ {
+ if ( iPersonalizationRepository )
+ {
+ delete iPersonalizationRepository;
+ iPersonalizationRepository = NULL;
+ }
+ if ( iLocaleRepository )
+ {
+ delete iLocaleRepository;
+ iLocaleRepository = NULL;
+ }
+ if ( iStartupConfRepository )
+ {
+ delete iStartupConfRepository;
+ iStartupConfRepository = NULL;
+ }
+ if ( iAknFepRepository )
+ {
+ delete iAknFepRepository;
+ iAknFepRepository = NULL;
+ }
+ if ( iCommonEngineRepository )
+ {
+ delete iCommonEngineRepository;
+ iCommonEngineRepository = NULL;
+ }
+ if ( iScreensaverRepository )
+ {
+ delete iScreensaverRepository;
+ iScreensaverRepository = NULL;
+ }
+ }
+
+// ================= DATA ACCESS FUNCTIONS ==================
+
+// ----------------------------------------------------------------------------
+// CGSLangModel::GetLanguagesFromPtiL
+//
+// Utility routine to get available languages with Symbian OS codes
+// ----------------------------------------------------------------------------
+//
+void CGSLangModel::GetLanguagesFromPtiL(
+ CArrayFix<TInt>* aInstalledLangCodes,
+ CArrayFix<TInt>* aSeedLanguages,
+ CDesCArray* aLanguageNames )
+ {
+ CPtiEngine* ptiEngine = CPtiEngine::NewL();
+ CleanupStack::PushL( ptiEngine );
+
+ CArrayFix<TInt>* languageCodeArray = aSeedLanguages;
+ if ( aInstalledLangCodes )
+ {
+ languageCodeArray = aInstalledLangCodes;
+ }
+ else
+ {
+ ptiEngine->GetAvailableLanguagesL( languageCodeArray );
+ }
+
+ HBufC* buffer = HBufC::NewLC( KGSBufSize128 );
+ const TInt count = languageCodeArray->Count();
+ for ( TInt index = 0; index < count; ++index )
+ {
+ const TInt langId = languageCodeArray->At( index );
+
+ TPtr ptrToBuffer( buffer->Des() );
+ ptiEngine->GetLocalizedLanguageName( langId & KGSLanguageMask,
+ ptrToBuffer );
+
+ if ( aInstalledLangCodes )
+ {
+ aSeedLanguages->AppendL( langId );
+ }
+ aLanguageNames->AppendL( ptrToBuffer );
+
+ ptrToBuffer.Zero();
+ }
+
+ CleanupStack::PopAndDestroy( buffer );
+ CleanupStack::PopAndDestroy( ptiEngine );
+ }
+
+
+// -----------------------------------------------------------------------------
+// CGSLangModel::LanguageL
+//
+//
+// -----------------------------------------------------------------------------
+//
+TInt CGSLangModel::LanguageL( TLanguage aType )
+ {
+ TInt Language = KErrNone;
+
+ switch ( aType )
+ {
+ case EGSUiLanguage:
+ {
+ User::LeaveIfError(
+ iCommonEngineRepository->Get( KGSDisplayTxtLang, Language ) );
+ }
+ break;
+ case EGSInputLanguage:
+ {
+ User::LeaveIfError(
+ iAknFepRepository->Get( KAknFepInputTxtLang, Language ) );
+ }
+ break;
+#ifdef RD_INTELLIGENT_TEXT_INPUT
+#ifdef FF_DUAL_LANGUAGE_SUPPORT
+ case EGSInputLanguageSecondary:
+ {
+ User::LeaveIfError(
+ iAknFepRepository->Get( KAknFepInputTxtLangSecondary, Language ) );
+ }
+ break;
+#endif
+#endif
+ default:
+ break;
+ }
+
+ return Language;
+ }
+
+
+// -----------------------------------------------------------------------------
+// CGSLangModel::SetLanguageL
+//
+//
+// -----------------------------------------------------------------------------
+//
+TBool CGSLangModel::SetLanguageL( TLanguage aType, TInt aLanguage )
+ {
+ TBool ret = ETrue;
+
+ switch( aType )
+ {
+ case EGSUiLanguage:
+ {
+ // Never set Language code 0 to HAL
+ if ( aLanguage !=0 )
+ {
+ if ( HAL::Set( HAL::ELanguageIndex, aLanguage ) != KErrNone )
+ {
+ ret = EFalse;
+ }
+ }
+
+ if ( iCommonEngineRepository->
+ Set( KGSDisplayTxtLang, aLanguage ) != KErrNone )
+ {
+ ret = EFalse;
+ }
+
+ TBool NbrModeSaved = EFalse;
+ if ( aLanguage == ELangArabic || User::Language() == ELangArabic )
+ {
+ //numberMode = EGSNumberModeArabicIndic;
+ SetDefaultNumberMode( EGSNbrModeArabic,
+ EGSNbrModeTypeArabic );
+ NbrModeSaved = ETrue;
+ }
+ else if ( ( aLanguage == ELangUrdu || User::Language() == ELangUrdu ) ||
+ ( aLanguage == ELangFarsi || User::Language() == ELangFarsi ) )
+ {
+ //numberMode = EGSNumberModeEasternArabicIndic;
+ SetDefaultNumberMode( EGSNbrModeLatin,
+ EGSNbrModeTypeEasternArabic );
+ NbrModeSaved = ETrue;
+ }
+ else if ( aLanguage == ELangHindi || User::Language() == ELangHindi ||
+ aLanguage == ELangMarathi || User::Language() == ELangMarathi )
+ {
+ //numberMode = EGSNumberModeIndic;
+ SetDefaultNumberMode( EGSNbrModeLatin,
+ EGSNbrModeTypeIndic );
+ NbrModeSaved = ETrue;
+ }
+
+ //if number mode is not set above, then set it to Latin with respective
+ //number mode types. This part might be executed when Automatic is
+ //selected and the SIM card does not support the language.
+ if ( !NbrModeSaved )
+ {
+ TInt nbrModeType = EGSNbrModeTypeIndic;
+ if ( aLanguage == ELangArabic || User::Language() == ELangArabic )
+ {
+ nbrModeType = EGSNbrModeTypeArabic;
+ }
+ else if ( ( aLanguage == ELangUrdu || User::Language() == ELangUrdu )
+ || ( aLanguage == ELangFarsi || User::Language() == ELangFarsi ) )
+ {
+ nbrModeType = EGSNbrModeTypeEasternArabic;
+ }
+
+ //EGSNumberModeLatin is true in both cases;
+ SetDefaultNumberMode( EGSNbrModeLatin,
+ nbrModeType );
+ }
+ }
+ break;
+ case EGSInputLanguage:
+ {
+ if( iAknFepRepository->Set( KAknFepInputTxtLang,
+ aLanguage ) != KErrNone )
+ {
+ ret = EFalse;
+ }
+
+ if(ret)
+ {
+ //inform all other apps about language change.
+ TWsEvent event;
+ event.SetType( KEikInputLanguageChange );
+ CEikonEnv::Static()->WsSession().SendEventToAllWindowGroups(event);
+ CAknEnv::Static()->SettingCache().Update(KEikInputLanguageChange);
+ }
+
+ // See if it cannot do predictive text entry
+ TBool checkEngine = EFalse;
+
+
+ if (!( aLanguage == ELangPrcChinese ||
+ aLanguage == ELangHongKongChinese ||
+ aLanguage == ELangTaiwanChinese )
+ )
+ {
+ if ( FeatureManager::FeatureSupported( KFeatureIdChinese ) )
+ {
+ aLanguage = ELangEnglish;
+ checkEngine = ETrue;
+ }
+ if (!CheckDictionaryFromPtiL( aLanguage, checkEngine))
+ {
+ CAknNoteDialog* dlg = new (ELeave) CAknNoteDialog( );
+ dlg->ExecuteDlgLD(
+ CAknNoteDialog::EShortTimeout,
+ CAknNoteDialog::ENoTone,
+ R_AVKON_T9_NOTE_NO_AVAILABLE );
+
+ //SetT9OnOffMode(0);
+ SetPredictiveOnOff( EGSLangOther, 0 );
+ }
+ }
+ }
+ break;
+#ifdef RD_INTELLIGENT_TEXT_INPUT
+#ifdef FF_DUAL_LANGUAGE_SUPPORT
+ case EGSInputLanguageSecondary:
+ {
+ if( iAknFepRepository->Set( KAknFepInputTxtLangSecondary,
+ aLanguage ) != KErrNone )
+ {
+ ret = EFalse;
+ }
+
+ if(ret)
+ {
+ //inform all other apps about language change.
+ TWsEvent event;
+ event.SetType( KEikInputLanguageChange );
+ CEikonEnv::Static()->WsSession().SendEventToAllWindowGroups(event);
+ CAknEnv::Static()->SettingCache().Update(KEikInputLanguageChange);
+ }
+
+ // Secondary input language does not need prediction
+ // so we don't check for it
+ }
+ break;
+#endif
+#endif
+ default:
+ break;
+ }
+
+ return ret;
+ }
+
+
+// -----------------------------------------------------------------------------
+// CGSLangModel::DefaultNumberMode
+//
+//
+// -----------------------------------------------------------------------------
+//
+TInt CGSLangModel::DefaultNumberMode( TInt aNbrModeType )
+ {
+ TInt value = KGSSettingOff;
+
+ switch ( aNbrModeType )
+ {
+ case EGSNbrModeTypeArabic:
+ case EGSNbrModeTypeEasternArabic:
+ iLocaleRepository->Get( KSettingsDefaultNumberMode, value );
+ break;
+ case EGSNbrModeTypeIndic:
+ iLocaleRepository->Get( KSettingsIndicDefaultNumberMode, value );
+ break;
+ default:
+ break;
+ }
+
+ return value;
+ }
+
+
+// -----------------------------------------------------------------------------
+// CGSLangModel::SetDefaultNumberMode
+//
+// Set default number mode for non-latin languagues
+// -----------------------------------------------------------------------------
+//
+void CGSLangModel::SetDefaultNumberMode( TInt aMode, TInt aNbrModeType )
+ {
+ if ( aNbrModeType == EGSNbrModeTypeArabic ||
+ aNbrModeType == EGSNbrModeTypeEasternArabic )
+ {
+ iLocaleRepository->Set( KSettingsDefaultNumberMode, aMode );
+ }
+ else
+ {
+ iLocaleRepository->Set( KSettingsIndicDefaultNumberMode, aMode );
+ }
+
+ TLocale locale;
+ if ( aMode == EGSNbrModeLatin )
+ {
+ locale.SetDigitType( EDigitTypeWestern );
+ }
+ else
+ {
+ //if aMode <> EGSNbrModeLatin, then it should be either latin or arabic. However
+ //as EGSNbrModeArabic and EGsNbrModeIndic both have a value = 1, we can't use
+ //that constant for below comparison. Hence, need to depend on the 2nd param.
+ switch ( aNbrModeType )
+ {
+ case EGSNbrModeTypeArabic:
+ locale.SetDigitType( EDigitTypeArabicIndic );
+ break;
+ case EGSNbrModeTypeIndic:
+ locale.SetDigitType( EDigitTypeDevanagari );
+ break;
+ case EGSNbrModeTypeEasternArabic:
+ locale.SetDigitType( EDigitTypeEasternArabicIndic );
+ break;
+ default:
+ break;
+ }
+ }
+
+ locale.Set();
+ }
+
+
+// -----------------------------------------------------------------------------
+// CGSLangModel::PredictiveOnOff
+//
+//
+// -----------------------------------------------------------------------------
+//
+TInt CGSLangModel::PredictiveOnOff( TPredictiveType aPredictive )
+ {
+ TInt onOffMode = KGSPredTxtFlagDefault;
+#ifdef RD_INTELLIGENT_TEXT_INPUT
+ TInt onOffBitMask = KGSPredTxtBitMaskDefault;
+#endif
+
+ switch( aPredictive )
+ {
+ case EGSLangJapanese:
+ {
+ if( iAknFepRepository->Get( KAknFepJapanesePredTxtFlag,
+ onOffMode ) != KErrNone )
+ {
+ iAknFepRepository->Set( KAknFepJapanesePredTxtFlag,
+ onOffMode );
+ }
+ }
+ break;
+ case EGSLangOther:
+ {
+#ifdef RD_INTELLIGENT_TEXT_INPUT
+ if ( iAknFepRepository->Get( KAknFepPredTxtFlagExtension,
+ onOffBitMask ) != KErrNone )
+ {
+ iAknFepRepository->Set( KAknFepPredTxtFlagExtension, onOffBitMask );
+ }
+
+ // Parse keyboard dependent settings for current keyboard from bitmask
+ // We'll only use this function to get prediction value if we have one
+ // keyboard on the device, so we can just check the current keyb. layout
+ TInt keyboardLayout = 0;
+ RProperty::Get(KCRUidAvkon, KAknKeyBoardLayout, keyboardLayout);
+ TPtiKeyboardType layout = (TPtiKeyboardType)keyboardLayout;
+ TInt predTmp = onOffBitMask;
+ switch(layout)
+ {
+ case EPtiKeyboardNone:
+ break;
+ case EPtiKeyboard12Key:
+ predTmp &= EKeyboardStyle12Key;
+ break;
+ case EPtiKeyboardHalfQwerty:
+ predTmp &= EKeyboardStyleHalfQwerty;
+ break;
+ case EPtiKeyboardQwerty4x12:
+ case EPtiKeyboardQwerty4x10:
+ case EPtiKeyboardQwerty3x11:
+ case EPtiKeyboardCustomQwerty:
+ predTmp &= EKeyboardStyleQwerty;
+ break;
+ default:
+ break;
+ }
+ onOffMode = ( predTmp ? 1 : 0);
+
+#else
+ if ( iAknFepRepository->Get( KAknFepPredTxtFlag,
+ onOffMode ) != KErrNone )
+ {
+ iAknFepRepository->Set( KAknFepPredTxtFlag, onOffMode );
+ }
+#endif
+ }
+ break;
+ default:
+ break;
+ }
+
+ return onOffMode;
+ }
+
+
+// -----------------------------------------------------------------------------
+// CGSLangModel::SetPredictiveOnOff
+//
+//
+// -----------------------------------------------------------------------------
+//
+TBool CGSLangModel::SetPredictiveOnOff( TPredictiveType aPredictive,
+ TInt aMode )
+ {
+ TBool ret = EFalse;
+ switch( aPredictive )
+ {
+ case EGSLangJapanese:
+ {
+ if ( iAknFepRepository->Set( KAknFepJapanesePredTxtFlag,
+ aMode ) != KErrNone )
+ {
+ ret = ETrue;
+ }
+ }
+ break;
+ case EGSLangOther:
+ {
+#ifdef RD_INTELLIGENT_TEXT_INPUT
+ TInt predFlag = 0;
+ iAknFepRepository->Get(KAknFepPredTxtFlagExtension, predFlag);
+
+ // Parse keyboard dependent settings for current keyboard from bitmask
+ // We'll only use this function to set prediction value if we have one
+ // keyboard on the device, so we can just check the current keyb. layout
+ TInt keyboardLayout = 0;
+ RProperty::Get(KCRUidAvkon, KAknKeyBoardLayout, keyboardLayout);
+ TPtiKeyboardType layout = (TPtiKeyboardType)keyboardLayout;
+ switch(layout)
+ {
+ case EPtiKeyboardNone:
+ break;
+ case EPtiKeyboard12Key:
+ if ( aMode )
+ {
+ predFlag |= EKeyboardStyle12Key;
+ }
+ else
+ {
+ predFlag &= ~EKeyboardStyle12Key;
+ }
+ break;
+ case EPtiKeyboardHalfQwerty:
+ if ( aMode )
+ {
+ predFlag |= EKeyboardStyleHalfQwerty;
+ }
+ else
+ {
+ predFlag &= ~EKeyboardStyleHalfQwerty;
+ }
+ break;
+
+ case EPtiKeyboardQwerty4x12:
+ case EPtiKeyboardQwerty4x10:
+ case EPtiKeyboardQwerty3x11:
+
+ case EPtiKeyboardCustomQwerty:
+ if (aMode)
+ {
+ predFlag |= EKeyboardStyleQwerty;
+ }
+ else
+ {
+ predFlag &= ~EKeyboardStyleQwerty;
+ }
+ break;
+ default:
+ break;
+ }
+ iAknFepRepository->Set(KAknFepPredTxtFlagExtension, predFlag);
+ iAknFepRepository->Set(KAknFepPredTxtFlag, aMode); // For backwards compatibility
+ }
+#else
+ if( iAknFepRepository->Set( KAknFepPredTxtFlag,
+ aMode ) != KErrNone )
+ {
+ ret = ETrue;
+ }
+ }
+#endif
+ break;
+ default:
+ break;
+ }
+
+ return ret;
+ }
+
+
+// ----------------------------------------------------------------------------
+// CGSLangModel::CheckDictionaryFromPtiL
+//
+// Checks if the selected language supports predictive text input.
+// In case this returns EFalse, the UI display's "Not available"
+// for Predictive text input.
+// ----------------------------------------------------------------------------
+//
+TBool CGSLangModel::CheckDictionaryFromPtiL( TInt aLangCode, TBool aCheckEngine)
+ {
+ TBool langSupport = EFalse;
+
+ if (!aCheckEngine && (FeatureManager::FeatureSupported( KFeatureIdChinese ) ||
+ FeatureManager::FeatureSupported( KFeatureIdJapanese ) ))
+ {
+ langSupport = ETrue;
+ }
+ else
+ {
+ CPtiEngine* ptiEngine = CPtiEngine::NewL();
+ CleanupStack::PushL( ptiEngine );
+
+ MPtiLanguage* ptiLang = ptiEngine->GetLanguage( aLangCode & KGSLanguageMask );
+ if ( ptiLang )
+ {
+ // the check here should be based on the keyboard
+#ifdef RD_INTELLIGENT_TEXT_INPUT
+ TInt keyboardLayout = 0;
+ RProperty::Get(KCRUidAvkon, KAknKeyBoardLayout, keyboardLayout);
+ TPtiKeyboardType layout = (TPtiKeyboardType)keyboardLayout;
+ switch(layout)
+ {
+ case EPtiKeyboardHalfQwerty:
+ langSupport = ptiLang->HasInputMode( (TPtiEngineInputMode)EPtiEngineHalfQwertyPredictive);
+ break;
+ case EPtiKeyboardQwerty4x12:
+ case EPtiKeyboardQwerty4x10:
+ case EPtiKeyboardQwerty3x11:
+ case EPtiKeyboardCustomQwerty:
+ langSupport = ptiLang->HasInputMode( (TPtiEngineInputMode)EPtiEngineQwertyPredictive);
+ break;
+ case EPtiKeyboardNone:
+ case EPtiKeyboard12Key:
+ langSupport = ptiLang->HasInputMode( (TPtiEngineInputMode)EPtiEnginePredictive);
+ break;
+ default:
+ langSupport = ptiLang->HasInputMode( (TPtiEngineInputMode)EPtiEnginePredictive);
+ break;
+ }
+#else
+ langSupport = ptiLang->HasInputMode( (TPtiEngineInputMode)EPtiEnginePredictive);
+#endif
+ }
+ CleanupStack::PopAndDestroy( ptiEngine );
+ ptiLang = NULL;
+ }
+
+ return langSupport;
+ }
+
+// ----------------------------------------------------------------------------
+// CGSLangModel::CheckT9FromPtiLForPrediction
+//
+// Checks if the selected language supports predictive text input.
+// In case this returns EFalse, the UI display's "Predictive text Not available
+// for selected language" for Predictive text input.
+// ----------------------------------------------------------------------------
+//
+
+#ifdef RD_INTELLIGENT_TEXT_INPUT
+TBool CGSLangModel::CheckT9FromPtiLForPredictionL(TPtiEngineInputMode inputMode, TInt aLangCode)
+ {
+ TBool langSupport=EFalse;
+
+ CPtiEngine* ptiEngine = CPtiEngine::NewL();
+ CleanupStack::PushL( ptiEngine );
+
+ MPtiLanguage* ptiLang = NULL;
+ if(0 == aLangCode)
+ iAknFepRepository->Get( KAknFepInputTxtLang, aLangCode );
+ if ( aLangCode == ELangPrcChinese ||
+ aLangCode == ELangHongKongChinese ||
+ aLangCode == ELangTaiwanChinese )
+ {
+ aLangCode = ELangEnglish;
+ }
+
+ ptiLang = ptiEngine->GetLanguage( aLangCode );
+ if ( ptiLang )
+ {
+ langSupport = ptiLang->HasInputMode( inputMode );
+ }
+
+ CleanupStack::PopAndDestroy( ptiEngine );
+ ptiLang = NULL;
+
+ return langSupport;
+ }
+#endif
+
+
+// -----------------------------------------------------------------------------
+// CGSLangModel::DefaultInputMethodL
+//
+//
+// -----------------------------------------------------------------------------
+//
+TInt CGSLangModel::DefaultInputMethodL()
+ {
+ if ( FeatureManager::FeatureSupported( KFeatureIdChinese ) )
+ {
+ // fetch the setting value from shared data etc.
+ // return the value
+ TUint MethodItem;
+ _LIT(Kx, "x");
+ // This conversion is needed because KAknFepChineseInputMode cenrep key original type was 16bit int.
+ // now type is changed to string, so that it can accommodate bigger values like EHangul 0x16000.
+ TBuf<KFepChineseInputModeLength> conversion;
+ User::LeaveIfError( iAknFepRepository->
+ Get( KAknFepChineseInputMode, conversion ) );
+ TInt len = conversion.Find(Kx);
+ TLex lex;
+
+ if(len)
+ {
+ TPtrC ptr = conversion.Mid(len +1);
+ lex.Assign(ptr);
+ }
+ else
+ {
+ lex.Assign(conversion);
+ }
+
+ lex.Val(MethodItem, EHex);
+ return MethodItem;
+ }
+ else
+ {
+ return KErrNotSupported;
+ }
+ }
+
+
+// -----------------------------------------------------------------------------
+// CGSLangModel::SetDefaultInputMethodL
+//
+//
+// -----------------------------------------------------------------------------
+//
+void CGSLangModel::SetDefaultInputMethodL( TInt aMethod )
+ {
+ if ( FeatureManager::FeatureSupported( KFeatureIdChinese ) )
+ {
+ TBuf<KFepChineseInputModeLength> conversion;
+ conversion.Num(aMethod, EHex);
+
+ User::LeaveIfError(
+ iAknFepRepository->Set( KAknFepChineseInputMode, conversion ) );
+
+ // See if it cannot do predictive text entry
+ if( !CheckDictionaryFromPtiL( aMethod ) )
+ {
+ SetPredictiveOnOff( EGSLangOther, 0 );
+ }
+ }
+ }
+
+
+// -----------------------------------------------------------------------------
+// CGSLangModel::ChangePredictiveOnOffSettingL
+//
+//
+// -----------------------------------------------------------------------------
+//
+void CGSLangModel::ChangePredictiveOnOffSettingL( TBool aShowOnOffSettingPage,
+ TPredictiveType aPredictive )
+ {
+ TInt currentValue = PredictiveOnOff( aPredictive );
+ TBool updateValue = ETrue;
+
+ // Following code potentially changes the value of currrent value
+ if ( aShowOnOffSettingPage )
+ {
+ updateValue = ShowPredictiveOnOffSettingPageL( currentValue );
+ }
+ else
+ {
+ currentValue = !PredictiveOnOff( aPredictive );
+ }
+
+ if ( updateValue )
+ {
+ // Treat on and off separately for clarity
+ if ( currentValue )
+ {
+ // See if it can do predictive text entry
+ if( CheckDictionaryFromPtiL( LanguageL( EGSInputLanguage ) ) )
+ {
+ SetPredictiveOnOff( aPredictive, currentValue );
+ }
+ else
+ {
+ CAknNoteDialog* dlg = new (ELeave) CAknNoteDialog( );
+ dlg->ExecuteDlgLD(
+ CAknNoteDialog::EShortTimeout,
+ CAknNoteDialog::ENoTone,
+ R_AVKON_T9_NOTE_NO_AVAILABLE );
+ }
+ }
+ else
+ {
+ // We are always able to turn T9 off:
+ SetPredictiveOnOff( aPredictive, currentValue );
+ }
+ // value should really be being updated, so update listbox
+ if ( FeatureManager::FeatureSupported( KFeatureIdJapanese ) )
+ {
+ // Update English Predictive list item
+ if ( aPredictive == CGSLangModel::EGSLangJapanese )
+ {
+ iContainer->UpdateListBoxL( EGSLangIdJPT );
+ }
+ else
+ {
+ iContainer->UpdateListBoxL( EGSLangIdEPT );
+ }
+ }
+ else
+ {
+ //EGSLangIdT9L
+ iContainer->UpdateListBoxL( iContainer->CurrentFeatureId() );
+ }
+ }
+ }
+
+
+// -----------------------------------------------------------------------------
+// CGSLangModel::ShowPredictiveOnOffSettingPageL
+//
+//
+// -----------------------------------------------------------------------------
+//
+TBool CGSLangModel::ShowPredictiveOnOffSettingPageL( TInt& aOnOffcurrent )
+ {
+ // Default is to act as if the user cancelled the setting page
+ TBool ret = EFalse;
+
+ if ( CheckDictionaryFromPtiL( LanguageL( EGSInputLanguage ) ) )
+ {
+ CDesCArrayFlat* items =
+ CCoeEnv::Static()->ReadDesC16ArrayResourceL(
+ R_T9_ON_OFF_SETTING_PAGE_LBX );
+
+ CleanupStack::PushL( items );
+
+ TInt dispOnOff = !aOnOffcurrent;
+
+ CAknRadioButtonSettingPage* dlg =
+ new ( ELeave ) CAknRadioButtonSettingPage(
+ R_T9_ON_OFF_SETTING_PAGE, dispOnOff, items );
+ ret = dlg->ExecuteLD( CAknSettingPage::EUpdateWhenChanged );
+ if ( ret )
+ {
+ aOnOffcurrent = !dispOnOff;
+ }
+ CleanupStack::PopAndDestroy( items );
+ }
+ else
+ {
+ CAknNoteDialog* dlg = new( ELeave ) CAknNoteDialog();
+ dlg->ExecuteDlgLD( CAknNoteDialog::EShortTimeout,
+ CAknNoteDialog::ENoTone,
+ R_AVKON_T9_NOTE_NO_AVAILABLE );
+ }
+ return ret;
+ }
+
+
+// -----------------------------------------------------------------------------
+// CGSLangModel::CheckCallStateL
+//
+//
+// -----------------------------------------------------------------------------
+//
+TInt CGSLangModel::CheckCallStateL()
+ {
+ TInt callState = KErrNone;
+
+ //here are open connections or not
+ RProperty::Get( KPSUidCtsyCallInformation,
+ KCTsyCallState,
+ callState );
+ return callState;
+ }
+
+
+// -----------------------------------------------------------------------------
+// CGSLangModel::HandleNotifyInt
+//
+//
+// -----------------------------------------------------------------------------
+//
+void CGSLangModel::HandleNotifyInt( TUint32 aId, TInt /*aNewValue*/ )
+ {
+ TRAP_IGNORE( HandleCenrepValueChangedL( aId ) );
+ }
+
+
+// -----------------------------------------------------------------------------
+// CGSLangModel::HandleCenrepValueChangedL
+//
+//
+// -----------------------------------------------------------------------------
+//
+void CGSLangModel::HandleCenrepValueChangedL( TUint32 aId )
+ {
+ if ( aId == KAknFepInputTxtLang )
+ {
+ iContainer->UpdateListBoxL( EGSLangIdITL );
+ iContainer->UpdateListBoxL( EGSLangIdT9L );
+
+ TInt inputLanguage;
+ iAknFepRepository->Get( KAknFepInputTxtLang, inputLanguage );
+ //Updating default input method based on input text language
+ //Chinese specific feature
+ TBool listboxUpdateReqd(EFalse);
+ if ( inputLanguage == ELangPrcChinese )
+ {
+ SetDefaultInputMethodL( EPinyin );
+ listboxUpdateReqd = ETrue;
+ }
+ else if ( inputLanguage == ELangHongKongChinese )
+ {
+ SetDefaultInputMethodL( EStroke );
+ listboxUpdateReqd = ETrue;
+ }
+ else if ( inputLanguage == ELangTaiwanChinese )
+ {
+ SetDefaultInputMethodL( EZhuyin );
+ listboxUpdateReqd = ETrue;
+ }
+ if (listboxUpdateReqd)
+ {
+ iContainer->UpdateListBoxL( EGSLangIdDIM );
+ }
+#ifdef RD_HINDI_PHONETIC_INPUT
+ //check if this is Hindi Phonetic - hide T9 item if it is.
+ if( inputLanguage == KLangHindiPhonetic )
+ {
+ iContainer->SetT9ItemVisibilityL( EFalse );
+ }
+ else
+ {
+ iContainer->SetT9ItemVisibilityL( ETrue );
+ }
+#endif //RD_HINDI_PHONETIC_INPUT
+ }
+ else if ( aId == KAknFepPredTxtFlag
+#ifdef RD_INTELLIGENT_TEXT_INPUT
+ || aId == KAknFepPredTxtFlagExtension
+#endif
+ )
+ {
+ iContainer->UpdateListBoxL( EGSLangIdT9L );
+ iContainer->UpdateListBoxL( EGSLangIdEPT );
+ }
+
+ else if ( aId == KAknFepJapanesePredTxtFlag)
+ {
+ iContainer->UpdateListBoxL( EGSLangIdJPT);
+ }
+
+ else if ( aId == KSettingsIndicDefaultNumberMode )
+ {
+ iContainer->UpdateListBoxL( EGSLangHindiNumberMode );
+ }
+ }
+
+
+// ----------------------------------------------------------------------------
+// CGSLangModel::KeypressTimeout
+//
+// Get Keypress timeout (means Multitap timer).
+// ----------------------------------------------------------------------------
+//
+TInt CGSLangModel::KeypressTimeout()
+ {
+ TInt msec;
+ if ( iAknFepRepository->Get( KAknFepMultiTapTimer, msec ) != KErrNone )
+ {
+ msec = KGSMultiTapTimerDefault;
+ iAknFepRepository->Set( KAknFepMultiTapTimer, msec );
+ }
+
+ return msec;
+ }
+
+// ----------------------------------------------------------------------------
+// CGSLangModel::SetKeypressTimeout
+//
+// Writes Keypress timeout (means Multitap timer).
+// ----------------------------------------------------------------------------
+//
+TBool CGSLangModel::SetKeypressTimeout( TInt aMilliSecond )
+ {
+ TBool ret = EFalse;
+ if ( iAknFepRepository->Set( KAknFepMultiTapTimer, aMilliSecond )
+ == KErrNone )
+ {
+ ret = ETrue;
+ }
+
+ return ret;
+ }
+
+// ----------------------------------------------------------------------------
+// CGSLangModel::JapanQwertyFlags
+//
+// Get setting value of each apanese qwerty specific flags
+// ----------------------------------------------------------------------------
+//
+TBool CGSLangModel::JapanQwertyFlags( const TGSJapQwertyFlags aFlag )
+ {
+ TInt value;
+ if ( iAknFepRepository->Get( KAknFepJapaneseSpecialCharFlag, value )
+ != KErrNone )
+ {
+ value = KGSJapaneseSpecialCharFlagDefault;
+ iAknFepRepository->Set( KAknFepJapaneseSpecialCharFlag, value );
+ }
+
+ return ( value&aFlag );
+ }
+
+// ----------------------------------------------------------------------------
+// CGSLangModel::SetJapanQwertyFlags
+//
+// Set value of each Japanese qwerty specific flags
+// ----------------------------------------------------------------------------
+//
+TBool CGSLangModel::SetJapanQwertyFlags( const TGSJapQwertyFlags aFlag,
+ TBool aValue )
+ {
+ TBool ret = EFalse;
+ TInt value;
+ if ( iAknFepRepository->Get( KAknFepJapaneseSpecialCharFlag, value )
+ == KErrNone )
+ {
+ if ( aValue )
+ {
+ value |= aFlag;
+ }
+ else
+ {
+ value &= ~( aFlag );
+ }
+ if ( iAknFepRepository->Set( KAknFepJapaneseSpecialCharFlag, value )
+ == KErrNone )
+ {
+ ret = ETrue;
+ }
+ }
+
+ return ret;
+ }
+
+
+// ----------------------------------------------------------------------------
+// CGSLangModel::ChiCangJieInput
+//
+// Get Chinese CangJie input method value
+// ----------------------------------------------------------------------------
+//
+TInt CGSLangModel::ChiCangJieInputL()
+ {
+ TInt value;
+ User::LeaveIfError( iAknFepRepository->
+ Get( KAknFepCangJieMode, value ) );
+
+ return value;
+ }
+
+// ----------------------------------------------------------------------------
+// CGSLangModel::SetChiCangJieInput
+//
+// Set Chinese CangJie input method value
+// ----------------------------------------------------------------------------
+//
+void CGSLangModel::SetChiCangJieInputL( TInt aMode )
+ {
+ User::LeaveIfError(
+ iAknFepRepository->Set( KAknFepCangJieMode, aMode ) );
+ }
+
+
+// ----------------------------------------------------------------------------
+// CGSLangModel::CheckCangjieSupportL
+//
+// Check if the Cangjie is supported by the language
+// @param aLangCode i.e. Code for the language
+// ----------------------------------------------------------------------------
+//
+TBool CGSLangModel:: CheckCangjieSupportL( TInt aLangCode )
+ {
+ TBool langSupport=EFalse;
+ CPtiEngine* ptiEngine = CPtiEngine::NewL();
+ CleanupStack::PushL( ptiEngine );
+
+ MPtiLanguage* ptiLang = NULL;
+ //Check if HK variant support CangJie input mode
+ TPtiEngineInputMode inputMode = EPtiEngineNormalCangjieQwerty;
+
+ //Chinese languages do not need a mask.
+ ptiLang = ptiEngine->GetLanguage( aLangCode );
+ if ( ptiLang )
+ {
+ langSupport = ptiLang->HasInputMode( inputMode );
+ }
+
+ CleanupStack::PopAndDestroy( ptiEngine );
+ ptiLang = NULL;
+ return langSupport;
+ }
+
+// ----------------------------------------------------------------------------
+// CGSLangModel::PredictiveModeL
+//
+// Get Predictive mode value
+// 0 --> Normal
+// 1 --> Autocompletion
+// ----------------------------------------------------------------------------
+//
+TInt CGSLangModel::PredictiveModeL()
+ {
+ TInt value = 0;
+ #ifndef RD_INTELLIGENT_TEXT_INPUT
+ User::LeaveIfError( iAknFepRepository->
+ Get( KAknFepAutoCompleteFlag, value ) );
+ #endif
+ return value;
+ }
+
+// ----------------------------------------------------------------------------
+// CGSLangModel::SetPredictiveModeL
+//
+// Get Predictive mode value
+// 0 --> Normal
+// 1 --> Autocompletion
+// ----------------------------------------------------------------------------
+//
+void CGSLangModel::SetPredictiveModeL( TInt aMode )
+ {
+ #ifndef RD_INTELLIGENT_TEXT_INPUT
+ User::LeaveIfError( iAknFepRepository->
+ Set( KAknFepAutoCompleteFlag, aMode ) );
+ #endif
+ }
+
+// ----------------------------------------------------------------------------
+// CGSLangModel::CheckAutoWordCompletionSupportL
+//
+// Checking autoword completion feature support
+// ----------------------------------------------------------------------------
+//
+TBool CGSLangModel::CheckAutoWordCompletionSupportL()
+ {
+ TBool langSupport=EFalse;
+
+ #ifndef RD_INTELLIGENT_TEXT_INPUT
+ CPtiEngine* ptiEngine = CPtiEngine::NewL();
+ CleanupStack::PushL( ptiEngine );
+
+ MPtiLanguage* ptiLang = NULL;
+ TPtiEngineInputMode inputMode = EPtiEngineWordCompletion;
+
+ TInt aLangCode = 0;
+ User::LeaveIfError( iAknFepRepository->Get( KAknFepInputTxtLang, aLangCode ) );
+
+ ptiLang = ptiEngine->GetLanguage( aLangCode );
+ if ( ptiLang )
+ {
+ langSupport = ptiLang->HasInputMode( inputMode );
+ }
+
+ CleanupStack::PopAndDestroy( ptiEngine );
+ ptiLang = NULL;
+ #endif //RD_INTELLIGENT_TEXT_INPUT
+
+ return langSupport;
+ }
+
+// ----------------------------------------------------------------------------
+// CGSLangModel::CheckDiskSpaceL
+//
+// Checking if there is enough free space for language switch
+// ----------------------------------------------------------------------------
+//
+TBool CGSLangModel::CheckDiskSpaceL()
+ {
+ // Check if there is enough space in disk
+ if ( SysUtil::FFSSpaceBelowCriticalLevelL( NULL,
+ KGSDiskSpaceLimitForLanguageChange ) )
+ {
+ return ETrue;
+ }
+ else
+ {
+ return EFalse;
+ }
+ }
+
+#ifdef RD_INTELLIGENT_TEXT_INPUT
+TBool CGSLangModel::DeviceHasMultipleKeyboardsL()
+ {
+ TInt physicalKeyboards = 0;
+ User::LeaveIfError( iAknFepRepository->Get( KAknFepPhysicalKeyboards, physicalKeyboards ));
+ // Check virtual keyboards
+ if ( FeatureManager::FeatureSupported(KFeatureIdVirtualItutInput) )
+ {
+ physicalKeyboards = physicalKeyboards | 0x01;
+ }
+ if ( FeatureManager::FeatureSupported(KFeatureIdVirtualFullscrQwertyInput) )
+ {
+ physicalKeyboards = physicalKeyboards | 0x02;
+ }
+ // Check virtual keyboards end
+ TBool firstFound = EFalse;
+ for(TUint i = 0x01; i <= 0xF0; i = i << 1)
+ {
+ if(physicalKeyboards & i)
+ {
+ if (firstFound)
+ {
+ return ETrue;
+ }
+ else
+ {
+ firstFound = ETrue;
+ }
+ }
+ }
+ return EFalse;
+ }
+
+TInt CGSLangModel::PredictionBitMaskL()
+ {
+ TInt value = 0;
+ User::LeaveIfError( iAknFepRepository->Get( KAknFepPredTxtFlagExtension, value ) );
+ return value;
+ }
+
+void CGSLangModel::SetPredictionBitMaskL(TInt aBitMask)
+ {
+ User::LeaveIfError( iAknFepRepository->Set( KAknFepPredTxtFlagExtension, aBitMask ) );
+ }
+
+TInt CGSLangModel::PhysicalKeyboardsL()
+ {
+ TInt physicalKeyboards = 0;
+ User::LeaveIfError( iAknFepRepository->Get( KAknFepPhysicalKeyboards, physicalKeyboards ));
+ // Check virtual keyboards
+ if ( FeatureManager::FeatureSupported(KFeatureIdVirtualItutInput) )
+ {
+ physicalKeyboards = physicalKeyboards | 0x01;
+ }
+ if ( FeatureManager::FeatureSupported(KFeatureIdVirtualFullscrQwertyInput) )
+ {
+ physicalKeyboards = physicalKeyboards | 0x02;
+ }
+ // Check virtual keyboards end
+ return physicalKeyboards;
+ }
+
+void CGSLangModel::GetSecondaryInputLanguagesL(
+ CArrayFix<TInt>* aSeedLanguages,
+ CDesCArray* aLanguageNames,
+ CCoeEnv* aCoeEnv)
+ {
+ CPtiEngine* ptiEngine = CPtiEngine::NewL();
+ CleanupStack::PushL( ptiEngine );
+
+ CArrayFix<TInt>* languageCodeArray = aSeedLanguages;
+ ptiEngine->GetAvailableLanguagesL( languageCodeArray );
+ languageCodeArray->InsertL(0,0); // No secondary input language as the first item
+
+ TInt count = languageCodeArray->Count();
+ for ( TInt index = 0; index < count; ++index )
+ {
+ const TInt langCode = languageCodeArray->At(index);
+ if(langCode == ELangTaiwanChinese ||
+ langCode == ELangHongKongChinese ||
+ langCode == ELangPrcChinese ||
+ langCode == ELangJapanese ||
+ langCode == ELangKorean )
+ {
+ languageCodeArray->Delete(index);
+ count--;
+ index--;
+ }
+ }
+
+ HBufC* noneString = StringLoader::LoadLC( R_SECONDARY_WRITING_LANG_NONE, aCoeEnv);
+ TPtr nonePtr( noneString->Des() );
+ aLanguageNames->AppendL(nonePtr);
+ CleanupStack::PopAndDestroy( noneString );
+
+ HBufC* buffer = HBufC::NewLC( KGSBufSize128 );
+ for ( TInt index = 1; index < count; ++index )
+ {
+ const TInt langId = languageCodeArray->At( index );
+
+ TPtr ptrToBuffer( buffer->Des() );
+ ptiEngine->GetLocalizedLanguageName( langId & KGSLanguageMask,
+ ptrToBuffer );
+
+ aLanguageNames->AppendL( ptrToBuffer );
+
+ ptrToBuffer.Zero();
+ }
+
+ CleanupStack::PopAndDestroy( buffer );
+ CleanupStack::PopAndDestroy( ptiEngine );
+ }
+#endif
+
+// End of File