/*
 * 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.util.TypedValue;
import android.view.ViewGroup;
import android.widget.FrameLayout;

import androidx.test.filters.MediumTest;
import androidx.test.rule.ActivityTestRule;
import androidx.test.runner.AndroidJUnit4;

import com.android.compatibility.common.util.WidgetTestUtils;
import com.android.compatibility.common.util.WindowUtil;

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();
        WindowUtil.waitForFocus(mActivity);
    }

    @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);

        WidgetTestUtils.runOnMainAndDrawSync(mActivityRule, layout,
                () -> mActivity.setContentView(layout));
        if (scrollToMiddle) {
            WidgetTestUtils.runOnMainAndDrawSync(mActivityRule, textView, () -> {
                float lineMid = (textView.getLayout().getLineLeft(0) +
                        textView.getLayout().getLineRight(0)) / 2;
                int scrollPosition = (int) lineMid;
                textView.setScrollX(scrollPosition);
            });
        }
        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);
        }
    }
}
