DO NOT MERGE. Styling search to match redlines.
- This conflicts with some of Sai's changes, so will manually
cherrypick this CL back to master..
- Shift arrow/close icons.
- Use 20sp font in expanded search (causes baseline to shift down).
- Update action bar movement to use dialpad's interpolators and
durations.
- Smoothed out animations. Icons in the view being faded out are now
instantaneously set to GONE. The margin animator when going from
collapsed to expanded starts at 0.8f now, so that the searchbox does
not shrink momentarily when switched to the 9-patch, because of the
shadow.
- Fix clipping because of 9-patch; refactored logic for updating
the position and padding from the Activity into SearchFragment. This
was motivated in part because we want a padding at the top of this
list for the first item, but when the dialpad is shown we do not
want that padding.
Bug: 15343931
Change-Id: I7c3a96dd295c58c6955e6bd3e9d8cda151de4c3f
diff --git a/res/anim/slide_in.xml b/res/anim/slide_in.xml
index b0eed37..4463f2f 100644
--- a/res/anim/slide_in.xml
+++ b/res/anim/slide_in.xml
@@ -15,6 +15,6 @@
-->
<translate xmlns:android="http://schemas.android.com/apk/res/android"
android:interpolator="@interpolator/ease_in_interpolator"
- android:duration="532"
+ android:duration="@integer/dialpad_slide_in_duration"
android:fromYDelta="67%p"
android:toYDelta="0" />
\ No newline at end of file
diff --git a/res/anim/slide_out.xml b/res/anim/slide_out.xml
index 231555e..88687f4 100644
--- a/res/anim/slide_out.xml
+++ b/res/anim/slide_out.xml
@@ -15,6 +15,6 @@
-->
<translate xmlns:android="http://schemas.android.com/apk/res/android"
android:interpolator="@interpolator/ease_out_interpolator"
- android:duration="257"
+ android:duration="@integer/dialpad_slide_out_duration"
android:fromYDelta="0"
android:toYDelta="80%p" />
\ No newline at end of file
diff --git a/res/layout/search_edittext.xml b/res/layout/search_edittext.xml
index 50cbf5a..ac1114e 100644
--- a/res/layout/search_edittext.xml
+++ b/res/layout/search_edittext.xml
@@ -9,18 +9,28 @@
android:layout_marginBottom="@dimen/search_bottom_margin"
android:layout_marginLeft="@dimen/search_margin_horizontal"
android:layout_marginRight="@dimen/search_margin_horizontal"
- android:paddingLeft="@dimen/search_box_left_padding"
- android:paddingRight="@dimen/search_box_right_padding"
android:background="@drawable/rounded_corner"
- android:elevation="@dimen/search_box_elevation"
- >
+ android:elevation="@dimen/search_box_elevation">
+
<LinearLayout
android:id="@+id/search_box_collapsed"
android:layout_width="match_parent"
android:layout_height="match_parent"
+ android:paddingStart="@dimen/search_box_left_padding"
+ android:paddingEnd="@dimen/search_box_right_padding"
android:gravity="center_vertical"
android:orientation="horizontal" >
+ <ImageView
+ android:id="@+id/search_magnifying_glass"
+ android:layout_height="@dimen/search_box_icon_size"
+ android:layout_width="@dimen/search_box_icon_size"
+ android:layout_margin="@dimen/search_box_icon_margin"
+ android:padding="@dimen/search_box_search_icon_padding"
+ android:src="@drawable/ic_ab_search"
+ android:importantForAccessibility="no"
+ android:tint="@color/searchbox_icon_tint" />
+
<!-- Portion of the search box that starts a search when clicked -->
<LinearLayout
android:id="@+id/search_box_start_search"
@@ -29,21 +39,11 @@
android:layout_weight="1"
android:gravity="center_vertical" >
- <ImageView
- android:id="@+id/search_magnifying_glass"
- android:layout_height="@dimen/search_box_icon_size"
- android:layout_width="@dimen/search_box_icon_size"
- android:layout_margin="@dimen/search_box_icon_margin"
- android:padding="@dimen/search_box_search_icon_padding"
- android:src="@drawable/ic_ab_search"
- android:importantForAccessibility="no"
- android:tint="@color/searchbox_icon_tint" />
-
<TextView
android:layout_width="wrap_content"
android:layout_height="@dimen/search_box_icon_size"
- android:layout_marginLeft="@dimen/search_box_text_left_margin"
- android:textSize="@dimen/search_text_size"
+ android:layout_marginLeft="@dimen/search_box_collapsed_text_margin_left"
+ android:textSize="@dimen/search_collapsed_text_size"
android:fontFamily="@string/search_font_family"
android:textColor="@color/searchbox_text_color"
android:textColorHint="@color/searchbox_hint_text_color"
@@ -88,7 +88,7 @@
android:id="@+id/search_back_button"
android:layout_width="@dimen/search_box_icon_size"
android:layout_height="@dimen/search_box_icon_size"
- android:layout_margin="@dimen/search_box_icon_margin"
+ android:layout_marginLeft="8dp"
android:src="@drawable/ic_back_arrow"
android:background="?android:attr/selectableItemBackground"
android:contentDescription="@string/action_menu_overflow_description"
@@ -97,10 +97,10 @@
<EditText
android:id="@+id/search_view"
android:layout_width="0dp"
- android:layout_height="@dimen/search_box_icon_size"
+ android:layout_height="@dimen/action_bar_height"
android:layout_weight="1"
- android:layout_marginLeft="@dimen/search_box_text_left_margin"
- android:textSize="@dimen/search_text_size"
+ android:layout_marginLeft="@dimen/search_box_expanded_text_margin_left"
+ android:textSize="@dimen/search_expanded_text_size"
android:fontFamily="@string/search_font_family"
android:textColor="@color/searchbox_text_color"
android:inputType="textFilter" />
@@ -109,7 +109,7 @@
android:id="@+id/search_close_button"
android:layout_height="@dimen/search_box_icon_size"
android:layout_width="@dimen/search_box_icon_size"
- android:layout_margin="@dimen/search_box_icon_margin"
+ android:layout_marginRight="8dp"
android:src="@drawable/ic_close_dk"
android:clickable="true"
android:background="?android:attr/selectableItemBackground"
diff --git a/res/values/animation_constants.xml b/res/values/animation_constants.xml
index 7863060..05b8e21 100644
--- a/res/values/animation_constants.xml
+++ b/res/values/animation_constants.xml
@@ -16,6 +16,8 @@
-->
<resources>
<integer name="fade_duration">300</integer>
+ <integer name="dialpad_slide_in_duration">532</integer>
+ <integer name="dialpad_slide_out_duration">257</integer>
<!-- Swipe constants -->
<integer name="swipe_escape_velocity">100</integer>
diff --git a/res/values/dimens.xml b/res/values/dimens.xml
index e659f57..6efb5ac 100644
--- a/res/values/dimens.xml
+++ b/res/values/dimens.xml
@@ -16,9 +16,6 @@
-->
<resources>
- <!-- Search View -->
- <dimen name="search_text_size">14sp</dimen>
-
<!--
Drag to remove view (in dp because it is used in conjunction with a statically
sized icon
@@ -106,8 +103,8 @@
<dimen name="search_top_margin">8dp</dimen>
<!-- Margin below the search box. -->
<dimen name="search_bottom_margin">8dp</dimen>
- <!-- Search box text size -->
- <dimen name="search_text_size">13.24sp</dimen>
+ <dimen name="search_collapsed_text_size">14sp</dimen>
+ <dimen name="search_expanded_text_size">20sp</dimen>
<!-- Search box interior padding - left -->
<dimen name="search_box_left_padding">8dp</dimen>
<!-- Search box interior padding - right -->
@@ -115,11 +112,11 @@
<!-- Padding around the icon in the search box. -->
<dimen name="search_box_icon_margin">4dp</dimen>
<dimen name="search_box_search_icon_padding">4dp</dimen>
- <!-- Left margin of the text field in the search box. -->
- <dimen name="search_box_text_left_margin">27dp</dimen>
+ <dimen name="search_box_collapsed_text_margin_left">24dp</dimen>
+ <dimen name="search_box_expanded_text_margin_left">26dp</dimen>
<!-- Size of the icon (voice search, close search) in the search box. -->
<dimen name="search_box_icon_size">28dp</dimen>
- <!-- Elevation of the search box -->
+ <dimen name="search_list_padding_top">8dp</dimen>
<dimen name="search_box_elevation">3dp</dimen>
<!-- Size of text in tabs. -->
diff --git a/src/com/android/dialer/DialtactsActivity.java b/src/com/android/dialer/DialtactsActivity.java
index df2a87c..26c1698 100644
--- a/src/com/android/dialer/DialtactsActivity.java
+++ b/src/com/android/dialer/DialtactsActivity.java
@@ -141,8 +141,6 @@
private static final int ACTIVITY_REQUEST_CODE_VOICE_SEARCH = 1;
- private static final int ANIMATION_DURATION = 250;
-
private RelativeLayout parentLayout;
/**
@@ -206,8 +204,6 @@
*/
private View mRemoveViewContainer;
- final Interpolator hideActionBarInterpolator = new AccelerateInterpolator(1.5f);
- final Interpolator showActionBarInterpolator = new DecelerateInterpolator(1.5f);
private String mSearchQuery;
private DialerDatabaseHelper mDialerDatabaseHelper;
@@ -662,7 +658,6 @@
}
private void updateSearchFragmentPosition() {
- int translationValue = mIsDialpadShown ? -mActionBarHeight : 0;
SearchFragment fragment = null;
if (mSmartDialSearchFragment != null && mSmartDialSearchFragment.isVisible()) {
fragment = mSmartDialSearchFragment;
@@ -670,8 +665,7 @@
fragment = mRegularSearchFragment;
}
if (fragment != null && fragment.isVisible()) {
- fragment.getView().animate().translationY(translationValue)
- .setInterpolator(hideActionBarInterpolator).setDuration(ANIMATION_DURATION);
+ fragment.updatePosition(true /* animate */);
}
}
@@ -1145,6 +1139,10 @@
return mActionBarController.isActionBarShowing();
}
+ public boolean isDialpadShown() {
+ return mIsDialpadShown;
+ }
+
@Override
public int getActionBarHideOffset() {
return getActionBar().getHideOffset();
diff --git a/src/com/android/dialer/list/SearchFragment.java b/src/com/android/dialer/list/SearchFragment.java
index 9a30c4d..9e2b8d0 100644
--- a/src/com/android/dialer/list/SearchFragment.java
+++ b/src/com/android/dialer/list/SearchFragment.java
@@ -17,13 +17,16 @@
import android.app.Activity;
import android.content.Intent;
+import android.content.res.Resources;
import android.os.Bundle;
import android.text.TextUtils;
import android.view.View;
+import android.view.animation.Interpolator;
import android.widget.AbsListView;
import android.widget.AbsListView.OnScrollListener;
import android.widget.ListView;
+import com.android.contacts.common.animation.AnimUtils;
import com.android.contacts.common.list.ContactEntryListAdapter;
import com.android.contacts.common.list.ContactListItemView;
import com.android.contacts.common.list.OnPhoneNumberPickerActionListener;
@@ -31,7 +34,6 @@
import com.android.contacts.common.util.ViewUtil;
import com.android.dialer.DialtactsActivity;
import com.android.dialer.R;
-import com.android.dialer.list.OnListFragmentScrolledListener;
import com.android.dialer.util.DialerUtils;
public class SearchFragment extends PhoneNumberPickerFragment {
@@ -44,9 +46,16 @@
*/
private String mAddToContactNumber;
private int mActionBarHeight;
+ private int mShadowHeight;
+ private int mPaddingTop;
+ private int mShowDialpadDuration;
+ private int mHideDialpadDuration;
+
+ private HostInterface mActivity;
public interface HostInterface {
public boolean isActionBarShowing();
+ public boolean isDialpadShown();
public int getActionBarHideOffset();
public int getActionBarHeight();
}
@@ -75,9 +84,14 @@
getAdapter().setHasHeader(0, false);
}
- HostInterface activity = (HostInterface) getActivity();
+ mActivity = (HostInterface) getActivity();
- mActionBarHeight = activity.getActionBarHeight();
+ final Resources res = getResources();
+ mActionBarHeight = mActivity.getActionBarHeight();
+ mShadowHeight = res.getDrawable(R.drawable.search_shadow).getIntrinsicHeight();
+ mPaddingTop = res.getDimensionPixelSize(R.dimen.search_list_padding_top);
+ mShowDialpadDuration = res.getInteger(R.integer.dialpad_slide_in_duration);
+ mHideDialpadDuration = res.getInteger(R.integer.dialpad_slide_out_duration);
final View parentView = getView();
parentView.setPaddingRelative(
@@ -88,6 +102,7 @@
final ListView listView = getListView();
+ listView.setClipToPadding(false);
listView.setOnScrollListener(new OnScrollListener() {
@Override
public void onScrollStateChanged(AbsListView view, int scrollState) {
@@ -100,10 +115,7 @@
}
});
-
- if (!activity.isActionBarShowing()) {
- parentView.setTranslationY(-mActionBarHeight);
- }
+ updatePosition(false /* animate */);
}
@Override
@@ -155,4 +167,36 @@
R.string.add_contact_not_available);
}
}
+
+ /**
+ * Updates the position and padding of the search fragment, depending on whether the dialpad is
+ * shown. This can be optionally animated.
+ * @param animate
+ */
+ public void updatePosition(boolean animate) {
+ // Use negative shadow height instead of 0 to account for the 9-patch's shadow.
+ int translationValue = mActivity.isDialpadShown() ? -mActionBarHeight : -mShadowHeight;
+
+ if (animate) {
+ Interpolator interpolator =
+ mActivity.isDialpadShown() ? AnimUtils.EASE_IN : AnimUtils.EASE_OUT ;
+ int duration =
+ mActivity.isDialpadShown() ? mShowDialpadDuration : mHideDialpadDuration;
+ getView().animate()
+ .translationY(translationValue)
+ .setInterpolator(interpolator)
+ .setDuration(duration);
+ } else {
+ getView().setTranslationY(translationValue);
+ }
+
+ // There is padding which should only be applied when the dialpad is not shown.
+ int paddingTop = mActivity.isDialpadShown() ? 0 : mPaddingTop;
+ final ListView listView = getListView();
+ listView.setPaddingRelative(
+ listView.getPaddingStart(),
+ paddingTop,
+ listView.getPaddingEnd(),
+ listView.getPaddingBottom());
+ }
}
diff --git a/src/com/android/dialer/widget/SearchEditTextLayout.java b/src/com/android/dialer/widget/SearchEditTextLayout.java
index dbb2b22..d229aa4 100644
--- a/src/com/android/dialer/widget/SearchEditTextLayout.java
+++ b/src/com/android/dialer/widget/SearchEditTextLayout.java
@@ -19,6 +19,7 @@
import android.animation.ValueAnimator;
import android.animation.ValueAnimator.AnimatorUpdateListener;
import android.content.Context;
+import android.graphics.Color;
import android.util.AttributeSet;
import android.view.KeyEvent;
import android.view.View;
@@ -30,6 +31,7 @@
import com.android.dialer.R;
public class SearchEditTextLayout extends FrameLayout {
+ private static final float EXPAND_MARGIN_FRACTION_START = 0.8f;
private static final int ANIMATION_DURATION = 200;
private OnKeyListener mPreImeKeyListener;
@@ -47,6 +49,11 @@
private View mCollapsed;
private View mExpanded;
private EditText mSearchView;
+ private View mCollapsedSearchBox;
+ private View mVoiceSearchButtonView;
+ private View mOverflowButtonView;
+ private View mBackButtonView;
+ private View mClearButtonView;
private ValueAnimator mAnimator;
@@ -85,6 +92,12 @@
mExpanded = findViewById(R.id.search_box_expanded);
mSearchView = (EditText) mExpanded.findViewById(R.id.search_view);
+ mCollapsedSearchBox = findViewById(R.id.search_box_start_search);
+ mVoiceSearchButtonView = findViewById(R.id.voice_search_button);
+ mOverflowButtonView = findViewById(R.id.dialtacts_options_menu_button);
+ mBackButtonView = findViewById(R.id.search_back_button);
+ mClearButtonView = findViewById(R.id.search_close_button);
+
mSearchView.setOnFocusChangeListener(new OnFocusChangeListener() {
@Override
public void onFocusChange(View v, boolean hasFocus) {
@@ -149,9 +162,16 @@
}
}
public void expand(boolean animate, boolean requestFocus) {
+ mCollapsedSearchBox.setVisibility(View.GONE);
+ mVoiceSearchButtonView.setVisibility(View.GONE);
+ mOverflowButtonView.setVisibility(View.GONE);
+ mBackButtonView.setVisibility(View.VISIBLE);
+ mClearButtonView.setVisibility(View.VISIBLE);
+
if (animate) {
AnimUtils.crossFadeViews(mExpanded, mCollapsed, ANIMATION_DURATION);
- mAnimator = ValueAnimator.ofFloat(1f, 0f);
+ mAnimator = ValueAnimator.ofFloat(EXPAND_MARGIN_FRACTION_START, 0f);
+ setMargins(EXPAND_MARGIN_FRACTION_START);
prepareAnimator(true);
} else {
mExpanded.setVisibility(View.VISIBLE);
@@ -169,6 +189,12 @@
}
public void collapse(boolean animate) {
+ mCollapsedSearchBox.setVisibility(View.VISIBLE);
+ mVoiceSearchButtonView.setVisibility(View.VISIBLE);
+ mOverflowButtonView.setVisibility(View.VISIBLE);
+ mBackButtonView.setVisibility(View.GONE);
+ mClearButtonView.setVisibility(View.GONE);
+
if (animate) {
AnimUtils.crossFadeViews(mCollapsed, mExpanded, ANIMATION_DURATION);
mAnimator = ValueAnimator.ofFloat(0f, 1f);