aboutsummaryrefslogtreecommitdiffstats
path: root/tests/src/com/android/inputmethod/latin/InputTestsBase.java
diff options
context:
space:
mode:
authorJean Chalard <jchalard@google.com>2013-04-03 19:33:06 -0700
committerAndroid Git Automerger <android-git-automerger@android.com>2013-04-03 19:33:06 -0700
commitd2a0c6145c8051042527c32b5f63870534d8f14f (patch)
treebc9e34069b2841226685daa99027cd0143298b62 /tests/src/com/android/inputmethod/latin/InputTestsBase.java
parentc840ec9eb7b905f50eee67f9b9d8154a45d2283a (diff)
parentb4e2a3bb4ededabce573e90fe0d82dda0fb2d8cb (diff)
downloadlatinime-d2a0c6145c8051042527c32b5f63870534d8f14f.tar.gz
latinime-d2a0c6145c8051042527c32b5f63870534d8f14f.tar.xz
latinime-d2a0c6145c8051042527c32b5f63870534d8f14f.zip
am b4e2a3bb: am 868805ae: Merge "Change which backdoor the tests goes through"
* commit 'b4e2a3bb4ededabce573e90fe0d82dda0fb2d8cb': Change which backdoor the tests goes through
Diffstat (limited to 'tests/src/com/android/inputmethod/latin/InputTestsBase.java')
-rw-r--r--tests/src/com/android/inputmethod/latin/InputTestsBase.java20
1 files changed, 12 insertions, 8 deletions
diff --git a/tests/src/com/android/inputmethod/latin/InputTestsBase.java b/tests/src/com/android/inputmethod/latin/InputTestsBase.java
index d0ab841ae..04e1f932a 100644
--- a/tests/src/com/android/inputmethod/latin/InputTestsBase.java
+++ b/tests/src/com/android/inputmethod/latin/InputTestsBase.java
@@ -181,17 +181,21 @@ public class InputTestsBase extends ServiceTestCase<LatinIME> {
// a message that calls it instead of calling it directly.
Looper.loop();
- // Once #quit() has been called, the message queue has an "mQuiting" field that prevents
- // any subsequent post in this queue. However the queue itself is still fully functional!
- // If we have a way of resetting "queue.mQuiting" then we can continue using it as normal,
- // coming back to this method to run the messages.
+ // Once #quit() has been called, the looper is not functional any more (it used to be,
+ // but now it SIGSEGV's if it's used again).
+ // It won't accept creating a new looper for this thread and switching to it...
+ // ...unless we can trick it into throwing out the old looper and believing it hasn't
+ // been initialized before.
MessageQueue queue = Looper.myQueue();
try {
- // However there is no way of doing it externally, and mQuiting is private.
+ // However there is no way of doing it externally, and the static ThreadLocal
+ // field into which it's stored is private.
// So... get out the big guns.
- java.lang.reflect.Field f = MessageQueue.class.getDeclaredField("mQuiting");
- f.setAccessible(true); // What do you mean "private"?
- f.setBoolean(queue, false);
+ java.lang.reflect.Field f = Looper.class.getDeclaredField("sThreadLocal");
+ f.setAccessible(true); // private lolwut
+ final ThreadLocal<Looper> a = (ThreadLocal<Looper>) f.get(looper);
+ a.set(null);
+ looper.prepare();
} catch (NoSuchFieldException e) {
throw new RuntimeException(e);
} catch (IllegalAccessException e) {