diff --git a/app/build.gradle.kts b/app/build.gradle.kts index 75cb78bb..6418b368 100644 --- a/app/build.gradle.kts +++ b/app/build.gradle.kts @@ -85,7 +85,6 @@ android { } } - @Suppress("UnstableApiUsage") buildFeatures { buildConfig = true viewBinding = true diff --git a/app/src/main/java/org/jellyfin/mobile/app/AppModule.kt b/app/src/main/java/org/jellyfin/mobile/app/AppModule.kt index 52770847..3d3df521 100644 --- a/app/src/main/java/org/jellyfin/mobile/app/AppModule.kt +++ b/app/src/main/java/org/jellyfin/mobile/app/AppModule.kt @@ -45,7 +45,7 @@ import org.jellyfin.sdk.api.client.ApiClient import org.jellyfin.sdk.api.client.util.AuthorizationHeaderBuilder import org.koin.android.ext.koin.androidApplication import org.koin.androidx.fragment.dsl.fragment -import org.koin.androidx.viewmodel.dsl.viewModel +import org.koin.core.module.dsl.viewModel import org.koin.core.qualifier.named import org.koin.dsl.module import java.io.File diff --git a/app/src/main/java/org/jellyfin/mobile/bridge/ExternalPlayer.kt b/app/src/main/java/org/jellyfin/mobile/bridge/ExternalPlayer.kt index 946b7c0c..a88c00eb 100644 --- a/app/src/main/java/org/jellyfin/mobile/bridge/ExternalPlayer.kt +++ b/app/src/main/java/org/jellyfin/mobile/bridge/ExternalPlayer.kt @@ -4,11 +4,11 @@ import android.app.Activity import android.content.ComponentName import android.content.Context import android.content.Intent -import android.net.Uri import android.webkit.JavascriptInterface import android.widget.Toast import androidx.activity.result.ActivityResultRegistry import androidx.activity.result.contract.ActivityResultContracts +import androidx.core.net.toUri import androidx.core.text.isDigitsOnly import androidx.lifecycle.LifecycleOwner import kotlinx.coroutines.MainScope @@ -137,7 +137,7 @@ class ExternalPlayer( if (context.packageManager.isPackageInstalled(appPreferences.externalPlayerApp)) { component = getComponent(appPreferences.externalPlayerApp) } - setDataAndType(Uri.parse(url), "video/*") + setDataAndType(url.toUri(), "video/*") putExtra("title", source.name) putExtra("position", source.startTimeMs.toInt()) putExtra("return_result", true) @@ -155,12 +155,12 @@ class ExternalPlayer( // MX Player API / MPV val subtitleUris = externalSubs.map { stream -> - Uri.parse(apiClient.createUrl(stream.deliveryUrl)) + apiClient.createUrl(stream.deliveryUrl).toUri() } putExtra("subs", subtitleUris.toTypedArray()) putExtra("subs.name", externalSubs.map(ExternalSubtitleStream::displayTitle).toTypedArray()) putExtra("subs.filename", externalSubs.map(ExternalSubtitleStream::language).toTypedArray()) - putExtra("subs.enable", enabledSubUrl?.let { url -> arrayOf(Uri.parse(url)) } ?: emptyArray()) + putExtra("subs.enable", enabledSubUrl?.let { url -> arrayOf(url.toUri()) } ?: emptyArray()) // VLC if (enabledSubUrl != null) putExtra("subtitles_location", enabledSubUrl) diff --git a/app/src/main/java/org/jellyfin/mobile/bridge/NativeInterface.kt b/app/src/main/java/org/jellyfin/mobile/bridge/NativeInterface.kt index ba1f843d..7be7aff0 100644 --- a/app/src/main/java/org/jellyfin/mobile/bridge/NativeInterface.kt +++ b/app/src/main/java/org/jellyfin/mobile/bridge/NativeInterface.kt @@ -4,9 +4,9 @@ import android.annotation.SuppressLint import android.content.Context import android.content.Intent import android.media.session.PlaybackState -import android.net.Uri import android.webkit.JavascriptInterface import androidx.core.content.ContextCompat +import androidx.core.net.toUri import org.jellyfin.mobile.events.ActivityEvent import org.jellyfin.mobile.events.ActivityEventHandler import org.jellyfin.mobile.utils.Constants @@ -134,7 +134,7 @@ class NativeInterface(private val context: Context) : KoinComponent { val filename: String = file.getString("filename") val url: String = file.getString("url") - emitEvent(ActivityEvent.DownloadFile(Uri.parse(url), title, filename)) + emitEvent(ActivityEvent.DownloadFile(url.toUri(), title, filename)) } } catch (e: JSONException) { Timber.e("Download failed: %s", e.message) diff --git a/app/src/main/java/org/jellyfin/mobile/data/entity/DownloadEntity.kt b/app/src/main/java/org/jellyfin/mobile/data/entity/DownloadEntity.kt index 40411e1a..395b5bb0 100644 --- a/app/src/main/java/org/jellyfin/mobile/data/entity/DownloadEntity.kt +++ b/app/src/main/java/org/jellyfin/mobile/data/entity/DownloadEntity.kt @@ -9,7 +9,6 @@ import androidx.room.Index import androidx.room.PrimaryKey import androidx.room.TypeConverter import androidx.room.TypeConverters -import kotlinx.serialization.encodeToString import kotlinx.serialization.json.Json import kotlinx.serialization.json.Json.Default.decodeFromString import org.jellyfin.mobile.data.entity.DownloadEntity.Key.ITEM_ID diff --git a/app/src/main/java/org/jellyfin/mobile/downloads/DownloadUtils.kt b/app/src/main/java/org/jellyfin/mobile/downloads/DownloadUtils.kt index 0659834a..309af9dc 100644 --- a/app/src/main/java/org/jellyfin/mobile/downloads/DownloadUtils.kt +++ b/app/src/main/java/org/jellyfin/mobile/downloads/DownloadUtils.kt @@ -135,7 +135,7 @@ class DownloadUtils( ) } - private fun isNetworkMetered(): Boolean = connectivityManager?.isActiveNetworkMetered ?: false + private fun isNetworkMetered(): Boolean = connectivityManager?.isActiveNetworkMetered == true private fun isNetworkRoamingCompat(): Boolean = connectivityManager?.activeNetworkInfo?.isRoaming ?: throw AndroidException() diff --git a/app/src/main/java/org/jellyfin/mobile/events/ActivityEventHandler.kt b/app/src/main/java/org/jellyfin/mobile/events/ActivityEventHandler.kt index e2475e9b..cc2514d1 100644 --- a/app/src/main/java/org/jellyfin/mobile/events/ActivityEventHandler.kt +++ b/app/src/main/java/org/jellyfin/mobile/events/ActivityEventHandler.kt @@ -3,8 +3,8 @@ package org.jellyfin.mobile.events import android.content.ActivityNotFoundException import android.content.Intent import android.content.pm.ActivityInfo -import android.net.Uri import android.os.Bundle +import androidx.core.net.toUri import androidx.lifecycle.Lifecycle import androidx.lifecycle.lifecycleScope import androidx.lifecycle.repeatOnLifecycle @@ -68,7 +68,7 @@ class ActivityEventHandler( } is ActivityEvent.OpenUrl -> { try { - val intent = Intent(Intent.ACTION_VIEW, Uri.parse(event.uri)) + val intent = Intent(Intent.ACTION_VIEW, event.uri.toUri()) startActivity(intent) } catch (e: ActivityNotFoundException) { Timber.e("openIntent: %s", e.message) diff --git a/app/src/main/java/org/jellyfin/mobile/player/queue/QueueManager.kt b/app/src/main/java/org/jellyfin/mobile/player/queue/QueueManager.kt index 01a3584f..b2bd1d32 100644 --- a/app/src/main/java/org/jellyfin/mobile/player/queue/QueueManager.kt +++ b/app/src/main/java/org/jellyfin/mobile/player/queue/QueueManager.kt @@ -325,7 +325,7 @@ class QueueManager( ): Array { val factory = get() return source.externalSubtitleStreams.map { stream -> - val uri = Uri.parse(apiClient.createUrl(stream.deliveryUrl)) + val uri = apiClient.createUrl(stream.deliveryUrl).toUri() val mediaItem = MediaItem.SubtitleConfiguration.Builder(uri).apply { setId("${ExternalSubtitleStream.ID_PREFIX}${stream.index}") setLabel(stream.displayTitle) @@ -353,7 +353,7 @@ class QueueManager( source: JellyfinMediaSource, fileUri: String, ): Array { - val downloadDir: String = File(fileUri).parent + val downloadDir = File(fileUri).parent val factory = get() return source.externalSubtitleStreams.map { stream -> val uri: Uri = File(downloadDir, "${stream.index}.subrip").toUri() diff --git a/app/src/main/java/org/jellyfin/mobile/player/source/JellyfinMediaSourceSerializer.kt b/app/src/main/java/org/jellyfin/mobile/player/source/JellyfinMediaSourceSerializer.kt index a983258e..b5d44559 100644 --- a/app/src/main/java/org/jellyfin/mobile/player/source/JellyfinMediaSourceSerializer.kt +++ b/app/src/main/java/org/jellyfin/mobile/player/source/JellyfinMediaSourceSerializer.kt @@ -1,5 +1,6 @@ package org.jellyfin.mobile.player.source +import kotlinx.serialization.ExperimentalSerializationApi import kotlinx.serialization.KSerializer import kotlinx.serialization.SerializationException import kotlinx.serialization.descriptors.SerialDescriptor @@ -15,6 +16,7 @@ import org.jellyfin.sdk.model.api.MediaSourceInfo import org.jellyfin.sdk.model.serializer.toUUID import java.util.UUID +@OptIn(ExperimentalSerializationApi::class) class JellyfinMediaSourceSerializer : KSerializer { override val descriptor: SerialDescriptor = buildClassSerialDescriptor("JellyfinMediaSource") { element("itemId") diff --git a/app/src/main/java/org/jellyfin/mobile/ui/content/ImageProvider.kt b/app/src/main/java/org/jellyfin/mobile/ui/content/ImageProvider.kt index 3df1833c..f706f417 100644 --- a/app/src/main/java/org/jellyfin/mobile/ui/content/ImageProvider.kt +++ b/app/src/main/java/org/jellyfin/mobile/ui/content/ImageProvider.kt @@ -68,7 +68,7 @@ class ImageProvider : ContentProvider(), KoinComponent { selectionArgs: Array?, sortOrder: String?, ): Cursor = MatrixCursor(arrayOf("_id", MediaMetadata.METADATA_KEY_ART_URI)).apply { - addRow(arrayOf(0, uri.toString())) + addRow(arrayOf(0, uri.toString())) } override fun openTypedAssetFile(uri: Uri, mimeTypeFilter: String, opts: Bundle?): AssetFileDescriptor { diff --git a/app/src/main/java/org/jellyfin/mobile/ui/screens/connect/ServerSelection.kt b/app/src/main/java/org/jellyfin/mobile/ui/screens/connect/ServerSelection.kt index 47a9afc8..ea830b5f 100644 --- a/app/src/main/java/org/jellyfin/mobile/ui/screens/connect/ServerSelection.kt +++ b/app/src/main/java/org/jellyfin/mobile/ui/screens/connect/ServerSelection.kt @@ -27,7 +27,7 @@ import androidx.compose.material.MaterialTheme import androidx.compose.material.OutlinedTextField import androidx.compose.material.Text import androidx.compose.material.icons.Icons -import androidx.compose.material.icons.outlined.ArrowBack +import androidx.compose.material.icons.automirrored.outlined.ArrowBack import androidx.compose.runtime.Composable import androidx.compose.runtime.LaunchedEffect import androidx.compose.runtime.MutableState @@ -278,7 +278,7 @@ private fun ServerDiscoveryList( verticalAlignment = Alignment.CenterVertically, ) { IconButton(onClick = onGoBack) { - Icon(imageVector = Icons.Outlined.ArrowBack, contentDescription = null) + Icon(imageVector = Icons.AutoMirrored.Outlined.ArrowBack, contentDescription = null) } Text( modifier = Modifier diff --git a/build.gradle.kts b/build.gradle.kts index 89a95e41..aa3e2479 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -17,6 +17,6 @@ allprojects { } } -tasks.create("clean") { +tasks.register("clean") { delete(rootProject.layout.buildDirectory) } diff --git a/buildSrc/src/main/kotlin/VersionUtils.kt b/buildSrc/src/main/kotlin/VersionUtils.kt index 8c02a371..cb123fbd 100644 --- a/buildSrc/src/main/kotlin/VersionUtils.kt +++ b/buildSrc/src/main/kotlin/VersionUtils.kt @@ -1,5 +1,4 @@ import org.gradle.api.Project -import java.util.* /** * Get the version name from the current environment or use the fallback.