diff --git a/res/layout/search_breadcrumb_view.xml b/res/layout/search_breadcrumb_view.xml new file mode 100644 index 00000000000..a78b7450fc9 --- /dev/null +++ b/res/layout/search_breadcrumb_view.xml @@ -0,0 +1,26 @@ + + + + \ No newline at end of file diff --git a/res/layout/search_icon_view.xml b/res/layout/search_icon_view.xml new file mode 100644 index 00000000000..d7e02051ad4 --- /dev/null +++ b/res/layout/search_icon_view.xml @@ -0,0 +1,33 @@ + + + + + \ No newline at end of file diff --git a/res/layout/search_inline_switch_item.xml b/res/layout/search_inline_switch_item.xml index 998c09c30d9..40639b025fd 100644 --- a/res/layout/search_inline_switch_item.xml +++ b/res/layout/search_inline_switch_item.xml @@ -15,67 +15,49 @@ --> + xmlns:android="http://schemas.android.com/apk/res/android" + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:minHeight="?android:attr/listPreferredItemHeight" + android:paddingTop="16dp" + android:paddingBottom="16dp" + android:paddingStart="?android:attr/listPreferredItemPaddingStart" + android:paddingEnd="?android:attr/listPreferredItemPaddingEnd" + android:background="?android:attr/selectableItemBackground" + android:clipToPadding="false"> + + + + - + android:singleLine="true" + android:textAppearance="?android:attr/textAppearanceListItem" + android:ellipsize="marquee"/> + + + + - - - - - - - - + android:id="@+id/switchView" + android:layout_width="wrap_content" + android:layout_height="match_parent" + android:gravity="top" + android:paddingStart="16dp"/> \ No newline at end of file diff --git a/res/layout/search_intent_item.xml b/res/layout/search_intent_item.xml index fcb5532460f..31f7f26eff6 100644 --- a/res/layout/search_intent_item.xml +++ b/res/layout/search_intent_item.xml @@ -15,58 +15,42 @@ --> + xmlns:android="http://schemas.android.com/apk/res/android" + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:minHeight="?android:attr/listPreferredItemHeight" + android:paddingTop="16dp" + android:paddingBottom="16dp" + android:paddingStart="?android:attr/listPreferredItemPaddingStart" + android:paddingEnd="?android:attr/listPreferredItemPaddingEnd" + android:background="?android:attr/selectableItemBackground" + android:clipToPadding="false"> + + + + - + android:singleLine="true" + android:textAppearance="?android:attr/textAppearanceListItem" + android:ellipsize="marquee"/> + + + + - - - - - - - - diff --git a/res/values/strings.xml b/res/values/strings.xml index b4e633978c8..aea2408b75e 100644 --- a/res/values/strings.xml +++ b/res/values/strings.xml @@ -5947,6 +5947,10 @@ Search settings Search settings + + + %1$s > %2$s + Recent searches diff --git a/src/com/android/settings/search2/CursorToSearchResultConverter.java b/src/com/android/settings/search2/CursorToSearchResultConverter.java index 540932c01d9..948397fe265 100644 --- a/src/com/android/settings/search2/CursorToSearchResultConverter.java +++ b/src/com/android/settings/search2/CursorToSearchResultConverter.java @@ -211,7 +211,12 @@ class CursorToSearchResultConverter { } private List getBreadcrumbs(Cursor cursor) { - return new ArrayList<>(); + final List breadcrumbs = new ArrayList<>(); + final String screenTitle = cursor.getString(COLUMN_INDEX_SCREEN_TITLE); + if (!TextUtils.isEmpty(screenTitle)) { + breadcrumbs.add(screenTitle); + } + return breadcrumbs; } /** Uses the breadcrumbs to determine the offset to the base rank. diff --git a/src/com/android/settings/search2/DatabaseIndexingManager.java b/src/com/android/settings/search2/DatabaseIndexingManager.java index 2cd0cea274e..073e202ca44 100644 --- a/src/com/android/settings/search2/DatabaseIndexingManager.java +++ b/src/com/android/settings/search2/DatabaseIndexingManager.java @@ -56,6 +56,7 @@ import java.util.HashMap; import java.util.List; import java.util.Locale; import java.util.Map; +import java.util.Objects; import java.util.concurrent.atomic.AtomicBoolean; import static android.provider.SearchIndexablesContract.COLUMN_INDEX_NON_INDEXABLE_KEYS_KEY_VALUE; @@ -279,7 +280,7 @@ public class DatabaseIndexingManager { * @param className the class name (typically a fragment name). * @param rebuild true means that you want to delete the data from the Index first. * @param includeInSearchResults true means that you want the bit "enabled" set so that the - * data will be seen included into the search results + * data will be seen included into the search results */ public void updateFromClassNameResource(String className, final boolean rebuild, boolean includeInSearchResults) { @@ -287,7 +288,7 @@ public class DatabaseIndexingManager { throw new IllegalArgumentException("class name cannot be null!"); } final SearchIndexableResource res = SearchIndexableResources.getResourceByName(className); - if (res == null ) { + if (res == null) { Log.e(LOG_TAG, "Cannot find SearchIndexableResources for class name: " + className); return; } @@ -753,7 +754,7 @@ public class DatabaseIndexingManager { } private void updateOneRowWithFilteredData(SQLiteDatabase database, DatabaseRow.Builder builder, - String title, String summaryOn, String summaryOff,String keywords) { + String title, String summaryOn, String summaryOff, String keywords) { final String updatedTitle = DatabaseIndexingUtils.normalizeHyphen(title); final String updatedSummaryOn = DatabaseIndexingUtils.normalizeHyphen(summaryOn); @@ -783,14 +784,8 @@ public class DatabaseIndexingManager { return; } - // The DocID should contains more than the title string itself (you may have two settings - // with the same title). So we need to use a combination of the title and the screenTitle. - StringBuilder sb = new StringBuilder(row.updatedTitle); - sb.append(row.screenTitle); - int docId = sb.toString().hashCode(); - ContentValues values = new ContentValues(); - values.put(IndexDatabaseHelper.IndexColumns.DOCID, docId); + values.put(IndexDatabaseHelper.IndexColumns.DOCID, row.getDocId()); values.put(IndexDatabaseHelper.IndexColumns.LOCALE, row.locale); values.put(IndexDatabaseHelper.IndexColumns.DATA_RANK, row.rank); values.put(IndexDatabaseHelper.IndexColumns.DATA_TITLE, row.updatedTitle); @@ -919,7 +914,7 @@ public class DatabaseIndexingManager { } if (!TextUtils.isEmpty(data.className)) { delete(database, IndexDatabaseHelper.IndexColumns.CLASS_NAME, data.className); - } else { + } else { if (data instanceof SearchIndexableRaw) { final SearchIndexableRaw raw = (SearchIndexableRaw) data; if (!TextUtils.isEmpty(raw.title)) { @@ -938,7 +933,7 @@ public class DatabaseIndexingManager { private int delete(SQLiteDatabase database, String columName, String value) { final String whereClause = columName + "=?"; - final String[] whereArgs = new String[] { value }; + final String[] whereArgs = new String[]{value}; return database.delete(IndexDatabaseHelper.Tables.TABLE_PREFS_INDEX, whereClause, whereArgs); @@ -993,6 +988,16 @@ public class DatabaseIndexingManager { : null; } + /** + * Returns the doc id for this row. + */ + public int getDocId() { + // The DocID should contains more than the title string itself (you may have two + // settings with the same title). So we need to use a combination of multiple + // attributes from this row. + return Objects.hash(updatedTitle, screenTitle, key, payloadType); + } + public static class Builder { private String mLocale; private String mUpdatedTitle; @@ -1013,7 +1018,8 @@ public class DatabaseIndexingManager { private boolean mEnabled; private String mKey; private int mUserId; - @ResultPayload.PayloadType private int mPayloadType; + @ResultPayload.PayloadType + private int mPayloadType; private ResultPayload mPayload; public Builder setLocale(String locale) { @@ -1114,7 +1120,7 @@ public class DatabaseIndexingManager { public Builder setPayload(ResultPayload payload) { mPayload = payload; - if(mPayload != null) { + if (mPayload != null) { setPayloadType(mPayload.getType()); } return this; @@ -1122,6 +1128,7 @@ public class DatabaseIndexingManager { /** * Payload type is added when a Payload is added to the Builder in {setPayload} + * * @param payloadType PayloadType * @return The Builder */ diff --git a/src/com/android/settings/search2/InlineSwitchViewHolder.java b/src/com/android/settings/search2/InlineSwitchViewHolder.java index ad99af8fc00..ac49b1c816c 100644 --- a/src/com/android/settings/search2/InlineSwitchViewHolder.java +++ b/src/com/android/settings/search2/InlineSwitchViewHolder.java @@ -21,41 +21,32 @@ import android.content.Context; import android.view.View; import android.widget.CompoundButton; import android.widget.Switch; -import android.widget.TextView; -import com.android.internal.widget.PreferenceImageView; import com.android.settings.R; /** * ViewHolder for Settings represented as SwitchPreferences. */ public class InlineSwitchViewHolder extends SearchViewHolder { - public final TextView titleView; - public final TextView summaryView; - public final PreferenceImageView iconView; + public final Switch switchView; private final Context mContext; - private final String TAG = "SwitchViewHolder"; - public InlineSwitchViewHolder(View view, Context context) { super(view); mContext = context; - titleView = (TextView) view.findViewById(android.R.id.title); - summaryView = (TextView) view.findViewById(android.R.id.summary); - iconView = (PreferenceImageView) view.findViewById(android.R.id.icon); switchView = (Switch) view.findViewById(R.id.switchView); } @Override public void onBind(SearchFragment fragment, SearchResult result) { + super.onBind(fragment, result); if (mContext == null) { return; } final InlineSwitchPayload payload = (InlineSwitchPayload) result.payload; switchView.setChecked(payload.getSwitchValue(mContext)); - switchView.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() { @Override public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { @@ -63,9 +54,5 @@ public class InlineSwitchViewHolder extends SearchViewHolder { payload.setSwitchValue(mContext, isChecked); } }); - - titleView.setText(result.title); - summaryView.setText(result.summary); - iconView.setImageDrawable(result.icon); } } diff --git a/src/com/android/settings/search2/InstalledAppResultLoader.java b/src/com/android/settings/search2/InstalledAppResultLoader.java index 14735bdf355..17bb1572854 100644 --- a/src/com/android/settings/search2/InstalledAppResultLoader.java +++ b/src/com/android/settings/search2/InstalledAppResultLoader.java @@ -28,6 +28,7 @@ import android.os.UserManager; import android.provider.Settings; import android.text.TextUtils; +import com.android.settings.R; import com.android.settings.applications.PackageManagerWrapper; import com.android.settings.utils.AsyncLoader; @@ -45,6 +46,7 @@ public class InstalledAppResultLoader extends AsyncLoader> { private static final Intent LAUNCHER_PROBE = new Intent(Intent.ACTION_MAIN) .addCategory(Intent.CATEGORY_LAUNCHER); + private final List mBreadcrumb; private final String mQuery; private final UserManager mUserManager; private final PackageManagerWrapper mPackageManager; @@ -53,6 +55,9 @@ public class InstalledAppResultLoader extends AsyncLoader> { public InstalledAppResultLoader(Context context, PackageManagerWrapper pmWrapper, String query) { super(context); + mBreadcrumb = new ArrayList<>(); + mBreadcrumb.add(context.getString(R.string.app_and_notification_dashboard_title)); + mBreadcrumb.add(context.getString(R.string.applications_settings)); mUserManager = (UserManager) context.getSystemService(Context.USER_SERVICE); mPackageManager = pmWrapper; mQuery = query; @@ -87,6 +92,7 @@ public class InstalledAppResultLoader extends AsyncLoader> { builder.addIcon(info.loadIcon(pm)) .addTitle(info.loadLabel(pm)) .addRank(wordDiff) + .addBreadcrumbs(mBreadcrumb) .addPayload(new IntentPayload(intent)); results.add(builder.build()); } @@ -127,7 +133,7 @@ public class InstalledAppResultLoader extends AsyncLoader> { * perfectly, and larger values means they are less similar. *

* Example: - * appName: Abcde, query: Abcde, Returns NAME_EXACT_MATCH + * appName: Abcde, query: Abcde, Returns {@link #NAME_EXACT_MATCH} * appName: Abcde, query: ade, Returns 2 * appName: Abcde, query: ae, Returns 3 * appName: Abcde, query: ea, Returns NAME_NO_MATCH diff --git a/src/com/android/settings/search2/IntentSearchViewHolder.java b/src/com/android/settings/search2/IntentSearchViewHolder.java index c9952fa6bda..d02ef1cfe41 100644 --- a/src/com/android/settings/search2/IntentSearchViewHolder.java +++ b/src/com/android/settings/search2/IntentSearchViewHolder.java @@ -16,10 +16,6 @@ package com.android.settings.search2; import android.view.View; -import android.widget.ImageView; -import android.widget.TextView; - -import com.android.settings.R; /** * ViewHolder for intent based search results. @@ -27,25 +23,14 @@ import com.android.settings.R; */ public class IntentSearchViewHolder extends SearchViewHolder { - public final TextView titleView; - public final TextView summaryView; - public final ImageView iconView; - public IntentSearchViewHolder(View view) { super(view); - titleView = (TextView) view.findViewById(android.R.id.title); - summaryView = (TextView) view.findViewById(android.R.id.summary); - iconView = (ImageView) view.findViewById(android.R.id.icon); } @Override public void onBind(final SearchFragment fragment, final SearchResult result) { - titleView.setText(result.title); - summaryView.setText(result.summary); - iconView.setImageDrawable(result.icon); - if (result.icon == null) { - iconView.setBackgroundResource(R.drawable.empty_icon); - } + super.onBind(fragment, result); + itemView.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { diff --git a/src/com/android/settings/search2/SearchViewHolder.java b/src/com/android/settings/search2/SearchViewHolder.java index 315ec6514c2..0b10b0695d8 100644 --- a/src/com/android/settings/search2/SearchViewHolder.java +++ b/src/com/android/settings/search2/SearchViewHolder.java @@ -15,8 +15,14 @@ */ package com.android.settings.search2; +import android.content.Context; import android.support.v7.widget.RecyclerView; +import android.text.TextUtils; import android.view.View; +import android.widget.ImageView; +import android.widget.TextView; + +import com.android.settings.R; /** * The ViewHolder for the Search RecyclerView. @@ -25,9 +31,47 @@ import android.view.View; */ public abstract class SearchViewHolder extends RecyclerView.ViewHolder { + public final TextView titleView; + public final TextView summaryView; + public final TextView breadcrumbView; + public final ImageView iconView; + public SearchViewHolder(View view) { super(view); + titleView = (TextView) view.findViewById(android.R.id.title); + summaryView = (TextView) view.findViewById(android.R.id.summary); + iconView = (ImageView) view.findViewById(android.R.id.icon); + breadcrumbView = (TextView) view.findViewById(R.id.breadcrumb); } - public abstract void onBind(SearchFragment fragment, SearchResult result); + public void onBind(SearchFragment fragment, SearchResult result) { + titleView.setText(result.title); + if (TextUtils.isEmpty(result.summary)) { + summaryView.setVisibility(View.GONE); + } else { + summaryView.setText(result.summary); + summaryView.setVisibility(View.VISIBLE); + } + iconView.setImageDrawable(result.icon); + if (result.icon == null) { + iconView.setBackgroundResource(R.drawable.empty_icon); + } + bindBreadcrumbView(result); + } + + private void bindBreadcrumbView(SearchResult result) { + if (result.breadcrumbs == null || result.breadcrumbs.isEmpty()) { + breadcrumbView.setVisibility(View.GONE); + return; + } + final Context context = breadcrumbView.getContext(); + String breadcrumb = result.breadcrumbs.get(0); + final int count = result.breadcrumbs.size(); + for (int i = 1; i < count; i++) { + breadcrumb = context.getString(R.string.search_breadcrumb_connector, + breadcrumb, result.breadcrumbs.get(i)); + } + breadcrumbView.setText(breadcrumb); + breadcrumbView.setVisibility(View.VISIBLE); + } } \ No newline at end of file diff --git a/tests/robotests/src/com/android/settings/search/DatabaseIndexingManagerTest.java b/tests/robotests/src/com/android/settings/search/DatabaseIndexingManagerTest.java index 3d469dd0b68..e55dc1058a7 100644 --- a/tests/robotests/src/com/android/settings/search/DatabaseIndexingManagerTest.java +++ b/tests/robotests/src/com/android/settings/search/DatabaseIndexingManagerTest.java @@ -196,7 +196,7 @@ public class DatabaseIndexingManagerTest { @Test public void testNullResource_NothingInserted() { mManager.indexOneSearchIndexableData(mDb, localeStr, null /* searchIndexableResource */, - new HashMap>()); + new HashMap<>()); Cursor cursor = mDb.rawQuery("SELECT * FROM prefs_index", null); assertThat(cursor.getCount()).isEqualTo(0); } @@ -205,7 +205,7 @@ public class DatabaseIndexingManagerTest { public void testAddResource_RowsInserted() { SearchIndexableResource resource = getFakeResource(R.xml.gesture_settings); mManager.indexOneSearchIndexableData(mDb, localeStr, resource, - new HashMap>()); + new HashMap<>()); Cursor cursor = mDb.rawQuery("SELECT * FROM prefs_index", null); assertThat(cursor.getCount()).isEqualTo(6); } @@ -214,7 +214,7 @@ public class DatabaseIndexingManagerTest { public void testAddResourceHeader_RowsMatch() { SearchIndexableResource resource = getFakeResource(R.xml.application_settings); mManager.indexOneSearchIndexableData(mDb, localeStr, resource, - new HashMap>()); + new HashMap<>()); Cursor cursor = mDb.rawQuery("SELECT * FROM prefs_index ORDER BY data_title", null); cursor.moveToPosition(1); @@ -267,25 +267,27 @@ public class DatabaseIndexingManagerTest { public void testAddResourceCustomSetting_RowsMatch() { SearchIndexableResource resource = getFakeResource(R.xml.gesture_settings); mManager.indexOneSearchIndexableData(mDb, localeStr, resource, - new HashMap>()); - - Cursor cursor = mDb.rawQuery("SELECT * FROM prefs_index", null); - cursor.moveToPosition(0); + new HashMap<>()); + final String prefTitle = + mContext.getString(R.string.fingerprint_swipe_for_notifications_title); + final String prefSummary = + mContext.getString(R.string.fingerprint_swipe_for_notifications_summary); + Cursor cursor = mDb.rawQuery( + "SELECT * FROM prefs_index where data_title='" + prefTitle + "'", null); + cursor.moveToFirst(); // Locale assertThat(cursor.getString(0)).isEqualTo(localeStr); // Data Rank assertThat(cursor.getInt(1)).isEqualTo(rank); // Data Title - assertThat(cursor.getString(2)).isEqualTo("Swipe for notifications"); + assertThat(cursor.getString(2)).isEqualTo(prefTitle); // Normalized Title - assertThat(cursor.getString(3)).isEqualTo("swipe for notifications"); + assertThat(cursor.getString(3)).isEqualTo(prefTitle.toLowerCase()); // Summary On - assertThat(cursor.getString(4)).isEqualTo("To check your notifications, " + - "swipe down on the fingerprint sensor on the back of your phone."); + assertThat(cursor.getString(4)).isEqualTo(prefSummary); // Summary On Normalized - assertThat(cursor.getString(5)).isEqualTo("to check your notifications, " + - "swipe down on the fingerprint sensor on the back of your phone."); + assertThat(cursor.getString(5)).isEqualTo(prefSummary.toLowerCase()); // Summary Off - only on for checkbox preferences assertThat(cursor.getString(6)).isEmpty(); // Summary off normalized - only on for checkbox preferences @@ -295,7 +297,8 @@ public class DatabaseIndexingManagerTest { // Keywords assertThat(cursor.getString(9)).isEmpty(); // Screen Title - assertThat(cursor.getString(10)).isEqualTo("Gestures"); + assertThat(cursor.getString(10)).isEqualTo( + mContext.getString(R.string.gesture_preference_title)); // Class Name assertThat(cursor.getString(11)).isEqualTo(className); // Icon @@ -322,7 +325,7 @@ public class DatabaseIndexingManagerTest { public void testAddResourceCheckboxPreference_RowsMatch() { SearchIndexableResource resource = getFakeResource(R.xml.application_settings); mManager.indexOneSearchIndexableData(mDb, localeStr, resource, - new HashMap>()); + new HashMap<>()); /* Should return 6 results, with the following titles: * Advanced Settings, Apps, Manage Apps, Preferred install location, Running Services @@ -377,7 +380,7 @@ public class DatabaseIndexingManagerTest { public void testAddResourceListPreference_RowsMatch() { SearchIndexableResource resource = getFakeResource(R.xml.application_settings); mManager.indexOneSearchIndexableData(mDb, localeStr, resource, - new HashMap>()); + new HashMap<>()); Cursor cursor = mDb.rawQuery("SELECT * FROM prefs_index ORDER BY data_title", null); cursor.moveToPosition(3); @@ -436,7 +439,7 @@ public class DatabaseIndexingManagerTest { resource.className = "com.android.settings.display.ScreenZoomSettings"; mManager.indexOneSearchIndexableData(mDb, localeStr, resource, - new HashMap>()); + new HashMap<>()); Cursor cursor = mDb.rawQuery("SELECT * FROM prefs_index", null); assertThat(cursor.getCount()).isEqualTo(1); } @@ -448,7 +451,7 @@ public class DatabaseIndexingManagerTest { resource.className = "com.android.settings.display.ScreenZoomSettings"; mManager.indexOneSearchIndexableData(mDb, localeStr, resource, - new HashMap>()); + new HashMap<>()); Cursor cursor = mDb.rawQuery("SELECT * FROM prefs_index", null); cursor.moveToPosition(0); @@ -504,7 +507,7 @@ public class DatabaseIndexingManagerTest { resource.className = "com.android.settings.LegalSettings"; mManager.indexOneSearchIndexableData(mDb, localeStr, resource, - new HashMap>()); + new HashMap<>()); Cursor cursor = mDb.rawQuery("SELECT * FROM prefs_index", null); assertThat(cursor.getCount()).isEqualTo(2); } @@ -516,7 +519,7 @@ public class DatabaseIndexingManagerTest { resource.className = "com.android.settings.LegalSettings"; mManager.indexOneSearchIndexableData(mDb, localeStr, resource, - new HashMap>()); + new HashMap<>()); Cursor cursor = mDb.rawQuery("SELECT * FROM prefs_index ORDER BY data_title", null); cursor.moveToPosition(0); diff --git a/tests/robotests/src/com/android/settings/search/IntentSearchViewHolderTest.java b/tests/robotests/src/com/android/settings/search/IntentSearchViewHolderTest.java index 3874479fcb4..7a2499b5934 100644 --- a/tests/robotests/src/com/android/settings/search/IntentSearchViewHolderTest.java +++ b/tests/robotests/src/com/android/settings/search/IntentSearchViewHolderTest.java @@ -41,6 +41,7 @@ import org.robolectric.annotation.Config; import org.robolectric.shadows.ShadowApplication; import java.util.ArrayList; +import java.util.List; import static com.google.common.truth.Truth.assertThat; import static org.mockito.Matchers.any; @@ -73,6 +74,7 @@ public class IntentSearchViewHolderTest { assertThat(mHolder.titleView).isNotNull(); assertThat(mHolder.summaryView).isNotNull(); assertThat(mHolder.iconView).isNotNull(); + assertThat(mHolder.breadcrumbView).isNotNull(); } @Test @@ -84,11 +86,43 @@ public class IntentSearchViewHolderTest { assertThat(mHolder.titleView.getText()).isEqualTo(TITLE); assertThat(mHolder.summaryView.getText()).isEqualTo(SUMMARY); assertThat(mHolder.iconView.getDrawable()).isEqualTo(mIcon); + assertThat(mHolder.summaryView.getVisibility()).isEqualTo(View.VISIBLE); + assertThat(mHolder.breadcrumbView.getVisibility()).isEqualTo(View.GONE); verify(mFragment).onSearchResultClicked(); verify(mFragment).startActivity(any(Intent.class)); } + @Test + public void testBindViewElements_emptySummary_hideSummaryView() { + final SearchResult result = new Builder().addTitle(TITLE) + .addRank(1) + .addPayload(new IntentPayload(null)) + .addIcon(mIcon) + .build(); + + mHolder.onBind(mFragment, result); + assertThat(mHolder.summaryView.getVisibility()).isEqualTo(View.GONE); + } + + @Test + public void testBindViewElements_withBreadcrumb_shouldFormatBreadcrumb() { + final List breadcrumbs = new ArrayList<>(); + breadcrumbs.add("a"); + breadcrumbs.add("b"); + breadcrumbs.add("c"); + final SearchResult result = new Builder().addTitle(TITLE) + .addRank(1) + .addPayload(new IntentPayload(null)) + .addBreadcrumbs(breadcrumbs) + .addIcon(mIcon) + .build(); + + mHolder.onBind(mFragment, result); + assertThat(mHolder.breadcrumbView.getVisibility()).isEqualTo(View.VISIBLE); + assertThat(mHolder.breadcrumbView.getText()).isEqualTo("a > b > c"); + } + private SearchResult getSearchResult() { Builder builder = new Builder(); builder.addTitle(TITLE)