/*
 * Copyright (C) 2012 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.View.LAYOUT_DIRECTION_INHERIT;
import static android.view.View.LAYOUT_DIRECTION_LOCALE;
import static android.view.View.LAYOUT_DIRECTION_LTR;
import static android.view.View.LAYOUT_DIRECTION_RTL;

import static org.junit.Assert.assertEquals;

import android.app.Activity;
import android.view.ViewGroup;
import android.widget.FrameLayout;
import android.widget.GridLayout;
import android.widget.LinearLayout;
import android.widget.RelativeLayout;
import android.widget.TableLayout;

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

import org.junit.Before;
import org.junit.Rule;
import org.junit.Test;
import org.junit.runner.RunWith;

@MediumTest
@RunWith(AndroidJUnit4.class)
public class LayoutDirectionTest {
    private Activity mActivity;

    @Rule
    public ActivityTestRule<LayoutDirectionCtsActivity> mActivityRule =
            new ActivityTestRule<>(LayoutDirectionCtsActivity.class);

    @Before
    public void setup() {
        mActivity = mActivityRule.getActivity();
    }

    private void checkDefaultDirectionForOneLayoutWithCode(ViewGroup vg) {
        assertEquals(LAYOUT_DIRECTION_LTR, vg.getLayoutDirection());
    }

    @UiThreadTest
    @Test
    public void testLayoutDirectionDefaults() {
        checkDefaultDirectionForOneLayoutWithCode(new LinearLayout(mActivity));
        checkDefaultDirectionForOneLayoutWithCode(new FrameLayout(mActivity));
        checkDefaultDirectionForOneLayoutWithCode(new TableLayout(mActivity));
        checkDefaultDirectionForOneLayoutWithCode(new RelativeLayout(mActivity));
        checkDefaultDirectionForOneLayoutWithCode(new GridLayout(mActivity));
    }

    private void verifyDirectionForOneLayoutWithCode(ViewGroup vg) {
        vg.setLayoutDirection(LAYOUT_DIRECTION_LTR);
        assertEquals(LAYOUT_DIRECTION_LTR, vg.getLayoutDirection());

        vg.setLayoutDirection(LAYOUT_DIRECTION_RTL);
        assertEquals(LAYOUT_DIRECTION_RTL, vg.getLayoutDirection());

        vg.setLayoutDirection(LAYOUT_DIRECTION_LOCALE);
        // running with English locale
        assertEquals(LAYOUT_DIRECTION_LTR, vg.getLayoutDirection());

        vg.setLayoutDirection(LAYOUT_DIRECTION_INHERIT);
        // default is LTR
        assertEquals(LAYOUT_DIRECTION_LTR, vg.getLayoutDirection());
    }

    @UiThreadTest
    @Test
    public void testDirectionForAllLayoutsWithCode() {
        verifyDirectionForOneLayoutWithCode(new LinearLayout(mActivity));
        verifyDirectionForOneLayoutWithCode(new FrameLayout(mActivity));
        verifyDirectionForOneLayoutWithCode(new TableLayout(mActivity));
        verifyDirectionForOneLayoutWithCode(new RelativeLayout(mActivity));
        verifyDirectionForOneLayoutWithCode(new GridLayout(mActivity));
    }

    private void verifyDirectionInheritanceForOneLayoutWithCode(ViewGroup parent) {
        LinearLayout child = new LinearLayout(mActivity);
        child.setLayoutDirection(LAYOUT_DIRECTION_INHERIT);
        parent.addView(child);

        // Parent is LTR
        parent.setLayoutDirection(LAYOUT_DIRECTION_LTR);

        assertEquals(LAYOUT_DIRECTION_LTR, parent.getLayoutDirection());
        assertEquals(LAYOUT_DIRECTION_LTR, child.getLayoutDirection());

        // Parent is RTL
        parent.setLayoutDirection(LAYOUT_DIRECTION_RTL);

        assertEquals(LAYOUT_DIRECTION_RTL, parent.getLayoutDirection());
        assertEquals(LAYOUT_DIRECTION_RTL, child.getLayoutDirection());
    }

    @UiThreadTest
    @Test
    public void testDirectionInheritanceForAllLayoutsWithCode() {
        verifyDirectionInheritanceForOneLayoutWithCode(new LinearLayout(mActivity));
        verifyDirectionInheritanceForOneLayoutWithCode(new FrameLayout(mActivity));
        verifyDirectionInheritanceForOneLayoutWithCode(new TableLayout(mActivity));
        verifyDirectionInheritanceForOneLayoutWithCode(new RelativeLayout(mActivity));
        verifyDirectionInheritanceForOneLayoutWithCode(new GridLayout(mActivity));
    }

    private void verifyDirectionForOneLayoutFromXml(
            int parentId, int parentDir, int parentResDir,
            int child1Id, int child1Dir, int child1ResDir,
            int child2Id, int child2Dir, int child2ResDir,
            int child3Id, int child3Dir, int child3ResDir,
            int child4Id, int child4Dir, int child4ResDir) {
        ViewGroup ll = (ViewGroup) mActivity.findViewById(parentId);
        assertEquals(parentResDir, ll.getLayoutDirection());

        ViewGroup child1 = (ViewGroup) mActivity.findViewById(child1Id);
        assertEquals(child1ResDir, child1.getLayoutDirection());

        ViewGroup child2 = (ViewGroup) mActivity.findViewById(child2Id);
        assertEquals(child2ResDir, child2.getLayoutDirection());

        ViewGroup child3 = (ViewGroup) mActivity.findViewById(child3Id);
        assertEquals(child3ResDir, child3.getLayoutDirection());

        ViewGroup child4 = (ViewGroup) mActivity.findViewById(child4Id);
        assertEquals(child4ResDir, child4.getLayoutDirection());
    }

    @UiThreadTest
    @Test
    public void testDirectionFromXml() {
        // We only test LinearLayout as the others would be the same (they extend ViewGroup / View)
        verifyDirectionForOneLayoutFromXml(
                R.id.layout_linearlayout_ltr, LAYOUT_DIRECTION_LTR, LAYOUT_DIRECTION_LTR,
                R.id.layout_linearlayout_ltr_child_1, LAYOUT_DIRECTION_LTR, LAYOUT_DIRECTION_LTR,
                R.id.layout_linearlayout_ltr_child_2, LAYOUT_DIRECTION_RTL, LAYOUT_DIRECTION_RTL,
                // parent is LTR
                R.id.layout_linearlayout_ltr_child_3, LAYOUT_DIRECTION_INHERIT,
                    LAYOUT_DIRECTION_LTR,
                // running with English locale
                R.id.layout_linearlayout_ltr_child_4, LAYOUT_DIRECTION_LOCALE,
                    LAYOUT_DIRECTION_LTR);

        verifyDirectionForOneLayoutFromXml(
                R.id.layout_linearlayout_rtl, LAYOUT_DIRECTION_RTL, LAYOUT_DIRECTION_RTL,
                R.id.layout_linearlayout_rtl_child_1, LAYOUT_DIRECTION_LTR, LAYOUT_DIRECTION_LTR,
                R.id.layout_linearlayout_rtl_child_2, LAYOUT_DIRECTION_RTL, LAYOUT_DIRECTION_RTL,
                // parent is RTL
                R.id.layout_linearlayout_rtl_child_3, LAYOUT_DIRECTION_INHERIT,
                    LAYOUT_DIRECTION_RTL,
                // running with English locale
                R.id.layout_linearlayout_rtl_child_4, LAYOUT_DIRECTION_LOCALE,
                    LAYOUT_DIRECTION_LTR);

        verifyDirectionForOneLayoutFromXml(
                // default is LTR
                R.id.layout_linearlayout_inherit, LAYOUT_DIRECTION_INHERIT, LAYOUT_DIRECTION_LTR,
                R.id.layout_linearlayout_inherit_child_1, LAYOUT_DIRECTION_LTR,
                    LAYOUT_DIRECTION_LTR,
                R.id.layout_linearlayout_inherit_child_2, LAYOUT_DIRECTION_RTL,
                    LAYOUT_DIRECTION_RTL,
                // parent is LTR
                R.id.layout_linearlayout_inherit_child_3, LAYOUT_DIRECTION_INHERIT,
                    LAYOUT_DIRECTION_LTR,
                // running with English locale
                R.id.layout_linearlayout_inherit_child_4, LAYOUT_DIRECTION_LOCALE,
                    LAYOUT_DIRECTION_LTR);

        verifyDirectionForOneLayoutFromXml(
                // running with English locale
                R.id.layout_linearlayout_locale, LAYOUT_DIRECTION_LOCALE, LAYOUT_DIRECTION_LTR,
                R.id.layout_linearlayout_locale_child_1, LAYOUT_DIRECTION_LTR, LAYOUT_DIRECTION_LTR,
                R.id.layout_linearlayout_locale_child_2, LAYOUT_DIRECTION_RTL, LAYOUT_DIRECTION_RTL,
                // parent is LTR
                R.id.layout_linearlayout_locale_child_3, LAYOUT_DIRECTION_INHERIT,
                    LAYOUT_DIRECTION_LTR,
                // running with English locale
                R.id.layout_linearlayout_locale_child_4, LAYOUT_DIRECTION_LOCALE,
                    LAYOUT_DIRECTION_LTR);
    }
}
