diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml
index 3fad6f35..52e44b24 100644
--- a/app/src/main/AndroidManifest.xml
+++ b/app/src/main/AndroidManifest.xml
@@ -19,15 +19,6 @@
-
-
-
diff --git a/app/src/main/java/org/jellyfin/mobile/app/StorageManager.kt b/app/src/main/java/org/jellyfin/mobile/app/StorageManager.kt
index c50eb82f..291c5cf7 100644
--- a/app/src/main/java/org/jellyfin/mobile/app/StorageManager.kt
+++ b/app/src/main/java/org/jellyfin/mobile/app/StorageManager.kt
@@ -9,33 +9,33 @@ import androidx.documentfile.provider.DocumentFile
import org.jellyfin.mobile.R
import org.jellyfin.mobile.data.entity.DownloadFiles
import org.jellyfin.mobile.downloads.DownloadStatus
-import java.io.File
+import timber.log.Timber
class StorageManager(
private val context: Context,
private val appPreferences: AppPreferences
) {
- private val defaultStorageLocation
- get() = Environment.getExternalStorageDirectory().absolutePath + File.separator + context.getString(R.string.app_name_short)
+ val defaultStorageLocation
+ get() = Environment.getExternalStorageDirectory().resolve(context.getString(R.string.app_name_short)).toUri()
- init {
- ensureNoMedia(getStorageLocation())
+ fun getStorageLocation() = appPreferences.storageLocation?.toUri()?.let {
+ DocumentFile.fromTreeUri(context, it)
}
- fun getStorageLocation(): DocumentFile = appPreferences.storageLocation?.toUri()?.let {
- DocumentFile.fromTreeUri(context, it)
- } ?: DocumentFile.fromFile(File(defaultStorageLocation))
+ fun changeStorageLocation(location: Uri): Boolean {
+ if (appPreferences.storageLocation?.toUri() == location) return true
- fun changeStorageLocation(location: Uri) {
- if (appPreferences.storageLocation?.toUri() == location) return
+ return runCatching {
+ context.contentResolver.takePersistableUriPermission(
+ location,
+ Intent.FLAG_GRANT_READ_URI_PERMISSION or Intent.FLAG_GRANT_WRITE_URI_PERMISSION,
+ )
- val documentFile = DocumentFile.fromTreeUri(context, location) ?: error("Invalid location $location")
- context.contentResolver.takePersistableUriPermission(
- documentFile.uri,
- Intent.FLAG_GRANT_READ_URI_PERMISSION or Intent.FLAG_GRANT_WRITE_URI_PERMISSION,
- )
- ensureNoMedia(documentFile)
- appPreferences.storageLocation = documentFile.uri.toString()
+ appPreferences.storageLocation = location.toString()
+ getStorageLocation()?.let(::ensureNoMedia)
+ }.onFailure { err ->
+ Timber.e(err, "Failed to change storage location to $location")
+ }.isFailure
}
fun verify(download: DownloadFiles): Boolean {
diff --git a/app/src/main/java/org/jellyfin/mobile/downloads/DownloadManager.kt b/app/src/main/java/org/jellyfin/mobile/downloads/DownloadManager.kt
index 960b0281..19611747 100644
--- a/app/src/main/java/org/jellyfin/mobile/downloads/DownloadManager.kt
+++ b/app/src/main/java/org/jellyfin/mobile/downloads/DownloadManager.kt
@@ -110,7 +110,7 @@ class DownloadManager(
if (deleteFiles) {
val storageLocation = storageManager.getStorageLocation()
- storageLocation.findFile(download.path)?.delete()
+ storageLocation?.findFile(download.path)?.delete()
}
downloadDao.delete(id)
diff --git a/app/src/main/java/org/jellyfin/mobile/downloads/DownloadQueue.kt b/app/src/main/java/org/jellyfin/mobile/downloads/DownloadQueue.kt
index 42140d3d..a3639ab4 100644
--- a/app/src/main/java/org/jellyfin/mobile/downloads/DownloadQueue.kt
+++ b/app/src/main/java/org/jellyfin/mobile/downloads/DownloadQueue.kt
@@ -119,8 +119,8 @@ class DownloadQueue(
private suspend fun prepareFiles(api: ApiClient, downloadWithFiles: DownloadFiles): List {
val storageLocation = storageManager.getStorageLocation()
- val itemLocation = storageLocation.findFile(downloadWithFiles.download.path)
- ?: storageLocation.createDirectory(downloadWithFiles.download.path)
+ val itemLocation = storageLocation?.findFile(downloadWithFiles.download.path)
+ ?: storageLocation?.createDirectory(downloadWithFiles.download.path)
?: error("Unable to find or create folder ${downloadWithFiles.download.path}")
return buildList {
diff --git a/app/src/main/java/org/jellyfin/mobile/downloads/DownloadsViewModel.kt b/app/src/main/java/org/jellyfin/mobile/downloads/DownloadsViewModel.kt
index d9f60091..3026fb80 100644
--- a/app/src/main/java/org/jellyfin/mobile/downloads/DownloadsViewModel.kt
+++ b/app/src/main/java/org/jellyfin/mobile/downloads/DownloadsViewModel.kt
@@ -56,7 +56,7 @@ class DownloadsViewModel : ViewModel(), KoinComponent {
viewModelScope.launch {
val fileUri = withContext(Dispatchers.IO) {
val storageLocation = storageManager.getStorageLocation()
- val itemLocation = storageLocation.findFile(download.path)
+ val itemLocation = storageLocation?.findFile(download.path)
if (itemLocation != null && itemLocation.isDirectory) {
val filename = download.item.path?.replace(Regex("^.*[\\\\/]"), "")
if (filename != null) itemLocation.findFile(filename)?.uri else null
diff --git a/app/src/main/java/org/jellyfin/mobile/settings/SettingsFragment.kt b/app/src/main/java/org/jellyfin/mobile/settings/SettingsFragment.kt
index 5b31384b..4c571515 100644
--- a/app/src/main/java/org/jellyfin/mobile/settings/SettingsFragment.kt
+++ b/app/src/main/java/org/jellyfin/mobile/settings/SettingsFragment.kt
@@ -42,11 +42,11 @@ class SettingsFragment : Fragment(), BackPressInterceptor {
private val storageLocationPicker = registerForActivityResult(ActivityResultContracts.OpenDocumentTree()) { uri ->
if (uri != null) {
- storageManager.changeStorageLocation(uri)
+ val changed = storageManager.changeStorageLocation(uri)
// Update preference
- if (::downloadLocationPreference.isInitialized) {
- downloadLocationPreference.summary = storageManager.getStorageLocation().name
+ if (changed && ::downloadLocationPreference.isInitialized) {
+ downloadLocationPreference.summary = storageManager.getStorageLocation()?.name
downloadLocationPreference.requestRebindAndHighlight()
}
}
@@ -281,10 +281,10 @@ class SettingsFragment : Fragment(), BackPressInterceptor {
val location = storageManager.getStorageLocation()
titleRes = R.string.pref_download_location
- summary = location.name
+ summary = location?.name ?: getString(R.string.menu_item_none)
onClick {
- storageLocationPicker.launch(location.uri)
+ storageLocationPicker.launch(location?.uri ?: storageManager.defaultStorageLocation)
false
}
}
diff --git a/app/src/main/java/org/jellyfin/mobile/utils/SystemUtils.kt b/app/src/main/java/org/jellyfin/mobile/utils/SystemUtils.kt
index a4610883..c8a9945b 100644
--- a/app/src/main/java/org/jellyfin/mobile/utils/SystemUtils.kt
+++ b/app/src/main/java/org/jellyfin/mobile/utils/SystemUtils.kt
@@ -102,11 +102,14 @@ suspend fun MainActivity.requestDownload(itemIds: Collection) {
}
}
- if (permissionResult) {
- val server = mainViewModel.serverState.value.server ?: return
- val user = mainViewModel.userState.value.user ?: return
- downloadManager.enqueueItems(server, user, itemIds)
+ // Automatically use a default download location
+ if (appPreferences.storageLocation == null) {
+
}
+
+ val server = mainViewModel.serverState.value.server ?: return
+ val user = mainViewModel.userState.value.user ?: return
+ downloadManager.enqueueItems(server, user, itemIds)
}
fun Activity.isAutoRotateOn() = Settings.System.getInt(contentResolver, ACCELEROMETER_ROTATION, 0) == 1