Update to 6.1.1 (1946)

This commit is contained in:
DrKLO 2020-05-01 05:08:26 +03:00
parent dbf81a34af
commit 5a2a813dc0
16 changed files with 254 additions and 98 deletions

View file

@ -286,7 +286,7 @@ android {
} }
} }
defaultConfig.versionCode = 1945 defaultConfig.versionCode = 1946
def tgVoipDexFileName = "libtgvoip.dex" def tgVoipDexFileName = "libtgvoip.dex"
def tgVoipDexClasses = ["AudioRecordJNI", "AudioTrackJNI", "NativeTgVoipDelegate", "NativeTgVoipInstance", "TgVoipNativeLoader", "Resampler", "VLog"] def tgVoipDexClasses = ["AudioRecordJNI", "AudioTrackJNI", "NativeTgVoipDelegate", "NativeTgVoipInstance", "TgVoipNativeLoader", "Resampler", "VLog"]

View file

@ -308,7 +308,14 @@ public class AndroidUtilities {
if (links.size() == 0) { if (links.size() == 0) {
return false; return false;
} }
for (LinkSpec link : links) { for (int a = 0, N = links.size(); a < N; a++) {
LinkSpec link = links.get(a);
URLSpan[] oldSpans = text.getSpans(link.start, link.end, URLSpan.class);
if (oldSpans != null && oldSpans.length > 0) {
for (int b = 0; b < oldSpans.length; b++) {
text.removeSpan(oldSpans[b]);
}
}
text.setSpan(new URLSpan(link.url), link.start, link.end, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE); text.setSpan(new URLSpan(link.url), link.start, link.end, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
} }
return true; return true;
@ -3307,7 +3314,7 @@ public class AndroidUtilities {
if (ch == '.' || ch == '-' || ch == '/' || ch == '+' || ch >= '0' && ch <= '9') { if (ch == '.' || ch == '-' || ch == '/' || ch == '+' || ch >= '0' && ch <= '9') {
continue; continue;
} }
if (ch >= 'a' && ch < 'z' || ch >= 'A' && ch <= 'Z') { if (ch >= 'a' && ch <= 'z' || ch >= 'A' && ch <= 'Z') {
hasLatin = true; hasLatin = true;
} else { } else {
hasNonLatin = true; hasNonLatin = true;

View file

@ -19,7 +19,7 @@ public class BuildVars {
public static boolean USE_CLOUD_STRINGS = true; public static boolean USE_CLOUD_STRINGS = true;
public static boolean CHECK_UPDATES = true; public static boolean CHECK_UPDATES = true;
public static boolean TON_WALLET_STANDALONE = false; public static boolean TON_WALLET_STANDALONE = false;
public static int BUILD_VERSION = 1945; public static int BUILD_VERSION = 1946;
public static String BUILD_VERSION_STRING = "6.1.0"; public static String BUILD_VERSION_STRING = "6.1.0";
public static int APP_ID = 4; public static int APP_ID = 4;
public static String APP_HASH = "014b35b6184100b085b0d0572f9b5103"; public static String APP_HASH = "014b35b6184100b085b0d0572f9b5103";

View file

@ -3923,14 +3923,14 @@ public class MediaDataController extends BaseController {
Collections.sort(entities, entityComparator); Collections.sort(entities, entityComparator);
} }
private static boolean checkInclusion(int index, ArrayList<TLRPC.MessageEntity> entities) { private static boolean checkInclusion(int index, ArrayList<TLRPC.MessageEntity> entities, boolean end) {
if (entities == null || entities.isEmpty()) { if (entities == null || entities.isEmpty()) {
return false; return false;
} }
int count = entities.size(); int count = entities.size();
for (int a = 0; a < count; a++) { for (int a = 0; a < count; a++) {
TLRPC.MessageEntity entity = entities.get(a); TLRPC.MessageEntity entity = entities.get(a);
if (entity.offset <= index && entity.offset + entity.length > index) { if ((end ? entity.offset < index : entity.offset <= index) && entity.offset + entity.length > index) {
return true; return true;
} }
} }
@ -4258,7 +4258,7 @@ public class MediaDataController extends BaseController {
TextStyleSpan span = spans[a]; TextStyleSpan span = spans[a];
int spanStart = spannable.getSpanStart(span); int spanStart = spannable.getSpanStart(span);
int spanEnd = spannable.getSpanEnd(span); int spanEnd = spannable.getSpanEnd(span);
if (checkInclusion(spanStart, entities) || checkInclusion(spanEnd, entities) || checkIntersection(spanStart, spanEnd, entities)) { if (checkInclusion(spanStart, entities, false) || checkInclusion(spanEnd, entities, true) || checkIntersection(spanStart, spanEnd, entities)) {
continue; continue;
} }
if (entities == null) { if (entities == null) {
@ -4362,7 +4362,7 @@ public class MediaDataController extends BaseController {
while ((index = TextUtils.indexOf(message[0], checkString, lastIndex)) != -1) { while ((index = TextUtils.indexOf(message[0], checkString, lastIndex)) != -1) {
if (start == -1) { if (start == -1) {
char prevChar = index == 0 ? ' ' : message[0].charAt(index - 1); char prevChar = index == 0 ? ' ' : message[0].charAt(index - 1);
if (!checkInclusion(index, entities) && (prevChar == ' ' || prevChar == '\n')) { if (!checkInclusion(index, entities, false) && (prevChar == ' ' || prevChar == '\n')) {
start = index; start = index;
} }
lastIndex = index + 2; lastIndex = index + 2;
@ -4375,7 +4375,7 @@ public class MediaDataController extends BaseController {
} }
} }
lastIndex = index + 2; lastIndex = index + 2;
if (checkInclusion(index, entities) || checkIntersection(start, index, entities)) { if (checkInclusion(index, entities, false) || checkIntersection(start, index, entities)) {
start = -1; start = -1;
continue; continue;
} }

View file

@ -1014,7 +1014,8 @@ public class MessageObject {
messageText = replaceWithLink(LocaleController.getString("EventLogAdded", R.string.EventLogAdded), "un2", whoUser); messageText = replaceWithLink(LocaleController.getString("EventLogAdded", R.string.EventLogAdded), "un2", whoUser);
messageText = replaceWithLink(messageText, "un1", fromUser); messageText = replaceWithLink(messageText, "un1", fromUser);
} }
} else if (event.action instanceof TLRPC.TL_channelAdminLogEventActionParticipantToggleAdmin) { } else if (event.action instanceof TLRPC.TL_channelAdminLogEventActionParticipantToggleAdmin ||
event.action instanceof TLRPC.TL_channelAdminLogEventActionParticipantToggleBan && event.action.prev_participant instanceof TLRPC.TL_channelParticipantAdmin && event.action.new_participant instanceof TLRPC.TL_channelParticipant) {
messageOwner = new TLRPC.TL_message(); messageOwner = new TLRPC.TL_message();
TLRPC.User whoUser = MessagesController.getInstance(currentAccount).getUser(event.action.prev_participant.user_id); TLRPC.User whoUser = MessagesController.getInstance(currentAccount).getUser(event.action.prev_participant.user_id);
StringBuilder rights; StringBuilder rights;

View file

@ -9675,19 +9675,23 @@ public class MessagesStorage extends BaseController {
for (int a = 0; a < dialogs.dialogs.size(); a++) { for (int a = 0; a < dialogs.dialogs.size(); a++) {
TLRPC.Dialog dialog = dialogs.dialogs.get(a); TLRPC.Dialog dialog = dialogs.dialogs.get(a);
boolean exists = false;
DialogObject.initDialog(dialog); DialogObject.initDialog(dialog);
if (check == 1) { if (check == 1) {
SQLiteCursor cursor = database.queryFinalized("SELECT did FROM dialogs WHERE did = " + dialog.id); SQLiteCursor cursor = database.queryFinalized("SELECT did FROM dialogs WHERE did = " + dialog.id);
boolean exists = cursor.next(); exists = cursor.next();
cursor.dispose(); cursor.dispose();
if (exists) { if (exists) {
continue; continue;
} }
} else if (dialog.pinned && check == 2) { } else if (check == 2) {
SQLiteCursor cursor = database.queryFinalized("SELECT pinned FROM dialogs WHERE did = " + dialog.id); SQLiteCursor cursor = database.queryFinalized("SELECT pinned FROM dialogs WHERE did = " + dialog.id);
if (cursor.next()) { if (cursor.next()) {
exists = true;
if (dialog.pinned) {
dialog.pinnedNum = cursor.intValue(0); dialog.pinnedNum = cursor.intValue(0);
} }
}
cursor.dispose(); cursor.dispose();
} }
int messageDate = 0; int messageDate = 0;
@ -9745,8 +9749,13 @@ public class MessagesStorage extends BaseController {
state_polls.step(); state_polls.step();
} }
if (exists) {
closeHolesInTable("messages_holes", dialog.id, message.id, message.id);
closeHolesInMedia(dialog.id, message.id, message.id, -1);
} else {
createFirstHoles(dialog.id, state_holes, state_media_holes, message.id); createFirstHoles(dialog.id, state_holes, state_media_holes, message.id);
} }
}
long topMessage = dialog.top_message; long topMessage = dialog.top_message;
if (dialog.peer != null && dialog.peer.channel_id != 0) { if (dialog.peer != null && dialog.peer.channel_id != 0) {

View file

@ -3110,6 +3110,7 @@ public class SendMessagesHelper extends BaseController implements NotificationCe
} }
if (poll.results != null && !TextUtils.isEmpty(poll.results.solution)) { if (poll.results != null && !TextUtils.isEmpty(poll.results.solution)) {
inputMediaPoll.solution = poll.results.solution; inputMediaPoll.solution = poll.results.solution;
inputMediaPoll.solution_entities = poll.results.solution_entities;
inputMediaPoll.flags |= 2; inputMediaPoll.flags |= 2;
} }
inputMedia = inputMediaPoll; inputMedia = inputMediaPoll;

View file

@ -5281,6 +5281,7 @@ public class ChatMessageCell extends BaseCell implements SeekBar.SeekBarDelegate
if (!animated) { if (!animated) {
psaButtonProgress = show ? 1.0f : 0.0f; psaButtonProgress = show ? 1.0f : 0.0f;
} else { } else {
setInvalidatesParent(true);
invalidate(); invalidate();
} }
} }
@ -5308,6 +5309,7 @@ public class ChatMessageCell extends BaseCell implements SeekBar.SeekBarDelegate
if (invalidatesParent && getParent() != null) { if (invalidatesParent && getParent() != null) {
View parent = (View) getParent(); View parent = (View) getParent();
if (parent.getParent() != null) { if (parent.getParent() != null) {
parent.invalidate();
parent = (View) parent.getParent(); parent = (View) parent.getParent();
parent.invalidate(); parent.invalidate();
} }
@ -8779,6 +8781,35 @@ public class ChatMessageCell extends BaseCell implements SeekBar.SeekBarDelegate
setDrawableBounds(currentBackgroundShadowDrawable, backgroundDrawableLeft, backgroundTop, backgroundDrawableRight, layoutHeight - offsetBottom + additionalBottom); setDrawableBounds(currentBackgroundShadowDrawable, backgroundDrawableLeft, backgroundTop, backgroundDrawableRight, layoutHeight - offsetBottom + additionalBottom);
} }
if (hasPsaHint) {
int x;
if (currentPosition == null || (currentPosition.flags & MessageObject.POSITION_FLAG_RIGHT) != 0) {
x = currentBackgroundDrawable.getBounds().right;
} else {
x = 0;
int dWidth = getGroupPhotosWidth();
for (int a = 0; a < currentMessagesGroup.posArray.size(); a++) {
MessageObject.GroupedMessagePosition position = currentMessagesGroup.posArray.get(a);
if (position.minY == 0) {
x += Math.ceil((position.pw + position.leftSpanOffset) / 1000.0f * dWidth);
} else {
break;
}
}
}
Drawable drawable = Theme.chat_psaHelpDrawable[currentMessageObject.isOutOwner() ? 1 : 0];
int y;
if (currentMessageObject.type == MessageObject.TYPE_ROUND_VIDEO) {
y = AndroidUtilities.dp(12);
} else {
y = AndroidUtilities.dp(10 + (drawNameLayout ? 19 : 0));
}
psaHelpX = x - drawable.getIntrinsicWidth() - AndroidUtilities.dp(currentMessageObject.isOutOwner() ? 20 : 14);
psaHelpY = y + AndroidUtilities.dp(4);
}
if (checkBoxVisible || checkBoxAnimationInProgress) { if (checkBoxVisible || checkBoxAnimationInProgress) {
if (checkBoxVisible && checkBoxAnimationProgress == 1.0f || !checkBoxVisible && checkBoxAnimationProgress == 0.0f) { if (checkBoxVisible && checkBoxAnimationProgress == 1.0f || !checkBoxVisible && checkBoxAnimationProgress == 0.0f) {
checkBoxAnimationInProgress = false; checkBoxAnimationInProgress = false;
@ -9093,13 +9124,6 @@ public class ChatMessageCell extends BaseCell implements SeekBar.SeekBarDelegate
if (hasPsaHint) { if (hasPsaHint) {
if (psaButtonVisible || psaButtonProgress > 0) { if (psaButtonVisible || psaButtonProgress > 0) {
Drawable drawable = Theme.chat_psaHelpDrawable[currentMessageObject.isOutOwner() ? 1 : 0]; Drawable drawable = Theme.chat_psaHelpDrawable[currentMessageObject.isOutOwner() ? 1 : 0];
if (pollVoteInProgress) {
drawable.setAlpha((int) (255 * pollAnimationProgress));
} else {
drawable.setAlpha(255);
}
psaHelpX = currentBackgroundDrawable.getBounds().right - drawable.getIntrinsicWidth() - AndroidUtilities.dp(currentMessageObject.isOutOwner() ? 20 : 14);
psaHelpY = forwardNameY + AndroidUtilities.dp(4);
int cx = psaHelpX + drawable.getIntrinsicWidth() / 2; int cx = psaHelpX + drawable.getIntrinsicWidth() / 2;
int cy = psaHelpY + drawable.getIntrinsicHeight() / 2; int cy = psaHelpY + drawable.getIntrinsicHeight() / 2;
float scale = psaButtonVisible && psaButtonProgress < 1 ? AnimationProperties.overshootInterpolator.getInterpolation(psaButtonProgress) : psaButtonProgress; float scale = psaButtonVisible && psaButtonProgress < 1 ? AnimationProperties.overshootInterpolator.getInterpolation(psaButtonProgress) : psaButtonProgress;
@ -9117,16 +9141,18 @@ public class ChatMessageCell extends BaseCell implements SeekBar.SeekBarDelegate
} }
if (psaButtonVisible && psaButtonProgress < 1.0f) { if (psaButtonVisible && psaButtonProgress < 1.0f) {
psaButtonProgress += dt / 180.0f; psaButtonProgress += dt / 180.0f;
invalidate();
if (psaButtonProgress > 1.0f) { if (psaButtonProgress > 1.0f) {
psaButtonProgress = 1.0f; psaButtonProgress = 1.0f;
setInvalidatesParent(false);
} }
invalidate();
} else if (!psaButtonVisible && psaButtonProgress > 0.0f) { } else if (!psaButtonVisible && psaButtonProgress > 0.0f) {
psaButtonProgress -= dt / 180.0f; psaButtonProgress -= dt / 180.0f;
invalidate();
if (psaButtonProgress < 0.0f) { if (psaButtonProgress < 0.0f) {
psaButtonProgress = 0.0f; psaButtonProgress = 0.0f;
setInvalidatesParent(false);
} }
invalidate();
} }
} }
} }

View file

@ -18,6 +18,7 @@ import android.graphics.PorterDuffColorFilter;
import android.text.TextUtils; import android.text.TextUtils;
import android.text.TextWatcher; import android.text.TextWatcher;
import android.util.TypedValue; import android.util.TypedValue;
import android.view.ActionMode;
import android.view.Gravity; import android.view.Gravity;
import android.view.MotionEvent; import android.view.MotionEvent;
import android.view.View; import android.view.View;
@ -33,6 +34,7 @@ import org.telegram.ui.ActionBar.SimpleTextView;
import org.telegram.ui.ActionBar.Theme; import org.telegram.ui.ActionBar.Theme;
import org.telegram.ui.Components.CheckBox2; import org.telegram.ui.Components.CheckBox2;
import org.telegram.ui.Components.EditTextBoldCursor; import org.telegram.ui.Components.EditTextBoldCursor;
import org.telegram.ui.Components.EditTextCaption;
import org.telegram.ui.Components.LayoutHelper; import org.telegram.ui.Components.LayoutHelper;
import java.util.ArrayList; import java.util.ArrayList;
@ -50,10 +52,57 @@ public class PollEditTextCell extends FrameLayout {
private boolean alwaysShowText2; private boolean alwaysShowText2;
public PollEditTextCell(Context context, OnClickListener onDelete) { public PollEditTextCell(Context context, OnClickListener onDelete) {
this(context, false, onDelete);
}
public PollEditTextCell(Context context, boolean caption, OnClickListener onDelete) {
super(context); super(context);
textView = new EditTextBoldCursor(context) { if (caption) {
textView = new EditTextCaption(context) {
@Override
public InputConnection onCreateInputConnection(EditorInfo outAttrs) {
InputConnection conn = super.onCreateInputConnection(outAttrs);
if (showNextButton) {
outAttrs.imeOptions &= ~EditorInfo.IME_FLAG_NO_ENTER_ACTION;
}
return conn;
}
@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
onEditTextDraw(this, canvas);
}
@Override
public boolean onTouchEvent(MotionEvent event) {
if (!isEnabled()) {
return false;
}
if (event.getAction() == MotionEvent.ACTION_UP) {
onFieldTouchUp(this);
}
return super.onTouchEvent(event);
}
@Override
public ActionMode startActionMode(ActionMode.Callback callback, int type) {
ActionMode actionMode = super.startActionMode(callback, type);
onActionModeStart(this, actionMode);
return actionMode;
}
@Override
public ActionMode startActionMode(ActionMode.Callback callback) {
ActionMode actionMode = super.startActionMode(callback);
onActionModeStart(this, actionMode);
return actionMode;
}
};
((EditTextCaption) textView).setAllowTextEntitiesIntersection(true);
} else {
textView = new EditTextBoldCursor(context) {
@Override @Override
public InputConnection onCreateInputConnection(EditorInfo outAttrs) { public InputConnection onCreateInputConnection(EditorInfo outAttrs) {
InputConnection conn = super.onCreateInputConnection(outAttrs); InputConnection conn = super.onCreateInputConnection(outAttrs);
@ -80,6 +129,7 @@ public class PollEditTextCell extends FrameLayout {
return super.onTouchEvent(event); return super.onTouchEvent(event);
} }
}; };
}
textView.setTextColor(Theme.getColor(Theme.key_windowBackgroundWhiteBlackText)); textView.setTextColor(Theme.getColor(Theme.key_windowBackgroundWhiteBlackText));
textView.setHintTextColor(Theme.getColor(Theme.key_windowBackgroundWhiteHintText)); textView.setHintTextColor(Theme.getColor(Theme.key_windowBackgroundWhiteHintText));
textView.setTextSize(TypedValue.COMPLEX_UNIT_DIP, 16); textView.setTextSize(TypedValue.COMPLEX_UNIT_DIP, 16);
@ -188,6 +238,10 @@ public class PollEditTextCell extends FrameLayout {
return false; return false;
} }
protected void onActionModeStart(EditTextBoldCursor editText, ActionMode actionMode) {
}
public void callOnDelete() { public void callOnDelete() {
if (deleteImageView == null) { if (deleteImageView == null) {
return; return;

View file

@ -12408,6 +12408,14 @@ public class ChatActivity extends BaseFragment implements NotificationCenter.Not
return true; return true;
} }
} }
fillActionModeMenu(menu);
return true;
}
public void fillActionModeMenu(Menu menu) {
if (menu.findItem(R.id.menu_bold) != null) {
return;
}
if (Build.VERSION.SDK_INT >= 23) { if (Build.VERSION.SDK_INT >= 23) {
menu.removeItem(android.R.id.shareText); menu.removeItem(android.R.id.shareText);
} }
@ -12434,7 +12442,6 @@ public class ChatActivity extends BaseFragment implements NotificationCenter.Not
} }
menu.add(R.id.menu_groupbolditalic, R.id.menu_link, 11, LocaleController.getString("CreateLink", R.string.CreateLink)); menu.add(R.id.menu_groupbolditalic, R.id.menu_link, 11, LocaleController.getString("CreateLink", R.string.CreateLink));
menu.add(R.id.menu_groupbolditalic, R.id.menu_regular, 12, LocaleController.getString("Regular", R.string.Regular)); menu.add(R.id.menu_groupbolditalic, R.id.menu_regular, 12, LocaleController.getString("Regular", R.string.Regular));
return true;
} }
private void updateScheduledInterface(boolean animated) { private void updateScheduledInterface(boolean animated) {
@ -16015,6 +16022,30 @@ public class ChatActivity extends BaseFragment implements NotificationCenter.Not
} }
SpannableStringBuilder stringBuilder = new SpannableStringBuilder(text); SpannableStringBuilder stringBuilder = new SpannableStringBuilder(text);
MessageObject.addLinks(false, stringBuilder); MessageObject.addLinks(false, stringBuilder);
MessageObject.GroupedMessages group = cell.getCurrentMessagesGroup();
if (group != null) {
for (int a = 0, N = group.posArray.size(); a < N; a++) {
MessageObject.GroupedMessagePosition pos = group.posArray.get(a);
if ((pos.flags & MessageObject.POSITION_FLAG_LEFT) != 0) {
MessageObject m = group.messages.get(a);
if (m != messageObject) {
messageObject = m;
int count = chatListView.getChildCount();
for (int b = 0; b < count; b++) {
View view = chatListView.getChildAt(b);
if (!(view instanceof ChatMessageCell)) {
continue;
}
ChatMessageCell c = (ChatMessageCell) view;
if (messageObject.equals(c.getMessageObject())) {
cell = c;
}
}
}
break;
}
}
}
showInfoHint(messageObject, stringBuilder, 1); showInfoHint(messageObject, stringBuilder, 1);
} }
cell.showHintButton(false, true, type); cell.showHintButton(false, true, type);

View file

@ -403,6 +403,7 @@ public class ChatAttachAlertDocumentLayout extends ChatAttachAlert.AttachAlertLa
} catch (Exception e) { } catch (Exception e) {
FileLog.e(e); FileLog.e(e);
} }
parentAlert.actionBar.closeSearchField();
ActionBarMenu menu = parentAlert.actionBar.createMenu(); ActionBarMenu menu = parentAlert.actionBar.createMenu();
menu.removeView(sortItem); menu.removeView(sortItem);
menu.removeView(searchItem); menu.removeView(searchItem);

View file

@ -968,6 +968,7 @@ public class ChatAttachAlertLocationLayout extends ChatAttachAlert.AttachAlertLa
if (searchAdapter != null) { if (searchAdapter != null) {
searchAdapter.destroy(); searchAdapter.destroy();
} }
parentAlert.actionBar.closeSearchField();
ActionBarMenu menu = parentAlert.actionBar.createMenu(); ActionBarMenu menu = parentAlert.actionBar.createMenu();
menu.removeView(searchItem); menu.removeView(searchItem);
} }

View file

@ -10,8 +10,10 @@ import android.graphics.drawable.Drawable;
import android.text.Editable; import android.text.Editable;
import android.text.TextUtils; import android.text.TextUtils;
import android.text.TextWatcher; import android.text.TextWatcher;
import android.view.ActionMode;
import android.view.Gravity; import android.view.Gravity;
import android.view.KeyEvent; import android.view.KeyEvent;
import android.view.Menu;
import android.view.View; import android.view.View;
import android.view.ViewGroup; import android.view.ViewGroup;
import android.view.inputmethod.EditorInfo; import android.view.inputmethod.EditorInfo;
@ -19,6 +21,7 @@ import android.view.inputmethod.EditorInfo;
import org.telegram.messenger.AndroidUtilities; import org.telegram.messenger.AndroidUtilities;
import org.telegram.messenger.ChatObject; import org.telegram.messenger.ChatObject;
import org.telegram.messenger.LocaleController; import org.telegram.messenger.LocaleController;
import org.telegram.messenger.MediaDataController;
import org.telegram.messenger.R; import org.telegram.messenger.R;
import org.telegram.messenger.Utilities; import org.telegram.messenger.Utilities;
import org.telegram.tgnet.SerializedData; import org.telegram.tgnet.SerializedData;
@ -59,7 +62,7 @@ public class ChatAttachAlertPollLayout extends ChatAttachAlert.AttachAlertLayout
private boolean[] answersChecks = new boolean[10]; private boolean[] answersChecks = new boolean[10];
private int answersCount = 1; private int answersCount = 1;
private String questionString; private String questionString;
private String solutionString; private CharSequence solutionString;
private boolean anonymousPoll = true; private boolean anonymousPoll = true;
private boolean multipleChoise; private boolean multipleChoise;
private boolean quizPoll; private boolean quizPoll;
@ -329,6 +332,9 @@ public class ChatAttachAlertPollLayout extends ChatAttachAlert.AttachAlertLayout
@Override @Override
public void onScrolled(RecyclerView recyclerView, int dx, int dy) { public void onScrolled(RecyclerView recyclerView, int dx, int dy) {
parentAlert.updateLayout(ChatAttachAlertPollLayout.this, true); parentAlert.updateLayout(ChatAttachAlertPollLayout.this, true);
if (dy != 0 && hintView != null) {
hintView.hide();
}
} }
@Override @Override
@ -393,14 +399,14 @@ public class ChatAttachAlertPollLayout extends ChatAttachAlert.AttachAlertLayout
poll.poll.multiple_choice = multipleChoise; poll.poll.multiple_choice = multipleChoise;
poll.poll.quiz = quizPoll; poll.poll.quiz = quizPoll;
poll.poll.public_voters = !anonymousPoll; poll.poll.public_voters = !anonymousPoll;
poll.poll.question = getFixedString(questionString); poll.poll.question = getFixedString(questionString).toString();
SerializedData serializedData = new SerializedData(10); SerializedData serializedData = new SerializedData(10);
for (int a = 0; a < answers.length; a++) { for (int a = 0; a < answers.length; a++) {
if (TextUtils.isEmpty(getFixedString(answers[a]))) { if (TextUtils.isEmpty(getFixedString(answers[a]))) {
continue; continue;
} }
TLRPC.TL_pollAnswer answer = new TLRPC.TL_pollAnswer(); TLRPC.TL_pollAnswer answer = new TLRPC.TL_pollAnswer();
answer.text = getFixedString(answers[a]); answer.text = getFixedString(answers[a]).toString();
answer.option = new byte[1]; answer.option = new byte[1];
answer.option[0] = (byte) (48 + poll.poll.answers.size()); answer.option[0] = (byte) (48 + poll.poll.answers.size());
poll.poll.answers.add(answer); poll.poll.answers.add(answer);
@ -411,7 +417,13 @@ public class ChatAttachAlertPollLayout extends ChatAttachAlert.AttachAlertLayout
HashMap<String, String> params = new HashMap<>(); HashMap<String, String> params = new HashMap<>();
params.put("answers", Utilities.bytesToHex(serializedData.toByteArray())); params.put("answers", Utilities.bytesToHex(serializedData.toByteArray()));
poll.results = new TLRPC.TL_pollResults(); poll.results = new TLRPC.TL_pollResults();
poll.results.solution = getFixedString(solutionString); CharSequence solution = getFixedString(solutionString);
poll.results.solution = solution.toString();
CharSequence[] message = new CharSequence[]{solution};
ArrayList<TLRPC.MessageEntity> entities = MediaDataController.getInstance(parentAlert.currentAccount).getEntities(message, true);
if (entities != null && !entities.isEmpty()) {
poll.results.solution_entities = entities;
}
if (!TextUtils.isEmpty(poll.results.solution)) { if (!TextUtils.isEmpty(poll.results.solution)) {
poll.results.flags |= 16; poll.results.flags |= 16;
} }
@ -507,16 +519,16 @@ public class ChatAttachAlertPollLayout extends ChatAttachAlert.AttachAlertLayout
listView.smoothScrollToPosition(1); listView.smoothScrollToPosition(1);
} }
private String getFixedString(String text) { public static CharSequence getFixedString(CharSequence text) {
if (TextUtils.isEmpty(text)) { if (TextUtils.isEmpty(text)) {
return text; return text;
} }
text = AndroidUtilities.getTrimmedString(text).toString(); text = AndroidUtilities.getTrimmedString(text);
while (text.contains("\n\n\n")) { while (TextUtils.indexOf(text, "\n\n\n") >= 0) {
text = text.replace("\n\n\n", "\n\n"); text = TextUtils.replace(text, new String[]{"\n\n\n"}, new CharSequence[]{"\n\n"});
} }
while (text.startsWith("\n\n\n")) { while (TextUtils.indexOf(text, "\n\n\n") == 0) {
text = text.replace("\n\n\n", "\n\n"); text = TextUtils.replace(text, new String[]{"\n\n\n"}, new CharSequence[]{"\n\n"});
} }
return text; return text;
} }
@ -909,11 +921,22 @@ public class ChatAttachAlertPollLayout extends ChatAttachAlert.AttachAlertLayout
view = new TextCheckCell(mContext); view = new TextCheckCell(mContext);
break; break;
case 7: { case 7: {
PollEditTextCell cell = new PollEditTextCell(mContext, null) { PollEditTextCell cell = new PollEditTextCell(mContext, true, null) {
@Override @Override
protected void onFieldTouchUp(EditTextBoldCursor editText) { protected void onFieldTouchUp(EditTextBoldCursor editText) {
parentAlert.makeFocusable(editText); parentAlert.makeFocusable(editText);
} }
@Override
protected void onActionModeStart(EditTextBoldCursor editText, ActionMode actionMode) {
if (editText.isFocused() && editText.hasSelection()) {
Menu menu = actionMode.getMenu();
if (menu.findItem(android.R.id.copy) == null) {
return;
}
((ChatActivity) parentAlert.baseFragment).fillActionModeMenu(menu);
}
}
}; };
cell.createErrorTextView(); cell.createErrorTextView();
cell.addTextWatcher(new TextWatcher() { cell.addTextWatcher(new TextWatcher() {
@ -932,7 +955,7 @@ public class ChatAttachAlertPollLayout extends ChatAttachAlert.AttachAlertLayout
if (cell.getTag() != null) { if (cell.getTag() != null) {
return; return;
} }
solutionString = s.toString(); solutionString = s;
RecyclerView.ViewHolder holder = listView.findViewHolderForAdapterPosition(solutionRow); RecyclerView.ViewHolder holder = listView.findViewHolderForAdapterPosition(solutionRow);
if (holder != null) { if (holder != null) {
setTextLeft(holder.itemView, solutionRow); setTextLeft(holder.itemView, solutionRow);

View file

@ -928,7 +928,7 @@ public class SharedMediaLayout extends FrameLayout implements NotificationCenter
commonGroupsAdapter = new CommonGroupsAdapter(context); commonGroupsAdapter = new CommonGroupsAdapter(context);
chatUsersAdapter = new ChatUsersAdapter(context); chatUsersAdapter = new ChatUsersAdapter(context);
chatUsersAdapter.sortedUsers = sortedUsers; chatUsersAdapter.sortedUsers = sortedUsers;
chatUsersAdapter.chatInfo = chatInfo; chatUsersAdapter.chatInfo = membersFirst ? chatInfo : null;
linksAdapter = new SharedLinksAdapter(context); linksAdapter = new SharedLinksAdapter(context);
setWillNotDraw(false); setWillNotDraw(false);

View file

@ -4090,7 +4090,7 @@ public class DialogsActivity extends BaseFragment implements NotificationCenter.
} }
} else if (action == delete || action == clear) { } else if (action == delete || action == clear) {
if (count == 1) { if (count == 1) {
if (canDeletePsaSelected) { if (action == delete && canDeletePsaSelected) {
AlertDialog.Builder builder = new AlertDialog.Builder(getParentActivity()); AlertDialog.Builder builder = new AlertDialog.Builder(getParentActivity());
builder.setTitle(LocaleController.getString("PsaHideChatAlertTitle", R.string.PsaHideChatAlertTitle)); builder.setTitle(LocaleController.getString("PsaHideChatAlertTitle", R.string.PsaHideChatAlertTitle));
builder.setMessage(LocaleController.getString("PsaHideChatAlertText", R.string.PsaHideChatAlertText)); builder.setMessage(LocaleController.getString("PsaHideChatAlertText", R.string.PsaHideChatAlertText));

View file

@ -9,8 +9,10 @@ import android.graphics.drawable.Drawable;
import android.text.Editable; import android.text.Editable;
import android.text.TextUtils; import android.text.TextUtils;
import android.text.TextWatcher; import android.text.TextWatcher;
import android.view.ActionMode;
import android.view.Gravity; import android.view.Gravity;
import android.view.KeyEvent; import android.view.KeyEvent;
import android.view.Menu;
import android.view.View; import android.view.View;
import android.view.ViewGroup; import android.view.ViewGroup;
import android.view.inputmethod.EditorInfo; import android.view.inputmethod.EditorInfo;
@ -49,7 +51,6 @@ import java.util.ArrayList;
import java.util.Arrays; import java.util.Arrays;
import java.util.HashMap; import java.util.HashMap;
import androidx.annotation.NonNull;
import androidx.recyclerview.widget.DefaultItemAnimator; import androidx.recyclerview.widget.DefaultItemAnimator;
import androidx.recyclerview.widget.ItemTouchHelper; import androidx.recyclerview.widget.ItemTouchHelper;
import androidx.recyclerview.widget.LinearLayoutManager; import androidx.recyclerview.widget.LinearLayoutManager;
@ -67,7 +68,7 @@ public class PollCreateActivity extends BaseFragment {
private boolean[] answersChecks = new boolean[10]; private boolean[] answersChecks = new boolean[10];
private int answersCount = 1; private int answersCount = 1;
private String questionString; private String questionString;
private String solutionString; private CharSequence solutionString;
private boolean anonymousPoll = true; private boolean anonymousPoll = true;
private boolean multipleChoise; private boolean multipleChoise;
private boolean quizPoll; private boolean quizPoll;
@ -195,7 +196,7 @@ public class PollCreateActivity extends BaseFragment {
if (quizPoll && doneItem.getAlpha() != 1.0f) { if (quizPoll && doneItem.getAlpha() != 1.0f) {
int checksCount = 0; int checksCount = 0;
for (int a = 0; a < answersChecks.length; a++) { for (int a = 0; a < answersChecks.length; a++) {
if (!TextUtils.isEmpty(getFixedString(answers[a])) && answersChecks[a]) { if (!TextUtils.isEmpty(ChatAttachAlertPollLayout.getFixedString(answers[a])) && answersChecks[a]) {
checksCount++; checksCount++;
} }
} }
@ -209,18 +210,14 @@ public class PollCreateActivity extends BaseFragment {
poll.poll.multiple_choice = multipleChoise; poll.poll.multiple_choice = multipleChoise;
poll.poll.quiz = quizPoll; poll.poll.quiz = quizPoll;
poll.poll.public_voters = !anonymousPoll; poll.poll.public_voters = !anonymousPoll;
poll.poll.question = getFixedString(questionString); poll.poll.question = ChatAttachAlertPollLayout.getFixedString(questionString).toString();
/*poll.poll.close_period = 20;
poll.poll.close_date = getConnectionsManager().getCurrentTime() + 20;
poll.poll.flags |= 16;
poll.poll.flags |= 32;*/
SerializedData serializedData = new SerializedData(10); SerializedData serializedData = new SerializedData(10);
for (int a = 0; a < answers.length; a++) { for (int a = 0; a < answers.length; a++) {
if (TextUtils.isEmpty(getFixedString(answers[a]))) { if (TextUtils.isEmpty(ChatAttachAlertPollLayout.getFixedString(answers[a]))) {
continue; continue;
} }
TLRPC.TL_pollAnswer answer = new TLRPC.TL_pollAnswer(); TLRPC.TL_pollAnswer answer = new TLRPC.TL_pollAnswer();
answer.text = getFixedString(answers[a]); answer.text = ChatAttachAlertPollLayout.getFixedString(answers[a]).toString();
answer.option = new byte[1]; answer.option = new byte[1];
answer.option[0] = (byte) (48 + poll.poll.answers.size()); answer.option[0] = (byte) (48 + poll.poll.answers.size());
poll.poll.answers.add(answer); poll.poll.answers.add(answer);
@ -231,7 +228,13 @@ public class PollCreateActivity extends BaseFragment {
HashMap<String, String> params = new HashMap<>(); HashMap<String, String> params = new HashMap<>();
params.put("answers", Utilities.bytesToHex(serializedData.toByteArray())); params.put("answers", Utilities.bytesToHex(serializedData.toByteArray()));
poll.results = new TLRPC.TL_pollResults(); poll.results = new TLRPC.TL_pollResults();
poll.results.solution = getFixedString(solutionString); CharSequence solution = ChatAttachAlertPollLayout.getFixedString(solutionString);
poll.results.solution = solution.toString();
CharSequence[] message = new CharSequence[]{solution};
ArrayList<TLRPC.MessageEntity> entities = getMediaDataController().getEntities(message, true);
if (entities != null && !entities.isEmpty()) {
poll.results.solution_entities = entities;
}
if (!TextUtils.isEmpty(poll.results.solution)) { if (!TextUtils.isEmpty(poll.results.solution)) {
poll.results.flags |= 16; poll.results.flags |= 16;
} }
@ -357,13 +360,15 @@ public class PollCreateActivity extends BaseFragment {
}); });
listView.setOnScrollListener(new RecyclerView.OnScrollListener() { listView.setOnScrollListener(new RecyclerView.OnScrollListener() {
@Override @Override
public void onScrollStateChanged(@NonNull RecyclerView recyclerView, int newState) { public void onScrollStateChanged(RecyclerView recyclerView, int newState) {
super.onScrollStateChanged(recyclerView, newState);
} }
@Override @Override
public void onScrolled(@NonNull RecyclerView recyclerView, int dx, int dy) { public void onScrolled(RecyclerView recyclerView, int dx, int dy) {
super.onScrolled(recyclerView, dx, dy); if (dy != 0 && hintView != null) {
hintView.hide();
}
} }
}); });
@ -387,20 +392,6 @@ public class PollCreateActivity extends BaseFragment {
AndroidUtilities.requestAdjustResize(getParentActivity(), classGuid, true); AndroidUtilities.requestAdjustResize(getParentActivity(), classGuid, true);
} }
private String getFixedString(String text) {
if (TextUtils.isEmpty(text)) {
return text;
}
text = AndroidUtilities.getTrimmedString(text).toString();
while (text.contains("\n\n\n")) {
text = text.replace("\n\n\n", "\n\n");
}
while (text.startsWith("\n\n\n")) {
text = text.replace("\n\n\n", "\n\n");
}
return text;
}
private void showQuizHint() { private void showQuizHint() {
int count = listView.getChildCount(); int count = listView.getChildCount();
for (int a = answerStartRow; a < answerStartRow + answersCount; a++) { for (int a = answerStartRow; a < answerStartRow + answersCount; a++) {
@ -420,19 +411,19 @@ public class PollCreateActivity extends BaseFragment {
int checksCount = 0; int checksCount = 0;
if (quizPoll) { if (quizPoll) {
for (int a = 0; a < answersChecks.length; a++) { for (int a = 0; a < answersChecks.length; a++) {
if (!TextUtils.isEmpty(getFixedString(answers[a])) && answersChecks[a]) { if (!TextUtils.isEmpty(ChatAttachAlertPollLayout.getFixedString(answers[a])) && answersChecks[a]) {
checksCount++; checksCount++;
} }
} }
} }
if (!TextUtils.isEmpty(getFixedString(solutionString)) && solutionString.length() > ChatAttachAlertPollLayout.MAX_SOLUTION_LENGTH) { if (!TextUtils.isEmpty(ChatAttachAlertPollLayout.getFixedString(solutionString)) && solutionString.length() > ChatAttachAlertPollLayout.MAX_SOLUTION_LENGTH) {
enabled = false; enabled = false;
} else if (TextUtils.isEmpty(getFixedString(questionString)) || questionString.length() > ChatAttachAlertPollLayout.MAX_QUESTION_LENGTH) { } else if (TextUtils.isEmpty(ChatAttachAlertPollLayout.getFixedString(questionString)) || questionString.length() > ChatAttachAlertPollLayout.MAX_QUESTION_LENGTH) {
enabled = false; enabled = false;
} else { } else {
int count = 0; int count = 0;
for (int a = 0; a < answers.length; a++) { for (int a = 0; a < answers.length; a++) {
if (!TextUtils.isEmpty(getFixedString(answers[a]))) { if (!TextUtils.isEmpty(ChatAttachAlertPollLayout.getFixedString(answers[a]))) {
if (answers[a].length() > ChatAttachAlertPollLayout.MAX_ANSWER_LENGTH) { if (answers[a].length() > ChatAttachAlertPollLayout.MAX_ANSWER_LENGTH) {
count = 0; count = 0;
break; break;
@ -499,10 +490,10 @@ public class PollCreateActivity extends BaseFragment {
} }
private boolean checkDiscard() { private boolean checkDiscard() {
boolean allowDiscard = TextUtils.isEmpty(getFixedString(questionString)); boolean allowDiscard = TextUtils.isEmpty(ChatAttachAlertPollLayout.getFixedString(questionString));
if (allowDiscard) { if (allowDiscard) {
for (int a = 0; a < answersCount; a++) { for (int a = 0; a < answersCount; a++) {
allowDiscard = TextUtils.isEmpty(getFixedString(answers[a])); allowDiscard = TextUtils.isEmpty(ChatAttachAlertPollLayout.getFixedString(answers[a]));
if (!allowDiscard) { if (!allowDiscard) {
break; break;
} }
@ -748,7 +739,18 @@ public class PollCreateActivity extends BaseFragment {
view.setBackgroundColor(Theme.getColor(Theme.key_windowBackgroundWhite)); view.setBackgroundColor(Theme.getColor(Theme.key_windowBackgroundWhite));
break; break;
case 7: { case 7: {
PollEditTextCell cell = new PollEditTextCell(mContext, null); PollEditTextCell cell = new PollEditTextCell(mContext, true, null) {
@Override
protected void onActionModeStart(EditTextBoldCursor editText, ActionMode actionMode) {
if (editText.isFocused() && editText.hasSelection()) {
Menu menu = actionMode.getMenu();
if (menu.findItem(android.R.id.copy) == null) {
return;
}
parentFragment.fillActionModeMenu(menu);
}
}
};
cell.createErrorTextView(); cell.createErrorTextView();
cell.setBackgroundColor(Theme.getColor(Theme.key_windowBackgroundWhite)); cell.setBackgroundColor(Theme.getColor(Theme.key_windowBackgroundWhite));
cell.addTextWatcher(new TextWatcher() { cell.addTextWatcher(new TextWatcher() {
@ -767,7 +769,7 @@ public class PollCreateActivity extends BaseFragment {
if (cell.getTag() != null) { if (cell.getTag() != null) {
return; return;
} }
solutionString = s.toString(); solutionString = s;
RecyclerView.ViewHolder holder = listView.findViewHolderForAdapterPosition(solutionRow); RecyclerView.ViewHolder holder = listView.findViewHolderForAdapterPosition(solutionRow);
if (holder != null) { if (holder != null) {
setTextLeft(holder.itemView, solutionRow); setTextLeft(holder.itemView, solutionRow);