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
|
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()
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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.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
|
||||||
|
|||||||
@@ -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) {
|
||||||
|
|||||||
@@ -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))
|
||||||
|
|||||||
@@ -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
|
||||||
) {
|
) {
|
||||||
|
|
||||||
|
|||||||
@@ -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!!)
|
||||||
|
|||||||
@@ -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) {
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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
|
||||||
|
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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!!)
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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()
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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()
|
||||||
|
|||||||
Reference in New Issue
Block a user