Add preview treatment for call links.

This commit is contained in:
Alex Hart
2023-06-16 12:33:58 -03:00
committed by Nicholas Tinsley
parent 4ce05a064c
commit e3044b8b85
9 changed files with 91 additions and 11 deletions

View File

@@ -19,10 +19,12 @@ import org.signal.libsignal.protocol.InvalidMessageException;
import org.signal.libsignal.protocol.util.Pair;
import org.signal.libsignal.zkgroup.VerificationFailedException;
import org.signal.libsignal.zkgroup.groups.GroupMasterKey;
import org.signal.ringrtc.CallLinkRootKey;
import org.signal.storageservice.protos.groups.local.DecryptedGroupJoinInfo;
import org.thoughtcrime.securesms.R;
import org.thoughtcrime.securesms.attachments.Attachment;
import org.thoughtcrime.securesms.attachments.UriAttachment;
import org.thoughtcrime.securesms.calls.links.CallLinks;
import org.thoughtcrime.securesms.database.AttachmentTable;
import org.thoughtcrime.securesms.database.SignalDatabase;
import org.thoughtcrime.securesms.database.model.GroupRecord;
@@ -42,6 +44,8 @@ import org.thoughtcrime.securesms.net.UserAgentInterceptor;
import org.thoughtcrime.securesms.profiles.AvatarHelper;
import org.thoughtcrime.securesms.providers.BlobProvider;
import org.thoughtcrime.securesms.recipients.Recipient;
import org.thoughtcrime.securesms.service.webrtc.links.CallLinkCredentials;
import org.thoughtcrime.securesms.service.webrtc.links.ReadCallLinkResult;
import org.thoughtcrime.securesms.stickers.StickerRemoteUri;
import org.thoughtcrime.securesms.stickers.StickerUrl;
import org.thoughtcrime.securesms.util.AvatarUtil;
@@ -64,6 +68,7 @@ import java.util.Optional;
import java.util.concurrent.ExecutionException;
import io.reactivex.rxjava3.core.Single;
import io.reactivex.rxjava3.disposables.Disposable;
import io.reactivex.rxjava3.schedulers.Schedulers;
import okhttp3.CacheControl;
import okhttp3.Call;
@@ -133,6 +138,8 @@ public class LinkPreviewRepository {
metadataController = fetchStickerPackLinkPreview(context, url, callback);
} else if (GroupInviteLinkUrl.isGroupLink(url)) {
metadataController = fetchGroupLinkPreview(context, url, callback);
} else if (CallLinks.isCallLink(url)) {
metadataController = fetchCallLinkPreview(context, url, callback);
} else {
metadataController = fetchMetadata(url, metadata -> {
if (metadata.isEmpty()) {
@@ -295,6 +302,55 @@ public class LinkPreviewRepository {
return () -> Log.i(TAG, "Cancelled sticker pack link preview fetch -- no effect.");
}
private static RequestController fetchCallLinkPreview(@NonNull Context context,
@NonNull String callLinkUrl,
@NonNull Callback callback) {
CallLinkRootKey callLinkRootKey = CallLinks.parseUrl(callLinkUrl);
if (callLinkRootKey == null) {
callback.onError(Error.PREVIEW_NOT_AVAILABLE);
return () -> { };
}
Disposable disposable = ApplicationDependencies.getSignalCallManager()
.getCallLinkManager()
.readCallLink(new CallLinkCredentials(callLinkRootKey.getKeyBytes(), null))
.observeOn(Schedulers.io())
.subscribe(
result -> {
if (result instanceof ReadCallLinkResult.Success) {
ReadCallLinkResult.Success success = (ReadCallLinkResult.Success) result;
Log.i(TAG, "Successfully read call link.");
if (((ReadCallLinkResult.Success) result).getCallLinkState().hasBeenRevoked()) {
Log.i(TAG, "Call link has been revoked.");
callback.onError(Error.PREVIEW_NOT_AVAILABLE);
return;
}
// Note: thumbnails are generated recv-side using the CallLinkRootKey
callback.onSuccess(new LinkPreview(
callLinkUrl,
success.getCallLinkState().getName(),
"",
0,
Optional.empty()
));
} else {
ReadCallLinkResult.Failure failure = (ReadCallLinkResult.Failure) result;
Log.w(TAG, "Failed to read call link: " + failure);
callback.onError(Error.PREVIEW_NOT_AVAILABLE);
}
},
error -> {
Log.w(TAG, "An error occurred: ", error);
callback.onError(Error.PREVIEW_NOT_AVAILABLE);
}
);
return disposable::dispose;
}
private static RequestController fetchGroupLinkPreview(@NonNull Context context,
@NonNull String groupUrl,
@NonNull Callback callback)