mirror of
https://github.com/LawnchairLauncher/lawnchair.git
synced 2026-03-03 17:36:49 +00:00
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
This commit is contained in:
@@ -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);
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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<T extends BaseDraggingActivity> {
|
||||
|
||||
ActivityInitListener createActivityInitListener(BiPredicate<T, Boolean> onInitListener);
|
||||
|
||||
void onOverviewShown(T activity);
|
||||
|
||||
@Nullable
|
||||
T getCreatedActivity();
|
||||
|
||||
@@ -225,6 +228,11 @@ public interface ActivityControlHelper<T extends BaseDraggingActivity> {
|
||||
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<T extends BaseDraggingActivity> {
|
||||
return new RecentsActivityTracker(onInitListener);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onOverviewShown(RecentsActivity activity) {
|
||||
// Do nothing.
|
||||
}
|
||||
|
||||
@Nullable
|
||||
@Override
|
||||
public RecentsActivity getCreatedActivity() {
|
||||
|
||||
@@ -699,6 +699,7 @@ public class WindowTransformSwipeHandler<T extends BaseDraggingActivity> {
|
||||
finishTransitionRunnable.run();
|
||||
}
|
||||
RecentsModel.getInstance(mContext).onOverviewShown(false, TAG);
|
||||
mActivityControlHelper.onOverviewShown(mActivity);
|
||||
doLogGesture(true /* toLauncher */);
|
||||
}
|
||||
|
||||
|
||||
@@ -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();
|
||||
}
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
@@ -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);
|
||||
|
||||
Reference in New Issue
Block a user