Refine CurrentPlaylistActivity actionbar items.

- Don't show the item to go to CurrentPlaylistActivity if in
  CurrentPlaylistActivity.

- Put the "Clear" and "Save" playlist items first so they are readily
  available.
Merge branch 'lint' into develop

* lint:
  Use Guava's MD5 hash and hash-to-string functions.
  Add a unit test for ImageCache.hashKeyForDisk().
  Use the enhanced for-loop syntax.
  Remove unnecessary null check for wifiLock.
  Remove an unnecessary null check.
  Remove unnecessary " extends Object".
  Remove unused imports.
  Mark variables that can be marked as final.
Use 'com.android.application' as the Android Gradle plugin.
Update to Guava 17.0.0.
Use v20 of the Support and AppCompat libraries.
Start supporting apps.

- Show the Apps menu in the Home activity.

- List the things an app can do when it's selected.
Support plugins that return "networkerror".

- Implement a dialog fragment that can display the error from the plugin.

- Show the dialog if the plugin returns "networkerror".
Implement "My Apps" support using the MyApps plugin, not the "apps" command.

The "My Apps" plugin returns apps that have been installed via
mysqueezebox.com, which appears to match the behaviour of other remote
control apps and the web UI on the server.

- The individual apps are returned as plugin items, so adjust the classes
  that ApplicationListActivity and ApplicationView inherit from.

- Add a new MY_APPS plugin type to request and manage the information.
Track whether the server supports "Favorites" and "My Apps".

- Add handshake tests for "favorites" and "myapps" support.

- Store this information in the ConnectionState.

- Use it to control the item visibility in HomeActivity.
Fix bug where the current song information might be lost on fragment pause.

When NowPlayingFragment pauses (device rotation, moving to another activity,
etc) updatePlayerSubscriptionState() is called. This realised that there
were no clients that cared about second-to-second updates connected to the
service, so unsubscribed from status updates.

The unsubscription command did not use the same set of tags as the subscribe
command. So when the server responded to the unsubscribe command the response
contained less data. In particular, the artwork URL was missing.

The service would receive the response, parse it (with missing artwork URL)
and update the information about the currently playing song, including
setting the artwork URL to null.

Then NowPlayingFragment would resume and use the song info to load the
song artwork. But the artwork URL is null, so the generic art was loaded
instead.

Then the service re-subscribes to status updates, including being advised
of the song's URL.  A second or so later a new status update comes in
(including the song's URL) but because the rest of the song info hasn't
changed this is considered to be the same song, so the displayed information
is not refreshed.

Fix this by sending the same set of tags when unsubscribing from status
updates as when subscribing, to ensure that the information is consistent.
Fix bug where the current song information might be lost on fragment pause.

When NowPlayingFragment pauses (device rotation, moving to another activity,
etc) updatePlayerSubscriptionState() is called. This realised that there
were no clients that cared about second-to-second updates connected to the
service, so unsubscribed from status updates.

The unsubscription command did not use the same set of tags as the subscribe
command. So when the server responded to the unsubscribe command the response
contained less data. In particular, the artwork URL was missing.

The service would receive the response, parse it (with missing artwork URL)
and update the information about the currently playing song, including
setting the artwork URL to null.

Then NowPlayingFragment would resume and use the song info to load the
song artwork. But the artwork URL is null, so the generic art was loaded
instead.

Then the service re-subscribes to status updates, including being advised
of the song's URL.  A second or so later a new status update comes in
(including the song's URL) but because the rest of the song info hasn't
changed this is considered to be the same song, so the displayed information
is not refreshed.

Fix this by sending the same set of tags when unsubscribing from status
updates as when subscribing, to ensure that the information is consistent.
Update NEWS with "My Apps" support, fix a typo.
Dim and inactivate next/prev buttons for remote songs.
Handle songs from streaming services with identical IDs.

A streaming service might return a stream with an unchanging song ID, and
then update the title, artist, artwork URL, and other information.

Because the ID does not change Squeezer considered these to be identical
songs and didn't update the display in NowPlayingFragment when the track
changed.

Fix this by extending the equality test to consider additional fields, and
add tests for this.

While in this code remove unecessary setters, refactor member names, and
add annotations indicating whether or not values can be null.
Show the pause button in the layout tools.
Make the button visible in the layout editor.
Add additional info about working on Squeezer.

- Subscribing to the group.
- Forking the repository.
- Checking out and working on a branch.
- Rebasing on develop.
Simplify the player list.

- Remove the power button item, move it to the menu.

- Use a RelativeLayout
Merge branch 'apps' into develop

* apps:
  Handle songs from streaming services with identical IDs.
  Dim and inactivate next/prev buttons for remote songs.
  Update NEWS with "My Apps" support, fix a typo.
  Fix bug where the current song information might be lost on fragment pause.
  Track whether the server supports "Favorites" and "My Apps".
  Implement "My Apps" support using the MyApps plugin, not the "apps" command.
  Support plugins that return "networkerror".
  Start supporting apps.

Conflicts:
	Squeezer/src/main/res/values/strings.xml
Use Util.setAlpha() instead of View.setAlpha().