kopia lustrzana https://github.com/ryukoposting/Signal-Android
Fix remote delete for private stories.
rodzic
b5e0991f5e
commit
6b6e9e92e8
|
@ -189,6 +189,7 @@ public abstract class MessageDatabase extends Database implements MmsSmsColumns
|
||||||
public abstract @NonNull Reader getAllStoriesFor(@NonNull RecipientId recipientId);
|
public abstract @NonNull Reader getAllStoriesFor(@NonNull RecipientId recipientId);
|
||||||
public abstract @NonNull MessageId getStoryId(@NonNull RecipientId authorId, long sentTimestamp) throws NoSuchMessageException;
|
public abstract @NonNull MessageId getStoryId(@NonNull RecipientId authorId, long sentTimestamp) throws NoSuchMessageException;
|
||||||
public abstract int getNumberOfStoryReplies(long parentStoryId);
|
public abstract int getNumberOfStoryReplies(long parentStoryId);
|
||||||
|
public abstract boolean containsStories(long threadId);
|
||||||
public abstract boolean hasSelfReplyInStory(long parentStoryId);
|
public abstract boolean hasSelfReplyInStory(long parentStoryId);
|
||||||
public abstract @NonNull Cursor getStoryReplies(long parentStoryId);
|
public abstract @NonNull Cursor getStoryReplies(long parentStoryId);
|
||||||
public abstract long getUnreadStoryCount();
|
public abstract long getUnreadStoryCount();
|
||||||
|
|
|
@ -708,6 +708,18 @@ public class MmsDatabase extends MessageDatabase {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean containsStories(long threadId) {
|
||||||
|
SQLiteDatabase db = databaseHelper.getSignalReadableDatabase();
|
||||||
|
String[] columns = new String[]{"1"};
|
||||||
|
String where = THREAD_ID_WHERE + " AND " + STORY_TYPE + " > 0";
|
||||||
|
String[] whereArgs = SqlUtil.buildArgs(threadId);
|
||||||
|
|
||||||
|
try (Cursor cursor = db.query(TABLE_NAME, columns, where, whereArgs, null, null, null, "1")) {
|
||||||
|
return cursor != null && cursor.moveToNext();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean hasSelfReplyInStory(long parentStoryId) {
|
public boolean hasSelfReplyInStory(long parentStoryId) {
|
||||||
SQLiteDatabase db = databaseHelper.getSignalReadableDatabase();
|
SQLiteDatabase db = databaseHelper.getSignalReadableDatabase();
|
||||||
|
|
|
@ -1424,6 +1424,11 @@ public class SmsDatabase extends MessageDatabase {
|
||||||
throw new UnsupportedOperationException();
|
throw new UnsupportedOperationException();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean containsStories(long threadId) {
|
||||||
|
throw new UnsupportedOperationException();
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean hasSelfReplyInStory(long parentStoryId) {
|
public boolean hasSelfReplyInStory(long parentStoryId) {
|
||||||
throw new UnsupportedOperationException();
|
throw new UnsupportedOperationException();
|
||||||
|
|
|
@ -1308,7 +1308,7 @@ public class ThreadDatabase extends Database {
|
||||||
try {
|
try {
|
||||||
record = mmsSmsDatabase.getConversationSnippet(threadId);
|
record = mmsSmsDatabase.getConversationSnippet(threadId);
|
||||||
} catch (NoSuchMessageException e) {
|
} catch (NoSuchMessageException e) {
|
||||||
if (allowDeletion) {
|
if (allowDeletion && !SignalDatabase.mms().containsStories(threadId)) {
|
||||||
deleteConversation(threadId);
|
deleteConversation(threadId);
|
||||||
}
|
}
|
||||||
return true;
|
return true;
|
||||||
|
|
|
@ -10,13 +10,11 @@ import com.annimon.stream.Stream;
|
||||||
import org.signal.core.util.logging.Log;
|
import org.signal.core.util.logging.Log;
|
||||||
import org.thoughtcrime.securesms.attachments.Attachment;
|
import org.thoughtcrime.securesms.attachments.Attachment;
|
||||||
import org.thoughtcrime.securesms.database.GroupReceiptDatabase;
|
import org.thoughtcrime.securesms.database.GroupReceiptDatabase;
|
||||||
import org.thoughtcrime.securesms.database.GroupReceiptDatabase.GroupReceiptInfo;
|
|
||||||
import org.thoughtcrime.securesms.database.MessageDatabase;
|
import org.thoughtcrime.securesms.database.MessageDatabase;
|
||||||
import org.thoughtcrime.securesms.database.NoSuchMessageException;
|
import org.thoughtcrime.securesms.database.NoSuchMessageException;
|
||||||
import org.thoughtcrime.securesms.database.SignalDatabase;
|
import org.thoughtcrime.securesms.database.SignalDatabase;
|
||||||
import org.thoughtcrime.securesms.database.documents.IdentityKeyMismatch;
|
import org.thoughtcrime.securesms.database.documents.IdentityKeyMismatch;
|
||||||
import org.thoughtcrime.securesms.database.documents.NetworkFailure;
|
import org.thoughtcrime.securesms.database.documents.NetworkFailure;
|
||||||
import org.thoughtcrime.securesms.database.model.DistributionListId;
|
|
||||||
import org.thoughtcrime.securesms.database.model.MessageId;
|
import org.thoughtcrime.securesms.database.model.MessageId;
|
||||||
import org.thoughtcrime.securesms.jobmanager.Data;
|
import org.thoughtcrime.securesms.jobmanager.Data;
|
||||||
import org.thoughtcrime.securesms.jobmanager.Job;
|
import org.thoughtcrime.securesms.jobmanager.Job;
|
||||||
|
@ -29,7 +27,7 @@ import org.thoughtcrime.securesms.mms.MmsException;
|
||||||
import org.thoughtcrime.securesms.mms.OutgoingMediaMessage;
|
import org.thoughtcrime.securesms.mms.OutgoingMediaMessage;
|
||||||
import org.thoughtcrime.securesms.recipients.Recipient;
|
import org.thoughtcrime.securesms.recipients.Recipient;
|
||||||
import org.thoughtcrime.securesms.recipients.RecipientId;
|
import org.thoughtcrime.securesms.recipients.RecipientId;
|
||||||
import org.thoughtcrime.securesms.recipients.RecipientUtil;
|
import org.thoughtcrime.securesms.stories.Stories;
|
||||||
import org.thoughtcrime.securesms.transport.RetryLaterException;
|
import org.thoughtcrime.securesms.transport.RetryLaterException;
|
||||||
import org.thoughtcrime.securesms.transport.UndeliverableMessageException;
|
import org.thoughtcrime.securesms.transport.UndeliverableMessageException;
|
||||||
import org.whispersystems.signalservice.api.crypto.UntrustedIdentityException;
|
import org.whispersystems.signalservice.api.crypto.UntrustedIdentityException;
|
||||||
|
@ -43,7 +41,6 @@ import java.util.Collections;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.Set;
|
import java.util.Set;
|
||||||
import java.util.concurrent.TimeUnit;
|
import java.util.concurrent.TimeUnit;
|
||||||
import java.util.stream.Collectors;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* A job that lets us send a message to a distribution list. Currently the only supported message type is a story.
|
* A job that lets us send a message to a distribution list. Currently the only supported message type is a story.
|
||||||
|
@ -148,7 +145,7 @@ public final class PushDistributionListSendJob extends PushSendJob {
|
||||||
List<Recipient> target;
|
List<Recipient> target;
|
||||||
|
|
||||||
if (!existingNetworkFailures.isEmpty()) target = Stream.of(existingNetworkFailures).map(nf -> nf.getRecipientId(context)).distinct().map(Recipient::resolved).toList();
|
if (!existingNetworkFailures.isEmpty()) target = Stream.of(existingNetworkFailures).map(nf -> nf.getRecipientId(context)).distinct().map(Recipient::resolved).toList();
|
||||||
else target = Stream.of(getFullRecipients(listRecipient.requireDistributionListId(), messageId)).distinctBy(Recipient::getId).toList();
|
else target = Stream.of(Stories.getRecipientsToSendTo(listRecipient.requireDistributionListId(), messageId)).distinctBy(Recipient::getId).toList();
|
||||||
|
|
||||||
List<SendMessageResult> results = deliver(message, target);
|
List<SendMessageResult> results = deliver(message, target);
|
||||||
Log.i(TAG, JobLogger.format(this, "Finished send."));
|
Log.i(TAG, JobLogger.format(this, "Finished send."));
|
||||||
|
@ -189,23 +186,6 @@ public final class PushDistributionListSendJob extends PushSendJob {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private static List<Recipient> getFullRecipients(@NonNull DistributionListId distributionListId, long messageId) {
|
|
||||||
List<GroupReceiptInfo> destinations = SignalDatabase.groupReceipts().getGroupReceiptInfo(messageId);
|
|
||||||
|
|
||||||
if (!destinations.isEmpty()) {
|
|
||||||
return RecipientUtil.getEligibleForSending(destinations.stream()
|
|
||||||
.map(GroupReceiptInfo::getRecipientId)
|
|
||||||
.map(Recipient::resolved)
|
|
||||||
.collect(Collectors.toList()));
|
|
||||||
} else {
|
|
||||||
return RecipientUtil.getEligibleForSending(SignalDatabase.distributionLists()
|
|
||||||
.getMembers(distributionListId)
|
|
||||||
.stream()
|
|
||||||
.map(Recipient::resolved)
|
|
||||||
.collect(Collectors.toList()));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public static class Factory implements Job.Factory<PushDistributionListSendJob> {
|
public static class Factory implements Job.Factory<PushDistributionListSendJob> {
|
||||||
@Override
|
@Override
|
||||||
public @NonNull PushDistributionListSendJob create(@NonNull Parameters parameters, @NonNull Data data) {
|
public @NonNull PushDistributionListSendJob create(@NonNull Parameters parameters, @NonNull Data data) {
|
||||||
|
|
|
@ -11,6 +11,7 @@ import org.signal.core.util.logging.Log;
|
||||||
import org.thoughtcrime.securesms.database.MessageDatabase;
|
import org.thoughtcrime.securesms.database.MessageDatabase;
|
||||||
import org.thoughtcrime.securesms.database.NoSuchMessageException;
|
import org.thoughtcrime.securesms.database.NoSuchMessageException;
|
||||||
import org.thoughtcrime.securesms.database.SignalDatabase;
|
import org.thoughtcrime.securesms.database.SignalDatabase;
|
||||||
|
import org.thoughtcrime.securesms.database.model.DistributionListId;
|
||||||
import org.thoughtcrime.securesms.database.model.MessageId;
|
import org.thoughtcrime.securesms.database.model.MessageId;
|
||||||
import org.thoughtcrime.securesms.database.model.MessageRecord;
|
import org.thoughtcrime.securesms.database.model.MessageRecord;
|
||||||
import org.thoughtcrime.securesms.groups.GroupId;
|
import org.thoughtcrime.securesms.groups.GroupId;
|
||||||
|
@ -21,6 +22,7 @@ import org.thoughtcrime.securesms.net.NotPushRegisteredException;
|
||||||
import org.thoughtcrime.securesms.recipients.Recipient;
|
import org.thoughtcrime.securesms.recipients.Recipient;
|
||||||
import org.thoughtcrime.securesms.recipients.RecipientId;
|
import org.thoughtcrime.securesms.recipients.RecipientId;
|
||||||
import org.thoughtcrime.securesms.recipients.RecipientUtil;
|
import org.thoughtcrime.securesms.recipients.RecipientUtil;
|
||||||
|
import org.thoughtcrime.securesms.stories.Stories;
|
||||||
import org.thoughtcrime.securesms.transport.RetryLaterException;
|
import org.thoughtcrime.securesms.transport.RetryLaterException;
|
||||||
import org.thoughtcrime.securesms.util.GroupUtil;
|
import org.thoughtcrime.securesms.util.GroupUtil;
|
||||||
import org.thoughtcrime.securesms.util.SetUtil;
|
import org.thoughtcrime.securesms.util.SetUtil;
|
||||||
|
@ -34,6 +36,7 @@ import org.whispersystems.signalservice.api.push.exceptions.ServerRejectedExcept
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.concurrent.TimeUnit;
|
import java.util.concurrent.TimeUnit;
|
||||||
|
import java.util.stream.Collectors;
|
||||||
|
|
||||||
public class RemoteDeleteSendJob extends BaseJob {
|
public class RemoteDeleteSendJob extends BaseJob {
|
||||||
|
|
||||||
|
@ -67,8 +70,18 @@ public class RemoteDeleteSendJob extends BaseJob {
|
||||||
throw new AssertionError("We have a message, but couldn't find the thread!");
|
throw new AssertionError("We have a message, but couldn't find the thread!");
|
||||||
}
|
}
|
||||||
|
|
||||||
List<RecipientId> recipients = conversationRecipient.isGroup() ? Stream.of(conversationRecipient.getParticipants()).map(Recipient::getId).toList()
|
List<RecipientId> recipients;
|
||||||
|
if (conversationRecipient.isDistributionList()) {
|
||||||
|
DistributionListId distributionListId = conversationRecipient.requireDistributionListId();
|
||||||
|
|
||||||
|
recipients = Stories.getRecipientsToSendTo(distributionListId, messageId)
|
||||||
|
.stream()
|
||||||
|
.map(Recipient::getId)
|
||||||
|
.collect(Collectors.toList());
|
||||||
|
} else {
|
||||||
|
recipients = conversationRecipient.isGroup() ? Stream.of(conversationRecipient.getParticipants()).map(Recipient::getId).toList()
|
||||||
: Stream.of(conversationRecipient.getId()).toList();
|
: Stream.of(conversationRecipient.getId()).toList();
|
||||||
|
}
|
||||||
|
|
||||||
recipients.remove(Recipient.self().getId());
|
recipients.remove(Recipient.self().getId());
|
||||||
|
|
||||||
|
|
|
@ -5,11 +5,16 @@ import androidx.fragment.app.FragmentManager
|
||||||
import io.reactivex.rxjava3.core.Completable
|
import io.reactivex.rxjava3.core.Completable
|
||||||
import org.thoughtcrime.securesms.R
|
import org.thoughtcrime.securesms.R
|
||||||
import org.thoughtcrime.securesms.contacts.HeaderAction
|
import org.thoughtcrime.securesms.contacts.HeaderAction
|
||||||
|
import org.thoughtcrime.securesms.database.GroupReceiptDatabase.GroupReceiptInfo
|
||||||
|
import org.thoughtcrime.securesms.database.SignalDatabase
|
||||||
|
import org.thoughtcrime.securesms.database.model.DistributionListId
|
||||||
import org.thoughtcrime.securesms.dependencies.ApplicationDependencies
|
import org.thoughtcrime.securesms.dependencies.ApplicationDependencies
|
||||||
import org.thoughtcrime.securesms.keyvalue.SignalStore
|
import org.thoughtcrime.securesms.keyvalue.SignalStore
|
||||||
import org.thoughtcrime.securesms.mediasend.v2.stories.ChooseStoryTypeBottomSheet
|
import org.thoughtcrime.securesms.mediasend.v2.stories.ChooseStoryTypeBottomSheet
|
||||||
import org.thoughtcrime.securesms.mms.OutgoingMediaMessage
|
import org.thoughtcrime.securesms.mms.OutgoingMediaMessage
|
||||||
import org.thoughtcrime.securesms.recipients.Recipient
|
import org.thoughtcrime.securesms.recipients.Recipient
|
||||||
|
import org.thoughtcrime.securesms.recipients.RecipientId
|
||||||
|
import org.thoughtcrime.securesms.recipients.RecipientUtil
|
||||||
import org.thoughtcrime.securesms.sms.MessageSender
|
import org.thoughtcrime.securesms.sms.MessageSender
|
||||||
import org.thoughtcrime.securesms.util.BottomSheetUtil
|
import org.thoughtcrime.securesms.util.BottomSheetUtil
|
||||||
import org.thoughtcrime.securesms.util.FeatureFlags
|
import org.thoughtcrime.securesms.util.FeatureFlags
|
||||||
|
@ -48,4 +53,17 @@ object Stories {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@JvmStatic
|
||||||
|
fun getRecipientsToSendTo(distributionListId: DistributionListId, messageId: Long): List<Recipient> {
|
||||||
|
val destinations: List<GroupReceiptInfo> = SignalDatabase.groupReceipts.getGroupReceiptInfo(messageId)
|
||||||
|
|
||||||
|
val recipientIds: List<RecipientId> = if (destinations.isNotEmpty()) {
|
||||||
|
destinations.map(GroupReceiptInfo::getRecipientId)
|
||||||
|
} else {
|
||||||
|
SignalDatabase.distributionLists.getMembers(distributionListId)
|
||||||
|
}
|
||||||
|
|
||||||
|
return RecipientUtil.getEligibleForSending(recipientIds.map(Recipient::resolved))
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
Ładowanie…
Reference in New Issue