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:
casey langen 2019-07-07 17:59:03 -07:00
parent ceed5a1c73
commit 37cd0da85f
41 changed files with 225 additions and 237 deletions

View File

@ -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:

View File

@ -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

View File

@ -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" />

View File

@ -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>

View File

@ -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;
}

View File

@ -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;

View File

@ -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 {

View File

@ -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(

View File

@ -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 =

View File

@ -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();

View File

@ -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,

View File

@ -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 */
} }

View File

@ -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()
}
} }

View File

@ -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)
} }

View File

@ -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
} }

View File

@ -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()
} }
} }
} }

View File

@ -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()

View File

@ -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()
} }
} }

View File

@ -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 {

View File

@ -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)

View File

@ -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()
} }
}, },

View File

@ -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 -> {

View File

@ -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)
} }

View File

@ -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 {

View File

@ -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)

View File

@ -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)

View File

@ -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)

View File

@ -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()
} }
}, },

View File

@ -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) { }

View File

@ -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)

View File

@ -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)

View File

@ -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

View File

@ -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)

View File

@ -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)

View File

@ -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()

View File

@ -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

View File

@ -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'
} }

View File

@ -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;

View File

@ -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) {

View File

@ -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(),

View File

@ -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();
} }