17899d6f64ae6585a79c7c1844d4a5e8f894bf2d7Kirill Grouchnikov/*
2ac5fe7c617c66850fff75a9fce9979c6e5674b0fAurimas Liutikas * Copyright 2018 The Android Open Source Project
37899d6f64ae6585a79c7c1844d4a5e8f894bf2d7Kirill Grouchnikov *
47899d6f64ae6585a79c7c1844d4a5e8f894bf2d7Kirill Grouchnikov * Licensed under the Apache License, Version 2.0 (the "License");
57899d6f64ae6585a79c7c1844d4a5e8f894bf2d7Kirill Grouchnikov * you may not use this file except in compliance with the License.
67899d6f64ae6585a79c7c1844d4a5e8f894bf2d7Kirill Grouchnikov * You may obtain a copy of the License at
77899d6f64ae6585a79c7c1844d4a5e8f894bf2d7Kirill Grouchnikov *
87899d6f64ae6585a79c7c1844d4a5e8f894bf2d7Kirill Grouchnikov *      http://www.apache.org/licenses/LICENSE-2.0
97899d6f64ae6585a79c7c1844d4a5e8f894bf2d7Kirill Grouchnikov *
107899d6f64ae6585a79c7c1844d4a5e8f894bf2d7Kirill Grouchnikov * Unless required by applicable law or agreed to in writing, software
117899d6f64ae6585a79c7c1844d4a5e8f894bf2d7Kirill Grouchnikov * distributed under the License is distributed on an "AS IS" BASIS,
127899d6f64ae6585a79c7c1844d4a5e8f894bf2d7Kirill Grouchnikov * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
137899d6f64ae6585a79c7c1844d4a5e8f894bf2d7Kirill Grouchnikov * See the License for the specific language governing permissions and
147899d6f64ae6585a79c7c1844d4a5e8f894bf2d7Kirill Grouchnikov * limitations under the License.
157899d6f64ae6585a79c7c1844d4a5e8f894bf2d7Kirill Grouchnikov */
16ac5fe7c617c66850fff75a9fce9979c6e5674b0fAurimas Liutikaspackage androidx.core.view;
177899d6f64ae6585a79c7c1844d4a5e8f894bf2d7Kirill Grouchnikov
184c0cac8cbf22f47465eec7a75d723fa0e0ebf1dcAurimas Liutikasimport static org.junit.Assert.assertEquals;
194c0cac8cbf22f47465eec7a75d723fa0e0ebf1dcAurimas Liutikas
200945b2238447028b9d274cccccd7fc61042bf03bKirill Grouchnikovimport android.graphics.Rect;
217899d6f64ae6585a79c7c1844d4a5e8f894bf2d7Kirill Grouchnikovimport android.os.Build;
22754cb29c50f09a83251dd4bb633ba445b2411adbAurimas Liutikasimport android.support.test.filters.SmallTest;
23d5bac09cd05be314f4c38435572a3fc01c2c8d4fKirill Grouchnikovimport android.support.test.runner.AndroidJUnit4;
240945b2238447028b9d274cccccd7fc61042bf03bKirill Grouchnikovimport android.support.v4.testutils.TestUtils;
2539e84476b45f10ed4929e307372d6f7a2103e9d5Kirill Grouchnikovimport android.view.Gravity;
264c0cac8cbf22f47465eec7a75d723fa0e0ebf1dcAurimas Liutikas
27d5bac09cd05be314f4c38435572a3fc01c2c8d4fKirill Grouchnikovimport org.junit.Test;
28d5bac09cd05be314f4c38435572a3fc01c2c8d4fKirill Grouchnikovimport org.junit.runner.RunWith;
297899d6f64ae6585a79c7c1844d4a5e8f894bf2d7Kirill Grouchnikov
30d5bac09cd05be314f4c38435572a3fc01c2c8d4fKirill Grouchnikov@RunWith(AndroidJUnit4.class)
31d5bac09cd05be314f4c38435572a3fc01c2c8d4fKirill Grouchnikov@SmallTest
32d5bac09cd05be314f4c38435572a3fc01c2c8d4fKirill Grouchnikovpublic class GravityCompatTest {
33d5bac09cd05be314f4c38435572a3fc01c2c8d4fKirill Grouchnikov    @Test
347899d6f64ae6585a79c7c1844d4a5e8f894bf2d7Kirill Grouchnikov    public void testConstants() {
357899d6f64ae6585a79c7c1844d4a5e8f894bf2d7Kirill Grouchnikov        // Compat constants must match core constants since they can be OR'd with
367899d6f64ae6585a79c7c1844d4a5e8f894bf2d7Kirill Grouchnikov        // other core constants.
37bdfb4eaebe24e9b4478f4cad3fb12e68493ffd70Kirill Grouchnikov        assertEquals("Start constants", Gravity.START, GravityCompat.START);
38bdfb4eaebe24e9b4478f4cad3fb12e68493ffd70Kirill Grouchnikov        assertEquals("End constants", Gravity.END, GravityCompat.END);
397899d6f64ae6585a79c7c1844d4a5e8f894bf2d7Kirill Grouchnikov    }
407899d6f64ae6585a79c7c1844d4a5e8f894bf2d7Kirill Grouchnikov
41d5bac09cd05be314f4c38435572a3fc01c2c8d4fKirill Grouchnikov    @Test
427899d6f64ae6585a79c7c1844d4a5e8f894bf2d7Kirill Grouchnikov    public void testGetAbsoluteGravity() {
437899d6f64ae6585a79c7c1844d4a5e8f894bf2d7Kirill Grouchnikov        assertEquals("Left under LTR",
447899d6f64ae6585a79c7c1844d4a5e8f894bf2d7Kirill Grouchnikov                GravityCompat.getAbsoluteGravity(Gravity.LEFT, ViewCompat.LAYOUT_DIRECTION_LTR),
457899d6f64ae6585a79c7c1844d4a5e8f894bf2d7Kirill Grouchnikov                Gravity.LEFT);
467899d6f64ae6585a79c7c1844d4a5e8f894bf2d7Kirill Grouchnikov        assertEquals("Right under LTR",
477899d6f64ae6585a79c7c1844d4a5e8f894bf2d7Kirill Grouchnikov                GravityCompat.getAbsoluteGravity(Gravity.RIGHT, ViewCompat.LAYOUT_DIRECTION_LTR),
487899d6f64ae6585a79c7c1844d4a5e8f894bf2d7Kirill Grouchnikov                Gravity.RIGHT);
497899d6f64ae6585a79c7c1844d4a5e8f894bf2d7Kirill Grouchnikov        assertEquals("Left under RTL",
507899d6f64ae6585a79c7c1844d4a5e8f894bf2d7Kirill Grouchnikov                GravityCompat.getAbsoluteGravity(Gravity.LEFT, ViewCompat.LAYOUT_DIRECTION_RTL),
517899d6f64ae6585a79c7c1844d4a5e8f894bf2d7Kirill Grouchnikov                Gravity.LEFT);
527899d6f64ae6585a79c7c1844d4a5e8f894bf2d7Kirill Grouchnikov        assertEquals("Right under RTL",
537899d6f64ae6585a79c7c1844d4a5e8f894bf2d7Kirill Grouchnikov                GravityCompat.getAbsoluteGravity(Gravity.RIGHT, ViewCompat.LAYOUT_DIRECTION_RTL),
547899d6f64ae6585a79c7c1844d4a5e8f894bf2d7Kirill Grouchnikov                Gravity.RIGHT);
557899d6f64ae6585a79c7c1844d4a5e8f894bf2d7Kirill Grouchnikov
567899d6f64ae6585a79c7c1844d4a5e8f894bf2d7Kirill Grouchnikov        assertEquals("Start under LTR",
577899d6f64ae6585a79c7c1844d4a5e8f894bf2d7Kirill Grouchnikov                GravityCompat.getAbsoluteGravity(GravityCompat.START,
587899d6f64ae6585a79c7c1844d4a5e8f894bf2d7Kirill Grouchnikov                        ViewCompat.LAYOUT_DIRECTION_LTR),
597899d6f64ae6585a79c7c1844d4a5e8f894bf2d7Kirill Grouchnikov                Gravity.LEFT);
607899d6f64ae6585a79c7c1844d4a5e8f894bf2d7Kirill Grouchnikov        assertEquals("End under LTR",
617899d6f64ae6585a79c7c1844d4a5e8f894bf2d7Kirill Grouchnikov                GravityCompat.getAbsoluteGravity(GravityCompat.END,
627899d6f64ae6585a79c7c1844d4a5e8f894bf2d7Kirill Grouchnikov                        ViewCompat.LAYOUT_DIRECTION_LTR),
637899d6f64ae6585a79c7c1844d4a5e8f894bf2d7Kirill Grouchnikov                Gravity.RIGHT);
647899d6f64ae6585a79c7c1844d4a5e8f894bf2d7Kirill Grouchnikov
657899d6f64ae6585a79c7c1844d4a5e8f894bf2d7Kirill Grouchnikov        if (Build.VERSION.SDK_INT >= 17) {
667899d6f64ae6585a79c7c1844d4a5e8f894bf2d7Kirill Grouchnikov            // The following tests are only expected to pass on v17+ devices
677899d6f64ae6585a79c7c1844d4a5e8f894bf2d7Kirill Grouchnikov            assertEquals("Start under RTL",
687899d6f64ae6585a79c7c1844d4a5e8f894bf2d7Kirill Grouchnikov                    GravityCompat.getAbsoluteGravity(GravityCompat.START,
697899d6f64ae6585a79c7c1844d4a5e8f894bf2d7Kirill Grouchnikov                            ViewCompat.LAYOUT_DIRECTION_RTL),
707899d6f64ae6585a79c7c1844d4a5e8f894bf2d7Kirill Grouchnikov                    Gravity.RIGHT);
717899d6f64ae6585a79c7c1844d4a5e8f894bf2d7Kirill Grouchnikov            assertEquals("End under RTL",
727899d6f64ae6585a79c7c1844d4a5e8f894bf2d7Kirill Grouchnikov                    GravityCompat.getAbsoluteGravity(GravityCompat.END,
737899d6f64ae6585a79c7c1844d4a5e8f894bf2d7Kirill Grouchnikov                            ViewCompat.LAYOUT_DIRECTION_RTL),
747899d6f64ae6585a79c7c1844d4a5e8f894bf2d7Kirill Grouchnikov                    Gravity.LEFT);
757899d6f64ae6585a79c7c1844d4a5e8f894bf2d7Kirill Grouchnikov        } else {
767899d6f64ae6585a79c7c1844d4a5e8f894bf2d7Kirill Grouchnikov            // And on older devices START is always LEFT, END is always RIGHT
777899d6f64ae6585a79c7c1844d4a5e8f894bf2d7Kirill Grouchnikov            assertEquals("Start under RTL",
787899d6f64ae6585a79c7c1844d4a5e8f894bf2d7Kirill Grouchnikov                    GravityCompat.getAbsoluteGravity(GravityCompat.START,
797899d6f64ae6585a79c7c1844d4a5e8f894bf2d7Kirill Grouchnikov                            ViewCompat.LAYOUT_DIRECTION_RTL),
807899d6f64ae6585a79c7c1844d4a5e8f894bf2d7Kirill Grouchnikov                    Gravity.LEFT);
817899d6f64ae6585a79c7c1844d4a5e8f894bf2d7Kirill Grouchnikov            assertEquals("End under RTL",
827899d6f64ae6585a79c7c1844d4a5e8f894bf2d7Kirill Grouchnikov                    GravityCompat.getAbsoluteGravity(GravityCompat.END,
837899d6f64ae6585a79c7c1844d4a5e8f894bf2d7Kirill Grouchnikov                            ViewCompat.LAYOUT_DIRECTION_RTL),
847899d6f64ae6585a79c7c1844d4a5e8f894bf2d7Kirill Grouchnikov                    Gravity.RIGHT);
857899d6f64ae6585a79c7c1844d4a5e8f894bf2d7Kirill Grouchnikov        }
867899d6f64ae6585a79c7c1844d4a5e8f894bf2d7Kirill Grouchnikov    }
870945b2238447028b9d274cccccd7fc61042bf03bKirill Grouchnikov
88d5bac09cd05be314f4c38435572a3fc01c2c8d4fKirill Grouchnikov    @Test
890945b2238447028b9d274cccccd7fc61042bf03bKirill Grouchnikov    public void testApplyNoOffsetsLtr() {
900945b2238447028b9d274cccccd7fc61042bf03bKirill Grouchnikov        Rect outRect = new Rect();
910945b2238447028b9d274cccccd7fc61042bf03bKirill Grouchnikov
920945b2238447028b9d274cccccd7fc61042bf03bKirill Grouchnikov        // Left / top aligned under LTR direction
930945b2238447028b9d274cccccd7fc61042bf03bKirill Grouchnikov        GravityCompat.apply(Gravity.LEFT | Gravity.TOP, 100, 50,
940945b2238447028b9d274cccccd7fc61042bf03bKirill Grouchnikov                new Rect(0, 0, 200, 100), outRect, ViewCompat.LAYOUT_DIRECTION_LTR);
950945b2238447028b9d274cccccd7fc61042bf03bKirill Grouchnikov        TestUtils.assertRectangleBounds("Left / top aligned under LTR: ",
960945b2238447028b9d274cccccd7fc61042bf03bKirill Grouchnikov                outRect, 0, 0, 100, 50);
970945b2238447028b9d274cccccd7fc61042bf03bKirill Grouchnikov
980945b2238447028b9d274cccccd7fc61042bf03bKirill Grouchnikov        // Center / top aligned under LTR direction
990945b2238447028b9d274cccccd7fc61042bf03bKirill Grouchnikov        GravityCompat.apply(Gravity.CENTER_HORIZONTAL | Gravity.TOP, 100, 50,
1000945b2238447028b9d274cccccd7fc61042bf03bKirill Grouchnikov                new Rect(0, 0, 200, 100), outRect, ViewCompat.LAYOUT_DIRECTION_LTR);
1010945b2238447028b9d274cccccd7fc61042bf03bKirill Grouchnikov        TestUtils.assertRectangleBounds("Center / top aligned under LTR: ",
1020945b2238447028b9d274cccccd7fc61042bf03bKirill Grouchnikov                outRect, 50, 0, 150, 50);
1030945b2238447028b9d274cccccd7fc61042bf03bKirill Grouchnikov
1040945b2238447028b9d274cccccd7fc61042bf03bKirill Grouchnikov        // Right / top aligned under LTR direction
1050945b2238447028b9d274cccccd7fc61042bf03bKirill Grouchnikov        GravityCompat.apply(Gravity.RIGHT | Gravity.TOP, 100, 50,
1060945b2238447028b9d274cccccd7fc61042bf03bKirill Grouchnikov                new Rect(0, 0, 200, 100), outRect, ViewCompat.LAYOUT_DIRECTION_LTR);
1070945b2238447028b9d274cccccd7fc61042bf03bKirill Grouchnikov        TestUtils.assertRectangleBounds("Right / top aligned under LTR: ",
1080945b2238447028b9d274cccccd7fc61042bf03bKirill Grouchnikov                outRect, 100, 0, 200, 50);
1090945b2238447028b9d274cccccd7fc61042bf03bKirill Grouchnikov
1100945b2238447028b9d274cccccd7fc61042bf03bKirill Grouchnikov        // Left / center aligned under LTR direction
1110945b2238447028b9d274cccccd7fc61042bf03bKirill Grouchnikov        GravityCompat.apply(Gravity.LEFT | Gravity.CENTER_VERTICAL, 100, 50,
1120945b2238447028b9d274cccccd7fc61042bf03bKirill Grouchnikov                new Rect(0, 0, 200, 100), outRect, ViewCompat.LAYOUT_DIRECTION_LTR);
1130945b2238447028b9d274cccccd7fc61042bf03bKirill Grouchnikov        TestUtils.assertRectangleBounds("Left / center aligned under LTR: ",
1140945b2238447028b9d274cccccd7fc61042bf03bKirill Grouchnikov                outRect, 0, 25, 100, 75);
1150945b2238447028b9d274cccccd7fc61042bf03bKirill Grouchnikov
1160945b2238447028b9d274cccccd7fc61042bf03bKirill Grouchnikov        // Center / center aligned under LTR direction
1170945b2238447028b9d274cccccd7fc61042bf03bKirill Grouchnikov        GravityCompat.apply(Gravity.CENTER, 100, 50,
1180945b2238447028b9d274cccccd7fc61042bf03bKirill Grouchnikov                new Rect(0, 0, 200, 100), outRect, ViewCompat.LAYOUT_DIRECTION_LTR);
1190945b2238447028b9d274cccccd7fc61042bf03bKirill Grouchnikov        TestUtils.assertRectangleBounds("Center / center aligned under LTR: ",
1200945b2238447028b9d274cccccd7fc61042bf03bKirill Grouchnikov                outRect, 50, 25, 150, 75);
1210945b2238447028b9d274cccccd7fc61042bf03bKirill Grouchnikov
1220945b2238447028b9d274cccccd7fc61042bf03bKirill Grouchnikov        // Right / center aligned under LTR direction
1230945b2238447028b9d274cccccd7fc61042bf03bKirill Grouchnikov        GravityCompat.apply(Gravity.RIGHT | Gravity.CENTER_VERTICAL, 100, 50,
1240945b2238447028b9d274cccccd7fc61042bf03bKirill Grouchnikov                new Rect(0, 0, 200, 100), outRect, ViewCompat.LAYOUT_DIRECTION_LTR);
1250945b2238447028b9d274cccccd7fc61042bf03bKirill Grouchnikov        TestUtils.assertRectangleBounds("Right / center aligned under LTR: ",
1260945b2238447028b9d274cccccd7fc61042bf03bKirill Grouchnikov                outRect, 100, 25, 200, 75);
1270945b2238447028b9d274cccccd7fc61042bf03bKirill Grouchnikov
1280945b2238447028b9d274cccccd7fc61042bf03bKirill Grouchnikov        // Left / bottom aligned under LTR direction
1290945b2238447028b9d274cccccd7fc61042bf03bKirill Grouchnikov        GravityCompat.apply(Gravity.LEFT | Gravity.BOTTOM, 100, 50,
1300945b2238447028b9d274cccccd7fc61042bf03bKirill Grouchnikov                new Rect(0, 0, 200, 100), outRect, ViewCompat.LAYOUT_DIRECTION_LTR);
1310945b2238447028b9d274cccccd7fc61042bf03bKirill Grouchnikov        TestUtils.assertRectangleBounds("Left / bottom aligned under LTR: ",
1320945b2238447028b9d274cccccd7fc61042bf03bKirill Grouchnikov                outRect, 0, 50, 100, 100);
1330945b2238447028b9d274cccccd7fc61042bf03bKirill Grouchnikov
1340945b2238447028b9d274cccccd7fc61042bf03bKirill Grouchnikov        // Center / bottom aligned under LTR direction
1350945b2238447028b9d274cccccd7fc61042bf03bKirill Grouchnikov        GravityCompat.apply(Gravity.CENTER_HORIZONTAL | Gravity.BOTTOM, 100, 50,
1360945b2238447028b9d274cccccd7fc61042bf03bKirill Grouchnikov                new Rect(0, 0, 200, 100), outRect, ViewCompat.LAYOUT_DIRECTION_LTR);
1370945b2238447028b9d274cccccd7fc61042bf03bKirill Grouchnikov        TestUtils.assertRectangleBounds("Center / bottom aligned under LTR: ",
1380945b2238447028b9d274cccccd7fc61042bf03bKirill Grouchnikov                outRect, 50, 50, 150, 100);
1390945b2238447028b9d274cccccd7fc61042bf03bKirill Grouchnikov
1400945b2238447028b9d274cccccd7fc61042bf03bKirill Grouchnikov        // Right / bottom aligned under LTR direction
1410945b2238447028b9d274cccccd7fc61042bf03bKirill Grouchnikov        GravityCompat.apply(Gravity.RIGHT | Gravity.BOTTOM, 100, 50,
1420945b2238447028b9d274cccccd7fc61042bf03bKirill Grouchnikov                new Rect(0, 0, 200, 100), outRect, ViewCompat.LAYOUT_DIRECTION_LTR);
1430945b2238447028b9d274cccccd7fc61042bf03bKirill Grouchnikov        TestUtils.assertRectangleBounds("Right / bottom aligned under LTR: ",
1440945b2238447028b9d274cccccd7fc61042bf03bKirill Grouchnikov                outRect, 100, 50, 200, 100);
1450945b2238447028b9d274cccccd7fc61042bf03bKirill Grouchnikov
1460945b2238447028b9d274cccccd7fc61042bf03bKirill Grouchnikov        // The following tests are expected to pass on all devices since START under LTR is LEFT
1470945b2238447028b9d274cccccd7fc61042bf03bKirill Grouchnikov        // and END under LTR is RIGHT on pre-v17 and v17+ versions of the platform.
1480945b2238447028b9d274cccccd7fc61042bf03bKirill Grouchnikov
1490945b2238447028b9d274cccccd7fc61042bf03bKirill Grouchnikov        // Start / top aligned under LTR direction
1500945b2238447028b9d274cccccd7fc61042bf03bKirill Grouchnikov        GravityCompat.apply(GravityCompat.START | Gravity.TOP, 100, 50,
1510945b2238447028b9d274cccccd7fc61042bf03bKirill Grouchnikov                new Rect(0, 0, 200, 100), outRect, ViewCompat.LAYOUT_DIRECTION_LTR);
1520945b2238447028b9d274cccccd7fc61042bf03bKirill Grouchnikov        TestUtils.assertRectangleBounds("Start / top aligned under LTR: ",
1530945b2238447028b9d274cccccd7fc61042bf03bKirill Grouchnikov                outRect, 0, 0, 100, 50);
1540945b2238447028b9d274cccccd7fc61042bf03bKirill Grouchnikov
1550945b2238447028b9d274cccccd7fc61042bf03bKirill Grouchnikov        // End / top aligned under LTR direction
1560945b2238447028b9d274cccccd7fc61042bf03bKirill Grouchnikov        GravityCompat.apply(GravityCompat.END | Gravity.TOP, 100, 50,
1570945b2238447028b9d274cccccd7fc61042bf03bKirill Grouchnikov                new Rect(0, 0, 200, 100), outRect, ViewCompat.LAYOUT_DIRECTION_LTR);
1580945b2238447028b9d274cccccd7fc61042bf03bKirill Grouchnikov        TestUtils.assertRectangleBounds("End / top aligned under LTR: ",
1590945b2238447028b9d274cccccd7fc61042bf03bKirill Grouchnikov                outRect, 100, 0, 200, 50);
1600945b2238447028b9d274cccccd7fc61042bf03bKirill Grouchnikov
1610945b2238447028b9d274cccccd7fc61042bf03bKirill Grouchnikov        // Start / center aligned under LTR direction
1620945b2238447028b9d274cccccd7fc61042bf03bKirill Grouchnikov        GravityCompat.apply(GravityCompat.START | Gravity.CENTER_VERTICAL, 100, 50,
1630945b2238447028b9d274cccccd7fc61042bf03bKirill Grouchnikov                new Rect(0, 0, 200, 100), outRect, ViewCompat.LAYOUT_DIRECTION_LTR);
1640945b2238447028b9d274cccccd7fc61042bf03bKirill Grouchnikov        TestUtils.assertRectangleBounds("Start / center aligned under LTR: ",
1650945b2238447028b9d274cccccd7fc61042bf03bKirill Grouchnikov                outRect, 0, 25, 100, 75);
1660945b2238447028b9d274cccccd7fc61042bf03bKirill Grouchnikov
1670945b2238447028b9d274cccccd7fc61042bf03bKirill Grouchnikov        // End / center aligned under LTR direction
1680945b2238447028b9d274cccccd7fc61042bf03bKirill Grouchnikov        GravityCompat.apply(GravityCompat.END | Gravity.CENTER_VERTICAL, 100, 50,
1690945b2238447028b9d274cccccd7fc61042bf03bKirill Grouchnikov                new Rect(0, 0, 200, 100), outRect, ViewCompat.LAYOUT_DIRECTION_LTR);
1700945b2238447028b9d274cccccd7fc61042bf03bKirill Grouchnikov        TestUtils.assertRectangleBounds("End / center aligned under LTR: ",
1710945b2238447028b9d274cccccd7fc61042bf03bKirill Grouchnikov                outRect, 100, 25, 200, 75);
1720945b2238447028b9d274cccccd7fc61042bf03bKirill Grouchnikov
1730945b2238447028b9d274cccccd7fc61042bf03bKirill Grouchnikov        // Start / bottom aligned under LTR direction
1740945b2238447028b9d274cccccd7fc61042bf03bKirill Grouchnikov        GravityCompat.apply(GravityCompat.START | Gravity.BOTTOM, 100, 50,
1750945b2238447028b9d274cccccd7fc61042bf03bKirill Grouchnikov                new Rect(0, 0, 200, 100), outRect, ViewCompat.LAYOUT_DIRECTION_LTR);
1760945b2238447028b9d274cccccd7fc61042bf03bKirill Grouchnikov        TestUtils.assertRectangleBounds("Start / bottom aligned under LTR: ",
1770945b2238447028b9d274cccccd7fc61042bf03bKirill Grouchnikov                outRect, 0, 50, 100, 100);
1780945b2238447028b9d274cccccd7fc61042bf03bKirill Grouchnikov
1790945b2238447028b9d274cccccd7fc61042bf03bKirill Grouchnikov        // End / bottom aligned under LTR direction
1800945b2238447028b9d274cccccd7fc61042bf03bKirill Grouchnikov        GravityCompat.apply(GravityCompat.END | Gravity.BOTTOM, 100, 50,
1810945b2238447028b9d274cccccd7fc61042bf03bKirill Grouchnikov                new Rect(0, 0, 200, 100), outRect, ViewCompat.LAYOUT_DIRECTION_LTR);
1820945b2238447028b9d274cccccd7fc61042bf03bKirill Grouchnikov        TestUtils.assertRectangleBounds("End / bottom aligned under LTR: ",
1830945b2238447028b9d274cccccd7fc61042bf03bKirill Grouchnikov                outRect, 100, 50, 200, 100);
1840945b2238447028b9d274cccccd7fc61042bf03bKirill Grouchnikov    }
1850945b2238447028b9d274cccccd7fc61042bf03bKirill Grouchnikov
186d5bac09cd05be314f4c38435572a3fc01c2c8d4fKirill Grouchnikov    @Test
1870945b2238447028b9d274cccccd7fc61042bf03bKirill Grouchnikov    public void testApplyNoOffsetsRtl() {
1880945b2238447028b9d274cccccd7fc61042bf03bKirill Grouchnikov        Rect outRect = new Rect();
1890945b2238447028b9d274cccccd7fc61042bf03bKirill Grouchnikov
1900945b2238447028b9d274cccccd7fc61042bf03bKirill Grouchnikov        // The following tests are expected to pass on all devices since they are using
1910945b2238447028b9d274cccccd7fc61042bf03bKirill Grouchnikov        // Gravity constants that are not RTL-aware
1920945b2238447028b9d274cccccd7fc61042bf03bKirill Grouchnikov
1930945b2238447028b9d274cccccd7fc61042bf03bKirill Grouchnikov        // Left / top aligned under RTL direction
1940945b2238447028b9d274cccccd7fc61042bf03bKirill Grouchnikov        GravityCompat.apply(Gravity.LEFT | Gravity.TOP, 100, 50,
1950945b2238447028b9d274cccccd7fc61042bf03bKirill Grouchnikov                new Rect(0, 0, 200, 100), outRect, ViewCompat.LAYOUT_DIRECTION_RTL);
1960945b2238447028b9d274cccccd7fc61042bf03bKirill Grouchnikov        TestUtils.assertRectangleBounds("Left / top aligned under RTL: ",
1970945b2238447028b9d274cccccd7fc61042bf03bKirill Grouchnikov                outRect, 0, 0, 100, 50);
1980945b2238447028b9d274cccccd7fc61042bf03bKirill Grouchnikov
1990945b2238447028b9d274cccccd7fc61042bf03bKirill Grouchnikov        // Center / top aligned under RTL direction
2000945b2238447028b9d274cccccd7fc61042bf03bKirill Grouchnikov        GravityCompat.apply(Gravity.CENTER_HORIZONTAL | Gravity.TOP, 100, 50,
2010945b2238447028b9d274cccccd7fc61042bf03bKirill Grouchnikov                new Rect(0, 0, 200, 100), outRect, ViewCompat.LAYOUT_DIRECTION_RTL);
2020945b2238447028b9d274cccccd7fc61042bf03bKirill Grouchnikov        TestUtils.assertRectangleBounds("Center / top aligned under RTL: ",
2030945b2238447028b9d274cccccd7fc61042bf03bKirill Grouchnikov                outRect, 50, 0, 150, 50);
2040945b2238447028b9d274cccccd7fc61042bf03bKirill Grouchnikov
2050945b2238447028b9d274cccccd7fc61042bf03bKirill Grouchnikov        // Right / top aligned under RTL direction
2060945b2238447028b9d274cccccd7fc61042bf03bKirill Grouchnikov        GravityCompat.apply(Gravity.RIGHT | Gravity.TOP, 100, 50,
2070945b2238447028b9d274cccccd7fc61042bf03bKirill Grouchnikov                new Rect(0, 0, 200, 100), outRect, ViewCompat.LAYOUT_DIRECTION_RTL);
2080945b2238447028b9d274cccccd7fc61042bf03bKirill Grouchnikov        TestUtils.assertRectangleBounds("Right / top aligned under RTL: ",
2090945b2238447028b9d274cccccd7fc61042bf03bKirill Grouchnikov                outRect, 100, 0, 200, 50);
2100945b2238447028b9d274cccccd7fc61042bf03bKirill Grouchnikov
2110945b2238447028b9d274cccccd7fc61042bf03bKirill Grouchnikov        // Left / center aligned under RTL direction
2120945b2238447028b9d274cccccd7fc61042bf03bKirill Grouchnikov        GravityCompat.apply(Gravity.LEFT | Gravity.CENTER_VERTICAL, 100, 50,
2130945b2238447028b9d274cccccd7fc61042bf03bKirill Grouchnikov                new Rect(0, 0, 200, 100), outRect, ViewCompat.LAYOUT_DIRECTION_RTL);
2140945b2238447028b9d274cccccd7fc61042bf03bKirill Grouchnikov        TestUtils.assertRectangleBounds("Left / center aligned under RTL: ",
2150945b2238447028b9d274cccccd7fc61042bf03bKirill Grouchnikov                outRect, 0, 25, 100, 75);
2160945b2238447028b9d274cccccd7fc61042bf03bKirill Grouchnikov
2170945b2238447028b9d274cccccd7fc61042bf03bKirill Grouchnikov        // Center / center aligned under RTL direction
2180945b2238447028b9d274cccccd7fc61042bf03bKirill Grouchnikov        GravityCompat.apply(Gravity.CENTER, 100, 50,
2190945b2238447028b9d274cccccd7fc61042bf03bKirill Grouchnikov                new Rect(0, 0, 200, 100), outRect, ViewCompat.LAYOUT_DIRECTION_RTL);
2200945b2238447028b9d274cccccd7fc61042bf03bKirill Grouchnikov        TestUtils.assertRectangleBounds("Center / center aligned under RTL: ",
2210945b2238447028b9d274cccccd7fc61042bf03bKirill Grouchnikov                outRect, 50, 25, 150, 75);
2220945b2238447028b9d274cccccd7fc61042bf03bKirill Grouchnikov
2230945b2238447028b9d274cccccd7fc61042bf03bKirill Grouchnikov        // Right / center aligned under RTL direction
2240945b2238447028b9d274cccccd7fc61042bf03bKirill Grouchnikov        GravityCompat.apply(Gravity.RIGHT | Gravity.CENTER_VERTICAL, 100, 50,
2250945b2238447028b9d274cccccd7fc61042bf03bKirill Grouchnikov                new Rect(0, 0, 200, 100), outRect, ViewCompat.LAYOUT_DIRECTION_RTL);
2260945b2238447028b9d274cccccd7fc61042bf03bKirill Grouchnikov        TestUtils.assertRectangleBounds("Right / center aligned under RTL: ",
2270945b2238447028b9d274cccccd7fc61042bf03bKirill Grouchnikov                outRect, 100, 25, 200, 75);
2280945b2238447028b9d274cccccd7fc61042bf03bKirill Grouchnikov
2290945b2238447028b9d274cccccd7fc61042bf03bKirill Grouchnikov        // Left / bottom aligned under RTL direction
2300945b2238447028b9d274cccccd7fc61042bf03bKirill Grouchnikov        GravityCompat.apply(Gravity.LEFT | Gravity.BOTTOM, 100, 50,
2310945b2238447028b9d274cccccd7fc61042bf03bKirill Grouchnikov                new Rect(0, 0, 200, 100), outRect, ViewCompat.LAYOUT_DIRECTION_RTL);
2320945b2238447028b9d274cccccd7fc61042bf03bKirill Grouchnikov        TestUtils.assertRectangleBounds("Left / bottom aligned under RTL: ",
2330945b2238447028b9d274cccccd7fc61042bf03bKirill Grouchnikov                outRect, 0, 50, 100, 100);
2340945b2238447028b9d274cccccd7fc61042bf03bKirill Grouchnikov
2350945b2238447028b9d274cccccd7fc61042bf03bKirill Grouchnikov        // Center / bottom aligned under RTL direction
2360945b2238447028b9d274cccccd7fc61042bf03bKirill Grouchnikov        GravityCompat.apply(Gravity.CENTER_HORIZONTAL | Gravity.BOTTOM, 100, 50,
2370945b2238447028b9d274cccccd7fc61042bf03bKirill Grouchnikov                new Rect(0, 0, 200, 100), outRect, ViewCompat.LAYOUT_DIRECTION_RTL);
2380945b2238447028b9d274cccccd7fc61042bf03bKirill Grouchnikov        TestUtils.assertRectangleBounds("Center / bottom aligned under RTL: ",
2390945b2238447028b9d274cccccd7fc61042bf03bKirill Grouchnikov                outRect, 50, 50, 150, 100);
2400945b2238447028b9d274cccccd7fc61042bf03bKirill Grouchnikov
2410945b2238447028b9d274cccccd7fc61042bf03bKirill Grouchnikov        // Right / bottom aligned under RTL direction
2420945b2238447028b9d274cccccd7fc61042bf03bKirill Grouchnikov        GravityCompat.apply(Gravity.RIGHT | Gravity.BOTTOM, 100, 50,
2430945b2238447028b9d274cccccd7fc61042bf03bKirill Grouchnikov                new Rect(0, 0, 200, 100), outRect, ViewCompat.LAYOUT_DIRECTION_RTL);
2440945b2238447028b9d274cccccd7fc61042bf03bKirill Grouchnikov        TestUtils.assertRectangleBounds("Right / bottom aligned under RTL: ",
2450945b2238447028b9d274cccccd7fc61042bf03bKirill Grouchnikov                outRect, 100, 50, 200, 100);
2460945b2238447028b9d274cccccd7fc61042bf03bKirill Grouchnikov
2470945b2238447028b9d274cccccd7fc61042bf03bKirill Grouchnikov
2480945b2238447028b9d274cccccd7fc61042bf03bKirill Grouchnikov        if (Build.VERSION.SDK_INT >= 17) {
2490945b2238447028b9d274cccccd7fc61042bf03bKirill Grouchnikov            // The following tests are only expected to pass on v17+ devices since START under
2500945b2238447028b9d274cccccd7fc61042bf03bKirill Grouchnikov            // RTL is RIGHT and END under RTL is LEFT only on those devices.
2510945b2238447028b9d274cccccd7fc61042bf03bKirill Grouchnikov
2520945b2238447028b9d274cccccd7fc61042bf03bKirill Grouchnikov            // Start / top aligned under RTL direction
2530945b2238447028b9d274cccccd7fc61042bf03bKirill Grouchnikov            GravityCompat.apply(GravityCompat.START | Gravity.TOP, 100, 50,
2540945b2238447028b9d274cccccd7fc61042bf03bKirill Grouchnikov                    new Rect(0, 0, 200, 100), outRect, ViewCompat.LAYOUT_DIRECTION_RTL);
2550945b2238447028b9d274cccccd7fc61042bf03bKirill Grouchnikov            TestUtils.assertRectangleBounds("Start / top aligned under RTL: ",
2560945b2238447028b9d274cccccd7fc61042bf03bKirill Grouchnikov                    outRect, 100, 0, 200, 50);
2570945b2238447028b9d274cccccd7fc61042bf03bKirill Grouchnikov
2580945b2238447028b9d274cccccd7fc61042bf03bKirill Grouchnikov            // End / top aligned under RTL direction
2590945b2238447028b9d274cccccd7fc61042bf03bKirill Grouchnikov            GravityCompat.apply(GravityCompat.END | Gravity.TOP, 100, 50,
2600945b2238447028b9d274cccccd7fc61042bf03bKirill Grouchnikov                    new Rect(0, 0, 200, 100), outRect, ViewCompat.LAYOUT_DIRECTION_RTL);
2610945b2238447028b9d274cccccd7fc61042bf03bKirill Grouchnikov            TestUtils.assertRectangleBounds("End / top aligned under RTL: ",
2620945b2238447028b9d274cccccd7fc61042bf03bKirill Grouchnikov                    outRect, 0, 0, 100, 50);
2630945b2238447028b9d274cccccd7fc61042bf03bKirill Grouchnikov
2640945b2238447028b9d274cccccd7fc61042bf03bKirill Grouchnikov            // Start / center aligned under RTL direction
2650945b2238447028b9d274cccccd7fc61042bf03bKirill Grouchnikov            GravityCompat.apply(GravityCompat.START | Gravity.CENTER_VERTICAL, 100, 50,
2660945b2238447028b9d274cccccd7fc61042bf03bKirill Grouchnikov                    new Rect(0, 0, 200, 100), outRect, ViewCompat.LAYOUT_DIRECTION_RTL);
2670945b2238447028b9d274cccccd7fc61042bf03bKirill Grouchnikov            TestUtils.assertRectangleBounds("Start / center aligned under RTL: ",
2680945b2238447028b9d274cccccd7fc61042bf03bKirill Grouchnikov                    outRect, 100, 25, 200, 75);
2690945b2238447028b9d274cccccd7fc61042bf03bKirill Grouchnikov
2700945b2238447028b9d274cccccd7fc61042bf03bKirill Grouchnikov            // End / center aligned under RTL direction
2710945b2238447028b9d274cccccd7fc61042bf03bKirill Grouchnikov            GravityCompat.apply(GravityCompat.END | Gravity.CENTER_VERTICAL, 100, 50,
2720945b2238447028b9d274cccccd7fc61042bf03bKirill Grouchnikov                    new Rect(0, 0, 200, 100), outRect, ViewCompat.LAYOUT_DIRECTION_RTL);
2730945b2238447028b9d274cccccd7fc61042bf03bKirill Grouchnikov            TestUtils.assertRectangleBounds("End / center aligned under RTL: ",
2740945b2238447028b9d274cccccd7fc61042bf03bKirill Grouchnikov                    outRect, 0, 25, 100, 75);
2750945b2238447028b9d274cccccd7fc61042bf03bKirill Grouchnikov
2760945b2238447028b9d274cccccd7fc61042bf03bKirill Grouchnikov            // Start / bottom aligned under RTL direction
2770945b2238447028b9d274cccccd7fc61042bf03bKirill Grouchnikov            GravityCompat.apply(GravityCompat.START | Gravity.BOTTOM, 100, 50,
2780945b2238447028b9d274cccccd7fc61042bf03bKirill Grouchnikov                    new Rect(0, 0, 200, 100), outRect, ViewCompat.LAYOUT_DIRECTION_RTL);
2790945b2238447028b9d274cccccd7fc61042bf03bKirill Grouchnikov            TestUtils.assertRectangleBounds("Start / bottom aligned under RTL: ",
2800945b2238447028b9d274cccccd7fc61042bf03bKirill Grouchnikov                    outRect, 100, 50, 200, 100);
2810945b2238447028b9d274cccccd7fc61042bf03bKirill Grouchnikov
2820945b2238447028b9d274cccccd7fc61042bf03bKirill Grouchnikov            // End / bottom aligned under RTL direction
2830945b2238447028b9d274cccccd7fc61042bf03bKirill Grouchnikov            GravityCompat.apply(GravityCompat.END | Gravity.BOTTOM, 100, 50,
2840945b2238447028b9d274cccccd7fc61042bf03bKirill Grouchnikov                    new Rect(0, 0, 200, 100), outRect, ViewCompat.LAYOUT_DIRECTION_RTL);
2850945b2238447028b9d274cccccd7fc61042bf03bKirill Grouchnikov            TestUtils.assertRectangleBounds("End / bottom aligned under RTL: ",
2860945b2238447028b9d274cccccd7fc61042bf03bKirill Grouchnikov                    outRect, 0, 50, 100, 100);
2870945b2238447028b9d274cccccd7fc61042bf03bKirill Grouchnikov        } else {
2880945b2238447028b9d274cccccd7fc61042bf03bKirill Grouchnikov            // And on older devices START is always LEFT, END is always RIGHT
2890945b2238447028b9d274cccccd7fc61042bf03bKirill Grouchnikov
2900945b2238447028b9d274cccccd7fc61042bf03bKirill Grouchnikov            // Start / top aligned under RTL direction
2910945b2238447028b9d274cccccd7fc61042bf03bKirill Grouchnikov            GravityCompat.apply(GravityCompat.START | Gravity.TOP, 100, 50,
2920945b2238447028b9d274cccccd7fc61042bf03bKirill Grouchnikov                    new Rect(0, 0, 200, 100), outRect, ViewCompat.LAYOUT_DIRECTION_RTL);
2930945b2238447028b9d274cccccd7fc61042bf03bKirill Grouchnikov            TestUtils.assertRectangleBounds("Start / top aligned under RTL: ",
2940945b2238447028b9d274cccccd7fc61042bf03bKirill Grouchnikov                    outRect, 0, 0, 100, 50);
2950945b2238447028b9d274cccccd7fc61042bf03bKirill Grouchnikov
2960945b2238447028b9d274cccccd7fc61042bf03bKirill Grouchnikov            // End / top aligned under RTL direction
2970945b2238447028b9d274cccccd7fc61042bf03bKirill Grouchnikov            GravityCompat.apply(GravityCompat.END | Gravity.TOP, 100, 50,
2980945b2238447028b9d274cccccd7fc61042bf03bKirill Grouchnikov                    new Rect(0, 0, 200, 100), outRect, ViewCompat.LAYOUT_DIRECTION_RTL);
2990945b2238447028b9d274cccccd7fc61042bf03bKirill Grouchnikov            TestUtils.assertRectangleBounds("End / top aligned under RTL: ",
3000945b2238447028b9d274cccccd7fc61042bf03bKirill Grouchnikov                    outRect, 100, 0, 200, 50);
3010945b2238447028b9d274cccccd7fc61042bf03bKirill Grouchnikov
3020945b2238447028b9d274cccccd7fc61042bf03bKirill Grouchnikov            // Start / center aligned under RTL direction
3030945b2238447028b9d274cccccd7fc61042bf03bKirill Grouchnikov            GravityCompat.apply(GravityCompat.START | Gravity.CENTER_VERTICAL, 100, 50,
3040945b2238447028b9d274cccccd7fc61042bf03bKirill Grouchnikov                    new Rect(0, 0, 200, 100), outRect, ViewCompat.LAYOUT_DIRECTION_RTL);
3050945b2238447028b9d274cccccd7fc61042bf03bKirill Grouchnikov            TestUtils.assertRectangleBounds("Start / center aligned under RTL: ",
3060945b2238447028b9d274cccccd7fc61042bf03bKirill Grouchnikov                    outRect, 0, 25, 100, 75);
3070945b2238447028b9d274cccccd7fc61042bf03bKirill Grouchnikov
3080945b2238447028b9d274cccccd7fc61042bf03bKirill Grouchnikov            // End / center aligned under RTL direction
3090945b2238447028b9d274cccccd7fc61042bf03bKirill Grouchnikov            GravityCompat.apply(GravityCompat.END | Gravity.CENTER_VERTICAL, 100, 50,
3100945b2238447028b9d274cccccd7fc61042bf03bKirill Grouchnikov                    new Rect(0, 0, 200, 100), outRect, ViewCompat.LAYOUT_DIRECTION_RTL);
3110945b2238447028b9d274cccccd7fc61042bf03bKirill Grouchnikov            TestUtils.assertRectangleBounds("End / center aligned under RTL: ",
3120945b2238447028b9d274cccccd7fc61042bf03bKirill Grouchnikov                    outRect, 100, 25, 200, 75);
3130945b2238447028b9d274cccccd7fc61042bf03bKirill Grouchnikov
3140945b2238447028b9d274cccccd7fc61042bf03bKirill Grouchnikov            // Start / bottom aligned under RTL direction
3150945b2238447028b9d274cccccd7fc61042bf03bKirill Grouchnikov            GravityCompat.apply(GravityCompat.START | Gravity.BOTTOM, 100, 50,
3160945b2238447028b9d274cccccd7fc61042bf03bKirill Grouchnikov                    new Rect(0, 0, 200, 100), outRect, ViewCompat.LAYOUT_DIRECTION_RTL);
3170945b2238447028b9d274cccccd7fc61042bf03bKirill Grouchnikov            TestUtils.assertRectangleBounds("Start / bottom aligned under RTL: ",
3180945b2238447028b9d274cccccd7fc61042bf03bKirill Grouchnikov                    outRect, 0, 50, 100, 100);
3190945b2238447028b9d274cccccd7fc61042bf03bKirill Grouchnikov
3200945b2238447028b9d274cccccd7fc61042bf03bKirill Grouchnikov            // End / bottom aligned under RTL direction
3210945b2238447028b9d274cccccd7fc61042bf03bKirill Grouchnikov            GravityCompat.apply(GravityCompat.END | Gravity.BOTTOM, 100, 50,
3220945b2238447028b9d274cccccd7fc61042bf03bKirill Grouchnikov                    new Rect(0, 0, 200, 100), outRect, ViewCompat.LAYOUT_DIRECTION_RTL);
3230945b2238447028b9d274cccccd7fc61042bf03bKirill Grouchnikov            TestUtils.assertRectangleBounds("End / bottom aligned under RTL: ",
3240945b2238447028b9d274cccccd7fc61042bf03bKirill Grouchnikov                    outRect, 100, 50, 200, 100);
3250945b2238447028b9d274cccccd7fc61042bf03bKirill Grouchnikov        }
3260945b2238447028b9d274cccccd7fc61042bf03bKirill Grouchnikov    }
3277899d6f64ae6585a79c7c1844d4a5e8f894bf2d7Kirill Grouchnikov}
328