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