Added "ListCatgories" functionality to ISimpleDataProvider,

LocalSimpleDataProvider, WebSocketServer, and the Android IDataProvider.
This commit is contained in:
casey langen 2018-01-04 21:37:26 -08:00
parent 654f26f9b6
commit 016de4fed4
10 changed files with 62 additions and 0 deletions

View File

@ -38,6 +38,7 @@
#include <core/debug.h>
#include <core/db/ScopedTransaction.h>
#include <core/library/query/local/AlbumListQuery.h>
#include <core/library/query/local/AllCategoriesQuery.h>
#include <core/library/query/local/AppendPlaylistQuery.h>
#include <core/library/query/local/CategoryListQuery.h>
#include <core/library/query/local/CategoryTrackListQuery.h>
@ -371,6 +372,23 @@ IValueList* LocalSimpleDataProvider::QueryCategory(const char* type, const char*
return QueryCategoryWithPredicate(type, "", -1LL, filter);
}
IValueList* LocalSimpleDataProvider::ListCategories() {
try {
auto query = std::make_shared<AllCategoriesQuery>();
this->library->Enqueue(query, ILibrary::QuerySynchronous);
if (query->GetStatus() == IQuery::Finished) {
return query->GetSdkResult();
}
}
catch (...) {
musik::debug::err(TAG, "ListCategories failed");
}
return nullptr;
}
IValueList* LocalSimpleDataProvider::QueryCategoryWithPredicate(
const char* type, const char* predicateType, int64_t predicateId, const char* filter)
{

View File

@ -68,6 +68,8 @@ namespace musik { namespace core { namespace db { namespace local {
virtual musik::core::sdk::ITrackList* QueryTracksByExternalId(
const char** externalIds, size_t externalIdCount) override;
virtual musik::core::sdk::IValueList* ListCategories() override;
virtual musik::core::sdk::IValueList*
QueryCategory(
const char* type,

View File

@ -62,6 +62,8 @@ namespace musik { namespace core { namespace sdk {
virtual ITrackList* QueryTracksByExternalId(
const char** externalIds, size_t externalIdCount) = 0;
virtual IValueList* ListCategories() = 0;
virtual IValueList* QueryCategory(
const char* type,
const char* filter = "") = 0;

View File

@ -21,6 +21,7 @@ class Messages {
PlayTracks("play_tracks"),
PlayTracksByCategory("play_tracks_by_category"),
QueryTracks("query_tracks"),
ListCategories("list_categories"),
QueryTracksByCategory("query_tracks_by_category"),
QueryTracksByExternalIds("query_tracks_by_external_ids"),
QueryCategory("query_category"),

View File

@ -21,6 +21,8 @@ interface IDataProvider {
fun getTracks(limit: Int, offset: Int, filter: String = ""): Observable<List<ITrack>>
fun getTracks(externalIds: Set<String>): Observable<Map<String, ITrack>>
fun listCategories(): Observable<List<String>>
fun getTrackCountByCategory(category: String, id: Long, filter: String = ""): Observable<Int>
fun getTrackIdsByCategory(category: String, id: Long, filter: String = ""): Observable<List<String>>
fun getTracksByCategory(category: String, id: Long, filter: String = ""): Observable<List<ITrack>>

View File

@ -99,6 +99,17 @@ class RemoteDataProvider(private val service: WebSocketService) : IDataProvider
.observeOn(AndroidSchedulers.mainThread())
}
override fun listCategories(): Observable<List<String>> {
val message = SocketMessage.Builder
.request(Messages.Request.ListCategories)
.build()
return service.observe(message, client)
.observeOn(Schedulers.computation())
.flatMap<List<String>> { socketMessage -> toStringList(socketMessage) }
.observeOn(AndroidSchedulers.mainThread())
}
override fun getTracks(filter: String): Observable<List<ITrack>> =
getTracks(-1, -1, filter)

View File

@ -39,6 +39,7 @@ 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
import io.casey.musikcube.remote.ui.tracks.activity.TrackListActivity
import io.reactivex.rxkotlin.subscribeBy
class MainActivity : BaseActivity() {
private val handler = Handler()

View File

@ -158,6 +158,7 @@ namespace request {
static const std::string toggle_mute = "toggle_mute";
static const std::string get_playback_overview = "get_playback_overview";
static const std::string get_current_time = "get_current_time";
static const std::string list_categories = "list_categories";
static const std::string query_category = "query_category";
static const std::string query_tracks = "query_tracks";
static const std::string query_tracks_by_external_ids = "query_tracks_by_external_ids";

View File

@ -352,6 +352,10 @@ void WebSocketServer::HandleRequest(connection_hdl connection, json& request) {
RespondWithPlaybackOverview(connection, request);
return;
}
else if (name == request::list_categories) {
RespondWithListCategories(connection, request);
return;
}
else if (name == request::query_category) {
RespondWithQueryCategory(connection, request);
return;
@ -812,6 +816,25 @@ void WebSocketServer::RespondWithQueryTracksByCategory(connection_hdl connection
this->RespondWithInvalidRequest(connection, request[message::name], value::invalid);
}
void WebSocketServer::RespondWithListCategories(connection_hdl connection, json& request) {
IValueList* result = context.dataProvider->ListCategories();
if (result != nullptr) {
json list = json::array();
for (size_t i = 0; i < result->Count(); i++) {
list[i] = GetValueString(result->GetAt(i));
}
result->Release();
this->RespondWithOptions(connection, request, { { key::data, list } });
}
else {
this->RespondWithInvalidRequest(connection, request[message::name], value::invalid);
}
}
void WebSocketServer::RespondWithQueryCategory(connection_hdl connection, json& request) {
if (request.find(message::options) != request.end()) {
auto& options = request[message::options];

View File

@ -142,6 +142,7 @@ class WebSocketServer {
void RespondWithQueryAlbums(connection_hdl connection, json& request);
void RespondWithPlayTracks(connection_hdl connection, json& request);
void RespondWithQueryTracksByCategory(connection_hdl connection, json& request);
void RespondWithListCategories(connection_hdl connection, json& request);
void RespondWithQueryCategory(connection_hdl connection, json& request);
void RespondWithPlayAllTracks(connection_hdl connection, json& request);
void RespondWithPlayTracksByCategory(connection_hdl connection, json& request);