network: Cleanup logic and move required instances to separate modules

Signed-off-by: Aayush Gupta <aayushgupta219@gmail.com>
This commit is contained in:
Aayush Gupta
2024-09-12 13:39:40 +05:30
parent 388a61f131
commit 0e6ee6a121
24 changed files with 323 additions and 317 deletions

View File

@@ -19,41 +19,159 @@
package com.aurora.store.data.network package com.aurora.store.data.network
import android.content.Context
import android.util.Log import android.util.Log
import com.aurora.store.data.model.ProxyInfo import com.aurora.gplayapi.data.models.PlayResponse
import com.aurora.store.util.Preferences import com.aurora.gplayapi.network.IHttpClient
import com.google.gson.Gson import com.aurora.store.BuildConfig
import dagger.Module import java.io.IOException
import dagger.Provides import javax.inject.Inject
import dagger.hilt.InstallIn
import dagger.hilt.android.qualifiers.ApplicationContext
import dagger.hilt.components.SingletonComponent
import javax.inject.Singleton 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 @Singleton
@InstallIn(SingletonComponent::class) class HttpClient @Inject constructor(private val okHttpClient: OkHttpClient): IHttpClient {
object HttpClient {
private const val TAG = "HttpClient" private val TAG = HttpClient::class.java.simpleName
@Provides private val POST = "POST"
@Singleton private val GET = "GET"
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)
val okHttpClient = OkHttpClient.builder(context) private val _responseCode = MutableStateFlow(100)
if (proxyEnabled && proxyInfoString.isNotBlank() && proxyInfoString != "{}") { override val responseCode: StateFlow<Int>
val proxyInfo = gson.fromJson(proxyInfoString, ProxyInfo::class.java) get() = _responseCode.asStateFlow()
if (proxyInfo != null) {
OkHttpClient.setProxy(proxyInfo) @Throws(IOException::class)
} else { fun post(url: String, headers: Map<String, String>, requestBody: RequestBody): PlayResponse {
Log.e(TAG, "Proxy info is unavailable, using default client") val request = Request.Builder()
} .url(url)
} else { .headers(headers.toHeaders())
Log.i(TAG, "Proxy is disabled") .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()
} }
} }

View File

@@ -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
}
}

View File

@@ -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
}

View File

@@ -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}")
}
}
}

View File

@@ -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
}
}
}

View File

