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
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()
}
}

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.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

View File

@@ -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) {

View File

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

View File

@@ -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
) {

View File

@@ -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!!)

View File

@@ -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) {

View File

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

View File

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

View File

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

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.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

View File

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

View File

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

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.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

View File

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

View File

@@ -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!!)

View File

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

View File

@@ -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()

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.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

View File

@@ -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()