blob: f001b4686ceca3c31ca222ab36ff076ff0bfbee2 [file] [log] [blame]
/*
* Copyright (C) 2016 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.widget.cts;
import static android.view.Gravity.CENTER;
import static android.view.Gravity.LEFT;
import static android.view.Gravity.NO_GRAVITY;
import static android.view.Gravity.RIGHT;
import static android.view.View.TEXT_ALIGNMENT_INHERIT;
import static android.widget.TextView.TEXT_ALIGNMENT_TEXT_END;
import static android.widget.TextView.TEXT_ALIGNMENT_TEXT_START;
import static android.widget.TextView.TEXT_ALIGNMENT_VIEW_END;
import static android.widget.TextView.TEXT_ALIGNMENT_VIEW_START;
import static org.junit.Assert.assertEquals;
import android.app.Activity;
import android.app.Instrumentation;
import android.support.test.InstrumentationRegistry;
import android.support.test.filters.MediumTest;
import android.support.test.rule.ActivityTestRule;
import android.support.test.runner.AndroidJUnit4;
import android.util.TypedValue;
import android.view.ViewGroup;
import android.widget.FrameLayout;
import com.android.compatibility.common.util.PollingCheck;
import org.junit.Before;
import org.junit.Rule;
import org.junit.Test;
import org.junit.runner.RunWith;
@MediumTest
@RunWith(AndroidJUnit4.class)
public class TextViewFadingEdgeTest {
private Activity mActivity;
@Rule
public ActivityTestRule<EmptyCtsActivity> mActivityRule =
new ActivityTestRule<>(EmptyCtsActivity.class);
public static final float DELTA = 0.01f;
private static final String LONG_RTL_STRING = "مرحبا الروبوت مرحبا الروبوت مرحبا الروبوت";
private static final String LONG_LTR_STRING = "start start1 middle middle1 end end1";
private static final String SHORT_RTL_STRING = "ت";
private static final String SHORT_LTR_STRING = "s";
public static final int ANY_PADDING = 20;
public static final int ANY_FADE_LENGTH = 20;
public static final int TEXT_SIZE = 20;
public static final int WIDTH = 100;
private static final TestCase[] TEST_DATA = {
// no fade - fading disabled
new TestCase("Should not fade when text:empty, fading:disabled",
null, false, NO_GRAVITY, TEXT_ALIGNMENT_INHERIT, 0f, 0f),
new TestCase("Should not fade when text:short, dir:LTR, fading:disabled",
SHORT_LTR_STRING, false, NO_GRAVITY, TEXT_ALIGNMENT_INHERIT, 0f, 0f),
new TestCase("Should not fade when text:short, dir:RTL, fading:disabled",
SHORT_RTL_STRING, false, NO_GRAVITY, TEXT_ALIGNMENT_INHERIT, 0f, 0f),
new TestCase("Should not fade when text:long , dir:LTR, fading:disabled",
LONG_LTR_STRING, false, NO_GRAVITY, TEXT_ALIGNMENT_INHERIT, 0f, 0f),
new TestCase("Should not fade when text:long , dir:RTL, fading:disabled",
LONG_RTL_STRING, false, NO_GRAVITY, TEXT_ALIGNMENT_INHERIT, 0f, 0f),
new TestCase("Should not fade when text:long, dir:LTR, scroll:middle",
LONG_LTR_STRING, false, NO_GRAVITY, TEXT_ALIGNMENT_INHERIT, true, 0f, 0f),
new TestCase("Should not fade when text:long, dir:RTL, scroll:middle",
LONG_RTL_STRING, false, NO_GRAVITY, TEXT_ALIGNMENT_INHERIT, true, 0f, 0f),
// no fade - text is shorter than view width
new TestCase("Should not fade when text:empty",
null, true, NO_GRAVITY, TEXT_ALIGNMENT_INHERIT, 0f, 0f),
new TestCase("Should not fade when text:short, dir:LTR",
SHORT_LTR_STRING, true, NO_GRAVITY, TEXT_ALIGNMENT_INHERIT, 0f, 0f),
new TestCase("Should not fade when text:short, dir:LTR, gravity:center",
SHORT_LTR_STRING, true, CENTER, TEXT_ALIGNMENT_INHERIT, 0f, 0f),
new TestCase("Should not fade when text:short, dir:RTL",
SHORT_RTL_STRING, true, NO_GRAVITY, TEXT_ALIGNMENT_INHERIT, 0f, 0f),
new TestCase("Should not fade when text:short, dir:RTL, gravity:center",
SHORT_RTL_STRING, true, CENTER, TEXT_ALIGNMENT_INHERIT, 0f, 0f),
// left fade - LTR
new TestCase("Should fade left when text:long, dir:LTR, gravity:right",
LONG_LTR_STRING, true, RIGHT, TEXT_ALIGNMENT_INHERIT, 1f, 0f),
new TestCase("Should fade left when text:long, dir:LTR, textAlignment:textEnd",
LONG_LTR_STRING, true, NO_GRAVITY, TEXT_ALIGNMENT_TEXT_END, 1f, 0f),
new TestCase("Should fade left when text:long, dir:LTR, textAlignment:viewEnd",
LONG_LTR_STRING, true, NO_GRAVITY, TEXT_ALIGNMENT_VIEW_END, 1f, 0f),
// left fade - RTL
new TestCase("Should fade left when text:long, dir:RTL",
LONG_RTL_STRING, true, NO_GRAVITY, TEXT_ALIGNMENT_INHERIT, 1f, 0f),
new TestCase("Should fade left when text:long, dir:RTL, gravity:right",
LONG_RTL_STRING, true, RIGHT, TEXT_ALIGNMENT_INHERIT, 1f, 0f),
new TestCase("Should fade left when text:long, dir:RTL, textAlignment:textStart",
LONG_RTL_STRING, true, NO_GRAVITY, TEXT_ALIGNMENT_TEXT_START, 1f, 0f),
new TestCase("Should fade left when text:long, dir:RTL, textAlignment:viewEnd",
LONG_RTL_STRING, true, NO_GRAVITY, TEXT_ALIGNMENT_VIEW_END, 1f, 0f),
// right fade - LTR
new TestCase("Should fade right when text:long, dir:LTR",
LONG_LTR_STRING, true, NO_GRAVITY, TEXT_ALIGNMENT_INHERIT, 0f, 1f),
new TestCase("Should fade right when text:long, dir:LTR, textAlignment:textStart",
LONG_LTR_STRING, true, NO_GRAVITY, TEXT_ALIGNMENT_TEXT_START, 0f, 1f),
new TestCase("Should fade right when text:long, dir:LTR, gravity:left",
LONG_LTR_STRING, true, LEFT, TEXT_ALIGNMENT_INHERIT, 0f, 1f),
new TestCase("Should fade right when text:long, dir:LTR, textAlignment:viewStart",
LONG_LTR_STRING, true, NO_GRAVITY, TEXT_ALIGNMENT_VIEW_START, 0f, 1f),
// right fade - RTL
new TestCase("Should fade right when text:long, dir:RTL, gravity:left",
LONG_RTL_STRING, true, LEFT, TEXT_ALIGNMENT_INHERIT, 0f, 1f),
new TestCase("Should fade right when text:long, dir:RTL, textAlignment:viewStart",
LONG_RTL_STRING, true, NO_GRAVITY, TEXT_ALIGNMENT_VIEW_START, 0f, 1f),
new TestCase("Should fade right when text:long, dir:RTL, textAlignment:textEnd",
LONG_RTL_STRING, true, NO_GRAVITY, TEXT_ALIGNMENT_TEXT_END, 0f, 1f),
// left and right fade
new TestCase("Should fade both when text:long, dir:LTR, scroll:middle",
LONG_LTR_STRING, true, NO_GRAVITY, TEXT_ALIGNMENT_INHERIT, true, 1f, 1f),
new TestCase("Should fade both when text:long, dir:RTL, scroll:middle",
LONG_RTL_STRING, true, NO_GRAVITY, TEXT_ALIGNMENT_INHERIT, true, 1f, 1f)
};
@Before
public void setup() {
mActivity = mActivityRule.getActivity();
PollingCheck.waitFor(mActivity::hasWindowFocus);
}
@Test
public void testFadingEdge() throws Throwable {
for (TestCase data : TEST_DATA) {
MockTextView textView = createTextView(data.text, data.horizontalFadingEnabled,
data.gravity, data.textAlignment, data.scrollToMiddle);
assertEquals(data.errorMsg,
data.expectationLeft, textView.getLeftFadingEdgeStrength(), DELTA);
assertEquals(data.errorMsg,
data.expectationRight, textView.getRightFadingEdgeStrength(), DELTA);
}
}
private final MockTextView createTextView(String text, boolean horizontalFadingEnabled,
int gravity, int textAlignment, boolean scrollToMiddle) throws Throwable {
final MockTextView textView = new MockTextView(mActivity);
textView.setSingleLine(true);
textView.setTextSize(TypedValue.COMPLEX_UNIT_PX, TEXT_SIZE);
textView.setPadding(ANY_PADDING, ANY_PADDING, ANY_PADDING, ANY_PADDING);
textView.setFadingEdgeLength(ANY_FADE_LENGTH);
textView.setLayoutParams(new ViewGroup.LayoutParams(WIDTH,
ViewGroup.LayoutParams.WRAP_CONTENT));
textView.setHorizontalFadingEdgeEnabled(horizontalFadingEnabled);
textView.setText(text);
textView.setGravity(gravity);
textView.setTextAlignment(textAlignment);
final FrameLayout layout = new FrameLayout(mActivity);
ViewGroup.LayoutParams layoutParams = new ViewGroup.LayoutParams(
ViewGroup.LayoutParams.MATCH_PARENT,
ViewGroup.LayoutParams.MATCH_PARENT);
layout.setLayoutParams(layoutParams);
layout.addView(textView);
final Instrumentation instrumentation = InstrumentationRegistry.getInstrumentation();
mActivityRule.runOnUiThread(() -> mActivity.setContentView(layout));
if (scrollToMiddle) {
mActivityRule.runOnUiThread(() -> {
float lineMid = (textView.getLayout().getLineLeft(0) +
textView.getLayout().getLineRight(0)) / 2;
int scrollPosition = (int) lineMid;
textView.setScrollX(scrollPosition);
});
}
instrumentation.waitForIdleSync();
return textView;
}
private static class TestCase {
final String errorMsg;
final String text;
final boolean horizontalFadingEnabled;
final int gravity;
final int textAlignment;
final float expectationLeft;
final float expectationRight;
final boolean scrollToMiddle;
TestCase(String errorMsg, String text, boolean horizontalFadingEnabled, int gravity,
int textAlignment, boolean scrollToMiddle, float expectationLeft,
float expectationRight) {
this.errorMsg = errorMsg;
this.text = text;
this.horizontalFadingEnabled = horizontalFadingEnabled;
this.gravity = gravity;
this.textAlignment = textAlignment;
this.expectationLeft = expectationLeft;
this.expectationRight = expectationRight;
this.scrollToMiddle = scrollToMiddle;
}
TestCase(String errorMsg, String text, boolean horizontalFadingEnabled, int gravity,
int textAlignment, float expectationLeft, float expectationRight) {
this(errorMsg, text, horizontalFadingEnabled, gravity, textAlignment, false,
expectationLeft, expectationRight);
}
}
}