diff --git a/app/build.gradle.kts b/app/build.gradle.kts index 8e6d68bada4..d06fb37cb3c 100644 --- a/app/build.gradle.kts +++ b/app/build.gradle.kts @@ -337,3 +337,12 @@ fun Project.configureLicensesTasks(reportingExtension: ReportingExtension) { } } } + +configurations.all { + resolutionStrategy { + dependencySubstitution { + val tink = libs.google.tink.get() + substitute(module("com.google.crypto.tink:tink")).using(module("${tink.group}:${tink.name}:${tink.version}")) + } + } +} diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 914c11473e0..a3043002e4d 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -177,7 +177,7 @@ sqldelight-driver-jvm = { module = "app.cash.sqldelight:sqlite-driver", version. sqldelight-coroutines = { module = "app.cash.sqldelight:coroutines-extensions", version.ref = "sqldelight" } sqlcipher = "net.zetetic:android-database-sqlcipher:4.5.4" sqlite = "androidx.sqlite:sqlite-ktx:2.5.0" -unifiedpush = "com.github.UnifiedPush:android-connector:2.4.0" +unifiedpush = "org.unifiedpush.android:connector:3.0.9" otaliastudios_transcoder = "com.otaliastudios:transcoder:0.11.2" vanniktech_blurhash = "com.vanniktech:blurhash:0.3.0" telephoto_zoomableimage = { module = "me.saket.telephoto:zoomable-image-coil", version.ref = "telephoto" } diff --git a/libraries/pushproviders/unifiedpush/build.gradle.kts b/libraries/pushproviders/unifiedpush/build.gradle.kts index 1dec445c003..c98d98f64eb 100644 --- a/libraries/pushproviders/unifiedpush/build.gradle.kts +++ b/libraries/pushproviders/unifiedpush/build.gradle.kts @@ -42,8 +42,7 @@ dependencies { implementation(libs.serialization.json) // UnifiedPush library - api(libs.unifiedpush) - + implementation(libs.unifiedpush) testImplementation(libs.coroutines.test) testImplementation(libs.test.junit) testImplementation(libs.test.robolectric) diff --git a/libraries/pushproviders/unifiedpush/src/main/kotlin/io/element/android/libraries/pushproviders/unifiedpush/RegisterUnifiedPushUseCase.kt b/libraries/pushproviders/unifiedpush/src/main/kotlin/io/element/android/libraries/pushproviders/unifiedpush/RegisterUnifiedPushUseCase.kt index dc32dbff763..5df7c1e5c3a 100644 --- a/libraries/pushproviders/unifiedpush/src/main/kotlin/io/element/android/libraries/pushproviders/unifiedpush/RegisterUnifiedPushUseCase.kt +++ b/libraries/pushproviders/unifiedpush/src/main/kotlin/io/element/android/libraries/pushproviders/unifiedpush/RegisterUnifiedPushUseCase.kt @@ -33,7 +33,7 @@ class DefaultRegisterUnifiedPushUseCase @Inject constructor( UnifiedPush.saveDistributor(context, distributor.value) // This will trigger the callback // VectorUnifiedPushMessagingReceiver.onNewEndpoint - UnifiedPush.registerApp(context = context, instance = clientSecret) + UnifiedPush.register(context = context, instance = clientSecret) // Wait for VectorUnifiedPushMessagingReceiver.onNewEndpoint to proceed return runCatching { withTimeout(30.seconds) { diff --git a/libraries/pushproviders/unifiedpush/src/main/kotlin/io/element/android/libraries/pushproviders/unifiedpush/UnregisterUnifiedPushUseCase.kt b/libraries/pushproviders/unifiedpush/src/main/kotlin/io/element/android/libraries/pushproviders/unifiedpush/UnregisterUnifiedPushUseCase.kt index e41aa6a51f1..24b9676c11c 100644 --- a/libraries/pushproviders/unifiedpush/src/main/kotlin/io/element/android/libraries/pushproviders/unifiedpush/UnregisterUnifiedPushUseCase.kt +++ b/libraries/pushproviders/unifiedpush/src/main/kotlin/io/element/android/libraries/pushproviders/unifiedpush/UnregisterUnifiedPushUseCase.kt @@ -53,6 +53,6 @@ class DefaultUnregisterUnifiedPushUseCase @Inject constructor( override fun cleanup(clientSecret: String) { unifiedPushStore.storeUpEndpoint(clientSecret, null) unifiedPushStore.storePushGateway(clientSecret, null) - UnifiedPush.unregisterApp(context, clientSecret) + UnifiedPush.unregister(context, clientSecret) } } diff --git a/libraries/pushproviders/unifiedpush/src/main/kotlin/io/element/android/libraries/pushproviders/unifiedpush/VectorUnifiedPushMessagingReceiver.kt b/libraries/pushproviders/unifiedpush/src/main/kotlin/io/element/android/libraries/pushproviders/unifiedpush/VectorUnifiedPushMessagingReceiver.kt index 684e08be5b3..9cb7e8e60f7 100644 --- a/libraries/pushproviders/unifiedpush/src/main/kotlin/io/element/android/libraries/pushproviders/unifiedpush/VectorUnifiedPushMessagingReceiver.kt +++ b/libraries/pushproviders/unifiedpush/src/main/kotlin/io/element/android/libraries/pushproviders/unifiedpush/VectorUnifiedPushMessagingReceiver.kt @@ -16,7 +16,10 @@ import io.element.android.libraries.pushproviders.unifiedpush.registration.Endpo import io.element.android.libraries.pushproviders.unifiedpush.registration.RegistrationResult import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.launch +import org.unifiedpush.android.connector.FailedReason import org.unifiedpush.android.connector.MessagingReceiver +import org.unifiedpush.android.connector.data.PushEndpoint +import org.unifiedpush.android.connector.data.PushMessage import timber.log.Timber import javax.inject.Inject @@ -45,15 +48,15 @@ class VectorUnifiedPushMessagingReceiver : MessagingReceiver() { * @param message the message * @param instance connection, for multi-account */ - override fun onMessage(context: Context, message: ByteArray, instance: String) { - Timber.tag(loggerTag.value).w("New message") + override fun onMessage(context: Context, message: PushMessage, instance: String) { + Timber.tag(loggerTag.value).d("New message, decrypted: ${message.decrypted}") coroutineScope.launch { - val pushData = pushParser.parse(message, instance) + val pushData = pushParser.parse(message.content, instance) if (pushData == null) { Timber.tag(loggerTag.value).w("Invalid data received from UnifiedPush") pushHandler.handleInvalid( providerInfo = "${UnifiedPushConfig.NAME} - $instance", - data = String(message), + data = String(message.content), ) } else { pushHandler.handle( @@ -68,20 +71,20 @@ class VectorUnifiedPushMessagingReceiver : MessagingReceiver() { * Called when a new endpoint is to be used for sending push messages. * You should send the endpoint to your application server and sync for missing notifications. */ - override fun onNewEndpoint(context: Context, endpoint: String, instance: String) { + override fun onNewEndpoint(context: Context, endpoint: PushEndpoint, instance: String) { Timber.tag(loggerTag.value).w("onNewEndpoint: $endpoint") coroutineScope.launch { - val gateway = unifiedPushGatewayResolver.getGateway(endpoint) + val gateway = unifiedPushGatewayResolver.getGateway(endpoint.url) .let { gatewayResult -> unifiedPushGatewayUrlResolver.resolve(gatewayResult, instance) } unifiedPushStore.storePushGateway(instance, gateway) - val result = newGatewayHandler.handle(endpoint, gateway, instance) + val result = newGatewayHandler.handle(endpoint.url, gateway, instance) .onFailure { Timber.tag(loggerTag.value).e(it, "Failed to handle new gateway") } .onSuccess { - unifiedPushStore.storeUpEndpoint(instance, endpoint) + unifiedPushStore.storeUpEndpoint(instance, endpoint.url) } endpointRegistrationHandler.registrationDone( RegistrationResult( @@ -96,8 +99,8 @@ class VectorUnifiedPushMessagingReceiver : MessagingReceiver() { /** * Called when the registration is not possible, eg. no network. */ - override fun onRegistrationFailed(context: Context, instance: String) { - Timber.tag(loggerTag.value).e("onRegistrationFailed for $instance") + override fun onRegistrationFailed(context: Context, reason: FailedReason, instance: String) { + Timber.tag(loggerTag.value).e("onRegistrationFailed for $instance, reason: $reason") /* Toast.makeText(context, "Push service registration failed", Toast.LENGTH_SHORT).show() val mode = BackgroundSyncMode.FDROID_BACKGROUND_SYNC_MODE_FOR_REALTIME @@ -110,7 +113,7 @@ class VectorUnifiedPushMessagingReceiver : MessagingReceiver() { * Called when this application is unregistered from receiving push messages. */ override fun onUnregistered(context: Context, instance: String) { - Timber.tag(loggerTag.value).w("Unifiedpush: Unregistered") + Timber.tag(loggerTag.value).w("UnifiedPush: Unregistered") /* val mode = BackgroundSyncMode.FDROID_BACKGROUND_SYNC_MODE_FOR_REALTIME pushDataStore.setFdroidSyncBackgroundMode(mode) diff --git a/libraries/pushproviders/unifiedpush/src/test/kotlin/io/element/android/libraries/pushproviders/unifiedpush/VectorUnifiedPushMessagingReceiverTest.kt b/libraries/pushproviders/unifiedpush/src/test/kotlin/io/element/android/libraries/pushproviders/unifiedpush/VectorUnifiedPushMessagingReceiverTest.kt index bcacdc3d7a8..5bb0a6731fc 100644 --- a/libraries/pushproviders/unifiedpush/src/test/kotlin/io/element/android/libraries/pushproviders/unifiedpush/VectorUnifiedPushMessagingReceiverTest.kt +++ b/libraries/pushproviders/unifiedpush/src/test/kotlin/io/element/android/libraries/pushproviders/unifiedpush/VectorUnifiedPushMessagingReceiverTest.kt @@ -32,6 +32,10 @@ import org.junit.Assert.assertThrows import org.junit.Test import org.junit.runner.RunWith import org.robolectric.RobolectricTestRunner +import org.unifiedpush.android.connector.FailedReason +import org.unifiedpush.android.connector.data.PublicKeySet +import org.unifiedpush.android.connector.data.PushEndpoint +import org.unifiedpush.android.connector.data.PushMessage @RunWith(RobolectricTestRunner::class) class VectorUnifiedPushMessagingReceiverTest { @@ -56,7 +60,7 @@ class VectorUnifiedPushMessagingReceiverTest { fun `onRegistrationFailed does nothing`() = runTest { val context = InstrumentationRegistry.getInstrumentation().context val vectorUnifiedPushMessagingReceiver = createVectorUnifiedPushMessagingReceiver() - vectorUnifiedPushMessagingReceiver.onRegistrationFailed(context, A_SECRET) + vectorUnifiedPushMessagingReceiver.onRegistrationFailed(context, FailedReason.NETWORK, A_SECRET) } @Test @@ -68,7 +72,7 @@ class VectorUnifiedPushMessagingReceiverTest { handleResult = pushHandlerResult ), ) - vectorUnifiedPushMessagingReceiver.onMessage(context, UnifiedPushParserTest.UNIFIED_PUSH_DATA.toByteArray(), A_SECRET) + vectorUnifiedPushMessagingReceiver.onMessage(context, aPushMessage(), A_SECRET) advanceUntilIdle() pushHandlerResult.assertions() .isCalledOnce() @@ -96,7 +100,7 @@ class VectorUnifiedPushMessagingReceiverTest { handleInvalidResult = handleInvalidResult, ), ) - vectorUnifiedPushMessagingReceiver.onMessage(context, "".toByteArray(), A_SECRET) + vectorUnifiedPushMessagingReceiver.onMessage(context, aPushMessage(""), A_SECRET) advanceUntilIdle() handleInvalidResult.assertions().isCalledOnce() } @@ -127,7 +131,7 @@ class VectorUnifiedPushMessagingReceiverTest { unifiedPushNewGatewayHandler = unifiedPushNewGatewayHandler, ) endpointRegistrationHandler.state.test { - vectorUnifiedPushMessagingReceiver.onNewEndpoint(context, "anEndpoint", A_SECRET) + vectorUnifiedPushMessagingReceiver.onNewEndpoint(context, aPushEndpoint("anEndpoint"), A_SECRET) advanceUntilIdle() assertThat(awaitItem()).isEqualTo( RegistrationResult( @@ -170,7 +174,7 @@ class VectorUnifiedPushMessagingReceiverTest { unifiedPushNewGatewayHandler = unifiedPushNewGatewayHandler, ) endpointRegistrationHandler.state.test { - vectorUnifiedPushMessagingReceiver.onNewEndpoint(context, "anEndpoint", A_SECRET) + vectorUnifiedPushMessagingReceiver.onNewEndpoint(context, aPushEndpoint(), A_SECRET) advanceUntilIdle() assertThat(awaitItem()).isEqualTo( RegistrationResult( @@ -207,3 +211,19 @@ class VectorUnifiedPushMessagingReceiverTest { } } } + +private fun aPushMessage( + data: String = UnifiedPushParserTest.UNIFIED_PUSH_DATA, + decrypted: Boolean = true, +) = PushMessage( + content = data.toByteArray(), + decrypted = decrypted, +) + +private fun aPushEndpoint( + url: String = "anEndpoint", + pubKeySet: PublicKeySet? = null, +) = PushEndpoint( + url = url, + pubKeySet = pubKeySet, +) diff --git a/settings.gradle.kts b/settings.gradle.kts index d63017992fa..e594999bd8c 100644 --- a/settings.gradle.kts +++ b/settings.gradle.kts @@ -39,7 +39,6 @@ dependencyResolutionManagement { maven { url = URI("https://www.jitpack.io") content { - includeModule("com.github.UnifiedPush", "android-connector") includeModule("com.github.matrix-org", "matrix-analytics-events") } }