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 6c2a6da631..afafc1a17c 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 caa8778277..513d5b6517 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 262bf4150f..8b0cae71ef 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 91a63a8cc8..c4d3c09dbd 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 552831001b..a8770c6630 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 cb99280660..d44ae96357 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 370b65d7d9..2704d5fbc1 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 95298a2190..d8f49d9318 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 64125e1b85..85359d8252 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,