mirror of
https://github.com/clangen/musikcube.git
synced 2025-02-11 09:40:26 +00:00
Some renames I've been wanting to do for a while, but was dragging my
feet. In musikcube/musikcore: * ISimpleDataProvider -> IMetadataProxy * LocalSimpleDataProvider -> LocalMetadataProxy In musikdroid: * IDataProvider -> IMetadataProxy * RemoteDataProvider -> RemoteMetadataProxy * DataProviderMixin -> MetadataProxyMixin
This commit is contained in:
parent
ceed5a1c73
commit
37cd0da85f
@ -1,3 +1,21 @@
|
|||||||
|
0.65.2
|
||||||
|
|
||||||
|
musikcube:
|
||||||
|
* updated `ru_RU` locale (adem4ik)
|
||||||
|
|
||||||
|
musikcore:
|
||||||
|
* renamed some classes:
|
||||||
|
* `ISimpleDataProvider` -> `IMetadataProxy`
|
||||||
|
* `LocalSimpleDataProvider` -> `LocalMetadataProxy`
|
||||||
|
|
||||||
|
musikdroid:
|
||||||
|
* renamed some classes:
|
||||||
|
* `IDataProvider` -> `IMetadataProxy`
|
||||||
|
* `RemoteDataProvider` -> `RemoteMetadataProxy`
|
||||||
|
* `DataProviderMixin` -> `MetadataProxyMixin`
|
||||||
|
|
||||||
|
--------------------------------------------------------------------------------
|
||||||
|
|
||||||
0.65.1
|
0.65.1
|
||||||
|
|
||||||
musikcube:
|
musikcube:
|
||||||
|
@ -20,7 +20,7 @@ set(CORE_SOURCES
|
|||||||
./library/Indexer.cpp
|
./library/Indexer.cpp
|
||||||
./library/LibraryFactory.cpp
|
./library/LibraryFactory.cpp
|
||||||
./library/LocalLibrary.cpp
|
./library/LocalLibrary.cpp
|
||||||
./library/LocalSimpleDataProvider.cpp
|
./library/LocalMetadataProxy.cpp
|
||||||
./library/query/local/AlbumListQuery.cpp
|
./library/query/local/AlbumListQuery.cpp
|
||||||
./library/query/local/AllCategoriesQuery.cpp
|
./library/query/local/AllCategoriesQuery.cpp
|
||||||
./library/query/local/AppendPlaylistQuery.cpp
|
./library/query/local/AppendPlaylistQuery.cpp
|
||||||
|
@ -104,7 +104,7 @@
|
|||||||
<ClCompile Include="library\Indexer.cpp" />
|
<ClCompile Include="library\Indexer.cpp" />
|
||||||
<ClCompile Include="library\LocalLibrary.cpp" />
|
<ClCompile Include="library\LocalLibrary.cpp" />
|
||||||
<ClCompile Include="library\LibraryFactory.cpp" />
|
<ClCompile Include="library\LibraryFactory.cpp" />
|
||||||
<ClCompile Include="library\LocalSimpleDataProvider.cpp" />
|
<ClCompile Include="library\LocalMetadataProxy.cpp" />
|
||||||
<ClCompile Include="library\metadata\MetadataMap.cpp" />
|
<ClCompile Include="library\metadata\MetadataMap.cpp" />
|
||||||
<ClCompile Include="library\metadata\MetadataMapList.cpp" />
|
<ClCompile Include="library\metadata\MetadataMapList.cpp" />
|
||||||
<ClCompile Include="library\query\local\AlbumListQuery.cpp" />
|
<ClCompile Include="library\query\local\AlbumListQuery.cpp" />
|
||||||
@ -171,7 +171,7 @@
|
|||||||
<ClInclude Include="library\LocalLibrary.h" />
|
<ClInclude Include="library\LocalLibrary.h" />
|
||||||
<ClInclude Include="library\LibraryFactory.h" />
|
<ClInclude Include="library\LibraryFactory.h" />
|
||||||
<ClInclude Include="library\LocalLibraryConstants.h" />
|
<ClInclude Include="library\LocalLibraryConstants.h" />
|
||||||
<ClInclude Include="library\LocalSimpleDataProvider.h" />
|
<ClInclude Include="library\LocalMetadataProxy.h" />
|
||||||
<ClInclude Include="library\metadata\MetadataMap.h" />
|
<ClInclude Include="library\metadata\MetadataMap.h" />
|
||||||
<ClInclude Include="library\metadata\MetadataMapList.h" />
|
<ClInclude Include="library\metadata\MetadataMapList.h" />
|
||||||
<ClInclude Include="library\query\local\AlbumListQuery.h" />
|
<ClInclude Include="library\query\local\AlbumListQuery.h" />
|
||||||
@ -241,7 +241,7 @@
|
|||||||
<ClInclude Include="audio\Player.h" />
|
<ClInclude Include="audio\Player.h" />
|
||||||
<ClInclude Include="audio\Stream.h" />
|
<ClInclude Include="audio\Stream.h" />
|
||||||
<ClInclude Include="sdk\IPreferences.h" />
|
<ClInclude Include="sdk\IPreferences.h" />
|
||||||
<ClInclude Include="sdk\ISimpleDataProvider.h" />
|
<ClInclude Include="sdk\IMetadataProxy.h" />
|
||||||
<ClInclude Include="sdk\ISpectrumVisualizer.h" />
|
<ClInclude Include="sdk\ISpectrumVisualizer.h" />
|
||||||
<ClInclude Include="sdk\ITrack.h" />
|
<ClInclude Include="sdk\ITrack.h" />
|
||||||
<ClInclude Include="sdk\ITrackList.h" />
|
<ClInclude Include="sdk\ITrackList.h" />
|
||||||
|
@ -175,9 +175,6 @@
|
|||||||
<ClCompile Include="library\query\local\CategoryListQuery.cpp">
|
<ClCompile Include="library\query\local\CategoryListQuery.cpp">
|
||||||
<Filter>src\library\query\local</Filter>
|
<Filter>src\library\query\local</Filter>
|
||||||
</ClCompile>
|
</ClCompile>
|
||||||
<ClCompile Include="library\LocalSimpleDataProvider.cpp">
|
|
||||||
<Filter>src\library</Filter>
|
|
||||||
</ClCompile>
|
|
||||||
<ClCompile Include="plugin\Plugins.cpp">
|
<ClCompile Include="plugin\Plugins.cpp">
|
||||||
<Filter>src\plugin</Filter>
|
<Filter>src\plugin</Filter>
|
||||||
</ClCompile>
|
</ClCompile>
|
||||||
@ -229,6 +226,9 @@
|
|||||||
<ClCompile Include="support\Auddio.cpp">
|
<ClCompile Include="support\Auddio.cpp">
|
||||||
<Filter>src\support</Filter>
|
<Filter>src\support</Filter>
|
||||||
</ClCompile>
|
</ClCompile>
|
||||||
|
<ClCompile Include="library\LocalMetadataProxy.cpp">
|
||||||
|
<Filter>src\library</Filter>
|
||||||
|
</ClCompile>
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<ClInclude Include="pch.hpp">
|
<ClInclude Include="pch.hpp">
|
||||||
@ -390,9 +390,6 @@
|
|||||||
<ClInclude Include="Library\query\local\LocalQueryBase.h">
|
<ClInclude Include="Library\query\local\LocalQueryBase.h">
|
||||||
<Filter>src\library\query\local</Filter>
|
<Filter>src\library\query\local</Filter>
|
||||||
</ClInclude>
|
</ClInclude>
|
||||||
<ClInclude Include="library\LocalSimpleDataProvider.h">
|
|
||||||
<Filter>src\library</Filter>
|
|
||||||
</ClInclude>
|
|
||||||
<ClInclude Include="plugin\Plugins.h">
|
<ClInclude Include="plugin\Plugins.h">
|
||||||
<Filter>src\plugin</Filter>
|
<Filter>src\plugin</Filter>
|
||||||
</ClInclude>
|
</ClInclude>
|
||||||
@ -447,9 +444,6 @@
|
|||||||
<ClInclude Include="sdk\ISpectrumVisualizer.h">
|
<ClInclude Include="sdk\ISpectrumVisualizer.h">
|
||||||
<Filter>src\sdk\vis</Filter>
|
<Filter>src\sdk\vis</Filter>
|
||||||
</ClInclude>
|
</ClInclude>
|
||||||
<ClInclude Include="sdk\ISimpleDataProvider.h">
|
|
||||||
<Filter>src\sdk\metadata</Filter>
|
|
||||||
</ClInclude>
|
|
||||||
<ClInclude Include="sdk\IPlaybackRemote.h">
|
<ClInclude Include="sdk\IPlaybackRemote.h">
|
||||||
<Filter>src\sdk\audio</Filter>
|
<Filter>src\sdk\audio</Filter>
|
||||||
</ClInclude>
|
</ClInclude>
|
||||||
@ -555,5 +549,11 @@
|
|||||||
<ClInclude Include="support\Auddio.h">
|
<ClInclude Include="support\Auddio.h">
|
||||||
<Filter>src\support</Filter>
|
<Filter>src\support</Filter>
|
||||||
</ClInclude>
|
</ClInclude>
|
||||||
|
<ClInclude Include="sdk\IMetadataProxy.h">
|
||||||
|
<Filter>src\sdk\metadata</Filter>
|
||||||
|
</ClInclude>
|
||||||
|
<ClInclude Include="library\LocalMetadataProxy.h">
|
||||||
|
<Filter>src\library</Filter>
|
||||||
|
</ClInclude>
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
</Project>
|
</Project>
|
@ -98,28 +98,3 @@ DataStreamPtr DataStreamFactory::OpenSharedDataStream(const char *uri) {
|
|||||||
auto stream = OpenDataStream(uri);
|
auto stream = OpenDataStream(uri);
|
||||||
return stream ? DataStreamPtr(stream, StreamDeleter()) : DataStreamPtr();
|
return stream ? DataStreamPtr(stream, StreamDeleter()) : DataStreamPtr();
|
||||||
}
|
}
|
||||||
|
|
||||||
bool DataStreamFactory::IsLocalFileStream(const char *uri) {
|
|
||||||
if (uri) {
|
|
||||||
/* see if a plugin can handle this. if it can, then it's not
|
|
||||||
considered to be a local file stream */
|
|
||||||
DataStreamFactoryVector::iterator it =
|
|
||||||
DataStreamFactory::Instance()->dataStreamFactories.begin();
|
|
||||||
|
|
||||||
for( ; it != DataStreamFactory::Instance()->dataStreamFactories.end(); ++it) {
|
|
||||||
if ((*it)->CanRead(uri)) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/* now test local filesystem */
|
|
||||||
boost::filesystem::path filename(uri);
|
|
||||||
try {
|
|
||||||
return boost::filesystem::exists(filename);
|
|
||||||
}
|
|
||||||
catch(...) {
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
@ -47,8 +47,6 @@ namespace musik { namespace core { namespace io {
|
|||||||
static DataStreamPtr OpenSharedDataStream(const char *uri);
|
static DataStreamPtr OpenSharedDataStream(const char *uri);
|
||||||
static musik::core::sdk::IDataStream* OpenDataStream(const char* uri);
|
static musik::core::sdk::IDataStream* OpenDataStream(const char* uri);
|
||||||
|
|
||||||
static bool IsLocalFileStream(const char *uri);
|
|
||||||
|
|
||||||
private:
|
private:
|
||||||
typedef std::vector<std::shared_ptr<musik::core::sdk::IDataStreamFactory> > DataStreamFactoryVector;
|
typedef std::vector<std::shared_ptr<musik::core::sdk::IDataStreamFactory> > DataStreamFactoryVector;
|
||||||
|
|
||||||
|
@ -33,7 +33,7 @@
|
|||||||
//////////////////////////////////////////////////////////////////////////////
|
//////////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
#include "pch.hpp"
|
#include "pch.hpp"
|
||||||
#include "LocalSimpleDataProvider.h"
|
#include "LocalMetadataProxy.h"
|
||||||
|
|
||||||
#include <core/debug.h>
|
#include <core/debug.h>
|
||||||
#include <core/db/ScopedTransaction.h>
|
#include <core/db/ScopedTransaction.h>
|
||||||
@ -56,7 +56,7 @@
|
|||||||
#include <vector>
|
#include <vector>
|
||||||
#include <map>
|
#include <map>
|
||||||
|
|
||||||
#define TAG "LocalSimpleDataProvider"
|
#define TAG "LocalMetadataProxy"
|
||||||
|
|
||||||
using namespace musik::core;
|
using namespace musik::core;
|
||||||
using namespace musik::core::db;
|
using namespace musik::core::db;
|
||||||
@ -284,16 +284,16 @@ class RemoveFromPlaylistQuery : public LocalQueryBase {
|
|||||||
|
|
||||||
/* DATA PROVIDER */
|
/* DATA PROVIDER */
|
||||||
|
|
||||||
LocalSimpleDataProvider::LocalSimpleDataProvider(musik::core::ILibraryPtr library)
|
LocalMetadataProxy::LocalMetadataProxy(musik::core::ILibraryPtr library)
|
||||||
: library(library) {
|
: library(library) {
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
LocalSimpleDataProvider::~LocalSimpleDataProvider() {
|
LocalMetadataProxy::~LocalMetadataProxy() {
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
ITrackList* LocalSimpleDataProvider::QueryTracks(const char* query, int limit, int offset) {
|
ITrackList* LocalMetadataProxy::QueryTracks(const char* query, int limit, int offset) {
|
||||||
try {
|
try {
|
||||||
std::shared_ptr<SearchTrackListQuery> search(
|
std::shared_ptr<SearchTrackListQuery> search(
|
||||||
new SearchTrackListQuery(this->library, std::string(query ? query : "")));
|
new SearchTrackListQuery(this->library, std::string(query ? query : "")));
|
||||||
@ -315,7 +315,7 @@ ITrackList* LocalSimpleDataProvider::QueryTracks(const char* query, int limit, i
|
|||||||
return nullptr;
|
return nullptr;
|
||||||
}
|
}
|
||||||
|
|
||||||
ITrack* LocalSimpleDataProvider::QueryTrackById(int64_t trackId) {
|
ITrack* LocalMetadataProxy::QueryTrackById(int64_t trackId) {
|
||||||
try {
|
try {
|
||||||
TrackPtr target(new LibraryTrack(trackId, this->library));
|
TrackPtr target(new LibraryTrack(trackId, this->library));
|
||||||
|
|
||||||
@ -335,7 +335,7 @@ ITrack* LocalSimpleDataProvider::QueryTrackById(int64_t trackId) {
|
|||||||
return nullptr;
|
return nullptr;
|
||||||
}
|
}
|
||||||
|
|
||||||
ITrack* LocalSimpleDataProvider::QueryTrackByExternalId(const char* externalId) {
|
ITrack* LocalMetadataProxy::QueryTrackByExternalId(const char* externalId) {
|
||||||
if (strlen(externalId)) {
|
if (strlen(externalId)) {
|
||||||
try {
|
try {
|
||||||
TrackPtr target(new LibraryTrack(0, this->library));
|
TrackPtr target(new LibraryTrack(0, this->library));
|
||||||
@ -358,7 +358,7 @@ ITrack* LocalSimpleDataProvider::QueryTrackByExternalId(const char* externalId)
|
|||||||
return nullptr;
|
return nullptr;
|
||||||
}
|
}
|
||||||
|
|
||||||
ITrackList* LocalSimpleDataProvider::QueryTracksByCategory(
|
ITrackList* LocalMetadataProxy::QueryTracksByCategory(
|
||||||
const char* categoryType, int64_t selectedId, const char* filter, int limit, int offset)
|
const char* categoryType, int64_t selectedId, const char* filter, int limit, int offset)
|
||||||
{
|
{
|
||||||
try {
|
try {
|
||||||
@ -394,7 +394,7 @@ ITrackList* LocalSimpleDataProvider::QueryTracksByCategory(
|
|||||||
return nullptr;
|
return nullptr;
|
||||||
}
|
}
|
||||||
|
|
||||||
ITrackList* LocalSimpleDataProvider::QueryTracksByCategories(
|
ITrackList* LocalMetadataProxy::QueryTracksByCategories(
|
||||||
IValue** categories, size_t categoryCount, const char* filter, int limit, int offset)
|
IValue** categories, size_t categoryCount, const char* filter, int limit, int offset)
|
||||||
{
|
{
|
||||||
try {
|
try {
|
||||||
@ -419,11 +419,11 @@ ITrackList* LocalSimpleDataProvider::QueryTracksByCategories(
|
|||||||
return nullptr;
|
return nullptr;
|
||||||
}
|
}
|
||||||
|
|
||||||
IValueList* LocalSimpleDataProvider::QueryCategory(const char* type, const char* filter) {
|
IValueList* LocalMetadataProxy::QueryCategory(const char* type, const char* filter) {
|
||||||
return QueryCategoryWithPredicate(type, "", -1LL, filter);
|
return QueryCategoryWithPredicate(type, "", -1LL, filter);
|
||||||
}
|
}
|
||||||
|
|
||||||
IValueList* LocalSimpleDataProvider::ListCategories() {
|
IValueList* LocalMetadataProxy::ListCategories() {
|
||||||
try {
|
try {
|
||||||
auto query = std::make_shared<AllCategoriesQuery>();
|
auto query = std::make_shared<AllCategoriesQuery>();
|
||||||
this->library->Enqueue(query, ILibrary::QuerySynchronous);
|
this->library->Enqueue(query, ILibrary::QuerySynchronous);
|
||||||
@ -440,7 +440,7 @@ IValueList* LocalSimpleDataProvider::ListCategories() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
IValueList* LocalSimpleDataProvider::QueryCategoryWithPredicate(
|
IValueList* LocalMetadataProxy::QueryCategoryWithPredicate(
|
||||||
const char* type, const char* predicateType, int64_t predicateId, const char* filter)
|
const char* type, const char* predicateType, int64_t predicateId, const char* filter)
|
||||||
{
|
{
|
||||||
try {
|
try {
|
||||||
@ -465,7 +465,7 @@ IValueList* LocalSimpleDataProvider::QueryCategoryWithPredicate(
|
|||||||
return nullptr;
|
return nullptr;
|
||||||
}
|
}
|
||||||
|
|
||||||
IValueList* LocalSimpleDataProvider::QueryCategoryWithPredicates(
|
IValueList* LocalMetadataProxy::QueryCategoryWithPredicates(
|
||||||
const char* type, IValue** predicates, size_t predicateCount, const char* filter)
|
const char* type, IValue** predicates, size_t predicateCount, const char* filter)
|
||||||
{
|
{
|
||||||
try {
|
try {
|
||||||
@ -487,7 +487,7 @@ IValueList* LocalSimpleDataProvider::QueryCategoryWithPredicates(
|
|||||||
return nullptr;
|
return nullptr;
|
||||||
}
|
}
|
||||||
|
|
||||||
IMapList* LocalSimpleDataProvider::QueryAlbums(
|
IMapList* LocalMetadataProxy::QueryAlbums(
|
||||||
const char* categoryIdName, int64_t categoryIdValue, const char* filter)
|
const char* categoryIdName, int64_t categoryIdValue, const char* filter)
|
||||||
{
|
{
|
||||||
try {
|
try {
|
||||||
@ -509,7 +509,7 @@ IMapList* LocalSimpleDataProvider::QueryAlbums(
|
|||||||
return nullptr;
|
return nullptr;
|
||||||
}
|
}
|
||||||
|
|
||||||
IMapList* LocalSimpleDataProvider::QueryAlbums(const char* filter) {
|
IMapList* LocalMetadataProxy::QueryAlbums(const char* filter) {
|
||||||
return this->QueryAlbums(nullptr, -1, filter);
|
return this->QueryAlbums(nullptr, -1, filter);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -561,7 +561,7 @@ static uint64_t savePlaylist(
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
int64_t LocalSimpleDataProvider::SavePlaylistWithIds(
|
int64_t LocalMetadataProxy::SavePlaylistWithIds(
|
||||||
int64_t* trackIds,
|
int64_t* trackIds,
|
||||||
size_t trackIdCount,
|
size_t trackIdCount,
|
||||||
const char* playlistName,
|
const char* playlistName,
|
||||||
@ -577,7 +577,7 @@ int64_t LocalSimpleDataProvider::SavePlaylistWithIds(
|
|||||||
return savePlaylist(this->library, trackList, playlistName, playlistId);
|
return savePlaylist(this->library, trackList, playlistName, playlistId);
|
||||||
}
|
}
|
||||||
|
|
||||||
int64_t LocalSimpleDataProvider::SavePlaylistWithExternalIds(
|
int64_t LocalMetadataProxy::SavePlaylistWithExternalIds(
|
||||||
const char** externalIds,
|
const char** externalIds,
|
||||||
size_t externalIdCount,
|
size_t externalIdCount,
|
||||||
const char* playlistName,
|
const char* playlistName,
|
||||||
@ -606,7 +606,7 @@ int64_t LocalSimpleDataProvider::SavePlaylistWithExternalIds(
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
int64_t LocalSimpleDataProvider::SavePlaylistWithTrackList(
|
int64_t LocalMetadataProxy::SavePlaylistWithTrackList(
|
||||||
ITrackList* trackList,
|
ITrackList* trackList,
|
||||||
const char* playlistName,
|
const char* playlistName,
|
||||||
const int64_t playlistId)
|
const int64_t playlistId)
|
||||||
@ -618,7 +618,7 @@ int64_t LocalSimpleDataProvider::SavePlaylistWithTrackList(
|
|||||||
return savePlaylist(this->library, trackList, playlistName, playlistId);
|
return savePlaylist(this->library, trackList, playlistName, playlistId);
|
||||||
}
|
}
|
||||||
|
|
||||||
bool LocalSimpleDataProvider::RenamePlaylist(const int64_t playlistId, const char* name)
|
bool LocalMetadataProxy::RenamePlaylist(const int64_t playlistId, const char* name)
|
||||||
{
|
{
|
||||||
if (strlen(name)) {
|
if (strlen(name)) {
|
||||||
try {
|
try {
|
||||||
@ -639,7 +639,7 @@ bool LocalSimpleDataProvider::RenamePlaylist(const int64_t playlistId, const cha
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool LocalSimpleDataProvider::DeletePlaylist(const int64_t playlistId) {
|
bool LocalMetadataProxy::DeletePlaylist(const int64_t playlistId) {
|
||||||
try {
|
try {
|
||||||
std::shared_ptr<DeletePlaylistQuery> query =
|
std::shared_ptr<DeletePlaylistQuery> query =
|
||||||
std::make_shared<DeletePlaylistQuery>(library, playlistId);
|
std::make_shared<DeletePlaylistQuery>(library, playlistId);
|
||||||
@ -682,7 +682,7 @@ static bool appendToPlaylist(
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool LocalSimpleDataProvider::AppendToPlaylistWithIds(
|
bool LocalMetadataProxy::AppendToPlaylistWithIds(
|
||||||
const int64_t playlistId,
|
const int64_t playlistId,
|
||||||
const int64_t* ids,
|
const int64_t* ids,
|
||||||
size_t idCount,
|
size_t idCount,
|
||||||
@ -694,7 +694,7 @@ bool LocalSimpleDataProvider::AppendToPlaylistWithIds(
|
|||||||
return appendToPlaylist(this->library, playlistId, trackList, offset);
|
return appendToPlaylist(this->library, playlistId, trackList, offset);
|
||||||
}
|
}
|
||||||
|
|
||||||
bool LocalSimpleDataProvider::AppendToPlaylistWithExternalIds(
|
bool LocalMetadataProxy::AppendToPlaylistWithExternalIds(
|
||||||
const int64_t playlistId,
|
const int64_t playlistId,
|
||||||
const char** externalIds,
|
const char** externalIds,
|
||||||
size_t externalIdCount,
|
size_t externalIdCount,
|
||||||
@ -720,7 +720,7 @@ bool LocalSimpleDataProvider::AppendToPlaylistWithExternalIds(
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
bool LocalSimpleDataProvider::AppendToPlaylistWithTrackList(
|
bool LocalMetadataProxy::AppendToPlaylistWithTrackList(
|
||||||
const int64_t playlistId, ITrackList* trackList, int offset)
|
const int64_t playlistId, ITrackList* trackList, int offset)
|
||||||
{
|
{
|
||||||
static auto deleter = [](musik::core::sdk::ITrackList* trackList) {};
|
static auto deleter = [](musik::core::sdk::ITrackList* trackList) {};
|
||||||
@ -731,7 +731,7 @@ bool LocalSimpleDataProvider::AppendToPlaylistWithTrackList(
|
|||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
size_t LocalSimpleDataProvider::RemoveTracksFromPlaylist(
|
size_t LocalMetadataProxy::RemoveTracksFromPlaylist(
|
||||||
const int64_t playlistId,
|
const int64_t playlistId,
|
||||||
const char** externalIds,
|
const char** externalIds,
|
||||||
const int* sortOrders,
|
const int* sortOrders,
|
||||||
@ -754,7 +754,7 @@ size_t LocalSimpleDataProvider::RemoveTracksFromPlaylist(
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
ITrackList* LocalSimpleDataProvider::QueryTracksByExternalId(
|
ITrackList* LocalMetadataProxy::QueryTracksByExternalId(
|
||||||
const char** externalIds, size_t externalIdCount)
|
const char** externalIds, size_t externalIdCount)
|
||||||
{
|
{
|
||||||
try {
|
try {
|
@ -35,15 +35,15 @@
|
|||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
#include <core/library/ILibrary.h>
|
#include <core/library/ILibrary.h>
|
||||||
#include <core/sdk/ISimpleDataProvider.h>
|
#include <core/sdk/IMetadataProxy.h>
|
||||||
|
|
||||||
namespace musik { namespace core { namespace db { namespace local {
|
namespace musik { namespace core { namespace db { namespace local {
|
||||||
|
|
||||||
class LocalSimpleDataProvider : public musik::core::sdk::ISimpleDataProvider {
|
class LocalMetadataProxy : public musik::core::sdk::IMetadataProxy {
|
||||||
public:
|
public:
|
||||||
LocalSimpleDataProvider(musik::core::ILibraryPtr library);
|
LocalMetadataProxy(musik::core::ILibraryPtr library);
|
||||||
|
|
||||||
virtual ~LocalSimpleDataProvider();
|
virtual ~LocalMetadataProxy();
|
||||||
|
|
||||||
virtual musik::core::sdk::ITrackList*
|
virtual musik::core::sdk::ITrackList*
|
||||||
QueryTracks(
|
QueryTracks(
|
@ -187,7 +187,7 @@ namespace musik { namespace core { namespace db { namespace local {
|
|||||||
"{{limit_and_offset}} ";
|
"{{limit_and_offset}} ";
|
||||||
|
|
||||||
/* ALBUM_LIST_QUERY is like a specialized REGULAR_PROPERTY_QUERY used by
|
/* ALBUM_LIST_QUERY is like a specialized REGULAR_PROPERTY_QUERY used by
|
||||||
LocalSimpleDataProvider to return album resources with thumbnail, artist,
|
LocalMetadataProxy to return album resources with thumbnail, artist,
|
||||||
and other supplementary information. */
|
and other supplementary information. */
|
||||||
|
|
||||||
static const std::string ALBUM_LIST_FILTER =
|
static const std::string ALBUM_LIST_FILTER =
|
||||||
|
@ -46,7 +46,7 @@
|
|||||||
#include <core/audio/Outputs.h>
|
#include <core/audio/Outputs.h>
|
||||||
#include <core/support/Preferences.h>
|
#include <core/support/Preferences.h>
|
||||||
#include <core/support/PreferenceKeys.h>
|
#include <core/support/PreferenceKeys.h>
|
||||||
#include <core/library/LocalSimpleDataProvider.h>
|
#include <core/library/LocalMetadataProxy.h>
|
||||||
#include <core/runtime/Message.h>
|
#include <core/runtime/Message.h>
|
||||||
#include <core/support/Messages.h>
|
#include <core/support/Messages.h>
|
||||||
|
|
||||||
@ -63,7 +63,7 @@ using namespace musik::core::sdk;
|
|||||||
|
|
||||||
typedef void(*SetEnvironment)(IEnvironment*);
|
typedef void(*SetEnvironment)(IEnvironment*);
|
||||||
typedef void(*SetDebug)(IDebug*);
|
typedef void(*SetDebug)(IDebug*);
|
||||||
typedef void(*SetSimpleDataProvider)(ISimpleDataProvider*);
|
typedef void(*SetMetadataProxy)(IMetadataProxy*);
|
||||||
typedef void(*SetIndexerNotifier)(IIndexerNotifier*);
|
typedef void(*SetIndexerNotifier)(IIndexerNotifier*);
|
||||||
|
|
||||||
static const std::string SUPEREQ_PLUGIN_GUID = "6f0ed53b-0f13-4220-9b0a-ca496b6421cc";
|
static const std::string SUPEREQ_PLUGIN_GUID = "6f0ed53b-0f13-4220-9b0a-ca496b6421cc";
|
||||||
@ -71,7 +71,7 @@ static const std::string SUPEREQ_PLUGIN_GUID = "6f0ed53b-0f13-4220-9b0a-ca496b64
|
|||||||
static IMessageQueue* messageQueue = nullptr;
|
static IMessageQueue* messageQueue = nullptr;
|
||||||
static ILibraryPtr library;
|
static ILibraryPtr library;
|
||||||
static IPlaybackService* playback = nullptr;
|
static IPlaybackService* playback = nullptr;
|
||||||
static LocalSimpleDataProvider* dataProvider = nullptr;
|
static LocalMetadataProxy* metadataProxy = nullptr;
|
||||||
static std::shared_ptr<Preferences> playbackPrefs;
|
static std::shared_ptr<Preferences> playbackPrefs;
|
||||||
|
|
||||||
static void saveEnvironment() {
|
static void saveEnvironment() {
|
||||||
@ -357,18 +357,18 @@ namespace musik { namespace core { namespace plugin {
|
|||||||
func(&debugger);
|
func(&debugger);
|
||||||
});
|
});
|
||||||
|
|
||||||
/* data providers */
|
/* metadata proxies */
|
||||||
delete dataProvider;
|
delete metadataProxy;
|
||||||
::messageQueue = messageQueue;
|
::messageQueue = messageQueue;
|
||||||
::library = library;
|
::library = library;
|
||||||
::playback = playback;
|
::playback = playback;
|
||||||
::dataProvider = new LocalSimpleDataProvider(library);
|
::metadataProxy = new LocalMetadataProxy(library);
|
||||||
::playbackPrefs = Preferences::ForComponent(prefs::components::Playback);
|
::playbackPrefs = Preferences::ForComponent(prefs::components::Playback);
|
||||||
|
|
||||||
PluginFactory::Instance().QueryFunction<SetSimpleDataProvider>(
|
PluginFactory::Instance().QueryFunction<SetMetadataProxy>(
|
||||||
"SetSimpleDataProvider",
|
"SetMetadataProxy",
|
||||||
[](musik::core::sdk::IPlugin* plugin, SetSimpleDataProvider func) {
|
[](musik::core::sdk::IPlugin* plugin, SetMetadataProxy func) {
|
||||||
func(dataProvider);
|
func(metadataProxy);
|
||||||
});
|
});
|
||||||
|
|
||||||
/* indexer */
|
/* indexer */
|
||||||
@ -394,15 +394,15 @@ namespace musik { namespace core { namespace plugin {
|
|||||||
Preferences::SavePluginPreferences();
|
Preferences::SavePluginPreferences();
|
||||||
|
|
||||||
/* data providers */
|
/* data providers */
|
||||||
PluginFactory::Instance().QueryFunction<SetSimpleDataProvider>(
|
PluginFactory::Instance().QueryFunction<SetMetadataProxy>(
|
||||||
"SetSimpleDataProvider",
|
"SetMetadataProxy",
|
||||||
[](musik::core::sdk::IPlugin* plugin, SetSimpleDataProvider func) {
|
[](musik::core::sdk::IPlugin* plugin, SetMetadataProxy func) {
|
||||||
func(nullptr);
|
func(nullptr);
|
||||||
});
|
});
|
||||||
|
|
||||||
delete dataProvider;
|
delete metadataProxy;
|
||||||
::messageQueue = nullptr;
|
::messageQueue = nullptr;
|
||||||
::dataProvider = nullptr;
|
::metadataProxy = nullptr;
|
||||||
::library.reset();
|
::library.reset();
|
||||||
::playback = nullptr;
|
::playback = nullptr;
|
||||||
::playbackPrefs.reset();
|
::playbackPrefs.reset();
|
||||||
|
@ -41,7 +41,7 @@
|
|||||||
|
|
||||||
namespace musik { namespace core { namespace sdk {
|
namespace musik { namespace core { namespace sdk {
|
||||||
|
|
||||||
class ISimpleDataProvider {
|
class IMetadataProxy {
|
||||||
public:
|
public:
|
||||||
virtual ITrackList* QueryTracks(
|
virtual ITrackList* QueryTracks(
|
||||||
const char* query = nullptr,
|
const char* query = nullptr,
|
@ -8,7 +8,7 @@ import io.casey.musikcube.remote.service.gapless.db.GaplessDb
|
|||||||
import io.casey.musikcube.remote.service.playback.impl.streaming.StreamProxy
|
import io.casey.musikcube.remote.service.playback.impl.streaming.StreamProxy
|
||||||
import io.casey.musikcube.remote.service.playback.impl.streaming.db.OfflineDb
|
import io.casey.musikcube.remote.service.playback.impl.streaming.db.OfflineDb
|
||||||
import io.casey.musikcube.remote.service.websocket.WebSocketService
|
import io.casey.musikcube.remote.service.websocket.WebSocketService
|
||||||
import io.casey.musikcube.remote.service.websocket.model.IDataProvider
|
import io.casey.musikcube.remote.service.websocket.model.IMetadataProxy
|
||||||
import io.casey.musikcube.remote.ui.settings.model.ConnectionsDb
|
import io.casey.musikcube.remote.ui.settings.model.ConnectionsDb
|
||||||
|
|
||||||
@ApplicationScope
|
@ApplicationScope
|
||||||
@ -22,6 +22,6 @@ interface AppComponent {
|
|||||||
fun offlineDb(): OfflineDb /* via DataModule */
|
fun offlineDb(): OfflineDb /* via DataModule */
|
||||||
fun gaplessDb(): GaplessDb /* via DataModule */
|
fun gaplessDb(): GaplessDb /* via DataModule */
|
||||||
fun connectionsDb(): ConnectionsDb /* via DataModule */
|
fun connectionsDb(): ConnectionsDb /* via DataModule */
|
||||||
fun dataProvider(): IDataProvider /* via DataModule */
|
fun metadataProxy(): IMetadataProxy /* via DataModule */
|
||||||
fun context(): Context /* via AppModule */
|
fun context(): Context /* via AppModule */
|
||||||
}
|
}
|
||||||
|
@ -7,30 +7,27 @@ import dagger.Provides
|
|||||||
import io.casey.musikcube.remote.service.gapless.db.GaplessDb
|
import io.casey.musikcube.remote.service.gapless.db.GaplessDb
|
||||||
import io.casey.musikcube.remote.service.playback.impl.streaming.db.OfflineDb
|
import io.casey.musikcube.remote.service.playback.impl.streaming.db.OfflineDb
|
||||||
import io.casey.musikcube.remote.service.websocket.WebSocketService
|
import io.casey.musikcube.remote.service.websocket.WebSocketService
|
||||||
import io.casey.musikcube.remote.service.websocket.model.IDataProvider
|
import io.casey.musikcube.remote.service.websocket.model.IMetadataProxy
|
||||||
import io.casey.musikcube.remote.service.websocket.model.impl.remote.RemoteDataProvider
|
import io.casey.musikcube.remote.service.websocket.model.impl.remote.RemoteMetadataProxy
|
||||||
import io.casey.musikcube.remote.ui.settings.model.ConnectionsDb
|
import io.casey.musikcube.remote.ui.settings.model.ConnectionsDb
|
||||||
|
|
||||||
@Module
|
@Module
|
||||||
class DataModule {
|
class DataModule {
|
||||||
@Provides
|
@Provides
|
||||||
fun providesDataProvider(wss: WebSocketService): IDataProvider = RemoteDataProvider(wss)
|
fun providesMetadataProxy(wss: WebSocketService): IMetadataProxy = RemoteMetadataProxy(wss)
|
||||||
|
|
||||||
@ApplicationScope
|
@ApplicationScope
|
||||||
@Provides
|
@Provides
|
||||||
fun providesOfflineDb(context: Context): OfflineDb {
|
fun providesOfflineDb(context: Context): OfflineDb =
|
||||||
return Room.databaseBuilder(context, OfflineDb::class.java, "offline").build()
|
Room.databaseBuilder(context, OfflineDb::class.java, "offline").build()
|
||||||
}
|
|
||||||
|
|
||||||
@ApplicationScope
|
@ApplicationScope
|
||||||
@Provides
|
@Provides
|
||||||
fun providesConnectionsDb(context: Context): ConnectionsDb {
|
fun providesConnectionsDb(context: Context): ConnectionsDb =
|
||||||
return Room.databaseBuilder(context, ConnectionsDb::class.java, "connections").build()
|
Room.databaseBuilder(context, ConnectionsDb::class.java, "connections").build()
|
||||||
}
|
|
||||||
|
|
||||||
@ApplicationScope
|
@ApplicationScope
|
||||||
@Provides
|
@Provides
|
||||||
fun providesGaplessDb(context: Context): GaplessDb {
|
fun providesGaplessDb(context: Context): GaplessDb =
|
||||||
return Room.databaseBuilder(context, GaplessDb::class.java, "gapless").build()
|
Room.databaseBuilder(context, GaplessDb::class.java, "gapless").build()
|
||||||
}
|
|
||||||
}
|
}
|
@ -16,7 +16,7 @@ import io.casey.musikcube.remote.ui.playqueue.fragment.PlayQueueFragment
|
|||||||
import io.casey.musikcube.remote.ui.settings.activity.*
|
import io.casey.musikcube.remote.ui.settings.activity.*
|
||||||
import io.casey.musikcube.remote.ui.shared.activity.BaseActivity
|
import io.casey.musikcube.remote.ui.shared.activity.BaseActivity
|
||||||
import io.casey.musikcube.remote.ui.shared.fragment.BaseFragment
|
import io.casey.musikcube.remote.ui.shared.fragment.BaseFragment
|
||||||
import io.casey.musikcube.remote.ui.shared.mixin.DataProviderMixin
|
import io.casey.musikcube.remote.ui.shared.mixin.MetadataProxyMixin
|
||||||
import io.casey.musikcube.remote.ui.shared.mixin.ItemContextMenuMixin
|
import io.casey.musikcube.remote.ui.shared.mixin.ItemContextMenuMixin
|
||||||
import io.casey.musikcube.remote.ui.shared.view.EmptyListView
|
import io.casey.musikcube.remote.ui.shared.view.EmptyListView
|
||||||
import io.casey.musikcube.remote.ui.tracks.activity.TrackListActivity
|
import io.casey.musikcube.remote.ui.tracks.activity.TrackListActivity
|
||||||
@ -50,7 +50,7 @@ interface ViewComponent {
|
|||||||
fun inject(view: EmptyListView)
|
fun inject(view: EmptyListView)
|
||||||
fun inject(view: MainMetadataView)
|
fun inject(view: MainMetadataView)
|
||||||
|
|
||||||
fun inject(mixin: DataProviderMixin)
|
fun inject(mixin: MetadataProxyMixin)
|
||||||
fun inject(mixin: ItemContextMenuMixin)
|
fun inject(mixin: ItemContextMenuMixin)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -10,7 +10,7 @@ import io.casey.musikcube.remote.service.playback.RepeatMode
|
|||||||
import io.casey.musikcube.remote.service.websocket.Messages
|
import io.casey.musikcube.remote.service.websocket.Messages
|
||||||
import io.casey.musikcube.remote.service.websocket.SocketMessage
|
import io.casey.musikcube.remote.service.websocket.SocketMessage
|
||||||
import io.casey.musikcube.remote.service.websocket.WebSocketService
|
import io.casey.musikcube.remote.service.websocket.WebSocketService
|
||||||
import io.casey.musikcube.remote.service.websocket.model.IDataProvider
|
import io.casey.musikcube.remote.service.websocket.model.IMetadataProxy
|
||||||
import io.casey.musikcube.remote.service.websocket.model.ITrack
|
import io.casey.musikcube.remote.service.websocket.model.ITrack
|
||||||
import io.casey.musikcube.remote.service.websocket.model.ITrackListQueryFactory
|
import io.casey.musikcube.remote.service.websocket.model.ITrackListQueryFactory
|
||||||
import io.casey.musikcube.remote.service.websocket.model.impl.remote.RemoteTrack
|
import io.casey.musikcube.remote.service.websocket.model.impl.remote.RemoteTrack
|
||||||
@ -95,7 +95,7 @@ class RemotePlaybackService : IPlaybackService {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Inject lateinit var wss: WebSocketService
|
@Inject lateinit var wss: WebSocketService
|
||||||
@Inject lateinit var dataProvider: IDataProvider
|
@Inject lateinit var metadataProxy: IMetadataProxy
|
||||||
|
|
||||||
private val handler = Handler()
|
private val handler = Handler()
|
||||||
private val listeners = HashSet<() -> Unit>()
|
private val listeners = HashSet<() -> Unit>()
|
||||||
@ -279,7 +279,7 @@ class RemotePlaybackService : IPlaybackService {
|
|||||||
|
|
||||||
if (listeners.size == 1) {
|
if (listeners.size == 1) {
|
||||||
wss.addClient(client)
|
wss.addClient(client)
|
||||||
dataProvider.attach()
|
metadataProxy.attach()
|
||||||
scheduleTimeSyncMessage()
|
scheduleTimeSyncMessage()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -289,7 +289,7 @@ class RemotePlaybackService : IPlaybackService {
|
|||||||
|
|
||||||
if (listeners.size == 0) {
|
if (listeners.size == 0) {
|
||||||
wss.removeClient(client)
|
wss.removeClient(client)
|
||||||
dataProvider.detach()
|
metadataProxy.detach()
|
||||||
handler.removeCallbacks(syncTimeRunnable)
|
handler.removeCallbacks(syncTimeRunnable)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -405,8 +405,8 @@ class RemotePlaybackService : IPlaybackService {
|
|||||||
get() = QueryContext(Messages.Request.QueryPlayQueueTracks)
|
get() = QueryContext(Messages.Request.QueryPlayQueueTracks)
|
||||||
|
|
||||||
override val playlistQueryFactory: ITrackListQueryFactory = object : ITrackListQueryFactory {
|
override val playlistQueryFactory: ITrackListQueryFactory = object : ITrackListQueryFactory {
|
||||||
override fun count(): Observable<Int> = dataProvider.getPlayQueueTracksCount()
|
override fun count(): Observable<Int> = metadataProxy.getPlayQueueTracksCount()
|
||||||
override fun page(offset: Int, limit: Int): Observable<List<ITrack>> = dataProvider.getPlayQueueTracks(limit, offset)
|
override fun page(offset: Int, limit: Int): Observable<List<ITrack>> = metadataProxy.getPlayQueueTracks(limit, offset)
|
||||||
override fun offline(): Boolean = false
|
override fun offline(): Boolean = false
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -16,7 +16,7 @@ import io.casey.musikcube.remote.service.playback.*
|
|||||||
import io.casey.musikcube.remote.service.playback.impl.remote.Metadata
|
import io.casey.musikcube.remote.service.playback.impl.remote.Metadata
|
||||||
import io.casey.musikcube.remote.service.system.SystemService
|
import io.casey.musikcube.remote.service.system.SystemService
|
||||||
import io.casey.musikcube.remote.service.websocket.Messages
|
import io.casey.musikcube.remote.service.websocket.Messages
|
||||||
import io.casey.musikcube.remote.service.websocket.model.IDataProvider
|
import io.casey.musikcube.remote.service.websocket.model.IMetadataProxy
|
||||||
import io.casey.musikcube.remote.service.websocket.model.ITrack
|
import io.casey.musikcube.remote.service.websocket.model.ITrack
|
||||||
import io.casey.musikcube.remote.service.websocket.model.ITrackListQueryFactory
|
import io.casey.musikcube.remote.service.websocket.model.ITrackListQueryFactory
|
||||||
import io.casey.musikcube.remote.service.websocket.model.PlayQueueType
|
import io.casey.musikcube.remote.service.websocket.model.PlayQueueType
|
||||||
@ -30,7 +30,7 @@ import java.util.*
|
|||||||
import javax.inject.Inject
|
import javax.inject.Inject
|
||||||
|
|
||||||
class StreamingPlaybackService(context: Context) : IPlaybackService {
|
class StreamingPlaybackService(context: Context) : IPlaybackService {
|
||||||
@Inject lateinit var dataProvider: IDataProvider
|
@Inject lateinit var metadataProxy: IMetadataProxy
|
||||||
|
|
||||||
private val prefs: SharedPreferences = context.getSharedPreferences(Prefs.NAME, Context.MODE_PRIVATE)
|
private val prefs: SharedPreferences = context.getSharedPreferences(Prefs.NAME, Context.MODE_PRIVATE)
|
||||||
private val listeners = HashSet<() -> Unit>()
|
private val listeners = HashSet<() -> Unit>()
|
||||||
@ -125,8 +125,8 @@ class StreamingPlaybackService(context: Context) : IPlaybackService {
|
|||||||
@Synchronized override fun connect(listener: () -> Unit) {
|
@Synchronized override fun connect(listener: () -> Unit) {
|
||||||
listeners.add(listener)
|
listeners.add(listener)
|
||||||
if (listeners.size == 1) {
|
if (listeners.size == 1) {
|
||||||
handler.removeCallbacks(dataProviderDisconnectRunnable)
|
handler.removeCallbacks(metadataProxyDisconnectRunnable)
|
||||||
dataProvider.attach()
|
metadataProxy.attach()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -138,7 +138,7 @@ class StreamingPlaybackService(context: Context) : IPlaybackService {
|
|||||||
conditions between Activity changes, so we make sure to give
|
conditions between Activity changes, so we make sure to give
|
||||||
things a couple seconds to settle... */
|
things a couple seconds to settle... */
|
||||||
handler.postDelayed(
|
handler.postDelayed(
|
||||||
dataProviderDisconnectRunnable,
|
metadataProxyDisconnectRunnable,
|
||||||
DATA_PROVIDER_DISCONNECT_DELAY_MS.toLong())
|
DATA_PROVIDER_DISCONNECT_DELAY_MS.toLong())
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -150,7 +150,7 @@ class StreamingPlaybackService(context: Context) : IPlaybackService {
|
|||||||
override fun playAll(index: Int, filter: String) {
|
override fun playAll(index: Int, filter: String) {
|
||||||
if (requestAudioFocus()) {
|
if (requestAudioFocus()) {
|
||||||
trackMetadataCache.clear()
|
trackMetadataCache.clear()
|
||||||
dataProvider.invalidatePlayQueueSnapshot()
|
metadataProxy.invalidatePlayQueueSnapshot()
|
||||||
resetPlayContextAndQueryFactory()
|
resetPlayContextAndQueryFactory()
|
||||||
val type = Messages.Request.QueryTracks
|
val type = Messages.Request.QueryTracks
|
||||||
loadQueueAndPlay(QueryContext(filter, type), index)
|
loadQueueAndPlay(QueryContext(filter, type), index)
|
||||||
@ -160,7 +160,7 @@ class StreamingPlaybackService(context: Context) : IPlaybackService {
|
|||||||
override fun play(category: String, categoryId: Long, index: Int, filter: String) {
|
override fun play(category: String, categoryId: Long, index: Int, filter: String) {
|
||||||
if (requestAudioFocus()) {
|
if (requestAudioFocus()) {
|
||||||
trackMetadataCache.clear()
|
trackMetadataCache.clear()
|
||||||
dataProvider.invalidatePlayQueueSnapshot()
|
metadataProxy.invalidatePlayQueueSnapshot()
|
||||||
resetPlayContextAndQueryFactory()
|
resetPlayContextAndQueryFactory()
|
||||||
val type = Messages.Request.QueryTracksByCategory
|
val type = Messages.Request.QueryTracksByCategory
|
||||||
loadQueueAndPlay(QueryContext(category, categoryId, filter, type), index)
|
loadQueueAndPlay(QueryContext(category, categoryId, filter, type), index)
|
||||||
@ -185,16 +185,16 @@ class StreamingPlaybackService(context: Context) : IPlaybackService {
|
|||||||
val type = PlayQueueType.Snapshot
|
val type = PlayQueueType.Snapshot
|
||||||
|
|
||||||
service.queryContext?.let {
|
service.queryContext?.let {
|
||||||
dataProvider.snapshotPlayQueue().subscribeBy(
|
metadataProxy.snapshotPlayQueue().subscribeBy(
|
||||||
onNext = {
|
onNext = {
|
||||||
resetPlayContextAndQueryFactory()
|
resetPlayContextAndQueryFactory()
|
||||||
|
|
||||||
snapshotQueryFactory = object: ITrackListQueryFactory {
|
snapshotQueryFactory = object: ITrackListQueryFactory {
|
||||||
override fun count(): Observable<Int>? =
|
override fun count(): Observable<Int>? =
|
||||||
dataProvider.getPlayQueueTracksCount(type)
|
metadataProxy.getPlayQueueTracksCount(type)
|
||||||
|
|
||||||
override fun page(offset: Int, limit: Int): Observable<List<ITrack>>? =
|
override fun page(offset: Int, limit: Int): Observable<List<ITrack>>? =
|
||||||
dataProvider.getPlayQueueTracks(limit, offset, type)
|
metadataProxy.getPlayQueueTracks(limit, offset, type)
|
||||||
|
|
||||||
override fun offline(): Boolean = false
|
override fun offline(): Boolean = false
|
||||||
}
|
}
|
||||||
@ -789,11 +789,11 @@ class StreamingPlaybackService(context: Context) : IPlaybackService {
|
|||||||
val params = queryContext
|
val params = queryContext
|
||||||
if (params != null) {
|
if (params != null) {
|
||||||
if (params.hasCategory()) {
|
if (params.hasCategory()) {
|
||||||
return dataProvider.getTrackCountByCategory(
|
return metadataProxy.getTrackCountByCategory(
|
||||||
params.category ?: "", params.categoryId, params.filter)
|
params.category ?: "", params.categoryId, params.filter)
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
return dataProvider.getTrackCount(params.filter)
|
return metadataProxy.getTrackCount(params.filter)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return null
|
return null
|
||||||
@ -803,11 +803,11 @@ class StreamingPlaybackService(context: Context) : IPlaybackService {
|
|||||||
val params = queryContext
|
val params = queryContext
|
||||||
if (params != null) {
|
if (params != null) {
|
||||||
if (params.hasCategory()) {
|
if (params.hasCategory()) {
|
||||||
return dataProvider.getTracksByCategory(
|
return metadataProxy.getTracksByCategory(
|
||||||
params.category ?: "", params.categoryId, limit, offset, params.filter)
|
params.category ?: "", params.categoryId, limit, offset, params.filter)
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
return dataProvider.getTracks(limit, offset, params.filter)
|
return metadataProxy.getTracks(limit, offset, params.filter)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return null
|
return null
|
||||||
@ -840,10 +840,10 @@ class StreamingPlaybackService(context: Context) : IPlaybackService {
|
|||||||
private fun detachable() =
|
private fun detachable() =
|
||||||
listeners.size == 0 && state == PlaybackState.Stopped
|
listeners.size == 0 && state == PlaybackState.Stopped
|
||||||
|
|
||||||
private val dataProviderDisconnectRunnable = object: Runnable {
|
private val metadataProxyDisconnectRunnable = object: Runnable {
|
||||||
override fun run() {
|
override fun run() {
|
||||||
if (detachable()) {
|
if (detachable()) {
|
||||||
dataProvider.detach()
|
metadataProxy.detach()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -2,7 +2,7 @@ package io.casey.musikcube.remote.service.websocket.model
|
|||||||
|
|
||||||
import io.reactivex.Observable
|
import io.reactivex.Observable
|
||||||
|
|
||||||
interface IDataProvider {
|
interface IMetadataProxy {
|
||||||
enum class State { Disconnected, Connecting, Connected }
|
enum class State { Disconnected, Connecting, Connected }
|
||||||
|
|
||||||
fun attach()
|
fun attach()
|
@ -2,7 +2,7 @@ package io.casey.musikcube.remote.service.websocket.model.impl.remote
|
|||||||
|
|
||||||
import io.casey.musikcube.remote.Application
|
import io.casey.musikcube.remote.Application
|
||||||
import io.casey.musikcube.remote.injection.DaggerDataComponent
|
import io.casey.musikcube.remote.injection.DaggerDataComponent
|
||||||
import io.casey.musikcube.remote.service.websocket.model.IDataProvider
|
import io.casey.musikcube.remote.service.websocket.model.IMetadataProxy
|
||||||
import io.casey.musikcube.remote.service.websocket.model.ITrack
|
import io.casey.musikcube.remote.service.websocket.model.ITrack
|
||||||
import io.casey.musikcube.remote.service.websocket.model.ITrackListQueryFactory
|
import io.casey.musikcube.remote.service.websocket.model.ITrackListQueryFactory
|
||||||
import io.reactivex.Observable
|
import io.reactivex.Observable
|
||||||
@ -10,14 +10,14 @@ import org.json.JSONObject
|
|||||||
import javax.inject.Inject
|
import javax.inject.Inject
|
||||||
|
|
||||||
class IdListTrackListQueryFactory(private val idList: List<String>): ITrackListQueryFactory {
|
class IdListTrackListQueryFactory(private val idList: List<String>): ITrackListQueryFactory {
|
||||||
@Inject protected lateinit var dataProvider: IDataProvider
|
@Inject protected lateinit var metadataProxy: IMetadataProxy
|
||||||
|
|
||||||
init {
|
init {
|
||||||
DaggerDataComponent.builder()
|
DaggerDataComponent.builder()
|
||||||
.appComponent(Application.appComponent)
|
.appComponent(Application.appComponent)
|
||||||
.build().inject(this)
|
.build().inject(this)
|
||||||
|
|
||||||
dataProvider.attach()
|
metadataProxy.attach()
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun page(offset: Int, limit: Int): Observable<List<ITrack>>? {
|
override fun page(offset: Int, limit: Int): Observable<List<ITrack>>? {
|
||||||
@ -29,7 +29,7 @@ class IdListTrackListQueryFactory(private val idList: List<String>): ITrackListQ
|
|||||||
}
|
}
|
||||||
|
|
||||||
val missing = RemoteTrack(JSONObject())
|
val missing = RemoteTrack(JSONObject())
|
||||||
return dataProvider.getTracks(window)
|
return metadataProxy.getTracks(window)
|
||||||
.flatMap{ it ->
|
.flatMap{ it ->
|
||||||
val result = mutableListOf<ITrack>()
|
val result = mutableListOf<ITrack>()
|
||||||
for (i in 0 until max) {
|
for (i in 0 until max) {
|
||||||
@ -43,6 +43,6 @@ class IdListTrackListQueryFactory(private val idList: List<String>): ITrackListQ
|
|||||||
override fun offline(): Boolean = false
|
override fun offline(): Boolean = false
|
||||||
|
|
||||||
fun destroy() {
|
fun destroy() {
|
||||||
dataProvider.destroy()
|
metadataProxy.destroy()
|
||||||
}
|
}
|
||||||
}
|
}
|
@ -15,12 +15,12 @@ import io.reactivex.subjects.ReplaySubject
|
|||||||
import org.json.JSONArray
|
import org.json.JSONArray
|
||||||
import org.json.JSONObject
|
import org.json.JSONObject
|
||||||
|
|
||||||
class RemoteDataProvider(private val service: WebSocketService) : IDataProvider {
|
class RemoteMetadataProxy(private val service: WebSocketService) : IMetadataProxy {
|
||||||
private var disposables = CompositeDisposable()
|
private var disposables = CompositeDisposable()
|
||||||
private var currentState = mapState(service.state)
|
private var currentState = mapState(service.state)
|
||||||
|
|
||||||
private val connectionStatePublisher: ReplaySubject<
|
private val connectionStatePublisher: ReplaySubject<
|
||||||
Pair<IDataProvider.State, IDataProvider.State>> = ReplaySubject.createWithSize(1)
|
Pair<IMetadataProxy.State, IMetadataProxy.State>> = ReplaySubject.createWithSize(1)
|
||||||
|
|
||||||
private val playQueueStatePublisher: PublishSubject<Unit> = PublishSubject.create()
|
private val playQueueStatePublisher: PublishSubject<Unit> = PublishSubject.create()
|
||||||
|
|
||||||
@ -32,7 +32,7 @@ class RemoteDataProvider(private val service: WebSocketService) : IDataProvider
|
|||||||
}, { /*error */ }))
|
}, { /*error */ }))
|
||||||
}
|
}
|
||||||
|
|
||||||
override val state: IDataProvider.State
|
override val state: IMetadataProxy.State
|
||||||
get() = currentState
|
get() = currentState
|
||||||
|
|
||||||
override fun getAlbums(filter: String): Observable<List<IAlbum>> =
|
override fun getAlbums(filter: String): Observable<List<IAlbum>> =
|
||||||
@ -550,7 +550,7 @@ class RemoteDataProvider(private val service: WebSocketService) : IDataProvider
|
|||||||
.observeOn(AndroidSchedulers.mainThread())
|
.observeOn(AndroidSchedulers.mainThread())
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun observeState(): Observable<Pair<IDataProvider.State, IDataProvider.State>> =
|
override fun observeState(): Observable<Pair<IMetadataProxy.State, IMetadataProxy.State>> =
|
||||||
connectionStatePublisher.observeOn(AndroidSchedulers.mainThread())
|
connectionStatePublisher.observeOn(AndroidSchedulers.mainThread())
|
||||||
|
|
||||||
override fun observePlayQueue(): Observable<Unit> =
|
override fun observePlayQueue(): Observable<Unit> =
|
||||||
@ -602,11 +602,11 @@ class RemoteDataProvider(private val service: WebSocketService) : IDataProvider
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun mapState(state: WebSocketService.State): IDataProvider.State =
|
private fun mapState(state: WebSocketService.State): IMetadataProxy.State =
|
||||||
when (state) {
|
when (state) {
|
||||||
WebSocketService.State.Disconnected -> IDataProvider.State.Disconnected
|
WebSocketService.State.Disconnected -> IMetadataProxy.State.Disconnected
|
||||||
WebSocketService.State.Connecting -> IDataProvider.State.Connecting
|
WebSocketService.State.Connecting -> IMetadataProxy.State.Connecting
|
||||||
WebSocketService.State.Connected -> IDataProvider.State.Connected
|
WebSocketService.State.Connected -> IMetadataProxy.State.Connected
|
||||||
}
|
}
|
||||||
|
|
||||||
companion object {
|
companion object {
|
@ -9,7 +9,7 @@ import android.view.ViewGroup
|
|||||||
import com.simplecityapps.recyclerview_fastscroll.views.FastScrollRecyclerView
|
import com.simplecityapps.recyclerview_fastscroll.views.FastScrollRecyclerView
|
||||||
import io.casey.musikcube.remote.R
|
import io.casey.musikcube.remote.R
|
||||||
import io.casey.musikcube.remote.service.websocket.model.IAlbum
|
import io.casey.musikcube.remote.service.websocket.model.IAlbum
|
||||||
import io.casey.musikcube.remote.service.websocket.model.IDataProvider
|
import io.casey.musikcube.remote.service.websocket.model.IMetadataProxy
|
||||||
import io.casey.musikcube.remote.ui.albums.adapter.AlbumBrowseAdapter
|
import io.casey.musikcube.remote.ui.albums.adapter.AlbumBrowseAdapter
|
||||||
import io.casey.musikcube.remote.ui.albums.constant.Album
|
import io.casey.musikcube.remote.ui.albums.constant.Album
|
||||||
import io.casey.musikcube.remote.ui.navigation.Navigate
|
import io.casey.musikcube.remote.ui.navigation.Navigate
|
||||||
@ -22,7 +22,7 @@ import io.casey.musikcube.remote.ui.shared.extension.getLayoutId
|
|||||||
import io.casey.musikcube.remote.ui.shared.extension.getTitleOverride
|
import io.casey.musikcube.remote.ui.shared.extension.getTitleOverride
|
||||||
import io.casey.musikcube.remote.ui.shared.extension.setupDefaultRecyclerView
|
import io.casey.musikcube.remote.ui.shared.extension.setupDefaultRecyclerView
|
||||||
import io.casey.musikcube.remote.ui.shared.fragment.BaseFragment
|
import io.casey.musikcube.remote.ui.shared.fragment.BaseFragment
|
||||||
import io.casey.musikcube.remote.ui.shared.mixin.DataProviderMixin
|
import io.casey.musikcube.remote.ui.shared.mixin.MetadataProxyMixin
|
||||||
import io.casey.musikcube.remote.ui.shared.mixin.ItemContextMenuMixin
|
import io.casey.musikcube.remote.ui.shared.mixin.ItemContextMenuMixin
|
||||||
import io.casey.musikcube.remote.ui.shared.mixin.PlaybackMixin
|
import io.casey.musikcube.remote.ui.shared.mixin.PlaybackMixin
|
||||||
import io.casey.musikcube.remote.ui.shared.view.EmptyListView
|
import io.casey.musikcube.remote.ui.shared.view.EmptyListView
|
||||||
@ -35,7 +35,7 @@ class AlbumBrowseFragment: BaseFragment(), IFilterable, ITitleProvider, ITranspo
|
|||||||
private var lastFilter = ""
|
private var lastFilter = ""
|
||||||
private lateinit var adapter: AlbumBrowseAdapter
|
private lateinit var adapter: AlbumBrowseAdapter
|
||||||
private lateinit var playback: PlaybackMixin
|
private lateinit var playback: PlaybackMixin
|
||||||
private lateinit var data: DataProviderMixin
|
private lateinit var data: MetadataProxyMixin
|
||||||
private lateinit var emptyView: EmptyListView
|
private lateinit var emptyView: EmptyListView
|
||||||
|
|
||||||
override val title: String
|
override val title: String
|
||||||
@ -43,7 +43,7 @@ class AlbumBrowseFragment: BaseFragment(), IFilterable, ITitleProvider, ITranspo
|
|||||||
|
|
||||||
override fun onCreate(savedInstanceState: Bundle?) {
|
override fun onCreate(savedInstanceState: Bundle?) {
|
||||||
component.inject(this)
|
component.inject(this)
|
||||||
data = mixin(DataProviderMixin())
|
data = mixin(MetadataProxyMixin())
|
||||||
playback = mixin(PlaybackMixin())
|
playback = mixin(PlaybackMixin())
|
||||||
mixin(ItemContextMenuMixin(appCompatActivity, fragment = this))
|
mixin(ItemContextMenuMixin(appCompatActivity, fragment = this))
|
||||||
|
|
||||||
@ -87,7 +87,7 @@ class AlbumBrowseFragment: BaseFragment(), IFilterable, ITitleProvider, ITranspo
|
|||||||
override fun onInitObservables() {
|
override fun onInitObservables() {
|
||||||
disposables.add(data.provider.observeState().subscribeBy(
|
disposables.add(data.provider.observeState().subscribeBy(
|
||||||
onNext = { state ->
|
onNext = { state ->
|
||||||
if (state.first == IDataProvider.State.Connected) {
|
if (state.first == IMetadataProxy.State.Connected) {
|
||||||
requery()
|
requery()
|
||||||
} else {
|
} else {
|
||||||
emptyView.update(state.first, adapter.itemCount)
|
emptyView.update(state.first, adapter.itemCount)
|
||||||
|
@ -6,18 +6,18 @@ import android.view.View
|
|||||||
import android.view.ViewGroup
|
import android.view.ViewGroup
|
||||||
import com.simplecityapps.recyclerview_fastscroll.views.FastScrollRecyclerView
|
import com.simplecityapps.recyclerview_fastscroll.views.FastScrollRecyclerView
|
||||||
import io.casey.musikcube.remote.R
|
import io.casey.musikcube.remote.R
|
||||||
import io.casey.musikcube.remote.service.websocket.model.IDataProvider
|
import io.casey.musikcube.remote.service.websocket.model.IMetadataProxy
|
||||||
import io.casey.musikcube.remote.ui.category.adapter.AllCategoriesAdapter
|
import io.casey.musikcube.remote.ui.category.adapter.AllCategoriesAdapter
|
||||||
import io.casey.musikcube.remote.ui.navigation.Navigate
|
import io.casey.musikcube.remote.ui.navigation.Navigate
|
||||||
import io.casey.musikcube.remote.ui.shared.activity.ITitleProvider
|
import io.casey.musikcube.remote.ui.shared.activity.ITitleProvider
|
||||||
import io.casey.musikcube.remote.ui.shared.extension.getLayoutId
|
import io.casey.musikcube.remote.ui.shared.extension.getLayoutId
|
||||||
import io.casey.musikcube.remote.ui.shared.extension.setupDefaultRecyclerView
|
import io.casey.musikcube.remote.ui.shared.extension.setupDefaultRecyclerView
|
||||||
import io.casey.musikcube.remote.ui.shared.fragment.BaseFragment
|
import io.casey.musikcube.remote.ui.shared.fragment.BaseFragment
|
||||||
import io.casey.musikcube.remote.ui.shared.mixin.DataProviderMixin
|
import io.casey.musikcube.remote.ui.shared.mixin.MetadataProxyMixin
|
||||||
import io.reactivex.rxkotlin.subscribeBy
|
import io.reactivex.rxkotlin.subscribeBy
|
||||||
|
|
||||||
class AllCategoriesFragment: BaseFragment(), ITitleProvider {
|
class AllCategoriesFragment: BaseFragment(), ITitleProvider {
|
||||||
private lateinit var data: DataProviderMixin
|
private lateinit var data: MetadataProxyMixin
|
||||||
private lateinit var adapter: AllCategoriesAdapter
|
private lateinit var adapter: AllCategoriesAdapter
|
||||||
|
|
||||||
override val title: String
|
override val title: String
|
||||||
@ -25,7 +25,7 @@ class AllCategoriesFragment: BaseFragment(), ITitleProvider {
|
|||||||
|
|
||||||
override fun onCreate(savedInstanceState: Bundle?) {
|
override fun onCreate(savedInstanceState: Bundle?) {
|
||||||
component.inject(this)
|
component.inject(this)
|
||||||
data = mixin(DataProviderMixin())
|
data = mixin(MetadataProxyMixin())
|
||||||
|
|
||||||
super.onCreate(savedInstanceState)
|
super.onCreate(savedInstanceState)
|
||||||
|
|
||||||
@ -41,7 +41,7 @@ class AllCategoriesFragment: BaseFragment(), ITitleProvider {
|
|||||||
override fun onInitObservables() {
|
override fun onInitObservables() {
|
||||||
disposables.add(data.provider.observeState().subscribeBy(
|
disposables.add(data.provider.observeState().subscribeBy(
|
||||||
onNext = { states ->
|
onNext = { states ->
|
||||||
if (states.first == IDataProvider.State.Connected) {
|
if (states.first == IMetadataProxy.State.Connected) {
|
||||||
requery()
|
requery()
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
@ -13,7 +13,7 @@ import com.simplecityapps.recyclerview_fastscroll.views.FastScrollRecyclerView
|
|||||||
import io.casey.musikcube.remote.R
|
import io.casey.musikcube.remote.R
|
||||||
import io.casey.musikcube.remote.service.playback.impl.remote.Metadata
|
import io.casey.musikcube.remote.service.playback.impl.remote.Metadata
|
||||||
import io.casey.musikcube.remote.service.websocket.model.ICategoryValue
|
import io.casey.musikcube.remote.service.websocket.model.ICategoryValue
|
||||||
import io.casey.musikcube.remote.service.websocket.model.IDataProvider
|
import io.casey.musikcube.remote.service.websocket.model.IMetadataProxy
|
||||||
import io.casey.musikcube.remote.ui.category.adapter.CategoryBrowseAdapter
|
import io.casey.musikcube.remote.ui.category.adapter.CategoryBrowseAdapter
|
||||||
import io.casey.musikcube.remote.ui.category.constant.Category
|
import io.casey.musikcube.remote.ui.category.constant.Category
|
||||||
import io.casey.musikcube.remote.ui.category.constant.NavigationType
|
import io.casey.musikcube.remote.ui.category.constant.NavigationType
|
||||||
@ -28,7 +28,7 @@ import io.casey.musikcube.remote.ui.shared.extension.getLayoutId
|
|||||||
import io.casey.musikcube.remote.ui.shared.extension.getTitleOverride
|
import io.casey.musikcube.remote.ui.shared.extension.getTitleOverride
|
||||||
import io.casey.musikcube.remote.ui.shared.extension.setupDefaultRecyclerView
|
import io.casey.musikcube.remote.ui.shared.extension.setupDefaultRecyclerView
|
||||||
import io.casey.musikcube.remote.ui.shared.fragment.BaseFragment
|
import io.casey.musikcube.remote.ui.shared.fragment.BaseFragment
|
||||||
import io.casey.musikcube.remote.ui.shared.mixin.DataProviderMixin
|
import io.casey.musikcube.remote.ui.shared.mixin.MetadataProxyMixin
|
||||||
import io.casey.musikcube.remote.ui.shared.mixin.ItemContextMenuMixin
|
import io.casey.musikcube.remote.ui.shared.mixin.ItemContextMenuMixin
|
||||||
import io.casey.musikcube.remote.ui.shared.mixin.PlaybackMixin
|
import io.casey.musikcube.remote.ui.shared.mixin.PlaybackMixin
|
||||||
import io.casey.musikcube.remote.ui.shared.view.EmptyListView
|
import io.casey.musikcube.remote.ui.shared.view.EmptyListView
|
||||||
@ -40,7 +40,7 @@ class CategoryBrowseFragment: BaseFragment(), IFilterable, ITitleProvider, ITran
|
|||||||
private var lastFilter: String? = null
|
private var lastFilter: String? = null
|
||||||
private lateinit var rootView: View
|
private lateinit var rootView: View
|
||||||
private lateinit var emptyView: EmptyListView
|
private lateinit var emptyView: EmptyListView
|
||||||
private lateinit var data: DataProviderMixin
|
private lateinit var data: MetadataProxyMixin
|
||||||
private lateinit var playback: PlaybackMixin
|
private lateinit var playback: PlaybackMixin
|
||||||
|
|
||||||
private val navigationType: NavigationType
|
private val navigationType: NavigationType
|
||||||
@ -68,7 +68,7 @@ class CategoryBrowseFragment: BaseFragment(), IFilterable, ITitleProvider, ITran
|
|||||||
super.onCreate(savedInstanceState)
|
super.onCreate(savedInstanceState)
|
||||||
|
|
||||||
component.inject(this)
|
component.inject(this)
|
||||||
data = mixin(DataProviderMixin())
|
data = mixin(MetadataProxyMixin())
|
||||||
playback = mixin(PlaybackMixin())
|
playback = mixin(PlaybackMixin())
|
||||||
mixin(ItemContextMenuMixin(appCompatActivity, contextMenuListener, this))
|
mixin(ItemContextMenuMixin(appCompatActivity, contextMenuListener, this))
|
||||||
|
|
||||||
@ -118,11 +118,11 @@ class CategoryBrowseFragment: BaseFragment(), IFilterable, ITitleProvider, ITran
|
|||||||
disposables.add(data.provider.observeState().subscribeBy(
|
disposables.add(data.provider.observeState().subscribeBy(
|
||||||
onNext = { states ->
|
onNext = { states ->
|
||||||
when (states.first) {
|
when (states.first) {
|
||||||
IDataProvider.State.Connected -> {
|
IMetadataProxy.State.Connected -> {
|
||||||
filterDebouncer.cancel()
|
filterDebouncer.cancel()
|
||||||
requery()
|
requery()
|
||||||
}
|
}
|
||||||
IDataProvider.State.Disconnected -> {
|
IMetadataProxy.State.Disconnected -> {
|
||||||
emptyView.update(states.first, adapter.itemCount)
|
emptyView.update(states.first, adapter.itemCount)
|
||||||
}
|
}
|
||||||
else -> {
|
else -> {
|
||||||
|
@ -19,7 +19,7 @@ import io.casey.musikcube.remote.service.playback.PlaybackState
|
|||||||
import io.casey.musikcube.remote.service.playback.RepeatMode
|
import io.casey.musikcube.remote.service.playback.RepeatMode
|
||||||
import io.casey.musikcube.remote.service.playback.impl.remote.Metadata
|
import io.casey.musikcube.remote.service.playback.impl.remote.Metadata
|
||||||
import io.casey.musikcube.remote.service.websocket.WebSocketService
|
import io.casey.musikcube.remote.service.websocket.WebSocketService
|
||||||
import io.casey.musikcube.remote.service.websocket.model.IDataProvider
|
import io.casey.musikcube.remote.service.websocket.model.IMetadataProxy
|
||||||
import io.casey.musikcube.remote.ui.home.fragment.InvalidPasswordDialogFragment
|
import io.casey.musikcube.remote.ui.home.fragment.InvalidPasswordDialogFragment
|
||||||
import io.casey.musikcube.remote.ui.home.view.MainMetadataView
|
import io.casey.musikcube.remote.ui.home.view.MainMetadataView
|
||||||
import io.casey.musikcube.remote.ui.navigation.Navigate
|
import io.casey.musikcube.remote.ui.navigation.Navigate
|
||||||
@ -31,7 +31,7 @@ import io.casey.musikcube.remote.ui.shared.extension.getColorCompat
|
|||||||
import io.casey.musikcube.remote.ui.shared.extension.setCheckWithoutEvent
|
import io.casey.musikcube.remote.ui.shared.extension.setCheckWithoutEvent
|
||||||
import io.casey.musikcube.remote.ui.shared.extension.showSnackbar
|
import io.casey.musikcube.remote.ui.shared.extension.showSnackbar
|
||||||
import io.casey.musikcube.remote.ui.shared.extension.toolbar
|
import io.casey.musikcube.remote.ui.shared.extension.toolbar
|
||||||
import io.casey.musikcube.remote.ui.shared.mixin.DataProviderMixin
|
import io.casey.musikcube.remote.ui.shared.mixin.MetadataProxyMixin
|
||||||
import io.casey.musikcube.remote.ui.shared.mixin.PlaybackMixin
|
import io.casey.musikcube.remote.ui.shared.mixin.PlaybackMixin
|
||||||
import io.casey.musikcube.remote.ui.shared.util.Duration
|
import io.casey.musikcube.remote.ui.shared.util.Duration
|
||||||
import io.casey.musikcube.remote.ui.shared.util.UpdateCheck
|
import io.casey.musikcube.remote.ui.shared.util.UpdateCheck
|
||||||
@ -42,7 +42,7 @@ class MainActivity : BaseActivity() {
|
|||||||
private var seekbarValue = -1
|
private var seekbarValue = -1
|
||||||
private var blink = 0
|
private var blink = 0
|
||||||
|
|
||||||
private lateinit var data: DataProviderMixin
|
private lateinit var data: MetadataProxyMixin
|
||||||
private lateinit var playback: PlaybackMixin
|
private lateinit var playback: PlaybackMixin
|
||||||
|
|
||||||
/* views */
|
/* views */
|
||||||
@ -64,7 +64,7 @@ class MainActivity : BaseActivity() {
|
|||||||
|
|
||||||
override fun onCreate(savedInstanceState: Bundle?) {
|
override fun onCreate(savedInstanceState: Bundle?) {
|
||||||
component.inject(this)
|
component.inject(this)
|
||||||
data = mixin(DataProviderMixin())
|
data = mixin(MetadataProxyMixin())
|
||||||
playback = mixin(PlaybackMixin { rebindUi() })
|
playback = mixin(PlaybackMixin { rebindUi() })
|
||||||
|
|
||||||
super.onCreate(savedInstanceState)
|
super.onCreate(savedInstanceState)
|
||||||
@ -174,12 +174,12 @@ class MainActivity : BaseActivity() {
|
|||||||
disposables.add(data.provider.observeState().subscribe(
|
disposables.add(data.provider.observeState().subscribe(
|
||||||
{ states ->
|
{ states ->
|
||||||
when (states.first) {
|
when (states.first) {
|
||||||
IDataProvider.State.Connected -> {
|
IMetadataProxy.State.Connected -> {
|
||||||
rebindUi()
|
rebindUi()
|
||||||
checkShowSpotlight()
|
checkShowSpotlight()
|
||||||
checkShowApiMismatch()
|
checkShowApiMismatch()
|
||||||
}
|
}
|
||||||
IDataProvider.State.Disconnected -> {
|
IMetadataProxy.State.Disconnected -> {
|
||||||
clearUi()
|
clearUi()
|
||||||
}
|
}
|
||||||
else -> {
|
else -> {
|
||||||
@ -424,7 +424,7 @@ class MainActivity : BaseActivity() {
|
|||||||
object : ViewTreeObserver.OnGlobalLayoutListener {
|
object : ViewTreeObserver.OnGlobalLayoutListener {
|
||||||
override fun onGlobalLayout() {
|
override fun onGlobalLayout() {
|
||||||
val toolbarButton = findViewById<View>(R.id.action_remote_toggle)
|
val toolbarButton = findViewById<View>(R.id.action_remote_toggle)
|
||||||
if (toolbarButton != null && data.provider.state == IDataProvider.State.Connected) {
|
if (toolbarButton != null && data.provider.state == IMetadataProxy.State.Connected) {
|
||||||
checkShowSpotlight()
|
checkShowSpotlight()
|
||||||
window.decorView.viewTreeObserver.removeOnGlobalLayoutListener(this)
|
window.decorView.viewTreeObserver.removeOnGlobalLayoutListener(this)
|
||||||
}
|
}
|
||||||
|
@ -6,7 +6,7 @@ import android.view.View
|
|||||||
import android.view.ViewGroup
|
import android.view.ViewGroup
|
||||||
import com.simplecityapps.recyclerview_fastscroll.views.FastScrollRecyclerView
|
import com.simplecityapps.recyclerview_fastscroll.views.FastScrollRecyclerView
|
||||||
import io.casey.musikcube.remote.R
|
import io.casey.musikcube.remote.R
|
||||||
import io.casey.musikcube.remote.service.websocket.model.IDataProvider
|
import io.casey.musikcube.remote.service.websocket.model.IMetadataProxy
|
||||||
import io.casey.musikcube.remote.service.websocket.model.ITrack
|
import io.casey.musikcube.remote.service.websocket.model.ITrack
|
||||||
import io.casey.musikcube.remote.ui.playqueue.adapter.PlayQueueAdapter
|
import io.casey.musikcube.remote.ui.playqueue.adapter.PlayQueueAdapter
|
||||||
import io.casey.musikcube.remote.ui.playqueue.constant.PlayQueue
|
import io.casey.musikcube.remote.ui.playqueue.constant.PlayQueue
|
||||||
@ -14,7 +14,7 @@ import io.casey.musikcube.remote.ui.shared.activity.ITitleProvider
|
|||||||
import io.casey.musikcube.remote.ui.shared.extension.getLayoutId
|
import io.casey.musikcube.remote.ui.shared.extension.getLayoutId
|
||||||
import io.casey.musikcube.remote.ui.shared.extension.setupDefaultRecyclerView
|
import io.casey.musikcube.remote.ui.shared.extension.setupDefaultRecyclerView
|
||||||
import io.casey.musikcube.remote.ui.shared.fragment.BaseFragment
|
import io.casey.musikcube.remote.ui.shared.fragment.BaseFragment
|
||||||
import io.casey.musikcube.remote.ui.shared.mixin.DataProviderMixin
|
import io.casey.musikcube.remote.ui.shared.mixin.MetadataProxyMixin
|
||||||
import io.casey.musikcube.remote.ui.shared.mixin.ItemContextMenuMixin
|
import io.casey.musikcube.remote.ui.shared.mixin.ItemContextMenuMixin
|
||||||
import io.casey.musikcube.remote.ui.shared.mixin.PlaybackMixin
|
import io.casey.musikcube.remote.ui.shared.mixin.PlaybackMixin
|
||||||
import io.casey.musikcube.remote.ui.shared.model.DefaultSlidingWindow
|
import io.casey.musikcube.remote.ui.shared.model.DefaultSlidingWindow
|
||||||
@ -24,7 +24,7 @@ import io.reactivex.rxkotlin.subscribeBy
|
|||||||
|
|
||||||
class PlayQueueFragment: BaseFragment(), ITitleProvider {
|
class PlayQueueFragment: BaseFragment(), ITitleProvider {
|
||||||
private var offlineQueue: Boolean = false
|
private var offlineQueue: Boolean = false
|
||||||
private lateinit var data: DataProviderMixin
|
private lateinit var data: MetadataProxyMixin
|
||||||
private lateinit var playback: PlaybackMixin
|
private lateinit var playback: PlaybackMixin
|
||||||
private lateinit var tracks: DefaultSlidingWindow
|
private lateinit var tracks: DefaultSlidingWindow
|
||||||
private lateinit var adapter: PlayQueueAdapter
|
private lateinit var adapter: PlayQueueAdapter
|
||||||
@ -35,7 +35,7 @@ class PlayQueueFragment: BaseFragment(), ITitleProvider {
|
|||||||
|
|
||||||
override fun onCreate(savedInstanceState: Bundle?) {
|
override fun onCreate(savedInstanceState: Bundle?) {
|
||||||
component.inject(this)
|
component.inject(this)
|
||||||
data = mixin(DataProviderMixin())
|
data = mixin(MetadataProxyMixin())
|
||||||
playback = mixin(PlaybackMixin(playbackEvents))
|
playback = mixin(PlaybackMixin(playbackEvents))
|
||||||
mixin(ItemContextMenuMixin(appCompatActivity, null, this))
|
mixin(ItemContextMenuMixin(appCompatActivity, null, this))
|
||||||
super.onCreate(savedInstanceState)
|
super.onCreate(savedInstanceState)
|
||||||
@ -76,7 +76,7 @@ class PlayQueueFragment: BaseFragment(), ITitleProvider {
|
|||||||
override fun onInitObservables() {
|
override fun onInitObservables() {
|
||||||
disposables.add(data.provider.observeState().subscribeBy(
|
disposables.add(data.provider.observeState().subscribeBy(
|
||||||
onNext = { states ->
|
onNext = { states ->
|
||||||
if (states.first == IDataProvider.State.Connected) {
|
if (states.first == IMetadataProxy.State.Connected) {
|
||||||
tracks.requery()
|
tracks.requery()
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
|
@ -11,12 +11,12 @@ import io.casey.musikcube.remote.framework.ViewModel
|
|||||||
import io.casey.musikcube.remote.ui.settings.viewmodel.BaseRemoteViewModel
|
import io.casey.musikcube.remote.ui.settings.viewmodel.BaseRemoteViewModel
|
||||||
import io.casey.musikcube.remote.ui.settings.viewmodel.RemoteEqViewModel
|
import io.casey.musikcube.remote.ui.settings.viewmodel.RemoteEqViewModel
|
||||||
import io.casey.musikcube.remote.ui.shared.activity.BaseActivity
|
import io.casey.musikcube.remote.ui.shared.activity.BaseActivity
|
||||||
import io.casey.musikcube.remote.ui.shared.mixin.DataProviderMixin
|
import io.casey.musikcube.remote.ui.shared.mixin.MetadataProxyMixin
|
||||||
import io.casey.musikcube.remote.ui.shared.mixin.ViewModelMixin
|
import io.casey.musikcube.remote.ui.shared.mixin.ViewModelMixin
|
||||||
import io.reactivex.rxkotlin.subscribeBy
|
import io.reactivex.rxkotlin.subscribeBy
|
||||||
|
|
||||||
class RemoteEqActivity: BaseActivity() {
|
class RemoteEqActivity: BaseActivity() {
|
||||||
private lateinit var data: DataProviderMixin
|
private lateinit var data: MetadataProxyMixin
|
||||||
private lateinit var viewModel: RemoteEqViewModel
|
private lateinit var viewModel: RemoteEqViewModel
|
||||||
private lateinit var loadingOverlay: View
|
private lateinit var loadingOverlay: View
|
||||||
private lateinit var table: TableLayout
|
private lateinit var table: TableLayout
|
||||||
@ -26,7 +26,7 @@ class RemoteEqActivity: BaseActivity() {
|
|||||||
|
|
||||||
override fun onCreate(savedInstanceState: Bundle?) {
|
override fun onCreate(savedInstanceState: Bundle?) {
|
||||||
component.inject(this)
|
component.inject(this)
|
||||||
data = mixin(DataProviderMixin())
|
data = mixin(MetadataProxyMixin())
|
||||||
mixin(ViewModelMixin(this))
|
mixin(ViewModelMixin(this))
|
||||||
|
|
||||||
title = getString(R.string.remote_settings_eq_title)
|
title = getString(R.string.remote_settings_eq_title)
|
||||||
|
@ -14,14 +14,14 @@ import io.casey.musikcube.remote.service.websocket.model.TransportType
|
|||||||
import io.casey.musikcube.remote.ui.navigation.Transition
|
import io.casey.musikcube.remote.ui.navigation.Transition
|
||||||
import io.casey.musikcube.remote.ui.settings.viewmodel.RemoteSettingsViewModel
|
import io.casey.musikcube.remote.ui.settings.viewmodel.RemoteSettingsViewModel
|
||||||
import io.casey.musikcube.remote.ui.shared.activity.BaseActivity
|
import io.casey.musikcube.remote.ui.shared.activity.BaseActivity
|
||||||
import io.casey.musikcube.remote.ui.shared.mixin.DataProviderMixin
|
import io.casey.musikcube.remote.ui.shared.mixin.MetadataProxyMixin
|
||||||
import io.casey.musikcube.remote.ui.shared.mixin.ViewModelMixin
|
import io.casey.musikcube.remote.ui.shared.mixin.ViewModelMixin
|
||||||
import io.reactivex.rxkotlin.subscribeBy
|
import io.reactivex.rxkotlin.subscribeBy
|
||||||
import io.casey.musikcube.remote.ui.settings.viewmodel.BaseRemoteViewModel.State as ViewModelState
|
import io.casey.musikcube.remote.ui.settings.viewmodel.BaseRemoteViewModel.State as ViewModelState
|
||||||
|
|
||||||
class RemoteSettingsActivity: BaseActivity() {
|
class RemoteSettingsActivity: BaseActivity() {
|
||||||
private var initialized = false
|
private var initialized = false
|
||||||
private lateinit var data: DataProviderMixin
|
private lateinit var data: MetadataProxyMixin
|
||||||
private lateinit var viewModel: RemoteSettingsViewModel
|
private lateinit var viewModel: RemoteSettingsViewModel
|
||||||
private lateinit var loadingOverlay: View
|
private lateinit var loadingOverlay: View
|
||||||
private lateinit var driverSpinner: Spinner
|
private lateinit var driverSpinner: Spinner
|
||||||
@ -37,7 +37,7 @@ class RemoteSettingsActivity: BaseActivity() {
|
|||||||
override fun onCreate(savedInstanceState: Bundle?) {
|
override fun onCreate(savedInstanceState: Bundle?) {
|
||||||
component.inject(this)
|
component.inject(this)
|
||||||
|
|
||||||
data = mixin(DataProviderMixin())
|
data = mixin(MetadataProxyMixin())
|
||||||
mixin(ViewModelMixin(this))
|
mixin(ViewModelMixin(this))
|
||||||
|
|
||||||
super.onCreate(savedInstanceState)
|
super.onCreate(savedInstanceState)
|
||||||
|
@ -23,7 +23,7 @@ import io.casey.musikcube.remote.ui.settings.model.Connection
|
|||||||
import io.casey.musikcube.remote.ui.settings.model.ConnectionsDb
|
import io.casey.musikcube.remote.ui.settings.model.ConnectionsDb
|
||||||
import io.casey.musikcube.remote.ui.shared.activity.BaseActivity
|
import io.casey.musikcube.remote.ui.shared.activity.BaseActivity
|
||||||
import io.casey.musikcube.remote.ui.shared.extension.*
|
import io.casey.musikcube.remote.ui.shared.extension.*
|
||||||
import io.casey.musikcube.remote.ui.shared.mixin.DataProviderMixin
|
import io.casey.musikcube.remote.ui.shared.mixin.MetadataProxyMixin
|
||||||
import io.casey.musikcube.remote.ui.shared.mixin.PlaybackMixin
|
import io.casey.musikcube.remote.ui.shared.mixin.PlaybackMixin
|
||||||
import java.util.*
|
import java.util.*
|
||||||
import javax.inject.Inject
|
import javax.inject.Inject
|
||||||
@ -49,10 +49,10 @@ class SettingsActivity : BaseActivity() {
|
|||||||
private lateinit var cacheSpinner: Spinner
|
private lateinit var cacheSpinner: Spinner
|
||||||
private lateinit var titleEllipsisSpinner: Spinner
|
private lateinit var titleEllipsisSpinner: Spinner
|
||||||
private lateinit var playback: PlaybackMixin
|
private lateinit var playback: PlaybackMixin
|
||||||
private lateinit var data: DataProviderMixin
|
private lateinit var data: MetadataProxyMixin
|
||||||
|
|
||||||
override fun onCreate(savedInstanceState: Bundle?) {
|
override fun onCreate(savedInstanceState: Bundle?) {
|
||||||
data = mixin(DataProviderMixin())
|
data = mixin(MetadataProxyMixin())
|
||||||
playback = mixin(PlaybackMixin())
|
playback = mixin(PlaybackMixin())
|
||||||
component.inject(this)
|
component.inject(this)
|
||||||
super.onCreate(savedInstanceState)
|
super.onCreate(savedInstanceState)
|
||||||
|
@ -1,22 +1,22 @@
|
|||||||
package io.casey.musikcube.remote.ui.settings.viewmodel
|
package io.casey.musikcube.remote.ui.settings.viewmodel
|
||||||
|
|
||||||
import io.casey.musikcube.remote.framework.ViewModel
|
import io.casey.musikcube.remote.framework.ViewModel
|
||||||
import io.casey.musikcube.remote.service.websocket.model.IDataProvider
|
import io.casey.musikcube.remote.service.websocket.model.IMetadataProxy
|
||||||
import io.reactivex.disposables.CompositeDisposable
|
import io.reactivex.disposables.CompositeDisposable
|
||||||
import io.reactivex.rxkotlin.subscribeBy
|
import io.reactivex.rxkotlin.subscribeBy
|
||||||
|
|
||||||
abstract class BaseRemoteViewModel: ViewModel<BaseRemoteViewModel.State>() {
|
abstract class BaseRemoteViewModel: ViewModel<BaseRemoteViewModel.State>() {
|
||||||
protected var provider: IDataProvider? = null
|
protected var provider: IMetadataProxy? = null
|
||||||
protected var disposables = CompositeDisposable()
|
protected var disposables = CompositeDisposable()
|
||||||
|
|
||||||
enum class State { Disconnected, Saving, Saved, Loading, Ready, Error }
|
enum class State { Disconnected, Saving, Saved, Loading, Ready, Error }
|
||||||
|
|
||||||
fun attach(provider: IDataProvider) {
|
fun attach(provider: IMetadataProxy) {
|
||||||
this.provider = provider
|
this.provider = provider
|
||||||
this.provider?.let {
|
this.provider?.let {
|
||||||
this.disposables.add(it.observeState().subscribeBy(
|
this.disposables.add(it.observeState().subscribeBy(
|
||||||
onNext = {
|
onNext = {
|
||||||
if (it.first == IDataProvider.State.Connected) {
|
if (it.first == IMetadataProxy.State.Connected) {
|
||||||
onConnected()
|
onConnected()
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
@ -18,7 +18,7 @@ import io.casey.musikcube.remote.service.playback.PlaybackServiceFactory
|
|||||||
import io.casey.musikcube.remote.service.playback.impl.remote.Metadata
|
import io.casey.musikcube.remote.service.playback.impl.remote.Metadata
|
||||||
import io.casey.musikcube.remote.service.websocket.model.IAlbum
|
import io.casey.musikcube.remote.service.websocket.model.IAlbum
|
||||||
import io.casey.musikcube.remote.service.websocket.model.ICategoryValue
|
import io.casey.musikcube.remote.service.websocket.model.ICategoryValue
|
||||||
import io.casey.musikcube.remote.service.websocket.model.IDataProvider
|
import io.casey.musikcube.remote.service.websocket.model.IMetadataProxy
|
||||||
import io.casey.musikcube.remote.service.websocket.model.ITrack
|
import io.casey.musikcube.remote.service.websocket.model.ITrack
|
||||||
import io.casey.musikcube.remote.ui.category.constant.Category
|
import io.casey.musikcube.remote.ui.category.constant.Category
|
||||||
import io.casey.musikcube.remote.ui.navigation.Navigate
|
import io.casey.musikcube.remote.ui.navigation.Navigate
|
||||||
@ -38,7 +38,7 @@ class ItemContextMenuMixin(private val activity: AppCompatActivity,
|
|||||||
internal val fragment: BaseFragment? = null): MixinBase() {
|
internal val fragment: BaseFragment? = null): MixinBase() {
|
||||||
private enum class TrackType { Normal, Playlist }
|
private enum class TrackType { Normal, Playlist }
|
||||||
|
|
||||||
@Inject lateinit var provider: IDataProvider
|
@Inject lateinit var provider: IMetadataProxy
|
||||||
|
|
||||||
open class EventListener {
|
open class EventListener {
|
||||||
open fun onPlaylistDeleted(id: Long, name: String) { }
|
open fun onPlaylistDeleted(id: Long, name: String) { }
|
||||||
|
@ -5,12 +5,12 @@ import io.casey.musikcube.remote.Application
|
|||||||
import io.casey.musikcube.remote.framework.MixinBase
|
import io.casey.musikcube.remote.framework.MixinBase
|
||||||
import io.casey.musikcube.remote.injection.DaggerViewComponent
|
import io.casey.musikcube.remote.injection.DaggerViewComponent
|
||||||
import io.casey.musikcube.remote.service.websocket.WebSocketService
|
import io.casey.musikcube.remote.service.websocket.WebSocketService
|
||||||
import io.casey.musikcube.remote.service.websocket.model.IDataProvider
|
import io.casey.musikcube.remote.service.websocket.model.IMetadataProxy
|
||||||
import javax.inject.Inject
|
import javax.inject.Inject
|
||||||
|
|
||||||
class DataProviderMixin : MixinBase() {
|
class MetadataProxyMixin : MixinBase() {
|
||||||
@Inject lateinit var wss: WebSocketService
|
@Inject lateinit var wss: WebSocketService
|
||||||
@Inject lateinit var provider: IDataProvider
|
@Inject lateinit var provider: IMetadataProxy
|
||||||
|
|
||||||
override fun onCreate(bundle: Bundle) {
|
override fun onCreate(bundle: Bundle) {
|
||||||
super.onCreate(bundle)
|
super.onCreate(bundle)
|
@ -3,14 +3,14 @@ package io.casey.musikcube.remote.ui.shared.model
|
|||||||
import androidx.recyclerview.widget.RecyclerView
|
import androidx.recyclerview.widget.RecyclerView
|
||||||
import com.simplecityapps.recyclerview_fastscroll.interfaces.OnFastScrollStateChangeListener
|
import com.simplecityapps.recyclerview_fastscroll.interfaces.OnFastScrollStateChangeListener
|
||||||
import com.simplecityapps.recyclerview_fastscroll.views.FastScrollRecyclerView
|
import com.simplecityapps.recyclerview_fastscroll.views.FastScrollRecyclerView
|
||||||
import io.casey.musikcube.remote.service.websocket.model.IDataProvider
|
import io.casey.musikcube.remote.service.websocket.model.IMetadataProxy
|
||||||
import io.casey.musikcube.remote.service.websocket.model.ITrack
|
import io.casey.musikcube.remote.service.websocket.model.ITrack
|
||||||
import io.casey.musikcube.remote.util.Debouncer
|
import io.casey.musikcube.remote.util.Debouncer
|
||||||
import io.reactivex.disposables.CompositeDisposable
|
import io.reactivex.disposables.CompositeDisposable
|
||||||
|
|
||||||
abstract class BaseSlidingWindow(
|
abstract class BaseSlidingWindow(
|
||||||
private val recyclerView: FastScrollRecyclerView,
|
private val recyclerView: FastScrollRecyclerView,
|
||||||
private val dataProvider: IDataProvider) : ITrackListSlidingWindow
|
private val metadataProxy: IMetadataProxy) : ITrackListSlidingWindow
|
||||||
{
|
{
|
||||||
private var scrollState = RecyclerView.SCROLL_STATE_IDLE
|
private var scrollState = RecyclerView.SCROLL_STATE_IDLE
|
||||||
private var fastScrollerActive = false
|
private var fastScrollerActive = false
|
||||||
@ -40,7 +40,7 @@ abstract class BaseSlidingWindow(
|
|||||||
}
|
}
|
||||||
|
|
||||||
override fun resume() {
|
override fun resume() {
|
||||||
disposables.add(dataProvider.observePlayQueue()
|
disposables.add(metadataProxy.observePlayQueue()
|
||||||
.subscribe({ requery() }, { /* error */ }))
|
.subscribe({ requery() }, { /* error */ }))
|
||||||
|
|
||||||
recyclerView.setOnFastScrollStateChangeListener(fastScrollStateChangeListener)
|
recyclerView.setOnFastScrollStateChangeListener(fastScrollStateChangeListener)
|
||||||
|
@ -2,16 +2,16 @@ package io.casey.musikcube.remote.ui.shared.model
|
|||||||
|
|
||||||
import android.util.Log
|
import android.util.Log
|
||||||
import com.simplecityapps.recyclerview_fastscroll.views.FastScrollRecyclerView
|
import com.simplecityapps.recyclerview_fastscroll.views.FastScrollRecyclerView
|
||||||
import io.casey.musikcube.remote.service.websocket.model.IDataProvider
|
import io.casey.musikcube.remote.service.websocket.model.IMetadataProxy
|
||||||
import io.casey.musikcube.remote.service.websocket.model.ITrack
|
import io.casey.musikcube.remote.service.websocket.model.ITrack
|
||||||
import io.casey.musikcube.remote.service.websocket.model.ITrackListQueryFactory
|
import io.casey.musikcube.remote.service.websocket.model.ITrackListQueryFactory
|
||||||
import io.reactivex.rxkotlin.subscribeBy
|
import io.reactivex.rxkotlin.subscribeBy
|
||||||
|
|
||||||
class DefaultSlidingWindow(
|
class DefaultSlidingWindow(
|
||||||
private val recyclerView: FastScrollRecyclerView,
|
private val recyclerView: FastScrollRecyclerView,
|
||||||
dataProvider: IDataProvider,
|
metadataProxy: IMetadataProxy,
|
||||||
private val queryFactory: ITrackListQueryFactory)
|
private val queryFactory: ITrackListQueryFactory)
|
||||||
: BaseSlidingWindow(recyclerView, dataProvider)
|
: BaseSlidingWindow(recyclerView, metadataProxy)
|
||||||
{
|
{
|
||||||
private var queryOffset = -1
|
private var queryOffset = -1
|
||||||
private var queryLimit = -1
|
private var queryLimit = -1
|
||||||
|
@ -13,7 +13,7 @@ import io.casey.musikcube.remote.injection.DaggerViewComponent
|
|||||||
import io.casey.musikcube.remote.service.playback.PlaybackServiceFactory
|
import io.casey.musikcube.remote.service.playback.PlaybackServiceFactory
|
||||||
import io.casey.musikcube.remote.service.playback.impl.streaming.StreamingPlaybackService
|
import io.casey.musikcube.remote.service.playback.impl.streaming.StreamingPlaybackService
|
||||||
import io.casey.musikcube.remote.service.websocket.WebSocketService
|
import io.casey.musikcube.remote.service.websocket.WebSocketService
|
||||||
import io.casey.musikcube.remote.service.websocket.model.IDataProvider
|
import io.casey.musikcube.remote.service.websocket.model.IMetadataProxy
|
||||||
import io.casey.musikcube.remote.ui.shared.extension.setVisible
|
import io.casey.musikcube.remote.ui.shared.extension.setVisible
|
||||||
import io.casey.musikcube.remote.ui.tracks.activity.TrackListActivity
|
import io.casey.musikcube.remote.ui.tracks.activity.TrackListActivity
|
||||||
import javax.inject.Inject
|
import javax.inject.Inject
|
||||||
@ -86,7 +86,7 @@ class EmptyListView : FrameLayout {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
fun update(state: IDataProvider.State, count: Int) {
|
fun update(state: IMetadataProxy.State, count: Int) {
|
||||||
if (count > 0) {
|
if (count > 0) {
|
||||||
visibility = View.INVISIBLE
|
visibility = View.INVISIBLE
|
||||||
}
|
}
|
||||||
@ -96,7 +96,7 @@ class EmptyListView : FrameLayout {
|
|||||||
val showOfflineContainer =
|
val showOfflineContainer =
|
||||||
capability == Capability.OnlineOnly &&
|
capability == Capability.OnlineOnly &&
|
||||||
PlaybackServiceFactory.instance(context) is StreamingPlaybackService &&
|
PlaybackServiceFactory.instance(context) is StreamingPlaybackService &&
|
||||||
state != IDataProvider.State.Connected
|
state != IMetadataProxy.State.Connected
|
||||||
|
|
||||||
offlineContainer?.setVisible(showOfflineContainer)
|
offlineContainer?.setVisible(showOfflineContainer)
|
||||||
emptyContainer?.setVisible(!showOfflineContainer)
|
emptyContainer?.setVisible(!showOfflineContainer)
|
||||||
|
@ -17,7 +17,7 @@ import io.casey.musikcube.remote.ui.shared.activity.BaseActivity
|
|||||||
import io.casey.musikcube.remote.ui.shared.extension.setupDefaultRecyclerView
|
import io.casey.musikcube.remote.ui.shared.extension.setupDefaultRecyclerView
|
||||||
import io.casey.musikcube.remote.ui.shared.extension.showErrorSnackbar
|
import io.casey.musikcube.remote.ui.shared.extension.showErrorSnackbar
|
||||||
import io.casey.musikcube.remote.ui.shared.fragment.BaseDialogFragment
|
import io.casey.musikcube.remote.ui.shared.fragment.BaseDialogFragment
|
||||||
import io.casey.musikcube.remote.ui.shared.mixin.DataProviderMixin
|
import io.casey.musikcube.remote.ui.shared.mixin.MetadataProxyMixin
|
||||||
import io.casey.musikcube.remote.ui.shared.mixin.ViewModelMixin
|
import io.casey.musikcube.remote.ui.shared.mixin.ViewModelMixin
|
||||||
import io.casey.musikcube.remote.ui.tracks.adapter.EditPlaylistAdapter
|
import io.casey.musikcube.remote.ui.tracks.adapter.EditPlaylistAdapter
|
||||||
import io.casey.musikcube.remote.ui.tracks.model.EditPlaylistViewModel
|
import io.casey.musikcube.remote.ui.tracks.model.EditPlaylistViewModel
|
||||||
@ -26,13 +26,13 @@ import io.reactivex.rxkotlin.subscribeBy
|
|||||||
|
|
||||||
class EditPlaylistActivity: BaseActivity() {
|
class EditPlaylistActivity: BaseActivity() {
|
||||||
private lateinit var viewModel: EditPlaylistViewModel
|
private lateinit var viewModel: EditPlaylistViewModel
|
||||||
private lateinit var data: DataProviderMixin
|
private lateinit var data: MetadataProxyMixin
|
||||||
private lateinit var adapter: EditPlaylistAdapter
|
private lateinit var adapter: EditPlaylistAdapter
|
||||||
private var playlistName = ""
|
private var playlistName = ""
|
||||||
|
|
||||||
override fun onCreate(savedInstanceState: Bundle?) {
|
override fun onCreate(savedInstanceState: Bundle?) {
|
||||||
mixin(ViewModelMixin(this))
|
mixin(ViewModelMixin(this))
|
||||||
data = mixin(DataProviderMixin())
|
data = mixin(MetadataProxyMixin())
|
||||||
super.onCreate(savedInstanceState)
|
super.onCreate(savedInstanceState)
|
||||||
playlistName = extras.getString(EXTRA_PLAYLIST_NAME, "-")
|
playlistName = extras.getString(EXTRA_PLAYLIST_NAME, "-")
|
||||||
title = getString(R.string.playlist_edit_activity, playlistName)
|
title = getString(R.string.playlist_edit_activity, playlistName)
|
||||||
|
@ -8,7 +8,7 @@ import androidx.appcompat.app.AppCompatActivity
|
|||||||
import com.simplecityapps.recyclerview_fastscroll.views.FastScrollRecyclerView
|
import com.simplecityapps.recyclerview_fastscroll.views.FastScrollRecyclerView
|
||||||
import io.casey.musikcube.remote.R
|
import io.casey.musikcube.remote.R
|
||||||
import io.casey.musikcube.remote.service.playback.impl.remote.Metadata
|
import io.casey.musikcube.remote.service.playback.impl.remote.Metadata
|
||||||
import io.casey.musikcube.remote.service.websocket.model.IDataProvider
|
import io.casey.musikcube.remote.service.websocket.model.IMetadataProxy
|
||||||
import io.casey.musikcube.remote.service.websocket.model.ITrack
|
import io.casey.musikcube.remote.service.websocket.model.ITrack
|
||||||
import io.casey.musikcube.remote.service.websocket.model.ITrackListQueryFactory
|
import io.casey.musikcube.remote.service.websocket.model.ITrackListQueryFactory
|
||||||
import io.casey.musikcube.remote.ui.shared.activity.IFilterable
|
import io.casey.musikcube.remote.ui.shared.activity.IFilterable
|
||||||
@ -18,7 +18,7 @@ import io.casey.musikcube.remote.ui.shared.activity.ITransportObserver
|
|||||||
import io.casey.musikcube.remote.ui.shared.constant.Shared
|
import io.casey.musikcube.remote.ui.shared.constant.Shared
|
||||||
import io.casey.musikcube.remote.ui.shared.extension.*
|
import io.casey.musikcube.remote.ui.shared.extension.*
|
||||||
import io.casey.musikcube.remote.ui.shared.fragment.BaseFragment
|
import io.casey.musikcube.remote.ui.shared.fragment.BaseFragment
|
||||||
import io.casey.musikcube.remote.ui.shared.mixin.DataProviderMixin
|
import io.casey.musikcube.remote.ui.shared.mixin.MetadataProxyMixin
|
||||||
import io.casey.musikcube.remote.ui.shared.mixin.ItemContextMenuMixin
|
import io.casey.musikcube.remote.ui.shared.mixin.ItemContextMenuMixin
|
||||||
import io.casey.musikcube.remote.ui.shared.mixin.PlaybackMixin
|
import io.casey.musikcube.remote.ui.shared.mixin.PlaybackMixin
|
||||||
import io.casey.musikcube.remote.ui.shared.model.DefaultSlidingWindow
|
import io.casey.musikcube.remote.ui.shared.model.DefaultSlidingWindow
|
||||||
@ -38,7 +38,7 @@ class TrackListFragment: BaseFragment(), IFilterable, ITitleProvider, ITransport
|
|||||||
private lateinit var adapter: TrackListAdapter
|
private lateinit var adapter: TrackListAdapter
|
||||||
private lateinit var queryFactory: ITrackListQueryFactory
|
private lateinit var queryFactory: ITrackListQueryFactory
|
||||||
|
|
||||||
private lateinit var data: DataProviderMixin
|
private lateinit var data: MetadataProxyMixin
|
||||||
private lateinit var playback: PlaybackMixin
|
private lateinit var playback: PlaybackMixin
|
||||||
|
|
||||||
private var categoryType: String = ""
|
private var categoryType: String = ""
|
||||||
@ -49,7 +49,7 @@ class TrackListFragment: BaseFragment(), IFilterable, ITitleProvider, ITransport
|
|||||||
|
|
||||||
override fun onCreate(savedInstanceState: Bundle?) {
|
override fun onCreate(savedInstanceState: Bundle?) {
|
||||||
component.inject(this)
|
component.inject(this)
|
||||||
data = mixin(DataProviderMixin())
|
data = mixin(MetadataProxyMixin())
|
||||||
playback = mixin(PlaybackMixin())
|
playback = mixin(PlaybackMixin())
|
||||||
|
|
||||||
super.onCreate(savedInstanceState)
|
super.onCreate(savedInstanceState)
|
||||||
@ -83,8 +83,8 @@ class TrackListFragment: BaseFragment(), IFilterable, ITitleProvider, ITransport
|
|||||||
disposables.add(data.provider.observeState().subscribeBy(
|
disposables.add(data.provider.observeState().subscribeBy(
|
||||||
onNext = { states ->
|
onNext = { states ->
|
||||||
val shouldRequery =
|
val shouldRequery =
|
||||||
states.first === IDataProvider.State.Connected ||
|
states.first === IMetadataProxy.State.Connected ||
|
||||||
(states.first === IDataProvider.State.Disconnected && isOfflineTracks)
|
(states.first === IMetadataProxy.State.Disconnected && isOfflineTracks)
|
||||||
|
|
||||||
if (shouldRequery) {
|
if (shouldRequery) {
|
||||||
filterDebouncer.cancel()
|
filterDebouncer.cancel()
|
||||||
|
@ -2,7 +2,7 @@ package io.casey.musikcube.remote.ui.tracks.model
|
|||||||
|
|
||||||
import io.casey.musikcube.remote.framework.ViewModel
|
import io.casey.musikcube.remote.framework.ViewModel
|
||||||
import io.casey.musikcube.remote.service.playback.impl.remote.Metadata.Category.PLAYLISTS
|
import io.casey.musikcube.remote.service.playback.impl.remote.Metadata.Category.PLAYLISTS
|
||||||
import io.casey.musikcube.remote.service.websocket.model.IDataProvider
|
import io.casey.musikcube.remote.service.websocket.model.IMetadataProxy
|
||||||
import io.casey.musikcube.remote.service.websocket.model.ITrack
|
import io.casey.musikcube.remote.service.websocket.model.ITrack
|
||||||
import io.casey.musikcube.remote.service.websocket.model.impl.remote.RemoteTrack
|
import io.casey.musikcube.remote.service.websocket.model.impl.remote.RemoteTrack
|
||||||
import io.reactivex.Observable
|
import io.reactivex.Observable
|
||||||
@ -17,7 +17,7 @@ class EditPlaylistViewModel(private val playlistId: Long): ViewModel<EditPlaylis
|
|||||||
|
|
||||||
private var metadataDisposable: Disposable? = null
|
private var metadataDisposable: Disposable? = null
|
||||||
private var requestOffset = -1
|
private var requestOffset = -1
|
||||||
private var dataProvider: IDataProvider? = null
|
private var metadataProxy: IMetadataProxy? = null
|
||||||
private var externalIds: MutableList<String> = mutableListOf()
|
private var externalIds: MutableList<String> = mutableListOf()
|
||||||
|
|
||||||
private val cache = object : LinkedHashMap<String, CacheEntry>() {
|
private val cache = object : LinkedHashMap<String, CacheEntry>() {
|
||||||
@ -29,13 +29,13 @@ class EditPlaylistViewModel(private val playlistId: Long): ViewModel<EditPlaylis
|
|||||||
field = value
|
field = value
|
||||||
}
|
}
|
||||||
|
|
||||||
fun attach(dataProvider: IDataProvider) {
|
fun attach(metadataProxy: IMetadataProxy) {
|
||||||
this.dataProvider = dataProvider
|
this.metadataProxy = metadataProxy
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun onDestroy() {
|
override fun onDestroy() {
|
||||||
super.onDestroy()
|
super.onDestroy()
|
||||||
this.dataProvider = null
|
this.metadataProxy = null
|
||||||
}
|
}
|
||||||
|
|
||||||
private var status: Status = Status.NotLoaded
|
private var status: Status = Status.NotLoaded
|
||||||
@ -67,7 +67,7 @@ class EditPlaylistViewModel(private val playlistId: Long): ViewModel<EditPlaylis
|
|||||||
return Observable.just(playlistId)
|
return Observable.just(playlistId)
|
||||||
}
|
}
|
||||||
|
|
||||||
return dataProvider?.overwritePlaylistWithExternalIds(
|
return metadataProxy?.overwritePlaylistWithExternalIds(
|
||||||
playlistId, externalIds.toList()) ?: Observable.just(-1L)
|
playlistId, externalIds.toList()) ?: Observable.just(-1L)
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -84,7 +84,7 @@ class EditPlaylistViewModel(private val playlistId: Long): ViewModel<EditPlaylis
|
|||||||
|
|
||||||
private fun refreshTrackIds() {
|
private fun refreshTrackIds() {
|
||||||
status = Status.Loading
|
status = Status.Loading
|
||||||
dataProvider?.let {
|
metadataProxy?.let {
|
||||||
status = Status.Loading
|
status = Status.Loading
|
||||||
|
|
||||||
it.getTrackIdsByCategory(PLAYLISTS, playlistId).subscribeBy(
|
it.getTrackIdsByCategory(PLAYLISTS, playlistId).subscribeBy(
|
||||||
@ -103,7 +103,7 @@ class EditPlaylistViewModel(private val playlistId: Long): ViewModel<EditPlaylis
|
|||||||
return /* in flight */
|
return /* in flight */
|
||||||
}
|
}
|
||||||
|
|
||||||
dataProvider?.let {
|
metadataProxy?.let {
|
||||||
metadataDisposable?.dispose()
|
metadataDisposable?.dispose()
|
||||||
metadataDisposable = null
|
metadataDisposable = null
|
||||||
|
|
||||||
|
@ -6,7 +6,7 @@ buildscript {
|
|||||||
jcenter()
|
jcenter()
|
||||||
}
|
}
|
||||||
dependencies {
|
dependencies {
|
||||||
classpath 'com.android.tools.build:gradle:3.4.0'
|
classpath 'com.android.tools.build:gradle:3.4.1'
|
||||||
classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
|
classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
|
||||||
classpath 'com.google.gms:google-services:4.2.0'
|
classpath 'com.google.gms:google-services:4.2.0'
|
||||||
}
|
}
|
||||||
|
@ -34,7 +34,7 @@
|
|||||||
|
|
||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
#include <core/sdk/ISimpleDataProvider.h>
|
#include <core/sdk/IMetadataProxy.h>
|
||||||
#include <core/sdk/IPreferences.h>
|
#include <core/sdk/IPreferences.h>
|
||||||
#include <core/sdk/IPlaybackService.h>
|
#include <core/sdk/IPlaybackService.h>
|
||||||
#include <core/sdk/IEnvironment.h>
|
#include <core/sdk/IEnvironment.h>
|
||||||
@ -64,12 +64,12 @@ class ReadWriteLock {
|
|||||||
|
|
||||||
struct Context {
|
struct Context {
|
||||||
Context() {
|
Context() {
|
||||||
this->dataProvider = nullptr;
|
this->metadataProxy = nullptr;
|
||||||
this->prefs = nullptr;
|
this->prefs = nullptr;
|
||||||
this->playback = nullptr;
|
this->playback = nullptr;
|
||||||
}
|
}
|
||||||
|
|
||||||
musik::core::sdk::ISimpleDataProvider* dataProvider;
|
musik::core::sdk::IMetadataProxy* metadataProxy;
|
||||||
musik::core::sdk::IPreferences* prefs;
|
musik::core::sdk::IPreferences* prefs;
|
||||||
musik::core::sdk::IPlaybackService* playback;
|
musik::core::sdk::IPlaybackService* playback;
|
||||||
musik::core::sdk::IEnvironment* environment;
|
musik::core::sdk::IEnvironment* environment;
|
||||||
|
@ -412,7 +412,7 @@ int HttpServer::HandleAudioTrackRequest(
|
|||||||
|
|
||||||
if (byExternalId) {
|
if (byExternalId) {
|
||||||
std::string externalId = urlDecode(pathParts.at(2));
|
std::string externalId = urlDecode(pathParts.at(2));
|
||||||
track = server->context.dataProvider->QueryTrackByExternalId(externalId.c_str());
|
track = server->context.metadataProxy->QueryTrackByExternalId(externalId.c_str());
|
||||||
|
|
||||||
#ifdef ENABLE_DEBUG
|
#ifdef ENABLE_DEBUG
|
||||||
std::cerr << "externalId: " << externalId << "\n";
|
std::cerr << "externalId: " << externalId << "\n";
|
||||||
@ -421,7 +421,7 @@ int HttpServer::HandleAudioTrackRequest(
|
|||||||
}
|
}
|
||||||
else if (pathParts.at(1) == fragment::id) {
|
else if (pathParts.at(1) == fragment::id) {
|
||||||
uint64_t id = std::stoull(urlDecode(pathParts.at(2)));
|
uint64_t id = std::stoull(urlDecode(pathParts.at(2)));
|
||||||
track = server->context.dataProvider->QueryTrackById(id);
|
track = server->context.metadataProxy->QueryTrackById(id);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (track) {
|
if (track) {
|
||||||
|
@ -694,7 +694,7 @@ ITrackList* WebSocketServer::QueryTracks(json& request, int& limit, int& offset)
|
|||||||
json& options = request[message::options];
|
json& options = request[message::options];
|
||||||
std::string filter = options.value(key::filter, "");
|
std::string filter = options.value(key::filter, "");
|
||||||
this->GetLimitAndOffset(options, limit, offset);
|
this->GetLimitAndOffset(options, limit, offset);
|
||||||
return context.dataProvider->QueryTracks(filter.c_str(), limit, offset);
|
return context.metadataProxy->QueryTracks(filter.c_str(), limit, offset);
|
||||||
}
|
}
|
||||||
return nullptr;
|
return nullptr;
|
||||||
}
|
}
|
||||||
@ -718,7 +718,7 @@ void WebSocketServer::RespondWithQueryTracksByExternalIds(connection_hdl connect
|
|||||||
json& externalIds = options[key::external_ids];
|
json& externalIds = options[key::external_ids];
|
||||||
if (externalIds.is_array()) {
|
if (externalIds.is_array()) {
|
||||||
auto externalIdArray = jsonToStringArray(externalIds);
|
auto externalIdArray = jsonToStringArray(externalIds);
|
||||||
ITrackList* trackList = context.dataProvider
|
ITrackList* trackList = context.metadataProxy
|
||||||
->QueryTracksByExternalId(
|
->QueryTracksByExternalId(
|
||||||
(const char**) externalIdArray.get(),
|
(const char**) externalIdArray.get(),
|
||||||
externalIds.size());
|
externalIds.size());
|
||||||
@ -856,7 +856,7 @@ void WebSocketServer::RespondWithQueryAlbums(connection_hdl connection, json& re
|
|||||||
std::string category = options.value(key::category, "");
|
std::string category = options.value(key::category, "");
|
||||||
int64_t categoryId = options.value<int64_t>(key::category_id, -1);
|
int64_t categoryId = options.value<int64_t>(key::category_id, -1);
|
||||||
|
|
||||||
IMapList* albumList = context.dataProvider
|
IMapList* albumList = context.metadataProxy
|
||||||
->QueryAlbums(category.c_str(), categoryId, filter.c_str());
|
->QueryAlbums(category.c_str(), categoryId, filter.c_str());
|
||||||
|
|
||||||
json result = json::array();
|
json result = json::array();
|
||||||
@ -916,7 +916,7 @@ void WebSocketServer::RespondWithPlayTracks(connection_hdl connection, json& req
|
|||||||
if (externalIds.is_array()) {
|
if (externalIds.is_array()) {
|
||||||
auto externalIdArray = jsonToStringArray(externalIds);
|
auto externalIdArray = jsonToStringArray(externalIds);
|
||||||
|
|
||||||
ITrackList* trackList = context.dataProvider
|
ITrackList* trackList = context.metadataProxy
|
||||||
->QueryTracksByExternalId(
|
->QueryTracksByExternalId(
|
||||||
(const char**)externalIdArray.get(),
|
(const char**)externalIdArray.get(),
|
||||||
externalIds.size());
|
externalIds.size());
|
||||||
@ -970,11 +970,11 @@ ITrackList* WebSocketServer::QueryTracksByCategory(json& request, int& limit, in
|
|||||||
if (predicates.size()) {
|
if (predicates.size()) {
|
||||||
auto predicateList = jsonToPredicateList(predicates);
|
auto predicateList = jsonToPredicateList(predicates);
|
||||||
|
|
||||||
return context.dataProvider->QueryTracksByCategories(
|
return context.metadataProxy->QueryTracksByCategories(
|
||||||
predicateList.get(), predicates.size(), filter.c_str(), limit, offset);
|
predicateList.get(), predicates.size(), filter.c_str(), limit, offset);
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
return context.dataProvider->QueryTracksByCategory(
|
return context.metadataProxy->QueryTracksByCategory(
|
||||||
category.c_str(), selectedId, filter.c_str(), limit, offset);
|
category.c_str(), selectedId, filter.c_str(), limit, offset);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -995,7 +995,7 @@ void WebSocketServer::RespondWithQueryTracksByCategory(connection_hdl connection
|
|||||||
}
|
}
|
||||||
|
|
||||||
void WebSocketServer::RespondWithListCategories(connection_hdl connection, json& request) {
|
void WebSocketServer::RespondWithListCategories(connection_hdl connection, json& request) {
|
||||||
IValueList* result = context.dataProvider->ListCategories();
|
IValueList* result = context.metadataProxy->ListCategories();
|
||||||
|
|
||||||
if (result != nullptr) {
|
if (result != nullptr) {
|
||||||
json list = json::array();
|
json list = json::array();
|
||||||
@ -1031,7 +1031,7 @@ void WebSocketServer::RespondWithQueryCategory(connection_hdl connection, json&
|
|||||||
|
|
||||||
if (predicates.size()) {
|
if (predicates.size()) {
|
||||||
auto predicateList = jsonToPredicateList(predicates);
|
auto predicateList = jsonToPredicateList(predicates);
|
||||||
result = context.dataProvider
|
result = context.metadataProxy
|
||||||
->QueryCategoryWithPredicates(
|
->QueryCategoryWithPredicates(
|
||||||
category.c_str(),
|
category.c_str(),
|
||||||
predicateList.get(),
|
predicateList.get(),
|
||||||
@ -1039,7 +1039,7 @@ void WebSocketServer::RespondWithQueryCategory(connection_hdl connection, json&
|
|||||||
filter.c_str());
|
filter.c_str());
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
result = context.dataProvider
|
result = context.metadataProxy
|
||||||
->QueryCategoryWithPredicate(
|
->QueryCategoryWithPredicate(
|
||||||
category.c_str(),
|
category.c_str(),
|
||||||
predicate.c_str(),
|
predicate.c_str(),
|
||||||
@ -1086,7 +1086,7 @@ void WebSocketServer::RespondWithPlayAllTracks(connection_hdl connection, json&
|
|||||||
time = request[message::options].value(key::time, 0.0);
|
time = request[message::options].value(key::time, 0.0);
|
||||||
}
|
}
|
||||||
|
|
||||||
ITrackList* tracks = context.dataProvider->QueryTracks(filter.c_str());
|
ITrackList* tracks = context.metadataProxy->QueryTracks(filter.c_str());
|
||||||
|
|
||||||
if (tracks) {
|
if (tracks) {
|
||||||
context.playback->Play(tracks, index);
|
context.playback->Play(tracks, index);
|
||||||
@ -1175,7 +1175,7 @@ void WebSocketServer::RespondWithSavePlaylist(connection_hdl connection, json& r
|
|||||||
if (externalIds.is_array()) {
|
if (externalIds.is_array()) {
|
||||||
auto externalIdArray = jsonToStringArray(externalIds);
|
auto externalIdArray = jsonToStringArray(externalIds);
|
||||||
|
|
||||||
int64_t newPlaylistId = this->context.dataProvider
|
int64_t newPlaylistId = this->context.metadataProxy
|
||||||
->SavePlaylistWithExternalIds(
|
->SavePlaylistWithExternalIds(
|
||||||
(const char**) externalIdArray.get(),
|
(const char**) externalIdArray.get(),
|
||||||
externalIds.size(),
|
externalIds.size(),
|
||||||
@ -1209,7 +1209,7 @@ void WebSocketServer::RespondWithSavePlaylist(connection_hdl connection, json& r
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (tracks) {
|
if (tracks) {
|
||||||
int64_t newPlaylistId = this->context.dataProvider
|
int64_t newPlaylistId = this->context.metadataProxy
|
||||||
->SavePlaylistWithTrackList(tracks, name.c_str(), id);
|
->SavePlaylistWithTrackList(tracks, name.c_str(), id);
|
||||||
|
|
||||||
tracks->Release();
|
tracks->Release();
|
||||||
@ -1236,7 +1236,7 @@ void WebSocketServer::RespondWithRenamePlaylist(connection_hdl connection, json&
|
|||||||
int64_t id = options[key::playlist_id];
|
int64_t id = options[key::playlist_id];
|
||||||
std::string name = options[key::playlist_name];
|
std::string name = options[key::playlist_name];
|
||||||
|
|
||||||
this->context.dataProvider->RenamePlaylist(id, name.c_str())
|
this->context.metadataProxy->RenamePlaylist(id, name.c_str())
|
||||||
? this->RespondWithSuccess(connection, request)
|
? this->RespondWithSuccess(connection, request)
|
||||||
: this->RespondWithFailure(connection, request);
|
: this->RespondWithFailure(connection, request);
|
||||||
}
|
}
|
||||||
@ -1245,7 +1245,7 @@ void WebSocketServer::RespondWithDeletePlaylist(connection_hdl connection, json&
|
|||||||
auto& options = request[message::options];
|
auto& options = request[message::options];
|
||||||
int64_t id = options[key::playlist_id];
|
int64_t id = options[key::playlist_id];
|
||||||
|
|
||||||
this->context.dataProvider->DeletePlaylist(id)
|
this->context.metadataProxy->DeletePlaylist(id)
|
||||||
? this->RespondWithSuccess(connection, request)
|
? this->RespondWithSuccess(connection, request)
|
||||||
: this->RespondWithFailure(connection, request);
|
: this->RespondWithFailure(connection, request);
|
||||||
}
|
}
|
||||||
@ -1265,7 +1265,7 @@ void WebSocketServer::RespondWithAppendToPlaylist(connection_hdl connection, jso
|
|||||||
if (externalIds.is_array()) {
|
if (externalIds.is_array()) {
|
||||||
auto externalIdArray = jsonToStringArray(externalIds);
|
auto externalIdArray = jsonToStringArray(externalIds);
|
||||||
|
|
||||||
bool result = this->context.dataProvider
|
bool result = this->context.metadataProxy
|
||||||
->AppendToPlaylistWithExternalIds(
|
->AppendToPlaylistWithExternalIds(
|
||||||
id,
|
id,
|
||||||
(const char**) externalIdArray.get(),
|
(const char**) externalIdArray.get(),
|
||||||
@ -1295,7 +1295,7 @@ void WebSocketServer::RespondWithAppendToPlaylist(connection_hdl connection, jso
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (tracks) {
|
if (tracks) {
|
||||||
bool result = this->context.dataProvider
|
bool result = this->context.metadataProxy
|
||||||
->AppendToPlaylistWithTrackList(id, tracks, offset);
|
->AppendToPlaylistWithTrackList(id, tracks, offset);
|
||||||
|
|
||||||
tracks->Release();
|
tracks->Release();
|
||||||
@ -1527,7 +1527,7 @@ void WebSocketServer::RespondWithRemoveTracksFromPlaylist(connection_hdl connect
|
|||||||
auto ids = jsonToStringArray(*externalIdsIt);
|
auto ids = jsonToStringArray(*externalIdsIt);
|
||||||
auto orders = jsonToIntArray<int>(*sortOrdersIt);
|
auto orders = jsonToIntArray<int>(*sortOrdersIt);
|
||||||
|
|
||||||
updated = this->context.dataProvider
|
updated = this->context.metadataProxy
|
||||||
->RemoveTracksFromPlaylist(
|
->RemoveTracksFromPlaylist(
|
||||||
id,
|
id,
|
||||||
(const char**)ids.get(),
|
(const char**)ids.get(),
|
||||||
|
@ -84,10 +84,10 @@ static class PlaybackRemote : public IPlaybackRemote {
|
|||||||
}
|
}
|
||||||
|
|
||||||
void CheckRunningStatus() {
|
void CheckRunningStatus() {
|
||||||
if (!thread && context.environment && context.playback && context.prefs && context.dataProvider) {
|
if (!thread && context.environment && context.playback && context.prefs && context.metadataProxy) {
|
||||||
thread.reset(new std::thread(std::bind(&PlaybackRemote::ThreadProc, this)));
|
thread.reset(new std::thread(std::bind(&PlaybackRemote::ThreadProc, this)));
|
||||||
}
|
}
|
||||||
else if (thread && (!context.environment || !context.playback || !context.prefs || !context.dataProvider)) {
|
else if (thread && (!context.environment || !context.playback || !context.prefs || !context.metadataProxy)) {
|
||||||
this->Stop();
|
this->Stop();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -202,8 +202,8 @@ extern "C" DLL_EXPORT void SetPreferences(musik::core::sdk::IPreferences* prefs)
|
|||||||
remote.CheckRunningStatus();
|
remote.CheckRunningStatus();
|
||||||
}
|
}
|
||||||
|
|
||||||
extern "C" DLL_EXPORT void SetSimpleDataProvider(musik::core::sdk::ISimpleDataProvider* dataProvider) {
|
extern "C" DLL_EXPORT void SetMetadataProxy(musik::core::sdk::IMetadataProxy* metadataProxy) {
|
||||||
auto wl = context.lock.Write();
|
auto wl = context.lock.Write();
|
||||||
context.dataProvider = dataProvider;
|
context.metadataProxy = metadataProxy;
|
||||||
remote.CheckRunningStatus();
|
remote.CheckRunningStatus();
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user