Loading firebase-auth/core/src/main/kotlin/org/microg/gms/firebase/auth/IdentityToolkitClient.kt +2 −1 Original line number Diff line number Diff line Loading @@ -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 Loading @@ -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" Loading play-services-appinvite/core/src/main/kotlin/org/microg/gms/appinivite/AppInviteActivity.kt +2 −1 Original line number Diff line number Diff line Loading @@ -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" Loading @@ -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() Loading play-services-base/core/src/main/kotlin/org/microg/gms/utils/SingleInstanceUtil.kt 0 → 100644 +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 play-services-core/src/main/kotlin/com/google/android/gms/potokens/utils/PoTokenHelper.kt +2 −1 Original line number Diff line number Diff line Loading @@ -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 Loading @@ -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()) Loading play-services-core/src/main/kotlin/org/microg/gms/auth/appcert/AppCertManager.kt +2 −1 Original line number Diff line number Diff line Loading @@ -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 Loading
firebase-auth/core/src/main/kotlin/org/microg/gms/firebase/auth/IdentityToolkitClient.kt +2 −1 Original line number Diff line number Diff line Loading @@ -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 Loading @@ -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" Loading
play-services-appinvite/core/src/main/kotlin/org/microg/gms/appinivite/AppInviteActivity.kt +2 −1 Original line number Diff line number Diff line Loading @@ -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" Loading @@ -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() Loading
play-services-base/core/src/main/kotlin/org/microg/gms/utils/SingleInstanceUtil.kt 0 → 100644 +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
play-services-core/src/main/kotlin/com/google/android/gms/potokens/utils/PoTokenHelper.kt +2 −1 Original line number Diff line number Diff line Loading @@ -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 Loading @@ -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()) Loading
play-services-core/src/main/kotlin/org/microg/gms/auth/appcert/AppCertManager.kt +2 −1 Original line number Diff line number Diff line Loading @@ -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