blob: f2919988598ab32a7d5b17e24df5ab64017cfe1d [file] [log] [blame]
// Copyright 2010-2015, Google Inc.
// All rights reserved.
//
// Redistribution and use in source and binary forms, with or without
// modification, are permitted provided that the following conditions are
// met:
//
// * Redistributions of source code must retain the above copyright
// notice, this list of conditions and the following disclaimer.
// * Redistributions in binary form must reproduce the above
// copyright notice, this list of conditions and the following disclaimer
// in the documentation and/or other materials provided with the
// distribution.
// * Neither the name of Google Inc. nor the names of its
// contributors may be used to endorse or promote products derived from
// this software without specific prior written permission.
//
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
package org.mozc.android.inputmethod.japanese.testing;
import org.mozc.android.inputmethod.japanese.keyboard.Keyboard;
import org.mozc.android.inputmethod.japanese.keyboard.KeyboardView;
import android.app.Activity;
import android.app.Instrumentation;
import android.view.MotionEvent;
import android.view.View;
/**
* Utility class to run some methods on the UI thread.
* We should consider to use {@link android.test.UiThreadTest} annotation instead.
*
* TODO(hidehiko): Replace MainThreadRunner's methods by UiThreadTest, and deprecate this class.
*
*/
public class MainThreadRunner {
private static class OnTouchEventRunner implements Runnable {
private final View view;
private final MotionEvent event;
// A field to keep the result of onTouchEvent.
volatile boolean result;
volatile Throwable throwable = null;
OnTouchEventRunner(View view, MotionEvent event) {
this.view = view;
this.event = event;
}
@Override
public void run() {
try {
result = view.onTouchEvent(event);
} catch (Throwable e) {
// Catch a throwable here (Exception or Error is insufficient).
// If not, this thread (UI-thread. Non-test main thread) stops and
// the test process itself also stops.
result = false;
throwable = e;
}
}
}
private final Instrumentation instrumentation;
public MainThreadRunner(Instrumentation instrumentation) {
if (instrumentation == null) {
throw new NullPointerException("instrumentation is null.");
}
this.instrumentation = instrumentation;
}
public void runOnMainSync(Runnable runner) {
instrumentation.runOnMainSync(runner);
}
public void setContentView(final Activity activity, final View view) {
runOnMainSync(new Runnable() {
@Override
public void run() {
activity.setContentView(view);
}
});
}
public void layout(final View view,
final int left, final int top, final int right, final int bottom) {
runOnMainSync(new Runnable() {
@Override
public void run() {
view.layout(left, top, right, bottom);
}
});
}
public boolean onTouchEvent(View view, MotionEvent event) {
OnTouchEventRunner runner = new OnTouchEventRunner(view, event);
runOnMainSync(runner);
if (runner.throwable != null) {
throw new AssertionError(runner.throwable);
}
return runner.result;
}
public void setKeyboard(final KeyboardView view, final Keyboard keyboard) {
runOnMainSync(new Runnable() {
@Override
public void run() {
view.setKeyboard(keyboard);
}
});
}
}