WIP: Start working on an ExpandableListView to show groups of players.

- Create PlayerListAdapter to hold information about groups of players.

- Create item_list_players.xml to show player groups.

- Update PlayerListActivity to use both of these.

- Add a callback method to IServicePlayersCallback when player sync groups
  change.

Much still to be done -- this doesn't work yet. There's no integration with
the server.
WIP: Display all players in an ExpandableListView.

- Initial work to support fetching the list of sync. groups from the server.
  SqueezeService can send and parse the request, and ConnectionState can now
  track this information. This is provided in onPlayersChanged callbacks.

- Introduce model/PlayerSyncGroup to hold the sync group information.

- Change PlayerListActivity to extend ItemListActivity instead of
  BaseListActivity<Player>, as BaseListActivity makes assumptions that don't
  hold.

- Extend PlayerListAdapter, and start managing the child adapters properly.
  Flesh out the various get*() methods so that PlayerListActivity can
  show all the active players.
WIP: More work on player sync groups. Bugs remain (see XXX comments).

- Use the syncmaster / syncslaves attributes of Players, instead of the
  syncgroups command. This keeps all the information tied to the Players
  instead of having to fetch additional data from the server.

- Change PlayerListAdapter::updatePlayers() to use this information to
  construct the groups for the expandable list.

- Make the list of players in the expandable list stable by using their
  MAC address ID, converted to a long, as the child ID. Introduce a utility
  method to do the conversion, with a test.

- Add a specific view for the group header of players, with a minimum
  height.

- Instead of the service keeping track of a single PlayerState for the
  active player, make PlayerState a member of each Player

- Track the player's syncmaster and syncslaves in the PlayerState.

- Adjust all the PlayerState::set*() methods to return a boolean indicating
  whether or not the value was changed. Use this in the service to determine
  wether to call each specific callback.

- Track all the seen players in a Map in ConnectionState. Add methods to
  modify the map as appropriate.

- Delete the IServicePlayersCallback::onSyncGroupsChanged() method, and
  the ISqueezeService::syncgroups() method.
Pass through the correct player state.

Fixes a bug where onMusicChanged() was being called with data for the
previous track.
Merge branch 'release-1.1.0' into player-groups

* release-1.1.0:
  Prepare for release 1.1.0-beta-6.
  Use Crashlytics instead of ACRA.
  Handle service NPEs in RandomPlayActivity.
  Propogate the return value from changeVolumeBy().
  Verify that the return from getService() is not null.
  Start handling a nullable service binding in NowPlayingFragment.
  Ensure that activity options menu items reflect the bound service state.
  Fix NPEs with the service connection in *ListActivity::orderPage().
  Fix the REORDER_TO_FRONT 4.4.2 problem
  Avoid NPEs when registering callbacks.
  WIP: Rename "service" to "mService".
  WIP: Fix NPEs involving the bound service.
  Add a feature graphic, which is now a requirement for Google Play.
  Fix an NPE in updatePlayerDropDown().
  Prepare the release for 1.1.0-beta-5.
  Use an explicit version of Gradle to ensure reproducibility.
  Add downloaded files to the media library.

Conflicts:
	Squeezer/src/main/java/uk/org/ngo/squeezer/itemlist/PlayerListActivity.java
	Squeezer/src/main/java/uk/org/ngo/squeezer/service/SqueezeService.java
Only enable Crashlytics for release builds.
Handle PlayerView context menus correctly.

Context menu handling was lost when PlayerListActivity was changed to
extend ItemListActivity.

Implement PlayerListActivity.onContextItemSelected() and
PlayerListAdapter.doItemContext() to pass context menu selections down
to the relevant PlayerView.
Use "SEND" and "RECV" in tags for debugging strings.
Rename sendPlayerCommand() to sendActivePlayerCommand(), to make it clear
that this only operates on the active player.
Merge branch 'develop' into player-groups
Merge remote-tracking branch 'origin/develop' into player-groups
Update the UI when player states change, not players.

As the service is tracking players from the time it connects to the
server there is no need to re-fetch the list of players in this
activity.

Instead, use the service's current list of players, and rely on player
state change notifications to update the UI.

Refactor some method names and variables to make more sense.
Disable collapsing each player group expandable list view.
Add @Nullable annotations to methods that handle the active player.

The active player may legitimately be null -- for example, when there
are no players connected to the server.
Fix bugs with player tracking.

- changeActivePlayer() now handles the case where the active player is
  now null -- for example, if there are no players connected to the
  server.

- Unsubscribe from status updates when refreshing the list of players.
Ensure players with no syncmaster return null, rather than "".

Add @Nullable annotations to getSyncMaster() and setSyncMaster().
Refactor and simplify player group management.

- Move the player group creation code in to PlayerListActivity. This
  sets the way for future work to move players between groups, which
  will be managed by the activity.

- Simplify the code that determines player groups, with the additional
  side effect of making it correct. The previous code had problems with
  players that were synced to an un-connected master (which can happen).
Support managing player sync groups.

- Add a context menu entry for each player to manage its sync groups,
  initially disabled.

- Enable the context menu entry if more than one player is connected.

- Extend the service to support the commands for syncing two players
  together, and completely unsyncing a player.

- Provide a dialog that allows the user to select from the available
  sync groups, or break synchronisation, when selected from the context
  menu.
Use radio buttons for the list of sync groups.

The previous code presented a list where tapping an item would sync
the player with that group immediately.

This code presents each item with a radio button, and includes "OK"
and "Cancel" buttons so that the user has more control if they
fat-finger the list.
Use gradle 2.1, and version 0.14.0 of the Gradle plugin.

(cherry picked from commit 9adfd8ba1f7e0d07116bf36beae0bc7b2d9eed6c)