Commit 187d7225 authored by Friedrich Horschig's avatar Friedrich Horschig Committed by Commit Bot

[TouchToFill][Android] Make header scrollable

This CL makes the header (title, subtitle, illustration) part of the
recyclerview that previously only displayed credentials.

This makes the entire sheet contents (apart from the handlebar)
scrollable.

Bug: 1012219
Change-Id: I81d5191cf007f4d6516a4700f983b81b17434c02
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/1859654
Commit-Queue: Friedrich [CET] <fhorschig@chromium.org>
Reviewed-by: default avatarBoris Sazonov <bsazonov@chromium.org>
Cr-Commit-Position: refs/heads/master@{#706428}
parent d1c80a64
<?xml version="1.0" encoding="utf-8"?>
<!-- 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. -->
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_height="wrap_content"
android:layout_width="match_parent"
android:layout_marginBottom="16dp"
android:orientation="vertical"
android:paddingStart="16dp"
android:paddingEnd="16dp">
<ImageView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_horizontal"
android:importantForAccessibility="no"
app:srcCompat="@drawable/touch_to_fill_header_image" />
<org.chromium.ui.widget.TextViewWithLeading
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_horizontal"
android:text="@string/touch_to_fill_sheet_title"
android:textAppearance="@style/TextAppearance.BlackHeadline" />
<org.chromium.ui.widget.TextViewWithLeading
android:id="@+id/touch_to_fill_sheet_subtitle"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_horizontal"
android:textAppearance="@style/TextAppearance.BlackHint1" />
</LinearLayout>
...@@ -7,7 +7,7 @@ ...@@ -7,7 +7,7 @@
xmlns:android="http://schemas.android.com/apk/res/android" xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools" xmlns:tools="http://schemas.android.com/tools"
android:layout_height="match_parent" android:layout_height="wrap_content"
android:layout_width="match_parent" android:layout_width="match_parent"
android:orientation="vertical" android:orientation="vertical"
android:paddingStart="16dp" android:paddingStart="16dp"
...@@ -23,27 +23,6 @@ ...@@ -23,27 +23,6 @@
android:importantForAccessibility="no" android:importantForAccessibility="no"
app:srcCompat="@drawable/drag_handlebar" /> app:srcCompat="@drawable/drag_handlebar" />
<ImageView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_horizontal"
android:importantForAccessibility="no"
app:srcCompat="@drawable/touch_to_fill_header_image" />
<org.chromium.ui.widget.TextViewWithLeading
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_horizontal"
android:text="@string/touch_to_fill_sheet_title"
android:textAppearance="@style/TextAppearance.BlackHeadline" />
<org.chromium.ui.widget.TextViewWithLeading
android:id="@+id/touch_to_fill_sheet_subtitle"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_horizontal"
android:textAppearance="@style/TextAppearance.BlackHint1" />
<android.support.v7.widget.RecyclerView <android.support.v7.widget.RecyclerView
android:id="@+id/sheet_item_list" android:id="@+id/sheet_item_list"
android:layout_width="match_parent" android:layout_width="match_parent"
......
...@@ -8,14 +8,15 @@ import static org.chromium.chrome.browser.touch_to_fill.TouchToFillProperties.Cr ...@@ -8,14 +8,15 @@ import static org.chromium.chrome.browser.touch_to_fill.TouchToFillProperties.Cr
import static org.chromium.chrome.browser.touch_to_fill.TouchToFillProperties.CredentialProperties.FAVICON; import static org.chromium.chrome.browser.touch_to_fill.TouchToFillProperties.CredentialProperties.FAVICON;
import static org.chromium.chrome.browser.touch_to_fill.TouchToFillProperties.CredentialProperties.FORMATTED_ORIGIN; import static org.chromium.chrome.browser.touch_to_fill.TouchToFillProperties.CredentialProperties.FORMATTED_ORIGIN;
import static org.chromium.chrome.browser.touch_to_fill.TouchToFillProperties.CredentialProperties.ON_CLICK_LISTENER; import static org.chromium.chrome.browser.touch_to_fill.TouchToFillProperties.CredentialProperties.ON_CLICK_LISTENER;
import static org.chromium.chrome.browser.touch_to_fill.TouchToFillProperties.FORMATTED_URL; import static org.chromium.chrome.browser.touch_to_fill.TouchToFillProperties.HeaderProperties.FORMATTED_URL;
import static org.chromium.chrome.browser.touch_to_fill.TouchToFillProperties.ORIGIN_SECURE; import static org.chromium.chrome.browser.touch_to_fill.TouchToFillProperties.HeaderProperties.ORIGIN_SECURE;
import static org.chromium.chrome.browser.touch_to_fill.TouchToFillProperties.SHEET_ITEMS; import static org.chromium.chrome.browser.touch_to_fill.TouchToFillProperties.SHEET_ITEMS;
import static org.chromium.chrome.browser.touch_to_fill.TouchToFillProperties.VISIBLE; import static org.chromium.chrome.browser.touch_to_fill.TouchToFillProperties.VISIBLE;
import androidx.annotation.Px; import androidx.annotation.Px;
import org.chromium.chrome.browser.touch_to_fill.TouchToFillProperties.CredentialProperties; import org.chromium.chrome.browser.touch_to_fill.TouchToFillProperties.CredentialProperties;
import org.chromium.chrome.browser.touch_to_fill.TouchToFillProperties.HeaderProperties;
import org.chromium.chrome.browser.touch_to_fill.data.Credential; import org.chromium.chrome.browser.touch_to_fill.data.Credential;
import org.chromium.components.url_formatter.UrlFormatter; import org.chromium.components.url_formatter.UrlFormatter;
import org.chromium.ui.modelutil.ListModel; import org.chromium.ui.modelutil.ListModel;
...@@ -44,12 +45,17 @@ class TouchToFillMediator implements TouchToFillProperties.ViewEventListener { ...@@ -44,12 +45,17 @@ class TouchToFillMediator implements TouchToFillProperties.ViewEventListener {
void showCredentials( void showCredentials(
String formattedUrl, boolean isOriginSecure, List<Credential> credentials) { String formattedUrl, boolean isOriginSecure, List<Credential> credentials) {
assert credentials != null; assert credentials != null;
mModel.set(FORMATTED_URL, formattedUrl);
mModel.set(ORIGIN_SECURE, isOriginSecure);
mModel.set(VISIBLE, true); mModel.set(VISIBLE, true);
ListModel<ListItem> sheetItems = mModel.get(SHEET_ITEMS); ListModel<ListItem> sheetItems = mModel.get(SHEET_ITEMS);
sheetItems.clear(); sheetItems.clear();
sheetItems.add(new ListItem(TouchToFillProperties.ItemType.HEADER,
new PropertyModel.Builder(HeaderProperties.ALL_KEYS)
.with(FORMATTED_URL, formattedUrl)
.with(ORIGIN_SECURE, isOriginSecure)
.build()));
for (Credential credential : credentials) { for (Credential credential : credentials) {
PropertyModel propertyModel = PropertyModel propertyModel =
new PropertyModel.Builder(CredentialProperties.ALL_KEYS) new PropertyModel.Builder(CredentialProperties.ALL_KEYS)
......
...@@ -24,10 +24,6 @@ import java.lang.annotation.RetentionPolicy; ...@@ -24,10 +24,6 @@ import java.lang.annotation.RetentionPolicy;
class TouchToFillProperties { class TouchToFillProperties {
static final PropertyModel.WritableBooleanPropertyKey VISIBLE = static final PropertyModel.WritableBooleanPropertyKey VISIBLE =
new PropertyModel.WritableBooleanPropertyKey("visible"); new PropertyModel.WritableBooleanPropertyKey("visible");
static final PropertyModel.WritableObjectPropertyKey<String> FORMATTED_URL =
new PropertyModel.WritableObjectPropertyKey<>("formatted_url");
static final PropertyModel.WritableBooleanPropertyKey ORIGIN_SECURE =
new PropertyModel.WritableBooleanPropertyKey("origin_secure");
static final PropertyModel static final PropertyModel
.ReadableObjectPropertyKey<ListModel<MVCListAdapter.ListItem>> SHEET_ITEMS = .ReadableObjectPropertyKey<ListModel<MVCListAdapter.ListItem>> SHEET_ITEMS =
new PropertyModel.ReadableObjectPropertyKey<>("sheet_items"); new PropertyModel.ReadableObjectPropertyKey<>("sheet_items");
...@@ -35,10 +31,8 @@ class TouchToFillProperties { ...@@ -35,10 +31,8 @@ class TouchToFillProperties {
new PropertyModel.ReadableObjectPropertyKey<>("view_event_listener"); new PropertyModel.ReadableObjectPropertyKey<>("view_event_listener");
static PropertyModel createDefaultModel(ViewEventListener listener) { static PropertyModel createDefaultModel(ViewEventListener listener) {
return new PropertyModel return new PropertyModel.Builder(VISIBLE, SHEET_ITEMS, VIEW_EVENT_LISTENER)
.Builder(VISIBLE, FORMATTED_URL, ORIGIN_SECURE, SHEET_ITEMS, VIEW_EVENT_LISTENER)
.with(VISIBLE, false) .with(VISIBLE, false)
.with(ORIGIN_SECURE, false)
.with(SHEET_ITEMS, new ListModel<>()) .with(SHEET_ITEMS, new ListModel<>())
.with(VIEW_EVENT_LISTENER, listener) .with(VIEW_EVENT_LISTENER, listener)
.build(); .build();
...@@ -64,6 +58,20 @@ class TouchToFillProperties { ...@@ -64,6 +58,20 @@ class TouchToFillProperties {
private CredentialProperties() {} private CredentialProperties() {}
} }
/**
* Properties defined here reflect the visible state of the header in the TouchToFill sheet.
*/
static class HeaderProperties {
static final PropertyModel.ReadableObjectPropertyKey<String> FORMATTED_URL =
new PropertyModel.ReadableObjectPropertyKey<>("formatted_url");
static final PropertyModel.ReadableBooleanPropertyKey ORIGIN_SECURE =
new PropertyModel.ReadableBooleanPropertyKey("origin_secure");
static final PropertyKey[] ALL_KEYS = {FORMATTED_URL, ORIGIN_SECURE};
private HeaderProperties() {}
}
/** /**
* This interface is used by the view to communicate events back to the mediator. It abstracts * This interface is used by the view to communicate events back to the mediator. It abstracts
* from the view by stripping information like parents, id or context. * from the view by stripping information like parents, id or context.
......
...@@ -11,7 +11,6 @@ import android.support.v7.widget.RecyclerView; ...@@ -11,7 +11,6 @@ import android.support.v7.widget.RecyclerView;
import android.view.LayoutInflater; import android.view.LayoutInflater;
import android.view.View; import android.view.View;
import android.widget.LinearLayout; import android.widget.LinearLayout;
import android.widget.TextView;
import org.chromium.chrome.browser.widget.bottomsheet.BottomSheet; import org.chromium.chrome.browser.widget.bottomsheet.BottomSheet;
import org.chromium.chrome.browser.widget.bottomsheet.BottomSheetController; import org.chromium.chrome.browser.widget.bottomsheet.BottomSheetController;
...@@ -77,26 +76,6 @@ class TouchToFillView implements BottomSheet.BottomSheetContent { ...@@ -77,26 +76,6 @@ class TouchToFillView implements BottomSheet.BottomSheetContent {
} }
} }
/**
* Renders the given secure url into the subtitle.
* @param formattedUrl A {@link String} containing a URL already formatted to display.
*/
void setSecureSubtitle(String formattedUrl) {
TextView sheetSubtitleText = mContentView.findViewById(R.id.touch_to_fill_sheet_subtitle);
sheetSubtitleText.setText(formattedUrl);
}
/**
* Renders the given non-secure url into the subtitle.
* @param formattedUrl A {@link String} containing a URL already formatted to display.
*/
void setNonSecureSubtitle(String formattedUrl) {
TextView sheetSubtitleText = mContentView.findViewById(R.id.touch_to_fill_sheet_subtitle);
String subtitleText = String.format(
mContext.getString(R.string.touch_to_fill_sheet_subtitle_not_secure), formattedUrl);
sheetSubtitleText.setText(subtitleText);
}
void setSheetItemListAdapter(RecyclerView.Adapter adapter) { void setSheetItemListAdapter(RecyclerView.Adapter adapter) {
mSheetItemListView.setAdapter(adapter); mSheetItemListView.setAdapter(adapter);
} }
......
...@@ -8,8 +8,8 @@ import static org.chromium.chrome.browser.touch_to_fill.TouchToFillProperties.Cr ...@@ -8,8 +8,8 @@ import static org.chromium.chrome.browser.touch_to_fill.TouchToFillProperties.Cr
import static org.chromium.chrome.browser.touch_to_fill.TouchToFillProperties.CredentialProperties.FAVICON; import static org.chromium.chrome.browser.touch_to_fill.TouchToFillProperties.CredentialProperties.FAVICON;
import static org.chromium.chrome.browser.touch_to_fill.TouchToFillProperties.CredentialProperties.FORMATTED_ORIGIN; import static org.chromium.chrome.browser.touch_to_fill.TouchToFillProperties.CredentialProperties.FORMATTED_ORIGIN;
import static org.chromium.chrome.browser.touch_to_fill.TouchToFillProperties.CredentialProperties.ON_CLICK_LISTENER; import static org.chromium.chrome.browser.touch_to_fill.TouchToFillProperties.CredentialProperties.ON_CLICK_LISTENER;
import static org.chromium.chrome.browser.touch_to_fill.TouchToFillProperties.FORMATTED_URL; import static org.chromium.chrome.browser.touch_to_fill.TouchToFillProperties.HeaderProperties.FORMATTED_URL;
import static org.chromium.chrome.browser.touch_to_fill.TouchToFillProperties.ORIGIN_SECURE; import static org.chromium.chrome.browser.touch_to_fill.TouchToFillProperties.HeaderProperties.ORIGIN_SECURE;
import static org.chromium.chrome.browser.touch_to_fill.TouchToFillProperties.SHEET_ITEMS; import static org.chromium.chrome.browser.touch_to_fill.TouchToFillProperties.SHEET_ITEMS;
import static org.chromium.chrome.browser.touch_to_fill.TouchToFillProperties.VIEW_EVENT_LISTENER; import static org.chromium.chrome.browser.touch_to_fill.TouchToFillProperties.VIEW_EVENT_LISTENER;
import static org.chromium.chrome.browser.touch_to_fill.TouchToFillProperties.VISIBLE; import static org.chromium.chrome.browser.touch_to_fill.TouchToFillProperties.VISIBLE;
...@@ -46,12 +46,6 @@ class TouchToFillViewBinder { ...@@ -46,12 +46,6 @@ class TouchToFillViewBinder {
view.setEventListener(model.get(VIEW_EVENT_LISTENER)); view.setEventListener(model.get(VIEW_EVENT_LISTENER));
} else if (propertyKey == VISIBLE) { } else if (propertyKey == VISIBLE) {
view.setVisible(model.get(VISIBLE)); view.setVisible(model.get(VISIBLE));
} else if (propertyKey == FORMATTED_URL || propertyKey == ORIGIN_SECURE) {
if (model.get(ORIGIN_SECURE)) {
view.setSecureSubtitle(model.get(FORMATTED_URL));
} else {
view.setNonSecureSubtitle(model.get(FORMATTED_URL));
}
} else if (propertyKey == SHEET_ITEMS) { } else if (propertyKey == SHEET_ITEMS) {
view.setSheetItemListAdapter( view.setSheetItemListAdapter(
new RecyclerViewAdapter<>(new SimpleRecyclerViewMcp<>(model.get(SHEET_ITEMS), new RecyclerViewAdapter<>(new SimpleRecyclerViewMcp<>(model.get(SHEET_ITEMS),
...@@ -72,7 +66,8 @@ class TouchToFillViewBinder { ...@@ -72,7 +66,8 @@ class TouchToFillViewBinder {
ViewGroup parent, @ItemType int itemType) { ViewGroup parent, @ItemType int itemType) {
switch (itemType) { switch (itemType) {
case ItemType.HEADER: case ItemType.HEADER:
return null; return new TouchToFillViewHolder(parent, R.layout.touch_to_fill_header_item,
TouchToFillViewBinder::bindHeaderView);
case ItemType.CREDENTIAL: case ItemType.CREDENTIAL:
return new TouchToFillViewHolder(parent, R.layout.touch_to_fill_credential_item, return new TouchToFillViewHolder(parent, R.layout.touch_to_fill_credential_item,
TouchToFillViewBinder::bindCredentialView); TouchToFillViewBinder::bindCredentialView);
...@@ -133,5 +128,27 @@ class TouchToFillViewBinder { ...@@ -133,5 +128,27 @@ class TouchToFillViewBinder {
} }
} }
/**
* Called whenever a property in the given model changes. It updates the given view accordingly.
* @param model The observed {@link PropertyModel}. Its data need to be reflected in the view.
* @param viewGroup The {@link ViewGroup} containing the header to update.
* @param key The {@link PropertyKey} which changed.
*/
private static void bindHeaderView(PropertyModel model, ViewGroup viewGroup, PropertyKey key) {
if (key == FORMATTED_URL || key == ORIGIN_SECURE) {
TextView sheetSubtitleText = viewGroup.findViewById(R.id.touch_to_fill_sheet_subtitle);
if (model.get(ORIGIN_SECURE)) {
sheetSubtitleText.setText(model.get(FORMATTED_URL));
} else {
sheetSubtitleText.setText(
String.format(viewGroup.getContext().getString(
R.string.touch_to_fill_sheet_subtitle_not_secure),
model.get(FORMATTED_URL)));
}
} else {
assert false : "Unhandled update to property:" + key;
}
}
private TouchToFillViewBinder() {} private TouchToFillViewBinder() {}
} }
...@@ -15,8 +15,8 @@ import static org.mockito.Mockito.verify; ...@@ -15,8 +15,8 @@ import static org.mockito.Mockito.verify;
import static org.chromium.chrome.browser.touch_to_fill.TouchToFillProperties.CredentialProperties.CREDENTIAL; import static org.chromium.chrome.browser.touch_to_fill.TouchToFillProperties.CredentialProperties.CREDENTIAL;
import static org.chromium.chrome.browser.touch_to_fill.TouchToFillProperties.CredentialProperties.FORMATTED_ORIGIN; import static org.chromium.chrome.browser.touch_to_fill.TouchToFillProperties.CredentialProperties.FORMATTED_ORIGIN;
import static org.chromium.chrome.browser.touch_to_fill.TouchToFillProperties.CredentialProperties.ON_CLICK_LISTENER; import static org.chromium.chrome.browser.touch_to_fill.TouchToFillProperties.CredentialProperties.ON_CLICK_LISTENER;
import static org.chromium.chrome.browser.touch_to_fill.TouchToFillProperties.FORMATTED_URL; import static org.chromium.chrome.browser.touch_to_fill.TouchToFillProperties.HeaderProperties.FORMATTED_URL;
import static org.chromium.chrome.browser.touch_to_fill.TouchToFillProperties.ORIGIN_SECURE; import static org.chromium.chrome.browser.touch_to_fill.TouchToFillProperties.HeaderProperties.ORIGIN_SECURE;
import static org.chromium.chrome.browser.touch_to_fill.TouchToFillProperties.SHEET_ITEMS; import static org.chromium.chrome.browser.touch_to_fill.TouchToFillProperties.SHEET_ITEMS;
import static org.chromium.chrome.browser.touch_to_fill.TouchToFillProperties.VISIBLE; import static org.chromium.chrome.browser.touch_to_fill.TouchToFillProperties.VISIBLE;
import static org.chromium.content_public.browser.test.util.CriteriaHelper.pollUiThread; import static org.chromium.content_public.browser.test.util.CriteriaHelper.pollUiThread;
...@@ -41,6 +41,7 @@ import org.chromium.base.test.util.CommandLineFlags; ...@@ -41,6 +41,7 @@ import org.chromium.base.test.util.CommandLineFlags;
import org.chromium.base.test.util.ScalableTimeout; import org.chromium.base.test.util.ScalableTimeout;
import org.chromium.chrome.browser.ChromeActivity; import org.chromium.chrome.browser.ChromeActivity;
import org.chromium.chrome.browser.ChromeSwitches; import org.chromium.chrome.browser.ChromeSwitches;
import org.chromium.chrome.browser.touch_to_fill.TouchToFillProperties.HeaderProperties;
import org.chromium.chrome.browser.touch_to_fill.data.Credential; import org.chromium.chrome.browser.touch_to_fill.data.Credential;
import org.chromium.chrome.browser.widget.bottomsheet.BottomSheet.SheetState; import org.chromium.chrome.browser.widget.bottomsheet.BottomSheet.SheetState;
import org.chromium.chrome.test.ChromeJUnit4ClassRunner; import org.chromium.chrome.test.ChromeJUnit4ClassRunner;
...@@ -104,10 +105,14 @@ public class TouchToFillViewTest { ...@@ -104,10 +105,14 @@ public class TouchToFillViewTest {
@Test @Test
@MediumTest @MediumTest
public void testSubtitleUrlChangedByModel() { public void testSecureSubtitleUrlDisplayed() {
TestThreadUtils.runOnUiThreadBlocking(() -> { TestThreadUtils.runOnUiThreadBlocking(() -> {
mModel.set(FORMATTED_URL, "www.example.org"); mModel.get(SHEET_ITEMS)
mModel.set(ORIGIN_SECURE, true); .add(new MVCListAdapter.ListItem(TouchToFillProperties.ItemType.HEADER,
new PropertyModel.Builder(HeaderProperties.ALL_KEYS)
.with(FORMATTED_URL, "www.example.org")
.with(ORIGIN_SECURE, true)
.build()));
mModel.set(VISIBLE, true); mModel.set(VISIBLE, true);
}); });
pollUiThread(() -> getBottomSheetState() == SheetState.FULL); pollUiThread(() -> getBottomSheetState() == SheetState.FULL);
...@@ -115,11 +120,23 @@ public class TouchToFillViewTest { ...@@ -115,11 +120,23 @@ public class TouchToFillViewTest {
mTouchToFillView.getContentView().findViewById(R.id.touch_to_fill_sheet_subtitle); mTouchToFillView.getContentView().findViewById(R.id.touch_to_fill_sheet_subtitle);
assertThat(subtitle.getText(), is("www.example.org")); assertThat(subtitle.getText(), is("www.example.org"));
}
@Test
@MediumTest
public void testNonSecureSubtitleUrlDisplayed() {
TestThreadUtils.runOnUiThreadBlocking(() -> { TestThreadUtils.runOnUiThreadBlocking(() -> {
mModel.set(FORMATTED_URL, "m.example.org"); mModel.get(SHEET_ITEMS)
mModel.set(ORIGIN_SECURE, false); .add(new MVCListAdapter.ListItem(TouchToFillProperties.ItemType.HEADER,
new PropertyModel.Builder(HeaderProperties.ALL_KEYS)
.with(FORMATTED_URL, "m.example.org")
.with(ORIGIN_SECURE, false)
.build()));
mModel.set(VISIBLE, true);
}); });
pollUiThread(() -> getBottomSheetState() == SheetState.FULL);
TextView subtitle =
mTouchToFillView.getContentView().findViewById(R.id.touch_to_fill_sheet_subtitle);
assertThat(subtitle.getText(), is(getFormattedNotSecureSubtitle("m.example.org"))); assertThat(subtitle.getText(), is(getFormattedNotSecureSubtitle("m.example.org")));
} }
......
...@@ -18,8 +18,8 @@ import static org.chromium.chrome.browser.touch_to_fill.TouchToFillProperties.Cr ...@@ -18,8 +18,8 @@ import static org.chromium.chrome.browser.touch_to_fill.TouchToFillProperties.Cr
import static org.chromium.chrome.browser.touch_to_fill.TouchToFillProperties.CredentialProperties.FAVICON; import static org.chromium.chrome.browser.touch_to_fill.TouchToFillProperties.CredentialProperties.FAVICON;
import static org.chromium.chrome.browser.touch_to_fill.TouchToFillProperties.CredentialProperties.FORMATTED_ORIGIN; import static org.chromium.chrome.browser.touch_to_fill.TouchToFillProperties.CredentialProperties.FORMATTED_ORIGIN;
import static org.chromium.chrome.browser.touch_to_fill.TouchToFillProperties.CredentialProperties.ON_CLICK_LISTENER; import static org.chromium.chrome.browser.touch_to_fill.TouchToFillProperties.CredentialProperties.ON_CLICK_LISTENER;
import static org.chromium.chrome.browser.touch_to_fill.TouchToFillProperties.FORMATTED_URL; import static org.chromium.chrome.browser.touch_to_fill.TouchToFillProperties.HeaderProperties.FORMATTED_URL;
import static org.chromium.chrome.browser.touch_to_fill.TouchToFillProperties.ORIGIN_SECURE; import static org.chromium.chrome.browser.touch_to_fill.TouchToFillProperties.HeaderProperties.ORIGIN_SECURE;
import static org.chromium.chrome.browser.touch_to_fill.TouchToFillProperties.SHEET_ITEMS; import static org.chromium.chrome.browser.touch_to_fill.TouchToFillProperties.SHEET_ITEMS;
import static org.chromium.chrome.browser.touch_to_fill.TouchToFillProperties.VIEW_EVENT_LISTENER; import static org.chromium.chrome.browser.touch_to_fill.TouchToFillProperties.VIEW_EVENT_LISTENER;
import static org.chromium.chrome.browser.touch_to_fill.TouchToFillProperties.VISIBLE; import static org.chromium.chrome.browser.touch_to_fill.TouchToFillProperties.VISIBLE;
...@@ -99,32 +99,31 @@ public class TouchToFillControllerTest { ...@@ -99,32 +99,31 @@ public class TouchToFillControllerTest {
assertNotNull(mModel.get(SHEET_ITEMS)); assertNotNull(mModel.get(SHEET_ITEMS));
assertNotNull(mModel.get(VIEW_EVENT_LISTENER)); assertNotNull(mModel.get(VIEW_EVENT_LISTENER));
assertThat(mModel.get(VISIBLE), is(false)); assertThat(mModel.get(VISIBLE), is(false));
assertThat(mModel.get(FORMATTED_URL), is(nullValue()));
assertThat(mModel.get(ORIGIN_SECURE), is(false));
} }
@Test @Test
public void testShowCredentialsSetsFormattedUrl() { public void testShowCredentialsCreatesHeader() {
mMediator.showCredentials(TEST_URL, true, Arrays.asList(ANA, CARL, BOB)); mMediator.showCredentials(TEST_URL, true, Arrays.asList(ANA, CARL, BOB));
assertThat(mModel.get(FORMATTED_URL), is(TEST_URL)); ListModel<MVCListAdapter.ListItem> itemList = mModel.get(SHEET_ITEMS);
assertThat(mModel.get(ORIGIN_SECURE), is(true)); assertThat(itemList.get(0).type, is(ItemType.HEADER));
assertThat(itemList.get(0).model.get(FORMATTED_URL), is(TEST_URL));
assertThat(itemList.get(0).model.get(ORIGIN_SECURE), is(true));
} }
@Test @Test
public void testShowCredentialsSetsCredentialListAndRequestsFavicons() { public void testShowCredentialsSetsCredentialListAndRequestsFavicons() {
mMediator.showCredentials(TEST_URL, true, Arrays.asList(ANA, CARL, BOB)); mMediator.showCredentials(TEST_URL, true, Arrays.asList(ANA, CARL, BOB));
ListModel<MVCListAdapter.ListItem> credentialList = mModel.get(SHEET_ITEMS); ListModel<MVCListAdapter.ListItem> itemList = mModel.get(SHEET_ITEMS);
// TODO(https://crbug.com/1013209): Simplify this after adding equals to ModelList. assertThat(itemList.size(), is(4));
assertThat(credentialList.size(), is(3)); assertThat(itemList.get(1).type, is(ItemType.CREDENTIAL));
assertThat(credentialList.get(0).type, is(ItemType.CREDENTIAL)); assertThat(itemList.get(1).model.get(CREDENTIAL), is(ANA));
assertThat(credentialList.get(0).model.get(CREDENTIAL), is(ANA)); assertThat(itemList.get(1).model.get(FAVICON), is(nullValue()));
assertThat(credentialList.get(0).model.get(FAVICON), is(nullValue())); assertThat(itemList.get(2).type, is(ItemType.CREDENTIAL));
assertThat(credentialList.get(1).type, is(TouchToFillProperties.ItemType.CREDENTIAL)); assertThat(itemList.get(2).model.get(CREDENTIAL), is(CARL));
assertThat(credentialList.get(1).model.get(CREDENTIAL), is(CARL)); assertThat(itemList.get(2).model.get(FAVICON), is(nullValue()));
assertThat(credentialList.get(1).model.get(FAVICON), is(nullValue())); assertThat(itemList.get(3).type, is(ItemType.CREDENTIAL));
assertThat(credentialList.get(2).type, is(TouchToFillProperties.ItemType.CREDENTIAL)); assertThat(itemList.get(3).model.get(CREDENTIAL), is(BOB));
assertThat(credentialList.get(2).model.get(CREDENTIAL), is(BOB)); assertThat(itemList.get(3).model.get(FAVICON), is(nullValue()));
assertThat(credentialList.get(2).model.get(FAVICON), is(nullValue()));
verify(mMockDelegate).fetchFavicon(eq("https://m.a.xyz/"), eq(DESIRED_FAVICON_SIZE), any()); verify(mMockDelegate).fetchFavicon(eq("https://m.a.xyz/"), eq(DESIRED_FAVICON_SIZE), any());
verify(mMockDelegate).fetchFavicon(eq(TEST_URL), eq(DESIRED_FAVICON_SIZE), any()); verify(mMockDelegate).fetchFavicon(eq(TEST_URL), eq(DESIRED_FAVICON_SIZE), any());
...@@ -135,12 +134,11 @@ public class TouchToFillControllerTest { ...@@ -135,12 +134,11 @@ public class TouchToFillControllerTest {
@Test @Test
public void testFetchFaviconUpdatesModel() { public void testFetchFaviconUpdatesModel() {
mMediator.showCredentials(TEST_URL, true, Collections.singletonList(CARL)); mMediator.showCredentials(TEST_URL, true, Collections.singletonList(CARL));
ListModel<MVCListAdapter.ListItem> credentialList = mModel.get(SHEET_ITEMS); ListModel<MVCListAdapter.ListItem> itemList = mModel.get(SHEET_ITEMS);
assertThat(credentialList.size(), is(1)); assertThat(itemList.size(), is(2));
// TODO(https://crbug.com/1013209): Simplify this after adding equals to ModelList. assertThat(itemList.get(1).type, is(ItemType.CREDENTIAL));
assertThat(credentialList.get(0).type, is(TouchToFillProperties.ItemType.CREDENTIAL)); assertThat(itemList.get(1).model.get(CREDENTIAL), is(CARL));
assertThat(credentialList.get(0).model.get(CREDENTIAL), is(CARL)); assertThat(itemList.get(1).model.get(FAVICON), is(nullValue()));
assertThat(credentialList.get(0).model.get(FAVICON), is(nullValue()));
// ANA and CARL both have TEST_URL as their origin URL // ANA and CARL both have TEST_URL as their origin URL
verify(mMockDelegate) verify(mMockDelegate)
...@@ -150,39 +148,37 @@ public class TouchToFillControllerTest { ...@@ -150,39 +148,37 @@ public class TouchToFillControllerTest {
Bitmap bitmap = Bitmap.createBitmap( Bitmap bitmap = Bitmap.createBitmap(
DESIRED_FAVICON_SIZE, DESIRED_FAVICON_SIZE, Bitmap.Config.ARGB_8888); DESIRED_FAVICON_SIZE, DESIRED_FAVICON_SIZE, Bitmap.Config.ARGB_8888);
callback.onResult(bitmap); callback.onResult(bitmap);
assertThat(credentialList.get(0).model.get(FAVICON), is(bitmap)); assertThat(itemList.get(1).model.get(FAVICON), is(bitmap));
} }
@Test @Test
public void testShowCredentialsFormatPslOrigins() { public void testShowCredentialsFormatPslOrigins() {
mMediator.showCredentials(TEST_URL, true, Arrays.asList(ANA, BOB)); mMediator.showCredentials(TEST_URL, true, Arrays.asList(ANA, BOB));
assertThat(mModel.get(SHEET_ITEMS).size(), is(2)); assertThat(mModel.get(SHEET_ITEMS).size(), is(3));
assertThat(mModel.get(SHEET_ITEMS).get(0).type, is(ItemType.CREDENTIAL));
assertThat(mModel.get(SHEET_ITEMS).get(0).model.get(FORMATTED_ORIGIN),
is(format(ANA.getOriginUrl())));
assertThat(mModel.get(SHEET_ITEMS).get(1).type, is(ItemType.CREDENTIAL)); assertThat(mModel.get(SHEET_ITEMS).get(1).type, is(ItemType.CREDENTIAL));
assertThat(mModel.get(SHEET_ITEMS).get(1).model.get(FORMATTED_ORIGIN), assertThat(mModel.get(SHEET_ITEMS).get(1).model.get(FORMATTED_ORIGIN),
is(format(ANA.getOriginUrl())));
assertThat(mModel.get(SHEET_ITEMS).get(2).type, is(ItemType.CREDENTIAL));
assertThat(mModel.get(SHEET_ITEMS).get(2).model.get(FORMATTED_ORIGIN),
is(format(BOB.getOriginUrl()))); is(format(BOB.getOriginUrl())));
} }
@Test @Test
public void testClearsCredentialListWhenShowingAgain() { public void testClearsCredentialListWhenShowingAgain() {
mMediator.showCredentials(TEST_URL, true, Collections.singletonList(ANA)); mMediator.showCredentials(TEST_URL, true, Collections.singletonList(ANA));
ListModel<MVCListAdapter.ListItem> credentialList = mModel.get(SHEET_ITEMS); ListModel<MVCListAdapter.ListItem> itemList = mModel.get(SHEET_ITEMS);
// TODO(https://crbug.com/1013209): Simplify this after adding equals to ModelList. assertThat(itemList.size(), is(2));
assertThat(credentialList.size(), is(1)); assertThat(itemList.get(1).type, is(ItemType.CREDENTIAL));
assertThat(credentialList.get(0).type, is(ItemType.CREDENTIAL)); assertThat(itemList.get(1).model.get(CREDENTIAL), is(ANA));
assertThat(credentialList.get(0).model.get(CREDENTIAL), is(ANA)); assertThat(itemList.get(1).model.get(FAVICON), is(nullValue()));
assertThat(credentialList.get(0).model.get(FAVICON), is(nullValue()));
// Showing the sheet a second time should replace all changed credentials. // Showing the sheet a second time should replace all changed credentials.
mMediator.showCredentials(TEST_URL, true, Collections.singletonList(BOB)); mMediator.showCredentials(TEST_URL, true, Collections.singletonList(BOB));
credentialList = mModel.get(SHEET_ITEMS); itemList = mModel.get(SHEET_ITEMS);
// TODO(https://crbug.com/1013209): Simplify this after adding equals to ModelList. assertThat(itemList.size(), is(2));
assertThat(credentialList.size(), is(1)); assertThat(itemList.get(1).type, is(ItemType.CREDENTIAL));
assertThat(credentialList.get(0).type, is(ItemType.CREDENTIAL)); assertThat(itemList.get(1).model.get(CREDENTIAL), is(BOB));
assertThat(credentialList.get(0).model.get(CREDENTIAL), is(BOB)); assertThat(itemList.get(1).model.get(FAVICON), is(nullValue()));
assertThat(credentialList.get(0).model.get(FAVICON), is(nullValue()));
} }
@Test @Test
......
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