Merge "Cleaning up some old animation code, only setting view properties that have changed."

This commit is contained in:
Winson Chung
2014-06-14 00:40:45 +00:00
committed by Android (Google) Code Review
5 changed files with 112 additions and 49 deletions

View File

@@ -30,18 +30,21 @@ import android.content.pm.ActivityInfo;
import android.content.pm.IPackageManager;
import android.content.pm.PackageManager;
import android.graphics.Bitmap;
import android.graphics.Matrix;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.PorterDuff;
import android.graphics.PorterDuffXfermode;
import android.graphics.drawable.ColorDrawable;
import android.graphics.drawable.Drawable;
import android.os.Bundle;
import android.os.RemoteException;
import android.os.UserHandle;
import android.os.UserManager;
import android.util.DisplayMetrics;
import android.util.Log;
import android.util.Pair;
import android.view.Display;
import android.view.DisplayInfo;
import android.view.Surface;
import android.view.SurfaceControl;
import android.view.WindowManager;
@@ -55,6 +58,8 @@ import java.util.Random;
* a point of injection when testing UI.
*/
public class SystemServicesProxy {
final static String TAG = "SystemServicesProxy";
ActivityManager mAm;
AppWidgetManager mAwm;
PackageManager mPm;
@@ -67,6 +72,8 @@ public class SystemServicesProxy {
ComponentName mAssistComponent;
Bitmap mDummyIcon;
Paint mBgProtectionPaint;
Canvas mBgProtectionCanvas;
/** Private constructor */
public SystemServicesProxy(Context context) {
@@ -80,6 +87,12 @@ public class SystemServicesProxy {
mDisplay = mWm.getDefaultDisplay();
mRecentsPackage = context.getPackageName();
// Create the protection paints
mBgProtectionPaint = new Paint();
mBgProtectionPaint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.DST_ATOP));
mBgProtectionPaint.setColor(0xFFffffff);
mBgProtectionCanvas = new Canvas();
// Resolve the assist intent
Intent assist = mSm.getAssistIntent(context, false);
if (assist != null) {
@@ -195,7 +208,20 @@ public class SystemServicesProxy {
return thumbnail;
}
return mAm.getTaskTopThumbnail(taskId);
Bitmap thumbnail = mAm.getTaskTopThumbnail(taskId);
if (thumbnail != null) {
// We use a dumb heuristic for now, if the thumbnail is purely transparent in the top
// left pixel, then assume the whole thumbnail is transparent. Generally, proper
// screenshots are always composed onto a bitmap that has no alpha.
if (Color.alpha(thumbnail.getPixel(0, 0)) == 0) {
mBgProtectionCanvas.setBitmap(thumbnail);
mBgProtectionCanvas.drawRect(0, 0, thumbnail.getWidth(), thumbnail.getHeight(),
mBgProtectionPaint);
mBgProtectionCanvas.setBitmap(null);
Log.e(TAG, "Invalid screenshot detected from getTaskThumbnail()");
}
}
return thumbnail;
}
/** Moves a task to the front with the specified activity options */

View File

@@ -22,10 +22,10 @@ import android.graphics.Canvas;
import android.graphics.Paint;
import android.graphics.PorterDuff;
import android.graphics.PorterDuffXfermode;
import android.graphics.Rect;
import android.graphics.drawable.Drawable;
import android.util.AttributeSet;
import android.view.View;
import android.view.ViewPropertyAnimator;
import android.widget.FrameLayout;
import android.widget.ImageView;
import android.widget.TextView;
@@ -103,21 +103,24 @@ class TaskBarView extends FrameLayout {
}
/** Synchronizes this bar view's properties with the task's transform */
void updateViewPropertiesToTaskTransform(TaskViewTransform animateFromTransform,
TaskViewTransform toTransform, int duration) {
void updateViewPropertiesToTaskTransform(TaskViewTransform toTransform, int duration) {
if (duration > 0 && (mDismissButton.getVisibility() == View.VISIBLE)) {
if (animateFromTransform != null) {
mDismissButton.setAlpha(animateFromTransform.dismissAlpha);
}
mDismissButton.animate()
.alpha(toTransform.dismissAlpha)
ViewPropertyAnimator anim = mDismissButton.animate();
// Animate to the final state
if (toTransform.hasDismissAlphaChangedFrom(mDismissButton.getAlpha())) {
anim.alpha(toTransform.dismissAlpha)
.setStartDelay(0)
.setDuration(duration)
.setInterpolator(mConfig.fastOutSlowInInterpolator)
.withLayer()
.start();
}
} else {
mDismissButton.setAlpha(toTransform.dismissAlpha);
// Set the changed properties
if (toTransform.hasDismissAlphaChangedFrom(mDismissButton.getAlpha())) {
mDismissButton.setAlpha(toTransform.dismissAlpha);
}
}
}
@@ -169,7 +172,6 @@ class TaskBarView extends FrameLayout {
.setStartDelay(delay)
.setInterpolator(mConfig.fastOutSlowInInterpolator)
.setDuration(mConfig.taskBarEnterAnimDuration)
.withLayer()
.withEndAction(postAnimRunnable)
.start();
}
@@ -182,7 +184,6 @@ class TaskBarView extends FrameLayout {
.setStartDelay(0)
.setInterpolator(mConfig.fastOutLinearInInterpolator)
.setDuration(mConfig.taskBarExitAnimDuration)
.withLayer()
.withStartAction(preAnimRunnable)
.withEndAction(new Runnable() {
@Override

View File

@@ -322,7 +322,7 @@ public class TaskStackView extends FrameLayout implements TaskStack.TaskStackCal
if (mStackViewsAnimationDuration > 0 && i != 0) {
int fromIndex = (transform.t < 0) ? (visibleRange[0] - 1) :
(visibleRange[1] + 1);
tv.updateViewPropertiesToTaskTransform(null,
tv.updateViewPropertiesToTaskTransform(
getStackTransform(fromIndex, stackScroll), 0);
}
}
@@ -343,7 +343,7 @@ public class TaskStackView extends FrameLayout implements TaskStack.TaskStackCal
if (taskIndex < 0 || !mTaskTransforms.get(taskIndex).visible) {
mViewPool.returnViewToPool(tv);
} else {
tv.updateViewPropertiesToTaskTransform(null, mTaskTransforms.get(taskIndex),
tv.updateViewPropertiesToTaskTransform(mTaskTransforms.get(taskIndex),
mStackViewsAnimationDuration);
}
}
@@ -996,7 +996,7 @@ public class TaskStackView extends FrameLayout implements TaskStack.TaskStackCal
// Compose a new transform to fade and slide the new task in
TaskViewTransform fromTransform = new TaskViewTransform(toTransform);
tv.prepareTaskTransformForFilterTaskHidden(fromTransform);
tv.updateViewPropertiesToTaskTransform(null, fromTransform, 0);
tv.updateViewPropertiesToTaskTransform(fromTransform, 0);
int startDelay = offset *
Constants.Values.TaskStackView.FilterStartDelay;
@@ -1059,13 +1059,13 @@ public class TaskStackView extends FrameLayout implements TaskStack.TaskStackCal
for (final TaskView tv : childViewTransforms.keySet()) {
Pair<Integer, TaskViewTransform> t = childViewTransforms.get(tv);
tv.animate().setStartDelay(t.first);
tv.updateViewPropertiesToTaskTransform(null, t.second, duration);
tv.updateViewPropertiesToTaskTransform(t.second, duration);
}
}
}
}
});
tv.updateViewPropertiesToTaskTransform(null, t.second, duration);
tv.updateViewPropertiesToTaskTransform(t.second, duration);
}
}

