Move language-specific keyboard setting to resources.

Some flag settings used to be stored in a keyboard layout extravalue setting. This
change:
- Introduces the capability of setting such specific flags in values/config.xml
- Retains the ability to use extravalues (for layout-specific settings), though
  there is no more any such setting at the moment.
- Fixes a bug where loading a dictionary from outside does not initialize the flags.
- Moves Flag to another class.

Note: this needs I705ec68c to avoid breaking the build

Change-Id: Ia7703aae3215b06c0b3cb792821649806e8998c1
main
Jean Chalard 2011-04-20 16:52:07 +09:00
parent b1ae5d84b1
commit c899038eee
7 changed files with 103 additions and 30 deletions

View File

@ -0,0 +1,23 @@
<?xml version="1.0" encoding="utf-8"?>
<!--
/*
**
** Copyright 2011, The Android Open Source Project
**
** Licensed under the Apache License, Version 2.0 (the "License");
** you may not use this file except in compliance with the License.
** You may obtain a copy of the License at
**
** http://www.apache.org/licenses/LICENSE-2.0
**
** Unless required by applicable law or agreed to in writing, software
** distributed under the License is distributed on an "AS IS" BASIS,
** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
** See the License for the specific language governing permissions and
** limitations under the License.
*/
-->
<resources>
<bool name="config_require_umlaut_processing">true</bool>
</resources>

View File

@ -78,4 +78,5 @@
</string-array> </string-array>
<!-- Screen metrics for logging. 0 = "mdpi", 1 = "hdpi", 2 = "xlarge" --> <!-- Screen metrics for logging. 0 = "mdpi", 1 = "hdpi", 2 = "xlarge" -->
<integer name="log_screen_metrics">0</integer> <integer name="log_screen_metrics">0</integer>
<bool name="config_require_umlaut_processing">false</bool>
</resources> </resources>

View File

@ -72,7 +72,6 @@
android:label="@string/subtype_mode_de_keyboard" android:label="@string/subtype_mode_de_keyboard"
android:imeSubtypeLocale="de" android:imeSubtypeLocale="de"
android:imeSubtypeMode="keyboard" android:imeSubtypeMode="keyboard"
android:imeSubtypeExtraValue="requiresGermanUmlautProcessing"
/> />
<!-- <subtype android:icon="@drawable/ic_subtype_mic" --> <!-- <subtype android:icon="@drawable/ic_subtype_mic" -->
<!-- android:label="@string/subtype_mode_de_voice" --> <!-- android:label="@string/subtype_mode_de_voice" -->

View File

@ -63,18 +63,12 @@ public class BinaryDictionary extends Dictionary {
private final KeyboardSwitcher mKeyboardSwitcher = KeyboardSwitcher.getInstance(); private final KeyboardSwitcher mKeyboardSwitcher = KeyboardSwitcher.getInstance();
public static class Flag {
public final String mName;
public final int mValue;
public Flag(String name, int value) {
mName = name;
mValue = value;
}
}
public static final Flag FLAG_REQUIRES_GERMAN_UMLAUT_PROCESSING = public static final Flag FLAG_REQUIRES_GERMAN_UMLAUT_PROCESSING =
new Flag("requiresGermanUmlautProcessing", 0x1); new Flag(R.bool.config_require_umlaut_processing, 0x1);
// Can create a new flag from extravalue :
// public static final Flag FLAG_MYFLAG =
// new Flag("my_flag", 0x02);
private static final Flag[] ALL_FLAGS = { private static final Flag[] ALL_FLAGS = {
// Here should reside all flags that trigger some special processing // Here should reside all flags that trigger some special processing
@ -118,12 +112,12 @@ public class BinaryDictionary extends Dictionary {
return null; return null;
} }
} }
sInstance.mFlags = initFlags(ALL_FLAGS, SubtypeSwitcher.getInstance()); sInstance.mFlags = Flag.initFlags(ALL_FLAGS, context, SubtypeSwitcher.getInstance());
return sInstance; return sInstance;
} }
/* package for test */ static BinaryDictionary initDictionary(File dictionary, long startOffset, /* package for test */ static BinaryDictionary initDictionary(Context context, File dictionary,
long length, int dicTypeId, Flag[] flagArray) { long startOffset, long length, int dicTypeId, Flag[] flagArray) {
synchronized (sInstance) { synchronized (sInstance) {
sInstance.closeInternal(); sInstance.closeInternal();
if (dictionary.isFile()) { if (dictionary.isFile()) {
@ -134,19 +128,10 @@ public class BinaryDictionary extends Dictionary {
return null; return null;
} }
} }
sInstance.mFlags = initFlags(flagArray, null); sInstance.mFlags = Flag.initFlags(flagArray, context, null);
return sInstance; return sInstance;
} }
private static int initFlags(Flag[] flagArray, SubtypeSwitcher switcher) {
int flags = 0;
for (Flag entry : flagArray) {
if (switcher == null || switcher.currentSubtypeContainsExtraValueKey(entry.mName))
flags |= entry.mValue;
}
return flags;
}
static { static {
Utils.loadNativeLibrary(); Utils.loadNativeLibrary();
} }
@ -179,6 +164,7 @@ public class BinaryDictionary extends Dictionary {
sInstance.mDicTypeId = dicTypeId; sInstance.mDicTypeId = dicTypeId;
} }
} }
sInstance.mFlags = Flag.initFlags(ALL_FLAGS, context, SubtypeSwitcher.getInstance());
return sInstance; return sInstance;
} }