@@ -26,10 +26,10 @@ import com.aurora.Constants.ACCOUNT_SIGNED_IN
import com.aurora.gplayapi.data.models.AuthData import com.aurora.gplayapi.data.models.AuthData
import com.aurora.gplayapi.helpers.AuthHelper import com.aurora.gplayapi.helpers.AuthHelper
import com.aurora.gplayapi.helpers.AuthValidator import com.aurora.gplayapi.helpers.AuthValidator
import com.aurora.gplayapi.network.IHttpClient
import com.aurora.store.R import com.aurora.store.R
import com.aurora.store.data.model.AccountType import com.aurora.store.data.model.AccountType
import com.aurora.store.data.model.Auth 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
import com.aurora.store.util.Preferences.PREFERENCE_AUTH_DATA import com.aurora.store.util.Preferences.PREFERENCE_AUTH_DATA
import com.aurora.store.util.Preferences.PREFERENCE_DISPENSER_URLS import com.aurora.store.util.Preferences.PREFERENCE_DISPENSER_URLS
@@ -48,7 +48,7 @@ class AuthProvider @Inject constructor(
@ApplicationContext private val context: Context, @ApplicationContext private val context: Context,
private val gson: Gson, private val gson: Gson,
private val spoofProvider: SpoofProvider, private val spoofProvider: SpoofProvider,
private val httpClient: IProxyHttpClient private val httpClient: IHttpClient
) { ) {
private val TAG = AuthProvider::class.java.simpleName private val TAG = AuthProvider::class.java.simpleName

View File

@@ -19,13 +19,13 @@ import com.aurora.extensions.isQAndAbove
import com.aurora.extensions.isSAndAbove import com.aurora.extensions.isSAndAbove
import com.aurora.extensions.requiresObbDir import com.aurora.extensions.requiresObbDir
import com.aurora.gplayapi.helpers.PurchaseHelper import com.aurora.gplayapi.helpers.PurchaseHelper
import com.aurora.gplayapi.network.IHttpClient
import com.aurora.store.data.installer.AppInstaller 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.Request import com.aurora.store.data.model.Request
import com.aurora.store.data.network.IProxyHttpClient import com.aurora.store.data.network.HttpClient
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
@@ -58,7 +58,7 @@ class DownloadWorker @AssistedInject constructor(
private val gson: Gson, private val gson: Gson,
private val appInstaller: AppInstaller, private val appInstaller: AppInstaller,
private val authProvider: AuthProvider, private val authProvider: AuthProvider,
private val httpClient: IProxyHttpClient, private val httpClient: IHttpClient,
@Assisted private val appContext: Context, @Assisted private val appContext: Context,
@Assisted workerParams: WorkerParameters @Assisted workerParams: WorkerParameters
) : CoroutineWorker(appContext, workerParams) { ) : CoroutineWorker(appContext, workerParams) {
@@ -93,7 +93,7 @@ class DownloadWorker @AssistedInject constructor(
download = gson.fromJson(downloadData, Download::class.java) download = gson.fromJson(downloadData, Download::class.java)
val bitmap = BitmapFactory.decodeStream(withContext(Dispatchers.IO) { 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) icon = Bitmap.createScaledBitmap(bitmap, 96, 96, true)
} catch (exception: Exception) { } catch (exception: Exception) {
@@ -269,7 +269,7 @@ class DownloadWorker @AssistedInject constructor(
try { try {
val isNewFile = request.file.createNewFile() val isNewFile = request.file.createNewFile()
val okHttpClient = httpClient as OkHttpClient val okHttpClient = httpClient as HttpClient
val headers = mutableMapOf<String, String>() val headers = mutableMapOf<String, String>()
if (!isNewFile) { if (!isNewFile) {

View File

@@ -19,11 +19,13 @@
package com.aurora.store.util 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 okhttp3.RequestBody.Companion.toRequestBody
import java.util.Locale import java.util.Locale
import javax.inject.Inject
class AC2DMTask @Inject constructor(private val httpClient: HttpClient) {
class AC2DMTask {
@Throws(Exception::class) @Throws(Exception::class)
fun getAC2DMResponse(email: String?, oAuthToken: String?): Map<String, String> { fun getAC2DMResponse(email: String?, oAuthToken: String?): Map<String, String> {
if (email == null || oAuthToken == null) if (email == null || oAuthToken == null)
@@ -51,7 +53,7 @@ class AC2DMTask {
"Content-Type" to "application/x-www-form-urlencoded" "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) { return if (response.isSuccessful) {
AC2DMUtil.parseResponse(String(response.responseBytes)) AC2DMUtil.parseResponse(String(response.responseBytes))

View File

@@ -8,10 +8,10 @@ import com.aurora.Constants
import com.aurora.gplayapi.data.models.App import com.aurora.gplayapi.data.models.App
import com.aurora.gplayapi.data.models.AuthData import com.aurora.gplayapi.data.models.AuthData
import com.aurora.gplayapi.helpers.AppDetailsHelper import com.aurora.gplayapi.helpers.AppDetailsHelper
import com.aurora.gplayapi.network.IHttpClient
import com.aurora.store.AuroraApp import com.aurora.store.AuroraApp
import com.aurora.store.BuildConfig import com.aurora.store.BuildConfig
import com.aurora.store.data.model.SelfUpdate 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.AuthProvider
import com.aurora.store.data.providers.BlacklistProvider import com.aurora.store.data.providers.BlacklistProvider
import com.aurora.store.data.room.update.Update import com.aurora.store.data.room.update.Update
@@ -32,7 +32,7 @@ class AppUtil @Inject constructor(
private val authProvider: AuthProvider, private val authProvider: AuthProvider,
private val updateDao: UpdateDao, private val updateDao: UpdateDao,
private val blacklistProvider: BlacklistProvider, private val blacklistProvider: BlacklistProvider,
private val httpClient: IProxyHttpClient, private val httpClient: IHttpClient,
@ApplicationContext private val context: Context @ApplicationContext private val context: Context
) { ) {

View File

@@ -26,7 +26,7 @@ import androidx.lifecycle.viewModelScope
import com.aurora.extensions.isApp import com.aurora.extensions.isApp
import com.aurora.gplayapi.data.models.App import com.aurora.gplayapi.data.models.App
import com.aurora.gplayapi.helpers.AppDetailsHelper 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.AuthProvider
import com.aurora.store.data.providers.BlacklistProvider import com.aurora.store.data.providers.BlacklistProvider
import dagger.hilt.android.lifecycle.HiltViewModel import dagger.hilt.android.lifecycle.HiltViewModel
@@ -44,7 +44,7 @@ import javax.inject.Inject
class BlacklistViewModel @Inject constructor( class BlacklistViewModel @Inject constructor(
val blacklistProvider: BlacklistProvider, val blacklistProvider: BlacklistProvider,
@ApplicationContext private val context: Context, @ApplicationContext private val context: Context,
private val httpClient: IProxyHttpClient, private val httpClient: IHttpClient,
authProvider: AuthProvider authProvider: AuthProvider
) : ViewModel() { ) : ViewModel() {
private val appDetailsHelper = AppDetailsHelper(authProvider.authData!!) private val appDetailsHelper = AppDetailsHelper(authProvider.authData!!)

View File

@@ -29,13 +29,13 @@ import com.aurora.Constants
import com.aurora.gplayapi.data.models.AuthData import com.aurora.gplayapi.data.models.AuthData
import com.aurora.gplayapi.data.models.PlayResponse import com.aurora.gplayapi.data.models.PlayResponse
import com.aurora.gplayapi.helpers.AuthHelper import com.aurora.gplayapi.helpers.AuthHelper
import com.aurora.gplayapi.network.IHttpClient
import com.aurora.store.AuroraApp import com.aurora.store.AuroraApp
import com.aurora.store.R import com.aurora.store.R
import com.aurora.store.data.event.AuthEvent import com.aurora.store.data.event.AuthEvent
import com.aurora.store.data.model.AccountType import com.aurora.store.data.model.AccountType
import com.aurora.store.data.model.Auth import com.aurora.store.data.model.Auth
import com.aurora.store.data.model.AuthState 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.AccountProvider
import com.aurora.store.data.providers.AuthProvider import com.aurora.store.data.providers.AuthProvider
import com.aurora.store.util.AC2DMTask import com.aurora.store.util.AC2DMTask
@@ -57,7 +57,8 @@ class AuthViewModel @Inject constructor(
val authProvider: AuthProvider, val authProvider: AuthProvider,
@ApplicationContext private val context: Context, @ApplicationContext private val context: Context,
private val gson: Gson, private val gson: Gson,
private val httpClient: IProxyHttpClient private val httpClient: IHttpClient,
private val aC2DMTask: AC2DMTask
) : ViewModel() { ) : ViewModel() {
private val TAG = AuthViewModel::class.java.simpleName private val TAG = AuthViewModel::class.java.simpleName
@@ -130,7 +131,7 @@ class AuthViewModel @Inject constructor(
fun buildAuthData(context: Context, email: String, oauthToken: String?) { fun buildAuthData(context: Context, email: String, oauthToken: String?) {
viewModelScope.launch(Dispatchers.IO) { viewModelScope.launch(Dispatchers.IO) {
try { try {
val response = AC2DMTask().getAC2DMResponse(email, oauthToken) val response = aC2DMTask.getAC2DMResponse(email, oauthToken)
if (response.isNotEmpty()) { if (response.isNotEmpty()) {
val aasToken = response["Token"] val aasToken = response["Token"]
if (aasToken != null) { if (aasToken != null) {

View File

@@ -27,7 +27,7 @@ import androidx.lifecycle.ViewModel
import androidx.lifecycle.viewModelScope import androidx.lifecycle.viewModelScope
import com.aurora.gplayapi.data.models.StreamCluster import com.aurora.gplayapi.data.models.StreamCluster
import com.aurora.gplayapi.helpers.ExpandedBrowseHelper 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 com.aurora.store.data.providers.AuthProvider
import dagger.hilt.android.lifecycle.HiltViewModel import dagger.hilt.android.lifecycle.HiltViewModel
import dagger.hilt.android.qualifiers.ApplicationContext import dagger.hilt.android.qualifiers.ApplicationContext
@@ -41,7 +41,7 @@ import javax.inject.Inject
class ExpandedStreamBrowseViewModel @Inject constructor( class ExpandedStreamBrowseViewModel @Inject constructor(
@ApplicationContext private val context: Context, @ApplicationContext private val context: Context,
private val authProvider: AuthProvider, private val authProvider: AuthProvider,
private val httpClient: IProxyHttpClient private val httpClient: IHttpClient
) : ViewModel() { ) : ViewModel() {
private val TAG = ExpandedStreamBrowseViewModel::class.java.simpleName private val TAG = ExpandedStreamBrowseViewModel::class.java.simpleName

View File

@@ -28,7 +28,7 @@ import androidx.lifecycle.viewModelScope
import com.aurora.gplayapi.data.models.StreamCluster import com.aurora.gplayapi.data.models.StreamCluster
import com.aurora.gplayapi.helpers.contracts.StreamContract import com.aurora.gplayapi.helpers.contracts.StreamContract
import com.aurora.gplayapi.helpers.web.WebStreamHelper 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 com.aurora.store.data.providers.AuthProvider
import dagger.hilt.android.lifecycle.HiltViewModel import dagger.hilt.android.lifecycle.HiltViewModel
import dagger.hilt.android.qualifiers.ApplicationContext import dagger.hilt.android.qualifiers.ApplicationContext
@@ -42,7 +42,7 @@ import javax.inject.Inject
class StreamBrowseViewModel @Inject constructor( class StreamBrowseViewModel @Inject constructor(
@ApplicationContext private val context: Context, @ApplicationContext private val context: Context,
private val authProvider: AuthProvider, private val authProvider: AuthProvider,
private val httpClient: IProxyHttpClient private val httpClient: IHttpClient
) : ViewModel() { ) : ViewModel() {
private val TAG = StreamBrowseViewModel::class.java.simpleName private val TAG = StreamBrowseViewModel::class.java.simpleName

View File

@@ -28,9 +28,9 @@ import androidx.lifecycle.viewModelScope
import com.aurora.gplayapi.data.models.Category import com.aurora.gplayapi.data.models.Category
import com.aurora.gplayapi.helpers.CategoryHelper import com.aurora.gplayapi.helpers.CategoryHelper
import com.aurora.gplayapi.helpers.contracts.CategoryContract import com.aurora.gplayapi.helpers.contracts.CategoryContract
import com.aurora.gplayapi.network.IHttpClient
import com.aurora.store.CategoryStash import com.aurora.store.CategoryStash
import com.aurora.store.data.model.ViewState import com.aurora.store.data.model.ViewState
import com.aurora.store.data.network.IProxyHttpClient
import com.aurora.store.data.providers.AuthProvider import com.aurora.store.data.providers.AuthProvider
import dagger.hilt.android.lifecycle.HiltViewModel import dagger.hilt.android.lifecycle.HiltViewModel
import dagger.hilt.android.qualifiers.ApplicationContext import dagger.hilt.android.qualifiers.ApplicationContext
@@ -43,7 +43,7 @@ import javax.inject.Inject
class CategoryViewModel @Inject constructor( class CategoryViewModel @Inject constructor(
@ApplicationContext private val context: Context, @ApplicationContext private val context: Context,
private val authProvider: AuthProvider, private val authProvider: AuthProvider,
private val httpClient: IProxyHttpClient private val httpClient: IHttpClient
) : ViewModel() { ) : ViewModel() {
private val TAG = CategoryViewModel::class.java.simpleName private val TAG = CategoryViewModel::class.java.simpleName

View File

@@ -10,9 +10,9 @@ import com.aurora.gplayapi.data.models.details.TestingProgramStatus
import com.aurora.gplayapi.helpers.AppDetailsHelper import com.aurora.gplayapi.helpers.AppDetailsHelper
import com.aurora.gplayapi.helpers.ReviewsHelper import com.aurora.gplayapi.helpers.ReviewsHelper
import com.aurora.gplayapi.helpers.web.WebDataSafetyHelper 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.ExodusReport
import com.aurora.store.data.model.Report 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.providers.AuthProvider
import com.aurora.store.data.room.favourites.Favourite import com.aurora.store.data.room.favourites.Favourite
import com.aurora.store.data.room.favourites.FavouriteDao import com.aurora.store.data.room.favourites.FavouriteDao
@@ -37,7 +37,7 @@ class AppDetailsViewModel @Inject constructor(
private val downloadWorkerUtil: DownloadWorkerUtil, private val downloadWorkerUtil: DownloadWorkerUtil,
private val authProvider: AuthProvider, private val authProvider: AuthProvider,
private val favouriteDao: FavouriteDao, private val favouriteDao: FavouriteDao,
private val httpClient: IProxyHttpClient private val httpClient: IHttpClient
) : ViewModel() { ) : ViewModel() {
private val TAG = AppDetailsViewModel::class.java.simpleName private val TAG = AppDetailsViewModel::class.java.simpleName

View File

@@ -29,9 +29,9 @@ import com.aurora.gplayapi.data.models.StreamCluster
import com.aurora.gplayapi.helpers.AppDetailsHelper import com.aurora.gplayapi.helpers.AppDetailsHelper
import com.aurora.gplayapi.helpers.StreamHelper import com.aurora.gplayapi.helpers.StreamHelper
import com.aurora.gplayapi.helpers.contracts.StreamContract import com.aurora.gplayapi.helpers.contracts.StreamContract
import com.aurora.gplayapi.network.IHttpClient
import com.aurora.store.AppStreamStash import com.aurora.store.AppStreamStash
import com.aurora.store.data.model.ViewState import com.aurora.store.data.model.ViewState
import com.aurora.store.data.network.IProxyHttpClient
import com.aurora.store.data.providers.AuthProvider import com.aurora.store.data.providers.AuthProvider
import dagger.hilt.android.lifecycle.HiltViewModel import dagger.hilt.android.lifecycle.HiltViewModel
import dagger.hilt.android.qualifiers.ApplicationContext import dagger.hilt.android.qualifiers.ApplicationContext
@@ -44,7 +44,7 @@ import javax.inject.Inject
class DetailsClusterViewModel @Inject constructor( class DetailsClusterViewModel @Inject constructor(
@ApplicationContext private val context: Context, @ApplicationContext private val context: Context,
authProvider: AuthProvider, authProvider: AuthProvider,
private val httpClient: IProxyHttpClient private val httpClient: IHttpClient
) : ViewModel() { ) : ViewModel() {
private val TAG = DetailsClusterViewModel::class.java.simpleName private val TAG = DetailsClusterViewModel::class.java.simpleName

View File

@@ -6,7 +6,7 @@ import androidx.lifecycle.ViewModel
import androidx.lifecycle.viewModelScope import androidx.lifecycle.viewModelScope
import com.aurora.gplayapi.data.models.App import com.aurora.gplayapi.data.models.App
import com.aurora.gplayapi.helpers.AppDetailsHelper 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.AuthProvider
import dagger.hilt.android.lifecycle.HiltViewModel import dagger.hilt.android.lifecycle.HiltViewModel
import dagger.hilt.android.qualifiers.ApplicationContext import dagger.hilt.android.qualifiers.ApplicationContext
@@ -20,7 +20,7 @@ import javax.inject.Inject
class DetailsMoreViewModel @Inject constructor( class DetailsMoreViewModel @Inject constructor(
@ApplicationContext private val context: Context, @ApplicationContext private val context: Context,
private val authProvider: AuthProvider, private val authProvider: AuthProvider,
private val httpClient: IProxyHttpClient private val httpClient: IHttpClient
) : ViewModel() { ) : ViewModel() {
private val TAG = DetailsMoreViewModel::class.java.simpleName private val TAG = DetailsMoreViewModel::class.java.simpleName

View File

@@ -31,8 +31,8 @@ import com.aurora.gplayapi.data.models.details.DevStream
import com.aurora.gplayapi.helpers.AppDetailsHelper import com.aurora.gplayapi.helpers.AppDetailsHelper
import com.aurora.gplayapi.helpers.StreamHelper import com.aurora.gplayapi.helpers.StreamHelper
import com.aurora.gplayapi.helpers.contracts.StreamContract 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.model.ViewState
import com.aurora.store.data.network.IProxyHttpClient
import com.aurora.store.data.providers.AuthProvider import com.aurora.store.data.providers.AuthProvider
import dagger.hilt.android.lifecycle.HiltViewModel import dagger.hilt.android.lifecycle.HiltViewModel
import dagger.hilt.android.qualifiers.ApplicationContext import dagger.hilt.android.qualifiers.ApplicationContext
@@ -46,7 +46,7 @@ import javax.inject.Inject
class DevProfileViewModel @Inject constructor( class DevProfileViewModel @Inject constructor(
@ApplicationContext private val context: Context, @ApplicationContext private val context: Context,
private val authProvider: AuthProvider, private val authProvider: AuthProvider,
private val httpClient: IProxyHttpClient private val httpClient: IHttpClient
) : ViewModel() { ) : ViewModel() {
private val TAG = DevProfileViewModel::class.java.simpleName private val TAG = DevProfileViewModel::class.java.simpleName

View File

@@ -29,9 +29,9 @@ import com.aurora.gplayapi.data.models.StreamBundle
import com.aurora.gplayapi.data.models.StreamCluster import com.aurora.gplayapi.data.models.StreamCluster
import com.aurora.gplayapi.helpers.contracts.StreamContract import com.aurora.gplayapi.helpers.contracts.StreamContract
import com.aurora.gplayapi.helpers.web.WebStreamHelper import com.aurora.gplayapi.helpers.web.WebStreamHelper
import com.aurora.gplayapi.network.IHttpClient
import com.aurora.store.HomeStash import com.aurora.store.HomeStash
import com.aurora.store.data.model.ViewState import com.aurora.store.data.model.ViewState
import com.aurora.store.data.network.IProxyHttpClient
import dagger.hilt.android.lifecycle.HiltViewModel import dagger.hilt.android.lifecycle.HiltViewModel
import dagger.hilt.android.qualifiers.ApplicationContext import dagger.hilt.android.qualifiers.ApplicationContext
import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.Dispatchers
@@ -43,7 +43,7 @@ import javax.inject.Inject
@SuppressLint("StaticFieldLeak") // false positive, see https://github.com/google/dagger/issues/3253 @SuppressLint("StaticFieldLeak") // false positive, see https://github.com/google/dagger/issues/3253
class StreamViewModel @Inject constructor( class StreamViewModel @Inject constructor(
@ApplicationContext private val context: Context, @ApplicationContext private val context: Context,
private val httpClient: IProxyHttpClient private val httpClient: IHttpClient
) : ViewModel() { ) : ViewModel() {
private val TAG = StreamViewModel::class.java.simpleName private val TAG = StreamViewModel::class.java.simpleName

View File

@@ -27,7 +27,7 @@ import androidx.lifecycle.viewModelScope
import com.aurora.gplayapi.data.models.Review import com.aurora.gplayapi.data.models.Review
import com.aurora.gplayapi.data.models.ReviewCluster import com.aurora.gplayapi.data.models.ReviewCluster
import com.aurora.gplayapi.helpers.ReviewsHelper 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 com.aurora.store.data.providers.AuthProvider
import dagger.hilt.android.lifecycle.HiltViewModel import dagger.hilt.android.lifecycle.HiltViewModel
import dagger.hilt.android.qualifiers.ApplicationContext import dagger.hilt.android.qualifiers.ApplicationContext
@@ -41,7 +41,7 @@ import javax.inject.Inject
class ReviewViewModel @Inject constructor( class ReviewViewModel @Inject constructor(
@ApplicationContext private val context: Context, @ApplicationContext private val context: Context,
private val authProvider: AuthProvider, private val authProvider: AuthProvider,
private val httpClient: IProxyHttpClient private val httpClient: IHttpClient
) : ViewModel() { ) : ViewModel() {
var reviewsHelper: ReviewsHelper = ReviewsHelper(authProvider.authData!!) var reviewsHelper: ReviewsHelper = ReviewsHelper(authProvider.authData!!)

View File

@@ -30,7 +30,7 @@ import com.aurora.gplayapi.data.models.SearchBundle
import com.aurora.gplayapi.helpers.SearchHelper import com.aurora.gplayapi.helpers.SearchHelper
import com.aurora.gplayapi.helpers.contracts.SearchContract import com.aurora.gplayapi.helpers.contracts.SearchContract
import com.aurora.gplayapi.helpers.web.WebSearchHelper 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.AuthProvider
import com.aurora.store.data.providers.FilterProvider import com.aurora.store.data.providers.FilterProvider
import dagger.hilt.android.lifecycle.HiltViewModel import dagger.hilt.android.lifecycle.HiltViewModel
@@ -46,7 +46,7 @@ class SearchResultViewModel @Inject constructor(
val filterProvider: FilterProvider, val filterProvider: FilterProvider,
@ApplicationContext private val context: Context, @ApplicationContext private val context: Context,
private val authProvider: AuthProvider, private val authProvider: AuthProvider,
private val httpClient: IProxyHttpClient private val httpClient: IHttpClient
) : ViewModel() { ) : ViewModel() {
private val TAG = SearchResultViewModel::class.java.simpleName private val TAG = SearchResultViewModel::class.java.simpleName

View File

@@ -28,7 +28,7 @@ import com.aurora.gplayapi.SearchSuggestEntry
import com.aurora.gplayapi.helpers.SearchHelper import com.aurora.gplayapi.helpers.SearchHelper
import com.aurora.gplayapi.helpers.contracts.SearchContract import com.aurora.gplayapi.helpers.contracts.SearchContract
import com.aurora.gplayapi.helpers.web.WebSearchHelper 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.AuthProvider
import dagger.hilt.android.lifecycle.HiltViewModel import dagger.hilt.android.lifecycle.HiltViewModel
import dagger.hilt.android.qualifiers.ApplicationContext import dagger.hilt.android.qualifiers.ApplicationContext
@@ -41,7 +41,7 @@ import javax.inject.Inject
class SearchSuggestionViewModel @Inject constructor( class SearchSuggestionViewModel @Inject constructor(
@ApplicationContext private val context: Context, @ApplicationContext private val context: Context,
private val authProvider: AuthProvider, private val authProvider: AuthProvider,
private val httpClient: IProxyHttpClient private val httpClient: IHttpClient
) : ViewModel() { ) : ViewModel() {
val liveSearchSuggestions: MutableLiveData<List<SearchSuggestEntry>> = MutableLiveData() val liveSearchSuggestions: MutableLiveData<List<SearchSuggestEntry>> = MutableLiveData()

View File

@@ -30,8 +30,8 @@ import com.aurora.gplayapi.data.models.StreamCluster
import com.aurora.gplayapi.helpers.contracts.CategoryStreamContract import com.aurora.gplayapi.helpers.contracts.CategoryStreamContract
import com.aurora.gplayapi.helpers.contracts.StreamContract import com.aurora.gplayapi.helpers.contracts.StreamContract
import com.aurora.gplayapi.helpers.web.WebCategoryStreamHelper 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.model.ViewState
import com.aurora.store.data.network.IProxyHttpClient
import dagger.hilt.android.lifecycle.HiltViewModel import dagger.hilt.android.lifecycle.HiltViewModel
import dagger.hilt.android.qualifiers.ApplicationContext import dagger.hilt.android.qualifiers.ApplicationContext
import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.Dispatchers
@@ -43,7 +43,7 @@ import javax.inject.Inject
@SuppressLint("StaticFieldLeak") // false positive, see https://github.com/google/dagger/issues/3253 @SuppressLint("StaticFieldLeak") // false positive, see https://github.com/google/dagger/issues/3253
class CategoryStreamViewModel @Inject constructor( class CategoryStreamViewModel @Inject constructor(
@ApplicationContext private val context: Context, @ApplicationContext private val context: Context,
private val httpClient: IProxyHttpClient private val httpClient: IHttpClient
) : ViewModel() { ) : ViewModel() {
private val TAG = CategoryStreamViewModel::class.java.simpleName private val TAG = CategoryStreamViewModel::class.java.simpleName

View File

@@ -27,9 +27,9 @@ import androidx.lifecycle.viewModelScope
import com.aurora.gplayapi.data.models.StreamCluster import com.aurora.gplayapi.data.models.StreamCluster
import com.aurora.gplayapi.helpers.contracts.TopChartsContract import com.aurora.gplayapi.helpers.contracts.TopChartsContract
import com.aurora.gplayapi.helpers.web.WebTopChartsHelper import com.aurora.gplayapi.helpers.web.WebTopChartsHelper
import com.aurora.gplayapi.network.IHttpClient
import com.aurora.store.TopChartStash import com.aurora.store.TopChartStash
import com.aurora.store.data.model.ViewState import com.aurora.store.data.model.ViewState
import com.aurora.store.data.network.IProxyHttpClient
import dagger.hilt.android.lifecycle.HiltViewModel import dagger.hilt.android.lifecycle.HiltViewModel
import dagger.hilt.android.qualifiers.ApplicationContext import dagger.hilt.android.qualifiers.ApplicationContext
import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.Dispatchers
@@ -41,7 +41,7 @@ import javax.inject.Inject
@SuppressLint("StaticFieldLeak") // false positive, see https://github.com/google/dagger/issues/3253 @SuppressLint("StaticFieldLeak") // false positive, see https://github.com/google/dagger/issues/3253
class TopChartViewModel @Inject constructor( class TopChartViewModel @Inject constructor(
@ApplicationContext private val context: Context, @ApplicationContext private val context: Context,
private val httpClient: IProxyHttpClient private val httpClient: IHttpClient
): ViewModel() { ): ViewModel() {
private val webTopChartsHelper: TopChartsContract = WebTopChartsHelper() private val webTopChartsHelper: TopChartsContract = WebTopChartsHelper()