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" 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. -->
<grit current_release="1" latest_public_release="0" output_all_resource_defines="false">
<outputs>
<output filename="values-af/android_password_check_strings.xml" lang="af" type="android" />
<output filename="values-am/android_password_check_strings.xml" lang="am" type="android" />
<output filename="values-ar/android_password_check_strings.xml" lang="ar" type="android" />
<output filename="values-as/android_password_check_strings.xml" lang="as" type="android" />
<output filename="values-az/android_password_check_strings.xml" lang="az" type="android" />
<output filename="values-be/android_password_check_strings.xml" lang="be" type="android" />
<output filename="values-bg/android_password_check_strings.xml" lang="bg" type="android" />
<output filename="values-bn/android_password_check_strings.xml" lang="bn" type="android" />
<output filename="values-bs/android_password_check_strings.xml" lang="bs" type="android" />
<output filename="values-ca/android_password_check_strings.xml" lang="ca" type="android" />
<output filename="values-cs/android_password_check_strings.xml" lang="cs" type="android" />
<output filename="values-da/android_password_check_strings.xml" lang="da" type="android" />
<output filename="values-de/android_password_check_strings.xml" lang="de" type="android" />
<output filename="values-el/android_password_check_strings.xml" lang="el" type="android" />
<output filename="values/android_password_check_strings.xml" lang="en" type="android" />
<output filename="values-en-rGB/android_password_check_strings.xml" lang="en-GB" type="android" />
<output filename="values-es/android_password_check_strings.xml" lang="es" type="android" />
<output filename="values-es-rUS/android_password_check_strings.xml" lang="es-419" type="android" />
<output filename="values-et/android_password_check_strings.xml" lang="et" type="android" />
<output filename="values-eu/android_password_check_strings.xml" lang="eu" type="android" />
<output filename="values-fa/android_password_check_strings.xml" lang="fa" type="android" />
<output filename="values-fi/android_password_check_strings.xml" lang="fi" type="android" />
<output filename="values-tl/android_password_check_strings.xml" lang="fil" type="android" />
<output filename="values-fr/android_password_check_strings.xml" lang="fr" type="android" />
<output filename="values-fr-rCA/android_password_check_strings.xml" lang="fr-CA" type="android" />
<output filename="values-gl/android_password_check_strings.xml" lang="gl" type="android" />
<output filename="values-gu/android_password_check_strings.xml" lang="gu" type="android" />
<output filename="values-hi/android_password_check_strings.xml" lang="hi" type="android" />
<output filename="values-hr/android_password_check_strings.xml" lang="hr" type="android" />
<output filename="values-hu/android_password_check_strings.xml" lang="hu" type="android" />
<output filename="values-hy/android_password_check_strings.xml" lang="hy" type="android" />
<output filename="values-in/android_password_check_strings.xml" lang="id" type="android" />
<output filename="values-is/android_password_check_strings.xml" lang="is" type="android" />
<output filename="values-it/android_password_check_strings.xml" lang="it" type="android" />
<output filename="values-iw/android_password_check_strings.xml" lang="iw" type="android" />
<output filename="values-ja/android_password_check_strings.xml" lang="ja" type="android" />
<output filename="values-ka/android_password_check_strings.xml" lang="ka" type="android" />
<output filename="values-kk/android_password_check_strings.xml" lang="kk" type="android" />
<output filename="values-km/android_password_check_strings.xml" lang="km" type="android" />
<output filename="values-kn/android_password_check_strings.xml" lang="kn" type="android" />
<output filename="values-ko/android_password_check_strings.xml" lang="ko" type="android" />
<output filename="values-ky/android_password_check_strings.xml" lang="ky" type="android" />
<output filename="values-lo/android_password_check_strings.xml" lang="lo" type="android" />
<output filename="values-lt/android_password_check_strings.xml" lang="lt" type="android" />
<output filename="values-lv/android_password_check_strings.xml" lang="lv" type="android" />
<output filename="values-mk/android_password_check_strings.xml" lang="mk" type="android" />
<output filename="values-ml/android_password_check_strings.xml" lang="ml" type="android" />
<output filename="values-mn/android_password_check_strings.xml" lang="mn" type="android" />
<output filename="values-mr/android_password_check_strings.xml" lang="mr" type="android" />
<output filename="values-ms/android_password_check_strings.xml" lang="ms" type="android" />
<output filename="values-my/android_password_check_strings.xml" lang="my" type="android" />
<output filename="values-ne/android_password_check_strings.xml" lang="ne" type="android" />
<output filename="values-nl/android_password_check_strings.xml" lang="nl" type="android" />
<output filename="values-nb/android_password_check_strings.xml" lang="no" type="android" />
<output filename="values-or/android_password_check_strings.xml" lang="or" type="android" />
<output filename="values-pa/android_password_check_strings.xml" lang="pa" type="android" />
<output filename="values-pl/android_password_check_strings.xml" lang="pl" type="android" />
<output filename="values-pt-rBR/android_password_check_strings.xml" lang="pt-BR" type="android" />
<output filename="values-pt-rPT/android_password_check_strings.xml" lang="pt-PT" type="android" />
<output filename="values-ro/android_password_check_strings.xml" lang="ro" type="android" />
<output filename="values-ru/android_password_check_strings.xml" lang="ru" type="android" />
<output filename="values-si/android_password_check_strings.xml" lang="si" type="android" />
<output filename="values-sk/android_password_check_strings.xml" lang="sk" type="android" />
<output filename="values-sl/android_password_check_strings.xml" lang="sl" type="android" />
<output filename="values-sq/android_password_check_strings.xml" lang="sq" type="android" />
<output filename="values-sr/android_password_check_strings.xml" lang="sr" type="android" />
<output filename="values-b+sr+Latn/android_password_check_strings.xml" lang="sr-Latn" type="android" />
<output filename="values-sv/android_password_check_strings.xml" lang="sv" type="android" />
<output filename="values-sw/android_password_check_strings.xml" lang="sw" type="android" />
<output filename="values-ta/android_password_check_strings.xml" lang="ta" type="android" />
<output filename="values-te/android_password_check_strings.xml" lang="te" type="android" />
<output filename="values-th/android_password_check_strings.xml" lang="th" type="android" />
<output filename="values-tr/android_password_check_strings.xml" lang="tr" type="android" />
<output filename="values-uk/android_password_check_strings.xml" lang="uk" type="android" />
<output filename="values-ur/android_password_check_strings.xml" lang="ur" type="android" />
<output filename="values-uz/android_password_check_strings.xml" lang="uz" type="android" />
<output filename="values-vi/android_password_check_strings.xml" lang="vi" type="android" />
<output filename="values-zh-rCN/android_password_check_strings.xml" lang="zh-CN" type="android" />
<output filename="values-zh-rHK/android_password_check_strings.xml" lang="zh-HK" type="android" />
<output filename="values-zh-rTW/android_password_check_strings.xml" lang="zh-TW" type="android" />
<output filename="values-zu/android_password_check_strings.xml" lang="zu" type="android" />
</outputs>
<translations>
<file lang="af" path="translations/android_password_check_strings_af.xtb" />
<file lang="am" path="translations/android_password_check_strings_am.xtb" />
<file lang="ar" path="translations/android_password_check_strings_ar.xtb" />
<file lang="as" path="translations/android_password_check_strings_as.xtb" />
<file lang="az" path="translations/android_password_check_strings_az.xtb" />
<file lang="be" path="translations/android_password_check_strings_be.xtb" />
<file lang="bg" path="translations/android_password_check_strings_bg.xtb" />
<file lang="bn" path="translations/android_password_check_strings_bn.xtb" />
<file lang="bs" path="translations/android_password_check_strings_bs.xtb" />
<file lang="ca" path="translations/android_password_check_strings_ca.xtb" />
<file lang="cs" path="translations/android_password_check_strings_cs.xtb" />
<file lang="da" path="translations/android_password_check_strings_da.xtb" />
<file lang="de" path="translations/android_password_check_strings_de.xtb" />
<file lang="el" path="translations/android_password_check_strings_el.xtb" />
<file lang="en-GB" path="translations/android_password_check_strings_en-GB.xtb" />
<file lang="es" path="translations/android_password_check_strings_es.xtb" />
<file lang="es-419" path="translations/android_password_check_strings_es-419.xtb" />
<file lang="et" path="translations/android_password_check_strings_et.xtb" />
<file lang="eu" path="translations/android_password_check_strings_eu.xtb" />
<file lang="fa" path="translations/android_password_check_strings_fa.xtb" />
<file lang="fi" path="translations/android_password_check_strings_fi.xtb" />
<file lang="fil" path="translations/android_password_check_strings_fil.xtb" />
<file lang="fr" path="translations/android_password_check_strings_fr.xtb" />
<file lang="fr-CA" path="translations/android_password_check_strings_fr-CA.xtb" />
<file lang="gl" path="translations/android_password_check_strings_gl.xtb" />
<file lang="gu" path="translations/android_password_check_strings_gu.xtb" />
<file lang="hi" path="translations/android_password_check_strings_hi.xtb" />
<file lang="hr" path="translations/android_password_check_strings_hr.xtb" />
<file lang="hu" path="translations/android_password_check_strings_hu.xtb" />
<file lang="hy" path="translations/android_password_check_strings_hy.xtb" />
<file lang="id" path="translations/android_password_check_strings_id.xtb" />
<file lang="is" path="translations/android_password_check_strings_is.xtb" />
<file lang="it" path="translations/android_password_check_strings_it.xtb" />
<file lang="iw" path="translations/android_password_check_strings_iw.xtb" />
<file lang="ja" path="translations/android_password_check_strings_ja.xtb" />
<file lang="ka" path="translations/android_password_check_strings_ka.xtb" />
<file lang="kk" path="translations/android_password_check_strings_kk.xtb" />
<file lang="km" path="translations/android_password_check_strings_km.xtb" />
<file lang="kn" path="translations/android_password_check_strings_kn.xtb" />
<file lang="ko" path="translations/android_password_check_strings_ko.xtb" />
<file lang="ky" path="translations/android_password_check_strings_ky.xtb" />
<file lang="lo" path="translations/android_password_check_strings_lo.xtb" />
<file lang="lt" path="translations/android_password_check_strings_lt.xtb" />
<file lang="lv" path="translations/android_password_check_strings_lv.xtb" />
<file lang="mk" path="translations/android_password_check_strings_mk.xtb" />
<file lang="ml" path="translations/android_password_check_strings_ml.xtb" />
<file lang="mn" path="translations/android_password_check_strings_mn.xtb" />
<file lang="mr" path="translations/android_password_check_strings_mr.xtb" />
<file lang="ms" path="translations/android_password_check_strings_ms.xtb" />
<file lang="my" path="translations/android_password_check_strings_my.xtb" />
<file lang="ne" path="translations/android_password_check_strings_ne.xtb" />
<file lang="nl" path="translations/android_password_check_strings_nl.xtb" />
<file lang="no" path="translations/android_password_check_strings_no.xtb" />
<file lang="or" path="translations/android_password_check_strings_or.xtb" />
<file lang="pa" path="translations/android_password_check_strings_pa.xtb" />
<file lang="pl" path="translations/android_password_check_strings_pl.xtb" />
<file lang="pt-BR" path="translations/android_password_check_strings_pt-BR.xtb" />
<file lang="pt-PT" path="translations/android_password_check_strings_pt-PT.xtb" />
<file lang="ro" path="translations/android_password_check_strings_ro.xtb" />
<file lang="ru" path="translations/android_password_check_strings_ru.xtb" />
<file lang="si" path="translations/android_password_check_strings_si.xtb" />
<file lang="sk" path="translations/android_password_check_strings_sk.xtb" />
<file lang="sl" path="translations/android_password_check_strings_sl.xtb" />
<file lang="sq" path="translations/android_password_check_strings_sq.xtb" />
<file lang="sr" path="translations/android_password_check_strings_sr.xtb" />
<file lang="sr-Latn" path="translations/android_password_check_strings_sr-Latn.xtb" />
<file lang="sv" path="translations/android_password_check_strings_sv.xtb" />
<file lang="sw" path="translations/android_password_check_strings_sw.xtb" />
<file lang="ta" path="translations/android_password_check_strings_ta.xtb" />
<file lang="te" path="translations/android_password_check_strings_te.xtb" />
<file lang="th" path="translations/android_password_check_strings_th.xtb" />
<file lang="tr" path="translations/android_password_check_strings_tr.xtb" />
<file lang="uk" path="translations/android_password_check_strings_uk.xtb" />
<file lang="ur" path="translations/android_password_check_strings_ur.xtb" />
<file lang="uz" path="translations/android_password_check_strings_uz.xtb" />
<file lang="vi" path="translations/android_password_check_strings_vi.xtb" />
<file lang="zh-CN" path="translations/android_password_check_strings_zh-CN.xtb" />
<file lang="zh-HK" path="translations/android_password_check_strings_zh-HK.xtb" />
<file lang="zh-TW" path="translations/android_password_check_strings_zh-TW.xtb" />
<file lang="zu" path="translations/android_password_check_strings_zu.xtb" />
</translations>
<release allow_pseudo="false" seq="1">
<messages fallback_to_english="true">
<!-- Password Check -->
<message name="IDS_PASSWORD_CHECK_CREDENTIAL_ROW_CHANGE_BUTTON_CAPTION" desc="Caption for the button that links to a site where the user can change a compromised credential.">
Change password
</message>
<message name="IDS_PASSWORD_CHECK_CREDENTIAL_ROW_REASON_LEAKED" desc="Small description explaining that a credential is compromised because it was part of a data breach.">
Found in data breach
</message>
<message name="IDS_PASSWORD_CHECK_CREDENTIAL_ROW_REASON_PHISHED" desc="Small description explaining that a credential is compromised because it was entered on a deceptive site.">
Entered on a deceptive site
</message>
</messages>
</release>
</grit>
<?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