Merge "Improvements to multi select"
diff --git a/res/drawable/floating_action_button.xml b/res/drawable/floating_action_button.xml
index 34612d5..7753c89 100644
--- a/res/drawable/floating_action_button.xml
+++ b/res/drawable/floating_action_button.xml
@@ -16,6 +16,10 @@
-->
<ripple xmlns:android="http://schemas.android.com/apk/res/android"
- android:color="@color/contacts_accent_color">
- <item android:drawable="@drawable/fab_blue" />
-</ripple>
+ android:color="@color/contacts_accent_color">
+ <item android:id="@android:id/mask">
+ <shape android:shape="oval">
+ <solid android:color="@android:color/white" />
+ </shape>
+ </item>
+</ripple>
\ No newline at end of file
diff --git a/res/layout/floating_action_button.xml b/res/layout/floating_action_button.xml
index 1541d42..294d88b 100644
--- a/res/layout/floating_action_button.xml
+++ b/res/layout/floating_action_button.xml
@@ -22,6 +22,7 @@
android:layout_height="@dimen/floating_action_button_height"
android:layout_marginEnd="@dimen/floating_action_button_margin_right"
android:layout_marginBottom="@dimen/floating_action_button_margin_bottom"
+ android:background="@drawable/fab_blue"
android:layout_alignParentEnd="true"
android:layout_alignParentBottom="true">
diff --git a/res/layout/selection_bar.xml b/res/layout/selection_bar.xml
index e6b1f66..34cdd60 100644
--- a/res/layout/selection_bar.xml
+++ b/res/layout/selection_bar.xml
@@ -24,7 +24,7 @@
android:id="@+id/selection_close"
android:layout_width="48dp"
android:layout_height="48dp"
- android:src="@drawable/ic_close_dk"
+ android:src="@drawable/ic_back_arrow"
android:background="?android:attr/selectableItemBackgroundBorderless"
android:contentDescription="@string/action_menu_back_from_search"
android:layout_gravity="center_vertical|start"
diff --git a/src/com/android/contacts/activities/ActionBarAdapter.java b/src/com/android/contacts/activities/ActionBarAdapter.java
index dc9fcf2..c82c04e 100644
--- a/src/com/android/contacts/activities/ActionBarAdapter.java
+++ b/src/com/android/contacts/activities/ActionBarAdapter.java
@@ -55,6 +55,7 @@
public static final int START_SEARCH_MODE = 1;
public static final int START_SELECTION_MODE = 2;
public static final int STOP_SEARCH_AND_SELECTION_MODE = 3;
+ public static final int BEGIN_STOPPING_SEARCH_AND_SELECTION_MODE = 4;
}
void onAction(int action);
@@ -347,7 +348,7 @@
if (mShowHomeIcon && !isSearchOrSelectionMode) {
newFlags |= ActionBar.DISPLAY_SHOW_HOME;
}
- if (mSearchMode) {
+ if (mSearchMode && !mSelectionMode) {
// The search container is placed inside the toolbar. So we need to disable the
// Toolbar's content inset in order to allow the search container to be the width of
// the window.
@@ -384,6 +385,8 @@
final boolean isSelectionModeChanging
= (mSelectionContainer.getParent() == null) == mSelectionMode;
+ final boolean isSwitchingFromSearchToSelection =
+ mSearchMode && isSelectionModeChanging || mSearchMode && mSelectionMode;
final boolean isSearchModeChanging
= (mSearchContainer.getParent() == null) == mSearchMode;
final boolean isTabHeightChanging = isSearchModeChanging || isSelectionModeChanging;
@@ -391,21 +394,19 @@
// When skipAnimation=true, it is possible that we will switch from search mode
// to selection mode directly. So we need to remove the undesired container in addition
// to adding the desired container.
- if (skipAnimation) {
- if (isTabHeightChanging) {
+ if (skipAnimation || isSwitchingFromSearchToSelection) {
+ if (isTabHeightChanging || isSwitchingFromSearchToSelection) {
mToolbar.removeView(mLandscapeTabs);
- if (mSearchMode) {
+ mToolbar.removeView(mSearchContainer);
+ mToolBarFrame.removeView(mSelectionContainer);
+ if (mSelectionMode) {
setPortraitTabHeight(0);
- mToolBarFrame.removeView(mSelectionContainer);
- addSearchContainer();
- } else if (mSelectionMode) {
- setPortraitTabHeight(0);
- mToolbar.removeView(mSearchContainer);
addSelectionContainer();
+ } else if (mSearchMode) {
+ setPortraitTabHeight(0);
+ addSearchContainer();
} else {
setPortraitTabHeight(mMaxPortraitTabHeight);
- mToolbar.removeView(mSearchContainer);
- mToolBarFrame.removeView(mSelectionContainer);
addLandscapeViewPagerTabs();
}
updateDisplayOptions(isSearchModeChanging);
@@ -423,6 +424,9 @@
animateTabHeightChange(mMaxPortraitTabHeight, 0);
updateDisplayOptions(isSearchModeChanging);
} else {
+ if (mListener != null) {
+ mListener.onAction(Action.BEGIN_STOPPING_SEARCH_AND_SELECTION_MODE);
+ }
mSelectionContainer.setAlpha(1);
animateTabHeightChange(0, mMaxPortraitTabHeight);
mSelectionContainer.animate().alpha(0).withEndAction(new Runnable() {
@@ -491,15 +495,17 @@
private void addSearchContainer() {
mToolbar.removeView(mSearchContainer);
mToolbar.addView(mSearchContainer);
+ mSearchContainer.setAlpha(1);
}
private void addSelectionContainer() {
mToolBarFrame.removeView(mSelectionContainer);
mToolBarFrame.addView(mSelectionContainer, 0);
+ mSelectionContainer.setAlpha(1);
}
private void updateDisplayOptions(boolean isSearchModeChanging) {
- if (mSearchMode) {
+ if (mSearchMode && !mSelectionMode) {
setFocusOnSearchView();
// Since we have the {@link SearchView} in a custom action bar, we must manually handle
// expanding the {@link SearchView} when a search is initiated. Note that a side effect
diff --git a/src/com/android/contacts/activities/PeopleActivity.java b/src/com/android/contacts/activities/PeopleActivity.java
index 64d7843..6a5d348 100644
--- a/src/com/android/contacts/activities/PeopleActivity.java
+++ b/src/com/android/contacts/activities/PeopleActivity.java
@@ -56,6 +56,7 @@
import com.android.contacts.common.ContactsUtils;
import com.android.contacts.common.dialog.ClearFrequentsDialog;
import com.android.contacts.common.util.ImplicitIntentsUtil;
+import com.android.contacts.common.widget.FloatingActionButtonController;
import com.android.contacts.editor.EditorIntents;
import com.android.contacts.interactions.ContactDeletionInteraction;
import com.android.contacts.common.interactions.ImportExportDialogFragment;
@@ -119,6 +120,9 @@
private ContactsRequest mRequest;
private ActionBarAdapter mActionBarAdapter;
+ private FloatingActionButtonController mFloatingActionButtonController;
+ private View mFloatingActionButtonContainer;
+ private boolean wasLastFabAnimationScaleIn = false;
private ContactTileListFragment.Listener mFavoritesFragmentListener =
new StrequentContactListFragmentListener();
@@ -366,12 +370,14 @@
// Add shadow under toolbar
ViewUtil.addRectangularOutlineProvider(findViewById(R.id.toolbar_parent), getResources());
- // Configure action button
- final View floatingActionButtonContainer = findViewById(
- R.id.floating_action_button_container);
- ViewUtil.setupFloatingActionButton(floatingActionButtonContainer, getResources());
- final ImageButton floatingActionButton = (ImageButton) findViewById(R.id.floating_action_button);
+ // Configure floating action button
+ mFloatingActionButtonContainer = findViewById(R.id.floating_action_button_container);
+ final ImageButton floatingActionButton
+ = (ImageButton) findViewById(R.id.floating_action_button);
floatingActionButton.setOnClickListener(this);
+ initializeFabVisibility();
+ mFloatingActionButtonController = new FloatingActionButtonController(this,
+ mFloatingActionButtonContainer, floatingActionButton);
invalidateOptionsMenuIfNeeded();
}
@@ -494,6 +500,33 @@
invalidateOptionsMenuIfNeeded();
}
+ private void initializeFabVisibility() {
+ final boolean hideFab = mActionBarAdapter.isSearchMode()
+ || mActionBarAdapter.isSelectionMode();
+ mFloatingActionButtonContainer.setVisibility(hideFab ? View.GONE : View.VISIBLE);
+ wasLastFabAnimationScaleIn = !hideFab;
+ }
+
+ private void showFabWithAnimation(boolean showFab) {
+ if (mFloatingActionButtonContainer == null) {
+ return;
+ }
+ if (showFab) {
+ if (!wasLastFabAnimationScaleIn) {
+ mFloatingActionButtonContainer.setVisibility(View.VISIBLE);
+ mFloatingActionButtonController.scaleIn(0);
+ }
+ wasLastFabAnimationScaleIn = true;
+
+ } else {
+ if (wasLastFabAnimationScaleIn) {
+ mFloatingActionButtonContainer.setVisibility(View.VISIBLE);
+ mFloatingActionButtonController.scaleOut();
+ }
+ wasLastFabAnimationScaleIn = false;
+ }
+ }
+
@Override
public void onContactListFilterChanged() {
if (mAllFragment == null || !mAllFragment.isAdded()) {
@@ -519,11 +552,16 @@
configureFragments(false /* from request */);
updateFragmentsVisibility();
invalidateOptionsMenu();
+ showFabWithAnimation(/* showFabWithAnimation = */ false);
+ break;
+ case ActionBarAdapter.Listener.Action.BEGIN_STOPPING_SEARCH_AND_SELECTION_MODE:
+ showFabWithAnimation(/* showFabWithAnimation = */ true);
break;
case ActionBarAdapter.Listener.Action.STOP_SEARCH_AND_SELECTION_MODE:
setQueryTextToFragment("");
updateFragmentsVisibility();
invalidateOptionsMenu();
+ showFabWithAnimation(/* showFabWithAnimation = */ true);
break;
case ActionBarAdapter.Listener.Action.CHANGE_SEARCH_QUERY:
final String queryString = mActionBarAdapter.getQueryString();
@@ -935,10 +973,8 @@
private final class CheckBoxListListener implements OnCheckBoxListActionListener {
@Override
public void onStartDisplayingCheckBoxes() {
- if (!mActionBarAdapter.isSearchMode()) {
- mActionBarAdapter.setSelectionMode(true);
- invalidateOptionsMenu();
- }
+ mActionBarAdapter.setSelectionMode(true);
+ invalidateOptionsMenu();
}
@Override