From f30a582c7b39a42e60714a412242789d85b11438 Mon Sep 17 00:00:00 2001 From: tzugen Date: Sat, 19 Mar 2022 16:21:21 +0100 Subject: [PATCH 01/12] Add locale chooser --- .../ultrasonic/activity/NavigationActivity.kt | 12 +++++ .../org/moire/ultrasonic/util/Constants.kt | 1 + .../org/moire/ultrasonic/util/LocaleHelper.kt | 50 +++++++++++++++++++ .../org/moire/ultrasonic/util/Settings.kt | 4 ++ ultrasonic/src/main/res/values-de/strings.xml | 1 - ultrasonic/src/main/res/values-es/strings.xml | 1 - ultrasonic/src/main/res/values-nl/strings.xml | 1 - .../src/main/res/values-zh-rCN/strings.xml | 1 - ultrasonic/src/main/res/values/arrays.xml | 33 ++++++++++++ ultrasonic/src/main/res/values/strings.xml | 17 ++++++- ultrasonic/src/main/res/xml/settings.xml | 24 +++++---- 11 files changed, 130 insertions(+), 15 deletions(-) create mode 100644 ultrasonic/src/main/kotlin/org/moire/ultrasonic/util/LocaleHelper.kt diff --git a/ultrasonic/src/main/kotlin/org/moire/ultrasonic/activity/NavigationActivity.kt b/ultrasonic/src/main/kotlin/org/moire/ultrasonic/activity/NavigationActivity.kt index 2a915be3..571a4ad7 100644 --- a/ultrasonic/src/main/kotlin/org/moire/ultrasonic/activity/NavigationActivity.kt +++ b/ultrasonic/src/main/kotlin/org/moire/ultrasonic/activity/NavigationActivity.kt @@ -7,6 +7,8 @@ package org.moire.ultrasonic.activity import android.app.SearchManager +import android.content.Context +import android.content.ContextWrapper import android.content.Intent import android.content.res.ColorStateList import android.content.res.Resources @@ -53,6 +55,7 @@ import org.moire.ultrasonic.service.RxBus import org.moire.ultrasonic.subsonic.ImageLoaderProvider import org.moire.ultrasonic.util.Constants import org.moire.ultrasonic.util.InfoDialog +import org.moire.ultrasonic.util.LocaleHelper import org.moire.ultrasonic.util.ServerColor import org.moire.ultrasonic.util.Settings import org.moire.ultrasonic.util.Storage @@ -351,6 +354,15 @@ class NavigationActivity : AppCompatActivity() { } } + /** + * Apply the customized language settings if needed + */ + override fun attachBaseContext(newBase: Context?) { + val locale = Settings.overrideLanguage + val localeUpdatedContext: ContextWrapper = LocaleHelper.wrap(newBase, locale) + super.attachBaseContext(localeUpdatedContext) + } + private fun loadSettings() { PreferenceManager.setDefaultValues(this, R.xml.settings, false) } diff --git a/ultrasonic/src/main/kotlin/org/moire/ultrasonic/util/Constants.kt b/ultrasonic/src/main/kotlin/org/moire/ultrasonic/util/Constants.kt index 5e9cb2db..f722e7ae 100644 --- a/ultrasonic/src/main/kotlin/org/moire/ultrasonic/util/Constants.kt +++ b/ultrasonic/src/main/kotlin/org/moire/ultrasonic/util/Constants.kt @@ -115,6 +115,7 @@ object Constants { const val PREFERENCES_KEY_PAUSE_ON_BLUETOOTH_DEVICE = "pauseOnBluetoothDevice" const val PREFERENCES_KEY_SINGLE_BUTTON_PLAY_PAUSE = "singleButtonPlayPause" const val PREFERENCES_KEY_DEBUG_LOG_TO_FILE = "debugLogToFile" + const val PREFERENCES_KEY_OVERRIDE_LANGUAGE = "overrideLanguage" const val PREFERENCE_VALUE_ALL = 0 const val PREFERENCE_VALUE_A2DP = 1 const val PREFERENCE_VALUE_DISABLED = 2 diff --git a/ultrasonic/src/main/kotlin/org/moire/ultrasonic/util/LocaleHelper.kt b/ultrasonic/src/main/kotlin/org/moire/ultrasonic/util/LocaleHelper.kt new file mode 100644 index 00000000..a9ffd06a --- /dev/null +++ b/ultrasonic/src/main/kotlin/org/moire/ultrasonic/util/LocaleHelper.kt @@ -0,0 +1,50 @@ +/* + * LocaleHelper.kt + * Copyright (C) 2009-2021 Ultrasonic developers + * + * Distributed under terms of the GNU GPLv3 license. + */ + +package org.moire.ultrasonic.util + +import android.annotation.TargetApi +import android.content.Context +import android.content.ContextWrapper +import android.content.res.Configuration +import android.os.Build +import java.util.Locale + +/** + * Simple Helper class to "wrap" a context with a new locale. + */ +class LocaleHelper(base: Context?) : ContextWrapper(base) { + companion object { + fun wrap(ctx: Context?, language: String): ContextWrapper { + var context = ctx + if (context != null && language != "") { + val config = context.resources.configuration + val locale = Locale(language) + Locale.setDefault(locale) + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) { + setSystemLocale(config, locale) + } else { + setSystemLocaleLegacy(config, locale) + } + + config.setLayoutDirection(locale) + context = context.createConfigurationContext(config) + } + return LocaleHelper(context) + } + + @Suppress("DEPRECATION") + private fun setSystemLocaleLegacy(config: Configuration, locale: Locale?) { + config.locale = locale + } + + @TargetApi(Build.VERSION_CODES.N) + fun setSystemLocale(config: Configuration, locale: Locale?) { + config.setLocale(locale) + } + } +} diff --git a/ultrasonic/src/main/kotlin/org/moire/ultrasonic/util/Settings.kt b/ultrasonic/src/main/kotlin/org/moire/ultrasonic/util/Settings.kt index 814a926c..dd6697fe 100644 --- a/ultrasonic/src/main/kotlin/org/moire/ultrasonic/util/Settings.kt +++ b/ultrasonic/src/main/kotlin/org/moire/ultrasonic/util/Settings.kt @@ -308,12 +308,16 @@ object Settings { Constants.PREFERENCE_VALUE_A2DP ) + @JvmStatic var debugLogToFile by BooleanSetting(Constants.PREFERENCES_KEY_DEBUG_LOG_TO_FILE, false) @JvmStatic val preferences: SharedPreferences get() = PreferenceManager.getDefaultSharedPreferences(Util.appContext()) + @JvmStatic + val overrideLanguage by StringSetting(Constants.PREFERENCES_KEY_OVERRIDE_LANGUAGE, "") + var useFiveStarRating by BooleanSetting(Constants.PREFERENCES_KEY_USE_FIVE_STAR_RATING, false) // TODO: Remove in December 2022 diff --git a/ultrasonic/src/main/res/values-de/strings.xml b/ultrasonic/src/main/res/values-de/strings.xml index 9dd5c3bf..9dee8ff2 100644 --- a/ultrasonic/src/main/res/values-de/strings.xml +++ b/ultrasonic/src/main/res/values-de/strings.xml @@ -399,7 +399,6 @@ Inkompatible Versionen. Bitte den subsonic Server aktualisieren. - Besonderheiten Fünf-Stern Bewertung Benutze Bewertungssystem mit fünf Sternen anstatt Lieder mit bloß einem Stern zu markieren. diff --git a/ultrasonic/src/main/res/values-es/strings.xml b/ultrasonic/src/main/res/values-es/strings.xml index 4f4644e9..bc29dc60 100644 --- a/ultrasonic/src/main/res/values-es/strings.xml +++ b/ultrasonic/src/main/res/values-es/strings.xml @@ -461,7 +461,6 @@ Versiones incompatibles. Por favor actualiza el servidor de Subsonic. - Características Use cinco estrellas para las canciones Utilice el sistema de calificación de cinco estrellas para canciones en lugar de simplemente marcar / desmarcar elementos. diff --git a/ultrasonic/src/main/res/values-nl/strings.xml b/ultrasonic/src/main/res/values-nl/strings.xml index 18088911..6931ce7f 100644 --- a/ultrasonic/src/main/res/values-nl/strings.xml +++ b/ultrasonic/src/main/res/values-nl/strings.xml @@ -461,7 +461,6 @@ Incompatibele versies. Werk je Subsonic-server bij. - Functies Vijf sterren gebruiken voor nummers Toon vijf sterren om nummers te beoordelen in plaats van items toe te voegen aan of te verwijderen uit de favorieten. diff --git a/ultrasonic/src/main/res/values-zh-rCN/strings.xml b/ultrasonic/src/main/res/values-zh-rCN/strings.xml index e170c5e4..a31bcdce 100644 --- a/ultrasonic/src/main/res/values-zh-rCN/strings.xml +++ b/ultrasonic/src/main/res/values-zh-rCN/strings.xml @@ -444,7 +444,6 @@ 不兼容的版本。请升级Subsonic 服务。 - 特性 为歌曲使用五星评分 对歌曲使用五星级评级系统 而不是简单地为项目加星标/取消星标。 diff --git a/ultrasonic/src/main/res/values/arrays.xml b/ultrasonic/src/main/res/values/arrays.xml index 3ea71240..e18377c2 100644 --- a/ultrasonic/src/main/res/values/arrays.xml +++ b/ultrasonic/src/main/res/values/arrays.xml @@ -236,5 +236,38 @@ @string/settings.playback.bluetooth_a2dp @string/settings.playback.bluetooth_disabled + + @string/language.default + @string/language.zh + @string/language.cs + @string/language.nl + @string/language.en + @string/language.fr + @string/language.de + @string/language.hu + @string/language.it + @string/language.es + @string/language.pl + @string/language.pt + @string/language.pt_br + @string/language.ru + + + + + zh + cs + nl + en + fr + de + hu + it + es + pl + pt + pt_br + ru + \ No newline at end of file diff --git a/ultrasonic/src/main/res/values/strings.xml b/ultrasonic/src/main/res/values/strings.xml index 3e08db52..e5ea9f70 100644 --- a/ultrasonic/src/main/res/values/strings.xml +++ b/ultrasonic/src/main/res/values/strings.xml @@ -96,6 +96,20 @@ Error Jukebox By Default No lyrics found + Default + Chinese + Czech + Dutch + English + French + German + Hungarian + Italian + Spanish + Polish + Portuguese + Portuguese (Brazil) + Russian By Artist By Name Most Played @@ -257,6 +271,8 @@ Notifications Network Other Settings + Override the language + You need to restart the app after changing the language Playback Control Settings Songs To Preload 1 song @@ -466,7 +482,6 @@ Incompatible versions. Please upgrade Subsonic server. - Features Use five star rating for songs Use five star rating system for songs instead of simply starring/unstarring items. diff --git a/ultrasonic/src/main/res/xml/settings.xml b/ultrasonic/src/main/res/xml/settings.xml index 5f96a81b..ed81370e 100644 --- a/ultrasonic/src/main/res/xml/settings.xml +++ b/ultrasonic/src/main/res/xml/settings.xml @@ -122,6 +122,12 @@ a:summary="@string/settings.playback.single_button_bluetooth_device_summary" a:title="@string/settings.playback.single_button_bluetooth_device" app:iconSpaceReserved="false"/> + - - - + Date: Mon, 20 Dec 2021 22:18:55 +0100 Subject: [PATCH 02/12] Update Okhttp, Jackson and retrofit --- .../kotlin/org/moire/ultrasonic/api/subsonic/Extensions.kt | 6 +++--- .../org/moire/ultrasonic/api/subsonic/SubsonicAPIClient.kt | 2 +- .../api/subsonic/interceptors/PasswordHexInterceptor.kt | 2 +- .../api/subsonic/interceptors/PasswordMD5Interceptor.kt | 2 +- .../api/subsonic/interceptors/RangeHeaderInterceptor.kt | 2 +- .../api/subsonic/interceptors/VersionInterceptor.kt | 2 +- gradle/libs.versions.toml | 6 +++--- 7 files changed, 11 insertions(+), 11 deletions(-) diff --git a/core/subsonic-api/src/main/kotlin/org/moire/ultrasonic/api/subsonic/Extensions.kt b/core/subsonic-api/src/main/kotlin/org/moire/ultrasonic/api/subsonic/Extensions.kt index f9d48d23..9e745be1 100644 --- a/core/subsonic-api/src/main/kotlin/org/moire/ultrasonic/api/subsonic/Extensions.kt +++ b/core/subsonic-api/src/main/kotlin/org/moire/ultrasonic/api/subsonic/Extensions.kt @@ -17,8 +17,8 @@ fun Response.toStreamResponse(): StreamResponse { val contentType = responseBody?.contentType() if ( contentType != null && - contentType.type().equals("application", true) && - contentType.subtype().equals("json", true) + contentType.type.equals("application", true) && + contentType.subtype.equals("json", true) ) { val error = SubsonicAPIClient.jacksonMapper.readValue( responseBody.byteStream() @@ -40,7 +40,7 @@ fun Response.toStreamResponse(): StreamResponse { * It creates Exceptions from the results returned by the Subsonic API */ @Suppress("ThrowsCount") -fun Response.throwOnFailure(): Response { +fun Response.throwOnFailure(): Response { val response = this if (response.isSuccessful && response.body()!!.status === SubsonicResponse.Status.OK) { diff --git a/core/subsonic-api/src/main/kotlin/org/moire/ultrasonic/api/subsonic/SubsonicAPIClient.kt b/core/subsonic-api/src/main/kotlin/org/moire/ultrasonic/api/subsonic/SubsonicAPIClient.kt index 324d672f..9a7ea98d 100644 --- a/core/subsonic-api/src/main/kotlin/org/moire/ultrasonic/api/subsonic/SubsonicAPIClient.kt +++ b/core/subsonic-api/src/main/kotlin/org/moire/ultrasonic/api/subsonic/SubsonicAPIClient.kt @@ -68,7 +68,7 @@ class SubsonicAPIClient( .addInterceptor { chain -> // Adds default request params val originalRequest = chain.request() - val newUrl = originalRequest.url().newBuilder() + val newUrl = originalRequest.url.newBuilder() .addQueryParameter("u", config.username) .addQueryParameter("c", config.clientID) .addQueryParameter("f", "json") diff --git a/core/subsonic-api/src/main/kotlin/org/moire/ultrasonic/api/subsonic/interceptors/PasswordHexInterceptor.kt b/core/subsonic-api/src/main/kotlin/org/moire/ultrasonic/api/subsonic/interceptors/PasswordHexInterceptor.kt index c432bf35..92090436 100644 --- a/core/subsonic-api/src/main/kotlin/org/moire/ultrasonic/api/subsonic/interceptors/PasswordHexInterceptor.kt +++ b/core/subsonic-api/src/main/kotlin/org/moire/ultrasonic/api/subsonic/interceptors/PasswordHexInterceptor.kt @@ -18,7 +18,7 @@ class PasswordHexInterceptor(private val password: String) : Interceptor { override fun intercept(chain: Chain): Response { val originalRequest = chain.request() - val updatedUrl = originalRequest.url().newBuilder() + val updatedUrl = originalRequest.url.newBuilder() .addEncodedQueryParameter("p", passwordHex).build() return chain.proceed(originalRequest.newBuilder().url(updatedUrl).build()) } diff --git a/core/subsonic-api/src/main/kotlin/org/moire/ultrasonic/api/subsonic/interceptors/PasswordMD5Interceptor.kt b/core/subsonic-api/src/main/kotlin/org/moire/ultrasonic/api/subsonic/interceptors/PasswordMD5Interceptor.kt index 8a1c8388..d6baafef 100644 --- a/core/subsonic-api/src/main/kotlin/org/moire/ultrasonic/api/subsonic/interceptors/PasswordMD5Interceptor.kt +++ b/core/subsonic-api/src/main/kotlin/org/moire/ultrasonic/api/subsonic/interceptors/PasswordMD5Interceptor.kt @@ -21,7 +21,7 @@ class PasswordMD5Interceptor(private val password: String) : Interceptor { override fun intercept(chain: Chain): Response { val originalRequest = chain.request() val salt = getSalt() - val updatedUrl = originalRequest.url().newBuilder() + val updatedUrl = originalRequest.url.newBuilder() .addQueryParameter("t", getPasswordMD5Hash(salt)) .addQueryParameter("s", salt) .build() diff --git a/core/subsonic-api/src/main/kotlin/org/moire/ultrasonic/api/subsonic/interceptors/RangeHeaderInterceptor.kt b/core/subsonic-api/src/main/kotlin/org/moire/ultrasonic/api/subsonic/interceptors/RangeHeaderInterceptor.kt index 031d8c40..1bdb0153 100644 --- a/core/subsonic-api/src/main/kotlin/org/moire/ultrasonic/api/subsonic/interceptors/RangeHeaderInterceptor.kt +++ b/core/subsonic-api/src/main/kotlin/org/moire/ultrasonic/api/subsonic/interceptors/RangeHeaderInterceptor.kt @@ -19,7 +19,7 @@ internal const val TIMEOUT_MILLIS_PER_OFFSET_BYTE = 0.02 internal class RangeHeaderInterceptor : Interceptor { override fun intercept(chain: Chain): Response { val originalRequest = chain.request() - val headers = originalRequest.headers() + val headers = originalRequest.headers return if (headers.names().contains("Range")) { val offsetValue = headers["Range"] ?: "0" val offset = "bytes=$offsetValue-" diff --git a/core/subsonic-api/src/main/kotlin/org/moire/ultrasonic/api/subsonic/interceptors/VersionInterceptor.kt b/core/subsonic-api/src/main/kotlin/org/moire/ultrasonic/api/subsonic/interceptors/VersionInterceptor.kt index 8cffdda8..f75f81e8 100644 --- a/core/subsonic-api/src/main/kotlin/org/moire/ultrasonic/api/subsonic/interceptors/VersionInterceptor.kt +++ b/core/subsonic-api/src/main/kotlin/org/moire/ultrasonic/api/subsonic/interceptors/VersionInterceptor.kt @@ -18,7 +18,7 @@ internal class VersionInterceptor( val newRequest = originalRequest.newBuilder() .url( originalRequest - .url() + .url .newBuilder() .addQueryParameter("v", protocolVersion.restApiVersion) .build() diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index c57409e2..064dd182 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -22,9 +22,9 @@ kotlin = "1.6.10" kotlinxCoroutines = "1.6.0-native-mt" viewModelKtx = "2.3.0" -retrofit = "2.6.4" -jackson = "2.9.5" -okhttp = "3.12.13" +retrofit = "2.9.0" +jackson = "2.10.1" +okhttp = "4.9.1" koin = "3.0.2" picasso = "2.71828" From c2d62e8688fc0d39270cf16977caa1161a6df18d Mon Sep 17 00:00:00 2001 From: tzugen Date: Sat, 19 Mar 2022 17:36:46 +0100 Subject: [PATCH 03/12] Disable language split in bundle --- ultrasonic/build.gradle | 2 ++ 1 file changed, 2 insertions(+) diff --git a/ultrasonic/build.gradle b/ultrasonic/build.gradle index 05e93437..ba4ec15a 100644 --- a/ultrasonic/build.gradle +++ b/ultrasonic/build.gradle @@ -18,6 +18,8 @@ android { } + bundle.language.enableSplit = false + buildTypes { release { minifyEnabled true From f6f9683a9c2a7f99973127447a02accf99ab3309 Mon Sep 17 00:00:00 2001 From: tzugen Date: Sat, 19 Mar 2022 17:20:39 +0100 Subject: [PATCH 04/12] Migrate some old calls --- .../ultrasonic/api/subsonic/CommonFunctions.kt | 5 +++-- .../ultrasonic/imageloader/AvatarRequestHandler.kt | 4 ++-- .../imageloader/CoverArtRequestHandler.kt | 4 ++-- .../moire/ultrasonic/service/RESTMusicService.kt | 14 ++++++-------- .../ultrasonic/imageloader/CommonFunctions.kt | 5 +++-- 5 files changed, 16 insertions(+), 16 deletions(-) diff --git a/core/subsonic-api/src/integrationTest/kotlin/org/moire/ultrasonic/api/subsonic/CommonFunctions.kt b/core/subsonic-api/src/integrationTest/kotlin/org/moire/ultrasonic/api/subsonic/CommonFunctions.kt index 68f4f7dd..e46e23e2 100644 --- a/core/subsonic-api/src/integrationTest/kotlin/org/moire/ultrasonic/api/subsonic/CommonFunctions.kt +++ b/core/subsonic-api/src/integrationTest/kotlin/org/moire/ultrasonic/api/subsonic/CommonFunctions.kt @@ -9,6 +9,7 @@ import java.util.TimeZone import okhttp3.mockwebserver.MockResponse import okhttp3.mockwebserver.MockWebServer import okio.Okio +import okio.source import org.amshove.kluent.`should be` import org.amshove.kluent.`should contain` import org.amshove.kluent.`should not be` @@ -40,12 +41,12 @@ fun MockWebServer.enqueueResponse(resourceName: String) { } fun Any.loadJsonResponse(name: String): String { - val source = Okio.buffer(Okio.source(javaClass.classLoader.getResourceAsStream(name))) + val source = Okio.buffer(javaClass.classLoader.getResourceAsStream(name).source()) return source.readString(Charset.forName("UTF-8")) } fun Any.loadResourceStream(name: String): InputStream { - val source = Okio.buffer(Okio.source(javaClass.classLoader.getResourceAsStream(name))) + val source = Okio.buffer(javaClass.classLoader.getResourceAsStream(name).source()) return source.inputStream() } diff --git a/ultrasonic/src/main/kotlin/org/moire/ultrasonic/imageloader/AvatarRequestHandler.kt b/ultrasonic/src/main/kotlin/org/moire/ultrasonic/imageloader/AvatarRequestHandler.kt index b63549fb..fa71e9c9 100644 --- a/ultrasonic/src/main/kotlin/org/moire/ultrasonic/imageloader/AvatarRequestHandler.kt +++ b/ultrasonic/src/main/kotlin/org/moire/ultrasonic/imageloader/AvatarRequestHandler.kt @@ -4,7 +4,7 @@ import com.squareup.picasso.Picasso import com.squareup.picasso.Request import com.squareup.picasso.RequestHandler import java.io.IOException -import okio.Okio +import okio.source import org.moire.ultrasonic.api.subsonic.SubsonicAPIClient /** @@ -29,7 +29,7 @@ class AvatarRequestHandler( if (response.hasError() || response.stream == null) { throw IOException("${response.apiError}") } else { - return Result(Okio.source(response.stream!!), Picasso.LoadedFrom.NETWORK) + return Result(response.stream!!.source(), Picasso.LoadedFrom.NETWORK) } } } diff --git a/ultrasonic/src/main/kotlin/org/moire/ultrasonic/imageloader/CoverArtRequestHandler.kt b/ultrasonic/src/main/kotlin/org/moire/ultrasonic/imageloader/CoverArtRequestHandler.kt index 3cdc2039..9fcec91c 100644 --- a/ultrasonic/src/main/kotlin/org/moire/ultrasonic/imageloader/CoverArtRequestHandler.kt +++ b/ultrasonic/src/main/kotlin/org/moire/ultrasonic/imageloader/CoverArtRequestHandler.kt @@ -5,7 +5,7 @@ import com.squareup.picasso.Picasso.LoadedFrom.NETWORK import com.squareup.picasso.Request import com.squareup.picasso.RequestHandler import java.io.IOException -import okio.Okio +import okio.source import org.moire.ultrasonic.api.subsonic.SubsonicAPIClient import org.moire.ultrasonic.api.subsonic.toStreamResponse import org.moire.ultrasonic.util.FileUtil.SUFFIX_LARGE @@ -44,7 +44,7 @@ class CoverArtRequestHandler(private val client: SubsonicAPIClient) : RequestHan // Handle the response if (!response.hasError() && response.stream != null) { - return Result(Okio.source(response.stream!!), NETWORK) + return Result(response.stream!!.source(), NETWORK) } // Throw an error if still not successful diff --git a/ultrasonic/src/main/kotlin/org/moire/ultrasonic/service/RESTMusicService.kt b/ultrasonic/src/main/kotlin/org/moire/ultrasonic/service/RESTMusicService.kt index 0289af48..39492ddf 100644 --- a/ultrasonic/src/main/kotlin/org/moire/ultrasonic/service/RESTMusicService.kt +++ b/ultrasonic/src/main/kotlin/org/moire/ultrasonic/service/RESTMusicService.kt @@ -10,12 +10,11 @@ import java.io.IOException import java.io.InputStream import okhttp3.Protocol import okhttp3.Response -import okhttp3.ResponseBody +import okhttp3.ResponseBody.Companion.toResponseBody import org.moire.ultrasonic.api.subsonic.ApiNotSupportedException import org.moire.ultrasonic.api.subsonic.SubsonicAPIClient import org.moire.ultrasonic.api.subsonic.models.AlbumListType.Companion.fromName import org.moire.ultrasonic.api.subsonic.models.JukeboxAction -import org.moire.ultrasonic.api.subsonic.response.StreamResponse import org.moire.ultrasonic.api.subsonic.throwOnFailure import org.moire.ultrasonic.api.subsonic.toStreamResponse import org.moire.ultrasonic.data.ActiveServerProvider @@ -425,14 +424,13 @@ open class RESTMusicService( save: Boolean ): Pair { val songOffset = if (offset < 0) 0 else offset - lateinit var response: StreamResponse // Use semantically correct call - if (save) { - response = API.download(song.id, maxBitrate, offset = songOffset) + val response = if (save) { + API.download(song.id, maxBitrate, offset = songOffset) .execute().toStreamResponse() } else { - response = API.stream(song.id, maxBitrate, offset = songOffset) + API.stream(song.id, maxBitrate, offset = songOffset) .execute().toStreamResponse() } @@ -463,7 +461,7 @@ open class RESTMusicService( // Returns a dummy response Response.Builder() .code(100) - .body(ResponseBody.create(null, "")) + .body("".toResponseBody(null)) .protocol(Protocol.HTTP_2) .message("Empty response") .request(chain.request()) @@ -480,7 +478,7 @@ open class RESTMusicService( val response = client.newCall(request).execute() // The complete url :) - val url = response.request().url() + val url = response.request.url return url.toString() } diff --git a/ultrasonic/src/test/kotlin/org/moire/ultrasonic/imageloader/CommonFunctions.kt b/ultrasonic/src/test/kotlin/org/moire/ultrasonic/imageloader/CommonFunctions.kt index 3850290a..6c14eabc 100644 --- a/ultrasonic/src/test/kotlin/org/moire/ultrasonic/imageloader/CommonFunctions.kt +++ b/ultrasonic/src/test/kotlin/org/moire/ultrasonic/imageloader/CommonFunctions.kt @@ -1,9 +1,10 @@ package org.moire.ultrasonic.imageloader import java.io.InputStream -import okio.Okio +import okio.buffer +import okio.source fun Any.loadResourceStream(name: String): InputStream { - val source = Okio.buffer(Okio.source(javaClass.classLoader!!.getResourceAsStream(name))) + val source = javaClass.classLoader!!.getResourceAsStream(name).source().buffer() return source.inputStream() } From f0447105d2014e9384cc8f0a8138f6a48e48f3dd Mon Sep 17 00:00:00 2001 From: tzugen Date: Sat, 19 Mar 2022 18:29:53 +0100 Subject: [PATCH 05/12] Fix methods in integration tests --- .../org/moire/ultrasonic/api/subsonic/CommonFunctions.kt | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/core/subsonic-api/src/integrationTest/kotlin/org/moire/ultrasonic/api/subsonic/CommonFunctions.kt b/core/subsonic-api/src/integrationTest/kotlin/org/moire/ultrasonic/api/subsonic/CommonFunctions.kt index e46e23e2..e0bf38d3 100644 --- a/core/subsonic-api/src/integrationTest/kotlin/org/moire/ultrasonic/api/subsonic/CommonFunctions.kt +++ b/core/subsonic-api/src/integrationTest/kotlin/org/moire/ultrasonic/api/subsonic/CommonFunctions.kt @@ -8,7 +8,7 @@ import java.util.Locale import java.util.TimeZone import okhttp3.mockwebserver.MockResponse import okhttp3.mockwebserver.MockWebServer -import okio.Okio +import okio.buffer import okio.source import org.amshove.kluent.`should be` import org.amshove.kluent.`should contain` @@ -41,12 +41,12 @@ fun MockWebServer.enqueueResponse(resourceName: String) { } fun Any.loadJsonResponse(name: String): String { - val source = Okio.buffer(javaClass.classLoader.getResourceAsStream(name).source()) + val source = javaClass.classLoader.getResourceAsStream(name)!!.source().buffer() return source.readString(Charset.forName("UTF-8")) } fun Any.loadResourceStream(name: String): InputStream { - val source = Okio.buffer(javaClass.classLoader.getResourceAsStream(name).source()) + val source = javaClass.classLoader.getResourceAsStream(name)!!.source().buffer() return source.inputStream() } From e4a41de3ef0749abf19419ba1958fb1bb371d826 Mon Sep 17 00:00:00 2001 From: tzugen Date: Sun, 20 Mar 2022 07:57:50 +0100 Subject: [PATCH 06/12] Reword alert for better help --- ultrasonic/src/main/res/values/strings.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ultrasonic/src/main/res/values/strings.xml b/ultrasonic/src/main/res/values/strings.xml index 3e08db52..ff6c6c4d 100644 --- a/ultrasonic/src/main/res/values/strings.xml +++ b/ultrasonic/src/main/res/values/strings.xml @@ -148,7 +148,7 @@ Search No media found %d tracks selected - Warning: No network available. + Warning: No usable network available.\n If you are using mobile data, you may need to allow downloads on metered connections in the settings. Error: No SD card available. Play All All Folders From 2d8b93301f09ed227005d1cb4d939e8995629f0e Mon Sep 17 00:00:00 2001 From: tzugen Date: Sun, 20 Mar 2022 08:50:57 +0100 Subject: [PATCH 07/12] Add traditional german variant --- ultrasonic/build.gradle | 1 - .../src/main/kotlin/org/moire/ultrasonic/util/LocaleHelper.kt | 2 +- ultrasonic/src/main/res/values-b+de+DE+1901/strings.xml | 4 ++++ ultrasonic/src/main/res/values/arrays.xml | 4 +++- ultrasonic/src/main/res/values/strings.xml | 1 + 5 files changed, 9 insertions(+), 3 deletions(-) create mode 100644 ultrasonic/src/main/res/values-b+de+DE+1901/strings.xml diff --git a/ultrasonic/build.gradle b/ultrasonic/build.gradle index ba4ec15a..6b5c2cf2 100644 --- a/ultrasonic/build.gradle +++ b/ultrasonic/build.gradle @@ -14,7 +14,6 @@ android { minSdkVersion versions.minSdk targetSdkVersion versions.targetSdk - resConfigs 'cs', 'de', 'en', 'es', 'fr', 'hu', 'it', 'nl', 'pl', 'pt', 'pt-rBR', 'ru', 'zh-rCN', 'zh-rTW' } diff --git a/ultrasonic/src/main/kotlin/org/moire/ultrasonic/util/LocaleHelper.kt b/ultrasonic/src/main/kotlin/org/moire/ultrasonic/util/LocaleHelper.kt index a9ffd06a..8c2e55ba 100644 --- a/ultrasonic/src/main/kotlin/org/moire/ultrasonic/util/LocaleHelper.kt +++ b/ultrasonic/src/main/kotlin/org/moire/ultrasonic/util/LocaleHelper.kt @@ -23,7 +23,7 @@ class LocaleHelper(base: Context?) : ContextWrapper(base) { var context = ctx if (context != null && language != "") { val config = context.resources.configuration - val locale = Locale(language) + val locale = Locale.forLanguageTag(language) Locale.setDefault(locale) if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) { setSystemLocale(config, locale) diff --git a/ultrasonic/src/main/res/values-b+de+DE+1901/strings.xml b/ultrasonic/src/main/res/values-b+de+DE+1901/strings.xml new file mode 100644 index 00000000..4e2fb47b --- /dev/null +++ b/ultrasonic/src/main/res/values-b+de+DE+1901/strings.xml @@ -0,0 +1,4 @@ + + + Interpreten + \ No newline at end of file diff --git a/ultrasonic/src/main/res/values/arrays.xml b/ultrasonic/src/main/res/values/arrays.xml index e18377c2..c25f7f28 100644 --- a/ultrasonic/src/main/res/values/arrays.xml +++ b/ultrasonic/src/main/res/values/arrays.xml @@ -244,6 +244,7 @@ @string/language.en @string/language.fr @string/language.de + @string/language.de_DE_1901 @string/language.hu @string/language.it @string/language.es @@ -262,12 +263,13 @@ en fr de + de-DE-1901 hu it es pl pt - pt_br + pt-BR ru \ No newline at end of file diff --git a/ultrasonic/src/main/res/values/strings.xml b/ultrasonic/src/main/res/values/strings.xml index e5ea9f70..da8e6403 100644 --- a/ultrasonic/src/main/res/values/strings.xml +++ b/ultrasonic/src/main/res/values/strings.xml @@ -103,6 +103,7 @@ English French German + German (traditional) Hungarian Italian Spanish From c269243a0df96a8d67405bc0954fa1c1d0269799 Mon Sep 17 00:00:00 2001 From: tzugen Date: Sun, 20 Mar 2022 09:14:47 +0100 Subject: [PATCH 08/12] Complete traditional strings --- ultrasonic/src/main/res/values-b+de+DE+1901/strings.xml | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/ultrasonic/src/main/res/values-b+de+DE+1901/strings.xml b/ultrasonic/src/main/res/values-b+de+DE+1901/strings.xml index 4e2fb47b..f2f67ca9 100644 --- a/ultrasonic/src/main/res/values-b+de+DE+1901/strings.xml +++ b/ultrasonic/src/main/res/values-b+de+DE+1901/strings.xml @@ -1,4 +1,12 @@ + Interpret Interpreten + Interpreten + Bitrate und Dateityp hinter der Interpret anzeigen + Mehrere Interpreten + Nach Interpret + Alle Titel nach Interpret sortieren + Einen neuen Eintrag in der Interpretenansicht hinzufügen, um auf alle Lieder eines Interprets zuzugreifen + Interpret zeigen \ No newline at end of file From 555ef5b7ff46b24e68e7f879ec75f579c71c2796 Mon Sep 17 00:00:00 2001 From: tzugen Date: Sun, 20 Mar 2022 13:10:40 +0100 Subject: [PATCH 09/12] Differentiate chinese variants --- ultrasonic/src/main/res/values/arrays.xml | 10 ++++++---- ultrasonic/src/main/res/values/strings.xml | 5 +++-- 2 files changed, 9 insertions(+), 6 deletions(-) diff --git a/ultrasonic/src/main/res/values/arrays.xml b/ultrasonic/src/main/res/values/arrays.xml index c25f7f28..c1feeafa 100644 --- a/ultrasonic/src/main/res/values/arrays.xml +++ b/ultrasonic/src/main/res/values/arrays.xml @@ -236,9 +236,10 @@ @string/settings.playback.bluetooth_a2dp @string/settings.playback.bluetooth_disabled - + @string/language.default - @string/language.zh + @string/language.zh_CN + @string/language.zh_TW @string/language.cs @string/language.nl @string/language.en @@ -250,14 +251,15 @@ @string/language.es @string/language.pl @string/language.pt - @string/language.pt_br + @string/language.pt_BR @string/language.ru - zh + zh-CN + zh-TW cs nl en diff --git a/ultrasonic/src/main/res/values/strings.xml b/ultrasonic/src/main/res/values/strings.xml index da8e6403..d94a265b 100644 --- a/ultrasonic/src/main/res/values/strings.xml +++ b/ultrasonic/src/main/res/values/strings.xml @@ -97,7 +97,8 @@ Jukebox By Default No lyrics found Default - Chinese + Chinese (China) + Chinese (Taiwan) Czech Dutch English @@ -109,7 +110,7 @@ Spanish Polish Portuguese - Portuguese (Brazil) + Portuguese (Brazil) Russian By Artist By Name From 34d2b45d712f0faee4e2f90ff894bce2d44f8ab1 Mon Sep 17 00:00:00 2001 From: tzugen Date: Sun, 20 Mar 2022 13:12:47 +0100 Subject: [PATCH 10/12] Add Res Config --- ultrasonic/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ultrasonic/build.gradle b/ultrasonic/build.gradle index 6b5c2cf2..f6fc5607 100644 --- a/ultrasonic/build.gradle +++ b/ultrasonic/build.gradle @@ -14,7 +14,7 @@ android { minSdkVersion versions.minSdk targetSdkVersion versions.targetSdk - + resConfigs 'cs', 'de', 'en', 'es', 'fr', 'hu', 'it', 'nl', 'pl', 'pt', 'pt-rBR', 'ru', 'zh-rCN', 'zh-rTW' } bundle.language.enableSplit = false From 17850980e12ed0b58bb4f702f656fab222b1329b Mon Sep 17 00:00:00 2001 From: tzugen Date: Sun, 20 Mar 2022 13:13:04 +0100 Subject: [PATCH 11/12] Remove traditional german variant --- .../src/main/res/values-b+de+DE+1901/strings.xml | 12 ------------ ultrasonic/src/main/res/values/arrays.xml | 2 -- ultrasonic/src/main/res/values/strings.xml | 1 - 3 files changed, 15 deletions(-) delete mode 100644 ultrasonic/src/main/res/values-b+de+DE+1901/strings.xml diff --git a/ultrasonic/src/main/res/values-b+de+DE+1901/strings.xml b/ultrasonic/src/main/res/values-b+de+DE+1901/strings.xml deleted file mode 100644 index f2f67ca9..00000000 --- a/ultrasonic/src/main/res/values-b+de+DE+1901/strings.xml +++ /dev/null @@ -1,12 +0,0 @@ - - - Interpret - Interpreten - Interpreten - Bitrate und Dateityp hinter der Interpret anzeigen - Mehrere Interpreten - Nach Interpret - Alle Titel nach Interpret sortieren - Einen neuen Eintrag in der Interpretenansicht hinzufügen, um auf alle Lieder eines Interprets zuzugreifen - Interpret zeigen - \ No newline at end of file diff --git a/ultrasonic/src/main/res/values/arrays.xml b/ultrasonic/src/main/res/values/arrays.xml index c1feeafa..511d7be6 100644 --- a/ultrasonic/src/main/res/values/arrays.xml +++ b/ultrasonic/src/main/res/values/arrays.xml @@ -245,7 +245,6 @@ @string/language.en @string/language.fr @string/language.de - @string/language.de_DE_1901 @string/language.hu @string/language.it @string/language.es @@ -265,7 +264,6 @@ en fr de - de-DE-1901 hu it es diff --git a/ultrasonic/src/main/res/values/strings.xml b/ultrasonic/src/main/res/values/strings.xml index d94a265b..26685bdc 100644 --- a/ultrasonic/src/main/res/values/strings.xml +++ b/ultrasonic/src/main/res/values/strings.xml @@ -104,7 +104,6 @@ English French German - German (traditional) Hungarian Italian Spanish From fe3b713241b95efd53399d43c24ac53210d86b7b Mon Sep 17 00:00:00 2001 From: tzugen Date: Mon, 21 Mar 2022 09:47:46 +0100 Subject: [PATCH 12/12] Tweak wording --- ultrasonic/src/main/res/values/strings.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ultrasonic/src/main/res/values/strings.xml b/ultrasonic/src/main/res/values/strings.xml index 26685bdc..de2ec6c7 100644 --- a/ultrasonic/src/main/res/values/strings.xml +++ b/ultrasonic/src/main/res/values/strings.xml @@ -96,7 +96,7 @@ Error Jukebox By Default No lyrics found - Default + System default Chinese (China) Chinese (Taiwan) Czech