Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
61 changes: 37 additions & 24 deletions TMessagesProj/src/main/java/org/telegram/ui/ChatActivity.java
Original file line number Diff line number Diff line change
Expand Up @@ -9979,11 +9979,8 @@ public void updateLeftBottomButton(boolean noForwards) {
updateLeftBottomButton(ChatsHelper.getLeftButtonAction(this, noForwards));
}

private boolean isSelectableBetweenMessage(MessageObject message, int begin, int end) {
private boolean isSelectableBetweenMessage(MessageObject message) {
int msgId = message.getId();
if (msgId <= begin || msgId >= end) {
return false;
}
int index = message.getDialogId() == dialog_id ? 0 : 1;
if (selectedMessagesIds[index].indexOfKey(msgId) >= 0) {
return false;
Expand All @@ -9999,44 +9996,60 @@ private boolean isSelectableBetweenMessage(MessageObject message, int begin, int
return type >= MESSAGE_TYPE_MEDIA && type != MESSAGE_TYPE_SEND_ERROR_TEXT;
}

private boolean hasSelectedMessagesRange() {
return selectedMessagesIds[0].size() + selectedMessagesIds[1].size() >= 2;
}

private boolean isMessageSelectedForBetween(MessageObject message) {
int index = message.getDialogId() == dialog_id ? 0 : 1;
return selectedMessagesIds[index].indexOfKey(message.getId()) >= 0;
}

public boolean canSelectBetweenMessages() {
int[] bounds = ChatsHelper.getSelectBetweenBounds(selectedMessagesIds);
if (bounds == null) {
if (!hasSelectedMessagesRange()) {
return false;
}
int begin = bounds[0];
int end = bounds[1];
int minPos = Integer.MAX_VALUE, maxPos = Integer.MIN_VALUE;
for (int i = 0; i < messages.size(); i++) {
if (isSelectableBetweenMessage(messages.get(i), begin, end)) {
if (isMessageSelectedForBetween(messages.get(i))) {
if (i < minPos) minPos = i;
if (i > maxPos) maxPos = i;
}
}
if (minPos == Integer.MAX_VALUE || maxPos - minPos <= 1) {
return false;
}
for (int i = minPos + 1; i < maxPos; i++) {
if (isSelectableBetweenMessage(messages.get(i))) {
return true;
}
}
return false;
}

public void performSelectBetweenMessages() {
int[] bounds = ChatsHelper.getSelectBetweenBounds(selectedMessagesIds);
if (bounds == null) {
if (!hasSelectedMessagesRange()) {
return;
}
int begin = bounds[0];
int end = bounds[1];
int minPos = Integer.MAX_VALUE, maxPos = Integer.MIN_VALUE;
for (int i = 0; i < messages.size(); i++) {
if (isMessageSelectedForBetween(messages.get(i))) {
if (i < minPos) minPos = i;
if (i > maxPos) maxPos = i;
}
}
if (minPos == Integer.MAX_VALUE || maxPos - minPos <= 1) {
return;
}
for (int i = minPos + 1; i < maxPos; i++) {
MessageObject message = messages.get(i);
if (!isSelectableBetweenMessage(message, begin, end)) {
if (!isSelectableBetweenMessage(message)) {
continue;
}
if (selectedMessagesIds[0].size() + selectedMessagesIds[1].size() >= 100) {
if (message.getId() != begin) {
for (int x = 0; x < messages.size(); x++) {
MessageObject msg = messages.get(x);
if (msg.getId() == begin) {
addToSelectedMessages(msg, false, false);
addToSelectedMessages(message, true);
break;
}
}
}
MessageObject beginMsg = messages.get(minPos);
addToSelectedMessages(beginMsg, false, false);
addToSelectedMessages(message, true);
break;
}
addToSelectedMessages(message, true);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -448,29 +448,4 @@ public int loadServerUserName(long userId, int classGuid, Utilities.Callback2<St
return reqId;
}

@Nullable
public static int[] getSelectBetweenBounds(SparseArray<MessageObject>[] selectedMessagesIds) {
int min = Integer.MAX_VALUE;
int max = Integer.MIN_VALUE;
int count = 0;

for (int a = 1; a >= 0; a--) {
int size = selectedMessagesIds[a].size();
if (size > 0) {
int first = selectedMessagesIds[a].keyAt(0);
int last = selectedMessagesIds[a].keyAt(size - 1);
if (first < min) min = first;
if (last > max) max = last;
count += size;
}
}

if (count < 2) {
return null;
}
if (min == max || (long) max - min <= 1) {
return null;
}
return new int[]{min, max};
}
}
Loading