1 /* 2 * Copyright (C) 2016 The Android Open Source Project 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); 5 * you may not use this file except in compliance with the License. 6 * You may obtain a copy of the License at 7 * 8 * http://www.apache.org/licenses/LICENSE-2.0 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 * See the License for the specific language governing permissions and 14 * limitations under the License. 15 */ 16 17 package android.text.method.cts; 18 19 import static org.junit.Assert.assertFalse; 20 import static org.junit.Assert.assertTrue; 21 import static org.mockito.AdditionalAnswers.returnsFirstArg; 22 import static org.mockito.Mockito.any; 23 import static org.mockito.Mockito.anyBoolean; 24 import static org.mockito.Mockito.anyInt; 25 import static org.mockito.Mockito.atLeastOnce; 26 import static org.mockito.Mockito.mock; 27 import static org.mockito.Mockito.reset; 28 import static org.mockito.Mockito.verify; 29 import static org.mockito.Mockito.when; 30 31 import android.app.Instrumentation; 32 import android.support.test.InstrumentationRegistry; 33 import android.support.test.filters.MediumTest; 34 import android.support.test.rule.ActivityTestRule; 35 import android.support.test.runner.AndroidJUnit4; 36 import android.text.method.TransformationMethod; 37 import android.widget.Button; 38 import android.widget.EditText; 39 import android.widget.LinearLayout; 40 import android.widget.LinearLayout.LayoutParams; 41 42 import com.android.compatibility.common.util.PollingCheck; 43 44 import org.junit.Before; 45 import org.junit.Rule; 46 import org.junit.Test; 47 import org.junit.runner.RunWith; 48 49 /** 50 * Test that {@link TransformationMethod} interface gets called. 51 */ 52 @MediumTest 53 @RunWith(AndroidJUnit4.class) 54 public class TransformationMethodTest { 55 private static final int EDIT_TXT_ID = 1; 56 57 private Instrumentation mInstrumentation; 58 private CtsActivity mActivity; 59 private TransformationMethod mMethod; 60 private EditText mEditText; 61 private Button mButton; 62 63 @Rule 64 public ActivityTestRule<CtsActivity> mActivityRule = new ActivityTestRule<>(CtsActivity.class); 65 66 @Before 67 public void setup() throws Throwable { 68 mActivity = mActivityRule.getActivity(); 69 PollingCheck.waitFor(1000, mActivity::hasWindowFocus); 70 mInstrumentation = InstrumentationRegistry.getInstrumentation(); 71 mMethod = mock(TransformationMethod.class); 72 when(mMethod.getTransformation(any(), any())).then(returnsFirstArg()); 73 74 mActivityRule.runOnUiThread(() -> { 75 mEditText = new EditTextNoIme(mActivity); 76 mEditText.setId(EDIT_TXT_ID); 77 mEditText.setTransformationMethod(mMethod); 78 mButton = new Button(mActivity); 79 mButton.setFocusableInTouchMode(true); 80 LinearLayout layout = new LinearLayout(mActivity); 81 layout.setOrientation(LinearLayout.VERTICAL); 82 layout.addView(mEditText, new LayoutParams(LayoutParams.MATCH_PARENT, 83 LayoutParams.WRAP_CONTENT)); 84 layout.addView(mButton, new LayoutParams(LayoutParams.MATCH_PARENT, 85 LayoutParams.WRAP_CONTENT)); 86 mActivity.setContentView(layout); 87 mEditText.requestFocus(); 88 }); 89 mInstrumentation.waitForIdleSync(); 90 91 assertTrue(mEditText.isFocused()); 92 } 93 94 @Test 95 public void testGetTransformation() throws Throwable { 96 reset(mMethod); 97 when(mMethod.getTransformation(any(), any())).then(returnsFirstArg()); 98 mActivityRule.runOnUiThread(() -> mEditText.setText("some text")); 99 mInstrumentation.waitForIdleSync(); 100 verify(mMethod, atLeastOnce()).getTransformation(any(), any()); 101 } 102 103 @Test 104 public void testOnFocusChanged() throws Throwable { 105 // lose focus 106 reset(mMethod); 107 assertTrue(mEditText.isFocused()); 108 mActivityRule.runOnUiThread(() -> mButton.requestFocus()); 109 mInstrumentation.waitForIdleSync(); 110 verify(mMethod, atLeastOnce()).onFocusChanged(any(), any(), anyBoolean(), anyInt(), any()); 111 112 // gain focus 113 reset(mMethod); 114 assertFalse(mEditText.isFocused()); 115 mActivityRule.runOnUiThread(() -> mEditText.requestFocus()); 116 mInstrumentation.waitForIdleSync(); 117 assertTrue(mEditText.isFocused()); 118 verify(mMethod, atLeastOnce()).onFocusChanged(any(), any(), anyBoolean(), anyInt(), any()); 119 } 120 } 121