This PR fixes some issues with connections and threading. Specifically, the change in #618 introduced threading in `HostConnection`, which had some issues. To fix them, the following changes were made:
- A specific TCP listener thread is used and manually started, instead of using one of the threads in the pool. The TCP listener thread is a long lived thread that should always be running (as long as the connection is through TCP), blocked listening on the TCP socket, so it shouldn't be managed in a pool, where, theoretically, it can be paused and reused.
- Changed the number of threads to 5. We shouldn't need more than this, otherwise we can overwhelm some Kodi hardware.
- Had to sprinkle some `synchronized` to avoid race conditions. For instance, through a TCP connection, as soon as Kore is opened (on the remote screen) it will call at least `GetActivePlayers`, `GetProperties`, `Ping`. If the TCP socket isn't set up yet, each of these calls would create a socket (and a TCP listener thread), so we would open 3 or more sockets when we should just open 1. A `synchronized` in `executeThroughTcp` prevents this. The others prevent similar issues.
Aditionally:
- Tweaked the playlist fetching code, so that it happens exclusively in `HostConnectionObserver` and when PlaylistFragment is notified of changes, it already gets the playlist data. This somewhat simplifies the code, and makes it more consistent with the Player Observer code;
- Change `EventServerConnection` to accept a Handler on which to post the result of the connection, so that the caller can control on which thread the result is called;
- Calls to the various `RegisterObserver` loose the reply immediately parameter, as it was always true.
Implemented showing a music/video/picture playlist in PlaylistFragment even
when playback has stopped but the playlist is still available on Kodi.
The playlist is now only cleared if the Playlist.OnClear event is received
from Kodi.
As the pictures playlist does not support moving/removing items this has
been disabled for the pictures playlist only.
Added a new package org.xbmc.kore.host.actions to hold all Callable's that
we use to handle complex interactions with Kodi that use multiple JSON RPC
calls.
Fixed issue in HostConnectionObserver in method notifySomethingIsPlaying
where hostState.lastGetItemResult.label might not be set.
Reduced calling (force)refreshPlaylist considerably as it should now be
handled by the playlist observer.
As detailed in https://github.com/xbmc/xbmc/pull/13051, Kodi v18 changes the way album genres are handled, as the genre (by which i mean `genreId`) ceases to be available at the album level, being only available at the songs level.
This impacts Kore because `GetAlbums` and `GetAlbumDetails` won't return the `genreId` tag, from which the local AlbumGenres table was populated.
This PR changes the source of the local AlbumGenres table to be the `genreId` returned at the song level (by `GetSongs`), to make it somewhat more consistent with the way Kodi will handle things from now on.
* Implemented a new widget "fabspeeddial"
* Provides user with two options to play the media item. One
option to play the item on Kodi, one to play it on the remote.
* Replaced deprecated FAB button from
com.melnykov:floatingactionbutton:1.3.0 with the FAB button from
the design library
* Implemented a busy indicator (pulsate) when fab button is clicked
and JSON API method is still pending
* Added a setting to allow the user to disable local playback and
revert back to the old behaviour
* Refactored AbstractFragmentInfo
* Replaced RelativeLayout by CoordinatorLayout to support
hiding/showing the FAB button when scrolling
* Replaced the tree view observer to fade out art view when scrolling
with a behavior for the CoordinaterLayout
* Removed empty theme file for v19
* Refactored HostConnection to allow new activities to attach its
callbacks to any pending ApiMethod. This is required to support device
configuration changes.
- added method to HostConnection that returns a Future object instead of
taking a callback.
- added logic for handling null Handlers in HostConnection methods
- added method to HostManager to run a function that takes a HostConnection
in a background thread where the Future API results above can be
synchronously composed.
- replaced chain of callbacks in RemoteActivity with a sequence of
future gets in OpenSharedUrl.
* The slideup panel is only displayed when something is
playing. It starts collapsed showing the media poster
and title of what is currently playing.
* Media controls implemented are volume, progress, shuffle,
repeat and play/pause for all items. Next and previous are only
available when a music item is playing.
* In collapsed mode the panel will display the mute button only
if Kodi is muted. The mute button in expanded mode is always
visible.
* Panel is enabled by default. Users can disable the panel
in Settings
* Implemented listening to Player.OnPropertyChanged notifications
to update shuffle and repeat button states.
* Allow specifying HTTPS Hosts manually
This is not exposed in the UI, but on the manual host configuration screen, if the address starts with a "http://" or "https://" this will be stripped and the `isHttps` flag set appropriately.
Additionally, the port can be configured as part of the address as well.
Any port specified as part of the address takes precedence over the explicit HTTP port box, to allow easy copy-pasting of an entire URL for a host.
This enables using Kore with Kodi instances available though HTTPS (e.g. via a reverse proxy).