Commit 8232769a authored by Jan Wilken Dörrie's avatar Jan Wilken Dörrie Committed by Commit Bot

Revert "Fix image search from search activity"

This reverts commit 91eda9e8.

Reason for revert: testImageSearch is flaky: https://crbug.com/1087333

Original change's description:
> Fix image search from search activity
> 
> SearchActivity did not handle image search data since image search need
> post data, so the fix is add the post data into intent to pass to chrome.
> 
> Bug: 1078773
> Change-Id: I04efdad0bba315508e0b05d3d9e444d8c1a5d955
> Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/2187191
> Commit-Queue: Gang Wu <gangwu@chromium.org>
> Reviewed-by: Robert Sesek <rsesek@chromium.org>
> Reviewed-by: Ender <ender@google.com>
> Reviewed-by: Ted Choc <tedchoc@chromium.org>
> Cr-Commit-Position: refs/heads/master@{#772335}

TBR=tedchoc@chromium.org,gangwu@chromium.org,rsesek@chromium.org,ender@google.com

Change-Id: I7bce956c3e6ed21fce50f97a45bfd3bbe700473d
No-Presubmit: true
No-Tree-Checks: true
No-Try: true
Bug: 1078773, 1087333
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/2218074Reviewed-by: default avatarJan Wilken Dörrie <jdoerrie@chromium.org>
Commit-Queue: Jan Wilken Dörrie <jdoerrie@chromium.org>
Cr-Commit-Position: refs/heads/master@{#772665}
parent 500e552a
......@@ -186,17 +186,6 @@ public class IntentHandler {
*/
public static final String EXTRA_INCOGNITO_MODE = "org.chromium.chrome.browser.incognito_mode";
/**
* Byte array for the POST data when load a url, only Intents sent by Chrome can use this.
*/
public static final String EXTRA_POST_DATA = "com.android.chrome.post_data";
/**
* The type of the POST data, need to be added to the HTTP request header, only Intents sent by
* Chrome can use this.
*/
public static final String EXTRA_POST_DATA_TYPE = "com.android.chrome.post_data_type";
/**
* Fake ComponentName used in constructing TRUSTED_APPLICATION_CODE_EXTRA.
*/
......
......@@ -46,7 +46,6 @@ import org.chromium.ui.ViewProvider;
import org.chromium.ui.base.WindowAndroid;
import org.chromium.ui.modelutil.LazyConstructionPropertyMcp;
import org.chromium.ui.modelutil.MVCListAdapter;
import org.chromium.ui.modelutil.MVCListAdapter.ModelList;
import org.chromium.ui.modelutil.PropertyModel;
import java.util.ArrayList;
......@@ -336,11 +335,6 @@ public class AutocompleteCoordinatorImpl implements AutocompleteCoordinator {
return mMediator;
}
@VisibleForTesting
ModelList getSuggestionModelList() {
return mMediator.getSuggestionModelList();
}
private void onTileSelected(QueryTile queryTile) {
mMediator.onQueryTileSelected(queryTile);
}
......
......@@ -14,7 +14,6 @@ import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import androidx.annotation.Nullable;
import androidx.annotation.VisibleForTesting;
import androidx.core.app.ActivityOptionsCompat;
......@@ -103,8 +102,6 @@ public class SearchActivity extends AsyncInitializationActivity
/** Input submitted before before the native library was loaded. */
private String mQueuedUrl;
private String mQueuedPostDataType;
private byte[] mQueuedPostData;
/** The View that represents the search box. */
private SearchActivityLocationBarLayout mSearchBox;
......@@ -276,7 +273,7 @@ public class SearchActivity extends AsyncInitializationActivity
assert !mIsActivityUsable
: "finishDeferredInitialization() incorrectly called multiple times";
mIsActivityUsable = true;
if (mQueuedUrl != null) loadUrl(mQueuedUrl, mQueuedPostDataType, mQueuedPostData);
if (mQueuedUrl != null) loadUrl(mQueuedUrl);
// TODO(tedchoc): Warmup triggers the CustomTab layout to be inflated, but this widget
// will navigate to Tabbed mode. Investigate whether this can inflate
......@@ -330,53 +327,29 @@ public class SearchActivity extends AsyncInitializationActivity
}
@Override
public void loadUrl(String url, @Nullable String postDataType, @Nullable byte[] postData) {
public void loadUrl(String url) {
// Wait until native has loaded.
if (!mIsActivityUsable) {
mQueuedUrl = url;
mQueuedPostDataType = postDataType;
mQueuedPostData = postData;
return;
}
Intent intent = createIntentForStartActivity(url, postDataType, postData);
if (intent == null) return;
IntentUtils.safeStartActivity(this, intent,
ActivityOptionsCompat
.makeCustomAnimation(this, android.R.anim.fade_in, android.R.anim.fade_out)
.toBundle());
RecordUserAction.record("SearchWidget.SearchMade");
finish();
}
/**
* Creates an intent that will be used to launch Chrome.
*
* @param url The URL to be loaded.
* @param postDataType postData type.
* @param postData Post-data to include in the tab URL's request body, ex. bitmap when
* image search.
* @return the intent will be passed to ChromeLauncherActivity, null if input was emprty.
*/
private Intent createIntentForStartActivity(
String url, @Nullable String postDataType, @Nullable byte[] postData) {
// Don't do anything if the input was empty. This is done after the native check to prevent
// resending a queued query after the user deleted it.
if (TextUtils.isEmpty(url)) return null;
if (TextUtils.isEmpty(url)) return;
// Fix up the URL and send it to the full browser.
GURL fixedUrl = UrlFormatter.fixupUrl(url);
Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse(fixedUrl.getValidSpecOrEmpty()));
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_NEW_DOCUMENT);
intent.setClass(this, ChromeLauncherActivity.class);
if (!TextUtils.isEmpty(postDataType) && postData != null && postData.length != 0) {
intent.putExtra(IntentHandler.EXTRA_POST_DATA_TYPE, postDataType);
intent.putExtra(IntentHandler.EXTRA_POST_DATA, postData);
}
IntentHandler.addTrustedIntentExtras(intent);
return intent;
IntentUtils.safeStartActivity(this, intent,
ActivityOptionsCompat
.makeCustomAnimation(this, android.R.anim.fade_in, android.R.anim.fade_out)
.toBundle());
RecordUserAction.record("SearchWidget.SearchMade");
finish();
}
private ViewGroup createContentView() {
......
......@@ -28,7 +28,7 @@ public class SearchActivityLocationBarLayout extends LocationBarLayout {
/** Delegates calls out to the containing Activity. */
public static interface Delegate {
/** Load a URL in the associated tab. */
void loadUrl(String url, @Nullable String postDataType, @Nullable byte[] postData);
void loadUrl(String url);
/** The user hit the back button. */
void backKeyPressed();
......@@ -56,9 +56,8 @@ public class SearchActivityLocationBarLayout extends LocationBarLayout {
}
@Override
public void loadUrlWithPostData(String url, int transition, long inputStart,
@Nullable String postDataType, @Nullable byte[] postData) {
mDelegate.loadUrl(url, postDataType, postData);
public void loadUrl(String url, int transition, long inputStart) {
mDelegate.loadUrl(url);
LocaleManager.getInstance().recordLocaleBasedSearchMetrics(true, url, transition);
}
......
......@@ -33,7 +33,6 @@ import org.chromium.components.url_formatter.UrlFormatter;
import org.chromium.content_public.browser.LoadUrlParams;
import org.chromium.content_public.browser.WebContents;
import org.chromium.content_public.common.Referrer;
import org.chromium.content_public.common.ResourceRequestBody;
import org.chromium.ui.base.PageTransition;
import org.chromium.ui.base.WindowAndroid;
import org.chromium.url.GURL;
......@@ -299,9 +298,8 @@ public class ChromeTabCreator extends TabCreatorManager.TabCreator {
* @param intentTimestamp the time the intent was received.
* @return the tab the URL was opened in, could be a new tab or a reused one.
*/
// TODO(crbug.com/1081924): Clean up the launches from SearchActivity/Chrome.
public Tab launchUrlFromExternalApp(String url, String referer, String headers, String appId,
boolean forceNewTab, Intent intent, long intentTimestamp) {
public Tab launchUrlFromExternalApp(String url, String referer, String headers,
String appId, boolean forceNewTab, Intent intent, long intentTimestamp) {
assert !mIncognito;
boolean isLaunchedFromChrome = TextUtils.equals(appId, mActivity.getPackageName());
......@@ -311,26 +309,11 @@ public class ChromeTabCreator extends TabCreatorManager.TabCreator {
// reused either.
LoadUrlParams loadUrlParams = new LoadUrlParams(url);
loadUrlParams.setIntentReceivedTimestamp(intentTimestamp);
loadUrlParams.setVerbatimHeaders(headers);
if (referer != null) {
loadUrlParams.setReferrer(
new Referrer(referer, IntentHandler.getReferrerPolicyFromIntent(intent)));
}
// Handle post data case.
if (IntentHandler.wasIntentSenderChrome(intent)) {
String postDataType =
IntentUtils.safeGetStringExtra(intent, IntentHandler.EXTRA_POST_DATA_TYPE);
byte[] postData =
IntentUtils.safeGetByteArrayExtra(intent, IntentHandler.EXTRA_POST_DATA);
if (!TextUtils.isEmpty(postDataType) && postData != null && postData.length != 0) {
StringBuilder appendToHeader = new StringBuilder();
if (!TextUtils.isEmpty(headers)) appendToHeader.append("\r\n");
appendToHeader.append("Content-Type: ");
appendToHeader.append(postDataType);
headers = headers + appendToHeader.toString();
loadUrlParams.setPostData(ResourceRequestBody.createFromBytes(postData));
}
}
loadUrlParams.setVerbatimHeaders(headers);
return createNewTab(loadUrlParams, TabLaunchType.FROM_EXTERNAL_APP, null, intent);
}
......
......@@ -2,7 +2,6 @@ include_rules = [
"+chrome/app",
"+chrome/browser/android/lifecycle",
"+chrome/browser/profiles/android/java",
"+chrome/browser/share/android/java",
"+chrome/browser/tab/java",
"+chrome/browser/thumbnail/generator/android/java",
"+chrome/browser/ui/android/appmenu",
......
......@@ -12,18 +12,11 @@ import android.annotation.SuppressLint;
import android.app.Activity;
import android.app.Instrumentation;
import android.app.Instrumentation.ActivityMonitor;
import android.content.Context;
import android.content.Intent;
import android.graphics.Bitmap;
import android.net.Uri;
import android.support.test.InstrumentationRegistry;
import android.support.test.filters.SmallTest;
import android.text.TextUtils;
import android.view.KeyEvent;
import android.view.View;
import android.view.ViewGroup;
import androidx.core.content.FileProvider;
import org.junit.After;
import org.junit.Assert;
......@@ -36,9 +29,6 @@ import org.mockito.MockitoAnnotations;
import org.chromium.base.ApplicationStatus;
import org.chromium.base.Callback;
import org.chromium.base.ContentUriUtils;
import org.chromium.base.ContextUtils;
import org.chromium.base.IntentUtils;
import org.chromium.base.test.params.ParameterAnnotations;
import org.chromium.base.test.params.ParameterSet;
import org.chromium.base.test.params.ParameterizedRunner;
......@@ -48,8 +38,6 @@ import org.chromium.base.test.util.FlakyTest;
import org.chromium.base.test.util.RetryOnFailure;
import org.chromium.chrome.R;
import org.chromium.chrome.browser.ChromeTabbedActivity;
import org.chromium.chrome.browser.IntentHandler;
import org.chromium.chrome.browser.document.ChromeLauncherActivity;
import org.chromium.chrome.browser.flags.ChromeFeatureList;
import org.chromium.chrome.browser.flags.ChromeSwitches;
import org.chromium.chrome.browser.locale.DefaultSearchEngineDialogHelperUtils;
......@@ -58,19 +46,14 @@ import org.chromium.chrome.browser.locale.DefaultSearchEnginePromoDialog.Default
import org.chromium.chrome.browser.locale.LocaleManager;
import org.chromium.chrome.browser.omnibox.OmniboxSuggestionType;
import org.chromium.chrome.browser.omnibox.UrlBar;
import org.chromium.chrome.browser.omnibox.suggestions.AutocompleteCoordinatorTestUtils;
import org.chromium.chrome.browser.omnibox.suggestions.AutocompleteResult;
import org.chromium.chrome.browser.omnibox.suggestions.CachedZeroSuggestionsManager;
import org.chromium.chrome.browser.omnibox.suggestions.OmniboxSuggestion;
import org.chromium.chrome.browser.omnibox.suggestions.OmniboxSuggestionBuilderForTest;
import org.chromium.chrome.browser.omnibox.suggestions.OmniboxSuggestionUiType;
import org.chromium.chrome.browser.omnibox.suggestions.OmniboxSuggestionsDropdown;
import org.chromium.chrome.browser.omnibox.voice.VoiceRecognitionHandler;
import org.chromium.chrome.browser.search_engines.TemplateUrlServiceFactory;
import org.chromium.chrome.browser.searchwidget.SearchActivity.SearchActivityDelegate;
import org.chromium.chrome.browser.share.clipboard.ClipboardImageFileProvider;
import org.chromium.chrome.browser.tab.Tab;
import org.chromium.chrome.test.ChromeActivityTestRule;
import org.chromium.chrome.test.ChromeJUnit4RunnerDelegate;
import org.chromium.chrome.test.MultiActivityTestRule;
import org.chromium.chrome.test.util.ActivityUtils;
......@@ -81,13 +64,9 @@ import org.chromium.content_public.browser.test.util.Criteria;
import org.chromium.content_public.browser.test.util.CriteriaHelper;
import org.chromium.content_public.browser.test.util.KeyUtils;
import org.chromium.content_public.browser.test.util.TestThreadUtils;
import org.chromium.content_public.browser.test.util.TestTouchUtils;
import org.chromium.content_public.common.ContentUrlConstants;
import org.chromium.ui.base.Clipboard;
import org.chromium.url.GURL;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
......@@ -110,7 +89,6 @@ import java.util.concurrent.TimeoutException;
@CommandLineFlags.Add({ChromeSwitches.DISABLE_FIRST_RUN_EXPERIENCE})
public class SearchActivityTest {
private static final long OMNIBOX_SHOW_TIMEOUT_MS = 5000L;
private static final String TEST_PNG_IMAGE_FILE_EXTENSION = ".png";
@ParameterAnnotations.ClassParameter
private static List<ParameterSet> sClassParams =
......@@ -179,25 +157,9 @@ public class SearchActivityTest {
}
}
// Helper class for clipboard Omnibox test.
private class FileProviderHelper implements ContentUriUtils.FileProviderUtil {
private static final String API_AUTHORITY_SUFFIX = ".FileProvider";
@Override
public Uri getContentUriFromFile(File file) {
Context appContext = ContextUtils.getApplicationContext();
return FileProvider.getUriForFile(
appContext, appContext.getPackageName() + API_AUTHORITY_SUFFIX, file);
}
}
@Rule
public MultiActivityTestRule mTestRule = new MultiActivityTestRule();
@Rule
public ChromeActivityTestRule<ChromeTabbedActivity> mActivityTestRule =
new ChromeActivityTestRule<>(ChromeTabbedActivity.class);
@Mock
VoiceRecognitionHandler mHandler;
......@@ -578,160 +540,6 @@ public class SearchActivityTest {
});
}
@Test
@SmallTest
@Features.
EnableFeatures({ChromeFeatureList.OMNIBOX_ENABLE_CLIPBOARD_PROVIDER_IMAGE_SUGGESTIONS})
public void testImageSearch() throws InterruptedException, Exception {
// Put an image into system clipboard.
putAnImageIntoClipboard();
// Start the Activity.
final SearchActivity searchActivity = startSearchActivity();
// Omnibox suggestions should appear now.
final SearchActivityLocationBarLayout locationBar =
(SearchActivityLocationBarLayout) searchActivity.findViewById(
R.id.search_location_bar);
OmniboxTestUtils.waitForOmniboxSuggestions(locationBar, OMNIBOX_SHOW_TIMEOUT_MS);
OmniboxSuggestionsDropdown suggestionsDropdown =
AutocompleteCoordinatorTestUtils.getSuggestionsDropdown(
locationBar.getAutocompleteCoordinator());
int imageSuggestionIndex = -1;
// Find the index of the image clipboard suggestion.
for (int i = 0; i < suggestionsDropdown.getItemCount(); ++i) {
OmniboxSuggestion suggestion = AutocompleteCoordinatorTestUtils.getOmniboxSuggestionAt(
locationBar.getAutocompleteCoordinator(), i);
if (suggestion != null
&& suggestion.getType() == OmniboxSuggestionType.CLIPBOARD_IMAGE) {
imageSuggestionIndex = i;
break;
}
}
Assert.assertNotEquals(
"Cannot find the image clipboard Omnibox suggestion", -1, imageSuggestionIndex);
OmniboxSuggestion imageSuggestion = AutocompleteCoordinatorTestUtils.getOmniboxSuggestionAt(
locationBar.getAutocompleteCoordinator(), imageSuggestionIndex);
Assert.assertNotNull("The image clipboard suggestion should contains post content type.",
imageSuggestion.getPostContentType());
Assert.assertNotEquals(
"The image clipboard suggestion should not contains am empty post content type.", 0,
imageSuggestion.getPostContentType().length());
Assert.assertNotNull("The image clipboard suggestion should contains post data.",
imageSuggestion.getPostData());
Assert.assertNotEquals(
"The image clipboard suggestion should not contains am empty post data.", 0,
imageSuggestion.getPostData().length);
// Find the index of clipboard suggestion in the dropdown list.
final int clipboardSuggestionIndexInDropdown =
AutocompleteCoordinatorTestUtils.getIndexForFirstSuggestionOfType(
locationBar.getAutocompleteCoordinator(),
OmniboxSuggestionUiType.CLIPBOARD_SUGGESTION);
Assert.assertNotEquals("Cannot find the image clipboard Omnibox suggestion in UI.", -1,
clipboardSuggestionIndexInDropdown);
// Make sure the new tab is launched.
waitForChromeTabbedActivityToStart(new Callable<Void>() {
@Override
public Void call() {
clickSuggestionAt(suggestionsDropdown, clipboardSuggestionIndexInDropdown);
return null;
}
}, imageSuggestion.getUrl().getSpec());
}
@Test
@SmallTest
@Features.
EnableFeatures({ChromeFeatureList.OMNIBOX_ENABLE_CLIPBOARD_PROVIDER_IMAGE_SUGGESTIONS})
public void testImageSearch_OnlyTrustedIntentCanPost() throws InterruptedException, Exception {
// Put an image into system clipboard.
putAnImageIntoClipboard();
// Start the Activity.
final SearchActivity searchActivity = startSearchActivity();
// Omnibox suggestions should appear now.
final SearchActivityLocationBarLayout locationBar =
(SearchActivityLocationBarLayout) searchActivity.findViewById(
R.id.search_location_bar);
OmniboxTestUtils.waitForOmniboxSuggestions(locationBar, OMNIBOX_SHOW_TIMEOUT_MS);
OmniboxSuggestionsDropdown suggestionsDropdown =
AutocompleteCoordinatorTestUtils.getSuggestionsDropdown(
locationBar.getAutocompleteCoordinator());
int imageSuggestionIndex = -1;
// Find the index of the image clipboard suggestion.
for (int i = 0; i < suggestionsDropdown.getItemCount(); ++i) {
OmniboxSuggestion suggestion = AutocompleteCoordinatorTestUtils.getOmniboxSuggestionAt(
locationBar.getAutocompleteCoordinator(), i);
if (suggestion != null
&& suggestion.getType() == OmniboxSuggestionType.CLIPBOARD_IMAGE) {
imageSuggestionIndex = i;
break;
}
}
Assert.assertNotEquals(
"Cannot find the image clipboard Omnibox suggestion", -1, imageSuggestionIndex);
OmniboxSuggestion imageSuggestion = AutocompleteCoordinatorTestUtils.getOmniboxSuggestionAt(
locationBar.getAutocompleteCoordinator(), imageSuggestionIndex);
Intent intent =
new Intent(Intent.ACTION_VIEW, Uri.parse(imageSuggestion.getUrl().getSpec()));
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_NEW_DOCUMENT);
intent.setClass(searchActivity, ChromeLauncherActivity.class);
intent.putExtra(IntentHandler.EXTRA_POST_DATA_TYPE, imageSuggestion.getPostContentType());
intent.putExtra(IntentHandler.EXTRA_POST_DATA, imageSuggestion.getPostData());
final ChromeTabbedActivity cta =
ActivityUtils.waitForActivity(InstrumentationRegistry.getInstrumentation(),
ChromeTabbedActivity.class, new Callable<Void>() {
@Override
public Void call() {
IntentUtils.safeStartActivity(searchActivity, intent);
return null;
}
});
// Because no POST data, Google wont go to the result page.
CriteriaHelper.pollUiThread(new Criteria() {
@Override
public boolean isSatisfied() {
Tab tab = cta.getActivityTab();
return !tab.getUrlString().startsWith("https://www.google.com/search?");
}
}, CriteriaHelper.DEFAULT_MAX_TIME_TO_POLL, CriteriaHelper.DEFAULT_POLLING_INTERVAL);
}
private void putAnImageIntoClipboard() {
mActivityTestRule.startMainActivityFromLauncher();
ContentUriUtils.setFileProviderUtil(new FileProviderHelper());
Bitmap bitmap =
Bitmap.createBitmap(/* width = */ 10, /* height = */ 10, Bitmap.Config.ARGB_8888);
ByteArrayOutputStream baos = new ByteArrayOutputStream();
bitmap.compress(Bitmap.CompressFormat.PNG, /*quality = (0-100) */ 100, baos);
byte[] mTestImageData = baos.toByteArray();
Clipboard.getInstance().setImageFileProvider(new ClipboardImageFileProvider());
Clipboard.getInstance().setImage(mTestImageData, TEST_PNG_IMAGE_FILE_EXTENSION);
CriteriaHelper.pollInstrumentationThread(new Criteria() {
@Override
public boolean isSatisfied() {
return Clipboard.getInstance().getImage() != null;
}
});
}
private void clickSuggestionAt(OmniboxSuggestionsDropdown suggestionsDropdown, int index) {
ViewGroup viewGroup = suggestionsDropdown.getViewGroup();
View view = viewGroup.getChildAt(index);
TestTouchUtils.singleClickView(InstrumentationRegistry.getInstrumentation(), view);
}
private SearchActivity startSearchActivity() {
return startSearchActivity(0, /*isVoiceSearch=*/false);
}
......
......@@ -324,8 +324,6 @@ public abstract class ChromeFeatureList {
public static final String OMNIBOX_ASSISTANT_VOICE_SEARCH = "OmniboxAssistantVoiceSearch";
public static final String OMNIBOX_COMPACT_SUGGESTIONS = "OmniboxCompactSuggestions";
public static final String OMNIBOX_DEFERRED_KEYBOARD_POPUP = "OmniboxDeferredKeyboardPopup";
public static final String OMNIBOX_ENABLE_CLIPBOARD_PROVIDER_IMAGE_SUGGESTIONS =
"OmniboxEnableClipboardProviderImageSuggestions";
public static final String OMNIBOX_HIDE_SCHEME_IN_STEADY_STATE =
"OmniboxUIExperimentHideSteadyStateUrlScheme";
public static final String OMNIBOX_HIDE_TRIVIAL_SUBDOMAINS_IN_STEADY_STATE =
......
......@@ -4,9 +4,6 @@
package org.chromium.chrome.browser.omnibox.suggestions;
import org.chromium.chrome.browser.omnibox.suggestions.AutocompleteMediator.DropdownItemViewInfo;
import org.chromium.ui.modelutil.MVCListAdapter.ModelList;
/**
* Utility methods providing access to package-private methods in {@link AutocompleteCoordinator}
* for tests.
......@@ -37,28 +34,4 @@ public class AutocompleteCoordinatorTestUtils {
AutocompleteCoordinator coordinator) {
return ((AutocompleteCoordinatorImpl) coordinator).getSuggestionsDropdown();
}
/**
* @return The {@link OmniboxSuggestion} at the specified index.
*/
public static OmniboxSuggestion getOmniboxSuggestionAt(
AutocompleteCoordinator coordinator, int index) {
return coordinator.getSuggestionAt(index);
}
/**
* @return The index of the first suggestion which is |type|.
*/
public static int getIndexForFirstSuggestionOfType(
AutocompleteCoordinator coordinator, @OmniboxSuggestionUiType int type) {
ModelList currentModels =
((AutocompleteCoordinatorImpl) coordinator).getSuggestionModelList();
for (int i = 0; i < currentModels.size(); i++) {
DropdownItemViewInfo info = (DropdownItemViewInfo) currentModels.get(i);
if (info.type == type) {
return i;
}
}
return -1;
}
}
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment