Correct a method name in a log string.
Merge branch 'develop' of https://github.com/nikclayton/android-squeezer into develop
WIP: Support different themes for the UI.

Start by supporting the existing "Theme.AppCompat" and
"Theme.AppCompat.Light.DarkActionBar" themes.

- Implement a preference for the user's choice of theme ("squeezer.theme")
  and a ListPreference in the UI to show it to the user.

- Update BaseActivity to deal with theme changes at runtime.

- Add drawables for holo light versions of the AV player controls.

- Use styleable attributes to refer to the drawables, and update everything
  that referred to the drawable to use the attribute instead, so that the
  the drawable appropriate for the theme is used.
Ensure the actionbar spinner drop downs follow the applied theme.

Prior to this change they had the incorrect colour on the light +
dark action bar theme.

- Adjust Util.getSpinnerItemView and getActionBarSpinnerItemView to
  take a Context parameter instead of an Activity. Use the context to
  fetch the layout inflater. This ensures the layout inflater uses the
  correct theme.

- Pass the ArrayAdapter's context as the parameter for the actionbar.

As the ArrayAdapter's context comes from actionBar.getThemedContext()
this ensures that the correct theme is used.
Refactor theme management code for ease of use with other activities.

- Move the code in to its own ThemeManager class.

- Call the ThemeManager from SettingsActivity so it follows the theme.
Style the current playlist list correctly.

- Highlight the currently playing item using abc_light_pressed_*
  drawables from appcompat.v7.

- Use the normal android background colour for un-highlighted items.

This uses the correct colours for the selected style.
Move the Theme enum and default values into the ThemeManager.
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.
Ensure the text on the volume display panel is legible.

As the panel always has a dark background ensure that the text colour
is Android's primary/secondary colours for dark backgrounds.

Without this the theme-specific colours are chosen, and when the theme
is Light.DarkActionBar the theme colour is black/dark-grey.
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 'release-1.1.1' into develop

* release-1.1.1:
  Prepare for release 1.1.1.
Merge branch 'develop' into player-groups
Merge remote-tracking branch 'origin/develop' into player-groups