Attempt to reduce number of peek jobs run after being offline.

fork-5.53.8
Cody Henthorne 2020-12-08 16:43:43 -05:00 zatwierdzone przez Greyson Parrelli
rodzic 3949f4fd45
commit 84e9282f87
8 zmienionych plików z 43 dodań i 162 usunięć

Wyświetl plik

@ -692,19 +692,14 @@ public class SmsDatabase extends MessageDatabase {
@NonNull Collection<UUID> peekJoinedUuids,
boolean isCallFull)
{
SQLiteDatabase db = databaseHelper.getWritableDatabase();
long threadId;
SQLiteDatabase db = databaseHelper.getWritableDatabase();
Recipient recipient = Recipient.resolved(groupRecipientId);
long threadId = DatabaseFactory.getThreadDatabase(context).getThreadIdFor(recipient);
boolean peerEraIdSameAsPrevious = updatePreviousGroupCall(threadId, peekGroupCallEraId, peekJoinedUuids, isCallFull);
try {
db.beginTransaction();
Recipient recipient = Recipient.resolved(groupRecipientId);
threadId = DatabaseFactory.getThreadDatabase(context).getThreadIdFor(recipient);
boolean peerEraIdSameAsPrevious = updatePreviousGroupCall(threadId, peekGroupCallEraId, peekJoinedUuids, isCallFull);
if (!peerEraIdSameAsPrevious && !Util.isEmpty(peekGroupCallEraId)) {
Recipient self = Recipient.self();
boolean markRead = peekJoinedUuids.contains(self.requireUuid()) || self.getId().equals(sender);
@ -825,9 +820,10 @@ public class SmsDatabase extends MessageDatabase {
@Override
public boolean updatePreviousGroupCall(long threadId, @Nullable String peekGroupCallEraId, @NonNull Collection<UUID> peekJoinedUuids, boolean isCallFull) {
SQLiteDatabase db = databaseHelper.getWritableDatabase();
String where = TYPE + " = ? AND " + THREAD_ID + " = ?";
String[] args = SqlUtil.buildArgs(Types.GROUP_CALL_TYPE, threadId);
SQLiteDatabase db = databaseHelper.getWritableDatabase();
String where = TYPE + " = ? AND " + THREAD_ID + " = ?";
String[] args = SqlUtil.buildArgs(Types.GROUP_CALL_TYPE, threadId);
boolean sameEraId = false;
try (Reader reader = new Reader(db.query(TABLE_NAME, MESSAGE_PROJECTION, where, args, null, null, DATE_RECEIVED + " DESC", "1"))) {
MessageRecord record = reader.getNext();
@ -836,9 +832,10 @@ public class SmsDatabase extends MessageDatabase {
}
GroupCallUpdateDetails groupCallUpdateDetails = GroupCallUpdateDetailsUtil.parse(record.getBody());
boolean sameEraId = groupCallUpdateDetails.getEraId().equals(peekGroupCallEraId) && !Util.isEmpty(peekGroupCallEraId);
boolean containsSelf = peekJoinedUuids.contains(Recipient.self().requireUuid());
sameEraId = groupCallUpdateDetails.getEraId().equals(peekGroupCallEraId) && !Util.isEmpty(peekGroupCallEraId);
List<String> inCallUuids = sameEraId ? Stream.of(peekJoinedUuids).map(UUID::toString).toList()
: Collections.emptyList();
@ -852,9 +849,11 @@ public class SmsDatabase extends MessageDatabase {
}
db.update(TABLE_NAME, contentValues, ID_WHERE, SqlUtil.buildArgs(record.getId()));
return sameEraId;
}
notifyConversationListeners(threadId);
return sameEraId;
}
private @NonNull Pair<Long, Long> insertCallLog(@NonNull RecipientId recipientId, long type, boolean unread, long timestamp) {

Wyświetl plik

@ -8,7 +8,6 @@ import org.thoughtcrime.securesms.jobmanager.Job;
import org.thoughtcrime.securesms.jobmanager.JobManager;
import org.thoughtcrime.securesms.jobmanager.impl.WebsocketDrainedConstraint;
import org.thoughtcrime.securesms.recipients.RecipientId;
import org.thoughtcrime.securesms.service.webrtc.WebRtcData;
/**
* Allows the enqueueing of one peek operation per group while the web socket is not drained.
@ -19,35 +18,32 @@ public final class GroupCallPeekJob extends BaseJob {
private static final String QUEUE = "__GroupCallPeekJob__";
private static final String KEY_SENDER = "sender";
private static final String KEY_GROUP_RECIPIENT_ID = "group_recipient_id";
private static final String KEY_GROUP_CALL_ERA_ID = "group_call_era_id";
private static final String KEY_SERVER_RECEIVED_TIMESTAMP = "server_timestamp";
private static final String KEY_GROUP_RECIPIENT_ID = "group_recipient_id";
@NonNull private final WebRtcData.GroupCallUpdateMetadata updateMetadata;
@NonNull private final RecipientId groupRecipientId;
public static void enqueue(@NonNull WebRtcData.GroupCallUpdateMetadata updateMetadata) {
public static void enqueue(@NonNull RecipientId groupRecipientId) {
JobManager jobManager = ApplicationDependencies.getJobManager();
String queue = QUEUE + updateMetadata.getGroupRecipientId().serialize();
String queue = QUEUE + groupRecipientId.serialize();
Parameters.Builder parameters = new Parameters.Builder()
.setQueue(queue)
.addConstraint(WebsocketDrainedConstraint.KEY);
jobManager.cancelAllInQueue(queue);
jobManager.add(new GroupCallPeekJob(parameters.build(), updateMetadata));
jobManager.add(new GroupCallPeekJob(parameters.build(), groupRecipientId));
}
private GroupCallPeekJob(@NonNull Parameters parameters,
@NonNull WebRtcData.GroupCallUpdateMetadata updateMetadata)
@NonNull RecipientId groupRecipientId)
{
super(parameters);
this.updateMetadata = updateMetadata;
this.groupRecipientId = groupRecipientId;
}
@Override
protected void onRun() {
ApplicationDependencies.getJobManager().add(new GroupCallPeekWorkerJob(updateMetadata));
ApplicationDependencies.getJobManager().add(new GroupCallPeekWorkerJob(groupRecipientId));
}
@Override
@ -58,10 +54,7 @@ public final class GroupCallPeekJob extends BaseJob {
@Override
public @NonNull Data serialize() {
return new Data.Builder()
.putString(KEY_SENDER, updateMetadata.getSender().serialize())
.putString(KEY_GROUP_RECIPIENT_ID, updateMetadata.getGroupRecipientId().serialize())
.putString(KEY_GROUP_CALL_ERA_ID, updateMetadata.getGroupCallEraId())
.putLong(KEY_SERVER_RECEIVED_TIMESTAMP, updateMetadata.getServerReceivedTimestamp())
.putString(KEY_GROUP_RECIPIENT_ID, groupRecipientId.serialize())
.build();
}
@ -78,12 +71,7 @@ public final class GroupCallPeekJob extends BaseJob {
@Override
public @NonNull GroupCallPeekJob create(@NonNull Parameters parameters, @NonNull Data data) {
RecipientId sender = RecipientId.from(data.getString(KEY_SENDER));
RecipientId group = RecipientId.from(data.getString(KEY_GROUP_RECIPIENT_ID));
String era = data.getString(KEY_GROUP_CALL_ERA_ID);
long serverTimestamp = data.getLong(KEY_SERVER_RECEIVED_TIMESTAMP);
return new GroupCallPeekJob(parameters, new WebRtcData.GroupCallUpdateMetadata(sender, group, era, serverTimestamp));
return new GroupCallPeekJob(parameters, RecipientId.from(data.getString(KEY_GROUP_RECIPIENT_ID)));
}
}
}

Wyświetl plik

@ -7,8 +7,8 @@ import androidx.annotation.NonNull;
import org.thoughtcrime.securesms.jobmanager.Data;
import org.thoughtcrime.securesms.jobmanager.Job;
import org.thoughtcrime.securesms.recipients.RecipientId;
import org.thoughtcrime.securesms.ringrtc.RemotePeer;
import org.thoughtcrime.securesms.service.WebRtcCallService;
import org.thoughtcrime.securesms.service.webrtc.WebRtcData;
/**
* Runs in the same queue as messages for the group.
@ -17,36 +17,28 @@ final class GroupCallPeekWorkerJob extends BaseJob {
public static final String KEY = "GroupCallPeekWorkerJob";
private static final String KEY_SENDER = "sender";
private static final String KEY_GROUP_RECIPIENT_ID = "group_recipient_id";
private static final String KEY_GROUP_CALL_ERA_ID = "group_call_era_id";
private static final String KEY_SERVER_RECEIVED_TIMESTAMP = "server_timestamp";
@NonNull private final WebRtcData.GroupCallUpdateMetadata updateMetadata;
@NonNull private final RecipientId groupRecipientId;
public GroupCallPeekWorkerJob(@NonNull WebRtcData.GroupCallUpdateMetadata updateMetadata) {
public GroupCallPeekWorkerJob(@NonNull RecipientId groupRecipientId) {
this(new Parameters.Builder()
.setQueue(PushProcessMessageJob.getQueueName(updateMetadata.getGroupRecipientId()))
.setQueue(PushProcessMessageJob.getQueueName(groupRecipientId))
.setMaxInstancesForQueue(2)
.build(),
updateMetadata);
groupRecipientId);
}
private GroupCallPeekWorkerJob(@NonNull Parameters parameters,
@NonNull WebRtcData.GroupCallUpdateMetadata updateMetadata)
{
private GroupCallPeekWorkerJob(@NonNull Parameters parameters, @NonNull RecipientId groupRecipientId) {
super(parameters);
this.updateMetadata = updateMetadata;
this.groupRecipientId = groupRecipientId;
}
@Override
protected void onRun() {
Intent intent = new Intent(context, WebRtcCallService.class);
intent.setAction(WebRtcCallService.ACTION_GROUP_CALL_UPDATE_MESSAGE)
.putExtra(WebRtcCallService.EXTRA_GROUP_CALL_UPDATE_SENDER, updateMetadata.getSender().serialize())
.putExtra(WebRtcCallService.EXTRA_GROUP_CALL_UPDATE_GROUP, updateMetadata.getGroupRecipientId().serialize())
.putExtra(WebRtcCallService.EXTRA_GROUP_CALL_ERA_ID, updateMetadata.getGroupCallEraId())
.putExtra(WebRtcCallService.EXTRA_SERVER_RECEIVED_TIMESTAMP, updateMetadata.getServerReceivedTimestamp());
intent.setAction(WebRtcCallService.ACTION_GROUP_CALL_PEEK)
.putExtra(WebRtcCallService.EXTRA_REMOTE_PEER, new RemotePeer(groupRecipientId));
context.startService(intent);
}
@ -59,10 +51,7 @@ final class GroupCallPeekWorkerJob extends BaseJob {
@Override
public @NonNull Data serialize() {
return new Data.Builder()
.putString(KEY_SENDER, updateMetadata.getSender().serialize())
.putString(KEY_GROUP_RECIPIENT_ID, updateMetadata.getGroupRecipientId().serialize())
.putString(KEY_GROUP_CALL_ERA_ID, updateMetadata.getGroupCallEraId())
.putLong(KEY_SERVER_RECEIVED_TIMESTAMP, updateMetadata.getServerReceivedTimestamp())
.putString(KEY_GROUP_RECIPIENT_ID, groupRecipientId.serialize())
.build();
}
@ -79,12 +68,7 @@ final class GroupCallPeekWorkerJob extends BaseJob {
@Override
public @NonNull GroupCallPeekWorkerJob create(@NonNull Parameters parameters, @NonNull Data data) {
RecipientId sender = RecipientId.from(data.getString(KEY_SENDER));
RecipientId group = RecipientId.from(data.getString(KEY_GROUP_RECIPIENT_ID));
String era = data.getString(KEY_GROUP_CALL_ERA_ID);
long serverTimestamp = data.getLong(KEY_SERVER_RECEIVED_TIMESTAMP);
return new GroupCallPeekWorkerJob(parameters, new WebRtcData.GroupCallUpdateMetadata(sender, group, era, serverTimestamp));
return new GroupCallPeekWorkerJob(parameters, RecipientId.from(data.getString(KEY_GROUP_RECIPIENT_ID)));
}
}
}

Wyświetl plik

@ -74,7 +74,6 @@ import org.thoughtcrime.securesms.recipients.RecipientId;
import org.thoughtcrime.securesms.ringrtc.IceCandidateParcel;
import org.thoughtcrime.securesms.ringrtc.RemotePeer;
import org.thoughtcrime.securesms.service.WebRtcCallService;
import org.thoughtcrime.securesms.service.webrtc.WebRtcData;
import org.thoughtcrime.securesms.sms.IncomingEncryptedMessage;
import org.thoughtcrime.securesms.sms.IncomingEndSessionMessage;
import org.thoughtcrime.securesms.sms.IncomingTextMessage;
@ -662,19 +661,14 @@ public final class PushProcessMessageJob extends BaseJob {
return;
}
RecipientId groupRecipientId = DatabaseFactory.getRecipientDatabase(context).getOrInsertFromPossiblyMigratedGroupId(groupId.get());
WebRtcData.GroupCallUpdateMetadata updateMetadata = new WebRtcData.GroupCallUpdateMetadata(RecipientId.from(content.getSender()),
groupRecipientId,
message.getGroupCallUpdate().get().getEraId(),
content.getServerReceivedTimestamp());
RecipientId groupRecipientId = DatabaseFactory.getRecipientDatabase(context).getOrInsertFromPossiblyMigratedGroupId(groupId.get());
DatabaseFactory.getSmsDatabase(context).insertOrUpdateGroupCall(updateMetadata.getGroupRecipientId(),
updateMetadata.getSender(),
updateMetadata.getServerReceivedTimestamp(),
updateMetadata.getGroupCallEraId());
DatabaseFactory.getSmsDatabase(context).insertOrUpdateGroupCall(groupRecipientId,
RecipientId.from(content.getSender()),
content.getServerReceivedTimestamp(),
message.getGroupCallUpdate().get().getEraId());
GroupCallPeekJob.enqueue(updateMetadata);
GroupCallPeekJob.enqueue(groupRecipientId);
}
private void handleEndSessionMessage(@NonNull SignalServiceContent content,

Wyświetl plik

@ -52,7 +52,6 @@ import org.thoughtcrime.securesms.ringrtc.IceCandidateParcel;
import org.thoughtcrime.securesms.ringrtc.RemotePeer;
import org.thoughtcrime.securesms.ringrtc.TurnServerInfoParcel;
import org.thoughtcrime.securesms.service.webrtc.IdleActionProcessor;
import org.thoughtcrime.securesms.service.webrtc.WebRtcData;
import org.thoughtcrime.securesms.service.webrtc.WebRtcInteractor;
import org.thoughtcrime.securesms.service.webrtc.WebRtcUtil;
import org.thoughtcrime.securesms.service.webrtc.state.WebRtcServiceState;
@ -203,7 +202,6 @@ public class WebRtcCallService extends Service implements CallManager.Observer,
public static final String ACTION_GROUP_REQUEST_UPDATE_MEMBERS = "GROUP_REQUEST_UPDATE_MEMBERS";
public static final String ACTION_GROUP_UPDATE_RENDERED_RESOLUTIONS = "GROUP_UPDATE_RENDERED_RESOLUTIONS";
public static final String ACTION_GROUP_CALL_ENDED = "GROUP_CALL_ENDED";
public static final String ACTION_GROUP_CALL_UPDATE_MESSAGE = "GROUP_CALL_UPDATE_MESSAGE";
public static final String ACTION_GROUP_CALL_PEEK = "GROUP_CALL_PEEK";
public static final String ACTION_GROUP_MESSAGE_SENT_ERROR = "GROUP_MESSAGE_SENT_ERROR";
public static final String ACTION_GROUP_APPROVE_SAFETY_CHANGE = "GROUP_APPROVE_SAFETY_CHANGE";
@ -700,37 +698,6 @@ public class WebRtcCallService extends Service implements CallManager.Observer,
SignalExecutors.BOUNDED.execute(() -> ApplicationDependencies.getJobManager().add(GroupCallUpdateSendJob.create(recipient.getId(), groupCallEraId)));
}
public void peekGroupCall(@NonNull WebRtcData.GroupCallUpdateMetadata groupCallUpdateMetadata) {
networkExecutor.execute(() -> {
try {
Recipient group = Recipient.resolved(groupCallUpdateMetadata.getGroupRecipientId());
GroupId.V2 groupId = group.requireGroupId().requireV2();
GroupExternalCredential credential = GroupManager.getGroupExternalCredential(this, groupId);
List<GroupCall.GroupMemberInfo> members = Stream.of(GroupManager.getUuidCipherTexts(this, groupId))
.map(entry -> new GroupCall.GroupMemberInfo(entry.getKey(), entry.getValue().serialize()))
.toList();
callManager.peekGroupCall(BuildConfig.SIGNAL_SFU_URL, credential.getTokenBytes().toByteArray(), members, peekInfo -> {
DatabaseFactory.getSmsDatabase(this).insertOrUpdateGroupCall(group.getId(),
groupCallUpdateMetadata.getSender(),
groupCallUpdateMetadata.getServerReceivedTimestamp(),
peekInfo.getEraId(),
peekInfo.getJoinedMembers(),
WebRtcUtil.isCallFull(peekInfo));
long threadId = DatabaseFactory.getThreadDatabase(this).getThreadIdFor(group);
ApplicationDependencies.getMessageNotifier().updateNotification(this, threadId, true);
EventBus.getDefault().postSticky(new GroupCallPeekEvent(group.getId(), peekInfo.getEraId(), peekInfo.getDeviceCount(), peekInfo.getMaxDevices()));
});
} catch (IOException | VerificationFailedException | CallException e) {
Log.e(TAG, "error peeking from message", e);
}
});
}
public void peekGroupCall(@NonNull RecipientId id) {
networkExecutor.execute(() -> {
try {
@ -742,6 +709,7 @@ public class WebRtcCallService extends Service implements CallManager.Observer,
.map(entry -> new GroupCall.GroupMemberInfo(entry.getKey(), entry.getValue().serialize()))
.toList();
//noinspection ConstantConditions
callManager.peekGroupCall(BuildConfig.SIGNAL_SFU_URL, credential.getTokenBytes().toByteArray(), members, peekInfo -> {
long threadId = DatabaseFactory.getThreadDatabase(this).getThreadIdFor(group);

Wyświetl plik

@ -21,7 +21,6 @@ import org.thoughtcrime.securesms.ringrtc.CameraState;
import org.thoughtcrime.securesms.ringrtc.IceCandidateParcel;
import org.thoughtcrime.securesms.ringrtc.RemotePeer;
import org.thoughtcrime.securesms.service.webrtc.WebRtcData.CallMetadata;
import org.thoughtcrime.securesms.service.webrtc.WebRtcData.GroupCallUpdateMetadata;
import org.thoughtcrime.securesms.service.webrtc.WebRtcData.HttpData;
import org.thoughtcrime.securesms.service.webrtc.WebRtcData.OfferMetadata;
import org.thoughtcrime.securesms.service.webrtc.WebRtcData.ReceivedOfferMetadata;
@ -64,7 +63,6 @@ import static org.thoughtcrime.securesms.service.WebRtcCallService.ACTION_FLIP_C
import static org.thoughtcrime.securesms.service.WebRtcCallService.ACTION_GROUP_APPROVE_SAFETY_CHANGE;
import static org.thoughtcrime.securesms.service.WebRtcCallService.ACTION_GROUP_CALL_ENDED;
import static org.thoughtcrime.securesms.service.WebRtcCallService.ACTION_GROUP_CALL_PEEK;
import static org.thoughtcrime.securesms.service.WebRtcCallService.ACTION_GROUP_CALL_UPDATE_MESSAGE;
import static org.thoughtcrime.securesms.service.WebRtcCallService.ACTION_GROUP_JOINED_MEMBERSHIP_CHANGED;
import static org.thoughtcrime.securesms.service.WebRtcCallService.ACTION_GROUP_LOCAL_DEVICE_STATE_CHANGED;
import static org.thoughtcrime.securesms.service.WebRtcCallService.ACTION_GROUP_MESSAGE_SENT_ERROR;
@ -242,7 +240,6 @@ public abstract class WebRtcActionProcessor {
case ACTION_GROUP_REQUEST_UPDATE_MEMBERS: return handleGroupRequestUpdateMembers(currentState);
case ACTION_GROUP_UPDATE_RENDERED_RESOLUTIONS: return handleUpdateRenderedResolutions(currentState);
case ACTION_GROUP_CALL_ENDED: return handleGroupCallEnded(currentState, getGroupCallHash(intent), getGroupCallEndReason(intent));
case ACTION_GROUP_CALL_UPDATE_MESSAGE: return handleGroupCallUpdateMessage(currentState, GroupCallUpdateMetadata.fromIntent(intent));
case ACTION_GROUP_CALL_PEEK: return handleGroupCallPeek(currentState, getRemotePeer(intent));
case ACTION_GROUP_MESSAGE_SENT_ERROR: return handleGroupMessageSentError(currentState, getRemotePeer(intent), getErrorCallState(intent), getErrorIdentityKey(intent));
case ACTION_GROUP_APPROVE_SAFETY_CHANGE: return handleGroupApproveSafetyNumberChange(currentState, RecipientId.fromSerializedList(intent.getStringExtra(EXTRA_RECIPIENT_IDS)));
@ -730,11 +727,6 @@ public abstract class WebRtcActionProcessor {
return currentState;
}
protected @NonNull WebRtcServiceState handleGroupCallUpdateMessage(@NonNull WebRtcServiceState currentState, @NonNull GroupCallUpdateMetadata groupCallUpdateMetadata) {
webRtcInteractor.peekGroupCall(groupCallUpdateMetadata);
return currentState;
}
protected @NonNull WebRtcServiceState handleGroupCallPeek(@NonNull WebRtcServiceState currentState, @NonNull RemotePeer remotePeer) {
webRtcInteractor.peekGroupCall(remotePeer.getId());
return currentState;

Wyświetl plik

@ -309,44 +309,4 @@ public class WebRtcData {
return messageAgeSeconds;
}
}
/**
* Metadata associated with a group call update message.
*/
public static class GroupCallUpdateMetadata {
private final RecipientId sender;
private final RecipientId groupRecipientId;
private final String groupCallEraId;
private final long serverReceivedTimestamp;
static @NonNull GroupCallUpdateMetadata fromIntent(@NonNull Intent intent) {
return new GroupCallUpdateMetadata(getRecipientId(intent, EXTRA_GROUP_CALL_UPDATE_SENDER),
getRecipientId(intent, EXTRA_GROUP_CALL_UPDATE_GROUP),
intent.getStringExtra(EXTRA_GROUP_CALL_ERA_ID),
intent.getLongExtra(EXTRA_SERVER_RECEIVED_TIMESTAMP, 0));
}
public GroupCallUpdateMetadata(@NonNull RecipientId sender, @NonNull RecipientId groupRecipientId, @Nullable String groupCallEraId, long serverReceivedTimestamp) {
this.sender = sender;
this.groupRecipientId = groupRecipientId;
this.groupCallEraId = groupCallEraId;
this.serverReceivedTimestamp = serverReceivedTimestamp;
}
public @NonNull RecipientId getSender() {
return sender;
}
public @NonNull RecipientId getGroupRecipientId() {
return groupRecipientId;
}
public @Nullable String getGroupCallEraId() {
return groupCallEraId;
}
public long getServerReceivedTimestamp() {
return serverReceivedTimestamp;
}
}
}

Wyświetl plik

@ -154,10 +154,6 @@ public class WebRtcInteractor {
audioManager.startCommunication(preserveSpeakerphone);
}
void peekGroupCall(@NonNull WebRtcData.GroupCallUpdateMetadata groupCallUpdateMetadata) {
webRtcCallService.peekGroupCall(groupCallUpdateMetadata);
}
void peekGroupCall(@NonNull RecipientId recipientId) {
webRtcCallService.peekGroupCall(recipientId);
}