summaryrefslogtreecommitdiffstats
path: root/src/com/android/launcher3/allapps/DiscoveryBounce.java
diff options
context:
space:
mode:
Diffstat (limited to 'src/com/android/launcher3/allapps/DiscoveryBounce.java')
-rw-r--r--src/com/android/launcher3/allapps/DiscoveryBounce.java97
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);
}
}