|
|
@ -22,11 +22,8 @@ import io.element.android.libraries.di.AppScope |
|
|
|
import io.element.android.libraries.di.ApplicationContext |
|
|
|
import io.element.android.libraries.di.ApplicationContext |
|
|
|
import io.element.android.libraries.pushproviders.api.Distributor |
|
|
|
import io.element.android.libraries.pushproviders.api.Distributor |
|
|
|
import io.element.android.libraries.pushproviders.unifiedpush.registration.EndpointRegistrationHandler |
|
|
|
import io.element.android.libraries.pushproviders.unifiedpush.registration.EndpointRegistrationHandler |
|
|
|
import kotlinx.coroutines.CompletableDeferred |
|
|
|
|
|
|
|
import kotlinx.coroutines.CoroutineScope |
|
|
|
|
|
|
|
import kotlinx.coroutines.flow.filter |
|
|
|
import kotlinx.coroutines.flow.filter |
|
|
|
import kotlinx.coroutines.flow.first |
|
|
|
import kotlinx.coroutines.flow.first |
|
|
|
import kotlinx.coroutines.launch |
|
|
|
|
|
|
|
import kotlinx.coroutines.withTimeout |
|
|
|
import kotlinx.coroutines.withTimeout |
|
|
|
import org.unifiedpush.android.connector.UnifiedPush |
|
|
|
import org.unifiedpush.android.connector.UnifiedPush |
|
|
|
import javax.inject.Inject |
|
|
|
import javax.inject.Inject |
|
|
@ -40,27 +37,21 @@ interface RegisterUnifiedPushUseCase { |
|
|
|
class DefaultRegisterUnifiedPushUseCase @Inject constructor( |
|
|
|
class DefaultRegisterUnifiedPushUseCase @Inject constructor( |
|
|
|
@ApplicationContext private val context: Context, |
|
|
|
@ApplicationContext private val context: Context, |
|
|
|
private val endpointRegistrationHandler: EndpointRegistrationHandler, |
|
|
|
private val endpointRegistrationHandler: EndpointRegistrationHandler, |
|
|
|
private val coroutineScope: CoroutineScope, |
|
|
|
|
|
|
|
) : RegisterUnifiedPushUseCase { |
|
|
|
) : RegisterUnifiedPushUseCase { |
|
|
|
override suspend fun execute(distributor: Distributor, clientSecret: String): Result<Unit> { |
|
|
|
override suspend fun execute(distributor: Distributor, clientSecret: String): Result<Unit> { |
|
|
|
UnifiedPush.saveDistributor(context, distributor.value) |
|
|
|
UnifiedPush.saveDistributor(context, distributor.value) |
|
|
|
val completable = CompletableDeferred<Result<Unit>>() |
|
|
|
|
|
|
|
val job = coroutineScope.launch { |
|
|
|
|
|
|
|
val result = endpointRegistrationHandler.state |
|
|
|
|
|
|
|
.filter { it.clientSecret == clientSecret } |
|
|
|
|
|
|
|
.first() |
|
|
|
|
|
|
|
.result |
|
|
|
|
|
|
|
completable.complete(result) |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
// This will trigger the callback |
|
|
|
// This will trigger the callback |
|
|
|
// VectorUnifiedPushMessagingReceiver.onNewEndpoint |
|
|
|
// VectorUnifiedPushMessagingReceiver.onNewEndpoint |
|
|
|
UnifiedPush.registerApp(context = context, instance = clientSecret) |
|
|
|
UnifiedPush.registerApp(context = context, instance = clientSecret) |
|
|
|
// Wait for VectorUnifiedPushMessagingReceiver.onNewEndpoint to proceed |
|
|
|
// Wait for VectorUnifiedPushMessagingReceiver.onNewEndpoint to proceed |
|
|
|
return withTimeout(30.seconds) { |
|
|
|
return runCatching { |
|
|
|
completable.await() |
|
|
|
withTimeout(30.seconds) { |
|
|
|
} |
|
|
|
val result = endpointRegistrationHandler.state |
|
|
|
.onFailure { |
|
|
|
.filter { it.clientSecret == clientSecret } |
|
|
|
job.cancel() |
|
|
|
.first() |
|
|
|
|
|
|
|
.result |
|
|
|
|
|
|
|
result.getOrThrow() |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|