diff --git a/dependencies.gradle b/dependencies.gradle index 69b58c79..ce6e4309 100644 --- a/dependencies.gradle +++ b/dependencies.gradle @@ -1,7 +1,4 @@ ext.versions = [ - versionCode : 67, - versionName : "2.4.0", - minSdk : 14, targetSdk : 22, compileSdk : 27, @@ -19,7 +16,7 @@ ext.versions = [ kotlin : "1.2.31", retrofit : "2.4.0", - jackson : "2.9.0", + jackson : "2.9.5", okhttp : "3.10.0", semver : "1.0.0", twitterSerial : "0.1.6", diff --git a/subsonic-api/src/integrationTest/kotlin/org/moire/ultrasonic/api/subsonic/interceptors/VersionInterceptorTest.kt b/subsonic-api/src/integrationTest/kotlin/org/moire/ultrasonic/api/subsonic/interceptors/VersionInterceptorTest.kt index 9b543fe9..3c1eccb4 100644 --- a/subsonic-api/src/integrationTest/kotlin/org/moire/ultrasonic/api/subsonic/interceptors/VersionInterceptorTest.kt +++ b/subsonic-api/src/integrationTest/kotlin/org/moire/ultrasonic/api/subsonic/interceptors/VersionInterceptorTest.kt @@ -44,6 +44,16 @@ class VersionInterceptorTest : BaseInterceptorTest() { .protocolVersion `should equal` SubsonicAPIVersions.V1_13_0 } + @Test + fun `Should update version from response with utf-8 bom`() { + mockWebServerRule.enqueueResponse("ping_ok_utf8_bom.json") + + client.newCall(createRequest {}).execute() + + (interceptor as VersionInterceptor) + .protocolVersion `should equal` SubsonicAPIVersions.V1_16_0 + } + @Test fun `Should not update version if response json doesn't contain version`() { mockWebServerRule.enqueueResponse("non_subsonic_response.json") diff --git a/subsonic-api/src/integrationTest/resources/ping_ok_utf8_bom.json b/subsonic-api/src/integrationTest/resources/ping_ok_utf8_bom.json new file mode 100644 index 00000000..e73dbbe6 --- /dev/null +++ b/subsonic-api/src/integrationTest/resources/ping_ok_utf8_bom.json @@ -0,0 +1,4 @@ +{"subsonic-response":{ + "status": "ok", + "version": "1.16.0" +}} \ No newline at end of file diff --git a/subsonic-api/src/main/kotlin/org/moire/ultrasonic/api/subsonic/interceptors/VersionInterceptor.kt b/subsonic-api/src/main/kotlin/org/moire/ultrasonic/api/subsonic/interceptors/VersionInterceptor.kt index ae700f5a..e217c46b 100644 --- a/subsonic-api/src/main/kotlin/org/moire/ultrasonic/api/subsonic/interceptors/VersionInterceptor.kt +++ b/subsonic-api/src/main/kotlin/org/moire/ultrasonic/api/subsonic/interceptors/VersionInterceptor.kt @@ -48,8 +48,7 @@ internal class VersionInterceptor( } private fun tryUpdateProtocolVersion(response: Response) { - val content = response.peekBody(DEFAULT_PEEK_BYTE_COUNT) - .byteStream().bufferedReader().readText() + val content = response.peekBody(DEFAULT_PEEK_BYTE_COUNT).byteStream() try { val jsonReader = jsonFactory.createParser(content) diff --git a/ultrasonic/build.gradle b/ultrasonic/build.gradle index c2912a95..7cd7c804 100644 --- a/ultrasonic/build.gradle +++ b/ultrasonic/build.gradle @@ -8,8 +8,8 @@ android { defaultConfig { applicationId "org.moire.ultrasonic" - versionCode versions.versionCode - versionName versions.versionName + versionCode 68 + versionName "2.5.0" minSdkVersion versions.minSdk targetSdkVersion versions.targetSdk diff --git a/ultrasonic/src/main/java/org/moire/ultrasonic/fragment/ServerSettingsFragment.java b/ultrasonic/src/main/java/org/moire/ultrasonic/fragment/ServerSettingsFragment.java index 536e6fc4..ccc01852 100644 --- a/ultrasonic/src/main/java/org/moire/ultrasonic/fragment/ServerSettingsFragment.java +++ b/ultrasonic/src/main/java/org/moire/ultrasonic/fragment/ServerSettingsFragment.java @@ -193,20 +193,20 @@ public class ServerSettingsFragment extends PreferenceFragment private void updatePassword() { serverPasswordPref.setText(sharedPreferences - .getString(Constants.PREFERENCES_KEY_PASSWORD + serverId, "***")); - serverPasswordPref.setSummary("***"); + .getString(Constants.PREFERENCES_KEY_PASSWORD + serverId, + "")); } private void updateUsername() { serverUsernamePref.setText(sharedPreferences .getString(Constants.PREFERENCES_KEY_USERNAME + serverId, - getString(R.string.settings_server_username))); + "")); } private void updateUrl() { final String serverUrl = sharedPreferences .getString(Constants.PREFERENCES_KEY_SERVER_URL + serverId, - getString(R.string.settings_server_address_unset)); + "http://"); serverUrlPref.setText(serverUrl); serverUrlPref.setSummary(serverUrl); } @@ -214,7 +214,7 @@ public class ServerSettingsFragment extends PreferenceFragment private void updateName() { final String serverName = sharedPreferences .getString(Constants.PREFERENCES_KEY_SERVER_NAME + serverId, - getString(R.string.settings_server_unused)); + ""); serverNamePref.setText(serverName); serverNamePref.setSummary(serverName); } diff --git a/ultrasonic/src/main/java/org/moire/ultrasonic/util/Util.java b/ultrasonic/src/main/java/org/moire/ultrasonic/util/Util.java index b1d12eac..90620e00 100644 --- a/ultrasonic/src/main/java/org/moire/ultrasonic/util/Util.java +++ b/ultrasonic/src/main/java/org/moire/ultrasonic/util/Util.java @@ -21,11 +21,7 @@ package org.moire.ultrasonic.util; import android.app.Activity; import android.app.AlertDialog; import android.app.PendingIntent; -import android.content.ComponentName; -import android.content.Context; -import android.content.DialogInterface; -import android.content.Intent; -import android.content.SharedPreferences; +import android.content.*; import android.content.pm.ApplicationInfo; import android.content.pm.PackageManager; import android.content.res.TypedArray; @@ -49,33 +45,19 @@ import android.view.Gravity; import android.view.KeyEvent; import android.widget.RemoteViews; import android.widget.Toast; - import org.moire.ultrasonic.R; import org.moire.ultrasonic.activity.DownloadActivity; import org.moire.ultrasonic.activity.MainActivity; import org.moire.ultrasonic.activity.SettingsActivity; -import org.moire.ultrasonic.domain.Bookmark; -import org.moire.ultrasonic.domain.MusicDirectory; +import org.moire.ultrasonic.domain.*; import org.moire.ultrasonic.domain.MusicDirectory.Entry; -import org.moire.ultrasonic.domain.PlayerState; -import org.moire.ultrasonic.domain.RepeatMode; -import org.moire.ultrasonic.domain.SearchResult; -import org.moire.ultrasonic.domain.Version; import org.moire.ultrasonic.receiver.MediaButtonIntentReceiver; import org.moire.ultrasonic.service.DownloadFile; import org.moire.ultrasonic.service.DownloadService; import org.moire.ultrasonic.service.DownloadServiceImpl; import org.moire.ultrasonic.service.MusicServiceFactory; -import java.io.ByteArrayOutputStream; -import java.io.Closeable; -import java.io.File; -import java.io.FileInputStream; -import java.io.FileOutputStream; -import java.io.IOException; -import java.io.InputStream; -import java.io.OutputStream; -import java.io.UnsupportedEncodingException; +import java.io.*; import java.security.MessageDigest; import java.text.DecimalFormat; import java.text.NumberFormat; @@ -928,17 +910,18 @@ public class Util extends DownloadActivity return musicDirectory; } - public static MusicDirectory getSongsFromBookmarks(Iterable bookmarks) - { - MusicDirectory musicDirectory = new MusicDirectory(); + public static MusicDirectory getSongsFromBookmarks(Iterable bookmarks) { + MusicDirectory musicDirectory = new MusicDirectory(); - for (Bookmark bookmark : bookmarks) - { - musicDirectory.addChild(bookmark.getEntry()); - } + MusicDirectory.Entry song; + for (Bookmark bookmark : bookmarks) { + song = bookmark.getEntry(); + song.setBookmarkPosition(bookmark.getPosition()); + musicDirectory.addChild(song); + } - return musicDirectory; - } + return musicDirectory; + } /** *

Broadcasts the given song info as the new song being played.

diff --git a/ultrasonic/src/main/res/xml/server_settings.xml b/ultrasonic/src/main/res/xml/server_settings.xml index 46ea55dd..6990d52a 100644 --- a/ultrasonic/src/main/res/xml/server_settings.xml +++ b/ultrasonic/src/main/res/xml/server_settings.xml @@ -29,7 +29,6 @@ android:key="@string/settings.server_password" android:persistent="false" android:inputType="textPassword" - android:summary="***" android:title="@string/settings.server_password" />