DownloadWorker: Use OkHttpClient for downloading files as well
Signed-off-by: Aayush Gupta <aayushgupta219@gmail.com>
This commit is contained in:
@@ -198,6 +198,14 @@ object OkHttpClient : IProxyHttpClient {
|
|||||||
return processRequest(request)
|
return processRequest(request)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fun call(url: String, headers: Map<String, String> = emptyMap()): Response {
|
||||||
|
val request = Request.Builder()
|
||||||
|
.url(url)
|
||||||
|
.headers(headers.toHeaders())
|
||||||
|
.build()
|
||||||
|
return okHttpClient.newCall(request).execute()
|
||||||
|
}
|
||||||
|
|
||||||
private fun processRequest(request: Request): PlayResponse {
|
private fun processRequest(request: Request): PlayResponse {
|
||||||
// Reset response code as flow doesn't sends the same value twice
|
// Reset response code as flow doesn't sends the same value twice
|
||||||
_responseCode.value = 0
|
_responseCode.value = 0
|
||||||
|
|||||||
@@ -23,9 +23,9 @@ import com.aurora.store.data.installer.AppInstaller
|
|||||||
import com.aurora.store.data.model.Algorithm
|
import com.aurora.store.data.model.Algorithm
|
||||||
import com.aurora.store.data.model.DownloadInfo
|
import com.aurora.store.data.model.DownloadInfo
|
||||||
import com.aurora.store.data.model.DownloadStatus
|
import com.aurora.store.data.model.DownloadStatus
|
||||||
import com.aurora.store.data.model.ProxyInfo
|
|
||||||
import com.aurora.store.data.model.Request
|
import com.aurora.store.data.model.Request
|
||||||
import com.aurora.store.data.network.IProxyHttpClient
|
import com.aurora.store.data.network.IProxyHttpClient
|
||||||
|
import com.aurora.store.data.network.OkHttpClient
|
||||||
import com.aurora.store.data.providers.AuthProvider
|
import com.aurora.store.data.providers.AuthProvider
|
||||||
import com.aurora.store.data.room.download.Download
|
import com.aurora.store.data.room.download.Download
|
||||||
import com.aurora.store.data.room.download.DownloadDao
|
import com.aurora.store.data.room.download.DownloadDao
|
||||||
@@ -33,9 +33,6 @@ import com.aurora.store.util.CertUtil
|
|||||||
import com.aurora.store.util.DownloadWorkerUtil
|
import com.aurora.store.util.DownloadWorkerUtil
|
||||||
import com.aurora.store.util.NotificationUtil
|
import com.aurora.store.util.NotificationUtil
|
||||||
import com.aurora.store.util.PathUtil
|
import com.aurora.store.util.PathUtil
|
||||||
import com.aurora.store.util.Preferences
|
|
||||||
import com.aurora.store.util.Preferences.PREFERENCE_PROXY_ENABLED
|
|
||||||
import com.aurora.store.util.Preferences.PREFERENCE_PROXY_INFO
|
|
||||||
import com.google.gson.Gson
|
import com.google.gson.Gson
|
||||||
import dagger.assisted.Assisted
|
import dagger.assisted.Assisted
|
||||||
import dagger.assisted.AssistedInject
|
import dagger.assisted.AssistedInject
|
||||||
@@ -45,14 +42,9 @@ import kotlinx.coroutines.delay
|
|||||||
import kotlinx.coroutines.withContext
|
import kotlinx.coroutines.withContext
|
||||||
import java.io.File
|
import java.io.File
|
||||||
import java.io.FileOutputStream
|
import java.io.FileOutputStream
|
||||||
import java.net.Authenticator
|
|
||||||
import java.net.InetSocketAddress
|
|
||||||
import java.net.PasswordAuthentication
|
|
||||||
import java.net.Proxy
|
|
||||||
import java.net.URL
|
import java.net.URL
|
||||||
import java.security.DigestInputStream
|
import java.security.DigestInputStream
|
||||||
import java.security.MessageDigest
|
import java.security.MessageDigest
|
||||||
import javax.net.ssl.HttpsURLConnection
|
|
||||||
import kotlin.properties.Delegates
|
import kotlin.properties.Delegates
|
||||||
import com.aurora.gplayapi.data.models.File as GPlayFile
|
import com.aurora.gplayapi.data.models.File as GPlayFile
|
||||||
|
|
||||||
@@ -77,8 +69,6 @@ class DownloadWorker @AssistedInject constructor(
|
|||||||
private lateinit var icon: Bitmap
|
private lateinit var icon: Bitmap
|
||||||
private lateinit var purchaseHelper: PurchaseHelper
|
private lateinit var purchaseHelper: PurchaseHelper
|
||||||
|
|
||||||
private val proxy: Proxy? = getProxy()
|
|
||||||
|
|
||||||
private val NOTIFICATION_ID = 200
|
private val NOTIFICATION_ID = 200
|
||||||
|
|
||||||
private var downloading = false
|
private var downloading = false
|
||||||
@@ -280,19 +270,17 @@ class DownloadWorker @AssistedInject constructor(
|
|||||||
|
|
||||||
try {
|
try {
|
||||||
val isNewFile = request.file.createNewFile()
|
val isNewFile = request.file.createNewFile()
|
||||||
val connection = if (proxy != null) {
|
|
||||||
URL(request.url).openConnection(proxy) as HttpsURLConnection
|
val okHttpClient = httpClient as OkHttpClient
|
||||||
} else {
|
val headers = mutableMapOf<String, String>()
|
||||||
URL(request.url).openConnection() as HttpsURLConnection
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!isNewFile) {
|
if (!isNewFile) {
|
||||||
Log.i(TAG, "${request.file} has an unfinished download, resuming!")
|
Log.i(TAG, "${request.file} has an unfinished download, resuming!")
|
||||||
downloadedBytes += request.file.length()
|
downloadedBytes += request.file.length()
|
||||||
connection.setRequestProperty("Range", "bytes=${request.file.length()}-")
|
headers["Range"] = "bytes=${request.file.length()}-"
|
||||||
}
|
}
|
||||||
|
|
||||||
connection.inputStream.use { input ->
|
okHttpClient.call(request.url, headers).body?.byteStream()?.use { input ->
|
||||||
FileOutputStream(request.file, !isNewFile).use {
|
FileOutputStream(request.file, !isNewFile).use {
|
||||||
input.copyTo(it, request.size).collect { p -> onProgress(p) }
|
input.copyTo(it, request.size).collect { p -> onProgress(p) }
|
||||||
}
|
}
|
||||||
@@ -414,37 +402,4 @@ class DownloadWorker @AssistedInject constructor(
|
|||||||
return@withContext sha == expectedSha
|
return@withContext sha == expectedSha
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* Gets the current [Proxy] configuration.
|
|
||||||
* @return An instance of [Proxy] if configured by the user, null otherwise
|
|
||||||
*/
|
|
||||||
private fun getProxy(): Proxy? {
|
|
||||||
val proxyEnabled = Preferences.getBoolean(appContext, PREFERENCE_PROXY_ENABLED)
|
|
||||||
val proxyInfoString = Preferences.getString(appContext, PREFERENCE_PROXY_INFO)
|
|
||||||
|
|
||||||
if (proxyEnabled && proxyInfoString.isNotBlank() && proxyInfoString != "{}") {
|
|
||||||
val proxyInfo = gson.fromJson(proxyInfoString, ProxyInfo::class.java)
|
|
||||||
|
|
||||||
val proxy = Proxy(
|
|
||||||
if (proxyInfo.protocol == "SOCKS") Proxy.Type.SOCKS else Proxy.Type.HTTP,
|
|
||||||
InetSocketAddress.createUnresolved(proxyInfo.host, proxyInfo.port)
|
|
||||||
)
|
|
||||||
|
|
||||||
val proxyUser = proxyInfo.proxyUser
|
|
||||||
val proxyPassword = proxyInfo.proxyPassword
|
|
||||||
|
|
||||||
if (!proxyUser.isNullOrBlank() && !proxyPassword.isNullOrBlank()) {
|
|
||||||
Authenticator.setDefault(object : Authenticator() {
|
|
||||||
override fun getPasswordAuthentication(): PasswordAuthentication {
|
|
||||||
return PasswordAuthentication(proxyUser, proxyPassword.toCharArray())
|
|
||||||
}
|
|
||||||
})
|
|
||||||
}
|
|
||||||
return proxy
|
|
||||||
} else {
|
|
||||||
Log.i(TAG, "Proxy is disabled")
|
|
||||||
return null
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user