Merge "Enabling clipping on task views."

This commit is contained in:
Winson Chung
2014-05-21 20:24:05 +00:00
committed by Android (Google) Code Review
3 changed files with 60 additions and 9 deletions

View File

@@ -28,7 +28,7 @@ public class Constants {
// Enables the filtering of tasks according to their grouping
public static final boolean EnableTaskFiltering = false;
// Enables clipping of tasks against each other
public static final boolean EnableTaskStackClipping = false;
public static final boolean EnableTaskStackClipping = true;
// Enables the use of theme colors as the task bar background
public static final boolean EnableTaskBarThemeColors = true;
// Enables app-info pane on long-pressing the icon

View File

@@ -592,18 +592,27 @@ public class TaskStackView extends FrameLayout implements TaskStack.TaskStackCal
@Override
protected boolean drawChild(Canvas canvas, View child, long drawingTime) {
if (Constants.DebugFlags.App.EnableTaskStackClipping) {
RecentsConfiguration config = RecentsConfiguration.getInstance();
TaskView tv = (TaskView) child;
TaskView nextTv = null;
int curIndex = indexOfChild(tv);
if ((curIndex > -1) && (curIndex < (getChildCount() - 1))) {
TaskView tmpTv = null;
if (tv.shouldClipViewInStack()) {
int curIndex = indexOfChild(tv);
// Find the next view to clip against
while (nextTv == null && curIndex < getChildCount()) {
tmpTv = (TaskView) getChildAt(++curIndex);
if (tmpTv != null && tmpTv.shouldClipViewInStack()) {
nextTv = tmpTv;
}
}
// Clip against the next view (if we aren't animating its alpha)
nextTv = (TaskView) getChildAt(curIndex + 1);
if (nextTv.getAlpha() == 1f) {
if (nextTv != null && nextTv.getAlpha() == 1f) {
Rect curRect = tv.getClippingRect(mTmpRect);
Rect nextRect = nextTv.getClippingRect(mTmpRect2);
RecentsConfiguration config = RecentsConfiguration.getInstance();
// The hit rects are relative to the task view, which needs to be offset by the
// system bar height
// The hit rects are relative to the task view, which needs to be offset by
// the system bar height
curRect.offset(0, config.systemInsets.top);
nextRect.offset(0, config.systemInsets.top);
// Compute the clip region
@@ -1048,6 +1057,10 @@ public class TaskStackView extends FrameLayout implements TaskStack.TaskStackCal
}
}
// Sanity check, the task view should always be clipping against the stack at this point,
// but just in case, re-enable it here
tv.setClipViewInStack(true);
// Add/attach the view to the hierarchy
if (Console.Enabled) {
Console.log(Constants.Log.ViewPool.PoolCallbacks, " [TaskStackView|insertIndex]",
@@ -1500,6 +1513,9 @@ class TaskStackViewTouchHandler implements SwipeHelper.Callback {
public void onBeginDrag(View v) {
// Enable HW layers
mSv.addHwLayersRefCount("swipeBegin");
// Disable clipping with the stack while we are swiping
TaskView tv = (TaskView) v;
tv.setClipViewInStack(false);
// Disallow parents from intercepting touch events
final ViewParent parent = mSv.getParent();
if (parent != null) {
@@ -1512,13 +1528,18 @@ class TaskStackViewTouchHandler implements SwipeHelper.Callback {
TaskView tv = (TaskView) v;
mSv.onTaskDismissed(tv);
// Re-enable clipping with the stack (we will reuse this view)
tv.setClipViewInStack(true);
// Disable HW layers
mSv.decHwLayersRefCount("swipeComplete");
}
@Override
public void onSnapBackCompleted(View v) {
// Do Nothing
// Re-enable clipping with the stack
TaskView tv = (TaskView) v;
tv.setClipViewInStack(true);
}
@Override

View File

@@ -57,6 +57,7 @@ public class TaskView extends FrameLayout implements Task.TaskCallbacks, View.On
Task mTask;
boolean mTaskDataLoaded;
boolean mIsFocused;
boolean mClipViewInStack;
Point mLastTouchDown = new Point();
Path mRoundedRectClipPath = new Path();
@@ -87,6 +88,9 @@ public class TaskView extends FrameLayout implements Task.TaskCallbacks, View.On
RecentsConfiguration config = RecentsConfiguration.getInstance();
mMaxDim = config.taskStackMaxDim;
// By default, all views are clipped to other views in their stack
mClipViewInStack = true;
// Bind the views
mThumbnailView = (TaskThumbnailView) findViewById(R.id.task_view_thumbnail);
mBarView = (TaskBarView) findViewById(R.id.task_view_bar);
@@ -250,6 +254,9 @@ public class TaskView extends FrameLayout implements Task.TaskCallbacks, View.On
/** Animates the deletion of this task view */
public void animateRemoval(final Runnable r) {
// Disabling clipping with the stack while the view is animating away
setClipViewInStack(false);
RecentsConfiguration config = RecentsConfiguration.getInstance();
animate().translationX(config.taskViewRemoveAnimTranslationXPx)
.alpha(0f)
@@ -261,6 +268,9 @@ public class TaskView extends FrameLayout implements Task.TaskCallbacks, View.On
@Override
public void run() {
post(r);
// Re-enable clipping with the stack (we will reuse this view)
setClipViewInStack(false);
}
})
.start();
@@ -285,6 +295,26 @@ public class TaskView extends FrameLayout implements Task.TaskCallbacks, View.On
mThumbnailView.setLayerType(View.LAYER_TYPE_NONE, null);
}
/**
* Returns whether this view should be clipped, or any views below should clip against this
* view.
*/
boolean shouldClipViewInStack() {
return mClipViewInStack;
}
/** Sets whether this view should be clipped, or clipped against. */
void setClipViewInStack(boolean clip) {
if (clip != mClipViewInStack) {
mClipViewInStack = clip;
if (getParent() instanceof View) {
Rect r = new Rect();
getHitRect(r);
((View) getParent()).invalidate(r);
}
}
}
/** Update the dim as a function of the scale of this view. */
void updateDimOverlayFromScale() {
float minScale = Constants.Values.TaskStackView.StackPeekMinScale;