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