use formatFileSize and getDirectorySize, compatibility fixes
This commit is contained in:
parent
7f777e5c1a
commit
abd3d9c1ea
8 changed files with 23 additions and 64 deletions
|
@ -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)
|
||||||
|
|
|
@ -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,
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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 {
|
||||||
|
|
|
@ -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(
|
||||||
|
|
|
@ -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
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -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!!)),
|
||||||
),
|
),
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
|
@ -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>
|
||||||
|
|
Reference in a new issue