From e5575f9fff4dc008611a93344e3b59fe2531f375 Mon Sep 17 00:00:00 2001 From: Tracy Zhou Date: Thu, 19 Apr 2018 11:12:53 -0700 Subject: Implement all apps discovery bounce. Mock: https://docs.google.com/presentation/d/1TCp1mREgsFAWq4hCnUaSRCpaqvDbzCVkN1mJuRMylIg/edit#slide=id.g36a3e190fb_0_6 Demo video: go/shelf_bounce_animation Fixes: 70180942 Test: manual test Change-Id: I6ecceb63612dd63cea62f2e6cb19d7522f3d76e0 --- .../launcher3/uioverrides/AllAppsState.java | 6 +-- .../launcher3/uioverrides/OverviewState.java | 7 +++ .../android/quickstep/ActivityControlHelper.java | 13 +++++ .../quickstep/WindowTransformSwipeHandler.java | 1 + src/com/android/launcher3/Launcher.java | 2 +- .../android/launcher3/allapps/DiscoveryBounce.java | 57 ++++++++++++++++++---- .../launcher3/uioverrides/AllAppsState.java | 6 +-- 7 files changed, 75 insertions(+), 17 deletions(-) diff --git a/quickstep/src/com/android/launcher3/uioverrides/AllAppsState.java b/quickstep/src/com/android/launcher3/uioverrides/AllAppsState.java index d2f54874f..7da50c883 100644 --- a/quickstep/src/com/android/launcher3/uioverrides/AllAppsState.java +++ b/quickstep/src/com/android/launcher3/uioverrides/AllAppsState.java @@ -16,7 +16,7 @@ package com.android.launcher3.uioverrides; import static com.android.launcher3.LauncherAnimUtils.ALL_APPS_TRANSITION_MS; -import static com.android.launcher3.allapps.DiscoveryBounce.APPS_VIEW_SHOWN; +import static com.android.launcher3.allapps.DiscoveryBounce.SHELF_BOUNCE_SEEN; import static com.android.launcher3.anim.Interpolators.DEACCEL_2; import android.view.View; @@ -47,8 +47,8 @@ public class AllAppsState extends LauncherState { @Override public void onStateEnabled(Launcher launcher) { - if (!launcher.getSharedPrefs().getBoolean(APPS_VIEW_SHOWN, false)) { - launcher.getSharedPrefs().edit().putBoolean(APPS_VIEW_SHOWN, true).apply(); + if (!launcher.getSharedPrefs().getBoolean(SHELF_BOUNCE_SEEN, false)) { + launcher.getSharedPrefs().edit().putBoolean(SHELF_BOUNCE_SEEN, true).apply(); } AbstractFloatingView.closeAllOpenViews(launcher); diff --git a/quickstep/src/com/android/launcher3/uioverrides/OverviewState.java b/quickstep/src/com/android/launcher3/uioverrides/OverviewState.java index 026f059f7..61422e02f 100644 --- a/quickstep/src/com/android/launcher3/uioverrides/OverviewState.java +++ b/quickstep/src/com/android/launcher3/uioverrides/OverviewState.java @@ -16,6 +16,7 @@ package com.android.launcher3.uioverrides; import static com.android.launcher3.LauncherAnimUtils.OVERVIEW_TRANSITION_MS; +import static com.android.launcher3.allapps.DiscoveryBounce.HOME_BOUNCE_SEEN; import static com.android.launcher3.anim.Interpolators.DEACCEL_2; import static com.android.launcher3.states.RotationHelper.REQUEST_ROTATE; @@ -25,6 +26,7 @@ import com.android.launcher3.AbstractFloatingView; import com.android.launcher3.DeviceProfile; import com.android.launcher3.Launcher; import com.android.launcher3.LauncherState; +import com.android.launcher3.allapps.DiscoveryBounce; import com.android.launcher3.userevent.nano.LauncherLogProto.ContainerType; import com.android.quickstep.views.RecentsView; @@ -57,6 +59,10 @@ public class OverviewState extends LauncherState { @Override public void onStateEnabled(Launcher launcher) { + if (!launcher.getSharedPrefs().getBoolean(HOME_BOUNCE_SEEN, false)) { + launcher.getSharedPrefs().edit().putBoolean(HOME_BOUNCE_SEEN, true).apply(); + } + RecentsView rv = launcher.getOverviewPanel(); rv.setOverviewStateEnabled(true); AbstractFloatingView.closeAllOpenViews(launcher); @@ -71,6 +77,7 @@ public class OverviewState extends LauncherState { @Override public void onStateTransitionEnd(Launcher launcher) { launcher.getRotationHelper().setCurrentStateRequest(REQUEST_ROTATE); + DiscoveryBounce.showForOverviewIfNeeded(launcher); } @Override diff --git a/quickstep/src/com/android/quickstep/ActivityControlHelper.java b/quickstep/src/com/android/quickstep/ActivityControlHelper.java index 0ea729f28..7de19b811 100644 --- a/quickstep/src/com/android/quickstep/ActivityControlHelper.java +++ b/quickstep/src/com/android/quickstep/ActivityControlHelper.java @@ -39,6 +39,7 @@ import com.android.launcher3.LauncherAppState; import com.android.launcher3.LauncherInitListener; import com.android.launcher3.LauncherState; import com.android.launcher3.allapps.AllAppsTransitionController; +import com.android.launcher3.allapps.DiscoveryBounce; import com.android.launcher3.anim.AnimatorPlaybackController; import com.android.launcher3.util.ViewOnDrawExecutor; import com.android.quickstep.util.LayoutUtils; @@ -83,6 +84,8 @@ public interface ActivityControlHelper { ActivityInitListener createActivityInitListener(BiPredicate onInitListener); + void onOverviewShown(T activity); + @Nullable T getCreatedActivity(); @@ -225,6 +228,11 @@ public interface ActivityControlHelper { return new LauncherInitListener(onInitListener); } + @Override + public void onOverviewShown(Launcher launcher) { + DiscoveryBounce.showForOverviewIfNeeded(launcher); + } + @Nullable @Override public Launcher getCreatedActivity() { @@ -366,6 +374,11 @@ public interface ActivityControlHelper { return new RecentsActivityTracker(onInitListener); } + @Override + public void onOverviewShown(RecentsActivity activity) { + // Do nothing. + } + @Nullable @Override public RecentsActivity getCreatedActivity() { diff --git a/quickstep/src/com/android/quickstep/WindowTransformSwipeHandler.java b/quickstep/src/com/android/quickstep/WindowTransformSwipeHandler.java index 0944a7a26..51f6a6fca 100644 --- a/quickstep/src/com/android/quickstep/WindowTransformSwipeHandler.java +++ b/quickstep/src/com/android/quickstep/WindowTransformSwipeHandler.java @@ -699,6 +699,7 @@ public class WindowTransformSwipeHandler { finishTransitionRunnable.run(); } RecentsModel.getInstance(mContext).onOverviewShown(false, TAG); + mActivityControlHelper.onOverviewShown(mActivity); doLogGesture(true /* toLauncher */); } diff --git a/src/com/android/launcher3/Launcher.java b/src/com/android/launcher3/Launcher.java index ec0a8ffb3..0eeec70f0 100644 --- a/src/com/android/launcher3/Launcher.java +++ b/src/com/android/launcher3/Launcher.java @@ -787,7 +787,7 @@ public class Launcher extends BaseDraggingActivity // Refresh shortcuts if the permission changed. mModel.refreshShortcutsIfRequired(); - DiscoveryBounce.showIfNeeded(this); + DiscoveryBounce.showForHomeIfNeeded(this); if (mLauncherCallbacks != null) { mLauncherCallbacks.onResume(); } diff --git a/src/com/android/launcher3/allapps/DiscoveryBounce.java b/src/com/android/launcher3/allapps/DiscoveryBounce.java index fddafb2a6..0ce33bcc6 100644 --- a/src/com/android/launcher3/allapps/DiscoveryBounce.java +++ b/src/com/android/launcher3/allapps/DiscoveryBounce.java @@ -1,5 +1,5 @@ /* - * Copyright (C) 2017 The Android Open Source Project + * Copyright (C) 2018 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -17,13 +17,18 @@ package com.android.launcher3.allapps; import static com.android.launcher3.LauncherState.NORMAL; +import static com.android.launcher3.LauncherState.OVERVIEW; import android.animation.Animator; import android.animation.AnimatorInflater; import android.animation.AnimatorListenerAdapter; +import android.animation.Keyframe; +import android.animation.ObjectAnimator; +import android.animation.PropertyValuesHolder; +import android.animation.TimeInterpolator; import android.app.ActivityManager; -import android.content.Context; import android.view.MotionEvent; +import android.view.animation.PathInterpolator; import com.android.launcher3.AbstractFloatingView; import com.android.launcher3.Launcher; @@ -31,21 +36,21 @@ import com.android.launcher3.R; import com.android.launcher3.compat.UserManagerCompat; /** - * Floating view responsible for showing discovery bounce animation + * Abstract base class of floating view responsible for showing discovery bounce animation */ public class DiscoveryBounce extends AbstractFloatingView { - public static final String APPS_VIEW_SHOWN = "launcher.apps_view_shown"; + public static final String HOME_BOUNCE_SEEN = "launcher.apps_view_shown"; + public static final String SHELF_BOUNCE_SEEN = "launcher.shelf_bounce_seen"; private final Launcher mLauncher; private final Animator mDiscoBounceAnimation; - public DiscoveryBounce(Launcher launcher) { + public DiscoveryBounce(Launcher launcher, Animator animator) { super(launcher, null); mLauncher = launcher; - mDiscoBounceAnimation = AnimatorInflater.loadAnimator(mLauncher, - R.animator.discovery_bounce); + mDiscoBounceAnimation = animator; AllAppsTransitionController controller = mLauncher.getAllAppsController(); mDiscoBounceAnimation.setTarget(controller); mDiscoBounceAnimation.addListener(controller.getProgressAnimatorListener()); @@ -96,16 +101,48 @@ public class DiscoveryBounce extends AbstractFloatingView { return (type & TYPE_ON_BOARD_POPUP) != 0; } - public static void showIfNeeded(Launcher launcher) { + public static void showForHomeIfNeeded(Launcher launcher) { if (!launcher.isInState(NORMAL) - || launcher.getSharedPrefs().getBoolean(APPS_VIEW_SHOWN, false) + || launcher.getSharedPrefs().getBoolean(HOME_BOUNCE_SEEN, false) || AbstractFloatingView.getTopOpenView(launcher) != null || UserManagerCompat.getInstance(launcher).isDemoUser() || ActivityManager.isRunningInTestHarness()) { return; } - DiscoveryBounce view = new DiscoveryBounce(launcher); + DiscoveryBounce view = new DiscoveryBounce(launcher, + AnimatorInflater.loadAnimator(launcher, R.animator.discovery_bounce)); + view.mIsOpen = true; + launcher.getDragLayer().addView(view); + } + + public static void showForOverviewIfNeeded(Launcher launcher) { + if (!launcher.isInState(OVERVIEW) + || launcher.getDeviceProfile().isVerticalBarLayout() + || launcher.getSharedPrefs().getBoolean(SHELF_BOUNCE_SEEN, false) + || UserManagerCompat.getInstance(launcher).isDemoUser() + || ActivityManager.isRunningInTestHarness()) { + return; + } + + float verticalProgress = OVERVIEW.getVerticalProgress(launcher); + + TimeInterpolator pathInterpolator = new PathInterpolator(0.35f, 0, 0.5f, 1); + Keyframe keyframe3 = Keyframe.ofFloat(0.423f, verticalProgress - (1 - 0.9438f)); + keyframe3.setInterpolator(pathInterpolator); + Keyframe keyframe4 = Keyframe.ofFloat(0.654f, verticalProgress); + keyframe4.setInterpolator(pathInterpolator); + + PropertyValuesHolder propertyValuesHolder = PropertyValuesHolder.ofKeyframe("progress", + Keyframe.ofFloat(0, verticalProgress), + Keyframe.ofFloat(0.346f, verticalProgress), keyframe3, keyframe4, + Keyframe.ofFloat(1f, verticalProgress)); + ObjectAnimator animator = ObjectAnimator.ofPropertyValuesHolder(null, + new PropertyValuesHolder[]{propertyValuesHolder}); + animator.setDuration(2166); + animator.setRepeatCount(5); + + DiscoveryBounce view = new DiscoveryBounce(launcher, animator); view.mIsOpen = true; launcher.getDragLayer().addView(view); } diff --git a/src_ui_overrides/com/android/launcher3/uioverrides/AllAppsState.java b/src_ui_overrides/com/android/launcher3/uioverrides/AllAppsState.java index 49a9dc7c9..6366b2d8f 100644 --- a/src_ui_overrides/com/android/launcher3/uioverrides/AllAppsState.java +++ b/src_ui_overrides/com/android/launcher3/uioverrides/AllAppsState.java @@ -16,7 +16,7 @@ package com.android.launcher3.uioverrides; import static com.android.launcher3.LauncherAnimUtils.ALL_APPS_TRANSITION_MS; -import static com.android.launcher3.allapps.DiscoveryBounce.APPS_VIEW_SHOWN; +import static com.android.launcher3.allapps.DiscoveryBounce.HOME_BOUNCE_SEEN; import static com.android.launcher3.anim.Interpolators.DEACCEL_2; import android.view.View; @@ -49,8 +49,8 @@ public class AllAppsState extends LauncherState { @Override public void onStateEnabled(Launcher launcher) { - if (!launcher.getSharedPrefs().getBoolean(APPS_VIEW_SHOWN, false)) { - launcher.getSharedPrefs().edit().putBoolean(APPS_VIEW_SHOWN, true).apply(); + if (!launcher.getSharedPrefs().getBoolean(HOME_BOUNCE_SEEN, false)) { + launcher.getSharedPrefs().edit().putBoolean(HOME_BOUNCE_SEEN, true).apply(); } AbstractFloatingView.closeAllOpenViews(launcher); -- cgit v1.2.3