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