summaryrefslogtreecommitdiffstats
path: root/core/tests
diff options
context:
space:
mode:
authorYohei Yukawa <yukawa@google.com>2014-03-03 15:38:18 +0900
committerYohei Yukawa <yukawa@google.com>2014-03-06 11:25:57 +0900
commitf06569561fe1c6e898debf8bb9f37331a9f87323 (patch)
treec9c391d4d0ac5987eb33bd5e47be4c03a2ba0cbb /core/tests
parent4b131046aa5685112b8f198a989daef13279cadb (diff)
downloadframeworks_base-f06569561fe1c6e898debf8bb9f37331a9f87323.zip
frameworks_base-f06569561fe1c6e898debf8bb9f37331a9f87323.tar.gz
frameworks_base-f06569561fe1c6e898debf8bb9f37331a9f87323.tar.bz2
Introduce InputMethodSubtypeArray for memory efficient IPCs
This CL introduces InputMethodSubtypeArray which compresses multiple instances of InputMethodSubtype to reduce the risk of TransactionTooLargeException during IPCs. There are some IMEs which rapidly adding new subtypes into their supported language list. One problem here is that each instance of InputMethodInfo internally owns the list of supported subtypes. Basically it requires additional 200 ~ 300 bytes for each subtype when InputMethodInfo is transffered via IPCs. We should keep the size less than 100 KB in typical scenario. With this CL, the list of InputMethodSubtype is marshalled with GZIP compression. Approximately one InputMethodInfo is marshalled within 10 KB even when it has 100 subtypes. No negative performance impact is observed so far. The cost of decompression seems to be compensated by another optimization in this CL. Actually marshalling cost is reduced with this CL by caching the compressed data on demand. BUG: 12954290 Change-Id: Ibb2940fcc02f3b3b51ba6bbe127d646fd7de7c45
Diffstat (limited to 'core/tests')
-rwxr-xr-xcore/tests/inputmethodtests/run_core_inputmethod_test.sh2
-rw-r--r--core/tests/inputmethodtests/src/android/os/InputMethodSubtypeArrayTest.java77
2 files changed, 78 insertions, 1 deletions
diff --git a/core/tests/inputmethodtests/run_core_inputmethod_test.sh b/core/tests/inputmethodtests/run_core_inputmethod_test.sh
index 5e123ec..b0b119b 100755
--- a/core/tests/inputmethodtests/run_core_inputmethod_test.sh
+++ b/core/tests/inputmethodtests/run_core_inputmethod_test.sh
@@ -21,4 +21,4 @@ if [[ $rebuild == true ]]; then
$COMMAND
fi
-adb shell am instrument -w -e class android.os.InputMethodTest com.android.frameworks.coretests.inputmethod/android.test.InstrumentationTestRunner
+adb shell am instrument -w -e class android.os.InputMethodTest,android.os.InputMethodSubtypeArrayTest com.android.frameworks.coretests.inputmethod/android.test.InstrumentationTestRunner
diff --git a/core/tests/inputmethodtests/src/android/os/InputMethodSubtypeArrayTest.java b/core/tests/inputmethodtests/src/android/os/InputMethodSubtypeArrayTest.java
new file mode 100644
index 0000000..1e0a919
--- /dev/null
+++ b/core/tests/inputmethodtests/src/android/os/InputMethodSubtypeArrayTest.java
@@ -0,0 +1,77 @@
+/*
+ * Copyright (C) 2014 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 android.os;
+
+import android.test.InstrumentationTestCase;
+import android.test.suitebuilder.annotation.SmallTest;
+import android.view.inputmethod.InputMethodSubtype;
+import android.view.inputmethod.InputMethodSubtypeArray;
+import android.view.inputmethod.InputMethodSubtype.InputMethodSubtypeBuilder;
+
+import java.util.ArrayList;
+
+public class InputMethodSubtypeArrayTest extends InstrumentationTestCase {
+ @SmallTest
+ public void testInstanciate() throws Exception {
+ final ArrayList<InputMethodSubtype> subtypes = new ArrayList<InputMethodSubtype>();
+ subtypes.add(createDummySubtype(0, "en_US"));
+ subtypes.add(createDummySubtype(1, "en_US"));
+ subtypes.add(createDummySubtype(2, "ja_JP"));
+
+ final InputMethodSubtypeArray array = new InputMethodSubtypeArray(subtypes);
+ assertEquals(subtypes.size(), array.getCount());
+ assertEquals(subtypes.get(0), array.get(0));
+ assertEquals(subtypes.get(1), array.get(1));
+ assertEquals(subtypes.get(2), array.get(2));
+
+ final InputMethodSubtypeArray clonedArray = cloneViaParcel(array);
+ assertEquals(subtypes.size(), clonedArray.getCount());
+ assertEquals(subtypes.get(0), clonedArray.get(0));
+ assertEquals(subtypes.get(1), clonedArray.get(1));
+ assertEquals(subtypes.get(2), clonedArray.get(2));
+
+ final InputMethodSubtypeArray clonedClonedArray = cloneViaParcel(clonedArray);
+ assertEquals(clonedArray.getCount(), clonedClonedArray.getCount());
+ assertEquals(clonedArray.get(0), clonedClonedArray.get(0));
+ assertEquals(clonedArray.get(1), clonedClonedArray.get(1));
+ assertEquals(clonedArray.get(2), clonedClonedArray.get(2));
+ }
+
+ InputMethodSubtypeArray cloneViaParcel(final InputMethodSubtypeArray original) {
+ Parcel parcel = null;
+ try {
+ parcel = Parcel.obtain();
+ original.writeToParcel(parcel);
+ parcel.setDataPosition(0);
+ return new InputMethodSubtypeArray(parcel);
+ } finally {
+ if (parcel != null) {
+ parcel.recycle();
+ }
+ }
+ }
+
+ private static InputMethodSubtype createDummySubtype(final int id, final String locale) {
+ final InputMethodSubtypeBuilder builder = new InputMethodSubtypeBuilder();
+ return builder.setSubtypeNameResId(0)
+ .setSubtypeIconResId(0)
+ .setSubtypeId(id)
+ .setSubtypeLocale(locale)
+ .setIsAsciiCapable(true)
+ .build();
+ }
+}