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

Commit 707843f7 authored by shawnlin's avatar shawnlin
Browse files

Attached the navigation bar to app for launching from notification

- Play the nav bar fade-out animation at the same time when the app
  launching animation starts and make the fade-in animation ends at the
  same time when app launching animation ends.
- To make the nav bar fade-in animation looks like it's attached to the
  app, apply crop rect and translation that the app targets apply to the
  nav target.

Bug: 181638132
Test: manual: click on notification item to launch an activity and
observe the navigation bar animation.

Change-Id: I85b6d68cc91fb38774a22a9665da41c244af6aa9
parent 2a12cfad
Loading
Loading
Loading
Loading
+55 −0
Original line number Diff line number Diff line
@@ -16,6 +16,8 @@

package com.android.systemui.statusbar.notification;

import static android.view.WindowManager.LayoutParams.TYPE_NAVIGATION_BAR;

import static com.android.internal.jank.InteractionJankMonitor.CUJ_NOTIFICATION_APP_START;

import android.animation.Animator;
@@ -34,6 +36,8 @@ import android.view.SyncRtSurfaceTransactionApplier;
import android.view.SyncRtSurfaceTransactionApplier.SurfaceParams;
import android.view.View;
import android.view.WindowManager;
import android.view.animation.Interpolator;
import android.view.animation.PathInterpolator;

import com.android.internal.jank.InteractionJankMonitor;
import com.android.internal.policy.ScreenDecorationsUtils;
@@ -59,6 +63,14 @@ public class ActivityLaunchAnimator {
    public static final long ANIMATION_DELAY_ICON_FADE_IN = ANIMATION_DURATION -
            CollapsedStatusBarFragment.FADE_IN_DURATION - CollapsedStatusBarFragment.FADE_IN_DELAY
            - 16;
    private static final int ANIMATION_DURATION_NAV_FADE_IN = 266;
    private static final int ANIMATION_DURATION_NAV_FADE_OUT = 133;
    private static final long ANIMATION_DELAY_NAV_FADE_IN =
            ANIMATION_DURATION - ANIMATION_DURATION_NAV_FADE_IN;
    private static final Interpolator NAV_FADE_IN_INTERPOLATOR =
            new PathInterpolator(0f, 0f, 0f, 1f);
    private static final Interpolator NAV_FADE_OUT_INTERPOLATOR =
            new PathInterpolator(0.2f, 0f, 1f, 1f);
    private static final long LAUNCH_TIMEOUT = 500;
    private final NotificationPanelViewController mNotificationPanel;
    private final NotificationListContainer mNotificationContainer;
@@ -208,6 +220,8 @@ public class ActivityLaunchAnimator {
                int notificationHeight = Math.max(mSourceNotification.getActualHeight()
                        - mSourceNotification.getClipBottomAmount(), 0);
                int notificationWidth = mSourceNotification.getWidth();
                final RemoteAnimationTarget navigationBarTarget =
                        getNavBarRemoteAnimationTarget(remoteAnimationNonAppTargets);
                anim.setDuration(ANIMATION_DURATION);
                anim.setInterpolator(Interpolators.LINEAR);
                anim.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
@@ -234,6 +248,7 @@ public class ActivityLaunchAnimator {
                        applyParamsToWindow(primary);
                        applyParamsToNotification(mParams);
                        applyParamsToNotificationShade(mParams);
                        applyNavigationBarParamsToWindow(navigationBarTarget);
                    }
                });
                anim.addListener(new AnimatorListenerAdapter() {
@@ -286,6 +301,18 @@ public class ActivityLaunchAnimator {
            return primary;
        }

        private RemoteAnimationTarget getNavBarRemoteAnimationTarget(
                RemoteAnimationTarget[] remoteAnimationTargets) {
            RemoteAnimationTarget navBar = null;
            for (RemoteAnimationTarget target : remoteAnimationTargets) {
                if (target.windowType == TYPE_NAVIGATION_BAR) {
                    navBar = target;
                    break;
                }
            }
            return navBar;
        }

        private void setExpandAnimationRunning(boolean running) {
            mNotificationPanel.setLaunchingNotification(running);
            mSourceNotification.setExpandAnimationRunning(running);
@@ -326,6 +353,34 @@ public class ActivityLaunchAnimator {
            mSyncRtTransactionApplier.scheduleApply(params);
        }

        private void applyNavigationBarParamsToWindow(RemoteAnimationTarget navBarTarget) {
            if (navBarTarget == null) {
                return;
            }

            // calculate navigation bar fade-out progress
            final float fadeOutProgress = mParams.getProgress(0,
                    ANIMATION_DURATION_NAV_FADE_OUT);

            // calculate navigation bar fade-in progress
            final float fadeInProgress = mParams.getProgress(ANIMATION_DELAY_NAV_FADE_IN,
                    ANIMATION_DURATION_NAV_FADE_OUT);

            final SurfaceParams.Builder builder = new SurfaceParams.Builder(navBarTarget.leash);
            if (fadeInProgress > 0) {
                Matrix m = new Matrix();
                m.postTranslate(0, (float) (mParams.top - navBarTarget.position.y));
                mWindowCrop.set(mParams.left, 0, mParams.right, mParams.getHeight());
                builder.withMatrix(m)
                        .withWindowCrop(mWindowCrop)
                        .withVisibility(true);
                builder.withAlpha(NAV_FADE_IN_INTERPOLATOR.getInterpolation(fadeInProgress));
            } else {
                builder.withAlpha(1f - NAV_FADE_OUT_INTERPOLATOR.getInterpolation(fadeOutProgress));
            }
            mSyncRtTransactionApplier.scheduleApply(builder.build());
        }

        @Override
        public void onAnimationCancelled() throws RemoteException {
            mMainExecutor.execute(() -> {