1be565dfc1c17b7ddafa9753851b8f82849fd3f42Jorim Jaggi/* 2be565dfc1c17b7ddafa9753851b8f82849fd3f42Jorim Jaggi * Copyright (C) 2014 The Android Open Source Project 3be565dfc1c17b7ddafa9753851b8f82849fd3f42Jorim Jaggi * 4be565dfc1c17b7ddafa9753851b8f82849fd3f42Jorim Jaggi * Licensed under the Apache License, Version 2.0 (the "License"); 5be565dfc1c17b7ddafa9753851b8f82849fd3f42Jorim Jaggi * you may not use this file except in compliance with the License. 6be565dfc1c17b7ddafa9753851b8f82849fd3f42Jorim Jaggi * You may obtain a copy of the License at 7be565dfc1c17b7ddafa9753851b8f82849fd3f42Jorim Jaggi * 8be565dfc1c17b7ddafa9753851b8f82849fd3f42Jorim Jaggi * http://www.apache.org/licenses/LICENSE-2.0 9be565dfc1c17b7ddafa9753851b8f82849fd3f42Jorim Jaggi * 10be565dfc1c17b7ddafa9753851b8f82849fd3f42Jorim Jaggi * Unless required by applicable law or agreed to in writing, software 11be565dfc1c17b7ddafa9753851b8f82849fd3f42Jorim Jaggi * distributed under the License is distributed on an "AS IS" BASIS, 12be565dfc1c17b7ddafa9753851b8f82849fd3f42Jorim Jaggi * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13be565dfc1c17b7ddafa9753851b8f82849fd3f42Jorim Jaggi * See the License for the specific language governing permissions and 14be565dfc1c17b7ddafa9753851b8f82849fd3f42Jorim Jaggi * limitations under the License 15be565dfc1c17b7ddafa9753851b8f82849fd3f42Jorim Jaggi */ 16be565dfc1c17b7ddafa9753851b8f82849fd3f42Jorim Jaggi 17be565dfc1c17b7ddafa9753851b8f82849fd3f42Jorim Jaggipackage com.android.systemui.statusbar; 18be565dfc1c17b7ddafa9753851b8f82849fd3f42Jorim Jaggi 19be565dfc1c17b7ddafa9753851b8f82849fd3f42Jorim Jaggiimport android.content.Context; 20be565dfc1c17b7ddafa9753851b8f82849fd3f42Jorim Jaggiimport android.graphics.Outline; 217b7ca3cdf25bee73aa9e58aaaf6ce75fe81bd045Chris Craikimport android.graphics.Rect; 228efa6dde2b4f2cdbf046b87b7366404c3cc46219Selim Cinekimport android.graphics.RectF; 23be565dfc1c17b7ddafa9753851b8f82849fd3f42Jorim Jaggiimport android.util.AttributeSet; 247b7ca3cdf25bee73aa9e58aaaf6ce75fe81bd045Chris Craikimport android.view.View; 257b7ca3cdf25bee73aa9e58aaaf6ce75fe81bd045Chris Craikimport android.view.ViewOutlineProvider; 26be565dfc1c17b7ddafa9753851b8f82849fd3f42Jorim Jaggi 27be565dfc1c17b7ddafa9753851b8f82849fd3f42Jorim Jaggi/** 28be565dfc1c17b7ddafa9753851b8f82849fd3f42Jorim Jaggi * Like {@link ExpandableView}, but setting an outline for the height and clipping. 29be565dfc1c17b7ddafa9753851b8f82849fd3f42Jorim Jaggi */ 30be565dfc1c17b7ddafa9753851b8f82849fd3f42Jorim Jaggipublic abstract class ExpandableOutlineView extends ExpandableView { 31be565dfc1c17b7ddafa9753851b8f82849fd3f42Jorim Jaggi 327b7ca3cdf25bee73aa9e58aaaf6ce75fe81bd045Chris Craik private final Rect mOutlineRect = new Rect(); 338efa6dde2b4f2cdbf046b87b7366404c3cc46219Selim Cinek private boolean mCustomOutline; 34be565dfc1c17b7ddafa9753851b8f82849fd3f42Jorim Jaggi 35be565dfc1c17b7ddafa9753851b8f82849fd3f42Jorim Jaggi public ExpandableOutlineView(Context context, AttributeSet attrs) { 36be565dfc1c17b7ddafa9753851b8f82849fd3f42Jorim Jaggi super(context, attrs); 377b7ca3cdf25bee73aa9e58aaaf6ce75fe81bd045Chris Craik setOutlineProvider(new ViewOutlineProvider() { 387b7ca3cdf25bee73aa9e58aaaf6ce75fe81bd045Chris Craik @Override 3931ba192dd201df2cad96a8c503f730130ab0d80fChris Craik public void getOutline(View view, Outline outline) { 407b7ca3cdf25bee73aa9e58aaaf6ce75fe81bd045Chris Craik if (!mCustomOutline) { 417b7ca3cdf25bee73aa9e58aaaf6ce75fe81bd045Chris Craik outline.setRect(0, 427b7ca3cdf25bee73aa9e58aaaf6ce75fe81bd045Chris Craik mClipTopAmount, 437b7ca3cdf25bee73aa9e58aaaf6ce75fe81bd045Chris Craik getWidth(), 44310df3127aace5a82cdc107fdb1e2d6957f38bccChris Wren Math.max(getActualHeight(), mClipTopAmount)); 457b7ca3cdf25bee73aa9e58aaaf6ce75fe81bd045Chris Craik } else { 467b7ca3cdf25bee73aa9e58aaaf6ce75fe81bd045Chris Craik outline.setRect(mOutlineRect); 477b7ca3cdf25bee73aa9e58aaaf6ce75fe81bd045Chris Craik } 487b7ca3cdf25bee73aa9e58aaaf6ce75fe81bd045Chris Craik } 497b7ca3cdf25bee73aa9e58aaaf6ce75fe81bd045Chris Craik }); 50be565dfc1c17b7ddafa9753851b8f82849fd3f42Jorim Jaggi } 51be565dfc1c17b7ddafa9753851b8f82849fd3f42Jorim Jaggi 52be565dfc1c17b7ddafa9753851b8f82849fd3f42Jorim Jaggi @Override 53d552d9d8e964c102e6832610be46cf2c041e8829Jorim Jaggi public void setActualHeight(int actualHeight, boolean notifyListeners) { 54d552d9d8e964c102e6832610be46cf2c041e8829Jorim Jaggi super.setActualHeight(actualHeight, notifyListeners); 557b7ca3cdf25bee73aa9e58aaaf6ce75fe81bd045Chris Craik invalidateOutline(); 56be565dfc1c17b7ddafa9753851b8f82849fd3f42Jorim Jaggi } 57be565dfc1c17b7ddafa9753851b8f82849fd3f42Jorim Jaggi 58be565dfc1c17b7ddafa9753851b8f82849fd3f42Jorim Jaggi @Override 59be565dfc1c17b7ddafa9753851b8f82849fd3f42Jorim Jaggi public void setClipTopAmount(int clipTopAmount) { 60be565dfc1c17b7ddafa9753851b8f82849fd3f42Jorim Jaggi super.setClipTopAmount(clipTopAmount); 617b7ca3cdf25bee73aa9e58aaaf6ce75fe81bd045Chris Craik invalidateOutline(); 62be565dfc1c17b7ddafa9753851b8f82849fd3f42Jorim Jaggi } 63be565dfc1c17b7ddafa9753851b8f82849fd3f42Jorim Jaggi 648efa6dde2b4f2cdbf046b87b7366404c3cc46219Selim Cinek protected void setOutlineRect(RectF rect) { 658efa6dde2b4f2cdbf046b87b7366404c3cc46219Selim Cinek if (rect != null) { 668efa6dde2b4f2cdbf046b87b7366404c3cc46219Selim Cinek setOutlineRect(rect.left, rect.top, rect.right, rect.bottom); 678efa6dde2b4f2cdbf046b87b7366404c3cc46219Selim Cinek } else { 688efa6dde2b4f2cdbf046b87b7366404c3cc46219Selim Cinek mCustomOutline = false; 697b7ca3cdf25bee73aa9e58aaaf6ce75fe81bd045Chris Craik invalidateOutline(); 708efa6dde2b4f2cdbf046b87b7366404c3cc46219Selim Cinek } 718efa6dde2b4f2cdbf046b87b7366404c3cc46219Selim Cinek } 728efa6dde2b4f2cdbf046b87b7366404c3cc46219Selim Cinek 738efa6dde2b4f2cdbf046b87b7366404c3cc46219Selim Cinek protected void setOutlineRect(float left, float top, float right, float bottom) { 748efa6dde2b4f2cdbf046b87b7366404c3cc46219Selim Cinek mCustomOutline = true; 758efa6dde2b4f2cdbf046b87b7366404c3cc46219Selim Cinek 767b7ca3cdf25bee73aa9e58aaaf6ce75fe81bd045Chris Craik mOutlineRect.set((int) left, (int) top, (int) right, (int) bottom); 778efa6dde2b4f2cdbf046b87b7366404c3cc46219Selim Cinek 788efa6dde2b4f2cdbf046b87b7366404c3cc46219Selim Cinek // Outlines need to be at least 1 dp 793969ffa2f5830a680490d03fbb113a7fee900b56Selim Cinek mOutlineRect.bottom = (int) Math.max(top, mOutlineRect.bottom); 803969ffa2f5830a680490d03fbb113a7fee900b56Selim Cinek mOutlineRect.right = (int) Math.max(left, mOutlineRect.right); 818efa6dde2b4f2cdbf046b87b7366404c3cc46219Selim Cinek 827b7ca3cdf25bee73aa9e58aaaf6ce75fe81bd045Chris Craik invalidateOutline(); 838efa6dde2b4f2cdbf046b87b7366404c3cc46219Selim Cinek } 847b7ca3cdf25bee73aa9e58aaaf6ce75fe81bd045Chris Craik 85be565dfc1c17b7ddafa9753851b8f82849fd3f42Jorim Jaggi} 86