Dashboard search bar polish

Various tweaks to match redlines:
- background is now grey all the time
- the search icon is aligned with the other icons
- the title text is primary colored instead of accent colored
- the background of search bar doesn't scroll anymore

Deletes a bunch of logic to add an initial view that would be
colored based on the first view. It never quite worked right.
Now it's consistent and never moves.

Bug: 37477506
Change-Id: I82c584e8f8ecc6fc298c5cdbce08516c6a069a39
Fixes: 62267378
Fixes: 62379978
Fixes: 62361213
Test: robotests
This commit is contained in:
Andrew Sapperstein
2017-06-25 15:18:46 -07:00
parent 4bac421538
commit c217464dca
7 changed files with 45 additions and 161 deletions

View File

@@ -1,25 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- Copyright (C) 2017 The Android Open Source Project
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
-->
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:padding="@dimen/search_bar_margin">
<View
android:layout_width="match_parent"
android:layout_height="?android:attr/actionBarSize"/>
</LinearLayout>

View File

@@ -17,14 +17,15 @@
*/
-->
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_width="match_parent">
android:orientation="vertical">
<FrameLayout
android:id="@+id/main_content"
android:layout_height="match_parent"
android:layout_width="match_parent"/>
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="@color/material_grey_300">
<android.support.v7.widget.CardView
android:id="@+id/search_bar"
android:layout_width="match_parent"
@@ -37,12 +38,15 @@
android:id="@+id/search_action_bar"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginStart="@dimen/search_bar_negative_margin"
android:background="?android:attr/selectableItemBackground"
android:contentInsetStartWithNavigation="64dp"
android:navigationIcon="@drawable/ic_search_24dp"
android:title="@string/search_menu"
android:titleTextAppearance="?android:attr/subtitleTextAppearance"
android:titleTextColor="?android:attr/textColorHint"
android:titleTextColor="@*android:color/text_color_primary"
android:theme="?android:attr/actionBarTheme"/>
</android.support.v7.widget.CardView>
</FrameLayout>
<FrameLayout
android:id="@+id/main_content"
android:layout_height="match_parent"
android:layout_width="match_parent"/>
</LinearLayout>

View File

@@ -337,6 +337,14 @@ public class SettingsActivity extends SettingsDrawerActivity
Toolbar toolbar = findViewById(R.id.search_action_bar);
toolbar.setOnClickListener(this);
setActionBar(toolbar);
// Please forgive me for what I am about to do.
//
// Need to make the navigation icon non-clickable so that the entire card is clickable
// and goes to the search UI. Also set the background to null so there's no ripple.
View navView = toolbar.getNavigationView();
navView.setClickable(false);
navView.setBackground(null);
}
ActionBar actionBar = getActionBar();

View File

