Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 7323fa91 authored by Sid Soundararajan's avatar Sid Soundararajan Committed by Android (Google) Code Review
Browse files

Merge "Add Home Recents Transition Animations" into nyc-dev

parents 80fa5906 67ed54a7
Loading
Loading
Loading
Loading
+2 −0
Original line number Diff line number Diff line
@@ -57,4 +57,6 @@
    <!-- Extra space around the PIP control button icon to match with the focused circle -->
    <dimen name="tv_pip_button_icon_padding">5dp</dimen>

    <!-- Values for entering Recents and exiting Recents -->
    <dimen name="recents_tv_home_recents_shift">125dip</dimen>
</resources>
+6 −0
Original line number Diff line number Diff line
@@ -17,5 +17,11 @@
    <integer name="item_scale_anim_duration">150</integer>
    <integer name="dismiss_short_duration">200</integer>
    <integer name="dismiss_long_duration">400</integer>

    <integer name="recents_tv_pip_focus_anim_duration">200</integer>

    <!-- Duration for how long it takes cards to slide in or out when going to and from recents. -->
    <integer name="recents_home_duration">400</integer>
    <!-- Delay between the start of slide in animation for each card. -->
    <integer name="recents_home_delay">40</integer>
</resources>
+42 −15
Original line number Diff line number Diff line
@@ -37,14 +37,12 @@ import com.android.systemui.recents.events.EventBus;
import com.android.systemui.recents.events.activity.CancelEnterRecentsWindowAnimationEvent;
import com.android.systemui.recents.events.activity.DismissRecentsToHomeAnimationStarted;
import com.android.systemui.recents.events.activity.EnterRecentsWindowAnimationCompletedEvent;
import com.android.systemui.recents.events.activity.EnterRecentsWindowLastAnimationFrameEvent;
import com.android.systemui.recents.events.activity.HideRecentsEvent;
import com.android.systemui.recents.events.activity.LaunchTaskFailedEvent;
import com.android.systemui.recents.events.activity.ToggleRecentsEvent;
import com.android.systemui.recents.events.component.RecentsVisibilityChangedEvent;
import com.android.systemui.recents.events.ui.AllTaskViewsDismissedEvent;
import com.android.systemui.recents.events.ui.DeleteTaskDataEvent;
import com.android.systemui.recents.events.ui.UpdateFreeformTaskViewVisibilityEvent;
import com.android.systemui.recents.events.ui.UserInteractionEvent;
import com.android.systemui.recents.events.ui.focus.DismissFocusedTaskViewEvent;
import com.android.systemui.recents.misc.SystemServicesProxy;
@@ -53,7 +51,9 @@ import com.android.systemui.recents.model.RecentsTaskLoadPlan;
import com.android.systemui.recents.model.RecentsTaskLoader;
import com.android.systemui.recents.model.Task;
import com.android.systemui.recents.model.TaskStack;
import com.android.systemui.recents.tv.animations.HomeRecentsEnterExitAnimationHolder;
import com.android.systemui.recents.tv.views.RecentsTvView;
import com.android.systemui.recents.tv.views.TaskStackHorizontalGridView;
import com.android.systemui.recents.tv.views.TaskStackHorizontalViewAdapter;
import com.android.systemui.statusbar.BaseStatusBar;
import com.android.systemui.tv.pip.PipManager;
@@ -76,11 +76,14 @@ public class RecentsTvActivity extends Activity implements OnPreDrawListener {
    private RecentsPackageMonitor mPackageMonitor;
    private long mLastTabKeyEventTime;
    private boolean mIgnoreAltTabRelease;
    private boolean mLaunchedFromHome;

    private RecentsTvView mRecentsView;
    private View mPipView;
    private TaskStackHorizontalViewAdapter mTaskStackViewAdapter;
    private TaskStackHorizontalGridView mTaskStackHorizontalGridView;
    private FinishRecentsRunnable mFinishLaunchHomeRunnable;
    private HomeRecentsEnterExitAnimationHolder mHomeRecentsEnterExitAnimationHolder;

    private final PipManager mPipManager = PipManager.getInstance();
    private final PipManager.Listener mPipListener = new PipManager.Listener() {
@@ -174,6 +177,7 @@ public class RecentsTvActivity extends Activity implements OnPreDrawListener {
        if (!plan.hasTasks()) {
            loader.preloadTasks(plan, -1, launchState.launchedFromHome);
        }
        mLaunchedFromHome = launchState.launchedFromHome;
        TaskStack stack = plan.getTaskStack();
        RecentsTaskLoadPlan.Options loadOpts = new RecentsTaskLoadPlan.Options();
        loadOpts.runningTaskId = launchState.launchedToTaskId;
@@ -187,7 +191,8 @@ public class RecentsTvActivity extends Activity implements OnPreDrawListener {
        Collections.reverse(stackTasks);
        if (mTaskStackViewAdapter == null) {
            mTaskStackViewAdapter = new TaskStackHorizontalViewAdapter(stackTasks);
            mRecentsView.setTaskStackViewAdapter(mTaskStackViewAdapter);
            mTaskStackHorizontalGridView = mRecentsView
                    .setTaskStackViewAdapter(mTaskStackViewAdapter);
        } else {
            mTaskStackViewAdapter.setNewStackTasks(stackTasks);
        }
@@ -229,17 +234,24 @@ public class RecentsTvActivity extends Activity implements OnPreDrawListener {
    }

    void dismissRecentsToHome(boolean animateTaskViews) {
        DismissRecentsToHomeAnimationStarted dismissEvent =
                new DismissRecentsToHomeAnimationStarted(animateTaskViews);
        dismissEvent.addPostAnimationCallback(mFinishLaunchHomeRunnable);
        dismissEvent.addPostAnimationCallback(new Runnable() {
        Runnable closeSystemWindows = new Runnable() {
            @Override
            public void run() {
                Recents.getSystemServices().sendCloseSystemWindows(
                        BaseStatusBar.SYSTEM_DIALOG_REASON_HOME_KEY);
            }
        });
        EventBus.getDefault().send(dismissEvent);
        };
        DismissRecentsToHomeAnimationStarted dismissEvent =
                new DismissRecentsToHomeAnimationStarted(animateTaskViews);
        dismissEvent.addPostAnimationCallback(mFinishLaunchHomeRunnable);
        dismissEvent.addPostAnimationCallback(closeSystemWindows);

        if(mTaskStackHorizontalGridView.getChildCount() > 0) {
            mHomeRecentsEnterExitAnimationHolder.startExitAnimation(dismissEvent);
        } else {
            closeSystemWindows.run();
            mFinishLaunchHomeRunnable.run();
        }
    }

    boolean dismissRecentsToHomeIfVisible(boolean animated) {
@@ -319,6 +331,19 @@ public class RecentsTvActivity extends Activity implements OnPreDrawListener {
        // Update the recent tasks
        updateRecentsTasks();

        mHomeRecentsEnterExitAnimationHolder = new HomeRecentsEnterExitAnimationHolder(
                getApplicationContext(), mTaskStackHorizontalGridView);
        if(mTaskStackHorizontalGridView != null &&
                mTaskStackHorizontalGridView.getChildCount() > 0) {
            if(mLaunchedFromHome) {
                mHomeRecentsEnterExitAnimationHolder.setEnterFromHomeStartingAnimationValues();
            } else {
                mHomeRecentsEnterExitAnimationHolder.setEnterFromAppStartingAnimationValues();
            }
        } else {
            mRecentsView.getViewTreeObserver().addOnPreDrawListener(this);
        }

        // If this is a new instance from a configuration change, then we have to manually trigger
        // the enter animation state, or if recents was relaunched by AM, without going through
        // the normal mechanisms
@@ -340,6 +365,9 @@ public class RecentsTvActivity extends Activity implements OnPreDrawListener {
    @Override
    public void onEnterAnimationComplete() {
        super.onEnterAnimationComplete();
        if(mLaunchedFromHome) {
            mHomeRecentsEnterExitAnimationHolder.startEnterAnimation();
        }
        EventBus.getDefault().send(new EnterRecentsWindowAnimationCompletedEvent());
    }

@@ -444,12 +472,6 @@ public class RecentsTvActivity extends Activity implements OnPreDrawListener {
        }
    }

    public final void onBusEvent(EnterRecentsWindowLastAnimationFrameEvent event) {
        EventBus.getDefault().send(new UpdateFreeformTaskViewVisibilityEvent(true));
        mRecentsView.getViewTreeObserver().addOnPreDrawListener(this);
        mRecentsView.invalidate();
    }

    public final void onBusEvent(CancelEnterRecentsWindowAnimationEvent event) {
        RecentsActivityLaunchState launchState = Recents.getConfiguration().getLaunchState();
        int launchToTaskId = launchState.launchedToTaskId;
@@ -489,6 +511,11 @@ public class RecentsTvActivity extends Activity implements OnPreDrawListener {
    @Override
    public boolean onPreDraw() {
        mRecentsView.getViewTreeObserver().removeOnPreDrawListener(this);
        if(mLaunchedFromHome) {
            mHomeRecentsEnterExitAnimationHolder.setEnterFromHomeStartingAnimationValues();
        } else {
            mHomeRecentsEnterExitAnimationHolder.setEnterFromAppStartingAnimationValues();
        }
        // We post to make sure that this information is delivered after this traversals is
        // finished.
        mRecentsView.post(new Runnable() {
+12 −10
Original line number Diff line number Diff line
@@ -25,6 +25,7 @@ import android.graphics.Rect;
import android.os.SystemClock;
import android.os.UserHandle;

import com.android.systemui.SystemUIApplication;
import com.android.systemui.recents.Recents;
import com.android.systemui.recents.RecentsActivityLaunchState;
import com.android.systemui.recents.RecentsConfiguration;
@@ -34,6 +35,7 @@ import com.android.systemui.recents.events.activity.RecentsActivityStartingEvent
import com.android.systemui.recents.model.RecentsTaskLoader;
import com.android.systemui.recents.model.TaskStack;
import com.android.systemui.recents.tv.views.TaskCardView;
import com.android.systemui.statusbar.tv.TvStatusBar;

public class RecentsTvImpl extends RecentsImpl{
    public final static String RECENTS_TV_ACTIVITY =
@@ -81,16 +83,7 @@ public class RecentsTvImpl extends RecentsImpl{
        }

        if (!useThumbnailTransition) {
            // If there is no thumbnail transition, but is launching from home into recents, then
            // use a quick home transition and do the animation from home
            if (hasRecentTasks) {
                ActivityOptions opts = getHomeTransitionActivityOptions();
                startRecentsActivity(topTask, opts, true /* fromHome */, false /* fromThumbnail */);
            } else {
                // Otherwise we do the normal fade from an unknown source
                ActivityOptions opts = getUnknownTransitionActivityOptions();
                startRecentsActivity(topTask, opts, true /* fromHome */, false /* fromThumbnail */);
            }
            startRecentsActivity(topTask, null, true /* fromHome */, false /* fromThumbnail */);
        }
        mLastToggleTime = SystemClock.elapsedRealtime();
    }
@@ -134,4 +127,13 @@ public class RecentsTvImpl extends RecentsImpl{
        // If both the screenshot and thumbnail fails, then just fall back to the default transition
        return getUnknownTransitionActivityOptions();
    }

    @Override
    public void onVisibilityChanged(Context context, boolean visible) {
        SystemUIApplication app = (SystemUIApplication) context;
        TvStatusBar statusBar = app.getComponent(TvStatusBar.class);
        if (statusBar != null) {
            statusBar.updateRecentsVisibility(visible);
        }
    }
}
+29 −26
Original line number Diff line number Diff line
@@ -18,9 +18,8 @@ package com.android.systemui.recents.tv.animations;

import android.animation.Animator;
import android.content.res.Resources;
import android.support.v4.view.animation.FastOutSlowInInterpolator;
import android.view.View;
import android.widget.LinearLayout;
import com.android.systemui.Interpolators;
import com.android.systemui.recents.tv.views.TaskCardView;

import com.android.systemui.R;
@@ -28,7 +27,6 @@ import com.android.systemui.R;
public class DismissAnimationsHolder {
    private LinearLayout mDismissArea;
    private LinearLayout mTaskCardView;
    private FastOutSlowInInterpolator mFastOutSlowIn;
    private int mCardYDelta;
    private long mShortDuration;
    private long mLongDuration;
@@ -36,7 +34,6 @@ public class DismissAnimationsHolder {
    public DismissAnimationsHolder(TaskCardView taskCardView) {
        mTaskCardView = (LinearLayout) taskCardView.findViewById(R.id.recents_tv_card);
        mDismissArea = (LinearLayout) taskCardView.findViewById(R.id.card_dismiss);
        mFastOutSlowIn = new FastOutSlowInInterpolator();

        Resources res = taskCardView.getResources();
        mCardYDelta = res.getDimensionPixelOffset(R.dimen.recents_tv_dismiss_shift_down);
@@ -45,36 +42,42 @@ public class DismissAnimationsHolder {
    }

    public void startEnterAnimation() {
        mDismissArea.animate().setDuration(mShortDuration);
        mDismissArea.animate().setInterpolator(mFastOutSlowIn);
        mDismissArea.animate().alpha(1.0f);
        mDismissArea.animate()
                .setDuration(mShortDuration)
                .setInterpolator(Interpolators.FAST_OUT_SLOW_IN)
                .alpha(1.0f);

        mTaskCardView.animate().setDuration(mShortDuration);
        mTaskCardView.animate().setInterpolator(mFastOutSlowIn);
        mTaskCardView.animate().translationYBy(mCardYDelta);
        mTaskCardView.animate().alpha(0.5f);
        mTaskCardView.animate()
                .setDuration(mShortDuration)
                .setInterpolator(Interpolators.FAST_OUT_SLOW_IN)
                .translationYBy(mCardYDelta)
                .alpha(0.5f);
    }

    public void startExitAnimation() {
        mDismissArea.animate().setDuration(mShortDuration);
        mDismissArea.animate().setInterpolator(mFastOutSlowIn);
        mDismissArea.animate().alpha(0.0f);
        mDismissArea.animate()
                .setDuration(mShortDuration)
                .setInterpolator(Interpolators.FAST_OUT_SLOW_IN)
                .alpha(0.0f);

        mTaskCardView.animate().setDuration(mShortDuration);
        mTaskCardView.animate().setInterpolator(mFastOutSlowIn);
        mTaskCardView.animate().translationYBy(-mCardYDelta);
        mTaskCardView.animate().alpha(1.0f);
        mTaskCardView.animate()
                .setDuration(mShortDuration)
                .setInterpolator(Interpolators.FAST_OUT_SLOW_IN)
                .translationYBy(-mCardYDelta)
                .alpha(1.0f);
    }

    public void startDismissAnimation(Animator.AnimatorListener listener) {
        mDismissArea.animate().setDuration(mShortDuration);
        mDismissArea.animate().setInterpolator(mFastOutSlowIn);
        mDismissArea.animate().alpha(0.0f);
        mDismissArea.animate()
                .setDuration(mShortDuration)
                .setInterpolator(Interpolators.FAST_OUT_SLOW_IN)
                .alpha(0.0f);

        mTaskCardView.animate().setDuration(mLongDuration);
        mTaskCardView.animate().setInterpolator(mFastOutSlowIn);
        mTaskCardView.animate().translationYBy(mCardYDelta);
        mTaskCardView.animate().alpha(0.0f);
        mTaskCardView.animate().setListener(listener);
        mTaskCardView.animate()
                .setDuration(mLongDuration)
                .setInterpolator(Interpolators.FAST_OUT_SLOW_IN)
                .translationYBy(mCardYDelta)
                .alpha(0.0f)
                .setListener(listener);
    }
}
Loading