Moved free space to IO thread.

This commit is contained in:
MohitMaliFtechiz 2024-12-09 12:51:13 +05:30 committed by Kelson
parent 3e197cfcd2
commit cd73d6eb89
6 changed files with 86 additions and 87 deletions

View File

@ -106,6 +106,7 @@ androidComponents {
} }
dependencies { dependencies {
implementation(Libs.kotlinx_coroutines_rx3)
androidTestImplementation(Libs.leakcanary_android_instrumentation) androidTestImplementation(Libs.leakcanary_android_instrumentation)
testImplementation(Libs.kotlinx_coroutines_test) testImplementation(Libs.kotlinx_coroutines_test)
} }

View File

@ -208,7 +208,7 @@ class CopyMoveFileHandler @Inject constructor(
} }
} }
fun handleDetectingFileSystemState() { suspend fun handleDetectingFileSystemState() {
if (isBookLessThan4GB()) { if (isBookLessThan4GB()) {
performCopyMoveOperationIfSufficientSpaceAvailable() performCopyMoveOperationIfSufficientSpaceAvailable()
} else { } else {
@ -217,7 +217,7 @@ class CopyMoveFileHandler @Inject constructor(
} }
} }
fun handleCannotWrite4GbFileState() { suspend fun handleCannotWrite4GbFileState() {
if (isBookLessThan4GB()) { if (isBookLessThan4GB()) {
performCopyMoveOperationIfSufficientSpaceAvailable() performCopyMoveOperationIfSufficientSpaceAvailable()
} else { } else {
@ -240,8 +240,7 @@ class CopyMoveFileHandler @Inject constructor(
} }
} }
fun performCopyMoveOperationIfSufficientSpaceAvailable() { suspend fun performCopyMoveOperationIfSufficientSpaceAvailable() {
lifecycleScope?.launch {
val availableSpace = storageCalculator.availableBytes(File(sharedPreferenceUtil.prefStorage)) val availableSpace = storageCalculator.availableBytes(File(sharedPreferenceUtil.prefStorage))
if (hasNotSufficientStorageSpace(availableSpace)) { if (hasNotSufficientStorageSpace(availableSpace)) {
fileCopyMoveCallback?.insufficientSpaceInStorage(availableSpace) fileCopyMoveCallback?.insufficientSpaceInStorage(availableSpace)
@ -249,7 +248,6 @@ class CopyMoveFileHandler @Inject constructor(
performCopyMoveOperation() performCopyMoveOperation()
} }
} }
}
fun showCopyMoveDialog(showStorageSelectionDialog: Boolean = false) { fun showCopyMoveDialog(showStorageSelectionDialog: Boolean = false) {
alertDialogShower.show( alertDialogShower.show(

View File

@ -244,8 +244,10 @@ class LocalLibraryFragment : BaseFragment(), CopyMoveFileHandler.FileCopyMoveCal
) )
} }
@Suppress("LongMethod")
override fun onViewCreated(view: View, savedInstanceState: Bundle?) { override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState) super.onViewCreated(view, savedInstanceState)
lifecycleScope.launch {
setUpSwipeRefreshLayout() setUpSwipeRefreshLayout()
copyMoveFileHandler?.apply { copyMoveFileHandler?.apply {
setFileCopyMoveCallback(this@LocalLibraryFragment) setFileCopyMoveCallback(this@LocalLibraryFragment)
@ -308,6 +310,7 @@ class LocalLibraryFragment : BaseFragment(), CopyMoveFileHandler.FileCopyMoveCal
) )
showCopyMoveDialogForOpenedZimFileFromStorage() showCopyMoveDialogForOpenedZimFileFromStorage()
} }
}
private fun showCopyMoveDialogForOpenedZimFileFromStorage() { private fun showCopyMoveDialogForOpenedZimFileFromStorage() {
val args = LocalLibraryFragmentArgs.fromBundle(requireArguments()) val args = LocalLibraryFragmentArgs.fromBundle(requireArguments())
@ -680,6 +683,7 @@ class LocalLibraryFragment : BaseFragment(), CopyMoveFileHandler.FileCopyMoveCal
private fun storeDeviceInPreferences( private fun storeDeviceInPreferences(
storageDevice: StorageDevice storageDevice: StorageDevice
) { ) {
lifecycleScope.launch {
sharedPreferenceUtil.putPrefStorage( sharedPreferenceUtil.putPrefStorage(
sharedPreferenceUtil.getPublicDirectoryPath(storageDevice.name) sharedPreferenceUtil.getPublicDirectoryPath(storageDevice.name)
) )
@ -690,4 +694,5 @@ class LocalLibraryFragment : BaseFragment(), CopyMoveFileHandler.FileCopyMoveCal
// after selecting the storage try to copy/move the zim file. // after selecting the storage try to copy/move the zim file.
copyMoveFileHandler?.copyMoveZIMFileInSelectedStorage(storageDevice) copyMoveFileHandler?.copyMoveZIMFileInSelectedStorage(storageDevice)
} }
}
} }

View File

@ -136,11 +136,11 @@ class CopyMoveFileHandlerTest {
val result = fileHandler.validateZimFileCanCopyOrMove(storageFile) val result = fileHandler.validateZimFileCanCopyOrMove(storageFile)
assertFalse(result) assertFalse(result)
verify { fileHandler.handleDetectingFileSystemState() } coVerify { fileHandler.handleDetectingFileSystemState() }
} }
@Test @Test
fun validateZimFileCanCopyOrMoveShouldReturnFalseWhenCannotWrite4GbFile() = runBlocking { fun validateZimFileCanCopyOrMoveShouldReturnFalseWhenCannotWrite4GbFile() = runTest {
every { fileHandler.isBookLessThan4GB() } returns true every { fileHandler.isBookLessThan4GB() } returns true
every { fileHandler.showCopyMoveDialog() } just Runs every { fileHandler.showCopyMoveDialog() } just Runs
every { every {
@ -151,23 +151,23 @@ class CopyMoveFileHandlerTest {
val result = fileHandler.validateZimFileCanCopyOrMove(storageFile) val result = fileHandler.validateZimFileCanCopyOrMove(storageFile)
assertFalse(result) assertFalse(result)
verify { fileHandler.handleCannotWrite4GbFileState() } coVerify { fileHandler.handleCannotWrite4GbFileState() }
} }
@Test @Test
fun handleDetectingFileSystemStateShouldPerformCopyMoveOperationIfBookLessThan4GB() { fun handleDetectingFileSystemStateShouldPerformCopyMoveOperationIfBookLessThan4GB() = runTest {
fileHandler = spyk(fileHandler) fileHandler = spyk(fileHandler)
prepareFileSystemAndFileForMockk() prepareFileSystemAndFileForMockk()
every { fileHandler.isBookLessThan4GB() } returns true every { fileHandler.isBookLessThan4GB() } returns true
every { fileHandler.performCopyMoveOperationIfSufficientSpaceAvailable() } just Runs coEvery { fileHandler.performCopyMoveOperationIfSufficientSpaceAvailable() } just Runs
fileHandler.handleDetectingFileSystemState() fileHandler.handleDetectingFileSystemState()
verify { fileHandler.performCopyMoveOperationIfSufficientSpaceAvailable() } coVerify { fileHandler.performCopyMoveOperationIfSufficientSpaceAvailable() }
} }
@Test @Test
fun handleDetectingFileSystemStateShouldObserveFileSystemStateIfBookGreaterThan4GB() { fun handleDetectingFileSystemStateShouldObserveFileSystemStateIfBookGreaterThan4GB() = runTest {
fileHandler = spyk(fileHandler) fileHandler = spyk(fileHandler)
prepareFileSystemAndFileForMockk(fileSystemState = DetectingFileSystem) prepareFileSystemAndFileForMockk(fileSystemState = DetectingFileSystem)
every { fileHandler.isBookLessThan4GB() } returns false every { fileHandler.isBookLessThan4GB() } returns false
@ -178,19 +178,19 @@ class CopyMoveFileHandlerTest {
} }
@Test @Test
fun handleCannotWrite4GbFileStateShouldPerformCopyMoveOperationIfBookLessThan4GB() { fun handleCannotWrite4GbFileStateShouldPerformCopyMoveOperationIfBookLessThan4GB() = runTest {
fileHandler = spyk(fileHandler) fileHandler = spyk(fileHandler)
prepareFileSystemAndFileForMockk() prepareFileSystemAndFileForMockk()
every { fileHandler.isBookLessThan4GB() } returns true every { fileHandler.isBookLessThan4GB() } returns true
every { fileHandler.performCopyMoveOperationIfSufficientSpaceAvailable() } just Runs coEvery { fileHandler.performCopyMoveOperationIfSufficientSpaceAvailable() } just Runs
fileHandler.handleCannotWrite4GbFileState() fileHandler.handleCannotWrite4GbFileState()
verify { fileHandler.performCopyMoveOperationIfSufficientSpaceAvailable() } coVerify { fileHandler.performCopyMoveOperationIfSufficientSpaceAvailable() }
} }
@Test @Test
fun handleCannotWrite4GbFileStateShouldCallCallbackIfBookGreaterThan4GB() { fun handleCannotWrite4GbFileStateShouldCallCallbackIfBookGreaterThan4GB() = runTest {
fileHandler = spyk(fileHandler) fileHandler = spyk(fileHandler)
prepareFileSystemAndFileForMockk() prepareFileSystemAndFileForMockk()
every { fileHandler.isBookLessThan4GB() } returns false every { fileHandler.isBookLessThan4GB() } returns false

View File

@ -19,17 +19,12 @@
package org.kiwix.kiwixmobile.core.extensions package org.kiwix.kiwixmobile.core.extensions
import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.runBlocking
import kotlinx.coroutines.withContext import kotlinx.coroutines.withContext
import java.io.File import java.io.File
suspend fun File.isFileExist(): Boolean = withContext(Dispatchers.IO) { exists() } suspend fun File.isFileExist(): Boolean = withContext(Dispatchers.IO) { exists() }
fun File.freeSpace(): Long = runBlocking { suspend fun File.freeSpace(): Long = withContext(Dispatchers.IO) { freeSpace }
withContext(Dispatchers.IO) {
freeSpace
}
}
suspend fun File.totalSpace(): Long = withContext(Dispatchers.IO) { totalSpace } suspend fun File.totalSpace(): Long = withContext(Dispatchers.IO) { totalSpace }

View File

@ -28,7 +28,7 @@ import javax.inject.Inject
class SetPreferredStorageWithMostSpace @Inject constructor( class SetPreferredStorageWithMostSpace @Inject constructor(
private val storageCalculator: StorageCalculator, private val storageCalculator: StorageCalculator,
private val sharedPreferenceUtil: SharedPreferenceUtil private val sharedPreferenceUtil: SharedPreferenceUtil,
) : SideEffect<Unit> { ) : SideEffect<Unit> {
override fun invokeWith(activity: AppCompatActivity) { override fun invokeWith(activity: AppCompatActivity) {
activity.lifecycleScope.launch { activity.lifecycleScope.launch {