ExpandableView.java revision 4222d9a7fb87d73e1443ec1a2de9782b05741af6
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.Canvas; 21be565dfc1c17b7ddafa9753851b8f82849fd3f42Jorim Jaggiimport android.graphics.Outline; 22be565dfc1c17b7ddafa9753851b8f82849fd3f42Jorim Jaggiimport android.graphics.Rect; 23be565dfc1c17b7ddafa9753851b8f82849fd3f42Jorim Jaggiimport android.graphics.drawable.Drawable; 24be565dfc1c17b7ddafa9753851b8f82849fd3f42Jorim Jaggiimport android.graphics.drawable.InsetDrawable; 25be565dfc1c17b7ddafa9753851b8f82849fd3f42Jorim Jaggiimport android.util.AttributeSet; 26be565dfc1c17b7ddafa9753851b8f82849fd3f42Jorim Jaggiimport android.view.View; 27be565dfc1c17b7ddafa9753851b8f82849fd3f42Jorim Jaggiimport android.widget.FrameLayout; 28be565dfc1c17b7ddafa9753851b8f82849fd3f42Jorim Jaggi 29be565dfc1c17b7ddafa9753851b8f82849fd3f42Jorim Jaggi/** 30be565dfc1c17b7ddafa9753851b8f82849fd3f42Jorim Jaggi * An abstract view for expandable views. 31be565dfc1c17b7ddafa9753851b8f82849fd3f42Jorim Jaggi */ 32be565dfc1c17b7ddafa9753851b8f82849fd3f42Jorim Jaggipublic abstract class ExpandableView extends FrameLayout { 33be565dfc1c17b7ddafa9753851b8f82849fd3f42Jorim Jaggi 34be565dfc1c17b7ddafa9753851b8f82849fd3f42Jorim Jaggi private OnHeightChangedListener mOnHeightChangedListener; 35be565dfc1c17b7ddafa9753851b8f82849fd3f42Jorim Jaggi protected int mActualHeight; 36be565dfc1c17b7ddafa9753851b8f82849fd3f42Jorim Jaggi protected int mClipTopAmount; 37be565dfc1c17b7ddafa9753851b8f82849fd3f42Jorim Jaggi private boolean mActualHeightInitialized; 38be565dfc1c17b7ddafa9753851b8f82849fd3f42Jorim Jaggi 39be565dfc1c17b7ddafa9753851b8f82849fd3f42Jorim Jaggi public ExpandableView(Context context, AttributeSet attrs) { 40be565dfc1c17b7ddafa9753851b8f82849fd3f42Jorim Jaggi super(context, attrs); 41be565dfc1c17b7ddafa9753851b8f82849fd3f42Jorim Jaggi } 42be565dfc1c17b7ddafa9753851b8f82849fd3f42Jorim Jaggi 43be565dfc1c17b7ddafa9753851b8f82849fd3f42Jorim Jaggi @Override 44be565dfc1c17b7ddafa9753851b8f82849fd3f42Jorim Jaggi protected void onLayout(boolean changed, int left, int top, int right, int bottom) { 45be565dfc1c17b7ddafa9753851b8f82849fd3f42Jorim Jaggi super.onLayout(changed, left, top, right, bottom); 46be565dfc1c17b7ddafa9753851b8f82849fd3f42Jorim Jaggi if (!mActualHeightInitialized && mActualHeight == 0) { 47be565dfc1c17b7ddafa9753851b8f82849fd3f42Jorim Jaggi mActualHeight = getHeight(); 48be565dfc1c17b7ddafa9753851b8f82849fd3f42Jorim Jaggi } 49be565dfc1c17b7ddafa9753851b8f82849fd3f42Jorim Jaggi mActualHeightInitialized = true; 50be565dfc1c17b7ddafa9753851b8f82849fd3f42Jorim Jaggi } 51be565dfc1c17b7ddafa9753851b8f82849fd3f42Jorim Jaggi 52be565dfc1c17b7ddafa9753851b8f82849fd3f42Jorim Jaggi /** 53be565dfc1c17b7ddafa9753851b8f82849fd3f42Jorim Jaggi * Sets the actual height of this notification. This is different than the laid out 54be565dfc1c17b7ddafa9753851b8f82849fd3f42Jorim Jaggi * {@link View#getHeight()}, as we want to avoid layouting during scrolling and expanding. 55be565dfc1c17b7ddafa9753851b8f82849fd3f42Jorim Jaggi */ 56be565dfc1c17b7ddafa9753851b8f82849fd3f42Jorim Jaggi public void setActualHeight(int actualHeight) { 57be565dfc1c17b7ddafa9753851b8f82849fd3f42Jorim Jaggi mActualHeight = actualHeight; 58be565dfc1c17b7ddafa9753851b8f82849fd3f42Jorim Jaggi if (mOnHeightChangedListener != null) { 59be565dfc1c17b7ddafa9753851b8f82849fd3f42Jorim Jaggi mOnHeightChangedListener.onHeightChanged(this); 60be565dfc1c17b7ddafa9753851b8f82849fd3f42Jorim Jaggi } 61be565dfc1c17b7ddafa9753851b8f82849fd3f42Jorim Jaggi } 62be565dfc1c17b7ddafa9753851b8f82849fd3f42Jorim Jaggi 63be565dfc1c17b7ddafa9753851b8f82849fd3f42Jorim Jaggi /** 64be565dfc1c17b7ddafa9753851b8f82849fd3f42Jorim Jaggi * See {@link #setActualHeight}. 65be565dfc1c17b7ddafa9753851b8f82849fd3f42Jorim Jaggi * 66be565dfc1c17b7ddafa9753851b8f82849fd3f42Jorim Jaggi * @return The actual height of this notification. 67be565dfc1c17b7ddafa9753851b8f82849fd3f42Jorim Jaggi */ 68be565dfc1c17b7ddafa9753851b8f82849fd3f42Jorim Jaggi public int getActualHeight() { 69be565dfc1c17b7ddafa9753851b8f82849fd3f42Jorim Jaggi return mActualHeight; 70be565dfc1c17b7ddafa9753851b8f82849fd3f42Jorim Jaggi } 71be565dfc1c17b7ddafa9753851b8f82849fd3f42Jorim Jaggi 72be565dfc1c17b7ddafa9753851b8f82849fd3f42Jorim Jaggi /** 73be565dfc1c17b7ddafa9753851b8f82849fd3f42Jorim Jaggi * @return The maximum height of this notification. 74be565dfc1c17b7ddafa9753851b8f82849fd3f42Jorim Jaggi */ 754222d9a7fb87d73e1443ec1a2de9782b05741af6Jorim Jaggi public int getMaxHeight() { 764222d9a7fb87d73e1443ec1a2de9782b05741af6Jorim Jaggi return getHeight(); 774222d9a7fb87d73e1443ec1a2de9782b05741af6Jorim Jaggi } 784222d9a7fb87d73e1443ec1a2de9782b05741af6Jorim Jaggi 794222d9a7fb87d73e1443ec1a2de9782b05741af6Jorim Jaggi /** 804222d9a7fb87d73e1443ec1a2de9782b05741af6Jorim Jaggi * @return The minimum height of this notification. 814222d9a7fb87d73e1443ec1a2de9782b05741af6Jorim Jaggi */ 824222d9a7fb87d73e1443ec1a2de9782b05741af6Jorim Jaggi public int getMinHeight() { 834222d9a7fb87d73e1443ec1a2de9782b05741af6Jorim Jaggi return getHeight(); 844222d9a7fb87d73e1443ec1a2de9782b05741af6Jorim Jaggi } 85be565dfc1c17b7ddafa9753851b8f82849fd3f42Jorim Jaggi 86be565dfc1c17b7ddafa9753851b8f82849fd3f42Jorim Jaggi /** 87be565dfc1c17b7ddafa9753851b8f82849fd3f42Jorim Jaggi * Sets the amount this view should be clipped from the top. This is used when an expanded 88be565dfc1c17b7ddafa9753851b8f82849fd3f42Jorim Jaggi * notification is scrolling in the top or bottom stack. 89be565dfc1c17b7ddafa9753851b8f82849fd3f42Jorim Jaggi * 90be565dfc1c17b7ddafa9753851b8f82849fd3f42Jorim Jaggi * @param clipTopAmount The amount of pixels this view should be clipped from top. 91be565dfc1c17b7ddafa9753851b8f82849fd3f42Jorim Jaggi */ 92be565dfc1c17b7ddafa9753851b8f82849fd3f42Jorim Jaggi public void setClipTopAmount(int clipTopAmount) { 93be565dfc1c17b7ddafa9753851b8f82849fd3f42Jorim Jaggi mClipTopAmount = clipTopAmount; 94be565dfc1c17b7ddafa9753851b8f82849fd3f42Jorim Jaggi } 95be565dfc1c17b7ddafa9753851b8f82849fd3f42Jorim Jaggi 96be565dfc1c17b7ddafa9753851b8f82849fd3f42Jorim Jaggi public void setOnHeightChangedListener(OnHeightChangedListener listener) { 97be565dfc1c17b7ddafa9753851b8f82849fd3f42Jorim Jaggi mOnHeightChangedListener = listener; 98be565dfc1c17b7ddafa9753851b8f82849fd3f42Jorim Jaggi } 99be565dfc1c17b7ddafa9753851b8f82849fd3f42Jorim Jaggi 100be565dfc1c17b7ddafa9753851b8f82849fd3f42Jorim Jaggi /** 1014222d9a7fb87d73e1443ec1a2de9782b05741af6Jorim Jaggi * @return Whether we can expand this views content. 102be565dfc1c17b7ddafa9753851b8f82849fd3f42Jorim Jaggi */ 1034222d9a7fb87d73e1443ec1a2de9782b05741af6Jorim Jaggi public boolean isContentExpandable() { 1044222d9a7fb87d73e1443ec1a2de9782b05741af6Jorim Jaggi return false; 105be565dfc1c17b7ddafa9753851b8f82849fd3f42Jorim Jaggi } 106be565dfc1c17b7ddafa9753851b8f82849fd3f42Jorim Jaggi 107be565dfc1c17b7ddafa9753851b8f82849fd3f42Jorim Jaggi /** 108be565dfc1c17b7ddafa9753851b8f82849fd3f42Jorim Jaggi * A listener notifying when {@link #getActualHeight} changes. 109be565dfc1c17b7ddafa9753851b8f82849fd3f42Jorim Jaggi */ 110be565dfc1c17b7ddafa9753851b8f82849fd3f42Jorim Jaggi public interface OnHeightChangedListener { 111be565dfc1c17b7ddafa9753851b8f82849fd3f42Jorim Jaggi void onHeightChanged(ExpandableView view); 112be565dfc1c17b7ddafa9753851b8f82849fd3f42Jorim Jaggi } 113be565dfc1c17b7ddafa9753851b8f82849fd3f42Jorim Jaggi} 114