View File

@@ -29,6 +29,7 @@ import android.graphics.RectF;
import android.util.AttributeSet;
import android.view.MotionEvent;
import android.view.View;
import android.view.ViewPropertyAnimator;
import android.view.animation.AccelerateInterpolator;
import android.widget.FrameLayout;
import com.android.systemui.R;
@@ -163,50 +164,64 @@ public class TaskView extends FrameLayout implements Task.TaskCallbacks, View.On
}
/** Synchronizes this view's properties with the task's transform */
void updateViewPropertiesToTaskTransform(TaskViewTransform animateFromTransform,
TaskViewTransform toTransform, int duration) {
void updateViewPropertiesToTaskTransform(TaskViewTransform toTransform, int duration) {
if (Console.Enabled) {
Console.log(Constants.Log.UI.Draw, "[TaskView|updateViewPropertiesToTaskTransform]",
"duration: " + duration, Console.AnsiPurple);
}
// Update the bar view
mBarView.updateViewPropertiesToTaskTransform(animateFromTransform, toTransform, duration);
mBarView.updateViewPropertiesToTaskTransform(toTransform, duration);
// Update this task view
// Check to see if any properties have changed, and update the task view
if (duration > 0) {
if (animateFromTransform != null) {
setTranslationY(animateFromTransform.translationY);
if (Constants.DebugFlags.App.EnableShadows) {
setTranslationZ(animateFromTransform.translationZ);
}
setScaleX(animateFromTransform.scale);
setScaleY(animateFromTransform.scale);
setAlpha(animateFromTransform.alpha);
ViewPropertyAnimator anim = animate();
boolean useLayers = false;
// Animate to the final state
if (toTransform.hasTranslationYChangedFrom(getTranslationY())) {
anim.translationY(toTransform.translationY);
}
if (Constants.DebugFlags.App.EnableShadows) {
animate().translationZ(toTransform.translationZ);
if (Constants.DebugFlags.App.EnableShadows &&
toTransform.hasTranslationZChangedFrom(getTranslationZ())) {
anim.translationZ(toTransform.translationZ);
}
animate().translationY(toTransform.translationY)
.scaleX(toTransform.scale)
if (toTransform.hasScaleChangedFrom(getScaleX())) {
anim.scaleX(toTransform.scale)
.scaleY(toTransform.scale)
.alpha(toTransform.alpha)
.setStartDelay(0)
.setDuration(duration)
.setInterpolator(mConfig.fastOutSlowInInterpolator)
.setUpdateListener(mUpdateDimListener)
.start();
.setUpdateListener(mUpdateDimListener);
useLayers = true;
}
if (toTransform.hasAlphaChangedFrom(getAlpha())) {
// Use layers if we animate alpha
anim.alpha(toTransform.alpha);
useLayers = true;
}
if (useLayers) {
anim.withLayer();
}
anim.setStartDelay(0)
.setDuration(duration)
.setInterpolator(mConfig.fastOutSlowInInterpolator)
.start();
} else {
setTranslationY(toTransform.translationY);
if (Constants.DebugFlags.App.EnableShadows) {
// Set the changed properties
if (toTransform.hasTranslationYChangedFrom(getTranslationY())) {
setTranslationY(toTransform.translationY);
}
if (Constants.DebugFlags.App.EnableShadows &&
toTransform.hasTranslationZChangedFrom(getTranslationZ())) {
setTranslationZ(toTransform.translationZ);
}
setScaleX(toTransform.scale);
setScaleY(toTransform.scale);
setAlpha(toTransform.alpha);
if (toTransform.hasScaleChangedFrom(getScaleX())) {
setScaleX(toTransform.scale);
setScaleY(toTransform.scale);
updateDimOverlayFromScale();
}
if (toTransform.hasAlphaChangedFrom(getAlpha())) {
setAlpha(toTransform.alpha);
}
}
updateDimOverlayFromScale();
invalidate();
}
/** Resets this view's properties */
@@ -298,6 +313,7 @@ public class TaskView extends FrameLayout implements Task.TaskCallbacks, View.On
.scaleY(transform.scale)
.translationY(transform.translationY)
.setStartDelay(0)
.setUpdateListener(null)
.setInterpolator(mConfig.linearOutSlowInInterpolator)
.setDuration(475)
.withLayer()
@@ -330,6 +346,7 @@ public class TaskView extends FrameLayout implements Task.TaskCallbacks, View.On
.scaleY(transform.scale)
.translationY(transform.translationY)
.setStartDelay(delay)
.setUpdateListener(null)
.setInterpolator(mConfig.quintOutInterpolator)
.setDuration(mConfig.taskViewEnterFromHomeDuration)
.withLayer()
@@ -343,6 +360,7 @@ public class TaskView extends FrameLayout implements Task.TaskCallbacks, View.On
animate()
.translationY(ctx.offscreenTranslationY)
.setStartDelay(0)
.setUpdateListener(null)
.setInterpolator(mConfig.fastOutLinearInInterpolator)
.setDuration(mConfig.taskViewExitToHomeDuration)
.withLayer()
@@ -383,6 +401,7 @@ public class TaskView extends FrameLayout implements Task.TaskCallbacks, View.On
animate().translationX(mConfig.taskViewRemoveAnimTranslationXPx)
.alpha(0f)
.setStartDelay(0)
.setUpdateListener(null)
.setInterpolator(mConfig.fastOutSlowInInterpolator)
.setDuration(mConfig.taskViewRemoveAnimDuration)
.withLayer()

View File

@@ -45,6 +45,23 @@ public class TaskViewTransform {
t = o.t;
}
/** Convenience functions to compare against current property values */
public boolean hasAlphaChangedFrom(float v) {
return (Float.compare(alpha, v) != 0);
}
public boolean hasDismissAlphaChangedFrom(float v) {
return (Float.compare(dismissAlpha, v) != 0);
}
public boolean hasScaleChangedFrom(float v) {
return (Float.compare(scale, v) != 0);
}
public boolean hasTranslationYChangedFrom(float v) {
return (Float.compare(translationY, v) != 0);
}
public boolean hasTranslationZChangedFrom(float v) {
return (Float.compare(translationZ, v) != 0);
}
@Override
public String toString() {
return "TaskViewTransform y: " + translationY + " z: " + translationZ + " scale: " + scale +