diff --git a/AndroidManifest.xml b/AndroidManifest.xml index c73c909bbf1..925b936da2a 100644 --- a/AndroidManifest.xml +++ b/AndroidManifest.xml @@ -210,7 +210,7 @@ diff --git a/res/drawable-hdpi/ic_search_history_am.png b/res/drawable-hdpi/ic_search_history_am.png deleted file mode 100644 index eaef70cbcdd..00000000000 Binary files a/res/drawable-hdpi/ic_search_history_am.png and /dev/null differ diff --git a/res/drawable-mdpi/ic_search_history_am.png b/res/drawable-mdpi/ic_search_history_am.png deleted file mode 100644 index fd6755ffcc5..00000000000 Binary files a/res/drawable-mdpi/ic_search_history_am.png and /dev/null differ diff --git a/res/drawable-xhdpi/ic_search_history_am.png b/res/drawable-xhdpi/ic_search_history_am.png deleted file mode 100644 index 7183fc214e6..00000000000 Binary files a/res/drawable-xhdpi/ic_search_history_am.png and /dev/null differ diff --git a/res/drawable-xxhdpi/ic_search_history_am.png b/res/drawable-xxhdpi/ic_search_history_am.png deleted file mode 100644 index 174409b92db..00000000000 Binary files a/res/drawable-xxhdpi/ic_search_history_am.png and /dev/null differ diff --git a/res/drawable-xxxhdpi/ic_search_history_am.png b/res/drawable-xxxhdpi/ic_search_history_am.png deleted file mode 100644 index ffce51ee0b6..00000000000 Binary files a/res/drawable-xxxhdpi/ic_search_history_am.png and /dev/null differ diff --git a/res/drawable/ic_cross_grey_24dp.xml b/res/drawable/ic_cross_grey_24dp.xml deleted file mode 100644 index 312c034a786..00000000000 --- a/res/drawable/ic_cross_grey_24dp.xml +++ /dev/null @@ -1,24 +0,0 @@ - - - - - diff --git a/res/drawable/ic_search_history.xml b/res/drawable/ic_search_history.xml deleted file mode 100644 index 05384d27d2b..00000000000 --- a/res/drawable/ic_search_history.xml +++ /dev/null @@ -1,23 +0,0 @@ - - - - diff --git a/res/layout/search_saved_query_item.xml b/res/layout/search_saved_query_item.xml index 50001a5ff62..f8c239a9f04 100644 --- a/res/layout/search_saved_query_item.xml +++ b/res/layout/search_saved_query_item.xml @@ -20,28 +20,25 @@ android:orientation="horizontal" android:layout_width="match_parent" android:layout_height="wrap_content" + android:paddingEnd="?android:attr/listPreferredItemPaddingEnd" + android:background="?android:attr/selectableItemBackground" android:minHeight="?android:attr/listPreferredItemHeight" android:gravity="center_vertical"> + + - - \ No newline at end of file diff --git a/res/layout/search_suggestion_item.xml b/res/layout/search_suggestion_item.xml deleted file mode 100644 index 85a33816726..00000000000 --- a/res/layout/search_suggestion_item.xml +++ /dev/null @@ -1,58 +0,0 @@ - - - - - - - - - - - - - - - - - - diff --git a/res/values-sw600dp/dimens.xml b/res/values-sw600dp/dimens.xml index 041191467fe..4d309692663 100755 --- a/res/values-sw600dp/dimens.xml +++ b/res/values-sw600dp/dimens.xml @@ -59,13 +59,6 @@ 80dp 24dp - - 24dp - - - 24dp - 32dp - 64dp diff --git a/res/values/dimens.xml b/res/values/dimens.xml index 4bbc43a7a8f..0e10a716df7 100755 --- a/res/values/dimens.xml +++ b/res/values/dimens.xml @@ -96,9 +96,6 @@ 2dp - - 48dp - 72dp @@ -116,26 +113,6 @@ 72dp 16dp - - 4dp - - - 12dp - - - 24dp - - - 12dp - 32dp - - - 24dp - - - 32dp - 32dp - diff --git a/res/values/strings.xml b/res/values/strings.xml index df2168d7ed9..a9a0892e4e2 100644 --- a/res/values/strings.xml +++ b/res/values/strings.xml @@ -2345,6 +2345,9 @@ No results + + Clear history + Display diff --git a/res/xml/date_time_prefs.xml b/res/xml/date_time_prefs.xml index 78591198fe3..c9ad0dddb23 100644 --- a/res/xml/date_time_prefs.xml +++ b/res/xml/date_time_prefs.xml @@ -14,44 +14,44 @@ limitations under the License. --> - + - + settings:restrictedSwitchSummary="@string/enabled_by_admin" /> - + android:summaryOff="@string/zone_auto_summaryOff" /> - + android:summary="@string/summary_placeholder" /> - + android:summary="@string/summary_placeholder" /> + android:summary="GMT-8:00" /> - + diff --git a/src/com/android/settings/search/SavedQueryController.java b/src/com/android/settings/search/SavedQueryController.java index f6a3ff6972d..c61d5449783 100644 --- a/src/com/android/settings/search/SavedQueryController.java +++ b/src/com/android/settings/search/SavedQueryController.java @@ -21,12 +21,16 @@ import android.app.LoaderManager; import android.content.Context; import android.content.Loader; import android.os.Bundle; +import android.view.Menu; +import android.view.MenuItem; +import com.android.settings.R; import com.android.settings.overlay.FeatureFactory; import java.util.List; -public class SavedQueryController implements LoaderManager.LoaderCallbacks { +public class SavedQueryController implements LoaderManager.LoaderCallbacks, + MenuItem.OnMenuItemClickListener { // TODO: make a generic background task manager to handle one-off tasks like this one. @@ -35,6 +39,8 @@ public class SavedQueryController implements LoaderManager.LoaderCallbacks { private static final int LOADER_ID_SAVED_QUERIES = 2; private static final String ARG_QUERY = "remove_query"; + private static final int MENU_SEARCH_HISTORY = 1000; + private final Context mContext; private final LoaderManager mLoaderManager; private final SearchFeatureProvider mSearchFeatureProvider; @@ -55,7 +61,7 @@ public class SavedQueryController implements LoaderManager.LoaderCallbacks { case LOADER_ID_SAVE_QUERY_TASK: return new SavedQueryRecorder(mContext, args.getString(ARG_QUERY)); case LOADER_ID_REMOVE_QUERY_TASK: - return new SavedQueryRemover(mContext, args.getString(ARG_QUERY)); + return new SavedQueryRemover(mContext); case LOADER_ID_SAVED_QUERIES: return mSearchFeatureProvider.getSavedQueryLoader(mContext); } @@ -76,7 +82,21 @@ public class SavedQueryController implements LoaderManager.LoaderCallbacks { @Override public void onLoaderReset(Loader loader) { + } + @Override + public boolean onMenuItemClick(MenuItem item) { + if (item.getItemId() != MENU_SEARCH_HISTORY) { + return false; + } + removeQueries(); + return true; + } + + public void buildMenuItem(Menu menu) { + final MenuItem item = + menu.add(Menu.NONE, MENU_SEARCH_HISTORY, Menu.NONE, R.string.search_clear_history); + item.setOnMenuItemClickListener(this); } public void saveQuery(String query) { @@ -85,9 +105,11 @@ public class SavedQueryController implements LoaderManager.LoaderCallbacks { mLoaderManager.restartLoader(LOADER_ID_SAVE_QUERY_TASK, args, this); } - public void removeQuery(String query) { + /** + * Remove all saved queries from DB + */ + public void removeQueries() { final Bundle args = new Bundle(); - args.putString(ARG_QUERY, query); mLoaderManager.restartLoader(LOADER_ID_REMOVE_QUERY_TASK, args, this); } diff --git a/src/com/android/settings/search/SavedQueryRemover.java b/src/com/android/settings/search/SavedQueryRemover.java index 47bb3baa2e8..77334a5ab55 100644 --- a/src/com/android/settings/search/SavedQueryRemover.java +++ b/src/com/android/settings/search/SavedQueryRemover.java @@ -17,25 +17,21 @@ package com.android.settings.search; +import static com.android.settings.search.IndexDatabaseHelper.Tables.TABLE_SAVED_QUERIES; + import android.content.Context; import android.database.sqlite.SQLiteDatabase; import android.database.sqlite.SQLiteException; import android.util.Log; -import com.android.settings.search.IndexDatabaseHelper; import com.android.settings.utils.AsyncLoader; -import static com.android.settings.search.IndexDatabaseHelper.Tables.TABLE_SAVED_QUERIES; - public class SavedQueryRemover extends AsyncLoader { private static final String LOG_TAG = "SavedQueryRemover"; - private final String mQuery; - - public SavedQueryRemover(Context context, String query) { + public SavedQueryRemover(Context context) { super(context); - mQuery = query; } @Override @@ -44,8 +40,8 @@ public class SavedQueryRemover extends AsyncLoader { try { // First, delete all saved queries that are the same database.delete(TABLE_SAVED_QUERIES, - IndexDatabaseHelper.SavedQueriesColumns.QUERY + " = ?", - new String[]{mQuery}); + null /* where */, + null /* whereArgs */); } catch (Exception e) { Log.d(LOG_TAG, "Cannot update saved Search queries", e); } diff --git a/src/com/android/settings/search/SavedQueryViewHolder.java b/src/com/android/settings/search/SavedQueryViewHolder.java index 14509b6f9c5..a8d449d45f9 100644 --- a/src/com/android/settings/search/SavedQueryViewHolder.java +++ b/src/com/android/settings/search/SavedQueryViewHolder.java @@ -25,12 +25,10 @@ import com.android.internal.logging.nano.MetricsProto; public class SavedQueryViewHolder extends SearchViewHolder { public final TextView titleView; - public final View removeButton; public SavedQueryViewHolder(View view) { super(view); titleView = view.findViewById(android.R.id.title); - removeButton = view.findViewById(android.R.id.icon); } @Override @@ -40,8 +38,7 @@ public class SavedQueryViewHolder extends SearchViewHolder { @Override public void onBind(SearchFragment fragment, SearchResult result) { + itemView.setOnClickListener(v -> fragment.onSavedQueryClicked(result.title)); titleView.setText(result.title); - titleView.setOnClickListener(v -> fragment.onSavedQueryClicked(result.title)); - removeButton.setOnClickListener(v -> fragment.onRemoveSavedQueryClicked(result.title)); } } \ No newline at end of file diff --git a/src/com/android/settings/search/SearchFragment.java b/src/com/android/settings/search/SearchFragment.java index 2a485fe7a94..468a196ea7d 100644 --- a/src/com/android/settings/search/SearchFragment.java +++ b/src/com/android/settings/search/SearchFragment.java @@ -32,6 +32,8 @@ import android.util.Log; import android.util.Pair; import android.util.TypedValue; import android.view.LayoutInflater; +import android.view.Menu; +import android.view.MenuInflater; import android.view.View; import android.view.ViewGroup; import android.view.inputmethod.InputMethodManager; @@ -103,7 +105,7 @@ public class SearchFragment extends InstrumentedFragment implements SearchView.O @VisibleForTesting SearchFeatureProvider mSearchFeatureProvider; - @VisibleForTesting(otherwise = VisibleForTesting.PRIVATE) + @VisibleForTesting SearchResultsAdapter mSearchAdapter; @VisibleForTesting @@ -164,6 +166,12 @@ public class SearchFragment extends InstrumentedFragment implements SearchView.O } } + @Override + public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) { + super.onCreateOptionsMenu(menu, inflater); + mSavedQueryController.buildMenuItem(menu); + } + @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { @@ -361,10 +369,6 @@ public class SearchFragment extends InstrumentedFragment implements SearchView.O onQueryTextChange(queryString); } - public void onRemoveSavedQueryClicked(CharSequence title) { - mSavedQueryController.removeQuery(title.toString()); - } - private void restartLoaders() { mShowingSavedQuery = false; final LoaderManager loaderManager = getLoaderManager(); diff --git a/tests/robotests/src/com/android/settings/search/CursorToSearchResultConverterTest.java b/tests/robotests/src/com/android/settings/search/CursorToSearchResultConverterTest.java index 1aed11d00d3..0d1d7e6aa5e 100644 --- a/tests/robotests/src/com/android/settings/search/CursorToSearchResultConverterTest.java +++ b/tests/robotests/src/com/android/settings/search/CursorToSearchResultConverterTest.java @@ -17,6 +17,8 @@ package com.android.settings.search; +import static com.google.common.truth.Truth.assertThat; + import android.app.Activity; import android.content.Context; import android.content.Intent; @@ -26,14 +28,14 @@ import android.graphics.drawable.Drawable; import com.android.settings.DisplaySettings; import com.android.settings.R; -import com.android.settings.testutils.SettingsRobolectricTestRunner; import com.android.settings.TestConfig; import com.android.settings.dashboard.SiteMapManager; import com.android.settings.gestures.SwipeToNotificationSettings; import com.android.settings.search.ResultPayload.Availability; import com.android.settings.search.ResultPayload.PayloadType; - +import com.android.settings.testutils.SettingsRobolectricTestRunner; import com.android.settings.wifi.WifiSettings; + import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; @@ -48,8 +50,6 @@ import java.util.Arrays; import java.util.List; import java.util.Set; -import static com.google.common.truth.Truth.assertThat; - @RunWith(SettingsRobolectricTestRunner.class) @Config(manifest = TestConfig.MANIFEST_PATH, sdk = TestConfig.SDK_VERSION) public class CursorToSearchResultConverterTest { @@ -60,7 +60,7 @@ public class CursorToSearchResultConverterTest { private static final String TARGET_CLASS = "a.b.c.class"; private static final String KEY = "key"; private static final Intent INTENT = new Intent("com.android.settings"); - private static final int ICON = R.drawable.ic_search_history; + private static final int ICON = R.drawable.ic_search_24dp; private static final int BASE_RANK = 1; @Mock(answer = Answers.RETURNS_DEEP_STUBS) diff --git a/tests/robotests/src/com/android/settings/search/InlineSwitchViewHolderTest.java b/tests/robotests/src/com/android/settings/search/InlineSwitchViewHolderTest.java index 093909bf730..d87550bce96 100644 --- a/tests/robotests/src/com/android/settings/search/InlineSwitchViewHolderTest.java +++ b/tests/robotests/src/com/android/settings/search/InlineSwitchViewHolderTest.java @@ -17,14 +17,18 @@ package com.android.settings.search; +import static com.google.common.truth.Truth.assertThat; +import static org.mockito.Matchers.any; +import static org.mockito.Mockito.when; + import android.content.Context; import android.graphics.drawable.Drawable; import android.view.LayoutInflater; import com.android.settings.R; -import com.android.settings.testutils.SettingsRobolectricTestRunner; import com.android.settings.TestConfig; import com.android.settings.testutils.FakeFeatureFactory; +import com.android.settings.testutils.SettingsRobolectricTestRunner; import org.junit.Before; import org.junit.Test; @@ -38,10 +42,6 @@ import org.robolectric.util.ReflectionHelpers; import java.util.ArrayList; -import static com.google.common.truth.Truth.assertThat; -import static org.mockito.Matchers.any; -import static org.mockito.Mockito.when; - @RunWith(SettingsRobolectricTestRunner.class) @Config(manifest = TestConfig.MANIFEST_PATH, sdk = TestConfig.SDK_VERSION) public class InlineSwitchViewHolderTest { @@ -65,7 +65,7 @@ public class InlineSwitchViewHolderTest { public void setUp() { MockitoAnnotations.initMocks(this); final Context context = RuntimeEnvironment.application; - mIcon = context.getDrawable(R.drawable.ic_search_history); + mIcon = context.getDrawable(R.drawable.ic_search_24dp); FakeFeatureFactory.setupForTest(mContext); mFeatureFactory = (FakeFeatureFactory) FakeFeatureFactory.getFactory(mContext); diff --git a/tests/robotests/src/com/android/settings/search/IntentSearchViewHolderTest.java b/tests/robotests/src/com/android/settings/search/IntentSearchViewHolderTest.java index cee3c7831c0..38e6285b7ff 100644 --- a/tests/robotests/src/com/android/settings/search/IntentSearchViewHolderTest.java +++ b/tests/robotests/src/com/android/settings/search/IntentSearchViewHolderTest.java @@ -85,7 +85,7 @@ public class IntentSearchViewHolderTest { View view = LayoutInflater.from(context).inflate(R.layout.search_intent_item, null); mHolder = new IntentSearchViewHolder(view); - mIcon = context.getDrawable(R.drawable.ic_search_history); + mIcon = context.getDrawable(R.drawable.ic_search_24dp); mBadgedIcon = context.getDrawable(R.drawable.ic_add); when(mFragment.getActivity().getPackageManager()).thenReturn(mPackageManager); } diff --git a/tests/robotests/src/com/android/settings/search/SavedQueryRecorderAndRemoverTest.java b/tests/robotests/src/com/android/settings/search/SavedQueryRecorderAndRemoverTest.java index 6d49555496f..af8cfe40bd3 100644 --- a/tests/robotests/src/com/android/settings/search/SavedQueryRecorderAndRemoverTest.java +++ b/tests/robotests/src/com/android/settings/search/SavedQueryRecorderAndRemoverTest.java @@ -18,11 +18,13 @@ package com.android.settings.search; +import static com.google.common.truth.Truth.assertThat; + import android.content.Context; -import com.android.settings.testutils.SettingsRobolectricTestRunner; import com.android.settings.TestConfig; import com.android.settings.testutils.DatabaseTestUtils; +import com.android.settings.testutils.SettingsRobolectricTestRunner; import org.junit.After; import org.junit.Before; @@ -33,8 +35,6 @@ import org.robolectric.annotation.Config; import java.util.List; -import static com.google.common.truth.Truth.assertThat; - @RunWith(SettingsRobolectricTestRunner.class) @Config(manifest = TestConfig.MANIFEST_PATH, sdk = TestConfig.SDK_VERSION) public class SavedQueryRecorderAndRemoverTest { @@ -57,7 +57,7 @@ public class SavedQueryRecorderAndRemoverTest { public void canSaveAndRemoveQuery() { final String query = "test"; mRecorder = new SavedQueryRecorder(mContext, query); - mRemover = new SavedQueryRemover(mContext, query); + mRemover = new SavedQueryRemover(mContext); // Record a new query and load all queries from DB mRecorder.loadInBackground(); @@ -75,4 +75,22 @@ public class SavedQueryRecorderAndRemoverTest { // Saved query list should be empty because it's removed. assertThat(results).isEmpty(); } + + @Test + public void canRemoveAllQueriesAtOnce() { + mRemover = new SavedQueryRemover(mContext);; + + // Record a new query and load all queries from DB + new SavedQueryRecorder(mContext, "Test1").loadInBackground(); + new SavedQueryRecorder(mContext, "Test2").loadInBackground(); + final SavedQueryLoader loader = new SavedQueryLoader(mContext); + List results = loader.loadInBackground(); + assertThat(results.size()).isEqualTo(2); + + mRemover.loadInBackground(); + results = loader.loadInBackground(); + + // Saved query list should be empty because it's removed. + assertThat(results).isEmpty(); + } } diff --git a/tests/robotests/src/com/android/settings/search/SavedQueryViewHolderTest.java b/tests/robotests/src/com/android/settings/search/SavedQueryViewHolderTest.java index 691fcf7fae9..bb8f6d12da8 100644 --- a/tests/robotests/src/com/android/settings/search/SavedQueryViewHolderTest.java +++ b/tests/robotests/src/com/android/settings/search/SavedQueryViewHolderTest.java @@ -26,8 +26,8 @@ import android.view.LayoutInflater; import android.view.View; import com.android.settings.R; -import com.android.settings.testutils.SettingsRobolectricTestRunner; import com.android.settings.TestConfig; +import com.android.settings.testutils.SettingsRobolectricTestRunner; import org.junit.Before; import org.junit.Test; @@ -47,7 +47,6 @@ public class SavedQueryViewHolderTest { private SavedQueryViewHolder mHolder; private View mView; private View mTitleView; - private View mRemoveButton; @Before public void setUp() { @@ -56,7 +55,6 @@ public class SavedQueryViewHolderTest { mView = LayoutInflater.from(mContext) .inflate(R.layout.search_saved_query_item, null); mTitleView = mView.findViewById(android.R.id.title); - mRemoveButton = mView.findViewById(android.R.id.icon); mHolder = new SavedQueryViewHolder(mView); } @@ -65,10 +63,8 @@ public class SavedQueryViewHolderTest { final SearchResult result = mock(SearchResult.class); mHolder.onBind(mSearchFragment, result); - mTitleView.performClick(); - mRemoveButton.performClick(); + mHolder.itemView.performClick(); verify(mSearchFragment).onSavedQueryClicked(nullable(CharSequence.class)); - verify(mSearchFragment).onRemoveSavedQueryClicked(nullable(CharSequence.class)); } } diff --git a/tests/robotests/src/com/android/settings/search/SearchResultBuilderTest.java b/tests/robotests/src/com/android/settings/search/SearchResultBuilderTest.java index e601087d4b2..cd77b25753c 100644 --- a/tests/robotests/src/com/android/settings/search/SearchResultBuilderTest.java +++ b/tests/robotests/src/com/android/settings/search/SearchResultBuilderTest.java @@ -17,14 +17,16 @@ package com.android.settings.search; +import static com.google.common.truth.Truth.assertThat; + import android.content.Context; import android.content.Intent; import android.graphics.drawable.Drawable; import com.android.settings.R; -import com.android.settings.testutils.SettingsRobolectricTestRunner; import com.android.settings.TestConfig; import com.android.settings.search.SearchResult.Builder; +import com.android.settings.testutils.SettingsRobolectricTestRunner; import org.junit.Before; import org.junit.Test; @@ -34,8 +36,6 @@ import org.robolectric.shadows.ShadowApplication; import java.util.ArrayList; -import static com.google.common.truth.Truth.assertThat; - @RunWith(SettingsRobolectricTestRunner.class) @Config(manifest = TestConfig.MANIFEST_PATH, sdk = TestConfig.SDK_VERSION) public class SearchResultBuilderTest { @@ -57,7 +57,7 @@ public class SearchResultBuilderTest { mResultPayload = new ResultPayload(new Intent()); final Context context = ShadowApplication.getInstance().getApplicationContext(); - mIcon = context.getDrawable(R.drawable.ic_search_history); + mIcon = context.getDrawable(R.drawable.ic_search_24dp); } @Test diff --git a/tests/robotests/src/com/android/settings/search/SearchResultsAdapterTest.java b/tests/robotests/src/com/android/settings/search/SearchResultsAdapterTest.java index 9c1453ffa7b..e605ec1729b 100644 --- a/tests/robotests/src/com/android/settings/search/SearchResultsAdapterTest.java +++ b/tests/robotests/src/com/android/settings/search/SearchResultsAdapterTest.java @@ -17,6 +17,14 @@ package com.android.settings.search; +import static com.google.common.truth.Truth.assertThat; +import static org.mockito.Matchers.any; +import static org.mockito.Matchers.anyString; +import static org.mockito.Mockito.never; +import static org.mockito.Mockito.times; +import static org.mockito.Mockito.verify; +import static org.mockito.Mockito.when; + import android.app.Activity; import android.content.Context; import android.content.Intent; @@ -26,10 +34,10 @@ import android.view.ViewGroup; import android.widget.FrameLayout; import com.android.settings.R; -import com.android.settings.testutils.SettingsRobolectricTestRunner; import com.android.settings.TestConfig; import com.android.settings.search.SearchResult.Builder; import com.android.settings.search.ranking.SearchResultsRankerCallback; +import com.android.settings.testutils.SettingsRobolectricTestRunner; import org.junit.Before; import org.junit.Test; @@ -49,14 +57,6 @@ import java.util.List; import java.util.Objects; import java.util.Set; -import static com.google.common.truth.Truth.assertThat; -import static org.mockito.Matchers.any; -import static org.mockito.Matchers.anyString; -import static org.mockito.Mockito.never; -import static org.mockito.Mockito.times; -import static org.mockito.Mockito.verify; -import static org.mockito.Mockito.when; - @RunWith(SettingsRobolectricTestRunner.class) @Config(manifest = TestConfig.MANIFEST_PATH, sdk = TestConfig.SDK_VERSION) public class SearchResultsAdapterTest { @@ -553,7 +553,7 @@ public class SearchResultsAdapterTest { private Set getIntentSampleResults() { Set sampleResults = new HashSet<>(); ArrayList breadcrumbs = new ArrayList<>(); - final Drawable icon = mContext.getDrawable(R.drawable.ic_search_history); + final Drawable icon = mContext.getDrawable(R.drawable.ic_search_24dp); final ResultPayload payload = new ResultPayload(null); final SearchResult.Builder builder = new Builder(); builder.setTitle("title")