Commit 5334ef45 authored by Friedrich Horschig's avatar Friedrich Horschig Committed by Commit Bot

[PwdCheckAndroid] Layout entry for single credential

This CL adds all UI elements that will be used to render a single
compromised credential. Button and more-icon have no function yet.

Origin, Username and compromising reason are bound to model.

IDS_PASSWORD_CHECK_CREDENTIAL_ROW_CHANGE_BUTTON_CAPTION.png and
IDS_PASSWORD_CHECK_CREDENTIAL_ROW_REASON_LEAKED.png.sha1 image:
https://storage.cloud.google.com/chromium-translation-screenshots/662ab4bd4aec81ac0ef54848efad843452a0a601

IDS_PASSWORD_CHECK_CREDENTIAL_ROW_REASON_PHISHED.png image:
https://storage.cloud.google.com/chromium-translation-screenshots/952ee79c665274f11d86424f83fa10ee1bfc3c13

Screenshot in the linked bug.

Bug: 1106277, 1092444
Change-Id: I894286c8a238f7c0018e9cf0ba09fbff969de5cc
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/2300301
Commit-Queue: Friedrich [CET] <fhorschig@chromium.org>
Reviewed-by: default avatarSamuel Huang <huangs@chromium.org>
Reviewed-by: default avatarIoana Pandele <ioanap@chromium.org>
Cr-Commit-Position: refs/heads/master@{#789429}
parent b421b013
......@@ -3,7 +3,9 @@
# found in the LICENSE file.
import("//build/config/android/rules.gni")
import("//build/config/locales.gni")
import("//chrome/android/features/android_library_factory_tmpl.gni")
import("//chrome/common/features.gni")
_factory_sources = [ "java/src/org/chromium/chrome/browser/password_check/PasswordCheckFactory.java" ]
_public_target = "//chrome/browser/password_check/android:public_java"
......@@ -88,9 +90,21 @@ source_set("internal") {
}
android_resources("java_resources") {
deps = [ ":java_strings_grd" ]
sources = [
"java/res/layout/password_check_compromised_credential_item.xml",
"java/res/layout/password_check_header_item.xml",
"java/res/values/dimens.xml",
]
custom_package = "org.chromium.chrome.browser.password_check.internal"
}
java_strings_grd("java_strings_grd") {
defines = chrome_grit_defines
grd_file = "java/strings/android_password_check_strings.grd"
outputs =
[ "values/android_password_check_strings.xml" ] +
process_file_template(
android_bundle_locales_as_resources,
[ "values-{{source_name_part}}/android_password_check_strings.xml" ])
}
......@@ -2,9 +2,62 @@
<!-- 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. -->
<TextView xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/credential_origin"
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:fillViewport="true"
android:gravity="center"
android:layout_height="wrap_content"
android:layout_width="match_parent"
android:textAppearance="@style/TextAppearance.TextMedium.Secondary" />
android:orientation="horizontal">
<!-- TODO(crbug.com/1106277): Remove the paddingStart if favicons fill that space. -->
<LinearLayout
android:gravity="start"
android:layout_gravity="top"
android:layout_height="wrap_content"
android:layout_width="0dp"
android:layout_weight="1"
android:orientation="vertical"
android:paddingStart="@dimen/compromised_credential_row_padding_start"
android:paddingBottom="@dimen/compromised_credential_row_padding_bottom"
android:paddingTop="@dimen/compromised_credential_row_padding_top">
<TextView
android:id="@+id/credential_origin"
android:layout_height="wrap_content"
android:layout_width="match_parent"
android:textAppearance="@style/TextAppearance.TextLarge.Primary" />
<TextView
android:id="@+id/compromised_username"
android:layout_height="wrap_content"
android:layout_width="match_parent"
android:textAppearance="@style/TextAppearance.TextMedium.Secondary" />
<TextView
android:id="@+id/compromised_reason"
android:layout_marginTop="@dimen/compromised_credential_row_reason_margin_top"
android:layout_height="wrap_content"
android:layout_width="match_parent"
android:textAppearance="@style/TextAppearance.TextSmall.Secondary" />
<org.chromium.ui.widget.ButtonCompat
android:id="@+id/credential_change_button"
android:layout_marginTop="@dimen/compromised_credential_row_button_margin_top"
android:layout_height="wrap_content"
android:layout_width="wrap_content"
android:text="@string/password_check_credential_row_change_button_caption"
style="@style/FilledButton.Flat" />
</LinearLayout>
<ImageView
android:id="@+id/credential_menu_button"
android:contentDescription="@string/more"
android:paddingEnd="@dimen/compromised_credential_row_more_padding_end"
android:paddingStart="@dimen/compromised_credential_row_more_padding_start"
android:layout_gravity="top"
android:layout_height="@dimen/compromised_credential_row_more_size"
android:layout_width="@dimen/compromised_credential_row_more_size"
android:src="@drawable/ic_more_vert_24dp" />
</LinearLayout>
<?xml version="1.0" encoding="utf-8"?>
<!-- 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. -->
<resources>
<dimen name="compromised_credential_row_button_margin_top">16dp</dimen>
<dimen name="compromised_credential_row_more_padding_end">8dp</dimen>
<dimen name="compromised_credential_row_more_padding_start">16dp</dimen>
<dimen name="compromised_credential_row_more_size">48dp</dimen>
<dimen name="compromised_credential_row_padding_bottom">16dp</dimen>
<dimen name="compromised_credential_row_padding_start">16dp</dimen>
<dimen name="compromised_credential_row_padding_top">12dp</dimen>
<dimen name="compromised_credential_row_reason_margin_top">2dp</dimen>
</resources>
......@@ -22,10 +22,10 @@ class PasswordCheckCoordinator implements PasswordCheckComponentUi {
PasswordCheckCoordinator(PasswordCheckFragmentView fragmentView) {
mFragmentView = fragmentView;
PropertyModel model = new PropertyModel.Builder(PasswordCheckProperties.ALL_KEYS).build();
PropertyModel model = PasswordCheckProperties.createDefaultModel();
PasswordCheckMediator mediator = new PasswordCheckMediator();
mediator.initialize(model);
PasswordCheckCoordinator.setUpModelChangeProcessors(model, mFragmentView);
mediator.initialize(model);
}
// TODO(crbug.com/1101256): Move to view code.
......
......@@ -92,6 +92,14 @@ class PasswordCheckViewBinder {
formattedOrigin =
formattedOrigin.replaceFirst("/$", ""); // Strip possibly trailing slash.
pslOriginText.setText(formattedOrigin);
TextView username = view.findViewById(R.id.compromised_username);
username.setText(credential.getUsername());
TextView reason = view.findViewById(R.id.compromised_reason);
reason.setText(credential.isPhished()
? R.string.password_check_credential_row_reason_phished
: R.string.password_check_credential_row_reason_leaked);
} else {
assert false : "Unhandled update to property:" + propertyKey;
}
......
<?xml version="1.0" ?>
<!DOCTYPE translationbundle>
<translationbundle lang="af">
</translationbundle>
\ No newline at end of file
<?xml version="1.0" ?>
<!DOCTYPE translationbundle>
<translationbundle lang="am">
</translationbundle>
\ No newline at end of file
<?xml version="1.0" ?>
<!DOCTYPE translationbundle>
<translationbundle lang="ar">
</translationbundle>
\ No newline at end of file
<?xml version="1.0" ?>
<!DOCTYPE translationbundle>
<translationbundle lang="as">
</translationbundle>
\ No newline at end of file
<?xml version="1.0" ?>
<!DOCTYPE translationbundle>
<translationbundle lang="az">
</translationbundle>
\ No newline at end of file
<?xml version="1.0" ?>
<!DOCTYPE translationbundle>
<translationbundle lang="be">
</translationbundle>
\ No newline at end of file
<?xml version="1.0" ?>
<!DOCTYPE translationbundle>
<translationbundle lang="bg">
</translationbundle>
\ No newline at end of file
<?xml version="1.0" ?>
<!DOCTYPE translationbundle>
<translationbundle lang="bn">
</translationbundle>
\ No newline at end of file
<?xml version="1.0" ?>
<!DOCTYPE translationbundle>
<translationbundle lang="bs">
</translationbundle>
\ No newline at end of file
<?xml version="1.0" ?>
<!DOCTYPE translationbundle>
<translationbundle lang="ca">
</translationbundle>
\ No newline at end of file
<?xml version="1.0" ?>
<!DOCTYPE translationbundle>
<translationbundle lang="cs">
</translationbundle>
\ No newline at end of file
<?xml version="1.0" ?>
<!DOCTYPE translationbundle>
<translationbundle lang="da">
</translationbundle>
\ No newline at end of file
<?xml version="1.0" ?>
<!DOCTYPE translationbundle>
<translationbundle lang="de">
</translationbundle>
\ No newline at end of file
<?xml version="1.0" ?>
<!DOCTYPE translationbundle>
<translationbundle lang="el">
</translationbundle>
\ No newline at end of file
<?xml version="1.0" ?>
<!DOCTYPE translationbundle>
<translationbundle lang="en-GB">
</translationbundle>
\ No newline at end of file
<?xml version="1.0" ?>
<!DOCTYPE translationbundle>
<translationbundle lang="es-419">
</translationbundle>
\ No newline at end of file
<?xml version="1.0" ?>
<!DOCTYPE translationbundle>
<translationbundle lang="es">
</translationbundle>
\ No newline at end of file
<?xml version="1.0" ?>
<!DOCTYPE translationbundle>
<translationbundle lang="et">
</translationbundle>
\ No newline at end of file
<?xml version="1.0" ?>
<!DOCTYPE translationbundle>
<translationbundle lang="eu">
</translationbundle>
\ No newline at end of file
<?xml version="1.0" ?>
<!DOCTYPE translationbundle>
<translationbundle lang="fa">
</translationbundle>
\ No newline at end of file
<?xml version="1.0" ?>
<!DOCTYPE translationbundle>
<translationbundle lang="fi">
</translationbundle>
\ No newline at end of file
<?xml version="1.0" ?>
<!DOCTYPE translationbundle>
<translationbundle lang="fil">
</translationbundle>
\ No newline at end of file
<?xml version="1.0" ?>
<!DOCTYPE translationbundle>
<translationbundle lang="fr-CA">
</translationbundle>
\ No newline at end of file
<?xml version="1.0" ?>
<!DOCTYPE translationbundle>
<translationbundle lang="fr">
</translationbundle>
\ No newline at end of file
<?xml version="1.0" ?>
<!DOCTYPE translationbundle>
<translationbundle lang="gl">
</translationbundle>
\ No newline at end of file
<?xml version="1.0" ?>
<!DOCTYPE translationbundle>
<translationbundle lang="gu">
</translationbundle>
\ No newline at end of file
<?xml version="1.0" ?>
<!DOCTYPE translationbundle>
<translationbundle lang="hi">
</translationbundle>
\ No newline at end of file
<?xml version="1.0" ?>
<!DOCTYPE translationbundle>
<translationbundle lang="hr">
</translationbundle>
\ No newline at end of file
<?xml version="1.0" ?>
<!DOCTYPE translationbundle>
<translationbundle lang="hu">
</translationbundle>
\ No newline at end of file
<?xml version="1.0" ?>
<!DOCTYPE translationbundle>
<translationbundle lang="hy">
</translationbundle>
\ No newline at end of file
<?xml version="1.0" ?>
<!DOCTYPE translationbundle>
<translationbundle lang="id">
</translationbundle>
\ No newline at end of file
<?xml version="1.0" ?>
<!DOCTYPE translationbundle>
<translationbundle lang="is">
</translationbundle>
\ No newline at end of file
<?xml version="1.0" ?>
<!DOCTYPE translationbundle>
<translationbundle lang="it">
</translationbundle>
\ No newline at end of file
<?xml version="1.0" ?>
<!DOCTYPE translationbundle>
<translationbundle lang="iw">
</translationbundle>
\ No newline at end of file
<?xml version="1.0" ?>
<!DOCTYPE translationbundle>
<translationbundle lang="ja">
</translationbundle>
\ No newline at end of file
<?xml version="1.0" ?>
<!DOCTYPE translationbundle>
<translationbundle lang="ka">
</translationbundle>
\ No newline at end of file
<?xml version="1.0" ?>
<!DOCTYPE translationbundle>
<translationbundle lang="kk">
</translationbundle>
\ No newline at end of file
<?xml version="1.0" ?>
<!DOCTYPE translationbundle>
<translationbundle lang="km">
</translationbundle>
\ No newline at end of file
<?xml version="1.0" ?>
<!DOCTYPE translationbundle>
<translationbundle lang="kn">
</translationbundle>
\ No newline at end of file
<?xml version="1.0" ?>
<!DOCTYPE translationbundle>
<translationbundle lang="ko">
</translationbundle>
\ No newline at end of file
<?xml version="1.0" ?>
<!DOCTYPE translationbundle>
<translationbundle lang="ky">
</translationbundle>
\ No newline at end of file
<?xml version="1.0" ?>
<!DOCTYPE translationbundle>
<translationbundle lang="lo">
</translationbundle>
\ No newline at end of file
<?xml version="1.0" ?>
<!DOCTYPE translationbundle>
<translationbundle lang="lt">
</translationbundle>
\ No newline at end of file
<?xml version="1.0" ?>
<!DOCTYPE translationbundle>
<translationbundle lang="lv">
</translationbundle>
\ No newline at end of file
<?xml version="1.0" ?>
<!DOCTYPE translationbundle>
<translationbundle lang="mk">
</translationbundle>
\ No newline at end of file
<?xml version="1.0" ?>
<!DOCTYPE translationbundle>
<translationbundle lang="ml">
</translationbundle>
\ No newline at end of file
<?xml version="1.0" ?>
<!DOCTYPE translationbundle>
<translationbundle lang="mn">
</translationbundle>
\ No newline at end of file
<?xml version="1.0" ?>
<!DOCTYPE translationbundle>
<translationbundle lang="mr">
</translationbundle>
\ No newline at end of file
<?xml version="1.0" ?>
<!DOCTYPE translationbundle>
<translationbundle lang="ms">
</translationbundle>
\ No newline at end of file
<?xml version="1.0" ?>
<!DOCTYPE translationbundle>
<translationbundle lang="my">
</translationbundle>
\ No newline at end of file
<?xml version="1.0" ?>
<!DOCTYPE translationbundle>
<translationbundle lang="ne">
</translationbundle>
\ No newline at end of file
<?xml version="1.0" ?>
<!DOCTYPE translationbundle>
<translationbundle lang="nl">
</translationbundle>
\ No newline at end of file
<?xml version="1.0" ?>
<!DOCTYPE translationbundle>
<translationbundle lang="no">
</translationbundle>
\ No newline at end of file
<?xml version="1.0" ?>
<!DOCTYPE translationbundle>
<translationbundle lang="or">
</translationbundle>
\ No newline at end of file
<?xml version="1.0" ?>
<!DOCTYPE translationbundle>
<translationbundle lang="pa">
</translationbundle>
\ No newline at end of file
<?xml version="1.0" ?>
<!DOCTYPE translationbundle>
<translationbundle lang="pl">
</translationbundle>
\ No newline at end of file
<?xml version="1.0" ?>
<!DOCTYPE translationbundle>
<translationbundle lang="pt-BR">
</translationbundle>
\ No newline at end of file
<?xml version="1.0" ?>
<!DOCTYPE translationbundle>
<translationbundle lang="pt-PT">
</translationbundle>
\ No newline at end of file
<?xml version="1.0" ?>
<!DOCTYPE translationbundle>
<translationbundle lang="ro">
</translationbundle>
\ No newline at end of file
<?xml version="1.0" ?>
<!DOCTYPE translationbundle>
<translationbundle lang="ru">
</translationbundle>
\ No newline at end of file
<?xml version="1.0" ?>
<!DOCTYPE translationbundle>
<translationbundle lang="si">
</translationbundle>
\ No newline at end of file
<?xml version="1.0" ?>
<!DOCTYPE translationbundle>
<translationbundle lang="sk">
</translationbundle>
\ No newline at end of file
<?xml version="1.0" ?>
<!DOCTYPE translationbundle>
<translationbundle lang="sl">
</translationbundle>
\ No newline at end of file
<?xml version="1.0" ?>
<!DOCTYPE translationbundle>
<translationbundle lang="sq">
</translationbundle>
\ No newline at end of file
<?xml version="1.0" ?>
<!DOCTYPE translationbundle>
<translationbundle lang="sr-Latn">
</translationbundle>
\ No newline at end of file
<?xml version="1.0" ?>
<!DOCTYPE translationbundle>
<translationbundle lang="sr">
</translationbundle>
\ No newline at end of file
<?xml version="1.0" ?>
<!DOCTYPE translationbundle>
<translationbundle lang="sv">
</translationbundle>
\ No newline at end of file
<?xml version="1.0" ?>
<!DOCTYPE translationbundle>
<translationbundle lang="sw">
</translationbundle>
\ No newline at end of file
<?xml version="1.0" ?>
<!DOCTYPE translationbundle>
<translationbundle lang="ta">
</translationbundle>
\ No newline at end of file
<?xml version="1.0" ?>
<!DOCTYPE translationbundle>
<translationbundle lang="te">
</translationbundle>
\ No newline at end of file
<?xml version="1.0" ?>
<!DOCTYPE translationbundle>
<translationbundle lang="th">
</translationbundle>
\ No newline at end of file
<?xml version="1.0" ?>
<!DOCTYPE translationbundle>
<translationbundle lang="tr">
</translationbundle>
\ No newline at end of file
<?xml version="1.0" ?>
<!DOCTYPE translationbundle>
<translationbundle lang="uk">
</translationbundle>
\ No newline at end of file
<?xml version="1.0" ?>
<!DOCTYPE translationbundle>
<translationbundle lang="ur">
</translationbundle>
\ No newline at end of file
<?xml version="1.0" ?>
<!DOCTYPE translationbundle>
<translationbundle lang="uz">
</translationbundle>
\ No newline at end of file
<?xml version="1.0" ?>
<!DOCTYPE translationbundle>
<translationbundle lang="vi">
</translationbundle>
\ No newline at end of file
<?xml version="1.0" ?>
<!DOCTYPE translationbundle>
<translationbundle lang="zh-CN">
</translationbundle>
\ No newline at end of file
<?xml version="1.0" ?>
<!DOCTYPE translationbundle>
<translationbundle lang="zh-HK">
</translationbundle>
\ No newline at end of file
<?xml version="1.0" ?>
<!DOCTYPE translationbundle>
<translationbundle lang="zh-TW">
</translationbundle>
\ No newline at end of file
<?xml version="1.0" ?>
<!DOCTYPE translationbundle>
<translationbundle lang="zu">
</translationbundle>
\ No newline at end of file
......@@ -8,6 +8,7 @@ import android.content.Context;
import android.os.Bundle;
import android.view.MenuItem;
import androidx.annotation.Nullable;
import androidx.annotation.VisibleForTesting;
import androidx.preference.PreferenceFragmentCompat;
......@@ -35,6 +36,11 @@ public class PasswordCheckFragmentView extends PreferenceFragmentCompat {
public void onCreatePreferences(Bundle savedInstanceState, String rootKey) {
getActivity().setTitle(R.string.passwords_check_title);
setPreferenceScreen(getPreferenceManager().createPreferenceScreen(getStyledContext()));
}
@Override
public void onActivityCreated(@Nullable Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
mComponentDelegate = sComponentFactory.create(this);
}
......
......@@ -5,16 +5,20 @@
package org.chromium.chrome.browser.password_check;
import static org.hamcrest.core.Is.is;
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertThat;
import static org.chromium.chrome.browser.password_check.PasswordCheckProperties.CompromisedCredentialProperties.COMPROMISED_CREDENTIAL;
import static org.chromium.chrome.browser.password_check.PasswordCheckProperties.HeaderProperties.CHECK_STATUS;
import static org.chromium.chrome.browser.password_check.PasswordCheckProperties.ITEMS;
import static org.chromium.components.embedder_support.util.UrlUtilities.stripScheme;
import static org.chromium.content_public.browser.test.util.CriteriaHelper.pollUiThread;
import android.view.View;
import android.widget.ImageView;
import android.widget.TextView;
import androidx.annotation.IdRes;
import androidx.recyclerview.widget.RecyclerView;
import androidx.test.filters.MediumTest;
import org.junit.Before;
......@@ -27,12 +31,14 @@ import org.mockito.MockitoAnnotations;
import org.chromium.base.test.util.CommandLineFlags;
import org.chromium.chrome.browser.flags.ChromeSwitches;
import org.chromium.chrome.browser.password_check.PasswordCheckProperties.HeaderProperties;
import org.chromium.chrome.browser.password_check.internal.R;
import org.chromium.chrome.browser.settings.SettingsActivityTestRule;
import org.chromium.chrome.test.ChromeJUnit4ClassRunner;
import org.chromium.content_public.browser.test.util.Criteria;
import org.chromium.content_public.browser.test.util.TestThreadUtils;
import org.chromium.ui.modelutil.MVCListAdapter;
import org.chromium.ui.modelutil.PropertyModel;
import org.chromium.ui.widget.ButtonCompat;
/**
* View tests for the Password Check component ensure model changes are reflected in the check UI.
......@@ -41,7 +47,11 @@ import org.chromium.ui.modelutil.PropertyModel;
@CommandLineFlags.Add({ChromeSwitches.DISABLE_FIRST_RUN_EXPERIENCE})
public class PasswordCheckViewTest {
private static final CompromisedCredential ANA =
new CompromisedCredential("https://some-url.com", "Ana", "password", false);
new CompromisedCredential("some-url.com", "Ana", "password", false);
private static final CompromisedCredential PHISHED =
new CompromisedCredential("example.com", "Baub", "DoSomething", true);
private static final CompromisedCredential LEAKED =
new CompromisedCredential("some-other-url.com", "AZiegler", "N0M3rcy", false);
private PropertyModel mModel = PasswordCheckProperties.createDefaultModel();
private PasswordCheckFragmentView mPasswordCheckView;
......@@ -76,10 +86,40 @@ public class PasswordCheckViewTest {
.build()));
mModel.get(ITEMS).add(buildCredentialItem(ANA));
});
pollUiThread(
() -> Criteria.checkThat(mPasswordCheckView.getListView().getChildCount(), is(2)));
TextView entry = (TextView) mPasswordCheckView.getListView().getChildAt(1);
assertThat(entry.getText(), is(stripScheme(ANA.getOriginUrl())));
pollUiThread(() -> Criteria.checkThat(getCredentials().getChildCount(), is(2)));
// Has a change passwords button.
assertNotNull(getCredentialChangeButtonAt(1));
assertThat(getCredentialChangeButtonAt(1).getVisibility(), is(View.VISIBLE));
assertThat(getCredentialChangeButtonAt(1).getText(),
is(getString(R.string.password_check_credential_row_change_button_caption)));
// Has a more button.
assertNotNull(getCredentialMoreButtonAt(1));
assertThat(getCredentialMoreButtonAt(1).getVisibility(), is(View.VISIBLE));
assertThat(getCredentialMoreButtonAt(1).getContentDescription(),
is(getString(org.chromium.chrome.R.string.more)));
}
@Test
@MediumTest
public void testCrendentialDisplaysNameOriginAndReason() {
TestThreadUtils.runOnUiThreadBlocking(() -> {
mModel.get(ITEMS).add(buildCredentialItem(PHISHED));
mModel.get(ITEMS).add(buildCredentialItem(LEAKED));
});
pollUiThread(() -> Criteria.checkThat(getCredentials().getChildCount(), is(2)));
// The phished credential is rendered first:
assertThat(getCredentialOriginAt(0).getText(), is(PHISHED.getOriginUrl()));
assertThat(getCredentialUserAt(0).getText(), is(PHISHED.getUsername()));
assertThat(getCredentialReasonAt(0).getText(),
is(getString(R.string.password_check_credential_row_reason_phished)));
// The leaked credential is rendered second:
assertThat(getCredentialOriginAt(1).getText(), is(LEAKED.getOriginUrl()));
assertThat(getCredentialUserAt(1).getText(), is(LEAKED.getUsername()));
assertThat(getCredentialReasonAt(1).getText(),
is(getString(R.string.password_check_credential_row_reason_leaked)));
}
private static MVCListAdapter.ListItem buildCredentialItem(CompromisedCredential credential) {
......@@ -89,4 +129,32 @@ public class PasswordCheckViewTest {
.with(COMPROMISED_CREDENTIAL, credential)
.build());
}
private RecyclerView getCredentials() {
return mPasswordCheckView.getListView();
}
private TextView getCredentialOriginAt(int index) {
return getCredentials().getChildAt(index).findViewById(R.id.credential_origin);
}
private TextView getCredentialUserAt(int index) {
return getCredentials().getChildAt(index).findViewById(R.id.compromised_username);
}
private TextView getCredentialReasonAt(int index) {
return getCredentials().getChildAt(index).findViewById(R.id.compromised_reason);
}
private ButtonCompat getCredentialChangeButtonAt(int index) {
return getCredentials().getChildAt(index).findViewById(R.id.credential_change_button);
}
private ImageView getCredentialMoreButtonAt(int index) {
return getCredentials().getChildAt(index).findViewById(R.id.credential_menu_button);
}
private String getString(@IdRes int stringResource) {
return mTestRule.getActivity().getString(stringResource);
}
}
......@@ -38,6 +38,7 @@
"chrome/app/google_chrome_strings.grd",
"chrome/browser/resources/chromeos/accessibility/strings/accessibility_strings.grd",
"chrome/browser/touch_to_fill/android/internal/java/strings/android_touch_to_fill_strings.grd",
"chrome/browser/password_check/android/internal/java/strings/android_password_check_strings.grd",
"chrome/browser/ui/android/strings/android_chrome_strings.grd",
"chrome/credential_provider/gaiacp/gaia_resources.grd",
"chromeos/chromeos_strings.grd",
......
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