1d42497e516521891a9d6ffa0daab75ef016725f5Daniel Sandler/*
2d42497e516521891a9d6ffa0daab75ef016725f5Daniel Sandler * Copyright (C) 2011 The Android Open Source Project
3d42497e516521891a9d6ffa0daab75ef016725f5Daniel Sandler *
4d42497e516521891a9d6ffa0daab75ef016725f5Daniel Sandler * Licensed under the Apache License, Version 2.0 (the "License");
5d42497e516521891a9d6ffa0daab75ef016725f5Daniel Sandler * you may not use this file except in compliance with the License.
6d42497e516521891a9d6ffa0daab75ef016725f5Daniel Sandler * You may obtain a copy of the License at
7d42497e516521891a9d6ffa0daab75ef016725f5Daniel Sandler *
8d42497e516521891a9d6ffa0daab75ef016725f5Daniel Sandler *      http://www.apache.org/licenses/LICENSE-2.0
9d42497e516521891a9d6ffa0daab75ef016725f5Daniel Sandler *
10d42497e516521891a9d6ffa0daab75ef016725f5Daniel Sandler * Unless required by applicable law or agreed to in writing, software
11d42497e516521891a9d6ffa0daab75ef016725f5Daniel Sandler * distributed under the License is distributed on an "AS IS" BASIS,
12d42497e516521891a9d6ffa0daab75ef016725f5Daniel Sandler * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13d42497e516521891a9d6ffa0daab75ef016725f5Daniel Sandler * See the License for the specific language governing permissions and
14d42497e516521891a9d6ffa0daab75ef016725f5Daniel Sandler * limitations under the License.
15d42497e516521891a9d6ffa0daab75ef016725f5Daniel Sandler */
16d42497e516521891a9d6ffa0daab75ef016725f5Daniel Sandler
17d42497e516521891a9d6ffa0daab75ef016725f5Daniel Sandlerpackage com.android.systemui.statusbar.policy;
18d42497e516521891a9d6ffa0daab75ef016725f5Daniel Sandler
19c6d29fc0f552db7cfee6491530cf89f59c242bd4Daniel Sandlerimport android.animation.LayoutTransition;
201cdf067f5fe58ad4abb623b82eede3fab2a5f533Daniel Sandlerimport android.animation.ValueAnimator;
21d42497e516521891a9d6ffa0daab75ef016725f5Daniel Sandlerimport android.content.Context;
2207d4046ea914c999b7aaa587b7bfe81d548121f7Michael Jurkaimport android.content.res.Configuration;
23d42497e516521891a9d6ffa0daab75ef016725f5Daniel Sandlerimport android.graphics.Rect;
24d42497e516521891a9d6ffa0daab75ef016725f5Daniel Sandlerimport android.util.AttributeSet;
2507d4046ea914c999b7aaa587b7bfe81d548121f7Michael Jurkaimport android.util.Log;
26ad6352be884b017254698957462fa9156f1afd07Daniel Sandlerimport android.view.MotionEvent;
27d42497e516521891a9d6ffa0daab75ef016725f5Daniel Sandlerimport android.view.View;
2807d4046ea914c999b7aaa587b7bfe81d548121f7Michael Jurkaimport android.view.ViewConfiguration;
29d42497e516521891a9d6ffa0daab75ef016725f5Daniel Sandlerimport android.view.ViewGroup;
30c6d29fc0f552db7cfee6491530cf89f59c242bd4Daniel Sandlerimport android.widget.LinearLayout;
31d42497e516521891a9d6ffa0daab75ef016725f5Daniel Sandler
326a858c347f4d4e5db4c8f00d5e285967631b71caDaniel Sandlerimport com.android.systemui.ExpandHelper;
33d42497e516521891a9d6ffa0daab75ef016725f5Daniel Sandlerimport com.android.systemui.R;
3407d4046ea914c999b7aaa587b7bfe81d548121f7Michael Jurkaimport com.android.systemui.SwipeHelper;
3551c7510e493680b4aca1ed7695b35c52d2cd63ffChris Wrenimport com.android.systemui.statusbar.ExpandableNotificationRow;
368fd12657e353a4a6f6d875a0d86850426fec00e8Chris Wrenimport com.android.systemui.statusbar.NotificationData;
3707d4046ea914c999b7aaa587b7bfe81d548121f7Michael Jurka
381cdf067f5fe58ad4abb623b82eede3fab2a5f533Daniel Sandlerimport java.util.HashMap;
39d42497e516521891a9d6ffa0daab75ef016725f5Daniel Sandler
40209bede6b9edb9171e5bee4077b48e35004a37b4John Spurlockpublic class NotificationRowLayout
41209bede6b9edb9171e5bee4077b48e35004a37b4John Spurlock        extends LinearLayout
423d32a24adf02cecca86ec16ac8827ce195daeaecDaniel Sandler        implements SwipeHelper.Callback, ExpandHelper.Callback
436a858c347f4d4e5db4c8f00d5e285967631b71caDaniel Sandler{
44d42497e516521891a9d6ffa0daab75ef016725f5Daniel Sandler    private static final String TAG = "NotificationRowLayout";
45d42497e516521891a9d6ffa0daab75ef016725f5Daniel Sandler    private static final boolean DEBUG = false;
461cdf067f5fe58ad4abb623b82eede3fab2a5f533Daniel Sandler    private static final boolean SLOW_ANIMATIONS = DEBUG;
47d42497e516521891a9d6ffa0daab75ef016725f5Daniel Sandler
48ad6352be884b017254698957462fa9156f1afd07Daniel Sandler    private static final int APPEAR_ANIM_LEN = SLOW_ANIMATIONS ? 5000 : 250;
49ad6352be884b017254698957462fa9156f1afd07Daniel Sandler    private static final int DISAPPEAR_ANIM_LEN = APPEAR_ANIM_LEN;
50d42497e516521891a9d6ffa0daab75ef016725f5Daniel Sandler
518ba33c965f940070060585e45e1c833519bb45c9Daniel Sandler    boolean mAnimateBounds = true;
528ba33c965f940070060585e45e1c833519bb45c9Daniel Sandler
53d42497e516521891a9d6ffa0daab75ef016725f5Daniel Sandler    Rect mTmpRect = new Rect();
54d42497e516521891a9d6ffa0daab75ef016725f5Daniel Sandler
551cdf067f5fe58ad4abb623b82eede3fab2a5f533Daniel Sandler    HashMap<View, ValueAnimator> mAppearingViews = new HashMap<View, ValueAnimator>();
561cdf067f5fe58ad4abb623b82eede3fab2a5f533Daniel Sandler    HashMap<View, ValueAnimator> mDisappearingViews = new HashMap<View, ValueAnimator>();
57d42497e516521891a9d6ffa0daab75ef016725f5Daniel Sandler
5807d4046ea914c999b7aaa587b7bfe81d548121f7Michael Jurka    private SwipeHelper mSwipeHelper;
59209bede6b9edb9171e5bee4077b48e35004a37b4John Spurlock
603d32a24adf02cecca86ec16ac8827ce195daeaecDaniel Sandler    private OnSizeChangedListener mOnSizeChangedListener;
61ad6352be884b017254698957462fa9156f1afd07Daniel Sandler
622f2022afa1eb85018368398bd150e9575fc099c9Chet Haase    // Flag set during notification removal animation to avoid causing too much work until
632f2022afa1eb85018368398bd150e9575fc099c9Chet Haase    // animation is done
642f2022afa1eb85018368398bd150e9575fc099c9Chet Haase    boolean mRemoveViews = true;
652f2022afa1eb85018368398bd150e9575fc099c9Chet Haase
66e5011a3ad4186a39f07bd155784a0b3eba404274Daniel Sandler    private LayoutTransition mRealLayoutTransition;
67e5011a3ad4186a39f07bd155784a0b3eba404274Daniel Sandler
68d42497e516521891a9d6ffa0daab75ef016725f5Daniel Sandler    public NotificationRowLayout(Context context, AttributeSet attrs) {
69d42497e516521891a9d6ffa0daab75ef016725f5Daniel Sandler        this(context, attrs, 0);
70d42497e516521891a9d6ffa0daab75ef016725f5Daniel Sandler    }
71d42497e516521891a9d6ffa0daab75ef016725f5Daniel Sandler
72d42497e516521891a9d6ffa0daab75ef016725f5Daniel Sandler    public NotificationRowLayout(Context context, AttributeSet attrs, int defStyle) {
73d42497e516521891a9d6ffa0daab75ef016725f5Daniel Sandler        super(context, attrs, defStyle);
74d42497e516521891a9d6ffa0daab75ef016725f5Daniel Sandler
75e5011a3ad4186a39f07bd155784a0b3eba404274Daniel Sandler        mRealLayoutTransition = new LayoutTransition();
765050813f15a1d39d49cb8eca5a3aa6df43c4d450Daniel Sandler        mRealLayoutTransition.setAnimateParentHierarchy(true);
77e5011a3ad4186a39f07bd155784a0b3eba404274Daniel Sandler        setLayoutTransitionsEnabled(true);
78209bede6b9edb9171e5bee4077b48e35004a37b4John Spurlock
79c6d29fc0f552db7cfee6491530cf89f59c242bd4Daniel Sandler        setOrientation(LinearLayout.VERTICAL);
80d42497e516521891a9d6ffa0daab75ef016725f5Daniel Sandler
81d42497e516521891a9d6ffa0daab75ef016725f5Daniel Sandler        if (DEBUG) {
82d42497e516521891a9d6ffa0daab75ef016725f5Daniel Sandler            setOnHierarchyChangeListener(new ViewGroup.OnHierarchyChangeListener() {
83d42497e516521891a9d6ffa0daab75ef016725f5Daniel Sandler                @Override
84d42497e516521891a9d6ffa0daab75ef016725f5Daniel Sandler                public void onChildViewAdded(View parent, View child) {
85cd686b5b6d4166b510df8e32138479a9559bc117John Spurlock                    Log.d(TAG, "view added: " + child + "; new count: " + getChildCount());
86d42497e516521891a9d6ffa0daab75ef016725f5Daniel Sandler                }
87d42497e516521891a9d6ffa0daab75ef016725f5Daniel Sandler                @Override
88d42497e516521891a9d6ffa0daab75ef016725f5Daniel Sandler                public void onChildViewRemoved(View parent, View child) {
89cd686b5b6d4166b510df8e32138479a9559bc117John Spurlock                    Log.d(TAG, "view removed: " + child + "; new count: " + (getChildCount() - 1));
90d42497e516521891a9d6ffa0daab75ef016725f5Daniel Sandler                }
91d42497e516521891a9d6ffa0daab75ef016725f5Daniel Sandler            });
92d42497e516521891a9d6ffa0daab75ef016725f5Daniel Sandler
93d42497e516521891a9d6ffa0daab75ef016725f5Daniel Sandler            setBackgroundColor(0x80FF8000);
94d42497e516521891a9d6ffa0daab75ef016725f5Daniel Sandler        }
95d42497e516521891a9d6ffa0daab75ef016725f5Daniel Sandler
9607d4046ea914c999b7aaa587b7bfe81d548121f7Michael Jurka        float densityScale = getResources().getDisplayMetrics().density;
9707d4046ea914c999b7aaa587b7bfe81d548121f7Michael Jurka        float pagingTouchSlop = ViewConfiguration.get(mContext).getScaledPagingTouchSlop();
9807d4046ea914c999b7aaa587b7bfe81d548121f7Michael Jurka        mSwipeHelper = new SwipeHelper(SwipeHelper.X, this, densityScale, pagingTouchSlop);
99d42497e516521891a9d6ffa0daab75ef016725f5Daniel Sandler    }
100d42497e516521891a9d6ffa0daab75ef016725f5Daniel Sandler
101f7a1956b06faeb6025fdea331f81d66edda58b3cDaniel Sandler    public void setLongPressListener(View.OnLongClickListener listener) {
102f7a1956b06faeb6025fdea331f81d66edda58b3cDaniel Sandler        mSwipeHelper.setLongPressListener(listener);
103f7a1956b06faeb6025fdea331f81d66edda58b3cDaniel Sandler    }
104f7a1956b06faeb6025fdea331f81d66edda58b3cDaniel Sandler
1053d32a24adf02cecca86ec16ac8827ce195daeaecDaniel Sandler    public void setOnSizeChangedListener(OnSizeChangedListener l) {
1063d32a24adf02cecca86ec16ac8827ce195daeaecDaniel Sandler        mOnSizeChangedListener = l;
1073d32a24adf02cecca86ec16ac8827ce195daeaecDaniel Sandler    }
1083d32a24adf02cecca86ec16ac8827ce195daeaecDaniel Sandler
109469e96e206f8df44b32ce393f8d19f0cae730030Daniel Sandler    @Override
110469e96e206f8df44b32ce393f8d19f0cae730030Daniel Sandler    public void onWindowFocusChanged(boolean hasWindowFocus) {
111469e96e206f8df44b32ce393f8d19f0cae730030Daniel Sandler        super.onWindowFocusChanged(hasWindowFocus);
112469e96e206f8df44b32ce393f8d19f0cae730030Daniel Sandler        if (!hasWindowFocus) {
113469e96e206f8df44b32ce393f8d19f0cae730030Daniel Sandler            mSwipeHelper.removeLongPressCallback();
114469e96e206f8df44b32ce393f8d19f0cae730030Daniel Sandler        }
115469e96e206f8df44b32ce393f8d19f0cae730030Daniel Sandler    }
116469e96e206f8df44b32ce393f8d19f0cae730030Daniel Sandler
1178ba33c965f940070060585e45e1c833519bb45c9Daniel Sandler    public void setAnimateBounds(boolean anim) {
1188ba33c965f940070060585e45e1c833519bb45c9Daniel Sandler        mAnimateBounds = anim;
1198ba33c965f940070060585e45e1c833519bb45c9Daniel Sandler    }
1208ba33c965f940070060585e45e1c833519bb45c9Daniel Sandler
1216a858c347f4d4e5db4c8f00d5e285967631b71caDaniel Sandler    private void logLayoutTransition() {
1226a858c347f4d4e5db4c8f00d5e285967631b71caDaniel Sandler        Log.v(TAG, "layout " +
123e5011a3ad4186a39f07bd155784a0b3eba404274Daniel Sandler              (mRealLayoutTransition.isChangingLayout() ? "is " : "is not ") +
1246a858c347f4d4e5db4c8f00d5e285967631b71caDaniel Sandler              "in transition and animations " +
125e5011a3ad4186a39f07bd155784a0b3eba404274Daniel Sandler              (mRealLayoutTransition.isRunning() ? "are " : "are not ") +
1266a858c347f4d4e5db4c8f00d5e285967631b71caDaniel Sandler              "running.");
1276a858c347f4d4e5db4c8f00d5e285967631b71caDaniel Sandler    }
1286a858c347f4d4e5db4c8f00d5e285967631b71caDaniel Sandler
129ad6352be884b017254698957462fa9156f1afd07Daniel Sandler    @Override
130ad6352be884b017254698957462fa9156f1afd07Daniel Sandler    public boolean onInterceptTouchEvent(MotionEvent ev) {
13107d4046ea914c999b7aaa587b7bfe81d548121f7Michael Jurka        if (DEBUG) Log.v(TAG, "onInterceptTouchEvent()");
1326a858c347f4d4e5db4c8f00d5e285967631b71caDaniel Sandler        if (DEBUG) logLayoutTransition();
1336a858c347f4d4e5db4c8f00d5e285967631b71caDaniel Sandler
1345de6e94e36e2adbdd4ebfb5c1903c23c9ea3c388Chris Wren        return mSwipeHelper.onInterceptTouchEvent(ev) ||
1355de6e94e36e2adbdd4ebfb5c1903c23c9ea3c388Chris Wren                super.onInterceptTouchEvent(ev);
13607d4046ea914c999b7aaa587b7bfe81d548121f7Michael Jurka    }
13707d4046ea914c999b7aaa587b7bfe81d548121f7Michael Jurka
13807d4046ea914c999b7aaa587b7bfe81d548121f7Michael Jurka    @Override
13907d4046ea914c999b7aaa587b7bfe81d548121f7Michael Jurka    public boolean onTouchEvent(MotionEvent ev) {
1406a858c347f4d4e5db4c8f00d5e285967631b71caDaniel Sandler        if (DEBUG) Log.v(TAG, "onTouchEvent()");
1416a858c347f4d4e5db4c8f00d5e285967631b71caDaniel Sandler        if (DEBUG) logLayoutTransition();
1425de6e94e36e2adbdd4ebfb5c1903c23c9ea3c388Chris Wren
1435de6e94e36e2adbdd4ebfb5c1903c23c9ea3c388Chris Wren        return mSwipeHelper.onTouchEvent(ev) ||
1445de6e94e36e2adbdd4ebfb5c1903c23c9ea3c388Chris Wren                super.onTouchEvent(ev);
145ad6352be884b017254698957462fa9156f1afd07Daniel Sandler    }
146ebce0115e239919680fc5574ae4ca79e617fcce8Daniel Sandler
14707d4046ea914c999b7aaa587b7bfe81d548121f7Michael Jurka    public boolean canChildBeDismissed(View v) {
148ebce0115e239919680fc5574ae4ca79e617fcce8Daniel Sandler        final View veto = v.findViewById(R.id.veto);
149ebce0115e239919680fc5574ae4ca79e617fcce8Daniel Sandler        return (veto != null && veto.getVisibility() != View.GONE);
150ebce0115e239919680fc5574ae4ca79e617fcce8Daniel Sandler    }
151ebce0115e239919680fc5574ae4ca79e617fcce8Daniel Sandler
15280a76276dc9440ffad30dc4c820eb7d65f4df368Chris Wren    public boolean canChildBeExpanded(View v) {
15351c7510e493680b4aca1ed7695b35c52d2cd63ffChris Wren        return v instanceof ExpandableNotificationRow
15451c7510e493680b4aca1ed7695b35c52d2cd63ffChris Wren                && ((ExpandableNotificationRow) v).isExpandable();
1558fd12657e353a4a6f6d875a0d86850426fec00e8Chris Wren    }
1568fd12657e353a4a6f6d875a0d86850426fec00e8Chris Wren
15751c7510e493680b4aca1ed7695b35c52d2cd63ffChris Wren    public void setUserExpandedChild(View v, boolean userExpanded) {
15851c7510e493680b4aca1ed7695b35c52d2cd63ffChris Wren        if (v instanceof ExpandableNotificationRow) {
15951c7510e493680b4aca1ed7695b35c52d2cd63ffChris Wren            ((ExpandableNotificationRow) v).setUserExpanded(userExpanded);
16051c7510e493680b4aca1ed7695b35c52d2cd63ffChris Wren        }
16180a76276dc9440ffad30dc4c820eb7d65f4df368Chris Wren    }
16280a76276dc9440ffad30dc4c820eb7d65f4df368Chris Wren
16351c7510e493680b4aca1ed7695b35c52d2cd63ffChris Wren    public void setUserLockedChild(View v, boolean userLocked) {
16451c7510e493680b4aca1ed7695b35c52d2cd63ffChris Wren        if (v instanceof ExpandableNotificationRow) {
16551c7510e493680b4aca1ed7695b35c52d2cd63ffChris Wren            ((ExpandableNotificationRow) v).setUserLocked(userLocked);
16651c7510e493680b4aca1ed7695b35c52d2cd63ffChris Wren        }
1673ddab0dcc1039137f05a28ff86477601a223a0faChris Wren    }
1683ddab0dcc1039137f05a28ff86477601a223a0faChris Wren
16907d4046ea914c999b7aaa587b7bfe81d548121f7Michael Jurka    public void onChildDismissed(View v) {
170cd686b5b6d4166b510df8e32138479a9559bc117John Spurlock        if (DEBUG) Log.v(TAG, "onChildDismissed: " + v + " mRemoveViews=" + mRemoveViews);
171ebce0115e239919680fc5574ae4ca79e617fcce8Daniel Sandler        final View veto = v.findViewById(R.id.veto);
1722f2022afa1eb85018368398bd150e9575fc099c9Chet Haase        if (veto != null && veto.getVisibility() != View.GONE && mRemoveViews) {
173ebce0115e239919680fc5574ae4ca79e617fcce8Daniel Sandler            veto.performClick();
174ebce0115e239919680fc5574ae4ca79e617fcce8Daniel Sandler        }
175ebce0115e239919680fc5574ae4ca79e617fcce8Daniel Sandler    }
176ebce0115e239919680fc5574ae4ca79e617fcce8Daniel Sandler
17707d4046ea914c999b7aaa587b7bfe81d548121f7Michael Jurka    public void onBeginDrag(View v) {
17807d4046ea914c999b7aaa587b7bfe81d548121f7Michael Jurka        // We need to prevent the surrounding ScrollView from intercepting us now;
17907d4046ea914c999b7aaa587b7bfe81d548121f7Michael Jurka        // the scroll position will be locked while we swipe
18007d4046ea914c999b7aaa587b7bfe81d548121f7Michael Jurka        requestDisallowInterceptTouchEvent(true);
18107d4046ea914c999b7aaa587b7bfe81d548121f7Michael Jurka    }
18207d4046ea914c999b7aaa587b7bfe81d548121f7Michael Jurka
183622a97646d316ca753c577752ac9010415e9a472Peter Ng    public void onDragCancelled(View v) {
184622a97646d316ca753c577752ac9010415e9a472Peter Ng    }
185622a97646d316ca753c577752ac9010415e9a472Peter Ng
18607d4046ea914c999b7aaa587b7bfe81d548121f7Michael Jurka    public View getChildAtPosition(MotionEvent ev) {
1876a858c347f4d4e5db4c8f00d5e285967631b71caDaniel Sandler        return getChildAtPosition(ev.getX(), ev.getY());
1886a858c347f4d4e5db4c8f00d5e285967631b71caDaniel Sandler    }
1895de6e94e36e2adbdd4ebfb5c1903c23c9ea3c388Chris Wren
1905de6e94e36e2adbdd4ebfb5c1903c23c9ea3c388Chris Wren    public View getChildAtRawPosition(float touchX, float touchY) {
1915de6e94e36e2adbdd4ebfb5c1903c23c9ea3c388Chris Wren        int[] location = new int[2];
1925de6e94e36e2adbdd4ebfb5c1903c23c9ea3c388Chris Wren        getLocationOnScreen(location);
1935de6e94e36e2adbdd4ebfb5c1903c23c9ea3c388Chris Wren        return getChildAtPosition((float) (touchX - location[0]), (float) (touchY - location[1]));
1945de6e94e36e2adbdd4ebfb5c1903c23c9ea3c388Chris Wren    }
1955de6e94e36e2adbdd4ebfb5c1903c23c9ea3c388Chris Wren
1966a858c347f4d4e5db4c8f00d5e285967631b71caDaniel Sandler    public View getChildAtPosition(float touchX, float touchY) {
19707d4046ea914c999b7aaa587b7bfe81d548121f7Michael Jurka        // find the view under the pointer, accounting for GONE views
19807d4046ea914c999b7aaa587b7bfe81d548121f7Michael Jurka        final int count = getChildCount();
19907d4046ea914c999b7aaa587b7bfe81d548121f7Michael Jurka        int y = 0;
20007d4046ea914c999b7aaa587b7bfe81d548121f7Michael Jurka        int childIdx = 0;
20107d4046ea914c999b7aaa587b7bfe81d548121f7Michael Jurka        View slidingChild;
20207d4046ea914c999b7aaa587b7bfe81d548121f7Michael Jurka        for (; childIdx < count; childIdx++) {
20307d4046ea914c999b7aaa587b7bfe81d548121f7Michael Jurka            slidingChild = getChildAt(childIdx);
20407d4046ea914c999b7aaa587b7bfe81d548121f7Michael Jurka            if (slidingChild.getVisibility() == GONE) {
20507d4046ea914c999b7aaa587b7bfe81d548121f7Michael Jurka                continue;
206ad6352be884b017254698957462fa9156f1afd07Daniel Sandler            }
207c6d29fc0f552db7cfee6491530cf89f59c242bd4Daniel Sandler            y += slidingChild.getMeasuredHeight();
20807d4046ea914c999b7aaa587b7bfe81d548121f7Michael Jurka            if (touchY < y) return slidingChild;
209ad6352be884b017254698957462fa9156f1afd07Daniel Sandler        }
21007d4046ea914c999b7aaa587b7bfe81d548121f7Michael Jurka        return null;
21107d4046ea914c999b7aaa587b7bfe81d548121f7Michael Jurka    }
21207d4046ea914c999b7aaa587b7bfe81d548121f7Michael Jurka
21307d4046ea914c999b7aaa587b7bfe81d548121f7Michael Jurka    public View getChildContentView(View v) {
21407d4046ea914c999b7aaa587b7bfe81d548121f7Michael Jurka        return v;
21507d4046ea914c999b7aaa587b7bfe81d548121f7Michael Jurka    }
21607d4046ea914c999b7aaa587b7bfe81d548121f7Michael Jurka
21707d4046ea914c999b7aaa587b7bfe81d548121f7Michael Jurka    @Override
21807d4046ea914c999b7aaa587b7bfe81d548121f7Michael Jurka    protected void onConfigurationChanged(Configuration newConfig) {
21907d4046ea914c999b7aaa587b7bfe81d548121f7Michael Jurka        super.onConfigurationChanged(newConfig);
22007d4046ea914c999b7aaa587b7bfe81d548121f7Michael Jurka        float densityScale = getResources().getDisplayMetrics().density;
22107d4046ea914c999b7aaa587b7bfe81d548121f7Michael Jurka        mSwipeHelper.setDensityScale(densityScale);
22207d4046ea914c999b7aaa587b7bfe81d548121f7Michael Jurka        float pagingTouchSlop = ViewConfiguration.get(mContext).getScaledPagingTouchSlop();
22307d4046ea914c999b7aaa587b7bfe81d548121f7Michael Jurka        mSwipeHelper.setPagingTouchSlop(pagingTouchSlop);
224ad6352be884b017254698957462fa9156f1afd07Daniel Sandler    }
225ad6352be884b017254698957462fa9156f1afd07Daniel Sandler
226d42497e516521891a9d6ffa0daab75ef016725f5Daniel Sandler
2272f2022afa1eb85018368398bd150e9575fc099c9Chet Haase    /**
2282f2022afa1eb85018368398bd150e9575fc099c9Chet Haase     * Sets a flag to tell us whether to actually remove views. Removal is delayed by setting this
2292f2022afa1eb85018368398bd150e9575fc099c9Chet Haase     * to false during some animations to smooth out performance. Callers should restore the
2302f2022afa1eb85018368398bd150e9575fc099c9Chet Haase     * flag to true after the animation is done, and then they should make sure that the views
2312f2022afa1eb85018368398bd150e9575fc099c9Chet Haase     * get removed properly.
2322f2022afa1eb85018368398bd150e9575fc099c9Chet Haase     */
2332f2022afa1eb85018368398bd150e9575fc099c9Chet Haase    public void setViewRemoval(boolean removeViews) {
234cd686b5b6d4166b510df8e32138479a9559bc117John Spurlock        if (DEBUG) Log.v(TAG, "setViewRemoval: " + removeViews);
2352f2022afa1eb85018368398bd150e9575fc099c9Chet Haase        mRemoveViews = removeViews;
2362f2022afa1eb85018368398bd150e9575fc099c9Chet Haase    }
2372f2022afa1eb85018368398bd150e9575fc099c9Chet Haase
238e5011a3ad4186a39f07bd155784a0b3eba404274Daniel Sandler    // Suppress layout transitions for a little while.
239e5011a3ad4186a39f07bd155784a0b3eba404274Daniel Sandler    public void setLayoutTransitionsEnabled(boolean b) {
240e5011a3ad4186a39f07bd155784a0b3eba404274Daniel Sandler        if (b) {
241e5011a3ad4186a39f07bd155784a0b3eba404274Daniel Sandler            setLayoutTransition(mRealLayoutTransition);
242e5011a3ad4186a39f07bd155784a0b3eba404274Daniel Sandler        } else {
243e5011a3ad4186a39f07bd155784a0b3eba404274Daniel Sandler            if (mRealLayoutTransition.isRunning()) {
244e5011a3ad4186a39f07bd155784a0b3eba404274Daniel Sandler                mRealLayoutTransition.cancel();
245e5011a3ad4186a39f07bd155784a0b3eba404274Daniel Sandler            }
246e5011a3ad4186a39f07bd155784a0b3eba404274Daniel Sandler            setLayoutTransition(null);
247e5011a3ad4186a39f07bd155784a0b3eba404274Daniel Sandler        }
248e5011a3ad4186a39f07bd155784a0b3eba404274Daniel Sandler    }
249e5011a3ad4186a39f07bd155784a0b3eba404274Daniel Sandler
2508ba33c965f940070060585e45e1c833519bb45c9Daniel Sandler    public void dismissRowAnimated(View child) {
2518ba33c965f940070060585e45e1c833519bb45c9Daniel Sandler        dismissRowAnimated(child, 0);
2528ba33c965f940070060585e45e1c833519bb45c9Daniel Sandler    }
2538ba33c965f940070060585e45e1c833519bb45c9Daniel Sandler
2548ba33c965f940070060585e45e1c833519bb45c9Daniel Sandler    public void dismissRowAnimated(View child, int vel) {
2558ba33c965f940070060585e45e1c833519bb45c9Daniel Sandler        mSwipeHelper.dismissChild(child, vel);
2568ba33c965f940070060585e45e1c833519bb45c9Daniel Sandler    }
2578ba33c965f940070060585e45e1c833519bb45c9Daniel Sandler
258d42497e516521891a9d6ffa0daab75ef016725f5Daniel Sandler    @Override
259d42497e516521891a9d6ffa0daab75ef016725f5Daniel Sandler    public void onFinishInflate() {
260d42497e516521891a9d6ffa0daab75ef016725f5Daniel Sandler        super.onFinishInflate();
261c6d29fc0f552db7cfee6491530cf89f59c242bd4Daniel Sandler        if (DEBUG) setWillNotDraw(false);
262d42497e516521891a9d6ffa0daab75ef016725f5Daniel Sandler    }
263d42497e516521891a9d6ffa0daab75ef016725f5Daniel Sandler
264d42497e516521891a9d6ffa0daab75ef016725f5Daniel Sandler    @Override
265d42497e516521891a9d6ffa0daab75ef016725f5Daniel Sandler    public void onDraw(android.graphics.Canvas c) {
266d42497e516521891a9d6ffa0daab75ef016725f5Daniel Sandler        super.onDraw(c);
2676a858c347f4d4e5db4c8f00d5e285967631b71caDaniel Sandler        if (DEBUG) logLayoutTransition();
268d42497e516521891a9d6ffa0daab75ef016725f5Daniel Sandler        if (DEBUG) {
269cd686b5b6d4166b510df8e32138479a9559bc117John Spurlock            //Log.d(TAG, "onDraw: canvas height: " + c.getHeight() + "px; measured height: "
270ad6352be884b017254698957462fa9156f1afd07Daniel Sandler            //        + getMeasuredHeight() + "px");
271d42497e516521891a9d6ffa0daab75ef016725f5Daniel Sandler            c.save();
272d42497e516521891a9d6ffa0daab75ef016725f5Daniel Sandler            c.clipRect(6, 6, c.getWidth() - 6, getMeasuredHeight() - 6,
273d42497e516521891a9d6ffa0daab75ef016725f5Daniel Sandler                    android.graphics.Region.Op.DIFFERENCE);
274d42497e516521891a9d6ffa0daab75ef016725f5Daniel Sandler            c.drawColor(0xFFFF8000);
275d42497e516521891a9d6ffa0daab75ef016725f5Daniel Sandler            c.restore();
276d42497e516521891a9d6ffa0daab75ef016725f5Daniel Sandler        }
277d42497e516521891a9d6ffa0daab75ef016725f5Daniel Sandler    }
2783d32a24adf02cecca86ec16ac8827ce195daeaecDaniel Sandler
2793d32a24adf02cecca86ec16ac8827ce195daeaecDaniel Sandler    @Override
2803d32a24adf02cecca86ec16ac8827ce195daeaecDaniel Sandler    protected void onSizeChanged(int w, int h, int oldw, int oldh) {
2813d32a24adf02cecca86ec16ac8827ce195daeaecDaniel Sandler        if (mOnSizeChangedListener != null) {
2823d32a24adf02cecca86ec16ac8827ce195daeaecDaniel Sandler            mOnSizeChangedListener.onSizeChanged(this, w, h, oldw, oldh);
2833d32a24adf02cecca86ec16ac8827ce195daeaecDaniel Sandler        }
2843d32a24adf02cecca86ec16ac8827ce195daeaecDaniel Sandler    }
285d42497e516521891a9d6ffa0daab75ef016725f5Daniel Sandler}
286