aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorTadashi G. Takaoka <takaoka@google.com>2014-02-10 12:54:45 +0900
committerTadashi G. Takaoka <takaoka@google.com>2014-02-10 14:38:53 +0900
commitbd9887a57485c602e66a8f0eaebe40313ffa89cd (patch)
tree15e999d9c370257fbd13c8e640aa0437d93b09ce
parente592c1b291b9eba807b0ee888a3944555d296877 (diff)
downloadlatinime-bd9887a57485c602e66a8f0eaebe40313ffa89cd.tar.gz
latinime-bd9887a57485c602e66a8f0eaebe40313ffa89cd.tar.xz
latinime-bd9887a57485c602e66a8f0eaebe40313ffa89cd.zip
Fix possible NPE while finding device override value from resource
Bug: 12949735 Change-Id: Iffda08db413b3b3d338ab9bf625bb0968c2e48dd
-rw-r--r--java/res/values-land/keyboard-heights.xml2
-rw-r--r--java/res/values/keyboard-heights.xml2
-rw-r--r--java/res/values/keypress-vibration-durations.xml2
-rw-r--r--java/res/values/keypress-volumes.xml2
-rw-r--r--java/res/values/phantom-sudden-move-event-device-list.xml2
-rw-r--r--java/src/com/android/inputmethod/keyboard/PointerTracker.java4
-rw-r--r--java/src/com/android/inputmethod/latin/settings/Settings.java16
-rw-r--r--java/src/com/android/inputmethod/latin/utils/ResourceUtils.java48
-rw-r--r--tests/src/com/android/inputmethod/latin/utils/ResourceUtilsTests.java33
9 files changed, 21 insertions, 90 deletions
diff --git a/java/res/values-land/keyboard-heights.xml b/java/res/values-land/keyboard-heights.xml
index 670be3329..d57f96be3 100644
--- a/java/res/values-land/keyboard-heights.xml
+++ b/java/res/values-land/keyboard-heights.xml
@@ -33,7 +33,5 @@
<!-- Preferable keyboard height in absolute scale: 45.0mm -->
<!-- Xoom -->
<item>HARDWARE=stingray,265.4378</item>
- <!-- Default value for unknown device: empty string -->
- <item>,</item>
</string-array>
</resources>
diff --git a/java/res/values/keyboard-heights.xml b/java/res/values/keyboard-heights.xml
index c651a89b3..12dd51d9d 100644
--- a/java/res/values/keyboard-heights.xml
+++ b/java/res/values/keyboard-heights.xml
@@ -33,7 +33,5 @@
<!-- Preferable keyboard height in absolute scale: 48.0mm -->
<!-- Xoom -->
<item>HARDWARE=stingray,283.1337</item>
- <!-- Default value for unknown device: empty string -->
- <item>,</item>
</string-array>
</resources>
diff --git a/java/res/values/keypress-vibration-durations.xml b/java/res/values/keypress-vibration-durations.xml
index cde4e4447..032b5fd91 100644
--- a/java/res/values/keypress-vibration-durations.xml
+++ b/java/res/values/keypress-vibration-durations.xml
@@ -59,7 +59,5 @@
<item>MODEL=XT1035:MANUFACTURER=motorola,18</item>
<!-- Sony Xperia Z, Z Ultra -->
<item>MODEL=C6603|C6806:MANUFACTURER=Sony,35</item>
- <!-- Default value for unknown device. The negative value means system default. -->
- <item>,-1</item>
</string-array>
</resources>
diff --git a/java/res/values/keypress-volumes.xml b/java/res/values/keypress-volumes.xml
index d359055c2..074581d00 100644
--- a/java/res/values/keypress-volumes.xml
+++ b/java/res/values/keypress-volumes.xml
@@ -26,7 +26,5 @@
<item>HARDWARE=grouper,0.3f</item>
<item>HARDWARE=mako,0.3f</item>
<item>HARDWARE=manta,0.2f</item>
- <!-- Default value for unknown device. The negative value means system default. -->
- <item>,-1.0f</item>
</string-array>
</resources>
diff --git a/java/res/values/phantom-sudden-move-event-device-list.xml b/java/res/values/phantom-sudden-move-event-device-list.xml
index 53002b31e..4f91cd389 100644
--- a/java/res/values/phantom-sudden-move-event-device-list.xml
+++ b/java/res/values/phantom-sudden-move-event-device-list.xml
@@ -23,7 +23,5 @@
See {@link com.android.inputmethod.keyboard.PointerTracker}. -->
<!-- Xoom -->
<item>HARDWARE=stingray,true</item>
- <!-- Default value for unknown device -->
- <item>,false</item>
</string-array>
</resources>
diff --git a/java/src/com/android/inputmethod/keyboard/PointerTracker.java b/java/src/com/android/inputmethod/keyboard/PointerTracker.java
index 093155049..19aef140a 100644
--- a/java/src/com/android/inputmethod/keyboard/PointerTracker.java
+++ b/java/src/com/android/inputmethod/keyboard/PointerTracker.java
@@ -215,8 +215,8 @@ public final class PointerTracker implements PointerTrackerQueue.Element,
final Resources res = mainKeyboardViewAttr.getResources();
sNeedsPhantomSuddenMoveEventHack = Boolean.parseBoolean(
- ResourceUtils.getDeviceOverrideValue(
- res, R.array.phantom_sudden_move_event_device_list));
+ ResourceUtils.getDeviceOverrideValue(res,
+ R.array.phantom_sudden_move_event_device_list, Boolean.FALSE.toString()));
BogusMoveEventDetector.init(res);
sTimerProxy = timerProxy;
diff --git a/java/src/com/android/inputmethod/latin/settings/Settings.java b/java/src/com/android/inputmethod/latin/settings/Settings.java
index f0f7de7d4..45c5b733f 100644
--- a/java/src/com/android/inputmethod/latin/settings/Settings.java
+++ b/java/src/com/android/inputmethod/latin/settings/Settings.java
@@ -310,9 +310,13 @@ public final class Settings implements SharedPreferences.OnSharedPreferenceChang
: readDefaultKeypressSoundVolume(res);
}
+ // Default keypress sound volume for unknown devices.
+ // The negative value means system default.
+ private static final String DEFAULT_KEYPRESS_SOUND_VOLUME = Float.toString(-1.0f);
+
public static float readDefaultKeypressSoundVolume(final Resources res) {
- return Float.parseFloat(
- ResourceUtils.getDeviceOverrideValue(res, R.array.keypress_volumes));
+ return Float.parseFloat(ResourceUtils.getDeviceOverrideValue(res,
+ R.array.keypress_volumes, DEFAULT_KEYPRESS_SOUND_VOLUME));
}
public static int readKeyLongpressTimeout(final SharedPreferences prefs,
@@ -335,9 +339,13 @@ public final class Settings implements SharedPreferences.OnSharedPreferenceChang
: readDefaultKeypressVibrationDuration(res);
}
+ // Default keypress vibration duration for unknown devices.
+ // The negative value means system default.
+ private static final String DEFAULT_KEYPRESS_VIBRATION_DURATION = Integer.toString(-1);
+
public static int readDefaultKeypressVibrationDuration(final Resources res) {
- return Integer.parseInt(
- ResourceUtils.getDeviceOverrideValue(res, R.array.keypress_vibration_durations));
+ return Integer.parseInt(ResourceUtils.getDeviceOverrideValue(res,
+ R.array.keypress_vibration_durations, DEFAULT_KEYPRESS_VIBRATION_DURATION));
}
public static boolean readUsabilityStudyMode(final SharedPreferences prefs) {
diff --git a/java/src/com/android/inputmethod/latin/utils/ResourceUtils.java b/java/src/com/android/inputmethod/latin/utils/ResourceUtils.java
index 3a1c24c74..49f4929b4 100644
--- a/java/src/com/android/inputmethod/latin/utils/ResourceUtils.java
+++ b/java/src/com/android/inputmethod/latin/utils/ResourceUtils.java
@@ -67,7 +67,8 @@ public final class ResourceUtils {
sBuildKeyValuesDebugString = "[" + TextUtils.join(" ", keyValuePairs) + "]";
}
- public static String getDeviceOverrideValue(final Resources res, final int overrideResId) {
+ public static String getDeviceOverrideValue(final Resources res, final int overrideResId,
+ final String defaultValue) {
final int orientation = res.getConfiguration().orientation;
final String key = overrideResId + "-" + orientation;
if (sDeviceOverrideValueMap.containsKey(key)) {
@@ -86,23 +87,6 @@ public final class ResourceUtils {
return overrideValue;
}
- String defaultValue = null;
- try {
- defaultValue = findDefaultConstant(overrideArray);
- // The defaultValue might be an empty string.
- if (defaultValue == null) {
- Log.w(TAG, "Couldn't find override value nor default value:"
- + " resource="+ res.getResourceEntryName(overrideResId)
- + " build=" + sBuildKeyValuesDebugString);
- } else {
- Log.i(TAG, "Found default value:"
- + " resource="+ res.getResourceEntryName(overrideResId)
- + " build=" + sBuildKeyValuesDebugString
- + " default=" + defaultValue);
- }
- } catch (final DeviceOverridePatternSyntaxError e) {
- Log.w(TAG, "Syntax error, ignored", e);
- }
sDeviceOverrideValueMap.put(key, defaultValue);
return defaultValue;
}
@@ -152,8 +136,7 @@ public final class ResourceUtils {
}
final String condition = conditionConstant.substring(0, posComma);
if (condition.isEmpty()) {
- // Default condition. The default condition should be searched by
- // {@link #findConstantForDefault(String[])}.
+ Log.w(TAG, "Array element has no condition: " + conditionConstant);
continue;
}
try {
@@ -199,24 +182,6 @@ public final class ResourceUtils {
return matchedAll;
}
- @UsedForTesting
- static String findDefaultConstant(final String[] conditionConstantArray)
- throws DeviceOverridePatternSyntaxError {
- if (conditionConstantArray == null) {
- return null;
- }
- for (final String condition : conditionConstantArray) {
- final int posComma = condition.indexOf(',');
- if (posComma < 0) {
- throw new DeviceOverridePatternSyntaxError("Array element has no comma", condition);
- }
- if (posComma == 0) { // condition is empty.
- return condition.substring(posComma + 1);
- }
- }
- return null;
- }
-
public static int getDefaultKeyboardWidth(final Resources res) {
final DisplayMetrics dm = res.getDisplayMetrics();
return dm.widthPixels;
@@ -224,12 +189,13 @@ public final class ResourceUtils {
public static int getDefaultKeyboardHeight(final Resources res) {
final DisplayMetrics dm = res.getDisplayMetrics();
- final String keyboardHeightString = getDeviceOverrideValue(res, R.array.keyboard_heights);
+ final String keyboardHeightInDp = getDeviceOverrideValue(
+ res, R.array.keyboard_heights, null /* defaultValue */);
final float keyboardHeight;
- if (TextUtils.isEmpty(keyboardHeightString)) {
+ if (TextUtils.isEmpty(keyboardHeightInDp)) {
keyboardHeight = res.getDimension(R.dimen.config_default_keyboard_height);
} else {
- keyboardHeight = Float.parseFloat(keyboardHeightString) * dm.density;
+ keyboardHeight = Float.parseFloat(keyboardHeightInDp) * dm.density;
}
final float maxKeyboardHeight = res.getFraction(
R.fraction.config_max_keyboard_height, dm.heightPixels, dm.heightPixels);
diff --git a/tests/src/com/android/inputmethod/latin/utils/ResourceUtilsTests.java b/tests/src/com/android/inputmethod/latin/utils/ResourceUtilsTests.java
index 1ae22e307..3eb704093 100644
--- a/tests/src/com/android/inputmethod/latin/utils/ResourceUtilsTests.java
+++ b/tests/src/com/android/inputmethod/latin/utils/ResourceUtilsTests.java
@@ -19,43 +19,10 @@ package com.android.inputmethod.latin.utils;
import android.test.AndroidTestCase;
import android.test.suitebuilder.annotation.SmallTest;
-import com.android.inputmethod.latin.utils.ResourceUtils.DeviceOverridePatternSyntaxError;
-
import java.util.HashMap;
@SmallTest
public class ResourceUtilsTests extends AndroidTestCase {
- public void testFindDefaultConstant() {
- final String[] nullArray = null;
- final String[] emptyArray = {};
- final String[] array = {
- "HARDWARE=grouper,0.3",
- "HARDWARE=mako,0.4",
- ",defaultValue1",
- "HARDWARE=manta,0.2",
- ",defaultValue2",
- };
-
- try {
- assertNull(ResourceUtils.findDefaultConstant(nullArray));
- assertNull(ResourceUtils.findDefaultConstant(emptyArray));
- assertEquals(ResourceUtils.findDefaultConstant(array), "defaultValue1");
- } catch (final DeviceOverridePatternSyntaxError e) {
- fail(e.getMessage());
- }
-
- final String[] errorArray = {
- "HARDWARE=grouper,0.3",
- "no_comma"
- };
- try {
- final String defaultValue = ResourceUtils.findDefaultConstant(errorArray);
- fail("exception should be thrown: defaultValue=" + defaultValue);
- } catch (final DeviceOverridePatternSyntaxError e) {
- assertEquals("Array element has no comma: no_comma", e.getMessage());
- }
- }
-
public void testFindConstantForKeyValuePairsSimple() {
final HashMap<String,String> anyKeyValue = CollectionUtils.newHashMap();
anyKeyValue.put("anyKey", "anyValue");