diff --git a/app/src/main/java/org/jellyfin/mobile/fragment/ConnectFragment.kt b/app/src/main/java/org/jellyfin/mobile/fragment/ConnectFragment.kt index ccc64770..9b8cfb94 100644 --- a/app/src/main/java/org/jellyfin/mobile/fragment/ConnectFragment.kt +++ b/app/src/main/java/org/jellyfin/mobile/fragment/ConnectFragment.kt @@ -35,6 +35,7 @@ import org.jellyfin.mobile.R import org.jellyfin.mobile.databinding.FragmentConnectBinding import org.jellyfin.mobile.utils.* import org.koin.android.ext.android.inject +import timber.log.Timber class ConnectFragment : Fragment() { private val jellyfin: Jellyfin by inject() @@ -155,11 +156,14 @@ class ConnectFragment : Fragment() { } private suspend fun checkServerUrlAndConnection(enteredUrl: String): HttpUrl? { + Timber.i("checkServerUrlAndConnection $enteredUrl") + val normalizedUrl = enteredUrl.run { if (lastOrNull() == '/') this else "$this/" } val urls = jellyfin.discovery.addressCandidates(normalizedUrl) + Timber.i("Address candidates are $urls") var httpUrl: HttpUrl? = null var serverInfo: PublicSystemInfo? = null @@ -180,6 +184,8 @@ class ConnectFragment : Fragment() { } if (httpUrl == null || serverInfo == null) { + Timber.w("Failed to find server info, url was $httpUrl") + showConnectionError() return null } @@ -190,10 +196,20 @@ class ConnectFragment : Fragment() { val isValidInstance = when { version.size != 3 -> false - version[0] == PRODUCT_NAME_SUPPORTED_SINCE.first && version[1] < PRODUCT_NAME_SUPPORTED_SINCE.second -> true // Valid old version + // Major version is invalid + version[0] != PRODUCT_NAME_SUPPORTED_SINCE.first -> false + // Minor version is too old + version[1] < PRODUCT_NAME_SUPPORTED_SINCE.second -> false else -> true // FIXME: check ProductName once API client supports it } - return if (isValidInstance) httpUrl else null + Timber.i("Server at $httpUrl with version ${serverInfo.version} valid: $isValidInstance") + + if (!isValidInstance) { + showConnectionError(R.string.connection_error_invalid_version) + return null + } + + return httpUrl } } diff --git a/app/src/main/java/org/jellyfin/mobile/utils/ApiExtensions.kt b/app/src/main/java/org/jellyfin/mobile/utils/ApiExtensions.kt index 9fe8eee9..0523659c 100644 --- a/app/src/main/java/org/jellyfin/mobile/utils/ApiExtensions.kt +++ b/app/src/main/java/org/jellyfin/mobile/utils/ApiExtensions.kt @@ -18,7 +18,7 @@ import kotlin.coroutines.resume import kotlin.coroutines.resumeWithException import kotlin.coroutines.suspendCoroutine -val PRODUCT_NAME_SUPPORTED_SINCE: Pair = 10 to 3 +val PRODUCT_NAME_SUPPORTED_SINCE: Pair = 10 to 6 // Can be removed/replaced once the api client supports coroutines natively suspend fun ApiClient.getPublicSystemInfo(): PublicSystemInfo? = suspendCoroutine { continuation -> diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 3c3a6b6f..9ce1eeb3 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -3,6 +3,7 @@ Host Host has an invalid format Connection cannot be established.\nPlease check the hostname and your network connection. + The server uses an unsupported version. Upgrade to the latest version available at jellyfin.org. Connect Choose server Available servers