1df64e524a2bad079e6b0aa2d22c287f2c62aed82susnata/*
2df64e524a2bad079e6b0aa2d22c287f2c62aed82susnata * Copyright (C) 2015 The Android Open Source Project
3df64e524a2bad079e6b0aa2d22c287f2c62aed82susnata *
4df64e524a2bad079e6b0aa2d22c287f2c62aed82susnata * Licensed under the Apache License, Version 2.0 (the "License");
5df64e524a2bad079e6b0aa2d22c287f2c62aed82susnata * you may not use this file except in compliance with the License.
6df64e524a2bad079e6b0aa2d22c287f2c62aed82susnata * You may obtain a copy of the License at
7df64e524a2bad079e6b0aa2d22c287f2c62aed82susnata *
8df64e524a2bad079e6b0aa2d22c287f2c62aed82susnata *      http://www.apache.org/licenses/LICENSE-2.0
9df64e524a2bad079e6b0aa2d22c287f2c62aed82susnata *
10df64e524a2bad079e6b0aa2d22c287f2c62aed82susnata * Unless required by applicable law or agreed to in writing, software
11df64e524a2bad079e6b0aa2d22c287f2c62aed82susnata * distributed under the License is distributed on an "AS IS" BASIS,
12df64e524a2bad079e6b0aa2d22c287f2c62aed82susnata * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13df64e524a2bad079e6b0aa2d22c287f2c62aed82susnata * See the License for the specific language governing permissions and
14df64e524a2bad079e6b0aa2d22c287f2c62aed82susnata * limitations under the License.
15df64e524a2bad079e6b0aa2d22c287f2c62aed82susnata */
16ac5fe7c617c66850fff75a9fce9979c6e5674b0fAurimas Liutikaspackage androidx.leanback.graphics;
17df64e524a2bad079e6b0aa2d22c287f2c62aed82susnata
18df64e524a2bad079e6b0aa2d22c287f2c62aed82susnataimport android.graphics.Rect;
19df64e524a2bad079e6b0aa2d22c287f2c62aed82susnata
20df64e524a2bad079e6b0aa2d22c287f2c62aed82susnata/**
218be7e7b0b81450f406354f4672d0e0cf7138e127Dake Gu * This class contains the rules for updating the bounds of a
228be7e7b0b81450f406354f4672d0e0cf7138e127Dake Gu * {@link CompositeDrawable.ChildDrawable}. It contains four rules, one for each value of the
238be7e7b0b81450f406354f4672d0e0cf7138e127Dake Gu * rectangular bound - left/top/right/bottom.
24df64e524a2bad079e6b0aa2d22c287f2c62aed82susnata */
25df64e524a2bad079e6b0aa2d22c287f2c62aed82susnatapublic class BoundsRule {
26df64e524a2bad079e6b0aa2d22c287f2c62aed82susnata
27df64e524a2bad079e6b0aa2d22c287f2c62aed82susnata    /**
28bf4318c67254bc11307796601b9fb4a8bbfe67b2Dake Gu     * This class represents individual rules for updating the bounds.
29df64e524a2bad079e6b0aa2d22c287f2c62aed82susnata     */
303d9017263a760990ba79d5ebf3d1b6587e0bd311susnata    public final static class ValueRule {
31bf4318c67254bc11307796601b9fb4a8bbfe67b2Dake Gu        float mFraction;
32bf4318c67254bc11307796601b9fb4a8bbfe67b2Dake Gu        int mAbsoluteValue;
33bf4318c67254bc11307796601b9fb4a8bbfe67b2Dake Gu
34bf4318c67254bc11307796601b9fb4a8bbfe67b2Dake Gu        /**
35bf4318c67254bc11307796601b9fb4a8bbfe67b2Dake Gu         * Creates ValueRule using a fraction of parent size.
36bf4318c67254bc11307796601b9fb4a8bbfe67b2Dake Gu         *
37bf4318c67254bc11307796601b9fb4a8bbfe67b2Dake Gu         * @param fraction Percentage of parent.
38bf4318c67254bc11307796601b9fb4a8bbfe67b2Dake Gu         * @return Newly created ValueRule.
39bf4318c67254bc11307796601b9fb4a8bbfe67b2Dake Gu         */
40bf4318c67254bc11307796601b9fb4a8bbfe67b2Dake Gu        public static ValueRule inheritFromParent(float fraction) {
41bf4318c67254bc11307796601b9fb4a8bbfe67b2Dake Gu            return new ValueRule(0, fraction);
42bf4318c67254bc11307796601b9fb4a8bbfe67b2Dake Gu        }
43bf4318c67254bc11307796601b9fb4a8bbfe67b2Dake Gu
44bf4318c67254bc11307796601b9fb4a8bbfe67b2Dake Gu        /**
45bf4318c67254bc11307796601b9fb4a8bbfe67b2Dake Gu         * Creates ValueRule using an absolute value.
46bf4318c67254bc11307796601b9fb4a8bbfe67b2Dake Gu         *
47bf4318c67254bc11307796601b9fb4a8bbfe67b2Dake Gu         * @param absoluteValue Absolute value.
48bf4318c67254bc11307796601b9fb4a8bbfe67b2Dake Gu         * @return Newly created ValueRule.
49bf4318c67254bc11307796601b9fb4a8bbfe67b2Dake Gu         */
50bf4318c67254bc11307796601b9fb4a8bbfe67b2Dake Gu        public static ValueRule absoluteValue(int absoluteValue) {
51bf4318c67254bc11307796601b9fb4a8bbfe67b2Dake Gu            return new ValueRule(absoluteValue, 0);
52bf4318c67254bc11307796601b9fb4a8bbfe67b2Dake Gu        }
53bf4318c67254bc11307796601b9fb4a8bbfe67b2Dake Gu
54bf4318c67254bc11307796601b9fb4a8bbfe67b2Dake Gu        /**
55bf4318c67254bc11307796601b9fb4a8bbfe67b2Dake Gu         * Creates ValueRule of fraction and offset.
56bf4318c67254bc11307796601b9fb4a8bbfe67b2Dake Gu         *
57bf4318c67254bc11307796601b9fb4a8bbfe67b2Dake Gu         * @param fraction Percentage of parent.
58bf4318c67254bc11307796601b9fb4a8bbfe67b2Dake Gu         * @param value    Offset
59bf4318c67254bc11307796601b9fb4a8bbfe67b2Dake Gu         * @return Newly created ValueRule.
60bf4318c67254bc11307796601b9fb4a8bbfe67b2Dake Gu         */
61bf4318c67254bc11307796601b9fb4a8bbfe67b2Dake Gu        public static ValueRule inheritFromParentWithOffset(float fraction, int value) {
62bf4318c67254bc11307796601b9fb4a8bbfe67b2Dake Gu            return new ValueRule(value, fraction);
63bf4318c67254bc11307796601b9fb4a8bbfe67b2Dake Gu        }
64bf4318c67254bc11307796601b9fb4a8bbfe67b2Dake Gu
65bf4318c67254bc11307796601b9fb4a8bbfe67b2Dake Gu        ValueRule(int absoluteValue, float fraction) {
66bf4318c67254bc11307796601b9fb4a8bbfe67b2Dake Gu            this.mAbsoluteValue = absoluteValue;
67bf4318c67254bc11307796601b9fb4a8bbfe67b2Dake Gu            this.mFraction = fraction;
68df64e524a2bad079e6b0aa2d22c287f2c62aed82susnata        }
693d9017263a760990ba79d5ebf3d1b6587e0bd311susnata
70450fe7ab2d8a911ecdc335d55c60dfbae70f2407susnata        ValueRule(ValueRule rule) {
71bf4318c67254bc11307796601b9fb4a8bbfe67b2Dake Gu            this.mFraction = rule.mFraction;
72bf4318c67254bc11307796601b9fb4a8bbfe67b2Dake Gu            this.mAbsoluteValue = rule.mAbsoluteValue;
73450fe7ab2d8a911ecdc335d55c60dfbae70f2407susnata        }
74450fe7ab2d8a911ecdc335d55c60dfbae70f2407susnata
753d9017263a760990ba79d5ebf3d1b6587e0bd311susnata        /**
763d9017263a760990ba79d5ebf3d1b6587e0bd311susnata         * Sets the fractional value (percentage of parent) for this rule.
77bf4318c67254bc11307796601b9fb4a8bbfe67b2Dake Gu         *
78bf4318c67254bc11307796601b9fb4a8bbfe67b2Dake Gu         * @param fraction Percentage of parent.
793d9017263a760990ba79d5ebf3d1b6587e0bd311susnata         */
803d9017263a760990ba79d5ebf3d1b6587e0bd311susnata        public void setFraction(float fraction) {
81bf4318c67254bc11307796601b9fb4a8bbfe67b2Dake Gu            this.mFraction = fraction;
823d9017263a760990ba79d5ebf3d1b6587e0bd311susnata        }
833d9017263a760990ba79d5ebf3d1b6587e0bd311susnata
843d9017263a760990ba79d5ebf3d1b6587e0bd311susnata        /**
85bf4318c67254bc11307796601b9fb4a8bbfe67b2Dake Gu         * @return The current fractional value.
863d9017263a760990ba79d5ebf3d1b6587e0bd311susnata         */
873d9017263a760990ba79d5ebf3d1b6587e0bd311susnata        public float getFraction() {
88bf4318c67254bc11307796601b9fb4a8bbfe67b2Dake Gu            return mFraction;
893d9017263a760990ba79d5ebf3d1b6587e0bd311susnata        }
903d9017263a760990ba79d5ebf3d1b6587e0bd311susnata
913d9017263a760990ba79d5ebf3d1b6587e0bd311susnata        /**
92bf4318c67254bc11307796601b9fb4a8bbfe67b2Dake Gu         * Sets the absolute/offset value for rule.
93bf4318c67254bc11307796601b9fb4a8bbfe67b2Dake Gu         *
94bf4318c67254bc11307796601b9fb4a8bbfe67b2Dake Gu         * @param absoluteValue Absolute value.
953d9017263a760990ba79d5ebf3d1b6587e0bd311susnata         */
963d9017263a760990ba79d5ebf3d1b6587e0bd311susnata        public void setAbsoluteValue(int absoluteValue) {
97bf4318c67254bc11307796601b9fb4a8bbfe67b2Dake Gu            this.mAbsoluteValue = absoluteValue;
983d9017263a760990ba79d5ebf3d1b6587e0bd311susnata        }
993d9017263a760990ba79d5ebf3d1b6587e0bd311susnata
1003d9017263a760990ba79d5ebf3d1b6587e0bd311susnata        /**
101bf4318c67254bc11307796601b9fb4a8bbfe67b2Dake Gu         * @return The current absolute/offset value forrule.
1023d9017263a760990ba79d5ebf3d1b6587e0bd311susnata         */
1033d9017263a760990ba79d5ebf3d1b6587e0bd311susnata        public int getAbsoluteValue() {
104bf4318c67254bc11307796601b9fb4a8bbfe67b2Dake Gu            return mAbsoluteValue;
1053d9017263a760990ba79d5ebf3d1b6587e0bd311susnata        }
106df64e524a2bad079e6b0aa2d22c287f2c62aed82susnata
107df64e524a2bad079e6b0aa2d22c287f2c62aed82susnata    }
108df64e524a2bad079e6b0aa2d22c287f2c62aed82susnata
109df64e524a2bad079e6b0aa2d22c287f2c62aed82susnata    /**
110df64e524a2bad079e6b0aa2d22c287f2c62aed82susnata     * Takes in the current bounds and sets the final values based on the individual rules in the
111df64e524a2bad079e6b0aa2d22c287f2c62aed82susnata     * result object.
112df64e524a2bad079e6b0aa2d22c287f2c62aed82susnata     *
113df64e524a2bad079e6b0aa2d22c287f2c62aed82susnata     * @param rect Represents the current bounds.
114df64e524a2bad079e6b0aa2d22c287f2c62aed82susnata     * @param result Represents the final bounds.
115df64e524a2bad079e6b0aa2d22c287f2c62aed82susnata     */
116df64e524a2bad079e6b0aa2d22c287f2c62aed82susnata    public void calculateBounds(Rect rect, Rect result) {
117e1cde4d4ac42a6e9e16aad2b4df970c7c7d0771cDake Gu        if (left == null) {
118df64e524a2bad079e6b0aa2d22c287f2c62aed82susnata            result.left = rect.left;
119df64e524a2bad079e6b0aa2d22c287f2c62aed82susnata        } else {
120e1cde4d4ac42a6e9e16aad2b4df970c7c7d0771cDake Gu            result.left = doCalculate(rect.left, left, rect.width());
121df64e524a2bad079e6b0aa2d22c287f2c62aed82susnata        }
122df64e524a2bad079e6b0aa2d22c287f2c62aed82susnata
123e1cde4d4ac42a6e9e16aad2b4df970c7c7d0771cDake Gu        if (right == null) {
124df64e524a2bad079e6b0aa2d22c287f2c62aed82susnata            result.right = rect.right;
125df64e524a2bad079e6b0aa2d22c287f2c62aed82susnata        } else {
126e1cde4d4ac42a6e9e16aad2b4df970c7c7d0771cDake Gu            result.right = doCalculate(rect.left, right, rect.width());
127df64e524a2bad079e6b0aa2d22c287f2c62aed82susnata        }
128df64e524a2bad079e6b0aa2d22c287f2c62aed82susnata
129e1cde4d4ac42a6e9e16aad2b4df970c7c7d0771cDake Gu        if (top == null) {
130df64e524a2bad079e6b0aa2d22c287f2c62aed82susnata            result.top = rect.top;
131df64e524a2bad079e6b0aa2d22c287f2c62aed82susnata        } else {
132e1cde4d4ac42a6e9e16aad2b4df970c7c7d0771cDake Gu            result.top = doCalculate(rect.top, top, rect.height());
133df64e524a2bad079e6b0aa2d22c287f2c62aed82susnata        }
134df64e524a2bad079e6b0aa2d22c287f2c62aed82susnata
135e1cde4d4ac42a6e9e16aad2b4df970c7c7d0771cDake Gu        if (bottom == null) {
136df64e524a2bad079e6b0aa2d22c287f2c62aed82susnata            result.bottom = rect.bottom;
137df64e524a2bad079e6b0aa2d22c287f2c62aed82susnata        } else {
138e1cde4d4ac42a6e9e16aad2b4df970c7c7d0771cDake Gu            result.bottom = doCalculate(rect.top, bottom, rect.height());
139df64e524a2bad079e6b0aa2d22c287f2c62aed82susnata        }
140df64e524a2bad079e6b0aa2d22c287f2c62aed82susnata    }
141df64e524a2bad079e6b0aa2d22c287f2c62aed82susnata
142450fe7ab2d8a911ecdc335d55c60dfbae70f2407susnata    public BoundsRule() {}
143450fe7ab2d8a911ecdc335d55c60dfbae70f2407susnata
144450fe7ab2d8a911ecdc335d55c60dfbae70f2407susnata    public BoundsRule(BoundsRule boundsRule) {
145e1cde4d4ac42a6e9e16aad2b4df970c7c7d0771cDake Gu        this.left = boundsRule.left != null ? new ValueRule(boundsRule.left) : null;
146e1cde4d4ac42a6e9e16aad2b4df970c7c7d0771cDake Gu        this.right = boundsRule.right != null ? new ValueRule(boundsRule.right) : null;
147e1cde4d4ac42a6e9e16aad2b4df970c7c7d0771cDake Gu        this.top = boundsRule.top != null ? new ValueRule(boundsRule.top) : null;
148e1cde4d4ac42a6e9e16aad2b4df970c7c7d0771cDake Gu        this.bottom = boundsRule.bottom != null ? new ValueRule(boundsRule.bottom) : null;
149450fe7ab2d8a911ecdc335d55c60dfbae70f2407susnata    }
150450fe7ab2d8a911ecdc335d55c60dfbae70f2407susnata
151df64e524a2bad079e6b0aa2d22c287f2c62aed82susnata    private int doCalculate(int value, ValueRule rule, int size) {
152bf4318c67254bc11307796601b9fb4a8bbfe67b2Dake Gu        return value + rule.mAbsoluteValue + (int) (rule.mFraction * size);
153df64e524a2bad079e6b0aa2d22c287f2c62aed82susnata    }
154df64e524a2bad079e6b0aa2d22c287f2c62aed82susnata
155df64e524a2bad079e6b0aa2d22c287f2c62aed82susnata    /** {@link ValueRule} for left attribute of {@link BoundsRule} */
156e1cde4d4ac42a6e9e16aad2b4df970c7c7d0771cDake Gu    public ValueRule left;
157df64e524a2bad079e6b0aa2d22c287f2c62aed82susnata
158df64e524a2bad079e6b0aa2d22c287f2c62aed82susnata    /** {@link ValueRule} for top attribute of {@link BoundsRule} */
159e1cde4d4ac42a6e9e16aad2b4df970c7c7d0771cDake Gu    public ValueRule top;
160df64e524a2bad079e6b0aa2d22c287f2c62aed82susnata
161df64e524a2bad079e6b0aa2d22c287f2c62aed82susnata    /** {@link ValueRule} for right attribute of {@link BoundsRule} */
162e1cde4d4ac42a6e9e16aad2b4df970c7c7d0771cDake Gu    public ValueRule right;
163df64e524a2bad079e6b0aa2d22c287f2c62aed82susnata
164df64e524a2bad079e6b0aa2d22c287f2c62aed82susnata    /** {@link ValueRule} for bottom attribute of {@link BoundsRule} */
165e1cde4d4ac42a6e9e16aad2b4df970c7c7d0771cDake Gu    public ValueRule bottom;
166df64e524a2bad079e6b0aa2d22c287f2c62aed82susnata}
167