network: Cleanup logic and move required instances to separate modules
Signed-off-by: Aayush Gupta <aayushgupta219@gmail.com>
This commit is contained in:
@@ -19,41 +19,159 @@
|
||||
|
||||
package com.aurora.store.data.network
|
||||
|
||||
import android.content.Context
|
||||
import android.util.Log
|
||||
import com.aurora.store.data.model.ProxyInfo
|
||||
import com.aurora.store.util.Preferences
|
||||
import com.google.gson.Gson
|
||||
import dagger.Module
|
||||
import dagger.Provides
|
||||
import dagger.hilt.InstallIn
|
||||
import dagger.hilt.android.qualifiers.ApplicationContext
|
||||
import dagger.hilt.components.SingletonComponent
|
||||
import com.aurora.gplayapi.data.models.PlayResponse
|
||||
import com.aurora.gplayapi.network.IHttpClient
|
||||
import com.aurora.store.BuildConfig
|
||||
import java.io.IOException
|
||||
import javax.inject.Inject
|
||||
import javax.inject.Singleton
|
||||
import kotlinx.coroutines.flow.MutableStateFlow
|
||||
import kotlinx.coroutines.flow.StateFlow
|
||||
import kotlinx.coroutines.flow.asStateFlow
|
||||
import okhttp3.OkHttpClient
|
||||
import okhttp3.Headers.Companion.toHeaders
|
||||
import okhttp3.HttpUrl
|
||||
import okhttp3.HttpUrl.Companion.toHttpUrl
|
||||
import okhttp3.MediaType.Companion.toMediaType
|
||||
import okhttp3.Request
|
||||
import okhttp3.RequestBody
|
||||
import okhttp3.RequestBody.Companion.toRequestBody
|
||||
import okhttp3.Response
|
||||
|
||||
@Module
|
||||
@InstallIn(SingletonComponent::class)
|
||||
object HttpClient {
|
||||
@Singleton
|
||||
class HttpClient @Inject constructor(private val okHttpClient: OkHttpClient): IHttpClient {
|
||||
|
||||
private const val TAG = "HttpClient"
|
||||
private val TAG = HttpClient::class.java.simpleName
|
||||
|
||||
@Provides
|
||||
@Singleton
|
||||
fun getPreferredClient(@ApplicationContext context: Context, gson: Gson): IProxyHttpClient {
|
||||
val proxyEnabled = Preferences.getBoolean(context, Preferences.PREFERENCE_PROXY_ENABLED)
|
||||
val proxyInfoString = Preferences.getString(context, Preferences.PREFERENCE_PROXY_INFO)
|
||||
private val POST = "POST"
|
||||
private val GET = "GET"
|
||||
|
||||
val okHttpClient = OkHttpClient.builder(context)
|
||||
if (proxyEnabled && proxyInfoString.isNotBlank() && proxyInfoString != "{}") {
|
||||
val proxyInfo = gson.fromJson(proxyInfoString, ProxyInfo::class.java)
|
||||
if (proxyInfo != null) {
|
||||
OkHttpClient.setProxy(proxyInfo)
|
||||
} else {
|
||||
Log.e(TAG, "Proxy info is unavailable, using default client")
|
||||
}
|
||||
} else {
|
||||
Log.i(TAG, "Proxy is disabled")
|
||||
private val _responseCode = MutableStateFlow(100)
|
||||
override val responseCode: StateFlow<Int>
|
||||
get() = _responseCode.asStateFlow()
|
||||
|
||||
@Throws(IOException::class)
|
||||
fun post(url: String, headers: Map<String, String>, requestBody: RequestBody): PlayResponse {
|
||||
val request = Request.Builder()
|
||||
.url(url)
|
||||
.headers(headers.toHeaders())
|
||||
.method(POST, requestBody)
|
||||
.build()
|
||||
return processRequest(request)
|
||||
}
|
||||
|
||||
@Throws(IOException::class)
|
||||
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()
|
||||
}
|
||||
|
||||
@Throws(IOException::class)
|
||||
override fun post(
|
||||
url: String,
|
||||
headers: Map<String, String>,
|
||||
params: Map<String, String>
|
||||
): PlayResponse {
|
||||
val request = Request.Builder()
|
||||
.url(buildUrl(url, params))
|
||||
.headers(headers.toHeaders())
|
||||
.method(POST, "".toRequestBody(null))
|
||||
.build()
|
||||
return processRequest(request)
|
||||
}
|
||||
|
||||
override fun postAuth(url: String, body: ByteArray): PlayResponse {
|
||||
val requestBody = body.toRequestBody("application/json".toMediaType(), 0, body.size)
|
||||
val request = Request.Builder()
|
||||
.url(url)
|
||||
.header(
|
||||
"User-Agent",
|
||||
"${BuildConfig.APPLICATION_ID}-${BuildConfig.VERSION_NAME}-${BuildConfig.VERSION_CODE}"
|
||||
)
|
||||
.method(POST, requestBody)
|
||||
.build()
|
||||
return processRequest(request)
|
||||
}
|
||||
|
||||
@Throws(IOException::class)
|
||||
override fun post(url: String, headers: Map<String, String>, body: ByteArray): PlayResponse {
|
||||
return post(url, headers, body.toRequestBody())
|
||||
}
|
||||
|
||||
@Throws(IOException::class)
|
||||
override fun get(url: String, headers: Map<String, String>): PlayResponse {
|
||||
return get(url, headers, mapOf())
|
||||
}
|
||||
|
||||
@Throws(IOException::class)
|
||||
override fun get(
|
||||
url: String,
|
||||
headers: Map<String, String>,
|
||||
params: Map<String, String>
|
||||
): PlayResponse {
|
||||
val request = Request.Builder()
|
||||
.url(buildUrl(url, params))
|
||||
.headers(headers.toHeaders())
|
||||
.method(GET, null)
|
||||
.build()
|
||||
return processRequest(request)
|
||||
}
|
||||
|
||||
override fun getAuth(url: String): PlayResponse {
|
||||
val request = Request.Builder()
|
||||
.url(url)
|
||||
.header(
|
||||
"User-Agent",
|
||||
"${BuildConfig.APPLICATION_ID}-${BuildConfig.VERSION_NAME}-${BuildConfig.VERSION_CODE}"
|
||||
)
|
||||
.method(GET, null)
|
||||
.build()
|
||||
return processRequest(request)
|
||||
}
|
||||
|
||||
@Throws(IOException::class)
|
||||
override fun get(
|
||||
url: String,
|
||||
headers: Map<String, String>,
|
||||
paramString: String
|
||||
): PlayResponse {
|
||||
val request = Request.Builder()
|
||||
.url(url + paramString)
|
||||
.headers(headers.toHeaders())
|
||||
.method(GET, null)
|
||||
.build()
|
||||
return processRequest(request)
|
||||
}
|
||||
|
||||
private fun processRequest(request: Request): PlayResponse {
|
||||
// Reset response code as flow doesn't sends the same value twice
|
||||
_responseCode.value = 0
|
||||
|
||||
val call = okHttpClient.newCall(request)
|
||||
return buildPlayResponse(call.execute())
|
||||
}
|
||||
|
||||
private fun buildUrl(url: String, params: Map<String, String>): HttpUrl {
|
||||
val urlBuilder = url.toHttpUrl().newBuilder()
|
||||
params.forEach {
|
||||
urlBuilder.addQueryParameter(it.key, it.value)
|
||||
}
|
||||
return urlBuilder.build()
|
||||
}
|
||||
|
||||
private fun buildPlayResponse(response: Response): PlayResponse {
|
||||
return PlayResponse(
|
||||
isSuccessful = response.isSuccessful,
|
||||
code = response.code,
|
||||
responseBytes = response.body?.bytes() ?: byteArrayOf(),
|
||||
errorString = if (!response.isSuccessful) response.message else String()
|
||||
).also {
|
||||
_responseCode.value = response.code
|
||||
Log.i(TAG, "OKHTTP [${response.code}] ${response.request.url}")
|
||||
}
|
||||
return okHttpClient.build()
|
||||
}
|
||||
}
|
||||
|
||||
@@ -0,0 +1,19 @@
|
||||
package com.aurora.store.data.network
|
||||
|
||||
import com.aurora.gplayapi.network.IHttpClient
|
||||
import dagger.Module
|
||||
import dagger.Provides
|
||||
import dagger.hilt.InstallIn
|
||||
import dagger.hilt.components.SingletonComponent
|
||||
import javax.inject.Singleton
|
||||
|
||||
@Module
|
||||
@InstallIn(SingletonComponent::class)
|
||||
object IHttpClientModule {
|
||||
|
||||
@Provides
|
||||
@Singleton
|
||||
fun providesIHttpClientInstance(httpClient: HttpClient): IHttpClient {
|
||||
return httpClient
|
||||
}
|
||||
}
|
||||
@@ -1,9 +0,0 @@
|
||||
package com.aurora.store.data.network
|
||||
|
||||
import com.aurora.gplayapi.network.IHttpClient
|
||||
import com.aurora.store.data.model.ProxyInfo
|
||||
|
||||
interface IProxyHttpClient : IHttpClient {
|
||||
@Throws(UnsupportedOperationException::class)
|
||||
fun setProxy(proxyInfo: ProxyInfo): IHttpClient
|
||||
}
|
||||
@@ -1,236 +0,0 @@
|
||||
/*
|
||||
* Aurora Store
|
||||
* Copyright (C) 2021, Rahul Kumar Patel <whyorean@gmail.com>
|
||||
*
|
||||
* Aurora Store 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 2 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* Aurora Store 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 Aurora Store. If not, see <http://www.gnu.org/licenses/>.
|
||||
*
|
||||
*/
|
||||
|
||||
package com.aurora.store.data.network
|
||||
|
||||
import android.content.Context
|
||||
import android.util.Log
|
||||
import com.aurora.gplayapi.data.models.PlayResponse
|
||||
import com.aurora.store.BuildConfig
|
||||
import com.aurora.store.data.model.ProxyInfo
|
||||
import com.aurora.store.util.CertUtil
|
||||
import kotlinx.coroutines.flow.MutableStateFlow
|
||||
import kotlinx.coroutines.flow.StateFlow
|
||||
import kotlinx.coroutines.flow.asStateFlow
|
||||
import okhttp3.*
|
||||
import okhttp3.Headers.Companion.toHeaders
|
||||
import okhttp3.HttpUrl.Companion.toHttpUrl
|
||||
import okhttp3.MediaType.Companion.toMediaType
|
||||
import okhttp3.RequestBody.Companion.toRequestBody
|
||||
import java.io.IOException
|
||||
import java.net.InetSocketAddress
|
||||
import java.net.Proxy
|
||||
import java.util.concurrent.TimeUnit
|
||||
|
||||
object OkHttpClient : IProxyHttpClient {
|
||||
|
||||
private const val TAG = "OkHttpClient"
|
||||
|
||||
private const val POST = "POST"
|
||||
private const val GET = "GET"
|
||||
|
||||
private val _responseCode = MutableStateFlow(100)
|
||||
override val responseCode: StateFlow<Int>
|
||||
get() = _responseCode.asStateFlow()
|
||||
|
||||
private lateinit var okHttpClient: okhttp3.OkHttpClient
|
||||
private val okHttpClientBuilder = OkHttpClient().newBuilder()
|
||||
.connectTimeout(25, TimeUnit.SECONDS)
|
||||
.readTimeout(25, TimeUnit.SECONDS)
|
||||
.writeTimeout(25, TimeUnit.SECONDS)
|
||||
.retryOnConnectionFailure(true)
|
||||
.followRedirects(true)
|
||||
.followSslRedirects(true)
|
||||
|
||||
fun builder(context: Context): OkHttpClient {
|
||||
setupSSLPinning(context)
|
||||
return this
|
||||
}
|
||||
|
||||
fun build(): OkHttpClient {
|
||||
okHttpClient = okHttpClientBuilder.build()
|
||||
return this
|
||||
}
|
||||
|
||||
override fun setProxy(proxyInfo: ProxyInfo): OkHttpClient {
|
||||
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()) {
|
||||
okHttpClientBuilder.proxyAuthenticator { _, response ->
|
||||
if (response.request.header("Proxy-Authorization") != null) {
|
||||
return@proxyAuthenticator null
|
||||
}
|
||||
|
||||
val credential = Credentials.basic(proxyUser, proxyPassword)
|
||||
response.request
|
||||
.newBuilder()
|
||||
.header("Proxy-Authorization", credential)
|
||||
.build()
|
||||
}
|
||||
}
|
||||
|
||||
okHttpClientBuilder.proxy(proxy)
|
||||
return this
|
||||
}
|
||||
|
||||
private fun setupSSLPinning(context: Context) {
|
||||
// Google needs special handling, see: https://pki.goog/faq/#faq-27
|
||||
val googleRootCerts = CertUtil.getGoogleRootCertHashes(context).map { "sha256/$it" }
|
||||
.toTypedArray()
|
||||
|
||||
val certificatePinner = CertificatePinner.Builder()
|
||||
.add("*.googleapis.com", *googleRootCerts)
|
||||
.add("*.google.com", *googleRootCerts)
|
||||
.add("auroraoss.com", "sha256/mEflZT5enoR1FuXLgYYGqnVEoZvmf9c2bVBpiOjYQ0c=") // GTS Root R4
|
||||
.add("*.exodus-privacy.eu.org", "sha256/C5+lpZ7tcVwmwQIMcRtPbsQtWLABXhQzejna0wHFr8M=") // ISRG Root X1
|
||||
.add("gitlab.com", "sha256/x4QzPSC810K5/cMjb05Qm4k3Bw5zBn4lTdO/nEW/Td4=") // USERTrust RSA Certification Authority
|
||||
.build()
|
||||
|
||||
okHttpClientBuilder.certificatePinner(certificatePinner)
|
||||
}
|
||||
|
||||
@Throws(IOException::class)
|
||||
fun post(url: String, headers: Map<String, String>, requestBody: RequestBody): PlayResponse {
|
||||
val request = Request.Builder()
|
||||
.url(url)
|
||||
.headers(headers.toHeaders())
|
||||
.method(POST, requestBody)
|
||||
.build()
|
||||
return processRequest(request)
|
||||
}
|
||||
|
||||
@Throws(IOException::class)
|
||||
override fun post(
|
||||
url: String,
|
||||
headers: Map<String, String>,
|
||||
params: Map<String, String>
|
||||
): PlayResponse {
|
||||
val request = Request.Builder()
|
||||
.url(buildUrl(url, params))
|
||||
.headers(headers.toHeaders())
|
||||
.method(POST, "".toRequestBody(null))
|
||||
.build()
|
||||
return processRequest(request)
|
||||
}
|
||||
|
||||
override fun postAuth(url: String, body: ByteArray): PlayResponse {
|
||||
val requestBody = body.toRequestBody("application/json".toMediaType(), 0, body.size)
|
||||
val request = Request.Builder()
|
||||
.url(url)
|
||||
.header(
|
||||
"User-Agent",
|
||||
"${BuildConfig.APPLICATION_ID}-${BuildConfig.VERSION_NAME}-${BuildConfig.VERSION_CODE}"
|
||||
)
|
||||
.method(POST, requestBody)
|
||||
.build()
|
||||
return processRequest(request)
|
||||
}
|
||||
|
||||
@Throws(IOException::class)
|
||||
override fun post(url: String, headers: Map<String, String>, body: ByteArray): PlayResponse {
|
||||
return post(url, headers, body.toRequestBody())
|
||||
}
|
||||
|
||||
@Throws(IOException::class)
|
||||
override fun get(url: String, headers: Map<String, String>): PlayResponse {
|
||||
return get(url, headers, mapOf())
|
||||
}
|
||||
|
||||
@Throws(IOException::class)
|
||||
override fun get(
|
||||
url: String,
|
||||
headers: Map<String, String>,
|
||||
params: Map<String, String>
|
||||
): PlayResponse {
|
||||
val request = Request.Builder()
|
||||
.url(buildUrl(url, params))
|
||||
.headers(headers.toHeaders())
|
||||
.method(GET, null)
|
||||
.build()
|
||||
return processRequest(request)
|
||||
}
|
||||
|
||||
override fun getAuth(url: String): PlayResponse {
|
||||
val request = Request.Builder()
|
||||
.url(url)
|
||||
.header(
|
||||
"User-Agent",
|
||||
"${BuildConfig.APPLICATION_ID}-${BuildConfig.VERSION_NAME}-${BuildConfig.VERSION_CODE}"
|
||||
)
|
||||
.method(GET, null)
|
||||
.build()
|
||||
return processRequest(request)
|
||||
}
|
||||
|
||||
@Throws(IOException::class)
|
||||
override fun get(
|
||||
url: String,
|
||||
headers: Map<String, String>,
|
||||
paramString: String
|
||||
): PlayResponse {
|
||||
val request = Request.Builder()
|
||||
.url(url + paramString)
|
||||
.headers(headers.toHeaders())
|
||||
.method(GET, null)
|
||||
.build()
|
||||
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 {
|
||||
// Reset response code as flow doesn't sends the same value twice
|
||||
_responseCode.value = 0
|
||||
|
||||
val call = okHttpClient.newCall(request)
|
||||
return buildPlayResponse(call.execute())
|
||||
}
|
||||
|
||||
private fun buildUrl(url: String, params: Map<String, String>): HttpUrl {
|
||||
val urlBuilder = url.toHttpUrl().newBuilder()
|
||||
params.forEach {
|
||||
urlBuilder.addQueryParameter(it.key, it.value)
|
||||
}
|
||||
return urlBuilder.build()
|
||||
}
|
||||
|
||||
private fun buildPlayResponse(response: Response): PlayResponse {
|
||||
return PlayResponse(
|
||||
isSuccessful = response.isSuccessful,
|
||||
code = response.code,
|
||||
responseBytes = response.body?.bytes() ?: byteArrayOf(),
|
||||
errorString = if (!response.isSuccessful) response.message else String()
|
||||
).also {
|
||||
_responseCode.value = response.code
|
||||
Log.i(TAG, "OKHTTP [${response.code}] ${response.request.url}")
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,111 @@
|
||||
/*
|
||||
* Aurora Store
|
||||
* Copyright (C) 2021, Rahul Kumar Patel <whyorean@gmail.com>
|
||||
*
|
||||
* Aurora Store 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 2 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* Aurora Store 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 Aurora Store. If not, see <http://www.gnu.org/licenses/>.
|
||||
*
|
||||
*/
|
||||
|
||||
package com.aurora.store.data.network
|
||||
|
||||
import android.content.Context
|
||||
import android.util.Log
|
||||
import com.aurora.store.data.model.ProxyInfo
|
||||
import com.aurora.store.util.CertUtil
|
||||
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.Module
|
||||
import dagger.Provides
|
||||
import dagger.hilt.InstallIn
|
||||
import dagger.hilt.android.qualifiers.ApplicationContext
|
||||
import dagger.hilt.components.SingletonComponent
|
||||
import java.net.Authenticator
|
||||
import java.net.InetSocketAddress
|
||||
import java.net.PasswordAuthentication
|
||||
import java.net.Proxy
|
||||
import java.util.concurrent.TimeUnit
|
||||
import javax.inject.Singleton
|
||||
import okhttp3.CertificatePinner
|
||||
import okhttp3.OkHttpClient
|
||||
|
||||
@Module
|
||||
@InstallIn(SingletonComponent::class)
|
||||
object OkHttpClientModule {
|
||||
|
||||
private const val TAG = "HttpClient"
|
||||
|
||||
@Provides
|
||||
@Singleton
|
||||
fun providesOkHttpClientInstance(certPinner: CertificatePinner, proxy: Proxy?): OkHttpClient {
|
||||
return OkHttpClient().newBuilder()
|
||||
.proxy(proxy)
|
||||
.certificatePinner(certPinner)
|
||||
.connectTimeout(25, TimeUnit.SECONDS)
|
||||
.readTimeout(25, TimeUnit.SECONDS)
|
||||
.writeTimeout(25, TimeUnit.SECONDS)
|
||||
.retryOnConnectionFailure(true)
|
||||
.followRedirects(true)
|
||||
.followSslRedirects(true)
|
||||
.build()
|
||||
}
|
||||
|
||||
@Provides
|
||||
@Singleton
|
||||
fun providesCertificatePinnerInstance(@ApplicationContext context: Context): CertificatePinner {
|
||||
// Google needs special handling, see: https://pki.goog/faq/#faq-27
|
||||
val googleRootCerts = CertUtil.getGoogleRootCertHashes(context).map { "sha256/$it" }
|
||||
.toTypedArray()
|
||||
|
||||
return CertificatePinner.Builder()
|
||||
.add("*.googleapis.com", *googleRootCerts)
|
||||
.add("*.google.com", *googleRootCerts)
|
||||
.add("auroraoss.com", "sha256/mEflZT5enoR1FuXLgYYGqnVEoZvmf9c2bVBpiOjYQ0c=") // GTS Root R4
|
||||
.add("*.exodus-privacy.eu.org", "sha256/C5+lpZ7tcVwmwQIMcRtPbsQtWLABXhQzejna0wHFr8M=") // ISRG Root X1
|
||||
.add("gitlab.com", "sha256/x4QzPSC810K5/cMjb05Qm4k3Bw5zBn4lTdO/nEW/Td4=") // USERTrust RSA Certification Authority
|
||||
.build()
|
||||
}
|
||||
|
||||
@Provides
|
||||
@Singleton
|
||||
fun providesProxyInstance(@ApplicationContext context: Context, gson: Gson): Proxy? {
|
||||
val proxyEnabled = Preferences.getBoolean(context, PREFERENCE_PROXY_ENABLED)
|
||||
val proxyInfoString = Preferences.getString(context, 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
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -26,10 +26,10 @@ import com.aurora.Constants.ACCOUNT_SIGNED_IN
|
||||
import com.aurora.gplayapi.data.models.AuthData
|
||||
import com.aurora.gplayapi.helpers.AuthHelper
|
||||
import com.aurora.gplayapi.helpers.AuthValidator
|
||||
import com.aurora.gplayapi.network.IHttpClient
|
||||
import com.aurora.store.R
|
||||
import com.aurora.store.data.model.AccountType
|
||||
import com.aurora.store.data.model.Auth
|
||||
import com.aurora.store.data.network.IProxyHttpClient
|
||||
import com.aurora.store.util.Preferences
|
||||
import com.aurora.store.util.Preferences.PREFERENCE_AUTH_DATA
|
||||
import com.aurora.store.util.Preferences.PREFERENCE_DISPENSER_URLS
|
||||
@@ -48,7 +48,7 @@ class AuthProvider @Inject constructor(
|
||||
@ApplicationContext private val context: Context,
|
||||
private val gson: Gson,
|
||||
private val spoofProvider: SpoofProvider,
|
||||
private val httpClient: IProxyHttpClient
|
||||
private val httpClient: IHttpClient
|
||||
) {
|
||||
|
||||
private val TAG = AuthProvider::class.java.simpleName
|
||||
|
||||
@@ -19,13 +19,13 @@ import com.aurora.extensions.isQAndAbove
|
||||
import com.aurora.extensions.isSAndAbove
|
||||
import com.aurora.extensions.requiresObbDir
|
||||
import com.aurora.gplayapi.helpers.PurchaseHelper
|
||||
import com.aurora.gplayapi.network.IHttpClient
|
||||
import com.aurora.store.data.installer.AppInstaller
|
||||
import com.aurora.store.data.model.Algorithm
|
||||
import com.aurora.store.data.model.DownloadInfo
|
||||
import com.aurora.store.data.model.DownloadStatus
|
||||
import com.aurora.store.data.model.Request
|
||||
import com.aurora.store.data.network.IProxyHttpClient
|
||||
import com.aurora.store.data.network.OkHttpClient
|
||||
import com.aurora.store.data.network.HttpClient
|
||||
import com.aurora.store.data.providers.AuthProvider
|
||||
import com.aurora.store.data.room.download.Download
|
||||
import com.aurora.store.data.room.download.DownloadDao
|
||||
@@ -58,7 +58,7 @@ class DownloadWorker @AssistedInject constructor(
|
||||
private val gson: Gson,
|
||||
private val appInstaller: AppInstaller,
|
||||
private val authProvider: AuthProvider,
|
||||
private val httpClient: IProxyHttpClient,
|
||||
private val httpClient: IHttpClient,
|
||||
@Assisted private val appContext: Context,
|
||||
@Assisted workerParams: WorkerParameters
|
||||
) : CoroutineWorker(appContext, workerParams) {
|
||||
@@ -93,7 +93,7 @@ class DownloadWorker @AssistedInject constructor(
|
||||
download = gson.fromJson(downloadData, Download::class.java)
|
||||
|
||||
val bitmap = BitmapFactory.decodeStream(withContext(Dispatchers.IO) {
|
||||
(httpClient as OkHttpClient).call(download.iconURL).body!!.byteStream()
|
||||
(httpClient as HttpClient).call(download.iconURL).body!!.byteStream()
|
||||
})
|
||||
icon = Bitmap.createScaledBitmap(bitmap, 96, 96, true)
|
||||
} catch (exception: Exception) {
|
||||
@@ -269,7 +269,7 @@ class DownloadWorker @AssistedInject constructor(
|
||||
try {
|
||||
val isNewFile = request.file.createNewFile()
|
||||
|
||||
val okHttpClient = httpClient as OkHttpClient
|
||||
val okHttpClient = httpClient as HttpClient
|
||||
val headers = mutableMapOf<String, String>()
|
||||
|
||||
if (!isNewFile) {
|
||||
|
||||
@@ -19,11 +19,13 @@
|
||||
|
||||
package com.aurora.store.util
|
||||
|
||||
import com.aurora.store.data.network.OkHttpClient
|
||||
import com.aurora.store.data.network.HttpClient
|
||||
import okhttp3.RequestBody.Companion.toRequestBody
|
||||
import java.util.Locale
|
||||
import javax.inject.Inject
|
||||
|
||||
class AC2DMTask @Inject constructor(private val httpClient: HttpClient) {
|
||||
|
||||
class AC2DMTask {
|
||||
@Throws(Exception::class)
|
||||
fun getAC2DMResponse(email: String?, oAuthToken: String?): Map<String, String> {
|
||||
if (email == null || oAuthToken == null)
|
||||
@@ -51,7 +53,7 @@ class AC2DMTask {
|
||||
"Content-Type" to "application/x-www-form-urlencoded"
|
||||
)
|
||||
|
||||
val response = OkHttpClient.post(TOKEN_AUTH_URL, header, body.toRequestBody())
|
||||
val response = httpClient.post(TOKEN_AUTH_URL, header, body.toRequestBody())
|
||||
|
||||
return if (response.isSuccessful) {
|
||||
AC2DMUtil.parseResponse(String(response.responseBytes))
|
||||
|
||||
@@ -8,10 +8,10 @@ import com.aurora.Constants
|
||||
import com.aurora.gplayapi.data.models.App
|
||||
import com.aurora.gplayapi.data.models.AuthData
|
||||
import com.aurora.gplayapi.helpers.AppDetailsHelper
|
||||
import com.aurora.gplayapi.network.IHttpClient
|
||||
import com.aurora.store.AuroraApp
|
||||
import com.aurora.store.BuildConfig
|
||||
import com.aurora.store.data.model.SelfUpdate
|
||||
import com.aurora.store.data.network.IProxyHttpClient
|
||||
import com.aurora.store.data.providers.AuthProvider
|
||||
import com.aurora.store.data.providers.BlacklistProvider
|
||||
import com.aurora.store.data.room.update.Update
|
||||
@@ -32,7 +32,7 @@ class AppUtil @Inject constructor(
|
||||
private val authProvider: AuthProvider,
|
||||
private val updateDao: UpdateDao,
|
||||
private val blacklistProvider: BlacklistProvider,
|
||||
private val httpClient: IProxyHttpClient,
|
||||
private val httpClient: IHttpClient,
|
||||
@ApplicationContext private val context: Context
|
||||
) {
|
||||
|
||||
|
||||
@@ -26,7 +26,7 @@ import androidx.lifecycle.viewModelScope
|
||||
import com.aurora.extensions.isApp
|
||||
import com.aurora.gplayapi.data.models.App
|
||||
import com.aurora.gplayapi.helpers.AppDetailsHelper
|
||||
import com.aurora.store.data.network.IProxyHttpClient
|
||||
import com.aurora.gplayapi.network.IHttpClient
|
||||
import com.aurora.store.data.providers.AuthProvider
|
||||
import com.aurora.store.data.providers.BlacklistProvider
|
||||
import dagger.hilt.android.lifecycle.HiltViewModel
|
||||
@@ -44,7 +44,7 @@ import javax.inject.Inject
|
||||
class BlacklistViewModel @Inject constructor(
|
||||
val blacklistProvider: BlacklistProvider,
|
||||
@ApplicationContext private val context: Context,
|
||||
private val httpClient: IProxyHttpClient,
|
||||
private val httpClient: IHttpClient,
|
||||
authProvider: AuthProvider
|
||||
) : ViewModel() {
|
||||
private val appDetailsHelper = AppDetailsHelper(authProvider.authData!!)
|
||||
|
||||
@@ -29,13 +29,13 @@ import com.aurora.Constants
|
||||
import com.aurora.gplayapi.data.models.AuthData
|
||||
import com.aurora.gplayapi.data.models.PlayResponse
|
||||
import com.aurora.gplayapi.helpers.AuthHelper
|
||||
import com.aurora.gplayapi.network.IHttpClient
|
||||
import com.aurora.store.AuroraApp
|
||||
import com.aurora.store.R
|
||||
import com.aurora.store.data.event.AuthEvent
|
||||
import com.aurora.store.data.model.AccountType
|
||||
import com.aurora.store.data.model.Auth
|
||||
import com.aurora.store.data.model.AuthState
|
||||
import com.aurora.store.data.network.IProxyHttpClient
|
||||
import com.aurora.store.data.providers.AccountProvider
|
||||
import com.aurora.store.data.providers.AuthProvider
|
||||
import com.aurora.store.util.AC2DMTask
|
||||
@@ -57,7 +57,8 @@ class AuthViewModel @Inject constructor(
|
||||
val authProvider: AuthProvider,
|
||||
@ApplicationContext private val context: Context,
|
||||
private val gson: Gson,
|
||||
private val httpClient: IProxyHttpClient
|
||||
private val httpClient: IHttpClient,
|
||||
private val aC2DMTask: AC2DMTask
|
||||
) : ViewModel() {
|
||||
|
||||
private val TAG = AuthViewModel::class.java.simpleName
|
||||
@@ -130,7 +131,7 @@ class AuthViewModel @Inject constructor(
|
||||
fun buildAuthData(context: Context, email: String, oauthToken: String?) {
|
||||
viewModelScope.launch(Dispatchers.IO) {
|
||||
try {
|
||||
val response = AC2DMTask().getAC2DMResponse(email, oauthToken)
|
||||
val response = aC2DMTask.getAC2DMResponse(email, oauthToken)
|
||||
if (response.isNotEmpty()) {
|
||||
val aasToken = response["Token"]
|
||||
if (aasToken != null) {
|
||||
|
||||
@@ -27,7 +27,7 @@ import androidx.lifecycle.ViewModel
|
||||
import androidx.lifecycle.viewModelScope
|
||||
import com.aurora.gplayapi.data.models.StreamCluster
|
||||
import com.aurora.gplayapi.helpers.ExpandedBrowseHelper
|
||||
import com.aurora.store.data.network.IProxyHttpClient
|
||||
import com.aurora.gplayapi.network.IHttpClient
|
||||
import com.aurora.store.data.providers.AuthProvider
|
||||
import dagger.hilt.android.lifecycle.HiltViewModel
|
||||
import dagger.hilt.android.qualifiers.ApplicationContext
|
||||
@@ -41,7 +41,7 @@ import javax.inject.Inject
|
||||
class ExpandedStreamBrowseViewModel @Inject constructor(
|
||||
@ApplicationContext private val context: Context,
|
||||
private val authProvider: AuthProvider,
|
||||
private val httpClient: IProxyHttpClient
|
||||
private val httpClient: IHttpClient
|
||||
) : ViewModel() {
|
||||
|
||||
private val TAG = ExpandedStreamBrowseViewModel::class.java.simpleName
|
||||
|
||||
@@ -28,7 +28,7 @@ import androidx.lifecycle.viewModelScope
|
||||
import com.aurora.gplayapi.data.models.StreamCluster
|
||||
import com.aurora.gplayapi.helpers.contracts.StreamContract
|
||||
import com.aurora.gplayapi.helpers.web.WebStreamHelper
|
||||
import com.aurora.store.data.network.IProxyHttpClient
|
||||
import com.aurora.gplayapi.network.IHttpClient
|
||||
import com.aurora.store.data.providers.AuthProvider
|
||||
import dagger.hilt.android.lifecycle.HiltViewModel
|
||||
import dagger.hilt.android.qualifiers.ApplicationContext
|
||||
@@ -42,7 +42,7 @@ import javax.inject.Inject
|
||||
class StreamBrowseViewModel @Inject constructor(
|
||||
@ApplicationContext private val context: Context,
|
||||
private val authProvider: AuthProvider,
|
||||
private val httpClient: IProxyHttpClient
|
||||
private val httpClient: IHttpClient
|
||||
) : ViewModel() {
|
||||
|
||||
private val TAG = StreamBrowseViewModel::class.java.simpleName
|
||||
|
||||
@@ -28,9 +28,9 @@ import androidx.lifecycle.viewModelScope
|
||||
import com.aurora.gplayapi.data.models.Category
|
||||
import com.aurora.gplayapi.helpers.CategoryHelper
|
||||
import com.aurora.gplayapi.helpers.contracts.CategoryContract
|
||||
import com.aurora.gplayapi.network.IHttpClient
|
||||
import com.aurora.store.CategoryStash
|
||||
import com.aurora.store.data.model.ViewState
|
||||
import com.aurora.store.data.network.IProxyHttpClient
|
||||
import com.aurora.store.data.providers.AuthProvider
|
||||
import dagger.hilt.android.lifecycle.HiltViewModel
|
||||
import dagger.hilt.android.qualifiers.ApplicationContext
|
||||
@@ -43,7 +43,7 @@ import javax.inject.Inject
|
||||
class CategoryViewModel @Inject constructor(
|
||||
@ApplicationContext private val context: Context,
|
||||
private val authProvider: AuthProvider,
|
||||
private val httpClient: IProxyHttpClient
|
||||
private val httpClient: IHttpClient
|
||||
) : ViewModel() {
|
||||
private val TAG = CategoryViewModel::class.java.simpleName
|
||||
|
||||
|
||||
@@ -10,9 +10,9 @@ import com.aurora.gplayapi.data.models.details.TestingProgramStatus
|
||||
import com.aurora.gplayapi.helpers.AppDetailsHelper
|
||||
import com.aurora.gplayapi.helpers.ReviewsHelper
|
||||
import com.aurora.gplayapi.helpers.web.WebDataSafetyHelper
|
||||
import com.aurora.gplayapi.network.IHttpClient
|
||||
import com.aurora.store.data.model.ExodusReport
|
||||
import com.aurora.store.data.model.Report
|
||||
import com.aurora.store.data.network.IProxyHttpClient
|
||||
import com.aurora.store.data.providers.AuthProvider
|
||||
import com.aurora.store.data.room.favourites.Favourite
|
||||
import com.aurora.store.data.room.favourites.FavouriteDao
|
||||
@@ -37,7 +37,7 @@ class AppDetailsViewModel @Inject constructor(
|
||||
private val downloadWorkerUtil: DownloadWorkerUtil,
|
||||
private val authProvider: AuthProvider,
|
||||
private val favouriteDao: FavouriteDao,
|
||||
private val httpClient: IProxyHttpClient
|
||||
private val httpClient: IHttpClient
|
||||
) : ViewModel() {
|
||||
|
||||
private val TAG = AppDetailsViewModel::class.java.simpleName
|
||||
|
||||
@@ -29,9 +29,9 @@ import com.aurora.gplayapi.data.models.StreamCluster
|
||||
import com.aurora.gplayapi.helpers.AppDetailsHelper
|
||||
import com.aurora.gplayapi.helpers.StreamHelper
|
||||
import com.aurora.gplayapi.helpers.contracts.StreamContract
|
||||
import com.aurora.gplayapi.network.IHttpClient
|
||||
import com.aurora.store.AppStreamStash
|
||||
import com.aurora.store.data.model.ViewState
|
||||
import com.aurora.store.data.network.IProxyHttpClient
|
||||
import com.aurora.store.data.providers.AuthProvider
|
||||
import dagger.hilt.android.lifecycle.HiltViewModel
|
||||
import dagger.hilt.android.qualifiers.ApplicationContext
|
||||
@@ -44,7 +44,7 @@ import javax.inject.Inject
|
||||
class DetailsClusterViewModel @Inject constructor(
|
||||
@ApplicationContext private val context: Context,
|
||||
authProvider: AuthProvider,
|
||||
private val httpClient: IProxyHttpClient
|
||||
private val httpClient: IHttpClient
|
||||
) : ViewModel() {
|
||||
|
||||
private val TAG = DetailsClusterViewModel::class.java.simpleName
|
||||
|
||||
@@ -6,7 +6,7 @@ import androidx.lifecycle.ViewModel
|
||||
import androidx.lifecycle.viewModelScope
|
||||
import com.aurora.gplayapi.data.models.App
|
||||
import com.aurora.gplayapi.helpers.AppDetailsHelper
|
||||
import com.aurora.store.data.network.IProxyHttpClient
|
||||
import com.aurora.gplayapi.network.IHttpClient
|
||||
import com.aurora.store.data.providers.AuthProvider
|
||||
import dagger.hilt.android.lifecycle.HiltViewModel
|
||||
import dagger.hilt.android.qualifiers.ApplicationContext
|
||||
@@ -20,7 +20,7 @@ import javax.inject.Inject
|
||||
class DetailsMoreViewModel @Inject constructor(
|
||||
@ApplicationContext private val context: Context,
|
||||
private val authProvider: AuthProvider,
|
||||
private val httpClient: IProxyHttpClient
|
||||
private val httpClient: IHttpClient
|
||||
) : ViewModel() {
|
||||
|
||||
private val TAG = DetailsMoreViewModel::class.java.simpleName
|
||||
|
||||
@@ -31,8 +31,8 @@ import com.aurora.gplayapi.data.models.details.DevStream
|
||||
import com.aurora.gplayapi.helpers.AppDetailsHelper
|
||||
import com.aurora.gplayapi.helpers.StreamHelper
|
||||
import com.aurora.gplayapi.helpers.contracts.StreamContract
|
||||
import com.aurora.gplayapi.network.IHttpClient
|
||||
import com.aurora.store.data.model.ViewState
|
||||
import com.aurora.store.data.network.IProxyHttpClient
|
||||
import com.aurora.store.data.providers.AuthProvider
|
||||
import dagger.hilt.android.lifecycle.HiltViewModel
|
||||
import dagger.hilt.android.qualifiers.ApplicationContext
|
||||
@@ -46,7 +46,7 @@ import javax.inject.Inject
|
||||
class DevProfileViewModel @Inject constructor(
|
||||
@ApplicationContext private val context: Context,
|
||||
private val authProvider: AuthProvider,
|
||||
private val httpClient: IProxyHttpClient
|
||||
private val httpClient: IHttpClient
|
||||
) : ViewModel() {
|
||||
|
||||
private val TAG = DevProfileViewModel::class.java.simpleName
|
||||
|
||||
@@ -29,9 +29,9 @@ import com.aurora.gplayapi.data.models.StreamBundle
|
||||
import com.aurora.gplayapi.data.models.StreamCluster
|
||||
import com.aurora.gplayapi.helpers.contracts.StreamContract
|
||||
import com.aurora.gplayapi.helpers.web.WebStreamHelper
|
||||
import com.aurora.gplayapi.network.IHttpClient
|
||||
import com.aurora.store.HomeStash
|
||||
import com.aurora.store.data.model.ViewState
|
||||
import com.aurora.store.data.network.IProxyHttpClient
|
||||
import dagger.hilt.android.lifecycle.HiltViewModel
|
||||
import dagger.hilt.android.qualifiers.ApplicationContext
|
||||
import kotlinx.coroutines.Dispatchers
|
||||
@@ -43,7 +43,7 @@ import javax.inject.Inject
|
||||
@SuppressLint("StaticFieldLeak") // false positive, see https://github.com/google/dagger/issues/3253
|
||||
class StreamViewModel @Inject constructor(
|
||||
@ApplicationContext private val context: Context,
|
||||
private val httpClient: IProxyHttpClient
|
||||
private val httpClient: IHttpClient
|
||||
) : ViewModel() {
|
||||
|
||||
private val TAG = StreamViewModel::class.java.simpleName
|
||||
|
||||
@@ -27,7 +27,7 @@ import androidx.lifecycle.viewModelScope
|
||||
import com.aurora.gplayapi.data.models.Review
|
||||
import com.aurora.gplayapi.data.models.ReviewCluster
|
||||
import com.aurora.gplayapi.helpers.ReviewsHelper
|
||||
import com.aurora.store.data.network.IProxyHttpClient
|
||||
import com.aurora.gplayapi.network.IHttpClient
|
||||
import com.aurora.store.data.providers.AuthProvider
|
||||
import dagger.hilt.android.lifecycle.HiltViewModel
|
||||
import dagger.hilt.android.qualifiers.ApplicationContext
|
||||
@@ -41,7 +41,7 @@ import javax.inject.Inject
|
||||
class ReviewViewModel @Inject constructor(
|
||||
@ApplicationContext private val context: Context,
|
||||
private val authProvider: AuthProvider,
|
||||
private val httpClient: IProxyHttpClient
|
||||
private val httpClient: IHttpClient
|
||||
) : ViewModel() {
|
||||
|
||||
var reviewsHelper: ReviewsHelper = ReviewsHelper(authProvider.authData!!)
|
||||
|
||||
@@ -30,7 +30,7 @@ import com.aurora.gplayapi.data.models.SearchBundle
|
||||
import com.aurora.gplayapi.helpers.SearchHelper
|
||||
import com.aurora.gplayapi.helpers.contracts.SearchContract
|
||||
import com.aurora.gplayapi.helpers.web.WebSearchHelper
|
||||
import com.aurora.store.data.network.IProxyHttpClient
|
||||
import com.aurora.gplayapi.network.IHttpClient
|
||||
import com.aurora.store.data.providers.AuthProvider
|
||||
import com.aurora.store.data.providers.FilterProvider
|
||||
import dagger.hilt.android.lifecycle.HiltViewModel
|
||||
@@ -46,7 +46,7 @@ class SearchResultViewModel @Inject constructor(
|
||||
val filterProvider: FilterProvider,
|
||||
@ApplicationContext private val context: Context,
|
||||
private val authProvider: AuthProvider,
|
||||
private val httpClient: IProxyHttpClient
|
||||
private val httpClient: IHttpClient
|
||||
) : ViewModel() {
|
||||
|
||||
private val TAG = SearchResultViewModel::class.java.simpleName
|
||||
|
||||
@@ -28,7 +28,7 @@ import com.aurora.gplayapi.SearchSuggestEntry
|
||||
import com.aurora.gplayapi.helpers.SearchHelper
|
||||
import com.aurora.gplayapi.helpers.contracts.SearchContract
|
||||
import com.aurora.gplayapi.helpers.web.WebSearchHelper
|
||||
import com.aurora.store.data.network.IProxyHttpClient
|
||||
import com.aurora.gplayapi.network.IHttpClient
|
||||
import com.aurora.store.data.providers.AuthProvider
|
||||
import dagger.hilt.android.lifecycle.HiltViewModel
|
||||
import dagger.hilt.android.qualifiers.ApplicationContext
|
||||
@@ -41,7 +41,7 @@ import javax.inject.Inject
|
||||
class SearchSuggestionViewModel @Inject constructor(
|
||||
@ApplicationContext private val context: Context,
|
||||
private val authProvider: AuthProvider,
|
||||
private val httpClient: IProxyHttpClient
|
||||
private val httpClient: IHttpClient
|
||||
) : ViewModel() {
|
||||
|
||||
val liveSearchSuggestions: MutableLiveData<List<SearchSuggestEntry>> = MutableLiveData()
|
||||
|
||||
@@ -30,8 +30,8 @@ import com.aurora.gplayapi.data.models.StreamCluster
|
||||
import com.aurora.gplayapi.helpers.contracts.CategoryStreamContract
|
||||
import com.aurora.gplayapi.helpers.contracts.StreamContract
|
||||
import com.aurora.gplayapi.helpers.web.WebCategoryStreamHelper
|
||||
import com.aurora.gplayapi.network.IHttpClient
|
||||
import com.aurora.store.data.model.ViewState
|
||||
import com.aurora.store.data.network.IProxyHttpClient
|
||||
import dagger.hilt.android.lifecycle.HiltViewModel
|
||||
import dagger.hilt.android.qualifiers.ApplicationContext
|
||||
import kotlinx.coroutines.Dispatchers
|
||||
@@ -43,7 +43,7 @@ import javax.inject.Inject
|
||||
@SuppressLint("StaticFieldLeak") // false positive, see https://github.com/google/dagger/issues/3253
|
||||
class CategoryStreamViewModel @Inject constructor(
|
||||
@ApplicationContext private val context: Context,
|
||||
private val httpClient: IProxyHttpClient
|
||||
private val httpClient: IHttpClient
|
||||
) : ViewModel() {
|
||||
|
||||
private val TAG = CategoryStreamViewModel::class.java.simpleName
|
||||
|
||||
@@ -27,9 +27,9 @@ import androidx.lifecycle.viewModelScope
|
||||
import com.aurora.gplayapi.data.models.StreamCluster
|
||||
import com.aurora.gplayapi.helpers.contracts.TopChartsContract
|
||||
import com.aurora.gplayapi.helpers.web.WebTopChartsHelper
|
||||
import com.aurora.gplayapi.network.IHttpClient
|
||||
import com.aurora.store.TopChartStash
|
||||
import com.aurora.store.data.model.ViewState
|
||||
import com.aurora.store.data.network.IProxyHttpClient
|
||||
import dagger.hilt.android.lifecycle.HiltViewModel
|
||||
import dagger.hilt.android.qualifiers.ApplicationContext
|
||||
import kotlinx.coroutines.Dispatchers
|
||||
@@ -41,7 +41,7 @@ import javax.inject.Inject
|
||||
@SuppressLint("StaticFieldLeak") // false positive, see https://github.com/google/dagger/issues/3253
|
||||
class TopChartViewModel @Inject constructor(
|
||||
@ApplicationContext private val context: Context,
|
||||
private val httpClient: IProxyHttpClient
|
||||
private val httpClient: IHttpClient
|
||||
): ViewModel() {
|
||||
|
||||
private val webTopChartsHelper: TopChartsContract = WebTopChartsHelper()
|
||||
|
||||
Reference in New Issue
Block a user