# Account Selection Android Feature
This folder contains the internal parts of the Account Selection 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 Account Selection component API that intends to change
the visible appearance involves all component parts. For example if the API
caller requests to show new accounts:
1. The API caller asks the controller to show a set of `accounts`.
1. The controller prepares the `accounts` for display.
2. The controller writes the prepared accounts into the [model](#Model).
2. The MCP picks up model changes.
1. The MCP identifies that the `SHEET_ITEMS` property was changed.
2. The MCP uses a ViewBinder to bind each changed account to the
corresponding view (e.g. a TextView inside a RecyclerView).
3. The view renders the changed account list.
1. The view may apply style, and event handlers for click events.
## Model
The model holds state and event listeners connected to the view. An MCP
automatically notifies listener about any change made to a property. To automate
this Observer structure, the model is a `ListModel` as defined in
`//src/ui/android/java/src/org/chromium/ui/modelutil/`. The items in this model
are themselves of type `PropertyModel`. The properties for these are located in
the static `AccountSelectionProperties` class.
The items in the list can be of three types:
* **HEADER**: There is only one of these and it represents the header of the
view. Contains whether this is for a single or multiple accounts, and the URL
for the RP.
* **ACCOUNT**: One for each account. It contains the account data, favicon, and
a click listener.
* **CONTINUE_BUTTON**: There is only one when we want to show a confirm button.
## Controller
The controller of this model implements the AccountSelectionComponent interface
as defined in `public/` and contains all logic. The controller consists of two
parts:
* **AccountSelectionCoordinator** which implements the public interface and
creates all parts of the component (model, mediator, view, etc.) and links
them using MCPs.
* **AccountSelectionMediator** which handles request to the component API and
changes the model accordingly. Interactions with the view are typically
handled here and either affect the model or notify callers of the component
API. This is also responsible for observing the bottom sheet state and
notify callers on its dismissal.
## View
We use a simple `LinearLayout` as the top-level view for this component which
contains the list view for sheet items. This view is them displayed inside the
bottom sheet via `AccountSelectionBottomSheetContent`. The rest of the logic is
split in two parts:
* **AccountSelectionViewBinder** which maps model changes to the view. This is
mainly used by `SimpleRecyclerViewAdapter` and is responsible to bind changes
to the items in the model list to the RecyclerView inside the bottom sheet.
* **AccountSelectionBottomSheetContent** This is a simple container that
implements `BottomSheetContent` interface and facilitates display of our view
inside the `BottomSheetController`. The bottom sheet controller instance
itself is controlled by the mediator to create and modify the bottom sheet
where accounts are displayed.