Always try and order pages, catching HandshakeNotCompleteException as
necessary.

The previous code could crash if the handshake had completed at least
once in the activity's lifetime.

Rather than try and track the handshake status in the activity, catch
the exception and try again in onHandshakeCompleted.
Fix null pointer exceptions when updating the ongoing notification.

- Refactor the scrobbling code in to Scrobble.java.

- Check that objects are non-null before operating on them.
Remove duplicate entries from the release instructions.
Prepare for release 1.2.1.
Merge branch 'release-1.2.1' into develop
Mark mHandshakeComplete as volatile.

Fixes an issue where the handshake can complete in one thread and
mHandshakeComplete is set to true, but then callbacks do work in
another thread and mHandshakeComplete is still false.
Fix a crash when musicfolder items do not have URLs.

At least one server in the wild does not return URLs for musicfolder
queries when asked.
Fix an NPE in SqueezeService.getCurrentPlaylist().

- Check for null playerState, return null in that case.

- Note that the currentPlaylist is normally a string, so if
  getCurrentPlaylist returns null it indicates a special condition.

- Use this in CurrentPlaylistActivity to affect the visibility of
  menu items for managing the playlist. Make sure the options menu
  is regenerated when player information changes.

- Add annotations for nullity in relevant locations.
Fix NPE in SqueezeService.isPlaying().
Save the LMS version number to Crashlytics if there's a crash.
Prepare for release 1.2.2.
Merge branch 'release-1.2.2' into develop
Fix exception from calling updateUIFromServiceState() before the
handshake completed.
Remove possibility of ordering the same page multiple times pre-handshake.

- Check mOrderedPagesBeforeHandshake for the requested page in
  maybeOrderPage(), and if the page is there then there's no need to
  request it again.
Fix HandshakeNotCompleteExceptions by moving setAdapter() calls.

Calling setAdapter triggers a layout measure pass, and the measure
pass ends up calling getView(), which can call through to the service
to request the album art URL, which only works after the handshake
is complete.

Where setAdapater() calls were happening in the onCreate() or
onServiceConnected() methods, create a handshake callback and set the
adapter there.
Hash the player ID to generate a long identifier for it.

Converting the MAC address to a long does not work for players that do
not use the MAC address as their identifier.
Wrap the trackname TextView in a LinearLayout.

Without this, changing the contents of any other item in the layout will
cause the layout to reflow, which causes the scrolling marquee text to
reset.  Wrapping the trackname TextView in a LinearLayout means that the
TextView will not change size when then the layout is recalculated, and
the text continues to scroll.
Fix an IndexOutOfBoundsException.

Caused by opening a player's context menu and then the player
disconnects.
Fix inverted logic error showing playlist option menu items.
Ensure the context_menu is below the track_wrapper.