From 0472b2c5ff313179242f9d489ca84e3fcf21484f Mon Sep 17 00:00:00 2001 From: MohitMaliFtechiz Date: Fri, 24 Jun 2022 12:18:15 +0530 Subject: [PATCH 1/3] Increase read, connect and auto retry attempts --- .../kiwix/kiwixmobile/core/di/modules/DownloaderModule.kt | 5 +++++ .../core/downloader/fetch/FetchDownloadRequester.kt | 3 ++- .../java/org/kiwix/kiwixmobile/core/utils/Constants.kt | 7 +++++++ 3 files changed, 14 insertions(+), 1 deletion(-) diff --git a/core/src/main/java/org/kiwix/kiwixmobile/core/di/modules/DownloaderModule.kt b/core/src/main/java/org/kiwix/kiwixmobile/core/di/modules/DownloaderModule.kt index ad6ce5ba1..29b26fc56 100644 --- a/core/src/main/java/org/kiwix/kiwixmobile/core/di/modules/DownloaderModule.kt +++ b/core/src/main/java/org/kiwix/kiwixmobile/core/di/modules/DownloaderModule.kt @@ -34,7 +34,10 @@ import org.kiwix.kiwixmobile.core.downloader.Downloader import org.kiwix.kiwixmobile.core.downloader.DownloaderImpl import org.kiwix.kiwixmobile.core.downloader.fetch.FetchDownloadNotificationManager import org.kiwix.kiwixmobile.core.downloader.fetch.FetchDownloadRequester +import org.kiwix.kiwixmobile.core.utils.CONNECT_TIME_OUT +import org.kiwix.kiwixmobile.core.utils.READ_TIME_OUT import org.kiwix.kiwixmobile.core.utils.SharedPreferenceUtil +import java.util.concurrent.TimeUnit import javax.inject.Singleton @Module @@ -77,6 +80,8 @@ object DownloaderModule { @Singleton fun provideOkHttpDownloader() = OkHttpDownloader( OkHttpClient.Builder() + .connectTimeout(CONNECT_TIME_OUT, TimeUnit.MINUTES) + .readTimeout(READ_TIME_OUT, TimeUnit.MINUTES) .followRedirects(true) .followSslRedirects(true) .build() diff --git a/core/src/main/java/org/kiwix/kiwixmobile/core/downloader/fetch/FetchDownloadRequester.kt b/core/src/main/java/org/kiwix/kiwixmobile/core/downloader/fetch/FetchDownloadRequester.kt index b53d77e52..a11bb7634 100644 --- a/core/src/main/java/org/kiwix/kiwixmobile/core/downloader/fetch/FetchDownloadRequester.kt +++ b/core/src/main/java/org/kiwix/kiwixmobile/core/downloader/fetch/FetchDownloadRequester.kt @@ -23,6 +23,7 @@ import com.tonyodev.fetch2.NetworkType.WIFI_ONLY import com.tonyodev.fetch2.Request import org.kiwix.kiwixmobile.core.downloader.DownloadRequester import org.kiwix.kiwixmobile.core.downloader.model.DownloadRequest +import org.kiwix.kiwixmobile.core.utils.AUTO_RETRY_MAX_ATTEMPTS import org.kiwix.kiwixmobile.core.utils.SharedPreferenceUtil import javax.inject.Inject @@ -45,5 +46,5 @@ class FetchDownloadRequester @Inject constructor( private fun DownloadRequest.toFetchRequest(sharedPreferenceUtil: SharedPreferenceUtil) = Request("$uri", getDestination(sharedPreferenceUtil)).apply { networkType = if (sharedPreferenceUtil.prefWifiOnly) WIFI_ONLY else ALL - autoRetryMaxAttempts = 10 + autoRetryMaxAttempts = AUTO_RETRY_MAX_ATTEMPTS } diff --git a/core/src/main/java/org/kiwix/kiwixmobile/core/utils/Constants.kt b/core/src/main/java/org/kiwix/kiwixmobile/core/utils/Constants.kt index 927d6f54f..a1ad44a29 100644 --- a/core/src/main/java/org/kiwix/kiwixmobile/core/utils/Constants.kt +++ b/core/src/main/java/org/kiwix/kiwixmobile/core/utils/Constants.kt @@ -44,3 +44,10 @@ const val INTERNAL_SELECT_POSITION = 0 const val EXTERNAL_SELECT_POSITION = 1 const val FILE_SELECT_CODE = 5 + +// For Read and Connect timeout on download OkHttpClient both are in minutes +const val READ_TIME_OUT = 1L +const val CONNECT_TIME_OUT = 1L + +// For autoRetryMaxAttempts in download zim file +const val AUTO_RETRY_MAX_ATTEMPTS = 20 From 90cb76839c8fa2b87a01c3945cb4dca9734eeef5 Mon Sep 17 00:00:00 2001 From: MohitMaliFtechiz Date: Tue, 28 Jun 2022 12:32:49 +0530 Subject: [PATCH 2/3] Retry strategy if download failed due to network fluctuation --- .../destination/library/OnlineLibraryFragment.kt | 16 ++++++++++++---- .../library_view/adapter/LibraryViewHolder.kt | 3 +++ .../core/downloader/DownloadRequester.kt | 1 + .../kiwixmobile/core/downloader/Downloader.kt | 1 + .../core/downloader/DownloaderImpl.kt | 4 ++++ .../downloader/fetch/FetchDownloadRequester.kt | 4 ++++ 6 files changed, 25 insertions(+), 4 deletions(-) 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 b6ad10b20..405bb7ba9 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 @@ -106,10 +106,18 @@ class OnlineLibraryFragment : BaseFragment(), FragmentActivityExtensions { LibraryAdapter( LibraryDelegate.BookDelegate(bookUtils, ::onBookItemClick), LibraryDelegate.DownloadDelegate { - dialogShower.show( - KiwixDialog.YesNoDialog.StopDownload, - { downloader.cancelDownload(it.downloadId) } - ) + if (it.downloadState.toReadableState(requireActivity()).contains("Failed")) { + if (isNotConnected) { + noInternetSnackbar() + } else { + downloader.retryDownload(it.downloadId) + } + } else { + dialogShower.show( + KiwixDialog.YesNoDialog.StopDownload, + { downloader.cancelDownload(it.downloadId) } + ) + } }, LibraryDelegate.DividerDelegate ) diff --git a/app/src/main/java/org/kiwix/kiwixmobile/zim_manager/library_view/adapter/LibraryViewHolder.kt b/app/src/main/java/org/kiwix/kiwixmobile/zim_manager/library_view/adapter/LibraryViewHolder.kt index 6613d32e7..453e47285 100644 --- a/app/src/main/java/org/kiwix/kiwixmobile/zim_manager/library_view/adapter/LibraryViewHolder.kt +++ b/app/src/main/java/org/kiwix/kiwixmobile/zim_manager/library_view/adapter/LibraryViewHolder.kt @@ -99,6 +99,9 @@ sealed class LibraryViewHolder(containerView: View) : downloadProgress.progress = item.progress stop.setOnClickListener { clickAction.invoke(item) } downloadState.text = item.downloadState.toReadableState(containerView.context) + if (item.downloadState.toReadableState(containerView.context).contains("Failed")) { + clickAction.invoke(item) + } eta.text = item.readableEta } } diff --git a/core/src/main/java/org/kiwix/kiwixmobile/core/downloader/DownloadRequester.kt b/core/src/main/java/org/kiwix/kiwixmobile/core/downloader/DownloadRequester.kt index cf41124ab..33c73c508 100644 --- a/core/src/main/java/org/kiwix/kiwixmobile/core/downloader/DownloadRequester.kt +++ b/core/src/main/java/org/kiwix/kiwixmobile/core/downloader/DownloadRequester.kt @@ -22,4 +22,5 @@ import org.kiwix.kiwixmobile.core.downloader.model.DownloadRequest interface DownloadRequester { fun enqueue(downloadRequest: DownloadRequest): Long fun cancel(downloadId: Long) + fun retryDownload(downloadId: Long) } diff --git a/core/src/main/java/org/kiwix/kiwixmobile/core/downloader/Downloader.kt b/core/src/main/java/org/kiwix/kiwixmobile/core/downloader/Downloader.kt index 53f5c4d5a..4f9d09b50 100644 --- a/core/src/main/java/org/kiwix/kiwixmobile/core/downloader/Downloader.kt +++ b/core/src/main/java/org/kiwix/kiwixmobile/core/downloader/Downloader.kt @@ -22,4 +22,5 @@ import org.kiwix.kiwixmobile.core.entity.LibraryNetworkEntity interface Downloader { fun download(book: LibraryNetworkEntity.Book) fun cancelDownload(downloadId: Long) + fun retryDownload(downloadId: Long) } diff --git a/core/src/main/java/org/kiwix/kiwixmobile/core/downloader/DownloaderImpl.kt b/core/src/main/java/org/kiwix/kiwixmobile/core/downloader/DownloaderImpl.kt index 7483d0be0..291ebf74d 100644 --- a/core/src/main/java/org/kiwix/kiwixmobile/core/downloader/DownloaderImpl.kt +++ b/core/src/main/java/org/kiwix/kiwixmobile/core/downloader/DownloaderImpl.kt @@ -49,4 +49,8 @@ class DownloaderImpl @Inject constructor( override fun cancelDownload(downloadId: Long) { downloadRequester.cancel(downloadId) } + + override fun retryDownload(downloadId: Long) { + downloadRequester.retryDownload(downloadId) + } } diff --git a/core/src/main/java/org/kiwix/kiwixmobile/core/downloader/fetch/FetchDownloadRequester.kt b/core/src/main/java/org/kiwix/kiwixmobile/core/downloader/fetch/FetchDownloadRequester.kt index a11bb7634..cb312342b 100644 --- a/core/src/main/java/org/kiwix/kiwixmobile/core/downloader/fetch/FetchDownloadRequester.kt +++ b/core/src/main/java/org/kiwix/kiwixmobile/core/downloader/fetch/FetchDownloadRequester.kt @@ -41,6 +41,10 @@ class FetchDownloadRequester @Inject constructor( override fun cancel(downloadId: Long) { fetch.delete(downloadId.toInt()) } + + override fun retryDownload(downloadId: Long) { + fetch.retry(downloadId.toInt()) + } } private fun DownloadRequest.toFetchRequest(sharedPreferenceUtil: SharedPreferenceUtil) = From 941898d2b629464fd923d23e7f869042f786f1f9 Mon Sep 17 00:00:00 2001 From: MohitMaliFtechiz Date: Fri, 1 Jul 2022 14:39:08 +0530 Subject: [PATCH 3/3] Improve method to detect failed downloads --- .../nav/destination/library/OnlineLibraryFragment.kt | 3 ++- .../zim_manager/library_view/adapter/LibraryListItem.kt | 7 +++++-- .../zim_manager/library_view/adapter/LibraryViewHolder.kt | 3 ++- 3 files changed, 9 insertions(+), 4 deletions(-) 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 405bb7ba9..c2ddc6e6f 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 @@ -46,6 +46,7 @@ import androidx.lifecycle.ViewModelProvider import androidx.lifecycle.observe import androidx.recyclerview.widget.LinearLayoutManager import androidx.recyclerview.widget.RecyclerView +import com.tonyodev.fetch2.Status import eu.mhutti1.utils.storage.StorageDevice import eu.mhutti1.utils.storage.StorageSelectDialog import kotlinx.android.synthetic.main.fragment_destination_download.allowInternetPermissionButton @@ -106,7 +107,7 @@ class OnlineLibraryFragment : BaseFragment(), FragmentActivityExtensions { LibraryAdapter( LibraryDelegate.BookDelegate(bookUtils, ::onBookItemClick), LibraryDelegate.DownloadDelegate { - if (it.downloadState.toReadableState(requireActivity()).contains("Failed")) { + if (it.currentDownloadState == Status.FAILED) { if (isNotConnected) { noInternetSnackbar() } else { diff --git a/app/src/main/java/org/kiwix/kiwixmobile/zim_manager/library_view/adapter/LibraryListItem.kt b/app/src/main/java/org/kiwix/kiwixmobile/zim_manager/library_view/adapter/LibraryListItem.kt index 1881179b0..03c19b591 100644 --- a/app/src/main/java/org/kiwix/kiwixmobile/zim_manager/library_view/adapter/LibraryListItem.kt +++ b/app/src/main/java/org/kiwix/kiwixmobile/zim_manager/library_view/adapter/LibraryListItem.kt @@ -19,6 +19,7 @@ package org.kiwix.kiwixmobile.zim_manager.library_view.adapter import androidx.annotation.StringRes +import com.tonyodev.fetch2.Status import org.kiwix.kiwixmobile.core.downloader.model.Base64String import org.kiwix.kiwixmobile.core.downloader.model.DownloadModel import org.kiwix.kiwixmobile.core.downloader.model.DownloadState @@ -69,7 +70,8 @@ sealed class LibraryListItem { val progress: Int, val eta: Seconds, val downloadState: DownloadState, - override val id: Long + override val id: Long, + val currentDownloadState: Status ) : LibraryListItem() { val readableEta: CharSequence = eta.takeIf { it.seconds > 0L }?.toHumanReadableTime() ?: "" @@ -84,7 +86,8 @@ sealed class LibraryListItem { downloadModel.progress, Seconds(downloadModel.etaInMilliSeconds / 1000L), DownloadState.from(downloadModel.state, downloadModel.error), - downloadModel.book.id.hashCode().toLong() + downloadModel.book.id.hashCode().toLong(), + downloadModel.state ) } } diff --git a/app/src/main/java/org/kiwix/kiwixmobile/zim_manager/library_view/adapter/LibraryViewHolder.kt b/app/src/main/java/org/kiwix/kiwixmobile/zim_manager/library_view/adapter/LibraryViewHolder.kt index 453e47285..db2bf8aad 100644 --- a/app/src/main/java/org/kiwix/kiwixmobile/zim_manager/library_view/adapter/LibraryViewHolder.kt +++ b/app/src/main/java/org/kiwix/kiwixmobile/zim_manager/library_view/adapter/LibraryViewHolder.kt @@ -23,6 +23,7 @@ import android.view.View import android.view.View.MeasureSpec import android.widget.Toast import androidx.annotation.StringRes +import com.tonyodev.fetch2.Status import kotlinx.android.synthetic.main.item_download.downloadProgress import kotlinx.android.synthetic.main.item_download.downloadState import kotlinx.android.synthetic.main.item_download.eta @@ -99,7 +100,7 @@ sealed class LibraryViewHolder(containerView: View) : downloadProgress.progress = item.progress stop.setOnClickListener { clickAction.invoke(item) } downloadState.text = item.downloadState.toReadableState(containerView.context) - if (item.downloadState.toReadableState(containerView.context).contains("Failed")) { + if (item.currentDownloadState == Status.FAILED) { clickAction.invoke(item) } eta.text = item.readableEta