View File

@ -0,0 +1,64 @@
/*
* Copyright (C) 2011 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License"); you may not
* use this file except in compliance with the License. You may obtain a copy of
* the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
* WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
* License for the specific language governing permissions and limitations under
* the License.
*/
package com.android.inputmethod.latin;
import android.content.Context;
import android.content.res.Resources;
public class Flag {
public final String mName;
public final int mResource;
public final int mMask;
public final int mSource;
static private final int SOURCE_CONFIG = 1;
static private final int SOURCE_EXTRAVALUE = 2;
public Flag(int resourceId, int mask) {
mName = null;
mResource = resourceId;
mSource = SOURCE_CONFIG;
mMask = mask;
}
public Flag(String name, int mask) {
mName = name;
mResource = 0;
mSource = SOURCE_EXTRAVALUE;
mMask = mask;
}
// If context/switcher are null, set all related flags in flagArray to on.
public static int initFlags(Flag[] flagArray, Context context, SubtypeSwitcher switcher) {
int flags = 0;
final Resources res = null == context ? null : context.getResources();
for (Flag entry : flagArray) {
switch (entry.mSource) {
case Flag.SOURCE_CONFIG:
if (res == null || res.getBoolean(entry.mResource))
flags |= entry.mMask;
break;
case Flag.SOURCE_EXTRAVALUE:
if (switcher == null ||
switcher.currentSubtypeContainsExtraValueKey(entry.mName))
flags |= entry.mMask;
break;
}
}
return flags;
}
}

View File

@ -112,10 +112,10 @@ public class Suggest implements Dictionary.WordCallback {
dictionaryResId)); dictionaryResId));
} }
/* package for test */ Suggest(File dictionary, long startOffset, long length, /* package for test */ Suggest(Context context, File dictionary, long startOffset, long length,
BinaryDictionary.Flag[] flagArray) { Flag[] flagArray) {
init(null, BinaryDictionary.initDictionary(dictionary, startOffset, length, DIC_MAIN, init(null, BinaryDictionary.initDictionary(context, dictionary, startOffset, length,
flagArray)); DIC_MAIN, flagArray));
} }
private void init(Context context, BinaryDictionary mainDict) { private void init(Context context, BinaryDictionary mainDict) {

View File

@ -43,7 +43,7 @@ public class SuggestHelper {
protected SuggestHelper(Context context, File dictionaryPath, long startOffset, long length, protected SuggestHelper(Context context, File dictionaryPath, long startOffset, long length,
KeyboardId keyboardId) { KeyboardId keyboardId) {
mSuggest = new Suggest(dictionaryPath, startOffset, length, null); mSuggest = new Suggest(context, dictionaryPath, startOffset, length, null);
mKeyboard = new LatinKeyboard(context, keyboardId); mKeyboard = new LatinKeyboard(context, keyboardId);
mKeyDetector = new KeyDetector(); mKeyDetector = new KeyDetector();
init(); init();