Commit 80cf0f6b authored by Tomasz Wiszkowski's avatar Tomasz Wiszkowski Committed by Commit Bot

Make EditUrl suggestion extend the BaseSuggestion

Change-Id: I4a598f87ca7b853ee93f02087945808e65ffef0e
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/2223263
Commit-Queue: Ender <ender@google.com>
Reviewed-by: default avatarFilip Gorski <fgorski@chromium.org>
Reviewed-by: default avatarTed Choc <tedchoc@chromium.org>
Cr-Commit-Position: refs/heads/master@{#774454}
parent 87ca10d0
...@@ -953,7 +953,6 @@ chrome_java_resources = [ ...@@ -953,7 +953,6 @@ chrome_java_resources = [
"java/res/layout/device_item_list.xml", "java/res/layout/device_item_list.xml",
"java/res/layout/distilled_page_font_family_spinner.xml", "java/res/layout/distilled_page_font_family_spinner.xml",
"java/res/layout/distilled_page_prefs_view.xml", "java/res/layout/distilled_page_prefs_view.xml",
"java/res/layout/edit_url_suggestion_layout.xml",
"java/res/layout/editable_option_editor_footer.xml", "java/res/layout/editable_option_editor_footer.xml",
"java/res/layout/editable_option_editor_icons.xml", "java/res/layout/editable_option_editor_icons.xml",
"java/res/layout/empty_accessory_sheet.xml", "java/res/layout/empty_accessory_sheet.xml",
......
...@@ -1169,7 +1169,7 @@ chrome_java_sources = [ ...@@ -1169,7 +1169,7 @@ chrome_java_sources = [
"java/src/org/chromium/chrome/browser/omnibox/suggestions/basic/SuggestionViewViewBinder.java", "java/src/org/chromium/chrome/browser/omnibox/suggestions/basic/SuggestionViewViewBinder.java",
"java/src/org/chromium/chrome/browser/omnibox/suggestions/clipboard/ClipboardSuggestionProcessor.java", "java/src/org/chromium/chrome/browser/omnibox/suggestions/clipboard/ClipboardSuggestionProcessor.java",
"java/src/org/chromium/chrome/browser/omnibox/suggestions/editurl/EditUrlSuggestionProcessor.java", "java/src/org/chromium/chrome/browser/omnibox/suggestions/editurl/EditUrlSuggestionProcessor.java",
"java/src/org/chromium/chrome/browser/omnibox/suggestions/editurl/EditUrlSuggestionProperties.java", "java/src/org/chromium/chrome/browser/omnibox/suggestions/editurl/EditUrlSuggestionView.java",
"java/src/org/chromium/chrome/browser/omnibox/suggestions/editurl/EditUrlSuggestionViewBinder.java", "java/src/org/chromium/chrome/browser/omnibox/suggestions/editurl/EditUrlSuggestionViewBinder.java",
"java/src/org/chromium/chrome/browser/omnibox/suggestions/entity/EntitySuggestionProcessor.java", "java/src/org/chromium/chrome/browser/omnibox/suggestions/entity/EntitySuggestionProcessor.java",
"java/src/org/chromium/chrome/browser/omnibox/suggestions/entity/EntitySuggestionViewBinder.java", "java/src/org/chromium/chrome/browser/omnibox/suggestions/entity/EntitySuggestionViewBinder.java",
......
<?xml version="1.0" encoding="utf-8"?>
<!-- Copyright 2018 The Chromium Authors. All rights reserved.
Use of this source code is governed by a BSD-style license that can be
found in the LICENSE file. -->
<RelativeLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:id="@+id/suggestions_url_view"
android:minHeight="@dimen/omnibox_suggestion_comfortable_height"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="?attr/selectableItemBackground" >
<LinearLayout
android:id="@+id/edit_url_suggestion_icons"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentEnd="true"
android:layout_centerVertical="true"
android:orientation="horizontal"
android:layout_marginEnd="@dimen/omnibox_suggestion_refine_view_modern_end_padding">
<org.chromium.ui.widget.ChromeImageButton
android:id="@+id/url_share_icon"
style="@style/OmniboxSuggestionIconButton"
app:srcCompat="@drawable/ic_share_white_24dp"
android:contentDescription="@string/menu_share_page" />
<org.chromium.ui.widget.ChromeImageButton
android:id="@+id/url_copy_icon"
style="@style/OmniboxSuggestionIconButton"
app:srcCompat="@drawable/ic_content_copy_black"
android:contentDescription="@string/copy_link" />
<org.chromium.ui.widget.ChromeImageButton
android:id="@+id/url_edit_icon"
style="@style/OmniboxSuggestionIconButton"
app:srcCompat="@drawable/bookmark_edit_active"
android:contentDescription="@string/bookmark_item_edit" />
</LinearLayout>
<ImageView
android:id="@+id/edit_url_favicon"
android:layout_width="@dimen/omnibox_suggestion_favicon_size"
android:layout_height="@dimen/omnibox_suggestion_favicon_size"
android:layout_centerVertical="true"
android:layout_marginStart="@dimen/omnibox_suggestion_24dp_icon_margin_start"
android:layout_marginEnd="@dimen/omnibox_suggestion_24dp_icon_margin_end"
android:importantForAccessibility="no"
android:scaleType="centerInside" />
<LinearLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerVertical="true"
android:layout_toStartOf="@id/edit_url_suggestion_icons"
android:layout_toEndOf="@id/edit_url_favicon"
android:orientation="vertical">
<TextView
android:id="@+id/title_text_view"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:ellipsize="end"
android:textAppearance="@style/TextAppearance.TextLarge.Primary"
android:singleLine="true" />
<TextView
android:id="@+id/full_url_text_view"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:ellipsize="end"
android:textAppearance="@style/TextAppearance.OmniboxSuggestionSecondLine"
android:singleLine="true" />
</LinearLayout>
<View
android:layout_alignParentBottom="true"
android:importantForAccessibility="no"
style="@style/HorizontalDivider" />
</RelativeLayout>
...@@ -28,7 +28,7 @@ import org.chromium.chrome.browser.omnibox.suggestions.answer.AnswerSuggestionVi ...@@ -28,7 +28,7 @@ import org.chromium.chrome.browser.omnibox.suggestions.answer.AnswerSuggestionVi
import org.chromium.chrome.browser.omnibox.suggestions.base.BaseSuggestionView; import org.chromium.chrome.browser.omnibox.suggestions.base.BaseSuggestionView;
import org.chromium.chrome.browser.omnibox.suggestions.base.BaseSuggestionViewBinder; import org.chromium.chrome.browser.omnibox.suggestions.base.BaseSuggestionViewBinder;
import org.chromium.chrome.browser.omnibox.suggestions.basic.SuggestionViewViewBinder; import org.chromium.chrome.browser.omnibox.suggestions.basic.SuggestionViewViewBinder;
import org.chromium.chrome.browser.omnibox.suggestions.editurl.EditUrlSuggestionProcessor; import org.chromium.chrome.browser.omnibox.suggestions.editurl.EditUrlSuggestionView;
import org.chromium.chrome.browser.omnibox.suggestions.editurl.EditUrlSuggestionViewBinder; import org.chromium.chrome.browser.omnibox.suggestions.editurl.EditUrlSuggestionViewBinder;
import org.chromium.chrome.browser.omnibox.suggestions.entity.EntitySuggestionViewBinder; import org.chromium.chrome.browser.omnibox.suggestions.entity.EntitySuggestionViewBinder;
import org.chromium.chrome.browser.omnibox.suggestions.header.HeaderView; import org.chromium.chrome.browser.omnibox.suggestions.header.HeaderView;
...@@ -138,8 +138,8 @@ public class AutocompleteCoordinatorImpl implements AutocompleteCoordinator { ...@@ -138,8 +138,8 @@ public class AutocompleteCoordinatorImpl implements AutocompleteCoordinator {
adapter.registerType( adapter.registerType(
OmniboxSuggestionUiType.EDIT_URL_SUGGESTION, OmniboxSuggestionUiType.EDIT_URL_SUGGESTION,
parent -> EditUrlSuggestionProcessor.createView(parent.getContext()), parent -> new EditUrlSuggestionView(parent.getContext()),
EditUrlSuggestionViewBinder::bind); new EditUrlSuggestionViewBinder());
adapter.registerType( adapter.registerType(
OmniboxSuggestionUiType.ANSWER_SUGGESTION, OmniboxSuggestionUiType.ANSWER_SUGGESTION,
......
...@@ -634,8 +634,8 @@ class AutocompleteMediator implements OnSuggestionsReceivedListener, StartStopWi ...@@ -634,8 +634,8 @@ class AutocompleteMediator implements OnSuggestionsReceivedListener, StartStopWi
} }
@Override @Override
public SuggestionViewDelegate createSuggestionViewDelegate( public SuggestionViewDelegate createSuggestionViewDelegate(DropdownItemProcessor processor,
OmniboxSuggestion suggestion, int position) { PropertyModel model, OmniboxSuggestion suggestion, int position) {
return new SuggestionViewDelegate() { return new SuggestionViewDelegate() {
@Override @Override
public void onSetUrlToSuggestion() { public void onSetUrlToSuggestion() {
...@@ -646,6 +646,7 @@ class AutocompleteMediator implements OnSuggestionsReceivedListener, StartStopWi ...@@ -646,6 +646,7 @@ class AutocompleteMediator implements OnSuggestionsReceivedListener, StartStopWi
@Override @Override
public void onSelection() { public void onSelection() {
processor.recordItemUsed(model);
AutocompleteMediator.this.onSelection(suggestion, position); AutocompleteMediator.this.onSelection(suggestion, position);
} }
......
...@@ -37,7 +37,7 @@ public interface DropdownItemProcessor { ...@@ -37,7 +37,7 @@ public interface DropdownItemProcessor {
PropertyModel createModel(); PropertyModel createModel();
/** /**
* Record histograms for this processor. * Record suggestion impressions for this processor.
* Purpose of this function is bookkeeping of presented views at the time user finishes * Purpose of this function is bookkeeping of presented views at the time user finishes
* interacting with omnibox (whether navigating somewhere, turning off screen, leaving omnibox * interacting with omnibox (whether navigating somewhere, turning off screen, leaving omnibox
* or closing the app). * or closing the app).
...@@ -45,6 +45,14 @@ public interface DropdownItemProcessor { ...@@ -45,6 +45,14 @@ public interface DropdownItemProcessor {
*/ */
void recordItemPresented(PropertyModel model); void recordItemPresented(PropertyModel model);
/**
* Record suggestion usage for this processor.
* Purpose of this function is to record that the user selected a suggestion created by
* this processor.
* This call is invoked once for every model created by the processor.
*/
void recordItemUsed(PropertyModel model);
/** /**
* Signals that the dropdown list is about to be populated with new content. * Signals that the dropdown list is about to be populated with new content.
*/ */
......
...@@ -35,7 +35,6 @@ import java.util.Map; ...@@ -35,7 +35,6 @@ import java.util.Map;
*/ */
public class AnswerSuggestionProcessor extends BaseSuggestionViewProcessor { public class AnswerSuggestionProcessor extends BaseSuggestionViewProcessor {
private final Map<String, List<PropertyModel>> mPendingAnswerRequestUrls; private final Map<String, List<PropertyModel>> mPendingAnswerRequestUrls;
private final Context mContext;
private final SuggestionHost mSuggestionHost; private final SuggestionHost mSuggestionHost;
private final UrlBarEditingTextStateProvider mUrlBarEditingTextProvider; private final UrlBarEditingTextStateProvider mUrlBarEditingTextProvider;
private final Supplier<ImageFetcher> mImageFetcherSupplier; private final Supplier<ImageFetcher> mImageFetcherSupplier;
...@@ -48,7 +47,6 @@ public class AnswerSuggestionProcessor extends BaseSuggestionViewProcessor { ...@@ -48,7 +47,6 @@ public class AnswerSuggestionProcessor extends BaseSuggestionViewProcessor {
UrlBarEditingTextStateProvider editingTextProvider, UrlBarEditingTextStateProvider editingTextProvider,
Supplier<ImageFetcher> imageFetcherSupplier) { Supplier<ImageFetcher> imageFetcherSupplier) {
super(context, suggestionHost); super(context, suggestionHost);
mContext = context;
mSuggestionHost = suggestionHost; mSuggestionHost = suggestionHost;
mPendingAnswerRequestUrls = new HashMap<>(); mPendingAnswerRequestUrls = new HashMap<>();
mUrlBarEditingTextProvider = editingTextProvider; mUrlBarEditingTextProvider = editingTextProvider;
...@@ -127,7 +125,7 @@ public class AnswerSuggestionProcessor extends BaseSuggestionViewProcessor { ...@@ -127,7 +125,7 @@ public class AnswerSuggestionProcessor extends BaseSuggestionViewProcessor {
for (int i = 0; i < currentModels.size(); i++) { for (int i = 0; i < currentModels.size(); i++) {
PropertyModel currentModel = currentModels.get(i); PropertyModel currentModel = currentModels.get(i);
setSuggestionDrawableState(currentModel, setSuggestionDrawableState(currentModel,
SuggestionDrawableState.Builder.forBitmap(mContext, bitmap) SuggestionDrawableState.Builder.forBitmap(getContext(), bitmap)
.setLarge(true) .setLarge(true)
.build()); .build());
} }
...@@ -139,7 +137,7 @@ public class AnswerSuggestionProcessor extends BaseSuggestionViewProcessor { ...@@ -139,7 +137,7 @@ public class AnswerSuggestionProcessor extends BaseSuggestionViewProcessor {
*/ */
private void setStateForSuggestion(PropertyModel model, OmniboxSuggestion suggestion) { private void setStateForSuggestion(PropertyModel model, OmniboxSuggestion suggestion) {
AnswerText[] details = AnswerTextNewLayout.from( AnswerText[] details = AnswerTextNewLayout.from(
mContext, suggestion, mUrlBarEditingTextProvider.getTextWithoutAutocomplete()); getContext(), suggestion, mUrlBarEditingTextProvider.getTextWithoutAutocomplete());
model.set(AnswerSuggestionViewProperties.TEXT_LINE_1_TEXT, details[0].mText); model.set(AnswerSuggestionViewProperties.TEXT_LINE_1_TEXT, details[0].mText);
model.set(AnswerSuggestionViewProperties.TEXT_LINE_2_TEXT, details[1].mText); model.set(AnswerSuggestionViewProperties.TEXT_LINE_2_TEXT, details[1].mText);
...@@ -160,7 +158,7 @@ public class AnswerSuggestionProcessor extends BaseSuggestionViewProcessor { ...@@ -160,7 +158,7 @@ public class AnswerSuggestionProcessor extends BaseSuggestionViewProcessor {
setSuggestionDrawableState(model, setSuggestionDrawableState(model,
SuggestionDrawableState.Builder SuggestionDrawableState.Builder
.forDrawableRes(mContext, getSuggestionIcon(suggestion)) .forDrawableRes(getContext(), getSuggestionIcon(suggestion))
.setLarge(true) .setLarge(true)
.build()); .build());
......
...@@ -60,6 +60,9 @@ public abstract class BaseSuggestionViewProcessor implements SuggestionProcessor ...@@ -60,6 +60,9 @@ public abstract class BaseSuggestionViewProcessor implements SuggestionProcessor
@Override @Override
public void recordItemPresented(PropertyModel model) {} public void recordItemPresented(PropertyModel model) {}
@Override
public void recordItemUsed(PropertyModel model) {}
@Override @Override
public void onNativeInitialized() { public void onNativeInitialized() {
if (ChromeFeatureList.isEnabled(ChromeFeatureList.OMNIBOX_COMPACT_SUGGESTIONS)) { if (ChromeFeatureList.isEnabled(ChromeFeatureList.OMNIBOX_COMPACT_SUGGESTIONS)) {
...@@ -126,7 +129,7 @@ public abstract class BaseSuggestionViewProcessor implements SuggestionProcessor ...@@ -126,7 +129,7 @@ public abstract class BaseSuggestionViewProcessor implements SuggestionProcessor
@Override @Override
public void populateModel(OmniboxSuggestion suggestion, PropertyModel model, int position) { public void populateModel(OmniboxSuggestion suggestion, PropertyModel model, int position) {
SuggestionViewDelegate delegate = SuggestionViewDelegate delegate =
mSuggestionHost.createSuggestionViewDelegate(suggestion, position); mSuggestionHost.createSuggestionViewDelegate(this, model, suggestion, position);
model.set(BaseSuggestionViewProperties.SUGGESTION_DELEGATE, delegate); model.set(BaseSuggestionViewProperties.SUGGESTION_DELEGATE, delegate);
model.set(BaseSuggestionViewProperties.DENSITY, mDensity); model.set(BaseSuggestionViewProperties.DENSITY, mDensity);
...@@ -194,4 +197,11 @@ public abstract class BaseSuggestionViewProcessor implements SuggestionProcessor ...@@ -194,4 +197,11 @@ public abstract class BaseSuggestionViewProcessor implements SuggestionProcessor
} }
}); });
} }
/**
* @return Current context.
*/
protected Context getContext() {
return mContext;
}
} }
...@@ -44,7 +44,7 @@ public class BaseSuggestionViewProperties { ...@@ -44,7 +44,7 @@ public class BaseSuggestionViewProperties {
* @param description Content description for the action view. * @param description Content description for the action view.
* @param callback Callback to invoke when user interacts with the icon. * @param callback Callback to invoke when user interacts with the icon.
*/ */
Action(SuggestionDrawableState icon, @StringRes int description, Runnable callback) { public Action(SuggestionDrawableState icon, @StringRes int description, Runnable callback) {
this.icon = icon; this.icon = icon;
this.accessibilityDescription = description; this.accessibilityDescription = description;
this.callback = callback; this.callback = callback;
......
...@@ -30,7 +30,6 @@ import java.util.List; ...@@ -30,7 +30,6 @@ import java.util.List;
/** A class that handles model and view creation for the basic omnibox suggestions. */ /** A class that handles model and view creation for the basic omnibox suggestions. */
public class BasicSuggestionProcessor extends BaseSuggestionViewProcessor { public class BasicSuggestionProcessor extends BaseSuggestionViewProcessor {
private final Context mContext;
private final UrlBarEditingTextStateProvider mUrlBarEditingTextProvider; private final UrlBarEditingTextStateProvider mUrlBarEditingTextProvider;
private final Supplier<LargeIconBridge> mIconBridgeSupplier; private final Supplier<LargeIconBridge> mIconBridgeSupplier;
private final int mDesiredFaviconWidthPx; private final int mDesiredFaviconWidthPx;
...@@ -46,8 +45,7 @@ public class BasicSuggestionProcessor extends BaseSuggestionViewProcessor { ...@@ -46,8 +45,7 @@ public class BasicSuggestionProcessor extends BaseSuggestionViewProcessor {
Supplier<LargeIconBridge> iconBridgeSupplier) { Supplier<LargeIconBridge> iconBridgeSupplier) {
super(context, suggestionHost); super(context, suggestionHost);
mContext = context; mDesiredFaviconWidthPx = getContext().getResources().getDimensionPixelSize(
mDesiredFaviconWidthPx = mContext.getResources().getDimensionPixelSize(
R.dimen.omnibox_suggestion_favicon_size); R.dimen.omnibox_suggestion_favicon_size);
mUrlBarEditingTextProvider = editingTextProvider; mUrlBarEditingTextProvider = editingTextProvider;
mIconBridgeSupplier = iconBridgeSupplier; mIconBridgeSupplier = iconBridgeSupplier;
...@@ -138,7 +136,7 @@ public class BasicSuggestionProcessor extends BaseSuggestionViewProcessor { ...@@ -138,7 +136,7 @@ public class BasicSuggestionProcessor extends BaseSuggestionViewProcessor {
model.set(SuggestionViewProperties.SUGGESTION_ICON_TYPE, type); model.set(SuggestionViewProperties.SUGGESTION_ICON_TYPE, type);
setSuggestionDrawableState(model, setSuggestionDrawableState(model,
SuggestionDrawableState.Builder.forDrawableRes(mContext, icon) SuggestionDrawableState.Builder.forDrawableRes(getContext(), icon)
.setAllowTint(true) .setAllowTint(true)
.build()); .build());
} }
......
...@@ -4,16 +4,21 @@ ...@@ -4,16 +4,21 @@
package org.chromium.chrome.browser.omnibox.suggestions.basic; package org.chromium.chrome.browser.omnibox.suggestions.basic;
import org.chromium.chrome.browser.omnibox.suggestions.DropdownItemProcessor;
import org.chromium.chrome.browser.omnibox.suggestions.OmniboxSuggestion; import org.chromium.chrome.browser.omnibox.suggestions.OmniboxSuggestion;
import org.chromium.ui.modelutil.PropertyModel;
/** A mechanism for creating {@link SuggestionViewDelegate}s. */ /** A mechanism for creating {@link SuggestionViewDelegate}s. */
public interface SuggestionHost { public interface SuggestionHost {
/** /**
* @param processor The suggestion processor that manages the suggestion.
* @param model The property model representing the suggestion.
* @param suggestion The suggestion to create the delegate for. * @param suggestion The suggestion to create the delegate for.
* @param position The position of the delegate in the list. * @param position The position of the delegate in the list.
* @return A delegate for the specified suggestion. * @return A delegate for the specified suggestion.
*/ */
SuggestionViewDelegate createSuggestionViewDelegate(OmniboxSuggestion suggestion, int position); SuggestionViewDelegate createSuggestionViewDelegate(DropdownItemProcessor processor,
PropertyModel model, OmniboxSuggestion suggestion, int position);
/** /**
* Triggered when the user selects to refine one of the omnibox suggestions. * Triggered when the user selects to refine one of the omnibox suggestions.
......
...@@ -25,7 +25,6 @@ import org.chromium.ui.modelutil.PropertyModel; ...@@ -25,7 +25,6 @@ import org.chromium.ui.modelutil.PropertyModel;
/** A class that handles model and view creation for the clipboard suggestions. */ /** A class that handles model and view creation for the clipboard suggestions. */
public class ClipboardSuggestionProcessor extends BaseSuggestionViewProcessor { public class ClipboardSuggestionProcessor extends BaseSuggestionViewProcessor {
private final Context mContext;
private final Supplier<LargeIconBridge> mIconBridgeSupplier; private final Supplier<LargeIconBridge> mIconBridgeSupplier;
/** /**
...@@ -36,7 +35,6 @@ public class ClipboardSuggestionProcessor extends BaseSuggestionViewProcessor { ...@@ -36,7 +35,6 @@ public class ClipboardSuggestionProcessor extends BaseSuggestionViewProcessor {
public ClipboardSuggestionProcessor(Context context, SuggestionHost suggestionHost, public ClipboardSuggestionProcessor(Context context, SuggestionHost suggestionHost,
Supplier<LargeIconBridge> iconBridgeSupplier) { Supplier<LargeIconBridge> iconBridgeSupplier) {
super(context, suggestionHost); super(context, suggestionHost);
mContext = context;
mIconBridgeSupplier = iconBridgeSupplier; mIconBridgeSupplier = iconBridgeSupplier;
} }
...@@ -76,7 +74,8 @@ public class ClipboardSuggestionProcessor extends BaseSuggestionViewProcessor { ...@@ -76,7 +74,8 @@ public class ClipboardSuggestionProcessor extends BaseSuggestionViewProcessor {
Bitmap bitmap = BitmapFactory.decodeByteArray(imageData, 0, imageData.length); Bitmap bitmap = BitmapFactory.decodeByteArray(imageData, 0, imageData.length);
if (bitmap != null) { if (bitmap != null) {
setSuggestionDrawableState(model, setSuggestionDrawableState(model,
SuggestionDrawableState.Builder.forBitmap(mContext, bitmap).build()); SuggestionDrawableState.Builder.forBitmap(getContext(), bitmap)
.build());
return; return;
} }
} }
...@@ -86,7 +85,7 @@ public class ClipboardSuggestionProcessor extends BaseSuggestionViewProcessor { ...@@ -86,7 +85,7 @@ public class ClipboardSuggestionProcessor extends BaseSuggestionViewProcessor {
final int icon = final int icon =
isUrlSuggestion ? R.drawable.ic_globe_24dp : R.drawable.ic_suggestion_magnifier; isUrlSuggestion ? R.drawable.ic_globe_24dp : R.drawable.ic_suggestion_magnifier;
setSuggestionDrawableState(model, setSuggestionDrawableState(model,
SuggestionDrawableState.Builder.forDrawableRes(mContext, icon) SuggestionDrawableState.Builder.forDrawableRes(getContext(), icon)
.setAllowTint(true) .setAllowTint(true)
.build()); .build());
......
// Copyright 2018 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
package org.chromium.chrome.browser.omnibox.suggestions.editurl;
import android.graphics.Bitmap;
import android.view.View;
import org.chromium.chrome.browser.omnibox.suggestions.SuggestionCommonProperties;
import org.chromium.ui.modelutil.PropertyKey;
import org.chromium.ui.modelutil.PropertyModel;
import org.chromium.ui.modelutil.PropertyModel.WritableObjectPropertyKey;
/** The properties for the "edit URL" suggestion in the omnibox suggestions. */
class EditUrlSuggestionProperties {
/** The key for the title displayed by the suggestion item. */
public static final WritableObjectPropertyKey<String> TITLE_TEXT =
new WritableObjectPropertyKey<>();
/** The key for the URL displayed for the suggestion item. */
public static final WritableObjectPropertyKey<String> URL_TEXT =
new WritableObjectPropertyKey<>();
/** The key for the click listener that all of the buttons use. */
public static final WritableObjectPropertyKey<View.OnClickListener> BUTTON_CLICK_LISTENER =
new WritableObjectPropertyKey<>();
/** The key for the click listener that the text of the suggestion uses. */
public static final WritableObjectPropertyKey<View.OnClickListener> TEXT_CLICK_LISTENER =
new WritableObjectPropertyKey<>();
public static final WritableObjectPropertyKey<Bitmap> SITE_FAVICON =
new WritableObjectPropertyKey<>();
private static final PropertyKey[] ALL_UNIQUE_KEYS = new PropertyKey[] {
TITLE_TEXT, URL_TEXT, BUTTON_CLICK_LISTENER, TEXT_CLICK_LISTENER, SITE_FAVICON};
public static final PropertyKey[] ALL_KEYS =
PropertyModel.concatKeys(ALL_UNIQUE_KEYS, SuggestionCommonProperties.ALL_KEYS);
}
// Copyright 2020 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
package org.chromium.chrome.browser.omnibox.suggestions.editurl;
import android.content.Context;
import android.view.Gravity;
import android.view.View;
import android.widget.FrameLayout;
import org.chromium.chrome.R;
import org.chromium.chrome.browser.omnibox.suggestions.base.BaseSuggestionView;
/**
* Container view for Search-Ready Omnibox suggestions.
* Decorates the suggestion with the bottom bar.
*/
public class EditUrlSuggestionView extends FrameLayout {
BaseSuggestionView<View> mContent;
public EditUrlSuggestionView(Context context) {
super(context, null);
mContent = new BaseSuggestionView<View>(context, R.layout.omnibox_basic_suggestion);
LayoutParams contentLayoutParams = generateDefaultLayoutParams();
contentLayoutParams.width = LayoutParams.MATCH_PARENT;
contentLayoutParams.height = LayoutParams.WRAP_CONTENT;
addView(mContent, contentLayoutParams);
View divider = new View(context, null, 0, R.style.HorizontalDivider);
LayoutParams dividerLayoutParams = generateDefaultLayoutParams();
dividerLayoutParams.gravity = Gravity.BOTTOM;
dividerLayoutParams.width = LayoutParams.MATCH_PARENT;
dividerLayoutParams.height = getResources().getDimensionPixelSize(R.dimen.divider_height);
addView(divider, dividerLayoutParams);
}
BaseSuggestionView<View> getBaseSuggestionView() {
return mContent;
}
@Override
public void setSelected(boolean selected) {
mContent.setSelected(selected);
}
}
// Copyright 2018 The Chromium Authors. All rights reserved. // Copyright 2020 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be // Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file. // found in the LICENSE file.
package org.chromium.chrome.browser.omnibox.suggestions.editurl; package org.chromium.chrome.browser.omnibox.suggestions.editurl;
import android.graphics.Bitmap; import android.view.View;
import android.graphics.drawable.Drawable;
import android.view.ViewGroup;
import android.widget.ImageView;
import android.widget.TextView;
import androidx.annotation.ColorRes; import org.chromium.chrome.browser.omnibox.suggestions.base.BaseSuggestionViewBinder;
import androidx.appcompat.content.res.AppCompatResources; import org.chromium.chrome.browser.omnibox.suggestions.basic.SuggestionViewViewBinder;
import androidx.core.graphics.drawable.DrawableCompat;
import org.chromium.chrome.R;
import org.chromium.chrome.browser.omnibox.suggestions.SuggestionCommonProperties;
import org.chromium.components.browser_ui.styles.ChromeColors;
import org.chromium.ui.modelutil.PropertyKey; import org.chromium.ui.modelutil.PropertyKey;
import org.chromium.ui.modelutil.PropertyModel; import org.chromium.ui.modelutil.PropertyModel;
import org.chromium.ui.modelutil.PropertyModelChangeProcessor.ViewBinder;
/** Binder proxy for EditURL Suggestions. */
public class EditUrlSuggestionViewBinder
implements ViewBinder<PropertyModel, EditUrlSuggestionView, PropertyKey> {
private final BaseSuggestionViewBinder<View> mBinder;
/** A mechanism for binding the {@link EditUrlSuggestionProperties} to its view. */ public EditUrlSuggestionViewBinder() {
public class EditUrlSuggestionViewBinder { mBinder = new BaseSuggestionViewBinder<>(SuggestionViewViewBinder::bind);
public static void bind(PropertyModel model, ViewGroup view, PropertyKey propertyKey) {
if (EditUrlSuggestionProperties.TITLE_TEXT == propertyKey) {
TextView titleView = view.findViewById(R.id.title_text_view);
titleView.setText(model.get(EditUrlSuggestionProperties.TITLE_TEXT));
} else if (EditUrlSuggestionProperties.URL_TEXT == propertyKey) {
TextView urlView = view.findViewById(R.id.full_url_text_view);
urlView.setText(model.get(EditUrlSuggestionProperties.URL_TEXT));
} else if (EditUrlSuggestionProperties.BUTTON_CLICK_LISTENER == propertyKey) {
view.findViewById(R.id.url_edit_icon)
.setOnClickListener(
model.get(EditUrlSuggestionProperties.BUTTON_CLICK_LISTENER));
view.findViewById(R.id.url_copy_icon)
.setOnClickListener(
model.get(EditUrlSuggestionProperties.BUTTON_CLICK_LISTENER));
view.findViewById(R.id.url_share_icon)
.setOnClickListener(
model.get(EditUrlSuggestionProperties.BUTTON_CLICK_LISTENER));
} else if (EditUrlSuggestionProperties.TEXT_CLICK_LISTENER == propertyKey) {
view.setOnClickListener(model.get(EditUrlSuggestionProperties.TEXT_CLICK_LISTENER));
} else if (EditUrlSuggestionProperties.SITE_FAVICON == propertyKey
|| SuggestionCommonProperties.USE_DARK_COLORS == propertyKey) {
updateSiteFavicon(view.findViewById(R.id.edit_url_favicon), model);
}
// TODO(mdjones): Support SuggestionCommonProperties.*
} }
private static void updateSiteFavicon(ImageView view, PropertyModel model) { @Override
Bitmap bitmap = model.get(EditUrlSuggestionProperties.SITE_FAVICON); public void bind(PropertyModel model, EditUrlSuggestionView view, PropertyKey propertyKey) {
if (bitmap != null) { mBinder.bind(model, view.getBaseSuggestionView(), propertyKey);
view.setImageBitmap(bitmap);
} else {
boolean useDarkColors = model.get(SuggestionCommonProperties.USE_DARK_COLORS);
Drawable icon =
AppCompatResources.getDrawable(view.getContext(), R.drawable.ic_globe_24dp);
@ColorRes
int color = view.getContext().getResources().getColor(
ChromeColors.getSecondaryIconTintRes(!useDarkColors));
DrawableCompat.setTint(icon, color);
view.setImageDrawable(icon);
}
} }
} }
...@@ -38,7 +38,6 @@ import java.util.Map; ...@@ -38,7 +38,6 @@ import java.util.Map;
/** A class that handles model and view creation for the Entity suggestions. */ /** A class that handles model and view creation for the Entity suggestions. */
public class EntitySuggestionProcessor extends BaseSuggestionViewProcessor { public class EntitySuggestionProcessor extends BaseSuggestionViewProcessor {
private static final String TAG = "EntitySP"; private static final String TAG = "EntitySP";
private final Context mContext;
private final SuggestionHost mSuggestionHost; private final SuggestionHost mSuggestionHost;
private final Map<GURL, List<PropertyModel>> mPendingImageRequests; private final Map<GURL, List<PropertyModel>> mPendingImageRequests;
private final int mEntityImageSizePx; private final int mEntityImageSizePx;
...@@ -67,7 +66,6 @@ public class EntitySuggestionProcessor extends BaseSuggestionViewProcessor { ...@@ -67,7 +66,6 @@ public class EntitySuggestionProcessor extends BaseSuggestionViewProcessor {
public EntitySuggestionProcessor(Context context, SuggestionHost suggestionHost, public EntitySuggestionProcessor(Context context, SuggestionHost suggestionHost,
Supplier<ImageFetcher> imageFetcherSupplier) { Supplier<ImageFetcher> imageFetcherSupplier) {
super(context, suggestionHost); super(context, suggestionHost);
mContext = context;
mSuggestionHost = suggestionHost; mSuggestionHost = suggestionHost;
mPendingImageRequests = new HashMap<>(); mPendingImageRequests = new HashMap<>();
mEntityImageSizePx = context.getResources().getDimensionPixelSize( mEntityImageSizePx = context.getResources().getDimensionPixelSize(
...@@ -134,7 +132,7 @@ public class EntitySuggestionProcessor extends BaseSuggestionViewProcessor { ...@@ -134,7 +132,7 @@ public class EntitySuggestionProcessor extends BaseSuggestionViewProcessor {
for (int i = 0; i < pendingModels.size(); i++) { for (int i = 0; i < pendingModels.size(); i++) {
PropertyModel pendingModel = pendingModels.get(i); PropertyModel pendingModel = pendingModels.get(i);
setSuggestionDrawableState(pendingModel, setSuggestionDrawableState(pendingModel,
SuggestionDrawableState.Builder.forBitmap(mContext, bitmap) SuggestionDrawableState.Builder.forBitmap(getContext(), bitmap)
.setUseRoundedCorners(true) .setUseRoundedCorners(true)
.setLarge(true) .setLarge(true)
.build()); .build());
...@@ -171,7 +169,7 @@ public class EntitySuggestionProcessor extends BaseSuggestionViewProcessor { ...@@ -171,7 +169,7 @@ public class EntitySuggestionProcessor extends BaseSuggestionViewProcessor {
super.populateModel(suggestion, model, position); super.populateModel(suggestion, model, position);
setSuggestionDrawableState(model, setSuggestionDrawableState(model,
SuggestionDrawableState.Builder SuggestionDrawableState.Builder
.forDrawableRes(mContext, R.drawable.ic_suggestion_magnifier) .forDrawableRes(getContext(), R.drawable.ic_suggestion_magnifier)
.setAllowTint(true) .setAllowTint(true)
.build()); .build());
model.set(EntitySuggestionViewProperties.DECORATION_TYPE, DECORATION_TYPE_ICON); model.set(EntitySuggestionViewProperties.DECORATION_TYPE, DECORATION_TYPE_ICON);
......
...@@ -54,6 +54,9 @@ public class HeaderProcessor implements DropdownItemProcessor { ...@@ -54,6 +54,9 @@ public class HeaderProcessor implements DropdownItemProcessor {
@Override @Override
public void recordItemPresented(PropertyModel model) {} public void recordItemPresented(PropertyModel model) {}
@Override
public void recordItemUsed(PropertyModel model) {}
@Override @Override
public void onSuggestionsReceived() {} public void onSuggestionsReceived() {}
......
...@@ -19,7 +19,6 @@ import org.chromium.ui.modelutil.PropertyModel; ...@@ -19,7 +19,6 @@ import org.chromium.ui.modelutil.PropertyModel;
/** A class that handles model and view creation for the tail suggestions. */ /** A class that handles model and view creation for the tail suggestions. */
public class TailSuggestionProcessor extends BaseSuggestionViewProcessor { public class TailSuggestionProcessor extends BaseSuggestionViewProcessor {
private final Context mContext;
private final boolean mAlignTailSuggestions; private final boolean mAlignTailSuggestions;
private AlignmentManager mAlignmentManager; private AlignmentManager mAlignmentManager;
...@@ -29,7 +28,6 @@ public class TailSuggestionProcessor extends BaseSuggestionViewProcessor { ...@@ -29,7 +28,6 @@ public class TailSuggestionProcessor extends BaseSuggestionViewProcessor {
*/ */
public TailSuggestionProcessor(Context context, SuggestionHost suggestionHost) { public TailSuggestionProcessor(Context context, SuggestionHost suggestionHost) {
super(context, suggestionHost); super(context, suggestionHost);
mContext = context;
mAlignTailSuggestions = DeviceFormFactor.isNonMultiDisplayContextOnTablet(context); mAlignTailSuggestions = DeviceFormFactor.isNonMultiDisplayContextOnTablet(context);
} }
...@@ -64,7 +62,7 @@ public class TailSuggestionProcessor extends BaseSuggestionViewProcessor { ...@@ -64,7 +62,7 @@ public class TailSuggestionProcessor extends BaseSuggestionViewProcessor {
setSuggestionDrawableState(model, setSuggestionDrawableState(model,
SuggestionDrawableState.Builder SuggestionDrawableState.Builder
.forDrawableRes(mContext, R.drawable.ic_suggestion_magnifier) .forDrawableRes(getContext(), R.drawable.ic_suggestion_magnifier)
.setAllowTint(true) .setAllowTint(true)
.build()); .build());
setRefineAction(model, suggestion); setRefineAction(model, suggestion);
......
...@@ -81,6 +81,9 @@ public class TileSuggestionProcessor implements SuggestionProcessor { ...@@ -81,6 +81,9 @@ public class TileSuggestionProcessor implements SuggestionProcessor {
// TODO(crbug.com/1068672): Record metrics. // TODO(crbug.com/1068672): Record metrics.
} }
@Override
public void recordItemUsed(PropertyModel model) {}
@Override @Override
public void onSuggestionsReceived() {} public void onSuggestionsReceived() {}
} }
...@@ -4,28 +4,29 @@ ...@@ -4,28 +4,29 @@
package org.chromium.chrome.browser.omnibox.suggestions.editurl; package org.chromium.chrome.browser.omnibox.suggestions.editurl;
import static org.mockito.Mockito.any; import static org.mockito.Mockito.times;
import static org.mockito.Mockito.anyInt;
import static org.mockito.Mockito.verify; import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when; import static org.mockito.Mockito.when;
import android.content.ClipboardManager;
import android.content.Context; import android.content.Context;
import android.content.res.Resources;
import android.view.View; import android.view.View;
import org.junit.Assert; import org.junit.Assert;
import org.mockito.Mock; import org.mockito.Mock;
import org.mockito.MockitoAnnotations; import org.mockito.MockitoAnnotations;
import org.chromium.base.ContextUtils;
import org.chromium.base.annotations.CalledByNative; import org.chromium.base.annotations.CalledByNative;
import org.chromium.base.annotations.CalledByNativeJavaTest; import org.chromium.base.annotations.CalledByNativeJavaTest;
import org.chromium.chrome.R;
import org.chromium.chrome.browser.ActivityTabProvider; import org.chromium.chrome.browser.ActivityTabProvider;
import org.chromium.chrome.browser.omnibox.OmniboxSuggestionType; import org.chromium.chrome.browser.omnibox.OmniboxSuggestionType;
import org.chromium.chrome.browser.omnibox.suggestions.OmniboxSuggestion; import org.chromium.chrome.browser.omnibox.suggestions.OmniboxSuggestion;
import org.chromium.chrome.browser.omnibox.suggestions.UrlBarDelegate; import org.chromium.chrome.browser.omnibox.suggestions.UrlBarDelegate;
import org.chromium.chrome.browser.omnibox.suggestions.base.BaseSuggestionViewProperties;
import org.chromium.chrome.browser.omnibox.suggestions.base.BaseSuggestionViewProperties.Action;
import org.chromium.chrome.browser.omnibox.suggestions.basic.SuggestionHost; import org.chromium.chrome.browser.omnibox.suggestions.basic.SuggestionHost;
import org.chromium.chrome.browser.omnibox.suggestions.basic.SuggestionViewDelegate; import org.chromium.chrome.browser.omnibox.suggestions.basic.SuggestionViewProperties;
import org.chromium.chrome.browser.search_engines.TemplateUrlServiceFactory; import org.chromium.chrome.browser.search_engines.TemplateUrlServiceFactory;
import org.chromium.chrome.browser.share.ShareDelegate; import org.chromium.chrome.browser.share.ShareDelegate;
import org.chromium.chrome.browser.tab.Tab; import org.chromium.chrome.browser.tab.Tab;
...@@ -34,6 +35,8 @@ import org.chromium.components.search_engines.TemplateUrlService; ...@@ -34,6 +35,8 @@ import org.chromium.components.search_engines.TemplateUrlService;
import org.chromium.ui.modelutil.PropertyModel; import org.chromium.ui.modelutil.PropertyModel;
import org.chromium.url.GURL; import org.chromium.url.GURL;
import java.util.List;
/** /**
* Unit tests for the "edit url" omnibox suggestion. * Unit tests for the "edit url" omnibox suggestion.
*/ */
...@@ -42,6 +45,10 @@ public final class EditUrlSuggestionUnitTest { ...@@ -42,6 +45,10 @@ public final class EditUrlSuggestionUnitTest {
private static final String FOOBAR_SEARCH_TERMS = "foobar"; private static final String FOOBAR_SEARCH_TERMS = "foobar";
private static final String BARBAZ_SEARCH_TERMS = "barbaz"; private static final String BARBAZ_SEARCH_TERMS = "barbaz";
private static final int ACTION_SHARE = 0;
private static final int ACTION_COPY = 1;
private static final int ACTION_EDIT = 2;
private final GURL mTestUrl = new GURL("http://www.example.com"); private final GURL mTestUrl = new GURL("http://www.example.com");
private final GURL mFoobarSearchUrl = private final GURL mFoobarSearchUrl =
new GURL("http://www.example.com?q=" + FOOBAR_SEARCH_TERMS); new GURL("http://www.example.com?q=" + FOOBAR_SEARCH_TERMS);
...@@ -50,12 +57,6 @@ public final class EditUrlSuggestionUnitTest { ...@@ -50,12 +57,6 @@ public final class EditUrlSuggestionUnitTest {
private EditUrlSuggestionProcessor mProcessor; private EditUrlSuggestionProcessor mProcessor;
private PropertyModel mModel; private PropertyModel mModel;
@Mock
Context mContext;
@Mock
Resources mResources;
@Mock @Mock
private ActivityTabProvider mTabProvider; private ActivityTabProvider mTabProvider;
...@@ -92,9 +93,6 @@ public final class EditUrlSuggestionUnitTest { ...@@ -92,9 +93,6 @@ public final class EditUrlSuggestionUnitTest {
@Mock @Mock
private SuggestionHost mSuggestionHost; private SuggestionHost mSuggestionHost;
@Mock
private SuggestionViewDelegate mDelegate;
@CalledByNative @CalledByNative
private EditUrlSuggestionUnitTest() {} private EditUrlSuggestionUnitTest() {}
...@@ -104,7 +102,6 @@ public final class EditUrlSuggestionUnitTest { ...@@ -104,7 +102,6 @@ public final class EditUrlSuggestionUnitTest {
TemplateUrlServiceFactory.setInstanceForTesting(mTemplateUrlService); TemplateUrlServiceFactory.setInstanceForTesting(mTemplateUrlService);
when(mContext.getResources()).thenReturn(mResources);
when(mTab.getUrl()).thenReturn(mTestUrl); when(mTab.getUrl()).thenReturn(mTestUrl);
when(mTab.getTitle()).thenReturn(TEST_TITLE); when(mTab.getTitle()).thenReturn(TEST_TITLE);
when(mTab.isNativePage()).thenReturn(false); when(mTab.isNativePage()).thenReturn(false);
...@@ -122,16 +119,13 @@ public final class EditUrlSuggestionUnitTest { ...@@ -122,16 +119,13 @@ public final class EditUrlSuggestionUnitTest {
when(mOtherSuggestion.getType()).thenReturn(OmniboxSuggestionType.SEARCH_HISTORY); when(mOtherSuggestion.getType()).thenReturn(OmniboxSuggestionType.SEARCH_HISTORY);
when(mSuggestionHost.createSuggestionViewDelegate(any(), anyInt())).thenReturn(mDelegate); mModel = new PropertyModel.Builder(SuggestionViewProperties.ALL_KEYS).build();
mModel = new PropertyModel.Builder(EditUrlSuggestionProperties.ALL_KEYS).build(); mProcessor = new EditUrlSuggestionProcessor(ContextUtils.getApplicationContext(),
mSuggestionHost, mUrlBarDelegate, () -> mIconBridge);
mProcessor = new EditUrlSuggestionProcessor(
mContext, mSuggestionHost, mUrlBarDelegate, () -> mIconBridge);
mProcessor.setActivityTabProvider(mTabProvider); mProcessor.setActivityTabProvider(mTabProvider);
mProcessor.setShareDelegateSupplier(() -> mShareDelegate); mProcessor.setShareDelegateSupplier(() -> mShareDelegate);
when(mEditButton.getId()).thenReturn(R.id.url_edit_icon);
} }
/** Test that the suggestion is triggered. */ /** Test that the suggestion is triggered. */
...@@ -145,10 +139,11 @@ public final class EditUrlSuggestionUnitTest { ...@@ -145,10 +139,11 @@ public final class EditUrlSuggestionUnitTest {
mProcessor.populateModel(mWhatYouTypedSuggestion, mModel, 0); mProcessor.populateModel(mWhatYouTypedSuggestion, mModel, 0);
Assert.assertEquals("The model should have the title set.", TEST_TITLE, Assert.assertEquals("The model should have the title set.", TEST_TITLE,
mModel.get(EditUrlSuggestionProperties.TITLE_TEXT)); mModel.get(SuggestionViewProperties.TEXT_LINE_1_TEXT).toString());
Assert.assertEquals("The model should have the URL set to the tab's URL", Assert.assertEquals("The model should have the URL set to the tab's URL",
mTestUrl.getSpec(), mModel.get(EditUrlSuggestionProperties.URL_TEXT)); mTestUrl.getSpec(),
mModel.get(SuggestionViewProperties.TEXT_LINE_2_TEXT).toString());
} }
/** Test that the suggestion is not triggered if its url doesn't match the current page's. */ /** Test that the suggestion is not triggered if its url doesn't match the current page's. */
...@@ -168,21 +163,42 @@ public final class EditUrlSuggestionUnitTest { ...@@ -168,21 +163,42 @@ public final class EditUrlSuggestionUnitTest {
mProcessor.doesProcessSuggestion(mWhatYouTypedSuggestion); mProcessor.doesProcessSuggestion(mWhatYouTypedSuggestion);
mProcessor.populateModel(mWhatYouTypedSuggestion, mModel, 0); mProcessor.populateModel(mWhatYouTypedSuggestion, mModel, 0);
mModel.get(EditUrlSuggestionProperties.BUTTON_CLICK_LISTENER).onClick(mEditButton); List<Action> actions = mModel.get(BaseSuggestionViewProperties.ACTIONS);
Assert.assertEquals("EditUrl suggestion should have 3 action buttons.", 3, actions.size());
actions.get(ACTION_EDIT).callback.run();
verify(mUrlBarDelegate).setOmniboxEditingText(mTestUrl.getSpec()); verify(mUrlBarDelegate).setOmniboxEditingText(mTestUrl.getSpec());
} }
/** Test that when suggestion is tapped, it still navigates to the correct location. */ /** Test the share button is pressed, we trigger the share menu. */
@CalledByNativeJavaTest @CalledByNativeJavaTest
public void testPressSuggestion() { public void testShareButtonPress() {
mProcessor.onUrlFocusChange(true); mProcessor.onUrlFocusChange(true);
mProcessor.doesProcessSuggestion(mWhatYouTypedSuggestion); mProcessor.doesProcessSuggestion(mWhatYouTypedSuggestion);
mProcessor.populateModel(mWhatYouTypedSuggestion, mModel, 0); mProcessor.populateModel(mWhatYouTypedSuggestion, mModel, 0);
mModel.get(EditUrlSuggestionProperties.TEXT_CLICK_LISTENER).onClick(mSuggestionView); List<Action> actions = mModel.get(BaseSuggestionViewProperties.ACTIONS);
Assert.assertEquals("EditUrl suggestion should have 3 action buttons.", 3, actions.size());
actions.get(ACTION_SHARE).callback.run();
verify(mShareDelegate, times(1)).share(mTab, false /* shareDirectly */);
}
/** Test the copy button is pressed, we update clipboard. */
@CalledByNativeJavaTest
public void testCopyButtonPress() {
mProcessor.onUrlFocusChange(true);
mProcessor.doesProcessSuggestion(mWhatYouTypedSuggestion);
mProcessor.populateModel(mWhatYouTypedSuggestion, mModel, 0);
List<Action> actions = mModel.get(BaseSuggestionViewProperties.ACTIONS);
Assert.assertEquals("EditUrl suggestion should have 3 action buttons.", 3, actions.size());
actions.get(ACTION_COPY).callback.run();
verify(mDelegate).onSelection(); ClipboardManager clipboardManager =
(ClipboardManager) ContextUtils.getApplicationContext().getSystemService(
Context.CLIPBOARD_SERVICE);
Assert.assertEquals("Clipboard content should be updated when user presses Copy button.",
mTestUrl.getSpec(), clipboardManager.getText());
} }
@CalledByNativeJavaTest @CalledByNativeJavaTest
......
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