Android app for sorting and reviewing changes

The 'Review It!?' app is an Android application for Gerrit that allows
sorting of incoming changes and review of small/trivial changes.

There is a drawer menu that allows switching between the sorting and
the review mode of the app.

Sorting of incoming changes
===========================

When working with Gerrit it is a common workflow that reviewers are
not always explicitly assigned, but that committers and contributors
watch the incoming changes and choose those changes for review that
are interesting to them.

Watching incoming changes can be done in different ways, e.g
- manually go through the list of open changes
- register project watches to get email notifications about new
  changes

These approaches have some problems in common when the number of
incoming changes gets too high:
- some changes of interest are not noticed (e.g. get lost in the mail
  inbox)
- at the time of notification there may be no time for immediate
  review, and at the moment when there is time to review, some of the
  interesting changes have been forgotten
- changes that are not interesting popup again and again whenever they
  are updated

The 'ReviewIt!?' Android app tries to solve these problems by offering
a simple way to sort incoming changes:
- mark interesting changes to review them later (by putting a labeled
  star on them)
- mark non-interesting changes as ignored

The actual review of the changes may be done in the Gerrit web UI on a
large screen or directly in the app by using its review functionality
(see below).

The idea of the sorting is that it allows you to stay updated about
your project while you are not in office (see new changes and sort
them), but the code review is done only later, e.g. because the small
display of a phone is not supporting reviews very well.

The changes that have been starred are accessible by a change query or
a Gerrit dashboard, and hence they can be easily found when there is
time to do reviews. The app should configure a 'My' menu entry for
this dashboard automatically (not implemented yet).

Updates for ignored changes will be filtered out so that the noise is
reduced.

In addition to starring/ignoring a change, the app also offers to skip
changes. Skipping a change means that the user is asked about this
change once more when it was updated.

Within the app you can define a change query for the incoming changes.
The results are then presented one by one. For each change a decision
(star, ignore or skip) has to be made to go to the next change.
Starring/ignoring a change can be done by swiping the change to the
right/left side. In addition there are buttons to trigger starring,
ignoring and skipping a change.

The main sorting screen provides the information that is most relevant
to deciding whether a change is interesting:
- subject + commit message
- project, branch, topic
- age (when was the change last updated)
- owner
- patch set number
- number of positive and negative Code-Review votes
- number of comments
- number of reviewers
- positive/negative Verified votes
- whether the change is mergable
- change status if merged/abandoned

This information is presented in a very compressed way and the focus
is on the subject and the commit message.

By clicking on the bottom of the change one can also go to a detailed
change view where more information is presented, e.g. the change
number, the change link, the approvals and the list of files. This
detailed change view is zoomable.

The file diff can be seen in a unified diff view with intraline diff
highlighting. If wanted one can start reviewing the change here (see
more about review below).

All actions (star, ignore and skip) are undoable by clicking on the
undo action in the menu, so that mistakes in sorting can be easily
corrected.

Sometimes when watching a change one knows another person that is
well suited to review this change. This is why there is an add
reviewer action in the menu that allows to add another person as
reviewer. Reviewer names are auto-completed on typing.

There are also menu entries to abandon/restore and reload the current
change.

Review changes
==============

It is envisioned to present the user a change list from which he can
select a change and start reviewing it (not implemented yet).

The files are shown as unified diff with intraline diff highlighting.
You can see the unified diff for all files in a single scroll view or
page through the change file by file. While scrolling the file name is
sticky at the top of the screen.

Context lines are collapsed and can be expanded as needed.

At the bottom of the unified diff view there is an expandable panel
that presents quick-voting buttons for the Code-Review label.

Pressing on a quick-voting button leads to a publish screen where a
summary message can be provided and voting on other labels is
possible. By clicking on the 'Publish' button the review is sent to
the server. If Code-Review+2 is selected a 'Publish and Submit' button
appears that allows to submit the change right away.

Inline commenting is not implemented yet.

The goal is to allow review of small/trivial changes, but not to
support review of arbitrary large changes.

Settings
========

A setting screens allows to configure the change query for the
incoming changes, the star label and the server configuration.

The star label will be used to mark changes as interesting or as
skipped.

It is possible to configure multiple servers, each with URL, user and
password.

For googlesource.com servers there is support to easily import the
user credentials by copy and paste.

The configuration is stored in the app preferences and the
configuration values are encrypted.

When starting the app for the first time there is a short introduction
that explains the basic functions and asks for the server connection.

Licenses
========
The 'Review It!?' app is licensed under the Apache License 2.0.
Executable distributions also include other software components that
are provided under additional licenses.

To connect to the Gerrit server the app uses the
gerrit-rest-java-client [1] by Urs Wolfer which is available under the
Apache License, Version 2.0.

The used icons are taken from the Material icons set [2].

The Diffy logo was created by Sara Owens (http://inkylabs.com/).

Disclaimer
==========

This app is still a prototype and not fully functional. E.g. the
ignore, skip and star actions are not implemented yet and don't have
any effect.

The ignore, skip and star functionality requires a server that
supports labeled stars and runs notedb.

Here some things that were not done for this initial version:
- implement change list for starting reviews
- implement ignore/skip/star
- more info on the detailed change screen
  * summary comments
  * hashtags
  * related changes
- implement paging for approvals on detailed change screen similar to
  how it is done for the files (implement a custom widget for the
  paging functionality that can be reused)
- allow to display more details as icons in change box
  * number of files
  * change size
  * number of changes in the same topic
  * icon for other labels (abbreviated label name overlayed with small
    thumb up/down icon in lower right corner), e.g. for Verified
- when swiping change box to left/right, in addition to changing the
  color of the change box, show an overlayed star/ignore image
  (relying on coloring only is bad for color blind people)
- add commit message to file list
- make bottom panel in unified diff pullable
- show commit message in Abandon/Restore fragments (as it is already
  done in PostReviewFragment)
- the configuration should allow to store multiple query
  configurations + the user should be able to switch between them
  quickly
- make buttons in setting screens blue
- allow to expand the one sentence help text describing the app to get
  a detailed description of the app (basically provide more info from
  what is contained in this commit message)
- the user should be able to configure favourite reviewers that can be
  added by a single click
- in the configuration there should be a button to create/update a My
  menu entry on the server that opens a query that shows all the
  changes starred by the app
- feedback button
- automatically check whether the server version is compatible with
  the app
- notifications when there are new query results
- implement proper build without committing the used libraries
- support anonymous try-out mode that only allows to page through the
  changes without any actions
- remember missing avatars and don't try to download them again and
  again (e.g. if avatars are disabled on the server)

[1] https://github.com/uwolfer/gerrit-rest-java-client
[2] https://design.google.com/icons/

Change-Id: I6a85bb2f3c80c0a47a448474b47a977151823a95
Signed-off-by: Edwin Kempin <ekempin@google.com>
2360 files changed