CompositeDrawable.java revision 450fe7ab2d8a911ecdc335d55c60dfbae70f2407
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;
1900f780c9e3cca0b2e364c61e936147e09877c43fDake Guimport android.content.res.Resources;
20df64e524a2bad079e6b0aa2d22c287f2c62aed82susnataimport android.graphics.Canvas;
21df64e524a2bad079e6b0aa2d22c287f2c62aed82susnataimport android.graphics.ColorFilter;
22df64e524a2bad079e6b0aa2d22c287f2c62aed82susnataimport android.graphics.PixelFormat;
23df64e524a2bad079e6b0aa2d22c287f2c62aed82susnataimport android.graphics.Rect;
24df64e524a2bad079e6b0aa2d22c287f2c62aed82susnataimport android.graphics.drawable.Drawable;
253d9017263a760990ba79d5ebf3d1b6587e0bd311susnataimport android.os.Build;
2600f780c9e3cca0b2e364c61e936147e09877c43fDake Guimport android.support.annotation.NonNull;
2700f780c9e3cca0b2e364c61e936147e09877c43fDake Guimport android.support.v4.graphics.drawable.DrawableCompat;
283d9017263a760990ba79d5ebf3d1b6587e0bd311susnataimport android.util.Property;
29df64e524a2bad079e6b0aa2d22c287f2c62aed82susnata
30df64e524a2bad079e6b0aa2d22c287f2c62aed82susnataimport java.util.ArrayList;
31df64e524a2bad079e6b0aa2d22c287f2c62aed82susnata
32df64e524a2bad079e6b0aa2d22c287f2c62aed82susnata/**
333d9017263a760990ba79d5ebf3d1b6587e0bd311susnata * Generic drawable class that can be composed of multiple children. Whenever the bounds changes
3415c3f439b0dad70925e5fec0508a17976b881dabsusnata * for this class, it updates those of it's children.
35df64e524a2bad079e6b0aa2d22c287f2c62aed82susnata */
363d9017263a760990ba79d5ebf3d1b6587e0bd311susnata@TargetApi(Build.VERSION_CODES.ICE_CREAM_SANDWICH)
373d9017263a760990ba79d5ebf3d1b6587e0bd311susnatapublic class CompositeDrawable extends Drawable implements Drawable.Callback {
3800f780c9e3cca0b2e364c61e936147e09877c43fDake Gu
3900f780c9e3cca0b2e364c61e936147e09877c43fDake Gu    static class CompositeState extends Drawable.ConstantState {
4000f780c9e3cca0b2e364c61e936147e09877c43fDake Gu
4100f780c9e3cca0b2e364c61e936147e09877c43fDake Gu        final ArrayList<ChildDrawable> mChildren;
4200f780c9e3cca0b2e364c61e936147e09877c43fDake Gu
4300f780c9e3cca0b2e364c61e936147e09877c43fDake Gu        CompositeState() {
4400f780c9e3cca0b2e364c61e936147e09877c43fDake Gu            mChildren = new ArrayList<ChildDrawable>();
4500f780c9e3cca0b2e364c61e936147e09877c43fDake Gu        }
4600f780c9e3cca0b2e364c61e936147e09877c43fDake Gu
4700f780c9e3cca0b2e364c61e936147e09877c43fDake Gu        CompositeState(CompositeState other, CompositeDrawable parent, Resources res) {
4800f780c9e3cca0b2e364c61e936147e09877c43fDake Gu            final int n = other.mChildren.size();
4900f780c9e3cca0b2e364c61e936147e09877c43fDake Gu            mChildren = new ArrayList<ChildDrawable>(n);
5000f780c9e3cca0b2e364c61e936147e09877c43fDake Gu            for (int k = 0; k < n; k++) {
5100f780c9e3cca0b2e364c61e936147e09877c43fDake Gu                mChildren.add(new ChildDrawable(other.mChildren.get(k), parent, res));
5200f780c9e3cca0b2e364c61e936147e09877c43fDake Gu            }
5300f780c9e3cca0b2e364c61e936147e09877c43fDake Gu        }
5400f780c9e3cca0b2e364c61e936147e09877c43fDake Gu
5500f780c9e3cca0b2e364c61e936147e09877c43fDake Gu        @NonNull
5600f780c9e3cca0b2e364c61e936147e09877c43fDake Gu        @Override
5700f780c9e3cca0b2e364c61e936147e09877c43fDake Gu        public Drawable newDrawable() {
5800f780c9e3cca0b2e364c61e936147e09877c43fDake Gu            return new CompositeDrawable(this);
5900f780c9e3cca0b2e364c61e936147e09877c43fDake Gu        }
6000f780c9e3cca0b2e364c61e936147e09877c43fDake Gu
6100f780c9e3cca0b2e364c61e936147e09877c43fDake Gu        @Override
6200f780c9e3cca0b2e364c61e936147e09877c43fDake Gu        public int getChangingConfigurations() {
6300f780c9e3cca0b2e364c61e936147e09877c43fDake Gu            return 0;
6400f780c9e3cca0b2e364c61e936147e09877c43fDake Gu        }
6500f780c9e3cca0b2e364c61e936147e09877c43fDake Gu
6600f780c9e3cca0b2e364c61e936147e09877c43fDake Gu    }
6700f780c9e3cca0b2e364c61e936147e09877c43fDake Gu
6800f780c9e3cca0b2e364c61e936147e09877c43fDake Gu    CompositeState mState;
6900f780c9e3cca0b2e364c61e936147e09877c43fDake Gu    boolean mMutated = false;
7000f780c9e3cca0b2e364c61e936147e09877c43fDake Gu
7100f780c9e3cca0b2e364c61e936147e09877c43fDake Gu    public CompositeDrawable() {
7200f780c9e3cca0b2e364c61e936147e09877c43fDake Gu        mState = new CompositeState();
7300f780c9e3cca0b2e364c61e936147e09877c43fDake Gu    }
7400f780c9e3cca0b2e364c61e936147e09877c43fDake Gu
7500f780c9e3cca0b2e364c61e936147e09877c43fDake Gu    CompositeDrawable(CompositeState state) {
7600f780c9e3cca0b2e364c61e936147e09877c43fDake Gu        mState = state;
7700f780c9e3cca0b2e364c61e936147e09877c43fDake Gu    }
7800f780c9e3cca0b2e364c61e936147e09877c43fDake Gu
7900f780c9e3cca0b2e364c61e936147e09877c43fDake Gu    @Override
8000f780c9e3cca0b2e364c61e936147e09877c43fDake Gu    public ConstantState getConstantState() {
8100f780c9e3cca0b2e364c61e936147e09877c43fDake Gu        return mState;
8200f780c9e3cca0b2e364c61e936147e09877c43fDake Gu    }
8300f780c9e3cca0b2e364c61e936147e09877c43fDake Gu
8400f780c9e3cca0b2e364c61e936147e09877c43fDake Gu    @Override
8500f780c9e3cca0b2e364c61e936147e09877c43fDake Gu    public Drawable mutate() {
8600f780c9e3cca0b2e364c61e936147e09877c43fDake Gu        if (!mMutated && super.mutate() == this) {
8700f780c9e3cca0b2e364c61e936147e09877c43fDake Gu            mState = new CompositeState(mState, this, null);
8800f780c9e3cca0b2e364c61e936147e09877c43fDake Gu            final ArrayList<ChildDrawable> children = mState.mChildren;
8900f780c9e3cca0b2e364c61e936147e09877c43fDake Gu            for (int i = 0, n = children.size(); i < n; i++) {
9000f780c9e3cca0b2e364c61e936147e09877c43fDake Gu                final Drawable dr = children.get(i).mDrawable;
9100f780c9e3cca0b2e364c61e936147e09877c43fDake Gu                if (dr != null) {
9200f780c9e3cca0b2e364c61e936147e09877c43fDake Gu                    dr.mutate();
9300f780c9e3cca0b2e364c61e936147e09877c43fDake Gu                }
9400f780c9e3cca0b2e364c61e936147e09877c43fDake Gu            }
9500f780c9e3cca0b2e364c61e936147e09877c43fDake Gu            mMutated = true;
9600f780c9e3cca0b2e364c61e936147e09877c43fDake Gu        }
9700f780c9e3cca0b2e364c61e936147e09877c43fDake Gu        return this;
9800f780c9e3cca0b2e364c61e936147e09877c43fDake Gu    }
99df64e524a2bad079e6b0aa2d22c287f2c62aed82susnata
100df64e524a2bad079e6b0aa2d22c287f2c62aed82susnata    /**
101df64e524a2bad079e6b0aa2d22c287f2c62aed82susnata     * Adds the supplied region.
102df64e524a2bad079e6b0aa2d22c287f2c62aed82susnata     */
1033d9017263a760990ba79d5ebf3d1b6587e0bd311susnata    public void addChildDrawable(Drawable drawable) {
10400f780c9e3cca0b2e364c61e936147e09877c43fDake Gu        mState.mChildren.add(new ChildDrawable(drawable, this));
105df64e524a2bad079e6b0aa2d22c287f2c62aed82susnata    }
106df64e524a2bad079e6b0aa2d22c287f2c62aed82susnata
107df64e524a2bad079e6b0aa2d22c287f2c62aed82susnata    /**
1083d9017263a760990ba79d5ebf3d1b6587e0bd311susnata     * Returns the {@link Drawable} for the given index.
109df64e524a2bad079e6b0aa2d22c287f2c62aed82susnata     */
1103d9017263a760990ba79d5ebf3d1b6587e0bd311susnata    public Drawable getDrawable(int index) {
11100f780c9e3cca0b2e364c61e936147e09877c43fDake Gu        return mState.mChildren.get(index).mDrawable;
112df64e524a2bad079e6b0aa2d22c287f2c62aed82susnata    }
113df64e524a2bad079e6b0aa2d22c287f2c62aed82susnata
114df64e524a2bad079e6b0aa2d22c287f2c62aed82susnata    /**
1153d9017263a760990ba79d5ebf3d1b6587e0bd311susnata     * Returns the {@link ChildDrawable} at the given index.
116df64e524a2bad079e6b0aa2d22c287f2c62aed82susnata     */
1173d9017263a760990ba79d5ebf3d1b6587e0bd311susnata    public ChildDrawable getChildAt(int index) {
11800f780c9e3cca0b2e364c61e936147e09877c43fDake Gu        return mState.mChildren.get(index);
1193d9017263a760990ba79d5ebf3d1b6587e0bd311susnata    }
1203d9017263a760990ba79d5ebf3d1b6587e0bd311susnata
1213d9017263a760990ba79d5ebf3d1b6587e0bd311susnata    /**
1223d9017263a760990ba79d5ebf3d1b6587e0bd311susnata     * Removes the child corresponding to the given index.
1233d9017263a760990ba79d5ebf3d1b6587e0bd311susnata     */
1243d9017263a760990ba79d5ebf3d1b6587e0bd311susnata    public void removeChild(int index) {
12500f780c9e3cca0b2e364c61e936147e09877c43fDake Gu        mState.mChildren.remove(index);
126df64e524a2bad079e6b0aa2d22c287f2c62aed82susnata    }
127df64e524a2bad079e6b0aa2d22c287f2c62aed82susnata
128df64e524a2bad079e6b0aa2d22c287f2c62aed82susnata    /**
129df64e524a2bad079e6b0aa2d22c287f2c62aed82susnata     * Removes the given region.
130df64e524a2bad079e6b0aa2d22c287f2c62aed82susnata     */
1313d9017263a760990ba79d5ebf3d1b6587e0bd311susnata    public void removeDrawable(Drawable drawable) {
13200f780c9e3cca0b2e364c61e936147e09877c43fDake Gu        final ArrayList<ChildDrawable> children = mState.mChildren;
1333d9017263a760990ba79d5ebf3d1b6587e0bd311susnata        for (int i = 0; i < children.size(); i++) {
1343d9017263a760990ba79d5ebf3d1b6587e0bd311susnata            if (drawable == children.get(i).mDrawable) {
1353d9017263a760990ba79d5ebf3d1b6587e0bd311susnata                children.get(i).mDrawable.setCallback(null);
1363d9017263a760990ba79d5ebf3d1b6587e0bd311susnata                children.remove(i);
1373d9017263a760990ba79d5ebf3d1b6587e0bd311susnata                return;
1383d9017263a760990ba79d5ebf3d1b6587e0bd311susnata            }
1393d9017263a760990ba79d5ebf3d1b6587e0bd311susnata        }
140df64e524a2bad079e6b0aa2d22c287f2c62aed82susnata    }
141df64e524a2bad079e6b0aa2d22c287f2c62aed82susnata
142df64e524a2bad079e6b0aa2d22c287f2c62aed82susnata    /**
1433d9017263a760990ba79d5ebf3d1b6587e0bd311susnata     * Returns the total number of children.
144df64e524a2bad079e6b0aa2d22c287f2c62aed82susnata     */
1453d9017263a760990ba79d5ebf3d1b6587e0bd311susnata    public int getChildCount() {
14600f780c9e3cca0b2e364c61e936147e09877c43fDake Gu        return mState.mChildren.size();
147df64e524a2bad079e6b0aa2d22c287f2c62aed82susnata    }
148df64e524a2bad079e6b0aa2d22c287f2c62aed82susnata
149df64e524a2bad079e6b0aa2d22c287f2c62aed82susnata    @Override
150df64e524a2bad079e6b0aa2d22c287f2c62aed82susnata    public void draw(Canvas canvas) {
15100f780c9e3cca0b2e364c61e936147e09877c43fDake Gu        final ArrayList<ChildDrawable> children = mState.mChildren;
1523d9017263a760990ba79d5ebf3d1b6587e0bd311susnata        for (int i = 0; i < children.size(); i++) {
1533d9017263a760990ba79d5ebf3d1b6587e0bd311susnata            children.get(i).mDrawable.draw(canvas);
154df64e524a2bad079e6b0aa2d22c287f2c62aed82susnata        }
155df64e524a2bad079e6b0aa2d22c287f2c62aed82susnata    }
156df64e524a2bad079e6b0aa2d22c287f2c62aed82susnata
157df64e524a2bad079e6b0aa2d22c287f2c62aed82susnata    @Override
158df64e524a2bad079e6b0aa2d22c287f2c62aed82susnata    protected void onBoundsChange(Rect bounds) {
159df64e524a2bad079e6b0aa2d22c287f2c62aed82susnata        super.onBoundsChange(bounds);
1603d9017263a760990ba79d5ebf3d1b6587e0bd311susnata        updateBounds(bounds);
161df64e524a2bad079e6b0aa2d22c287f2c62aed82susnata    }
162df64e524a2bad079e6b0aa2d22c287f2c62aed82susnata
163df64e524a2bad079e6b0aa2d22c287f2c62aed82susnata    @Override
164df64e524a2bad079e6b0aa2d22c287f2c62aed82susnata    public void setColorFilter(ColorFilter colorFilter) {
16500f780c9e3cca0b2e364c61e936147e09877c43fDake Gu        final ArrayList<ChildDrawable> children = mState.mChildren;
1663d9017263a760990ba79d5ebf3d1b6587e0bd311susnata        for (int i = 0; i < children.size(); i++) {
1673d9017263a760990ba79d5ebf3d1b6587e0bd311susnata            children.get(i).mDrawable.setColorFilter(colorFilter);
168df64e524a2bad079e6b0aa2d22c287f2c62aed82susnata        }
169df64e524a2bad079e6b0aa2d22c287f2c62aed82susnata    }
170df64e524a2bad079e6b0aa2d22c287f2c62aed82susnata
171df64e524a2bad079e6b0aa2d22c287f2c62aed82susnata    @Override
172df64e524a2bad079e6b0aa2d22c287f2c62aed82susnata    public int getOpacity() {
173df64e524a2bad079e6b0aa2d22c287f2c62aed82susnata        return PixelFormat.UNKNOWN;
174df64e524a2bad079e6b0aa2d22c287f2c62aed82susnata    }
175df64e524a2bad079e6b0aa2d22c287f2c62aed82susnata
176df64e524a2bad079e6b0aa2d22c287f2c62aed82susnata    @Override
177df64e524a2bad079e6b0aa2d22c287f2c62aed82susnata    public void setAlpha(int alpha) {
17800f780c9e3cca0b2e364c61e936147e09877c43fDake Gu        final ArrayList<ChildDrawable> children = mState.mChildren;
1793d9017263a760990ba79d5ebf3d1b6587e0bd311susnata        for (int i = 0; i < children.size(); i++) {
1803d9017263a760990ba79d5ebf3d1b6587e0bd311susnata            children.get(i).mDrawable.setAlpha(alpha);
1813d9017263a760990ba79d5ebf3d1b6587e0bd311susnata        }
1823d9017263a760990ba79d5ebf3d1b6587e0bd311susnata    }
1833d9017263a760990ba79d5ebf3d1b6587e0bd311susnata
18400f780c9e3cca0b2e364c61e936147e09877c43fDake Gu    /**
18500f780c9e3cca0b2e364c61e936147e09877c43fDake Gu     * @return Alpha value between 0(inclusive) and 255(inclusive)
18600f780c9e3cca0b2e364c61e936147e09877c43fDake Gu     */
18700f780c9e3cca0b2e364c61e936147e09877c43fDake Gu    public int getAlpha() {
18800f780c9e3cca0b2e364c61e936147e09877c43fDake Gu        final Drawable dr = getFirstNonNullDrawable();
18900f780c9e3cca0b2e364c61e936147e09877c43fDake Gu        if (dr != null) {
19000f780c9e3cca0b2e364c61e936147e09877c43fDake Gu            return DrawableCompat.getAlpha(dr);
19100f780c9e3cca0b2e364c61e936147e09877c43fDake Gu        } else {
19200f780c9e3cca0b2e364c61e936147e09877c43fDake Gu            return 0xFF;
19300f780c9e3cca0b2e364c61e936147e09877c43fDake Gu        }
19400f780c9e3cca0b2e364c61e936147e09877c43fDake Gu    }
19500f780c9e3cca0b2e364c61e936147e09877c43fDake Gu
19600f780c9e3cca0b2e364c61e936147e09877c43fDake Gu    final Drawable getFirstNonNullDrawable() {
19700f780c9e3cca0b2e364c61e936147e09877c43fDake Gu        final ArrayList<ChildDrawable> children = mState.mChildren;
19800f780c9e3cca0b2e364c61e936147e09877c43fDake Gu        for (int i = 0, n = children.size(); i < n; i++) {
19900f780c9e3cca0b2e364c61e936147e09877c43fDake Gu            final Drawable dr = children.get(i).mDrawable;
20000f780c9e3cca0b2e364c61e936147e09877c43fDake Gu            if (dr != null) {
20100f780c9e3cca0b2e364c61e936147e09877c43fDake Gu                return dr;
20200f780c9e3cca0b2e364c61e936147e09877c43fDake Gu            }
20300f780c9e3cca0b2e364c61e936147e09877c43fDake Gu        }
20400f780c9e3cca0b2e364c61e936147e09877c43fDake Gu        return null;
20500f780c9e3cca0b2e364c61e936147e09877c43fDake Gu    }
20600f780c9e3cca0b2e364c61e936147e09877c43fDake Gu
2073d9017263a760990ba79d5ebf3d1b6587e0bd311susnata    @Override
2083d9017263a760990ba79d5ebf3d1b6587e0bd311susnata    public void invalidateDrawable(Drawable who) {
2093d9017263a760990ba79d5ebf3d1b6587e0bd311susnata        invalidateSelf();
2103d9017263a760990ba79d5ebf3d1b6587e0bd311susnata    }
2113d9017263a760990ba79d5ebf3d1b6587e0bd311susnata
2123d9017263a760990ba79d5ebf3d1b6587e0bd311susnata    @Override
2133d9017263a760990ba79d5ebf3d1b6587e0bd311susnata    public void scheduleDrawable(Drawable who, Runnable what, long when) {
2143d9017263a760990ba79d5ebf3d1b6587e0bd311susnata        scheduleSelf(what, when);
2153d9017263a760990ba79d5ebf3d1b6587e0bd311susnata    }
2163d9017263a760990ba79d5ebf3d1b6587e0bd311susnata
2173d9017263a760990ba79d5ebf3d1b6587e0bd311susnata    @Override
2183d9017263a760990ba79d5ebf3d1b6587e0bd311susnata    public void unscheduleDrawable(Drawable who, Runnable what) {
2193d9017263a760990ba79d5ebf3d1b6587e0bd311susnata        unscheduleSelf(what);
2203d9017263a760990ba79d5ebf3d1b6587e0bd311susnata    }
2213d9017263a760990ba79d5ebf3d1b6587e0bd311susnata
2223d9017263a760990ba79d5ebf3d1b6587e0bd311susnata    /**
2233d9017263a760990ba79d5ebf3d1b6587e0bd311susnata     * Updates the bounds based on the {@link BoundsRule}.
2243d9017263a760990ba79d5ebf3d1b6587e0bd311susnata     */
2253d9017263a760990ba79d5ebf3d1b6587e0bd311susnata    void updateBounds(Rect bounds) {
22600f780c9e3cca0b2e364c61e936147e09877c43fDake Gu        final ArrayList<ChildDrawable> children = mState.mChildren;
2273d9017263a760990ba79d5ebf3d1b6587e0bd311susnata        for (int i = 0; i < children.size(); i++) {
2283d9017263a760990ba79d5ebf3d1b6587e0bd311susnata            ChildDrawable childDrawable = children.get(i);
2293d9017263a760990ba79d5ebf3d1b6587e0bd311susnata            childDrawable.updateBounds(bounds);
2303d9017263a760990ba79d5ebf3d1b6587e0bd311susnata        }
2313d9017263a760990ba79d5ebf3d1b6587e0bd311susnata    }
2323d9017263a760990ba79d5ebf3d1b6587e0bd311susnata
2333d9017263a760990ba79d5ebf3d1b6587e0bd311susnata    /**
2343d9017263a760990ba79d5ebf3d1b6587e0bd311susnata     * Wrapper class holding a drawable object and {@link BoundsRule} to update drawable bounds
2353d9017263a760990ba79d5ebf3d1b6587e0bd311susnata     * when parent bound changes.
2363d9017263a760990ba79d5ebf3d1b6587e0bd311susnata     */
2373d9017263a760990ba79d5ebf3d1b6587e0bd311susnata    @TargetApi(Build.VERSION_CODES.ICE_CREAM_SANDWICH)
2383d9017263a760990ba79d5ebf3d1b6587e0bd311susnata    public static final class ChildDrawable {
239450fe7ab2d8a911ecdc335d55c60dfbae70f2407susnata        private final BoundsRule mBoundsRule;
2403d9017263a760990ba79d5ebf3d1b6587e0bd311susnata        private final Drawable mDrawable;
2413d9017263a760990ba79d5ebf3d1b6587e0bd311susnata        private final Rect adjustedBounds = new Rect();
242738deb3f9c75ea32dff1bf335753703e40e87f39Dake Gu        final CompositeDrawable mParent;
2433d9017263a760990ba79d5ebf3d1b6587e0bd311susnata
2443d9017263a760990ba79d5ebf3d1b6587e0bd311susnata        public ChildDrawable(Drawable drawable, CompositeDrawable parent) {
2453d9017263a760990ba79d5ebf3d1b6587e0bd311susnata            this.mDrawable = drawable;
2463d9017263a760990ba79d5ebf3d1b6587e0bd311susnata            this.mParent = parent;
247450fe7ab2d8a911ecdc335d55c60dfbae70f2407susnata            this.mBoundsRule = new BoundsRule();
24800f780c9e3cca0b2e364c61e936147e09877c43fDake Gu            drawable.setCallback(parent);
24900f780c9e3cca0b2e364c61e936147e09877c43fDake Gu        }
25000f780c9e3cca0b2e364c61e936147e09877c43fDake Gu
25100f780c9e3cca0b2e364c61e936147e09877c43fDake Gu        ChildDrawable(ChildDrawable orig, CompositeDrawable parent, Resources res) {
25200f780c9e3cca0b2e364c61e936147e09877c43fDake Gu            final Drawable dr = orig.mDrawable;
25300f780c9e3cca0b2e364c61e936147e09877c43fDake Gu            final Drawable clone;
25400f780c9e3cca0b2e364c61e936147e09877c43fDake Gu            if (dr != null) {
25500f780c9e3cca0b2e364c61e936147e09877c43fDake Gu                final ConstantState cs = dr.getConstantState();
25600f780c9e3cca0b2e364c61e936147e09877c43fDake Gu                if (res != null) {
25700f780c9e3cca0b2e364c61e936147e09877c43fDake Gu                    clone = cs.newDrawable(res);
25800f780c9e3cca0b2e364c61e936147e09877c43fDake Gu                } else {
25900f780c9e3cca0b2e364c61e936147e09877c43fDake Gu                    clone = cs.newDrawable();
26000f780c9e3cca0b2e364c61e936147e09877c43fDake Gu                }
26100f780c9e3cca0b2e364c61e936147e09877c43fDake Gu                clone.setCallback(parent);
26200f780c9e3cca0b2e364c61e936147e09877c43fDake Gu                DrawableCompat.setLayoutDirection(clone, DrawableCompat.getLayoutDirection(dr));
26300f780c9e3cca0b2e364c61e936147e09877c43fDake Gu                clone.setBounds(dr.getBounds());
26400f780c9e3cca0b2e364c61e936147e09877c43fDake Gu                clone.setLevel(dr.getLevel());
26500f780c9e3cca0b2e364c61e936147e09877c43fDake Gu            } else {
26600f780c9e3cca0b2e364c61e936147e09877c43fDake Gu                clone = null;
26700f780c9e3cca0b2e364c61e936147e09877c43fDake Gu            }
268450fe7ab2d8a911ecdc335d55c60dfbae70f2407susnata            if (orig.mBoundsRule != null) {
269450fe7ab2d8a911ecdc335d55c60dfbae70f2407susnata                this.mBoundsRule = new BoundsRule(orig.mBoundsRule);
270450fe7ab2d8a911ecdc335d55c60dfbae70f2407susnata            } else {
271450fe7ab2d8a911ecdc335d55c60dfbae70f2407susnata                this.mBoundsRule = new BoundsRule();
272450fe7ab2d8a911ecdc335d55c60dfbae70f2407susnata            }
27300f780c9e3cca0b2e364c61e936147e09877c43fDake Gu            mDrawable = clone;
27400f780c9e3cca0b2e364c61e936147e09877c43fDake Gu            mParent = parent;
2753d9017263a760990ba79d5ebf3d1b6587e0bd311susnata        }
2763d9017263a760990ba79d5ebf3d1b6587e0bd311susnata
2773d9017263a760990ba79d5ebf3d1b6587e0bd311susnata        /**
2783d9017263a760990ba79d5ebf3d1b6587e0bd311susnata         * Returns the instance of {@link BoundsRule}.
2793d9017263a760990ba79d5ebf3d1b6587e0bd311susnata         */
2803d9017263a760990ba79d5ebf3d1b6587e0bd311susnata        public BoundsRule getBoundsRule() {
281450fe7ab2d8a911ecdc335d55c60dfbae70f2407susnata            return this.mBoundsRule;
2823d9017263a760990ba79d5ebf3d1b6587e0bd311susnata        }
2833d9017263a760990ba79d5ebf3d1b6587e0bd311susnata
2843d9017263a760990ba79d5ebf3d1b6587e0bd311susnata        /**
2853d9017263a760990ba79d5ebf3d1b6587e0bd311susnata         * Returns the {@link Drawable}.
2863d9017263a760990ba79d5ebf3d1b6587e0bd311susnata         */
2873d9017263a760990ba79d5ebf3d1b6587e0bd311susnata        public Drawable getDrawable() {
2883d9017263a760990ba79d5ebf3d1b6587e0bd311susnata            return mDrawable;
2893d9017263a760990ba79d5ebf3d1b6587e0bd311susnata        }
2903d9017263a760990ba79d5ebf3d1b6587e0bd311susnata
2913d9017263a760990ba79d5ebf3d1b6587e0bd311susnata        /**
2923d9017263a760990ba79d5ebf3d1b6587e0bd311susnata         * Updates the bounds based on the {@link BoundsRule}.
2933d9017263a760990ba79d5ebf3d1b6587e0bd311susnata         */
2943d9017263a760990ba79d5ebf3d1b6587e0bd311susnata        void updateBounds(Rect bounds) {
295450fe7ab2d8a911ecdc335d55c60dfbae70f2407susnata            mBoundsRule.calculateBounds(bounds, adjustedBounds);
2963d9017263a760990ba79d5ebf3d1b6587e0bd311susnata            mDrawable.setBounds(adjustedBounds);
2973d9017263a760990ba79d5ebf3d1b6587e0bd311susnata        }
2983d9017263a760990ba79d5ebf3d1b6587e0bd311susnata
299e464e5647326c000d2bd48e7d4369a279894f360susnata        /**
300e464e5647326c000d2bd48e7d4369a279894f360susnata         * After changing the {@link BoundsRule}, user should call this function
301e464e5647326c000d2bd48e7d4369a279894f360susnata         * for the drawable to recalculate its bounds.
302e464e5647326c000d2bd48e7d4369a279894f360susnata         */
303e464e5647326c000d2bd48e7d4369a279894f360susnata        public void recomputeBounds() {
3043d9017263a760990ba79d5ebf3d1b6587e0bd311susnata            updateBounds(mParent.getBounds());
305df64e524a2bad079e6b0aa2d22c287f2c62aed82susnata        }
3063d9017263a760990ba79d5ebf3d1b6587e0bd311susnata
3073d9017263a760990ba79d5ebf3d1b6587e0bd311susnata        /**
3083d9017263a760990ba79d5ebf3d1b6587e0bd311susnata         * Implementation of {@link Property} for overrideTop attribute.
3093d9017263a760990ba79d5ebf3d1b6587e0bd311susnata         */
3103103f63e99d47573823957f7aa34308555873221Aurimas Liutikas        public static final Property<CompositeDrawable.ChildDrawable, Integer> TOP_ABSOLUTE =
3113103f63e99d47573823957f7aa34308555873221Aurimas Liutikas                new Property<CompositeDrawable.ChildDrawable, Integer>(
3123103f63e99d47573823957f7aa34308555873221Aurimas Liutikas                        Integer.class, "absoluteTop") {
3133d9017263a760990ba79d5ebf3d1b6587e0bd311susnata            @Override
3143d9017263a760990ba79d5ebf3d1b6587e0bd311susnata            public void set(CompositeDrawable.ChildDrawable obj, Integer value) {
3153d9017263a760990ba79d5ebf3d1b6587e0bd311susnata                if (obj.getBoundsRule().mTop == null) {
3163d9017263a760990ba79d5ebf3d1b6587e0bd311susnata                    obj.getBoundsRule().mTop = BoundsRule.absoluteValue(value);
3173d9017263a760990ba79d5ebf3d1b6587e0bd311susnata                } else {
3183d9017263a760990ba79d5ebf3d1b6587e0bd311susnata                    obj.getBoundsRule().mTop.setAbsoluteValue(value);
3193d9017263a760990ba79d5ebf3d1b6587e0bd311susnata                }
3203d9017263a760990ba79d5ebf3d1b6587e0bd311susnata
3213d9017263a760990ba79d5ebf3d1b6587e0bd311susnata                obj.recomputeBounds();
3223d9017263a760990ba79d5ebf3d1b6587e0bd311susnata            }
3233d9017263a760990ba79d5ebf3d1b6587e0bd311susnata
3243d9017263a760990ba79d5ebf3d1b6587e0bd311susnata            @Override
3253d9017263a760990ba79d5ebf3d1b6587e0bd311susnata            public Integer get(CompositeDrawable.ChildDrawable obj) {
326738deb3f9c75ea32dff1bf335753703e40e87f39Dake Gu                if (obj.getBoundsRule().mTop == null) {
327738deb3f9c75ea32dff1bf335753703e40e87f39Dake Gu                    return obj.mParent.getBounds().top;
328738deb3f9c75ea32dff1bf335753703e40e87f39Dake Gu                }
3293d9017263a760990ba79d5ebf3d1b6587e0bd311susnata                return obj.getBoundsRule().mTop.getAbsoluteValue();
3303d9017263a760990ba79d5ebf3d1b6587e0bd311susnata            }
3313d9017263a760990ba79d5ebf3d1b6587e0bd311susnata        };
3323d9017263a760990ba79d5ebf3d1b6587e0bd311susnata
3333d9017263a760990ba79d5ebf3d1b6587e0bd311susnata        /**
3343d9017263a760990ba79d5ebf3d1b6587e0bd311susnata         * Implementation of {@link Property} for overrideBottom attribute.
3353d9017263a760990ba79d5ebf3d1b6587e0bd311susnata         */
3363103f63e99d47573823957f7aa34308555873221Aurimas Liutikas        public static final Property<CompositeDrawable.ChildDrawable, Integer> BOTTOM_ABSOLUTE =
3373103f63e99d47573823957f7aa34308555873221Aurimas Liutikas                new Property<CompositeDrawable.ChildDrawable, Integer>(
3383103f63e99d47573823957f7aa34308555873221Aurimas Liutikas                        Integer.class, "absoluteBottom") {
3393d9017263a760990ba79d5ebf3d1b6587e0bd311susnata            @Override
3403d9017263a760990ba79d5ebf3d1b6587e0bd311susnata            public void set(CompositeDrawable.ChildDrawable obj, Integer value) {
3413d9017263a760990ba79d5ebf3d1b6587e0bd311susnata                if (obj.getBoundsRule().mBottom == null) {
3423d9017263a760990ba79d5ebf3d1b6587e0bd311susnata                    obj.getBoundsRule().mBottom = BoundsRule.absoluteValue(value);
3433d9017263a760990ba79d5ebf3d1b6587e0bd311susnata                } else {
3443d9017263a760990ba79d5ebf3d1b6587e0bd311susnata                    obj.getBoundsRule().mBottom.setAbsoluteValue(value);
3453d9017263a760990ba79d5ebf3d1b6587e0bd311susnata                }
3463d9017263a760990ba79d5ebf3d1b6587e0bd311susnata
3473d9017263a760990ba79d5ebf3d1b6587e0bd311susnata                obj.recomputeBounds();
3483d9017263a760990ba79d5ebf3d1b6587e0bd311susnata            }
3493d9017263a760990ba79d5ebf3d1b6587e0bd311susnata
3503d9017263a760990ba79d5ebf3d1b6587e0bd311susnata            @Override
3513d9017263a760990ba79d5ebf3d1b6587e0bd311susnata            public Integer get(CompositeDrawable.ChildDrawable obj) {
352738deb3f9c75ea32dff1bf335753703e40e87f39Dake Gu                if (obj.getBoundsRule().mBottom == null) {
353738deb3f9c75ea32dff1bf335753703e40e87f39Dake Gu                    return obj.mParent.getBounds().bottom;
354738deb3f9c75ea32dff1bf335753703e40e87f39Dake Gu                }
3553d9017263a760990ba79d5ebf3d1b6587e0bd311susnata                return obj.getBoundsRule().mBottom.getAbsoluteValue();
3563d9017263a760990ba79d5ebf3d1b6587e0bd311susnata            }
3573d9017263a760990ba79d5ebf3d1b6587e0bd311susnata        };
3583d9017263a760990ba79d5ebf3d1b6587e0bd311susnata
3593d9017263a760990ba79d5ebf3d1b6587e0bd311susnata
3603d9017263a760990ba79d5ebf3d1b6587e0bd311susnata        /**
3613d9017263a760990ba79d5ebf3d1b6587e0bd311susnata         * Implementation of {@link Property} for overrideLeft attribute.
3623d9017263a760990ba79d5ebf3d1b6587e0bd311susnata         */
3633103f63e99d47573823957f7aa34308555873221Aurimas Liutikas        public static final Property<CompositeDrawable.ChildDrawable, Integer> LEFT_ABSOLUTE =
3643103f63e99d47573823957f7aa34308555873221Aurimas Liutikas                new Property<CompositeDrawable.ChildDrawable, Integer>(
3653103f63e99d47573823957f7aa34308555873221Aurimas Liutikas                        Integer.class, "absoluteLeft") {
3663d9017263a760990ba79d5ebf3d1b6587e0bd311susnata            @Override
3673d9017263a760990ba79d5ebf3d1b6587e0bd311susnata            public void set(CompositeDrawable.ChildDrawable obj, Integer value) {
3683d9017263a760990ba79d5ebf3d1b6587e0bd311susnata                if (obj.getBoundsRule().mLeft == null) {
3693d9017263a760990ba79d5ebf3d1b6587e0bd311susnata                    obj.getBoundsRule().mLeft = BoundsRule.absoluteValue(value);
3703d9017263a760990ba79d5ebf3d1b6587e0bd311susnata                } else {
3713d9017263a760990ba79d5ebf3d1b6587e0bd311susnata                    obj.getBoundsRule().mLeft.setAbsoluteValue(value);
3723d9017263a760990ba79d5ebf3d1b6587e0bd311susnata                }
3733d9017263a760990ba79d5ebf3d1b6587e0bd311susnata
3743d9017263a760990ba79d5ebf3d1b6587e0bd311susnata                obj.recomputeBounds();
3753d9017263a760990ba79d5ebf3d1b6587e0bd311susnata            }
3763d9017263a760990ba79d5ebf3d1b6587e0bd311susnata
3773d9017263a760990ba79d5ebf3d1b6587e0bd311susnata            @Override
3783d9017263a760990ba79d5ebf3d1b6587e0bd311susnata            public Integer get(CompositeDrawable.ChildDrawable obj) {
379738deb3f9c75ea32dff1bf335753703e40e87f39Dake Gu                if (obj.getBoundsRule().mLeft == null) {
380738deb3f9c75ea32dff1bf335753703e40e87f39Dake Gu                    return obj.mParent.getBounds().left;
381738deb3f9c75ea32dff1bf335753703e40e87f39Dake Gu                }
3823d9017263a760990ba79d5ebf3d1b6587e0bd311susnata                return obj.getBoundsRule().mLeft.getAbsoluteValue();
3833d9017263a760990ba79d5ebf3d1b6587e0bd311susnata            }
3843d9017263a760990ba79d5ebf3d1b6587e0bd311susnata        };
3853d9017263a760990ba79d5ebf3d1b6587e0bd311susnata
3863d9017263a760990ba79d5ebf3d1b6587e0bd311susnata        /**
3873d9017263a760990ba79d5ebf3d1b6587e0bd311susnata         * Implementation of {@link Property} for overrideRight attribute.
3883d9017263a760990ba79d5ebf3d1b6587e0bd311susnata         */
3893103f63e99d47573823957f7aa34308555873221Aurimas Liutikas        public static final Property<CompositeDrawable.ChildDrawable, Integer> RIGHT_ABSOLUTE =
3903103f63e99d47573823957f7aa34308555873221Aurimas Liutikas                new Property<CompositeDrawable.ChildDrawable, Integer>(
3913103f63e99d47573823957f7aa34308555873221Aurimas Liutikas                        Integer.class, "absoluteRight") {
3923d9017263a760990ba79d5ebf3d1b6587e0bd311susnata            @Override
3933d9017263a760990ba79d5ebf3d1b6587e0bd311susnata            public void set(CompositeDrawable.ChildDrawable obj, Integer value) {
3943d9017263a760990ba79d5ebf3d1b6587e0bd311susnata                if (obj.getBoundsRule().mRight == null) {
3953d9017263a760990ba79d5ebf3d1b6587e0bd311susnata                    obj.getBoundsRule().mRight = BoundsRule.absoluteValue(value);
3963d9017263a760990ba79d5ebf3d1b6587e0bd311susnata                } else {
3973d9017263a760990ba79d5ebf3d1b6587e0bd311susnata                    obj.getBoundsRule().mRight.setAbsoluteValue(value);
3983d9017263a760990ba79d5ebf3d1b6587e0bd311susnata                }
3993d9017263a760990ba79d5ebf3d1b6587e0bd311susnata
4003d9017263a760990ba79d5ebf3d1b6587e0bd311susnata                obj.recomputeBounds();
4013d9017263a760990ba79d5ebf3d1b6587e0bd311susnata            }
4023d9017263a760990ba79d5ebf3d1b6587e0bd311susnata
4033d9017263a760990ba79d5ebf3d1b6587e0bd311susnata            @Override
4043d9017263a760990ba79d5ebf3d1b6587e0bd311susnata            public Integer get(CompositeDrawable.ChildDrawable obj) {
405738deb3f9c75ea32dff1bf335753703e40e87f39Dake Gu                if (obj.getBoundsRule().mRight == null) {
406738deb3f9c75ea32dff1bf335753703e40e87f39Dake Gu                    return obj.mParent.getBounds().right;
407738deb3f9c75ea32dff1bf335753703e40e87f39Dake Gu                }
4083d9017263a760990ba79d5ebf3d1b6587e0bd311susnata                return obj.getBoundsRule().mRight.getAbsoluteValue();
4093d9017263a760990ba79d5ebf3d1b6587e0bd311susnata            }
4103d9017263a760990ba79d5ebf3d1b6587e0bd311susnata        };
4113d9017263a760990ba79d5ebf3d1b6587e0bd311susnata
4123d9017263a760990ba79d5ebf3d1b6587e0bd311susnata        /**
4133d9017263a760990ba79d5ebf3d1b6587e0bd311susnata         * Implementation of {@link Property} for overwriting the bottom attribute of
4143d9017263a760990ba79d5ebf3d1b6587e0bd311susnata         * {@link BoundsRule} associated with this {@link ChildDrawable}. This allows users to
4153d9017263a760990ba79d5ebf3d1b6587e0bd311susnata         * change the bounds rules as a percentage of parent size. This is preferable over
4163d9017263a760990ba79d5ebf3d1b6587e0bd311susnata         * {@see PROPERTY_TOP_ABSOLUTE} when the exact start/end position of scroll movement
4173d9017263a760990ba79d5ebf3d1b6587e0bd311susnata         * isn't available at compile time.
4183d9017263a760990ba79d5ebf3d1b6587e0bd311susnata         */
4193103f63e99d47573823957f7aa34308555873221Aurimas Liutikas        public static final Property<CompositeDrawable.ChildDrawable, Float> TOP_FRACTION =
4203103f63e99d47573823957f7aa34308555873221Aurimas Liutikas                new Property<CompositeDrawable.ChildDrawable, Float>(Float.class, "fractionTop") {
4213d9017263a760990ba79d5ebf3d1b6587e0bd311susnata            @Override
4223d9017263a760990ba79d5ebf3d1b6587e0bd311susnata            public void set(CompositeDrawable.ChildDrawable obj, Float value) {
4233d9017263a760990ba79d5ebf3d1b6587e0bd311susnata                if (obj.getBoundsRule().mTop == null) {
4243d9017263a760990ba79d5ebf3d1b6587e0bd311susnata                    obj.getBoundsRule().mTop = BoundsRule.inheritFromParent(value);
4253d9017263a760990ba79d5ebf3d1b6587e0bd311susnata                } else {
4263d9017263a760990ba79d5ebf3d1b6587e0bd311susnata                    obj.getBoundsRule().mTop.setFraction(value);
4273d9017263a760990ba79d5ebf3d1b6587e0bd311susnata                }
4283d9017263a760990ba79d5ebf3d1b6587e0bd311susnata
4293d9017263a760990ba79d5ebf3d1b6587e0bd311susnata                obj.recomputeBounds();
4303d9017263a760990ba79d5ebf3d1b6587e0bd311susnata            }
4313d9017263a760990ba79d5ebf3d1b6587e0bd311susnata
4323d9017263a760990ba79d5ebf3d1b6587e0bd311susnata            @Override
4333d9017263a760990ba79d5ebf3d1b6587e0bd311susnata            public Float get(CompositeDrawable.ChildDrawable obj) {
434738deb3f9c75ea32dff1bf335753703e40e87f39Dake Gu                if (obj.getBoundsRule().mTop == null) {
435738deb3f9c75ea32dff1bf335753703e40e87f39Dake Gu                    return 0f;
436738deb3f9c75ea32dff1bf335753703e40e87f39Dake Gu                }
4373d9017263a760990ba79d5ebf3d1b6587e0bd311susnata                return obj.getBoundsRule().mTop.getFraction();
4383d9017263a760990ba79d5ebf3d1b6587e0bd311susnata            }
4393d9017263a760990ba79d5ebf3d1b6587e0bd311susnata        };
4403d9017263a760990ba79d5ebf3d1b6587e0bd311susnata
4413d9017263a760990ba79d5ebf3d1b6587e0bd311susnata        /**
4423d9017263a760990ba79d5ebf3d1b6587e0bd311susnata         * Implementation of {@link Property} for overwriting the bottom attribute of
4433d9017263a760990ba79d5ebf3d1b6587e0bd311susnata         * {@link BoundsRule} associated with this {@link ChildDrawable}. This allows users to
4443d9017263a760990ba79d5ebf3d1b6587e0bd311susnata         * change the bounds rules as a percentage of parent size. This is preferable over
4453d9017263a760990ba79d5ebf3d1b6587e0bd311susnata         * {@see PROPERTY_BOTTOM_ABSOLUTE} when the exact start/end position of scroll movement
4463d9017263a760990ba79d5ebf3d1b6587e0bd311susnata         * isn't available at compile time.
4473d9017263a760990ba79d5ebf3d1b6587e0bd311susnata         */
4483103f63e99d47573823957f7aa34308555873221Aurimas Liutikas        public static final Property<CompositeDrawable.ChildDrawable, Float> BOTTOM_FRACTION =
4493103f63e99d47573823957f7aa34308555873221Aurimas Liutikas                new Property<CompositeDrawable.ChildDrawable, Float>(
4503103f63e99d47573823957f7aa34308555873221Aurimas Liutikas                        Float.class, "fractionBottom") {
4513d9017263a760990ba79d5ebf3d1b6587e0bd311susnata            @Override
4523d9017263a760990ba79d5ebf3d1b6587e0bd311susnata            public void set(CompositeDrawable.ChildDrawable obj, Float value) {
4533d9017263a760990ba79d5ebf3d1b6587e0bd311susnata                if (obj.getBoundsRule().mBottom == null) {
4543d9017263a760990ba79d5ebf3d1b6587e0bd311susnata                    obj.getBoundsRule().mBottom = BoundsRule.inheritFromParent(value);
4553d9017263a760990ba79d5ebf3d1b6587e0bd311susnata                } else {
4563d9017263a760990ba79d5ebf3d1b6587e0bd311susnata                    obj.getBoundsRule().mBottom.setFraction(value);
4573d9017263a760990ba79d5ebf3d1b6587e0bd311susnata                }
4583d9017263a760990ba79d5ebf3d1b6587e0bd311susnata
4593d9017263a760990ba79d5ebf3d1b6587e0bd311susnata                obj.recomputeBounds();
4603d9017263a760990ba79d5ebf3d1b6587e0bd311susnata            }
4613d9017263a760990ba79d5ebf3d1b6587e0bd311susnata
4623d9017263a760990ba79d5ebf3d1b6587e0bd311susnata            @Override
4633d9017263a760990ba79d5ebf3d1b6587e0bd311susnata            public Float get(CompositeDrawable.ChildDrawable obj) {
464738deb3f9c75ea32dff1bf335753703e40e87f39Dake Gu                if (obj.getBoundsRule().mBottom == null) {
465738deb3f9c75ea32dff1bf335753703e40e87f39Dake Gu                    return 1f;
466738deb3f9c75ea32dff1bf335753703e40e87f39Dake Gu                }
4673d9017263a760990ba79d5ebf3d1b6587e0bd311susnata                return obj.getBoundsRule().mBottom.getFraction();
4683d9017263a760990ba79d5ebf3d1b6587e0bd311susnata            }
4693d9017263a760990ba79d5ebf3d1b6587e0bd311susnata        };
4703d9017263a760990ba79d5ebf3d1b6587e0bd311susnata
4713d9017263a760990ba79d5ebf3d1b6587e0bd311susnata        /**
4723d9017263a760990ba79d5ebf3d1b6587e0bd311susnata         * Implementation of {@link Property} for overwriting the bottom attribute of
4733d9017263a760990ba79d5ebf3d1b6587e0bd311susnata         * {@link BoundsRule} associated with this {@link ChildDrawable}. This allows users to
4743d9017263a760990ba79d5ebf3d1b6587e0bd311susnata         * change the bounds rules as a percentage of parent size. This is preferable over
4753d9017263a760990ba79d5ebf3d1b6587e0bd311susnata         * {@see PROPERTY_LEFT_ABSOLUTE} when the exact start/end position of scroll movement
4763d9017263a760990ba79d5ebf3d1b6587e0bd311susnata         * isn't available at compile time.
4773d9017263a760990ba79d5ebf3d1b6587e0bd311susnata         */
4783103f63e99d47573823957f7aa34308555873221Aurimas Liutikas        public static final Property<CompositeDrawable.ChildDrawable, Float> LEFT_FRACTION =
4793103f63e99d47573823957f7aa34308555873221Aurimas Liutikas                new Property<CompositeDrawable.ChildDrawable, Float>(Float.class, "fractionLeft") {
4803d9017263a760990ba79d5ebf3d1b6587e0bd311susnata            @Override
4813d9017263a760990ba79d5ebf3d1b6587e0bd311susnata            public void set(CompositeDrawable.ChildDrawable obj, Float value) {
4823d9017263a760990ba79d5ebf3d1b6587e0bd311susnata                if (obj.getBoundsRule().mLeft == null) {
4833d9017263a760990ba79d5ebf3d1b6587e0bd311susnata                    obj.getBoundsRule().mLeft = BoundsRule.inheritFromParent(value);
4843d9017263a760990ba79d5ebf3d1b6587e0bd311susnata                } else {
4853d9017263a760990ba79d5ebf3d1b6587e0bd311susnata                    obj.getBoundsRule().mLeft.setFraction(value);
4863d9017263a760990ba79d5ebf3d1b6587e0bd311susnata                }
4873d9017263a760990ba79d5ebf3d1b6587e0bd311susnata
4883d9017263a760990ba79d5ebf3d1b6587e0bd311susnata                obj.recomputeBounds();
4893d9017263a760990ba79d5ebf3d1b6587e0bd311susnata            }
4903d9017263a760990ba79d5ebf3d1b6587e0bd311susnata
4913d9017263a760990ba79d5ebf3d1b6587e0bd311susnata            @Override
4923d9017263a760990ba79d5ebf3d1b6587e0bd311susnata            public Float get(CompositeDrawable.ChildDrawable obj) {
493738deb3f9c75ea32dff1bf335753703e40e87f39Dake Gu                if (obj.getBoundsRule().mLeft == null) {
494738deb3f9c75ea32dff1bf335753703e40e87f39Dake Gu                    return 0f;
495738deb3f9c75ea32dff1bf335753703e40e87f39Dake Gu                }
4963d9017263a760990ba79d5ebf3d1b6587e0bd311susnata                return obj.getBoundsRule().mLeft.getFraction();
4973d9017263a760990ba79d5ebf3d1b6587e0bd311susnata            }
4983d9017263a760990ba79d5ebf3d1b6587e0bd311susnata        };
4993d9017263a760990ba79d5ebf3d1b6587e0bd311susnata
5003d9017263a760990ba79d5ebf3d1b6587e0bd311susnata        /**
5013d9017263a760990ba79d5ebf3d1b6587e0bd311susnata         * Implementation of {@link Property} for overwriting the bottom attribute of
5023d9017263a760990ba79d5ebf3d1b6587e0bd311susnata         * {@link BoundsRule} associated with this {@link ChildDrawable}. This allows users to
5033d9017263a760990ba79d5ebf3d1b6587e0bd311susnata         * change the bounds rules as a percentage of parent size. This is preferable over
5043d9017263a760990ba79d5ebf3d1b6587e0bd311susnata         * {@see PROPERTY_RIGHT_ABSOLUTE} when the exact start/end position of scroll movement
5053d9017263a760990ba79d5ebf3d1b6587e0bd311susnata         * isn't available at compile time.
5063d9017263a760990ba79d5ebf3d1b6587e0bd311susnata         */
5073103f63e99d47573823957f7aa34308555873221Aurimas Liutikas        public static final Property<CompositeDrawable.ChildDrawable, Float> RIGHT_FRACTION =
5083103f63e99d47573823957f7aa34308555873221Aurimas Liutikas                new Property<CompositeDrawable.ChildDrawable, Float>(Float.class, "fractoinRight") {
5093d9017263a760990ba79d5ebf3d1b6587e0bd311susnata            @Override
5103d9017263a760990ba79d5ebf3d1b6587e0bd311susnata            public void set(CompositeDrawable.ChildDrawable obj, Float value) {
5113d9017263a760990ba79d5ebf3d1b6587e0bd311susnata                if (obj.getBoundsRule().mRight == null) {
5123d9017263a760990ba79d5ebf3d1b6587e0bd311susnata                    obj.getBoundsRule().mRight = BoundsRule.inheritFromParent(value);
5133d9017263a760990ba79d5ebf3d1b6587e0bd311susnata                } else {
5143d9017263a760990ba79d5ebf3d1b6587e0bd311susnata                    obj.getBoundsRule().mRight.setFraction(value);
5153d9017263a760990ba79d5ebf3d1b6587e0bd311susnata                }
5163d9017263a760990ba79d5ebf3d1b6587e0bd311susnata
5173d9017263a760990ba79d5ebf3d1b6587e0bd311susnata                obj.recomputeBounds();
5183d9017263a760990ba79d5ebf3d1b6587e0bd311susnata            }
5193d9017263a760990ba79d5ebf3d1b6587e0bd311susnata
5203d9017263a760990ba79d5ebf3d1b6587e0bd311susnata            @Override
5213d9017263a760990ba79d5ebf3d1b6587e0bd311susnata            public Float get(CompositeDrawable.ChildDrawable obj) {
522738deb3f9c75ea32dff1bf335753703e40e87f39Dake Gu                if (obj.getBoundsRule().mRight == null) {
523738deb3f9c75ea32dff1bf335753703e40e87f39Dake Gu                    return 1f;
524738deb3f9c75ea32dff1bf335753703e40e87f39Dake Gu                }
5253d9017263a760990ba79d5ebf3d1b6587e0bd311susnata                return obj.getBoundsRule().mRight.getFraction();
5263d9017263a760990ba79d5ebf3d1b6587e0bd311susnata            }
5273d9017263a760990ba79d5ebf3d1b6587e0bd311susnata        };
528df64e524a2bad079e6b0aa2d22c287f2c62aed82susnata    }
529df64e524a2bad079e6b0aa2d22c287f2c62aed82susnata}
530