blob: 75ab391cea75bf993d24f9de0985fb4340064d72 [file] [log] [blame]
/*
* Copyright (C) 2015 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package android.support.v17.leanback.graphics;
import android.graphics.Rect;
/**
* This class contains the rules for updating the bounds of a
* {@link CompositeDrawable.ChildDrawable}. It contains four rules, one for each value of the
* rectangular bound - left/top/right/bottom.
*/
public class BoundsRule {
static final int INHERIT_PARENT = 0;
static final int ABSOLUTE_VALUE = 1;
static final int INHERIT_WITH_OFFSET = 2;
/**
* This class represents individual rules for updating the bounds. Currently we support
* 3 different rule types -
*
* <ul>
* <li>inheritFromParent: it applies a percentage to the parent property to compute
* the final value </li>
* <li>absoluteValue: it always used the supplied absolute value</li>
* <li>inheritFromParentWithOffset: this uses a combination of INHERIT_PARENT
* and ABSOLUTE_VALUE. First it applies the percentage on the parent and then adds the
* offset to compute the final value</li>
* </ul>
*/
public final static class ValueRule {
private final int type;
private float fraction;
private int absoluteValue;
ValueRule(int type, int absoluteValue, float fraction) {
this.type = type;
this.absoluteValue = absoluteValue;
this.fraction = fraction;
}
ValueRule(ValueRule rule) {
this.type = rule.type;
this.fraction = rule.fraction;
this.absoluteValue = rule.absoluteValue;
}
/**
* Sets the fractional value (percentage of parent) for this rule.
*/
public void setFraction(float fraction) {
this.fraction = fraction;
}
/**
* Returns the current fractional value.
*/
public float getFraction() {
return fraction;
}
/**
* Sets the absolute value for this rule.
*/
public void setAbsoluteValue(int absoluteValue) {
this.absoluteValue = absoluteValue;
}
/**
* Returns the current absolute value.
*/
public int getAbsoluteValue() {
return absoluteValue;
}
}
/**
* Factory method for creating ValueRule of type INHERIT_FROM_PARENT.
*/
public static ValueRule inheritFromParent(float fraction) {
return new ValueRule(INHERIT_PARENT, 0, fraction);
}
/**
* Factory method for creating ValueRule of type ABSOLUTE_VALUE.
*/
public static ValueRule absoluteValue(int value) {
return new ValueRule(ABSOLUTE_VALUE, value, 0);
}
/**
* Factory method for creating ValueRule of type INHERIT_WITH_OFFSET.
*/
public static ValueRule inheritFromParentWithOffset(float fraction, int value) {
return new ValueRule(INHERIT_WITH_OFFSET, value, fraction);
}
/**
* Takes in the current bounds and sets the final values based on the individual rules in the
* result object.
*
* @param rect Represents the current bounds.
* @param result Represents the final bounds.
*/
public void calculateBounds(Rect rect, Rect result) {
if (left == null) {
result.left = rect.left;
} else {
result.left = doCalculate(rect.left, left, rect.width());
}
if (right == null) {
result.right = rect.right;
} else {
result.right = doCalculate(rect.left, right, rect.width());
}
if (top == null) {
result.top = rect.top;
} else {
result.top = doCalculate(rect.top, top, rect.height());
}
if (bottom == null) {
result.bottom = rect.bottom;
} else {
result.bottom = doCalculate(rect.top, bottom, rect.height());
}
}
public BoundsRule() {}
public BoundsRule(BoundsRule boundsRule) {
this.left = boundsRule.left != null ? new ValueRule(boundsRule.left) : null;
this.right = boundsRule.right != null ? new ValueRule(boundsRule.right) : null;
this.top = boundsRule.top != null ? new ValueRule(boundsRule.top) : null;
this.bottom = boundsRule.bottom != null ? new ValueRule(boundsRule.bottom) : null;
}
private int doCalculate(int value, ValueRule rule, int size) {
int offset = 0;
switch(rule.type) {
case INHERIT_WITH_OFFSET:
offset = rule.absoluteValue;
case INHERIT_PARENT:
return value + offset + (int)(rule.fraction * size);
case ABSOLUTE_VALUE:
return rule.absoluteValue;
}
throw new IllegalArgumentException("Invalid type: "+rule.type);
}
/** {@link ValueRule} for left attribute of {@link BoundsRule} */
public ValueRule left;
/** {@link ValueRule} for top attribute of {@link BoundsRule} */
public ValueRule top;
/** {@link ValueRule} for right attribute of {@link BoundsRule} */
public ValueRule right;
/** {@link ValueRule} for bottom attribute of {@link BoundsRule} */
public ValueRule bottom;
}