1dcfa7976fa836ae90bb4a579892a18a0abf35b3cWinson Chung/*
2dcfa7976fa836ae90bb4a579892a18a0abf35b3cWinson Chung * Copyright (C) 2014 The Android Open Source Project
3dcfa7976fa836ae90bb4a579892a18a0abf35b3cWinson Chung *
4dcfa7976fa836ae90bb4a579892a18a0abf35b3cWinson Chung * Licensed under the Apache License, Version 2.0 (the "License");
5dcfa7976fa836ae90bb4a579892a18a0abf35b3cWinson Chung * you may not use this file except in compliance with the License.
6dcfa7976fa836ae90bb4a579892a18a0abf35b3cWinson Chung * You may obtain a copy of the License at
7dcfa7976fa836ae90bb4a579892a18a0abf35b3cWinson Chung *
8dcfa7976fa836ae90bb4a579892a18a0abf35b3cWinson Chung *      http://www.apache.org/licenses/LICENSE-2.0
9dcfa7976fa836ae90bb4a579892a18a0abf35b3cWinson Chung *
10dcfa7976fa836ae90bb4a579892a18a0abf35b3cWinson Chung * Unless required by applicable law or agreed to in writing, software
11dcfa7976fa836ae90bb4a579892a18a0abf35b3cWinson Chung * distributed under the License is distributed on an "AS IS" BASIS,
12dcfa7976fa836ae90bb4a579892a18a0abf35b3cWinson Chung * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13dcfa7976fa836ae90bb4a579892a18a0abf35b3cWinson Chung * See the License for the specific language governing permissions and
14dcfa7976fa836ae90bb4a579892a18a0abf35b3cWinson Chung * limitations under the License.
15dcfa7976fa836ae90bb4a579892a18a0abf35b3cWinson Chung */
16dcfa7976fa836ae90bb4a579892a18a0abf35b3cWinson Chung
17dcfa7976fa836ae90bb4a579892a18a0abf35b3cWinson Chungpackage com.android.systemui.recents.views;
18dcfa7976fa836ae90bb4a579892a18a0abf35b3cWinson Chung
19dcfa7976fa836ae90bb4a579892a18a0abf35b3cWinson Chungimport android.graphics.Outline;
20dcfa7976fa836ae90bb4a579892a18a0abf35b3cWinson Chungimport android.graphics.Rect;
21dcfa7976fa836ae90bb4a579892a18a0abf35b3cWinson Chungimport android.view.View;
22dcfa7976fa836ae90bb4a579892a18a0abf35b3cWinson Chungimport android.view.ViewOutlineProvider;
23dcfa7976fa836ae90bb4a579892a18a0abf35b3cWinson Chungimport com.android.systemui.recents.RecentsConfiguration;
24dcfa7976fa836ae90bb4a579892a18a0abf35b3cWinson Chung
25dcfa7976fa836ae90bb4a579892a18a0abf35b3cWinson Chung/* An outline provider that has a clip and outline that can be animated. */
26dcfa7976fa836ae90bb4a579892a18a0abf35b3cWinson Chungpublic class AnimateableViewBounds extends ViewOutlineProvider {
27dcfa7976fa836ae90bb4a579892a18a0abf35b3cWinson Chung
28dcfa7976fa836ae90bb4a579892a18a0abf35b3cWinson Chung    RecentsConfiguration mConfig;
29dcfa7976fa836ae90bb4a579892a18a0abf35b3cWinson Chung
30bf5dbf1c151eb64f4068f233e72b0a867348bf8cWinson Chung    TaskView mSourceView;
31dcfa7976fa836ae90bb4a579892a18a0abf35b3cWinson Chung    Rect mClipRect = new Rect();
32bf5dbf1c151eb64f4068f233e72b0a867348bf8cWinson Chung    Rect mClipBounds = new Rect();
33dcfa7976fa836ae90bb4a579892a18a0abf35b3cWinson Chung    int mCornerRadius;
34ebfc6981828b0699eef85c58b23a61f2cac41af3Winson Chung    float mAlpha = 1f;
35ebfc6981828b0699eef85c58b23a61f2cac41af3Winson Chung    final float mMinAlpha = 0.25f;
36dcfa7976fa836ae90bb4a579892a18a0abf35b3cWinson Chung
37bf5dbf1c151eb64f4068f233e72b0a867348bf8cWinson Chung    public AnimateableViewBounds(TaskView source, int cornerRadius) {
38dcfa7976fa836ae90bb4a579892a18a0abf35b3cWinson Chung        mConfig = RecentsConfiguration.getInstance();
39dcfa7976fa836ae90bb4a579892a18a0abf35b3cWinson Chung        mSourceView = source;
40dcfa7976fa836ae90bb4a579892a18a0abf35b3cWinson Chung        mCornerRadius = cornerRadius;
41dcfa7976fa836ae90bb4a579892a18a0abf35b3cWinson Chung        setClipBottom(getClipBottom());
42dcfa7976fa836ae90bb4a579892a18a0abf35b3cWinson Chung    }
43dcfa7976fa836ae90bb4a579892a18a0abf35b3cWinson Chung
44dcfa7976fa836ae90bb4a579892a18a0abf35b3cWinson Chung    @Override
45dcfa7976fa836ae90bb4a579892a18a0abf35b3cWinson Chung    public void getOutline(View view, Outline outline) {
46ebfc6981828b0699eef85c58b23a61f2cac41af3Winson Chung        outline.setAlpha(mMinAlpha + mAlpha / (1f - mMinAlpha));
47606b3da71ab64e489e8f65e0b1092138dbfaf7b7Winson Chung        outline.setRoundRect(mClipRect.left, mClipRect.top,
48606b3da71ab64e489e8f65e0b1092138dbfaf7b7Winson Chung                mSourceView.getWidth() - mClipRect.right,
49606b3da71ab64e489e8f65e0b1092138dbfaf7b7Winson Chung                mSourceView.getHeight() - mClipRect.bottom,
50dcfa7976fa836ae90bb4a579892a18a0abf35b3cWinson Chung                mCornerRadius);
51dcfa7976fa836ae90bb4a579892a18a0abf35b3cWinson Chung    }
52dcfa7976fa836ae90bb4a579892a18a0abf35b3cWinson Chung
53ebfc6981828b0699eef85c58b23a61f2cac41af3Winson Chung    /** Sets the view outline alpha. */
54ebfc6981828b0699eef85c58b23a61f2cac41af3Winson Chung    void setAlpha(float alpha) {
55ebfc6981828b0699eef85c58b23a61f2cac41af3Winson Chung        if (Float.compare(alpha, mAlpha) != 0) {
56ebfc6981828b0699eef85c58b23a61f2cac41af3Winson Chung            mAlpha = alpha;
57ebfc6981828b0699eef85c58b23a61f2cac41af3Winson Chung            mSourceView.invalidateOutline();
58ebfc6981828b0699eef85c58b23a61f2cac41af3Winson Chung        }
59ebfc6981828b0699eef85c58b23a61f2cac41af3Winson Chung    }
60ebfc6981828b0699eef85c58b23a61f2cac41af3Winson Chung
61dcfa7976fa836ae90bb4a579892a18a0abf35b3cWinson Chung    /** Sets the bottom clip. */
62dcfa7976fa836ae90bb4a579892a18a0abf35b3cWinson Chung    public void setClipBottom(int bottom) {
63dcfa7976fa836ae90bb4a579892a18a0abf35b3cWinson Chung        if (bottom != mClipRect.bottom) {
64dcfa7976fa836ae90bb4a579892a18a0abf35b3cWinson Chung            mClipRect.bottom = bottom;
65dcfa7976fa836ae90bb4a579892a18a0abf35b3cWinson Chung            mSourceView.invalidateOutline();
66bf5dbf1c151eb64f4068f233e72b0a867348bf8cWinson Chung            updateClipBounds();
67bf5dbf1c151eb64f4068f233e72b0a867348bf8cWinson Chung            if (!mConfig.useHardwareLayers) {
68353c0b91daa97fa87f077be0f403fe7db8dedb40Winson Chung                mSourceView.mThumbnailView.updateThumbnailVisibility(
69bf5dbf1c151eb64f4068f233e72b0a867348bf8cWinson Chung                        bottom - mSourceView.getPaddingBottom());
70bf5dbf1c151eb64f4068f233e72b0a867348bf8cWinson Chung            }
71dcfa7976fa836ae90bb4a579892a18a0abf35b3cWinson Chung        }
72dcfa7976fa836ae90bb4a579892a18a0abf35b3cWinson Chung    }
73dcfa7976fa836ae90bb4a579892a18a0abf35b3cWinson Chung
74dcfa7976fa836ae90bb4a579892a18a0abf35b3cWinson Chung    /** Returns the bottom clip. */
75dcfa7976fa836ae90bb4a579892a18a0abf35b3cWinson Chung    public int getClipBottom() {
76dcfa7976fa836ae90bb4a579892a18a0abf35b3cWinson Chung        return mClipRect.bottom;
77dcfa7976fa836ae90bb4a579892a18a0abf35b3cWinson Chung    }
78dcfa7976fa836ae90bb4a579892a18a0abf35b3cWinson Chung
79bf5dbf1c151eb64f4068f233e72b0a867348bf8cWinson Chung    private void updateClipBounds() {
80bf5dbf1c151eb64f4068f233e72b0a867348bf8cWinson Chung        mClipBounds.set(mClipRect.left, mClipRect.top,
81bf5dbf1c151eb64f4068f233e72b0a867348bf8cWinson Chung                mSourceView.getWidth() - mClipRect.right,
82bf5dbf1c151eb64f4068f233e72b0a867348bf8cWinson Chung                mSourceView.getHeight() - mClipRect.bottom);
83bf5dbf1c151eb64f4068f233e72b0a867348bf8cWinson Chung        mSourceView.setClipBounds(mClipBounds);
84bf5dbf1c151eb64f4068f233e72b0a867348bf8cWinson Chung    }
85dcfa7976fa836ae90bb4a579892a18a0abf35b3cWinson Chung}
86