From 7f522a25c39ceb35aa009f029abe74497f03c403 Mon Sep 17 00:00:00 2001 From: Jon Miranda Date: Fri, 28 Jul 2017 11:56:47 -0700 Subject: Optimizations to reduce all apps jank. * Since adding springs to the apps in All Apps, it is no longer efficient to build a hardware layer for it. * Pre-uploads bitmaps to RenderThread. * Only add overview animations if we are transitioning to/from it. Bug: 63711551 Change-Id: I948267598e95ec59dc156acb9abe6b5b789110c0 --- src/com/android/launcher3/BubbleTextView.java | 3 ++ .../LauncherStateTransitionAnimation.java | 6 ++-- .../WorkspaceStateTransitionAnimation.java | 36 +++++++++++++--------- 3 files changed, 29 insertions(+), 16 deletions(-) diff --git a/src/com/android/launcher3/BubbleTextView.java b/src/com/android/launcher3/BubbleTextView.java index aeb82b376..a63767c5d 100644 --- a/src/com/android/launcher3/BubbleTextView.java +++ b/src/com/android/launcher3/BubbleTextView.java @@ -592,6 +592,9 @@ public class BubbleTextView extends TextView implements ItemInfoUpdateReceiver { mIconLoadRequest = null; mDisableRelayout = true; + // Optimization: Starting in N, pre-uploads the bitmap to RenderThread. + info.iconBitmap.prepareToDraw(); + if (info instanceof AppInfo) { applyFromApplicationInfo((AppInfo) info); } else if (info instanceof ShortcutInfo) { diff --git a/src/com/android/launcher3/LauncherStateTransitionAnimation.java b/src/com/android/launcher3/LauncherStateTransitionAnimation.java index 44b9704f2..9ff61ec98 100644 --- a/src/com/android/launcher3/LauncherStateTransitionAnimation.java +++ b/src/com/android/launcher3/LauncherStateTransitionAnimation.java @@ -338,8 +338,10 @@ public class LauncherStateTransitionAnimation { toView.post(new StartAnimRunnable(animation, toView)); mCurrentAnimation = animation; } else if (animType == PULLUP) { - // We are animating the content view alpha, so ensure we have a layer for it - layerViews.addView(contentView); + if (!FeatureFlags.LAUNCHER3_PHYSICS) { + // We are animating the content view alpha, so ensure we have a layer for it. + layerViews.addView(contentView); + } animation.addListener(new AnimatorListenerAdapter() { @Override diff --git a/src/com/android/launcher3/WorkspaceStateTransitionAnimation.java b/src/com/android/launcher3/WorkspaceStateTransitionAnimation.java index 32deaf286..76772dce4 100644 --- a/src/com/android/launcher3/WorkspaceStateTransitionAnimation.java +++ b/src/com/android/launcher3/WorkspaceStateTransitionAnimation.java @@ -274,7 +274,6 @@ public class WorkspaceStateTransitionAnimation { 1.0f : 0f; float finalHotseatAlpha = (states.stateIsNormal || states.stateIsSpringLoaded || (FeatureFlags.LAUNCHER3_ALL_APPS_PULL_UP && states.stateIsNormalHidden)) ? 1f : 0f; - float finalOverviewPanelAlpha = states.stateIsOverview ? 1f : 0f; float finalQsbAlpha = (states.stateIsNormal || (FeatureFlags.LAUNCHER3_ALL_APPS_PULL_UP && states.stateIsNormalHidden)) ? 1f : 0f; @@ -359,38 +358,47 @@ public class WorkspaceStateTransitionAnimation { final ViewGroup overviewPanel = mLauncher.getOverviewPanel(); + float finalOverviewPanelAlpha = states.stateIsOverview ? 1f : 0f; if (animated) { + // This is true when transitioning between: + // - Overview <-> Workspace + // - Overview <-> Widget Tray + if (finalOverviewPanelAlpha != overviewPanel.getAlpha()) { + Animator overviewPanelAlpha = ObjectAnimator.ofFloat( + overviewPanel, View.ALPHA, finalOverviewPanelAlpha); + overviewPanelAlpha.addListener(new AlphaUpdateListener(overviewPanel, + accessibilityEnabled)); + layerViews.addView(overviewPanel); + + if (states.overviewToWorkspace) { + overviewPanelAlpha.setInterpolator(new DecelerateInterpolator(2)); + } else if (states.workspaceToOverview) { + overviewPanelAlpha.setInterpolator(null); + } + + overviewPanelAlpha.setDuration(duration); + mStateAnimator.play(overviewPanelAlpha); + } + Animator scale = LauncherAnimUtils.ofPropertyValuesHolder(mWorkspace, new PropertyListBuilder().scale(mNewScale) .translationY(finalWorkspaceTranslationY).build()) .setDuration(duration); scale.setInterpolator(mZoomInInterpolator); mStateAnimator.play(scale); - Animator hotseatAlpha = mWorkspace.createHotseatAlphaAnimator(finalHotseatAlpha); - - Animator overviewPanelAlpha = ObjectAnimator.ofFloat( - overviewPanel, View.ALPHA, finalOverviewPanelAlpha); - overviewPanelAlpha.addListener(new AlphaUpdateListener(overviewPanel, - accessibilityEnabled)); // For animation optimization, we may need to provide the Launcher transition // with a set of views on which to force build and manage layers in certain scenarios. - layerViews.addView(overviewPanel); layerViews.addView(mLauncher.getHotseat()); layerViews.addView(mWorkspace.getPageIndicator()); + Animator hotseatAlpha = mWorkspace.createHotseatAlphaAnimator(finalHotseatAlpha); if (states.workspaceToOverview) { hotseatAlpha.setInterpolator(new DecelerateInterpolator(2)); - overviewPanelAlpha.setInterpolator(null); } else if (states.overviewToWorkspace) { hotseatAlpha.setInterpolator(null); - overviewPanelAlpha.setInterpolator(new DecelerateInterpolator(2)); } - - overviewPanelAlpha.setDuration(duration); hotseatAlpha.setDuration(duration); - - mStateAnimator.play(overviewPanelAlpha); mStateAnimator.play(hotseatAlpha); mStateAnimator.addListener(new AnimatorListenerAdapter() { boolean canceled = false; -- cgit v1.2.3