blob: 0dbd832cbd1a6a4f5dc6fff1b51f853169d4ecf2 [file] [log] [blame]
/*
* Copyright (C) 2008 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.app.cts;
import android.app.Activity;
import android.app.SearchManager;
import android.content.ComponentName;
import android.content.Context;
import android.cts.util.CTSResult;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.util.Log;
public class SearchManagerStubActivity extends Activity {
private static final String TAG = "SearchManagerStubActivity";
public static final String TEST_STOP_SEARCH = "stopSearch";
public static final String TEST_ON_DISMISSLISTENER = "setOnDismissListener";
public static final String TEST_ON_CANCELLISTENER = "setOnCancelListener";
private SearchManager mSearchManager;
private ComponentName mComponentName;
private static CTSResult sCTSResult;
private boolean mDismissCalled;
private boolean mCancelCalled;
public static void setCTSResult(CTSResult result) {
sCTSResult = result;
}
@Override
public void onCreate(Bundle icicle) {
super.onCreate(icicle);
mSearchManager = (SearchManager) getSystemService(Context.SEARCH_SERVICE);
mComponentName = getComponentName();
String action = getIntent().getAction();
if (action.equals(TEST_STOP_SEARCH)) {
testStopSearch();
} else if (action.equals(TEST_ON_DISMISSLISTENER)) {
testOnDismissListener();
} else if (action.equals(TEST_ON_CANCELLISTENER)) {
testOnCancelListener();
}
}
private void testOnCancelListener() {
mCancelCalled = false;
mSearchManager.setOnCancelListener(new SearchManager.OnCancelListener() {
@Override
public void onCancel() {
mCancelCalled = true;
}
});
new TestStepHandler() {
@Override
public boolean doStep(int step) throws FailException {
switch (step) {
case 1:
startSearch("test", false, mComponentName, null, false);
return false;
case 2:
assertFalse("cancel called", mCancelCalled);
stopSearch();
return false;
case 3:
assertTrue("cancel not called", mCancelCalled);
pass();
return true;
default:
throw new IllegalArgumentException("Bad step " + step);
}
}
}.start();
}
private void testOnDismissListener() {
mDismissCalled = false;
mSearchManager.setOnDismissListener(new SearchManager.OnDismissListener() {
public void onDismiss() {
mDismissCalled = true;
}
});
new TestStepHandler() {
@Override
public boolean doStep(int step) throws FailException {
switch (step) {
case 1:
startSearch("test", false, mComponentName, null, false);
return false;
case 2:
if (mDismissCalled) {
throw new FailException("dismiss called");
} else {
stopSearch();
}
return false;
case 3:
if (mDismissCalled) {
pass();
} else {
throw new FailException("dismiss not called");
}
return true;
default:
throw new IllegalArgumentException("Bad step " + step);
}
}
}.start();
}
private void testStopSearch() {
new TestStepHandler() {
@Override
public boolean doStep(int step) throws FailException {
switch (step) {
case 1:
startSearch("test", false, mComponentName, null, false);
return false;
case 2:
assertVisible();
stopSearch();
return false;
case 3:
assertInVisible();
pass();
return true;
default:
throw new IllegalArgumentException("Bad step " + step);
}
}
}.start();
}
private void fail(Exception ex) {
Log.e(TAG, "test failed", ex);
sCTSResult.setResult(CTSResult.RESULT_FAIL);
finish();
}
private void pass() {
sCTSResult.setResult(CTSResult.RESULT_OK);
finish();
}
private void assertInVisible() throws FailException {
if (isVisible()) {
throw new FailException();
}
}
private void assertVisible() throws FailException {
if (!isVisible()) {
throw new FailException();
}
}
private void assertFalse(String message, boolean value) throws FailException {
assertTrue(message, !value);
}
private void assertTrue(String message, boolean value) throws FailException {
if (!value) {
throw new FailException(message);
}
}
private void startSearch(String initialQuery, boolean selectInitialQuery,
ComponentName launchActivity, Bundle appSearchData, boolean globalSearch) {
mSearchManager.startSearch(initialQuery, selectInitialQuery, launchActivity, appSearchData,
globalSearch);
}
private void stopSearch() {
mSearchManager.stopSearch();
}
private boolean isVisible() {
return mSearchManager.isVisible();
}
private abstract class TestStepHandler extends Handler {
public void start() {
sendEmptyMessage(1);
}
@Override
public void handleMessage(Message msg) {
try {
if (!doStep(msg.what)) {
sendEmptyMessage(msg.what + 1);
}
} catch (FailException ex) {
fail(ex);
}
}
/**
* Performs one step of the test.
*
* @param step The 1-based number of the step to perform.
* @return {@code true} if this was the last step.
* @throws FailException If the test failed.
*/
protected abstract boolean doStep(int step) throws FailException;
}
private static class FailException extends Exception {
private static final long serialVersionUID = 1L;
public FailException() {
super();
}
public FailException(String detailMessage) {
super(detailMessage);
}
}
}