Animation should start and finish on widgets button when opening/closing widget tray.

b/21301759

Change-Id: Ib0b9132d8709426598d95fc9f60d37752e05b711
This commit is contained in:
Hyunyoung Song
2015-07-10 17:50:13 -07:00
parent 76648c58d5
commit 98ff38aa48
2 changed files with 45 additions and 95 deletions
+8 -3
View File
@@ -263,6 +263,7 @@ public class Launcher extends Activity
private ViewGroup mOverviewPanel; private ViewGroup mOverviewPanel;
private View mAllAppsButton; private View mAllAppsButton;
private View mWidgetsButton;
private SearchDropTargetBar mSearchDropTargetBar; private SearchDropTargetBar mSearchDropTargetBar;
@@ -1370,8 +1371,8 @@ public class Launcher extends Activity
} }
mOverviewPanel = (ViewGroup) findViewById(R.id.overview_panel); mOverviewPanel = (ViewGroup) findViewById(R.id.overview_panel);
View widgetButton = findViewById(R.id.widget_button); mWidgetsButton = findViewById(R.id.widget_button);
widgetButton.setOnClickListener(new OnClickListener() { mWidgetsButton.setOnClickListener(new OnClickListener() {
@Override @Override
public void onClick(View arg0) { public void onClick(View arg0) {
if (!mWorkspace.isSwitchingState()) { if (!mWorkspace.isSwitchingState()) {
@@ -1379,7 +1380,7 @@ public class Launcher extends Activity
} }
} }
}); });
widgetButton.setOnTouchListener(getHapticFeedbackTouchListener()); mWidgetsButton.setOnTouchListener(getHapticFeedbackTouchListener());
View wallpaperButton = findViewById(R.id.wallpaper_button); View wallpaperButton = findViewById(R.id.wallpaper_button);
wallpaperButton.setOnClickListener(new OnClickListener() { wallpaperButton.setOnClickListener(new OnClickListener() {
@@ -1465,6 +1466,10 @@ public class Launcher extends Activity
return mAllAppsButton; return mAllAppsButton;
} }
public View getWidgetsButton() {
return mWidgetsButton;
}
/** /**
* Creates a view representing a shortcut. * Creates a view representing a shortcut.
* *
@@ -90,21 +90,14 @@ public class LauncherStateTransitionAnimation {
* Private callbacks made during transition setup. * Private callbacks made during transition setup.
*/ */
static abstract class PrivateTransitionCallbacks { static abstract class PrivateTransitionCallbacks {
void onRevealViewVisible(View revealView, View contentView, View allAppsButtonView) {}
float getMaterialRevealViewFinalAlpha(View revealView) { float getMaterialRevealViewFinalAlpha(View revealView) {
return 0; return 0;
} }
float getMaterialRevealViewFinalXDrift(View revealView) {
return 0;
}
float getMaterialRevealViewFinalYDrift(View revealView) {
return 0;
}
float getMaterialRevealViewStartFinalRadius() { float getMaterialRevealViewStartFinalRadius() {
return 0; return 0;
} }
AnimatorListenerAdapter getMaterialRevealViewAnimatorListener(View revealView, AnimatorListenerAdapter getMaterialRevealViewAnimatorListener(View revealView,
View allAppsButtonView) { View buttonView) {
return null; return null;
} }
void onTransitionComplete() {} void onTransitionComplete() {}
@@ -135,30 +128,13 @@ public class LauncherStateTransitionAnimation {
public void startAnimationToAllApps(final boolean animated, public void startAnimationToAllApps(final boolean animated,
final boolean startSearchAfterTransition) { final boolean startSearchAfterTransition) {
final AllAppsContainerView toView = mLauncher.getAppsView(); final AllAppsContainerView toView = mLauncher.getAppsView();
final View buttonView = mLauncher.getAllAppsButton();
PrivateTransitionCallbacks cb = new PrivateTransitionCallbacks() { PrivateTransitionCallbacks cb = new PrivateTransitionCallbacks() {
private int[] mAllAppsToPanelDelta;
@Override
public void onRevealViewVisible(View revealView, View contentView,
View allAppsButtonView) {
// Get the y delta between the center of the page and the center of the all apps
// button
mAllAppsToPanelDelta = Utilities.getCenterDeltaInScreenSpace(revealView,
allAppsButtonView, null);
}
@Override @Override
public float getMaterialRevealViewFinalAlpha(View revealView) { public float getMaterialRevealViewFinalAlpha(View revealView) {
return 1f; return 1f;
} }
@Override @Override
public float getMaterialRevealViewFinalXDrift(View revealView) {
return mAllAppsToPanelDelta[0];
}
@Override
public float getMaterialRevealViewFinalYDrift(View revealView) {
return mAllAppsToPanelDelta[1];
}
@Override
public float getMaterialRevealViewStartFinalRadius() { public float getMaterialRevealViewStartFinalRadius() {
int allAppsButtonSize = mLauncher.getDeviceProfile().allAppsButtonVisualSize; int allAppsButtonSize = mLauncher.getDeviceProfile().allAppsButtonVisualSize;
return allAppsButtonSize / 2; return allAppsButtonSize / 2;
@@ -183,9 +159,9 @@ public class LauncherStateTransitionAnimation {
} }
}; };
// Only animate the search bar if animating from spring loaded mode back to all apps // Only animate the search bar if animating from spring loaded mode back to all apps
startAnimationToOverlay(Workspace.State.NORMAL_HIDDEN, toView, toView.getContentView(), startAnimationToOverlay(Workspace.State.NORMAL_HIDDEN, buttonView, toView,
toView.getRevealView(), toView.getSearchBarView(), animated, toView.getContentView(), toView.getRevealView(), toView.getSearchBarView(),
true /* hideSearchBar */, cb); animated, true /* hideSearchBar */, cb);
} }
/** /**
@@ -193,22 +169,15 @@ public class LauncherStateTransitionAnimation {
*/ */
public void startAnimationToWidgets(final boolean animated) { public void startAnimationToWidgets(final boolean animated) {
final WidgetsContainerView toView = mLauncher.getWidgetsView(); final WidgetsContainerView toView = mLauncher.getWidgetsView();
final Resources res = mLauncher.getResources(); final View buttonView = mLauncher.getWidgetsButton();
PrivateTransitionCallbacks cb = new PrivateTransitionCallbacks() { PrivateTransitionCallbacks cb = new PrivateTransitionCallbacks() {
@Override
public void onRevealViewVisible(View revealView, View contentView,
View allAppsButtonView) {
}
@Override @Override
public float getMaterialRevealViewFinalAlpha(View revealView) { public float getMaterialRevealViewFinalAlpha(View revealView) {
return 0.3f; return 0.3f;
} }
@Override
public float getMaterialRevealViewFinalYDrift(View revealView) {
return revealView.getMeasuredHeight() / 2;
}
}; };
startAnimationToOverlay(Workspace.State.OVERVIEW_HIDDEN, toView, startAnimationToOverlay(Workspace.State.OVERVIEW_HIDDEN, buttonView, toView,
toView.getContentView(), toView.getRevealView(), null, animated, toView.getContentView(), toView.getRevealView(), null, animated,
true /* hideSearchBar */, cb); true /* hideSearchBar */, cb);
} }
@@ -238,23 +207,22 @@ public class LauncherStateTransitionAnimation {
* Creates and starts a new animation to a particular overlay view. * Creates and starts a new animation to a particular overlay view.
*/ */
@SuppressLint("NewApi") @SuppressLint("NewApi")
private void startAnimationToOverlay(final Workspace.State toWorkspaceState, final View toView, private void startAnimationToOverlay(final Workspace.State toWorkspaceState,
final View contentView, final View revealView, final View overlaySearchBarView, final View buttonView, final View toView, final View contentView, final View revealView,
final boolean animated, final boolean hideSearchBar, final View overlaySearchBarView, final boolean animated, final boolean hideSearchBar,
final PrivateTransitionCallbacks pCb) { final PrivateTransitionCallbacks pCb) {
final Resources res = mLauncher.getResources(); final Resources res = mLauncher.getResources();
final boolean material = Utilities.isLmpOrAbove(); final boolean material = Utilities.isLmpOrAbove();
final int revealDuration = res.getInteger(R.integer.config_overlayRevealTime); final int revealDuration = res.getInteger(R.integer.config_overlayRevealTime);
final int itemsAlphaStagger = final int itemsAlphaStagger =
res.getInteger(R.integer.config_overlayItemsAlphaStagger); res.getInteger(R.integer.config_overlayItemsAlphaStagger);
final View allAppsButtonView = mLauncher.getAllAppsButton();
final View fromView = mLauncher.getWorkspace(); final View fromView = mLauncher.getWorkspace();
final HashMap<View, Integer> layerViews = new HashMap<>(); final HashMap<View, Integer> layerViews = new HashMap<>();
// If for some reason our views aren't initialized, don't animate // If for some reason our views aren't initialized, don't animate
boolean initialized = allAppsButtonView != null; boolean initialized = buttonView != null;
// Cancel the current animation // Cancel the current animation
cancelAnimation(); cancelAnimation();
@@ -275,16 +243,17 @@ public class LauncherStateTransitionAnimation {
revealView.setAlpha(0f); revealView.setAlpha(0f);
revealView.setTranslationY(0f); revealView.setTranslationY(0f);
revealView.setTranslationX(0f); revealView.setTranslationX(0f);
pCb.onRevealViewVisible(revealView, contentView, allAppsButtonView);
// Calculate the final animation values // Calculate the final animation values
final float revealViewToAlpha; final float revealViewToAlpha;
final float revealViewToXDrift; final float revealViewToXDrift;
final float revealViewToYDrift; final float revealViewToYDrift;
if (material) { if (material) {
int[] buttonViewToPanelDelta = Utilities.getCenterDeltaInScreenSpace(revealView,
buttonView, null);
revealViewToAlpha = pCb.getMaterialRevealViewFinalAlpha(revealView); revealViewToAlpha = pCb.getMaterialRevealViewFinalAlpha(revealView);
revealViewToYDrift = pCb.getMaterialRevealViewFinalYDrift(revealView); revealViewToYDrift = buttonViewToPanelDelta[1];
revealViewToXDrift = pCb.getMaterialRevealViewFinalXDrift(revealView); revealViewToXDrift = buttonViewToPanelDelta[0];
} else { } else {
revealViewToAlpha = 0f; revealViewToAlpha = 0f;
revealViewToYDrift = 2 * height / 3; revealViewToYDrift = 2 * height / 3;
@@ -337,10 +306,9 @@ public class LauncherStateTransitionAnimation {
mStateAnimation.play(itemsAlpha); mStateAnimation.play(itemsAlpha);
if (material) { if (material) {
// Animate the all apps button
float startRadius = pCb.getMaterialRevealViewStartFinalRadius(); float startRadius = pCb.getMaterialRevealViewStartFinalRadius();
AnimatorListenerAdapter listener = pCb.getMaterialRevealViewAnimatorListener( AnimatorListenerAdapter listener = pCb.getMaterialRevealViewAnimatorListener(
revealView, allAppsButtonView); revealView, buttonView);
Animator reveal = UiThreadCircularReveal.createCircularReveal(revealView, width / 2, Animator reveal = UiThreadCircularReveal.createCircularReveal(revealView, width / 2,
height / 2, startRadius, revealRadius); height / 2, startRadius, revealRadius);
reveal.setDuration(revealDuration); reveal.setDuration(revealDuration);
@@ -452,22 +420,6 @@ public class LauncherStateTransitionAnimation {
PrivateTransitionCallbacks cb = new PrivateTransitionCallbacks() { PrivateTransitionCallbacks cb = new PrivateTransitionCallbacks() {
int[] mAllAppsToPanelDelta; int[] mAllAppsToPanelDelta;
@Override
public void onRevealViewVisible(View revealView, View contentView,
View allAppsButtonView) {
// Get the y delta between the center of the page and the center of the all apps
// button
mAllAppsToPanelDelta = Utilities.getCenterDeltaInScreenSpace(revealView,
allAppsButtonView, null);
}
@Override
public float getMaterialRevealViewFinalXDrift(View revealView) {
return mAllAppsToPanelDelta[0];
}
@Override
public float getMaterialRevealViewFinalYDrift(View revealView) {
return mAllAppsToPanelDelta[1];
}
@Override @Override
float getMaterialRevealViewFinalAlpha(View revealView) { float getMaterialRevealViewFinalAlpha(View revealView) {
// No alpha anim from all apps // No alpha anim from all apps
@@ -499,9 +451,10 @@ public class LauncherStateTransitionAnimation {
} }
}; };
// Only animate the search bar if animating to spring loaded mode from all apps // Only animate the search bar if animating to spring loaded mode from all apps
startAnimationToWorkspaceFromOverlay(toWorkspaceState, toWorkspacePage, appsView, startAnimationToWorkspaceFromOverlay(toWorkspaceState, toWorkspacePage,
appsView.getContentView(), appsView.getRevealView(), appsView.getSearchBarView(), mLauncher.getAllAppsButton(), appsView, appsView.getContentView(),
animated, onCompleteRunnable, cb); appsView.getRevealView(), appsView.getSearchBarView(), animated,
onCompleteRunnable, cb);
} }
/** /**
@@ -510,23 +463,14 @@ public class LauncherStateTransitionAnimation {
private void startAnimationToWorkspaceFromWidgets(final Workspace.State toWorkspaceState, private void startAnimationToWorkspaceFromWidgets(final Workspace.State toWorkspaceState,
final int toWorkspacePage, final boolean animated, final Runnable onCompleteRunnable) { final int toWorkspacePage, final boolean animated, final Runnable onCompleteRunnable) {
final WidgetsContainerView widgetsView = mLauncher.getWidgetsView(); final WidgetsContainerView widgetsView = mLauncher.getWidgetsView();
final Resources res = mLauncher.getResources();
PrivateTransitionCallbacks cb = new PrivateTransitionCallbacks() { PrivateTransitionCallbacks cb = new PrivateTransitionCallbacks() {
@Override
public void onRevealViewVisible(View revealView, View contentView,
View allAppsButtonView) {
}
@Override
public float getMaterialRevealViewFinalYDrift(View revealView) {
return revealView.getMeasuredHeight() / 2;
}
@Override @Override
float getMaterialRevealViewFinalAlpha(View revealView) { float getMaterialRevealViewFinalAlpha(View revealView) {
return 0.4f; return 0.3f;
} }
@Override @Override
public AnimatorListenerAdapter getMaterialRevealViewAnimatorListener( public AnimatorListenerAdapter getMaterialRevealViewAnimatorListener(
final View revealView, final View allAppsButtonView) { final View revealView, final View widgetsButtonView) {
return new AnimatorListenerAdapter() { return new AnimatorListenerAdapter() {
public void onAnimationEnd(Animator animation) { public void onAnimationEnd(Animator animation) {
// Hide the reveal view // Hide the reveal view
@@ -535,31 +479,31 @@ public class LauncherStateTransitionAnimation {
}; };
} }
}; };
startAnimationToWorkspaceFromOverlay(toWorkspaceState, toWorkspacePage, widgetsView, startAnimationToWorkspaceFromOverlay(toWorkspaceState, toWorkspacePage,
widgetsView.getContentView(), widgetsView.getRevealView(), null, animated, mLauncher.getWidgetsButton(), widgetsView, widgetsView.getContentView(),
onCompleteRunnable, cb); widgetsView.getRevealView(), null, animated, onCompleteRunnable, cb);
} }
/** /**
* Creates and starts a new animation to the workspace. * Creates and starts a new animation to the workspace.
*/ */
private void startAnimationToWorkspaceFromOverlay(final Workspace.State toWorkspaceState, private void startAnimationToWorkspaceFromOverlay(final Workspace.State toWorkspaceState,
final int toWorkspacePage, final View fromView, final View contentView, final int toWorkspacePage, final View buttonView, final View fromView,
final View revealView, final View overlaySearchBarView, final boolean animated, final View contentView, final View revealView, final View overlaySearchBarView,
final Runnable onCompleteRunnable, final PrivateTransitionCallbacks pCb) { final boolean animated, final Runnable onCompleteRunnable,
final PrivateTransitionCallbacks pCb) {
final Resources res = mLauncher.getResources(); final Resources res = mLauncher.getResources();
final boolean material = Utilities.isLmpOrAbove(); final boolean material = Utilities.isLmpOrAbove();
final int revealDuration = res.getInteger(R.integer.config_overlayRevealTime); final int revealDuration = res.getInteger(R.integer.config_overlayRevealTime);
final int itemsAlphaStagger = final int itemsAlphaStagger =
res.getInteger(R.integer.config_overlayItemsAlphaStagger); res.getInteger(R.integer.config_overlayItemsAlphaStagger);
final View allAppsButtonView = mLauncher.getAllAppsButton();
final View toView = mLauncher.getWorkspace(); final View toView = mLauncher.getWorkspace();
final HashMap<View, Integer> layerViews = new HashMap<>(); final HashMap<View, Integer> layerViews = new HashMap<>();
// If for some reason our views aren't initialized, don't animate // If for some reason our views aren't initialized, don't animate
boolean initialized = allAppsButtonView != null; boolean initialized = buttonView != null;
// Cancel the current animation // Cancel the current animation
cancelAnimation(); cancelAnimation();
@@ -589,14 +533,15 @@ public class LauncherStateTransitionAnimation {
revealView.setAlpha(1f); revealView.setAlpha(1f);
revealView.setTranslationY(0); revealView.setTranslationY(0);
layerViews.put(revealView, BUILD_AND_SET_LAYER); layerViews.put(revealView, BUILD_AND_SET_LAYER);
pCb.onRevealViewVisible(revealView, contentView, allAppsButtonView);
// Calculate the final animation values // Calculate the final animation values
final float revealViewToXDrift; final float revealViewToXDrift;
final float revealViewToYDrift; final float revealViewToYDrift;
if (material) { if (material) {
revealViewToYDrift = pCb.getMaterialRevealViewFinalYDrift(revealView); int[] buttonViewToPanelDelta = Utilities.getCenterDeltaInScreenSpace(revealView,
revealViewToXDrift = pCb.getMaterialRevealViewFinalXDrift(revealView); buttonView, null);
revealViewToYDrift = buttonViewToPanelDelta[1];
revealViewToXDrift = buttonViewToPanelDelta[0];
} else { } else {
revealViewToYDrift = 2 * height / 3; revealViewToYDrift = 2 * height / 3;
revealViewToXDrift = 0; revealViewToXDrift = 0;
@@ -666,7 +611,7 @@ public class LauncherStateTransitionAnimation {
// Animate the all apps button // Animate the all apps button
float finalRadius = pCb.getMaterialRevealViewStartFinalRadius(); float finalRadius = pCb.getMaterialRevealViewStartFinalRadius();
AnimatorListenerAdapter listener = AnimatorListenerAdapter listener =
pCb.getMaterialRevealViewAnimatorListener(revealView, allAppsButtonView); pCb.getMaterialRevealViewAnimatorListener(revealView, buttonView);
Animator reveal = UiThreadCircularReveal.createCircularReveal(revealView, width / 2, Animator reveal = UiThreadCircularReveal.createCircularReveal(revealView, width / 2,
height / 2, revealRadius, finalRadius); height / 2, revealRadius, finalRadius);
reveal.setInterpolator(new LogDecelerateInterpolator(100, 0)); reveal.setInterpolator(new LogDecelerateInterpolator(100, 0));