diff options
author | calderwoodra <calderwoodra@google.com> | 2018-03-20 13:49:26 -0700 |
---|---|---|
committer | Copybara-Service <copybara-piper@google.com> | 2018-03-20 13:50:18 -0700 |
commit | 026ed57ba679b63d165743a4162f54435449281d (patch) | |
tree | 78cb0f232145d6e5c85a9ebfcb826739df79b354 /java | |
parent | 29bfd06217b454bc6220e925fb98c9383fd40c9b (diff) |
Mitigate some of the jank in opening/closeing search.
There is still some jank on first open, but it's much less janky
on close and consecutive open calls.
Test: existing tests confirm no regressions
PiperOrigin-RevId: 189802733
Change-Id: I49d6c2def7c33be0fdbb79c89772a5e4513cde3b
Diffstat (limited to 'java')
5 files changed, 69 insertions, 86 deletions
diff --git a/java/com/android/dialer/main/impl/MainSearchController.java b/java/com/android/dialer/main/impl/MainSearchController.java index 46f6a90b9..c2ff0512a 100644 --- a/java/com/android/dialer/main/impl/MainSearchController.java +++ b/java/com/android/dialer/main/impl/MainSearchController.java @@ -84,6 +84,9 @@ public class MainSearchController implements SearchBarListener { private final MainToolbar toolbar; private final View toolbarShadow; + /** View located underneath the toolbar that needs to animate with it. */ + private final View fragmentContainer; + private final List<OnSearchShowListener> onSearchShowListenerList = new ArrayList<>(); /** @@ -91,7 +94,6 @@ public class MainSearchController implements SearchBarListener { * want to wait until onPause is called otherwise the transition will look extremely janky. */ private boolean closeSearchOnPause; - private boolean requestingPermission; public MainSearchController( @@ -99,12 +101,14 @@ public class MainSearchController implements SearchBarListener { BottomNavBar bottomNav, FloatingActionButton fab, MainToolbar toolbar, - View toolbarShadow) { + View toolbarShadow, + View fragmentContainer) { this.activity = activity; this.bottomNav = bottomNav; this.fab = fab; this.toolbar = toolbar; this.toolbarShadow = toolbarShadow; + this.fragmentContainer = fragmentContainer; } /** Should be called if we're showing the dialpad because of a new ACTION_DIAL intent. */ @@ -134,9 +138,10 @@ public class MainSearchController implements SearchBarListener { Logger.get(activity).logScreenView(ScreenEvent.Type.MAIN_DIALPAD, activity); fab.hide(); - toolbar.slideUp(animate); + toolbar.slideUp(animate, fragmentContainer); toolbar.expand(animate, Optional.absent()); toolbarShadow.setVisibility(View.VISIBLE); + activity.setTitle(R.string.dialpad_activity_title); FragmentTransaction transaction = activity.getFragmentManager().beginTransaction(); @@ -147,19 +152,13 @@ public class MainSearchController implements SearchBarListener { // TODO(a bug): zero suggest results aren't actually shown but this enabled the nearby // places promo to be shown. searchFragment = NewSearchFragment.newInstance(/* showZeroSuggest=*/ true); - transaction.replace(R.id.fragment_container, searchFragment, SEARCH_FRAGMENT_TAG); - transaction.addToBackStack(null); + transaction.add(R.id.search_fragment_container, searchFragment, SEARCH_FRAGMENT_TAG); transaction.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_FADE); } else if (!isSearchVisible()) { transaction.show(searchFragment); } searchFragment.setQuery("", CallInitiationType.Type.DIALPAD); - // Split the transactions so that the dialpad fragment isn't popped off the stack when we exit - // search. We do this so that the dialpad actually animates down instead of just disappearing. - transaction.commit(); - transaction = activity.getFragmentManager().beginTransaction(); - // Show Dialpad if (getDialpadFragment() == null) { DialpadFragment dialpadFragment = new DialpadFragment(); @@ -184,12 +183,12 @@ public class MainSearchController implements SearchBarListener { * * @see {@link #closeSearch(boolean)} to "remove" the dialpad. */ - private void hideDialpad(boolean animate, boolean bottomNavVisible) { + private void hideDialpad(boolean animate) { LogUtil.enterBlock("MainSearchController.hideDialpad"); Assert.checkArgument(isDialpadVisible()); fab.show(); - toolbar.slideDown(animate); + toolbar.slideDown(animate, fragmentContainer); toolbar.transferQueryFromDialpad(getDialpadFragment().getQuery()); activity.setTitle(R.string.main_activity_label); @@ -199,15 +198,7 @@ public class MainSearchController implements SearchBarListener { animate, new AnimationListener() { @Override - public void onAnimationStart(Animation animation) { - // Slide the bottom nav on animation start so it's (not) visible when the dialpad - // finishes animating down. - if (bottomNavVisible) { - showBottomNav(); - } else { - hideBottomNav(); - } - } + public void onAnimationStart(Animation animation) {} @Override public void onAnimationEnd(Animation animation) { @@ -257,7 +248,7 @@ public class MainSearchController implements SearchBarListener { } else { Logger.get(activity) .logImpression(DialerImpression.Type.MAIN_TOUCH_DIALPAD_SEARCH_LIST_TO_HIDE_DIALPAD); - hideDialpad(/* animate=*/ true, /* bottomNavVisible=*/ false); + hideDialpad(/* animate=*/ true); } } else if (isSearchVisible()) { if (TextUtils.isEmpty(toolbar.getQuery())) { @@ -282,7 +273,7 @@ public class MainSearchController implements SearchBarListener { LogUtil.i("MainSearchController.onBackPressed", "Dialpad visible with query"); Logger.get(activity) .logImpression(DialerImpression.Type.MAIN_PRESS_BACK_BUTTON_TO_HIDE_DIALPAD); - hideDialpad(/* animate=*/ true, /* bottomNavVisible=*/ false); + hideDialpad(/* animate=*/ true); return true; } else if (isSearchVisible()) { LogUtil.i("MainSearchController.onBackPressed", "Search is visible"); @@ -298,22 +289,19 @@ public class MainSearchController implements SearchBarListener { } } - /** - * Calls {@link #hideDialpad(boolean, boolean)}, removes the search fragment and clears the - * dialpad. - */ + /** Calls {@link #hideDialpad(boolean)}, removes the search fragment and clears the dialpad. */ private void closeSearch(boolean animate) { LogUtil.enterBlock("MainSearchController.closeSearch"); Assert.checkArgument(isSearchVisible()); if (isDialpadVisible()) { - hideDialpad(animate, /* bottomNavVisible=*/ true); + hideDialpad(animate); } else if (!fab.isShown()) { fab.show(); } showBottomNav(); toolbar.collapse(animate); toolbarShadow.setVisibility(View.GONE); - activity.getFragmentManager().popBackStack(); + activity.getFragmentManager().beginTransaction().hide(getSearchFragment()).commit(); // Clear the dialpad so the phone number isn't persisted between search sessions. DialpadFragment dialpadFragment = getDialpadFragment(); @@ -391,8 +379,7 @@ public class MainSearchController implements SearchBarListener { // TODO(a bug): zero suggest results aren't actually shown but this enabled the nearby // places promo to be shown. searchFragment = NewSearchFragment.newInstance(true); - transaction.replace(R.id.fragment_container, searchFragment, SEARCH_FRAGMENT_TAG); - transaction.addToBackStack(null); + transaction.add(R.id.search_fragment_container, searchFragment, SEARCH_FRAGMENT_TAG); transaction.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_FADE); } else if (!isSearchVisible()) { transaction.show(getSearchFragment()); @@ -519,7 +506,7 @@ public class MainSearchController implements SearchBarListener { toolbar.expand(false, Optional.absent()); } if (savedInstanceState.getBoolean(KEY_IS_TOOLBAR_SLIDE_UP, false)) { - toolbar.slideUp(false); + toolbar.slideUp(false, fragmentContainer); } } diff --git a/java/com/android/dialer/main/impl/OldMainActivityPeer.java b/java/com/android/dialer/main/impl/OldMainActivityPeer.java index 9f15d28c5..2db331a81 100644 --- a/java/com/android/dialer/main/impl/OldMainActivityPeer.java +++ b/java/com/android/dialer/main/impl/OldMainActivityPeer.java @@ -230,7 +230,7 @@ public class OldMainActivityPeer implements MainActivityPeer, FragmentUtilListen searchController = getNewMainSearchController( - bottomNav, fab, toolbar, activity.findViewById(R.id.toolbar_shadow)); + bottomNav, fab, toolbar, activity.findViewById(R.id.toolbar_shadow), snackbarContainer); toolbar.setSearchBarListener(searchController); onDialpadQueryChangedListener = getNewOnDialpadQueryChangedListener(searchController); @@ -579,8 +579,10 @@ public class OldMainActivityPeer implements MainActivityPeer, FragmentUtilListen BottomNavBar bottomNavBar, FloatingActionButton fab, MainToolbar mainToolbar, - View toolbarShadow) { - return new MainSearchController(activity, bottomNavBar, fab, mainToolbar, toolbarShadow); + View toolbarShadow, + View fragmentContainer) { + return new MainSearchController( + activity, bottomNavBar, fab, mainToolbar, toolbarShadow, fragmentContainer); } public MainOnDialpadQueryChangedListener getNewOnDialpadQueryChangedListener( diff --git a/java/com/android/dialer/main/impl/res/layout/main_activity.xml b/java/com/android/dialer/main/impl/res/layout/main_activity.xml index 0883acebc..a1d6e5372 100644 --- a/java/com/android/dialer/main/impl/res/layout/main_activity.xml +++ b/java/com/android/dialer/main/impl/res/layout/main_activity.xml @@ -21,6 +21,11 @@ android:layout_width="match_parent" android:layout_height="match_parent"> + <!-- MainToolbar --> + <include + android:id="@+id/toolbar" + layout="@layout/toolbar_layout"/> + <android.support.design.widget.CoordinatorLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" @@ -34,8 +39,20 @@ <FrameLayout android:id="@+id/fragment_container" android:layout_width="match_parent" - android:layout_height="match_parent" - android:layout_above="@+id/bottom_nav_bar"/> + android:layout_height="match_parent"/> + + <FrameLayout + android:id="@+id/search_fragment_container" + android:layout_width="match_parent" + android:layout_height="match_parent"/> + + <ImageView + android:id="@+id/toolbar_shadow" + android:layout_width="match_parent" + android:layout_height="2dp" + android:scaleType="fitXY" + android:src="@drawable/search_shadow" + android:visibility="gone"/> <com.android.dialer.widget.DialerFloatingActionButton android:id="@+id/fab" @@ -63,20 +80,6 @@ android:layout_height="match_parent" android:elevation="10dp"/> - <!-- MainToolbar --> - <include - android:id="@+id/toolbar" - layout="@layout/toolbar_layout"/> - - <ImageView - android:id="@+id/toolbar_shadow" - android:layout_width="match_parent" - android:layout_height="2dp" - android:scaleType="fitXY" - android:src="@drawable/search_shadow" - android:layout_below="@+id/toolbar" - android:visibility="gone"/> - <!-- TODO(calderwoodra): investigate what this is for and why we want it. --> <!-- Host container for the contact tile drag shadow --> <FrameLayout diff --git a/java/com/android/dialer/main/impl/toolbar/MainToolbar.java b/java/com/android/dialer/main/impl/toolbar/MainToolbar.java index 2f36717c9..68876dde5 100644 --- a/java/com/android/dialer/main/impl/toolbar/MainToolbar.java +++ b/java/com/android/dialer/main/impl/toolbar/MainToolbar.java @@ -16,8 +16,6 @@ package com.android.dialer.main.impl.toolbar; -import android.animation.ValueAnimator; -import android.animation.ValueAnimator.AnimatorUpdateListener; import android.content.Context; import android.support.annotation.NonNull; import android.support.annotation.StringRes; @@ -25,10 +23,10 @@ import android.support.v7.app.AppCompatActivity; import android.support.v7.widget.Toolbar; import android.util.AttributeSet; import android.view.MenuItem; +import android.view.View; import android.view.animation.AccelerateDecelerateInterpolator; import android.widget.ImageButton; import android.widget.PopupMenu; -import android.widget.RelativeLayout; import com.android.dialer.common.Assert; import com.android.dialer.util.ViewUtil; import com.google.common.base.Optional; @@ -73,47 +71,41 @@ public final class MainToolbar extends Toolbar implements PopupMenu.OnMenuItemCl } /** Slides the toolbar up and off the screen. */ - public void slideUp(boolean animate) { + public void slideUp(boolean animate, View container) { Assert.checkArgument(!isSlideUp); if (getHeight() == 0) { - ViewUtil.doOnGlobalLayout(this, view -> slideUp(animate)); + ViewUtil.doOnGlobalLayout(this, view -> slideUp(animate, container)); return; } isSlideUp = true; - ValueAnimator animator = ValueAnimator.ofFloat(0, -getHeight()); - animator.setDuration(animate ? SLIDE_DURATION : 0); - animator.setInterpolator(SLIDE_INTERPOLATOR); - animator.addUpdateListener( - new AnimatorUpdateListener() { - @Override - public void onAnimationUpdate(ValueAnimator animation) { - int val = ((Float) animation.getAnimatedValue()).intValue(); - RelativeLayout.LayoutParams params = (RelativeLayout.LayoutParams) getLayoutParams(); - params.topMargin = val; - requestLayout(); - } - }); - animator.start(); + animate() + .translationY(-getHeight()) + .setDuration(animate ? SLIDE_DURATION : 0) + .setInterpolator(SLIDE_INTERPOLATOR) + .start(); + container + .animate() + .translationY(-getHeight()) + .setDuration(animate ? SLIDE_DURATION : 0) + .setInterpolator(SLIDE_INTERPOLATOR) + .start(); } /** Slides the toolbar down and back onto the screen. */ - public void slideDown(boolean animate) { + public void slideDown(boolean animate, View container) { Assert.checkArgument(isSlideUp); isSlideUp = false; - ValueAnimator animator = ValueAnimator.ofFloat(-getHeight(), 0); - animator.setDuration(animate ? SLIDE_DURATION : 0); - animator.setInterpolator(SLIDE_INTERPOLATOR); - animator.addUpdateListener( - new AnimatorUpdateListener() { - @Override - public void onAnimationUpdate(ValueAnimator animation) { - int val = ((Float) animation.getAnimatedValue()).intValue(); - RelativeLayout.LayoutParams params = (RelativeLayout.LayoutParams) getLayoutParams(); - params.topMargin = val; - requestLayout(); - } - }); - animator.start(); + animate() + .translationY(0) + .setDuration(animate ? SLIDE_DURATION : 0) + .setInterpolator(SLIDE_INTERPOLATOR) + .start(); + container + .animate() + .translationY(0) + .setDuration(animate ? SLIDE_DURATION : 0) + .setInterpolator(SLIDE_INTERPOLATOR) + .start(); } /** @see SearchBarView#collapse(boolean) */ diff --git a/java/com/android/dialer/main/impl/toolbar/SearchBarView.java b/java/com/android/dialer/main/impl/toolbar/SearchBarView.java index 299985057..0cc76598c 100644 --- a/java/com/android/dialer/main/impl/toolbar/SearchBarView.java +++ b/java/com/android/dialer/main/impl/toolbar/SearchBarView.java @@ -186,7 +186,6 @@ final class SearchBarView extends FrameLayout { params.rightMargin = margin; searchBoxExpanded.getLayoutParams().height = (int) (animationEndHeight - (animationEndHeight - animationStartHeight) * fraction); - requestLayout(); } /* package-private */ void setSearchBarListener(@NonNull SearchBarListener listener) { |