Merge remote-tracking branch 'origin/dev' into dev
This commit is contained in:
commit
c5a03c4455
17 changed files with 55 additions and 31 deletions
|
@ -636,6 +636,23 @@ fun ImageView.loadImage(file: FileUrl?, size: Int = 0) {
|
|||
}
|
||||
}
|
||||
|
||||
fun ImageView.loadImage(file: FileUrl?, width: Int = 0, height: Int = 0) {
|
||||
file?.url = PrefManager.getVal<String>(PrefName.ImageUrl).ifEmpty { file?.url ?: "" }
|
||||
if (file?.url?.isNotEmpty() == true) {
|
||||
tryWith {
|
||||
if (file.url.startsWith("content://")) {
|
||||
Glide.with(this.context).load(Uri.parse(file.url)).transition(withCrossFade())
|
||||
.override(width, height).into(this)
|
||||
} else {
|
||||
val glideUrl = GlideUrl(file.url) { file.headers }
|
||||
Glide.with(this.context).load(glideUrl).transition(withCrossFade()).override(width, height)
|
||||
.into(this)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
fun ImageView.loadLocalImage(file: File?, size: Int = 0) {
|
||||
if (file?.exists() == true) {
|
||||
tryWith {
|
||||
|
|
|
@ -79,7 +79,6 @@ class AddonDownloader {
|
|||
activity.getSystemService(Context.NOTIFICATION_SERVICE) as NotificationManager
|
||||
val installerSteps = InstallerSteps(notificationManager, activity)
|
||||
manager.install(this)
|
||||
.observeOn(AndroidSchedulers.mainThread())
|
||||
.observeOn(AndroidSchedulers.mainThread())
|
||||
.subscribe(
|
||||
{ installStep -> installerSteps.onInstallStep(installStep) {} },
|
||||
|
|
|
@ -75,7 +75,6 @@ internal class AddonInstallReceiver : BroadcastReceiver() {
|
|||
}
|
||||
|
||||
Intent.ACTION_PACKAGE_REPLACED -> {
|
||||
if (ExtensionInstallReceiver.isReplacing(intent)) return
|
||||
launchNow {
|
||||
when (type) {
|
||||
AddonType.DOWNLOAD -> {
|
||||
|
|
|
@ -369,7 +369,7 @@ class DownloadsManager(private val context: Context) {
|
|||
}
|
||||
|
||||
private const val RESERVED_CHARS = "|\\?*<\":>+[]/'"
|
||||
private fun String?.findValidName(): String {
|
||||
fun String?.findValidName(): String {
|
||||
return this?.filterNot { RESERVED_CHARS.contains(it) } ?: ""
|
||||
}
|
||||
|
||||
|
|
|
@ -36,6 +36,7 @@ import ani.dantotsu.download.DownloadCompat.Companion.loadOfflineAnimeModelCompa
|
|||
import ani.dantotsu.download.DownloadedType
|
||||
import ani.dantotsu.download.DownloadsManager
|
||||
import ani.dantotsu.download.DownloadsManager.Companion.compareName
|
||||
import ani.dantotsu.download.findValidName
|
||||
import ani.dantotsu.initActivity
|
||||
import ani.dantotsu.media.Media
|
||||
import ani.dantotsu.media.MediaDetailsActivity
|
||||
|
@ -289,7 +290,7 @@ class OfflineAnimeFragment : Fragment(), OfflineAnimeSearchListener {
|
|||
}
|
||||
downloadsJob = Job()
|
||||
CoroutineScope(Dispatchers.IO + downloadsJob).launch {
|
||||
val animeTitles = downloadManager.animeDownloadedTypes.map { it.titleName }.distinct()
|
||||
val animeTitles = downloadManager.animeDownloadedTypes.map { it.titleName.findValidName() }.distinct()
|
||||
val newAnimeDownloads = mutableListOf<OfflineAnimeModel>()
|
||||
for (title in animeTitles) {
|
||||
val tDownloads = downloadManager.animeDownloadedTypes.filter { it.titleName == title }
|
||||
|
@ -365,6 +366,7 @@ class OfflineAnimeFragment : Fragment(), OfflineAnimeSearchListener {
|
|||
val bannerUri: Uri? = if (banner?.exists() == true) {
|
||||
banner.uri
|
||||
} else null
|
||||
if (coverUri == null && bannerUri == null) throw Exception("No cover or banner found, probably compat")
|
||||
val title = mediaModel.mainName()
|
||||
val score = ((if (mediaModel.userScore == 0) (mediaModel.meanScore
|
||||
?: 0) else mediaModel.userScore) / 10.0).toString()
|
||||
|
|
|
@ -34,6 +34,7 @@ import ani.dantotsu.download.DownloadedType
|
|||
import ani.dantotsu.download.DownloadsManager
|
||||
import ani.dantotsu.download.DownloadsManager.Companion.compareName
|
||||
import ani.dantotsu.download.DownloadsManager.Companion.getSubDirectory
|
||||
import ani.dantotsu.download.findValidName
|
||||
import ani.dantotsu.initActivity
|
||||
import ani.dantotsu.media.Media
|
||||
import ani.dantotsu.media.MediaDetailsActivity
|
||||
|
@ -280,7 +281,7 @@ class OfflineMangaFragment : Fragment(), OfflineMangaSearchListener {
|
|||
downloads = listOf()
|
||||
downloadsJob = Job()
|
||||
CoroutineScope(Dispatchers.IO + downloadsJob).launch {
|
||||
val mangaTitles = downloadManager.mangaDownloadedTypes.map { it.titleName }.distinct()
|
||||
val mangaTitles = downloadManager.mangaDownloadedTypes.map { it.titleName.findValidName() }.distinct()
|
||||
val newMangaDownloads = mutableListOf<OfflineMangaModel>()
|
||||
for (title in mangaTitles) {
|
||||
val tDownloads = downloadManager.mangaDownloadedTypes.filter { it.titleName == title }
|
||||
|
@ -356,6 +357,7 @@ class OfflineMangaFragment : Fragment(), OfflineMangaSearchListener {
|
|||
val bannerUri: Uri? = if (banner?.exists() == true) {
|
||||
banner.uri
|
||||
} else null
|
||||
if (coverUri == null && bannerUri == null) throw Exception("No cover or banner found, probably compat")
|
||||
val title = mediaModel.mainName()
|
||||
val score = ((if (mediaModel.userScore == 0) (mediaModel.meanScore
|
||||
?: 0) else mediaModel.userScore) / 10.0).toString()
|
||||
|
|
|
@ -70,7 +70,7 @@ object MediaNameAdapter {
|
|||
return if (seasonMatcher.find()) {
|
||||
seasonMatcher.group(2)?.toInt()
|
||||
} else {
|
||||
null
|
||||
text.toIntOrNull()
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -93,7 +93,7 @@ object MediaNameAdapter {
|
|||
}
|
||||
}
|
||||
} else {
|
||||
null
|
||||
text.toFloatOrNull()
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -139,7 +139,7 @@ object MediaNameAdapter {
|
|||
if (failedChapterNumberMatcher.find()) {
|
||||
failedChapterNumberMatcher.group(1)?.toFloat()
|
||||
} else {
|
||||
null
|
||||
text.toFloatOrNull()
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -305,14 +305,12 @@ class SearchAdapter(private val activity: SearchActivity, private val type: Stri
|
|||
private fun fadeInAnimation(): Animation {
|
||||
return AlphaAnimation(0f, 1f).apply {
|
||||
duration = 150
|
||||
fillAfter = true
|
||||
}
|
||||
}
|
||||
|
||||
private fun fadeOutAnimation(): Animation {
|
||||
return AlphaAnimation(1f, 0f).apply {
|
||||
duration = 150
|
||||
fillAfter = true
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -121,7 +121,6 @@ class CommentsFragment : Fragment() {
|
|||
}
|
||||
}
|
||||
} else {
|
||||
toast("Not logged in")
|
||||
activity.binding.commentMessageContainer.visibility = View.GONE
|
||||
}
|
||||
|
||||
|
|
|
@ -117,9 +117,10 @@ class NovelReadFragment : Fragment(),
|
|||
context ?: currContext()!!,
|
||||
MediaType.NOVEL,
|
||||
false,
|
||||
media.mainName(),
|
||||
novel.name
|
||||
)
|
||||
val file = directory?.findFile(novel.name)
|
||||
val file = directory?.findFile("0.epub")
|
||||
if (file?.exists() == false) return false
|
||||
val fileUri = file?.uri ?: return false
|
||||
val intent = Intent(context, NovelReaderActivity::class.java).apply {
|
||||
|
|
|
@ -8,6 +8,7 @@ import androidx.core.view.isVisible
|
|||
import androidx.recyclerview.widget.RecyclerView
|
||||
import ani.dantotsu.R
|
||||
import ani.dantotsu.databinding.ItemNovelResponseBinding
|
||||
import ani.dantotsu.loadImage
|
||||
import ani.dantotsu.parsers.ShowResponse
|
||||
import ani.dantotsu.setAnimation
|
||||
import ani.dantotsu.snackString
|
||||
|
@ -37,10 +38,7 @@ class NovelResponseAdapter(
|
|||
val binding = holder.binding
|
||||
val novel = list[position]
|
||||
setAnimation(fragment.requireContext(), holder.binding.root)
|
||||
|
||||
val cover = GlideUrl(novel.coverUrl.url) { novel.coverUrl.headers }
|
||||
Glide.with(binding.itemEpisodeImage).load(cover).override(400, 0)
|
||||
.into(binding.itemEpisodeImage)
|
||||
binding.itemEpisodeImage.loadImage(novel.coverUrl, 400, 0)
|
||||
|
||||
val typedValue = TypedValue()
|
||||
fragment.requireContext().theme?.resolveAttribute(
|
||||
|
|
|
@ -55,12 +55,11 @@ class OfflineAnimeParser : AnimeParser() {
|
|||
episodes.add(episode)
|
||||
}
|
||||
}
|
||||
return if (episodes.isNotEmpty()) {
|
||||
episodes.sortBy { MediaNameAdapter.findEpisodeNumber(it.number) }
|
||||
episodes
|
||||
} else {
|
||||
loadEpisodesCompat(animeLink, extra, sAnime)
|
||||
}
|
||||
//episodes.sortBy { MediaNameAdapter.findEpisodeNumber(it.number) }
|
||||
episodes.addAll(loadEpisodesCompat(animeLink, extra, sAnime))
|
||||
//filter those with the same name
|
||||
return episodes.distinctBy { it.number }
|
||||
.sortedBy { MediaNameAdapter.findEpisodeNumber(it.number) }
|
||||
}
|
||||
return emptyList()
|
||||
}
|
||||
|
|
|
@ -43,12 +43,9 @@ class OfflineMangaParser : MangaParser() {
|
|||
chapters.add(chapter)
|
||||
}
|
||||
}
|
||||
return if (chapters.isNotEmpty()) {
|
||||
chapters.sortBy { MediaNameAdapter.findChapterNumber(it.number) }
|
||||
chapters
|
||||
} else {
|
||||
loadChaptersCompat(mangaLink, extra, sManga)
|
||||
}
|
||||
chapters.addAll(loadChaptersCompat(mangaLink, extra, sManga))
|
||||
return chapters.distinctBy { it.number }
|
||||
.sortedBy { MediaNameAdapter.findChapterNumber(it.number) }
|
||||
}
|
||||
return emptyList()
|
||||
}
|
||||
|
|
|
@ -73,7 +73,7 @@ class OfflineNovelParser : NovelParser() {
|
|||
}
|
||||
val cover = directory?.findFile("cover.jpg")?.uri.toString()
|
||||
names.forEach {
|
||||
returnList.add(ShowResponse(it, it, cover))
|
||||
returnList.add(ShowResponse(it, query, cover))
|
||||
}
|
||||
}
|
||||
return returnList
|
||||
|
|
|
@ -10,7 +10,9 @@ import android.content.pm.PackageInstaller
|
|||
import android.os.Build
|
||||
import androidx.core.content.ContextCompat
|
||||
import androidx.core.content.IntentSanitizer
|
||||
import ani.dantotsu.R
|
||||
import ani.dantotsu.snackString
|
||||
import ani.dantotsu.toast
|
||||
import ani.dantotsu.util.Logger
|
||||
import eu.kanade.tachiyomi.extension.InstallStep
|
||||
import eu.kanade.tachiyomi.util.lang.use
|
||||
|
@ -55,7 +57,16 @@ class PackageInstallerInstaller(private val service: Service) : Installer(servic
|
|||
}
|
||||
|
||||
PackageInstaller.STATUS_SUCCESS -> continueQueue(InstallStep.Installed)
|
||||
else -> continueQueue(InstallStep.Error)
|
||||
PackageInstaller.STATUS_FAILURE_CONFLICT -> {
|
||||
Logger.log("Failed to install extension due to conflict")
|
||||
toast(context.getString(R.string.failed_ext_install_conflict))
|
||||
continueQueue(InstallStep.Error)
|
||||
}
|
||||
else -> {
|
||||
Logger.log("Fatal error for $intent")
|
||||
Logger.log("Status: ${intent.getIntExtra(PackageInstaller.EXTRA_STATUS, -1)}")
|
||||
continueQueue(InstallStep.Error)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -111,7 +111,7 @@
|
|||
android:layout_gravity="center"
|
||||
android:drawablePadding="4dp"
|
||||
android:fontFamily="@font/poppins_bold"
|
||||
android:text="Image"
|
||||
android:text="@string/image"
|
||||
android:textColor="?attr/colorPrimary"
|
||||
app:drawableStartCompat="@drawable/ic_round_search_24"
|
||||
app:drawableTint="?attr/colorPrimary" />
|
||||
|
|
|
@ -956,4 +956,6 @@ Non quae tempore quo provident laudantium qui illo dolor vel quia dolor et exerc
|
|||
<string name="update_addon">Update Addon</string>
|
||||
<string name="install_addon">Install Addon</string>
|
||||
<string name="download_addon_not_found">Download addon not found</string>
|
||||
<string name="image">Image</string>
|
||||
<string name="failed_ext_install_conflict">Failed to install extension due to conflict</string>
|
||||
</resources>
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue