diff options
Diffstat (limited to 'src/com/android/launcher3/allapps/DiscoveryBounce.java')
-rw-r--r-- | src/com/android/launcher3/allapps/DiscoveryBounce.java | 97 |
1 files changed, 87 insertions, 10 deletions
diff --git a/src/com/android/launcher3/allapps/DiscoveryBounce.java b/src/com/android/launcher3/allapps/DiscoveryBounce.java index fddafb2a6..e1cd06a8b 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,35 +17,46 @@ package com.android.launcher3.allapps; import static com.android.launcher3.LauncherState.NORMAL; +import static com.android.launcher3.LauncherState.OVERVIEW; +import static com.android.launcher3.userevent.nano.LauncherLogProto.ContainerType.HOTSEAT; +import static com.android.launcher3.userevent.nano.LauncherLogProto.ContainerType.PREDICTION; 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.os.Handler; import android.view.MotionEvent; +import android.view.animation.PathInterpolator; import com.android.launcher3.AbstractFloatingView; import com.android.launcher3.Launcher; import com.android.launcher3.R; import com.android.launcher3.compat.UserManagerCompat; +import com.android.launcher3.states.InternalStateHandler; /** - * 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"; + private static final long DELAY_MS = 450; + + 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()); @@ -73,6 +84,14 @@ public class DiscoveryBounce extends AbstractFloatingView { } @Override + public boolean onBackPressed() { + super.onBackPressed(); + // Go back to the previous state (from a user's perspective this floating view isn't + // something to go back from). + return false; + } + + @Override public boolean onControllerInterceptTouchEvent(MotionEvent ev) { handleClose(false); return false; @@ -96,17 +115,75 @@ public class DiscoveryBounce extends AbstractFloatingView { return (type & TYPE_ON_BOARD_POPUP) != 0; } - public static void showIfNeeded(Launcher launcher) { + public static void showForHomeIfNeeded(Launcher launcher) { + showForHomeIfNeeded(launcher, true); + } + + private static void showForHomeIfNeeded(Launcher launcher, boolean withDelay) { 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); + if (withDelay) { + new Handler().postDelayed(() -> showForHomeIfNeeded(launcher, false), DELAY_MS); + return; + } + + DiscoveryBounce view = new DiscoveryBounce(launcher, + AnimatorInflater.loadAnimator(launcher, R.animator.discovery_bounce)); + view.mIsOpen = true; + launcher.getDragLayer().addView(view); + launcher.getUserEventDispatcher().logActionBounceTip(HOTSEAT); + } + + public static void showForOverviewIfNeeded(Launcher launcher) { + showForOverviewIfNeeded(launcher, true); + } + + private static void showForOverviewIfNeeded(Launcher launcher, boolean withDelay) { + if (!launcher.isInState(OVERVIEW) + || !launcher.hasBeenResumed() + || launcher.isForceInvisible() + || launcher.getDeviceProfile().isVerticalBarLayout() + || launcher.getSharedPrefs().getBoolean(SHELF_BOUNCE_SEEN, false) + || UserManagerCompat.getInstance(launcher).isDemoUser() + || ActivityManager.isRunningInTestHarness()) { + return; + } + + if (withDelay) { + new Handler().postDelayed(() -> showForOverviewIfNeeded(launcher, false), DELAY_MS); + return; + } else if (InternalStateHandler.hasPending() + || AbstractFloatingView.getTopOpenView(launcher) != null) { + // TODO: Move these checks to the top and call this method after invalidate handler. + 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.9738f)); + keyframe3.setInterpolator(pathInterpolator); + Keyframe keyframe4 = Keyframe.ofFloat(0.754f, verticalProgress); + keyframe4.setInterpolator(pathInterpolator); + + PropertyValuesHolder propertyValuesHolder = PropertyValuesHolder.ofKeyframe("progress", + Keyframe.ofFloat(0, verticalProgress), + Keyframe.ofFloat(0.246f, 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); + launcher.getUserEventDispatcher().logActionBounceTip(PREDICTION); } } |