FileDocCategorySizeDatePackage
ExpandableView.javaAPI DocAndroid 5.1 API11345Thu Mar 12 22:22:42 GMT 2015com.android.systemui.statusbar

ExpandableView

public abstract class ExpandableView extends android.widget.FrameLayout
An abstract view for expandable views.

Fields Summary
private final int
mMaxNotificationHeight
private OnHeightChangedListener
mOnHeightChangedListener
private int
mActualHeight
protected int
mClipTopAmount
private boolean
mActualHeightInitialized
private boolean
mDark
private ArrayList
mMatchParentViews
Constructors Summary
public ExpandableView(android.content.Context context, android.util.AttributeSet attrs)


         
        super(context, attrs);
        mMaxNotificationHeight = getResources().getDimensionPixelSize(
                R.dimen.notification_max_height);
    
Methods Summary
public booleandispatchTouchEvent(android.view.MotionEvent ev)

        if (filterMotionEvent(ev)) {
            return super.dispatchTouchEvent(ev);
        }
        return false;
    
protected booleanfilterMotionEvent(android.view.MotionEvent event)

        return event.getActionMasked() != MotionEvent.ACTION_DOWN
                || event.getY() > mClipTopAmount && event.getY() < mActualHeight;
    
public intgetActualHeight()
See {@link #setActualHeight}.

return
The current actual height of this notification.

        return mActualHeight;
    
public intgetClipTopAmount()

        return mClipTopAmount;
    
public voidgetDrawingRect(android.graphics.Rect outRect)
This method returns the drawing rect for the view which is different from the regular drawing rect, since we layout all children in the {@link NotificationStackScrollLayout} at position 0 and usually the translation is neglected. Since we are manually clipping this view,we also need to subtract the clipTopAmount from the top. This is needed in order to ensure that accessibility and focusing work correctly.

param
outRect The (scrolled) drawing bounds of the view.

        super.getDrawingRect(outRect);
        outRect.left += getTranslationX();
        outRect.right += getTranslationX();
        outRect.bottom = (int) (outRect.top + getTranslationY() + getActualHeight());
        outRect.top += getTranslationY() + getClipTopAmount();
    
protected intgetInitialHeight()

        return getHeight();
    
public intgetIntrinsicHeight()

return
The desired notification height.

        return getHeight();
    
public intgetMaxHeight()

return
The maximum height of this notification.

        return getHeight();
    
public intgetMinHeight()

return
The minimum height of this notification.

        return getHeight();
    
public booleanisContentExpandable()

return
Whether we can expand this views content.

        return false;
    
public booleanisDark()

        return mDark;
    
public booleanisTransparent()

        return false;
    
public voidnotifyHeightChanged()

        if (mOnHeightChangedListener != null) {
            mOnHeightChangedListener.onHeightChanged(this);
        }
    
public voidonHeightReset()

        if (mOnHeightChangedListener != null) {
            mOnHeightChangedListener.onReset(this);
        }
    
protected voidonLayout(boolean changed, int left, int top, int right, int bottom)

        super.onLayout(changed, left, top, right, bottom);
        if (!mActualHeightInitialized && mActualHeight == 0) {
            int initialHeight = getInitialHeight();
            if (initialHeight != 0) {
                setActualHeight(initialHeight);
            }
        }
    
protected voidonMeasure(int widthMeasureSpec, int heightMeasureSpec)

        int ownMaxHeight = mMaxNotificationHeight;
        int heightMode = MeasureSpec.getMode(heightMeasureSpec);
        boolean hasFixedHeight = heightMode == MeasureSpec.EXACTLY;
        boolean isHeightLimited = heightMode == MeasureSpec.AT_MOST;
        if (hasFixedHeight || isHeightLimited) {
            int size = MeasureSpec.getSize(heightMeasureSpec);
            ownMaxHeight = Math.min(ownMaxHeight, size);
        }
        int newHeightSpec = MeasureSpec.makeMeasureSpec(ownMaxHeight, MeasureSpec.AT_MOST);
        int maxChildHeight = 0;
        int childCount = getChildCount();
        for (int i = 0; i < childCount; i++) {
            View child = getChildAt(i);
            int childHeightSpec = newHeightSpec;
            ViewGroup.LayoutParams layoutParams = child.getLayoutParams();
            if (layoutParams.height != ViewGroup.LayoutParams.MATCH_PARENT) {
                if (layoutParams.height >= 0) {
                    // An actual height is set
                    childHeightSpec = layoutParams.height > ownMaxHeight
                        ? MeasureSpec.makeMeasureSpec(ownMaxHeight, MeasureSpec.EXACTLY)
                        : MeasureSpec.makeMeasureSpec(layoutParams.height, MeasureSpec.EXACTLY);
                }
                child.measure(
                        getChildMeasureSpec(widthMeasureSpec, 0 /* padding */, layoutParams.width),
                        childHeightSpec);
                int childHeight = child.getMeasuredHeight();
                maxChildHeight = Math.max(maxChildHeight, childHeight);
            } else {
                mMatchParentViews.add(child);
            }
        }
        int ownHeight = hasFixedHeight ? ownMaxHeight : maxChildHeight;
        newHeightSpec = MeasureSpec.makeMeasureSpec(ownHeight, MeasureSpec.EXACTLY);
        for (View child : mMatchParentViews) {
            child.measure(getChildMeasureSpec(
                    widthMeasureSpec, 0 /* padding */, child.getLayoutParams().width),
                    newHeightSpec);
        }
        mMatchParentViews.clear();
        int width = MeasureSpec.getSize(widthMeasureSpec);
        setMeasuredDimension(width, ownHeight);
    
public abstract voidperformAddAnimation(long delay, long duration)

public abstract voidperformRemoveAnimation(long duration, float translationDirection, java.lang.Runnable onFinishedRunnable)
Perform a remove animation on this view.

param
duration The duration of the remove animation.
param
translationDirection The direction value from [-1 ... 1] indicating in which the animation should be performed. A value of -1 means that The remove animation should be performed upwards, such that the child appears to be going away to the top. 1 Should mean the opposite.
param
onFinishedRunnable A runnable which should be run when the animation is finished.

protected voidresetActualHeight()
Resets the height of the view on the next layout pass

        mActualHeight = 0;
        mActualHeightInitialized = false;
        requestLayout();
    
public voidsetActualHeight(int actualHeight, boolean notifyListeners)
Sets the actual height of this notification. This is different than the laid out {@link View#getHeight()}, as we want to avoid layouting during scrolling and expanding.

param
actualHeight The height of this notification.
param
notifyListeners Whether the listener should be informed about the change.

        mActualHeightInitialized = true;
        mActualHeight = actualHeight;
        if (notifyListeners) {
            notifyHeightChanged();
        }
    
public voidsetActualHeight(int actualHeight)

        setActualHeight(actualHeight, true);
    
public voidsetBelowSpeedBump(boolean below)

    
public voidsetClipTopAmount(int clipTopAmount)
Sets the amount this view should be clipped from the top. This is used when an expanded notification is scrolling in the top or bottom stack.

param
clipTopAmount The amount of pixels this view should be clipped from top.

        mClipTopAmount = clipTopAmount;
    
public voidsetDark(boolean dark, boolean fade, long delay)
Sets the notification as dark. The default implementation does nothing.

param
dark Whether the notification should be dark.
param
fade Whether an animation should be played to change the state.
param
delay If fading, the delay of the animation.

        mDark = dark;
    
public voidsetDimmed(boolean dimmed, boolean fade)
Sets the notification as dimmed. The default implementation does nothing.

param
dimmed Whether the notification should be dimmed.
param
fade Whether an animation should be played to change the state.

    
public voidsetHideSensitive(boolean hideSensitive, boolean animated, long delay, long duration)
Sets whether the notification should hide its private contents if it is sensitive.

    
public voidsetHideSensitiveForIntrinsicHeight(boolean hideSensitive)
See {@link #setHideSensitive}. This is a variant which notifies this view in advance about the upcoming state of hiding sensitive notifications. It gets called at the very beginning of a stack scroller update such that the updated intrinsic height (which is dependent on whether private or public layout is showing) gets taken into account into all layout calculations.

    
public voidsetOnHeightChangedListener(com.android.systemui.statusbar.ExpandableView$OnHeightChangedListener listener)

        mOnHeightChangedListener = listener;