Merge "Fix black bar drawn sometimes when swiping away items in Recents" into klp-dev

This commit is contained in:
Michael Jurka
2013-09-17 20:46:38 +00:00
committed by Android (Google) Code Review
4 changed files with 105 additions and 102 deletions

View File

@@ -30,7 +30,7 @@ import android.widget.LinearLayout;
import com.android.systemui.R;
public class RecentsScrollViewPerformanceHelper {
public class FadedEdgeDrawHelper {
public static final boolean OPTIMIZE_SW_RENDERED_RECENTS = true;
public static final boolean USE_DARK_FADE_IN_HW_ACCELERATED_MODE = true;
private View mScrollView;
@@ -43,18 +43,18 @@ public class RecentsScrollViewPerformanceHelper {
private Matrix mFadeMatrix;
private LinearGradient mFade;
public static RecentsScrollViewPerformanceHelper create(Context context,
public static FadedEdgeDrawHelper create(Context context,
AttributeSet attrs, View scrollView, boolean isVertical) {
boolean isTablet = context.getResources().
getBoolean(R.bool.config_recents_interface_for_tablets);
if (!isTablet && (OPTIMIZE_SW_RENDERED_RECENTS || USE_DARK_FADE_IN_HW_ACCELERATED_MODE)) {
return new RecentsScrollViewPerformanceHelper(context, attrs, scrollView, isVertical);
return new FadedEdgeDrawHelper(context, attrs, scrollView, isVertical);
} else {
return null;
}
}
public RecentsScrollViewPerformanceHelper(Context context,
public FadedEdgeDrawHelper(Context context,
AttributeSet attrs, View scrollView, boolean isVertical) {
mScrollView = scrollView;
TypedArray a = context.obtainStyledAttributes(attrs, com.android.internal.R.styleable.View);
@@ -64,7 +64,7 @@ public class RecentsScrollViewPerformanceHelper {
}
public void onAttachedToWindowCallback(
RecentsCallback callback, LinearLayout layout, boolean hardwareAccelerated) {
LinearLayout layout, boolean hardwareAccelerated) {
mSoftwareRendered = !hardwareAccelerated;
if ((mSoftwareRendered && OPTIMIZE_SW_RENDERED_RECENTS)
|| USE_DARK_FADE_IN_HW_ACCELERATED_MODE) {
@@ -178,11 +178,11 @@ public class RecentsScrollViewPerformanceHelper {
}
}
public int getVerticalFadingEdgeLengthCallback() {
public int getVerticalFadingEdgeLength() {
return mFadingEdgeLength;
}
public int getHorizontalFadingEdgeLengthCallback() {
public int getHorizontalFadingEdgeLength() {
return mFadingEdgeLength;
}

View File

@@ -49,16 +49,17 @@ public class RecentsHorizontalScrollView extends HorizontalScrollView
private RecentsCallback mCallback;
protected int mLastScrollPosition;
private SwipeHelper mSwipeHelper;
private RecentsScrollViewPerformanceHelper mPerformanceHelper;
private FadedEdgeDrawHelper mFadedEdgeDrawHelper;
private HashSet<View> mRecycledViews;
private int mNumItemsInOneScreenful;
private Runnable mOnScrollListener;
public RecentsHorizontalScrollView(Context context, AttributeSet attrs) {
super(context, attrs, 0);
float densityScale = getResources().getDisplayMetrics().density;
float pagingTouchSlop = ViewConfiguration.get(mContext).getScaledPagingTouchSlop();
mSwipeHelper = new SwipeHelper(SwipeHelper.Y, this, densityScale, pagingTouchSlop);
mPerformanceHelper = RecentsScrollViewPerformanceHelper.create(context, attrs, this, false);
mFadedEdgeDrawHelper = FadedEdgeDrawHelper.create(context, attrs, this, false);
mRecycledViews = new HashSet<View>();
}
@@ -108,8 +109,8 @@ public class RecentsHorizontalScrollView extends HorizontalScrollView
final View view = mAdapter.getView(i, old, mLinearLayout);
if (mPerformanceHelper != null) {
mPerformanceHelper.addViewCallback(view);
if (mFadedEdgeDrawHelper != null) {
mFadedEdgeDrawHelper.addViewCallback(view);
}
OnTouchListener noOpListener = new OnTouchListener() {
@@ -234,36 +235,32 @@ public class RecentsHorizontalScrollView extends HorizontalScrollView
}
@Override
public void draw(Canvas canvas) {
super.draw(canvas);
public void drawFadedEdges(Canvas canvas, int left, int right, int top, int bottom) {
if (mFadedEdgeDrawHelper != null) {
if (mPerformanceHelper != null) {
int paddingLeft = mPaddingLeft;
final boolean offsetRequired = isPaddingOffsetRequired();
if (offsetRequired) {
paddingLeft += getLeftPaddingOffset();
}
int left = mScrollX + paddingLeft;
int right = left + mRight - mLeft - mPaddingRight - paddingLeft;
int top = mScrollY + getFadeTop(offsetRequired);
int bottom = top + getFadeHeight(offsetRequired);
if (offsetRequired) {
right += getRightPaddingOffset();
bottom += getBottomPaddingOffset();
}
mPerformanceHelper.drawCallback(canvas,
mFadedEdgeDrawHelper.drawCallback(canvas,
left, right, top, bottom, mScrollX, mScrollY,
0, 0,
getLeftFadingEdgeStrength(), getRightFadingEdgeStrength(), mPaddingTop);
}
}
@Override
protected void onScrollChanged(int l, int t, int oldl, int oldt) {
super.onScrollChanged(l, t, oldl, oldt);
if (mOnScrollListener != null) {
mOnScrollListener.run();
}
}
public void setOnScrollListener(Runnable listener) {
mOnScrollListener = listener;
}
@Override
public int getVerticalFadingEdgeLength() {
if (mPerformanceHelper != null) {
return mPerformanceHelper.getVerticalFadingEdgeLengthCallback();
if (mFadedEdgeDrawHelper != null) {
return mFadedEdgeDrawHelper.getVerticalFadingEdgeLength();
} else {
return super.getVerticalFadingEdgeLength();
}
@@ -271,8 +268,8 @@ public class RecentsHorizontalScrollView extends HorizontalScrollView
@Override
public int getHorizontalFadingEdgeLength() {
if (mPerformanceHelper != null) {
return mPerformanceHelper.getHorizontalFadingEdgeLengthCallback();
if (mFadedEdgeDrawHelper != null) {
return mFadedEdgeDrawHelper.getHorizontalFadingEdgeLength();
} else {
return super.getHorizontalFadingEdgeLength();
}
@@ -290,9 +287,8 @@ public class RecentsHorizontalScrollView extends HorizontalScrollView
@Override
public void onAttachedToWindow() {
if (mPerformanceHelper != null) {
mPerformanceHelper.onAttachedToWindowCallback(
mCallback, mLinearLayout, isHardwareAccelerated());
if (mFadedEdgeDrawHelper != null) {
mFadedEdgeDrawHelper.onAttachedToWindowCallback(mLinearLayout, isHardwareAccelerated());
}
}

View File

@@ -30,6 +30,7 @@ import android.content.res.Configuration;
import android.content.res.Resources;
import android.content.res.TypedArray;
import android.graphics.Bitmap;
import android.graphics.Canvas;
import android.graphics.Matrix;
import android.graphics.Shader.TileMode;
import android.graphics.drawable.BitmapDrawable;
@@ -74,7 +75,7 @@ public class RecentsPanelView extends FrameLayout implements OnItemClickListener
private PopupMenu mPopup;
private View mRecentsScrim;
private View mRecentsNoApps;
private ViewGroup mRecentsContainer;
private RecentsScrollView mRecentsContainer;
private boolean mShowing;
private boolean mWaitingToShow;
@@ -98,6 +99,8 @@ public class RecentsPanelView extends FrameLayout implements OnItemClickListener
public void setCallback(RecentsCallback callback);
public void setMinSwipeAlpha(float minAlpha);
public View findViewForTask(int persistentTaskId);
public void drawFadedEdges(Canvas c, int left, int right, int top, int bottom);
public void setOnScrollListener(Runnable listener);
}
private final class OnLongClickDelegate implements View.OnLongClickListener {
@@ -270,13 +273,7 @@ public class RecentsPanelView extends FrameLayout implements OnItemClickListener
}
public int numItemsInOneScreenful() {
if (mRecentsContainer instanceof RecentsScrollView){
RecentsScrollView scrollView
= (RecentsScrollView) mRecentsContainer;
return scrollView.numItemsInOneScreenful();
} else {
throw new IllegalArgumentException("missing Recents[Horizontal]ScrollView");
}
return mRecentsContainer.numItemsInOneScreenful();
}
private boolean pointInside(int x, int y, View v) {
@@ -288,7 +285,7 @@ public class RecentsPanelView extends FrameLayout implements OnItemClickListener
}
public boolean isInContentArea(int x, int y) {
return pointInside(x, y, mRecentsContainer);
return pointInside(x, y, (View) mRecentsContainer);
}
public void show(boolean show) {
@@ -436,16 +433,16 @@ public class RecentsPanelView extends FrameLayout implements OnItemClickListener
protected void onFinishInflate() {
super.onFinishInflate();
mRecentsContainer = (ViewGroup) findViewById(R.id.recents_container);
mRecentsContainer = (RecentsScrollView) findViewById(R.id.recents_container);
mRecentsContainer.setOnScrollListener(new Runnable() {
public void run() {
// need to redraw the faded edges
invalidate();
}
});
mListAdapter = new TaskDescriptionAdapter(mContext);
if (mRecentsContainer instanceof RecentsScrollView){
RecentsScrollView scrollView
= (RecentsScrollView) mRecentsContainer;
scrollView.setAdapter(mListAdapter);
scrollView.setCallback(this);
} else {
throw new IllegalArgumentException("missing Recents[Horizontal]ScrollView");
}
mRecentsContainer.setAdapter(mListAdapter);
mRecentsContainer.setCallback(this);
mRecentsScrim = findViewById(R.id.recents_bg_protect);
mRecentsNoApps = findViewById(R.id.recents_no_apps);
@@ -462,11 +459,7 @@ public class RecentsPanelView extends FrameLayout implements OnItemClickListener
}
public void setMinSwipeAlpha(float minAlpha) {
if (mRecentsContainer instanceof RecentsScrollView){
RecentsScrollView scrollView
= (RecentsScrollView) mRecentsContainer;
scrollView.setMinSwipeAlpha(minAlpha);
}
mRecentsContainer.setMinSwipeAlpha(minAlpha);
}
private void createCustomAnimations(LayoutTransition transitioner) {
@@ -524,7 +517,7 @@ public class RecentsPanelView extends FrameLayout implements OnItemClickListener
void onTaskThumbnailLoaded(TaskDescription td) {
synchronized (td) {
if (mRecentsContainer != null) {
ViewGroup container = mRecentsContainer;
ViewGroup container = (ViewGroup) mRecentsContainer;
if (container instanceof RecentsScrollView) {
container = (ViewGroup) container.findViewById(
R.id.recents_linear_layout);
@@ -633,7 +626,7 @@ public class RecentsPanelView extends FrameLayout implements OnItemClickListener
final int items = mRecentTaskDescriptions != null
? mRecentTaskDescriptions.size() : 0;
mRecentsContainer.setVisibility(items > 0 ? View.VISIBLE : View.GONE);
((View) mRecentsContainer).setVisibility(items > 0 ? View.VISIBLE : View.GONE);
// Set description for accessibility
int numRecentApps = mRecentTaskDescriptions != null
@@ -650,14 +643,10 @@ public class RecentsPanelView extends FrameLayout implements OnItemClickListener
}
public boolean simulateClick(int persistentTaskId) {
if (mRecentsContainer instanceof RecentsScrollView){
RecentsScrollView scrollView
= (RecentsScrollView) mRecentsContainer;
View v = scrollView.findViewForTask(persistentTaskId);
if (v != null) {
handleOnClick(v);
return true;
}
View v = mRecentsContainer.findViewForTask(persistentTaskId);
if (v != null) {
handleOnClick(v);
return true;
}
return false;
}
@@ -775,7 +764,7 @@ public class RecentsPanelView extends FrameLayout implements OnItemClickListener
popup.setOnMenuItemClickListener(new PopupMenu.OnMenuItemClickListener() {
public boolean onMenuItemClick(MenuItem item) {
if (item.getItemId() == R.id.recent_remove_item) {
mRecentsContainer.removeViewInLayout(selectedView);
((ViewGroup) mRecentsContainer).removeViewInLayout(selectedView);
} else if (item.getItemId() == R.id.recent_inspect_item) {
ViewHolder viewHolder = (ViewHolder) selectedView.getTag();
if (viewHolder != null) {
@@ -799,4 +788,26 @@ public class RecentsPanelView extends FrameLayout implements OnItemClickListener
});
popup.show();
}
@Override
protected void dispatchDraw(Canvas canvas) {
super.dispatchDraw(canvas);
int paddingLeft = mPaddingLeft;
final boolean offsetRequired = isPaddingOffsetRequired();
if (offsetRequired) {
paddingLeft += getLeftPaddingOffset();
}
int left = mScrollX + paddingLeft;
int right = left + mRight - mLeft - mPaddingRight - paddingLeft;
int top = mScrollY + getFadeTop(offsetRequired);
int bottom = top + getFadeHeight(offsetRequired);
if (offsetRequired) {
right += getRightPaddingOffset();
bottom += getBottomPaddingOffset();
}
mRecentsContainer.drawFadedEdges(canvas, left, right, top, bottom);
}
}

View File

@@ -49,9 +49,10 @@ public class RecentsVerticalScrollView extends ScrollView
private RecentsCallback mCallback;
protected int mLastScrollPosition;
private SwipeHelper mSwipeHelper;
private RecentsScrollViewPerformanceHelper mPerformanceHelper;
private FadedEdgeDrawHelper mFadedEdgeDrawHelper;
private HashSet<View> mRecycledViews;
private int mNumItemsInOneScreenful;
private Runnable mOnScrollListener;
public RecentsVerticalScrollView(Context context, AttributeSet attrs) {
super(context, attrs, 0);
@@ -59,7 +60,7 @@ public class RecentsVerticalScrollView extends ScrollView
float pagingTouchSlop = ViewConfiguration.get(mContext).getScaledPagingTouchSlop();
mSwipeHelper = new SwipeHelper(SwipeHelper.X, this, densityScale, pagingTouchSlop);
mPerformanceHelper = RecentsScrollViewPerformanceHelper.create(context, attrs, this, true);
mFadedEdgeDrawHelper = FadedEdgeDrawHelper.create(context, attrs, this, true);
mRecycledViews = new HashSet<View>();
}
@@ -112,8 +113,8 @@ public class RecentsVerticalScrollView extends ScrollView
}
final View view = mAdapter.getView(i, old, mLinearLayout);
if (mPerformanceHelper != null) {
mPerformanceHelper.addViewCallback(view);
if (mFadedEdgeDrawHelper != null) {
mFadedEdgeDrawHelper.addViewCallback(view);
}
OnTouchListener noOpListener = new OnTouchListener() {
@@ -243,36 +244,32 @@ public class RecentsVerticalScrollView extends ScrollView
}
@Override
public void draw(Canvas canvas) {
super.draw(canvas);
if (mPerformanceHelper != null) {
int paddingLeft = mPaddingLeft;
public void drawFadedEdges(Canvas canvas, int left, int right, int top, int bottom) {
if (mFadedEdgeDrawHelper != null) {
final boolean offsetRequired = isPaddingOffsetRequired();
if (offsetRequired) {
paddingLeft += getLeftPaddingOffset();
}
int left = mScrollX + paddingLeft;
int right = left + mRight - mLeft - mPaddingRight - paddingLeft;
int top = mScrollY + getFadeTop(offsetRequired);
int bottom = top + getFadeHeight(offsetRequired);
if (offsetRequired) {
right += getRightPaddingOffset();
bottom += getBottomPaddingOffset();
}
mPerformanceHelper.drawCallback(canvas,
left, right, top, bottom, mScrollX, mScrollY,
mFadedEdgeDrawHelper.drawCallback(canvas,
left, right, top + getFadeTop(offsetRequired), bottom, mScrollX, mScrollY,
getTopFadingEdgeStrength(), getBottomFadingEdgeStrength(),
0, 0, mPaddingTop);
}
}
@Override
protected void onScrollChanged(int l, int t, int oldl, int oldt) {
super.onScrollChanged(l, t, oldl, oldt);
if (mOnScrollListener != null) {
mOnScrollListener.run();
}
}
public void setOnScrollListener(Runnable listener) {
mOnScrollListener = listener;
}
@Override
public int getVerticalFadingEdgeLength() {
if (mPerformanceHelper != null) {
return mPerformanceHelper.getVerticalFadingEdgeLengthCallback();
if (mFadedEdgeDrawHelper != null) {
return mFadedEdgeDrawHelper.getVerticalFadingEdgeLength();
} else {
return super.getVerticalFadingEdgeLength();
}
@@ -280,8 +277,8 @@ public class RecentsVerticalScrollView extends ScrollView
@Override
public int getHorizontalFadingEdgeLength() {
if (mPerformanceHelper != null) {
return mPerformanceHelper.getHorizontalFadingEdgeLengthCallback();
if (mFadedEdgeDrawHelper != null) {
return mFadedEdgeDrawHelper.getHorizontalFadingEdgeLength();
} else {
return super.getHorizontalFadingEdgeLength();
}
@@ -299,9 +296,8 @@ public class RecentsVerticalScrollView extends ScrollView
@Override
public void onAttachedToWindow() {
if (mPerformanceHelper != null) {
mPerformanceHelper.onAttachedToWindowCallback(
mCallback, mLinearLayout, isHardwareAccelerated());
if (mFadedEdgeDrawHelper != null) {
mFadedEdgeDrawHelper.onAttachedToWindowCallback(mLinearLayout, isHardwareAccelerated());
}
}