diff --git a/subsonic-api/src/integrationTest/kotlin/org/moire/ultrasonic/api/subsonic/SubsonicApiCreateBookmarkTest.kt b/subsonic-api/src/integrationTest/kotlin/org/moire/ultrasonic/api/subsonic/SubsonicApiCreateBookmarkTest.kt new file mode 100644 index 00000000..10f253c8 --- /dev/null +++ b/subsonic-api/src/integrationTest/kotlin/org/moire/ultrasonic/api/subsonic/SubsonicApiCreateBookmarkTest.kt @@ -0,0 +1,51 @@ +package org.moire.ultrasonic.api.subsonic + +import org.junit.Test + +/** + * Integration test for [SubsonicAPIDefinition.createBookmark] call. + */ +class SubsonicApiCreateBookmarkTest : SubsonicAPIClientTest() { + @Test + fun `Should handle error response`() { + checkErrorCallParsed(mockWebServerRule) { + client.api.createBookmark(1, 1).execute() + } + } + + @Test + fun `Should handle ok response`() { + mockWebServerRule.enqueueResponse("ping_ok.json") + + val response = client.api.createBookmark(213, 123213L).execute() + + assertResponseSuccessful(response) + } + + @Test + fun `Should pass id in request params`() { + val id = 544 + + mockWebServerRule.assertRequestParam(expectedParam = "id=$id") { + client.api.createBookmark(id = id, position = 123).execute() + } + } + + @Test + fun `Should pass position in request params`() { + val position = 4412333L + + mockWebServerRule.assertRequestParam(expectedParam = "position=$position") { + client.api.createBookmark(id = 12, position = position).execute() + } + } + + @Test + fun `Should pass comment in request params`() { + val comment = "some-comment" + + mockWebServerRule.assertRequestParam(expectedParam = "comment=$comment") { + client.api.createBookmark(id = 1, position = 1, comment = comment).execute() + } + } +} diff --git a/subsonic-api/src/main/kotlin/org/moire/ultrasonic/api/subsonic/SubsonicAPIDefinition.kt b/subsonic-api/src/main/kotlin/org/moire/ultrasonic/api/subsonic/SubsonicAPIDefinition.kt index 04bb260a..5158a7a4 100644 --- a/subsonic-api/src/main/kotlin/org/moire/ultrasonic/api/subsonic/SubsonicAPIDefinition.kt +++ b/subsonic-api/src/main/kotlin/org/moire/ultrasonic/api/subsonic/SubsonicAPIDefinition.kt @@ -224,4 +224,10 @@ interface SubsonicAPIDefinition { @GET("getBookmarks.view") fun getBookmarks(): Call + + @GET("createBookmark.view") + fun createBookmark( + @Query("id") id: Int, + @Query("position") position: Long, + @Query("comment") comment: String? = null): Call } diff --git a/ultrasonic/src/main/java/org/moire/ultrasonic/service/RESTMusicService.java b/ultrasonic/src/main/java/org/moire/ultrasonic/service/RESTMusicService.java index 31c4afb9..fecd8404 100644 --- a/ultrasonic/src/main/java/org/moire/ultrasonic/service/RESTMusicService.java +++ b/ultrasonic/src/main/java/org/moire/ultrasonic/service/RESTMusicService.java @@ -1284,33 +1284,20 @@ public class RESTMusicService implements MusicService return APIBookmarkConverter.toDomainEntitiesList(response.body().getBookmarkList()); } - @Override - public void createBookmark(String id, int position, Context context, ProgressListener progressListener) throws Exception - { - checkServerVersion(context, "1.9", "Bookmarks not supported."); - - HttpParams params = new BasicHttpParams(); - HttpConnectionParams.setSoTimeout(params, SOCKET_READ_TIMEOUT_GET_RANDOM_SONGS); - - List parameterNames = new ArrayList(); - List parameterValues = new ArrayList(); - - parameterNames.add("id"); - parameterValues.add(id); - parameterNames.add("position"); - parameterValues.add(position); - - Reader reader = getReader(context, progressListener, "createBookmark", params, parameterNames, parameterValues); - - try - { - new ErrorParser(context).parse(reader); - } - finally - { - Util.close(reader); - } - } + @Override + public void createBookmark(String id, + int position, + Context context, + ProgressListener progressListener) throws Exception { + if (id == null) { + throw new IllegalArgumentException("Item id should not be null"); + } + Integer itemId = Integer.valueOf(id); + updateProgressListener(progressListener, R.string.parser_reading); + Response response = subsonicAPIClient.getApi() + .createBookmark(itemId, position, null).execute(); + checkResponseSuccessful(response); + } @Override public void deleteBookmark(String id, Context context, ProgressListener progressListener) throws Exception