mirror of
https://github.com/kiwix/kiwix-android.git
synced 2025-08-03 18:56:44 -04:00
Removed the fetch library and its code from project.
* Fixed the Downloading for Authentication URL.
This commit is contained in:
parent
775fab14bc
commit
88d828e5ce
@ -329,8 +329,6 @@ object Libs {
|
|||||||
|
|
||||||
const val barista: String = "com.adevinta.android:barista:" + Versions.barista
|
const val barista: String = "com.adevinta.android:barista:" + Versions.barista
|
||||||
|
|
||||||
const val fetch: String = "com.github.tonyofrancis:fetch:" + Versions.fetch
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* https://github.com/ReactiveX/RxJava
|
* https://github.com/ReactiveX/RxJava
|
||||||
*/
|
*/
|
||||||
|
@ -94,8 +94,6 @@ object Versions {
|
|||||||
|
|
||||||
const val barista: String = "4.3.0"
|
const val barista: String = "4.3.0"
|
||||||
|
|
||||||
const val fetch: String = "3.1.6"
|
|
||||||
|
|
||||||
const val rxjava: String = "2.2.21"
|
const val rxjava: String = "2.2.21"
|
||||||
|
|
||||||
const val webkit: String = "1.7.0"
|
const val webkit: String = "1.7.0"
|
||||||
|
@ -201,7 +201,6 @@ class AllProjectConfigurer {
|
|||||||
implementation(Libs.collection_ktx)
|
implementation(Libs.collection_ktx)
|
||||||
implementation(Libs.butterknife)
|
implementation(Libs.butterknife)
|
||||||
kapt(Libs.butterknife_compiler)
|
kapt(Libs.butterknife_compiler)
|
||||||
implementation(Libs.fetch)
|
|
||||||
implementation(Libs.rxandroid)
|
implementation(Libs.rxandroid)
|
||||||
implementation(Libs.rxjava)
|
implementation(Libs.rxjava)
|
||||||
implementation(Libs.preference_ktx)
|
implementation(Libs.preference_ktx)
|
||||||
|
@ -248,120 +248,6 @@
|
|||||||
],
|
],
|
||||||
"relations": []
|
"relations": []
|
||||||
},
|
},
|
||||||
{
|
|
||||||
"id": "8:8093454424037540087",
|
|
||||||
"lastPropertyId": "24:4272820830206771469",
|
|
||||||
"name": "FetchDownloadEntity",
|
|
||||||
"properties": [
|
|
||||||
{
|
|
||||||
"id": "1:7366957113003324901",
|
|
||||||
"name": "id",
|
|
||||||
"type": 6,
|
|
||||||
"flags": 1
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"id": "3:3174500111130052488",
|
|
||||||
"name": "bookId",
|
|
||||||
"type": 9
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"id": "4:3949362784963767166",
|
|
||||||
"name": "title",
|
|
||||||
"type": 9
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"id": "5:812546090900770347",
|
|
||||||
"name": "description",
|
|
||||||
"type": 9
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"id": "6:3129463483413863468",
|
|
||||||
"name": "language",
|
|
||||||
"type": 9
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"id": "7:3402286918039853548",
|
|
||||||
"name": "creator",
|
|
||||||
"type": 9
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"id": "8:4732753967507809221",
|
|
||||||
"name": "publisher",
|
|
||||||
"type": 9
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"id": "9:3239042532048399134",
|
|
||||||
"name": "date",
|
|
||||||
"type": 9
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"id": "10:1136584919149973914",
|
|
||||||
"name": "url",
|
|
||||||
"type": 9
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"id": "11:4252749008345744598",
|
|
||||||
"name": "articleCount",
|
|
||||||
"type": 9
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"id": "12:8625493380854102341",
|
|
||||||
"name": "mediaCount",
|
|
||||||
"type": 9
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"id": "13:2787210837560254021",
|
|
||||||
"name": "size",
|
|
||||||
"type": 9
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"id": "14:2052022387195277817",
|
|
||||||
"name": "name",
|
|
||||||
"type": 9
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"id": "15:1976493094677983679",
|
|
||||||
"name": "favIcon",
|
|
||||||
"type": 9
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"id": "16:217454020763036675",
|
|
||||||
"name": "etaInMilliSeconds",
|
|
||||||
"type": 6
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"id": "17:1136630637198901642",
|
|
||||||
"name": "bytesDownloaded",
|
|
||||||
"type": 6
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"id": "18:8939019296899137627",
|
|
||||||
"name": "totalSizeOfDownload",
|
|
||||||
"type": 6
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"id": "21:5555873126720275555",
|
|
||||||
"name": "file",
|
|
||||||
"type": 9
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"id": "22:2724607601244650879",
|
|
||||||
"name": "downloadId",
|
|
||||||
"type": 6
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"id": "23:5485468735259326535",
|
|
||||||
"name": "progress",
|
|
||||||
"type": 5
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"id": "24:4272820830206771469",
|
|
||||||
"name": "tags",
|
|
||||||
"type": 9
|
|
||||||
}
|
|
||||||
],
|
|
||||||
"relations": []
|
|
||||||
},
|
|
||||||
{
|
{
|
||||||
"id": "10:3205842982118792800",
|
"id": "10:3205842982118792800",
|
||||||
"lastPropertyId": "9:5286545520416917562",
|
"lastPropertyId": "9:5286545520416917562",
|
||||||
@ -416,7 +302,8 @@
|
|||||||
"retiredEntityUids": [
|
"retiredEntityUids": [
|
||||||
349148274283701276,
|
349148274283701276,
|
||||||
7257718270326155947,
|
7257718270326155947,
|
||||||
7394649290555378565
|
7394649290555378565,
|
||||||
|
8093454424037540087
|
||||||
],
|
],
|
||||||
"retiredIndexUids": [
|
"retiredIndexUids": [
|
||||||
1293695782925933448,
|
1293695782925933448,
|
||||||
@ -470,7 +357,28 @@
|
|||||||
4335394620556092321,
|
4335394620556092321,
|
||||||
1899740026144478138,
|
1899740026144478138,
|
||||||
3378789699620971394,
|
3378789699620971394,
|
||||||
6867355950440828062
|
6867355950440828062,
|
||||||
|
7366957113003324901,
|
||||||
|
3174500111130052488,
|
||||||
|
3949362784963767166,
|
||||||
|
812546090900770347,
|
||||||
|
3129463483413863468,
|
||||||
|
3402286918039853548,
|
||||||
|
4732753967507809221,
|
||||||
|
3239042532048399134,
|
||||||
|
1136584919149973914,
|
||||||
|
4252749008345744598,
|
||||||
|
8625493380854102341,
|
||||||
|
2787210837560254021,
|
||||||
|
2052022387195277817,
|
||||||
|
1976493094677983679,
|
||||||
|
217454020763036675,
|
||||||
|
1136630637198901642,
|
||||||
|
8939019296899137627,
|
||||||
|
5555873126720275555,
|
||||||
|
2724607601244650879,
|
||||||
|
5485468735259326535,
|
||||||
|
4272820830206771469
|
||||||
],
|
],
|
||||||
"retiredRelationUids": [],
|
"retiredRelationUids": [],
|
||||||
"version": 1
|
"version": 1
|
||||||
|
@ -339,16 +339,6 @@
|
|||||||
"name": "totalSizeOfDownload",
|
"name": "totalSizeOfDownload",
|
||||||
"type": 6
|
"type": 6
|
||||||
},
|
},
|
||||||
{
|
|
||||||
"id": "19:3378789699620971394",
|
|
||||||
"name": "status",
|
|
||||||
"type": 5
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"id": "20:6867355950440828062",
|
|
||||||
"name": "error",
|
|
||||||
"type": 5
|
|
||||||
},
|
|
||||||
{
|
{
|
||||||
"id": "21:5555873126720275555",
|
"id": "21:5555873126720275555",
|
||||||
"name": "file",
|
"name": "file",
|
||||||
@ -478,7 +468,9 @@
|
|||||||
8819082642546094709,
|
8819082642546094709,
|
||||||
7233601933599801875,
|
7233601933599801875,
|
||||||
4335394620556092321,
|
4335394620556092321,
|
||||||
1899740026144478138
|
1899740026144478138,
|
||||||
|
3378789699620971394,
|
||||||
|
6867355950440828062
|
||||||
],
|
],
|
||||||
"retiredRelationUids": [],
|
"retiredRelationUids": [],
|
||||||
"version": 1
|
"version": 1
|
||||||
|
@ -1,107 +0,0 @@
|
|||||||
/*
|
|
||||||
* Kiwix Android
|
|
||||||
* Copyright (c) 2019 Kiwix <android.kiwix.org>
|
|
||||||
* 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 <http://www.gnu.org/licenses/>.
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
package org.kiwix.kiwixmobile.core.dao
|
|
||||||
|
|
||||||
import io.objectbox.Box
|
|
||||||
import org.kiwix.kiwixmobile.core.dao.entities.FetchDownloadEntity
|
|
||||||
import org.kiwix.kiwixmobile.core.entity.LibraryNetworkEntity.Book
|
|
||||||
import org.kiwix.kiwixmobile.core.utils.SharedPreferenceUtil
|
|
||||||
import javax.inject.Inject
|
|
||||||
|
|
||||||
class FetchDownloadDao @Inject constructor(
|
|
||||||
private val box: Box<FetchDownloadEntity>,
|
|
||||||
private val newBookDao: NewBookDao,
|
|
||||||
private val sharedPreferenceUtil: SharedPreferenceUtil
|
|
||||||
) {
|
|
||||||
|
|
||||||
// fun downloads(): Flowable<List<DownloadModel>> =
|
|
||||||
// box.asFlowable()
|
|
||||||
// .distinctUntilChanged()
|
|
||||||
// .doOnNext(::moveCompletedToBooksOnDiskDao)
|
|
||||||
// .map { it.map(::DownloadModel) }
|
|
||||||
|
|
||||||
// fun allDownloads() = Single.fromCallable { box.all.map(::DownloadModel) }
|
|
||||||
|
|
||||||
// private fun moveCompletedToBooksOnDiskDao(downloadEntities: List<FetchDownloadEntity>) {
|
|
||||||
// downloadEntities.filter { it.status == COMPLETED }.takeIf { it.isNotEmpty() }?.let {
|
|
||||||
// box.store.callInTx {
|
|
||||||
// box.remove(it)
|
|
||||||
// newBookDao.insert(it.map(::BookOnDisk))
|
|
||||||
// }
|
|
||||||
// }
|
|
||||||
// }
|
|
||||||
|
|
||||||
// fun update(download: Download) {
|
|
||||||
// box.store.callInTx {
|
|
||||||
// getEntityFor(download.id)?.let { dbEntity ->
|
|
||||||
// dbEntity.updateWith(download)
|
|
||||||
// .takeIf { updatedEntity -> updatedEntity != dbEntity }
|
|
||||||
// ?.let(box::put)
|
|
||||||
// }
|
|
||||||
// }
|
|
||||||
// }
|
|
||||||
|
|
||||||
// fun getEntityFor(downloadId: Int) =
|
|
||||||
// box.query {
|
|
||||||
// equal(FetchDownloadEntity_.downloadId, downloadId)
|
|
||||||
// }.find().getOrNull(0)
|
|
||||||
|
|
||||||
// fun getEntityForFileName(fileName: String) =
|
|
||||||
// box.query {
|
|
||||||
// endsWith(
|
|
||||||
// FetchDownloadEntity_.file, fileName,
|
|
||||||
// QueryBuilder.StringOrder.CASE_INSENSITIVE
|
|
||||||
// )
|
|
||||||
// }.findFirst()
|
|
||||||
|
|
||||||
fun insert(downloadId: Long, book: Book, filePath: String?) {
|
|
||||||
box.put(FetchDownloadEntity(downloadId, book, filePath))
|
|
||||||
}
|
|
||||||
|
|
||||||
// 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, downloadId)
|
|
||||||
// }.remove()
|
|
||||||
// }
|
|
||||||
|
|
||||||
// fun addIfDoesNotExist(
|
|
||||||
// url: String,
|
|
||||||
// book: Book,
|
|
||||||
// downloadRequester: DownloadRequester
|
|
||||||
// ) {
|
|
||||||
// box.store.callInTx {
|
|
||||||
// if (doesNotAlreadyExist(book)) {
|
|
||||||
// val downloadRequest = DownloadRequest(url, book.title)
|
|
||||||
// insert(
|
|
||||||
// downloadRequester.enqueue(downloadRequest),
|
|
||||||
// book = book,
|
|
||||||
// filePath = downloadRequest.getDestinationFile(sharedPreferenceUtil).path
|
|
||||||
// )
|
|
||||||
// }
|
|
||||||
// }
|
|
||||||
// }
|
|
||||||
|
|
||||||
// private fun doesNotAlreadyExist(book: Book) =
|
|
||||||
// box.query {
|
|
||||||
// equal(FetchDownloadEntity_.bookId, book.id, QueryBuilder.StringOrder.CASE_INSENSITIVE)
|
|
||||||
// }.count() == 0L
|
|
||||||
}
|
|
@ -1,98 +0,0 @@
|
|||||||
/*
|
|
||||||
* Kiwix Android
|
|
||||||
* Copyright (c) 2019 Kiwix <android.kiwix.org>
|
|
||||||
* 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 <http://www.gnu.org/licenses/>.
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
package org.kiwix.kiwixmobile.core.dao.entities
|
|
||||||
|
|
||||||
import com.tonyodev.fetch2.Download
|
|
||||||
import io.objectbox.annotation.Entity
|
|
||||||
import io.objectbox.annotation.Id
|
|
||||||
import org.kiwix.kiwixmobile.core.entity.LibraryNetworkEntity.Book
|
|
||||||
|
|
||||||
@Entity
|
|
||||||
data class FetchDownloadEntity(
|
|
||||||
@Id var id: Long = 0,
|
|
||||||
var downloadId: Long,
|
|
||||||
val file: String? = null,
|
|
||||||
val etaInMilliSeconds: Long = -1L,
|
|
||||||
val bytesDownloaded: Long = -1L,
|
|
||||||
val totalSizeOfDownload: Long = -1L,
|
|
||||||
// @Convert(converter = StatusConverter::class, dbType = Int::class)
|
|
||||||
// val status: Status = Status.NONE,
|
|
||||||
// @Convert(converter = ErrorConverter::class, dbType = Int::class)
|
|
||||||
// val error: Error = Error.NONE,
|
|
||||||
val progress: Int = -1,
|
|
||||||
val bookId: String,
|
|
||||||
val title: String,
|
|
||||||
val description: String?,
|
|
||||||
val language: String,
|
|
||||||
val creator: String,
|
|
||||||
val publisher: String,
|
|
||||||
val date: String,
|
|
||||||
val url: String?,
|
|
||||||
val articleCount: String?,
|
|
||||||
val mediaCount: String?,
|
|
||||||
val size: String,
|
|
||||||
val name: String?,
|
|
||||||
val favIcon: String,
|
|
||||||
val tags: String? = null
|
|
||||||
) {
|
|
||||||
constructor(downloadId: Long, book: Book, file: String?) : this(
|
|
||||||
file = file,
|
|
||||||
downloadId = downloadId,
|
|
||||||
bookId = book.id,
|
|
||||||
title = book.title,
|
|
||||||
description = book.description,
|
|
||||||
language = book.language,
|
|
||||||
creator = book.creator,
|
|
||||||
publisher = book.publisher,
|
|
||||||
date = book.date,
|
|
||||||
url = book.url,
|
|
||||||
articleCount = book.articleCount,
|
|
||||||
mediaCount = book.mediaCount,
|
|
||||||
size = book.size,
|
|
||||||
name = book.bookName,
|
|
||||||
favIcon = book.favicon,
|
|
||||||
tags = book.tags
|
|
||||||
)
|
|
||||||
|
|
||||||
fun toBook() = Book().apply {
|
|
||||||
id = bookId
|
|
||||||
title = this@FetchDownloadEntity.title
|
|
||||||
description = this@FetchDownloadEntity.description
|
|
||||||
language = this@FetchDownloadEntity.language
|
|
||||||
creator = this@FetchDownloadEntity.creator
|
|
||||||
publisher = this@FetchDownloadEntity.publisher
|
|
||||||
date = this@FetchDownloadEntity.date
|
|
||||||
url = this@FetchDownloadEntity.url
|
|
||||||
articleCount = this@FetchDownloadEntity.articleCount
|
|
||||||
mediaCount = this@FetchDownloadEntity.mediaCount
|
|
||||||
size = this@FetchDownloadEntity.size
|
|
||||||
bookName = name
|
|
||||||
favicon = favIcon
|
|
||||||
tags = this@FetchDownloadEntity.tags
|
|
||||||
}
|
|
||||||
|
|
||||||
fun updateWith(download: Download) = copy(
|
|
||||||
file = download.file,
|
|
||||||
etaInMilliSeconds = download.etaInMilliSeconds,
|
|
||||||
bytesDownloaded = download.downloaded,
|
|
||||||
totalSizeOfDownload = download.total,
|
|
||||||
// status = download.status,
|
|
||||||
// error = download.error,
|
|
||||||
progress = download.progress
|
|
||||||
)
|
|
||||||
}
|
|
@ -30,7 +30,6 @@ import kotlinx.coroutines.sync.Mutex
|
|||||||
import org.kiwix.kiwixmobile.core.CoreApp
|
import org.kiwix.kiwixmobile.core.CoreApp
|
||||||
import org.kiwix.kiwixmobile.core.StorageObserver
|
import org.kiwix.kiwixmobile.core.StorageObserver
|
||||||
import org.kiwix.kiwixmobile.core.dao.DownloadRoomDao
|
import org.kiwix.kiwixmobile.core.dao.DownloadRoomDao
|
||||||
import org.kiwix.kiwixmobile.core.dao.FetchDownloadDao
|
|
||||||
import org.kiwix.kiwixmobile.core.dao.HistoryDao
|
import org.kiwix.kiwixmobile.core.dao.HistoryDao
|
||||||
import org.kiwix.kiwixmobile.core.dao.HistoryRoomDao
|
import org.kiwix.kiwixmobile.core.dao.HistoryRoomDao
|
||||||
import org.kiwix.kiwixmobile.core.dao.LibkiwixBookmarks
|
import org.kiwix.kiwixmobile.core.dao.LibkiwixBookmarks
|
||||||
@ -97,7 +96,6 @@ interface CoreComponent {
|
|||||||
fun application(): Application
|
fun application(): Application
|
||||||
fun bookUtils(): BookUtils
|
fun bookUtils(): BookUtils
|
||||||
fun dataSource(): DataSource
|
fun dataSource(): DataSource
|
||||||
fun fetchDownloadDao(): FetchDownloadDao
|
|
||||||
fun newBookDao(): NewBookDao
|
fun newBookDao(): NewBookDao
|
||||||
fun historyDao(): HistoryDao
|
fun historyDao(): HistoryDao
|
||||||
fun noteDao(): NewNoteDao
|
fun noteDao(): NewNoteDao
|
||||||
|
@ -22,7 +22,6 @@ import dagger.Module
|
|||||||
import dagger.Provides
|
import dagger.Provides
|
||||||
import io.objectbox.BoxStore
|
import io.objectbox.BoxStore
|
||||||
import io.objectbox.kotlin.boxFor
|
import io.objectbox.kotlin.boxFor
|
||||||
import org.kiwix.kiwixmobile.core.dao.FetchDownloadDao
|
|
||||||
import org.kiwix.kiwixmobile.core.dao.FlowBuilder
|
import org.kiwix.kiwixmobile.core.dao.FlowBuilder
|
||||||
import org.kiwix.kiwixmobile.core.dao.HistoryDao
|
import org.kiwix.kiwixmobile.core.dao.HistoryDao
|
||||||
import org.kiwix.kiwixmobile.core.dao.NewBookDao
|
import org.kiwix.kiwixmobile.core.dao.NewBookDao
|
||||||
@ -32,7 +31,6 @@ import org.kiwix.kiwixmobile.core.dao.NewNoteDao
|
|||||||
import org.kiwix.kiwixmobile.core.dao.NewRecentSearchDao
|
import org.kiwix.kiwixmobile.core.dao.NewRecentSearchDao
|
||||||
import org.kiwix.kiwixmobile.core.dao.entities.MyObjectBox
|
import org.kiwix.kiwixmobile.core.dao.entities.MyObjectBox
|
||||||
import org.kiwix.kiwixmobile.core.data.KiwixRoomDatabase
|
import org.kiwix.kiwixmobile.core.data.KiwixRoomDatabase
|
||||||
import org.kiwix.kiwixmobile.core.utils.SharedPreferenceUtil
|
|
||||||
import javax.inject.Singleton
|
import javax.inject.Singleton
|
||||||
|
|
||||||
@Module
|
@Module
|
||||||
@ -70,13 +68,6 @@ open class DatabaseModule {
|
|||||||
flowBuilder: FlowBuilder
|
flowBuilder: FlowBuilder
|
||||||
): NewRecentSearchDao = NewRecentSearchDao(boxStore.boxFor(), flowBuilder)
|
): NewRecentSearchDao = NewRecentSearchDao(boxStore.boxFor(), flowBuilder)
|
||||||
|
|
||||||
@Provides @Singleton fun providesFetchDownloadDao(
|
|
||||||
boxStore: BoxStore,
|
|
||||||
newBookDao: NewBookDao,
|
|
||||||
sharedPreferenceUtil: SharedPreferenceUtil
|
|
||||||
): FetchDownloadDao =
|
|
||||||
FetchDownloadDao(boxStore.boxFor(), newBookDao, sharedPreferenceUtil)
|
|
||||||
|
|
||||||
@Singleton
|
@Singleton
|
||||||
@Provides
|
@Provides
|
||||||
fun provideYourDatabase(
|
fun provideYourDatabase(
|
||||||
|
@ -20,18 +20,9 @@ package org.kiwix.kiwixmobile.core.di.modules
|
|||||||
import android.app.DownloadManager
|
import android.app.DownloadManager
|
||||||
import android.app.NotificationManager
|
import android.app.NotificationManager
|
||||||
import android.content.Context
|
import android.content.Context
|
||||||
import com.tonyodev.fetch2.Fetch
|
|
||||||
import com.tonyodev.fetch2.Fetch.Impl
|
|
||||||
import com.tonyodev.fetch2.FetchConfiguration
|
|
||||||
import com.tonyodev.fetch2.FetchNotificationManager
|
|
||||||
import com.tonyodev.fetch2okhttp.OkHttpDownloader
|
|
||||||
import dagger.Module
|
import dagger.Module
|
||||||
import dagger.Provides
|
import dagger.Provides
|
||||||
import okhttp3.OkHttpClient
|
|
||||||
import org.kiwix.kiwixmobile.core.BuildConfig
|
|
||||||
import org.kiwix.kiwixmobile.core.dao.DownloadRoomDao
|
import org.kiwix.kiwixmobile.core.dao.DownloadRoomDao
|
||||||
import org.kiwix.kiwixmobile.core.dao.FetchDownloadDao
|
|
||||||
import org.kiwix.kiwixmobile.core.data.remote.BasicAuthInterceptor
|
|
||||||
import org.kiwix.kiwixmobile.core.data.remote.KiwixService
|
import org.kiwix.kiwixmobile.core.data.remote.KiwixService
|
||||||
import org.kiwix.kiwixmobile.core.downloader.DownloadRequester
|
import org.kiwix.kiwixmobile.core.downloader.DownloadRequester
|
||||||
import org.kiwix.kiwixmobile.core.downloader.Downloader
|
import org.kiwix.kiwixmobile.core.downloader.Downloader
|
||||||
@ -41,11 +32,7 @@ import org.kiwix.kiwixmobile.core.downloader.downloadManager.DownloadManagerMoni
|
|||||||
import org.kiwix.kiwixmobile.core.downloader.downloadManager.DownloadManagerRequester
|
import org.kiwix.kiwixmobile.core.downloader.downloadManager.DownloadManagerRequester
|
||||||
import org.kiwix.kiwixmobile.core.downloader.downloadManager.DownloadNotificationActionsBroadcastReceiver
|
import org.kiwix.kiwixmobile.core.downloader.downloadManager.DownloadNotificationActionsBroadcastReceiver
|
||||||
import org.kiwix.kiwixmobile.core.downloader.downloadManager.DownloadNotificationManager
|
import org.kiwix.kiwixmobile.core.downloader.downloadManager.DownloadNotificationManager
|
||||||
import org.kiwix.kiwixmobile.core.downloader.fetch.FetchDownloadNotificationManager
|
|
||||||
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 org.kiwix.kiwixmobile.core.utils.SharedPreferenceUtil
|
||||||
import java.util.concurrent.TimeUnit
|
|
||||||
import javax.inject.Singleton
|
import javax.inject.Singleton
|
||||||
|
|
||||||
@Module
|
@Module
|
||||||
@ -60,49 +47,6 @@ object DownloaderModule {
|
|||||||
): Downloader =
|
): Downloader =
|
||||||
DownloaderImpl(downloadRequester, downloadRoomDao, kiwixService, sharedPreferenceUtil)
|
DownloaderImpl(downloadRequester, downloadRoomDao, kiwixService, sharedPreferenceUtil)
|
||||||
|
|
||||||
// @Provides
|
|
||||||
// @Singleton
|
|
||||||
// fun providesDownloadRequester(fetch: Fetch, sharedPreferenceUtil: SharedPreferenceUtil):
|
|
||||||
// DownloadRequester = FetchDownloadRequester(fetch, sharedPreferenceUtil)
|
|
||||||
|
|
||||||
@Provides
|
|
||||||
@Singleton
|
|
||||||
fun provideFetch(fetchConfiguration: FetchConfiguration): Fetch =
|
|
||||||
Fetch.getInstance(fetchConfiguration)
|
|
||||||
|
|
||||||
@Provides
|
|
||||||
@Singleton
|
|
||||||
fun provideFetchConfiguration(
|
|
||||||
context: Context,
|
|
||||||
okHttpDownloader: OkHttpDownloader,
|
|
||||||
fetchNotificationManager: FetchNotificationManager
|
|
||||||
): FetchConfiguration =
|
|
||||||
FetchConfiguration.Builder(context).apply {
|
|
||||||
setDownloadConcurrentLimit(5)
|
|
||||||
enableLogging(BuildConfig.DEBUG)
|
|
||||||
enableRetryOnNetworkGain(true)
|
|
||||||
setHttpDownloader(okHttpDownloader)
|
|
||||||
preAllocateFileOnCreation(false)
|
|
||||||
setNotificationManager(fetchNotificationManager)
|
|
||||||
}.build().also(Impl::setDefaultInstanceConfiguration)
|
|
||||||
|
|
||||||
@Provides
|
|
||||||
@Singleton
|
|
||||||
fun provideOkHttpDownloader() = OkHttpDownloader(
|
|
||||||
OkHttpClient.Builder()
|
|
||||||
.connectTimeout(CONNECT_TIME_OUT, TimeUnit.MINUTES)
|
|
||||||
.readTimeout(READ_TIME_OUT, TimeUnit.MINUTES)
|
|
||||||
.addInterceptor(BasicAuthInterceptor())
|
|
||||||
.followRedirects(true)
|
|
||||||
.followSslRedirects(true)
|
|
||||||
.build()
|
|
||||||
)
|
|
||||||
|
|
||||||
@Provides
|
|
||||||
@Singleton
|
|
||||||
fun provideFetchDownloadNotificationManager(context: Context, fetchDownloadDao: FetchDownloadDao):
|
|
||||||
FetchNotificationManager = FetchDownloadNotificationManager(context, fetchDownloadDao)
|
|
||||||
|
|
||||||
@Provides
|
@Provides
|
||||||
@Singleton
|
@Singleton
|
||||||
fun providesDownloadRequester(
|
fun providesDownloadRequester(
|
||||||
|
@ -22,9 +22,13 @@ import android.app.DownloadManager
|
|||||||
import android.app.DownloadManager.Request
|
import android.app.DownloadManager.Request
|
||||||
import android.app.DownloadManager.Request.VISIBILITY_HIDDEN
|
import android.app.DownloadManager.Request.VISIBILITY_HIDDEN
|
||||||
import android.net.Uri
|
import android.net.Uri
|
||||||
|
import androidx.core.net.toUri
|
||||||
import kotlinx.coroutines.CoroutineScope
|
import kotlinx.coroutines.CoroutineScope
|
||||||
import kotlinx.coroutines.Dispatchers
|
import kotlinx.coroutines.Dispatchers
|
||||||
import kotlinx.coroutines.launch
|
import kotlinx.coroutines.launch
|
||||||
|
import org.kiwix.kiwixmobile.core.data.remote.isAuthenticationUrl
|
||||||
|
import org.kiwix.kiwixmobile.core.data.remote.removeAuthenticationFromUrl
|
||||||
|
import org.kiwix.kiwixmobile.core.data.remote.secretKey
|
||||||
import org.kiwix.kiwixmobile.core.downloader.DownloadRequester
|
import org.kiwix.kiwixmobile.core.downloader.DownloadRequester
|
||||||
import org.kiwix.kiwixmobile.core.downloader.model.DownloadRequest
|
import org.kiwix.kiwixmobile.core.downloader.model.DownloadRequest
|
||||||
import org.kiwix.kiwixmobile.core.utils.SharedPreferenceUtil
|
import org.kiwix.kiwixmobile.core.utils.SharedPreferenceUtil
|
||||||
@ -89,15 +93,37 @@ class DownloadManagerRequester @Inject constructor(
|
|||||||
|
|
||||||
fun DownloadRequest.toDownloadManagerRequest(
|
fun DownloadRequest.toDownloadManagerRequest(
|
||||||
sharedPreferenceUtil: SharedPreferenceUtil
|
sharedPreferenceUtil: SharedPreferenceUtil
|
||||||
) =
|
): DownloadManager.Request {
|
||||||
DownloadManager.Request(uri).apply {
|
return if (urlString.isAuthenticationUrl) {
|
||||||
setDestinationUri(Uri.fromFile(getDestinationFile(sharedPreferenceUtil)))
|
// return the request with "Authorization" header if the url is a Authentication url.
|
||||||
setAllowedNetworkTypes(
|
DownloadManager.Request(urlString.removeAuthenticationFromUrl.toUri()).apply {
|
||||||
if (sharedPreferenceUtil.prefWifiOnly)
|
setDestinationUri(Uri.fromFile(getDestinationFile(sharedPreferenceUtil)))
|
||||||
Request.NETWORK_WIFI
|
setAllowedNetworkTypes(
|
||||||
else
|
if (sharedPreferenceUtil.prefWifiOnly)
|
||||||
Request.NETWORK_MOBILE
|
Request.NETWORK_WIFI
|
||||||
)
|
else
|
||||||
setAllowedOverMetered(true)
|
Request.NETWORK_MOBILE
|
||||||
setNotificationVisibility(VISIBILITY_HIDDEN) // hide the default notification.
|
)
|
||||||
|
setAllowedOverMetered(true)
|
||||||
|
setNotificationVisibility(VISIBILITY_HIDDEN) // hide the default notification.
|
||||||
|
val userNameAndPassword = System.getenv(urlString.secretKey) ?: ""
|
||||||
|
val userName = userNameAndPassword.substringBefore(":", "")
|
||||||
|
val password = userNameAndPassword.substringAfter(":", "")
|
||||||
|
val credentials = okhttp3.Credentials.basic(userName, password)
|
||||||
|
addRequestHeader("Authorization", credentials)
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
// return the request for normal urls.
|
||||||
|
DownloadManager.Request(uri).apply {
|
||||||
|
setDestinationUri(Uri.fromFile(getDestinationFile(sharedPreferenceUtil)))
|
||||||
|
setAllowedNetworkTypes(
|
||||||
|
if (sharedPreferenceUtil.prefWifiOnly)
|
||||||
|
Request.NETWORK_WIFI
|
||||||
|
else
|
||||||
|
Request.NETWORK_MOBILE
|
||||||
|
)
|
||||||
|
setAllowedOverMetered(true)
|
||||||
|
setNotificationVisibility(VISIBILITY_HIDDEN) // hide the default notification.
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
@ -1,119 +0,0 @@
|
|||||||
/*
|
|
||||||
* Kiwix Android
|
|
||||||
* Copyright (c) 2019 Kiwix <android.kiwix.org>
|
|
||||||
* 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 <http://www.gnu.org/licenses/>.
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
package org.kiwix.kiwixmobile.core.downloader.fetch
|
|
||||||
|
|
||||||
import android.annotation.SuppressLint
|
|
||||||
import com.tonyodev.fetch2.Download
|
|
||||||
import com.tonyodev.fetch2.Error
|
|
||||||
import com.tonyodev.fetch2.Fetch
|
|
||||||
import com.tonyodev.fetch2.FetchListener
|
|
||||||
import com.tonyodev.fetch2core.DownloadBlock
|
|
||||||
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
|
|
||||||
|
|
||||||
@SuppressLint("CheckResult")
|
|
||||||
class FetchDownloadMonitor @Inject constructor(fetch: Fetch, fetchDownloadDao: FetchDownloadDao) :
|
|
||||||
DownloadMonitor {
|
|
||||||
private val updater = PublishSubject.create<() -> Unit>()
|
|
||||||
private val fetchListener = object : FetchListener {
|
|
||||||
override fun onAdded(download: Download) {}
|
|
||||||
|
|
||||||
override fun onCancelled(download: Download) {
|
|
||||||
delete(download)
|
|
||||||
}
|
|
||||||
|
|
||||||
override fun onCompleted(download: Download) {
|
|
||||||
update(download)
|
|
||||||
}
|
|
||||||
|
|
||||||
override fun onDeleted(download: Download) {
|
|
||||||
delete(download)
|
|
||||||
}
|
|
||||||
|
|
||||||
override fun onDownloadBlockUpdated(
|
|
||||||
download: Download,
|
|
||||||
downloadBlock: DownloadBlock,
|
|
||||||
totalBlocks: Int
|
|
||||||
) {
|
|
||||||
update(download)
|
|
||||||
}
|
|
||||||
|
|
||||||
override fun onError(download: Download, error: Error, throwable: Throwable?) {
|
|
||||||
update(download)
|
|
||||||
}
|
|
||||||
|
|
||||||
override fun onPaused(download: Download) {
|
|
||||||
update(download)
|
|
||||||
}
|
|
||||||
|
|
||||||
override fun onProgress(
|
|
||||||
download: Download,
|
|
||||||
etaInMilliSeconds: Long,
|
|
||||||
downloadedBytesPerSecond: Long
|
|
||||||
) {
|
|
||||||
update(download)
|
|
||||||
}
|
|
||||||
|
|
||||||
override fun onQueued(download: Download, waitingOnNetwork: Boolean) {
|
|
||||||
update(download)
|
|
||||||
}
|
|
||||||
|
|
||||||
override fun onRemoved(download: Download) {
|
|
||||||
delete(download)
|
|
||||||
}
|
|
||||||
|
|
||||||
override fun onResumed(download: Download) {
|
|
||||||
update(download)
|
|
||||||
}
|
|
||||||
|
|
||||||
override fun onStarted(
|
|
||||||
download: Download,
|
|
||||||
downloadBlocks: List<DownloadBlock>,
|
|
||||||
totalBlocks: Int
|
|
||||||
) {
|
|
||||||
update(download)
|
|
||||||
}
|
|
||||||
|
|
||||||
override fun onWaitingNetwork(download: Download) {
|
|
||||||
update(download)
|
|
||||||
}
|
|
||||||
|
|
||||||
private fun update(download: Download) {
|
|
||||||
// updater.onNext { fetchDownloadDao.update(download) }
|
|
||||||
}
|
|
||||||
|
|
||||||
private fun delete(download: Download) {
|
|
||||||
// updater.onNext { download.delete(download.id.toLong()) }
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
init {
|
|
||||||
fetch.addListener(fetchListener, true)
|
|
||||||
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
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,193 +0,0 @@
|
|||||||
/*
|
|
||||||
* Kiwix Android
|
|
||||||
* Copyright (c) 2019 Kiwix <android.kiwix.org>
|
|
||||||
* 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 <http://www.gnu.org/licenses/>.
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
package org.kiwix.kiwixmobile.core.downloader.fetch
|
|
||||||
|
|
||||||
import android.annotation.SuppressLint
|
|
||||||
import android.app.NotificationChannel
|
|
||||||
import android.app.NotificationManager
|
|
||||||
import android.app.PendingIntent
|
|
||||||
import android.app.PendingIntent.FLAG_IMMUTABLE
|
|
||||||
import android.app.PendingIntent.FLAG_UPDATE_CURRENT
|
|
||||||
import android.app.PendingIntent.getActivity
|
|
||||||
import android.content.Context
|
|
||||||
import android.content.Intent
|
|
||||||
import android.os.Build
|
|
||||||
import android.os.Build.VERSION_CODES
|
|
||||||
import androidx.annotation.RequiresApi
|
|
||||||
import androidx.core.app.NotificationCompat
|
|
||||||
import com.tonyodev.fetch2.ACTION_TYPE_CANCEL
|
|
||||||
import com.tonyodev.fetch2.ACTION_TYPE_DELETE
|
|
||||||
import com.tonyodev.fetch2.ACTION_TYPE_INVALID
|
|
||||||
import com.tonyodev.fetch2.ACTION_TYPE_PAUSE
|
|
||||||
import com.tonyodev.fetch2.ACTION_TYPE_RESUME
|
|
||||||
import com.tonyodev.fetch2.ACTION_TYPE_RETRY
|
|
||||||
import com.tonyodev.fetch2.DefaultFetchNotificationManager
|
|
||||||
import com.tonyodev.fetch2.DownloadNotification
|
|
||||||
import com.tonyodev.fetch2.EXTRA_ACTION_TYPE
|
|
||||||
import com.tonyodev.fetch2.EXTRA_DOWNLOAD_ID
|
|
||||||
import com.tonyodev.fetch2.EXTRA_GROUP_ACTION
|
|
||||||
import com.tonyodev.fetch2.EXTRA_NAMESPACE
|
|
||||||
import com.tonyodev.fetch2.EXTRA_NOTIFICATION_GROUP_ID
|
|
||||||
import com.tonyodev.fetch2.EXTRA_NOTIFICATION_ID
|
|
||||||
import com.tonyodev.fetch2.Fetch
|
|
||||||
import com.tonyodev.fetch2.util.DEFAULT_NOTIFICATION_TIMEOUT_AFTER_RESET
|
|
||||||
import org.kiwix.kiwixmobile.core.Intents
|
|
||||||
import org.kiwix.kiwixmobile.core.R
|
|
||||||
import org.kiwix.kiwixmobile.core.R.string
|
|
||||||
import org.kiwix.kiwixmobile.core.dao.FetchDownloadDao
|
|
||||||
import org.kiwix.kiwixmobile.core.downloader.downloadManager.DOWNLOAD_NOTIFICATION_TITLE
|
|
||||||
import org.kiwix.kiwixmobile.core.main.CoreMainActivity
|
|
||||||
|
|
||||||
class FetchDownloadNotificationManager(
|
|
||||||
private val context: Context,
|
|
||||||
private val fetchDownloadDao: FetchDownloadDao
|
|
||||||
) :
|
|
||||||
DefaultFetchNotificationManager(context) {
|
|
||||||
override fun getFetchInstanceForNamespace(namespace: String) = Fetch.getDefaultInstance()
|
|
||||||
|
|
||||||
override fun createNotificationChannels(
|
|
||||||
context: Context,
|
|
||||||
notificationManager: NotificationManager
|
|
||||||
) {
|
|
||||||
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
|
|
||||||
val channelId = context.getString(R.string.fetch_notification_default_channel_id)
|
|
||||||
if (notificationManager.getNotificationChannel(channelId) == null) {
|
|
||||||
notificationManager.createNotificationChannel(createChannel(channelId, context))
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
override fun updateNotification(
|
|
||||||
notificationBuilder: NotificationCompat.Builder,
|
|
||||||
downloadNotification: DownloadNotification,
|
|
||||||
context: Context
|
|
||||||
) {
|
|
||||||
// super method but with pause button removed
|
|
||||||
val smallIcon = if (downloadNotification.isDownloading) {
|
|
||||||
android.R.drawable.stat_sys_download
|
|
||||||
} else {
|
|
||||||
android.R.drawable.stat_sys_download_done
|
|
||||||
}
|
|
||||||
val notificationTitle = downloadNotification.title
|
|
||||||
notificationBuilder.setPriority(NotificationCompat.PRIORITY_DEFAULT)
|
|
||||||
.setSmallIcon(smallIcon)
|
|
||||||
.setContentTitle(notificationTitle)
|
|
||||||
.setContentText(getSubtitleText(context, downloadNotification))
|
|
||||||
.setOngoing(downloadNotification.isOnGoingNotification)
|
|
||||||
.setGroup(downloadNotification.groupId.toString())
|
|
||||||
.setGroupSummary(false)
|
|
||||||
if (downloadNotification.isFailed || downloadNotification.isCompleted) {
|
|
||||||
notificationBuilder.setProgress(0, 0, false)
|
|
||||||
} else {
|
|
||||||
val progressIndeterminate = downloadNotification.progressIndeterminate
|
|
||||||
val maxProgress = if (downloadNotification.progressIndeterminate) 0 else 100
|
|
||||||
val progress = if (downloadNotification.progress < 0) 0 else downloadNotification.progress
|
|
||||||
notificationBuilder.setProgress(maxProgress, progress, progressIndeterminate)
|
|
||||||
}
|
|
||||||
when {
|
|
||||||
downloadNotification.isDownloading ->
|
|
||||||
notificationBuilder.setTimeoutAfter(getNotificationTimeOutMillis())
|
|
||||||
.addAction(
|
|
||||||
R.drawable.fetch_notification_cancel,
|
|
||||||
context.getString(R.string.cancel),
|
|
||||||
getActionPendingIntent(downloadNotification, DownloadNotification.ActionType.DELETE)
|
|
||||||
).addAction(
|
|
||||||
R.drawable.fetch_notification_pause,
|
|
||||||
context.getString(R.string.tts_pause),
|
|
||||||
getActionPendingIntent(downloadNotification, DownloadNotification.ActionType.PAUSE)
|
|
||||||
)
|
|
||||||
|
|
||||||
downloadNotification.isPaused ->
|
|
||||||
notificationBuilder.setTimeoutAfter(getNotificationTimeOutMillis())
|
|
||||||
.addAction(
|
|
||||||
R.drawable.fetch_notification_resume,
|
|
||||||
context.getString(R.string.tts_resume),
|
|
||||||
getActionPendingIntent(downloadNotification, DownloadNotification.ActionType.RESUME)
|
|
||||||
)
|
|
||||||
.addAction(
|
|
||||||
R.drawable.fetch_notification_cancel,
|
|
||||||
context.getString(R.string.cancel),
|
|
||||||
getActionPendingIntent(downloadNotification, DownloadNotification.ActionType.DELETE)
|
|
||||||
)
|
|
||||||
|
|
||||||
downloadNotification.isQueued ->
|
|
||||||
notificationBuilder.setTimeoutAfter(getNotificationTimeOutMillis())
|
|
||||||
|
|
||||||
else -> notificationBuilder.setTimeoutAfter(DEFAULT_NOTIFICATION_TIMEOUT_AFTER_RESET)
|
|
||||||
}
|
|
||||||
notificationCustomisation(downloadNotification, notificationBuilder, context)
|
|
||||||
}
|
|
||||||
|
|
||||||
override fun getActionPendingIntent(
|
|
||||||
downloadNotification: DownloadNotification,
|
|
||||||
actionType: DownloadNotification.ActionType
|
|
||||||
): PendingIntent {
|
|
||||||
val intent = Intent(notificationManagerAction).apply {
|
|
||||||
putExtra(EXTRA_NAMESPACE, downloadNotification.namespace)
|
|
||||||
putExtra(EXTRA_DOWNLOAD_ID, downloadNotification.notificationId)
|
|
||||||
putExtra(EXTRA_NOTIFICATION_ID, downloadNotification.notificationId)
|
|
||||||
putExtra(EXTRA_GROUP_ACTION, false)
|
|
||||||
putExtra(EXTRA_NOTIFICATION_GROUP_ID, downloadNotification.groupId)
|
|
||||||
}
|
|
||||||
val action = when (actionType) {
|
|
||||||
DownloadNotification.ActionType.CANCEL -> ACTION_TYPE_CANCEL
|
|
||||||
DownloadNotification.ActionType.DELETE -> ACTION_TYPE_DELETE
|
|
||||||
DownloadNotification.ActionType.RESUME -> ACTION_TYPE_RESUME
|
|
||||||
DownloadNotification.ActionType.PAUSE -> ACTION_TYPE_PAUSE
|
|
||||||
DownloadNotification.ActionType.RETRY -> ACTION_TYPE_RETRY
|
|
||||||
else -> ACTION_TYPE_INVALID
|
|
||||||
}
|
|
||||||
intent.putExtra(EXTRA_ACTION_TYPE, action)
|
|
||||||
val flags = PendingIntent.FLAG_IMMUTABLE or PendingIntent.FLAG_UPDATE_CURRENT
|
|
||||||
return PendingIntent.getBroadcast(
|
|
||||||
context,
|
|
||||||
downloadNotification.notificationId + action,
|
|
||||||
intent,
|
|
||||||
flags
|
|
||||||
)
|
|
||||||
}
|
|
||||||
|
|
||||||
@SuppressLint("UnspecifiedImmutableFlag")
|
|
||||||
private fun notificationCustomisation(
|
|
||||||
downloadNotification: DownloadNotification,
|
|
||||||
notificationBuilder: NotificationCompat.Builder,
|
|
||||||
context: Context
|
|
||||||
) {
|
|
||||||
if (downloadNotification.isCompleted) {
|
|
||||||
val internal = Intents.internal(CoreMainActivity::class.java).apply {
|
|
||||||
addFlags(Intent.FLAG_ACTIVITY_NEW_TASK)
|
|
||||||
putExtra(DOWNLOAD_NOTIFICATION_TITLE, downloadNotification.title)
|
|
||||||
}
|
|
||||||
val pendingIntent =
|
|
||||||
getActivity(context, 0, internal, FLAG_IMMUTABLE or FLAG_UPDATE_CURRENT)
|
|
||||||
notificationBuilder.setContentIntent(pendingIntent)
|
|
||||||
notificationBuilder.setAutoCancel(true)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@RequiresApi(VERSION_CODES.O)
|
|
||||||
private fun createChannel(channelId: String, context: Context) =
|
|
||||||
NotificationChannel(
|
|
||||||
channelId,
|
|
||||||
context.getString(string.fetch_notification_default_channel_name),
|
|
||||||
NotificationManager.IMPORTANCE_DEFAULT
|
|
||||||
).apply {
|
|
||||||
setSound(null, null)
|
|
||||||
enableVibration(false)
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,65 +0,0 @@
|
|||||||
/*
|
|
||||||
* Kiwix Android
|
|
||||||
* Copyright (c) 2019 Kiwix <android.kiwix.org>
|
|
||||||
* 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 <http://www.gnu.org/licenses/>.
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
package org.kiwix.kiwixmobile.core.downloader.fetch
|
|
||||||
|
|
||||||
import com.tonyodev.fetch2.Fetch
|
|
||||||
import com.tonyodev.fetch2.NetworkType.ALL
|
|
||||||
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
|
|
||||||
|
|
||||||
class FetchDownloadRequester @Inject constructor(
|
|
||||||
private val fetch: Fetch,
|
|
||||||
private val sharedPreferenceUtil: SharedPreferenceUtil
|
|
||||||
) : DownloadRequester {
|
|
||||||
|
|
||||||
override fun enqueue(downloadRequest: DownloadRequest): Long {
|
|
||||||
val request = downloadRequest.toFetchRequest(sharedPreferenceUtil)
|
|
||||||
fetch.enqueue(request)
|
|
||||||
return request.id.toLong()
|
|
||||||
}
|
|
||||||
|
|
||||||
override fun cancel(downloadId: Long) {
|
|
||||||
fetch.delete(downloadId.toInt())
|
|
||||||
}
|
|
||||||
|
|
||||||
override fun retryDownload(downloadId: Long) {
|
|
||||||
fetch.retry(downloadId.toInt())
|
|
||||||
}
|
|
||||||
|
|
||||||
override fun pauseResumeDownload(downloadId: Long, isPause: Boolean) {
|
|
||||||
if (isPause)
|
|
||||||
fetch.resume(downloadId.toInt())
|
|
||||||
else
|
|
||||||
fetch.pause(downloadId.toInt())
|
|
||||||
}
|
|
||||||
|
|
||||||
override fun onDownloadAdded() {
|
|
||||||
// empty function
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private fun DownloadRequest.toFetchRequest(sharedPreferenceUtil: SharedPreferenceUtil) =
|
|
||||||
Request("$uri", getDestinationFile(sharedPreferenceUtil).path).apply {
|
|
||||||
networkType = if (sharedPreferenceUtil.prefWifiOnly) WIFI_ONLY else ALL
|
|
||||||
autoRetryMaxAttempts = AUTO_RETRY_MAX_ATTEMPTS
|
|
||||||
}
|
|
Loading…
x
Reference in New Issue
Block a user