From 6007f5208514c4f69ca6fa75507abba92ef5372d Mon Sep 17 00:00:00 2001 From: calderwoodra Date: Mon, 9 Oct 2017 16:59:04 -0700 Subject: Improved FAB UX. One of the biggest issues with the FAB is that it doesn't scale in/out properly. It looked more like setVisibility was being called instead. This CL migrates the FAB controller to use the built in scale in/out methods #show and #hide and the animation is much nicer. Some of the other issues were: - Now scaling animation is correct and visible. - No longer flashes when going in/out of search. - No longer shows on top of the return to call controller. - No longer bugs when switching between VVM TOS and contacts. - No longer shows FAB over VVM TOS when entering/exiting search Bug: 62588192,35359563,64116334,27458212,37991480,67419607 Test: manual PiperOrigin-RevId: 171608105 Change-Id: I9b3f61df35abf3659a432adf411b1b7d20eba683 --- java/com/android/dialer/app/DialtactsActivity.java | 43 ++++++++++++++++------ 1 file changed, 32 insertions(+), 11 deletions(-) (limited to 'java/com/android/dialer/app/DialtactsActivity.java') diff --git a/java/com/android/dialer/app/DialtactsActivity.java b/java/com/android/dialer/app/DialtactsActivity.java index 5f3620b1c..164c1ea82 100644 --- a/java/com/android/dialer/app/DialtactsActivity.java +++ b/java/com/android/dialer/app/DialtactsActivity.java @@ -38,6 +38,7 @@ import android.support.annotation.NonNull; import android.support.annotation.VisibleForTesting; import android.support.design.widget.CoordinatorLayout; import android.support.design.widget.FloatingActionButton; +import android.support.design.widget.FloatingActionButton.OnVisibilityChangedListener; import android.support.design.widget.Snackbar; import android.support.v4.app.ActivityCompat; import android.support.v4.view.ViewPager; @@ -67,7 +68,6 @@ import com.android.contacts.common.list.OnPhoneNumberPickerActionListener; import com.android.contacts.common.list.PhoneNumberListAdapter; import com.android.contacts.common.list.PhoneNumberPickerFragment.CursorReranker; import com.android.contacts.common.list.PhoneNumberPickerFragment.OnLoadFinishedListener; -import com.android.contacts.common.widget.FloatingActionButtonController; import com.android.dialer.animation.AnimUtils; import com.android.dialer.animation.AnimationListenerAdapter; import com.android.dialer.app.calllog.CallLogActivity; @@ -98,6 +98,7 @@ import com.android.dialer.callintent.CallIntentBuilder; import com.android.dialer.callintent.CallSpecificAppData; import com.android.dialer.common.Assert; import com.android.dialer.common.LogUtil; +import com.android.dialer.common.concurrent.ThreadUtil; import com.android.dialer.configprovider.ConfigProviderBindings; import com.android.dialer.constants.ActivityRequestCodes; import com.android.dialer.contactsfragment.ContactsFragment; @@ -133,6 +134,7 @@ import com.android.dialer.util.PermissionsUtil; import com.android.dialer.util.TouchPointManager; import com.android.dialer.util.TransactionSafeActivity; import com.android.dialer.util.ViewUtil; +import com.android.dialer.widget.FloatingActionButtonController; import java.util.ArrayList; import java.util.Arrays; import java.util.List; @@ -548,7 +550,7 @@ public class DialtactsActivity extends TransactionSafeActivity mDialerDatabaseHelper.startSmartDialUpdateThread(); } if (mIsDialpadShown) { - mFloatingActionButtonController.setVisible(false); + mFloatingActionButtonController.scaleOut(); } else { mFloatingActionButtonController.align(getFabAlignment(), false /* animate */); } @@ -857,7 +859,7 @@ public class DialtactsActivity extends TransactionSafeActivity mFloatingActionButtonController.scaleOut(); maybeEnterSearchUi(); } else { - mFloatingActionButtonController.setVisible(false); + mFloatingActionButtonController.scaleOut(); maybeEnterSearchUi(); } mActionBarController.onDialpadUp(); @@ -955,7 +957,7 @@ public class DialtactsActivity extends TransactionSafeActivity ft.hide(mDialpadFragment); ft.commit(); } - mFloatingActionButtonController.scaleIn(AnimUtils.NO_DELAY); + mFloatingActionButtonController.scaleIn(); } private void updateSearchFragmentPosition() { @@ -1271,12 +1273,28 @@ public class DialtactsActivity extends TransactionSafeActivity setNotInSearchUi(); - // Restore the FAB for the lists fragment. - if (getFabAlignment() != FloatingActionButtonController.ALIGN_END) { - mFloatingActionButtonController.setVisible(false); + // There are four states the fab can be in: + // - Not visible and should remain not visible (do nothing) + // - Not visible (move then show the fab) + // - Visible, in the correct position (do nothing) + // - Visible, in the wrong position (hide, move, then show the fab) + if (mFloatingActionButtonController.isVisible() + && getFabAlignment() != FloatingActionButtonController.ALIGN_END) { + mFloatingActionButtonController.scaleOut( + new OnVisibilityChangedListener() { + @Override + public void onHidden(FloatingActionButton floatingActionButton) { + super.onHidden(floatingActionButton); + onPageScrolled( + mListsFragment.getCurrentTabIndex(), 0 /* offset */, 0 /* pixelOffset */); + mFloatingActionButtonController.scaleIn(); + } + }); + } else if (!mFloatingActionButtonController.isVisible() && mListsFragment.shouldShowFab()) { + onPageScrolled(mListsFragment.getCurrentTabIndex(), 0 /* offset */, 0 /* pixelOffset */); + ThreadUtil.getUiThreadHandler() + .postDelayed(() -> mFloatingActionButtonController.scaleIn(), FAB_SCALE_IN_DELAY_MS); } - mFloatingActionButtonController.scaleIn(FAB_SCALE_IN_DELAY_MS); - onPageScrolled(mListsFragment.getCurrentTabIndex(), 0 /* offset */, 0 /* pixelOffset */); final FragmentTransaction transaction = getFragmentManager().beginTransaction(); if (mSmartDialSearchFragment != null) { @@ -1527,8 +1545,10 @@ public class DialtactsActivity extends TransactionSafeActivity public void onPageSelected(int position) { updateMissedCalls(); int tabIndex = mListsFragment.getCurrentTabIndex(); + if (tabIndex != mPreviouslySelectedTabIndex) { + mFloatingActionButtonController.scaleIn(); + } mPreviouslySelectedTabIndex = tabIndex; - mFloatingActionButtonController.setVisible(true); timeTabSelected = SystemClock.elapsedRealtime(); } @@ -1563,7 +1583,8 @@ public class DialtactsActivity extends TransactionSafeActivity return mActionBarHeight; } - private int getFabAlignment() { + @VisibleForTesting + public int getFabAlignment() { if (!mIsLandscape && !isInSearchUi() && mListsFragment.getCurrentTabIndex() == DialtactsPagerAdapter.TAB_INDEX_SPEED_DIAL) { -- cgit v1.2.3