diff --git a/app/build.gradle.kts b/app/build.gradle.kts index 0552b1340..b8af233c4 100644 --- a/app/build.gradle.kts +++ b/app/build.gradle.kts @@ -184,13 +184,9 @@ dependencies { implementation(libs.bitfire.vcard4android) // third-party libs - implementation(libs.commons.collections) - @Suppress("RedundantSuppression") - implementation(libs.commons.io) - implementation(libs.commons.lang) - implementation(libs.commons.text) @Suppress("RedundantSuppression") implementation(libs.dnsjava) + implementation(libs.guava) implementation(libs.mikepenz.aboutLibraries) implementation(libs.nsk90.kstatemachine) implementation(libs.okhttp.base) diff --git a/app/src/androidTest/kotlin/at/bitfire/davdroid/servicedetection/CollectionListRefresherTest.kt b/app/src/androidTest/kotlin/at/bitfire/davdroid/servicedetection/CollectionListRefresherTest.kt index 13e3ecc05..e144109d2 100644 --- a/app/src/androidTest/kotlin/at/bitfire/davdroid/servicedetection/CollectionListRefresherTest.kt +++ b/app/src/androidTest/kotlin/at/bitfire/davdroid/servicedetection/CollectionListRefresherTest.kt @@ -24,7 +24,6 @@ import okhttp3.mockwebserver.Dispatcher import okhttp3.mockwebserver.MockResponse import okhttp3.mockwebserver.MockWebServer import okhttp3.mockwebserver.RecordedRequest -import org.apache.commons.lang3.StringUtils import org.junit.After import org.junit.Assert.assertEquals import org.junit.Assert.assertFalse @@ -625,7 +624,7 @@ class CollectionListRefresherTest { class TestDispatcher: Dispatcher() { override fun dispatch(request: RecordedRequest): MockResponse { - val path = StringUtils.removeEnd(request.path!!, "/") + val path = request.path!!.trimEnd('/') if (request.method.equals("PROPFIND", true)) { val properties = when (path) { diff --git a/app/src/main/kotlin/at/bitfire/davdroid/sync/CalendarSyncManager.kt b/app/src/main/kotlin/at/bitfire/davdroid/sync/CalendarSyncManager.kt index 044308277..a15bff007 100644 --- a/app/src/main/kotlin/at/bitfire/davdroid/sync/CalendarSyncManager.kt +++ b/app/src/main/kotlin/at/bitfire/davdroid/sync/CalendarSyncManager.kt @@ -7,6 +7,7 @@ package at.bitfire.davdroid.sync import android.accounts.Account import android.content.Context import android.content.SyncResult +import android.text.format.Formatter import at.bitfire.dav4jvm.DavCalendar import at.bitfire.dav4jvm.MultiResponseCallback import at.bitfire.dav4jvm.Response @@ -42,7 +43,6 @@ import okhttp3.HttpUrl import okhttp3.HttpUrl.Companion.toHttpUrlOrNull import okhttp3.RequestBody import okhttp3.RequestBody.Companion.toRequestBody -import org.apache.commons.io.FileUtils import java.io.ByteArrayOutputStream import java.io.Reader import java.io.StringReader @@ -97,7 +97,7 @@ class CalendarSyncManager @AssistedInject constructor( it.propfind(0, MaxResourceSize.NAME, SupportedReportSet.NAME, GetCTag.NAME, SyncToken.NAME) { response, relation -> if (relation == Response.HrefRelation.SELF) { response[MaxResourceSize::class.java]?.maxSize?.let { maxSize -> - Logger.log.info("Calendar accepts events up to ${FileUtils.byteCountToDisplaySize(maxSize)}") + Logger.log.info("Calendar accepts events up to ${Formatter.formatFileSize(context, maxSize)}") } response[SupportedReportSet::class.java]?.let { supported -> diff --git a/app/src/main/kotlin/at/bitfire/davdroid/sync/ContactsSyncManager.kt b/app/src/main/kotlin/at/bitfire/davdroid/sync/ContactsSyncManager.kt index aa0adc53d..e307a7c9e 100644 --- a/app/src/main/kotlin/at/bitfire/davdroid/sync/ContactsSyncManager.kt +++ b/app/src/main/kotlin/at/bitfire/davdroid/sync/ContactsSyncManager.kt @@ -10,6 +10,7 @@ import android.content.ContentResolver import android.content.Context import android.content.SyncResult import android.os.Build +import android.text.format.Formatter import at.bitfire.dav4jvm.DavAddressBook import at.bitfire.dav4jvm.MultiResponseCallback import at.bitfire.dav4jvm.Response @@ -53,7 +54,6 @@ import okhttp3.MediaType import okhttp3.Request import okhttp3.RequestBody import okhttp3.RequestBody.Companion.toRequestBody -import org.apache.commons.io.FileUtils import java.io.ByteArrayOutputStream import java.io.IOException import java.io.Reader @@ -168,7 +168,7 @@ class ContactsSyncManager @AssistedInject constructor( it.propfind(0, MaxResourceSize.NAME, SupportedAddressData.NAME, SupportedReportSet.NAME, GetCTag.NAME, SyncToken.NAME) { response, relation -> if (relation == Response.HrefRelation.SELF) { response[MaxResourceSize::class.java]?.maxSize?.let { maxSize -> - Logger.log.info("Address book accepts vCards up to ${FileUtils.byteCountToDisplaySize(maxSize)}") + Logger.log.info("Address book accepts vCards up to ${Formatter.formatFileSize(context, maxSize)}") } response[SupportedAddressData::class.java]?.let { supported -> diff --git a/app/src/main/kotlin/at/bitfire/davdroid/sync/JtxSyncManager.kt b/app/src/main/kotlin/at/bitfire/davdroid/sync/JtxSyncManager.kt index 8330cacbf..336c646ab 100644 --- a/app/src/main/kotlin/at/bitfire/davdroid/sync/JtxSyncManager.kt +++ b/app/src/main/kotlin/at/bitfire/davdroid/sync/JtxSyncManager.kt @@ -7,6 +7,7 @@ package at.bitfire.davdroid.sync import android.accounts.Account import android.content.Context import android.content.SyncResult +import android.text.format.Formatter import at.bitfire.dav4jvm.DavCalendar import at.bitfire.dav4jvm.MultiResponseCallback import at.bitfire.dav4jvm.Response @@ -36,7 +37,6 @@ import okhttp3.HttpUrl import okhttp3.HttpUrl.Companion.toHttpUrlOrNull import okhttp3.RequestBody import okhttp3.RequestBody.Companion.toRequestBody -import org.apache.commons.io.FileUtils import java.io.ByteArrayOutputStream import java.io.Reader import java.io.StringReader @@ -81,7 +81,7 @@ class JtxSyncManager @AssistedInject constructor( it.propfind(0, GetCTag.NAME, MaxResourceSize.NAME, SyncToken.NAME) { response, relation -> if (relation == Response.HrefRelation.SELF) { response[MaxResourceSize::class.java]?.maxSize?.let { maxSize -> - Logger.log.info("Collection accepts resources up to ${FileUtils.byteCountToDisplaySize(maxSize)}") + Logger.log.info("Collection accepts resources up to ${Formatter.formatFileSize(context, maxSize)}") } syncState = syncState(response) diff --git a/app/src/main/kotlin/at/bitfire/davdroid/sync/TasksSyncManager.kt b/app/src/main/kotlin/at/bitfire/davdroid/sync/TasksSyncManager.kt index e5ed0069a..86fd2c001 100644 --- a/app/src/main/kotlin/at/bitfire/davdroid/sync/TasksSyncManager.kt +++ b/app/src/main/kotlin/at/bitfire/davdroid/sync/TasksSyncManager.kt @@ -7,6 +7,7 @@ package at.bitfire.davdroid.sync import android.accounts.Account import android.content.Context import android.content.SyncResult +import android.text.format.Formatter import at.bitfire.dav4jvm.DavCalendar import at.bitfire.dav4jvm.MultiResponseCallback import at.bitfire.dav4jvm.Response @@ -36,7 +37,6 @@ import okhttp3.HttpUrl import okhttp3.HttpUrl.Companion.toHttpUrlOrNull import okhttp3.RequestBody import okhttp3.RequestBody.Companion.toRequestBody -import org.apache.commons.io.FileUtils import java.io.ByteArrayOutputStream import java.io.Reader import java.io.StringReader @@ -84,7 +84,7 @@ class TasksSyncManager @AssistedInject constructor( it.propfind(0, MaxResourceSize.NAME, GetCTag.NAME, SyncToken.NAME) { response, relation -> if (relation == Response.HrefRelation.SELF) { response[MaxResourceSize::class.java]?.maxSize?.let { maxSize -> - Logger.log.info("Calendar accepts tasks up to ${FileUtils.byteCountToDisplaySize(maxSize)}") + Logger.log.info("Calendar accepts tasks up to ${Formatter.formatFileSize(context, maxSize)}") } syncState = syncState(response) diff --git a/app/src/main/kotlin/at/bitfire/davdroid/ui/AboutActivity.kt b/app/src/main/kotlin/at/bitfire/davdroid/ui/AboutActivity.kt index 11682b149..394c267de 100644 --- a/app/src/main/kotlin/at/bitfire/davdroid/ui/AboutActivity.kt +++ b/app/src/main/kotlin/at/bitfire/davdroid/ui/AboutActivity.kt @@ -65,7 +65,6 @@ import dagger.hilt.android.AndroidEntryPoint import dagger.hilt.android.components.ActivityComponent import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.launch -import org.apache.commons.io.IOUtils import org.json.JSONObject import java.text.Collator import java.time.LocalDateTime @@ -207,7 +206,7 @@ class AboutActivity: AppCompatActivity() { val context = getApplication() try { context.resources.assets.open("translators.json").use { stream -> - val jsonTranslations = JSONObject(IOUtils.toString(stream, Charsets.UTF_8)) + val jsonTranslations = JSONObject(stream.readBytes().decodeToString()) val result = LinkedList() for (langCode in jsonTranslations.keys()) { val jsonTranslators = jsonTranslations.getJSONArray(langCode) diff --git a/app/src/main/kotlin/at/bitfire/davdroid/ui/DebugInfoActivity.kt b/app/src/main/kotlin/at/bitfire/davdroid/ui/DebugInfoActivity.kt index 5abf946a1..f596187be 100644 --- a/app/src/main/kotlin/at/bitfire/davdroid/ui/DebugInfoActivity.kt +++ b/app/src/main/kotlin/at/bitfire/davdroid/ui/DebugInfoActivity.kt @@ -16,7 +16,6 @@ import at.bitfire.davdroid.BuildConfig import at.bitfire.davdroid.R import dagger.hilt.android.AndroidEntryPoint import okhttp3.HttpUrl -import org.apache.commons.io.FileUtils import org.apache.commons.lang3.StringUtils import java.io.File @@ -129,7 +128,7 @@ class DebugInfoActivity : AppCompatActivity() { class IntentBuilder(context: Context) { companion object { - const val MAX_ELEMENT_SIZE = 800 * FileUtils.ONE_KB.toInt() + const val MAX_ELEMENT_SIZE = 800 * 1024 // 800 kB } val intent = Intent(context, DebugInfoActivity::class.java) diff --git a/app/src/main/kotlin/at/bitfire/davdroid/ui/DebugInfoModel.kt b/app/src/main/kotlin/at/bitfire/davdroid/ui/DebugInfoModel.kt index 16be0f709..5a58f26d3 100644 --- a/app/src/main/kotlin/at/bitfire/davdroid/ui/DebugInfoModel.kt +++ b/app/src/main/kotlin/at/bitfire/davdroid/ui/DebugInfoModel.kt @@ -24,6 +24,7 @@ import android.os.StatFs import android.provider.CalendarContract import android.provider.ContactsContract import android.text.format.DateUtils +import android.text.format.Formatter import androidx.compose.runtime.getValue import androidx.compose.runtime.mutableStateOf import androidx.compose.runtime.setValue @@ -48,20 +49,18 @@ import at.bitfire.davdroid.settings.SettingsManager import at.bitfire.davdroid.sync.worker.BaseSyncWorker import at.bitfire.ical4android.TaskProvider import at.techbee.jtx.JtxContract +import com.google.common.io.ByteStreams +import com.google.common.io.Files import dagger.assisted.Assisted import dagger.assisted.AssistedFactory import dagger.assisted.AssistedInject import dagger.hilt.android.lifecycle.HiltViewModel import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.launch -import org.apache.commons.io.ByteOrderMark -import org.apache.commons.io.FileUtils -import org.apache.commons.io.IOUtils import org.apache.commons.lang3.exception.ExceptionUtils import org.dmfs.tasks.contract.TaskContract import java.io.File import java.io.IOException -import java.io.StringReader import java.io.Writer import java.util.TimeZone import java.util.logging.Level @@ -129,8 +128,8 @@ class DebugInfoModel @AssistedInject constructor( if (details.logs != null) { val file = File(debugDir, FILE_LOGS) if (!file.exists() || file.canWrite()) { - file.writer().buffered().use { writer -> - IOUtils.copy(StringReader(details.logs), writer) + file.printWriter().use { writer -> + writer.write(details.logs) } uiState = uiState.copy(logFile = file) } else @@ -164,7 +163,6 @@ class DebugInfoModel @AssistedInject constructor( private fun generateDebugInfo(syncAccount: Account?, syncAuthority: String?, cause: Throwable?, localResource: String?, remoteResource: String?) { val debugInfoFile = File(Logger.debugDir(), FILE_DEBUG_INFO) debugInfoFile.writer().buffered().use { writer -> - writer.append(ByteOrderMark.UTF_BOM) writer.append("--- BEGIN DEBUG INFO ---\n\n") // begin with most specific information @@ -262,9 +260,9 @@ class DebugInfoModel @AssistedInject constructor( val filesPath = Environment.getDataDirectory() val statFs = StatFs(filesPath.path) writer.append("Internal memory ($filesPath): ") - .append(FileUtils.byteCountToDisplaySize(statFs.availableBytes)) + .append(Formatter.formatFileSize(context, statFs.availableBytes)) .append(" free of ") - .append(FileUtils.byteCountToDisplaySize(statFs.totalBytes)) + .append(Formatter.formatFileSize(context, statFs.totalBytes)) .append("\n\n") // power saving @@ -431,9 +429,7 @@ class DebugInfoModel @AssistedInject constructor( zip.setLevel(9) uiState.debugInfo?.let { debugInfo -> zip.putNextEntry(ZipEntry("debug-info.txt")) - debugInfo.inputStream().use { - IOUtils.copy(it, zip) - } + Files.copy(debugInfo, zip) zip.closeEntry() } @@ -441,16 +437,14 @@ class DebugInfoModel @AssistedInject constructor( if (logs != null) { // verbose logs available zip.putNextEntry(ZipEntry(logs.name)) - logs.inputStream().use { - IOUtils.copy(it, zip) - } + Files.copy(logs, zip) zip.closeEntry() } else { // logcat (short logs) try { Runtime.getRuntime().exec("logcat -d").also { logcat -> zip.putNextEntry(ZipEntry("logcat.txt")) - IOUtils.copy(logcat.inputStream, zip) + ByteStreams.copy(logcat.inputStream, zip) } } catch (e: Exception) { Logger.log.log(Level.SEVERE, "Couldn't attach logcat", e) diff --git a/app/src/main/kotlin/at/bitfire/davdroid/ui/intro/BatteryOptimizationsPageContent.kt b/app/src/main/kotlin/at/bitfire/davdroid/ui/intro/BatteryOptimizationsPageContent.kt index fdaf8b1da..7bacc2f6c 100644 --- a/app/src/main/kotlin/at/bitfire/davdroid/ui/intro/BatteryOptimizationsPageContent.kt +++ b/app/src/main/kotlin/at/bitfire/davdroid/ui/intro/BatteryOptimizationsPageContent.kt @@ -35,7 +35,6 @@ import at.bitfire.davdroid.Constants import at.bitfire.davdroid.Constants.withStatParams import at.bitfire.davdroid.R import at.bitfire.davdroid.ui.AppTheme -import org.apache.commons.text.WordUtils import java.util.Locale @Composable @@ -154,7 +153,7 @@ fun BatteryOptimizationsPageContent( Text( text = stringResource( R.string.intro_autostart_title, - WordUtils.capitalize(Build.MANUFACTURER) + Build.MANUFACTURER.replaceFirstChar { if (it.isLowerCase()) it.titlecase() else it.toString() } ), style = MaterialTheme.typography.labelLarge, modifier = Modifier.fillMaxWidth() diff --git a/app/src/main/kotlin/at/bitfire/davdroid/ui/webdav/WebdavMountsScreen.kt b/app/src/main/kotlin/at/bitfire/davdroid/ui/webdav/WebdavMountsScreen.kt index 8bd083868..9c1134e87 100644 --- a/app/src/main/kotlin/at/bitfire/davdroid/ui/webdav/WebdavMountsScreen.kt +++ b/app/src/main/kotlin/at/bitfire/davdroid/ui/webdav/WebdavMountsScreen.kt @@ -7,7 +7,9 @@ package at.bitfire.davdroid.ui.webdav import android.content.Intent import android.net.Uri import android.os.Build +import android.os.FileUtils import android.provider.DocumentsContract +import android.text.format.Formatter import androidx.activity.compose.rememberLauncherForActivityResult import androidx.activity.result.contract.ActivityResultContracts import androidx.compose.foundation.layout.Arrangement @@ -71,7 +73,6 @@ import at.bitfire.davdroid.ui.composable.ProgressBar import at.bitfire.davdroid.ui.widget.ClickableTextWithLink import at.bitfire.davdroid.util.DavUtils import okhttp3.HttpUrl -import org.apache.commons.io.FileUtils @Composable fun WebdavMountsScreen( @@ -295,11 +296,12 @@ fun WebdavMountsItem( .fillMaxWidth() .padding(vertical = 8.dp), ) + val context = LocalContext.current Text( text = stringResource( R.string.webdav_mounts_quota_used_available, - FileUtils.byteCountToDisplaySize(quotaUsed), - FileUtils.byteCountToDisplaySize(quotaAvailable) + Formatter.formatFileSize(context, quotaUsed), + Formatter.formatFileSize(context, quotaAvailable) ), modifier = Modifier.fillMaxWidth() ) diff --git a/app/src/main/kotlin/at/bitfire/davdroid/webdav/RandomAccessCallback.kt b/app/src/main/kotlin/at/bitfire/davdroid/webdav/RandomAccessCallback.kt index 1806de46e..01a93dc82 100644 --- a/app/src/main/kotlin/at/bitfire/davdroid/webdav/RandomAccessCallback.kt +++ b/app/src/main/kotlin/at/bitfire/davdroid/webdav/RandomAccessCallback.kt @@ -12,6 +12,7 @@ import android.os.HandlerThread import android.os.ProxyFileDescriptorCallback import android.system.ErrnoException import android.system.OsConstants +import android.text.format.Formatter import androidx.core.app.NotificationCompat import androidx.core.app.NotificationManagerCompat import at.bitfire.dav4jvm.DavResource @@ -35,7 +36,6 @@ import kotlinx.coroutines.runInterruptible import okhttp3.Headers import okhttp3.HttpUrl import okhttp3.MediaType -import org.apache.commons.io.FileUtils import ru.nsk.kstatemachine.event.Event import ru.nsk.kstatemachine.state.State import ru.nsk.kstatemachine.state.finalState @@ -76,7 +76,7 @@ class RandomAccessCallback private constructor( .setCategory(NotificationCompat.CATEGORY_STATUS) .setContentTitle(context.getString(R.string.webdav_notification_access)) .setContentText(dav.fileName()) - .setSubText(FileUtils.byteCountToDisplaySize(fileSize)) + .setSubText(Formatter.formatFileSize(context, fileSize)) .setSmallIcon(R.drawable.ic_storage_notify) .setOngoing(true) private val notificationTag = url.toString() diff --git a/app/src/main/kotlin/at/bitfire/davdroid/webdav/StreamingFileDescriptor.kt b/app/src/main/kotlin/at/bitfire/davdroid/webdav/StreamingFileDescriptor.kt index c80f8cab6..66db60e18 100644 --- a/app/src/main/kotlin/at/bitfire/davdroid/webdav/StreamingFileDescriptor.kt +++ b/app/src/main/kotlin/at/bitfire/davdroid/webdav/StreamingFileDescriptor.kt @@ -7,6 +7,7 @@ package at.bitfire.davdroid.webdav import android.content.Context import android.os.CancellationSignal import android.os.ParcelFileDescriptor +import android.text.format.Formatter import androidx.annotation.WorkerThread import androidx.core.app.NotificationCompat import androidx.core.app.NotificationManagerCompat @@ -27,7 +28,6 @@ import okhttp3.MediaType import okhttp3.RequestBody import okhttp3.internal.headersContentLength import okio.BufferedSink -import org.apache.commons.io.FileUtils import java.io.IOException import java.util.logging.Level @@ -45,7 +45,7 @@ class StreamingFileDescriptor( companion object { /** 1 MB transfer buffer */ - private const val BUFFER_SIZE = FileUtils.ONE_MB.toInt() + private const val BUFFER_SIZE = 1024*1024 } val dav = DavResource(client.okHttpClient, url) @@ -123,7 +123,7 @@ class StreamingFileDescriptor( ) else // known file size - notification.setSubText(FileUtils.byteCountToDisplaySize(length)) + notification.setSubText(Formatter.formatFileSize(context, length)) ParcelFileDescriptor.AutoCloseOutputStream(writeFd).use { output -> val buffer = ByteArray(BUFFER_SIZE) diff --git a/app/src/main/kotlin/at/bitfire/davdroid/webdav/cache/DiskCache.kt b/app/src/main/kotlin/at/bitfire/davdroid/webdav/cache/DiskCache.kt index 050f735b3..5bf6509c2 100644 --- a/app/src/main/kotlin/at/bitfire/davdroid/webdav/cache/DiskCache.kt +++ b/app/src/main/kotlin/at/bitfire/davdroid/webdav/cache/DiskCache.kt @@ -5,7 +5,6 @@ package at.bitfire.davdroid.webdav.cache import at.bitfire.davdroid.log.Logger -import org.apache.commons.io.FileUtils import java.io.File /** @@ -71,7 +70,9 @@ class DiskCache( @Synchronized fun clear() { - FileUtils.cleanDirectory(cacheDir) + cacheDir.listFiles()?.forEach { entry -> + entry.delete() + } } @Synchronized diff --git a/app/src/main/kotlin/at/bitfire/davdroid/webdav/cache/PageCacheBuilder.kt b/app/src/main/kotlin/at/bitfire/davdroid/webdav/cache/PageCacheBuilder.kt index 9fc35e30f..58c6df316 100644 --- a/app/src/main/kotlin/at/bitfire/davdroid/webdav/cache/PageCacheBuilder.kt +++ b/app/src/main/kotlin/at/bitfire/davdroid/webdav/cache/PageCacheBuilder.kt @@ -5,7 +5,6 @@ package at.bitfire.davdroid.webdav.cache import okhttp3.HttpUrl -import org.apache.commons.io.FileUtils import java.lang.ref.WeakReference /** @@ -17,7 +16,7 @@ typealias PageCache = ExtendedLruCache? = null diff --git a/app/src/main/kotlin/at/bitfire/davdroid/webdav/cache/ThumbnailCache.kt b/app/src/main/kotlin/at/bitfire/davdroid/webdav/cache/ThumbnailCache.kt index e03b66c95..e44528829 100644 --- a/app/src/main/kotlin/at/bitfire/davdroid/webdav/cache/ThumbnailCache.kt +++ b/app/src/main/kotlin/at/bitfire/davdroid/webdav/cache/ThumbnailCache.kt @@ -8,12 +8,12 @@ import android.app.Application import android.graphics.Point import android.os.Build import android.os.storage.StorageManager +import android.text.format.Formatter import androidx.core.content.getSystemService import at.bitfire.davdroid.db.WebDavDocument import at.bitfire.davdroid.log.Logger import at.bitfire.davdroid.webdav.WebdavScoped import org.apache.commons.codec.digest.DigestUtils -import org.apache.commons.io.FileUtils import java.io.File import javax.inject.Inject @@ -31,8 +31,8 @@ class ThumbnailCache @Inject constructor(context: Application) { val maxBytes = if (Build.VERSION.SDK_INT >= 26) storageManager.getCacheQuotaBytes(storageManager.getUuidForPath(cacheDir)) / 2 else - 50*FileUtils.ONE_MB - Logger.log.info("Initializing WebDAV thumbnail cache with ${FileUtils.byteCountToDisplaySize(maxBytes)}") + 50 * 1024*1024 // 50 MB + Logger.log.info("Initializing WebDAV thumbnail cache with ${Formatter.formatFileSize(context, maxBytes)}") storage = DiskCache(cacheDir, maxBytes) } diff --git a/app/src/ose/kotlin/at/bitfire/davdroid/ui/OpenSourceLicenseInfoProvider.kt b/app/src/ose/kotlin/at/bitfire/davdroid/ui/OpenSourceLicenseInfoProvider.kt index 5a31a2acb..b9bdca4e9 100644 --- a/app/src/ose/kotlin/at/bitfire/davdroid/ui/OpenSourceLicenseInfoProvider.kt +++ b/app/src/ose/kotlin/at/bitfire/davdroid/ui/OpenSourceLicenseInfoProvider.kt @@ -18,10 +18,10 @@ import androidx.lifecycle.viewModelScope import androidx.lifecycle.viewmodel.compose.viewModel import at.bitfire.davdroid.ui.UiUtils.toAnnotatedString import at.bitfire.davdroid.ui.widget.ClickableTextWithLink +import com.google.common.io.CharStreams import dagger.hilt.android.lifecycle.HiltViewModel import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.launch -import org.apache.commons.io.IOUtils import javax.inject.Inject class OpenSourceLicenseInfoProvider @Inject constructor(): AboutActivity.AppLicenseInfoProvider { @@ -47,7 +47,7 @@ class OpenSourceLicenseInfoProvider @Inject constructor(): AboutActivity.AppLice init { viewModelScope.launch(Dispatchers.IO) { app.resources.assets.open("gplv3.html").use { inputStream -> - val raw = IOUtils.toString(inputStream, Charsets.UTF_8) + val raw = CharStreams.toString(inputStream.bufferedReader()) gpl = HtmlCompat.fromHtml(raw, HtmlCompat.FROM_HTML_MODE_LEGACY) } } diff --git a/app/src/test/kotlin/at/bitfire/davdroid/webdav/DiskCacheTest.kt b/app/src/test/kotlin/at/bitfire/davdroid/webdav/DiskCacheTest.kt index 535412303..1d05e7b19 100644 --- a/app/src/test/kotlin/at/bitfire/davdroid/webdav/DiskCacheTest.kt +++ b/app/src/test/kotlin/at/bitfire/davdroid/webdav/DiskCacheTest.kt @@ -4,9 +4,11 @@ package at.bitfire.davdroid.webdav +import android.os.FileUtils import at.bitfire.davdroid.webdav.cache.DiskCache -import org.apache.commons.io.FileUtils -import org.apache.commons.io.IOUtils +import com.google.common.io.ByteStreams +import com.google.common.io.Files +import ezvcard.util.IOUtils import org.junit.After import org.junit.Assert.assertArrayEquals import org.junit.Assert.assertEquals @@ -26,7 +28,7 @@ class DiskCacheTest { val SOME_OTHER_VALUE = ByteArray(30) { (it/2).toByte() } const val MAX_CACHE_MB = 10 - const val MAX_CACHE_SIZE = MAX_CACHE_MB*FileUtils.ONE_MB + const val MAX_CACHE_SIZE = MAX_CACHE_MB * 1024*1024L } @Rule @@ -53,22 +55,21 @@ class DiskCacheTest { // null value shouldn't have been written to cache assertEquals(0, cache.entries()) - val file = cache.getFileOrPut(SOME_KEY) { SOME_VALUE } - file!!.inputStream().use { input -> - assertArrayEquals(SOME_VALUE, IOUtils.toByteArray(input)) + cache.getFileOrPut(SOME_KEY) { SOME_VALUE }!!.let { + assertArrayEquals(SOME_VALUE, Files.asByteSource(it).read()) } } @Test fun testGetFile_NotNull() { - cache.getFileOrPut(SOME_KEY) { SOME_VALUE }!!.inputStream().use { input -> - assertArrayEquals(SOME_VALUE, IOUtils.toByteArray(input)) + cache.getFileOrPut(SOME_KEY) { SOME_VALUE }!!.let { + assertArrayEquals(SOME_VALUE, Files.asByteSource(it).read()) } // non-null value should have been written to cache assertEquals(1, cache.entries()) - cache.getFileOrPut(SOME_KEY) { SOME_OTHER_VALUE }!!.inputStream().use { input -> - assertArrayEquals(SOME_VALUE, IOUtils.toByteArray(input)) + cache.getFileOrPut(SOME_KEY) { SOME_OTHER_VALUE }!!.let { + assertArrayEquals(SOME_VALUE, Files.asByteSource(it).read()) } } @@ -97,7 +98,7 @@ class DiskCacheTest { // add 11 x 1 MB for (i in 0..MAX_CACHE_MB) { - cache.getFileOrPut(i.toString()) { ByteArray(FileUtils.ONE_MB.toInt()) } + cache.getFileOrPut(i.toString()) { ByteArray(1024*1024) } Thread.sleep(5) // make sure that files are exactly sortable by modification date } // now in cache: SOME_KEY (some bytes) and "0" .. "10" (1 MB each), i.e. 11 MB + some bytes in total diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 290352828..77725b4bb 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -22,18 +22,12 @@ bitfire-cert4android = "f1cc9b9ca3" bitfire-dav4jvm = "b8be778202" bitfire-ical4android = "83cda23ceb" bitfire-vcard4android = "03a37a8284" -commons-collections = "4.4" -commons-lang = "3.14.0" -# don't update until API level 26 (Android 8) is the minimum API [https://github.com/bitfireAT/davx5/issues/130] -#noinspection GradleDependency -commons-io = "2.8.0" -#noinspection GradleDependency -commons-text = "1.11.0" compose-accompanist = "0.34.0" compose-bom = "2024.06.00" # don't update to dnsjava 3.x until API level 26 (Android 8) is the minimum API [https://github.com/bitfireAT/davx5/issues/453] dnsjava = "2.1.9" glance = "1.1.0" +guava = "33.2.1-android" hilt = "2.51.1" # keep in sync with * app/build.gradle.kts composeOptions.kotlinCompilerExtensionVersion # * com.google.devtools.ksp at the end of this file @@ -76,10 +70,6 @@ bitfire-cert4android = { module = "com.github.bitfireAT:cert4android", version.r bitfire-dav4jvm = { module = "com.github.bitfireAT:dav4jvm", version.ref = "bitfire-dav4jvm" } bitfire-ical4android = { module = "com.github.bitfireAT:ical4android", version.ref = "bitfire-ical4android" } bitfire-vcard4android = { module = "com.github.bitfireAT:vcard4android", version.ref = "bitfire-vcard4android" } -commons-collections = { module = "org.apache.commons:commons-collections4", version.ref = "commons-collections" } -commons-io = { module = "commons-io:commons-io", version.ref = "commons-io" } -commons-lang = { module = "org.apache.commons:commons-lang3", version.ref = "commons-lang" } -commons-text = { module = "org.apache.commons:commons-text", version.ref = "commons-text" } compose-accompanist-permissions = { module = "com.google.accompanist:accompanist-permissions", version.ref = "compose-accompanist" } compose-bom = { group = "androidx.compose", name = "compose-bom", version.ref = "compose-bom" } compose-material3 = { group = "androidx.compose.material3", name = "material3" } @@ -90,6 +80,7 @@ compose-ui-toolingPreview = { module = "androidx.compose.ui:ui-tooling-preview" dnsjava = { module = "dnsjava:dnsjava", version.ref = "dnsjava" } glance-base = { module = "androidx.glance:glance-appwidget", version.ref = "glance" } glance-material = { module = "androidx.glance:glance-material", version.ref = "glance" } +guava = { module = "com.google.guava:guava", version.ref = "guava" } hilt-android-base = { module = "com.google.dagger:hilt-android", version.ref = "hilt" } hilt-android-compiler = { module = "com.google.dagger:hilt-android-compiler", version.ref = "hilt" } hilt-android-testing = { module = "com.google.dagger:hilt-android-testing", version.ref = "hilt" }