DownloadWorker: Download files using proxy when exists

Signed-off-by: Aayush Gupta <aayushgupta219@gmail.com>
This commit is contained in:
Aayush Gupta
2024-03-07 00:16:16 +05:30
parent 717cb29a04
commit 2a41baf69d

View File

@@ -22,6 +22,7 @@ import com.aurora.gplayapi.helpers.PurchaseHelper
import com.aurora.store.data.installer.AppInstaller
import com.aurora.store.data.model.DownloadInfo
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.network.HttpClient
import com.aurora.store.data.providers.AuthProvider
@@ -31,21 +32,30 @@ import com.aurora.store.util.CertUtil
import com.aurora.store.util.DownloadWorkerUtil
import com.aurora.store.util.NotificationUtil
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 dagger.assisted.Assisted
import dagger.assisted.AssistedInject
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.NonCancellable
import kotlinx.coroutines.delay
import kotlinx.coroutines.flow.collectLatest
import kotlinx.coroutines.withContext
import java.io.File
import java.net.Authenticator
import java.net.InetSocketAddress
import java.net.PasswordAuthentication
import java.net.Proxy
import java.net.URL
import java.security.DigestInputStream
import java.security.MessageDigest
import kotlinx.coroutines.NonCancellable
import javax.net.ssl.HttpsURLConnection
import kotlin.properties.Delegates
import com.aurora.gplayapi.data.models.File as GPlayFile
@HiltWorker
class DownloadWorker @AssistedInject constructor(
private val downloadDao: DownloadDao,
@@ -60,6 +70,8 @@ class DownloadWorker @AssistedInject constructor(
private lateinit var icon: Bitmap
private lateinit var purchaseHelper: PurchaseHelper
private val proxy: Proxy? = getProxy()
private val NOTIFICATION_ID = 200
private var downloading = false
@@ -236,11 +248,18 @@ class DownloadWorker @AssistedInject constructor(
}
try {
requestFile.createNewFile()
val algorithm = if (request.sha256.isBlank()) "SHA-1" else "SHA-256"
val messageDigest = MessageDigest.getInstance(algorithm)
requestFile.createNewFile()
DigestInputStream(URL(request.url).openStream(), messageDigest).use { input ->
val inputStream = if (proxy != null) {
(URL(request.url).openConnection(proxy) as HttpsURLConnection).inputStream
} else {
URL(request.url).openStream()
}
DigestInputStream(inputStream, messageDigest).use { input ->
requestFile.outputStream().use {
input.copyTo(it, request.size).collectLatest { p -> onProgress(p) }
}
@@ -350,4 +369,33 @@ class DownloadWorker @AssistedInject constructor(
}
}
}
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
}
}
}