X-Git-Url: https://gitweb.stoutner.com/?p=PrivacyBrowserAndroid.git;a=blobdiff_plain;f=app%2Fsrc%2Fmain%2Fjava%2Fcom%2Fstoutner%2Fprivacybrowser%2Fcoroutines%2FSaveUrlCoroutine.kt;fp=app%2Fsrc%2Fmain%2Fjava%2Fcom%2Fstoutner%2Fprivacybrowser%2Fcoroutines%2FSaveUrlCoroutine.kt;h=7ce88146a7ef60501c914829058b2c4ce3dfd73a;hp=f6b7a83235d8f181f9f3c0ec18848d553e957c4f;hb=6696d6946875515ae71c46a62dede4df44ad4351;hpb=2562fecd31bce18ba708033e5b69736dc82e737d diff --git a/app/src/main/java/com/stoutner/privacybrowser/coroutines/SaveUrlCoroutine.kt b/app/src/main/java/com/stoutner/privacybrowser/coroutines/SaveUrlCoroutine.kt index f6b7a832..7ce88146 100644 --- a/app/src/main/java/com/stoutner/privacybrowser/coroutines/SaveUrlCoroutine.kt +++ b/app/src/main/java/com/stoutner/privacybrowser/coroutines/SaveUrlCoroutine.kt @@ -1,5 +1,5 @@ /* - * Copyright 2020-2023 Soren Stoutner . + * Copyright 2020-2024 Soren Stoutner . * * This file is part of Privacy Browser Android . * @@ -44,6 +44,7 @@ import java.io.InputStream import java.net.HttpURLConnection import java.net.URL import java.text.NumberFormat +import java.util.Date class SaveUrlCoroutine { fun save(context: Context, activity: Activity, urlString: String, fileUri: Uri, userAgent: String, cookiesEnabled: Boolean) { @@ -154,11 +155,13 @@ class SaveUrlCoroutine { val inputStream: InputStream = BufferedInputStream(httpUrlConnection.inputStream) // Initialize the conversion buffer byte array. - // This is set to a megabyte so that frequent updating of the snackbar doesn't freeze the interface on download. - val conversionBufferByteArray = ByteArray(1048576) + // This is set to a 100,000 bytes so that frequent updating of the snackbar doesn't freeze the interface on download, although `inputStream.read` currently used 8,000 as an upper limit. + // + val conversionBufferByteArray = ByteArray(100_000) - // Initialize the downloaded kilobytes counter. - var downloadedKilobytesCounter: Long = 0 + // Initialize the longs. + var downloadedBytesCounterLong: Long = 0 + var lastSnackbarUpdateLong: Long = 0 // Define the buffer length variable. var bufferLength: Int @@ -168,26 +171,36 @@ class SaveUrlCoroutine { // Write the contents of the conversion buffer to the file output stream. outputStream.write(conversionBufferByteArray, 0, bufferLength) - // Update the downloaded kilobytes counter. - downloadedKilobytesCounter += bufferLength + // Update the downloaded bytes counter. + downloadedBytesCounterLong += bufferLength // Format the number of bytes downloaded. - val formattedNumberOfBytesDownloadedString = NumberFormat.getInstance().format(downloadedKilobytesCounter) - - // Update the UI. - withContext(Dispatchers.Main) { - // Check to see if the file size is known. - if (fileSize == -1L) { // The size of the download file is not known. - // Update the snackbar. - savingFileSnackbar.setText(activity.getString(R.string.saving_file_progress, formattedNumberOfBytesDownloadedString, fileNameString)) - } else { // The size of the download file is known. - // Calculate the download percentage. - val downloadPercentage = downloadedKilobytesCounter * 100 / fileSize - - // Update the snackbar. - savingFileSnackbar.setText(activity.getString(R.string.saving_file_percentage_progress, downloadPercentage, formattedNumberOfBytesDownloadedString, formattedFileSize, - fileNameString) - ) + val formattedNumberOfBytesDownloadedString = NumberFormat.getInstance().format(downloadedBytesCounterLong) + + // Get the current time. + val currentTimeLong = Date().time + + // Update the snackbar if more than 100 milliseconds have passed since the last update. + // Updating the snackbar is so resource intensive that it will throttle the download if it is done too frequently. + if (currentTimeLong - lastSnackbarUpdateLong > 100) { + // Store the update time. + lastSnackbarUpdateLong = currentTimeLong + + // Update the UI. + withContext(Dispatchers.Main) { + // Check to see if the file size is known. + if (fileSize == -1L) { // The size of the download file is not known. + // Update the snackbar. + savingFileSnackbar.setText(activity.getString(R.string.saving_file_progress, formattedNumberOfBytesDownloadedString, fileNameString)) + } else { // The size of the download file is known. + // Calculate the download percentage. + val downloadPercentage = downloadedBytesCounterLong * 100 / fileSize + + // Update the snackbar. + savingFileSnackbar.setText(activity.getString(R.string.saving_file_percentage_progress, downloadPercentage, formattedNumberOfBytesDownloadedString, formattedFileSize, + fileNameString) + ) + } } } }