am 3bb96c7b: Merge "Refinements for app transitions" into mnc-dev

* commit '3bb96c7b3bbaa54f584ffff515f348178c79825e':
  Refinements for app transitions
This commit is contained in:
Jorim Jaggi
2015-06-05 20:28:44 +00:00
committed by Android Git Automerger

View File

@@ -34,11 +34,11 @@ import android.view.animation.ClipRectAnimation;
import android.view.animation.ClipRectLRAnimation;
import android.view.animation.ClipRectTBAnimation;
import android.view.animation.Interpolator;
import android.view.animation.LinearInterpolator;
import android.view.animation.PathInterpolator;
import android.view.animation.ScaleAnimation;
import android.view.animation.TranslateAnimation;
import android.view.animation.TranslateXAnimation;
import android.view.animation.TranslateYAnimation;
import com.android.internal.util.DumpUtils.Dump;
import com.android.server.AttributeCache;
import com.android.server.wm.WindowManagerService.H;
@@ -47,28 +47,28 @@ import java.io.PrintWriter;
import java.util.ArrayList;
import static android.view.WindowManagerInternal.AppTransitionListener;
import static com.android.internal.R.styleable.WindowAnimation_activityOpenEnterAnimation;
import static com.android.internal.R.styleable.WindowAnimation_activityOpenExitAnimation;
import static com.android.internal.R.styleable.WindowAnimation_activityCloseEnterAnimation;
import static com.android.internal.R.styleable.WindowAnimation_activityCloseExitAnimation;
import static com.android.internal.R.styleable.WindowAnimation_taskOpenEnterAnimation;
import static com.android.internal.R.styleable.WindowAnimation_taskOpenExitAnimation;
import static com.android.internal.R.styleable.WindowAnimation_launchTaskBehindTargetAnimation;
import static com.android.internal.R.styleable.WindowAnimation_activityOpenEnterAnimation;
import static com.android.internal.R.styleable.WindowAnimation_activityOpenExitAnimation;
import static com.android.internal.R.styleable.WindowAnimation_launchTaskBehindSourceAnimation;
import static com.android.internal.R.styleable.WindowAnimation_launchTaskBehindTargetAnimation;
import static com.android.internal.R.styleable.WindowAnimation_taskCloseEnterAnimation;
import static com.android.internal.R.styleable.WindowAnimation_taskCloseExitAnimation;
import static com.android.internal.R.styleable.WindowAnimation_taskToFrontEnterAnimation;
import static com.android.internal.R.styleable.WindowAnimation_taskToFrontExitAnimation;
import static com.android.internal.R.styleable.WindowAnimation_taskOpenEnterAnimation;
import static com.android.internal.R.styleable.WindowAnimation_taskOpenExitAnimation;
import static com.android.internal.R.styleable.WindowAnimation_taskToBackEnterAnimation;
import static com.android.internal.R.styleable.WindowAnimation_taskToBackExitAnimation;
import static com.android.internal.R.styleable.WindowAnimation_wallpaperOpenEnterAnimation;
import static com.android.internal.R.styleable.WindowAnimation_wallpaperOpenExitAnimation;
import static com.android.internal.R.styleable.WindowAnimation_taskToFrontEnterAnimation;
import static com.android.internal.R.styleable.WindowAnimation_taskToFrontExitAnimation;
import static com.android.internal.R.styleable.WindowAnimation_wallpaperCloseEnterAnimation;
import static com.android.internal.R.styleable.WindowAnimation_wallpaperCloseExitAnimation;
import static com.android.internal.R.styleable.WindowAnimation_wallpaperIntraOpenEnterAnimation;
import static com.android.internal.R.styleable.WindowAnimation_wallpaperIntraOpenExitAnimation;
import static com.android.internal.R.styleable.WindowAnimation_wallpaperIntraCloseEnterAnimation;
import static com.android.internal.R.styleable.WindowAnimation_wallpaperIntraCloseExitAnimation;
import static com.android.internal.R.styleable.WindowAnimation_wallpaperIntraOpenEnterAnimation;
import static com.android.internal.R.styleable.WindowAnimation_wallpaperIntraOpenExitAnimation;
import static com.android.internal.R.styleable.WindowAnimation_wallpaperOpenEnterAnimation;
import static com.android.internal.R.styleable.WindowAnimation_wallpaperOpenExitAnimation;
// State management of app transitions. When we are preparing for a
// transition, mNextAppTransition will be the kind of transition to
@@ -80,7 +80,7 @@ public class AppTransition implements Dump {
private static final boolean DEBUG_APP_TRANSITIONS =
WindowManagerService.DEBUG_APP_TRANSITIONS;
private static final boolean DEBUG_ANIM = WindowManagerService.DEBUG_ANIM;
private static final int CLIP_REVEAL_TRANSLATION_Y_DP = 8;
/** Not set up for a transition. */
public static final int TRANSIT_UNSET = -1;
@@ -121,13 +121,13 @@ public class AppTransition implements Dump {
public static final int TRANSIT_TASK_IN_PLACE = 17;
/** Fraction of animation at which the recents thumbnail stays completely transparent */
private static final float RECENTS_THUMBNAIL_FADEIN_FRACTION = 0.7f;
private static final float RECENTS_THUMBNAIL_FADEIN_FRACTION = 0.5f;
/** Fraction of animation at which the recents thumbnail becomes completely transparent */
private static final float RECENTS_THUMBNAIL_FADEOUT_FRACTION = 0.3f;
private static final float RECENTS_THUMBNAIL_FADEOUT_FRACTION = 0.5f;
private static final int DEFAULT_APP_TRANSITION_DURATION = 250;
private static final int THUMBNAIL_APP_TRANSITION_DURATION = 325;
private static final int THUMBNAIL_APP_TRANSITION_ALPHA_DURATION = 325;
private static final int DEFAULT_APP_TRANSITION_DURATION = 336;
private static final int THUMBNAIL_APP_TRANSITION_DURATION = 336;
private static final int THUMBNAIL_APP_TRANSITION_ALPHA_DURATION = 336;
private final Context mContext;
private final Handler mH;
@@ -179,8 +179,14 @@ public class AppTransition implements Dump {
private final Interpolator mThumbnailFadeInInterpolator;
private final Interpolator mThumbnailFadeOutInterpolator;
private final Interpolator mLinearOutSlowInInterpolator;
private final Interpolator mFastOutSlowInInterpolator;
private final LinearInterpolator mLinearInterpolator;
private final Interpolator mFastOutLinearInInterpolator;
private final Interpolator mClipHorizontalInterpolator = new PathInterpolator(0, 0, 0.4f, 1f);
/** Interpolator to be used for animations that respond directly to a touch */
private final Interpolator mTouchResponseInterpolator =
new PathInterpolator(0.3f, 0f, 0.1f, 1f);
private final int mClipRevealTranslationY;
private int mCurrentUserId = 0;
@@ -191,9 +197,8 @@ public class AppTransition implements Dump {
mH = h;
mLinearOutSlowInInterpolator = AnimationUtils.loadInterpolator(context,
com.android.internal.R.interpolator.linear_out_slow_in);
mFastOutSlowInInterpolator = AnimationUtils.loadInterpolator(context,
com.android.internal.R.interpolator.fast_out_slow_in);
mLinearInterpolator = new LinearInterpolator();
mFastOutLinearInInterpolator = AnimationUtils.loadInterpolator(context,
com.android.internal.R.interpolator.fast_out_linear_in);
mConfigShortAnimTime = context.getResources().getInteger(
com.android.internal.R.integer.config_shortAnimTime);
mDecelerateInterpolator = AnimationUtils.loadInterpolator(context,
@@ -205,8 +210,9 @@ public class AppTransition implements Dump {
if (input < RECENTS_THUMBNAIL_FADEIN_FRACTION) {
return 0f;
}
return (input - RECENTS_THUMBNAIL_FADEIN_FRACTION) /
float t = (input - RECENTS_THUMBNAIL_FADEIN_FRACTION) /
(1f - RECENTS_THUMBNAIL_FADEIN_FRACTION);
return mFastOutLinearInInterpolator.getInterpolation(t);
}
};
mThumbnailFadeOutInterpolator = new Interpolator() {
@@ -214,11 +220,14 @@ public class AppTransition implements Dump {
public float getInterpolation(float input) {
// Linear response for first fraction, then complete after that.
if (input < RECENTS_THUMBNAIL_FADEOUT_FRACTION) {
return input / RECENTS_THUMBNAIL_FADEOUT_FRACTION;
float t = input / RECENTS_THUMBNAIL_FADEOUT_FRACTION;
return mLinearOutSlowInInterpolator.getInterpolation(t);
}
return 1f;
}
};
mClipRevealTranslationY = (int) (CLIP_REVEAL_TRANSLATION_Y_DP
* mContext.getResources().getDisplayMetrics().density);
}
boolean isTransitionSet() {
@@ -507,47 +516,47 @@ public class AppTransition implements Dump {
if (enter) {
// Reveal will expand and move faster in horizontal direction
// Start from upper left of start and move to final position
final int appWidth = appFrame.width();
final int appHeight = appFrame.height();
// Start from size of launch icon, expand to full width/height
float t = 0f;
if (appHeight > 0) {
t = (float) mNextAppTransitionStartY / appHeight;
}
int translationY = mClipRevealTranslationY
+ (int)(appHeight / 7f * t);
int centerX = mNextAppTransitionStartX + mNextAppTransitionStartWidth / 2;
int centerY = mNextAppTransitionStartY + mNextAppTransitionStartHeight / 2;
// Clip third of the from size of launch icon, expand to full width/height
Animation clipAnimLR = new ClipRectLRAnimation(
(appWidth - mNextAppTransitionStartWidth) / 2,
(appWidth + mNextAppTransitionStartWidth) / 2, 0, appWidth);
clipAnimLR.setInterpolator(mLinearOutSlowInInterpolator);
clipAnimLR.setDuration(DEFAULT_APP_TRANSITION_DURATION);
centerX - mNextAppTransitionStartWidth / 3,
centerX + mNextAppTransitionStartWidth / 3,
0, appWidth);
clipAnimLR.setInterpolator(mClipHorizontalInterpolator);
clipAnimLR.setDuration((long) (DEFAULT_APP_TRANSITION_DURATION / 2.5f));
Animation clipAnimTB = new ClipRectTBAnimation(
(appHeight - mNextAppTransitionStartHeight) / 2,
(appHeight + mNextAppTransitionStartHeight) / 2, 0, appHeight);
clipAnimTB.setInterpolator(mFastOutSlowInInterpolator);
centerY - mNextAppTransitionStartHeight / 3 - translationY,
centerY + mNextAppTransitionStartHeight / 3 - translationY,
0, appHeight);
clipAnimTB.setInterpolator(mTouchResponseInterpolator);
clipAnimTB.setDuration(DEFAULT_APP_TRANSITION_DURATION);
// Start from middle of launch icon area, move to 0, 0
int startMiddleX = mNextAppTransitionStartX +
(mNextAppTransitionStartWidth - appWidth) / 2 - appFrame.left;
int startMiddleY = mNextAppTransitionStartY +
(mNextAppTransitionStartHeight - appHeight) / 2 - appFrame.top;
TranslateXAnimation translateX = new TranslateXAnimation(
Animation.ABSOLUTE, startMiddleX, Animation.ABSOLUTE, 0);
translateX.setInterpolator(mLinearOutSlowInInterpolator);
translateX.setDuration(DEFAULT_APP_TRANSITION_DURATION);
TranslateYAnimation translateY = new TranslateYAnimation(
Animation.ABSOLUTE, startMiddleY, Animation.ABSOLUTE, 0);
translateY.setInterpolator(mFastOutSlowInInterpolator);
Animation.ABSOLUTE, translationY, Animation.ABSOLUTE, 0);
translateY.setInterpolator(mLinearOutSlowInInterpolator);
translateY.setDuration(DEFAULT_APP_TRANSITION_DURATION);
// Quick fade-in from icon to app window
final int alphaDuration = 100;
AlphaAnimation alpha = new AlphaAnimation(0.1f, 1);
final int alphaDuration = DEFAULT_APP_TRANSITION_DURATION / 4;
AlphaAnimation alpha = new AlphaAnimation(0.5f, 1);
alpha.setDuration(alphaDuration);
alpha.setInterpolator(mLinearInterpolator);
alpha.setInterpolator(mLinearOutSlowInInterpolator);
AnimationSet set = new AnimationSet(false);
set.addAnimation(clipAnimLR);
set.addAnimation(clipAnimTB);
set.addAnimation(translateX);
set.addAnimation(translateY);
set.addAnimation(alpha);
set.initialize(appWidth, appHeight, appWidth, appHeight);
@@ -657,14 +666,14 @@ public class AppTransition implements Dump {
Animation scale = new ScaleAnimation(1f, scaleW, 1f, scaleW,
mNextAppTransitionStartX + (thumbWidth / 2f),
mNextAppTransitionStartY + (thumbHeight / 2f));
scale.setInterpolator(mFastOutSlowInInterpolator);
scale.setInterpolator(mTouchResponseInterpolator);
scale.setDuration(THUMBNAIL_APP_TRANSITION_DURATION);
Animation alpha = new AlphaAnimation(1, 0);
alpha.setInterpolator(mThumbnailFadeOutInterpolator);
alpha.setDuration(THUMBNAIL_APP_TRANSITION_ALPHA_DURATION);
Animation translate = new TranslateAnimation(0, 0, 0, -unscaledStartY +
mNextAppTransitionInsets.top);
translate.setInterpolator(mFastOutSlowInInterpolator);
translate.setInterpolator(mTouchResponseInterpolator);
translate.setDuration(THUMBNAIL_APP_TRANSITION_DURATION);
// This AnimationSet uses the Interpolators assigned above.
@@ -678,14 +687,14 @@ public class AppTransition implements Dump {
Animation scale = new ScaleAnimation(scaleW, 1f, scaleW, 1f,
mNextAppTransitionStartX + (thumbWidth / 2f),
mNextAppTransitionStartY + (thumbHeight / 2f));
scale.setInterpolator(mFastOutSlowInInterpolator);
scale.setInterpolator(mTouchResponseInterpolator);
scale.setDuration(THUMBNAIL_APP_TRANSITION_DURATION);
Animation alpha = new AlphaAnimation(0f, 1f);
alpha.setInterpolator(mThumbnailFadeInInterpolator);
alpha.setDuration(THUMBNAIL_APP_TRANSITION_ALPHA_DURATION);
Animation translate = new TranslateAnimation(0, 0, -unscaledStartY +
mNextAppTransitionInsets.top, 0);
translate.setInterpolator(mFastOutSlowInInterpolator);
translate.setInterpolator(mTouchResponseInterpolator);
translate.setDuration(THUMBNAIL_APP_TRANSITION_DURATION);
// This AnimationSet uses the Interpolators assigned above.
@@ -697,7 +706,7 @@ public class AppTransition implements Dump {
}
return prepareThumbnailAnimationWithDuration(a, appWidth, appHeight, 0,
mFastOutSlowInInterpolator);
mTouchResponseInterpolator);
}
/**
@@ -833,7 +842,7 @@ public class AppTransition implements Dump {
int duration = Math.max(THUMBNAIL_APP_TRANSITION_ALPHA_DURATION,
THUMBNAIL_APP_TRANSITION_DURATION);
return prepareThumbnailAnimationWithDuration(a, appWidth, appHeight, duration,
mFastOutSlowInInterpolator);
mTouchResponseInterpolator);
}
/**