@@ -65,7 +65,6 @@ public class DashboardAdapter extends RecyclerView.Adapter<DashboardAdapter.Dash
private static final String STATE_CATEGORY_LIST = "category_list";
private static final String STATE_SUGGESTION_MODE = "suggestion_mode";
private static final String STATE_SUGGESTIONS_SHOWN_LOGGED = "suggestions_shown_logged";
private static final int DONT_SET_BACKGROUND_ATTR = -1;
private static final String STATE_SUGGESTION_CONDITION_MODE = "suggestion_condition_mode";
private final IconCache mCache;
@@ -305,9 +304,6 @@ public class DashboardAdapter extends RecyclerView.Adapter<DashboardAdapter.Dash
public void onBindViewHolder(DashboardItemHolder holder, int position) {
final int type = mDashboardData.getItemTypeByPosition(position);
switch (type) {
case R.layout.dashboard_header_spacer:
onBindHeaderSpacer(holder, position);
break;
case R.layout.dashboard_tile:
final Tile tile = (Tile) mDashboardData.getItemEntityByPosition(position);
onBindTile(holder, tile);
@@ -480,33 +476,6 @@ public class DashboardAdapter extends RecyclerView.Adapter<DashboardAdapter.Dash
notifyDashboardDataChanged(prevData);
}
private void onBindHeaderSpacer(DashboardItemHolder holder, int position) {
if (mDashboardData.size() > (position + 1)) {
// The spacer that goes underneath the search bar needs to match the
// background of the first real view. That view is either a condition,
// a suggestion, or the dashboard item.
//
// If it's a dashboard item, set null background so it uses the parent's
// background like the other views. Otherwise, match the colors.
int nextType = mDashboardData.getItemTypeByPosition(position + 1);
int colorAttr = nextType == R.layout.suggestion_header
? android.R.attr.colorSecondary
: nextType == R.layout.condition_card
? android.R.attr.colorAccent
: DONT_SET_BACKGROUND_ATTR;
if (colorAttr != DONT_SET_BACKGROUND_ATTR) {
TypedArray array = holder.itemView.getContext()
.obtainStyledAttributes(new int[]{colorAttr});
@ColorInt int color = array.getColor(0, 0);
array.recycle();
holder.itemView.setBackgroundColor(color);
} else {
holder.itemView.setBackground(null);
}
}
}
@VisibleForTesting
void onBindSuggestionHeader(final DashboardItemHolder holder, DashboardData
.SuggestionHeaderData data) {

View File

@@ -59,8 +59,7 @@ public class DashboardData {
public static final int DEFAULT_SUGGESTION_COUNT = 2;
// id namespace for different type of items.
private static final int NS_HEADER_SPACER = 0;
private static final int NS_SPACER = 1000;
private static final int NS_SPACER = 0;
private static final int NS_ITEMS = 2000;
private static final int NS_CONDITION = 3000;
private static final int NS_SUGGESTION_CONDITION = 4000;
@@ -281,9 +280,6 @@ public class DashboardData {
* and mIsShowingAll, mSuggestionMode flag.
*/
private void buildItemsData() {
// add the view that goes under the search bar
countItem(null, R.layout.dashboard_header_spacer, true, NS_HEADER_SPACER);
resetCount();
final boolean hasSuggestions = sizeOf(mSuggestions) > 0;
if (!mCombineSuggestionAndCondition) {
boolean hasConditions = false;

View File

@@ -123,53 +123,6 @@ public class DashboardAdapterTest {
when(mView.getTag()).thenReturn(mCondition);
}
@Test
public void testOnBindViewHolder_spacer_noSuggestions_noConditions() {
makeCategory();
DashboardAdapter.DashboardItemHolder holder = setupSpacer();
mDashboardAdapter.onBindViewHolder(holder, 0);
assertThat(holder.itemView.getBackground()).isNull();
}
@Test
public void testOnBindViewHolder_spacer_suggestion_noConditions() {
setupSuggestions(makeSuggestions("pkg1"));
makeCategory();
DashboardAdapter.DashboardItemHolder holder = setupSpacer();
mDashboardAdapter.onBindViewHolder(holder, 0);
assertThat(holder.itemView.getBackground()).isNotNull();
assertThat(holder.itemView.getBackground()).isInstanceOf(ColorDrawable.class);
}
@Test
public void testOnBindViewHolder_spacer_noSuggestion_condition() {
makeCondition();
makeCategory();
DashboardAdapter.DashboardItemHolder holder = setupSpacer();
mDashboardAdapter.onBindViewHolder(holder, 0);
assertThat(holder.itemView.getBackground()).isNotNull();
assertThat(holder.itemView.getBackground()).isInstanceOf(ColorDrawable.class);
}
@Test
public void testOnBindViewHolder_spacer_suggestion_condition() {
setupSuggestions(makeSuggestions("pkg1"));
makeCondition();
makeCategory();
DashboardAdapter.DashboardItemHolder holder = setupSpacer();
mDashboardAdapter.onBindViewHolder(holder, 0);
assertThat(holder.itemView.getBackground()).isNotNull();
assertThat(holder.itemView.getBackground()).isInstanceOf(ColorDrawable.class);
}
@Test
public void testSuggestionsLogs_NotExpanded() {
setupSuggestions(makeSuggestions("pkg1", "pkg2", "pkg3"));
@@ -388,7 +341,7 @@ public class DashboardAdapterTest {
new FrameLayout(RuntimeEnvironment.application),
R.layout.suggestion_tile_card);
mDashboardAdapter.onBindViewHolder(mSuggestionHolder, 2);
mDashboardAdapter.onBindViewHolder(mSuggestionHolder, 1);
assertThat(textView.getParent()).isSameAs(mSuggestionHolder.itemView);
mSuggestionHolder.itemView.performClick();
@@ -413,7 +366,7 @@ public class DashboardAdapterTest {
new FrameLayout(context),
R.layout.suggestion_tile_card);
mDashboardAdapter.onBindViewHolder(mSuggestionHolder, 2);
mDashboardAdapter.onBindViewHolder(mSuggestionHolder, 1);
mSuggestionHolder.itemView.performClick();
assertThat(ShadowApplication.getInstance().getNextStartedActivity()).isNull();
@@ -442,8 +395,8 @@ public class DashboardAdapterTest {
new FrameLayout(context),
R.layout.suggestion_tile_card);
mDashboardAdapter.onBindViewHolder(mSuggestionHolder, 2);
mDashboardAdapter.onBindViewHolder(mSuggestionHolder, 2);
mDashboardAdapter.onBindViewHolder(mSuggestionHolder, 1);
mDashboardAdapter.onBindViewHolder(mSuggestionHolder, 1);
ViewGroup itemView = (ViewGroup) mSuggestionHolder.itemView;
assertThat(itemView.getChildCount()).isEqualTo(1);
@@ -509,25 +462,4 @@ public class DashboardAdapterTest {
new FrameLayout(RuntimeEnvironment.application),
mDashboardAdapter.getItemViewType(1));
}
private void makeCondition() {
final List<Condition> conditions = new ArrayList<>();
Condition condition = mock(Condition.class);
when(condition.shouldShow()).thenReturn(true);
conditions.add(condition);
mDashboardAdapter.setConditions(conditions);
}
private void makeCategory() {
List<DashboardCategory> categories = new ArrayList<>();
categories.add(new DashboardCategory());
mDashboardAdapter.setCategory(categories);
}
private DashboardAdapter.DashboardItemHolder setupSpacer() {
Context context = RuntimeEnvironment.application;
final View view = LayoutInflater.from(context)
.inflate(R.layout.dashboard_header_spacer, new LinearLayout(context), false);
return new DashboardAdapter.DashboardItemHolder(view);
}
}

View File

@@ -119,7 +119,7 @@ public class DashboardDataTest {
final DashboardData.SuggestionConditionHeaderData data =
new DashboardData.SuggestionConditionHeaderData(
mDashboardDataWithOneConditions.getConditions(), 0);
final Object[] expectedObjects = {null, data,
final Object[] expectedObjects = {data,
mDashboardDataWithOneConditions.getSuggestions(),
mDashboardDataWithOneConditions.getConditions(),
null, mTestCategoryTile};
@@ -198,11 +198,11 @@ public class DashboardDataTest {
// Item in position 1 is the header, which contains the number of conditions, changed from
// 1 to 2
testResultData.add(new ListUpdateResult.ResultData(
ListUpdateResult.ResultData.TYPE_OPERATION_CHANGE, 1, 1));
ListUpdateResult.ResultData.TYPE_OPERATION_CHANGE, 0, 1));
// Item in position 3 is the condition container containing the list of conditions, which
// gets 1 more item
testResultData.add(new ListUpdateResult.ResultData(
ListUpdateResult.ResultData.TYPE_OPERATION_CHANGE, 3, 1));
ListUpdateResult.ResultData.TYPE_OPERATION_CHANGE, 2, 1));
testDiffUtil(mDashboardDataWithOneConditions,
mDashboardDataWithTwoConditions, testResultData);
@@ -213,7 +213,7 @@ public class DashboardDataTest {
//Build testResultData
final List<ListUpdateResult.ResultData> testResultData = new ArrayList<>();
testResultData.add(new ListUpdateResult.ResultData(
ListUpdateResult.ResultData.TYPE_OPERATION_REMOVE, 1, 5));
ListUpdateResult.ResultData.TYPE_OPERATION_REMOVE, 0, 5));
testDiffUtil(mDashboardDataWithOneConditions, mDashboardDataWithNoItems, testResultData);
}