From 5024503702fa464cb5722a1893118a9a0ea32c3b Mon Sep 17 00:00:00 2001 From: Sunny Goyal Date: Wed, 13 Jul 2016 14:24:18 -0700 Subject: [PATCH] Preventing unnecessary layouts on search focus change Instead of expanding the edittext, using a separate textview which is shown/hidden as the hint text Change-Id: Ib4cedeaed9291f972be2ee407c06f4944c983e27 --- res/layout/all_apps.xml | 25 ++++--- res/values/config.xml | 3 + .../allapps/AllAppsContainerView.java | 73 ++++++++----------- 3 files changed, 46 insertions(+), 55 deletions(-) diff --git a/res/layout/all_apps.xml b/res/layout/all_apps.xml index d55fda7713..7492a8e774 100644 --- a/res/layout/all_apps.xml +++ b/res/layout/all_apps.xml @@ -59,7 +59,7 @@ android:focusable="true" android:theme="@style/CustomOverscroll.Light" /> - + android:saveEnabled="false" + android:paddingTop="@dimen/all_apps_search_bar_margin_top" > - + android:gravity="center_vertical" + android:id="@+id/search_hint" + android:layout_gravity="center_horizontal" + android:drawablePadding="@dimen/all_apps_search_bar_icon_margin_right" + android:drawableStart="@drawable/ic_allapps_search" + android:text="@string/all_apps_search_bar_hint" + android:textColor="@drawable/all_apps_search_hint" + android:textSize="16sp" /> - + 17 + + 50 + diff --git a/src/com/android/launcher3/allapps/AllAppsContainerView.java b/src/com/android/launcher3/allapps/AllAppsContainerView.java index fc1288da8b..561cc41c24 100644 --- a/src/com/android/launcher3/allapps/AllAppsContainerView.java +++ b/src/com/android/launcher3/allapps/AllAppsContainerView.java @@ -15,6 +15,7 @@ */ package com.android.launcher3.allapps; +import android.animation.ObjectAnimator; import android.annotation.SuppressLint; import android.content.Context; import android.content.res.Resources; @@ -25,19 +26,15 @@ import android.text.Selection; import android.text.SpannableStringBuilder; import android.text.method.TextKeyListener; import android.util.AttributeSet; -import android.view.Gravity; import android.view.KeyEvent; -import android.view.LayoutInflater; import android.view.MotionEvent; import android.view.View; import android.view.ViewConfiguration; import android.view.ViewGroup; -import android.widget.ImageView; -import android.widget.LinearLayout; +import android.view.animation.AnimationUtils; import com.android.launcher3.AppInfo; import com.android.launcher3.BaseContainerView; -import com.android.launcher3.BubbleTextView; import com.android.launcher3.CellLayout; import com.android.launcher3.DeleteDropTarget; import com.android.launcher3.DeviceProfile; @@ -150,7 +147,6 @@ public class AllAppsContainerView extends BaseContainerView implements DragSourc private View mSearchContainer; private ExtendedEditText mSearchInput; - private ImageView mSearchIcon; private HeaderElevationController mElevationController; private int mSearchContainerOffsetTop; @@ -313,40 +309,35 @@ public class AllAppsContainerView extends BaseContainerView implements DragSourc mSearchContainer = findViewById(R.id.search_container); mSearchInput = (ExtendedEditText) findViewById(R.id.search_box_input); - mSearchIcon = (ImageView) findViewById(R.id.search_icon); mSearchContainerOffsetTop = getResources().getDimensionPixelSize( R.dimen.all_apps_search_bar_margin_top); - final LinearLayout.LayoutParams searchParams = - (LinearLayout.LayoutParams) mSearchInput.getLayoutParams(); + final View searchHint = findViewById(R.id.search_hint); + final ObjectAnimator searchInputAnimator = ObjectAnimator.ofFloat(mSearchInput, + View.TRANSLATION_X, 0); + searchInputAnimator.setDuration(getContext().getResources().getInteger( + R.integer.config_searchHintAnimationDuration)); + searchInputAnimator.setInterpolator(AnimationUtils.loadInterpolator(getContext(), + android.R.interpolator.accelerate_decelerate)); + mSearchInput.setOnFocusChangeListener(new OnFocusChangeListener() { @Override public void onFocusChange(View view, boolean focused) { if (focused) { - searchParams.width = LayoutParams.MATCH_PARENT; - mSearchInput.setLayoutParams(searchParams); - mSearchInput.setGravity(Gravity.FILL_HORIZONTAL | Gravity.CENTER_VERTICAL); - mSearchIcon.setVisibility(View.GONE); + searchHint.setVisibility(View.INVISIBLE); + if (searchInputAnimator.isRunning()) { + searchInputAnimator.end(); + } + + searchInputAnimator.setFloatValues(searchHint.getLeft(), 0); + searchInputAnimator.start(); } else { - searchParams.width = LayoutParams.WRAP_CONTENT; - mSearchInput.setLayoutParams(searchParams); - mSearchInput.setGravity(Gravity.START | Gravity.CENTER_VERTICAL); - mSearchIcon.setVisibility(View.VISIBLE); + searchHint.setVisibility(View.VISIBLE); + mSearchInput.setTranslationX(0); } } }); - final OnClickListener searchFocusListener = new OnClickListener() { - @Override - public void onClick(View view) { - if (!mSearchBarController.isSearchFieldFocused()) { - mSearchBarController.focusSearchField(); - } - } - }; - mSearchInput.setOnClickListener(searchFocusListener); - mSearchContainer.setOnClickListener(searchFocusListener); - mElevationController = Utilities.ATLEAST_LOLLIPOP ? new HeaderElevationController.ControllerVL(mSearchContainer) : new HeaderElevationController.ControllerV16(mSearchContainer); @@ -405,8 +396,11 @@ public class AllAppsContainerView extends BaseContainerView implements DragSourc final int thumbMaxWidth = getResources().getDimensionPixelSize( R.dimen.container_fastscroll_thumb_max_width); - mSearchContainer.setPaddingRelative(rvPadding + thumbMaxWidth, 0, rvPadding + - thumbMaxWidth, 0); + mSearchContainer.setPadding( + rvPadding - mHorizontalPadding + thumbMaxWidth, + mSearchContainer.getPaddingTop(), + rvPadding - mHorizontalPadding + thumbMaxWidth, + mSearchContainer.getPaddingBottom()); } } super.onMeasure(widthMeasureSpec, heightMeasureSpec); @@ -435,14 +429,6 @@ public class AllAppsContainerView extends BaseContainerView implements DragSourc mAppsRecyclerView.setNumAppsPerRow(grid, mNumAppsPerRow); mAdapter.setNumAppsPerRow(mNumAppsPerRow); mApps.setNumAppsPerRow(mNumAppsPerRow, mNumPredictedAppsPerRow, mergeAlgorithm); - - // TODO: should we not do all this complicated computation but just match the - // numAppsPerRow with the workspace? - if (mNumAppsPerRow > 0) { - int iconSize = availableWidth / mNumAppsPerRow; - int iconSpacing = (iconSize - grid.allAppsIconSizePx) / 2; - mSearchInput.setPaddingRelative(iconSpacing, 0, iconSpacing, 0); - } } // --- remove END when {@code FeatureFlags.LAUNCHER3_ALL_APPS_PULL_UP} is enabled. --- @@ -499,12 +485,11 @@ public class AllAppsContainerView extends BaseContainerView implements DragSourc mlp.topMargin = height; mAppsRecyclerView.setLayoutParams(mlp); - LinearLayout.LayoutParams llp = - (LinearLayout.LayoutParams) mSearchInput.getLayoutParams(); - llp.topMargin = insets.top + mSearchContainerOffsetTop; - mSearchInput.setLayoutParams(llp); - mSearchIcon.setLayoutParams(llp); - + mSearchContainer.setPadding( + mSearchContainer.getPaddingLeft(), + insets.top + mSearchContainerOffsetTop, + mSearchContainer.getPaddingRight(), + mSearchContainer.getPaddingBottom()); lp.height = height; View navBarBg = findViewById(R.id.nav_bar_bg);