From 49fb4ca5d4ffdecc487257794ed2e3a8d51d819e Mon Sep 17 00:00:00 2001 From: MohitMaliFtechiz Date: Wed, 27 Nov 2024 15:28:07 +0530 Subject: [PATCH] Minor improvement in downloading functionality. * When the internet connection is turned off and then turned on back, the download progress is now properly tracked while the application is in the foreground. Tracking progress is working fine with this scenario when the application is closed. --- app/detekt_baseline.xml | 2 -- .../library/OnlineLibraryFragment.kt | 2 +- .../zimManager/ZimManageViewModel.kt | 4 ++- .../zimManager/ZimManageViewModelTest.kt | 6 ++-- core/detekt_baseline.xml | 2 ++ .../core}/ConnectivityManagerExtensions.kt | 8 ++--- .../downloadManager/DownloadManagerMonitor.kt | 34 ++++++++++++++----- .../ConnectivityBroadcastReceiver.kt | 4 +-- .../core/zim_manager}/NetworkState.kt | 2 +- 9 files changed, 43 insertions(+), 21 deletions(-) rename {app/src/main/java/org/kiwix/kiwixmobile => core/src/main/java/org/kiwix/kiwixmobile/core}/ConnectivityManagerExtensions.kt (80%) rename {app/src/main/java/org/kiwix/kiwixmobile/zimManager => core/src/main/java/org/kiwix/kiwixmobile/core/zim_manager}/ConnectivityBroadcastReceiver.kt (94%) rename {app/src/main/java/org/kiwix/kiwixmobile/zimManager => core/src/main/java/org/kiwix/kiwixmobile/core/zim_manager}/NetworkState.kt (94%) diff --git a/app/detekt_baseline.xml b/app/detekt_baseline.xml index 6c2a6da63..afafc1a17 100644 --- a/app/detekt_baseline.xml +++ b/app/detekt_baseline.xml @@ -17,7 +17,6 @@ NestedBlockDepth:ReceiverHandShake.kt$ReceiverHandShake$override fun exchangeFileTransferMetadata(inputStream: InputStream, outputStream: OutputStream) PackageNaming:AvailableSpaceCalculator.kt$package org.kiwix.kiwixmobile.zimManager.libraryView - PackageNaming:ConnectivityBroadcastReceiver.kt$package org.kiwix.kiwixmobile.zimManager PackageNaming:DefaultLanguageProvider.kt$package org.kiwix.kiwixmobile.zimManager PackageNaming:DeleteFiles.kt$package org.kiwix.kiwixmobile.zimManager.fileselectView.effects @@ -37,7 +36,6 @@ PackageNaming:MountFileSystemChecker.kt$package org.kiwix.kiwixmobile.zimManager PackageNaming:NavigateToDownloads.kt$package org.kiwix.kiwixmobile.zimManager.fileselectView.effects - PackageNaming:NetworkState.kt$package org.kiwix.kiwixmobile.zimManager PackageNaming:None.kt$package org.kiwix.kiwixmobile.zimManager.fileselectView.effects PackageNaming:OpenFileWithNavigation.kt$package org.kiwix.kiwixmobile.zimManager.fileselectView.effects diff --git a/app/src/main/java/org/kiwix/kiwixmobile/nav/destination/library/OnlineLibraryFragment.kt b/app/src/main/java/org/kiwix/kiwixmobile/nav/destination/library/OnlineLibraryFragment.kt index caa877827..513d5b651 100644 --- a/app/src/main/java/org/kiwix/kiwixmobile/nav/destination/library/OnlineLibraryFragment.kt +++ b/app/src/main/java/org/kiwix/kiwixmobile/nav/destination/library/OnlineLibraryFragment.kt @@ -89,7 +89,7 @@ import org.kiwix.kiwixmobile.core.utils.dialog.DialogShower import org.kiwix.kiwixmobile.core.utils.dialog.KiwixDialog import org.kiwix.kiwixmobile.core.utils.dialog.KiwixDialog.YesNoDialog.WifiOnly import org.kiwix.kiwixmobile.databinding.FragmentDestinationDownloadBinding -import org.kiwix.kiwixmobile.zimManager.NetworkState +import org.kiwix.kiwixmobile.core.zim_manager.NetworkState import org.kiwix.kiwixmobile.zimManager.ZimManageViewModel import org.kiwix.kiwixmobile.zimManager.libraryView.AvailableSpaceCalculator import org.kiwix.kiwixmobile.zimManager.libraryView.adapter.LibraryAdapter diff --git a/app/src/main/java/org/kiwix/kiwixmobile/zimManager/ZimManageViewModel.kt b/app/src/main/java/org/kiwix/kiwixmobile/zimManager/ZimManageViewModel.kt index 262bf4150..8b0cae71e 100644 --- a/app/src/main/java/org/kiwix/kiwixmobile/zimManager/ZimManageViewModel.kt +++ b/app/src/main/java/org/kiwix/kiwixmobile/zimManager/ZimManageViewModel.kt @@ -66,13 +66,15 @@ import org.kiwix.kiwixmobile.core.utils.BookUtils import org.kiwix.kiwixmobile.core.utils.SharedPreferenceUtil import org.kiwix.kiwixmobile.core.utils.files.Log import org.kiwix.kiwixmobile.core.utils.files.ScanningProgressListener +import org.kiwix.kiwixmobile.core.zim_manager.ConnectivityBroadcastReceiver import org.kiwix.kiwixmobile.core.zim_manager.Language +import org.kiwix.kiwixmobile.core.zim_manager.NetworkState import org.kiwix.kiwixmobile.core.zim_manager.fileselect_view.SelectionMode.MULTI import org.kiwix.kiwixmobile.core.zim_manager.fileselect_view.SelectionMode.NORMAL import org.kiwix.kiwixmobile.core.zim_manager.fileselect_view.adapter.BooksOnDiskListItem import org.kiwix.kiwixmobile.core.zim_manager.fileselect_view.adapter.BooksOnDiskListItem.BookOnDisk import org.kiwix.kiwixmobile.zimManager.Fat32Checker.FileSystemState -import org.kiwix.kiwixmobile.zimManager.NetworkState.CONNECTED +import org.kiwix.kiwixmobile.core.zim_manager.NetworkState.CONNECTED import org.kiwix.kiwixmobile.zimManager.ZimManageViewModel.FileSelectActions.MultiModeFinished import org.kiwix.kiwixmobile.zimManager.ZimManageViewModel.FileSelectActions.RequestDeleteMultiSelection import org.kiwix.kiwixmobile.zimManager.ZimManageViewModel.FileSelectActions.RequestMultiSelection diff --git a/app/src/test/java/org/kiwix/kiwixmobile/zimManager/ZimManageViewModelTest.kt b/app/src/test/java/org/kiwix/kiwixmobile/zimManager/ZimManageViewModelTest.kt index 91a63a8cc..c4d3c09db 100644 --- a/app/src/test/java/org/kiwix/kiwixmobile/zimManager/ZimManageViewModelTest.kt +++ b/app/src/test/java/org/kiwix/kiwixmobile/zimManager/ZimManageViewModelTest.kt @@ -48,7 +48,9 @@ import org.kiwix.kiwixmobile.core.entity.LibraryNetworkEntity.Book import org.kiwix.kiwixmobile.core.utils.BookUtils import org.kiwix.kiwixmobile.core.utils.SharedPreferenceUtil import org.kiwix.kiwixmobile.core.utils.files.ScanningProgressListener +import org.kiwix.kiwixmobile.core.zim_manager.ConnectivityBroadcastReceiver import org.kiwix.kiwixmobile.core.zim_manager.Language +import org.kiwix.kiwixmobile.core.zim_manager.NetworkState import org.kiwix.kiwixmobile.core.zim_manager.fileselect_view.SelectionMode.MULTI import org.kiwix.kiwixmobile.core.zim_manager.fileselect_view.SelectionMode.NORMAL import org.kiwix.kiwixmobile.core.zim_manager.fileselect_view.adapter.BooksOnDiskListItem @@ -56,8 +58,8 @@ import org.kiwix.kiwixmobile.core.zim_manager.fileselect_view.adapter.BooksOnDis import org.kiwix.kiwixmobile.zimManager.Fat32Checker.FileSystemState import org.kiwix.kiwixmobile.zimManager.Fat32Checker.FileSystemState.CanWrite4GbFile import org.kiwix.kiwixmobile.zimManager.Fat32Checker.FileSystemState.CannotWrite4GbFile -import org.kiwix.kiwixmobile.zimManager.NetworkState.CONNECTED -import org.kiwix.kiwixmobile.zimManager.NetworkState.NOT_CONNECTED +import org.kiwix.kiwixmobile.core.zim_manager.NetworkState.CONNECTED +import org.kiwix.kiwixmobile.core.zim_manager.NetworkState.NOT_CONNECTED import org.kiwix.kiwixmobile.zimManager.ZimManageViewModel.FileSelectActions.MultiModeFinished import org.kiwix.kiwixmobile.zimManager.ZimManageViewModel.FileSelectActions.RequestDeleteMultiSelection import org.kiwix.kiwixmobile.zimManager.ZimManageViewModel.FileSelectActions.RequestMultiSelection diff --git a/core/detekt_baseline.xml b/core/detekt_baseline.xml index 552831001..a8770c663 100644 --- a/core/detekt_baseline.xml +++ b/core/detekt_baseline.xml @@ -51,6 +51,8 @@ PackageNaming:MountPointProducer.kt$package org.kiwix.kiwixmobile.core.zim_manager PackageNaming:SelectionMode.kt$package org.kiwix.kiwixmobile.core.zim_manager.fileselect_view PackageNaming:TagsView.kt$package org.kiwix.kiwixmobile.core.zim_manager + PackageNaming:ConnectivityBroadcastReceiver.kt$package org.kiwix.kiwixmobile.core.zim_manager + PackageNaming:NetworkState.kt$package org.kiwix.kiwixmobile.core.zim_manager ReturnCount:FileUtils.kt$FileUtils$@JvmStatic fun getAllZimParts(book: Book): List<File> ReturnCount:FileUtils.kt$FileUtils$@JvmStatic fun getLocalFilePathByUri( context: Context, uri: Uri ): String? ReturnCount:FileUtils.kt$FileUtils$@JvmStatic fun hasPart(file: File): Boolean diff --git a/app/src/main/java/org/kiwix/kiwixmobile/ConnectivityManagerExtensions.kt b/core/src/main/java/org/kiwix/kiwixmobile/core/ConnectivityManagerExtensions.kt similarity index 80% rename from app/src/main/java/org/kiwix/kiwixmobile/ConnectivityManagerExtensions.kt rename to core/src/main/java/org/kiwix/kiwixmobile/core/ConnectivityManagerExtensions.kt index cb9928066..d44ae9635 100644 --- a/app/src/main/java/org/kiwix/kiwixmobile/ConnectivityManagerExtensions.kt +++ b/core/src/main/java/org/kiwix/kiwixmobile/core/ConnectivityManagerExtensions.kt @@ -16,13 +16,13 @@ * */ -package org.kiwix.kiwixmobile +package org.kiwix.kiwixmobile.core import android.net.ConnectivityManager import org.kiwix.kiwixmobile.core.compat.CompatHelper.Companion.isNetworkAvailable -import org.kiwix.kiwixmobile.zimManager.NetworkState -import org.kiwix.kiwixmobile.zimManager.NetworkState.CONNECTED -import org.kiwix.kiwixmobile.zimManager.NetworkState.NOT_CONNECTED +import org.kiwix.kiwixmobile.core.zim_manager.NetworkState +import org.kiwix.kiwixmobile.core.zim_manager.NetworkState.CONNECTED +import org.kiwix.kiwixmobile.core.zim_manager.NetworkState.NOT_CONNECTED val ConnectivityManager.networkState: NetworkState get() = if (isNetworkAvailable()) diff --git a/core/src/main/java/org/kiwix/kiwixmobile/core/downloader/downloadManager/DownloadManagerMonitor.kt b/core/src/main/java/org/kiwix/kiwixmobile/core/downloader/downloadManager/DownloadManagerMonitor.kt index 370b65d7d..2704d5fbc 100644 --- a/core/src/main/java/org/kiwix/kiwixmobile/core/downloader/downloadManager/DownloadManagerMonitor.kt +++ b/core/src/main/java/org/kiwix/kiwixmobile/core/downloader/downloadManager/DownloadManagerMonitor.kt @@ -18,6 +18,7 @@ package org.kiwix.kiwixmobile.core.downloader.downloadManager +import android.annotation.SuppressLint import android.app.DownloadManager import android.content.Context import android.content.Intent @@ -25,33 +26,50 @@ import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.launch import org.kiwix.kiwixmobile.core.dao.DownloadRoomDao -import org.kiwix.kiwixmobile.core.dao.entities.DownloadRoomEntity import org.kiwix.kiwixmobile.core.downloader.DownloadMonitor import org.kiwix.kiwixmobile.core.downloader.downloadManager.DownloadNotificationManager.Companion.ACTION_CANCEL import org.kiwix.kiwixmobile.core.downloader.downloadManager.DownloadNotificationManager.Companion.ACTION_PAUSE import org.kiwix.kiwixmobile.core.downloader.downloadManager.DownloadNotificationManager.Companion.ACTION_QUERY_DOWNLOAD_STATUS import org.kiwix.kiwixmobile.core.downloader.downloadManager.DownloadNotificationManager.Companion.ACTION_RESUME +import org.kiwix.kiwixmobile.core.extensions.registerReceiver +import org.kiwix.kiwixmobile.core.zim_manager.ConnectivityBroadcastReceiver import javax.inject.Inject class DownloadManagerMonitor @Inject constructor( val downloadRoomDao: DownloadRoomDao, - private val context: Context + private val context: Context, + private val connectivityBroadcastReceiver: ConnectivityBroadcastReceiver ) : DownloadMonitor, DownloadManagerBroadcastReceiver.Callback { private val lock = Any() init { + context.registerReceiver(connectivityBroadcastReceiver) + startServiceIfActiveDownloads() + trackNetworkState() + } + + @SuppressLint("CheckResult") + private fun trackNetworkState() { + connectivityBroadcastReceiver.networkStates + .distinctUntilChanged() + .subscribe( + { + // Start the service when the network changes so that we can + // track the progress accurately. + startServiceIfActiveDownloads() + }, + Throwable::printStackTrace + ) + } + + private fun startServiceIfActiveDownloads() { CoroutineScope(Dispatchers.IO).launch { - if (getActiveDownloads().isNotEmpty()) { + if (downloadRoomDao.downloads().blockingFirst().isNotEmpty()) { startService() } } } - private suspend fun getActiveDownloads(): List = - downloadRoomDao.downloadRoomEntity().blockingFirst().filter { - it.status != Status.PAUSED && it.status != Status.CANCELLED - } - override fun downloadCompleteOrCancelled(intent: Intent) { synchronized(lock) { intent.extras?.let { diff --git a/app/src/main/java/org/kiwix/kiwixmobile/zimManager/ConnectivityBroadcastReceiver.kt b/core/src/main/java/org/kiwix/kiwixmobile/core/zim_manager/ConnectivityBroadcastReceiver.kt similarity index 94% rename from app/src/main/java/org/kiwix/kiwixmobile/zimManager/ConnectivityBroadcastReceiver.kt rename to core/src/main/java/org/kiwix/kiwixmobile/core/zim_manager/ConnectivityBroadcastReceiver.kt index 95298a219..d8f49d931 100644 --- a/app/src/main/java/org/kiwix/kiwixmobile/zimManager/ConnectivityBroadcastReceiver.kt +++ b/core/src/main/java/org/kiwix/kiwixmobile/core/zim_manager/ConnectivityBroadcastReceiver.kt @@ -16,7 +16,7 @@ * */ -package org.kiwix.kiwixmobile.zimManager +package org.kiwix.kiwixmobile.core.zim_manager import android.content.Context import android.content.Intent @@ -24,7 +24,7 @@ import android.net.ConnectivityManager import io.reactivex.Flowable import io.reactivex.processors.BehaviorProcessor import org.kiwix.kiwixmobile.core.base.BaseBroadcastReceiver -import org.kiwix.kiwixmobile.networkState +import org.kiwix.kiwixmobile.core.networkState import javax.inject.Inject class ConnectivityBroadcastReceiver @Inject constructor( diff --git a/app/src/main/java/org/kiwix/kiwixmobile/zimManager/NetworkState.kt b/core/src/main/java/org/kiwix/kiwixmobile/core/zim_manager/NetworkState.kt similarity index 94% rename from app/src/main/java/org/kiwix/kiwixmobile/zimManager/NetworkState.kt rename to core/src/main/java/org/kiwix/kiwixmobile/core/zim_manager/NetworkState.kt index 64125e1b8..85359d825 100644 --- a/app/src/main/java/org/kiwix/kiwixmobile/zimManager/NetworkState.kt +++ b/core/src/main/java/org/kiwix/kiwixmobile/core/zim_manager/NetworkState.kt @@ -16,7 +16,7 @@ * */ -package org.kiwix.kiwixmobile.zimManager +package org.kiwix.kiwixmobile.core.zim_manager enum class NetworkState { CONNECTED,