use formatFileSize and getDirectorySize, compatibility fixes

This commit is contained in:
semenvav 2023-11-01 18:09:41 +02:00
parent 7f777e5c1a
commit abd3d9c1ea
8 changed files with 23 additions and 64 deletions

View file

@ -13,11 +13,12 @@ import eu.kanade.tachiyomi.R
import eu.kanade.tachiyomi.data.download.DownloadManager import eu.kanade.tachiyomi.data.download.DownloadManager
import eu.kanade.tachiyomi.data.download.DownloadProvider import eu.kanade.tachiyomi.data.download.DownloadProvider
import eu.kanade.tachiyomi.util.lang.toRelativeString import eu.kanade.tachiyomi.util.lang.toRelativeString
import eu.kanade.tachiyomi.util.preference.toggle import eu.kanade.tachiyomi.util.storage.DiskUtil
import kotlinx.coroutines.flow.update import kotlinx.coroutines.flow.update
import kotlinx.coroutines.runBlocking import kotlinx.coroutines.runBlocking
import tachiyomi.core.preference.PreferenceStore import tachiyomi.core.preference.PreferenceStore
import tachiyomi.core.preference.getEnum import tachiyomi.core.preference.getEnum
import tachiyomi.core.preference.toggle
import tachiyomi.core.util.lang.launchIO import tachiyomi.core.util.lang.launchIO
import tachiyomi.core.util.lang.launchNonCancellable import tachiyomi.core.util.lang.launchNonCancellable
import tachiyomi.domain.category.interactor.GetCategories import tachiyomi.domain.category.interactor.GetCategories
@ -30,6 +31,7 @@ import tachiyomi.domain.stat.interactor.GetDownloadStatOperations
import tachiyomi.domain.stat.model.DownloadStatOperation import tachiyomi.domain.stat.model.DownloadStatOperation
import uy.kohesive.injekt.Injekt import uy.kohesive.injekt.Injekt
import uy.kohesive.injekt.api.get import uy.kohesive.injekt.api.get
import java.io.File
import java.text.SimpleDateFormat import java.text.SimpleDateFormat
import java.util.Date import java.util.Date
import java.util.Locale import java.util.Locale
@ -76,7 +78,7 @@ class DownloadStatsScreenModel(
DownloadStatManga( DownloadStatManga(
libraryManga = libraryManga, libraryManga = libraryManga,
source = source, source = source,
folderSize = downloadProvider.getFolderSize(path), folderSize = DiskUtil.getDirectorySize(File(path)),
downloadChaptersCount = downloadChaptersCount, downloadChaptersCount = downloadChaptersCount,
category = categories[libraryManga.category]!!, category = categories[libraryManga.category]!!,
) )
@ -399,7 +401,7 @@ class DownloadStatsScreenModel(
coordinate = weight, coordinate = weight,
subLine = Date(i.date).toRelativeString( subLine = Date(i.date).toRelativeString(
context = context, context = context,
range = 0, relative = false,
), ),
dialog = Dialog.DownloadStatOperationInfo(i), dialog = Dialog.DownloadStatOperationInfo(i),
), ),
@ -412,7 +414,7 @@ class DownloadStatsScreenModel(
weight += i.size weight += i.size
val key = Date(i.date).toRelativeString( val key = Date(i.date).toRelativeString(
context = context, context = context,
range = 0, relative = false,
) )
if (dateMap.containsKey(key)) { if (dateMap.containsKey(key)) {
dateMap[key]?.add(i) dateMap[key]?.add(i)

View file

@ -5,6 +5,7 @@ import androidx.compose.foundation.layout.Row
import androidx.compose.foundation.layout.fillMaxHeight import androidx.compose.foundation.layout.fillMaxHeight
import androidx.compose.foundation.layout.height import androidx.compose.foundation.layout.height
import androidx.compose.foundation.layout.padding import androidx.compose.foundation.layout.padding
import androidx.compose.foundation.lazy.LazyColumn
import androidx.compose.foundation.lazy.items import androidx.compose.foundation.lazy.items
import androidx.compose.foundation.rememberScrollState import androidx.compose.foundation.rememberScrollState
import androidx.compose.foundation.verticalScroll import androidx.compose.foundation.verticalScroll
@ -31,7 +32,6 @@ import eu.kanade.tachiyomi.R
import tachiyomi.domain.manga.model.Manga import tachiyomi.domain.manga.model.Manga
import tachiyomi.domain.stat.model.DownloadStatOperation import tachiyomi.domain.stat.model.DownloadStatOperation
import tachiyomi.presentation.core.components.CheckboxItem import tachiyomi.presentation.core.components.CheckboxItem
import tachiyomi.presentation.core.components.LazyColumn
import tachiyomi.presentation.core.components.RadioItem import tachiyomi.presentation.core.components.RadioItem
import tachiyomi.presentation.core.components.SortItem import tachiyomi.presentation.core.components.SortItem
import tachiyomi.presentation.core.components.material.TextButton import tachiyomi.presentation.core.components.material.TextButton
@ -181,7 +181,7 @@ private fun MangaInfoColumn(
stringResource(R.string.download_stat_operation_downloaded), stringResource(R.string.download_stat_operation_downloaded),
downloadItems.sumOf { it.units }, downloadItems.sumOf { it.units },
folderSizeText( folderSizeText(
folderSizeBytes = downloadItems.sumOf { it.size }, folderSize = downloadItems.sumOf { it.size },
), ),
), ),
maxLines = 2, maxLines = 2,
@ -201,7 +201,7 @@ private fun MangaInfoColumn(
stringResource(R.string.download_stat_operation_deleted), stringResource(R.string.download_stat_operation_deleted),
deleteItems.sumOf { it.units }, deleteItems.sumOf { it.units },
folderSizeText( folderSizeText(
folderSizeBytes = abs(deleteItems.sumOf { it.size }), folderSize = abs(deleteItems.sumOf { it.size }),
), ),
), ),
maxLines = 2, maxLines = 2,

View file

@ -1,5 +1,6 @@
package eu.kanade.presentation.more.download.components package eu.kanade.presentation.more.download.components
import android.text.format.Formatter
import androidx.compose.foundation.combinedClickable import androidx.compose.foundation.combinedClickable
import androidx.compose.foundation.layout.Arrangement import androidx.compose.foundation.layout.Arrangement
import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.Column
@ -34,6 +35,7 @@ import androidx.compose.runtime.setValue
import androidx.compose.ui.Alignment import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier import androidx.compose.ui.Modifier
import androidx.compose.ui.hapticfeedback.HapticFeedbackType import androidx.compose.ui.hapticfeedback.HapticFeedbackType
import androidx.compose.ui.platform.LocalContext
import androidx.compose.ui.platform.LocalHapticFeedback import androidx.compose.ui.platform.LocalHapticFeedback
import androidx.compose.ui.res.stringResource import androidx.compose.ui.res.stringResource
import androidx.compose.ui.text.TextStyle import androidx.compose.ui.text.TextStyle
@ -59,8 +61,6 @@ import tachiyomi.presentation.core.components.material.TextButton
import tachiyomi.presentation.core.components.material.padding import tachiyomi.presentation.core.components.material.padding
import tachiyomi.presentation.core.util.selectedBackground import tachiyomi.presentation.core.util.selectedBackground
import kotlin.math.abs import kotlin.math.abs
import kotlin.math.ln
import kotlin.math.pow
@Composable @Composable
fun CategoryList( fun CategoryList(
@ -413,12 +413,9 @@ fun DownloadedIndicator(
} }
@Composable @Composable
fun folderSizeText(folderSizeBytes: Long): String { fun folderSizeText(folderSize: Long): String {
val units = arrayOf(R.string.memory_unit_b, R.string.memory_unit_kb, R.string.memory_unit_mb, R.string.memory_unit_gb) val context = LocalContext.current
val base = 1024.0 return Formatter.formatFileSize(context, folderSize)
val exponent = (ln(folderSizeBytes.toDouble()) / ln(base)).toInt()
val size = folderSizeBytes / base.pow(exponent.toDouble())
return if (exponent > 0) { String.format("%.2f %s", size, stringResource(units[exponent])) } else "0"
} }
@Composable @Composable

View file

@ -1,6 +1,7 @@
package eu.kanade.presentation.more.download.tabs package eu.kanade.presentation.more.download.tabs
import androidx.compose.foundation.layout.Arrangement import androidx.compose.foundation.layout.Arrangement
import androidx.compose.foundation.lazy.LazyColumn
import androidx.compose.foundation.lazy.rememberLazyListState import androidx.compose.foundation.lazy.rememberLazyListState
import androidx.compose.material3.MaterialTheme import androidx.compose.material3.MaterialTheme
import androidx.compose.runtime.Composable import androidx.compose.runtime.Composable
@ -16,7 +17,6 @@ import eu.kanade.presentation.more.download.components.DownloadStatsRow
import eu.kanade.presentation.more.download.components.graphic.PieChartWithLegend import eu.kanade.presentation.more.download.components.graphic.PieChartWithLegend
import eu.kanade.presentation.more.download.components.graphic.PointGraph import eu.kanade.presentation.more.download.components.graphic.PointGraph
import eu.kanade.tachiyomi.R import eu.kanade.tachiyomi.R
import tachiyomi.presentation.core.components.LazyColumn
import tachiyomi.presentation.core.components.material.padding import tachiyomi.presentation.core.components.material.padding
@Composable @Composable
@ -27,10 +27,10 @@ fun overAllStatsTab(
return TabContent( return TabContent(
titleRes = R.string.label_download_stats_overall_tab, titleRes = R.string.label_download_stats_overall_tab,
searchEnabled = false, searchEnabled = false,
content = { PaddingValues, _ -> content = { paddingValues, _ ->
LazyColumn( LazyColumn(
state = rememberLazyListState(), state = rememberLazyListState(),
contentPadding = PaddingValues, contentPadding = paddingValues,
verticalArrangement = Arrangement.spacedBy(MaterialTheme.padding.small), verticalArrangement = Arrangement.spacedBy(MaterialTheme.padding.small),
) { ) {
item { item {
@ -56,7 +56,7 @@ fun overAllStatsTab(
defaultCategoryName = defaultCategoryName, defaultCategoryName = defaultCategoryName,
) )
}, },
contentPadding = PaddingValues, contentPadding = paddingValues,
) )
} }
item { item {

View file

@ -5,6 +5,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.source.Source import eu.kanade.tachiyomi.source.Source
import eu.kanade.tachiyomi.source.model.Page import eu.kanade.tachiyomi.source.model.Page
import eu.kanade.tachiyomi.util.storage.DiskUtil
import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.flow.Flow
import kotlinx.coroutines.flow.asFlow import kotlinx.coroutines.flow.asFlow
import kotlinx.coroutines.flow.drop import kotlinx.coroutines.flow.drop
@ -26,6 +27,7 @@ import tachiyomi.domain.stat.interactor.AddDownloadStatOperation
import tachiyomi.domain.stat.model.DownloadStatOperation import tachiyomi.domain.stat.model.DownloadStatOperation
import uy.kohesive.injekt.Injekt import uy.kohesive.injekt.Injekt
import uy.kohesive.injekt.api.get import uy.kohesive.injekt.api.get
import java.io.File
/** /**
* This class is used to manage chapter downloads in the application. It must be instantiated once * This class is used to manage chapter downloads in the application. It must be instantiated once
@ -229,7 +231,7 @@ class DownloadManager(
addDownloadStatOperation.await( addDownloadStatOperation.await(
DownloadStatOperation.create().copy( DownloadStatOperation.create().copy(
mangaId = manga.id, mangaId = manga.id,
size = chapterDirs.sumOf { provider.getFolderSize(it.filePath!!) } * -1, size = chapterDirs.sumOf { DiskUtil.getDirectorySize(File( it.filePath!!)) } * -1,
units = filteredChapters.size.toLong(), units = filteredChapters.size.toLong(),
), ),
@ -257,7 +259,7 @@ class DownloadManager(
downloader.removeFromQueue(manga) downloader.removeFromQueue(manga)
} }
val mangaDir = provider.findMangaDir(manga.title, source) val mangaDir = provider.findMangaDir(manga.title, source)
val dirSize = provider.getFolderSize(mangaDir?.filePath!!) val dirSize = DiskUtil.getDirectorySize(File( mangaDir?.filePath!!))
if (dirSize > 0) { if (dirSize > 0) {
addDownloadStatOperation.await( addDownloadStatOperation.await(
DownloadStatOperation.create().copy( DownloadStatOperation.create().copy(

View file

@ -16,7 +16,6 @@ import tachiyomi.domain.download.service.DownloadPreferences
import tachiyomi.domain.manga.model.Manga import tachiyomi.domain.manga.model.Manga
import uy.kohesive.injekt.Injekt import uy.kohesive.injekt.Injekt
import uy.kohesive.injekt.api.get import uy.kohesive.injekt.api.get
import java.io.File
/** /**
* This class is used to provide the directories where the downloads should be saved. * This class is used to provide the directories where the downloads should be saved.
@ -189,38 +188,4 @@ class DownloadProvider(
} }
} }
} }
fun getFolderSize(path: String): Long {
val file = File(path)
var size: Long = 0
if (file.exists()) {
if (file.isDirectory) {
val files = file.listFiles()
if (files != null) {
for (childFile in files) {
size += if (childFile.isDirectory) {
getFolderSize(childFile.path)
} else {
getFileSize(childFile)
}
}
}
} else {
size = getFileSize(file)
}
}
return size
}
private fun getFileSize(file: File): Long {
return if (file.isDirectory) {
getFolderSize(file.path)
} else if (file.isFile) {
file.length()
} else {
0
}
}
} }

View file

@ -407,7 +407,7 @@ class Downloader(
addDownloadStatOperation.await( addDownloadStatOperation.await(
DownloadStatOperation.create().copy( DownloadStatOperation.create().copy(
mangaId = download.manga.id, mangaId = download.manga.id,
size = provider.getFolderSize(provider.findChapterDir(download.chapter.name, download.chapter.scanlator, download.manga.title, download.source)?.filePath!!), size = DiskUtil.getDirectorySize(File(provider.findChapterDir(download.chapter.name, download.chapter.scanlator, download.manga.title, download.source)?.filePath!!)),
), ),
) )

View file

@ -183,13 +183,6 @@
<string name="disable_stat_graph_grouping">Disable group mode</string> <string name="disable_stat_graph_grouping">Disable group mode</string>
<string name="start_operation_massage">Start of recording, no information previously available</string> <string name="start_operation_massage">Start of recording, no information previously available</string>
<!-- Memory units -->
<string name="memory_unit_b">B</string>
<string name="memory_unit_kb">KB</string>
<string name="memory_unit_mb">MB</string>
<string name="memory_unit_gb">GB</string>
<!-- Operations --> <!-- Operations -->
<string name="loading">Loading…</string> <string name="loading">Loading…</string>
<string name="internal_error">InternalError: Check crash logs for further information</string> <string name="internal_error">InternalError: Check crash logs for further information</string>