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

View File

@ -20,7 +20,7 @@ set(CORE_SOURCES
./library/Indexer.cpp
./library/LibraryFactory.cpp
./library/LocalLibrary.cpp
./library/LocalSimpleDataProvider.cpp
./library/LocalMetadataProxy.cpp
./library/query/local/AlbumListQuery.cpp
./library/query/local/AllCategoriesQuery.cpp
./library/query/local/AppendPlaylistQuery.cpp

View File

@ -104,7 +104,7 @@
<ClCompile Include="library\Indexer.cpp" />
<ClCompile Include="library\LocalLibrary.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\MetadataMapList.cpp" />
<ClCompile Include="library\query\local\AlbumListQuery.cpp" />
@ -171,7 +171,7 @@
<ClInclude Include="library\LocalLibrary.h" />
<ClInclude Include="library\LibraryFactory.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\MetadataMapList.h" />
<ClInclude Include="library\query\local\AlbumListQuery.h" />
@ -241,7 +241,7 @@
<ClInclude Include="audio\Player.h" />
<ClInclude Include="audio\Stream.h" />
<ClInclude Include="sdk\IPreferences.h" />
<ClInclude Include="sdk\ISimpleDataProvider.h" />
<ClInclude Include="sdk\IMetadataProxy.h" />
<ClInclude Include="sdk\ISpectrumVisualizer.h" />
<ClInclude Include="sdk\ITrack.h" />
<ClInclude Include="sdk\ITrackList.h" />

View File

@ -175,9 +175,6 @@
<ClCompile Include="library\query\local\CategoryListQuery.cpp">
<Filter>src\library\query\local</Filter>
</ClCompile>
<ClCompile Include="library\LocalSimpleDataProvider.cpp">
<Filter>src\library</Filter>
</ClCompile>
<ClCompile Include="plugin\Plugins.cpp">
<Filter>src\plugin</Filter>
</ClCompile>
@ -229,6 +226,9 @@
<ClCompile Include="support\Auddio.cpp">
<Filter>src\support</Filter>
</ClCompile>
<ClCompile Include="library\LocalMetadataProxy.cpp">
<Filter>src\library</Filter>
</ClCompile>
</ItemGroup>
<ItemGroup>
<ClInclude Include="pch.hpp">
@ -390,9 +390,6 @@
<ClInclude Include="Library\query\local\LocalQueryBase.h">
<Filter>src\library\query\local</Filter>
</ClInclude>
<ClInclude Include="library\LocalSimpleDataProvider.h">
<Filter>src\library</Filter>
</ClInclude>
<ClInclude Include="plugin\Plugins.h">
<Filter>src\plugin</Filter>
</ClInclude>
@ -447,9 +444,6 @@
<ClInclude Include="sdk\ISpectrumVisualizer.h">
<Filter>src\sdk\vis</Filter>
</ClInclude>
<ClInclude Include="sdk\ISimpleDataProvider.h">
<Filter>src\sdk\metadata</Filter>
</ClInclude>
<ClInclude Include="sdk\IPlaybackRemote.h">
<Filter>src\sdk\audio</Filter>
</ClInclude>
@ -555,5 +549,11 @@
<ClInclude Include="support\Auddio.h">
<Filter>src\support</Filter>
</ClInclude>
<ClInclude Include="sdk\IMetadataProxy.h">
<Filter>src\sdk\metadata</Filter>
</ClInclude>
<ClInclude Include="library\LocalMetadataProxy.h">
<Filter>src\library</Filter>
</ClInclude>
</ItemGroup>
</Project>

View File

@ -98,28 +98,3 @@ DataStreamPtr DataStreamFactory::OpenSharedDataStream(const char *uri) {
auto stream = OpenDataStream(uri);
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 musik::core::sdk::IDataStream* OpenDataStream(const char* uri);
static bool IsLocalFileStream(const char *uri);
private:
typedef std::vector<std::shared_ptr<musik::core::sdk::IDataStreamFactory> > DataStreamFactoryVector;

View File

@ -33,7 +33,7 @@
//////////////////////////////////////////////////////////////////////////////
#include "pch.hpp"
#include "LocalSimpleDataProvider.h"
#include "LocalMetadataProxy.h"
#include <core/debug.h>
#include <core/db/ScopedTransaction.h>
@ -56,7 +56,7 @@
#include <vector>
#include <map>
#define TAG "LocalSimpleDataProvider"
#define TAG "LocalMetadataProxy"
using namespace musik::core;
using namespace musik::core::db;
@ -284,16 +284,16 @@ class RemoveFromPlaylistQuery : public LocalQueryBase {
/* DATA PROVIDER */
LocalSimpleDataProvider::LocalSimpleDataProvider(musik::core::ILibraryPtr library)
LocalMetadataProxy::LocalMetadataProxy(musik::core::ILibraryPtr 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 {
std::shared_ptr<SearchTrackListQuery> search(
new SearchTrackListQuery(this->library, std::string(query ? query : "")));
@ -315,7 +315,7 @@ ITrackList* LocalSimpleDataProvider::QueryTracks(const char* query, int limit, i
return nullptr;
}
ITrack* LocalSimpleDataProvider::QueryTrackById(int64_t trackId) {
ITrack* LocalMetadataProxy::QueryTrackById(int64_t trackId) {
try {
TrackPtr target(new LibraryTrack(trackId, this->library));
@ -335,7 +335,7 @@ ITrack* LocalSimpleDataProvider::QueryTrackById(int64_t trackId) {
return nullptr;
}
ITrack* LocalSimpleDataProvider::QueryTrackByExternalId(const char* externalId) {
ITrack* LocalMetadataProxy::QueryTrackByExternalId(const char* externalId) {
if (strlen(externalId)) {
try {
TrackPtr target(new LibraryTrack(0, this->library));
@ -358,7 +358,7 @@ ITrack* LocalSimpleDataProvider::QueryTrackByExternalId(const char* externalId)
return nullptr;
}
ITrackList* LocalSimpleDataProvider::QueryTracksByCategory(
ITrackList* LocalMetadataProxy::QueryTracksByCategory(
const char* categoryType, int64_t selectedId, const char* filter, int limit, int offset)
{
try {
@ -394,7 +394,7 @@ ITrackList* LocalSimpleDataProvider::QueryTracksByCategory(
return nullptr;
}
ITrackList* LocalSimpleDataProvider::QueryTracksByCategories(
ITrackList* LocalMetadataProxy::QueryTracksByCategories(
IValue** categories, size_t categoryCount, const char* filter, int limit, int offset)
{
try {
@ -419,11 +419,11 @@ ITrackList* LocalSimpleDataProvider::QueryTracksByCategories(
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);
}
IValueList* LocalSimpleDataProvider::ListCategories() {
IValueList* LocalMetadataProxy::ListCategories() {
try {
auto query = std::make_shared<AllCategoriesQuery>();
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)
{
try {
@ -465,7 +465,7 @@ IValueList* LocalSimpleDataProvider::QueryCategoryWithPredicate(
return nullptr;
}
IValueList* LocalSimpleDataProvider::QueryCategoryWithPredicates(
IValueList* LocalMetadataProxy::QueryCategoryWithPredicates(
const char* type, IValue** predicates, size_t predicateCount, const char* filter)
{
try {
@ -487,7 +487,7 @@ IValueList* LocalSimpleDataProvider::QueryCategoryWithPredicates(
return nullptr;
}
IMapList* LocalSimpleDataProvider::QueryAlbums(
IMapList* LocalMetadataProxy::QueryAlbums(
const char* categoryIdName, int64_t categoryIdValue, const char* filter)
{
try {
@ -509,7 +509,7 @@ IMapList* LocalSimpleDataProvider::QueryAlbums(
return nullptr;
}
IMapList* LocalSimpleDataProvider::QueryAlbums(const char* filter) {
IMapList* LocalMetadataProxy::QueryAlbums(const char* filter) {
return this->QueryAlbums(nullptr, -1, filter);
}
@ -561,7 +561,7 @@ static uint64_t savePlaylist(
return 0;
}
int64_t LocalSimpleDataProvider::SavePlaylistWithIds(
int64_t LocalMetadataProxy::SavePlaylistWithIds(
int64_t* trackIds,
size_t trackIdCount,
const char* playlistName,
@ -577,7 +577,7 @@ int64_t LocalSimpleDataProvider::SavePlaylistWithIds(
return savePlaylist(this->library, trackList, playlistName, playlistId);
}
int64_t LocalSimpleDataProvider::SavePlaylistWithExternalIds(
int64_t LocalMetadataProxy::SavePlaylistWithExternalIds(
const char** externalIds,
size_t externalIdCount,
const char* playlistName,
@ -606,7 +606,7 @@ int64_t LocalSimpleDataProvider::SavePlaylistWithExternalIds(
return 0;
}
int64_t LocalSimpleDataProvider::SavePlaylistWithTrackList(
int64_t LocalMetadataProxy::SavePlaylistWithTrackList(
ITrackList* trackList,
const char* playlistName,
const int64_t playlistId)
@ -618,7 +618,7 @@ int64_t LocalSimpleDataProvider::SavePlaylistWithTrackList(
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)) {
try {
@ -639,7 +639,7 @@ bool LocalSimpleDataProvider::RenamePlaylist(const int64_t playlistId, const cha
return false;
}
bool LocalSimpleDataProvider::DeletePlaylist(const int64_t playlistId) {
bool LocalMetadataProxy::DeletePlaylist(const int64_t playlistId) {
try {
std::shared_ptr<DeletePlaylistQuery> query =
std::make_shared<DeletePlaylistQuery>(library, playlistId);
@ -682,7 +682,7 @@ static bool appendToPlaylist(
return false;
}
bool LocalSimpleDataProvider::AppendToPlaylistWithIds(
bool LocalMetadataProxy::AppendToPlaylistWithIds(
const int64_t playlistId,
const int64_t* ids,
size_t idCount,
@ -694,7 +694,7 @@ bool LocalSimpleDataProvider::AppendToPlaylistWithIds(
return appendToPlaylist(this->library, playlistId, trackList, offset);
}
bool LocalSimpleDataProvider::AppendToPlaylistWithExternalIds(
bool LocalMetadataProxy::AppendToPlaylistWithExternalIds(
const int64_t playlistId,
const char** externalIds,
size_t externalIdCount,
@ -720,7 +720,7 @@ bool LocalSimpleDataProvider::AppendToPlaylistWithExternalIds(
}
bool LocalSimpleDataProvider::AppendToPlaylistWithTrackList(
bool LocalMetadataProxy::AppendToPlaylistWithTrackList(
const int64_t playlistId, ITrackList* trackList, int offset)
{
static auto deleter = [](musik::core::sdk::ITrackList* trackList) {};
@ -731,7 +731,7 @@ bool LocalSimpleDataProvider::AppendToPlaylistWithTrackList(
return result;
}
size_t LocalSimpleDataProvider::RemoveTracksFromPlaylist(
size_t LocalMetadataProxy::RemoveTracksFromPlaylist(
const int64_t playlistId,
const char** externalIds,
const int* sortOrders,
@ -754,7 +754,7 @@ size_t LocalSimpleDataProvider::RemoveTracksFromPlaylist(
return 0;
}
ITrackList* LocalSimpleDataProvider::QueryTracksByExternalId(
ITrackList* LocalMetadataProxy::QueryTracksByExternalId(
const char** externalIds, size_t externalIdCount)
{
try {

View File

@ -35,15 +35,15 @@
#pragma once
#include <core/library/ILibrary.h>
#include <core/sdk/ISimpleDataProvider.h>
#include <core/sdk/IMetadataProxy.h>
namespace musik { namespace core { namespace db { namespace local {
class LocalSimpleDataProvider : public musik::core::sdk::ISimpleDataProvider {
class LocalMetadataProxy : public musik::core::sdk::IMetadataProxy {
public:
LocalSimpleDataProvider(musik::core::ILibraryPtr library);
LocalMetadataProxy(musik::core::ILibraryPtr library);
virtual ~LocalSimpleDataProvider();
virtual ~LocalMetadataProxy();
virtual musik::core::sdk::ITrackList*
QueryTracks(

View File

@ -187,7 +187,7 @@ namespace musik { namespace core { namespace db { namespace local {
"{{limit_and_offset}} ";
/* 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. */
static const std::string ALBUM_LIST_FILTER =

View File

@ -46,7 +46,7 @@
#include <core/audio/Outputs.h>
#include <core/support/Preferences.h>
#include <core/support/PreferenceKeys.h>
#include <core/library/LocalSimpleDataProvider.h>
#include <core/library/LocalMetadataProxy.h>
#include <core/runtime/Message.h>
#include <core/support/Messages.h>
@ -63,7 +63,7 @@ using namespace musik::core::sdk;
typedef void(*SetEnvironment)(IEnvironment*);
typedef void(*SetDebug)(IDebug*);
typedef void(*SetSimpleDataProvider)(ISimpleDataProvider*);
typedef void(*SetMetadataProxy)(IMetadataProxy*);
typedef void(*SetIndexerNotifier)(IIndexerNotifier*);
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 ILibraryPtr library;
static IPlaybackService* playback = nullptr;
static LocalSimpleDataProvider* dataProvider = nullptr;
static LocalMetadataProxy* metadataProxy = nullptr;
static std::shared_ptr<Preferences> playbackPrefs;
static void saveEnvironment() {
@ -357,18 +357,18 @@ namespace musik { namespace core { namespace plugin {
func(&debugger);
});
/* data providers */
delete dataProvider;
/* metadata proxies */
delete metadataProxy;
::messageQueue = messageQueue;
::library = library;
::playback = playback;
::dataProvider = new LocalSimpleDataProvider(library);
::metadataProxy = new LocalMetadataProxy(library);
::playbackPrefs = Preferences::ForComponent(prefs::components::Playback);
PluginFactory::Instance().QueryFunction<SetSimpleDataProvider>(
"SetSimpleDataProvider",
[](musik::core::sdk::IPlugin* plugin, SetSimpleDataProvider func) {
func(dataProvider);
PluginFactory::Instance().QueryFunction<SetMetadataProxy>(
"SetMetadataProxy",
[](musik::core::sdk::IPlugin* plugin, SetMetadataProxy func) {
func(metadataProxy);
});
/* indexer */
@ -394,15 +394,15 @@ namespace musik { namespace core { namespace plugin {
Preferences::SavePluginPreferences();
/* data providers */
PluginFactory::Instance().QueryFunction<SetSimpleDataProvider>(
"SetSimpleDataProvider",
[](musik::core::sdk::IPlugin* plugin, SetSimpleDataProvider func) {
PluginFactory::Instance().QueryFunction<SetMetadataProxy>(
"SetMetadataProxy",
[](musik::core::sdk::IPlugin* plugin, SetMetadataProxy func) {
func(nullptr);
});
delete dataProvider;
delete metadataProxy;
::messageQueue = nullptr;
::dataProvider = nullptr;
::metadataProxy = nullptr;
::library.reset();
::playback = nullptr;
::playbackPrefs.reset();

View File

@ -41,7 +41,7 @@
namespace musik { namespace core { namespace sdk {
class ISimpleDataProvider {
class IMetadataProxy {
public:
virtual ITrackList* QueryTracks(
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.db.OfflineDb
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
@ApplicationScope
@ -22,6 +22,6 @@ interface AppComponent {
fun offlineDb(): OfflineDb /* via DataModule */
fun gaplessDb(): GaplessDb /* via DataModule */
fun connectionsDb(): ConnectionsDb /* via DataModule */
fun dataProvider(): IDataProvider /* via DataModule */
fun metadataProxy(): IMetadataProxy /* via DataModule */
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.playback.impl.streaming.db.OfflineDb
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.impl.remote.RemoteDataProvider
import io.casey.musikcube.remote.service.websocket.model.IMetadataProxy
import io.casey.musikcube.remote.service.websocket.model.impl.remote.RemoteMetadataProxy
import io.casey.musikcube.remote.ui.settings.model.ConnectionsDb
@Module
class DataModule {
@Provides
fun providesDataProvider(wss: WebSocketService): IDataProvider = RemoteDataProvider(wss)
fun providesMetadataProxy(wss: WebSocketService): IMetadataProxy = RemoteMetadataProxy(wss)
@ApplicationScope
@Provides
fun providesOfflineDb(context: Context): OfflineDb {
return Room.databaseBuilder(context, OfflineDb::class.java, "offline").build()
}
fun providesOfflineDb(context: Context): OfflineDb =
Room.databaseBuilder(context, OfflineDb::class.java, "offline").build()
@ApplicationScope
@Provides
fun providesConnectionsDb(context: Context): ConnectionsDb {
return Room.databaseBuilder(context, ConnectionsDb::class.java, "connections").build()
}
fun providesConnectionsDb(context: Context): ConnectionsDb =
Room.databaseBuilder(context, ConnectionsDb::class.java, "connections").build()
@ApplicationScope
@Provides
fun providesGaplessDb(context: Context): GaplessDb {
return Room.databaseBuilder(context, GaplessDb::class.java, "gapless").build()
}
fun providesGaplessDb(context: Context): GaplessDb =
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.shared.activity.BaseActivity
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.view.EmptyListView
import io.casey.musikcube.remote.ui.tracks.activity.TrackListActivity
@ -50,7 +50,7 @@ interface ViewComponent {
fun inject(view: EmptyListView)
fun inject(view: MainMetadataView)
fun inject(mixin: DataProviderMixin)
fun inject(mixin: MetadataProxyMixin)
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.SocketMessage
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.ITrackListQueryFactory
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 dataProvider: IDataProvider
@Inject lateinit var metadataProxy: IMetadataProxy
private val handler = Handler()
private val listeners = HashSet<() -> Unit>()
@ -279,7 +279,7 @@ class RemotePlaybackService : IPlaybackService {
if (listeners.size == 1) {
wss.addClient(client)
dataProvider.attach()
metadataProxy.attach()
scheduleTimeSyncMessage()
}
}
@ -289,7 +289,7 @@ class RemotePlaybackService : IPlaybackService {
if (listeners.size == 0) {
wss.removeClient(client)
dataProvider.detach()
metadataProxy.detach()
handler.removeCallbacks(syncTimeRunnable)
}
}
@ -405,8 +405,8 @@ class RemotePlaybackService : IPlaybackService {
get() = QueryContext(Messages.Request.QueryPlayQueueTracks)
override val playlistQueryFactory: ITrackListQueryFactory = object : ITrackListQueryFactory {
override fun count(): Observable<Int> = dataProvider.getPlayQueueTracksCount()
override fun page(offset: Int, limit: Int): Observable<List<ITrack>> = dataProvider.getPlayQueueTracks(limit, offset)
override fun count(): Observable<Int> = metadataProxy.getPlayQueueTracksCount()
override fun page(offset: Int, limit: Int): Observable<List<ITrack>> = metadataProxy.getPlayQueueTracks(limit, offset)
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.system.SystemService
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.ITrackListQueryFactory
import io.casey.musikcube.remote.service.websocket.model.PlayQueueType
@ -30,7 +30,7 @@ import java.util.*
import javax.inject.Inject
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 listeners = HashSet<() -> Unit>()
@ -125,8 +125,8 @@ class StreamingPlaybackService(context: Context) : IPlaybackService {
@Synchronized override fun connect(listener: () -> Unit) {
listeners.add(listener)
if (listeners.size == 1) {
handler.removeCallbacks(dataProviderDisconnectRunnable)
dataProvider.attach()
handler.removeCallbacks(metadataProxyDisconnectRunnable)
metadataProxy.attach()
}
}
@ -138,7 +138,7 @@ class StreamingPlaybackService(context: Context) : IPlaybackService {
conditions between Activity changes, so we make sure to give
things a couple seconds to settle... */
handler.postDelayed(
dataProviderDisconnectRunnable,
metadataProxyDisconnectRunnable,
DATA_PROVIDER_DISCONNECT_DELAY_MS.toLong())
}
}
@ -150,7 +150,7 @@ class StreamingPlaybackService(context: Context) : IPlaybackService {
override fun playAll(index: Int, filter: String) {
if (requestAudioFocus()) {
trackMetadataCache.clear()
dataProvider.invalidatePlayQueueSnapshot()
metadataProxy.invalidatePlayQueueSnapshot()
resetPlayContextAndQueryFactory()
val type = Messages.Request.QueryTracks
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) {
if (requestAudioFocus()) {
trackMetadataCache.clear()
dataProvider.invalidatePlayQueueSnapshot()
metadataProxy.invalidatePlayQueueSnapshot()
resetPlayContextAndQueryFactory()
val type = Messages.Request.QueryTracksByCategory
loadQueueAndPlay(QueryContext(category, categoryId, filter, type), index)
@ -185,16 +185,16 @@ class StreamingPlaybackService(context: Context) : IPlaybackService {
val type = PlayQueueType.Snapshot
service.queryContext?.let {
dataProvider.snapshotPlayQueue().subscribeBy(
metadataProxy.snapshotPlayQueue().subscribeBy(
onNext = {
resetPlayContextAndQueryFactory()
snapshotQueryFactory = object: ITrackListQueryFactory {
override fun count(): Observable<Int>? =
dataProvider.getPlayQueueTracksCount(type)
metadataProxy.getPlayQueueTracksCount(type)
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
}
@ -789,11 +789,11 @@ class StreamingPlaybackService(context: Context) : IPlaybackService {
val params = queryContext
if (params != null) {
if (params.hasCategory()) {
return dataProvider.getTrackCountByCategory(
return metadataProxy.getTrackCountByCategory(
params.category ?: "", params.categoryId, params.filter)
}
else {
return dataProvider.getTrackCount(params.filter)
return metadataProxy.getTrackCount(params.filter)
}
}
return null
@ -803,11 +803,11 @@ class StreamingPlaybackService(context: Context) : IPlaybackService {
val params = queryContext
if (params != null) {
if (params.hasCategory()) {
return dataProvider.getTracksByCategory(
return metadataProxy.getTracksByCategory(
params.category ?: "", params.categoryId, limit, offset, params.filter)
}
else {
return dataProvider.getTracks(limit, offset, params.filter)
return metadataProxy.getTracks(limit, offset, params.filter)
}
}
return null
@ -840,10 +840,10 @@ class StreamingPlaybackService(context: Context) : IPlaybackService {
private fun detachable() =
listeners.size == 0 && state == PlaybackState.Stopped
private val dataProviderDisconnectRunnable = object: Runnable {
private val metadataProxyDisconnectRunnable = object: Runnable {
override fun run() {
if (detachable()) {
dataProvider.detach()
metadataProxy.detach()
}
}
}

View File

@ -2,7 +2,7 @@ package io.casey.musikcube.remote.service.websocket.model
import io.reactivex.Observable
interface IDataProvider {
interface IMetadataProxy {
enum class State { Disconnected, Connecting, Connected }
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.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.ITrackListQueryFactory
import io.reactivex.Observable
@ -10,14 +10,14 @@ import org.json.JSONObject
import javax.inject.Inject
class IdListTrackListQueryFactory(private val idList: List<String>): ITrackListQueryFactory {
@Inject protected lateinit var dataProvider: IDataProvider
@Inject protected lateinit var metadataProxy: IMetadataProxy
init {
DaggerDataComponent.builder()
.appComponent(Application.appComponent)
.build().inject(this)
dataProvider.attach()
metadataProxy.attach()
}
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())
return dataProvider.getTracks(window)
return metadataProxy.getTracks(window)
.flatMap{ it ->
val result = mutableListOf<ITrack>()
for (i in 0 until max) {
@ -43,6 +43,6 @@ class IdListTrackListQueryFactory(private val idList: List<String>): ITrackListQ
override fun offline(): Boolean = false
fun destroy() {
dataProvider.destroy()
metadataProxy.destroy()
}
}

View File

@ -15,12 +15,12 @@ import io.reactivex.subjects.ReplaySubject
import org.json.JSONArray
import org.json.JSONObject
class RemoteDataProvider(private val service: WebSocketService) : IDataProvider {
class RemoteMetadataProxy(private val service: WebSocketService) : IMetadataProxy {
private var disposables = CompositeDisposable()
private var currentState = mapState(service.state)
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()
@ -32,7 +32,7 @@ class RemoteDataProvider(private val service: WebSocketService) : IDataProvider
}, { /*error */ }))
}
override val state: IDataProvider.State
override val state: IMetadataProxy.State
get() = currentState
override fun getAlbums(filter: String): Observable<List<IAlbum>> =
@ -550,7 +550,7 @@ class RemoteDataProvider(private val service: WebSocketService) : IDataProvider
.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())
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) {
WebSocketService.State.Disconnected -> IDataProvider.State.Disconnected
WebSocketService.State.Connecting -> IDataProvider.State.Connecting
WebSocketService.State.Connected -> IDataProvider.State.Connected
WebSocketService.State.Disconnected -> IMetadataProxy.State.Disconnected
WebSocketService.State.Connecting -> IMetadataProxy.State.Connecting
WebSocketService.State.Connected -> IMetadataProxy.State.Connected
}
companion object {

View File

@ -9,7 +9,7 @@ import android.view.ViewGroup
import com.simplecityapps.recyclerview_fastscroll.views.FastScrollRecyclerView
import io.casey.musikcube.remote.R
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.constant.Album
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.setupDefaultRecyclerView
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.PlaybackMixin
import io.casey.musikcube.remote.ui.shared.view.EmptyListView
@ -35,7 +35,7 @@ class AlbumBrowseFragment: BaseFragment(), IFilterable, ITitleProvider, ITranspo
private var lastFilter = ""
private lateinit var adapter: AlbumBrowseAdapter
private lateinit var playback: PlaybackMixin
private lateinit var data: DataProviderMixin
private lateinit var data: MetadataProxyMixin
private lateinit var emptyView: EmptyListView
override val title: String
@ -43,7 +43,7 @@ class AlbumBrowseFragment: BaseFragment(), IFilterable, ITitleProvider, ITranspo
override fun onCreate(savedInstanceState: Bundle?) {
component.inject(this)
data = mixin(DataProviderMixin())
data = mixin(MetadataProxyMixin())
playback = mixin(PlaybackMixin())
mixin(ItemContextMenuMixin(appCompatActivity, fragment = this))
@ -87,7 +87,7 @@ class AlbumBrowseFragment: BaseFragment(), IFilterable, ITitleProvider, ITranspo
override fun onInitObservables() {
disposables.add(data.provider.observeState().subscribeBy(
onNext = { state ->
if (state.first == IDataProvider.State.Connected) {
if (state.first == IMetadataProxy.State.Connected) {
requery()
} else {
emptyView.update(state.first, adapter.itemCount)

View File

@ -6,18 +6,18 @@ import android.view.View
import android.view.ViewGroup
import com.simplecityapps.recyclerview_fastscroll.views.FastScrollRecyclerView
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.navigation.Navigate
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.setupDefaultRecyclerView
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
class AllCategoriesFragment: BaseFragment(), ITitleProvider {
private lateinit var data: DataProviderMixin
private lateinit var data: MetadataProxyMixin
private lateinit var adapter: AllCategoriesAdapter
override val title: String
@ -25,7 +25,7 @@ class AllCategoriesFragment: BaseFragment(), ITitleProvider {
override fun onCreate(savedInstanceState: Bundle?) {
component.inject(this)
data = mixin(DataProviderMixin())
data = mixin(MetadataProxyMixin())
super.onCreate(savedInstanceState)
@ -41,7 +41,7 @@ class AllCategoriesFragment: BaseFragment(), ITitleProvider {
override fun onInitObservables() {
disposables.add(data.provider.observeState().subscribeBy(
onNext = { states ->
if (states.first == IDataProvider.State.Connected) {
if (states.first == IMetadataProxy.State.Connected) {
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.service.playback.impl.remote.Metadata
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.constant.Category
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.setupDefaultRecyclerView
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.PlaybackMixin
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 lateinit var rootView: View
private lateinit var emptyView: EmptyListView
private lateinit var data: DataProviderMixin
private lateinit var data: MetadataProxyMixin
private lateinit var playback: PlaybackMixin
private val navigationType: NavigationType
@ -68,7 +68,7 @@ class CategoryBrowseFragment: BaseFragment(), IFilterable, ITitleProvider, ITran
super.onCreate(savedInstanceState)
component.inject(this)
data = mixin(DataProviderMixin())
data = mixin(MetadataProxyMixin())
playback = mixin(PlaybackMixin())
mixin(ItemContextMenuMixin(appCompatActivity, contextMenuListener, this))
@ -118,11 +118,11 @@ class CategoryBrowseFragment: BaseFragment(), IFilterable, ITitleProvider, ITran
disposables.add(data.provider.observeState().subscribeBy(
onNext = { states ->
when (states.first) {
IDataProvider.State.Connected -> {
IMetadataProxy.State.Connected -> {
filterDebouncer.cancel()
requery()
}
IDataProvider.State.Disconnected -> {
IMetadataProxy.State.Disconnected -> {
emptyView.update(states.first, adapter.itemCount)
}
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.impl.remote.Metadata
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.view.MainMetadataView
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.showSnackbar
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.util.Duration
import io.casey.musikcube.remote.ui.shared.util.UpdateCheck
@ -42,7 +42,7 @@ class MainActivity : BaseActivity() {
private var seekbarValue = -1
private var blink = 0
private lateinit var data: DataProviderMixin
private lateinit var data: MetadataProxyMixin
private lateinit var playback: PlaybackMixin
/* views */
@ -64,7 +64,7 @@ class MainActivity : BaseActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
component.inject(this)
data = mixin(DataProviderMixin())
data = mixin(MetadataProxyMixin())
playback = mixin(PlaybackMixin { rebindUi() })
super.onCreate(savedInstanceState)
@ -174,12 +174,12 @@ class MainActivity : BaseActivity() {
disposables.add(data.provider.observeState().subscribe(
{ states ->
when (states.first) {
IDataProvider.State.Connected -> {
IMetadataProxy.State.Connected -> {
rebindUi()
checkShowSpotlight()
checkShowApiMismatch()
}
IDataProvider.State.Disconnected -> {
IMetadataProxy.State.Disconnected -> {
clearUi()
}
else -> {
@ -424,7 +424,7 @@ class MainActivity : BaseActivity() {
object : ViewTreeObserver.OnGlobalLayoutListener {
override fun onGlobalLayout() {
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()
window.decorView.viewTreeObserver.removeOnGlobalLayoutListener(this)
}

View File

@ -6,7 +6,7 @@ import android.view.View
import android.view.ViewGroup
import com.simplecityapps.recyclerview_fastscroll.views.FastScrollRecyclerView
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.ui.playqueue.adapter.PlayQueueAdapter
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.setupDefaultRecyclerView
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.PlaybackMixin
import io.casey.musikcube.remote.ui.shared.model.DefaultSlidingWindow
@ -24,7 +24,7 @@ import io.reactivex.rxkotlin.subscribeBy
class PlayQueueFragment: BaseFragment(), ITitleProvider {
private var offlineQueue: Boolean = false
private lateinit var data: DataProviderMixin
private lateinit var data: MetadataProxyMixin
private lateinit var playback: PlaybackMixin
private lateinit var tracks: DefaultSlidingWindow
private lateinit var adapter: PlayQueueAdapter
@ -35,7 +35,7 @@ class PlayQueueFragment: BaseFragment(), ITitleProvider {
override fun onCreate(savedInstanceState: Bundle?) {
component.inject(this)
data = mixin(DataProviderMixin())
data = mixin(MetadataProxyMixin())
playback = mixin(PlaybackMixin(playbackEvents))
mixin(ItemContextMenuMixin(appCompatActivity, null, this))
super.onCreate(savedInstanceState)
@ -76,7 +76,7 @@ class PlayQueueFragment: BaseFragment(), ITitleProvider {
override fun onInitObservables() {
disposables.add(data.provider.observeState().subscribeBy(
onNext = { states ->
if (states.first == IDataProvider.State.Connected) {
if (states.first == IMetadataProxy.State.Connected) {
tracks.requery()
}
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.RemoteEqViewModel
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.reactivex.rxkotlin.subscribeBy
class RemoteEqActivity: BaseActivity() {
private lateinit var data: DataProviderMixin
private lateinit var data: MetadataProxyMixin
private lateinit var viewModel: RemoteEqViewModel
private lateinit var loadingOverlay: View
private lateinit var table: TableLayout
@ -26,7 +26,7 @@ class RemoteEqActivity: BaseActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
component.inject(this)
data = mixin(DataProviderMixin())
data = mixin(MetadataProxyMixin())
mixin(ViewModelMixin(this))
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.settings.viewmodel.RemoteSettingsViewModel
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.reactivex.rxkotlin.subscribeBy
import io.casey.musikcube.remote.ui.settings.viewmodel.BaseRemoteViewModel.State as ViewModelState
class RemoteSettingsActivity: BaseActivity() {
private var initialized = false
private lateinit var data: DataProviderMixin
private lateinit var data: MetadataProxyMixin
private lateinit var viewModel: RemoteSettingsViewModel
private lateinit var loadingOverlay: View
private lateinit var driverSpinner: Spinner
@ -37,7 +37,7 @@ class RemoteSettingsActivity: BaseActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
component.inject(this)
data = mixin(DataProviderMixin())
data = mixin(MetadataProxyMixin())
mixin(ViewModelMixin(this))
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.shared.activity.BaseActivity
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 java.util.*
import javax.inject.Inject
@ -49,10 +49,10 @@ class SettingsActivity : BaseActivity() {
private lateinit var cacheSpinner: Spinner
private lateinit var titleEllipsisSpinner: Spinner
private lateinit var playback: PlaybackMixin
private lateinit var data: DataProviderMixin
private lateinit var data: MetadataProxyMixin
override fun onCreate(savedInstanceState: Bundle?) {
data = mixin(DataProviderMixin())
data = mixin(MetadataProxyMixin())
playback = mixin(PlaybackMixin())
component.inject(this)
super.onCreate(savedInstanceState)

View File

@ -1,22 +1,22 @@
package io.casey.musikcube.remote.ui.settings.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.rxkotlin.subscribeBy
abstract class BaseRemoteViewModel: ViewModel<BaseRemoteViewModel.State>() {
protected var provider: IDataProvider? = null
protected var provider: IMetadataProxy? = null
protected var disposables = CompositeDisposable()
enum class State { Disconnected, Saving, Saved, Loading, Ready, Error }
fun attach(provider: IDataProvider) {
fun attach(provider: IMetadataProxy) {
this.provider = provider
this.provider?.let {
this.disposables.add(it.observeState().subscribeBy(
onNext = {
if (it.first == IDataProvider.State.Connected) {
if (it.first == IMetadataProxy.State.Connected) {
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.websocket.model.IAlbum
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.ui.category.constant.Category
import io.casey.musikcube.remote.ui.navigation.Navigate
@ -38,7 +38,7 @@ class ItemContextMenuMixin(private val activity: AppCompatActivity,
internal val fragment: BaseFragment? = null): MixinBase() {
private enum class TrackType { Normal, Playlist }
@Inject lateinit var provider: IDataProvider
@Inject lateinit var provider: IMetadataProxy
open class EventListener {
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.injection.DaggerViewComponent
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
class DataProviderMixin : MixinBase() {
class MetadataProxyMixin : MixinBase() {
@Inject lateinit var wss: WebSocketService
@Inject lateinit var provider: IDataProvider
@Inject lateinit var provider: IMetadataProxy
override fun onCreate(bundle: Bundle) {
super.onCreate(bundle)

View File

@ -3,14 +3,14 @@ package io.casey.musikcube.remote.ui.shared.model
import androidx.recyclerview.widget.RecyclerView
import com.simplecityapps.recyclerview_fastscroll.interfaces.OnFastScrollStateChangeListener
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.util.Debouncer
import io.reactivex.disposables.CompositeDisposable
abstract class BaseSlidingWindow(
private val recyclerView: FastScrollRecyclerView,
private val dataProvider: IDataProvider) : ITrackListSlidingWindow
private val metadataProxy: IMetadataProxy) : ITrackListSlidingWindow
{
private var scrollState = RecyclerView.SCROLL_STATE_IDLE
private var fastScrollerActive = false
@ -40,7 +40,7 @@ abstract class BaseSlidingWindow(
}
override fun resume() {
disposables.add(dataProvider.observePlayQueue()
disposables.add(metadataProxy.observePlayQueue()
.subscribe({ requery() }, { /* error */ }))
recyclerView.setOnFastScrollStateChangeListener(fastScrollStateChangeListener)

View File

@ -2,16 +2,16 @@ package io.casey.musikcube.remote.ui.shared.model
import android.util.Log
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.ITrackListQueryFactory
import io.reactivex.rxkotlin.subscribeBy
class DefaultSlidingWindow(
private val recyclerView: FastScrollRecyclerView,
dataProvider: IDataProvider,
metadataProxy: IMetadataProxy,
private val queryFactory: ITrackListQueryFactory)
: BaseSlidingWindow(recyclerView, dataProvider)
: BaseSlidingWindow(recyclerView, metadataProxy)
{
private var queryOffset = -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.impl.streaming.StreamingPlaybackService
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.tracks.activity.TrackListActivity
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) {
visibility = View.INVISIBLE
}
@ -96,7 +96,7 @@ class EmptyListView : FrameLayout {
val showOfflineContainer =
capability == Capability.OnlineOnly &&
PlaybackServiceFactory.instance(context) is StreamingPlaybackService &&
state != IDataProvider.State.Connected
state != IMetadataProxy.State.Connected
offlineContainer?.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.showErrorSnackbar
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.tracks.adapter.EditPlaylistAdapter
import io.casey.musikcube.remote.ui.tracks.model.EditPlaylistViewModel
@ -26,13 +26,13 @@ import io.reactivex.rxkotlin.subscribeBy
class EditPlaylistActivity: BaseActivity() {
private lateinit var viewModel: EditPlaylistViewModel
private lateinit var data: DataProviderMixin
private lateinit var data: MetadataProxyMixin
private lateinit var adapter: EditPlaylistAdapter
private var playlistName = ""
override fun onCreate(savedInstanceState: Bundle?) {
mixin(ViewModelMixin(this))
data = mixin(DataProviderMixin())
data = mixin(MetadataProxyMixin())
super.onCreate(savedInstanceState)
playlistName = extras.getString(EXTRA_PLAYLIST_NAME, "-")
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 io.casey.musikcube.remote.R
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.ITrackListQueryFactory
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.extension.*
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.PlaybackMixin
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 queryFactory: ITrackListQueryFactory
private lateinit var data: DataProviderMixin
private lateinit var data: MetadataProxyMixin
private lateinit var playback: PlaybackMixin
private var categoryType: String = ""
@ -49,7 +49,7 @@ class TrackListFragment: BaseFragment(), IFilterable, ITitleProvider, ITransport
override fun onCreate(savedInstanceState: Bundle?) {
component.inject(this)
data = mixin(DataProviderMixin())
data = mixin(MetadataProxyMixin())
playback = mixin(PlaybackMixin())
super.onCreate(savedInstanceState)
@ -83,8 +83,8 @@ class TrackListFragment: BaseFragment(), IFilterable, ITitleProvider, ITransport
disposables.add(data.provider.observeState().subscribeBy(
onNext = { states ->
val shouldRequery =
states.first === IDataProvider.State.Connected ||
(states.first === IDataProvider.State.Disconnected && isOfflineTracks)
states.first === IMetadataProxy.State.Connected ||
(states.first === IMetadataProxy.State.Disconnected && isOfflineTracks)
if (shouldRequery) {
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.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.impl.remote.RemoteTrack
import io.reactivex.Observable
@ -17,7 +17,7 @@ class EditPlaylistViewModel(private val playlistId: Long): ViewModel<EditPlaylis
private var metadataDisposable: Disposable? = null
private var requestOffset = -1
private var dataProvider: IDataProvider? = null
private var metadataProxy: IMetadataProxy? = null
private var externalIds: MutableList<String> = mutableListOf()
private val cache = object : LinkedHashMap<String, CacheEntry>() {
@ -29,13 +29,13 @@ class EditPlaylistViewModel(private val playlistId: Long): ViewModel<EditPlaylis
field = value
}
fun attach(dataProvider: IDataProvider) {
this.dataProvider = dataProvider
fun attach(metadataProxy: IMetadataProxy) {
this.metadataProxy = metadataProxy
}
override fun onDestroy() {
super.onDestroy()
this.dataProvider = null
this.metadataProxy = null
}
private var status: Status = Status.NotLoaded
@ -67,7 +67,7 @@ class EditPlaylistViewModel(private val playlistId: Long): ViewModel<EditPlaylis
return Observable.just(playlistId)
}
return dataProvider?.overwritePlaylistWithExternalIds(
return metadataProxy?.overwritePlaylistWithExternalIds(
playlistId, externalIds.toList()) ?: Observable.just(-1L)
}
@ -84,7 +84,7 @@ class EditPlaylistViewModel(private val playlistId: Long): ViewModel<EditPlaylis
private fun refreshTrackIds() {
status = Status.Loading
dataProvider?.let {
metadataProxy?.let {
status = Status.Loading
it.getTrackIdsByCategory(PLAYLISTS, playlistId).subscribeBy(
@ -103,7 +103,7 @@ class EditPlaylistViewModel(private val playlistId: Long): ViewModel<EditPlaylis
return /* in flight */
}
dataProvider?.let {
metadataProxy?.let {
metadataDisposable?.dispose()
metadataDisposable = null

View File

@ -6,7 +6,7 @@ buildscript {
jcenter()
}
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 'com.google.gms:google-services:4.2.0'
}

View File

@ -34,7 +34,7 @@
#pragma once
#include <core/sdk/ISimpleDataProvider.h>
#include <core/sdk/IMetadataProxy.h>
#include <core/sdk/IPreferences.h>
#include <core/sdk/IPlaybackService.h>
#include <core/sdk/IEnvironment.h>
@ -64,12 +64,12 @@ class ReadWriteLock {
struct Context {
Context() {
this->dataProvider = nullptr;
this->metadataProxy = nullptr;
this->prefs = nullptr;
this->playback = nullptr;
}
musik::core::sdk::ISimpleDataProvider* dataProvider;
musik::core::sdk::IMetadataProxy* metadataProxy;
musik::core::sdk::IPreferences* prefs;
musik::core::sdk::IPlaybackService* playback;
musik::core::sdk::IEnvironment* environment;

View File

@ -412,7 +412,7 @@ int HttpServer::HandleAudioTrackRequest(
if (byExternalId) {
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
std::cerr << "externalId: " << externalId << "\n";
@ -421,7 +421,7 @@ int HttpServer::HandleAudioTrackRequest(
}
else if (pathParts.at(1) == fragment::id) {
uint64_t id = std::stoull(urlDecode(pathParts.at(2)));
track = server->context.dataProvider->QueryTrackById(id);
track = server->context.metadataProxy->QueryTrackById(id);
}
if (track) {

View File

@ -694,7 +694,7 @@ ITrackList* WebSocketServer::QueryTracks(json& request, int& limit, int& offset)
json& options = request[message::options];
std::string filter = options.value(key::filter, "");
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;
}
@ -718,7 +718,7 @@ void WebSocketServer::RespondWithQueryTracksByExternalIds(connection_hdl connect
json& externalIds = options[key::external_ids];
if (externalIds.is_array()) {
auto externalIdArray = jsonToStringArray(externalIds);
ITrackList* trackList = context.dataProvider
ITrackList* trackList = context.metadataProxy
->QueryTracksByExternalId(
(const char**) externalIdArray.get(),
externalIds.size());
@ -856,7 +856,7 @@ void WebSocketServer::RespondWithQueryAlbums(connection_hdl connection, json& re
std::string category = options.value(key::category, "");
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());
json result = json::array();
@ -916,7 +916,7 @@ void WebSocketServer::RespondWithPlayTracks(connection_hdl connection, json& req
if (externalIds.is_array()) {
auto externalIdArray = jsonToStringArray(externalIds);
ITrackList* trackList = context.dataProvider
ITrackList* trackList = context.metadataProxy
->QueryTracksByExternalId(
(const char**)externalIdArray.get(),
externalIds.size());
@ -970,11 +970,11 @@ ITrackList* WebSocketServer::QueryTracksByCategory(json& request, int& limit, in
if (predicates.size()) {
auto predicateList = jsonToPredicateList(predicates);
return context.dataProvider->QueryTracksByCategories(
return context.metadataProxy->QueryTracksByCategories(
predicateList.get(), predicates.size(), filter.c_str(), limit, offset);
}
else {
return context.dataProvider->QueryTracksByCategory(
return context.metadataProxy->QueryTracksByCategory(
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) {
IValueList* result = context.dataProvider->ListCategories();
IValueList* result = context.metadataProxy->ListCategories();
if (result != nullptr) {
json list = json::array();
@ -1031,7 +1031,7 @@ void WebSocketServer::RespondWithQueryCategory(connection_hdl connection, json&
if (predicates.size()) {
auto predicateList = jsonToPredicateList(predicates);
result = context.dataProvider
result = context.metadataProxy
->QueryCategoryWithPredicates(
category.c_str(),
predicateList.get(),
@ -1039,7 +1039,7 @@ void WebSocketServer::RespondWithQueryCategory(connection_hdl connection, json&
filter.c_str());
}
else {
result = context.dataProvider
result = context.metadataProxy
->QueryCategoryWithPredicate(
category.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);
}
ITrackList* tracks = context.dataProvider->QueryTracks(filter.c_str());
ITrackList* tracks = context.metadataProxy->QueryTracks(filter.c_str());
if (tracks) {
context.playback->Play(tracks, index);
@ -1175,7 +1175,7 @@ void WebSocketServer::RespondWithSavePlaylist(connection_hdl connection, json& r
if (externalIds.is_array()) {
auto externalIdArray = jsonToStringArray(externalIds);
int64_t newPlaylistId = this->context.dataProvider
int64_t newPlaylistId = this->context.metadataProxy
->SavePlaylistWithExternalIds(
(const char**) externalIdArray.get(),
externalIds.size(),
@ -1209,7 +1209,7 @@ void WebSocketServer::RespondWithSavePlaylist(connection_hdl connection, json& r
}
if (tracks) {
int64_t newPlaylistId = this->context.dataProvider
int64_t newPlaylistId = this->context.metadataProxy
->SavePlaylistWithTrackList(tracks, name.c_str(), id);
tracks->Release();
@ -1236,7 +1236,7 @@ void WebSocketServer::RespondWithRenamePlaylist(connection_hdl connection, json&
int64_t id = options[key::playlist_id];
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->RespondWithFailure(connection, request);
}
@ -1245,7 +1245,7 @@ void WebSocketServer::RespondWithDeletePlaylist(connection_hdl connection, json&
auto& options = request[message::options];
int64_t id = options[key::playlist_id];
this->context.dataProvider->DeletePlaylist(id)
this->context.metadataProxy->DeletePlaylist(id)
? this->RespondWithSuccess(connection, request)
: this->RespondWithFailure(connection, request);
}
@ -1265,7 +1265,7 @@ void WebSocketServer::RespondWithAppendToPlaylist(connection_hdl connection, jso
if (externalIds.is_array()) {
auto externalIdArray = jsonToStringArray(externalIds);
bool result = this->context.dataProvider
bool result = this->context.metadataProxy
->AppendToPlaylistWithExternalIds(
id,
(const char**) externalIdArray.get(),
@ -1295,7 +1295,7 @@ void WebSocketServer::RespondWithAppendToPlaylist(connection_hdl connection, jso
}
if (tracks) {
bool result = this->context.dataProvider
bool result = this->context.metadataProxy
->AppendToPlaylistWithTrackList(id, tracks, offset);
tracks->Release();
@ -1527,7 +1527,7 @@ void WebSocketServer::RespondWithRemoveTracksFromPlaylist(connection_hdl connect
auto ids = jsonToStringArray(*externalIdsIt);
auto orders = jsonToIntArray<int>(*sortOrdersIt);
updated = this->context.dataProvider
updated = this->context.metadataProxy
->RemoveTracksFromPlaylist(
id,
(const char**)ids.get(),

View File

@ -84,10 +84,10 @@ static class PlaybackRemote : public IPlaybackRemote {
}
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)));
}
else if (thread && (!context.environment || !context.playback || !context.prefs || !context.dataProvider)) {
else if (thread && (!context.environment || !context.playback || !context.prefs || !context.metadataProxy)) {
this->Stop();
}
}
@ -202,8 +202,8 @@ extern "C" DLL_EXPORT void SetPreferences(musik::core::sdk::IPreferences* prefs)
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();
context.dataProvider = dataProvider;
context.metadataProxy = metadataProxy;
remote.CheckRunningStatus();
}