108c56822b71ab0aa0b9bb03e5fd45e28f6e358b8Dake Gu/*
208c56822b71ab0aa0b9bb03e5fd45e28f6e358b8Dake Gu * Copyright (C) 2015 The Android Open Source Project
308c56822b71ab0aa0b9bb03e5fd45e28f6e358b8Dake Gu *
408c56822b71ab0aa0b9bb03e5fd45e28f6e358b8Dake Gu * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except
508c56822b71ab0aa0b9bb03e5fd45e28f6e358b8Dake Gu * in compliance with the License. You may obtain a copy of the License at
608c56822b71ab0aa0b9bb03e5fd45e28f6e358b8Dake Gu *
708c56822b71ab0aa0b9bb03e5fd45e28f6e358b8Dake Gu * http://www.apache.org/licenses/LICENSE-2.0
808c56822b71ab0aa0b9bb03e5fd45e28f6e358b8Dake Gu *
908c56822b71ab0aa0b9bb03e5fd45e28f6e358b8Dake Gu * Unless required by applicable law or agreed to in writing, software distributed under the License
1008c56822b71ab0aa0b9bb03e5fd45e28f6e358b8Dake Gu * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express
1108c56822b71ab0aa0b9bb03e5fd45e28f6e358b8Dake Gu * or implied. See the License for the specific language governing permissions and limitations under
1208c56822b71ab0aa0b9bb03e5fd45e28f6e358b8Dake Gu * the License.
1308c56822b71ab0aa0b9bb03e5fd45e28f6e358b8Dake Gu */
14ac5fe7c617c66850fff75a9fce9979c6e5674b0fAurimas Liutikaspackage androidx.leanback.widget;
1508c56822b71ab0aa0b9bb03e5fd45e28f6e358b8Dake Gu
16ac5fe7c617c66850fff75a9fce9979c6e5674b0fAurimas Liutikasimport static androidx.leanback.widget.ItemAlignmentFacet.ITEM_ALIGN_OFFSET_PERCENT_DISABLED;
17ac5fe7c617c66850fff75a9fce9979c6e5674b0fAurimas Liutikasimport static androidx.recyclerview.widget.RecyclerView.HORIZONTAL;
1808c56822b71ab0aa0b9bb03e5fd45e28f6e358b8Dake Gu
1908c56822b71ab0aa0b9bb03e5fd45e28f6e358b8Dake Guimport android.graphics.Rect;
2008c56822b71ab0aa0b9bb03e5fd45e28f6e358b8Dake Guimport android.view.View;
2108c56822b71ab0aa0b9bb03e5fd45e28f6e358b8Dake Guimport android.view.ViewGroup;
2208c56822b71ab0aa0b9bb03e5fd45e28f6e358b8Dake Gu
238619e0ef7062b6a714f22af993e4b440fae7ef08Aurimas Liutikasimport androidx.leanback.widget.GridLayoutManager.LayoutParams;
248619e0ef7062b6a714f22af993e4b440fae7ef08Aurimas Liutikas
2508c56822b71ab0aa0b9bb03e5fd45e28f6e358b8Dake Gu/**
2608c56822b71ab0aa0b9bb03e5fd45e28f6e358b8Dake Gu * Helper class to handle ItemAlignmentFacet in a grid view.
2708c56822b71ab0aa0b9bb03e5fd45e28f6e358b8Dake Gu */
2808c56822b71ab0aa0b9bb03e5fd45e28f6e358b8Dake Guclass ItemAlignmentFacetHelper {
2908c56822b71ab0aa0b9bb03e5fd45e28f6e358b8Dake Gu
3008c56822b71ab0aa0b9bb03e5fd45e28f6e358b8Dake Gu    private static Rect sRect = new Rect();
3108c56822b71ab0aa0b9bb03e5fd45e28f6e358b8Dake Gu
3208c56822b71ab0aa0b9bb03e5fd45e28f6e358b8Dake Gu    /**
3308c56822b71ab0aa0b9bb03e5fd45e28f6e358b8Dake Gu     * get alignment position relative to optical left/top of itemView.
3408c56822b71ab0aa0b9bb03e5fd45e28f6e358b8Dake Gu     */
3508c56822b71ab0aa0b9bb03e5fd45e28f6e358b8Dake Gu    static int getAlignmentPosition(View itemView, ItemAlignmentFacet.ItemAlignmentDef facet,
3608c56822b71ab0aa0b9bb03e5fd45e28f6e358b8Dake Gu            int orientation) {
3708c56822b71ab0aa0b9bb03e5fd45e28f6e358b8Dake Gu        LayoutParams p = (LayoutParams) itemView.getLayoutParams();
3808c56822b71ab0aa0b9bb03e5fd45e28f6e358b8Dake Gu        View view = itemView;
3908c56822b71ab0aa0b9bb03e5fd45e28f6e358b8Dake Gu        if (facet.mViewId != 0) {
4008c56822b71ab0aa0b9bb03e5fd45e28f6e358b8Dake Gu            view = itemView.findViewById(facet.mViewId);
4108c56822b71ab0aa0b9bb03e5fd45e28f6e358b8Dake Gu            if (view == null) {
4208c56822b71ab0aa0b9bb03e5fd45e28f6e358b8Dake Gu                view = itemView;
4308c56822b71ab0aa0b9bb03e5fd45e28f6e358b8Dake Gu            }
4408c56822b71ab0aa0b9bb03e5fd45e28f6e358b8Dake Gu        }
4508c56822b71ab0aa0b9bb03e5fd45e28f6e358b8Dake Gu        int alignPos = facet.mOffset;
4608c56822b71ab0aa0b9bb03e5fd45e28f6e358b8Dake Gu        if (orientation == HORIZONTAL) {
47bc6713f8e2fa9702675dc3827591ed401b539723Dake Gu            if (itemView.getLayoutDirection() == View.LAYOUT_DIRECTION_RTL) {
48bc6713f8e2fa9702675dc3827591ed401b539723Dake Gu                alignPos = (view == itemView ? p.getOpticalWidth(view)
49bc6713f8e2fa9702675dc3827591ed401b539723Dake Gu                        : view.getWidth()) - alignPos;
5008c56822b71ab0aa0b9bb03e5fd45e28f6e358b8Dake Gu                if (facet.mOffsetWithPadding) {
51bc6713f8e2fa9702675dc3827591ed401b539723Dake Gu                    if (facet.mOffsetPercent == 0f) {
52bc6713f8e2fa9702675dc3827591ed401b539723Dake Gu                        alignPos -= view.getPaddingRight();
53bc6713f8e2fa9702675dc3827591ed401b539723Dake Gu                    } else if (facet.mOffsetPercent == 100f) {
54bc6713f8e2fa9702675dc3827591ed401b539723Dake Gu                        alignPos += view.getPaddingLeft();
55bc6713f8e2fa9702675dc3827591ed401b539723Dake Gu                    }
5608c56822b71ab0aa0b9bb03e5fd45e28f6e358b8Dake Gu                }
57bc6713f8e2fa9702675dc3827591ed401b539723Dake Gu                if (facet.mOffsetPercent != ITEM_ALIGN_OFFSET_PERCENT_DISABLED) {
58bc6713f8e2fa9702675dc3827591ed401b539723Dake Gu                    alignPos -= (int) (((view == itemView ? p.getOpticalWidth(view)
59bc6713f8e2fa9702675dc3827591ed401b539723Dake Gu                            : view.getWidth()) * facet.mOffsetPercent) / 100f);
60bc6713f8e2fa9702675dc3827591ed401b539723Dake Gu                }
61bc6713f8e2fa9702675dc3827591ed401b539723Dake Gu                if (itemView != view) {
62bc6713f8e2fa9702675dc3827591ed401b539723Dake Gu                    sRect.right = alignPos;
63bc6713f8e2fa9702675dc3827591ed401b539723Dake Gu                    ((ViewGroup) itemView).offsetDescendantRectToMyCoords(view, sRect);
64bc6713f8e2fa9702675dc3827591ed401b539723Dake Gu                    alignPos = sRect.right + p.getOpticalRightInset();
65bc6713f8e2fa9702675dc3827591ed401b539723Dake Gu                }
66bc6713f8e2fa9702675dc3827591ed401b539723Dake Gu            } else  {
6708c56822b71ab0aa0b9bb03e5fd45e28f6e358b8Dake Gu                if (facet.mOffsetWithPadding) {
68bc6713f8e2fa9702675dc3827591ed401b539723Dake Gu                    if (facet.mOffsetPercent == 0f) {
69bc6713f8e2fa9702675dc3827591ed401b539723Dake Gu                        alignPos += view.getPaddingLeft();
70bc6713f8e2fa9702675dc3827591ed401b539723Dake Gu                    } else if (facet.mOffsetPercent == 100f) {
71bc6713f8e2fa9702675dc3827591ed401b539723Dake Gu                        alignPos -= view.getPaddingRight();
72bc6713f8e2fa9702675dc3827591ed401b539723Dake Gu                    }
73bc6713f8e2fa9702675dc3827591ed401b539723Dake Gu                }
74bc6713f8e2fa9702675dc3827591ed401b539723Dake Gu                if (facet.mOffsetPercent != ITEM_ALIGN_OFFSET_PERCENT_DISABLED) {
75bc6713f8e2fa9702675dc3827591ed401b539723Dake Gu                    alignPos += (int) (((view == itemView ? p.getOpticalWidth(view)
76bc6713f8e2fa9702675dc3827591ed401b539723Dake Gu                            : view.getWidth()) * facet.mOffsetPercent) / 100f);
77bc6713f8e2fa9702675dc3827591ed401b539723Dake Gu                }
78bc6713f8e2fa9702675dc3827591ed401b539723Dake Gu                if (itemView != view) {
79bc6713f8e2fa9702675dc3827591ed401b539723Dake Gu                    sRect.left = alignPos;
80bc6713f8e2fa9702675dc3827591ed401b539723Dake Gu                    ((ViewGroup) itemView).offsetDescendantRectToMyCoords(view, sRect);
81bc6713f8e2fa9702675dc3827591ed401b539723Dake Gu                    alignPos = sRect.left - p.getOpticalLeftInset();
8208c56822b71ab0aa0b9bb03e5fd45e28f6e358b8Dake Gu                }
8308c56822b71ab0aa0b9bb03e5fd45e28f6e358b8Dake Gu            }
8408c56822b71ab0aa0b9bb03e5fd45e28f6e358b8Dake Gu        } else {
85bc6713f8e2fa9702675dc3827591ed401b539723Dake Gu            if (facet.mOffsetWithPadding) {
86bc6713f8e2fa9702675dc3827591ed401b539723Dake Gu                if (facet.mOffsetPercent == 0f) {
8708c56822b71ab0aa0b9bb03e5fd45e28f6e358b8Dake Gu                    alignPos += view.getPaddingTop();
88bc6713f8e2fa9702675dc3827591ed401b539723Dake Gu                } else if (facet.mOffsetPercent == 100f) {
8908c56822b71ab0aa0b9bb03e5fd45e28f6e358b8Dake Gu                    alignPos -= view.getPaddingBottom();
9008c56822b71ab0aa0b9bb03e5fd45e28f6e358b8Dake Gu                }
9108c56822b71ab0aa0b9bb03e5fd45e28f6e358b8Dake Gu            }
9208c56822b71ab0aa0b9bb03e5fd45e28f6e358b8Dake Gu            if (facet.mOffsetPercent != ITEM_ALIGN_OFFSET_PERCENT_DISABLED) {
93985d0981d78f9ea1602e5562fda5f08a2fa8748cDake Gu                alignPos += (int) (((view == itemView ? p.getOpticalHeight(view) : view.getHeight())
94694edde99dc3782374977dab6d9aa34a16c13337Dake Gu                        * facet.mOffsetPercent) / 100f);
9508c56822b71ab0aa0b9bb03e5fd45e28f6e358b8Dake Gu            }
9608c56822b71ab0aa0b9bb03e5fd45e28f6e358b8Dake Gu            if (itemView != view) {
9708c56822b71ab0aa0b9bb03e5fd45e28f6e358b8Dake Gu                sRect.top = alignPos;
9808c56822b71ab0aa0b9bb03e5fd45e28f6e358b8Dake Gu                ((ViewGroup) itemView).offsetDescendantRectToMyCoords(view, sRect);
9908c56822b71ab0aa0b9bb03e5fd45e28f6e358b8Dake Gu                alignPos = sRect.top - p.getOpticalTopInset();
10008c56822b71ab0aa0b9bb03e5fd45e28f6e358b8Dake Gu            }
1013a585b405904d1d8dc9c714ae06da4441a07382dDake Gu            if (facet.isAlignedToTextViewBaseLine()) {
1023a585b405904d1d8dc9c714ae06da4441a07382dDake Gu                alignPos += view.getBaseline();
10350c611b216a4b2c8eb2bbd2a2848bb6da34677besusnata            }
10408c56822b71ab0aa0b9bb03e5fd45e28f6e358b8Dake Gu        }
10508c56822b71ab0aa0b9bb03e5fd45e28f6e358b8Dake Gu        return alignPos;
10608c56822b71ab0aa0b9bb03e5fd45e28f6e358b8Dake Gu    }
10708c56822b71ab0aa0b9bb03e5fd45e28f6e358b8Dake Gu
1080f4ca634bbc43ddff900c35f7d2a43b55d8c830dJake Wharton    private ItemAlignmentFacetHelper() {
1090f4ca634bbc43ddff900c35f7d2a43b55d8c830dJake Wharton    }
11008c56822b71ab0aa0b9bb03e5fd45e28f6e358b8Dake Gu}
111