Give ability to configure the Firebase push gateway.
This commit is contained in:
@@ -17,4 +17,6 @@ interface EnterpriseService {
|
||||
|
||||
fun semanticColorsLight(): SemanticColors
|
||||
fun semanticColorsDark(): SemanticColors
|
||||
|
||||
fun firebasePushGateway(): String?
|
||||
}
|
||||
|
||||
@@ -27,4 +27,6 @@ class DefaultEnterpriseService @Inject constructor() : EnterpriseService {
|
||||
override fun semanticColorsLight(): SemanticColors = compoundColorsLight
|
||||
|
||||
override fun semanticColorsDark(): SemanticColors = compoundColorsDark
|
||||
|
||||
override fun firebasePushGateway(): String? = null
|
||||
}
|
||||
|
||||
@@ -19,6 +19,7 @@ class FakeEnterpriseService(
|
||||
private val defaultHomeserverResult: () -> String? = { A_FAKE_HOMESERVER },
|
||||
private val semanticColorsLightResult: () -> SemanticColors = { lambdaError() },
|
||||
private val semanticColorsDarkResult: () -> SemanticColors = { lambdaError() },
|
||||
private val firebasePushGatewayResult: () -> String? = { lambdaError() },
|
||||
) : EnterpriseService {
|
||||
override suspend fun isEnterpriseUser(sessionId: SessionId): Boolean = simulateLongTask {
|
||||
isEnterpriseUserResult(sessionId)
|
||||
@@ -36,6 +37,10 @@ class FakeEnterpriseService(
|
||||
return semanticColorsDarkResult()
|
||||
}
|
||||
|
||||
override fun firebasePushGateway(): String? {
|
||||
return firebasePushGatewayResult()
|
||||
}
|
||||
|
||||
companion object {
|
||||
const val A_FAKE_HOMESERVER = "a_fake_homeserver"
|
||||
}
|
||||
|
||||
@@ -50,6 +50,7 @@ setupAnvil()
|
||||
dependencies {
|
||||
implementation(libs.dagger)
|
||||
implementation(libs.androidx.corektx)
|
||||
implementation(projects.features.enterprise.api)
|
||||
implementation(projects.libraries.architecture)
|
||||
implementation(projects.libraries.core)
|
||||
implementation(projects.libraries.di)
|
||||
@@ -73,6 +74,7 @@ dependencies {
|
||||
testImplementation(libs.test.truth)
|
||||
testImplementation(libs.test.turbine)
|
||||
testImplementation(libs.test.robolectric)
|
||||
testImplementation(projects.features.enterprise.test)
|
||||
testImplementation(projects.libraries.matrix.test)
|
||||
testImplementation(projects.libraries.push.test)
|
||||
testImplementation(projects.libraries.pushstore.test)
|
||||
|
||||
@@ -0,0 +1,26 @@
|
||||
/*
|
||||
* Copyright 2025 New Vector Ltd.
|
||||
*
|
||||
* SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial
|
||||
* Please see LICENSE files in the repository root for full details.
|
||||
*/
|
||||
|
||||
package io.element.android.libraries.pushproviders.firebase
|
||||
|
||||
import com.squareup.anvil.annotations.ContributesBinding
|
||||
import io.element.android.features.enterprise.api.EnterpriseService
|
||||
import io.element.android.libraries.di.AppScope
|
||||
import javax.inject.Inject
|
||||
|
||||
interface FirebaseGatewayProvider {
|
||||
fun getFirebaseGateway(): String
|
||||
}
|
||||
|
||||
@ContributesBinding(AppScope::class)
|
||||
class DefaultFirebaseGatewayProvider @Inject constructor(
|
||||
private val enterpriseService: EnterpriseService,
|
||||
) : FirebaseGatewayProvider {
|
||||
override fun getFirebaseGateway(): String {
|
||||
return enterpriseService.firebasePushGateway() ?: FirebaseConfig.PUSHER_HTTP_URL
|
||||
}
|
||||
}
|
||||
@@ -36,6 +36,7 @@ class DefaultFirebaseNewTokenHandler @Inject constructor(
|
||||
private val userPushStoreFactory: UserPushStoreFactory,
|
||||
private val matrixClientProvider: MatrixClientProvider,
|
||||
private val firebaseStore: FirebaseStore,
|
||||
private val firebaseGatewayProvider: FirebaseGatewayProvider,
|
||||
) : FirebaseNewTokenHandler {
|
||||
override suspend fun handle(firebaseToken: String) {
|
||||
firebaseStore.storeFcmToken(firebaseToken)
|
||||
@@ -55,7 +56,7 @@ class DefaultFirebaseNewTokenHandler @Inject constructor(
|
||||
.registerPusher(
|
||||
matrixClient = client,
|
||||
pushKey = firebaseToken,
|
||||
gateway = FirebaseConfig.PUSHER_HTTP_URL,
|
||||
gateway = firebaseGatewayProvider.getFirebaseGateway(),
|
||||
)
|
||||
.onFailure {
|
||||
Timber.tag(loggerTag.value).e(it, "Failed to register pusher for session $sessionId")
|
||||
|
||||
@@ -27,6 +27,7 @@ class FirebasePushProvider @Inject constructor(
|
||||
private val pusherSubscriber: PusherSubscriber,
|
||||
private val isPlayServiceAvailable: IsPlayServiceAvailable,
|
||||
private val firebaseTokenRotator: FirebaseTokenRotator,
|
||||
private val firebaseGatewayProvider: FirebaseGatewayProvider,
|
||||
) : PushProvider {
|
||||
override val index = FirebaseConfig.INDEX
|
||||
override val name = FirebaseConfig.NAME
|
||||
@@ -48,7 +49,7 @@ class FirebasePushProvider @Inject constructor(
|
||||
return pusherSubscriber.registerPusher(
|
||||
matrixClient = matrixClient,
|
||||
pushKey = pushKey,
|
||||
gateway = FirebaseConfig.PUSHER_HTTP_URL,
|
||||
gateway = firebaseGatewayProvider.getFirebaseGateway(),
|
||||
)
|
||||
}
|
||||
|
||||
@@ -60,7 +61,7 @@ class FirebasePushProvider @Inject constructor(
|
||||
Timber.tag(loggerTag.value).w("Unable to unregister pusher, Firebase token is not known.")
|
||||
Result.success(Unit)
|
||||
} else {
|
||||
pusherSubscriber.unregisterPusher(matrixClient, pushKey, FirebaseConfig.PUSHER_HTTP_URL)
|
||||
pusherSubscriber.unregisterPusher(matrixClient, pushKey, firebaseGatewayProvider.getFirebaseGateway())
|
||||
}
|
||||
}
|
||||
|
||||
@@ -72,7 +73,7 @@ class FirebasePushProvider @Inject constructor(
|
||||
override suspend fun getCurrentUserPushConfig(): CurrentUserPushConfig? {
|
||||
return firebaseStore.getFcmToken()?.let { fcmToken ->
|
||||
CurrentUserPushConfig(
|
||||
url = FirebaseConfig.PUSHER_HTTP_URL,
|
||||
url = firebaseGatewayProvider.getFirebaseGateway(),
|
||||
pushKey = fcmToken
|
||||
)
|
||||
}
|
||||
|
||||
@@ -79,8 +79,8 @@ class DefaultFirebaseNewTokenHandlerTest {
|
||||
registerPusherResult.assertions()
|
||||
.isCalledExactly(2)
|
||||
.withSequence(
|
||||
listOf(value(aMatrixClient1), value("aToken"), value(FirebaseConfig.PUSHER_HTTP_URL)),
|
||||
listOf(value(aMatrixClient3), value("aToken"), value(FirebaseConfig.PUSHER_HTTP_URL)),
|
||||
listOf(value(aMatrixClient1), value("aToken"), value(A_FIREBASE_GATEWAY)),
|
||||
listOf(value(aMatrixClient3), value("aToken"), value(A_FIREBASE_GATEWAY)),
|
||||
)
|
||||
}
|
||||
|
||||
@@ -130,7 +130,7 @@ class DefaultFirebaseNewTokenHandlerTest {
|
||||
registerPusherResult.assertions()
|
||||
registerPusherResult.assertions()
|
||||
.isCalledOnce()
|
||||
.with(value(aMatrixClient1), value("aToken"), value(FirebaseConfig.PUSHER_HTTP_URL))
|
||||
.with(value(aMatrixClient1), value("aToken"), value(A_FIREBASE_GATEWAY))
|
||||
}
|
||||
|
||||
private fun createDefaultFirebaseNewTokenHandler(
|
||||
@@ -139,13 +139,15 @@ class DefaultFirebaseNewTokenHandlerTest {
|
||||
userPushStoreFactory: UserPushStoreFactory = FakeUserPushStoreFactory(),
|
||||
matrixClientProvider: MatrixClientProvider = FakeMatrixClientProvider(),
|
||||
firebaseStore: FirebaseStore = InMemoryFirebaseStore(),
|
||||
firebaseGatewayProvider: FirebaseGatewayProvider = FakeFirebaseGatewayProvider(),
|
||||
): FirebaseNewTokenHandler {
|
||||
return DefaultFirebaseNewTokenHandler(
|
||||
pusherSubscriber = pusherSubscriber,
|
||||
sessionStore = sessionStore,
|
||||
userPushStoreFactory = userPushStoreFactory,
|
||||
matrixClientProvider = matrixClientProvider,
|
||||
firebaseStore = firebaseStore
|
||||
firebaseStore = firebaseStore,
|
||||
firebaseGatewayProvider = firebaseGatewayProvider,
|
||||
)
|
||||
}
|
||||
}
|
||||
|
||||
@@ -0,0 +1,16 @@
|
||||
/*
|
||||
* Copyright 2025 New Vector Ltd.
|
||||
*
|
||||
* SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial
|
||||
* Please see LICENSE files in the repository root for full details.
|
||||
*/
|
||||
|
||||
package io.element.android.libraries.pushproviders.firebase
|
||||
|
||||
const val A_FIREBASE_GATEWAY = "aGateway"
|
||||
|
||||
class FakeFirebaseGatewayProvider(
|
||||
private val firebaseGatewayResult: () -> String = { A_FIREBASE_GATEWAY }
|
||||
) : FirebaseGatewayProvider {
|
||||
override fun getFirebaseGateway() = firebaseGatewayResult()
|
||||
}
|
||||
@@ -70,7 +70,7 @@ class FirebasePushProviderTest {
|
||||
assertThat(result).isEqualTo(Result.success(Unit))
|
||||
registerPusherResultLambda.assertions()
|
||||
.isCalledOnce()
|
||||
.with(value(matrixClient), value("aToken"), value(FirebaseConfig.PUSHER_HTTP_URL))
|
||||
.with(value(matrixClient), value("aToken"), value(A_FIREBASE_GATEWAY))
|
||||
}
|
||||
|
||||
@Test
|
||||
@@ -117,7 +117,7 @@ class FirebasePushProviderTest {
|
||||
assertThat(result).isEqualTo(Result.success(Unit))
|
||||
unregisterPusherResultLambda.assertions()
|
||||
.isCalledOnce()
|
||||
.with(value(matrixClient), value("aToken"), value(FirebaseConfig.PUSHER_HTTP_URL))
|
||||
.with(value(matrixClient), value("aToken"), value(A_FIREBASE_GATEWAY))
|
||||
}
|
||||
|
||||
@Test
|
||||
@@ -164,7 +164,7 @@ class FirebasePushProviderTest {
|
||||
),
|
||||
)
|
||||
val result = firebasePushProvider.getCurrentUserPushConfig()
|
||||
assertThat(result).isEqualTo(CurrentUserPushConfig(FirebaseConfig.PUSHER_HTTP_URL, "aToken"))
|
||||
assertThat(result).isEqualTo(CurrentUserPushConfig(A_FIREBASE_GATEWAY, "aToken"))
|
||||
}
|
||||
|
||||
@Test
|
||||
@@ -194,12 +194,14 @@ class FirebasePushProviderTest {
|
||||
pusherSubscriber: PusherSubscriber = FakePusherSubscriber(),
|
||||
isPlayServiceAvailable: IsPlayServiceAvailable = FakeIsPlayServiceAvailable(false),
|
||||
firebaseTokenRotator: FirebaseTokenRotator = FakeFirebaseTokenRotator(),
|
||||
firebaseGatewayProvider: FirebaseGatewayProvider = FakeFirebaseGatewayProvider()
|
||||
): FirebasePushProvider {
|
||||
return FirebasePushProvider(
|
||||
firebaseStore = firebaseStore,
|
||||
pusherSubscriber = pusherSubscriber,
|
||||
isPlayServiceAvailable = isPlayServiceAvailable,
|
||||
firebaseTokenRotator = firebaseTokenRotator,
|
||||
firebaseGatewayProvider = firebaseGatewayProvider,
|
||||
)
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user