Support multiple alignment within one ViewHolder

Add support of align to multiple positions within one ViewHolder of
Grid View.

Introduce "FacetProvider" inteface for optional features to be implemented
without requiring an object must implement a java interface.  Benefit
is less impact on the major feature of a class, make the extra optional
features loosely coupled with existing class.  (And it is the only way
for ItemBridgeAdapter to provide a list of optional features that
are implemented by some Presenters but not others)

Add a new ItemAlignmentFacet class to describe multiple alignment positions.

Grid view gets optional ItemAlignmentFacet from RecyclerView.ViewHolder(rare)
or RecyclerView.Adapter for a given view type.  If the facet exists, it's used
to calculate multiple alignment positions within this ViewHolder.

At high level, for apps that using Presenter, they don't directly use
RecyclerView.ViewHolder or RecyclerView.Adapter.  apps put Facet in Presenter
(most cases) or a ViewHolder(rare cases).  For example in the new detail page
design, DetailsOverviewRowPresenter will need this facet(TODO),
ItemBridgeAdapter is responsible to "bridge" facet from Presenter.

In the future, Facet may be used to customize child view state saving.

Bug: 20094419

Change-Id: Iabef94e46f9a304ffd68e49bed10e74a57dfe4ce
14 files changed