| /* |
| * 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(mTargetActivity); |
| |
| 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) { |
| } |
| } |
| |
| } |