1/*
2 * Copyright (C) 2015 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except
5 * in compliance with the License. You may obtain a copy of the License at
6 *
7 * http://www.apache.org/licenses/LICENSE-2.0
8 *
9 * Unless required by applicable law or agreed to in writing, software distributed under the License
10 * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express
11 * or implied. See the License for the specific language governing permissions and limitations under
12 * the License.
13 */
14package android.support.v17.leanback.widget;
15
16import static android.support.v17.leanback.widget.ItemAlignmentFacet.ITEM_ALIGN_OFFSET_PERCENT_DISABLED;
17import static android.support.v7.widget.RecyclerView.HORIZONTAL;
18
19import android.graphics.Paint;
20import android.graphics.Rect;
21import android.support.v17.leanback.widget.GridLayoutManager.LayoutParams;
22import android.view.View;
23import android.view.ViewGroup;
24import android.widget.TextView;
25
26/**
27 * Helper class to handle ItemAlignmentFacet in a grid view.
28 */
29class ItemAlignmentFacetHelper {
30
31    private static Rect sRect = new Rect();
32
33    /**
34     * get alignment position relative to optical left/top of itemView.
35     */
36    static int getAlignmentPosition(View itemView, ItemAlignmentFacet.ItemAlignmentDef facet,
37            int orientation) {
38        LayoutParams p = (LayoutParams) itemView.getLayoutParams();
39        View view = itemView;
40        if (facet.mViewId != 0) {
41            view = itemView.findViewById(facet.mViewId);
42            if (view == null) {
43                view = itemView;
44            }
45        }
46        int alignPos = facet.mOffset;
47        if (orientation == HORIZONTAL) {
48            if (facet.mOffset >= 0) {
49                if (facet.mOffsetWithPadding) {
50                    alignPos += view.getPaddingLeft();
51                }
52            } else {
53                if (facet.mOffsetWithPadding) {
54                    alignPos -= view.getPaddingRight();
55                }
56            }
57            if (facet.mOffsetPercent != ITEM_ALIGN_OFFSET_PERCENT_DISABLED) {
58                alignPos += ((view == itemView ? p.getOpticalWidth(view) : view.getWidth())
59                        * facet.mOffsetPercent) / 100f;
60            }
61            if (itemView != view) {
62                sRect.left = alignPos;
63                ((ViewGroup) itemView).offsetDescendantRectToMyCoords(view, sRect);
64                alignPos = sRect.left - p.getOpticalLeftInset();
65            }
66        } else {
67            if (facet.mOffset >= 0) {
68                if (facet.mOffsetWithPadding) {
69                    alignPos += view.getPaddingTop();
70                }
71            } else {
72                if (facet.mOffsetWithPadding) {
73                    alignPos -= view.getPaddingBottom();
74                }
75            }
76            if (facet.mOffsetPercent != ITEM_ALIGN_OFFSET_PERCENT_DISABLED) {
77                alignPos += ((view == itemView ? p.getOpticalHeight(view) : view.getHeight())
78                        * facet.mOffsetPercent) / 100f;
79            }
80            if (itemView != view) {
81                sRect.top = alignPos;
82                ((ViewGroup) itemView).offsetDescendantRectToMyCoords(view, sRect);
83                alignPos = sRect.top - p.getOpticalTopInset();
84            }
85            if (view instanceof TextView && facet.isAlignedToTextViewBaseLine()) {
86                Paint textPaint = ((TextView)view).getPaint();
87                int titleViewTextHeight = -textPaint.getFontMetricsInt().top;
88                alignPos += titleViewTextHeight;
89            }
90        }
91        return alignPos;
92    }
93
94}
95