mirror of
https://github.com/null2264/yokai.git
synced 2025-06-21 10:44:42 +00:00
parent
4334f2bdfc
commit
c709206985
9 changed files with 42 additions and 17 deletions
|
@ -13,6 +13,7 @@ import eu.kanade.tachiyomi.data.notification.NotificationHandler
|
||||||
import eu.kanade.tachiyomi.data.notification.NotificationReceiver
|
import eu.kanade.tachiyomi.data.notification.NotificationReceiver
|
||||||
import eu.kanade.tachiyomi.data.notification.Notifications
|
import eu.kanade.tachiyomi.data.notification.Notifications
|
||||||
import eu.kanade.tachiyomi.data.preference.PreferencesHelper
|
import eu.kanade.tachiyomi.data.preference.PreferencesHelper
|
||||||
|
import eu.kanade.tachiyomi.util.chapter.ChapterUtil.Companion.preferredChapterName
|
||||||
import eu.kanade.tachiyomi.util.lang.chop
|
import eu.kanade.tachiyomi.util.lang.chop
|
||||||
import eu.kanade.tachiyomi.util.system.localeContext
|
import eu.kanade.tachiyomi.util.system.localeContext
|
||||||
import eu.kanade.tachiyomi.util.system.notificationBuilder
|
import eu.kanade.tachiyomi.util.system.notificationBuilder
|
||||||
|
@ -93,7 +94,8 @@ internal class DownloadNotifier(private val context: Context) {
|
||||||
if (download != null && !preferences.hideNotificationContent()) {
|
if (download != null && !preferences.hideNotificationContent()) {
|
||||||
val title = download.manga.title.chop(15)
|
val title = download.manga.title.chop(15)
|
||||||
val quotedTitle = Pattern.quote(title)
|
val quotedTitle = Pattern.quote(title)
|
||||||
val chapter = download.chapter.name.replaceFirst(
|
val name = download.chapter.preferredChapterName(context, download.manga, preferences)
|
||||||
|
val chapter = name.replaceFirst(
|
||||||
"$quotedTitle[\\s]*[-]*[\\s]*"
|
"$quotedTitle[\\s]*[-]*[\\s]*"
|
||||||
.toRegex(RegexOption.IGNORE_CASE),
|
.toRegex(RegexOption.IGNORE_CASE),
|
||||||
"",
|
"",
|
||||||
|
@ -152,7 +154,8 @@ internal class DownloadNotifier(private val context: Context) {
|
||||||
} else {
|
} else {
|
||||||
val title = download.manga.title.chop(15)
|
val title = download.manga.title.chop(15)
|
||||||
val quotedTitle = Pattern.quote(title)
|
val quotedTitle = Pattern.quote(title)
|
||||||
val chapter = download.chapter.name.replaceFirst(
|
val name = download.chapter.preferredChapterName(context, download.manga, preferences)
|
||||||
|
val chapter = name.replaceFirst(
|
||||||
"$quotedTitle[\\s]*[-]*[\\s]*".toRegex(RegexOption.IGNORE_CASE),
|
"$quotedTitle[\\s]*[-]*[\\s]*".toRegex(RegexOption.IGNORE_CASE),
|
||||||
"",
|
"",
|
||||||
)
|
)
|
||||||
|
|
|
@ -22,6 +22,7 @@ import eu.kanade.tachiyomi.source.UnmeteredSource
|
||||||
import eu.kanade.tachiyomi.source.model.Page
|
import eu.kanade.tachiyomi.source.model.Page
|
||||||
import eu.kanade.tachiyomi.source.online.HttpSource
|
import eu.kanade.tachiyomi.source.online.HttpSource
|
||||||
import eu.kanade.tachiyomi.source.online.fetchAllImageUrlsFromPageList
|
import eu.kanade.tachiyomi.source.online.fetchAllImageUrlsFromPageList
|
||||||
|
import eu.kanade.tachiyomi.util.chapter.ChapterUtil.Companion.preferredChapterName
|
||||||
import eu.kanade.tachiyomi.util.lang.RetryWithDelay
|
import eu.kanade.tachiyomi.util.lang.RetryWithDelay
|
||||||
import eu.kanade.tachiyomi.util.lang.plusAssign
|
import eu.kanade.tachiyomi.util.lang.plusAssign
|
||||||
import eu.kanade.tachiyomi.util.storage.DiskUtil
|
import eu.kanade.tachiyomi.util.storage.DiskUtil
|
||||||
|
@ -319,9 +320,10 @@ class Downloader(
|
||||||
val mangaDir = provider.getMangaDir(download.manga, download.source)
|
val mangaDir = provider.getMangaDir(download.manga, download.source)
|
||||||
|
|
||||||
val availSpace = DiskUtil.getAvailableStorageSpace(mangaDir)
|
val availSpace = DiskUtil.getAvailableStorageSpace(mangaDir)
|
||||||
|
val chapName = download.chapter.preferredChapterName(context, download.manga, preferences)
|
||||||
if (availSpace != -1L && availSpace < MIN_DISK_SPACE) {
|
if (availSpace != -1L && availSpace < MIN_DISK_SPACE) {
|
||||||
download.status = Download.State.ERROR
|
download.status = Download.State.ERROR
|
||||||
notifier.onError(context.getString(R.string.couldnt_download_low_space), download.chapter.name)
|
notifier.onError(context.getString(R.string.couldnt_download_low_space), chapName)
|
||||||
return@defer Observable.just(download)
|
return@defer Observable.just(download)
|
||||||
}
|
}
|
||||||
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R &&
|
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R &&
|
||||||
|
@ -334,7 +336,7 @@ class Downloader(
|
||||||
|
|
||||||
notifier.onError(
|
notifier.onError(
|
||||||
context.getString(R.string.external_storage_download_notice),
|
context.getString(R.string.external_storage_download_notice),
|
||||||
download.chapter.name,
|
chapName,
|
||||||
download.manga.title,
|
download.manga.title,
|
||||||
intent,
|
intent,
|
||||||
)
|
)
|
||||||
|
@ -386,7 +388,7 @@ class Downloader(
|
||||||
.onErrorReturn { error ->
|
.onErrorReturn { error ->
|
||||||
Timber.e(error)
|
Timber.e(error)
|
||||||
download.status = Download.State.ERROR
|
download.status = Download.State.ERROR
|
||||||
notifier.onError(error.message, download.chapter.name, download.manga.title)
|
notifier.onError(error.message, chapName, download.manga.title)
|
||||||
download
|
download
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -427,12 +429,13 @@ class Downloader(
|
||||||
else -> downloadImage(page, download.source, tmpDir, filename)
|
else -> downloadImage(page, download.source, tmpDir, filename)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
val chapName = download.chapter.preferredChapterName(context, download.manga, preferences)
|
||||||
return pageObservable
|
return pageObservable
|
||||||
// When the page is ready, set page path, progress (just in case) and status
|
// When the page is ready, set page path, progress (just in case) and status
|
||||||
.doOnNext { file ->
|
.doOnNext { file ->
|
||||||
val success = splitTallImageIfNeeded(page, tmpDir)
|
val success = splitTallImageIfNeeded(page, tmpDir)
|
||||||
if (success.not()) {
|
if (success.not()) {
|
||||||
notifier.onError(context.getString(R.string.download_notifier_split_failed), download.chapter.name, download.manga.title)
|
notifier.onError(context.getString(R.string.download_notifier_split_failed), chapName, download.manga.title)
|
||||||
}
|
}
|
||||||
page.uri = file.uri
|
page.uri = file.uri
|
||||||
page.progress = 100
|
page.progress = 100
|
||||||
|
@ -444,7 +447,7 @@ class Downloader(
|
||||||
.onErrorReturn {
|
.onErrorReturn {
|
||||||
page.progress = 0
|
page.progress = 0
|
||||||
page.status = Page.State.ERROR
|
page.status = Page.State.ERROR
|
||||||
notifier.onError(it.message, download.chapter.name, download.manga.title)
|
notifier.onError(it.message, chapName, download.manga.title)
|
||||||
page
|
page
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -23,6 +23,7 @@ import eu.kanade.tachiyomi.data.notification.NotificationReceiver
|
||||||
import eu.kanade.tachiyomi.data.notification.Notifications
|
import eu.kanade.tachiyomi.data.notification.Notifications
|
||||||
import eu.kanade.tachiyomi.data.preference.PreferencesHelper
|
import eu.kanade.tachiyomi.data.preference.PreferencesHelper
|
||||||
import eu.kanade.tachiyomi.ui.main.MainActivity
|
import eu.kanade.tachiyomi.ui.main.MainActivity
|
||||||
|
import eu.kanade.tachiyomi.util.chapter.ChapterUtil.Companion.preferredChapterName
|
||||||
import eu.kanade.tachiyomi.util.lang.chop
|
import eu.kanade.tachiyomi.util.lang.chop
|
||||||
import eu.kanade.tachiyomi.util.system.notification
|
import eu.kanade.tachiyomi.util.system.notification
|
||||||
import eu.kanade.tachiyomi.util.system.notificationBuilder
|
import eu.kanade.tachiyomi.util.system.notificationBuilder
|
||||||
|
@ -172,7 +173,9 @@ class LibraryUpdateNotifier(private val context: Context) {
|
||||||
updates.forEach {
|
updates.forEach {
|
||||||
val manga = it.key
|
val manga = it.key
|
||||||
val chapters = it.value
|
val chapters = it.value
|
||||||
val chapterNames = chapters.map { chapter -> chapter.name }
|
val chapterNames = chapters.map { chapter ->
|
||||||
|
chapter.preferredChapterName(context, manga, preferences)
|
||||||
|
}
|
||||||
notifications.add(
|
notifications.add(
|
||||||
Pair(
|
Pair(
|
||||||
context.notification(Notifications.CHANNEL_NEW_CHAPTERS) {
|
context.notification(Notifications.CHANNEL_NEW_CHAPTERS) {
|
||||||
|
|
|
@ -3,6 +3,8 @@ package eu.kanade.tachiyomi.ui.download
|
||||||
import android.view.MenuItem
|
import android.view.MenuItem
|
||||||
import eu.davidea.flexibleadapter.FlexibleAdapter
|
import eu.davidea.flexibleadapter.FlexibleAdapter
|
||||||
import eu.davidea.flexibleadapter.items.AbstractFlexibleItem
|
import eu.davidea.flexibleadapter.items.AbstractFlexibleItem
|
||||||
|
import eu.kanade.tachiyomi.data.preference.PreferencesHelper
|
||||||
|
import uy.kohesive.injekt.injectLazy
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Adapter storing a list of downloads.
|
* Adapter storing a list of downloads.
|
||||||
|
@ -19,6 +21,7 @@ class DownloadAdapter(controller: DownloadItemListener) : FlexibleAdapter<Abstra
|
||||||
* Listener called when an item of the list is released.
|
* Listener called when an item of the list is released.
|
||||||
*/
|
*/
|
||||||
val downloadItemListener: DownloadItemListener = controller
|
val downloadItemListener: DownloadItemListener = controller
|
||||||
|
val preferences: PreferencesHelper by injectLazy()
|
||||||
|
|
||||||
interface DownloadItemListener {
|
interface DownloadItemListener {
|
||||||
/**
|
/**
|
||||||
|
|
|
@ -20,6 +20,7 @@ import eu.kanade.tachiyomi.databinding.DownloadBottomSheetBinding
|
||||||
import eu.kanade.tachiyomi.ui.extension.ExtensionDividerItemDecoration
|
import eu.kanade.tachiyomi.ui.extension.ExtensionDividerItemDecoration
|
||||||
import eu.kanade.tachiyomi.ui.main.MainActivity
|
import eu.kanade.tachiyomi.ui.main.MainActivity
|
||||||
import eu.kanade.tachiyomi.ui.recents.RecentsController
|
import eu.kanade.tachiyomi.ui.recents.RecentsController
|
||||||
|
import eu.kanade.tachiyomi.util.chapter.ChapterUtil.Companion.preferredChapterName
|
||||||
import eu.kanade.tachiyomi.util.view.collapse
|
import eu.kanade.tachiyomi.util.view.collapse
|
||||||
import eu.kanade.tachiyomi.util.view.doOnApplyWindowInsetsCompat
|
import eu.kanade.tachiyomi.util.view.doOnApplyWindowInsetsCompat
|
||||||
import eu.kanade.tachiyomi.util.view.expand
|
import eu.kanade.tachiyomi.util.view.expand
|
||||||
|
@ -126,7 +127,7 @@ class DownloadBottomSheet @JvmOverloads constructor(
|
||||||
binding.titleText.text = if (extCount != null) {
|
binding.titleText.text = if (extCount != null) {
|
||||||
resources.getString(
|
resources.getString(
|
||||||
R.string.downloading_,
|
R.string.downloading_,
|
||||||
extCount.chapter.name,
|
extCount.chapter.preferredChapterName(context, extCount.manga, preferences),
|
||||||
)
|
)
|
||||||
} else {
|
} else {
|
||||||
""
|
""
|
||||||
|
|
|
@ -8,6 +8,7 @@ import eu.kanade.tachiyomi.R
|
||||||
import eu.kanade.tachiyomi.data.download.model.Download
|
import eu.kanade.tachiyomi.data.download.model.Download
|
||||||
import eu.kanade.tachiyomi.databinding.DownloadItemBinding
|
import eu.kanade.tachiyomi.databinding.DownloadItemBinding
|
||||||
import eu.kanade.tachiyomi.ui.base.holder.BaseFlexibleViewHolder
|
import eu.kanade.tachiyomi.ui.base.holder.BaseFlexibleViewHolder
|
||||||
|
import eu.kanade.tachiyomi.util.chapter.ChapterUtil.Companion.preferredChapterName
|
||||||
import eu.kanade.tachiyomi.util.view.setVectorCompat
|
import eu.kanade.tachiyomi.util.view.setVectorCompat
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -36,7 +37,8 @@ class DownloadHolder(private val view: View, val adapter: DownloadAdapter) :
|
||||||
fun bind(download: Download) {
|
fun bind(download: Download) {
|
||||||
this.download = download
|
this.download = download
|
||||||
// Update the chapter name.
|
// Update the chapter name.
|
||||||
binding.chapterTitle.text = download.chapter.name
|
binding.chapterTitle.text = download.chapter
|
||||||
|
.preferredChapterName(itemView.context, download.manga, adapter.preferences)
|
||||||
|
|
||||||
// Update the manga title
|
// Update the manga title
|
||||||
binding.title.text = download.manga.title
|
binding.title.text = download.manga.title
|
||||||
|
|
|
@ -1631,7 +1631,7 @@ class ReaderActivity : BaseActivity<ReaderActivityBinding>() {
|
||||||
val text = "${manga.title}: ${if (chapter.isRecognizedNumber) {
|
val text = "${manga.title}: ${if (chapter.isRecognizedNumber) {
|
||||||
getString(R.string.chapter_, decimalFormat.format(chapter.chapter_number))
|
getString(R.string.chapter_, decimalFormat.format(chapter.chapter_number))
|
||||||
} else {
|
} else {
|
||||||
chapter.name
|
chapter.preferredChapterName(this, manga, preferences)
|
||||||
}
|
}
|
||||||
}, $pageNumber"
|
}, $pageNumber"
|
||||||
|
|
||||||
|
|
|
@ -38,6 +38,7 @@ import eu.kanade.tachiyomi.ui.reader.settings.OrientationType
|
||||||
import eu.kanade.tachiyomi.ui.reader.settings.ReadingModeType
|
import eu.kanade.tachiyomi.ui.reader.settings.ReadingModeType
|
||||||
import eu.kanade.tachiyomi.util.chapter.ChapterFilter
|
import eu.kanade.tachiyomi.util.chapter.ChapterFilter
|
||||||
import eu.kanade.tachiyomi.util.chapter.ChapterSort
|
import eu.kanade.tachiyomi.util.chapter.ChapterSort
|
||||||
|
import eu.kanade.tachiyomi.util.chapter.ChapterUtil.Companion.preferredChapterName
|
||||||
import eu.kanade.tachiyomi.util.chapter.syncChaptersWithSource
|
import eu.kanade.tachiyomi.util.chapter.syncChaptersWithSource
|
||||||
import eu.kanade.tachiyomi.util.chapter.updateTrackChapterRead
|
import eu.kanade.tachiyomi.util.chapter.updateTrackChapterRead
|
||||||
import eu.kanade.tachiyomi.util.isLocal
|
import eu.kanade.tachiyomi.util.isLocal
|
||||||
|
@ -734,6 +735,7 @@ class ReaderViewModel(
|
||||||
private fun saveImage(page: ReaderPage, directory: File, manga: Manga): File {
|
private fun saveImage(page: ReaderPage, directory: File, manga: Manga): File {
|
||||||
val stream = page.stream!!
|
val stream = page.stream!!
|
||||||
val type = ImageUtil.findImageType(stream) ?: throw Exception("Not an image")
|
val type = ImageUtil.findImageType(stream) ?: throw Exception("Not an image")
|
||||||
|
val context = Injekt.get<Application>()
|
||||||
|
|
||||||
directory.mkdirs()
|
directory.mkdirs()
|
||||||
|
|
||||||
|
@ -741,7 +743,7 @@ class ReaderViewModel(
|
||||||
|
|
||||||
// Build destination file.
|
// Build destination file.
|
||||||
val filename = DiskUtil.buildValidFilename(
|
val filename = DiskUtil.buildValidFilename(
|
||||||
"${manga.title} - ${chapter.name}".take(225),
|
"${manga.title} - ${chapter.preferredChapterName(context, manga, preferences)}".take(225),
|
||||||
) + " - ${page.number}.${type.extension}"
|
) + " - ${page.number}.${type.extension}"
|
||||||
|
|
||||||
val destFile = File(directory, filename)
|
val destFile = File(directory, filename)
|
||||||
|
@ -771,10 +773,11 @@ class ReaderViewModel(
|
||||||
directory.mkdirs()
|
directory.mkdirs()
|
||||||
|
|
||||||
val chapter = page1.chapter.chapter
|
val chapter = page1.chapter.chapter
|
||||||
|
val context = Injekt.get<Application>()
|
||||||
|
|
||||||
// Build destination file.
|
// Build destination file.
|
||||||
val filename = DiskUtil.buildValidFilename(
|
val filename = DiskUtil.buildValidFilename(
|
||||||
"${manga.title} - ${chapter.name}".take(225),
|
"${manga.title} - ${chapter.preferredChapterName(context, manga, preferences)}".take(225),
|
||||||
) + " - ${page1.number}-${page2.number}.jpg"
|
) + " - ${page1.number}-${page2.number}.jpg"
|
||||||
|
|
||||||
val destFile = File(directory, filename)
|
val destFile = File(directory, filename)
|
||||||
|
|
|
@ -14,10 +14,14 @@ import androidx.core.view.isVisible
|
||||||
import eu.kanade.tachiyomi.R
|
import eu.kanade.tachiyomi.R
|
||||||
import eu.kanade.tachiyomi.data.database.models.Manga
|
import eu.kanade.tachiyomi.data.database.models.Manga
|
||||||
import eu.kanade.tachiyomi.data.download.DownloadManager
|
import eu.kanade.tachiyomi.data.download.DownloadManager
|
||||||
|
import eu.kanade.tachiyomi.data.preference.PreferencesHelper
|
||||||
import eu.kanade.tachiyomi.databinding.ReaderTransitionViewBinding
|
import eu.kanade.tachiyomi.databinding.ReaderTransitionViewBinding
|
||||||
import eu.kanade.tachiyomi.ui.reader.model.ChapterTransition
|
import eu.kanade.tachiyomi.ui.reader.model.ChapterTransition
|
||||||
|
import eu.kanade.tachiyomi.util.chapter.ChapterUtil.Companion.preferredChapterName
|
||||||
import eu.kanade.tachiyomi.util.system.contextCompatDrawable
|
import eu.kanade.tachiyomi.util.system.contextCompatDrawable
|
||||||
import eu.kanade.tachiyomi.util.system.dpToPx
|
import eu.kanade.tachiyomi.util.system.dpToPx
|
||||||
|
import uy.kohesive.injekt.api.get
|
||||||
|
import uy.kohesive.injekt.injectLazy
|
||||||
import kotlin.math.roundToInt
|
import kotlin.math.roundToInt
|
||||||
|
|
||||||
class ReaderTransitionView @JvmOverloads constructor(context: Context, attrs: AttributeSet? = null) :
|
class ReaderTransitionView @JvmOverloads constructor(context: Context, attrs: AttributeSet? = null) :
|
||||||
|
@ -25,6 +29,7 @@ class ReaderTransitionView @JvmOverloads constructor(context: Context, attrs: At
|
||||||
|
|
||||||
private val binding: ReaderTransitionViewBinding =
|
private val binding: ReaderTransitionViewBinding =
|
||||||
ReaderTransitionViewBinding.inflate(LayoutInflater.from(context), this, true)
|
ReaderTransitionViewBinding.inflate(LayoutInflater.from(context), this, true)
|
||||||
|
private val preferences: PreferencesHelper by injectLazy()
|
||||||
|
|
||||||
init {
|
init {
|
||||||
layoutParams = LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT)
|
layoutParams = LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT)
|
||||||
|
@ -57,12 +62,13 @@ class ReaderTransitionView @JvmOverloads constructor(context: Context, attrs: At
|
||||||
val isCurrentDownloaded = downloadManager.isChapterDownloaded(transition.from.chapter, manga)
|
val isCurrentDownloaded = downloadManager.isChapterDownloaded(transition.from.chapter, manga)
|
||||||
binding.upperText.text = buildSpannedString {
|
binding.upperText.text = buildSpannedString {
|
||||||
bold { append(context.getString(R.string.previous_title)) }
|
bold { append(context.getString(R.string.previous_title)) }
|
||||||
append("\n${prevChapter.chapter.name}")
|
append("\n${prevChapter.chapter.preferredChapterName(context, manga, preferences)}")
|
||||||
if (isPrevDownloaded != isCurrentDownloaded) addDLImageSpan(isPrevDownloaded)
|
if (isPrevDownloaded != isCurrentDownloaded) addDLImageSpan(isPrevDownloaded)
|
||||||
}
|
}
|
||||||
binding.lowerText.text = buildSpannedString {
|
binding.lowerText.text = buildSpannedString {
|
||||||
bold { append(context.getString(R.string.current_chapter)) }
|
bold { append(context.getString(R.string.current_chapter)) }
|
||||||
append("\n${transition.from.chapter.name}")
|
val name = transition.from.chapter.preferredChapterName(context, manga, preferences)
|
||||||
|
append("\n$name")
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
binding.upperText.textAlignment = TEXT_ALIGNMENT_CENTER
|
binding.upperText.textAlignment = TEXT_ALIGNMENT_CENTER
|
||||||
|
@ -87,11 +93,12 @@ class ReaderTransitionView @JvmOverloads constructor(context: Context, attrs: At
|
||||||
val isNextDownloaded = downloadManager.isChapterDownloaded(nextChapter.chapter, manga)
|
val isNextDownloaded = downloadManager.isChapterDownloaded(nextChapter.chapter, manga)
|
||||||
binding.upperText.text = buildSpannedString {
|
binding.upperText.text = buildSpannedString {
|
||||||
bold { append(context.getString(R.string.finished_chapter)) }
|
bold { append(context.getString(R.string.finished_chapter)) }
|
||||||
append("\n${transition.from.chapter.name}")
|
val name = transition.from.chapter.preferredChapterName(context, manga, preferences)
|
||||||
|
append("\n$name")
|
||||||
}
|
}
|
||||||
binding.lowerText.text = buildSpannedString {
|
binding.lowerText.text = buildSpannedString {
|
||||||
bold { append(context.getString(R.string.next_title)) }
|
bold { append(context.getString(R.string.next_title)) }
|
||||||
append("\n${nextChapter.chapter.name}")
|
append("\n${nextChapter.chapter.preferredChapterName(context, manga, preferences)}")
|
||||||
if (isNextDownloaded != isCurrentDownloaded) addDLImageSpan(isNextDownloaded)
|
if (isNextDownloaded != isCurrentDownloaded) addDLImageSpan(isNextDownloaded)
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue