CompositeDrawable.java revision 3d9017263a760990ba79d5ebf3d1b6587e0bd311
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 */
16df64e524a2bad079e6b0aa2d22c287f2c62aed82susnatapackage android.support.v17.leanback.graphics;
17df64e524a2bad079e6b0aa2d22c287f2c62aed82susnata
183d9017263a760990ba79d5ebf3d1b6587e0bd311susnataimport android.annotation.TargetApi;
19df64e524a2bad079e6b0aa2d22c287f2c62aed82susnataimport android.graphics.Canvas;
20df64e524a2bad079e6b0aa2d22c287f2c62aed82susnataimport android.graphics.ColorFilter;
21df64e524a2bad079e6b0aa2d22c287f2c62aed82susnataimport android.graphics.PixelFormat;
22df64e524a2bad079e6b0aa2d22c287f2c62aed82susnataimport android.graphics.Rect;
23df64e524a2bad079e6b0aa2d22c287f2c62aed82susnataimport android.graphics.drawable.Drawable;
243d9017263a760990ba79d5ebf3d1b6587e0bd311susnataimport android.os.Build;
253d9017263a760990ba79d5ebf3d1b6587e0bd311susnataimport android.util.Property;
26df64e524a2bad079e6b0aa2d22c287f2c62aed82susnata
27df64e524a2bad079e6b0aa2d22c287f2c62aed82susnataimport java.util.ArrayList;
28df64e524a2bad079e6b0aa2d22c287f2c62aed82susnata
29df64e524a2bad079e6b0aa2d22c287f2c62aed82susnata/**
303d9017263a760990ba79d5ebf3d1b6587e0bd311susnata * Generic drawable class that can be composed of multiple children. Whenever the bounds changes
313d9017263a760990ba79d5ebf3d1b6587e0bd311susnata * for this class, it updates those of it's children by calling {@link ChildDrawable#updateBounds}.
32df64e524a2bad079e6b0aa2d22c287f2c62aed82susnata */
333d9017263a760990ba79d5ebf3d1b6587e0bd311susnata@TargetApi(Build.VERSION_CODES.ICE_CREAM_SANDWICH)
343d9017263a760990ba79d5ebf3d1b6587e0bd311susnatapublic class CompositeDrawable extends Drawable implements Drawable.Callback {
353d9017263a760990ba79d5ebf3d1b6587e0bd311susnata    protected ArrayList<ChildDrawable> children = new ArrayList();
36df64e524a2bad079e6b0aa2d22c287f2c62aed82susnata
37df64e524a2bad079e6b0aa2d22c287f2c62aed82susnata    /**
38df64e524a2bad079e6b0aa2d22c287f2c62aed82susnata     * Adds the supplied region.
39df64e524a2bad079e6b0aa2d22c287f2c62aed82susnata     */
403d9017263a760990ba79d5ebf3d1b6587e0bd311susnata    public void addChildDrawable(Drawable drawable) {
413d9017263a760990ba79d5ebf3d1b6587e0bd311susnata        children.add(new ChildDrawable(drawable, this));
423d9017263a760990ba79d5ebf3d1b6587e0bd311susnata        drawable.setCallback(this);
43df64e524a2bad079e6b0aa2d22c287f2c62aed82susnata    }
44df64e524a2bad079e6b0aa2d22c287f2c62aed82susnata
45df64e524a2bad079e6b0aa2d22c287f2c62aed82susnata    /**
463d9017263a760990ba79d5ebf3d1b6587e0bd311susnata     * Returns the {@link Drawable} for the given index.
47df64e524a2bad079e6b0aa2d22c287f2c62aed82susnata     */
483d9017263a760990ba79d5ebf3d1b6587e0bd311susnata    public Drawable getDrawable(int index) {
493d9017263a760990ba79d5ebf3d1b6587e0bd311susnata        return children.get(index).mDrawable;
50df64e524a2bad079e6b0aa2d22c287f2c62aed82susnata    }
51df64e524a2bad079e6b0aa2d22c287f2c62aed82susnata
52df64e524a2bad079e6b0aa2d22c287f2c62aed82susnata    /**
533d9017263a760990ba79d5ebf3d1b6587e0bd311susnata     * Returns the {@link ChildDrawable} at the given index.
54df64e524a2bad079e6b0aa2d22c287f2c62aed82susnata     */
553d9017263a760990ba79d5ebf3d1b6587e0bd311susnata    public ChildDrawable getChildAt(int index) {
563d9017263a760990ba79d5ebf3d1b6587e0bd311susnata        return children.get(index);
573d9017263a760990ba79d5ebf3d1b6587e0bd311susnata    }
583d9017263a760990ba79d5ebf3d1b6587e0bd311susnata
593d9017263a760990ba79d5ebf3d1b6587e0bd311susnata    /**
603d9017263a760990ba79d5ebf3d1b6587e0bd311susnata     * Removes the child corresponding to the given index.
613d9017263a760990ba79d5ebf3d1b6587e0bd311susnata     */
623d9017263a760990ba79d5ebf3d1b6587e0bd311susnata    public void removeChild(int index) {
633d9017263a760990ba79d5ebf3d1b6587e0bd311susnata        children.remove(index);
64df64e524a2bad079e6b0aa2d22c287f2c62aed82susnata    }
65df64e524a2bad079e6b0aa2d22c287f2c62aed82susnata
66df64e524a2bad079e6b0aa2d22c287f2c62aed82susnata    /**
67df64e524a2bad079e6b0aa2d22c287f2c62aed82susnata     * Removes the given region.
68df64e524a2bad079e6b0aa2d22c287f2c62aed82susnata     */
693d9017263a760990ba79d5ebf3d1b6587e0bd311susnata    public void removeDrawable(Drawable drawable) {
703d9017263a760990ba79d5ebf3d1b6587e0bd311susnata        for (int i = 0; i < children.size(); i++) {
713d9017263a760990ba79d5ebf3d1b6587e0bd311susnata            if (drawable == children.get(i).mDrawable) {
723d9017263a760990ba79d5ebf3d1b6587e0bd311susnata                children.get(i).mDrawable.setCallback(null);
733d9017263a760990ba79d5ebf3d1b6587e0bd311susnata                children.remove(i);
743d9017263a760990ba79d5ebf3d1b6587e0bd311susnata                return;
753d9017263a760990ba79d5ebf3d1b6587e0bd311susnata            }
763d9017263a760990ba79d5ebf3d1b6587e0bd311susnata        }
77df64e524a2bad079e6b0aa2d22c287f2c62aed82susnata    }
78df64e524a2bad079e6b0aa2d22c287f2c62aed82susnata
79df64e524a2bad079e6b0aa2d22c287f2c62aed82susnata    /**
803d9017263a760990ba79d5ebf3d1b6587e0bd311susnata     * Returns the total number of children.
81df64e524a2bad079e6b0aa2d22c287f2c62aed82susnata     */
823d9017263a760990ba79d5ebf3d1b6587e0bd311susnata    public int getChildCount() {
833d9017263a760990ba79d5ebf3d1b6587e0bd311susnata        return children.size();
84df64e524a2bad079e6b0aa2d22c287f2c62aed82susnata    }
85df64e524a2bad079e6b0aa2d22c287f2c62aed82susnata
86df64e524a2bad079e6b0aa2d22c287f2c62aed82susnata    @Override
87df64e524a2bad079e6b0aa2d22c287f2c62aed82susnata    public void draw(Canvas canvas) {
883d9017263a760990ba79d5ebf3d1b6587e0bd311susnata        for (int i = 0; i < children.size(); i++) {
893d9017263a760990ba79d5ebf3d1b6587e0bd311susnata            children.get(i).mDrawable.draw(canvas);
90df64e524a2bad079e6b0aa2d22c287f2c62aed82susnata        }
91df64e524a2bad079e6b0aa2d22c287f2c62aed82susnata    }
92df64e524a2bad079e6b0aa2d22c287f2c62aed82susnata
93df64e524a2bad079e6b0aa2d22c287f2c62aed82susnata    @Override
94df64e524a2bad079e6b0aa2d22c287f2c62aed82susnata    protected void onBoundsChange(Rect bounds) {
95df64e524a2bad079e6b0aa2d22c287f2c62aed82susnata        super.onBoundsChange(bounds);
963d9017263a760990ba79d5ebf3d1b6587e0bd311susnata        updateBounds(bounds);
97df64e524a2bad079e6b0aa2d22c287f2c62aed82susnata    }
98df64e524a2bad079e6b0aa2d22c287f2c62aed82susnata
99df64e524a2bad079e6b0aa2d22c287f2c62aed82susnata    @Override
100df64e524a2bad079e6b0aa2d22c287f2c62aed82susnata    public void setColorFilter(ColorFilter colorFilter) {
1013d9017263a760990ba79d5ebf3d1b6587e0bd311susnata        for (int i = 0; i < children.size(); i++) {
1023d9017263a760990ba79d5ebf3d1b6587e0bd311susnata            children.get(i).mDrawable.setColorFilter(colorFilter);
103df64e524a2bad079e6b0aa2d22c287f2c62aed82susnata        }
104df64e524a2bad079e6b0aa2d22c287f2c62aed82susnata    }
105df64e524a2bad079e6b0aa2d22c287f2c62aed82susnata
106df64e524a2bad079e6b0aa2d22c287f2c62aed82susnata    @Override
107df64e524a2bad079e6b0aa2d22c287f2c62aed82susnata    public int getOpacity() {
108df64e524a2bad079e6b0aa2d22c287f2c62aed82susnata        return PixelFormat.UNKNOWN;
109df64e524a2bad079e6b0aa2d22c287f2c62aed82susnata    }
110df64e524a2bad079e6b0aa2d22c287f2c62aed82susnata
111df64e524a2bad079e6b0aa2d22c287f2c62aed82susnata    @Override
112df64e524a2bad079e6b0aa2d22c287f2c62aed82susnata    public void setAlpha(int alpha) {
1133d9017263a760990ba79d5ebf3d1b6587e0bd311susnata        for (int i = 0; i < children.size(); i++) {
1143d9017263a760990ba79d5ebf3d1b6587e0bd311susnata            children.get(i).mDrawable.setAlpha(alpha);
1153d9017263a760990ba79d5ebf3d1b6587e0bd311susnata        }
1163d9017263a760990ba79d5ebf3d1b6587e0bd311susnata    }
1173d9017263a760990ba79d5ebf3d1b6587e0bd311susnata
1183d9017263a760990ba79d5ebf3d1b6587e0bd311susnata    @Override
1193d9017263a760990ba79d5ebf3d1b6587e0bd311susnata    public void invalidateDrawable(Drawable who) {
1203d9017263a760990ba79d5ebf3d1b6587e0bd311susnata        invalidateSelf();
1213d9017263a760990ba79d5ebf3d1b6587e0bd311susnata    }
1223d9017263a760990ba79d5ebf3d1b6587e0bd311susnata
1233d9017263a760990ba79d5ebf3d1b6587e0bd311susnata    @Override
1243d9017263a760990ba79d5ebf3d1b6587e0bd311susnata    public void scheduleDrawable(Drawable who, Runnable what, long when) {
1253d9017263a760990ba79d5ebf3d1b6587e0bd311susnata        scheduleSelf(what, when);
1263d9017263a760990ba79d5ebf3d1b6587e0bd311susnata    }
1273d9017263a760990ba79d5ebf3d1b6587e0bd311susnata
1283d9017263a760990ba79d5ebf3d1b6587e0bd311susnata    @Override
1293d9017263a760990ba79d5ebf3d1b6587e0bd311susnata    public void unscheduleDrawable(Drawable who, Runnable what) {
1303d9017263a760990ba79d5ebf3d1b6587e0bd311susnata        unscheduleSelf(what);
1313d9017263a760990ba79d5ebf3d1b6587e0bd311susnata    }
1323d9017263a760990ba79d5ebf3d1b6587e0bd311susnata
1333d9017263a760990ba79d5ebf3d1b6587e0bd311susnata    /**
1343d9017263a760990ba79d5ebf3d1b6587e0bd311susnata     * Updates the bounds based on the {@link BoundsRule}.
1353d9017263a760990ba79d5ebf3d1b6587e0bd311susnata     */
1363d9017263a760990ba79d5ebf3d1b6587e0bd311susnata    void updateBounds(Rect bounds) {
1373d9017263a760990ba79d5ebf3d1b6587e0bd311susnata        for (int i = 0; i < children.size(); i++) {
1383d9017263a760990ba79d5ebf3d1b6587e0bd311susnata            ChildDrawable childDrawable = children.get(i);
1393d9017263a760990ba79d5ebf3d1b6587e0bd311susnata            childDrawable.updateBounds(bounds);
1403d9017263a760990ba79d5ebf3d1b6587e0bd311susnata        }
1413d9017263a760990ba79d5ebf3d1b6587e0bd311susnata    }
1423d9017263a760990ba79d5ebf3d1b6587e0bd311susnata
1433d9017263a760990ba79d5ebf3d1b6587e0bd311susnata    /**
1443d9017263a760990ba79d5ebf3d1b6587e0bd311susnata     * Wrapper class holding a drawable object and {@link BoundsRule} to update drawable bounds
1453d9017263a760990ba79d5ebf3d1b6587e0bd311susnata     * when parent bound changes.
1463d9017263a760990ba79d5ebf3d1b6587e0bd311susnata     */
1473d9017263a760990ba79d5ebf3d1b6587e0bd311susnata    @TargetApi(Build.VERSION_CODES.ICE_CREAM_SANDWICH)
1483d9017263a760990ba79d5ebf3d1b6587e0bd311susnata    public static final class ChildDrawable {
1493d9017263a760990ba79d5ebf3d1b6587e0bd311susnata        private final BoundsRule boundsRule = new BoundsRule();
1503d9017263a760990ba79d5ebf3d1b6587e0bd311susnata        private final Drawable mDrawable;
1513d9017263a760990ba79d5ebf3d1b6587e0bd311susnata        private final Rect adjustedBounds = new Rect();
1523d9017263a760990ba79d5ebf3d1b6587e0bd311susnata        private final CompositeDrawable mParent;
1533d9017263a760990ba79d5ebf3d1b6587e0bd311susnata
1543d9017263a760990ba79d5ebf3d1b6587e0bd311susnata        public ChildDrawable(Drawable drawable, CompositeDrawable parent) {
1553d9017263a760990ba79d5ebf3d1b6587e0bd311susnata            this.mDrawable = drawable;
1563d9017263a760990ba79d5ebf3d1b6587e0bd311susnata            this.mParent = parent;
1573d9017263a760990ba79d5ebf3d1b6587e0bd311susnata        }
1583d9017263a760990ba79d5ebf3d1b6587e0bd311susnata
1593d9017263a760990ba79d5ebf3d1b6587e0bd311susnata        /**
1603d9017263a760990ba79d5ebf3d1b6587e0bd311susnata         * Returns the instance of {@link BoundsRule}.
1613d9017263a760990ba79d5ebf3d1b6587e0bd311susnata         */
1623d9017263a760990ba79d5ebf3d1b6587e0bd311susnata        public BoundsRule getBoundsRule() {
1633d9017263a760990ba79d5ebf3d1b6587e0bd311susnata            return this.boundsRule;
1643d9017263a760990ba79d5ebf3d1b6587e0bd311susnata        }
1653d9017263a760990ba79d5ebf3d1b6587e0bd311susnata
1663d9017263a760990ba79d5ebf3d1b6587e0bd311susnata        /**
1673d9017263a760990ba79d5ebf3d1b6587e0bd311susnata         * Returns the {@link Drawable}.
1683d9017263a760990ba79d5ebf3d1b6587e0bd311susnata         */
1693d9017263a760990ba79d5ebf3d1b6587e0bd311susnata        public Drawable getDrawable() {
1703d9017263a760990ba79d5ebf3d1b6587e0bd311susnata            return mDrawable;
1713d9017263a760990ba79d5ebf3d1b6587e0bd311susnata        }
1723d9017263a760990ba79d5ebf3d1b6587e0bd311susnata
1733d9017263a760990ba79d5ebf3d1b6587e0bd311susnata        /**
1743d9017263a760990ba79d5ebf3d1b6587e0bd311susnata         * Updates the bounds based on the {@link BoundsRule}.
1753d9017263a760990ba79d5ebf3d1b6587e0bd311susnata         */
1763d9017263a760990ba79d5ebf3d1b6587e0bd311susnata        void updateBounds(Rect bounds) {
1773d9017263a760990ba79d5ebf3d1b6587e0bd311susnata            boundsRule.calculateBounds(bounds, adjustedBounds);
1783d9017263a760990ba79d5ebf3d1b6587e0bd311susnata            mDrawable.setBounds(adjustedBounds);
1793d9017263a760990ba79d5ebf3d1b6587e0bd311susnata        }
1803d9017263a760990ba79d5ebf3d1b6587e0bd311susnata
1813d9017263a760990ba79d5ebf3d1b6587e0bd311susnata        void recomputeBounds() {
1823d9017263a760990ba79d5ebf3d1b6587e0bd311susnata            updateBounds(mParent.getBounds());
183df64e524a2bad079e6b0aa2d22c287f2c62aed82susnata        }
1843d9017263a760990ba79d5ebf3d1b6587e0bd311susnata
1853d9017263a760990ba79d5ebf3d1b6587e0bd311susnata        /**
1863d9017263a760990ba79d5ebf3d1b6587e0bd311susnata         * Implementation of {@link Property} for overrideTop attribute.
1873d9017263a760990ba79d5ebf3d1b6587e0bd311susnata         */
1883d9017263a760990ba79d5ebf3d1b6587e0bd311susnata        public static final Property<CompositeDrawable.ChildDrawable, Integer> TOP_ABSOLUTE
1893d9017263a760990ba79d5ebf3d1b6587e0bd311susnata                = new Property<CompositeDrawable.ChildDrawable, Integer>(Integer.class, "absoluteTop") {
1903d9017263a760990ba79d5ebf3d1b6587e0bd311susnata
1913d9017263a760990ba79d5ebf3d1b6587e0bd311susnata            @Override
1923d9017263a760990ba79d5ebf3d1b6587e0bd311susnata            public void set(CompositeDrawable.ChildDrawable obj, Integer value) {
1933d9017263a760990ba79d5ebf3d1b6587e0bd311susnata                if (obj.getBoundsRule().mTop == null) {
1943d9017263a760990ba79d5ebf3d1b6587e0bd311susnata                    obj.getBoundsRule().mTop = BoundsRule.absoluteValue(value);
1953d9017263a760990ba79d5ebf3d1b6587e0bd311susnata                } else {
1963d9017263a760990ba79d5ebf3d1b6587e0bd311susnata                    obj.getBoundsRule().mTop.setAbsoluteValue(value);
1973d9017263a760990ba79d5ebf3d1b6587e0bd311susnata                }
1983d9017263a760990ba79d5ebf3d1b6587e0bd311susnata
1993d9017263a760990ba79d5ebf3d1b6587e0bd311susnata                obj.recomputeBounds();
2003d9017263a760990ba79d5ebf3d1b6587e0bd311susnata            }
2013d9017263a760990ba79d5ebf3d1b6587e0bd311susnata
2023d9017263a760990ba79d5ebf3d1b6587e0bd311susnata            @Override
2033d9017263a760990ba79d5ebf3d1b6587e0bd311susnata            public Integer get(CompositeDrawable.ChildDrawable obj) {
2043d9017263a760990ba79d5ebf3d1b6587e0bd311susnata                return obj.getBoundsRule().mTop.getAbsoluteValue();
2053d9017263a760990ba79d5ebf3d1b6587e0bd311susnata            }
2063d9017263a760990ba79d5ebf3d1b6587e0bd311susnata        };
2073d9017263a760990ba79d5ebf3d1b6587e0bd311susnata
2083d9017263a760990ba79d5ebf3d1b6587e0bd311susnata
2093d9017263a760990ba79d5ebf3d1b6587e0bd311susnata        /**
2103d9017263a760990ba79d5ebf3d1b6587e0bd311susnata         * Implementation of {@link Property} for overrideBottom attribute.
2113d9017263a760990ba79d5ebf3d1b6587e0bd311susnata         */
2123d9017263a760990ba79d5ebf3d1b6587e0bd311susnata        public static final Property<CompositeDrawable.ChildDrawable, Integer> BOTTOM_ABSOLUTE
2133d9017263a760990ba79d5ebf3d1b6587e0bd311susnata                = new Property<CompositeDrawable.ChildDrawable, Integer>(
2143d9017263a760990ba79d5ebf3d1b6587e0bd311susnata                Integer.class, "absoluteBottom") {
2153d9017263a760990ba79d5ebf3d1b6587e0bd311susnata
2163d9017263a760990ba79d5ebf3d1b6587e0bd311susnata            @Override
2173d9017263a760990ba79d5ebf3d1b6587e0bd311susnata            public void set(CompositeDrawable.ChildDrawable obj, Integer value) {
2183d9017263a760990ba79d5ebf3d1b6587e0bd311susnata                if (obj.getBoundsRule().mBottom == null) {
2193d9017263a760990ba79d5ebf3d1b6587e0bd311susnata                    obj.getBoundsRule().mBottom = BoundsRule.absoluteValue(value);
2203d9017263a760990ba79d5ebf3d1b6587e0bd311susnata                } else {
2213d9017263a760990ba79d5ebf3d1b6587e0bd311susnata                    obj.getBoundsRule().mBottom.setAbsoluteValue(value);
2223d9017263a760990ba79d5ebf3d1b6587e0bd311susnata                }
2233d9017263a760990ba79d5ebf3d1b6587e0bd311susnata
2243d9017263a760990ba79d5ebf3d1b6587e0bd311susnata                obj.recomputeBounds();
2253d9017263a760990ba79d5ebf3d1b6587e0bd311susnata            }
2263d9017263a760990ba79d5ebf3d1b6587e0bd311susnata
2273d9017263a760990ba79d5ebf3d1b6587e0bd311susnata            @Override
2283d9017263a760990ba79d5ebf3d1b6587e0bd311susnata            public Integer get(CompositeDrawable.ChildDrawable obj) {
2293d9017263a760990ba79d5ebf3d1b6587e0bd311susnata                return obj.getBoundsRule().mBottom.getAbsoluteValue();
2303d9017263a760990ba79d5ebf3d1b6587e0bd311susnata            }
2313d9017263a760990ba79d5ebf3d1b6587e0bd311susnata        };
2323d9017263a760990ba79d5ebf3d1b6587e0bd311susnata
2333d9017263a760990ba79d5ebf3d1b6587e0bd311susnata
2343d9017263a760990ba79d5ebf3d1b6587e0bd311susnata        /**
2353d9017263a760990ba79d5ebf3d1b6587e0bd311susnata         * Implementation of {@link Property} for overrideLeft attribute.
2363d9017263a760990ba79d5ebf3d1b6587e0bd311susnata         */
2373d9017263a760990ba79d5ebf3d1b6587e0bd311susnata        public static final Property<CompositeDrawable.ChildDrawable, Integer> LEFT_ABSOLUTE
2383d9017263a760990ba79d5ebf3d1b6587e0bd311susnata                = new Property<CompositeDrawable.ChildDrawable, Integer>(
2393d9017263a760990ba79d5ebf3d1b6587e0bd311susnata                Integer.class, "absoluteLeft") {
2403d9017263a760990ba79d5ebf3d1b6587e0bd311susnata
2413d9017263a760990ba79d5ebf3d1b6587e0bd311susnata            @Override
2423d9017263a760990ba79d5ebf3d1b6587e0bd311susnata            public void set(CompositeDrawable.ChildDrawable obj, Integer value) {
2433d9017263a760990ba79d5ebf3d1b6587e0bd311susnata                if (obj.getBoundsRule().mLeft == null) {
2443d9017263a760990ba79d5ebf3d1b6587e0bd311susnata                    obj.getBoundsRule().mLeft = BoundsRule.absoluteValue(value);
2453d9017263a760990ba79d5ebf3d1b6587e0bd311susnata                } else {
2463d9017263a760990ba79d5ebf3d1b6587e0bd311susnata                    obj.getBoundsRule().mLeft.setAbsoluteValue(value);
2473d9017263a760990ba79d5ebf3d1b6587e0bd311susnata                }
2483d9017263a760990ba79d5ebf3d1b6587e0bd311susnata
2493d9017263a760990ba79d5ebf3d1b6587e0bd311susnata                obj.recomputeBounds();
2503d9017263a760990ba79d5ebf3d1b6587e0bd311susnata            }
2513d9017263a760990ba79d5ebf3d1b6587e0bd311susnata
2523d9017263a760990ba79d5ebf3d1b6587e0bd311susnata            @Override
2533d9017263a760990ba79d5ebf3d1b6587e0bd311susnata            public Integer get(CompositeDrawable.ChildDrawable obj) {
2543d9017263a760990ba79d5ebf3d1b6587e0bd311susnata                return obj.getBoundsRule().mLeft.getAbsoluteValue();
2553d9017263a760990ba79d5ebf3d1b6587e0bd311susnata            }
2563d9017263a760990ba79d5ebf3d1b6587e0bd311susnata        };
2573d9017263a760990ba79d5ebf3d1b6587e0bd311susnata
2583d9017263a760990ba79d5ebf3d1b6587e0bd311susnata        /**
2593d9017263a760990ba79d5ebf3d1b6587e0bd311susnata         * Implementation of {@link Property} for overrideRight attribute.
2603d9017263a760990ba79d5ebf3d1b6587e0bd311susnata         */
2613d9017263a760990ba79d5ebf3d1b6587e0bd311susnata        public static final Property<CompositeDrawable.ChildDrawable, Integer> RIGHT_ABSOLUTE
2623d9017263a760990ba79d5ebf3d1b6587e0bd311susnata                = new Property<CompositeDrawable.ChildDrawable, Integer>(
2633d9017263a760990ba79d5ebf3d1b6587e0bd311susnata                Integer.class, "absoluteRight") {
2643d9017263a760990ba79d5ebf3d1b6587e0bd311susnata
2653d9017263a760990ba79d5ebf3d1b6587e0bd311susnata            @Override
2663d9017263a760990ba79d5ebf3d1b6587e0bd311susnata            public void set(CompositeDrawable.ChildDrawable obj, Integer value) {
2673d9017263a760990ba79d5ebf3d1b6587e0bd311susnata                if (obj.getBoundsRule().mRight == null) {
2683d9017263a760990ba79d5ebf3d1b6587e0bd311susnata                    obj.getBoundsRule().mRight = BoundsRule.absoluteValue(value);
2693d9017263a760990ba79d5ebf3d1b6587e0bd311susnata                } else {
2703d9017263a760990ba79d5ebf3d1b6587e0bd311susnata                    obj.getBoundsRule().mRight.setAbsoluteValue(value);
2713d9017263a760990ba79d5ebf3d1b6587e0bd311susnata                }
2723d9017263a760990ba79d5ebf3d1b6587e0bd311susnata
2733d9017263a760990ba79d5ebf3d1b6587e0bd311susnata                obj.recomputeBounds();
2743d9017263a760990ba79d5ebf3d1b6587e0bd311susnata            }
2753d9017263a760990ba79d5ebf3d1b6587e0bd311susnata
2763d9017263a760990ba79d5ebf3d1b6587e0bd311susnata            @Override
2773d9017263a760990ba79d5ebf3d1b6587e0bd311susnata            public Integer get(CompositeDrawable.ChildDrawable obj) {
2783d9017263a760990ba79d5ebf3d1b6587e0bd311susnata                return obj.getBoundsRule().mRight.getAbsoluteValue();
2793d9017263a760990ba79d5ebf3d1b6587e0bd311susnata            }
2803d9017263a760990ba79d5ebf3d1b6587e0bd311susnata        };
2813d9017263a760990ba79d5ebf3d1b6587e0bd311susnata
2823d9017263a760990ba79d5ebf3d1b6587e0bd311susnata        /**
2833d9017263a760990ba79d5ebf3d1b6587e0bd311susnata         * Implementation of {@link Property} for overwriting the bottom attribute of
2843d9017263a760990ba79d5ebf3d1b6587e0bd311susnata         * {@link BoundsRule} associated with this {@link ChildDrawable}. This allows users to
2853d9017263a760990ba79d5ebf3d1b6587e0bd311susnata         * change the bounds rules as a percentage of parent size. This is preferable over
2863d9017263a760990ba79d5ebf3d1b6587e0bd311susnata         * {@see PROPERTY_TOP_ABSOLUTE} when the exact start/end position of scroll movement
2873d9017263a760990ba79d5ebf3d1b6587e0bd311susnata         * isn't available at compile time.
2883d9017263a760990ba79d5ebf3d1b6587e0bd311susnata         */
2893d9017263a760990ba79d5ebf3d1b6587e0bd311susnata        public static final Property<CompositeDrawable.ChildDrawable, Float> TOP_FRACTION
2903d9017263a760990ba79d5ebf3d1b6587e0bd311susnata                = new Property<CompositeDrawable.ChildDrawable, Float>(Float.class, "fractionTop") {
2913d9017263a760990ba79d5ebf3d1b6587e0bd311susnata
2923d9017263a760990ba79d5ebf3d1b6587e0bd311susnata            @Override
2933d9017263a760990ba79d5ebf3d1b6587e0bd311susnata            public void set(CompositeDrawable.ChildDrawable obj, Float value) {
2943d9017263a760990ba79d5ebf3d1b6587e0bd311susnata                if (obj.getBoundsRule().mTop == null) {
2953d9017263a760990ba79d5ebf3d1b6587e0bd311susnata                    obj.getBoundsRule().mTop = BoundsRule.inheritFromParent(value);
2963d9017263a760990ba79d5ebf3d1b6587e0bd311susnata                } else {
2973d9017263a760990ba79d5ebf3d1b6587e0bd311susnata                    obj.getBoundsRule().mTop.setFraction(value);
2983d9017263a760990ba79d5ebf3d1b6587e0bd311susnata                }
2993d9017263a760990ba79d5ebf3d1b6587e0bd311susnata
3003d9017263a760990ba79d5ebf3d1b6587e0bd311susnata                obj.recomputeBounds();
3013d9017263a760990ba79d5ebf3d1b6587e0bd311susnata            }
3023d9017263a760990ba79d5ebf3d1b6587e0bd311susnata
3033d9017263a760990ba79d5ebf3d1b6587e0bd311susnata            @Override
3043d9017263a760990ba79d5ebf3d1b6587e0bd311susnata            public Float get(CompositeDrawable.ChildDrawable obj) {
3053d9017263a760990ba79d5ebf3d1b6587e0bd311susnata                return obj.getBoundsRule().mTop.getFraction();
3063d9017263a760990ba79d5ebf3d1b6587e0bd311susnata            }
3073d9017263a760990ba79d5ebf3d1b6587e0bd311susnata        };
3083d9017263a760990ba79d5ebf3d1b6587e0bd311susnata
3093d9017263a760990ba79d5ebf3d1b6587e0bd311susnata        /**
3103d9017263a760990ba79d5ebf3d1b6587e0bd311susnata         * Implementation of {@link Property} for overwriting the bottom attribute of
3113d9017263a760990ba79d5ebf3d1b6587e0bd311susnata         * {@link BoundsRule} associated with this {@link ChildDrawable}. This allows users to
3123d9017263a760990ba79d5ebf3d1b6587e0bd311susnata         * change the bounds rules as a percentage of parent size. This is preferable over
3133d9017263a760990ba79d5ebf3d1b6587e0bd311susnata         * {@see PROPERTY_BOTTOM_ABSOLUTE} when the exact start/end position of scroll movement
3143d9017263a760990ba79d5ebf3d1b6587e0bd311susnata         * isn't available at compile time.
3153d9017263a760990ba79d5ebf3d1b6587e0bd311susnata         */
3163d9017263a760990ba79d5ebf3d1b6587e0bd311susnata        public static final Property<CompositeDrawable.ChildDrawable, Float> BOTTOM_FRACTION
3173d9017263a760990ba79d5ebf3d1b6587e0bd311susnata                = new Property<CompositeDrawable.ChildDrawable, Float>(
3183d9017263a760990ba79d5ebf3d1b6587e0bd311susnata                Float.class, "fractionBottom") {
3193d9017263a760990ba79d5ebf3d1b6587e0bd311susnata
3203d9017263a760990ba79d5ebf3d1b6587e0bd311susnata            @Override
3213d9017263a760990ba79d5ebf3d1b6587e0bd311susnata            public void set(CompositeDrawable.ChildDrawable obj, Float value) {
3223d9017263a760990ba79d5ebf3d1b6587e0bd311susnata                if (obj.getBoundsRule().mBottom == null) {
3233d9017263a760990ba79d5ebf3d1b6587e0bd311susnata                    obj.getBoundsRule().mBottom = BoundsRule.inheritFromParent(value);
3243d9017263a760990ba79d5ebf3d1b6587e0bd311susnata                } else {
3253d9017263a760990ba79d5ebf3d1b6587e0bd311susnata                    obj.getBoundsRule().mBottom.setFraction(value);
3263d9017263a760990ba79d5ebf3d1b6587e0bd311susnata                }
3273d9017263a760990ba79d5ebf3d1b6587e0bd311susnata
3283d9017263a760990ba79d5ebf3d1b6587e0bd311susnata                obj.recomputeBounds();
3293d9017263a760990ba79d5ebf3d1b6587e0bd311susnata            }
3303d9017263a760990ba79d5ebf3d1b6587e0bd311susnata
3313d9017263a760990ba79d5ebf3d1b6587e0bd311susnata            @Override
3323d9017263a760990ba79d5ebf3d1b6587e0bd311susnata            public Float get(CompositeDrawable.ChildDrawable obj) {
3333d9017263a760990ba79d5ebf3d1b6587e0bd311susnata                return obj.getBoundsRule().mBottom.getFraction();
3343d9017263a760990ba79d5ebf3d1b6587e0bd311susnata            }
3353d9017263a760990ba79d5ebf3d1b6587e0bd311susnata        };
3363d9017263a760990ba79d5ebf3d1b6587e0bd311susnata
3373d9017263a760990ba79d5ebf3d1b6587e0bd311susnata        /**
3383d9017263a760990ba79d5ebf3d1b6587e0bd311susnata         * Implementation of {@link Property} for overwriting the bottom attribute of
3393d9017263a760990ba79d5ebf3d1b6587e0bd311susnata         * {@link BoundsRule} associated with this {@link ChildDrawable}. This allows users to
3403d9017263a760990ba79d5ebf3d1b6587e0bd311susnata         * change the bounds rules as a percentage of parent size. This is preferable over
3413d9017263a760990ba79d5ebf3d1b6587e0bd311susnata         * {@see PROPERTY_LEFT_ABSOLUTE} when the exact start/end position of scroll movement
3423d9017263a760990ba79d5ebf3d1b6587e0bd311susnata         * isn't available at compile time.
3433d9017263a760990ba79d5ebf3d1b6587e0bd311susnata         */
3443d9017263a760990ba79d5ebf3d1b6587e0bd311susnata        public static final Property<CompositeDrawable.ChildDrawable, Float> LEFT_FRACTION
3453d9017263a760990ba79d5ebf3d1b6587e0bd311susnata                = new Property<CompositeDrawable.ChildDrawable, Float>(Float.class, "fractionLeft") {
3463d9017263a760990ba79d5ebf3d1b6587e0bd311susnata
3473d9017263a760990ba79d5ebf3d1b6587e0bd311susnata            @Override
3483d9017263a760990ba79d5ebf3d1b6587e0bd311susnata            public void set(CompositeDrawable.ChildDrawable obj, Float value) {
3493d9017263a760990ba79d5ebf3d1b6587e0bd311susnata                if (obj.getBoundsRule().mLeft == null) {
3503d9017263a760990ba79d5ebf3d1b6587e0bd311susnata                    obj.getBoundsRule().mLeft = BoundsRule.inheritFromParent(value);
3513d9017263a760990ba79d5ebf3d1b6587e0bd311susnata                } else {
3523d9017263a760990ba79d5ebf3d1b6587e0bd311susnata                    obj.getBoundsRule().mLeft.setFraction(value);
3533d9017263a760990ba79d5ebf3d1b6587e0bd311susnata                }
3543d9017263a760990ba79d5ebf3d1b6587e0bd311susnata
3553d9017263a760990ba79d5ebf3d1b6587e0bd311susnata                obj.recomputeBounds();
3563d9017263a760990ba79d5ebf3d1b6587e0bd311susnata            }
3573d9017263a760990ba79d5ebf3d1b6587e0bd311susnata
3583d9017263a760990ba79d5ebf3d1b6587e0bd311susnata            @Override
3593d9017263a760990ba79d5ebf3d1b6587e0bd311susnata            public Float get(CompositeDrawable.ChildDrawable obj) {
3603d9017263a760990ba79d5ebf3d1b6587e0bd311susnata                return obj.getBoundsRule().mLeft.getFraction();
3613d9017263a760990ba79d5ebf3d1b6587e0bd311susnata            }
3623d9017263a760990ba79d5ebf3d1b6587e0bd311susnata        };
3633d9017263a760990ba79d5ebf3d1b6587e0bd311susnata
3643d9017263a760990ba79d5ebf3d1b6587e0bd311susnata        /**
3653d9017263a760990ba79d5ebf3d1b6587e0bd311susnata         * Implementation of {@link Property} for overwriting the bottom attribute of
3663d9017263a760990ba79d5ebf3d1b6587e0bd311susnata         * {@link BoundsRule} associated with this {@link ChildDrawable}. This allows users to
3673d9017263a760990ba79d5ebf3d1b6587e0bd311susnata         * change the bounds rules as a percentage of parent size. This is preferable over
3683d9017263a760990ba79d5ebf3d1b6587e0bd311susnata         * {@see PROPERTY_RIGHT_ABSOLUTE} when the exact start/end position of scroll movement
3693d9017263a760990ba79d5ebf3d1b6587e0bd311susnata         * isn't available at compile time.
3703d9017263a760990ba79d5ebf3d1b6587e0bd311susnata         */
3713d9017263a760990ba79d5ebf3d1b6587e0bd311susnata        public static final Property<CompositeDrawable.ChildDrawable, Float> RIGHT_FRACTION
3723d9017263a760990ba79d5ebf3d1b6587e0bd311susnata                = new Property<CompositeDrawable.ChildDrawable, Float>(
3733d9017263a760990ba79d5ebf3d1b6587e0bd311susnata                Float.class, "fractoinRight") {
3743d9017263a760990ba79d5ebf3d1b6587e0bd311susnata
3753d9017263a760990ba79d5ebf3d1b6587e0bd311susnata            @Override
3763d9017263a760990ba79d5ebf3d1b6587e0bd311susnata            public void set(CompositeDrawable.ChildDrawable obj, Float value) {
3773d9017263a760990ba79d5ebf3d1b6587e0bd311susnata                if (obj.getBoundsRule().mRight == null) {
3783d9017263a760990ba79d5ebf3d1b6587e0bd311susnata                    obj.getBoundsRule().mRight = BoundsRule.inheritFromParent(value);
3793d9017263a760990ba79d5ebf3d1b6587e0bd311susnata                } else {
3803d9017263a760990ba79d5ebf3d1b6587e0bd311susnata                    obj.getBoundsRule().mRight.setFraction(value);
3813d9017263a760990ba79d5ebf3d1b6587e0bd311susnata                }
3823d9017263a760990ba79d5ebf3d1b6587e0bd311susnata
3833d9017263a760990ba79d5ebf3d1b6587e0bd311susnata                obj.recomputeBounds();
3843d9017263a760990ba79d5ebf3d1b6587e0bd311susnata            }
3853d9017263a760990ba79d5ebf3d1b6587e0bd311susnata
3863d9017263a760990ba79d5ebf3d1b6587e0bd311susnata            @Override
3873d9017263a760990ba79d5ebf3d1b6587e0bd311susnata            public Float get(CompositeDrawable.ChildDrawable obj) {
3883d9017263a760990ba79d5ebf3d1b6587e0bd311susnata                return obj.getBoundsRule().mRight.getFraction();
3893d9017263a760990ba79d5ebf3d1b6587e0bd311susnata            }
3903d9017263a760990ba79d5ebf3d1b6587e0bd311susnata        };
391df64e524a2bad079e6b0aa2d22c287f2c62aed82susnata    }
392df64e524a2bad079e6b0aa2d22c287f2c62aed82susnata}
393