From c041d883c3591670441d4c2da8fd1108dfd28acd Mon Sep 17 00:00:00 2001 From: Winson Chung Date: Fri, 14 Nov 2014 17:34:03 -0800 Subject: [PATCH] Tweaking animation XMLs and removing dead code. (Bug 17672056, Bug 18415217) - Use shape drawable for pin background instead of asset. - Includes fix for scrolling regression when task stack scroller was not reset. Change-Id: I11eec1f3b0386b4354c8c5e3deca2b17cff83be1 --- .../res/anim/recents_from_app_enter.xml | 2 +- .../res/anim/recents_from_app_exit.xml | 2 +- .../recents_from_search_launcher_enter.xml | 6 +- .../recents_from_search_launcher_exit.xml | 5 +- .../anim/recents_to_search_launcher_enter.xml | 2 +- .../anim/recents_to_search_launcher_exit.xml | 7 +-- .../res/drawable-hdpi/btn_fab_recents.png | Bin 4248 -> 0 bytes .../res/drawable-mdpi/btn_fab_recents.png | Bin 2715 -> 0 bytes .../res/drawable-xhdpi/btn_fab_recents.png | Bin 5938 -> 0 bytes .../res/drawable-xxhdpi/btn_fab_recents.png | Bin 9255 -> 0 bytes .../recents_lock_to_task_button_bg.xml | 8 ++- .../SystemUI/res/layout/recents_task_view.xml | 8 +-- packages/SystemUI/res/values/config.xml | 59 ++++++++++++------ packages/SystemUI/res/values/dimens.xml | 9 ++- .../systemui/recents/RecentsActivity.java | 2 - .../recents/RecentsConfiguration.java | 48 ++++++-------- .../recents/views/AnimateableViewBounds.java | 3 - .../recents/views/SystemBarScrimViews.java | 12 ++-- .../systemui/recents/views/TaskStackView.java | 10 +-- .../recents/views/TaskStackViewScroller.java | 14 ++++- .../systemui/recents/views/TaskView.java | 38 ++++++----- .../recents/views/TaskViewHeader.java | 4 +- .../recents/views/TaskViewThumbnail.java | 4 +- 23 files changed, 134 insertions(+), 109 deletions(-) delete mode 100644 packages/SystemUI/res/drawable-hdpi/btn_fab_recents.png delete mode 100644 packages/SystemUI/res/drawable-mdpi/btn_fab_recents.png delete mode 100644 packages/SystemUI/res/drawable-xhdpi/btn_fab_recents.png delete mode 100644 packages/SystemUI/res/drawable-xxhdpi/btn_fab_recents.png diff --git a/packages/SystemUI/res/anim/recents_from_app_enter.xml b/packages/SystemUI/res/anim/recents_from_app_enter.xml index 6abe8b3d937fc..10ddce68dcaf6 100644 --- a/packages/SystemUI/res/anim/recents_from_app_enter.xml +++ b/packages/SystemUI/res/anim/recents_from_app_enter.xml @@ -16,7 +16,7 @@ ** limitations under the License. */ --> - + diff --git a/packages/SystemUI/res/anim/recents_from_app_exit.xml b/packages/SystemUI/res/anim/recents_from_app_exit.xml index 1447a5a359a42..c98ecf43eb655 100644 --- a/packages/SystemUI/res/anim/recents_from_app_exit.xml +++ b/packages/SystemUI/res/anim/recents_from_app_exit.xml @@ -16,7 +16,7 @@ ** limitations under the License. */ --> - + diff --git a/packages/SystemUI/res/anim/recents_from_search_launcher_enter.xml b/packages/SystemUI/res/anim/recents_from_search_launcher_enter.xml index 20e77640cd277..7de4460d4bb1c 100644 --- a/packages/SystemUI/res/anim/recents_from_search_launcher_enter.xml +++ b/packages/SystemUI/res/anim/recents_from_search_launcher_enter.xml @@ -16,13 +16,13 @@ ** limitations under the License. */ --> - + - + android:duration="1"/> diff --git a/packages/SystemUI/res/anim/recents_from_search_launcher_exit.xml b/packages/SystemUI/res/anim/recents_from_search_launcher_exit.xml index 92a8882272031..e0e2fc83a8160 100644 --- a/packages/SystemUI/res/anim/recents_from_search_launcher_exit.xml +++ b/packages/SystemUI/res/anim/recents_from_search_launcher_exit.xml @@ -16,14 +16,13 @@ ** limitations under the License. */ --> - + + android:duration="@integer/recents_enter_from_home_transition_duration"/> diff --git a/packages/SystemUI/res/anim/recents_to_search_launcher_enter.xml b/packages/SystemUI/res/anim/recents_to_search_launcher_enter.xml index 4e1d66dedda64..ea8283511b96c 100644 --- a/packages/SystemUI/res/anim/recents_to_search_launcher_enter.xml +++ b/packages/SystemUI/res/anim/recents_to_search_launcher_enter.xml @@ -16,7 +16,7 @@ ** limitations under the License. */ --> - + diff --git a/packages/SystemUI/res/anim/recents_to_search_launcher_exit.xml b/packages/SystemUI/res/anim/recents_to_search_launcher_exit.xml index d7a12a468f3cc..a8bdc8e45f59f 100644 --- a/packages/SystemUI/res/anim/recents_to_search_launcher_exit.xml +++ b/packages/SystemUI/res/anim/recents_to_search_launcher_exit.xml @@ -16,14 +16,13 @@ ** limitations under the License. */ --> - + - + android:duration="100"/> diff --git a/packages/SystemUI/res/drawable-hdpi/btn_fab_recents.png b/packages/SystemUI/res/drawable-hdpi/btn_fab_recents.png deleted file mode 100644 index b95fde57610fbb01adea40a74cf0ce7ba1e8fd45..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4248 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 L+9PWams0)(!-5N4 diff --git a/packages/SystemUI/res/drawable-xhdpi/btn_fab_recents.png b/packages/SystemUI/res/drawable-xhdpi/btn_fab_recents.png deleted file mode 100644 index 4cdd0aaea1eeb17c68a684fed74c25d8eecd1644..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5938 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 {Y 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 diff --git a/packages/SystemUI/res/drawable/recents_lock_to_task_button_bg.xml b/packages/SystemUI/res/drawable/recents_lock_to_task_button_bg.xml index 6424a65c5290b..8a8164a941221 100644 --- a/packages/SystemUI/res/drawable/recents_lock_to_task_button_bg.xml +++ b/packages/SystemUI/res/drawable/recents_lock_to_task_button_bg.xml @@ -16,5 +16,11 @@ - + + + + + + \ No newline at end of file diff --git a/packages/SystemUI/res/layout/recents_task_view.xml b/packages/SystemUI/res/layout/recents_task_view.xml index d1d382826ebe3..9c6f67c7cfd7e 100644 --- a/packages/SystemUI/res/layout/recents_task_view.xml +++ b/packages/SystemUI/res/layout/recents_task_view.xml @@ -29,8 +29,8 @@ diff --git a/packages/SystemUI/res/values/config.xml b/packages/SystemUI/res/values/config.xml index 3cd72fc66abce..fbee98f148adc 100644 --- a/packages/SystemUI/res/values/config.xml +++ b/packages/SystemUI/res/values/config.xml @@ -144,42 +144,61 @@ 1 + 250 + 250 - - 225 - - 275 - - 225 - - 125 - - 150 - - 250 - - 12 - - 150 - - 300 + + + 325 + + + 200 + + + 125 + + + 100 + + + 225 + + + 12 + + + 225 + 400 + 250 + 225 + 96 + 200 + true + true diff --git a/packages/SystemUI/res/values/dimens.xml b/packages/SystemUI/res/values/dimens.xml index 5caa866497baf..fdd01867f4240 100644 --- a/packages/SystemUI/res/values/dimens.xml +++ b/packages/SystemUI/res/values/dimens.xml @@ -226,9 +226,6 @@ 1.5dp - - 48dp - 64dp @@ -257,6 +254,12 @@ 0.6 + + 56dp + + + 28dp + 12dp diff --git a/packages/SystemUI/src/com/android/systemui/recents/RecentsActivity.java b/packages/SystemUI/src/com/android/systemui/recents/RecentsActivity.java index d1eadd880ffea..676f1abca4f6d 100644 --- a/packages/SystemUI/src/com/android/systemui/recents/RecentsActivity.java +++ b/packages/SystemUI/src/com/android/systemui/recents/RecentsActivity.java @@ -431,8 +431,6 @@ public class RecentsActivity extends Activity implements RecentsView.RecentsView // Update if we are getting a configuration change if (savedInstanceState != null) { // Update RecentsConfiguration - mConfig = RecentsConfiguration.reinitialize(this, - RecentsTaskLoader.getInstance().getSystemServicesProxy()); mConfig.updateOnConfigurationChange(); // Trigger the enter animation onEnterAnimationTriggered(); diff --git a/packages/SystemUI/src/com/android/systemui/recents/RecentsConfiguration.java b/packages/SystemUI/src/com/android/systemui/recents/RecentsConfiguration.java index e0c76b1dea026..75cf902ea8fd8 100644 --- a/packages/SystemUI/src/com/android/systemui/recents/RecentsConfiguration.java +++ b/packages/SystemUI/src/com/android/systemui/recents/RecentsConfiguration.java @@ -74,11 +74,15 @@ public class RecentsConfiguration { public float taskStackWidthPaddingPct; public float taskStackOverscrollPct; + /** Transitions */ + public int transitionEnterFromAppDelay; + public int transitionEnterFromHomeDelay; + /** Task view animation and styles */ - public int taskViewEnterFromHomeDelay; + public int taskViewEnterFromAppDuration; public int taskViewEnterFromHomeDuration; public int taskViewEnterFromHomeStaggerDelay; - public int taskViewEnterFromHomeStaggerDuration; + public int taskViewExitToAppDuration; public int taskViewExitToHomeDuration; public int taskViewRemoveAnimDuration; public int taskViewRemoveAnimTranslationXPx; @@ -98,16 +102,8 @@ public class RecentsConfiguration { /** Task bar size & animations */ public int taskBarHeight; - public int taskBarEnterAnimDuration; - public int taskBarEnterAnimDelay; - public int taskBarExitAnimDuration; public int taskBarDismissDozeDelaySeconds; - /** Lock to app */ - public int taskViewLockToAppButtonHeight; - public int taskViewLockToAppShortAnimDuration; - public int taskViewLockToAppLongAnimDuration; - /** Nav bar scrim */ public int navBarScrimEnterDuration; @@ -213,15 +209,23 @@ public class RecentsConfiguration { taskStackMaxDim = res.getInteger(R.integer.recents_max_task_stack_view_dim); taskStackTopPaddingPx = res.getDimensionPixelSize(R.dimen.recents_stack_top_padding); + // Transition + transitionEnterFromAppDelay = + res.getInteger(R.integer.recents_enter_from_app_transition_duration); + transitionEnterFromHomeDelay = + res.getInteger(R.integer.recents_enter_from_home_transition_duration); + // Task view animation and styles - taskViewEnterFromHomeDelay = - res.getInteger(R.integer.recents_animate_task_enter_from_home_delay); + taskViewEnterFromAppDuration = + res.getInteger(R.integer.recents_task_enter_from_app_duration); taskViewEnterFromHomeDuration = - res.getInteger(R.integer.recents_animate_task_enter_from_home_duration); + res.getInteger(R.integer.recents_task_enter_from_home_duration); taskViewEnterFromHomeStaggerDelay = - res.getInteger(R.integer.recents_animate_task_enter_from_home_stagger_delay); + res.getInteger(R.integer.recents_task_enter_from_home_stagger_delay); + taskViewExitToAppDuration = + res.getInteger(R.integer.recents_task_exit_to_app_duration); taskViewExitToHomeDuration = - res.getInteger(R.integer.recents_animate_task_exit_to_home_duration); + res.getInteger(R.integer.recents_task_exit_to_home_duration); taskViewRemoveAnimDuration = res.getInteger(R.integer.recents_animate_task_view_remove_duration); taskViewRemoveAnimTranslationXPx = @@ -252,23 +256,9 @@ public class RecentsConfiguration { // Task bar size & animations taskBarHeight = res.getDimensionPixelSize(R.dimen.recents_task_bar_height); - taskBarEnterAnimDuration = - res.getInteger(R.integer.recents_animate_task_bar_enter_duration); - taskBarEnterAnimDelay = - res.getInteger(R.integer.recents_animate_task_bar_enter_delay); - taskBarExitAnimDuration = - res.getInteger(R.integer.recents_animate_task_bar_exit_duration); taskBarDismissDozeDelaySeconds = res.getInteger(R.integer.recents_task_bar_dismiss_delay_seconds); - // Lock to app - taskViewLockToAppButtonHeight = - res.getDimensionPixelSize(R.dimen.recents_task_view_lock_to_app_button_height); - taskViewLockToAppShortAnimDuration = - res.getInteger(R.integer.recents_animate_lock_to_app_button_short_duration); - taskViewLockToAppLongAnimDuration = - res.getInteger(R.integer.recents_animate_lock_to_app_button_long_duration); - // Nav bar scrim navBarScrimEnterDuration = res.getInteger(R.integer.recents_nav_bar_scrim_enter_duration); diff --git a/packages/SystemUI/src/com/android/systemui/recents/views/AnimateableViewBounds.java b/packages/SystemUI/src/com/android/systemui/recents/views/AnimateableViewBounds.java index 5f8f3f26b594c..fb05c01e5de97 100644 --- a/packages/SystemUI/src/com/android/systemui/recents/views/AnimateableViewBounds.java +++ b/packages/SystemUI/src/com/android/systemui/recents/views/AnimateableViewBounds.java @@ -16,7 +16,6 @@ package com.android.systemui.recents.views; -import android.animation.ObjectAnimator; import android.graphics.Outline; import android.graphics.Rect; import android.view.View; @@ -35,8 +34,6 @@ public class AnimateableViewBounds extends ViewOutlineProvider { float mAlpha = 1f; final float mMinAlpha = 0.25f; - ObjectAnimator mClipBottomAnimator; - public AnimateableViewBounds(TaskView source, int cornerRadius) { mConfig = RecentsConfiguration.getInstance(); mSourceView = source; diff --git a/packages/SystemUI/src/com/android/systemui/recents/views/SystemBarScrimViews.java b/packages/SystemUI/src/com/android/systemui/recents/views/SystemBarScrimViews.java index 162897e3815ee..1086160e07e7d 100644 --- a/packages/SystemUI/src/com/android/systemui/recents/views/SystemBarScrimViews.java +++ b/packages/SystemUI/src/com/android/systemui/recents/views/SystemBarScrimViews.java @@ -64,7 +64,9 @@ public class SystemBarScrimViews { mStatusBarScrimView.setTranslationY(-mStatusBarScrimView.getMeasuredHeight()); mStatusBarScrimView.animate() .translationY(0) - .setStartDelay(mConfig.taskBarEnterAnimDelay) + .setStartDelay(mConfig.launchedFromHome ? + mConfig.transitionEnterFromHomeDelay : + mConfig.transitionEnterFromAppDelay) .setDuration(mConfig.navBarScrimEnterDuration) .setInterpolator(mConfig.quintOutInterpolator) .withStartAction(new Runnable() { @@ -79,7 +81,9 @@ public class SystemBarScrimViews { mNavBarScrimView.setTranslationY(mNavBarScrimView.getMeasuredHeight()); mNavBarScrimView.animate() .translationY(0) - .setStartDelay(mConfig.taskBarEnterAnimDelay) + .setStartDelay(mConfig.launchedFromHome ? + mConfig.transitionEnterFromHomeDelay : + mConfig.transitionEnterFromAppDelay) .setDuration(mConfig.navBarScrimEnterDuration) .setInterpolator(mConfig.quintOutInterpolator) .withStartAction(new Runnable() { @@ -101,7 +105,7 @@ public class SystemBarScrimViews { mStatusBarScrimView.animate() .translationY(-mStatusBarScrimView.getMeasuredHeight()) .setStartDelay(0) - .setDuration(mConfig.taskBarExitAnimDuration) + .setDuration(mConfig.taskViewExitToAppDuration) .setInterpolator(mConfig.fastOutSlowInInterpolator) .start(); } @@ -109,7 +113,7 @@ public class SystemBarScrimViews { mNavBarScrimView.animate() .translationY(mNavBarScrimView.getMeasuredHeight()) .setStartDelay(0) - .setDuration(mConfig.taskBarExitAnimDuration) + .setDuration(mConfig.taskViewExitToAppDuration) .setInterpolator(mConfig.fastOutSlowInInterpolator) .start(); } diff --git a/packages/SystemUI/src/com/android/systemui/recents/views/TaskStackView.java b/packages/SystemUI/src/com/android/systemui/recents/views/TaskStackView.java index 49fd792bf0a30..ae9034d4ebdf9 100644 --- a/packages/SystemUI/src/com/android/systemui/recents/views/TaskStackView.java +++ b/packages/SystemUI/src/com/android/systemui/recents/views/TaskStackView.java @@ -186,6 +186,7 @@ public class TaskStackView extends FrameLayout implements TaskStack.TaskStackCal mUIDozeTrigger.stopDozing(); mUIDozeTrigger.resetTrigger(); } + mStackScroller.reset(); } /** Requests that the views be synchronized with the model */ @@ -658,9 +659,10 @@ public class TaskStackView extends FrameLayout implements TaskStack.TaskStackCal // If this is the first layout, then scroll to the front of the stack and synchronize the // stack views immediately to load all the views if (mAwaitingFirstLayout) { - mStackScroller.setStackScrollToInitialState(); - requestSynchronizeStackViewsWithModel(); - synchronizeStackViewsWithModel(); + if (mStackScroller.setStackScrollToInitialState()) { + requestSynchronizeStackViewsWithModel(); + synchronizeStackViewsWithModel(); + } } // Measure each of the TaskViews @@ -914,7 +916,7 @@ public class TaskStackView extends FrameLayout implements TaskStack.TaskStackCal TaskView frontTv = getChildViewForTask(newFrontMostTask); if (frontTv != null) { frontTv.onTaskBound(newFrontMostTask); - frontTv.fadeInActionButton(false); + frontTv.fadeInActionButton(0, mConfig.taskViewEnterFromAppDuration); } } diff --git a/packages/SystemUI/src/com/android/systemui/recents/views/TaskStackViewScroller.java b/packages/SystemUI/src/com/android/systemui/recents/views/TaskStackViewScroller.java index 04f7c6fca64b1..f7067bece6fd0 100644 --- a/packages/SystemUI/src/com/android/systemui/recents/views/TaskStackViewScroller.java +++ b/packages/SystemUI/src/com/android/systemui/recents/views/TaskStackViewScroller.java @@ -48,6 +48,11 @@ public class TaskStackViewScroller { setStackScroll(getStackScroll()); } + /** Resets the task scroller. */ + void reset() { + mStackScrollP = 0f; + } + /** Sets the callbacks */ void setCallbacks(TaskStackViewScrollerCallbacks cb) { mCb = cb; @@ -71,9 +76,14 @@ public class TaskStackViewScroller { mStackScrollP = s; } - /** Sets the current stack scroll to the initial state when you first enter recents */ - public void setStackScrollToInitialState() { + /** + * Sets the current stack scroll to the initial state when you first enter recents. + * @return whether the stack progress changed. + */ + public boolean setStackScrollToInitialState() { + float prevStackScrollP = mStackScrollP; setStackScroll(getBoundedStackScroll(mLayoutAlgorithm.mInitialScrollP)); + return Float.compare(prevStackScrollP, mStackScrollP) != 0; } /** Bounds the current scroll if necessary */ diff --git a/packages/SystemUI/src/com/android/systemui/recents/views/TaskView.java b/packages/SystemUI/src/com/android/systemui/recents/views/TaskView.java index 790130ac6b354..fee8834411cb5 100644 --- a/packages/SystemUI/src/com/android/systemui/recents/views/TaskView.java +++ b/packages/SystemUI/src/com/android/systemui/recents/views/TaskView.java @@ -24,7 +24,6 @@ import android.graphics.*; import android.util.AttributeSet; import android.view.View; import android.view.ViewOutlineProvider; -import android.view.ViewPropertyAnimator; import android.view.animation.AccelerateInterpolator; import android.widget.FrameLayout; import com.android.systemui.R; @@ -263,24 +262,25 @@ public class TaskView extends FrameLayout implements Task.TaskCallbacks, if (Constants.DebugFlags.App.EnableThumbnailAlphaOnFrontmost) { // Animate the thumbnail alpha before the dim animation (to prevent updating the // hardware layer) - mThumbnailView.startEnterRecentsAnimation(mConfig.taskBarEnterAnimDelay, + mThumbnailView.startEnterRecentsAnimation(mConfig.transitionEnterFromAppDelay, new Runnable() { @Override public void run() { - animateDimToProgress(0, mConfig.taskBarEnterAnimDuration, + animateDimToProgress(0, mConfig.taskViewEnterFromAppDuration, ctx.postAnimationTrigger.decrementOnAnimationEnd()); } }); } else { // Immediately start the dim animation - animateDimToProgress(mConfig.taskBarEnterAnimDelay, - mConfig.taskBarEnterAnimDuration, + animateDimToProgress(mConfig.transitionEnterFromAppDelay, + mConfig.taskViewEnterFromAppDuration, ctx.postAnimationTrigger.decrementOnAnimationEnd()); } ctx.postAnimationTrigger.increment(); // Animate the action button in - fadeInActionButton(true); + fadeInActionButton(mConfig.transitionEnterFromAppDelay, + mConfig.taskViewEnterFromAppDuration); } else { // Animate the task up if it was occluding the launch target if (ctx.currentTaskOccludesLaunchTarget) { @@ -288,7 +288,7 @@ public class TaskView extends FrameLayout implements Task.TaskCallbacks, setAlpha(0f); animate().alpha(1f) .translationY(transform.translationY) - .setStartDelay(mConfig.taskBarEnterAnimDelay) + .setStartDelay(mConfig.transitionEnterFromAppDelay) .setUpdateListener(null) .setInterpolator(mConfig.fastOutSlowInInterpolator) .setDuration(mConfig.taskViewEnterFromHomeDuration) @@ -303,12 +303,12 @@ public class TaskView extends FrameLayout implements Task.TaskCallbacks, ctx.postAnimationTrigger.increment(); } } - startDelay = mConfig.taskBarEnterAnimDelay; + startDelay = mConfig.transitionEnterFromAppDelay; } else if (mConfig.launchedFromHome) { // Animate the tasks up int frontIndex = (ctx.currentStackViewCount - ctx.currentStackViewIndex - 1); - int delay = mConfig.taskViewEnterFromHomeDelay + + int delay = mConfig.transitionEnterFromHomeDelay + frontIndex * mConfig.taskViewEnterFromHomeStaggerDelay; setScaleX(transform.scale); @@ -345,19 +345,17 @@ public class TaskView extends FrameLayout implements Task.TaskCallbacks, }, (startDelay / 2)); } - public void fadeInActionButton(boolean withDelay) { + public void fadeInActionButton(int delay, int duration) { // Hide the action button mActionButtonView.setAlpha(0f); // Animate the action button in - ViewPropertyAnimator animator = mActionButtonView.animate().alpha(1f) - .setDuration(mConfig.taskBarEnterAnimDuration) + mActionButtonView.animate().alpha(1f) + .setStartDelay(delay) + .setDuration(duration) .setInterpolator(PhoneStatusBar.ALPHA_IN) - .withLayer(); - if (withDelay) { - animator.setStartDelay(mConfig.taskBarEnterAnimDelay); - } - animator.start(); + .withLayer() + .start(); } /** Animates this task view as it leaves recents by pressing home. */ @@ -383,7 +381,7 @@ public class TaskView extends FrameLayout implements Task.TaskCallbacks, // Animate the dim if (mDimAlpha > 0) { ObjectAnimator anim = ObjectAnimator.ofInt(this, "dim", 0); - anim.setDuration(mConfig.taskBarExitAnimDuration); + anim.setDuration(mConfig.taskViewExitToAppDuration); anim.setInterpolator(mConfig.fastOutLinearInInterpolator); anim.start(); } @@ -398,7 +396,7 @@ public class TaskView extends FrameLayout implements Task.TaskCallbacks, mActionButtonView.animate() .alpha(0f) .setStartDelay(0) - .setDuration(mConfig.taskBarExitAnimDuration) + .setDuration(mConfig.taskViewExitToAppDuration) .setInterpolator(mConfig.fastOutLinearInInterpolator) .withLayer() .start(); @@ -413,7 +411,7 @@ public class TaskView extends FrameLayout implements Task.TaskCallbacks, .setStartDelay(0) .setUpdateListener(null) .setInterpolator(mConfig.fastOutLinearInInterpolator) - .setDuration(mConfig.taskBarExitAnimDuration) + .setDuration(mConfig.taskViewExitToAppDuration) .start(); } } diff --git a/packages/SystemUI/src/com/android/systemui/recents/views/TaskViewHeader.java b/packages/SystemUI/src/com/android/systemui/recents/views/TaskViewHeader.java index 5de84bde822fb..1e5d9fc8a8156 100644 --- a/packages/SystemUI/src/com/android/systemui/recents/views/TaskViewHeader.java +++ b/packages/SystemUI/src/com/android/systemui/recents/views/TaskViewHeader.java @@ -235,7 +235,7 @@ public class TaskViewHeader extends FrameLayout { .alpha(0f) .setStartDelay(0) .setInterpolator(mConfig.fastOutSlowInInterpolator) - .setDuration(mConfig.taskBarExitAnimDuration) + .setDuration(mConfig.taskViewExitToAppDuration) .withLayer() .start(); } @@ -249,7 +249,7 @@ public class TaskViewHeader extends FrameLayout { .alpha(1f) .setStartDelay(0) .setInterpolator(mConfig.fastOutLinearInInterpolator) - .setDuration(mConfig.taskBarEnterAnimDuration) + .setDuration(mConfig.taskViewEnterFromAppDuration) .withLayer() .start(); } diff --git a/packages/SystemUI/src/com/android/systemui/recents/views/TaskViewThumbnail.java b/packages/SystemUI/src/com/android/systemui/recents/views/TaskViewThumbnail.java index c83248ef37d99..117a7d328692d 100644 --- a/packages/SystemUI/src/com/android/systemui/recents/views/TaskViewThumbnail.java +++ b/packages/SystemUI/src/com/android/systemui/recents/views/TaskViewThumbnail.java @@ -237,12 +237,12 @@ public class TaskViewThumbnail extends View { /** Animates this task thumbnail as it enters Recents. */ void startEnterRecentsAnimation(int delay, Runnable postAnimRunnable) { startFadeAnimation(mConfig.taskViewThumbnailAlpha, delay, - mConfig.taskBarEnterAnimDuration, postAnimRunnable); + mConfig.taskViewEnterFromAppDuration, postAnimRunnable); } /** Animates this task thumbnail as it exits Recents. */ void startLaunchTaskAnimation(Runnable postAnimRunnable) { - startFadeAnimation(1f, 0, mConfig.taskBarExitAnimDuration, postAnimRunnable); + startFadeAnimation(1f, 0, mConfig.taskViewExitToAppDuration, postAnimRunnable); } /** Starts a new thumbnail alpha animation. */