From e8978e1a06bd2463454079ca898a7c7f136e811e Mon Sep 17 00:00:00 2001 From: MohitMaliFtechiz Date: Thu, 11 Jul 2024 18:01:52 +0530 Subject: [PATCH] Replacing the fetch library with Android's DownloadManager. --- .../library/OnlineLibraryFragment.kt | 22 +++++++ .../kiwixmobile/core/dao/FetchDownloadDao.kt | 30 ++++++--- .../core/dao/entities/FetchDownloadEntity.kt | 3 +- .../core/di/modules/ApplicationModule.kt | 11 +++- .../core/di/modules/CoreServiceModule.kt | 9 +++ .../core/di/modules/DatabaseModule.kt | 6 +- .../core/di/modules/DownloaderModule.kt | 23 +++++-- .../DownloadManagerBroadcastReceiver.kt | 38 +++++++++++ .../downloadManager/DownloadManagerMonitor.kt | 47 ++++++++++++++ .../DownloadManagerRequester.kt | 63 +++++++++++++++++++ .../downloader/fetch/FetchDownloadMonitor.kt | 2 +- .../fetch/FetchDownloadRequester.kt | 2 +- .../core/downloader/model/DownloadRequest.kt | 11 +++- 13 files changed, 241 insertions(+), 26 deletions(-) create mode 100644 core/src/main/java/org/kiwix/kiwixmobile/core/downloader/downloadManager/DownloadManagerBroadcastReceiver.kt create mode 100644 core/src/main/java/org/kiwix/kiwixmobile/core/downloader/downloadManager/DownloadManagerMonitor.kt create mode 100644 core/src/main/java/org/kiwix/kiwixmobile/core/downloader/downloadManager/DownloadManagerRequester.kt 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 d86661cf18..8054305458 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 @@ -59,6 +59,7 @@ import org.kiwix.kiwixmobile.core.base.BaseActivity import org.kiwix.kiwixmobile.core.base.BaseFragment import org.kiwix.kiwixmobile.core.base.FragmentActivityExtensions import org.kiwix.kiwixmobile.core.downloader.Downloader +import org.kiwix.kiwixmobile.core.entity.LibraryNetworkEntity import org.kiwix.kiwixmobile.core.extensions.ActivityExtensions.hasNotificationPermission import org.kiwix.kiwixmobile.core.extensions.ActivityExtensions.isManageExternalStoragePermissionGranted import org.kiwix.kiwixmobile.core.extensions.ActivityExtensions.navigate @@ -89,6 +90,7 @@ import org.kiwix.kiwixmobile.core.utils.dialog.KiwixDialog.SelectFolder import org.kiwix.kiwixmobile.core.utils.dialog.KiwixDialog.YesNoDialog.WifiOnly import org.kiwix.kiwixmobile.core.utils.files.FileUtils.getPathFromUri import org.kiwix.kiwixmobile.databinding.FragmentDestinationDownloadBinding +import org.kiwix.kiwixmobile.zimManager.Fat32Checker import org.kiwix.kiwixmobile.zimManager.NetworkState import org.kiwix.kiwixmobile.zimManager.ZimManageViewModel import org.kiwix.kiwixmobile.zimManager.libraryView.AvailableSpaceCalculator @@ -209,6 +211,26 @@ class OnlineLibraryFragment : BaseFragment(), FragmentActivityExtensions { } } ) + // + val libraryBookEntity = LibraryNetworkEntity.Book().apply { + id = "6a5413cd-0d96-7288-9c1b-5beda035e472" + size = "170628" + url = "https://download.kiwix.org/zim/zimit/100r.co_en_all_2024-06.zim.meta4" + mediaCount = "1433" + articleCount = "320" + favicon = + "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" + title = "100 Rabbits" + description = "Research and test low-tech solutions, and document findings" + language = "eng" + creator = "-" + publisher = "openZIM" + bookName = "100r.co_en_all" + tags = "_ftindex:yes;preppers;_category:other;_pictures:yes;_videos:yes;_details:yes" + date = "2024-06-24" + faviconMimeType = "image/png" + } + downloader.download(libraryBookEntity) } private fun setupMenu() { diff --git a/core/src/main/java/org/kiwix/kiwixmobile/core/dao/FetchDownloadDao.kt b/core/src/main/java/org/kiwix/kiwixmobile/core/dao/FetchDownloadDao.kt index d2f8869ce3..733e78ae99 100644 --- a/core/src/main/java/org/kiwix/kiwixmobile/core/dao/FetchDownloadDao.kt +++ b/core/src/main/java/org/kiwix/kiwixmobile/core/dao/FetchDownloadDao.kt @@ -31,12 +31,16 @@ import org.kiwix.kiwixmobile.core.downloader.DownloadRequester import org.kiwix.kiwixmobile.core.downloader.model.DownloadModel import org.kiwix.kiwixmobile.core.downloader.model.DownloadRequest import org.kiwix.kiwixmobile.core.entity.LibraryNetworkEntity.Book +import org.kiwix.kiwixmobile.core.extensions.deleteFile +import org.kiwix.kiwixmobile.core.utils.SharedPreferenceUtil import org.kiwix.kiwixmobile.core.zim_manager.fileselect_view.adapter.BooksOnDiskListItem.BookOnDisk +import java.io.File import javax.inject.Inject class FetchDownloadDao @Inject constructor( private val box: Box, - private val newBookDao: NewBookDao + private val newBookDao: NewBookDao, + private val sharedPreferenceUtil: SharedPreferenceUtil ) { fun downloads(): Flowable> = @@ -58,7 +62,7 @@ class FetchDownloadDao @Inject constructor( fun update(download: Download) { box.store.callInTx { - getEntityFor(download)?.let { dbEntity -> + getEntityFor(download.id)?.let { dbEntity -> dbEntity.updateWith(download) .takeIf { updatedEntity -> updatedEntity != dbEntity } ?.let(box::put) @@ -66,9 +70,9 @@ class FetchDownloadDao @Inject constructor( } } - private fun getEntityFor(download: Download) = + private fun getEntityFor(downloadId: Int) = box.query { - equal(FetchDownloadEntity_.downloadId, download.id) + equal(FetchDownloadEntity_.downloadId, downloadId) }.find().getOrNull(0) fun getEntityForFileName(fileName: String) = @@ -79,13 +83,17 @@ class FetchDownloadDao @Inject constructor( ) }.findFirst() - fun insert(downloadId: Long, book: Book) { - box.put(FetchDownloadEntity(downloadId, book)) + fun insert(downloadId: Long, book: Book, filePath: String?) { + box.put(FetchDownloadEntity(downloadId, book, filePath)) } - fun delete(download: Download) { + fun delete(downloadId: Long) { + // remove the previous file from storage since we have cancelled the download. + // getEntityFor(downloadId.toInt())?.file?.let { + // File(it).deleteFile() + // } box.query { - equal(FetchDownloadEntity_.downloadId, download.id) + equal(FetchDownloadEntity_.downloadId, downloadId) }.remove() } @@ -96,9 +104,11 @@ class FetchDownloadDao @Inject constructor( ) { box.store.callInTx { if (doesNotAlreadyExist(book)) { + val downloadRequest = DownloadRequest(url, book.title) insert( - downloadRequester.enqueue(DownloadRequest(url)), - book = book + downloadRequester.enqueue(downloadRequest), + book = book, + filePath = downloadRequest.getDestinationFile(sharedPreferenceUtil).path ) } } diff --git a/core/src/main/java/org/kiwix/kiwixmobile/core/dao/entities/FetchDownloadEntity.kt b/core/src/main/java/org/kiwix/kiwixmobile/core/dao/entities/FetchDownloadEntity.kt index 12530caff2..a86ab66d5e 100644 --- a/core/src/main/java/org/kiwix/kiwixmobile/core/dao/entities/FetchDownloadEntity.kt +++ b/core/src/main/java/org/kiwix/kiwixmobile/core/dao/entities/FetchDownloadEntity.kt @@ -54,7 +54,8 @@ data class FetchDownloadEntity( val favIcon: String, val tags: String? = null ) { - constructor(downloadId: Long, book: Book) : this( + constructor(downloadId: Long, book: Book, file: String?) : this( + file = file, downloadId = downloadId, bookId = book.id, title = book.title, diff --git a/core/src/main/java/org/kiwix/kiwixmobile/core/di/modules/ApplicationModule.kt b/core/src/main/java/org/kiwix/kiwixmobile/core/di/modules/ApplicationModule.kt index 0fe67c567e..a9f6b7e0de 100644 --- a/core/src/main/java/org/kiwix/kiwixmobile/core/di/modules/ApplicationModule.kt +++ b/core/src/main/java/org/kiwix/kiwixmobile/core/di/modules/ApplicationModule.kt @@ -36,7 +36,7 @@ import org.kiwix.kiwixmobile.core.di.qualifiers.Computation import org.kiwix.kiwixmobile.core.di.qualifiers.IO import org.kiwix.kiwixmobile.core.di.qualifiers.MainThread import org.kiwix.kiwixmobile.core.downloader.DownloadMonitor -import org.kiwix.kiwixmobile.core.downloader.fetch.FetchDownloadMonitor +import org.kiwix.kiwixmobile.core.downloader.downloadManager.DownloadManagerMonitor import org.kiwix.kiwixmobile.core.reader.ZimFileReader import org.kiwix.kiwixmobile.core.utils.BookUtils import javax.inject.Singleton @@ -88,10 +88,15 @@ class ApplicationModule { @Provides fun provideComputationThread(): Scheduler = Schedulers.computation() + // @Provides + // @Singleton + // internal fun provideDownloadMonitor(fetchDownloadMonitor: FetchDownloadMonitor): DownloadMonitor = + // fetchDownloadMonitor + @Provides @Singleton - internal fun provideDownloadMonitor(fetchDownloadMonitor: FetchDownloadMonitor): DownloadMonitor = - fetchDownloadMonitor + internal fun provideDownloadMonitor(downloadManagerMonitor: DownloadManagerMonitor) + : DownloadMonitor = downloadManagerMonitor @Provides @Singleton diff --git a/core/src/main/java/org/kiwix/kiwixmobile/core/di/modules/CoreServiceModule.kt b/core/src/main/java/org/kiwix/kiwixmobile/core/di/modules/CoreServiceModule.kt index dc2b6b6e4e..c7dd8db3cf 100644 --- a/core/src/main/java/org/kiwix/kiwixmobile/core/di/modules/CoreServiceModule.kt +++ b/core/src/main/java/org/kiwix/kiwixmobile/core/di/modules/CoreServiceModule.kt @@ -25,6 +25,8 @@ import dagger.Module import dagger.Provides import org.kiwix.kiwixmobile.core.di.CoreServiceScope import org.kiwix.kiwixmobile.core.qr.GenerateQR +import org.kiwix.kiwixmobile.core.downloader.downloadManager.DownloadManagerBroadcastReceiver +import org.kiwix.kiwixmobile.core.downloader.downloadManager.DownloadManagerMonitor import org.kiwix.kiwixmobile.core.read_aloud.ReadAloudNotificationManger import org.kiwix.kiwixmobile.core.webserver.KiwixServer import org.kiwix.kiwixmobile.core.webserver.WebServerHelper @@ -75,4 +77,11 @@ class CoreServiceModule { @Provides @CoreServiceScope fun providesGenerateQr(): GenerateQR = GenerateQR() + fun providesDownloadManagerBroadcastReceiver(callback: DownloadManagerBroadcastReceiver.Callback) + : DownloadManagerBroadcastReceiver = DownloadManagerBroadcastReceiver(callback) + + @Provides + @CoreServiceScope + fun providesDownloadInformationCallback(downloadManagerMonitor: DownloadManagerMonitor) + : DownloadManagerBroadcastReceiver.Callback = downloadManagerMonitor } diff --git a/core/src/main/java/org/kiwix/kiwixmobile/core/di/modules/DatabaseModule.kt b/core/src/main/java/org/kiwix/kiwixmobile/core/di/modules/DatabaseModule.kt index c781829b65..d268420f17 100644 --- a/core/src/main/java/org/kiwix/kiwixmobile/core/di/modules/DatabaseModule.kt +++ b/core/src/main/java/org/kiwix/kiwixmobile/core/di/modules/DatabaseModule.kt @@ -32,6 +32,7 @@ import org.kiwix.kiwixmobile.core.dao.NewNoteDao import org.kiwix.kiwixmobile.core.dao.NewRecentSearchDao import org.kiwix.kiwixmobile.core.dao.entities.MyObjectBox import org.kiwix.kiwixmobile.core.data.KiwixRoomDatabase +import org.kiwix.kiwixmobile.core.utils.SharedPreferenceUtil import javax.inject.Singleton @Module @@ -71,9 +72,10 @@ open class DatabaseModule { @Provides @Singleton fun providesFetchDownloadDao( boxStore: BoxStore, - newBookDao: NewBookDao + newBookDao: NewBookDao, + sharedPreferenceUtil: SharedPreferenceUtil ): FetchDownloadDao = - FetchDownloadDao(boxStore.boxFor(), newBookDao) + FetchDownloadDao(boxStore.boxFor(), newBookDao, sharedPreferenceUtil) @Singleton @Provides 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 783fc8eeff..5f5a1a2c10 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 @@ -17,6 +17,7 @@ */ package org.kiwix.kiwixmobile.core.di.modules +import android.app.DownloadManager import android.content.Context import com.tonyodev.fetch2.Fetch import com.tonyodev.fetch2.Fetch.Impl @@ -33,8 +34,8 @@ import org.kiwix.kiwixmobile.core.data.remote.KiwixService import org.kiwix.kiwixmobile.core.downloader.DownloadRequester import org.kiwix.kiwixmobile.core.downloader.Downloader import org.kiwix.kiwixmobile.core.downloader.DownloaderImpl +import org.kiwix.kiwixmobile.core.downloader.downloadManager.DownloadManagerRequester 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 @@ -51,10 +52,10 @@ object DownloaderModule { kiwixService: KiwixService ): Downloader = DownloaderImpl(downloadRequester, downloadDao, kiwixService) - @Provides - @Singleton - fun providesDownloadRequester(fetch: Fetch, sharedPreferenceUtil: SharedPreferenceUtil): - DownloadRequester = FetchDownloadRequester(fetch, sharedPreferenceUtil) + // @Provides + // @Singleton + // fun providesDownloadRequester(fetch: Fetch, sharedPreferenceUtil: SharedPreferenceUtil): + // DownloadRequester = FetchDownloadRequester(fetch, sharedPreferenceUtil) @Provides @Singleton @@ -93,4 +94,16 @@ object DownloaderModule { @Singleton fun provideFetchDownloadNotificationManager(context: Context, fetchDownloadDao: FetchDownloadDao): FetchNotificationManager = FetchDownloadNotificationManager(context, fetchDownloadDao) + + @Provides + @Singleton + fun providesDownloadRequester( + downloadManager: DownloadManager, + sharedPreferenceUtil: SharedPreferenceUtil, + fetchDownloadDao: FetchDownloadDao + ): DownloadRequester = DownloadManagerRequester( + downloadManager, + sharedPreferenceUtil, + fetchDownloadDao + ) } diff --git a/core/src/main/java/org/kiwix/kiwixmobile/core/downloader/downloadManager/DownloadManagerBroadcastReceiver.kt b/core/src/main/java/org/kiwix/kiwixmobile/core/downloader/downloadManager/DownloadManagerBroadcastReceiver.kt new file mode 100644 index 0000000000..48cf414884 --- /dev/null +++ b/core/src/main/java/org/kiwix/kiwixmobile/core/downloader/downloadManager/DownloadManagerBroadcastReceiver.kt @@ -0,0 +1,38 @@ +/* + * Kiwix Android + * Copyright (c) 2024 Kiwix + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ + +package org.kiwix.kiwixmobile.core.downloader.downloadManager + +import android.app.DownloadManager.ACTION_DOWNLOAD_COMPLETE +import android.content.Context +import android.content.Intent +import org.kiwix.kiwixmobile.core.base.BaseBroadcastReceiver +import javax.inject.Inject + +class DownloadManagerBroadcastReceiver @Inject constructor(private val callback: Callback) : + BaseBroadcastReceiver() { + // This broadcast will trigger when a download is completed or cancelled. + override val action: String = ACTION_DOWNLOAD_COMPLETE + + override fun onIntentWithActionReceived(context: Context, intent: Intent) { + } + + interface Callback { + fun downloadInformation() + } +} 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 new file mode 100644 index 0000000000..9d53dbb27d --- /dev/null +++ b/core/src/main/java/org/kiwix/kiwixmobile/core/downloader/downloadManager/DownloadManagerMonitor.kt @@ -0,0 +1,47 @@ +/* + * Kiwix Android + * Copyright (c) 2024 Kiwix + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ + +package org.kiwix.kiwixmobile.core.downloader.downloadManager + +import android.app.DownloadManager +import io.reactivex.schedulers.Schedulers +import io.reactivex.subjects.PublishSubject +import org.kiwix.kiwixmobile.core.dao.FetchDownloadDao +import org.kiwix.kiwixmobile.core.downloader.DownloadMonitor +import javax.inject.Inject + +class DownloadManagerMonitor @Inject constructor( + private val downloadManager: DownloadManager, + private val fetchDownloadDao: FetchDownloadDao +) : + DownloadMonitor, DownloadManagerBroadcastReceiver.Callback { + private val updater = PublishSubject.create<() -> Unit>() + + override fun downloadInformation() {} + + init { + updater.subscribeOn(Schedulers.io()).observeOn(Schedulers.io()).subscribe( + { it.invoke() }, + Throwable::printStackTrace + ) + } + + override fun init() { + // empty method to so class does not get reported unused} + } +} diff --git a/core/src/main/java/org/kiwix/kiwixmobile/core/downloader/downloadManager/DownloadManagerRequester.kt b/core/src/main/java/org/kiwix/kiwixmobile/core/downloader/downloadManager/DownloadManagerRequester.kt new file mode 100644 index 0000000000..2e1cd15a1f --- /dev/null +++ b/core/src/main/java/org/kiwix/kiwixmobile/core/downloader/downloadManager/DownloadManagerRequester.kt @@ -0,0 +1,63 @@ +/* + * Kiwix Android + * Copyright (c) 2024 Kiwix + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ + +package org.kiwix.kiwixmobile.core.downloader.downloadManager + +import android.app.DownloadManager +import android.app.DownloadManager.Request +import android.net.Uri +import org.kiwix.kiwixmobile.core.dao.FetchDownloadDao +import org.kiwix.kiwixmobile.core.downloader.DownloadRequester +import org.kiwix.kiwixmobile.core.downloader.model.DownloadRequest +import org.kiwix.kiwixmobile.core.utils.SharedPreferenceUtil +import javax.inject.Inject + +class DownloadManagerRequester @Inject constructor( + private val downloadManager: DownloadManager, + private val sharedPreferenceUtil: SharedPreferenceUtil, + private val fetchDownloadDao: FetchDownloadDao +) : DownloadRequester { + override fun enqueue(downloadRequest: DownloadRequest): Long = + downloadManager.enqueue(downloadRequest.toDownloadManagerRequest(sharedPreferenceUtil)) + + override fun cancel(downloadId: Long) { + downloadManager.remove(downloadId).also { + fetchDownloadDao.delete(downloadId) + } + } + + override fun retryDownload(downloadId: Long) { + } + + override fun pauseResumeDownload(downloadId: Long, isPause: Boolean) { + } +} + +private fun DownloadRequest.toDownloadManagerRequest(sharedPreferenceUtil: SharedPreferenceUtil) = + DownloadManager.Request(uri).apply { + setDestinationUri(Uri.fromFile(getDestinationFile(sharedPreferenceUtil))) + setAllowedNetworkTypes( + if (sharedPreferenceUtil.prefWifiOnly) + Request.NETWORK_WIFI + else + Request.NETWORK_MOBILE + ) + setTitle(notificationTitle) + setAllowedOverMetered(true) + setNotificationVisibility(Request.VISIBILITY_VISIBLE_NOTIFY_COMPLETED) + } diff --git a/core/src/main/java/org/kiwix/kiwixmobile/core/downloader/fetch/FetchDownloadMonitor.kt b/core/src/main/java/org/kiwix/kiwixmobile/core/downloader/fetch/FetchDownloadMonitor.kt index eef4bf97d8..32db1a74b0 100644 --- a/core/src/main/java/org/kiwix/kiwixmobile/core/downloader/fetch/FetchDownloadMonitor.kt +++ b/core/src/main/java/org/kiwix/kiwixmobile/core/downloader/fetch/FetchDownloadMonitor.kt @@ -101,7 +101,7 @@ class FetchDownloadMonitor @Inject constructor(fetch: Fetch, fetchDownloadDao: F } private fun delete(download: Download) { - updater.onNext { fetchDownloadDao.delete(download) } + updater.onNext { fetchDownloadDao.delete(download.id.toLong()) } } } 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 13872f8e72..3da6946d07 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 @@ -55,7 +55,7 @@ class FetchDownloadRequester @Inject constructor( } private fun DownloadRequest.toFetchRequest(sharedPreferenceUtil: SharedPreferenceUtil) = - Request("$uri", getDestination(sharedPreferenceUtil)).apply { + Request("$uri", getDestinationFile(sharedPreferenceUtil).path).apply { networkType = if (sharedPreferenceUtil.prefWifiOnly) WIFI_ONLY else ALL autoRetryMaxAttempts = AUTO_RETRY_MAX_ATTEMPTS } diff --git a/core/src/main/java/org/kiwix/kiwixmobile/core/downloader/model/DownloadRequest.kt b/core/src/main/java/org/kiwix/kiwixmobile/core/downloader/model/DownloadRequest.kt index d060807334..9e91097141 100644 --- a/core/src/main/java/org/kiwix/kiwixmobile/core/downloader/model/DownloadRequest.kt +++ b/core/src/main/java/org/kiwix/kiwixmobile/core/downloader/model/DownloadRequest.kt @@ -18,13 +18,18 @@ package org.kiwix.kiwixmobile.core.downloader.model import android.net.Uri +import org.kiwix.kiwixmobile.core.extensions.isFileExist import org.kiwix.kiwixmobile.core.utils.SharedPreferenceUtil import org.kiwix.kiwixmobile.core.utils.StorageUtils +import java.io.File -data class DownloadRequest(val urlString: String) { +data class DownloadRequest(val urlString: String, val notificationTitle: String) { val uri: Uri get() = Uri.parse(urlString) - fun getDestination(sharedPreferenceUtil: SharedPreferenceUtil): String = - "${sharedPreferenceUtil.prefStorage}/Kiwix/${StorageUtils.getFileNameFromUrl(urlString)}" + fun getDestinationFile(sharedPreferenceUtil: SharedPreferenceUtil): File { + val file = + File("${sharedPreferenceUtil.prefStorage}/Kiwix/${StorageUtils.getFileNameFromUrl(urlString)}") + return file + } }