/*
* Copyright (C) 2007 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 com.android.imftest.samples;
import android.app.Activity;
import android.app.KeyguardManager;
import android.content.Context;
import android.content.Intent;
import android.content.res.Configuration;
import android.os.SystemClock;
import android.test.InstrumentationTestCase;
import android.view.KeyEvent;
import android.view.View;
import android.view.WindowManager;
import android.view.inputmethod.InputMethodManager;
import com.android.imftest.R;
public abstract class ImfBaseTestCase<T extends Activity> extends InstrumentationTestCase {
/*
* The amount of time we are willing to wait for the IME to appear after a user action
* before we give up and fail the test.
*/
public final long WAIT_FOR_IME = 5000;
/*
* Unfortunately there is now way for us to know how tall the IME is,
* so we have to hard code a minimum and maximum value.
*/
public final int IME_MIN_HEIGHT = 150;
public final int IME_MAX_HEIGHT = 300;
protected InputMethodManager mImm;
protected T mTargetActivity;
protected boolean mExpectAutoPop;
private Class<T> mTargetActivityClass;
public ImfBaseTestCase(Class<T> activityClass) {
mTargetActivityClass = activityClass;
}
@Override
public void setUp() throws Exception {
super.setUp();
final String packageName = getInstrumentation().getTargetContext().getPackageName();
Intent intent = new Intent(Intent.ACTION_MAIN);
intent.addFlags(Intent.FLAG_ACTIVITY_MULTIPLE_TASK);
mTargetActivity = launchActivityWithIntent(packageName, mTargetActivityClass, intent);
// expect ime to auto pop up if device has no hard keyboard
int keyboardType = mTargetActivity.getResources().getConfiguration().keyboard;
mExpectAutoPop = (keyboardType == Configuration.KEYBOARD_NOKEYS ||
keyboardType == Configuration.KEYBOARD_UNDEFINED);
mImm = InputMethodManager.getInstance();
KeyguardManager keyguardManager =
(KeyguardManager) getInstrumentation().getContext().getSystemService(
Context.KEYGUARD_SERVICE);
keyguardManager.newKeyguardLock("imftest").disableKeyguard();
}
// Utility test methods
public void verifyEditTextAdjustment(final View editText, int rootViewHeight) {
int[] origLocation = new int[2];
int[] newLocation = new int[2];
// Tell the keyboard to go away.
mImm.hideSoftInputFromWindow(editText.getWindowToken(), 0);
// Bring the target EditText into focus.
mTargetActivity.runOnUiThread(new Runnable() {
public void run() {
editText.requestFocus();
}
});
// Get the original location of the EditText.
editText.getLocationOnScreen(origLocation);
// Tap the EditText to bring up the IME.
sendKeys(KeyEvent.KEYCODE_DPAD_CENTER);
// Wait until the EditText pops above the IME or until we hit the timeout.
editText.getLocationOnScreen(newLocation);
long timeoutTime = SystemClock.uptimeMillis() + WAIT_FOR_IME;
while (newLocation[1] > rootViewHeight - IME_MIN_HEIGHT && SystemClock.uptimeMillis() < timeoutTime) {
editText.getLocationOnScreen(newLocation);
pause(100);
}
assertTrue(newLocation[1] <= rootViewHeight - IME_MIN_HEIGHT);
// Tell the keyboard to go away.
mImm.hideSoftInputFromWindow(editText.getWindowToken(), 0);
}
public void destructiveCheckImeInitialState(View rootView, View servedView) {
int windowSoftInputMode = mTargetActivity.getWindow().getAttributes().softInputMode;
int adjustMode = windowSoftInputMode & WindowManager.LayoutParams.SOFT_INPUT_MASK_ADJUST;
if (mExpectAutoPop && adjustMode == WindowManager.LayoutParams.SOFT_INPUT_ADJUST_RESIZE) {
assertTrue(destructiveCheckImeUp(rootView, servedView));
} else {
assertFalse(destructiveCheckImeUp(rootView, servedView));
}
}
public boolean destructiveCheckImeUp(View rootView, View servedView) {
int origHeight;
int newHeight;
origHeight = rootView.getHeight();
// Tell the keyboard to go away.
mImm.hideSoftInputFromWindow(servedView.getWindowToken(), 0);
// Give it five seconds to adjust
newHeight = rootView.getHeight();
long timeoutTime = SystemClock.uptimeMillis() + WAIT_FOR_IME;
while (Math.abs(newHeight - origHeight) < IME_MIN_HEIGHT && SystemClock.uptimeMillis() < timeoutTime) {
newHeight = rootView.getHeight();
}
return (Math.abs(origHeight - newHeight) >= IME_MIN_HEIGHT);
}
void pause(int millis) {
try {
Thread.sleep(millis);
} catch (InterruptedException e) {
}
}
}