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 = [
"java/res/layout/device_item_list.xml",
"java/res/layout/distilled_page_font_family_spinner.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_icons.xml",
"java/res/layout/empty_accessory_sheet.xml",
......
......@@ -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/clipboard/ClipboardSuggestionProcessor.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/entity/EntitySuggestionProcessor.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
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.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.entity.EntitySuggestionViewBinder;
import org.chromium.chrome.browser.omnibox.suggestions.header.HeaderView;
......@@ -138,8 +138,8 @@ public class AutocompleteCoordinatorImpl implements AutocompleteCoordinator {
adapter.registerType(
OmniboxSuggestionUiType.EDIT_URL_SUGGESTION,
parent -> EditUrlSuggestionProcessor.createView(parent.getContext()),
EditUrlSuggestionViewBinder::bind);
parent -> new EditUrlSuggestionView(parent.getContext()),
new EditUrlSuggestionViewBinder());
adapter.registerType(
OmniboxSuggestionUiType.ANSWER_SUGGESTION,
......
......@@ -634,8 +634,8 @@ class AutocompleteMediator implements OnSuggestionsReceivedListener, StartStopWi
}
@Override
public SuggestionViewDelegate createSuggestionViewDelegate(
OmniboxSuggestion suggestion, int position) {
public SuggestionViewDelegate createSuggestionViewDelegate(DropdownItemProcessor processor,
PropertyModel model, OmniboxSuggestion suggestion, int position) {
return new SuggestionViewDelegate() {
@Override
public void onSetUrlToSuggestion() {
......@@ -646,6 +646,7 @@ class AutocompleteMediator implements OnSuggestionsReceivedListener, StartStopWi
@Override
public void onSelection() {
processor.recordItemUsed(model);
AutocompleteMediator.this.onSelection(suggestion, position);
}
......
......@@ -37,7 +37,7 @@ public interface DropdownItemProcessor {
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
* interacting with omnibox (whether navigating somewhere, turning off screen, leaving omnibox
* or closing the app).
......@@ -45,6 +45,14 @@ public interface DropdownItemProcessor {
*/
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.
*/
......
......@@ -35,7 +35,6 @@ import java.util.Map;
*/
public class AnswerSuggestionProcessor extends BaseSuggestionViewProcessor {
private final Map<String, List<PropertyModel>> mPendingAnswerRequestUrls;
private final Context mContext;
private final SuggestionHost mSuggestionHost;
private final UrlBarEditingTextStateProvider mUrlBarEditingTextProvider;
private final Supplier<ImageFetcher> mImageFetcherSupplier;
......@@ -48,7 +47,6 @@ public class AnswerSuggestionProcessor extends BaseSuggestionViewProcessor {
UrlBarEditingTextStateProvider editingTextProvider,
Supplier<ImageFetcher> imageFetcherSupplier) {
super(context, suggestionHost);
mContext = context;
mSuggestionHost = suggestionHost;
mPendingAnswerRequestUrls = new HashMap<>();
mUrlBarEditingTextProvider = editingTextProvider;
......@@ -127,7 +125,7 @@ public class AnswerSuggestionProcessor extends BaseSuggestionViewProcessor {
for (int i = 0; i < currentModels.size(); i++) {
PropertyModel currentModel = currentModels.get(i);
setSuggestionDrawableState(currentModel,
SuggestionDrawableState.Builder.forBitmap(mContext, bitmap)
SuggestionDrawableState.Builder.forBitmap(getContext(), bitmap)
.setLarge(true)
.build());
}
......@@ -139,7 +137,7 @@ public class AnswerSuggestionProcessor extends BaseSuggestionViewProcessor {
*/
private void setStateForSuggestion(PropertyModel model, OmniboxSuggestion suggestion) {
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_2_TEXT, details[1].mText);
......@@ -160,7 +158,7 @@ public class AnswerSuggestionProcessor extends BaseSuggestionViewProcessor {
setSuggestionDrawableState(model,
SuggestionDrawableState.Builder
.forDrawableRes(mContext, getSuggestionIcon(suggestion))
.forDrawableRes(getContext(), getSuggestionIcon(suggestion))
.setLarge(true)
.build());
......
......@@ -60,6 +60,9 @@ public abstract class BaseSuggestionViewProcessor implements SuggestionProcessor
@Override
public void recordItemPresented(PropertyModel model) {}
@Override
public void recordItemUsed(PropertyModel model) {}
@Override
public void onNativeInitialized() {
if (ChromeFeatureList.isEnabled(ChromeFeatureList.OMNIBOX_COMPACT_SUGGESTIONS)) {
......@@ -126,7 +129,7 @@ public abstract class BaseSuggestionViewProcessor implements SuggestionProcessor
@Override
public void populateModel(OmniboxSuggestion suggestion, PropertyModel model, int position) {
SuggestionViewDelegate delegate =
mSuggestionHost.createSuggestionViewDelegate(suggestion, position);
mSuggestionHost.createSuggestionViewDelegate(this, model, suggestion, position);
model.set(BaseSuggestionViewProperties.SUGGESTION_DELEGATE, delegate);
model.set(BaseSuggestionViewProperties.DENSITY, mDensity);
......@@ -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 {
* @param description Content description for the action view.
* @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.accessibilityDescription = description;
this.callback = callback;
......
......@@ -30,7 +30,6 @@ import java.util.List;
/** A class that handles model and view creation for the basic omnibox suggestions. */
public class BasicSuggestionProcessor extends BaseSuggestionViewProcessor {
private final Context mContext;
private final UrlBarEditingTextStateProvider mUrlBarEditingTextProvider;
private final Supplier<LargeIconBridge> mIconBridgeSupplier;
private final int mDesiredFaviconWidthPx;
......@@ -46,8 +45,7 @@ public class BasicSuggestionProcessor extends BaseSuggestionViewProcessor {
Supplier<LargeIconBridge> iconBridgeSupplier) {
super(context, suggestionHost);
mContext = context;
mDesiredFaviconWidthPx = mContext.getResources().getDimensionPixelSize(
mDesiredFaviconWidthPx = getContext().getResources().getDimensionPixelSize(
R.dimen.omnibox_suggestion_favicon_size);
mUrlBarEditingTextProvider = editingTextProvider;
mIconBridgeSupplier = iconBridgeSupplier;
......@@ -138,7 +136,7 @@ public class BasicSuggestionProcessor extends BaseSuggestionViewProcessor {
model.set(SuggestionViewProperties.SUGGESTION_ICON_TYPE, type);
setSuggestionDrawableState(model,
SuggestionDrawableState.Builder.forDrawableRes(mContext, icon)
SuggestionDrawableState.Builder.forDrawableRes(getContext(), icon)
.setAllowTint(true)
.build());
}
......
......@@ -4,16 +4,21 @@
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.ui.modelutil.PropertyModel;
/** A mechanism for creating {@link SuggestionViewDelegate}s. */
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 position The position of the delegate in the list.
* @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.
......
......@@ -25,7 +25,6 @@ import org.chromium.ui.modelutil.PropertyModel;
/** A class that handles model and view creation for the clipboard suggestions. */
public class ClipboardSuggestionProcessor extends BaseSuggestionViewProcessor {
private final Context mContext;
private final Supplier<LargeIconBridge> mIconBridgeSupplier;
/**
......@@ -36,7 +35,6 @@ public class ClipboardSuggestionProcessor extends BaseSuggestionViewProcessor {
public ClipboardSuggestionProcessor(Context context, SuggestionHost suggestionHost,
Supplier<LargeIconBridge> iconBridgeSupplier) {
super(context, suggestionHost);
mContext = context;
mIconBridgeSupplier = iconBridgeSupplier;
}
......@@ -76,7 +74,8 @@ public class ClipboardSuggestionProcessor extends BaseSuggestionViewProcessor {
Bitmap bitmap = BitmapFactory.decodeByteArray(imageData, 0, imageData.length);
if (bitmap != null) {
setSuggestionDrawableState(model,
SuggestionDrawableState.Builder.forBitmap(mContext, bitmap).build());
SuggestionDrawableState.Builder.forBitmap(getContext(), bitmap)
.build());
return;
}
}
......@@ -86,7 +85,7 @@ public class ClipboardSuggestionProcessor extends BaseSuggestionViewProcessor {
final int icon =
isUrlSuggestion ? R.drawable.ic_globe_24dp : R.drawable.ic_suggestion_magnifier;
setSuggestionDrawableState(model,
SuggestionDrawableState.Builder.forDrawableRes(mContext, icon)
SuggestionDrawableState.Builder.forDrawableRes(getContext(), icon)
.setAllowTint(true)
.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
// found in the LICENSE file.
package org.chromium.chrome.browser.omnibox.suggestions.editurl;
import android.graphics.Bitmap;
import android.graphics.drawable.Drawable;
import android.view.ViewGroup;
import android.widget.ImageView;
import android.widget.TextView;
import android.view.View;
import androidx.annotation.ColorRes;
import androidx.appcompat.content.res.AppCompatResources;
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.chrome.browser.omnibox.suggestions.base.BaseSuggestionViewBinder;
import org.chromium.chrome.browser.omnibox.suggestions.basic.SuggestionViewViewBinder;
import org.chromium.ui.modelutil.PropertyKey;
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 class EditUrlSuggestionViewBinder {
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.*
public EditUrlSuggestionViewBinder() {
mBinder = new BaseSuggestionViewBinder<>(SuggestionViewViewBinder::bind);
}
private static void updateSiteFavicon(ImageView view, PropertyModel model) {
Bitmap bitmap = model.get(EditUrlSuggestionProperties.SITE_FAVICON);
if (bitmap != null) {
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);
}
@Override
public void bind(PropertyModel model, EditUrlSuggestionView view, PropertyKey propertyKey) {
mBinder.bind(model, view.getBaseSuggestionView(), propertyKey);
}
}
......@@ -38,7 +38,6 @@ import java.util.Map;
/** A class that handles model and view creation for the Entity suggestions. */
public class EntitySuggestionProcessor extends BaseSuggestionViewProcessor {
private static final String TAG = "EntitySP";
private final Context mContext;
private final SuggestionHost mSuggestionHost;
private final Map<GURL, List<PropertyModel>> mPendingImageRequests;
private final int mEntityImageSizePx;
......@@ -67,7 +66,6 @@ public class EntitySuggestionProcessor extends BaseSuggestionViewProcessor {
public EntitySuggestionProcessor(Context context, SuggestionHost suggestionHost,
Supplier<ImageFetcher> imageFetcherSupplier) {
super(context, suggestionHost);
mContext = context;
mSuggestionHost = suggestionHost;
mPendingImageRequests = new HashMap<>();
mEntityImageSizePx = context.getResources().getDimensionPixelSize(
......@@ -134,7 +132,7 @@ public class EntitySuggestionProcessor extends BaseSuggestionViewProcessor {
for (int i = 0; i < pendingModels.size(); i++) {
PropertyModel pendingModel = pendingModels.get(i);
setSuggestionDrawableState(pendingModel,
SuggestionDrawableState.Builder.forBitmap(mContext, bitmap)
SuggestionDrawableState.Builder.forBitmap(getContext(), bitmap)
.setUseRoundedCorners(true)
.setLarge(true)
.build());
......@@ -171,7 +169,7 @@ public class EntitySuggestionProcessor extends BaseSuggestionViewProcessor {
super.populateModel(suggestion, model, position);
setSuggestionDrawableState(model,
SuggestionDrawableState.Builder
.forDrawableRes(mContext, R.drawable.ic_suggestion_magnifier)
.forDrawableRes(getContext(), R.drawable.ic_suggestion_magnifier)
.setAllowTint(true)
.build());
model.set(EntitySuggestionViewProperties.DECORATION_TYPE, DECORATION_TYPE_ICON);
......
......@@ -54,6 +54,9 @@ public class HeaderProcessor implements DropdownItemProcessor {
@Override
public void recordItemPresented(PropertyModel model) {}
@Override
public void recordItemUsed(PropertyModel model) {}
@Override
public void onSuggestionsReceived() {}
......
......@@ -19,7 +19,6 @@ import org.chromium.ui.modelutil.PropertyModel;
/** A class that handles model and view creation for the tail suggestions. */
public class TailSuggestionProcessor extends BaseSuggestionViewProcessor {
private final Context mContext;
private final boolean mAlignTailSuggestions;
private AlignmentManager mAlignmentManager;
......@@ -29,7 +28,6 @@ public class TailSuggestionProcessor extends BaseSuggestionViewProcessor {
*/
public TailSuggestionProcessor(Context context, SuggestionHost suggestionHost) {
super(context, suggestionHost);
mContext = context;
mAlignTailSuggestions = DeviceFormFactor.isNonMultiDisplayContextOnTablet(context);
}
......@@ -64,7 +62,7 @@ public class TailSuggestionProcessor extends BaseSuggestionViewProcessor {
setSuggestionDrawableState(model,
SuggestionDrawableState.Builder
.forDrawableRes(mContext, R.drawable.ic_suggestion_magnifier)
.forDrawableRes(getContext(), R.drawable.ic_suggestion_magnifier)
.setAllowTint(true)
.build());
setRefineAction(model, suggestion);
......
......@@ -81,6 +81,9 @@ public class TileSuggestionProcessor implements SuggestionProcessor {
// TODO(crbug.com/1068672): Record metrics.
}
@Override
public void recordItemUsed(PropertyModel model) {}
@Override
public void onSuggestionsReceived() {}
}
......@@ -4,28 +4,29 @@
package org.chromium.chrome.browser.omnibox.suggestions.editurl;
import static org.mockito.Mockito.any;
import static org.mockito.Mockito.anyInt;
import static org.mockito.Mockito.times;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;
import android.content.ClipboardManager;
import android.content.Context;
import android.content.res.Resources;
import android.view.View;
import org.junit.Assert;
import org.mockito.Mock;
import org.mockito.MockitoAnnotations;
import org.chromium.base.ContextUtils;
import org.chromium.base.annotations.CalledByNative;
import org.chromium.base.annotations.CalledByNativeJavaTest;
import org.chromium.chrome.R;
import org.chromium.chrome.browser.ActivityTabProvider;
import org.chromium.chrome.browser.omnibox.OmniboxSuggestionType;
import org.chromium.chrome.browser.omnibox.suggestions.OmniboxSuggestion;
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.SuggestionViewDelegate;
import org.chromium.chrome.browser.omnibox.suggestions.basic.SuggestionViewProperties;
import org.chromium.chrome.browser.search_engines.TemplateUrlServiceFactory;
import org.chromium.chrome.browser.share.ShareDelegate;
import org.chromium.chrome.browser.tab.Tab;
......@@ -34,6 +35,8 @@ import org.chromium.components.search_engines.TemplateUrlService;
import org.chromium.ui.modelutil.PropertyModel;
import org.chromium.url.GURL;
import java.util.List;
/**
* Unit tests for the "edit url" omnibox suggestion.
*/
......@@ -42,6 +45,10 @@ public final class EditUrlSuggestionUnitTest {
private static final String FOOBAR_SEARCH_TERMS = "foobar";
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 mFoobarSearchUrl =
new GURL("http://www.example.com?q=" + FOOBAR_SEARCH_TERMS);
......@@ -50,12 +57,6 @@ public final class EditUrlSuggestionUnitTest {
private EditUrlSuggestionProcessor mProcessor;
private PropertyModel mModel;
@Mock
Context mContext;
@Mock
Resources mResources;
@Mock
private ActivityTabProvider mTabProvider;
......@@ -92,9 +93,6 @@ public final class EditUrlSuggestionUnitTest {
@Mock
private SuggestionHost mSuggestionHost;
@Mock
private SuggestionViewDelegate mDelegate;
@CalledByNative
private EditUrlSuggestionUnitTest() {}
......@@ -104,7 +102,6 @@ public final class EditUrlSuggestionUnitTest {
TemplateUrlServiceFactory.setInstanceForTesting(mTemplateUrlService);
when(mContext.getResources()).thenReturn(mResources);
when(mTab.getUrl()).thenReturn(mTestUrl);
when(mTab.getTitle()).thenReturn(TEST_TITLE);
when(mTab.isNativePage()).thenReturn(false);
......@@ -122,16 +119,13 @@ public final class EditUrlSuggestionUnitTest {
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.setShareDelegateSupplier(() -> mShareDelegate);
when(mEditButton.getId()).thenReturn(R.id.url_edit_icon);
}
/** Test that the suggestion is triggered. */
......@@ -145,10 +139,11 @@ public final class EditUrlSuggestionUnitTest {
mProcessor.populateModel(mWhatYouTypedSuggestion, mModel, 0);
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",
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. */
......@@ -168,21 +163,42 @@ public final class EditUrlSuggestionUnitTest {
mProcessor.doesProcessSuggestion(mWhatYouTypedSuggestion);
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());
}
/** 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
public void testPressSuggestion() {
public void testShareButtonPress() {
mProcessor.onUrlFocusChange(true);
mProcessor.doesProcessSuggestion(mWhatYouTypedSuggestion);
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
......
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