Commit 3389e04a authored by Clemens Arbesser's avatar Clemens Arbesser Committed by Commit Bot

[Autofill Assistant] Added initial UI tests for details.

Also, a small refactoring to allow code reuse between infobox-tests and details-tests.

Bug: b/133725664
Change-Id: Ia241cb3bfdae69533a12f1c88fe466deefabef61
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/1658021
Commit-Queue: Clemens Arbesser <arbesser@google.com>
Reviewed-by: default avatarJordan Demeulenaere <jdemeulenaere@chromium.org>
Cr-Commit-Position: refs/heads/master@{#670030}
parent dcf9662d
......@@ -155,9 +155,11 @@ android_library("test_java") {
java_files = [
"javatests/src/org/chromium/chrome/browser/autofill_assistant/AutofillAssistantActionsCarouselUiTest.java",
"javatests/src/org/chromium/chrome/browser/autofill_assistant/AutofillAssistantDetailsUiTest.java",
"javatests/src/org/chromium/chrome/browser/autofill_assistant/AutofillAssistantInfoBoxUiTest.java",
"javatests/src/org/chromium/chrome/browser/autofill_assistant/AutofillAssistantPaymentRequestTestHelper.java",
"javatests/src/org/chromium/chrome/browser/autofill_assistant/AutofillAssistantPaymentRequestUiTest.java",
"javatests/src/org/chromium/chrome/browser/autofill_assistant/AutofillAssistantUiTestUtil.java",
"javatests/src/org/chromium/chrome/browser/autofill_assistant/AutofillAssistantUiTest.java",
"javatests/src/org/chromium/chrome/browser/autofill_assistant/EditDistanceTest.java",
]
......
......@@ -5,8 +5,6 @@
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="@drawable/autofill_assistant_shadow_bg"
......
......@@ -5,13 +5,20 @@
package org.chromium.chrome.browser.autofill_assistant.details;
import android.content.Context;
import android.os.Build;
import android.view.LayoutInflater;
import android.view.View;
import org.chromium.base.VisibleForTesting;
import org.chromium.chrome.autofill_assistant.R;
import org.chromium.chrome.browser.autofill_assistant.details.AssistantDetailsViewBinder.ViewHolder;
import org.chromium.chrome.browser.image_fetcher.ImageFetcher;
import org.chromium.chrome.browser.image_fetcher.ImageFetcherConfig;
import org.chromium.chrome.browser.image_fetcher.ImageFetcherFactory;
import org.chromium.ui.modelutil.PropertyModelChangeProcessor;
import java.util.Locale;
/**
* Coordinator responsible for showing details.
*/
......@@ -20,11 +27,22 @@ public class AssistantDetailsCoordinator {
private final AssistantDetailsModel mModel;
public AssistantDetailsCoordinator(Context context, AssistantDetailsModel model) {
this(context,
Build.VERSION.SDK_INT >= Build.VERSION_CODES.N
? context.getResources().getConfiguration().getLocales().get(0)
: context.getResources().getConfiguration().locale,
model, ImageFetcherFactory.createImageFetcher(ImageFetcherConfig.DISK_CACHE_ONLY));
}
@VisibleForTesting
public AssistantDetailsCoordinator(Context context, Locale locale, AssistantDetailsModel model,
ImageFetcher imageFetcher) {
mView = LayoutInflater.from(context).inflate(
R.layout.autofill_assistant_details, /* root= */ null);
mModel = model;
ViewHolder viewHolder = new ViewHolder(context, mView);
AssistantDetailsViewBinder viewBinder = new AssistantDetailsViewBinder(context);
AssistantDetailsViewBinder viewBinder =
new AssistantDetailsViewBinder(context, locale, imageFetcher);
PropertyModelChangeProcessor.create(model, viewHolder, viewBinder);
// Details view is initially hidden.
......
......@@ -16,7 +16,6 @@ import android.graphics.Typeface;
import android.graphics.drawable.Drawable;
import android.graphics.drawable.GradientDrawable;
import android.media.ThumbnailUtils;
import android.os.Build;
import android.support.annotation.StyleRes;
import android.support.v4.graphics.drawable.RoundedBitmapDrawable;
import android.support.v4.graphics.drawable.RoundedBitmapDrawableFactory;
......@@ -31,8 +30,6 @@ import org.chromium.chrome.autofill_assistant.R;
import org.chromium.chrome.browser.compositor.animation.CompositorAnimator;
import org.chromium.chrome.browser.customtabs.CustomTabActivity;
import org.chromium.chrome.browser.image_fetcher.ImageFetcher;
import org.chromium.chrome.browser.image_fetcher.ImageFetcherConfig;
import org.chromium.chrome.browser.image_fetcher.ImageFetcherFactory;
import org.chromium.chrome.browser.modaldialog.AppModalPresenter;
import org.chromium.ui.modaldialog.DialogDismissalCause;
import org.chromium.ui.modaldialog.ModalDialogManager;
......@@ -77,7 +74,7 @@ class AssistantDetailsViewBinder
final TextView mTotalPriceLabelView;
final TextView mTotalPriceView;
public ViewHolder(Context context, View detailsView) {
ViewHolder(Context context, View detailsView) {
mDefaultImage = (GradientDrawable) context.getResources().getDrawable(
R.drawable.autofill_assistant_default_details);
mImageView = detailsView.findViewById(R.id.details_image);
......@@ -93,6 +90,7 @@ class AssistantDetailsViewBinder
}
private final Context mContext;
private final Locale mLocale;
private final int mImageWidth;
private final int mImageHeight;
......@@ -102,15 +100,16 @@ class AssistantDetailsViewBinder
private ValueAnimator mPulseAnimation;
private ImageFetcher mImageFetcher;
AssistantDetailsViewBinder(Context context) {
AssistantDetailsViewBinder(Context context, Locale locale, ImageFetcher imageFetcher) {
mContext = context;
mLocale = locale;
mImageWidth = context.getResources().getDimensionPixelSize(
R.dimen.autofill_assistant_details_image_size);
mImageHeight = context.getResources().getDimensionPixelSize(
R.dimen.autofill_assistant_details_image_size);
mPulseAnimationStartColor = context.getResources().getColor(R.color.modern_grey_300);
mPulseAnimationEndColor = context.getResources().getColor(R.color.modern_grey_200);
mImageFetcher = ImageFetcherFactory.createImageFetcher(ImageFetcherConfig.DISK_CACHE_ONLY);
mImageFetcher = imageFetcher;
}
/**
......@@ -224,22 +223,16 @@ class AssistantDetailsViewBinder
return TextUtils.join(" • ", parts);
}
private Locale getLocale() {
return Build.VERSION.SDK_INT >= Build.VERSION_CODES.N
? mContext.getResources().getConfiguration().getLocales().get(0)
: mContext.getResources().getConfiguration().locale;
}
private String formatDetailsTime(Date date) {
DateFormat df = DateFormat.getTimeInstance(DateFormat.SHORT, Locale.getDefault());
DateFormat df = DateFormat.getTimeInstance(DateFormat.SHORT, mLocale);
String timeFormatPattern = (df instanceof SimpleDateFormat)
? ((SimpleDateFormat) df).toPattern()
: DETAILS_TIME_FORMAT;
return new SimpleDateFormat(timeFormatPattern, getLocale()).format(date);
return new SimpleDateFormat(timeFormatPattern, mLocale).format(date);
}
private String formatDetailsDate(Date date) {
return new SimpleDateFormat(DETAILS_DATE_FORMAT, getLocale()).format(date);
return new SimpleDateFormat(DETAILS_DATE_FORMAT, mLocale).format(date);
}
private void hideIfEmpty(TextView view) {
......
......@@ -4,6 +4,12 @@
package org.chromium.chrome.browser.autofill_assistant;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertNull;
import static org.junit.Assert.assertTrue;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.support.design.widget.CoordinatorLayout;
......@@ -13,13 +19,11 @@ import android.view.Gravity;
import android.view.ViewGroup;
import android.widget.TextView;
import org.junit.Assert;
import org.junit.Before;
import org.junit.Rule;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.chromium.base.Callback;
import org.chromium.base.ThreadUtils;
import org.chromium.base.test.util.CommandLineFlags;
import org.chromium.chrome.autofill_assistant.R;
......@@ -30,42 +34,15 @@ import org.chromium.chrome.browser.autofill_assistant.infobox.AssistantInfoBoxMo
import org.chromium.chrome.browser.customtabs.CustomTabActivity;
import org.chromium.chrome.browser.customtabs.CustomTabActivityTestRule;
import org.chromium.chrome.browser.customtabs.CustomTabsTestUtils;
import org.chromium.chrome.browser.image_fetcher.ImageFetcher;
import org.chromium.chrome.browser.image_fetcher.ImageFetcherConfig;
import org.chromium.chrome.test.ChromeJUnit4ClassRunner;
import org.chromium.content_public.browser.test.util.TestThreadUtils;
import jp.tomorrowkey.android.gifplayer.BaseGifImage;
/**
* Tests for the Autofill Assistant infobox.
*/
@RunWith(ChromeJUnit4ClassRunner.class)
@CommandLineFlags.Add({ChromeSwitches.DISABLE_FIRST_RUN_EXPERIENCE})
public class AutofillAssistantInfoBoxUiTest {
private class MockImageFetcher extends ImageFetcher {
@Override
public void fetchGif(String url, String clientName, Callback<BaseGifImage> callback) {}
@Override
public void fetchImage(
String url, String clientName, int width, int height, Callback<Bitmap> callback) {
callback.onResult(BitmapFactory.decodeResource(
getActivity().getResources(), R.drawable.btn_close));
}
@Override
public void clear() {}
@Override
public @ImageFetcherConfig int getConfig() {
return ImageFetcherConfig.IN_MEMORY_ONLY;
}
@Override
public void destroy() {}
}
@Rule
public CustomTabActivityTestRule mCustomTabActivityTestRule = new CustomTabActivityTestRule();
......@@ -87,8 +64,13 @@ public class AutofillAssistantInfoBoxUiTest {
/** Creates a coordinator for use in UI tests, and adds it to the global view hierarchy. */
private AssistantInfoBoxCoordinator createCoordinator(AssistantInfoBoxModel model) {
ThreadUtils.assertOnUiThread();
AssistantInfoBoxCoordinator coordinator = new AssistantInfoBoxCoordinator(
InstrumentationRegistry.getTargetContext(), model, new MockImageFetcher());
Bitmap testImage =
BitmapFactory.decodeResource(getActivity().getResources(), R.drawable.btn_close);
AssistantInfoBoxCoordinator coordinator =
new AssistantInfoBoxCoordinator(InstrumentationRegistry.getTargetContext(), model,
new AutofillAssistantUiTestUtil.MockImageFetcher(testImage, null));
CoordinatorLayout.LayoutParams lp = new CoordinatorLayout.LayoutParams(
ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT);
......@@ -108,8 +90,8 @@ public class AutofillAssistantInfoBoxUiTest {
AssistantInfoBoxModel model = new AssistantInfoBoxModel();
AssistantInfoBoxCoordinator coordinator = createCoordinator(model);
Assert.assertNull(model.get(AssistantInfoBoxModel.INFO_BOX));
Assert.assertFalse(coordinator.getView().isShown());
assertNull(model.get(AssistantInfoBoxModel.INFO_BOX));
assertFalse(coordinator.getView().isShown());
});
}
......@@ -124,11 +106,10 @@ public class AutofillAssistantInfoBoxUiTest {
AssistantInfoBox infoBox = new AssistantInfoBox("", "Message");
model.set(AssistantInfoBoxModel.INFO_BOX, infoBox);
Assert.assertTrue(getExplanationView(coordinator).isShown());
Assert.assertNull("Image should not be set",
assertTrue(getExplanationView(coordinator).isShown());
assertNull("Image should not be set",
getExplanationView(coordinator).getCompoundDrawables()[1]);
Assert.assertEquals(
infoBox.getExplanation(), getExplanationView(coordinator).getText());
assertEquals(infoBox.getExplanation(), getExplanationView(coordinator).getText());
});
}
......@@ -143,11 +124,10 @@ public class AutofillAssistantInfoBoxUiTest {
AssistantInfoBox infoBox = new AssistantInfoBox("x", "Message");
model.set(AssistantInfoBoxModel.INFO_BOX, infoBox);
Assert.assertTrue(getExplanationView(coordinator).isShown());
Assert.assertNotNull("Image should be set",
assertTrue(getExplanationView(coordinator).isShown());
assertNotNull("Image should be set",
getExplanationView(coordinator).getCompoundDrawables()[1]);
Assert.assertEquals(
infoBox.getExplanation(), getExplanationView(coordinator).getText());
assertEquals(infoBox.getExplanation(), getExplanationView(coordinator).getText());
});
}
......@@ -160,10 +140,10 @@ public class AutofillAssistantInfoBoxUiTest {
AssistantInfoBox infoBox = new AssistantInfoBox("", "");
model.set(AssistantInfoBoxModel.INFO_BOX, infoBox);
Assert.assertTrue(coordinator.getView().isShown());
assertTrue(coordinator.getView().isShown());
model.set(AssistantInfoBoxModel.INFO_BOX, null);
Assert.assertFalse(coordinator.getView().isShown());
assertFalse(coordinator.getView().isShown());
});
}
}
// Copyright 2019 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.autofill_assistant;
import android.graphics.Bitmap;
import android.support.annotation.Nullable;
import android.view.View;
import android.widget.TextView;
import org.hamcrest.Description;
import org.hamcrest.TypeSafeMatcher;
import org.chromium.base.Callback;
import org.chromium.chrome.browser.image_fetcher.ImageFetcher;
import org.chromium.chrome.browser.image_fetcher.ImageFetcherConfig;
import jp.tomorrowkey.android.gifplayer.BaseGifImage;
/**
* Contains utilities for testing Autofill Assistant.
*/
class AutofillAssistantUiTestUtil {
/** Image fetcher which synchronously returns a preset image. */
static class MockImageFetcher extends ImageFetcher {
private final Bitmap mBitmapToFetch;
private final BaseGifImage mGifToFetch;
MockImageFetcher(@Nullable Bitmap bitmapToFetch, @Nullable BaseGifImage gifToFetch) {
mBitmapToFetch = bitmapToFetch;
mGifToFetch = gifToFetch;
}
@Override
public void fetchGif(String url, String clientName, Callback<BaseGifImage> callback) {
callback.onResult(mGifToFetch);
}
@Override
public void fetchImage(
String url, String clientName, int width, int height, Callback<Bitmap> callback) {
callback.onResult(mBitmapToFetch);
}
@Override
public void clear() {}
@Override
public @ImageFetcherConfig int getConfig() {
return ImageFetcherConfig.IN_MEMORY_ONLY;
}
@Override
public void destroy() {}
}
/** Checks that a text view has a specific maximum number of lines to display. */
public static TypeSafeMatcher<View> isTextMaxLines(int maxLines) {
return new TypeSafeMatcher<View>() {
@Override
protected boolean matchesSafely(View item) {
return ((TextView) item).getMaxLines() == maxLines;
}
@Override
public void describeTo(Description description) {
description.appendText("isTextMaxLines");
}
};
}
}
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