# Password Check UI Component
This folder contains the internal parts of the Password Check component. Files,
classes and methods defined in here are not meant to be used outside of this
package.
This document provides a brief overview of the architecture.
[TOC]
## Component structure
This component follows the typical
[MVC](https://en.wikipedia.org/wiki/Model%E2%80%93view%E2%80%93controller)
structure that is widely used in Chrome on Android. The MVC structures separates
logic from representation:
* The [controller](#Controller) creates and connects all subcomponents and
performs logic that affects the visual appearance of the component.
* The [model](#Model) keeps all state that affects the visual appearance of the
component. Changes made to it are automatically propagated to the view by a
Model-Change-Processor (MCP) as defined in
`//src/ui/android/java/src/org/chromium/ui/modelutil/`
* The [view](#View) is the representation of the component. It enforces styles
and is mostly called by a view binder to set mutable properties.
A typical request to the Password Check component API that intends to change the
visible appearance involves all component parts. For example if the API caller
requests to show compromosed credentials:
1. The API caller asks the controller to show a set of
`credentials`.
1. The controller prepares and filters the `credentials` for display.
2. The controller writes the prepared credentials into the [model](#Model)
as `ITEMS`.
2. The MCP picks up model changes.
1. The MCP identifies that the `ITEMS` property was changed.
2. The MCP uses a ViewBinder to bind each settings item to the
corresponding view (e.g. a `COMPROMISED_CREDENTIAL` item id would create
or reuse a TextView with a button of options).
3. The view renders the changed credential list.
1. The view may apply style, RTL settings and click event handlers.
## Model
The model holds state and event listeners connected to the view. An MCP
automatically notifies the listener about any change made to a property. To
automate this Observer structure, the model is a `PropertyModel` as defined in
`//src/ui/android/java/src/org/chromium/ui/modelutil/`. It is build by defining
properties and constructing a model with them. The properties are located in the
static `PasswordCheckProperties` class.
The model contains writable and readable properties. The readable properties are
guaranteed to never change for the lifetime of the Password Check component:
* **ITEMS** which is the set of displayed credentials. The list
itself will be modified (credentials will be added and removed) but the
object remains the same which allows to permanently bind it to a list
adapter.
* **FRAGMET_EVENT_LISTENER** which is the listener that reacts to view events.
The mediator implements this interface.
The writable properties change over the course of the components lifetime:
* None so far
## Controller
The controller of this model implements the PasswordCheckComponent interface as
defined in `public/` and contains all logic that affects the component's visual
appearance. The controller consists of two parts:
* **PasswordCheckCoordinator** which implements the public interface and
creates all parts of the component (model, mediator, view, etc.) and links
them using MCPs.
* **PasswordCheckMediator** which handles request to the component API and
changes the model accordingly.
## View
The view contains all parts that are necessary to display the check UI. It
consists of two parts:
* **PasswordCheckViewBinder** which maps model changes to the view. For the
Password Check component, the ViewBinder also supports an Adapter that binds
changes to the `ITEMS` property to the RecyclerView inside the
bottom sheet.
* **PasswordCheckSettingsView** which displays all visible elements. Since it
is a fragment that the SettignsLauncher needs to access, it is public.