Skip to content

Commit

Permalink
fix: Issues with permissions for local covers and backups
Browse files Browse the repository at this point in the history
  • Loading branch information
jmir1 committed Dec 2, 2023
1 parent 2c80237 commit 0faf8c3
Show file tree
Hide file tree
Showing 6 changed files with 41 additions and 12 deletions.
5 changes: 5 additions & 0 deletions app/src/main/AndroidManifest.xml
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,9 @@
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />

<!-- Storage -->
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />

<!-- For background jobs -->
<uses-permission android:name="android.permission.FOREGROUND_SERVICE" />
<uses-permission android:name="android.permission.WAKE_LOCK" />
Expand All @@ -33,6 +36,8 @@
android:largeHeap="true"
android:localeConfig="@xml/locales_config"
android:networkSecurityConfig="@xml/network_security_config"
android:preserveLegacyExternalStorage="true"
android:requestLegacyExternalStorage="true"
android:roundIcon="@mipmap/ic_launcher_round"
android:supportsRtl="true"
android:theme="@style/Theme.Tachiyomi">
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,5 @@
package eu.kanade.tachiyomi.data.backup

import android.Manifest
import android.content.Context
import android.content.SharedPreferences
import android.content.pm.PackageManager
Expand Down Expand Up @@ -42,7 +41,6 @@ import eu.kanade.tachiyomi.extension.anime.AnimeExtensionManager
import eu.kanade.tachiyomi.extension.manga.MangaExtensionManager
import eu.kanade.tachiyomi.source.anime.getPreferenceKey
import eu.kanade.tachiyomi.source.manga.getPreferenceKey
import eu.kanade.tachiyomi.util.system.hasPermission
import kotlinx.serialization.protobuf.ProtoBuf
import logcat.LogPriority
import okio.buffer
Expand Down Expand Up @@ -94,10 +92,6 @@ class BackupCreator(
* @param isAutoBackup backup called from scheduled backup job
*/
suspend fun createBackup(uri: Uri, flags: Int, isAutoBackup: Boolean): String {
if (!context.hasPermission(Manifest.permission.WRITE_EXTERNAL_STORAGE)) {
throw IllegalStateException(context.stringResource(MR.strings.missing_storage_permission))
}

val databaseAnime = getAnimeFavorites.await()
val databaseManga = getMangaFavorites.await()

Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
package eu.kanade.tachiyomi.data.coil

import android.net.Uri
import coil.ImageLoader
import coil.decode.DataSource
import coil.decode.ImageSource
Expand All @@ -10,6 +11,7 @@ import coil.fetch.SourceResult
import coil.network.HttpException
import coil.request.Options
import coil.request.Parameters
import com.hippo.unifile.UniFile
import eu.kanade.tachiyomi.animesource.online.AnimeHttpSource
import eu.kanade.tachiyomi.data.cache.AnimeCoverCache
import eu.kanade.tachiyomi.data.coil.AnimeCoverFetcher.Companion.USE_CUSTOM_COVER
Expand All @@ -24,6 +26,7 @@ import okio.Path.Companion.toOkioPath
import okio.Source
import okio.buffer
import okio.sink
import okio.source
import tachiyomi.core.util.system.logcat
import tachiyomi.domain.entries.anime.model.Anime
import tachiyomi.domain.entries.anime.model.AnimeCover
Expand Down Expand Up @@ -71,10 +74,21 @@ class AnimeCoverFetcher(
return when (getResourceType(url)) {
Type.URL -> httpLoader()
Type.File -> fileLoader(File(url.substringAfter("file://")))
Type.URI -> uniFileLoader(url)
null -> error("Invalid image")
}
}

private fun uniFileLoader(urlString: String): FetchResult {
val uniFile = UniFile.fromUri(options.context, Uri.parse(urlString))!!
val tempFile = uniFile.openInputStream().source().buffer()
return SourceResult(
source = ImageSource(source = tempFile, context = options.context),
mimeType = "image/*",
dataSource = DataSource.DISK,
)
}

private fun fileLoader(file: File): FetchResult {
return SourceResult(
source = ImageSource(file = file.toOkioPath(), diskCacheKey = diskCacheKey),
Expand Down Expand Up @@ -252,12 +266,13 @@ class AnimeCoverFetcher(
cover.isNullOrEmpty() -> null
cover.startsWith("http", true) || cover.startsWith("Custom-", true) -> Type.URL
cover.startsWith("/") || cover.startsWith("file://") -> Type.File
cover.startsWith("content") -> Type.URI
else -> null
}
}

private enum class Type {
File, URL
File, URL, URI
}

class AnimeFactory(
Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
package eu.kanade.tachiyomi.data.coil

import android.net.Uri
import coil.ImageLoader
import coil.decode.DataSource
import coil.decode.ImageSource
Expand All @@ -10,6 +11,7 @@ import coil.fetch.SourceResult
import coil.network.HttpException
import coil.request.Options
import coil.request.Parameters
import com.hippo.unifile.UniFile
import eu.kanade.tachiyomi.data.cache.MangaCoverCache
import eu.kanade.tachiyomi.data.coil.MangaCoverFetcher.Companion.USE_CUSTOM_COVER
import eu.kanade.tachiyomi.network.await
Expand All @@ -24,6 +26,7 @@ import okio.Path.Companion.toOkioPath
import okio.Source
import okio.buffer
import okio.sink
import okio.source
import tachiyomi.core.util.system.logcat
import tachiyomi.domain.entries.manga.model.Manga
import tachiyomi.domain.entries.manga.model.MangaCover
Expand Down Expand Up @@ -71,10 +74,21 @@ class MangaCoverFetcher(
return when (getResourceType(url)) {
Type.URL -> httpLoader()
Type.File -> fileLoader(File(url.substringAfter("file://")))
Type.URI -> uniFileLoader(url)
null -> error("Invalid image")
}
}

private fun uniFileLoader(urlString: String): FetchResult {
val uniFile = UniFile.fromUri(options.context, Uri.parse(urlString))!!
val tempFile = uniFile.openInputStream().source().buffer()
return SourceResult(
source = ImageSource(source = tempFile, context = options.context),
mimeType = "image/*",
dataSource = DataSource.DISK,
)
}

private fun fileLoader(file: File): FetchResult {
return SourceResult(
source = ImageSource(file = file.toOkioPath(), diskCacheKey = diskCacheKey),
Expand Down Expand Up @@ -256,12 +270,13 @@ class MangaCoverFetcher(
cover.isNullOrEmpty() -> null
cover.startsWith("http", true) || cover.startsWith("Custom-", true) -> Type.URL
cover.startsWith("/") || cover.startsWith("file://") -> Type.File
cover.startsWith("content") -> Type.URI
else -> null
}
}

private enum class Type {
File, URL
File, URL, URI
}

class MangaFactory(
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -124,7 +124,7 @@ actual class LocalAnimeSource(

// Try to find the cover
coverManager.find(animeDir.name.orEmpty())?.let {
thumbnail_url = it.filePath
thumbnail_url = it.uri.toString()
}
}
}
Expand Down Expand Up @@ -154,7 +154,7 @@ actual class LocalAnimeSource(
// Anime details related
override suspend fun getAnimeDetails(anime: SAnime): SAnime = withIOContext {
coverManager.find(anime.url)?.let {
anime.thumbnail_url = it.filePath
anime.thumbnail_url = it.uri.toString()
}

val animeDirFiles = fileSystem.getFilesInAnimeDirectory(anime.url)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -130,7 +130,7 @@ actual class LocalMangaSource(

// Try to find the cover
coverManager.find(mangaDir.name.orEmpty())?.let {
thumbnail_url = it.filePath
thumbnail_url = it.uri.toString()
}
}
}
Expand All @@ -143,7 +143,7 @@ actual class LocalMangaSource(
// Manga details related
override suspend fun getMangaDetails(manga: SManga): SManga = withIOContext {
coverManager.find(manga.url)?.let {
manga.thumbnail_url = it.filePath
manga.thumbnail_url = it.uri.toString()
}

// Augment manga details based on metadata files
Expand Down

0 comments on commit 0faf8c3

Please sign in to comment.