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