Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Unverified Commit d69a0f5a authored by Marvin W.'s avatar Marvin W. 🐿️
Browse files

Only use a single Volley instance per process

parent e3c7405f
Loading
Loading
Loading
Loading
+2 −1
Original line number Diff line number Diff line
@@ -20,6 +20,7 @@ import com.android.volley.toolbox.Volley
import org.json.JSONArray
import org.json.JSONException
import org.json.JSONObject
import org.microg.gms.utils.singleInstanceOf
import org.microg.gms.utils.toHexString
import java.io.UnsupportedEncodingException
import java.lang.RuntimeException
@@ -31,7 +32,7 @@ import kotlin.coroutines.suspendCoroutine
private const val TAG = "GmsFirebaseAuthClient"

class IdentityToolkitClient(context: Context, private val apiKey: String, private val packageName: String? = null, private val certSha1Hash: ByteArray? = null) {
    private val queue = Volley.newRequestQueue(context)
    private val queue = singleInstanceOf { Volley.newRequestQueue(context.applicationContext) }

    private fun buildRelyingPartyUrl(method: String) = "https://www.googleapis.com/identitytoolkit/v3/relyingparty/$method?key=$apiKey"
    private fun buildStsUrl(method: String) = "https://securetoken.googleapis.com/v1/$method?key=$apiKey"
+2 −1
Original line number Diff line number Diff line
@@ -27,6 +27,7 @@ import kotlinx.coroutines.CompletableDeferred
import okio.ByteString.Companion.decodeHex
import org.microg.gms.appinvite.*
import org.microg.gms.common.Constants
import org.microg.gms.utils.singleInstanceOf
import java.util.*

private const val TAG = "AppInviteActivity"
@@ -37,7 +38,7 @@ private const val APPINVITE_OPENED_FROM_PLAY_STORE = "com.google.android.gms.app
private const val APPINVITE_REFERRAL_BUNDLE = "com.google.android.gms.appinvite.REFERRAL_BUNDLE"

class AppInviteActivity : AppCompatActivity() {
    private val queue by lazy { Volley.newRequestQueue(this) }
    private val queue by lazy { singleInstanceOf { Volley.newRequestQueue(applicationContext) } }

    private val Int.px: Int get() = (this * resources.displayMetrics.density).toInt()

+42 −0
Original line number Diff line number Diff line
/*
 * SPDX-FileCopyrightText: 2024 microG Project Team
 * SPDX-License-Identifier: Apache-2.0
 */

package org.microg.gms.utils

private val singleInstanceLock = Any()
private val singleInstanceMap: MutableMap<Class<*>, Any> = hashMapOf()

fun <T : Any> singleInstanceOf(tClass: Class<T>, tCreator: () -> T): T {
    val tVolatileItem = singleInstanceMap[tClass]
    @Suppress("UNCHECKED_CAST")
    if (tVolatileItem != null && tClass.isAssignableFrom(tVolatileItem.javaClass)) return tVolatileItem as T
    val tLock = synchronized(singleInstanceLock) {
        val tItem = singleInstanceMap[tClass]
        if (tItem != null) {
            @Suppress("UNCHECKED_CAST")
            if (tClass.isAssignableFrom(tItem.javaClass)) return tItem as T
            tItem
        } else {
            val tLock = Any()
            singleInstanceMap[tClass] = tLock
            tLock
        }
    }
    synchronized(tLock) {
        val tItem = synchronized(singleInstanceMap) { singleInstanceMap[tClass] }
        if (tItem == null) throw IllegalStateException()
        @Suppress("UNCHECKED_CAST")
        if (tClass.isAssignableFrom(tItem.javaClass)) return tItem as T
        if (tItem != tLock) throw IllegalStateException()

        val tNewItem = tCreator()
        synchronized(singleInstanceMap) {
            singleInstanceMap[tClass] = tNewItem
        }
        return tNewItem
    }
}

inline fun <reified T : Any> singleInstanceOf(noinline tCreator: () -> T): T = singleInstanceOf(T::class.java, tCreator)
 No newline at end of file
+2 −1
Original line number Diff line number Diff line
@@ -34,6 +34,7 @@ import okio.ByteString.Companion.toByteString
import org.microg.gms.common.Constants
import org.microg.gms.profile.Build
import org.microg.gms.utils.getFirstSignatureDigest
import org.microg.gms.utils.singleInstanceOf
import java.nio.ByteBuffer
import java.security.SecureRandom
import java.util.Random
@@ -45,7 +46,7 @@ import kotlin.math.abs

class PoTokenHelper(context: Context) {

    private val volleyQueue = Volley.newRequestQueue(context)
    private val volleyQueue = singleInstanceOf { Volley.newRequestQueue(context.applicationContext) }

    private fun buildKeySet(): KeySet {
        val keyId = abs(Random().nextInt())
+2 −1
Original line number Diff line number Diff line
@@ -32,12 +32,13 @@ import org.microg.gms.profile.Build
import org.microg.gms.profile.ProfileManager
import org.microg.gms.settings.SettingsContract.CheckIn
import org.microg.gms.settings.SettingsContract.getSettings
import org.microg.gms.utils.singleInstanceOf
import javax.crypto.Mac
import javax.crypto.spec.SecretKeySpec
import kotlin.random.Random

class AppCertManager(private val context: Context) {
    private val queue = Volley.newRequestQueue(context)
    private val queue = singleInstanceOf { Volley.newRequestQueue(context.applicationContext) }

    private fun readDeviceKey() {
        try {
Loading