12284 lines
682 KiB
Java
12284 lines
682 KiB
Java
/*
|
|
* This is the source code of Telegram for Android v. 3.x.x.
|
|
* It is licensed under GNU GPL v. 2 or later.
|
|
* You should have received a copy of the license in this archive (see LICENSE).
|
|
*
|
|
* Copyright Nikolai Kudashov, 2013-2017.
|
|
*/
|
|
|
|
package org.telegram.ui;
|
|
|
|
import android.Manifest;
|
|
import android.animation.Animator;
|
|
import android.animation.AnimatorListenerAdapter;
|
|
import android.animation.AnimatorSet;
|
|
import android.animation.ObjectAnimator;
|
|
import android.annotation.TargetApi;
|
|
import android.app.Activity;
|
|
import android.app.DatePickerDialog;
|
|
import android.app.Dialog;
|
|
import android.content.ClipData;
|
|
import android.content.Context;
|
|
import android.content.DialogInterface;
|
|
import android.content.Intent;
|
|
import android.content.SharedPreferences;
|
|
import android.content.pm.PackageManager;
|
|
import android.content.res.Configuration;
|
|
import android.database.Cursor;
|
|
import android.graphics.Bitmap;
|
|
import android.graphics.Canvas;
|
|
import android.graphics.Outline;
|
|
import android.graphics.Paint;
|
|
import android.graphics.Path;
|
|
import android.graphics.PorterDuff;
|
|
import android.graphics.PorterDuffColorFilter;
|
|
import android.graphics.PorterDuffXfermode;
|
|
import android.graphics.Rect;
|
|
import android.graphics.drawable.Drawable;
|
|
import android.media.ExifInterface;
|
|
import android.media.ThumbnailUtils;
|
|
import android.net.Uri;
|
|
import android.os.Build;
|
|
import android.os.Bundle;
|
|
import android.provider.ContactsContract;
|
|
import android.provider.MediaStore;
|
|
import android.support.v4.content.FileProvider;
|
|
import android.text.Spannable;
|
|
import android.text.SpannableString;
|
|
import android.text.SpannableStringBuilder;
|
|
import android.text.Spanned;
|
|
import android.text.TextUtils;
|
|
import android.text.style.CharacterStyle;
|
|
import android.text.style.ClickableSpan;
|
|
import android.text.style.ForegroundColorSpan;
|
|
import android.text.style.URLSpan;
|
|
import android.util.SparseArray;
|
|
import android.util.SparseBooleanArray;
|
|
import android.util.SparseIntArray;
|
|
import android.util.TypedValue;
|
|
import android.view.Gravity;
|
|
import android.view.Menu;
|
|
import android.view.MotionEvent;
|
|
import android.view.TextureView;
|
|
import android.view.View;
|
|
import android.view.ViewGroup;
|
|
import android.view.ViewOutlineProvider;
|
|
import android.view.ViewTreeObserver;
|
|
import android.view.WindowManager;
|
|
import android.view.animation.DecelerateInterpolator;
|
|
import android.widget.DatePicker;
|
|
import android.widget.EditText;
|
|
import android.widget.FrameLayout;
|
|
import android.widget.ImageView;
|
|
import android.widget.LinearLayout;
|
|
import android.widget.TextView;
|
|
import android.widget.Toast;
|
|
|
|
import org.telegram.messenger.AndroidUtilities;
|
|
import org.telegram.PhoneFormat.PhoneFormat;
|
|
import org.telegram.messenger.BuildConfig;
|
|
import org.telegram.messenger.BuildVars;
|
|
import org.telegram.messenger.ChatObject;
|
|
import org.telegram.messenger.Emoji;
|
|
import org.telegram.messenger.EmojiSuggestion;
|
|
import org.telegram.messenger.LocaleController;
|
|
import org.telegram.messenger.MediaController;
|
|
import org.telegram.messenger.MessagesStorage;
|
|
import org.telegram.messenger.NotificationsController;
|
|
import org.telegram.messenger.SecretChatHelper;
|
|
import org.telegram.messenger.SendMessagesHelper;
|
|
import org.telegram.messenger.UserObject;
|
|
import org.telegram.messenger.Utilities;
|
|
import org.telegram.messenger.VideoEditedInfo;
|
|
import org.telegram.messenger.browser.Browser;
|
|
import org.telegram.messenger.exoplayer2.ui.AspectRatioFrameLayout;
|
|
import org.telegram.messenger.query.BotQuery;
|
|
import org.telegram.messenger.query.DraftQuery;
|
|
import org.telegram.messenger.query.MessagesSearchQuery;
|
|
import org.telegram.messenger.query.MessagesQuery;
|
|
import org.telegram.messenger.query.SearchQuery;
|
|
import org.telegram.messenger.query.StickersQuery;
|
|
import org.telegram.messenger.support.widget.GridLayoutManager;
|
|
import org.telegram.messenger.support.widget.GridLayoutManagerFixed;
|
|
import org.telegram.messenger.support.widget.LinearLayoutManager;
|
|
import org.telegram.messenger.support.widget.LinearSmoothScrollerMiddle;
|
|
import org.telegram.messenger.support.widget.RecyclerView;
|
|
import org.telegram.messenger.ApplicationLoader;
|
|
import org.telegram.messenger.FileLoader;
|
|
import org.telegram.tgnet.ConnectionsManager;
|
|
import org.telegram.tgnet.RequestDelegate;
|
|
import org.telegram.tgnet.TLObject;
|
|
import org.telegram.tgnet.TLRPC;
|
|
import org.telegram.messenger.ContactsController;
|
|
import org.telegram.messenger.FileLog;
|
|
import org.telegram.messenger.MessageObject;
|
|
import org.telegram.messenger.MessagesController;
|
|
import org.telegram.messenger.NotificationCenter;
|
|
import org.telegram.messenger.R;
|
|
import org.telegram.messenger.UserConfig;
|
|
import org.telegram.ui.ActionBar.ActionBarLayout;
|
|
import org.telegram.ui.ActionBar.AlertDialog;
|
|
import org.telegram.ui.ActionBar.BackDrawable;
|
|
import org.telegram.ui.ActionBar.BottomSheet;
|
|
import org.telegram.ui.ActionBar.SimpleTextView;
|
|
import org.telegram.ui.ActionBar.ThemeDescription;
|
|
import org.telegram.ui.Adapters.MentionsAdapter;
|
|
import org.telegram.ui.Adapters.StickersAdapter;
|
|
import org.telegram.ui.Cells.BotSwitchCell;
|
|
import org.telegram.ui.Cells.ChatActionCell;
|
|
import org.telegram.ui.Cells.ChatLoadingCell;
|
|
import org.telegram.ui.ActionBar.ActionBar;
|
|
import org.telegram.ui.ActionBar.ActionBarMenu;
|
|
import org.telegram.ui.ActionBar.ActionBarMenuItem;
|
|
import org.telegram.ui.Cells.ChatMessageCell;
|
|
import org.telegram.ui.Cells.ChatUnreadCell;
|
|
import org.telegram.ui.Cells.CheckBoxCell;
|
|
import org.telegram.ui.Cells.ContextLinkCell;
|
|
import org.telegram.ui.Cells.MentionCell;
|
|
import org.telegram.ui.Cells.StickerCell;
|
|
import org.telegram.ui.Components.AlertsCreator;
|
|
import org.telegram.ui.Components.BackupImageView;
|
|
import org.telegram.ui.ActionBar.BaseFragment;
|
|
import org.telegram.ui.Cells.BotHelpCell;
|
|
import org.telegram.ui.Components.ChatActivityEnterView;
|
|
import org.telegram.messenger.ImageReceiver;
|
|
import org.telegram.ui.Components.ChatAttachAlert;
|
|
import org.telegram.ui.Components.ChatAvatarContainer;
|
|
import org.telegram.ui.Components.ChatBigEmptyView;
|
|
import org.telegram.ui.Components.CombinedDrawable;
|
|
import org.telegram.ui.Components.CorrectlyMeasuringTextView;
|
|
import org.telegram.ui.Components.EmbedBottomSheet;
|
|
import org.telegram.ui.Components.EmojiView;
|
|
import org.telegram.ui.Components.ExtendedGridLayoutManager;
|
|
import org.telegram.ui.Components.FragmentContextView;
|
|
import org.telegram.ui.Components.InstantCameraView;
|
|
import org.telegram.ui.Components.LayoutHelper;
|
|
import org.telegram.ui.Components.NumberTextView;
|
|
import org.telegram.ui.Components.PipRoundVideoView;
|
|
import org.telegram.ui.Components.RadialProgressView;
|
|
import org.telegram.ui.Components.RecyclerListView;
|
|
import org.telegram.ui.Components.ShareAlert;
|
|
import org.telegram.ui.Components.Size;
|
|
import org.telegram.ui.Components.SizeNotifierFrameLayout;
|
|
import org.telegram.ui.Components.StickersAlert;
|
|
import org.telegram.ui.ActionBar.Theme;
|
|
import org.telegram.ui.Components.TypefaceSpan;
|
|
import org.telegram.ui.Components.URLSpanBotCommand;
|
|
import org.telegram.ui.Components.URLSpanMono;
|
|
import org.telegram.ui.Components.URLSpanNoUnderline;
|
|
import org.telegram.ui.Components.URLSpanReplacement;
|
|
import org.telegram.ui.Components.URLSpanUserMention;
|
|
import org.telegram.ui.Components.voip.VoIPHelper;
|
|
|
|
import java.io.File;
|
|
import java.net.URLDecoder;
|
|
import java.util.ArrayList;
|
|
import java.util.Calendar;
|
|
import java.util.Collections;
|
|
import java.util.HashMap;
|
|
import java.util.concurrent.Semaphore;
|
|
import java.util.regex.Matcher;
|
|
|
|
@SuppressWarnings("unchecked")
|
|
public class ChatActivity extends BaseFragment implements NotificationCenter.NotificationCenterDelegate, DialogsActivity.DialogsActivityDelegate, LocationActivity.LocationActivityDelegate {
|
|
|
|
protected TLRPC.Chat currentChat;
|
|
protected TLRPC.User currentUser;
|
|
protected TLRPC.EncryptedChat currentEncryptedChat;
|
|
private boolean userBlocked = false;
|
|
|
|
private ArrayList<ChatMessageCell> chatMessageCellsCache = new ArrayList<>();
|
|
|
|
private Dialog closeChatDialog;
|
|
private FrameLayout progressView;
|
|
private View progressView2;
|
|
private FrameLayout bottomOverlay;
|
|
protected ChatActivityEnterView chatActivityEnterView;
|
|
private View timeItem2;
|
|
private ActionBarMenuItem attachItem;
|
|
private ActionBarMenuItem headerItem;
|
|
private ActionBarMenuItem searchItem;
|
|
private RadialProgressView progressBar;
|
|
private TextView addContactItem;
|
|
private RecyclerListView chatListView;
|
|
private GridLayoutManagerFixed chatLayoutManager;
|
|
private ChatActivityAdapter chatAdapter;
|
|
private TextView bottomOverlayChatText;
|
|
private FrameLayout bottomOverlayChat;
|
|
private FrameLayout emptyViewContainer;
|
|
private SizeNotifierFrameLayout contentView;
|
|
private ChatBigEmptyView bigEmptyView;
|
|
private ArrayList<View> actionModeViews = new ArrayList<>();
|
|
private ChatAvatarContainer avatarContainer;
|
|
private TextView bottomOverlayText;
|
|
private NumberTextView selectedMessagesCountTextView;
|
|
private FrameLayout actionModeTitleContainer;
|
|
private SimpleTextView actionModeTextView;
|
|
private SimpleTextView actionModeSubTextView;
|
|
private RecyclerListView stickersListView;
|
|
private ImageView stickersPanelArrow;
|
|
private RecyclerListView.OnItemClickListener stickersOnItemClickListener;
|
|
private RecyclerListView.OnItemClickListener mentionsOnItemClickListener;
|
|
private StickersAdapter stickersAdapter;
|
|
private FrameLayout stickersPanel;
|
|
private TextView muteItem;
|
|
private FrameLayout pagedownButton;
|
|
private ImageView pagedownButtonImage;
|
|
private boolean pagedownButtonShowedByScroll;
|
|
private TextView pagedownButtonCounter;
|
|
private FrameLayout mentiondownButton;
|
|
private TextView mentiondownButtonCounter;
|
|
private ImageView mentiondownButtonImage;
|
|
private BackupImageView replyImageView;
|
|
private SimpleTextView replyNameTextView;
|
|
private SimpleTextView replyObjectTextView;
|
|
private ImageView replyIconImageView;
|
|
private ImageView replyCloseImageView;
|
|
private MentionsAdapter mentionsAdapter;
|
|
private FrameLayout mentionContainer;
|
|
private RecyclerListView mentionListView;
|
|
private LinearLayoutManager mentionLayoutManager;
|
|
private ExtendedGridLayoutManager mentionGridLayoutManager;
|
|
private AnimatorSet mentionListAnimation;
|
|
private ChatAttachAlert chatAttachAlert;
|
|
private LinearLayout reportSpamView;
|
|
private AnimatorSet reportSpamViewAnimator;
|
|
private TextView addToContactsButton;
|
|
private TextView reportSpamButton;
|
|
private FrameLayout reportSpamContainer;
|
|
private ImageView closeReportSpam;
|
|
private FragmentContextView fragmentContextView;
|
|
private FragmentContextView fragmentLocationContextView;
|
|
private View replyLineView;
|
|
private TextView emptyView;
|
|
private TextView gifHintTextView;
|
|
private TextView mediaBanTooltip;
|
|
private TextView voiceHintTextView;
|
|
private Runnable voiceHintHideRunnable;
|
|
private AnimatorSet voiceHintAnimation;
|
|
private View emojiButtonRed;
|
|
private FrameLayout pinnedMessageView;
|
|
private View pinnedLineView;
|
|
private AnimatorSet pinnedMessageViewAnimator;
|
|
private BackupImageView pinnedMessageImageView;
|
|
private SimpleTextView pinnedMessageNameTextView;
|
|
private ImageView closePinned;
|
|
private SimpleTextView pinnedMessageTextView;
|
|
private FrameLayout alertView;
|
|
private Runnable hideAlertViewRunnable;
|
|
private TextView alertNameTextView;
|
|
private TextView alertTextView;
|
|
private AnimatorSet alertViewAnimator;
|
|
private FrameLayout searchContainer;
|
|
private ImageView searchCalendarButton;
|
|
private ImageView searchUserButton;
|
|
private ImageView searchUpButton;
|
|
private ImageView searchDownButton;
|
|
private SimpleTextView searchCountText;
|
|
private ChatActionCell floatingDateView;
|
|
private InstantCameraView instantCameraView;
|
|
private View overlayView;
|
|
private boolean currentFloatingDateOnScreen;
|
|
private boolean currentFloatingTopIsNotMessage;
|
|
private AnimatorSet floatingDateAnimation;
|
|
private boolean scrollingFloatingDate;
|
|
private boolean checkTextureViewPosition;
|
|
private boolean searchingForUser;
|
|
private TLRPC.User searchingUserMessages;
|
|
|
|
private ArrayList<MessageObject> animatingMessageObjects = new ArrayList<>();
|
|
|
|
private int scrollToPositionOnRecreate = -1;
|
|
private int scrollToOffsetOnRecreate = 0;
|
|
private boolean chatListViewIgnoreLayout;
|
|
|
|
private int topViewWasVisible;
|
|
|
|
private boolean mentionListViewIgnoreLayout;
|
|
private int mentionListViewScrollOffsetY;
|
|
private int mentionListViewLastViewTop;
|
|
private int mentionListViewLastViewPosition;
|
|
private boolean mentionListViewIsScrolling;
|
|
|
|
private MessageObject pinnedMessageObject;
|
|
private int loadingPinnedMessage;
|
|
|
|
private AnimatorSet pagedownButtonAnimation;
|
|
private ObjectAnimator mentiondownButtonAnimation;
|
|
private AnimatorSet replyButtonAnimation;
|
|
|
|
private boolean openSearchKeyboard;
|
|
|
|
private boolean waitingForReplyMessageLoad;
|
|
|
|
private boolean ignoreAttachOnPause;
|
|
|
|
private boolean allowStickersPanel;
|
|
private boolean allowContextBotPanel;
|
|
private boolean allowContextBotPanelSecond = true;
|
|
private AnimatorSet runningAnimation;
|
|
|
|
private MessageObject selectedObject;
|
|
private MessageObject.GroupedMessages selectedObjectGroup;
|
|
private ArrayList<MessageObject> forwardingMessages;
|
|
private MessageObject forwardingMessage;
|
|
private MessageObject.GroupedMessages forwardingMessageGroup;
|
|
private MessageObject replyingMessageObject;
|
|
private int editingMessageObjectReqId;
|
|
private boolean paused = true;
|
|
private boolean pausedOnLastMessage;
|
|
private boolean wasPaused;
|
|
private boolean readWhenResume;
|
|
private TLRPC.FileLocation replyImageLocation;
|
|
private TLRPC.FileLocation pinnedImageLocation;
|
|
private int linkSearchRequestId;
|
|
private TLRPC.WebPage foundWebPage;
|
|
private ArrayList<CharSequence> foundUrls;
|
|
private String pendingLinkSearchString;
|
|
private Runnable pendingWebPageTimeoutRunnable;
|
|
private Runnable waitingForCharaterEnterRunnable;
|
|
|
|
private boolean openAnimationEnded;
|
|
|
|
private int readWithDate;
|
|
private int readWithMid;
|
|
private boolean scrollToTopOnResume;
|
|
private boolean forceScrollToTop;
|
|
private boolean scrollToTopUnReadOnResume;
|
|
private long dialog_id;
|
|
private int lastLoadIndex;
|
|
private boolean isBroadcast;
|
|
private HashMap<Integer, MessageObject>[] selectedMessagesIds = new HashMap[]{new HashMap<>(), new HashMap<>()};
|
|
private HashMap<Integer, MessageObject>[] selectedMessagesCanCopyIds = new HashMap[]{new HashMap<>(), new HashMap<>()};
|
|
private HashMap<Integer, MessageObject>[] selectedMessagesCanStarIds = new HashMap[]{new HashMap<>(), new HashMap<>()};
|
|
private boolean hasUnfavedSelected;
|
|
private int cantDeleteMessagesCount;
|
|
private int canEditMessagesCount;
|
|
private ArrayList<Integer> waitingForLoad = new ArrayList<>();
|
|
|
|
private int newUnreadMessageCount;
|
|
private int newMentionsCount;
|
|
private boolean hasAllMentionsLocal;
|
|
|
|
private boolean startReplyOnTextChange;
|
|
|
|
private HashMap<Integer, MessageObject>[] messagesDict = new HashMap[]{new HashMap<>(), new HashMap<>()};
|
|
private HashMap<String, ArrayList<MessageObject>> messagesByDays = new HashMap<>();
|
|
protected ArrayList<MessageObject> messages = new ArrayList<>();
|
|
private HashMap<Long, MessageObject.GroupedMessages> groupedMessagesMap = new HashMap<>();
|
|
private int maxMessageId[] = new int[] {Integer.MAX_VALUE, Integer.MAX_VALUE};
|
|
private int minMessageId[] = new int[] {Integer.MIN_VALUE, Integer.MIN_VALUE};
|
|
private int maxDate[] = new int[] {Integer.MIN_VALUE, Integer.MIN_VALUE};
|
|
private int minDate[] = new int[2];
|
|
private boolean endReached[] = new boolean[2];
|
|
private boolean cacheEndReached[] = new boolean[2];
|
|
private boolean forwardEndReached[] = new boolean[] {true, true};
|
|
private boolean loading;
|
|
private boolean firstLoading = true;
|
|
private int loadsCount;
|
|
private int last_message_id = 0;
|
|
private long mergeDialogId;
|
|
|
|
private int startLoadFromMessageId;
|
|
private int startLoadFromMessageOffset = Integer.MAX_VALUE;
|
|
private boolean needSelectFromMessageId;
|
|
private int returnToMessageId;
|
|
private int returnToLoadIndex;
|
|
private int createUnreadMessageAfterId;
|
|
private boolean createUnreadMessageAfterIdLoading;
|
|
private boolean loadingFromOldPosition;
|
|
|
|
private boolean first = true;
|
|
private int unread_to_load;
|
|
private int first_unread_id;
|
|
private boolean loadingForward;
|
|
private MessageObject unreadMessageObject;
|
|
private MessageObject scrollToMessage;
|
|
private int highlightMessageId = Integer.MAX_VALUE;
|
|
private int scrollToMessagePosition = -10000;
|
|
|
|
private String currentPicturePath;
|
|
|
|
protected TLRPC.ChatFull info;
|
|
|
|
private HashMap<Integer, TLRPC.BotInfo> botInfo = new HashMap<>();
|
|
private String botUser;
|
|
private long inlineReturn;
|
|
private MessageObject botButtons;
|
|
private MessageObject botReplyButtons;
|
|
private int botsCount;
|
|
private boolean hasBotsCommands;
|
|
private long chatEnterTime;
|
|
private long chatLeaveTime;
|
|
|
|
private String startVideoEdit;
|
|
|
|
private FrameLayout roundVideoContainer;
|
|
private AspectRatioFrameLayout aspectRatioFrameLayout;
|
|
private TextureView videoTextureView;
|
|
private Path aspectPath;
|
|
private Paint aspectPaint;
|
|
|
|
private PhotoViewer.PhotoViewerProvider photoViewerProvider = new PhotoViewer.EmptyPhotoViewerProvider() {
|
|
|
|
@Override
|
|
public PhotoViewer.PlaceProviderObject getPlaceForPhoto(MessageObject messageObject, TLRPC.FileLocation fileLocation, int index) {
|
|
int count = chatListView.getChildCount();
|
|
|
|
for (int a = 0; a < count; a++) {
|
|
ImageReceiver imageReceiver = null;
|
|
View view = chatListView.getChildAt(a);
|
|
if (view instanceof ChatMessageCell) {
|
|
if (messageObject != null) {
|
|
ChatMessageCell cell = (ChatMessageCell) view;
|
|
MessageObject message = cell.getMessageObject();
|
|
if (message != null && message.getId() == messageObject.getId()) {
|
|
imageReceiver = cell.getPhotoImage();
|
|
}
|
|
}
|
|
} else if (view instanceof ChatActionCell) {
|
|
ChatActionCell cell = (ChatActionCell) view;
|
|
MessageObject message = cell.getMessageObject();
|
|
if (message != null) {
|
|
if (messageObject != null) {
|
|
if (message.getId() == messageObject.getId()) {
|
|
imageReceiver = cell.getPhotoImage();
|
|
}
|
|
} else if (fileLocation != null && message.photoThumbs != null) {
|
|
for (int b = 0; b < message.photoThumbs.size(); b++) {
|
|
TLRPC.PhotoSize photoSize = message.photoThumbs.get(b);
|
|
if (photoSize.location.volume_id == fileLocation.volume_id && photoSize.location.local_id == fileLocation.local_id) {
|
|
imageReceiver = cell.getPhotoImage();
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
if (imageReceiver != null) {
|
|
int coords[] = new int[2];
|
|
view.getLocationInWindow(coords);
|
|
PhotoViewer.PlaceProviderObject object = new PhotoViewer.PlaceProviderObject();
|
|
object.viewX = coords[0];
|
|
object.viewY = coords[1] - (Build.VERSION.SDK_INT >= 21 ? 0 : AndroidUtilities.statusBarHeight);
|
|
object.parentView = chatListView;
|
|
object.imageReceiver = imageReceiver;
|
|
object.thumb = imageReceiver.getBitmap();
|
|
object.radius = imageReceiver.getRoundRadius();
|
|
if (view instanceof ChatActionCell && currentChat != null) {
|
|
object.dialogId = -currentChat.id;
|
|
}
|
|
if (pinnedMessageView != null && pinnedMessageView.getTag() == null || reportSpamView != null && reportSpamView.getTag() == null) {
|
|
object.clipTopAddition = AndroidUtilities.dp(48);
|
|
}
|
|
return object;
|
|
}
|
|
}
|
|
return null;
|
|
}
|
|
};
|
|
|
|
private Runnable readRunnable = new Runnable() {
|
|
@Override
|
|
public void run() {
|
|
if (readWhenResume && !messages.isEmpty()) {
|
|
for (int a = 0; a < messages.size(); a++) {
|
|
MessageObject messageObject = messages.get(a);
|
|
if (!messageObject.isUnread() && !messageObject.isOut()) {
|
|
break;
|
|
}
|
|
if (!messageObject.isOut()) {
|
|
messageObject.setIsRead();
|
|
}
|
|
}
|
|
readWhenResume = false;
|
|
MessagesController.getInstance().markDialogAsRead(dialog_id, messages.get(0).getId(), readWithMid, readWithDate, true, false);
|
|
}
|
|
}
|
|
};
|
|
|
|
private ArrayList<Object> botContextResults;
|
|
private PhotoViewer.PhotoViewerProvider botContextProvider = new PhotoViewer.EmptyPhotoViewerProvider() {
|
|
|
|
@Override
|
|
public PhotoViewer.PlaceProviderObject getPlaceForPhoto(MessageObject messageObject, TLRPC.FileLocation fileLocation, int index) {
|
|
if (index < 0 || index >= botContextResults.size()) {
|
|
return null;
|
|
}
|
|
int count = mentionListView.getChildCount();
|
|
Object result = botContextResults.get(index);
|
|
|
|
for (int a = 0; a < count; a++) {
|
|
ImageReceiver imageReceiver = null;
|
|
View view = mentionListView.getChildAt(a);
|
|
if (view instanceof ContextLinkCell) {
|
|
ContextLinkCell cell = (ContextLinkCell) view;
|
|
if (cell.getResult() == result) {
|
|
imageReceiver = cell.getPhotoImage();
|
|
}
|
|
}
|
|
|
|
if (imageReceiver != null) {
|
|
int coords[] = new int[2];
|
|
view.getLocationInWindow(coords);
|
|
PhotoViewer.PlaceProviderObject object = new PhotoViewer.PlaceProviderObject();
|
|
object.viewX = coords[0];
|
|
object.viewY = coords[1] - (Build.VERSION.SDK_INT >= 21 ? 0 : AndroidUtilities.statusBarHeight);
|
|
object.parentView = mentionListView;
|
|
object.imageReceiver = imageReceiver;
|
|
object.thumb = imageReceiver.getBitmap();
|
|
object.radius = imageReceiver.getRoundRadius();
|
|
return object;
|
|
}
|
|
}
|
|
return null;
|
|
}
|
|
|
|
@Override
|
|
public void sendButtonPressed(int index, VideoEditedInfo videoEditedInfo) {
|
|
if (index < 0 || index >= botContextResults.size()) {
|
|
return;
|
|
}
|
|
sendBotInlineResult((TLRPC.BotInlineResult) botContextResults.get(index));
|
|
}
|
|
};
|
|
|
|
private final static int copy = 10;
|
|
private final static int forward = 11;
|
|
private final static int delete = 12;
|
|
private final static int chat_enc_timer = 13;
|
|
private final static int chat_menu_attach = 14;
|
|
private final static int clear_history = 15;
|
|
private final static int delete_chat = 16;
|
|
private final static int share_contact = 17;
|
|
private final static int mute = 18;
|
|
private final static int reply = 19;
|
|
private final static int report = 21;
|
|
private final static int star = 22;
|
|
private final static int edit = 23;
|
|
private final static int add_shortcut = 24;
|
|
|
|
private final static int bot_help = 30;
|
|
private final static int bot_settings = 31;
|
|
private final static int call = 32;
|
|
|
|
private final static int attach_photo = 0;
|
|
private final static int attach_gallery = 1;
|
|
private final static int attach_video = 2;
|
|
private final static int attach_audio = 3;
|
|
private final static int attach_document = 4;
|
|
private final static int attach_contact = 5;
|
|
private final static int attach_location = 6;
|
|
|
|
private final static int search = 40;
|
|
|
|
private final static int id_chat_compose_panel = 1000;
|
|
|
|
RecyclerListView.OnItemLongClickListener onItemLongClickListener = new RecyclerListView.OnItemLongClickListener() {
|
|
@Override
|
|
public boolean onItemClick(View view, int position) {
|
|
if (!actionBar.isActionModeShowed()) {
|
|
createMenu(view, false, true);
|
|
return true;
|
|
}
|
|
return false;
|
|
}
|
|
};
|
|
|
|
RecyclerListView.OnItemClickListenerExtended onItemClickListener = new RecyclerListView.OnItemClickListenerExtended() {
|
|
@Override
|
|
public void onItemClick(View view, int position, float x, float y) {
|
|
if (actionBar.isActionModeShowed()) {
|
|
boolean outside = false;
|
|
if (view instanceof ChatMessageCell) {
|
|
outside = !((ChatMessageCell) view).isInsideBackground(x, y);
|
|
}
|
|
processRowSelect(view, outside);
|
|
return;
|
|
}
|
|
createMenu(view, true, false);
|
|
}
|
|
};
|
|
|
|
public ChatActivity(Bundle args) {
|
|
super(args);
|
|
}
|
|
|
|
@Override
|
|
public boolean onFragmentCreate() {
|
|
final int chatId = arguments.getInt("chat_id", 0);
|
|
final int userId = arguments.getInt("user_id", 0);
|
|
final int encId = arguments.getInt("enc_id", 0);
|
|
inlineReturn = arguments.getLong("inline_return", 0);
|
|
String inlineQuery = arguments.getString("inline_query");
|
|
startLoadFromMessageId = arguments.getInt("message_id", 0);
|
|
int migrated_to = arguments.getInt("migrated_to", 0);
|
|
scrollToTopOnResume = arguments.getBoolean("scrollToTopOnResume", false);
|
|
|
|
if (chatId != 0) {
|
|
currentChat = MessagesController.getInstance().getChat(chatId);
|
|
if (currentChat == null) {
|
|
final Semaphore semaphore = new Semaphore(0);
|
|
MessagesStorage.getInstance().getStorageQueue().postRunnable(new Runnable() {
|
|
@Override
|
|
public void run() {
|
|
currentChat = MessagesStorage.getInstance().getChat(chatId);
|
|
semaphore.release();
|
|
}
|
|
});
|
|
try {
|
|
semaphore.acquire();
|
|
} catch (Exception e) {
|
|
FileLog.e(e);
|
|
}
|
|
if (currentChat != null) {
|
|
MessagesController.getInstance().putChat(currentChat, true);
|
|
} else {
|
|
return false;
|
|
}
|
|
}
|
|
if (chatId > 0) {
|
|
dialog_id = -chatId;
|
|
} else {
|
|
isBroadcast = true;
|
|
dialog_id = AndroidUtilities.makeBroadcastId(chatId);
|
|
}
|
|
if (ChatObject.isChannel(currentChat)) {
|
|
MessagesController.getInstance().startShortPoll(chatId, false);
|
|
}
|
|
} else if (userId != 0) {
|
|
currentUser = MessagesController.getInstance().getUser(userId);
|
|
if (currentUser == null) {
|
|
final Semaphore semaphore = new Semaphore(0);
|
|
MessagesStorage.getInstance().getStorageQueue().postRunnable(new Runnable() {
|
|
@Override
|
|
public void run() {
|
|
currentUser = MessagesStorage.getInstance().getUser(userId);
|
|
semaphore.release();
|
|
}
|
|
});
|
|
try {
|
|
semaphore.acquire();
|
|
} catch (Exception e) {
|
|
FileLog.e(e);
|
|
}
|
|
if (currentUser != null) {
|
|
MessagesController.getInstance().putUser(currentUser, true);
|
|
} else {
|
|
return false;
|
|
}
|
|
}
|
|
dialog_id = userId;
|
|
botUser = arguments.getString("botUser");
|
|
if (inlineQuery != null) {
|
|
MessagesController.getInstance().sendBotStart(currentUser, inlineQuery);
|
|
}
|
|
} else if (encId != 0) {
|
|
currentEncryptedChat = MessagesController.getInstance().getEncryptedChat(encId);
|
|
if (currentEncryptedChat == null) {
|
|
final Semaphore semaphore = new Semaphore(0);
|
|
MessagesStorage.getInstance().getStorageQueue().postRunnable(new Runnable() {
|
|
@Override
|
|
public void run() {
|
|
currentEncryptedChat = MessagesStorage.getInstance().getEncryptedChat(encId);
|
|
semaphore.release();
|
|
}
|
|
});
|
|
try {
|
|
semaphore.acquire();
|
|
} catch (Exception e) {
|
|
FileLog.e(e);
|
|
}
|
|
if (currentEncryptedChat != null) {
|
|
MessagesController.getInstance().putEncryptedChat(currentEncryptedChat, true);
|
|
} else {
|
|
return false;
|
|
}
|
|
}
|
|
currentUser = MessagesController.getInstance().getUser(currentEncryptedChat.user_id);
|
|
if (currentUser == null) {
|
|
final Semaphore semaphore = new Semaphore(0);
|
|
MessagesStorage.getInstance().getStorageQueue().postRunnable(new Runnable() {
|
|
@Override
|
|
public void run() {
|
|
currentUser = MessagesStorage.getInstance().getUser(currentEncryptedChat.user_id);
|
|
semaphore.release();
|
|
}
|
|
});
|
|
try {
|
|
semaphore.acquire();
|
|
} catch (Exception e) {
|
|
FileLog.e(e);
|
|
}
|
|
if (currentUser != null) {
|
|
MessagesController.getInstance().putUser(currentUser, true);
|
|
} else {
|
|
return false;
|
|
}
|
|
}
|
|
dialog_id = ((long) encId) << 32;
|
|
maxMessageId[0] = maxMessageId[1] = Integer.MIN_VALUE;
|
|
minMessageId[0] = minMessageId[1] = Integer.MAX_VALUE;
|
|
} else {
|
|
return false;
|
|
}
|
|
|
|
if (currentUser != null) {
|
|
MediaController.getInstance().startMediaObserver();
|
|
}
|
|
|
|
NotificationCenter.getInstance().addObserver(this, NotificationCenter.messagesDidLoaded);
|
|
NotificationCenter.getInstance().addObserver(this, NotificationCenter.emojiDidLoaded);
|
|
NotificationCenter.getInstance().addObserver(this, NotificationCenter.updateInterfaces);
|
|
NotificationCenter.getInstance().addObserver(this, NotificationCenter.didReceivedNewMessages);
|
|
NotificationCenter.getInstance().addObserver(this, NotificationCenter.closeChats);
|
|
NotificationCenter.getInstance().addObserver(this, NotificationCenter.messagesRead);
|
|
NotificationCenter.getInstance().addObserver(this, NotificationCenter.messagesDeleted);
|
|
NotificationCenter.getInstance().addObserver(this, NotificationCenter.historyCleared);
|
|
NotificationCenter.getInstance().addObserver(this, NotificationCenter.messageReceivedByServer);
|
|
NotificationCenter.getInstance().addObserver(this, NotificationCenter.messageReceivedByAck);
|
|
NotificationCenter.getInstance().addObserver(this, NotificationCenter.messageSendError);
|
|
NotificationCenter.getInstance().addObserver(this, NotificationCenter.chatInfoDidLoaded);
|
|
NotificationCenter.getInstance().addObserver(this, NotificationCenter.contactsDidLoaded);
|
|
NotificationCenter.getInstance().addObserver(this, NotificationCenter.encryptedChatUpdated);
|
|
NotificationCenter.getInstance().addObserver(this, NotificationCenter.messagesReadEncrypted);
|
|
NotificationCenter.getInstance().addObserver(this, NotificationCenter.removeAllMessagesFromDialog);
|
|
NotificationCenter.getInstance().addObserver(this, NotificationCenter.messagePlayingProgressDidChanged);
|
|
NotificationCenter.getInstance().addObserver(this, NotificationCenter.messagePlayingDidReset);
|
|
NotificationCenter.getInstance().addObserver(this, NotificationCenter.messagePlayingPlayStateChanged);
|
|
NotificationCenter.getInstance().addObserver(this, NotificationCenter.screenshotTook);
|
|
NotificationCenter.getInstance().addObserver(this, NotificationCenter.blockedUsersDidLoaded);
|
|
NotificationCenter.getInstance().addObserver(this, NotificationCenter.FileNewChunkAvailable);
|
|
NotificationCenter.getInstance().addObserver(this, NotificationCenter.didCreatedNewDeleteTask);
|
|
NotificationCenter.getInstance().addObserver(this, NotificationCenter.messagePlayingDidStarted);
|
|
NotificationCenter.getInstance().addObserver(this, NotificationCenter.updateMessageMedia);
|
|
NotificationCenter.getInstance().addObserver(this, NotificationCenter.replaceMessagesObjects);
|
|
NotificationCenter.getInstance().addObserver(this, NotificationCenter.notificationsSettingsUpdated);
|
|
NotificationCenter.getInstance().addObserver(this, NotificationCenter.didLoadedReplyMessages);
|
|
NotificationCenter.getInstance().addObserver(this, NotificationCenter.didReceivedWebpages);
|
|
NotificationCenter.getInstance().addObserver(this, NotificationCenter.didReceivedWebpagesInUpdates);
|
|
NotificationCenter.getInstance().addObserver(this, NotificationCenter.messagesReadContent);
|
|
NotificationCenter.getInstance().addObserver(this, NotificationCenter.botInfoDidLoaded);
|
|
NotificationCenter.getInstance().addObserver(this, NotificationCenter.botKeyboardDidLoaded);
|
|
NotificationCenter.getInstance().addObserver(this, NotificationCenter.chatSearchResultsAvailable);
|
|
NotificationCenter.getInstance().addObserver(this, NotificationCenter.chatSearchResultsLoading);
|
|
NotificationCenter.getInstance().addObserver(this, NotificationCenter.didUpdatedMessagesViews);
|
|
NotificationCenter.getInstance().addObserver(this, NotificationCenter.chatInfoCantLoad);
|
|
NotificationCenter.getInstance().addObserver(this, NotificationCenter.didLoadedPinnedMessage);
|
|
NotificationCenter.getInstance().addObserver(this, NotificationCenter.peerSettingsDidLoaded);
|
|
NotificationCenter.getInstance().addObserver(this, NotificationCenter.newDraftReceived);
|
|
NotificationCenter.getInstance().addObserver(this, NotificationCenter.userInfoDidLoaded);
|
|
NotificationCenter.getInstance().addObserver(this, NotificationCenter.didSetNewWallpapper);
|
|
NotificationCenter.getInstance().addObserver(this, NotificationCenter.channelRightsUpdated);
|
|
NotificationCenter.getInstance().addObserver(this, NotificationCenter.updateMentionsCount);
|
|
|
|
super.onFragmentCreate();
|
|
|
|
if (currentEncryptedChat == null && !isBroadcast) {
|
|
BotQuery.loadBotKeyboard(dialog_id);
|
|
}
|
|
|
|
loading = true;
|
|
MessagesController.getInstance().loadPeerSettings(currentUser, currentChat);
|
|
MessagesController.getInstance().setLastCreatedDialogId(dialog_id, true);
|
|
|
|
if (startLoadFromMessageId == 0) {
|
|
SharedPreferences sharedPreferences = ApplicationLoader.applicationContext.getSharedPreferences("Notifications", Activity.MODE_PRIVATE);
|
|
int messageId = sharedPreferences.getInt("diditem" + dialog_id, 0);
|
|
if (messageId != 0) {
|
|
loadingFromOldPosition = true;
|
|
startLoadFromMessageOffset = sharedPreferences.getInt("diditemo" + dialog_id, 0);
|
|
startLoadFromMessageId = messageId;
|
|
}
|
|
} else {
|
|
needSelectFromMessageId = true;
|
|
}
|
|
|
|
if (startLoadFromMessageId != 0) {
|
|
waitingForLoad.add(lastLoadIndex);
|
|
if (migrated_to != 0) {
|
|
mergeDialogId = migrated_to;
|
|
MessagesController.getInstance().loadMessages(mergeDialogId, loadingFromOldPosition ? 50 : (AndroidUtilities.isTablet() ? 30 : 20), startLoadFromMessageId, 0, true, 0, classGuid, 3, 0, ChatObject.isChannel(currentChat), lastLoadIndex++);
|
|
} else {
|
|
MessagesController.getInstance().loadMessages(dialog_id, loadingFromOldPosition ? 50 : (AndroidUtilities.isTablet() ? 30 : 20), startLoadFromMessageId, 0, true, 0, classGuid, 3, 0, ChatObject.isChannel(currentChat), lastLoadIndex++);
|
|
}
|
|
} else {
|
|
waitingForLoad.add(lastLoadIndex);
|
|
MessagesController.getInstance().loadMessages(dialog_id, AndroidUtilities.isTablet() ? 30 : 20, 0, 0, true, 0, classGuid, 2, 0, ChatObject.isChannel(currentChat), lastLoadIndex++);
|
|
}
|
|
|
|
if (currentChat != null) {
|
|
Semaphore semaphore = null;
|
|
if (isBroadcast) {
|
|
semaphore = new Semaphore(0);
|
|
}
|
|
MessagesController.getInstance().loadChatInfo(currentChat.id, semaphore, ChatObject.isChannel(currentChat));
|
|
if (isBroadcast && semaphore != null) {
|
|
try {
|
|
semaphore.acquire();
|
|
} catch (Exception e) {
|
|
FileLog.e(e);
|
|
}
|
|
}
|
|
}
|
|
|
|
if (userId != 0 && currentUser.bot) {
|
|
BotQuery.loadBotInfo(userId, true, classGuid);
|
|
} else if (info instanceof TLRPC.TL_chatFull) {
|
|
for (int a = 0; a < info.participants.participants.size(); a++) {
|
|
TLRPC.ChatParticipant participant = info.participants.participants.get(a);
|
|
TLRPC.User user = MessagesController.getInstance().getUser(participant.user_id);
|
|
if (user != null && user.bot) {
|
|
BotQuery.loadBotInfo(user.id, true, classGuid);
|
|
}
|
|
}
|
|
}
|
|
|
|
if (currentUser != null) {
|
|
userBlocked = MessagesController.getInstance().blockedUsers.contains(currentUser.id);
|
|
}
|
|
|
|
if (AndroidUtilities.isTablet()) {
|
|
NotificationCenter.getInstance().postNotificationName(NotificationCenter.openedChatChanged, dialog_id, false);
|
|
}
|
|
|
|
if (currentEncryptedChat != null && AndroidUtilities.getMyLayerVersion(currentEncryptedChat.layer) != SecretChatHelper.CURRENT_SECRET_CHAT_LAYER) {
|
|
SecretChatHelper.getInstance().sendNotifyLayerMessage(currentEncryptedChat, null);
|
|
}
|
|
|
|
return true;
|
|
}
|
|
|
|
@Override
|
|
public void onFragmentDestroy() {
|
|
super.onFragmentDestroy();
|
|
if (chatActivityEnterView != null) {
|
|
chatActivityEnterView.onDestroy();
|
|
}
|
|
if (mentionsAdapter != null) {
|
|
mentionsAdapter.onDestroy();
|
|
}
|
|
if (chatAttachAlert != null) {
|
|
chatAttachAlert.dismissInternal();
|
|
}
|
|
MessagesController.getInstance().setLastCreatedDialogId(dialog_id, false);
|
|
NotificationCenter.getInstance().removeObserver(this, NotificationCenter.messagesDidLoaded);
|
|
NotificationCenter.getInstance().removeObserver(this, NotificationCenter.emojiDidLoaded);
|
|
NotificationCenter.getInstance().removeObserver(this, NotificationCenter.updateInterfaces);
|
|
NotificationCenter.getInstance().removeObserver(this, NotificationCenter.didReceivedNewMessages);
|
|
NotificationCenter.getInstance().removeObserver(this, NotificationCenter.closeChats);
|
|
NotificationCenter.getInstance().removeObserver(this, NotificationCenter.messagesRead);
|
|
NotificationCenter.getInstance().removeObserver(this, NotificationCenter.messagesDeleted);
|
|
NotificationCenter.getInstance().removeObserver(this, NotificationCenter.historyCleared);
|
|
NotificationCenter.getInstance().removeObserver(this, NotificationCenter.messageReceivedByServer);
|
|
NotificationCenter.getInstance().removeObserver(this, NotificationCenter.messageReceivedByAck);
|
|
NotificationCenter.getInstance().removeObserver(this, NotificationCenter.messageSendError);
|
|
NotificationCenter.getInstance().removeObserver(this, NotificationCenter.chatInfoDidLoaded);
|
|
NotificationCenter.getInstance().removeObserver(this, NotificationCenter.encryptedChatUpdated);
|
|
NotificationCenter.getInstance().removeObserver(this, NotificationCenter.messagesReadEncrypted);
|
|
NotificationCenter.getInstance().removeObserver(this, NotificationCenter.removeAllMessagesFromDialog);
|
|
NotificationCenter.getInstance().removeObserver(this, NotificationCenter.contactsDidLoaded);
|
|
NotificationCenter.getInstance().removeObserver(this, NotificationCenter.messagePlayingProgressDidChanged);
|
|
NotificationCenter.getInstance().removeObserver(this, NotificationCenter.messagePlayingDidReset);
|
|
NotificationCenter.getInstance().removeObserver(this, NotificationCenter.screenshotTook);
|
|
NotificationCenter.getInstance().removeObserver(this, NotificationCenter.blockedUsersDidLoaded);
|
|
NotificationCenter.getInstance().removeObserver(this, NotificationCenter.FileNewChunkAvailable);
|
|
NotificationCenter.getInstance().removeObserver(this, NotificationCenter.didCreatedNewDeleteTask);
|
|
NotificationCenter.getInstance().removeObserver(this, NotificationCenter.messagePlayingDidStarted);
|
|
NotificationCenter.getInstance().removeObserver(this, NotificationCenter.updateMessageMedia);
|
|
NotificationCenter.getInstance().removeObserver(this, NotificationCenter.replaceMessagesObjects);
|
|
NotificationCenter.getInstance().removeObserver(this, NotificationCenter.notificationsSettingsUpdated);
|
|
NotificationCenter.getInstance().removeObserver(this, NotificationCenter.didLoadedReplyMessages);
|
|
NotificationCenter.getInstance().removeObserver(this, NotificationCenter.didReceivedWebpages);
|
|
NotificationCenter.getInstance().removeObserver(this, NotificationCenter.didReceivedWebpagesInUpdates);
|
|
NotificationCenter.getInstance().removeObserver(this, NotificationCenter.messagesReadContent);
|
|
NotificationCenter.getInstance().removeObserver(this, NotificationCenter.botInfoDidLoaded);
|
|
NotificationCenter.getInstance().removeObserver(this, NotificationCenter.botKeyboardDidLoaded);
|
|
NotificationCenter.getInstance().removeObserver(this, NotificationCenter.chatSearchResultsAvailable);
|
|
NotificationCenter.getInstance().removeObserver(this, NotificationCenter.chatSearchResultsLoading);
|
|
NotificationCenter.getInstance().removeObserver(this, NotificationCenter.messagePlayingPlayStateChanged);
|
|
NotificationCenter.getInstance().removeObserver(this, NotificationCenter.didUpdatedMessagesViews);
|
|
NotificationCenter.getInstance().removeObserver(this, NotificationCenter.chatInfoCantLoad);
|
|
NotificationCenter.getInstance().removeObserver(this, NotificationCenter.didLoadedPinnedMessage);
|
|
NotificationCenter.getInstance().removeObserver(this, NotificationCenter.peerSettingsDidLoaded);
|
|
NotificationCenter.getInstance().removeObserver(this, NotificationCenter.newDraftReceived);
|
|
NotificationCenter.getInstance().removeObserver(this, NotificationCenter.userInfoDidLoaded);
|
|
NotificationCenter.getInstance().removeObserver(this, NotificationCenter.didSetNewWallpapper);
|
|
NotificationCenter.getInstance().removeObserver(this, NotificationCenter.channelRightsUpdated);
|
|
NotificationCenter.getInstance().removeObserver(this, NotificationCenter.updateMentionsCount);
|
|
|
|
if (AndroidUtilities.isTablet()) {
|
|
NotificationCenter.getInstance().postNotificationName(NotificationCenter.openedChatChanged, dialog_id, true);
|
|
}
|
|
if (currentUser != null) {
|
|
MediaController.getInstance().stopMediaObserver();
|
|
}
|
|
if (currentEncryptedChat != null) {
|
|
try {
|
|
if (Build.VERSION.SDK_INT >= 23 && (UserConfig.passcodeHash.length() == 0 || UserConfig.allowScreenCapture)) {
|
|
getParentActivity().getWindow().clearFlags(WindowManager.LayoutParams.FLAG_SECURE);
|
|
}
|
|
} catch (Throwable e) {
|
|
FileLog.e(e);
|
|
}
|
|
}
|
|
if (currentUser != null) {
|
|
MessagesController.getInstance().cancelLoadFullUser(currentUser.id);
|
|
}
|
|
AndroidUtilities.removeAdjustResize(getParentActivity(), classGuid);
|
|
if (stickersAdapter != null) {
|
|
stickersAdapter.onDestroy();
|
|
}
|
|
if (chatAttachAlert != null) {
|
|
chatAttachAlert.onDestroy();
|
|
}
|
|
AndroidUtilities.unlockOrientation(getParentActivity());
|
|
if (ChatObject.isChannel(currentChat)) {
|
|
MessagesController.getInstance().startShortPoll(currentChat.id, true);
|
|
}
|
|
}
|
|
|
|
@Override
|
|
public View createView(Context context) {
|
|
if (chatMessageCellsCache.isEmpty()) {
|
|
for (int a = 0; a < 8; a++) {
|
|
chatMessageCellsCache.add(new ChatMessageCell(context));
|
|
}
|
|
}
|
|
for (int a = 1; a >= 0; a--) {
|
|
selectedMessagesIds[a].clear();
|
|
selectedMessagesCanCopyIds[a].clear();
|
|
selectedMessagesCanStarIds[a].clear();
|
|
}
|
|
cantDeleteMessagesCount = 0;
|
|
canEditMessagesCount = 0;
|
|
|
|
hasOwnBackground = true;
|
|
if (chatAttachAlert != null) {
|
|
try {
|
|
if (chatAttachAlert.isShowing()) {
|
|
chatAttachAlert.dismiss();
|
|
}
|
|
} catch (Exception ignore) {
|
|
|
|
}
|
|
chatAttachAlert.onDestroy();
|
|
chatAttachAlert = null;
|
|
}
|
|
|
|
Theme.createChatResources(context, false);
|
|
|
|
actionBar.setAddToContainer(false);
|
|
actionBar.setBackButtonDrawable(new BackDrawable(false));
|
|
actionBar.setActionBarMenuOnItemClick(new ActionBar.ActionBarMenuOnItemClick() {
|
|
@Override
|
|
public void onItemClick(final int id) {
|
|
if (id == -1) {
|
|
if (actionBar.isActionModeShowed()) {
|
|
for (int a = 1; a >= 0; a--) {
|
|
selectedMessagesIds[a].clear();
|
|
selectedMessagesCanCopyIds[a].clear();
|
|
selectedMessagesCanStarIds[a].clear();
|
|
}
|
|
cantDeleteMessagesCount = 0;
|
|
canEditMessagesCount = 0;
|
|
if (chatActivityEnterView.isEditingMessage()) {
|
|
chatActivityEnterView.setEditingMessageObject(null, false);
|
|
} else {
|
|
actionBar.hideActionMode();
|
|
updatePinnedMessageView(true);
|
|
}
|
|
updateVisibleRows();
|
|
} else {
|
|
finishFragment();
|
|
}
|
|
} else if (id == copy) {
|
|
String str = "";
|
|
int previousUid = 0;
|
|
for (int a = 1; a >= 0; a--) {
|
|
ArrayList<Integer> ids = new ArrayList<>(selectedMessagesCanCopyIds[a].keySet());
|
|
if (currentEncryptedChat == null) {
|
|
Collections.sort(ids);
|
|
} else {
|
|
Collections.sort(ids, Collections.reverseOrder());
|
|
}
|
|
for (int b = 0; b < ids.size(); b++) {
|
|
Integer messageId = ids.get(b);
|
|
MessageObject messageObject = selectedMessagesCanCopyIds[a].get(messageId);
|
|
if (str.length() != 0) {
|
|
str += "\n\n";
|
|
}
|
|
str += getMessageContent(messageObject, previousUid, true);
|
|
previousUid = messageObject.messageOwner.from_id;
|
|
}
|
|
}
|
|
if (str.length() != 0) {
|
|
AndroidUtilities.addToClipboard(str);
|
|
}
|
|
for (int a = 1; a >= 0; a--) {
|
|
selectedMessagesIds[a].clear();
|
|
selectedMessagesCanCopyIds[a].clear();
|
|
selectedMessagesCanStarIds[a].clear();
|
|
}
|
|
cantDeleteMessagesCount = 0;
|
|
canEditMessagesCount = 0;
|
|
actionBar.hideActionMode();
|
|
updatePinnedMessageView(true);
|
|
updateVisibleRows();
|
|
} else if (id == delete) {
|
|
if (getParentActivity() == null) {
|
|
return;
|
|
}
|
|
createDeleteMessagesAlert(null, null);
|
|
} else if (id == forward) {
|
|
Bundle args = new Bundle();
|
|
args.putBoolean("onlySelect", true);
|
|
args.putInt("dialogsType", 3);
|
|
DialogsActivity fragment = new DialogsActivity(args);
|
|
fragment.setDelegate(ChatActivity.this);
|
|
presentFragment(fragment);
|
|
} else if (id == chat_enc_timer) {
|
|
if (getParentActivity() == null) {
|
|
return;
|
|
}
|
|
showDialog(AlertsCreator.createTTLAlert(getParentActivity(), currentEncryptedChat).create());
|
|
} else if (id == clear_history || id == delete_chat) {
|
|
if (getParentActivity() == null) {
|
|
return;
|
|
}
|
|
final boolean isChat = (int) dialog_id < 0 && (int) (dialog_id >> 32) != 1;
|
|
AlertDialog.Builder builder = new AlertDialog.Builder(getParentActivity());
|
|
builder.setTitle(LocaleController.getString("AppName", R.string.AppName));
|
|
if (id == clear_history) {
|
|
builder.setMessage(LocaleController.getString("AreYouSureClearHistory", R.string.AreYouSureClearHistory));
|
|
} else {
|
|
if (isChat) {
|
|
builder.setMessage(LocaleController.getString("AreYouSureDeleteAndExit", R.string.AreYouSureDeleteAndExit));
|
|
} else {
|
|
builder.setMessage(LocaleController.getString("AreYouSureDeleteThisChat", R.string.AreYouSureDeleteThisChat));
|
|
}
|
|
}
|
|
builder.setPositiveButton(LocaleController.getString("OK", R.string.OK), new DialogInterface.OnClickListener() {
|
|
@Override
|
|
public void onClick(DialogInterface dialogInterface, int i) {
|
|
if (id != clear_history) {
|
|
if (isChat) {
|
|
if (ChatObject.isNotInChat(currentChat)) {
|
|
MessagesController.getInstance().deleteDialog(dialog_id, 0);
|
|
} else {
|
|
MessagesController.getInstance().deleteUserFromChat((int) -dialog_id, MessagesController.getInstance().getUser(UserConfig.getClientUserId()), null);
|
|
}
|
|
} else {
|
|
MessagesController.getInstance().deleteDialog(dialog_id, 0);
|
|
}
|
|
finishFragment();
|
|
} else {
|
|
if (ChatObject.isChannel(currentChat) && info != null && info.pinned_msg_id != 0) {
|
|
SharedPreferences preferences = ApplicationLoader.applicationContext.getSharedPreferences("Notifications", Activity.MODE_PRIVATE);
|
|
preferences.edit().putInt("pin_" + dialog_id, info.pinned_msg_id).commit();
|
|
updatePinnedMessageView(true);
|
|
}
|
|
MessagesController.getInstance().deleteDialog(dialog_id, 1);
|
|
}
|
|
}
|
|
});
|
|
builder.setNegativeButton(LocaleController.getString("Cancel", R.string.Cancel), null);
|
|
showDialog(builder.create());
|
|
} else if (id == share_contact) {
|
|
if (currentUser == null || getParentActivity() == null) {
|
|
return;
|
|
}
|
|
if (currentUser.phone != null && currentUser.phone.length() != 0) {
|
|
Bundle args = new Bundle();
|
|
args.putInt("user_id", currentUser.id);
|
|
args.putBoolean("addContact", true);
|
|
presentFragment(new ContactAddActivity(args));
|
|
} else {
|
|
shareMyContact(replyingMessageObject);
|
|
}
|
|
} else if (id == mute) {
|
|
toggleMute(false);
|
|
} else if (id == add_shortcut) {
|
|
try {
|
|
AndroidUtilities.installShortcut(currentUser.id);
|
|
} catch (Exception e) {
|
|
FileLog.e(e);
|
|
}
|
|
} else if (id == report) {
|
|
showDialog(AlertsCreator.createReportAlert(getParentActivity(), dialog_id, ChatActivity.this));
|
|
} else if (id == reply) {
|
|
MessageObject messageObject = null;
|
|
for (int a = 1; a >= 0; a--) {
|
|
if (messageObject == null && selectedMessagesIds[a].size() == 1) {
|
|
ArrayList<Integer> ids = new ArrayList<>(selectedMessagesIds[a].keySet());
|
|
messageObject = messagesDict[a].get(ids.get(0));
|
|
}
|
|
selectedMessagesIds[a].clear();
|
|
selectedMessagesCanCopyIds[a].clear();
|
|
selectedMessagesCanStarIds[a].clear();
|
|
}
|
|
if (messageObject != null && (messageObject.messageOwner.id > 0 || messageObject.messageOwner.id < 0 && currentEncryptedChat != null)) {
|
|
showReplyPanel(true, messageObject, null, null, false);
|
|
}
|
|
cantDeleteMessagesCount = 0;
|
|
canEditMessagesCount = 0;
|
|
actionBar.hideActionMode();
|
|
updatePinnedMessageView(true);
|
|
updateVisibleRows();
|
|
} else if (id == star) {
|
|
for (int a = 0; a < 2; a++) {
|
|
for (HashMap.Entry<Integer, MessageObject> entry : selectedMessagesCanStarIds[a].entrySet()) {
|
|
MessageObject msg = entry.getValue();
|
|
StickersQuery.addRecentSticker(StickersQuery.TYPE_FAVE, msg.getDocument(), (int) (System.currentTimeMillis() / 1000), !hasUnfavedSelected);
|
|
}
|
|
}
|
|
for (int a = 1; a >= 0; a--) {
|
|
selectedMessagesIds[a].clear();
|
|
selectedMessagesCanCopyIds[a].clear();
|
|
selectedMessagesCanStarIds[a].clear();
|
|
}
|
|
cantDeleteMessagesCount = 0;
|
|
canEditMessagesCount = 0;
|
|
actionBar.hideActionMode();
|
|
updatePinnedMessageView(true);
|
|
updateVisibleRows();
|
|
} else if (id == edit) {
|
|
MessageObject messageObject = null;
|
|
for (int a = 1; a >= 0; a--) {
|
|
if (messageObject == null && selectedMessagesIds[a].size() == 1) {
|
|
ArrayList<Integer> ids = new ArrayList<>(selectedMessagesIds[a].keySet());
|
|
messageObject = messagesDict[a].get(ids.get(0));
|
|
}
|
|
selectedMessagesIds[a].clear();
|
|
selectedMessagesCanCopyIds[a].clear();
|
|
selectedMessagesCanStarIds[a].clear();
|
|
}
|
|
startReplyOnTextChange = false;
|
|
startEditingMessageObject(messageObject);
|
|
cantDeleteMessagesCount = 0;
|
|
canEditMessagesCount = 0;
|
|
updatePinnedMessageView(true);
|
|
updateVisibleRows();
|
|
} else if (id == chat_menu_attach) {
|
|
openAttachMenu();
|
|
} else if (id == bot_help) {
|
|
SendMessagesHelper.getInstance().sendMessage("/help", dialog_id, null, null, false, null, null, null);
|
|
} else if (id == bot_settings) {
|
|
SendMessagesHelper.getInstance().sendMessage("/settings", dialog_id, null, null, false, null, null, null);
|
|
} else if (id == search) {
|
|
openSearchWithText(null);
|
|
} else if(id == call) {
|
|
if (currentUser != null && getParentActivity() != null) {
|
|
VoIPHelper.startCall(currentUser, getParentActivity(), MessagesController.getInstance().getUserFull(currentUser.id));
|
|
}
|
|
}
|
|
}
|
|
});
|
|
|
|
avatarContainer = new ChatAvatarContainer(context, this, currentEncryptedChat != null);
|
|
actionBar.addView(avatarContainer, 0, LayoutHelper.createFrame(LayoutHelper.WRAP_CONTENT, LayoutHelper.MATCH_PARENT, Gravity.TOP | Gravity.LEFT, 56, 0, 40, 0));
|
|
|
|
if (currentChat != null) {
|
|
if (!ChatObject.isChannel(currentChat)) {
|
|
int count = currentChat.participants_count;
|
|
if (info != null) {
|
|
count = info.participants.participants.size();
|
|
}
|
|
if (count == 0 || currentChat.deactivated || currentChat.left || currentChat instanceof TLRPC.TL_chatForbidden || info != null && info.participants instanceof TLRPC.TL_chatParticipantsForbidden) {
|
|
avatarContainer.setEnabled(false);
|
|
}
|
|
}
|
|
}
|
|
|
|
ActionBarMenu menu = actionBar.createMenu();
|
|
|
|
if (currentEncryptedChat == null && !isBroadcast) {
|
|
searchItem = menu.addItem(0, R.drawable.ic_ab_search).setIsSearchField(true).setActionBarMenuItemSearchListener(new ActionBarMenuItem.ActionBarMenuItemSearchListener() {
|
|
|
|
boolean searchWas;
|
|
|
|
@Override
|
|
public void onSearchCollapse() {
|
|
searchCalendarButton.setVisibility(View.VISIBLE);
|
|
if (searchUserButton != null) {
|
|
searchUserButton.setVisibility(View.VISIBLE);
|
|
}
|
|
if (searchingForUser) {
|
|
mentionsAdapter.searchUsernameOrHashtag(null, 0, null, false);
|
|
searchingForUser = false;
|
|
}
|
|
mentionLayoutManager.setReverseLayout(false);
|
|
mentionsAdapter.setSearchingMentions(false);
|
|
searchingUserMessages = null;
|
|
searchItem.getSearchField().setHint(LocaleController.getString("Search", R.string.Search));
|
|
searchItem.setSearchFieldCaption(null);
|
|
avatarContainer.setVisibility(View.VISIBLE);
|
|
if (chatActivityEnterView.hasText()) {
|
|
if (headerItem != null) {
|
|
headerItem.setVisibility(View.GONE);
|
|
}
|
|
if (attachItem != null) {
|
|
attachItem.setVisibility(View.VISIBLE);
|
|
}
|
|
} else {
|
|
if (headerItem != null) {
|
|
headerItem.setVisibility(View.VISIBLE);
|
|
}
|
|
if (attachItem != null) {
|
|
attachItem.setVisibility(View.GONE);
|
|
}
|
|
}
|
|
searchItem.setVisibility(View.GONE);
|
|
highlightMessageId = Integer.MAX_VALUE;
|
|
updateVisibleRows();
|
|
if (searchWas) {
|
|
scrollToLastMessage(false);
|
|
}
|
|
updateBottomOverlay();
|
|
updatePinnedMessageView(true);
|
|
}
|
|
|
|
@Override
|
|
public void onSearchExpand() {
|
|
if (!openSearchKeyboard) {
|
|
return;
|
|
}
|
|
AndroidUtilities.runOnUIThread(new Runnable() {
|
|
@Override
|
|
public void run() {
|
|
searchWas = false;
|
|
searchItem.getSearchField().requestFocus();
|
|
AndroidUtilities.showKeyboard(searchItem.getSearchField());
|
|
}
|
|
}, 300);
|
|
}
|
|
|
|
@Override
|
|
public void onSearchPressed(EditText editText) {
|
|
searchWas = true;
|
|
updateSearchButtons(0, 0, -1);
|
|
MessagesSearchQuery.searchMessagesInChat(editText.getText().toString(), dialog_id, mergeDialogId, classGuid, 0, searchingUserMessages);
|
|
}
|
|
|
|
@Override
|
|
public void onTextChanged(EditText editText) {
|
|
if (searchingForUser) {
|
|
mentionsAdapter.searchUsernameOrHashtag("@" + editText.getText().toString(), 0, messages, true);
|
|
} else if (!searchingForUser && searchingUserMessages == null && searchUserButton != null && TextUtils.equals(editText.getText(), LocaleController.getString("SearchFrom", R.string.SearchFrom))) {
|
|
searchUserButton.callOnClick();
|
|
}
|
|
}
|
|
|
|
@Override
|
|
public void onCaptionCleared() {
|
|
if (searchingUserMessages != null) {
|
|
searchUserButton.callOnClick();
|
|
} else {
|
|
if (searchingForUser) {
|
|
mentionsAdapter.searchUsernameOrHashtag(null, 0, null, false);
|
|
searchingForUser = false;
|
|
}
|
|
searchItem.getSearchField().setHint(LocaleController.getString("Search", R.string.Search));
|
|
searchCalendarButton.setVisibility(View.VISIBLE);
|
|
searchUserButton.setVisibility(View.VISIBLE);
|
|
searchingUserMessages = null;
|
|
}
|
|
}
|
|
});
|
|
searchItem.getSearchField().setHint(LocaleController.getString("Search", R.string.Search));
|
|
searchItem.setVisibility(View.GONE);
|
|
}
|
|
|
|
headerItem = menu.addItem(0, R.drawable.ic_ab_other);
|
|
if (currentUser != null) {
|
|
headerItem.addSubItem(call, LocaleController.getString("Call", R.string.Call));
|
|
TLRPC.TL_userFull userFull = MessagesController.getInstance().getUserFull(currentUser.id);
|
|
if (userFull != null && userFull.phone_calls_available) {
|
|
headerItem.showSubItem(call);
|
|
} else {
|
|
headerItem.hideSubItem(call);
|
|
}
|
|
}
|
|
if (searchItem != null) {
|
|
headerItem.addSubItem(search, LocaleController.getString("Search", R.string.Search));
|
|
}
|
|
if (ChatObject.isChannel(currentChat) && !currentChat.creator && (!currentChat.megagroup || currentChat.username != null && currentChat.username.length() > 0)) {
|
|
headerItem.addSubItem(report, LocaleController.getString("ReportChat", R.string.ReportChat));
|
|
}
|
|
if (currentUser != null) {
|
|
addContactItem = headerItem.addSubItem(share_contact, "");
|
|
}
|
|
if (currentEncryptedChat != null) {
|
|
timeItem2 = headerItem.addSubItem(chat_enc_timer, LocaleController.getString("SetTimer", R.string.SetTimer));
|
|
}
|
|
if (!ChatObject.isChannel(currentChat) || currentChat != null && currentChat.megagroup && TextUtils.isEmpty(currentChat.username)) {
|
|
headerItem.addSubItem(clear_history, LocaleController.getString("ClearHistory", R.string.ClearHistory));
|
|
}
|
|
if (!ChatObject.isChannel(currentChat)) {
|
|
if (currentChat != null && !isBroadcast) {
|
|
headerItem.addSubItem(delete_chat, LocaleController.getString("DeleteAndExit", R.string.DeleteAndExit));
|
|
} else {
|
|
headerItem.addSubItem(delete_chat, LocaleController.getString("DeleteChatUser", R.string.DeleteChatUser));
|
|
}
|
|
}
|
|
if (currentUser == null || !currentUser.self) {
|
|
muteItem = headerItem.addSubItem(mute, null);
|
|
} else if (currentUser.self) {
|
|
headerItem.addSubItem(add_shortcut, LocaleController.getString("AddShortcut", R.string.AddShortcut));
|
|
}
|
|
if (currentUser != null && currentEncryptedChat == null && currentUser.bot) {
|
|
headerItem.addSubItem(bot_settings, LocaleController.getString("BotSettings", R.string.BotSettings));
|
|
headerItem.addSubItem(bot_help, LocaleController.getString("BotHelp", R.string.BotHelp));
|
|
updateBotButtons();
|
|
}
|
|
|
|
updateTitle();
|
|
avatarContainer.updateOnlineCount();
|
|
avatarContainer.updateSubtitle();
|
|
updateTitleIcons();
|
|
|
|
attachItem = menu.addItem(chat_menu_attach, R.drawable.ic_ab_other).setOverrideMenuClick(true).setAllowCloseAnimation(false);
|
|
attachItem.setVisibility(View.GONE);
|
|
|
|
actionModeViews.clear();
|
|
|
|
final ActionBarMenu actionMode = actionBar.createActionMode();
|
|
|
|
selectedMessagesCountTextView = new NumberTextView(actionMode.getContext());
|
|
selectedMessagesCountTextView.setTextSize(18);
|
|
selectedMessagesCountTextView.setTypeface(AndroidUtilities.getTypeface("fonts/rmedium.ttf"));
|
|
selectedMessagesCountTextView.setTextColor(Theme.getColor(Theme.key_actionBarActionModeDefaultIcon));
|
|
actionMode.addView(selectedMessagesCountTextView, LayoutHelper.createLinear(0, LayoutHelper.MATCH_PARENT, 1.0f, 65, 0, 0, 0));
|
|
selectedMessagesCountTextView.setOnTouchListener(new View.OnTouchListener() {
|
|
@Override
|
|
public boolean onTouch(View v, MotionEvent event) {
|
|
return true;
|
|
}
|
|
});
|
|
|
|
actionModeTitleContainer = new FrameLayout(context) {
|
|
|
|
@Override
|
|
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
|
|
int width = MeasureSpec.getSize(widthMeasureSpec);
|
|
int height = MeasureSpec.getSize(heightMeasureSpec);
|
|
|
|
setMeasuredDimension(width, height);
|
|
|
|
actionModeTextView.setTextSize(!AndroidUtilities.isTablet() && getResources().getConfiguration().orientation == Configuration.ORIENTATION_LANDSCAPE ? 18 : 20);
|
|
actionModeTextView.measure(MeasureSpec.makeMeasureSpec(width, MeasureSpec.AT_MOST), MeasureSpec.makeMeasureSpec(AndroidUtilities.dp(24), MeasureSpec.AT_MOST));
|
|
|
|
if (actionModeSubTextView.getVisibility() != GONE) {
|
|
actionModeSubTextView.setTextSize(!AndroidUtilities.isTablet() && getResources().getConfiguration().orientation == Configuration.ORIENTATION_LANDSCAPE ? 14 : 16);
|
|
actionModeSubTextView.measure(MeasureSpec.makeMeasureSpec(width, MeasureSpec.AT_MOST), MeasureSpec.makeMeasureSpec(AndroidUtilities.dp(20), MeasureSpec.AT_MOST));
|
|
}
|
|
}
|
|
|
|
@Override
|
|
protected void onLayout(boolean changed, int left, int top, int right, int bottom) {
|
|
int height = bottom - top;
|
|
|
|
int textTop;
|
|
if (actionModeSubTextView.getVisibility() != GONE) {
|
|
textTop = (height / 2 - actionModeTextView.getTextHeight()) / 2 + AndroidUtilities.dp(!AndroidUtilities.isTablet() && getResources().getConfiguration().orientation == Configuration.ORIENTATION_LANDSCAPE ? 2 : 3);
|
|
} else {
|
|
textTop = (height - actionModeTextView.getTextHeight()) / 2;
|
|
}
|
|
actionModeTextView.layout(0, textTop, actionModeTextView.getMeasuredWidth(), textTop + actionModeTextView.getTextHeight());
|
|
|
|
if (actionModeSubTextView.getVisibility() != GONE) {
|
|
textTop = height / 2 + (height / 2 - actionModeSubTextView.getTextHeight()) / 2 - AndroidUtilities.dp(!AndroidUtilities.isTablet() && getResources().getConfiguration().orientation == Configuration.ORIENTATION_LANDSCAPE ? 1 : 1);
|
|
actionModeSubTextView.layout(0, textTop, actionModeSubTextView.getMeasuredWidth(), textTop + actionModeSubTextView.getTextHeight());
|
|
}
|
|
}
|
|
};
|
|
actionMode.addView(actionModeTitleContainer, LayoutHelper.createLinear(0, LayoutHelper.MATCH_PARENT, 1.0f, 65, 0, 0, 0));
|
|
actionModeTitleContainer.setOnTouchListener(new View.OnTouchListener() {
|
|
@Override
|
|
public boolean onTouch(View v, MotionEvent event) {
|
|
return true;
|
|
}
|
|
});
|
|
actionModeTitleContainer.setVisibility(View.GONE);
|
|
|
|
actionModeTextView = new SimpleTextView(context);
|
|
actionModeTextView.setTextSize(18);
|
|
actionModeTextView.setTypeface(AndroidUtilities.getTypeface("fonts/rmedium.ttf"));
|
|
actionModeTextView.setTextColor(Theme.getColor(Theme.key_actionBarActionModeDefaultIcon));
|
|
actionModeTextView.setText(LocaleController.getString("Edit", R.string.Edit));
|
|
actionModeTitleContainer.addView(actionModeTextView, LayoutHelper.createFrame(LayoutHelper.MATCH_PARENT, LayoutHelper.MATCH_PARENT));
|
|
|
|
actionModeSubTextView = new SimpleTextView(context);
|
|
actionModeSubTextView.setGravity(Gravity.LEFT);
|
|
actionModeSubTextView.setTextColor(Theme.getColor(Theme.key_actionBarActionModeDefaultIcon));
|
|
actionModeTitleContainer.addView(actionModeSubTextView, LayoutHelper.createFrame(LayoutHelper.MATCH_PARENT, LayoutHelper.MATCH_PARENT));
|
|
|
|
if (currentEncryptedChat == null) {
|
|
actionModeViews.add(actionMode.addItemWithWidth(edit, R.drawable.group_edit, AndroidUtilities.dp(54)));
|
|
if (!isBroadcast) {
|
|
actionModeViews.add(actionMode.addItemWithWidth(reply, R.drawable.ic_ab_reply, AndroidUtilities.dp(54)));
|
|
}
|
|
actionModeViews.add(actionMode.addItemWithWidth(star, R.drawable.ic_ab_fave, AndroidUtilities.dp(54)));
|
|
actionModeViews.add(actionMode.addItemWithWidth(copy, R.drawable.ic_ab_copy, AndroidUtilities.dp(54)));
|
|
actionModeViews.add(actionMode.addItemWithWidth(forward, R.drawable.ic_ab_forward, AndroidUtilities.dp(54)));
|
|
actionModeViews.add(actionMode.addItemWithWidth(delete, R.drawable.ic_ab_delete, AndroidUtilities.dp(54)));
|
|
} else {
|
|
actionModeViews.add(actionMode.addItemWithWidth(edit, R.drawable.group_edit, AndroidUtilities.dp(54)));
|
|
actionModeViews.add(actionMode.addItemWithWidth(reply, R.drawable.ic_ab_reply, AndroidUtilities.dp(54)));
|
|
actionModeViews.add(actionMode.addItemWithWidth(star, R.drawable.ic_ab_fave, AndroidUtilities.dp(54)));
|
|
actionModeViews.add(actionMode.addItemWithWidth(copy, R.drawable.ic_ab_copy, AndroidUtilities.dp(54)));
|
|
actionModeViews.add(actionMode.addItemWithWidth(delete, R.drawable.ic_ab_delete, AndroidUtilities.dp(54)));
|
|
}
|
|
actionMode.getItem(edit).setVisibility(canEditMessagesCount == 1 && selectedMessagesIds[0].size() + selectedMessagesIds[1].size() == 1 ? View.VISIBLE : View.GONE);
|
|
actionMode.getItem(copy).setVisibility(selectedMessagesCanCopyIds[0].size() + selectedMessagesCanCopyIds[1].size() != 0 ? View.VISIBLE : View.GONE);
|
|
actionMode.getItem(star).setVisibility(selectedMessagesCanStarIds[0].size() + selectedMessagesCanStarIds[1].size() != 0 ? View.VISIBLE : View.GONE);
|
|
actionMode.getItem(delete).setVisibility(cantDeleteMessagesCount == 0 ? View.VISIBLE : View.GONE);
|
|
checkActionBarMenu();
|
|
|
|
fragmentView = new SizeNotifierFrameLayout(context) {
|
|
|
|
int inputFieldHeight = 0;
|
|
|
|
@Override
|
|
protected void onAttachedToWindow() {
|
|
super.onAttachedToWindow();
|
|
MessageObject messageObject = MediaController.getInstance().getPlayingMessageObject();
|
|
if (messageObject != null && messageObject.isRoundVideo() && messageObject.eventId == 0 && messageObject.getDialogId() == dialog_id) {
|
|
MediaController.getInstance().setTextureView(createTextureView(false), aspectRatioFrameLayout, roundVideoContainer, true);
|
|
}
|
|
}
|
|
|
|
@Override
|
|
protected boolean drawChild(Canvas canvas, View child, long drawingTime) {
|
|
boolean result;
|
|
MessageObject messageObject = MediaController.getInstance().getPlayingMessageObject();
|
|
boolean isRoundVideo = messageObject != null && messageObject.eventId == 0 && messageObject.isRoundVideo();
|
|
if (isRoundVideo && child == roundVideoContainer) {
|
|
if (messageObject.type == 5) {
|
|
if (Theme.chat_roundVideoShadow != null && aspectRatioFrameLayout.isDrawingReady()) {
|
|
int x = (int) child.getX() - AndroidUtilities.dp(3);
|
|
int y = (int) child.getY() - AndroidUtilities.dp(2);
|
|
Theme.chat_roundVideoShadow.setAlpha(255);
|
|
Theme.chat_roundVideoShadow.setBounds(x, y, x + AndroidUtilities.roundMessageSize + AndroidUtilities.dp(6), y + AndroidUtilities.roundMessageSize + AndroidUtilities.dp(6));
|
|
Theme.chat_roundVideoShadow.draw(canvas);
|
|
}
|
|
result = super.drawChild(canvas, child, drawingTime);
|
|
} else {
|
|
result = false;
|
|
}
|
|
} else {
|
|
result = super.drawChild(canvas, child, drawingTime);
|
|
if (isRoundVideo && child == chatListView && messageObject.type != 5 && roundVideoContainer != null) {
|
|
super.drawChild(canvas, roundVideoContainer, drawingTime);
|
|
}
|
|
}
|
|
if (child == actionBar && parentLayout != null) {
|
|
parentLayout.drawHeaderShadow(canvas, actionBar.getVisibility() == VISIBLE ? actionBar.getMeasuredHeight() : 0);
|
|
}
|
|
return result;
|
|
}
|
|
|
|
@Override
|
|
protected boolean isActionBarVisible() {
|
|
return actionBar.getVisibility() == VISIBLE;
|
|
}
|
|
|
|
@Override
|
|
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
|
|
int allHeight;
|
|
int widthSize = MeasureSpec.getSize(widthMeasureSpec);
|
|
int heightSize = allHeight = MeasureSpec.getSize(heightMeasureSpec);
|
|
|
|
setMeasuredDimension(widthSize, heightSize);
|
|
heightSize -= getPaddingTop();
|
|
|
|
measureChildWithMargins(actionBar, widthMeasureSpec, 0, heightMeasureSpec, 0);
|
|
int actionBarHeight = actionBar.getMeasuredHeight();
|
|
if (actionBar.getVisibility() == VISIBLE) {
|
|
heightSize -= actionBarHeight;
|
|
}
|
|
|
|
int keyboardSize = getKeyboardHeight();
|
|
|
|
if (keyboardSize <= AndroidUtilities.dp(20) && !AndroidUtilities.isInMultiwindow) {
|
|
heightSize -= chatActivityEnterView.getEmojiPadding();
|
|
allHeight -= chatActivityEnterView.getEmojiPadding();
|
|
}
|
|
|
|
int childCount = getChildCount();
|
|
|
|
measureChildWithMargins(chatActivityEnterView, widthMeasureSpec, 0, heightMeasureSpec, 0);
|
|
inputFieldHeight = chatActivityEnterView.getMeasuredHeight();
|
|
|
|
for (int i = 0; i < childCount; i++) {
|
|
View child = getChildAt(i);
|
|
if (child == null || child.getVisibility() == GONE || child == chatActivityEnterView || child == actionBar) {
|
|
continue;
|
|
}
|
|
if (child == chatListView || child == progressView) {
|
|
int contentWidthSpec = MeasureSpec.makeMeasureSpec(widthSize, MeasureSpec.EXACTLY);
|
|
int contentHeightSpec = MeasureSpec.makeMeasureSpec(Math.max(AndroidUtilities.dp(10), heightSize - inputFieldHeight + AndroidUtilities.dp(2 + (chatActivityEnterView.isTopViewVisible() ? 48 : 0))), MeasureSpec.EXACTLY);
|
|
child.measure(contentWidthSpec, contentHeightSpec);
|
|
} else if (child == instantCameraView || child == overlayView) {
|
|
int contentWidthSpec = MeasureSpec.makeMeasureSpec(widthSize, MeasureSpec.EXACTLY);
|
|
int contentHeightSpec = MeasureSpec.makeMeasureSpec(allHeight - inputFieldHeight + AndroidUtilities.dp(3), MeasureSpec.EXACTLY);
|
|
child.measure(contentWidthSpec, contentHeightSpec);
|
|
} else if (child == emptyViewContainer) {
|
|
int contentWidthSpec = MeasureSpec.makeMeasureSpec(widthSize, MeasureSpec.EXACTLY);
|
|
int contentHeightSpec = MeasureSpec.makeMeasureSpec(heightSize, MeasureSpec.EXACTLY);
|
|
child.measure(contentWidthSpec, contentHeightSpec);
|
|
} else if (chatActivityEnterView.isPopupView(child)) {
|
|
if (AndroidUtilities.isInMultiwindow) {
|
|
if (AndroidUtilities.isTablet()) {
|
|
child.measure(MeasureSpec.makeMeasureSpec(widthSize, MeasureSpec.EXACTLY), MeasureSpec.makeMeasureSpec(Math.min(AndroidUtilities.dp(320), heightSize - inputFieldHeight + actionBarHeight - AndroidUtilities.statusBarHeight + getPaddingTop()), MeasureSpec.EXACTLY));
|
|
} else {
|
|
child.measure(MeasureSpec.makeMeasureSpec(widthSize, MeasureSpec.EXACTLY), MeasureSpec.makeMeasureSpec(heightSize - inputFieldHeight + actionBarHeight - AndroidUtilities.statusBarHeight + getPaddingTop(), MeasureSpec.EXACTLY));
|
|
}
|
|
} else {
|
|
child.measure(MeasureSpec.makeMeasureSpec(widthSize, MeasureSpec.EXACTLY), MeasureSpec.makeMeasureSpec(child.getLayoutParams().height, MeasureSpec.EXACTLY));
|
|
}
|
|
} else if (child == mentionContainer) {
|
|
FrameLayout.LayoutParams layoutParams = (FrameLayout.LayoutParams) mentionContainer.getLayoutParams();
|
|
if (mentionsAdapter.isBannedInline()) {
|
|
child.measure(MeasureSpec.makeMeasureSpec(widthSize, MeasureSpec.EXACTLY), MeasureSpec.makeMeasureSpec(heightSize, MeasureSpec.AT_MOST));
|
|
} else {
|
|
int height;
|
|
mentionListViewIgnoreLayout = true;
|
|
if (mentionsAdapter.isBotContext() && mentionsAdapter.isMediaLayout()) {
|
|
int size = mentionGridLayoutManager.getRowsCount(widthSize);
|
|
int maxHeight = size * 102;
|
|
if (mentionsAdapter.isBotContext()) {
|
|
if (mentionsAdapter.getBotContextSwitch() != null) {
|
|
maxHeight += 34;
|
|
}
|
|
}
|
|
height = heightSize - chatActivityEnterView.getMeasuredHeight() + (maxHeight != 0 ? AndroidUtilities.dp(2) : 0);
|
|
int padding = Math.max(0, height - AndroidUtilities.dp(Math.min(maxHeight, 68 * 1.8f)));
|
|
if (mentionLayoutManager.getReverseLayout()) {
|
|
mentionListView.setPadding(0, 0, 0, padding);
|
|
} else {
|
|
mentionListView.setPadding(0, padding, 0, 0);
|
|
}
|
|
} else {
|
|
int size = mentionsAdapter.getItemCount();
|
|
int maxHeight = 0;
|
|
if (mentionsAdapter.isBotContext()) {
|
|
if (mentionsAdapter.getBotContextSwitch() != null) {
|
|
maxHeight += 36;
|
|
size -= 1;
|
|
}
|
|
maxHeight += size * 68;
|
|
} else {
|
|
maxHeight += size * 36;
|
|
}
|
|
height = heightSize - chatActivityEnterView.getMeasuredHeight() + (maxHeight != 0 ? AndroidUtilities.dp(2) : 0);
|
|
int padding = Math.max(0, height - AndroidUtilities.dp(Math.min(maxHeight, 68 * 1.8f)));
|
|
if (mentionLayoutManager.getReverseLayout()) {
|
|
mentionListView.setPadding(0, 0, 0, padding);
|
|
} else {
|
|
mentionListView.setPadding(0, padding, 0, 0);
|
|
}
|
|
}
|
|
|
|
layoutParams.height = height;
|
|
layoutParams.topMargin = 0;
|
|
|
|
mentionListViewIgnoreLayout = false;
|
|
child.measure(MeasureSpec.makeMeasureSpec(widthSize, MeasureSpec.EXACTLY), MeasureSpec.makeMeasureSpec(layoutParams.height, MeasureSpec.EXACTLY));
|
|
}
|
|
} else {
|
|
measureChildWithMargins(child, widthMeasureSpec, 0, heightMeasureSpec, 0);
|
|
}
|
|
}
|
|
}
|
|
|
|
@Override
|
|
protected void onLayout(boolean changed, int l, int t, int r, int b) {
|
|
final int count = getChildCount();
|
|
|
|
int paddingBottom = getKeyboardHeight() <= AndroidUtilities.dp(20) && !AndroidUtilities.isInMultiwindow ? chatActivityEnterView.getEmojiPadding() : 0;
|
|
setBottomClip(paddingBottom);
|
|
|
|
for (int i = 0; i < count; i++) {
|
|
final View child = getChildAt(i);
|
|
if (child.getVisibility() == GONE) {
|
|
continue;
|
|
}
|
|
final LayoutParams lp = (LayoutParams) child.getLayoutParams();
|
|
|
|
final int width = child.getMeasuredWidth();
|
|
final int height = child.getMeasuredHeight();
|
|
|
|
int childLeft;
|
|
int childTop;
|
|
|
|
int gravity = lp.gravity;
|
|
if (gravity == -1) {
|
|
gravity = Gravity.TOP | Gravity.LEFT;
|
|
}
|
|
|
|
final int absoluteGravity = gravity & Gravity.HORIZONTAL_GRAVITY_MASK;
|
|
final int verticalGravity = gravity & Gravity.VERTICAL_GRAVITY_MASK;
|
|
|
|
switch (absoluteGravity & Gravity.HORIZONTAL_GRAVITY_MASK) {
|
|
case Gravity.CENTER_HORIZONTAL:
|
|
childLeft = (r - l - width) / 2 + lp.leftMargin - lp.rightMargin;
|
|
break;
|
|
case Gravity.RIGHT:
|
|
childLeft = r - width - lp.rightMargin;
|
|
break;
|
|
case Gravity.LEFT:
|
|
default:
|
|
childLeft = lp.leftMargin;
|
|
}
|
|
|
|
switch (verticalGravity) {
|
|
case Gravity.TOP:
|
|
childTop = lp.topMargin + getPaddingTop();
|
|
if (child != actionBar && actionBar.getVisibility() == VISIBLE) {
|
|
childTop += actionBar.getMeasuredHeight();
|
|
}
|
|
break;
|
|
case Gravity.CENTER_VERTICAL:
|
|
childTop = ((b - paddingBottom) - t - height) / 2 + lp.topMargin - lp.bottomMargin;
|
|
break;
|
|
case Gravity.BOTTOM:
|
|
childTop = ((b - paddingBottom) - t) - height - lp.bottomMargin;
|
|
break;
|
|
default:
|
|
childTop = lp.topMargin;
|
|
}
|
|
|
|
if (child == mentionContainer) {
|
|
childTop -= chatActivityEnterView.getMeasuredHeight() - AndroidUtilities.dp(2);
|
|
} else if (child == pagedownButton) {
|
|
childTop -= chatActivityEnterView.getMeasuredHeight();
|
|
} else if (child == mentiondownButton) {
|
|
childTop -= chatActivityEnterView.getMeasuredHeight();
|
|
} else if (child == emptyViewContainer) {
|
|
childTop -= inputFieldHeight / 2 - (actionBar.getVisibility() == VISIBLE ? actionBar.getMeasuredHeight() / 2 : 0);
|
|
} else if (chatActivityEnterView.isPopupView(child)) {
|
|
if (AndroidUtilities.isInMultiwindow) {
|
|
childTop = chatActivityEnterView.getTop() - child.getMeasuredHeight() + AndroidUtilities.dp(1);
|
|
} else {
|
|
childTop = chatActivityEnterView.getBottom();
|
|
}
|
|
} else if (child == gifHintTextView || child == voiceHintTextView || child == mediaBanTooltip) {
|
|
childTop -= inputFieldHeight;
|
|
} else if (child == chatListView || child == progressView) {
|
|
if (chatActivityEnterView.isTopViewVisible()) {
|
|
childTop -= AndroidUtilities.dp(48);
|
|
}
|
|
} else if (child == actionBar) {
|
|
childTop -= getPaddingTop();
|
|
} else if (child == roundVideoContainer) {
|
|
childTop = actionBar.getMeasuredHeight();
|
|
} else if (child == instantCameraView || child == overlayView) {
|
|
childTop = 0;
|
|
}
|
|
child.layout(childLeft, childTop, childLeft + width, childTop + height);
|
|
}
|
|
|
|
updateMessagesVisisblePart();
|
|
notifyHeightChanged();
|
|
}
|
|
};
|
|
|
|
contentView = (SizeNotifierFrameLayout) fragmentView;
|
|
|
|
contentView.setBackgroundImage(Theme.getCachedWallpaper());
|
|
|
|
emptyViewContainer = new FrameLayout(context);
|
|
emptyViewContainer.setVisibility(View.INVISIBLE);
|
|
contentView.addView(emptyViewContainer, LayoutHelper.createFrame(LayoutHelper.MATCH_PARENT, LayoutHelper.WRAP_CONTENT, Gravity.CENTER));
|
|
emptyViewContainer.setOnTouchListener(new View.OnTouchListener() {
|
|
@Override
|
|
public boolean onTouch(View v, MotionEvent event) {
|
|
return true;
|
|
}
|
|
});
|
|
|
|
if (currentEncryptedChat == null) {
|
|
if (currentUser != null && currentUser.self) {
|
|
bigEmptyView = new ChatBigEmptyView(context, false);
|
|
emptyViewContainer.addView(bigEmptyView, new FrameLayout.LayoutParams(LayoutHelper.WRAP_CONTENT, LayoutHelper.WRAP_CONTENT, Gravity.CENTER));
|
|
} else {
|
|
emptyView = new TextView(context);
|
|
if (currentUser != null && currentUser.id != 777000 && currentUser.id != 429000 && currentUser.id != 4244000 && MessagesController.isSupportId(currentUser.id)) {
|
|
emptyView.setText(LocaleController.getString("GotAQuestion", R.string.GotAQuestion));
|
|
} else {
|
|
emptyView.setText(LocaleController.getString("NoMessages", R.string.NoMessages));
|
|
}
|
|
emptyView.setTextSize(TypedValue.COMPLEX_UNIT_DIP, 14);
|
|
emptyView.setGravity(Gravity.CENTER);
|
|
emptyView.setTextColor(Theme.getColor(Theme.key_chat_serviceText));
|
|
emptyView.setBackgroundResource(R.drawable.system);
|
|
emptyView.getBackground().setColorFilter(Theme.colorFilter);
|
|
emptyView.setTypeface(AndroidUtilities.getTypeface("fonts/rmedium.ttf"));
|
|
emptyView.setPadding(AndroidUtilities.dp(10), AndroidUtilities.dp(2), AndroidUtilities.dp(10), AndroidUtilities.dp(3));
|
|
emptyViewContainer.addView(emptyView, new FrameLayout.LayoutParams(LayoutHelper.WRAP_CONTENT, LayoutHelper.WRAP_CONTENT, Gravity.CENTER));
|
|
}
|
|
} else {
|
|
bigEmptyView = new ChatBigEmptyView(context, true);
|
|
if (currentEncryptedChat.admin_id == UserConfig.getClientUserId()) {
|
|
bigEmptyView.setSecretText(LocaleController.formatString("EncryptedPlaceholderTitleOutgoing", R.string.EncryptedPlaceholderTitleOutgoing, UserObject.getFirstName(currentUser)));
|
|
} else {
|
|
bigEmptyView.setSecretText(LocaleController.formatString("EncryptedPlaceholderTitleIncoming", R.string.EncryptedPlaceholderTitleIncoming, UserObject.getFirstName(currentUser)));
|
|
}
|
|
emptyViewContainer.addView(bigEmptyView, new FrameLayout.LayoutParams(LayoutHelper.WRAP_CONTENT, LayoutHelper.WRAP_CONTENT, Gravity.CENTER));
|
|
}
|
|
|
|
CharSequence oldMessage;
|
|
if (chatActivityEnterView != null) {
|
|
chatActivityEnterView.onDestroy();
|
|
if (!chatActivityEnterView.isEditingMessage()) {
|
|
oldMessage = chatActivityEnterView.getFieldText();
|
|
} else {
|
|
oldMessage = null;
|
|
}
|
|
} else {
|
|
oldMessage = null;
|
|
}
|
|
if (mentionsAdapter != null) {
|
|
mentionsAdapter.onDestroy();
|
|
}
|
|
|
|
chatListView = new RecyclerListView(context) {
|
|
|
|
ArrayList<ChatMessageCell> drawTimeAfter = new ArrayList<>();
|
|
ArrayList<ChatMessageCell> drawNamesAfter = new ArrayList<>();
|
|
ArrayList<ChatMessageCell> drawCaptionAfter = new ArrayList<>();
|
|
|
|
@Override
|
|
protected void onLayout(boolean changed, int l, int t, int r, int b) {
|
|
super.onLayout(changed, l, t, r, b);
|
|
forceScrollToTop = false;
|
|
if (chatAdapter.isBot) {
|
|
int childCount = getChildCount();
|
|
for (int a = 0; a < childCount; a++) {
|
|
View child = getChildAt(a);
|
|
if (child instanceof BotHelpCell) {
|
|
int height = b - t;
|
|
int top = height / 2 - child.getMeasuredHeight() / 2;
|
|
if (child.getTop() > top) {
|
|
child.layout(0, top, r - l, top + child.getMeasuredHeight());
|
|
}
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
@Override
|
|
protected void onChildPressed(View child, boolean pressed) {
|
|
super.onChildPressed(child, pressed);
|
|
if (child instanceof ChatMessageCell) {
|
|
MessageObject.GroupedMessages groupedMessages = ((ChatMessageCell) child).getCurrentMessagesGroup();
|
|
if (groupedMessages != null) {
|
|
int count = getChildCount();
|
|
for (int a = 0; a < count; a++) {
|
|
View item = getChildAt(a);
|
|
if (item == child || !(item instanceof ChatMessageCell)) {
|
|
continue;
|
|
}
|
|
ChatMessageCell cell = (ChatMessageCell) item;
|
|
if (((ChatMessageCell) item).getCurrentMessagesGroup() == groupedMessages) {
|
|
cell.setPressed(pressed);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
@Override
|
|
public void requestLayout() {
|
|
if (chatListViewIgnoreLayout) {
|
|
return;
|
|
}
|
|
super.requestLayout();
|
|
}
|
|
|
|
@Override
|
|
public boolean drawChild(Canvas canvas, View child, long drawingTime) {
|
|
int clipLeft = 0;
|
|
int clipBottom = 0;
|
|
if (child instanceof ChatMessageCell) {
|
|
ChatMessageCell cell = (ChatMessageCell) child;
|
|
MessageObject.GroupedMessagePosition position = cell.getCurrentPosition();
|
|
MessageObject.GroupedMessages group = cell.getCurrentMessagesGroup();
|
|
if (position != null) {
|
|
if (position.pw != position.spanSize && position.spanSize == 1000 && position.siblingHeights == null && group.hasSibling) {
|
|
clipLeft = ((ChatMessageCell) child).getBackgroundDrawableLeft();
|
|
} else if (position.siblingHeights != null) {
|
|
clipBottom = child.getBottom() - AndroidUtilities.dp(1 + (cell.isPinnedBottom() ? 1 : 0));
|
|
}
|
|
}
|
|
}
|
|
if (clipLeft != 0) {
|
|
canvas.save();
|
|
canvas.clipRect(clipLeft, child.getTop(), child.getRight(), child.getBottom());
|
|
} else if (clipBottom != 0) {
|
|
canvas.save();
|
|
canvas.clipRect(child.getLeft(), child.getTop(), child.getRight(), clipBottom);
|
|
}
|
|
boolean result = super.drawChild(canvas, child, drawingTime);
|
|
if (clipLeft != 0 || clipBottom != 0) {
|
|
canvas.restore();
|
|
}
|
|
int num = 0;
|
|
int count = getChildCount();
|
|
for (int a = 0; a < count; a++) {
|
|
if (getChildAt(a) == child) {
|
|
num = a;
|
|
break;
|
|
}
|
|
}
|
|
if (num == count - 1) {
|
|
int size = drawTimeAfter.size();
|
|
if (size > 0) {
|
|
for (int a = 0; a < size; a++) {
|
|
ChatMessageCell cell = drawTimeAfter.get(a);
|
|
canvas.save();
|
|
canvas.translate(cell.getLeft(), cell.getTop());
|
|
cell.drawTimeLayout(canvas);
|
|
canvas.restore();
|
|
}
|
|
drawTimeAfter.clear();
|
|
}
|
|
size = drawNamesAfter.size();
|
|
if (size > 0) {
|
|
for (int a = 0; a < size; a++) {
|
|
ChatMessageCell cell = drawNamesAfter.get(a);
|
|
canvas.save();
|
|
canvas.translate(cell.getLeft(), cell.getTop());
|
|
cell.drawNamesLayout(canvas);
|
|
canvas.restore();
|
|
}
|
|
drawNamesAfter.clear();
|
|
}
|
|
size = drawCaptionAfter.size();
|
|
if (size > 0) {
|
|
for (int a = 0; a < size; a++) {
|
|
ChatMessageCell cell = drawCaptionAfter.get(a);
|
|
canvas.save();
|
|
canvas.translate(cell.getLeft(), cell.getTop());
|
|
cell.drawCaptionLayout(canvas);
|
|
canvas.restore();
|
|
}
|
|
drawCaptionAfter.clear();
|
|
}
|
|
}
|
|
if (child instanceof ChatMessageCell) {
|
|
ChatMessageCell chatMessageCell = (ChatMessageCell) child;
|
|
|
|
MessageObject.GroupedMessagePosition position = chatMessageCell.getCurrentPosition();
|
|
if (position != null) {
|
|
if (position.last || position.minX == 0 && position.minY == 0) {
|
|
if (num == count - 1) {
|
|
canvas.save();
|
|
canvas.translate(chatMessageCell.getLeft(), chatMessageCell.getTop());
|
|
if (position.last) {
|
|
chatMessageCell.drawTimeLayout(canvas);
|
|
}
|
|
if (position.minX == 0 && position.minY == 0) {
|
|
chatMessageCell.drawNamesLayout(canvas);
|
|
}
|
|
canvas.restore();
|
|
} else {
|
|
if (position.last) {
|
|
drawTimeAfter.add(chatMessageCell);
|
|
}
|
|
if (position.minX == 0 && position.minY == 0 && chatMessageCell.hasNameLayout()) {
|
|
drawNamesAfter.add(chatMessageCell);
|
|
}
|
|
}
|
|
}
|
|
if (num == count - 1) {
|
|
canvas.save();
|
|
canvas.translate(chatMessageCell.getLeft(), chatMessageCell.getTop());
|
|
if (chatMessageCell.hasCaptionLayout() && (position.flags & MessageObject.POSITION_FLAG_BOTTOM) != 0 && (position.flags & MessageObject.POSITION_FLAG_LEFT) != 0) {
|
|
chatMessageCell.drawCaptionLayout(canvas);
|
|
}
|
|
canvas.restore();
|
|
} else {
|
|
if (chatMessageCell.hasCaptionLayout() && (position.flags & MessageObject.POSITION_FLAG_BOTTOM) != 0 && (position.flags & MessageObject.POSITION_FLAG_LEFT) != 0) {
|
|
drawCaptionAfter.add(chatMessageCell);
|
|
}
|
|
}
|
|
}
|
|
ImageReceiver imageReceiver = chatMessageCell.getAvatarImage();
|
|
if (imageReceiver != null) {
|
|
MessageObject message = chatMessageCell.getMessageObject();
|
|
|
|
MessageObject.GroupedMessages groupedMessages = getValidGroupedMessage(message);
|
|
|
|
int top = child.getTop();
|
|
if (chatMessageCell.isPinnedBottom()) {
|
|
ViewHolder holder = chatListView.getChildViewHolder(child);
|
|
if (holder != null) {
|
|
int p = holder.getAdapterPosition();
|
|
int nextPosition;
|
|
if (groupedMessages != null && position != null) {
|
|
int idx = groupedMessages.posArray.indexOf(position);
|
|
int size = groupedMessages.posArray.size();
|
|
if ((position.flags & MessageObject.POSITION_FLAG_BOTTOM) != 0) {
|
|
nextPosition = p - size + idx;
|
|
} else {
|
|
nextPosition = p - 1;
|
|
for (int a = idx + 1; idx < size; a++) {
|
|
if (groupedMessages.posArray.get(a).minY > position.maxY) {
|
|
break;
|
|
} else {
|
|
nextPosition--;
|
|
}
|
|
}
|
|
}
|
|
} else {
|
|
nextPosition = p - 1;
|
|
}
|
|
holder = chatListView.findViewHolderForAdapterPosition(nextPosition);
|
|
if (holder != null) {
|
|
imageReceiver.setImageY(-AndroidUtilities.dp(1000));
|
|
imageReceiver.draw(canvas);
|
|
return result;
|
|
}
|
|
}
|
|
}
|
|
if (chatMessageCell.isPinnedTop()) {
|
|
ViewHolder holder = chatListView.getChildViewHolder(child);
|
|
if (holder != null) {
|
|
while (true) {
|
|
int p = holder.getAdapterPosition();
|
|
int prevPosition;
|
|
if (groupedMessages != null && position != null) {
|
|
int idx = groupedMessages.posArray.indexOf(position);
|
|
int size = groupedMessages.posArray.size();
|
|
if ((position.flags & MessageObject.POSITION_FLAG_TOP) != 0) {
|
|
prevPosition = p + idx + 1;
|
|
} else {
|
|
prevPosition = p + 1;
|
|
for (int a = idx - 1; idx >= 0; a--) {
|
|
if (groupedMessages.posArray.get(a).maxY < position.minY) {
|
|
break;
|
|
} else {
|
|
prevPosition++;
|
|
}
|
|
}
|
|
}
|
|
} else {
|
|
prevPosition = p + 1;
|
|
}
|
|
holder = chatListView.findViewHolderForAdapterPosition(prevPosition);
|
|
if (holder != null) {
|
|
top = holder.itemView.getTop();
|
|
if (!(holder.itemView instanceof ChatMessageCell) || !((ChatMessageCell) holder.itemView).isPinnedTop()) {
|
|
break;
|
|
}
|
|
} else {
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
int y = child.getTop() + chatMessageCell.getLayoutHeight();
|
|
int maxY = chatListView.getMeasuredHeight() - chatListView.getPaddingBottom();
|
|
if (y > maxY) {
|
|
y = maxY;
|
|
}
|
|
if (y - AndroidUtilities.dp(48) < top) {
|
|
y = top + AndroidUtilities.dp(48);
|
|
}
|
|
imageReceiver.setImageY(y - AndroidUtilities.dp(44));
|
|
imageReceiver.draw(canvas);
|
|
}
|
|
}
|
|
return result;
|
|
}
|
|
};
|
|
chatListView.setTag(1);
|
|
chatListView.setVerticalScrollBarEnabled(true);
|
|
chatListView.setAdapter(chatAdapter = new ChatActivityAdapter(context));
|
|
chatListView.setClipToPadding(false);
|
|
chatListView.setPadding(0, AndroidUtilities.dp(4), 0, AndroidUtilities.dp(3));
|
|
chatListView.setItemAnimator(null);
|
|
chatListView.setLayoutAnimation(null);
|
|
|
|
chatLayoutManager = new GridLayoutManagerFixed(context, 1000, LinearLayoutManager.VERTICAL, true) {
|
|
@Override
|
|
public boolean supportsPredictiveItemAnimations() {
|
|
return false;
|
|
}
|
|
|
|
@Override
|
|
public void smoothScrollToPosition(RecyclerView recyclerView, RecyclerView.State state, int position) {
|
|
LinearSmoothScrollerMiddle linearSmoothScroller = new LinearSmoothScrollerMiddle(recyclerView.getContext());
|
|
linearSmoothScroller.setTargetPosition(position);
|
|
startSmoothScroll(linearSmoothScroller);
|
|
}
|
|
|
|
@Override
|
|
public boolean shouldLayoutChildFromOpositeSide(View child) {
|
|
if (child instanceof ChatMessageCell) {
|
|
return !((ChatMessageCell) child).getMessageObject().isOutOwner();
|
|
}
|
|
return false;
|
|
}
|
|
|
|
@Override
|
|
protected boolean hasSiblingChild(int position) {
|
|
if (position >= chatAdapter.messagesStartRow && position < chatAdapter.messagesEndRow) {
|
|
int index = position - chatAdapter.messagesStartRow;
|
|
if (index >= 0 && index < messages.size()) {
|
|
MessageObject message = messages.get(index);
|
|
MessageObject.GroupedMessages group = getValidGroupedMessage(message);
|
|
if (group != null) {
|
|
MessageObject.GroupedMessagePosition pos = group.positions.get(message);
|
|
if (pos.minX == pos.maxX || pos.minY != pos.maxY || pos.minY == 0) {
|
|
return false;
|
|
}
|
|
int count = group.posArray.size();
|
|
for (int a = 0; a < count; a++) {
|
|
MessageObject.GroupedMessagePosition p = group.posArray.get(a);
|
|
if (p == pos) {
|
|
continue;
|
|
}
|
|
if (p.minY <= pos.minY && p.maxY >= pos.minY) {
|
|
return true;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
return false;
|
|
}
|
|
};
|
|
chatLayoutManager.setSpanSizeLookup(new GridLayoutManagerFixed.SpanSizeLookup() {
|
|
@Override
|
|
public int getSpanSize(int position) {
|
|
if (position >= chatAdapter.messagesStartRow && position < chatAdapter.messagesEndRow) {
|
|
int idx = position - chatAdapter.messagesStartRow;
|
|
if (idx >= 0 && idx < messages.size()) {
|
|
MessageObject message = messages.get(idx);
|
|
MessageObject.GroupedMessages groupedMessages = getValidGroupedMessage(message);
|
|
if (groupedMessages != null) {
|
|
return groupedMessages.positions.get(message).spanSize;
|
|
}
|
|
}
|
|
}
|
|
return 1000;
|
|
}
|
|
});
|
|
chatListView.setLayoutManager(chatLayoutManager);
|
|
chatListView.addItemDecoration(new RecyclerView.ItemDecoration() {
|
|
@Override
|
|
public void getItemOffsets(Rect outRect, View view, RecyclerView parent, RecyclerView.State state) {
|
|
outRect.bottom = 0;
|
|
if (view instanceof ChatMessageCell) {
|
|
ChatMessageCell cell = (ChatMessageCell) view;
|
|
MessageObject.GroupedMessages group = cell.getCurrentMessagesGroup();
|
|
if (group != null) {
|
|
MessageObject.GroupedMessagePosition position = cell.getCurrentPosition();
|
|
if (position != null && position.siblingHeights != null) {
|
|
float maxHeight = Math.max(AndroidUtilities.displaySize.x, AndroidUtilities.displaySize.y) * 0.5f;
|
|
int h = 0;
|
|
for (int a = 0; a < position.siblingHeights.length; a++) {
|
|
h += (int) Math.ceil(maxHeight * position.siblingHeights[a]);
|
|
}
|
|
h += (position.maxY - position.minY) * AndroidUtilities.dp(11);
|
|
int count = group.posArray.size();
|
|
for (int a = 0; a < count; a++) {
|
|
MessageObject.GroupedMessagePosition pos = group.posArray.get(a);
|
|
if (pos.minY != position.minY || pos.minX == position.minX && pos.maxX == position.maxX && pos.minY == position.minY && pos.maxY == position.maxY) {
|
|
continue;
|
|
}
|
|
if (pos.minY == position.minY) {
|
|
h -= (int) Math.ceil(maxHeight * pos.ph) - AndroidUtilities.dp(4);
|
|
break;
|
|
}
|
|
}
|
|
outRect.bottom = -h;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
});
|
|
contentView.addView(chatListView, LayoutHelper.createFrame(LayoutHelper.MATCH_PARENT, LayoutHelper.MATCH_PARENT));
|
|
chatListView.setOnItemLongClickListener(onItemLongClickListener);
|
|
chatListView.setOnItemClickListener(onItemClickListener);
|
|
chatListView.setOnScrollListener(new RecyclerView.OnScrollListener() {
|
|
|
|
private float totalDy = 0;
|
|
private final int scrollValue = AndroidUtilities.dp(100);
|
|
|
|
@Override
|
|
public void onScrollStateChanged(RecyclerView recyclerView, int newState) {
|
|
if (newState == RecyclerView.SCROLL_STATE_DRAGGING) {
|
|
scrollingFloatingDate = true;
|
|
checkTextureViewPosition = true;
|
|
} else if (newState == RecyclerView.SCROLL_STATE_IDLE) {
|
|
scrollingFloatingDate = false;
|
|
checkTextureViewPosition = false;
|
|
hideFloatingDateView(true);
|
|
}
|
|
}
|
|
|
|
@Override
|
|
public void onScrolled(RecyclerView recyclerView, int dx, int dy) {
|
|
chatListView.invalidate();
|
|
if (dy != 0 && scrollingFloatingDate && !currentFloatingTopIsNotMessage) {
|
|
if (highlightMessageId != Integer.MAX_VALUE) {
|
|
highlightMessageId = Integer.MAX_VALUE;
|
|
updateVisibleRows();
|
|
}
|
|
if (floatingDateView.getTag() == null) {
|
|
if (floatingDateAnimation != null) {
|
|
floatingDateAnimation.cancel();
|
|
}
|
|
floatingDateView.setTag(1);
|
|
floatingDateAnimation = new AnimatorSet();
|
|
floatingDateAnimation.setDuration(150);
|
|
floatingDateAnimation.playTogether(ObjectAnimator.ofFloat(floatingDateView, "alpha", 1.0f));
|
|
floatingDateAnimation.addListener(new AnimatorListenerAdapter() {
|
|
@Override
|
|
public void onAnimationEnd(Animator animation) {
|
|
if (animation.equals(floatingDateAnimation)) {
|
|
floatingDateAnimation = null;
|
|
}
|
|
}
|
|
});
|
|
floatingDateAnimation.start();
|
|
}
|
|
}
|
|
checkScrollForLoad(true);
|
|
int firstVisibleItem = chatLayoutManager.findFirstVisibleItemPosition();
|
|
if (firstVisibleItem != RecyclerView.NO_POSITION) {
|
|
int totalItemCount = chatAdapter.getItemCount();
|
|
if (firstVisibleItem == 0 && forwardEndReached[0]) {
|
|
showPagedownButton(false, true);
|
|
} else {
|
|
if (dy > 0) {
|
|
if (pagedownButton.getTag() == null) {
|
|
totalDy += dy;
|
|
if (totalDy > scrollValue) {
|
|
totalDy = 0;
|
|
showPagedownButton(true, true);
|
|
pagedownButtonShowedByScroll = true;
|
|
}
|
|
}
|
|
} else {
|
|
if (pagedownButtonShowedByScroll && pagedownButton.getTag() != null) {
|
|
totalDy += dy;
|
|
if (totalDy < -scrollValue) {
|
|
showPagedownButton(false, true);
|
|
totalDy = 0;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
updateMessagesVisisblePart();
|
|
}
|
|
});
|
|
if (scrollToPositionOnRecreate != -1) {
|
|
chatLayoutManager.scrollToPositionWithOffset(scrollToPositionOnRecreate, scrollToOffsetOnRecreate);
|
|
scrollToPositionOnRecreate = -1;
|
|
}
|
|
|
|
progressView = new FrameLayout(context);
|
|
progressView.setVisibility(View.INVISIBLE);
|
|
contentView.addView(progressView, LayoutHelper.createFrame(LayoutHelper.MATCH_PARENT, LayoutHelper.MATCH_PARENT, Gravity.TOP | Gravity.LEFT));
|
|
|
|
progressView2 = new View(context);
|
|
progressView2.setBackgroundResource(R.drawable.system_loader);
|
|
progressView2.getBackground().setColorFilter(Theme.colorFilter);
|
|
progressView.addView(progressView2, LayoutHelper.createFrame(36, 36, Gravity.CENTER));
|
|
|
|
progressBar = new RadialProgressView(context);
|
|
progressBar.setSize(AndroidUtilities.dp(28));
|
|
progressBar.setProgressColor(Theme.getColor(Theme.key_chat_serviceText));
|
|
progressView.addView(progressBar, LayoutHelper.createFrame(32, 32, Gravity.CENTER));
|
|
|
|
floatingDateView = new ChatActionCell(context);
|
|
floatingDateView.setAlpha(0.0f);
|
|
contentView.addView(floatingDateView, LayoutHelper.createFrame(LayoutHelper.WRAP_CONTENT, LayoutHelper.WRAP_CONTENT, Gravity.TOP | Gravity.CENTER_HORIZONTAL, 0, 4, 0, 0));
|
|
floatingDateView.setOnClickListener(new View.OnClickListener() {
|
|
@Override
|
|
public void onClick(View view) {
|
|
if (floatingDateView.getAlpha() == 0) {
|
|
return;
|
|
}
|
|
Calendar calendar = Calendar.getInstance();
|
|
calendar.setTimeInMillis((long) floatingDateView.getCustomDate() * 1000);
|
|
int year = calendar.get(Calendar.YEAR);
|
|
int monthOfYear = calendar.get(Calendar.MONTH);
|
|
int dayOfMonth = calendar.get(Calendar.DAY_OF_MONTH);
|
|
|
|
calendar.clear();
|
|
calendar.set(year, monthOfYear, dayOfMonth);
|
|
jumpToDate((int) (calendar.getTime().getTime() / 1000));
|
|
}
|
|
});
|
|
|
|
if (ChatObject.isChannel(currentChat)) {
|
|
pinnedMessageView = new FrameLayout(context);
|
|
pinnedMessageView.setTag(1);
|
|
pinnedMessageView.setTranslationY(-AndroidUtilities.dp(50));
|
|
pinnedMessageView.setVisibility(View.GONE);
|
|
pinnedMessageView.setBackgroundResource(R.drawable.blockpanel);
|
|
pinnedMessageView.getBackground().setColorFilter(new PorterDuffColorFilter(Theme.getColor(Theme.key_chat_topPanelBackground), PorterDuff.Mode.MULTIPLY));
|
|
contentView.addView(pinnedMessageView, LayoutHelper.createFrame(LayoutHelper.MATCH_PARENT, 50, Gravity.TOP | Gravity.LEFT));
|
|
pinnedMessageView.setOnClickListener(new View.OnClickListener() {
|
|
@Override
|
|
public void onClick(View v) {
|
|
scrollToMessageId(info.pinned_msg_id, 0, true, 0, false);
|
|
}
|
|
});
|
|
|
|
pinnedLineView = new View(context);
|
|
pinnedLineView.setBackgroundColor(Theme.getColor(Theme.key_chat_topPanelLine));
|
|
pinnedMessageView.addView(pinnedLineView, LayoutHelper.createFrame(2, 32, Gravity.LEFT | Gravity.TOP, 8, 8, 0, 0));
|
|
|
|
pinnedMessageImageView = new BackupImageView(context);
|
|
pinnedMessageView.addView(pinnedMessageImageView, LayoutHelper.createFrame(32, 32, Gravity.TOP | Gravity.LEFT, 17, 8, 0, 0));
|
|
|
|
pinnedMessageNameTextView = new SimpleTextView(context);
|
|
pinnedMessageNameTextView.setTextSize(14);
|
|
pinnedMessageNameTextView.setTextColor(Theme.getColor(Theme.key_chat_topPanelTitle));
|
|
pinnedMessageNameTextView.setTypeface(AndroidUtilities.getTypeface("fonts/rmedium.ttf"));
|
|
pinnedMessageView.addView(pinnedMessageNameTextView, LayoutHelper.createFrame(LayoutHelper.MATCH_PARENT, AndroidUtilities.dp(18), Gravity.TOP | Gravity.LEFT, 18, 7.3f, 52, 0));
|
|
|
|
pinnedMessageTextView = new SimpleTextView(context);
|
|
pinnedMessageTextView.setTextSize(14);
|
|
pinnedMessageTextView.setTextColor(Theme.getColor(Theme.key_chat_topPanelMessage));
|
|
pinnedMessageView.addView(pinnedMessageTextView, LayoutHelper.createFrame(LayoutHelper.MATCH_PARENT, AndroidUtilities.dp(18), Gravity.TOP | Gravity.LEFT, 18, 25.3f, 52, 0));
|
|
|
|
closePinned = new ImageView(context);
|
|
closePinned.setImageResource(R.drawable.miniplayer_close);
|
|
closePinned.setColorFilter(new PorterDuffColorFilter(Theme.getColor(Theme.key_chat_topPanelClose), PorterDuff.Mode.MULTIPLY));
|
|
closePinned.setScaleType(ImageView.ScaleType.CENTER);
|
|
pinnedMessageView.addView(closePinned, LayoutHelper.createFrame(48, 48, Gravity.RIGHT | Gravity.TOP));
|
|
closePinned.setOnClickListener(new View.OnClickListener() {
|
|
@Override
|
|
public void onClick(View v) {
|
|
if (getParentActivity() == null) {
|
|
return;
|
|
}
|
|
if (currentChat.creator || currentChat.admin_rights != null && (currentChat.megagroup && currentChat.admin_rights.pin_messages || !currentChat.megagroup && currentChat.admin_rights.edit_messages)) {
|
|
AlertDialog.Builder builder = new AlertDialog.Builder(getParentActivity());
|
|
builder.setMessage(LocaleController.getString("UnpinMessageAlert", R.string.UnpinMessageAlert));
|
|
builder.setPositiveButton(LocaleController.getString("OK", R.string.OK), new DialogInterface.OnClickListener() {
|
|
@Override
|
|
public void onClick(DialogInterface dialogInterface, int i) {
|
|
MessagesController.getInstance().pinChannelMessage(currentChat, 0, false);
|
|
}
|
|
});
|
|
builder.setTitle(LocaleController.getString("AppName", R.string.AppName));
|
|
builder.setNegativeButton(LocaleController.getString("Cancel", R.string.Cancel), null);
|
|
showDialog(builder.create());
|
|
} else {
|
|
SharedPreferences preferences = ApplicationLoader.applicationContext.getSharedPreferences("Notifications", Activity.MODE_PRIVATE);
|
|
preferences.edit().putInt("pin_" + dialog_id, info.pinned_msg_id).commit();
|
|
updatePinnedMessageView(true);
|
|
}
|
|
}
|
|
});
|
|
}
|
|
|
|
reportSpamView = new LinearLayout(context);
|
|
reportSpamView.setTag(1);
|
|
reportSpamView.setTranslationY(-AndroidUtilities.dp(50));
|
|
reportSpamView.setVisibility(View.GONE);
|
|
reportSpamView.setBackgroundResource(R.drawable.blockpanel);
|
|
reportSpamView.getBackground().setColorFilter(new PorterDuffColorFilter(Theme.getColor(Theme.key_chat_topPanelBackground), PorterDuff.Mode.MULTIPLY));
|
|
contentView.addView(reportSpamView, LayoutHelper.createFrame(LayoutHelper.MATCH_PARENT, 50, Gravity.TOP | Gravity.LEFT));
|
|
|
|
addToContactsButton = new TextView(context);
|
|
addToContactsButton.setTextColor(Theme.getColor(Theme.key_chat_addContact));
|
|
addToContactsButton.setVisibility(View.GONE);
|
|
addToContactsButton.setTextSize(TypedValue.COMPLEX_UNIT_DIP, 14);
|
|
addToContactsButton.setTypeface(AndroidUtilities.getTypeface("fonts/rmedium.ttf"));
|
|
addToContactsButton.setSingleLine(true);
|
|
addToContactsButton.setMaxLines(1);
|
|
addToContactsButton.setPadding(AndroidUtilities.dp(4), 0, AndroidUtilities.dp(4), 0);
|
|
addToContactsButton.setGravity(Gravity.CENTER);
|
|
addToContactsButton.setText(LocaleController.getString("AddContactChat", R.string.AddContactChat));
|
|
reportSpamView.addView(addToContactsButton, LayoutHelper.createLinear(LayoutHelper.MATCH_PARENT, LayoutHelper.MATCH_PARENT, 0.5f, Gravity.LEFT | Gravity.TOP, 0, 0, 0, AndroidUtilities.dp(1)));
|
|
addToContactsButton.setOnClickListener(new View.OnClickListener() {
|
|
@Override
|
|
public void onClick(View v) {
|
|
Bundle args = new Bundle();
|
|
args.putInt("user_id", currentUser.id);
|
|
args.putBoolean("addContact", true);
|
|
presentFragment(new ContactAddActivity(args));
|
|
}
|
|
});
|
|
|
|
reportSpamContainer = new FrameLayout(context);
|
|
reportSpamView.addView(reportSpamContainer, LayoutHelper.createLinear(LayoutHelper.MATCH_PARENT, LayoutHelper.MATCH_PARENT, 1.0f, Gravity.LEFT | Gravity.TOP, 0, 0, 0, AndroidUtilities.dp(1)));
|
|
|
|
reportSpamButton = new TextView(context);
|
|
reportSpamButton.setTextColor(Theme.getColor(Theme.key_chat_reportSpam));
|
|
reportSpamButton.setTextSize(TypedValue.COMPLEX_UNIT_DIP, 14);
|
|
reportSpamButton.setTypeface(AndroidUtilities.getTypeface("fonts/rmedium.ttf"));
|
|
reportSpamButton.setSingleLine(true);
|
|
reportSpamButton.setMaxLines(1);
|
|
if (currentChat != null) {
|
|
reportSpamButton.setText(LocaleController.getString("ReportSpamAndLeave", R.string.ReportSpamAndLeave));
|
|
} else {
|
|
reportSpamButton.setText(LocaleController.getString("ReportSpam", R.string.ReportSpam));
|
|
}
|
|
reportSpamButton.setGravity(Gravity.CENTER);
|
|
reportSpamButton.setPadding(AndroidUtilities.dp(50), 0, AndroidUtilities.dp(50), 0);
|
|
reportSpamContainer.addView(reportSpamButton, LayoutHelper.createFrame(LayoutHelper.MATCH_PARENT, LayoutHelper.MATCH_PARENT, Gravity.LEFT | Gravity.TOP));
|
|
reportSpamButton.setOnClickListener(new View.OnClickListener() {
|
|
@Override
|
|
public void onClick(View v) {
|
|
if (getParentActivity() == null) {
|
|
return;
|
|
}
|
|
AlertDialog.Builder builder = new AlertDialog.Builder(getParentActivity());
|
|
if (ChatObject.isChannel(currentChat) && !currentChat.megagroup) {
|
|
builder.setMessage(LocaleController.getString("ReportSpamAlertChannel", R.string.ReportSpamAlertChannel));
|
|
} else if (currentChat != null) {
|
|
builder.setMessage(LocaleController.getString("ReportSpamAlertGroup", R.string.ReportSpamAlertGroup));
|
|
} else {
|
|
builder.setMessage(LocaleController.getString("ReportSpamAlert", R.string.ReportSpamAlert));
|
|
}
|
|
builder.setTitle(LocaleController.getString("AppName", R.string.AppName));
|
|
builder.setPositiveButton(LocaleController.getString("OK", R.string.OK), new DialogInterface.OnClickListener() {
|
|
@Override
|
|
public void onClick(DialogInterface dialogInterface, int i) {
|
|
if (currentUser != null) {
|
|
MessagesController.getInstance().blockUser(currentUser.id);
|
|
}
|
|
MessagesController.getInstance().reportSpam(dialog_id, currentUser, currentChat, currentEncryptedChat);
|
|
updateSpamView();
|
|
if (currentChat != null) {
|
|
if (ChatObject.isNotInChat(currentChat)) {
|
|
MessagesController.getInstance().deleteDialog(dialog_id, 0);
|
|
} else {
|
|
MessagesController.getInstance().deleteUserFromChat((int) -dialog_id, MessagesController.getInstance().getUser(UserConfig.getClientUserId()), null);
|
|
}
|
|
} else {
|
|
MessagesController.getInstance().deleteDialog(dialog_id, 0);
|
|
}
|
|
finishFragment();
|
|
}
|
|
});
|
|
builder.setNegativeButton(LocaleController.getString("Cancel", R.string.Cancel), null);
|
|
showDialog(builder.create());
|
|
}
|
|
});
|
|
|
|
closeReportSpam = new ImageView(context);
|
|
closeReportSpam.setImageResource(R.drawable.miniplayer_close);
|
|
closeReportSpam.setColorFilter(new PorterDuffColorFilter(Theme.getColor(Theme.key_chat_topPanelClose), PorterDuff.Mode.MULTIPLY));
|
|
closeReportSpam.setScaleType(ImageView.ScaleType.CENTER);
|
|
reportSpamContainer.addView(closeReportSpam, LayoutHelper.createFrame(48, 48, Gravity.RIGHT | Gravity.TOP));
|
|
closeReportSpam.setOnClickListener(new View.OnClickListener() {
|
|
@Override
|
|
public void onClick(View v) {
|
|
MessagesController.getInstance().hideReportSpam(dialog_id, currentUser, currentChat);
|
|
updateSpamView();
|
|
}
|
|
});
|
|
|
|
alertView = new FrameLayout(context);
|
|
alertView.setTag(1);
|
|
alertView.setTranslationY(-AndroidUtilities.dp(50));
|
|
alertView.setVisibility(View.GONE);
|
|
alertView.setBackgroundResource(R.drawable.blockpanel);
|
|
alertView.getBackground().setColorFilter(new PorterDuffColorFilter(Theme.getColor(Theme.key_chat_topPanelBackground), PorterDuff.Mode.MULTIPLY));
|
|
contentView.addView(alertView, LayoutHelper.createFrame(LayoutHelper.MATCH_PARENT, 50, Gravity.TOP | Gravity.LEFT));
|
|
|
|
alertNameTextView = new TextView(context);
|
|
alertNameTextView.setTextSize(TypedValue.COMPLEX_UNIT_DIP, 14);
|
|
alertNameTextView.setTextColor(Theme.getColor(Theme.key_chat_topPanelTitle));
|
|
alertNameTextView.setTypeface(AndroidUtilities.getTypeface("fonts/rmedium.ttf"));
|
|
alertNameTextView.setSingleLine(true);
|
|
alertNameTextView.setEllipsize(TextUtils.TruncateAt.END);
|
|
alertNameTextView.setMaxLines(1);
|
|
alertView.addView(alertNameTextView, LayoutHelper.createFrame(LayoutHelper.WRAP_CONTENT, LayoutHelper.WRAP_CONTENT, Gravity.TOP | Gravity.LEFT, 8, 5, 8, 0));
|
|
|
|
alertTextView = new TextView(context);
|
|
alertTextView.setTextSize(TypedValue.COMPLEX_UNIT_DIP, 14);
|
|
alertTextView.setTextColor(Theme.getColor(Theme.key_chat_topPanelMessage));
|
|
alertTextView.setSingleLine(true);
|
|
alertTextView.setEllipsize(TextUtils.TruncateAt.END);
|
|
alertTextView.setMaxLines(1);
|
|
alertView.addView(alertTextView, LayoutHelper.createFrame(LayoutHelper.WRAP_CONTENT, LayoutHelper.WRAP_CONTENT, Gravity.TOP | Gravity.LEFT, 8, 23, 8, 0));
|
|
|
|
pagedownButton = new FrameLayout(context);
|
|
pagedownButton.setVisibility(View.INVISIBLE);
|
|
contentView.addView(pagedownButton, LayoutHelper.createFrame(46, 59, Gravity.RIGHT | Gravity.BOTTOM, 0, 0, 7, 5));
|
|
pagedownButton.setOnClickListener(new View.OnClickListener() {
|
|
@Override
|
|
public void onClick(View view) {
|
|
checkTextureViewPosition = true;
|
|
if (createUnreadMessageAfterId != 0) {
|
|
scrollToMessageId(createUnreadMessageAfterId, 0, false, returnToLoadIndex, false);
|
|
} else if (returnToMessageId > 0) {
|
|
scrollToMessageId(returnToMessageId, 0, true, returnToLoadIndex, false);
|
|
} else {
|
|
scrollToLastMessage(true);
|
|
}
|
|
}
|
|
});
|
|
|
|
mentiondownButton = new FrameLayout(context);
|
|
mentiondownButton.setVisibility(View.INVISIBLE);
|
|
contentView.addView(mentiondownButton, LayoutHelper.createFrame(46, 59, Gravity.RIGHT | Gravity.BOTTOM, 0, 0, 7, 5));
|
|
mentiondownButton.setOnClickListener(new View.OnClickListener() {
|
|
|
|
private void loadLastUnreadMention() {
|
|
if (hasAllMentionsLocal) {
|
|
MessagesStorage.getInstance().getUnreadMention(dialog_id, new MessagesStorage.IntCallback() {
|
|
@Override
|
|
public void run(int param) {
|
|
if (param == 0) {
|
|
hasAllMentionsLocal = false;
|
|
loadLastUnreadMention();
|
|
} else {
|
|
scrollToMessageId(param, 0, false, 0, false);
|
|
}
|
|
}
|
|
});
|
|
} else {
|
|
TLRPC.TL_messages_getUnreadMentions req = new TLRPC.TL_messages_getUnreadMentions();
|
|
req.peer = MessagesController.getInputPeer((int) dialog_id);
|
|
req.limit = 1;
|
|
req.add_offset = newMentionsCount - 1;
|
|
ConnectionsManager.getInstance().sendRequest(req, new RequestDelegate() {
|
|
@Override
|
|
public void run(final TLObject response, final TLRPC.TL_error error) {
|
|
AndroidUtilities.runOnUIThread(new Runnable() {
|
|
@Override
|
|
public void run() {
|
|
TLRPC.messages_Messages res = (TLRPC.messages_Messages) response;
|
|
if (error != null || res.messages.isEmpty()) {
|
|
if (res != null) {
|
|
newMentionsCount = res.count;
|
|
} else {
|
|
newMentionsCount = 0;
|
|
}
|
|
MessagesStorage.getInstance().resetMentionsCount(dialog_id, newMentionsCount);
|
|
if (newMentionsCount == 0) {
|
|
hasAllMentionsLocal = true;
|
|
showMentiondownButton(false, true);
|
|
} else {
|
|
mentiondownButtonCounter.setText(String.format("%d", newMentionsCount));
|
|
loadLastUnreadMention();
|
|
}
|
|
} else {
|
|
int id = res.messages.get(0).id;
|
|
long mid = id;
|
|
if (ChatObject.isChannel(currentChat)) {
|
|
mid = mid | (((long) currentChat.id) << 32);
|
|
}
|
|
MessageObject object = messagesDict[0].get(id);
|
|
MessagesStorage.getInstance().markMessageAsMention(mid);
|
|
if (object != null) {
|
|
object.messageOwner.media_unread = true;
|
|
object.messageOwner.mentioned = true;
|
|
}
|
|
scrollToMessageId(id, 0, false, 0, false);
|
|
}
|
|
}
|
|
});
|
|
}
|
|
});
|
|
}
|
|
}
|
|
|
|
@Override
|
|
public void onClick(View view) {
|
|
loadLastUnreadMention();
|
|
}
|
|
});
|
|
|
|
mentiondownButton.setOnLongClickListener(new View.OnLongClickListener() {
|
|
@Override
|
|
public boolean onLongClick(View view) {
|
|
for (int a = 0; a < messages.size(); a++) {
|
|
MessageObject messageObject = messages.get(a);
|
|
if (messageObject.messageOwner.mentioned && !messageObject.isContentUnread()) {
|
|
messageObject.setContentIsRead();
|
|
}
|
|
}
|
|
newMentionsCount = 0;
|
|
MessagesStorage.getInstance().resetMentionsCount(dialog_id, newMentionsCount);
|
|
hasAllMentionsLocal = true;
|
|
showMentiondownButton(false, true);
|
|
TLRPC.TL_messages_readMentions req = new TLRPC.TL_messages_readMentions();
|
|
req.peer = MessagesController.getInputPeer((int) dialog_id);
|
|
ConnectionsManager.getInstance().sendRequest(req, new RequestDelegate() {
|
|
@Override
|
|
public void run(TLObject response, TLRPC.TL_error error) {
|
|
|
|
}
|
|
});
|
|
return true;
|
|
}
|
|
});
|
|
|
|
if (!isBroadcast) {
|
|
mentionContainer = new FrameLayout(context) {
|
|
|
|
@Override
|
|
public void onDraw(Canvas canvas) {
|
|
if (mentionListView.getChildCount() <= 0) {
|
|
return;
|
|
}
|
|
if (mentionLayoutManager.getReverseLayout()) {
|
|
int top = mentionListViewScrollOffsetY + AndroidUtilities.dp(2);
|
|
int bottom = top + Theme.chat_composeShadowDrawable.getIntrinsicHeight();
|
|
Theme.chat_composeShadowDrawable.setBounds(0, bottom, getMeasuredWidth(), top);
|
|
Theme.chat_composeShadowDrawable.draw(canvas);
|
|
canvas.drawRect(0, 0, getMeasuredWidth(), top, Theme.chat_composeBackgroundPaint);
|
|
} else {
|
|
int top;
|
|
if (mentionsAdapter.isBotContext() && mentionsAdapter.isMediaLayout() && mentionsAdapter.getBotContextSwitch() == null) {
|
|
top = mentionListViewScrollOffsetY - AndroidUtilities.dp(4);
|
|
} else {
|
|
top = mentionListViewScrollOffsetY - AndroidUtilities.dp(2);
|
|
}
|
|
int bottom = top + Theme.chat_composeShadowDrawable.getIntrinsicHeight();
|
|
Theme.chat_composeShadowDrawable.setBounds(0, top, getMeasuredWidth(), bottom);
|
|
Theme.chat_composeShadowDrawable.draw(canvas);
|
|
canvas.drawRect(0, bottom, getMeasuredWidth(), getMeasuredHeight(), Theme.chat_composeBackgroundPaint);
|
|
}
|
|
}
|
|
|
|
@Override
|
|
public void requestLayout() {
|
|
if (mentionListViewIgnoreLayout) {
|
|
return;
|
|
}
|
|
super.requestLayout();
|
|
}
|
|
};
|
|
mentionContainer.setVisibility(View.GONE);
|
|
mentionContainer.setWillNotDraw(false);
|
|
contentView.addView(mentionContainer, LayoutHelper.createFrame(LayoutHelper.MATCH_PARENT, 110, Gravity.LEFT | Gravity.BOTTOM));
|
|
|
|
mentionListView = new RecyclerListView(context) {
|
|
|
|
private int lastWidth;
|
|
private int lastHeight;
|
|
|
|
@Override
|
|
public boolean onInterceptTouchEvent(MotionEvent event) {
|
|
if (mentionLayoutManager.getReverseLayout()) {
|
|
if (!mentionListViewIsScrolling && mentionListViewScrollOffsetY != 0 && event.getY() > mentionListViewScrollOffsetY) {
|
|
return false;
|
|
}
|
|
} else {
|
|
if (!mentionListViewIsScrolling && mentionListViewScrollOffsetY != 0 && event.getY() < mentionListViewScrollOffsetY) {
|
|
return false;
|
|
}
|
|
}
|
|
boolean result = StickerPreviewViewer.getInstance().onInterceptTouchEvent(event, mentionListView, 0, null);
|
|
return super.onInterceptTouchEvent(event) || result;
|
|
}
|
|
|
|
@Override
|
|
public boolean onTouchEvent(MotionEvent event) {
|
|
if (mentionLayoutManager.getReverseLayout()) {
|
|
if (!mentionListViewIsScrolling && mentionListViewScrollOffsetY != 0 && event.getY() > mentionListViewScrollOffsetY) {
|
|
return false;
|
|
}
|
|
} else {
|
|
if (!mentionListViewIsScrolling && mentionListViewScrollOffsetY != 0 && event.getY() < mentionListViewScrollOffsetY) {
|
|
return false;
|
|
}
|
|
}
|
|
//supress warning
|
|
return super.onTouchEvent(event);
|
|
}
|
|
|
|
@Override
|
|
public void requestLayout() {
|
|
if (mentionListViewIgnoreLayout) {
|
|
return;
|
|
}
|
|
super.requestLayout();
|
|
}
|
|
|
|
@Override
|
|
protected void onLayout(boolean changed, int l, int t, int r, int b) {
|
|
int width = r - l;
|
|
int height = b - t;
|
|
|
|
int newPosition = -1;
|
|
int newTop = 0;
|
|
if (!mentionLayoutManager.getReverseLayout() && mentionListView != null && mentionListViewLastViewPosition >= 0 && width == lastWidth && height - lastHeight != 0) {
|
|
newPosition = mentionListViewLastViewPosition;
|
|
newTop = mentionListViewLastViewTop + height - lastHeight - getPaddingTop();
|
|
}
|
|
|
|
super.onLayout(changed, l, t, r, b);
|
|
|
|
if (newPosition != -1) {
|
|
mentionListViewIgnoreLayout = true;
|
|
if (mentionsAdapter.isBotContext() && mentionsAdapter.isMediaLayout()) {
|
|
mentionGridLayoutManager.scrollToPositionWithOffset(newPosition, newTop);
|
|
} else {
|
|
mentionLayoutManager.scrollToPositionWithOffset(newPosition, newTop);
|
|
}
|
|
super.onLayout(false, l, t, r, b);
|
|
mentionListViewIgnoreLayout = false;
|
|
}
|
|
|
|
lastHeight = height;
|
|
lastWidth = width;
|
|
mentionListViewUpdateLayout();
|
|
}
|
|
};
|
|
mentionListView.setOnTouchListener(new View.OnTouchListener() {
|
|
@Override
|
|
public boolean onTouch(View v, MotionEvent event) {
|
|
return StickerPreviewViewer.getInstance().onTouch(event, mentionListView, 0, mentionsOnItemClickListener, null);
|
|
}
|
|
});
|
|
mentionListView.setTag(2);
|
|
mentionLayoutManager = new LinearLayoutManager(context) {
|
|
@Override
|
|
public boolean supportsPredictiveItemAnimations() {
|
|
return false;
|
|
}
|
|
};
|
|
mentionLayoutManager.setOrientation(LinearLayoutManager.VERTICAL);
|
|
mentionGridLayoutManager = new ExtendedGridLayoutManager(context, 100) {
|
|
|
|
private Size size = new Size();
|
|
|
|
@Override
|
|
protected Size getSizeForItem(int i) {
|
|
if (mentionsAdapter.getBotContextSwitch() != null) {
|
|
i++;
|
|
}
|
|
Object object = mentionsAdapter.getItem(i);
|
|
if (object instanceof TLRPC.BotInlineResult) {
|
|
TLRPC.BotInlineResult inlineResult = (TLRPC.BotInlineResult) object;
|
|
if (inlineResult.document != null) {
|
|
size.width = inlineResult.document.thumb != null ? inlineResult.document.thumb.w : 100;
|
|
size.height = inlineResult.document.thumb != null ? inlineResult.document.thumb.h : 100;
|
|
for (int b = 0; b < inlineResult.document.attributes.size(); b++) {
|
|
TLRPC.DocumentAttribute attribute = inlineResult.document.attributes.get(b);
|
|
if (attribute instanceof TLRPC.TL_documentAttributeImageSize || attribute instanceof TLRPC.TL_documentAttributeVideo) {
|
|
size.width = attribute.w;
|
|
size.height = attribute.h;
|
|
break;
|
|
}
|
|
}
|
|
} else {
|
|
size.width = inlineResult.w;
|
|
size.height = inlineResult.h;
|
|
}
|
|
}
|
|
return size;
|
|
}
|
|
|
|
@Override
|
|
protected int getFlowItemCount() {
|
|
if (mentionsAdapter.getBotContextSwitch() != null) {
|
|
return getItemCount() - 1;
|
|
}
|
|
return super.getFlowItemCount();
|
|
}
|
|
};
|
|
mentionGridLayoutManager.setSpanSizeLookup(new GridLayoutManager.SpanSizeLookup() {
|
|
@Override
|
|
public int getSpanSize(int position) {
|
|
Object object = mentionsAdapter.getItem(position);
|
|
if (object instanceof TLRPC.TL_inlineBotSwitchPM) {
|
|
return 100;
|
|
} else {
|
|
if (mentionsAdapter.getBotContextSwitch() != null) {
|
|
position--;
|
|
}
|
|
return mentionGridLayoutManager.getSpanSizeForItem(position);
|
|
}
|
|
}
|
|
});
|
|
mentionListView.addItemDecoration(new RecyclerView.ItemDecoration() {
|
|
@Override
|
|
public void getItemOffsets(Rect outRect, View view, RecyclerView parent, RecyclerView.State state) {
|
|
outRect.left = 0;
|
|
outRect.right = 0;
|
|
outRect.top = 0;
|
|
outRect.bottom = 0;
|
|
if (parent.getLayoutManager() == mentionGridLayoutManager) {
|
|
int position = parent.getChildAdapterPosition(view);
|
|
if (mentionsAdapter.getBotContextSwitch() != null) {
|
|
if (position == 0) {
|
|
return;
|
|
}
|
|
position--;
|
|
if (!mentionGridLayoutManager.isFirstRow(position)) {
|
|
outRect.top = AndroidUtilities.dp(2);
|
|
}
|
|
} else {
|
|
outRect.top = AndroidUtilities.dp(2);
|
|
}
|
|
outRect.right = mentionGridLayoutManager.isLastInRow(position) ? 0 : AndroidUtilities.dp(2);
|
|
}
|
|
}
|
|
});
|
|
mentionListView.setItemAnimator(null);
|
|
mentionListView.setLayoutAnimation(null);
|
|
mentionListView.setClipToPadding(false);
|
|
mentionListView.setLayoutManager(mentionLayoutManager);
|
|
mentionListView.setOverScrollMode(RecyclerListView.OVER_SCROLL_NEVER);
|
|
mentionContainer.addView(mentionListView, LayoutHelper.createFrame(LayoutHelper.MATCH_PARENT, LayoutHelper.MATCH_PARENT));
|
|
|
|
mentionListView.setAdapter(mentionsAdapter = new MentionsAdapter(context, false, dialog_id, new MentionsAdapter.MentionsAdapterDelegate() {
|
|
@Override
|
|
public void needChangePanelVisibility(boolean show) {
|
|
if (mentionsAdapter.isBotContext() && mentionsAdapter.isMediaLayout()) {
|
|
mentionListView.setLayoutManager(mentionGridLayoutManager);
|
|
} else {
|
|
mentionListView.setLayoutManager(mentionLayoutManager);
|
|
}
|
|
if (show && bottomOverlay.getVisibility() == View.VISIBLE) {
|
|
show = false;
|
|
}
|
|
if (show) {
|
|
if (mentionListAnimation != null) {
|
|
mentionListAnimation.cancel();
|
|
mentionListAnimation = null;
|
|
}
|
|
|
|
if (mentionContainer.getVisibility() == View.VISIBLE) {
|
|
mentionContainer.setAlpha(1.0f);
|
|
return;
|
|
}
|
|
if (mentionsAdapter.isBotContext() && mentionsAdapter.isMediaLayout()) {
|
|
mentionGridLayoutManager.scrollToPositionWithOffset(0, 10000);
|
|
} else {
|
|
mentionLayoutManager.scrollToPositionWithOffset(0, 10000);
|
|
}
|
|
if (allowStickersPanel && (!mentionsAdapter.isBotContext() || (allowContextBotPanel || allowContextBotPanelSecond))) {
|
|
if (currentEncryptedChat != null && mentionsAdapter.isBotContext()) {
|
|
SharedPreferences preferences = ApplicationLoader.applicationContext.getSharedPreferences("mainconfig", Activity.MODE_PRIVATE);
|
|
if (!preferences.getBoolean("secretbot", false)) {
|
|
AlertDialog.Builder builder = new AlertDialog.Builder(getParentActivity());
|
|
builder.setTitle(LocaleController.getString("AppName", R.string.AppName));
|
|
builder.setMessage(LocaleController.getString("SecretChatContextBotAlert", R.string.SecretChatContextBotAlert));
|
|
builder.setPositiveButton(LocaleController.getString("OK", R.string.OK), null);
|
|
showDialog(builder.create());
|
|
preferences.edit().putBoolean("secretbot", true).commit();
|
|
}
|
|
}
|
|
mentionContainer.setVisibility(View.VISIBLE);
|
|
mentionContainer.setTag(null);
|
|
mentionListAnimation = new AnimatorSet();
|
|
mentionListAnimation.playTogether(
|
|
ObjectAnimator.ofFloat(mentionContainer, "alpha", 0.0f, 1.0f)
|
|
);
|
|
mentionListAnimation.addListener(new AnimatorListenerAdapter() {
|
|
@Override
|
|
public void onAnimationEnd(Animator animation) {
|
|
if (mentionListAnimation != null && mentionListAnimation.equals(animation)) {
|
|
mentionListAnimation = null;
|
|
}
|
|
}
|
|
|
|
@Override
|
|
public void onAnimationCancel(Animator animation) {
|
|
if (mentionListAnimation != null && mentionListAnimation.equals(animation)) {
|
|
mentionListAnimation = null;
|
|
}
|
|
}
|
|
});
|
|
mentionListAnimation.setDuration(200);
|
|
mentionListAnimation.start();
|
|
} else {
|
|
mentionContainer.setAlpha(1.0f);
|
|
mentionContainer.setVisibility(View.INVISIBLE);
|
|
}
|
|
} else {
|
|
if (mentionListAnimation != null) {
|
|
mentionListAnimation.cancel();
|
|
mentionListAnimation = null;
|
|
}
|
|
|
|
if (mentionContainer.getVisibility() == View.GONE) {
|
|
return;
|
|
}
|
|
if (allowStickersPanel) {
|
|
mentionListAnimation = new AnimatorSet();
|
|
mentionListAnimation.playTogether(
|
|
ObjectAnimator.ofFloat(mentionContainer, "alpha", 0.0f)
|
|
);
|
|
mentionListAnimation.addListener(new AnimatorListenerAdapter() {
|
|
@Override
|
|
public void onAnimationEnd(Animator animation) {
|
|
if (mentionListAnimation != null && mentionListAnimation.equals(animation)) {
|
|
mentionContainer.setVisibility(View.GONE);
|
|
mentionContainer.setTag(null);
|
|
mentionListAnimation = null;
|
|
}
|
|
}
|
|
|
|
@Override
|
|
public void onAnimationCancel(Animator animation) {
|
|
if (mentionListAnimation != null && mentionListAnimation.equals(animation)) {
|
|
mentionListAnimation = null;
|
|
}
|
|
}
|
|
});
|
|
mentionListAnimation.setDuration(200);
|
|
mentionListAnimation.start();
|
|
} else {
|
|
mentionContainer.setTag(null);
|
|
mentionContainer.setVisibility(View.GONE);
|
|
}
|
|
}
|
|
}
|
|
|
|
@Override
|
|
public void onContextSearch(boolean searching) {
|
|
if (chatActivityEnterView != null) {
|
|
chatActivityEnterView.setCaption(mentionsAdapter.getBotCaption());
|
|
chatActivityEnterView.showContextProgress(searching);
|
|
}
|
|
}
|
|
|
|
@Override
|
|
public void onContextClick(TLRPC.BotInlineResult result) {
|
|
if (getParentActivity() == null || result.content_url == null) {
|
|
return;
|
|
}
|
|
if (result.type.equals("video") || result.type.equals("web_player_video")) {
|
|
EmbedBottomSheet.show(getParentActivity(), result.title != null ? result.title : "", result.description, result.content_url, result.content_url, result.w, result.h);
|
|
} else {
|
|
Browser.openUrl(getParentActivity(), result.content_url);
|
|
}
|
|
}
|
|
}));
|
|
if (!ChatObject.isChannel(currentChat) || currentChat != null && currentChat.megagroup) {
|
|
mentionsAdapter.setBotInfo(botInfo);
|
|
}
|
|
mentionsAdapter.setParentFragment(this);
|
|
mentionsAdapter.setChatInfo(info);
|
|
mentionsAdapter.setNeedUsernames(currentChat != null);
|
|
mentionsAdapter.setNeedBotContext(currentEncryptedChat == null || AndroidUtilities.getPeerLayerVersion(currentEncryptedChat.layer) >= 46);
|
|
mentionsAdapter.setBotsCount(currentChat != null ? botsCount : 1);
|
|
mentionListView.setOnItemClickListener(mentionsOnItemClickListener = new RecyclerListView.OnItemClickListener() {
|
|
@Override
|
|
public void onItemClick(View view, int position) {
|
|
if (mentionsAdapter.isBannedInline()) {
|
|
return;
|
|
}
|
|
Object object = mentionsAdapter.getItem(position);
|
|
int start = mentionsAdapter.getResultStartPosition();
|
|
int len = mentionsAdapter.getResultLength();
|
|
if (object instanceof TLRPC.User) {
|
|
if (searchingForUser && searchContainer.getVisibility() == View.VISIBLE) {
|
|
searchingUserMessages = (TLRPC.User) object;
|
|
if (searchingUserMessages == null) {
|
|
return;
|
|
}
|
|
String name = searchingUserMessages.first_name;
|
|
if (TextUtils.isEmpty(name)) {
|
|
name = searchingUserMessages.last_name;
|
|
}
|
|
searchingForUser = false;
|
|
String from = LocaleController.getString("SearchFrom", R.string.SearchFrom);
|
|
Spannable spannable = new SpannableString(from + " " + name);
|
|
spannable.setSpan(new ForegroundColorSpan(Theme.getColor(Theme.key_actionBarDefaultSubtitle)), from.length() + 1, spannable.length(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
|
|
searchItem.setSearchFieldCaption(spannable);
|
|
mentionsAdapter.searchUsernameOrHashtag(null, 0, null, false);
|
|
searchItem.getSearchField().setHint(null);
|
|
searchItem.clearSearchText();
|
|
MessagesSearchQuery.searchMessagesInChat("", dialog_id, mergeDialogId, classGuid, 0, searchingUserMessages);
|
|
} else {
|
|
TLRPC.User user = (TLRPC.User) object;
|
|
if (user != null) {
|
|
if (user.username != null) {
|
|
chatActivityEnterView.replaceWithText(start, len, "@" + user.username + " ", false);
|
|
} else {
|
|
String name = UserObject.getFirstName(user);
|
|
Spannable spannable = new SpannableString(name + " ");
|
|
spannable.setSpan(new URLSpanUserMention("" + user.id, true), 0, spannable.length(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
|
|
chatActivityEnterView.replaceWithText(start, len, spannable, false);
|
|
}
|
|
}
|
|
}
|
|
} else if (object instanceof String) {
|
|
if (mentionsAdapter.isBotCommands()) {
|
|
SendMessagesHelper.getInstance().sendMessage((String) object, dialog_id, replyingMessageObject, null, false, null, null, null);
|
|
chatActivityEnterView.setFieldText("");
|
|
showReplyPanel(false, null, null, null, false);
|
|
} else {
|
|
chatActivityEnterView.replaceWithText(start, len, object + " ", false);
|
|
}
|
|
} else if (object instanceof TLRPC.BotInlineResult) {
|
|
if (chatActivityEnterView.getFieldText() == null) {
|
|
return;
|
|
}
|
|
TLRPC.BotInlineResult result = (TLRPC.BotInlineResult) object;
|
|
if ((result.type.equals("photo") && (result.photo != null || result.content_url != null) ||
|
|
result.type.equals("gif") && (result.document != null || result.content_url != null) ||
|
|
result.type.equals("video") && (result.document != null/* || result.content_url != null*/))) {
|
|
ArrayList<Object> arrayList = botContextResults = new ArrayList<Object>(mentionsAdapter.getSearchResultBotContext());
|
|
PhotoViewer.getInstance().setParentActivity(getParentActivity());
|
|
PhotoViewer.getInstance().openPhotoForSelect(arrayList, mentionsAdapter.getItemPosition(position), 3, botContextProvider, null);
|
|
} else {
|
|
sendBotInlineResult(result);
|
|
}
|
|
} else if (object instanceof TLRPC.TL_inlineBotSwitchPM) {
|
|
processInlineBotContextPM((TLRPC.TL_inlineBotSwitchPM) object);
|
|
} else if (object instanceof EmojiSuggestion) {
|
|
String code = ((EmojiSuggestion) object).emoji;
|
|
chatActivityEnterView.addEmojiToRecent(code);
|
|
chatActivityEnterView.replaceWithText(start, len, code, true);
|
|
}
|
|
}
|
|
});
|
|
|
|
mentionListView.setOnItemLongClickListener(new RecyclerListView.OnItemLongClickListener() {
|
|
@Override
|
|
public boolean onItemClick(View view, int position) {
|
|
if (getParentActivity() == null || !mentionsAdapter.isLongClickEnabled()) {
|
|
return false;
|
|
}
|
|
Object object = mentionsAdapter.getItem(position);
|
|
if (object instanceof String) {
|
|
if (mentionsAdapter.isBotCommands()) {
|
|
if (URLSpanBotCommand.enabled) {
|
|
chatActivityEnterView.setFieldText("");
|
|
chatActivityEnterView.setCommand(null, (String) object, true, currentChat != null && currentChat.megagroup);
|
|
return true;
|
|
}
|
|
return false;
|
|
} else {
|
|
AlertDialog.Builder builder = new AlertDialog.Builder(getParentActivity());
|
|
builder.setTitle(LocaleController.getString("AppName", R.string.AppName));
|
|
builder.setMessage(LocaleController.getString("ClearSearch", R.string.ClearSearch));
|
|
builder.setPositiveButton(LocaleController.getString("ClearButton", R.string.ClearButton).toUpperCase(), new DialogInterface.OnClickListener() {
|
|
@Override
|
|
public void onClick(DialogInterface dialogInterface, int i) {
|
|
mentionsAdapter.clearRecentHashtags();
|
|
}
|
|
});
|
|
builder.setNegativeButton(LocaleController.getString("Cancel", R.string.Cancel), null);
|
|
showDialog(builder.create());
|
|
return true;
|
|
}
|
|
}
|
|
return false;
|
|
}
|
|
});
|
|
|
|
mentionListView.setOnScrollListener(new RecyclerView.OnScrollListener() {
|
|
|
|
@Override
|
|
public void onScrollStateChanged(RecyclerView recyclerView, int newState) {
|
|
mentionListViewIsScrolling = newState == RecyclerView.SCROLL_STATE_DRAGGING;
|
|
}
|
|
|
|
@Override
|
|
public void onScrolled(RecyclerView recyclerView, int dx, int dy) {
|
|
int lastVisibleItem;
|
|
if (mentionsAdapter.isBotContext() && mentionsAdapter.isMediaLayout()) {
|
|
lastVisibleItem = mentionGridLayoutManager.findLastVisibleItemPosition();
|
|
} else {
|
|
lastVisibleItem = mentionLayoutManager.findLastVisibleItemPosition();
|
|
}
|
|
int visibleItemCount = lastVisibleItem == RecyclerView.NO_POSITION ? 0 : lastVisibleItem;
|
|
if (visibleItemCount > 0 && lastVisibleItem > mentionsAdapter.getItemCount() - 5) {
|
|
mentionsAdapter.searchForContextBotForNextOffset();
|
|
}
|
|
mentionListViewUpdateLayout();
|
|
}
|
|
});
|
|
}
|
|
|
|
pagedownButtonImage = new ImageView(context);
|
|
pagedownButtonImage.setImageResource(R.drawable.pagedown);
|
|
pagedownButtonImage.setScaleType(ImageView.ScaleType.CENTER);
|
|
pagedownButtonImage.setColorFilter(new PorterDuffColorFilter(Theme.getColor(Theme.key_chat_goDownButtonIcon), PorterDuff.Mode.MULTIPLY));
|
|
pagedownButtonImage.setPadding(0, AndroidUtilities.dp(2), 0, 0);
|
|
Drawable drawable = Theme.createCircleDrawable(AndroidUtilities.dp(42), Theme.getColor(Theme.key_chat_goDownButton));
|
|
Drawable shadowDrawable = context.getResources().getDrawable(R.drawable.pagedown_shadow).mutate();
|
|
shadowDrawable.setColorFilter(new PorterDuffColorFilter(Theme.getColor(Theme.key_chat_goDownButtonShadow), PorterDuff.Mode.MULTIPLY));
|
|
CombinedDrawable combinedDrawable = new CombinedDrawable(shadowDrawable, drawable, 0, 0);
|
|
combinedDrawable.setIconSize(AndroidUtilities.dp(42), AndroidUtilities.dp(42));
|
|
drawable = combinedDrawable;
|
|
pagedownButtonImage.setBackgroundDrawable(drawable);
|
|
|
|
pagedownButton.addView(pagedownButtonImage, LayoutHelper.createFrame(46, 46, Gravity.LEFT | Gravity.BOTTOM));
|
|
|
|
pagedownButtonCounter = new TextView(context);
|
|
pagedownButtonCounter.setVisibility(View.INVISIBLE);
|
|
pagedownButtonCounter.setTypeface(AndroidUtilities.getTypeface("fonts/rmedium.ttf"));
|
|
pagedownButtonCounter.setTextSize(TypedValue.COMPLEX_UNIT_DIP, 13);
|
|
pagedownButtonCounter.setTextColor(Theme.getColor(Theme.key_chat_goDownButtonCounter));
|
|
pagedownButtonCounter.setGravity(Gravity.CENTER);
|
|
pagedownButtonCounter.setBackgroundDrawable(Theme.createRoundRectDrawable(AndroidUtilities.dp(11.5f), Theme.getColor(Theme.key_chat_goDownButtonCounterBackground)));
|
|
pagedownButtonCounter.setMinWidth(AndroidUtilities.dp(23));
|
|
pagedownButtonCounter.setPadding(AndroidUtilities.dp(8), 0, AndroidUtilities.dp(8), AndroidUtilities.dp(1));
|
|
pagedownButton.addView(pagedownButtonCounter, LayoutHelper.createFrame(LayoutHelper.WRAP_CONTENT, 23, Gravity.TOP | Gravity.CENTER_HORIZONTAL));
|
|
|
|
mentiondownButtonImage = new ImageView(context);
|
|
mentiondownButtonImage.setImageResource(R.drawable.mentionbutton);
|
|
mentiondownButtonImage.setScaleType(ImageView.ScaleType.CENTER);
|
|
mentiondownButtonImage.setColorFilter(new PorterDuffColorFilter(Theme.getColor(Theme.key_chat_goDownButtonIcon), PorterDuff.Mode.MULTIPLY));
|
|
mentiondownButtonImage.setPadding(0, AndroidUtilities.dp(2), 0, 0);
|
|
drawable = Theme.createCircleDrawable(AndroidUtilities.dp(42), Theme.getColor(Theme.key_chat_goDownButton));
|
|
shadowDrawable = context.getResources().getDrawable(R.drawable.pagedown_shadow).mutate();
|
|
shadowDrawable.setColorFilter(new PorterDuffColorFilter(Theme.getColor(Theme.key_chat_goDownButtonShadow), PorterDuff.Mode.MULTIPLY));
|
|
combinedDrawable = new CombinedDrawable(shadowDrawable, drawable, 0, 0);
|
|
combinedDrawable.setIconSize(AndroidUtilities.dp(42), AndroidUtilities.dp(42));
|
|
drawable = combinedDrawable;
|
|
mentiondownButtonImage.setBackgroundDrawable(drawable);
|
|
|
|
mentiondownButton.addView(mentiondownButtonImage, LayoutHelper.createFrame(46, 46, Gravity.LEFT | Gravity.BOTTOM));
|
|
|
|
mentiondownButtonCounter = new TextView(context);
|
|
mentiondownButtonCounter.setVisibility(View.INVISIBLE);
|
|
mentiondownButtonCounter.setTypeface(AndroidUtilities.getTypeface("fonts/rmedium.ttf"));
|
|
mentiondownButtonCounter.setTextSize(TypedValue.COMPLEX_UNIT_DIP, 13);
|
|
mentiondownButtonCounter.setTextColor(Theme.getColor(Theme.key_chat_goDownButtonCounter));
|
|
mentiondownButtonCounter.setGravity(Gravity.CENTER);
|
|
mentiondownButtonCounter.setBackgroundDrawable(Theme.createRoundRectDrawable(AndroidUtilities.dp(11.5f), Theme.getColor(Theme.key_chat_goDownButtonCounterBackground)));
|
|
mentiondownButtonCounter.setMinWidth(AndroidUtilities.dp(23));
|
|
mentiondownButtonCounter.setPadding(AndroidUtilities.dp(8), 0, AndroidUtilities.dp(8), AndroidUtilities.dp(1));
|
|
mentiondownButton.addView(mentiondownButtonCounter, LayoutHelper.createFrame(LayoutHelper.WRAP_CONTENT, 23, Gravity.TOP | Gravity.CENTER_HORIZONTAL));
|
|
|
|
if (!AndroidUtilities.isTablet() || AndroidUtilities.isSmallTablet()) {
|
|
contentView.addView(fragmentLocationContextView = new FragmentContextView(context, this, true), LayoutHelper.createFrame(LayoutHelper.MATCH_PARENT, 39, Gravity.TOP | Gravity.LEFT, 0, -36, 0, 0));
|
|
contentView.addView(fragmentContextView = new FragmentContextView(context, this, false), LayoutHelper.createFrame(LayoutHelper.MATCH_PARENT, 39, Gravity.TOP | Gravity.LEFT, 0, -36, 0, 0));
|
|
fragmentContextView.setAdditionalContextView(fragmentLocationContextView);
|
|
fragmentLocationContextView.setAdditionalContextView(fragmentContextView);
|
|
}
|
|
|
|
contentView.addView(actionBar);
|
|
|
|
overlayView = new View(context);
|
|
overlayView.setOnTouchListener(new View.OnTouchListener() {
|
|
@Override
|
|
public boolean onTouch(View v, MotionEvent event) {
|
|
if (event.getAction() == MotionEvent.ACTION_DOWN) {
|
|
checkRecordLocked();
|
|
}
|
|
overlayView.getParent().requestDisallowInterceptTouchEvent(true);
|
|
return true;
|
|
}
|
|
});
|
|
contentView.addView(overlayView, LayoutHelper.createFrame(LayoutHelper.MATCH_PARENT, LayoutHelper.MATCH_PARENT, Gravity.LEFT | Gravity.TOP));
|
|
overlayView.setVisibility(View.GONE);
|
|
|
|
instantCameraView = new InstantCameraView(context, this);
|
|
contentView.addView(instantCameraView, LayoutHelper.createFrame(LayoutHelper.MATCH_PARENT, LayoutHelper.MATCH_PARENT, Gravity.LEFT | Gravity.TOP));
|
|
|
|
chatActivityEnterView = new ChatActivityEnterView(getParentActivity(), contentView, this, true);
|
|
chatActivityEnterView.setDialogId(dialog_id);
|
|
chatActivityEnterView.setId(id_chat_compose_panel);
|
|
chatActivityEnterView.setBotsCount(botsCount, hasBotsCommands);
|
|
chatActivityEnterView.setAllowStickersAndGifs(currentEncryptedChat == null || AndroidUtilities.getPeerLayerVersion(currentEncryptedChat.layer) >= 23, currentEncryptedChat == null || AndroidUtilities.getPeerLayerVersion(currentEncryptedChat.layer) >= 46);
|
|
contentView.addView(chatActivityEnterView, contentView.getChildCount() - 1, LayoutHelper.createFrame(LayoutHelper.MATCH_PARENT, LayoutHelper.WRAP_CONTENT, Gravity.LEFT | Gravity.BOTTOM));
|
|
chatActivityEnterView.setDelegate(new ChatActivityEnterView.ChatActivityEnterViewDelegate() {
|
|
@Override
|
|
public void onMessageSend(CharSequence message) {
|
|
moveScrollToLastMessage();
|
|
showReplyPanel(false, null, null, null, false);
|
|
if (mentionsAdapter != null) {
|
|
mentionsAdapter.addHashtagsFromMessage(message);
|
|
}
|
|
}
|
|
|
|
@Override
|
|
public void onSwitchRecordMode(boolean video) {
|
|
showVoiceHint(false, video);
|
|
}
|
|
|
|
@Override
|
|
public void onPreAudioVideoRecord() {
|
|
showVoiceHint(true, false);
|
|
}
|
|
|
|
@Override
|
|
public void onTextChanged(final CharSequence text, boolean bigChange) {
|
|
if (startReplyOnTextChange && text.length() > 0) {
|
|
actionBar.getActionBarMenuOnItemClick().onItemClick(reply);
|
|
startReplyOnTextChange = false;
|
|
}
|
|
MediaController.getInstance().setInputFieldHasText(!TextUtils.isEmpty(text) || chatActivityEnterView.isEditingMessage());
|
|
if (stickersAdapter != null && !chatActivityEnterView.isEditingMessage() && ChatObject.canSendStickers(currentChat)) {
|
|
stickersAdapter.loadStikersForEmoji(text);
|
|
}
|
|
if (mentionsAdapter != null) {
|
|
mentionsAdapter.searchUsernameOrHashtag(text.toString(), chatActivityEnterView.getCursorPosition(), messages, false);
|
|
}
|
|
if (waitingForCharaterEnterRunnable != null) {
|
|
AndroidUtilities.cancelRunOnUIThread(waitingForCharaterEnterRunnable);
|
|
waitingForCharaterEnterRunnable = null;
|
|
}
|
|
if (ChatObject.canSendEmbed(currentChat) && chatActivityEnterView.isMessageWebPageSearchEnabled() && (!chatActivityEnterView.isEditingMessage() || !chatActivityEnterView.isEditingCaption())) {
|
|
if (bigChange) {
|
|
searchLinks(text, true);
|
|
} else {
|
|
waitingForCharaterEnterRunnable = new Runnable() {
|
|
@Override
|
|
public void run() {
|
|
if (this == waitingForCharaterEnterRunnable) {
|
|
searchLinks(text, false);
|
|
waitingForCharaterEnterRunnable = null;
|
|
}
|
|
}
|
|
};
|
|
AndroidUtilities.runOnUIThread(waitingForCharaterEnterRunnable, AndroidUtilities.WEB_URL == null ? 3000 : 1000);
|
|
}
|
|
}
|
|
}
|
|
|
|
@Override
|
|
public void needSendTyping() {
|
|
MessagesController.getInstance().sendTyping(dialog_id, 0, classGuid);
|
|
}
|
|
|
|
@Override
|
|
public void onAttachButtonHidden() {
|
|
if (actionBar.isSearchFieldVisible()) {
|
|
return;
|
|
}
|
|
if (attachItem != null) {
|
|
attachItem.setVisibility(View.VISIBLE);
|
|
}
|
|
if (headerItem != null) {
|
|
headerItem.setVisibility(View.GONE);
|
|
}
|
|
}
|
|
|
|
@Override
|
|
public void onAttachButtonShow() {
|
|
if (actionBar.isSearchFieldVisible()) {
|
|
return;
|
|
}
|
|
if (attachItem != null) {
|
|
attachItem.setVisibility(View.GONE);
|
|
}
|
|
if (headerItem != null) {
|
|
headerItem.setVisibility(View.VISIBLE);
|
|
}
|
|
}
|
|
|
|
@Override
|
|
public void onMessageEditEnd(boolean loading) {
|
|
if (!loading) {
|
|
mentionsAdapter.setNeedBotContext(currentEncryptedChat == null || AndroidUtilities.getPeerLayerVersion(currentEncryptedChat.layer) >= 46);
|
|
chatListView.setOnItemLongClickListener(onItemLongClickListener);
|
|
chatListView.setOnItemClickListener(onItemClickListener);
|
|
chatListView.setClickable(true);
|
|
chatListView.setLongClickable(true);
|
|
mentionsAdapter.setAllowNewMentions(true);
|
|
actionModeTitleContainer.setVisibility(View.GONE);
|
|
selectedMessagesCountTextView.setVisibility(View.VISIBLE);
|
|
chatActivityEnterView.setAllowStickersAndGifs(currentEncryptedChat == null || AndroidUtilities.getPeerLayerVersion(currentEncryptedChat.layer) >= 23, currentEncryptedChat == null || AndroidUtilities.getPeerLayerVersion(currentEncryptedChat.layer) >= 46);
|
|
if (editingMessageObjectReqId != 0) {
|
|
ConnectionsManager.getInstance().cancelRequest(editingMessageObjectReqId, true);
|
|
editingMessageObjectReqId = 0;
|
|
}
|
|
actionBar.hideActionMode();
|
|
updatePinnedMessageView(true);
|
|
updateBottomOverlay();
|
|
updateVisibleRows();
|
|
}
|
|
}
|
|
|
|
@Override
|
|
public void onWindowSizeChanged(int size) {
|
|
if (size < AndroidUtilities.dp(72) + ActionBar.getCurrentActionBarHeight()) {
|
|
allowStickersPanel = false;
|
|
if (stickersPanel.getVisibility() == View.VISIBLE) {
|
|
stickersPanel.setVisibility(View.INVISIBLE);
|
|
}
|
|
if (mentionContainer != null && mentionContainer.getVisibility() == View.VISIBLE) {
|
|
mentionContainer.setVisibility(View.INVISIBLE);
|
|
}
|
|
} else {
|
|
allowStickersPanel = true;
|
|
if (stickersPanel.getVisibility() == View.INVISIBLE) {
|
|
stickersPanel.setVisibility(View.VISIBLE);
|
|
}
|
|
if (mentionContainer != null && mentionContainer.getVisibility() == View.INVISIBLE && (!mentionsAdapter.isBotContext() || (allowContextBotPanel || allowContextBotPanelSecond))) {
|
|
mentionContainer.setVisibility(View.VISIBLE);
|
|
mentionContainer.setTag(null);
|
|
}
|
|
}
|
|
|
|
allowContextBotPanel = !chatActivityEnterView.isPopupShowing();
|
|
checkContextBotPanel();
|
|
}
|
|
|
|
@Override
|
|
public void onStickersTab(boolean opened) {
|
|
if (emojiButtonRed != null) {
|
|
emojiButtonRed.setVisibility(View.GONE);
|
|
}
|
|
allowContextBotPanelSecond = !opened;
|
|
checkContextBotPanel();
|
|
}
|
|
|
|
@Override
|
|
public void didPressedAttachButton() {
|
|
openAttachMenu();
|
|
}
|
|
|
|
@Override
|
|
public void needStartRecordVideo(int state) {
|
|
if (instantCameraView != null) {
|
|
if (state == 0) {
|
|
instantCameraView.showCamera();
|
|
} else if (state == 1 || state == 3 || state == 4) {
|
|
instantCameraView.send(state);
|
|
} else if (state == 2) {
|
|
instantCameraView.cancel();
|
|
}
|
|
}
|
|
}
|
|
|
|
@Override
|
|
public void needChangeVideoPreviewState(int state, float seekProgress) {
|
|
if (instantCameraView != null) {
|
|
instantCameraView.changeVideoPreviewState(state, seekProgress);
|
|
}
|
|
}
|
|
|
|
@Override
|
|
public void needStartRecordAudio(int state) {
|
|
overlayView.setVisibility(state == 0 ? View.GONE : View.VISIBLE);
|
|
}
|
|
|
|
@Override
|
|
public void needShowMediaBanHint() {
|
|
showMediaBannedHint();
|
|
}
|
|
});
|
|
|
|
FrameLayout replyLayout = new FrameLayout(context) {
|
|
@Override
|
|
public void setTranslationY(float translationY) {
|
|
super.setTranslationY(translationY);
|
|
if (chatActivityEnterView != null) {
|
|
chatActivityEnterView.invalidate();
|
|
}
|
|
if (getVisibility() != GONE) {
|
|
int height = getLayoutParams().height;
|
|
if (chatListView != null) {
|
|
chatListView.setTranslationY(translationY);
|
|
}
|
|
if (progressView != null) {
|
|
progressView.setTranslationY(translationY);
|
|
}
|
|
if (mentionContainer != null) {
|
|
mentionContainer.setTranslationY(translationY);
|
|
}
|
|
if (pagedownButton != null) {
|
|
pagedownButton.setTranslationY(translationY);
|
|
}
|
|
if (mentiondownButton != null) {
|
|
mentiondownButton.setTranslationY(pagedownButton.getVisibility() != VISIBLE ? translationY : translationY - AndroidUtilities.dp(72));
|
|
}
|
|
}
|
|
}
|
|
|
|
@Override
|
|
public boolean hasOverlappingRendering() {
|
|
return false;
|
|
}
|
|
|
|
@Override
|
|
public void setVisibility(int visibility) {
|
|
super.setVisibility(visibility);
|
|
if (visibility == GONE) {
|
|
if (chatListView != null) {
|
|
chatListView.setTranslationY(0);
|
|
}
|
|
if (progressView != null) {
|
|
progressView.setTranslationY(0);
|
|
}
|
|
if (mentionContainer != null) {
|
|
mentionContainer.setTranslationY(0);
|
|
}
|
|
if (pagedownButton != null) {
|
|
pagedownButton.setTranslationY(pagedownButton.getTag() == null ? AndroidUtilities.dp(100) : 0);
|
|
}
|
|
if (mentiondownButton != null) {
|
|
mentiondownButton.setTranslationY(mentiondownButton.getTag() == null ? AndroidUtilities.dp(100) : (pagedownButton.getVisibility() == VISIBLE ? -AndroidUtilities.dp(72) : 0));
|
|
}
|
|
}
|
|
}
|
|
};
|
|
chatActivityEnterView.addTopView(replyLayout, 48);
|
|
replyLayout.setOnClickListener(new View.OnClickListener() {
|
|
@Override
|
|
public void onClick(View v) {
|
|
if (replyingMessageObject != null) {
|
|
scrollToMessageId(replyingMessageObject.getId(), 0, true, 0, false);
|
|
}
|
|
}
|
|
});
|
|
|
|
replyLineView = new View(context);
|
|
replyLineView.setBackgroundColor(Theme.getColor(Theme.key_chat_replyPanelLine));
|
|
replyLayout.addView(replyLineView, LayoutHelper.createFrame(LayoutHelper.MATCH_PARENT, 1, Gravity.BOTTOM | Gravity.LEFT));
|
|
|
|
replyIconImageView = new ImageView(context);
|
|
replyIconImageView.setColorFilter(new PorterDuffColorFilter(Theme.getColor(Theme.key_chat_replyPanelIcons), PorterDuff.Mode.MULTIPLY));
|
|
replyIconImageView.setScaleType(ImageView.ScaleType.CENTER);
|
|
replyLayout.addView(replyIconImageView, LayoutHelper.createFrame(52, 46, Gravity.TOP | Gravity.LEFT));
|
|
|
|
replyCloseImageView = new ImageView(context);
|
|
replyCloseImageView.setColorFilter(new PorterDuffColorFilter(Theme.getColor(Theme.key_chat_replyPanelClose), PorterDuff.Mode.MULTIPLY));
|
|
replyCloseImageView.setImageResource(R.drawable.msg_panel_clear);
|
|
replyCloseImageView.setScaleType(ImageView.ScaleType.CENTER);
|
|
replyLayout.addView(replyCloseImageView, LayoutHelper.createFrame(52, 46, Gravity.RIGHT | Gravity.TOP, 0, 0.5f, 0, 0));
|
|
replyCloseImageView.setOnClickListener(new View.OnClickListener() {
|
|
@Override
|
|
public void onClick(View v) {
|
|
if (forwardingMessages != null) {
|
|
forwardingMessages.clear();
|
|
}
|
|
showReplyPanel(false, null, null, foundWebPage, true);
|
|
}
|
|
});
|
|
|
|
replyNameTextView = new SimpleTextView(context);
|
|
replyNameTextView.setTextSize(14);
|
|
replyNameTextView.setTextColor(Theme.getColor(Theme.key_chat_replyPanelName));
|
|
replyNameTextView.setTypeface(AndroidUtilities.getTypeface("fonts/rmedium.ttf"));
|
|
replyLayout.addView(replyNameTextView, LayoutHelper.createFrame(LayoutHelper.MATCH_PARENT, 18, Gravity.TOP | Gravity.LEFT, 52, 6, 52, 0));
|
|
|
|
replyObjectTextView = new SimpleTextView(context);
|
|
replyObjectTextView.setTextSize(14);
|
|
replyObjectTextView.setTextColor(Theme.getColor(Theme.key_chat_replyPanelMessage));
|
|
replyLayout.addView(replyObjectTextView, LayoutHelper.createFrame(LayoutHelper.MATCH_PARENT, 18, Gravity.TOP | Gravity.LEFT, 52, 24, 52, 0));
|
|
|
|
replyImageView = new BackupImageView(context);
|
|
replyLayout.addView(replyImageView, LayoutHelper.createFrame(34, 34, Gravity.TOP | Gravity.LEFT, 52, 6, 0, 0));
|
|
|
|
stickersPanel = new FrameLayout(context);
|
|
stickersPanel.setVisibility(View.GONE);
|
|
contentView.addView(stickersPanel, LayoutHelper.createFrame(LayoutHelper.WRAP_CONTENT, 81.5f, Gravity.LEFT | Gravity.BOTTOM, 0, 0, 0, 38));
|
|
|
|
stickersListView = new RecyclerListView(context) {
|
|
@Override
|
|
public boolean onInterceptTouchEvent(MotionEvent event) {
|
|
boolean result = StickerPreviewViewer.getInstance().onInterceptTouchEvent(event, stickersListView, 0, null);
|
|
return super.onInterceptTouchEvent(event) || result;
|
|
}
|
|
};
|
|
stickersListView.setTag(3);
|
|
stickersListView.setOnTouchListener(new View.OnTouchListener() {
|
|
@Override
|
|
public boolean onTouch(View v, MotionEvent event) {
|
|
return StickerPreviewViewer.getInstance().onTouch(event, stickersListView, 0, stickersOnItemClickListener, null);
|
|
}
|
|
});
|
|
stickersListView.setDisallowInterceptTouchEvents(true);
|
|
LinearLayoutManager layoutManager = new LinearLayoutManager(context);
|
|
layoutManager.setOrientation(LinearLayoutManager.HORIZONTAL);
|
|
stickersListView.setLayoutManager(layoutManager);
|
|
stickersListView.setClipToPadding(false);
|
|
stickersListView.setOverScrollMode(RecyclerListView.OVER_SCROLL_NEVER);
|
|
stickersPanel.addView(stickersListView, LayoutHelper.createFrame(LayoutHelper.MATCH_PARENT, 78));
|
|
initStickers();
|
|
|
|
stickersPanelArrow = new ImageView(context);
|
|
stickersPanelArrow.setImageResource(R.drawable.stickers_back_arrow);
|
|
stickersPanelArrow.setColorFilter(new PorterDuffColorFilter(Theme.getColor(Theme.key_chat_stickersHintPanel), PorterDuff.Mode.MULTIPLY));
|
|
stickersPanel.addView(stickersPanelArrow, LayoutHelper.createFrame(LayoutHelper.WRAP_CONTENT, LayoutHelper.WRAP_CONTENT, Gravity.BOTTOM | Gravity.LEFT, 53, 0, 0, 0));
|
|
|
|
searchContainer = new FrameLayout(context) {
|
|
@Override
|
|
public void onDraw(Canvas canvas) {
|
|
int bottom = Theme.chat_composeShadowDrawable.getIntrinsicHeight();
|
|
Theme.chat_composeShadowDrawable.setBounds(0, 0, getMeasuredWidth(), bottom);
|
|
Theme.chat_composeShadowDrawable.draw(canvas);
|
|
canvas.drawRect(0, bottom, getMeasuredWidth(), getMeasuredHeight(), Theme.chat_composeBackgroundPaint);
|
|
}
|
|
};
|
|
searchContainer.setOnTouchListener(new View.OnTouchListener() {
|
|
@Override
|
|
public boolean onTouch(View v, MotionEvent event) {
|
|
return true;
|
|
}
|
|
});
|
|
searchContainer.setWillNotDraw(false);
|
|
searchContainer.setVisibility(View.INVISIBLE);
|
|
searchContainer.setFocusable(true);
|
|
searchContainer.setFocusableInTouchMode(true);
|
|
searchContainer.setClickable(true);
|
|
searchContainer.setPadding(0, AndroidUtilities.dp(3), 0, 0);
|
|
|
|
searchUpButton = new ImageView(context);
|
|
searchUpButton.setScaleType(ImageView.ScaleType.CENTER);
|
|
searchUpButton.setImageResource(R.drawable.search_up);
|
|
searchUpButton.setColorFilter(new PorterDuffColorFilter(Theme.getColor(Theme.key_chat_searchPanelIcons), PorterDuff.Mode.MULTIPLY));
|
|
searchContainer.addView(searchUpButton, LayoutHelper.createFrame(48, 48, Gravity.RIGHT | Gravity.TOP, 0, 0, 48, 0));
|
|
searchUpButton.setOnClickListener(new View.OnClickListener() {
|
|
@Override
|
|
public void onClick(View view) {
|
|
MessagesSearchQuery.searchMessagesInChat(null, dialog_id, mergeDialogId, classGuid, 1, searchingUserMessages);
|
|
}
|
|
});
|
|
|
|
searchDownButton = new ImageView(context);
|
|
searchDownButton.setScaleType(ImageView.ScaleType.CENTER);
|
|
searchDownButton.setImageResource(R.drawable.search_down);
|
|
searchDownButton.setColorFilter(new PorterDuffColorFilter(Theme.getColor(Theme.key_chat_searchPanelIcons), PorterDuff.Mode.MULTIPLY));
|
|
searchContainer.addView(searchDownButton, LayoutHelper.createFrame(48, 48, Gravity.RIGHT | Gravity.TOP, 0, 0, 0, 0));
|
|
searchDownButton.setOnClickListener(new View.OnClickListener() {
|
|
@Override
|
|
public void onClick(View view) {
|
|
MessagesSearchQuery.searchMessagesInChat(null, dialog_id, mergeDialogId, classGuid, 2, searchingUserMessages);
|
|
}
|
|
});
|
|
|
|
if (currentChat != null && (!ChatObject.isChannel(currentChat) || currentChat.megagroup)) {
|
|
searchUserButton = new ImageView(context);
|
|
searchUserButton.setScaleType(ImageView.ScaleType.CENTER);
|
|
searchUserButton.setImageResource(R.drawable.usersearch);
|
|
searchUserButton.setColorFilter(new PorterDuffColorFilter(Theme.getColor(Theme.key_chat_searchPanelIcons), PorterDuff.Mode.MULTIPLY));
|
|
searchContainer.addView(searchUserButton, LayoutHelper.createFrame(48, 48, Gravity.LEFT | Gravity.TOP, 48, 0, 0, 0));
|
|
searchUserButton.setOnClickListener(new View.OnClickListener() {
|
|
@Override
|
|
public void onClick(View view) {
|
|
mentionLayoutManager.setReverseLayout(true);
|
|
mentionsAdapter.setSearchingMentions(true);
|
|
searchCalendarButton.setVisibility(View.GONE);
|
|
searchUserButton.setVisibility(View.GONE);
|
|
searchingForUser = true;
|
|
searchingUserMessages = null;
|
|
searchItem.getSearchField().setHint(LocaleController.getString("SearchMembers", R.string.SearchMembers));
|
|
searchItem.setSearchFieldCaption(LocaleController.getString("SearchFrom", R.string.SearchFrom));
|
|
AndroidUtilities.showKeyboard(searchItem.getSearchField());
|
|
searchItem.clearSearchText();
|
|
}
|
|
});
|
|
}
|
|
|
|
searchCalendarButton = new ImageView(context);
|
|
searchCalendarButton.setScaleType(ImageView.ScaleType.CENTER);
|
|
searchCalendarButton.setImageResource(R.drawable.search_calendar);
|
|
searchCalendarButton.setColorFilter(new PorterDuffColorFilter(Theme.getColor(Theme.key_chat_searchPanelIcons), PorterDuff.Mode.MULTIPLY));
|
|
searchContainer.addView(searchCalendarButton, LayoutHelper.createFrame(48, 48, Gravity.LEFT | Gravity.TOP));
|
|
searchCalendarButton.setOnClickListener(new View.OnClickListener() {
|
|
@Override
|
|
public void onClick(View view) {
|
|
if (getParentActivity() == null) {
|
|
return;
|
|
}
|
|
AndroidUtilities.hideKeyboard(searchItem.getSearchField());
|
|
Calendar calendar = Calendar.getInstance();
|
|
int year = calendar.get(Calendar.YEAR);
|
|
int monthOfYear = calendar.get(Calendar.MONTH);
|
|
int dayOfMonth = calendar.get(Calendar.DAY_OF_MONTH);
|
|
try {
|
|
DatePickerDialog dialog = new DatePickerDialog(getParentActivity(), new DatePickerDialog.OnDateSetListener() {
|
|
@Override
|
|
public void onDateSet(DatePicker view, int year, int month, int dayOfMonth) {
|
|
Calendar calendar = Calendar.getInstance();
|
|
calendar.clear();
|
|
calendar.set(year, month, dayOfMonth);
|
|
int date = (int) (calendar.getTime().getTime() / 1000);
|
|
clearChatData();
|
|
waitingForLoad.add(lastLoadIndex);
|
|
MessagesController.getInstance().loadMessages(dialog_id, 30, 0, date, true, 0, classGuid, 4, 0, ChatObject.isChannel(currentChat), lastLoadIndex++);
|
|
}
|
|
}, year, monthOfYear, dayOfMonth);
|
|
final DatePicker datePicker = dialog.getDatePicker();
|
|
datePicker.setMinDate(1375315200000L);
|
|
datePicker.setMaxDate(System.currentTimeMillis());
|
|
dialog.setButton(DialogInterface.BUTTON_POSITIVE, LocaleController.getString("JumpToDate", R.string.JumpToDate), dialog);
|
|
dialog.setButton(DialogInterface.BUTTON_NEGATIVE, LocaleController.getString("Cancel", R.string.Cancel), new DialogInterface.OnClickListener() {
|
|
@Override
|
|
public void onClick(DialogInterface dialog, int which) {
|
|
|
|
}
|
|
});
|
|
if (Build.VERSION.SDK_INT >= 21) {
|
|
dialog.setOnShowListener(new DialogInterface.OnShowListener() {
|
|
@Override
|
|
public void onShow(DialogInterface dialog) {
|
|
int count = datePicker.getChildCount();
|
|
for (int a = 0; a < count; a++) {
|
|
View child = datePicker.getChildAt(a);
|
|
ViewGroup.LayoutParams layoutParams = child.getLayoutParams();
|
|
layoutParams.width = LayoutHelper.MATCH_PARENT;
|
|
child.setLayoutParams(layoutParams);
|
|
}
|
|
}
|
|
});
|
|
}
|
|
showDialog(dialog);
|
|
} catch (Exception e) {
|
|
FileLog.e(e);
|
|
}
|
|
}
|
|
});
|
|
|
|
searchCountText = new SimpleTextView(context);
|
|
searchCountText.setTextColor(Theme.getColor(Theme.key_chat_searchPanelText));
|
|
searchCountText.setTextSize(15);
|
|
searchCountText.setTypeface(AndroidUtilities.getTypeface("fonts/rmedium.ttf"));
|
|
searchCountText.setGravity(Gravity.RIGHT);
|
|
searchContainer.addView(searchCountText, LayoutHelper.createFrame(LayoutHelper.WRAP_CONTENT, LayoutHelper.WRAP_CONTENT, Gravity.RIGHT | Gravity.CENTER_VERTICAL, 0, 0, 108, 0));
|
|
|
|
bottomOverlay = new FrameLayout(context) {
|
|
@Override
|
|
public void onDraw(Canvas canvas) {
|
|
int bottom = Theme.chat_composeShadowDrawable.getIntrinsicHeight();
|
|
Theme.chat_composeShadowDrawable.setBounds(0, 0, getMeasuredWidth(), bottom);
|
|
Theme.chat_composeShadowDrawable.draw(canvas);
|
|
canvas.drawRect(0, bottom, getMeasuredWidth(), getMeasuredHeight(), Theme.chat_composeBackgroundPaint);
|
|
}
|
|
};
|
|
bottomOverlay.setWillNotDraw(false);
|
|
bottomOverlay.setVisibility(View.INVISIBLE);
|
|
bottomOverlay.setFocusable(true);
|
|
bottomOverlay.setFocusableInTouchMode(true);
|
|
bottomOverlay.setClickable(true);
|
|
bottomOverlay.setPadding(0, AndroidUtilities.dp(2), 0, 0);
|
|
contentView.addView(bottomOverlay, LayoutHelper.createFrame(LayoutHelper.MATCH_PARENT, 51, Gravity.BOTTOM));
|
|
|
|
bottomOverlayText = new TextView(context);
|
|
bottomOverlayText.setTextSize(TypedValue.COMPLEX_UNIT_DIP, 14);
|
|
bottomOverlayText.setGravity(Gravity.CENTER);
|
|
bottomOverlayText.setMaxLines(2);
|
|
bottomOverlayText.setEllipsize(TextUtils.TruncateAt.END);
|
|
bottomOverlayText.setLineSpacing(AndroidUtilities.dp(2), 1);
|
|
bottomOverlayText.setTextColor(Theme.getColor(Theme.key_chat_secretChatStatusText));
|
|
bottomOverlay.addView(bottomOverlayText, LayoutHelper.createFrame(LayoutHelper.WRAP_CONTENT, LayoutHelper.WRAP_CONTENT, Gravity.CENTER, 14, 0, 14, 0));
|
|
|
|
bottomOverlayChat = new FrameLayout(context) {
|
|
@Override
|
|
public void onDraw(Canvas canvas) {
|
|
int bottom = Theme.chat_composeShadowDrawable.getIntrinsicHeight();
|
|
Theme.chat_composeShadowDrawable.setBounds(0, 0, getMeasuredWidth(), bottom);
|
|
Theme.chat_composeShadowDrawable.draw(canvas);
|
|
canvas.drawRect(0, bottom, getMeasuredWidth(), getMeasuredHeight(), Theme.chat_composeBackgroundPaint);
|
|
}
|
|
};
|
|
bottomOverlayChat.setWillNotDraw(false);
|
|
bottomOverlayChat.setPadding(0, AndroidUtilities.dp(3), 0, 0);
|
|
bottomOverlayChat.setVisibility(View.INVISIBLE);
|
|
contentView.addView(bottomOverlayChat, LayoutHelper.createFrame(LayoutHelper.MATCH_PARENT, 51, Gravity.BOTTOM));
|
|
bottomOverlayChat.setOnClickListener(new View.OnClickListener() {
|
|
@Override
|
|
public void onClick(View view) {
|
|
if (getParentActivity() == null) {
|
|
return;
|
|
}
|
|
AlertDialog.Builder builder = null;
|
|
if (currentUser != null && userBlocked) {
|
|
if (currentUser.bot) {
|
|
String botUserLast = botUser;
|
|
botUser = null;
|
|
MessagesController.getInstance().unblockUser(currentUser.id);
|
|
if (botUserLast != null && botUserLast.length() != 0) {
|
|
MessagesController.getInstance().sendBotStart(currentUser, botUserLast);
|
|
} else {
|
|
SendMessagesHelper.getInstance().sendMessage("/start", dialog_id, null, null, false, null, null, null);
|
|
}
|
|
} else {
|
|
builder = new AlertDialog.Builder(getParentActivity());
|
|
builder.setMessage(LocaleController.getString("AreYouSureUnblockContact", R.string.AreYouSureUnblockContact));
|
|
builder.setPositiveButton(LocaleController.getString("OK", R.string.OK), new DialogInterface.OnClickListener() {
|
|
@Override
|
|
public void onClick(DialogInterface dialogInterface, int i) {
|
|
MessagesController.getInstance().unblockUser(currentUser.id);
|
|
}
|
|
});
|
|
}
|
|
} else if (currentUser != null && currentUser.bot && botUser != null) {
|
|
if (botUser.length() != 0) {
|
|
MessagesController.getInstance().sendBotStart(currentUser, botUser);
|
|
} else {
|
|
SendMessagesHelper.getInstance().sendMessage("/start", dialog_id, null, null, false, null, null, null);
|
|
}
|
|
botUser = null;
|
|
updateBottomOverlay();
|
|
} else {
|
|
if (ChatObject.isChannel(currentChat) && !(currentChat instanceof TLRPC.TL_channelForbidden)) {
|
|
if (ChatObject.isNotInChat(currentChat)) {
|
|
MessagesController.getInstance().addUserToChat(currentChat.id, UserConfig.getCurrentUser(), null, 0, null, ChatActivity.this);
|
|
} else {
|
|
toggleMute(true);
|
|
}
|
|
} else {
|
|
builder = new AlertDialog.Builder(getParentActivity());
|
|
builder.setMessage(LocaleController.getString("AreYouSureDeleteThisChat", R.string.AreYouSureDeleteThisChat));
|
|
builder.setPositiveButton(LocaleController.getString("OK", R.string.OK), new DialogInterface.OnClickListener() {
|
|
@Override
|
|
public void onClick(DialogInterface dialogInterface, int i) {
|
|
MessagesController.getInstance().deleteDialog(dialog_id, 0);
|
|
finishFragment();
|
|
}
|
|
});
|
|
}
|
|
}
|
|
if (builder != null) {
|
|
builder.setTitle(LocaleController.getString("AppName", R.string.AppName));
|
|
builder.setNegativeButton(LocaleController.getString("Cancel", R.string.Cancel), null);
|
|
showDialog(builder.create());
|
|
}
|
|
}
|
|
});
|
|
|
|
bottomOverlayChatText = new TextView(context);
|
|
bottomOverlayChatText.setTextSize(TypedValue.COMPLEX_UNIT_DIP, 15);
|
|
bottomOverlayChatText.setTypeface(AndroidUtilities.getTypeface("fonts/rmedium.ttf"));
|
|
bottomOverlayChatText.setTextColor(Theme.getColor(Theme.key_chat_fieldOverlayText));
|
|
bottomOverlayChat.addView(bottomOverlayChatText, LayoutHelper.createFrame(LayoutHelper.WRAP_CONTENT, LayoutHelper.WRAP_CONTENT, Gravity.CENTER));
|
|
|
|
contentView.addView(searchContainer, LayoutHelper.createFrame(LayoutHelper.MATCH_PARENT, 51, Gravity.BOTTOM));
|
|
|
|
chatAdapter.updateRows();
|
|
if (loading && messages.isEmpty()) {
|
|
progressView.setVisibility(chatAdapter.botInfoRow == -1 ? View.VISIBLE : View.INVISIBLE);
|
|
chatListView.setEmptyView(null);
|
|
} else {
|
|
progressView.setVisibility(View.INVISIBLE);
|
|
chatListView.setEmptyView(emptyViewContainer);
|
|
}
|
|
|
|
chatActivityEnterView.setButtons(userBlocked ? null : botButtons);
|
|
|
|
updateContactStatus();
|
|
updateBottomOverlay();
|
|
updateSecretStatus();
|
|
updateSpamView();
|
|
updatePinnedMessageView(true);
|
|
|
|
try {
|
|
if (currentEncryptedChat != null && Build.VERSION.SDK_INT >= 23 && (UserConfig.passcodeHash.length() == 0 || UserConfig.allowScreenCapture)) {
|
|
getParentActivity().getWindow().setFlags(WindowManager.LayoutParams.FLAG_SECURE, WindowManager.LayoutParams.FLAG_SECURE);
|
|
}
|
|
} catch (Throwable e) {
|
|
FileLog.e(e);
|
|
}
|
|
if (oldMessage != null) {
|
|
chatActivityEnterView.setFieldText(oldMessage);
|
|
}
|
|
fixLayoutInternal();
|
|
|
|
return fragmentView;
|
|
}
|
|
|
|
private TextureView createTextureView(boolean add) {
|
|
if (parentLayout == null) {
|
|
return null;
|
|
}
|
|
if (roundVideoContainer == null) {
|
|
if (Build.VERSION.SDK_INT >= 21) {
|
|
roundVideoContainer = new FrameLayout(getParentActivity()) {
|
|
@Override
|
|
public void setTranslationY(float translationY) {
|
|
super.setTranslationY(translationY);
|
|
contentView.invalidate();
|
|
}
|
|
};
|
|
roundVideoContainer.setOutlineProvider(new ViewOutlineProvider() {
|
|
@TargetApi(Build.VERSION_CODES.LOLLIPOP)
|
|
@Override
|
|
public void getOutline(View view, Outline outline) {
|
|
outline.setOval(0, 0, AndroidUtilities.roundMessageSize, AndroidUtilities.roundMessageSize);
|
|
}
|
|
});
|
|
roundVideoContainer.setClipToOutline(true);
|
|
} else {
|
|
roundVideoContainer = new FrameLayout(getParentActivity()) {
|
|
@Override
|
|
protected void onSizeChanged(int w, int h, int oldw, int oldh) {
|
|
super.onSizeChanged(w, h, oldw, oldh);
|
|
aspectPath.reset();
|
|
aspectPath.addCircle(w / 2, h / 2, w / 2, Path.Direction.CW);
|
|
aspectPath.toggleInverseFillType();
|
|
}
|
|
|
|
@Override
|
|
public void setTranslationY(float translationY) {
|
|
super.setTranslationY(translationY);
|
|
contentView.invalidate();
|
|
}
|
|
|
|
@Override
|
|
public void setVisibility(int visibility) {
|
|
super.setVisibility(visibility);
|
|
if (visibility == VISIBLE) {
|
|
setLayerType(View.LAYER_TYPE_HARDWARE, null);
|
|
}
|
|
}
|
|
|
|
@Override
|
|
protected void dispatchDraw(Canvas canvas) {
|
|
super.dispatchDraw(canvas);
|
|
canvas.drawPath(aspectPath, aspectPaint);
|
|
}
|
|
};
|
|
aspectPath = new Path();
|
|
aspectPaint = new Paint(Paint.ANTI_ALIAS_FLAG);
|
|
aspectPaint.setColor(0xff000000);
|
|
aspectPaint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.CLEAR));
|
|
}
|
|
roundVideoContainer.setWillNotDraw(false);
|
|
roundVideoContainer.setVisibility(View.INVISIBLE);
|
|
|
|
aspectRatioFrameLayout = new AspectRatioFrameLayout(getParentActivity());
|
|
aspectRatioFrameLayout.setBackgroundColor(0);
|
|
if (add) {
|
|
roundVideoContainer.addView(aspectRatioFrameLayout, LayoutHelper.createFrame(LayoutHelper.MATCH_PARENT, LayoutHelper.MATCH_PARENT));
|
|
}
|
|
|
|
videoTextureView = new TextureView(getParentActivity());
|
|
videoTextureView.setOpaque(false);
|
|
aspectRatioFrameLayout.addView(videoTextureView, LayoutHelper.createFrame(LayoutHelper.MATCH_PARENT, LayoutHelper.MATCH_PARENT));
|
|
}
|
|
if (roundVideoContainer.getParent() == null) {
|
|
contentView.addView(roundVideoContainer, 1, new FrameLayout.LayoutParams(AndroidUtilities.roundMessageSize, AndroidUtilities.roundMessageSize));
|
|
}
|
|
roundVideoContainer.setVisibility(View.INVISIBLE);
|
|
aspectRatioFrameLayout.setDrawingReady(false);
|
|
return videoTextureView;
|
|
}
|
|
|
|
private void destroyTextureView() {
|
|
if (roundVideoContainer == null || roundVideoContainer.getParent() == null) {
|
|
return;
|
|
}
|
|
contentView.removeView(roundVideoContainer);
|
|
aspectRatioFrameLayout.setDrawingReady(false);
|
|
roundVideoContainer.setVisibility(View.INVISIBLE);
|
|
if (Build.VERSION.SDK_INT < 21) {
|
|
roundVideoContainer.setLayerType(View.LAYER_TYPE_NONE, null);
|
|
}
|
|
}
|
|
|
|
private void sendBotInlineResult(TLRPC.BotInlineResult result) {
|
|
int uid = mentionsAdapter.getContextBotId();
|
|
HashMap<String, String> params = new HashMap<>();
|
|
params.put("id", result.id);
|
|
params.put("query_id", "" + result.query_id);
|
|
params.put("bot", "" + uid);
|
|
params.put("bot_name", mentionsAdapter.getContextBotName());
|
|
SendMessagesHelper.prepareSendingBotContextResult(result, params, dialog_id, replyingMessageObject);
|
|
chatActivityEnterView.setFieldText("");
|
|
showReplyPanel(false, null, null, null, false);
|
|
SearchQuery.increaseInlineRaiting(uid);
|
|
}
|
|
|
|
private void mentionListViewUpdateLayout() {
|
|
if (mentionListView.getChildCount() <= 0) {
|
|
mentionListViewScrollOffsetY = 0;
|
|
mentionListViewLastViewPosition = -1;
|
|
return;
|
|
}
|
|
View child = mentionListView.getChildAt(mentionListView.getChildCount() - 1);
|
|
RecyclerListView.Holder holder = (RecyclerListView.Holder) mentionListView.findContainingViewHolder(child);
|
|
if (mentionLayoutManager.getReverseLayout()) {
|
|
if (holder != null) {
|
|
mentionListViewLastViewPosition = holder.getAdapterPosition();
|
|
mentionListViewLastViewTop = child.getBottom();
|
|
} else {
|
|
mentionListViewLastViewPosition = -1;
|
|
}
|
|
|
|
child = mentionListView.getChildAt(0);
|
|
holder = (RecyclerListView.Holder) mentionListView.findContainingViewHolder(child);
|
|
int newOffset = child.getBottom() < mentionListView.getMeasuredHeight() && holder != null && holder.getAdapterPosition() == 0 ? child.getBottom() : mentionListView.getMeasuredHeight();
|
|
if (mentionListViewScrollOffsetY != newOffset) {
|
|
mentionListView.setBottomGlowOffset(mentionListViewScrollOffsetY = newOffset);
|
|
mentionListView.setTopGlowOffset(0);
|
|
mentionListView.invalidate();
|
|
mentionContainer.invalidate();
|
|
}
|
|
} else {
|
|
if (holder != null) {
|
|
mentionListViewLastViewPosition = holder.getAdapterPosition();
|
|
mentionListViewLastViewTop = child.getTop();
|
|
} else {
|
|
mentionListViewLastViewPosition = -1;
|
|
}
|
|
|
|
child = mentionListView.getChildAt(0);
|
|
holder = (RecyclerListView.Holder) mentionListView.findContainingViewHolder(child);
|
|
int newOffset = child.getTop() > 0 && holder != null && holder.getAdapterPosition() == 0 ? child.getTop() : 0;
|
|
if (mentionListViewScrollOffsetY != newOffset) {
|
|
mentionListView.setTopGlowOffset(mentionListViewScrollOffsetY = newOffset);
|
|
mentionListView.setBottomGlowOffset(0);
|
|
mentionListView.invalidate();
|
|
mentionContainer.invalidate();
|
|
}
|
|
}
|
|
}
|
|
|
|
private void checkBotCommands() {
|
|
URLSpanBotCommand.enabled = false;
|
|
if (currentUser != null && currentUser.bot) {
|
|
URLSpanBotCommand.enabled = true;
|
|
} else if (info instanceof TLRPC.TL_chatFull) {
|
|
for (int a = 0; a < info.participants.participants.size(); a++) {
|
|
TLRPC.ChatParticipant participant = info.participants.participants.get(a);
|
|
TLRPC.User user = MessagesController.getInstance().getUser(participant.user_id);
|
|
if (user != null && user.bot) {
|
|
URLSpanBotCommand.enabled = true;
|
|
break;
|
|
}
|
|
}
|
|
} else if (info instanceof TLRPC.TL_channelFull) {
|
|
URLSpanBotCommand.enabled = !info.bot_info.isEmpty() && currentChat != null && currentChat.megagroup;
|
|
}
|
|
}
|
|
|
|
private MessageObject.GroupedMessages getValidGroupedMessage(MessageObject message) {
|
|
MessageObject.GroupedMessages groupedMessages = null;
|
|
if (message.getGroupId() != 0) {
|
|
groupedMessages = groupedMessagesMap.get(message.getGroupId());
|
|
if (groupedMessages != null && (groupedMessages.messages.size() <= 1 || groupedMessages.positions.get(message) == null)) {
|
|
groupedMessages = null;
|
|
}
|
|
}
|
|
return groupedMessages;
|
|
}
|
|
|
|
private void jumpToDate(int date) {
|
|
if (messages.isEmpty()) {
|
|
return;
|
|
}
|
|
MessageObject firstMessage = messages.get(0);
|
|
MessageObject lastMessage = messages.get(messages.size() - 1);
|
|
if (firstMessage.messageOwner.date >= date && lastMessage.messageOwner.date <= date) {
|
|
for (int a = messages.size() - 1; a >= 0; a--) {
|
|
MessageObject message = messages.get(a);
|
|
if (message.messageOwner.date >= date && message.getId() != 0) {
|
|
scrollToMessageId(message.getId(), 0, false, message.getDialogId() == mergeDialogId ? 1 : 0, false);
|
|
break;
|
|
}
|
|
}
|
|
} else if ((int) dialog_id != 0) {
|
|
clearChatData();
|
|
waitingForLoad.add(lastLoadIndex);
|
|
MessagesController.getInstance().loadMessages(dialog_id, 30, 0, date, true, 0, classGuid, 4, 0, ChatObject.isChannel(currentChat), lastLoadIndex++);
|
|
floatingDateView.setAlpha(0.0f);
|
|
floatingDateView.setTag(null);
|
|
}
|
|
}
|
|
|
|
public void processInlineBotContextPM(TLRPC.TL_inlineBotSwitchPM object) {
|
|
if (object == null) {
|
|
return;
|
|
}
|
|
TLRPC.User user = mentionsAdapter.getContextBotUser();
|
|
if (user == null) {
|
|
return;
|
|
}
|
|
chatActivityEnterView.setFieldText("");
|
|
if (dialog_id == user.id) {
|
|
inlineReturn = dialog_id;
|
|
MessagesController.getInstance().sendBotStart(currentUser, object.start_param);
|
|
} else {
|
|
Bundle args = new Bundle();
|
|
args.putInt("user_id", user.id);
|
|
args.putString("inline_query", object.start_param);
|
|
args.putLong("inline_return", dialog_id);
|
|
if (!MessagesController.checkCanOpenChat(args, ChatActivity.this)) {
|
|
return;
|
|
}
|
|
presentFragment(new ChatActivity(args));
|
|
}
|
|
}
|
|
|
|
private void createChatAttachView() {
|
|
if (getParentActivity() == null) {
|
|
return;
|
|
}
|
|
if (chatAttachAlert == null) {
|
|
chatAttachAlert = new ChatAttachAlert(getParentActivity(), this);
|
|
chatAttachAlert.setDelegate(new ChatAttachAlert.ChatAttachViewDelegate() {
|
|
@Override
|
|
public void didPressedButton(int button) {
|
|
if (getParentActivity() == null || chatAttachAlert == null) {
|
|
return;
|
|
}
|
|
if (button == 7 || button == 4 && !chatAttachAlert.getSelectedPhotos().isEmpty()) {
|
|
chatAttachAlert.dismiss();
|
|
HashMap<Object, Object> selectedPhotos = chatAttachAlert.getSelectedPhotos();
|
|
ArrayList<Object> selectedPhotosOrder = chatAttachAlert.getSelectedPhotosOrder();
|
|
if (!selectedPhotos.isEmpty()) {
|
|
ArrayList<SendMessagesHelper.SendingMediaInfo> photos = new ArrayList<>();
|
|
for (int a = 0; a < selectedPhotosOrder.size(); a++) {
|
|
MediaController.PhotoEntry photoEntry = (MediaController.PhotoEntry) selectedPhotos.get(selectedPhotosOrder.get(a));
|
|
|
|
SendMessagesHelper.SendingMediaInfo info = new SendMessagesHelper.SendingMediaInfo();
|
|
if (photoEntry.imagePath != null) {
|
|
info.path = photoEntry.imagePath;
|
|
} else if (photoEntry.path != null) {
|
|
info.path = photoEntry.path;
|
|
}
|
|
info.isVideo = photoEntry.isVideo;
|
|
info.caption = photoEntry.caption != null ? photoEntry.caption.toString() : null;
|
|
info.masks = !photoEntry.stickers.isEmpty() ? new ArrayList<>(photoEntry.stickers) : null;
|
|
info.ttl = photoEntry.ttl;
|
|
info.videoEditedInfo = photoEntry.editedInfo;
|
|
photos.add(info);
|
|
photoEntry.reset();
|
|
}
|
|
SendMessagesHelper.prepareSendingMedia(photos, dialog_id, replyingMessageObject, null, button == 4, MediaController.getInstance().isGroupPhotosEnabled());
|
|
showReplyPanel(false, null, null, null, false);
|
|
DraftQuery.cleanDraft(dialog_id, true);
|
|
}
|
|
return;
|
|
} else if (chatAttachAlert != null) {
|
|
chatAttachAlert.dismissWithButtonClick(button);
|
|
}
|
|
processSelectedAttach(button);
|
|
}
|
|
|
|
@Override
|
|
public View getRevealView() {
|
|
return chatActivityEnterView.getAttachButton();
|
|
}
|
|
|
|
@Override
|
|
public void didSelectBot(TLRPC.User user) {
|
|
if (chatActivityEnterView == null || TextUtils.isEmpty(user.username)) {
|
|
return;
|
|
}
|
|
chatActivityEnterView.setFieldText("@" + user.username + " ");
|
|
chatActivityEnterView.openKeyboard();
|
|
}
|
|
|
|
@Override
|
|
public void onCameraOpened() {
|
|
chatActivityEnterView.closeKeyboard();
|
|
}
|
|
});
|
|
}
|
|
}
|
|
|
|
public long getDialogId() {
|
|
return dialog_id;
|
|
}
|
|
|
|
public void setBotUser(String value) {
|
|
if (inlineReturn != 0) {
|
|
MessagesController.getInstance().sendBotStart(currentUser, value);
|
|
} else {
|
|
botUser = value;
|
|
updateBottomOverlay();
|
|
}
|
|
}
|
|
|
|
public boolean playFirstUnreadVoiceMessage() {
|
|
if (chatActivityEnterView != null && chatActivityEnterView.isRecordingAudioVideo()) {
|
|
return true;
|
|
}
|
|
for (int a = messages.size() - 1; a >= 0; a--) {
|
|
MessageObject messageObject = messages.get(a);
|
|
if ((messageObject.isVoice() || messageObject.isRoundVideo()) && messageObject.isContentUnread() && !messageObject.isOut()) {
|
|
MediaController.getInstance().setVoiceMessagesPlaylist(MediaController.getInstance().playMessage(messageObject) ? createVoiceMessagesPlaylist(messageObject, true) : null, true);
|
|
return true;
|
|
}
|
|
}
|
|
if (Build.VERSION.SDK_INT >= 23 && getParentActivity() != null) {
|
|
if (getParentActivity().checkSelfPermission(Manifest.permission.RECORD_AUDIO) != PackageManager.PERMISSION_GRANTED) {
|
|
getParentActivity().requestPermissions(new String[]{Manifest.permission.RECORD_AUDIO}, 3);
|
|
return true;
|
|
}
|
|
}
|
|
return false;
|
|
}
|
|
|
|
private void initStickers() {
|
|
if (chatActivityEnterView == null || getParentActivity() == null || stickersAdapter != null || currentEncryptedChat != null && AndroidUtilities.getPeerLayerVersion(currentEncryptedChat.layer) < 23) {
|
|
return;
|
|
}
|
|
if (stickersAdapter != null) {
|
|
stickersAdapter.onDestroy();
|
|
}
|
|
stickersListView.setPadding(AndroidUtilities.dp(18), 0, AndroidUtilities.dp(18), 0);
|
|
stickersListView.setAdapter(stickersAdapter = new StickersAdapter(getParentActivity(), new StickersAdapter.StickersAdapterDelegate() {
|
|
@Override
|
|
public void needChangePanelVisibility(final boolean show) {
|
|
if (show && stickersPanel.getVisibility() == View.VISIBLE || !show && stickersPanel.getVisibility() == View.GONE) {
|
|
return;
|
|
}
|
|
if (show) {
|
|
stickersListView.scrollToPosition(0);
|
|
stickersPanel.setVisibility(allowStickersPanel ? View.VISIBLE : View.INVISIBLE);
|
|
}
|
|
if (runningAnimation != null) {
|
|
runningAnimation.cancel();
|
|
runningAnimation = null;
|
|
}
|
|
if (stickersPanel.getVisibility() != View.INVISIBLE) {
|
|
runningAnimation = new AnimatorSet();
|
|
runningAnimation.playTogether(
|
|
ObjectAnimator.ofFloat(stickersPanel, "alpha", show ? 0.0f : 1.0f, show ? 1.0f : 0.0f)
|
|
);
|
|
runningAnimation.setDuration(150);
|
|
runningAnimation.addListener(new AnimatorListenerAdapter() {
|
|
@Override
|
|
public void onAnimationEnd(Animator animation) {
|
|
if (runningAnimation != null && runningAnimation.equals(animation)) {
|
|
if (!show) {
|
|
stickersAdapter.clearStickers();
|
|
stickersPanel.setVisibility(View.GONE);
|
|
if (StickerPreviewViewer.getInstance().isVisible()) {
|
|
StickerPreviewViewer.getInstance().close();
|
|
}
|
|
StickerPreviewViewer.getInstance().reset();
|
|
}
|
|
runningAnimation = null;
|
|
}
|
|
}
|
|
|
|
@Override
|
|
public void onAnimationCancel(Animator animation) {
|
|
if (runningAnimation != null && runningAnimation.equals(animation)) {
|
|
runningAnimation = null;
|
|
}
|
|
}
|
|
});
|
|
runningAnimation.start();
|
|
} else if (!show) {
|
|
stickersPanel.setVisibility(View.GONE);
|
|
}
|
|
}
|
|
}));
|
|
stickersListView.setOnItemClickListener(stickersOnItemClickListener = new RecyclerListView.OnItemClickListener() {
|
|
@Override
|
|
public void onItemClick(View view, int position) {
|
|
TLRPC.Document document = stickersAdapter.getItem(position);
|
|
if (document instanceof TLRPC.TL_document) {
|
|
SendMessagesHelper.getInstance().sendSticker(document, dialog_id, replyingMessageObject);
|
|
showReplyPanel(false, null, null, null, false);
|
|
chatActivityEnterView.addStickerToRecent(document);
|
|
}
|
|
chatActivityEnterView.setFieldText("");
|
|
}
|
|
});
|
|
}
|
|
|
|
public void shareMyContact(final MessageObject messageObject) {
|
|
AlertDialog.Builder builder = new AlertDialog.Builder(getParentActivity());
|
|
builder.setTitle(LocaleController.getString("ShareYouPhoneNumberTitle", R.string.ShareYouPhoneNumberTitle));
|
|
if (currentUser != null) {
|
|
if (currentUser.bot) {
|
|
builder.setMessage(LocaleController.getString("AreYouSureShareMyContactInfoBot", R.string.AreYouSureShareMyContactInfoBot));
|
|
} else {
|
|
builder.setMessage(AndroidUtilities.replaceTags(LocaleController.formatString("AreYouSureShareMyContactInfoUser", R.string.AreYouSureShareMyContactInfoUser, PhoneFormat.getInstance().format("+" + UserConfig.getCurrentUser().phone), ContactsController.formatName(currentUser.first_name, currentUser.last_name))));
|
|
}
|
|
} else {
|
|
builder.setMessage(LocaleController.getString("AreYouSureShareMyContactInfo", R.string.AreYouSureShareMyContactInfo));
|
|
}
|
|
builder.setPositiveButton(LocaleController.getString("OK", R.string.OK), new DialogInterface.OnClickListener() {
|
|
@Override
|
|
public void onClick(DialogInterface dialogInterface, int i) {
|
|
SendMessagesHelper.getInstance().sendMessage(UserConfig.getCurrentUser(), dialog_id, messageObject, null, null);
|
|
moveScrollToLastMessage();
|
|
showReplyPanel(false, null, null, null, false);
|
|
}
|
|
});
|
|
builder.setNegativeButton(LocaleController.getString("Cancel", R.string.Cancel), null);
|
|
showDialog(builder.create());
|
|
}
|
|
|
|
private void hideVoiceHint() {
|
|
voiceHintAnimation = new AnimatorSet();
|
|
voiceHintAnimation.playTogether(
|
|
ObjectAnimator.ofFloat(voiceHintTextView, "alpha", 0.0f)
|
|
);
|
|
voiceHintAnimation.addListener(new AnimatorListenerAdapter() {
|
|
@Override
|
|
public void onAnimationEnd(Animator animation) {
|
|
if (animation.equals(voiceHintAnimation)) {
|
|
voiceHintAnimation = null;
|
|
voiceHintHideRunnable = null;
|
|
if (voiceHintTextView != null) {
|
|
voiceHintTextView.setVisibility(View.GONE);
|
|
}
|
|
}
|
|
}
|
|
|
|
@Override
|
|
public void onAnimationCancel(Animator animation) {
|
|
if (animation.equals(voiceHintAnimation)) {
|
|
voiceHintHideRunnable = null;
|
|
voiceHintHideRunnable = null;
|
|
}
|
|
}
|
|
});
|
|
voiceHintAnimation.setDuration(300);
|
|
voiceHintAnimation.start();
|
|
}
|
|
|
|
private void showVoiceHint(boolean hide, boolean video) {
|
|
if (getParentActivity() == null || fragmentView == null || hide && voiceHintTextView == null) {
|
|
return;
|
|
}
|
|
if (voiceHintTextView == null) {
|
|
SizeNotifierFrameLayout frameLayout = (SizeNotifierFrameLayout) fragmentView;
|
|
int index = frameLayout.indexOfChild(chatActivityEnterView);
|
|
if (index == -1) {
|
|
return;
|
|
}
|
|
voiceHintTextView = new TextView(getParentActivity());
|
|
voiceHintTextView.setBackgroundDrawable(Theme.createRoundRectDrawable(AndroidUtilities.dp(3), Theme.getColor(Theme.key_chat_gifSaveHintBackground)));
|
|
voiceHintTextView.setTextColor(Theme.getColor(Theme.key_chat_gifSaveHintText));
|
|
voiceHintTextView.setTextSize(TypedValue.COMPLEX_UNIT_DIP, 14);
|
|
voiceHintTextView.setPadding(AndroidUtilities.dp(8), AndroidUtilities.dp(7), AndroidUtilities.dp(8), AndroidUtilities.dp(7));
|
|
voiceHintTextView.setGravity(Gravity.CENTER_VERTICAL);
|
|
voiceHintTextView.setAlpha(0.0f);
|
|
frameLayout.addView(voiceHintTextView, index + 1, LayoutHelper.createFrame(LayoutHelper.WRAP_CONTENT, LayoutHelper.WRAP_CONTENT, Gravity.RIGHT | Gravity.BOTTOM, 5, 0, 5, 3));
|
|
}
|
|
if (hide) {
|
|
if (voiceHintAnimation != null) {
|
|
voiceHintAnimation.cancel();
|
|
voiceHintAnimation = null;
|
|
}
|
|
AndroidUtilities.cancelRunOnUIThread(voiceHintHideRunnable);
|
|
voiceHintHideRunnable = null;
|
|
hideVoiceHint();
|
|
return;
|
|
}
|
|
|
|
voiceHintTextView.setText(video ? LocaleController.getString("HoldToVideo", R.string.HoldToVideo) : LocaleController.getString("HoldToAudio", R.string.HoldToAudio));
|
|
|
|
if (voiceHintHideRunnable != null) {
|
|
if (voiceHintAnimation != null) {
|
|
voiceHintAnimation.cancel();
|
|
voiceHintAnimation = null;
|
|
} else {
|
|
AndroidUtilities.cancelRunOnUIThread(voiceHintHideRunnable);
|
|
AndroidUtilities.runOnUIThread(voiceHintHideRunnable = new Runnable() {
|
|
@Override
|
|
public void run() {
|
|
hideVoiceHint();
|
|
}
|
|
}, 2000);
|
|
return;
|
|
}
|
|
} else if (voiceHintAnimation != null) {
|
|
return;
|
|
}
|
|
|
|
voiceHintTextView.setVisibility(View.VISIBLE);
|
|
voiceHintAnimation = new AnimatorSet();
|
|
voiceHintAnimation.playTogether(
|
|
ObjectAnimator.ofFloat(voiceHintTextView, "alpha", 1.0f)
|
|
);
|
|
voiceHintAnimation.addListener(new AnimatorListenerAdapter() {
|
|
@Override
|
|
public void onAnimationEnd(Animator animation) {
|
|
if (animation.equals(voiceHintAnimation)) {
|
|
voiceHintAnimation = null;
|
|
AndroidUtilities.runOnUIThread(voiceHintHideRunnable = new Runnable() {
|
|
@Override
|
|
public void run() {
|
|
hideVoiceHint();
|
|
}
|
|
}, 2000);
|
|
}
|
|
}
|
|
|
|
@Override
|
|
public void onAnimationCancel(Animator animation) {
|
|
if (animation.equals(voiceHintAnimation)) {
|
|
voiceHintAnimation = null;
|
|
}
|
|
}
|
|
});
|
|
voiceHintAnimation.setDuration(300);
|
|
voiceHintAnimation.start();
|
|
}
|
|
|
|
private void showMediaBannedHint() {
|
|
if (getParentActivity() == null || currentChat == null || currentChat.banned_rights == null || fragmentView == null || mediaBanTooltip != null && mediaBanTooltip.getVisibility() == View.VISIBLE) {
|
|
return;
|
|
}
|
|
SizeNotifierFrameLayout frameLayout = (SizeNotifierFrameLayout) fragmentView;
|
|
int index = frameLayout.indexOfChild(chatActivityEnterView);
|
|
if (index == -1) {
|
|
return;
|
|
}
|
|
|
|
if (mediaBanTooltip == null) {
|
|
mediaBanTooltip = new CorrectlyMeasuringTextView(getParentActivity());
|
|
mediaBanTooltip.setBackgroundDrawable(Theme.createRoundRectDrawable(AndroidUtilities.dp(3), Theme.getColor(Theme.key_chat_gifSaveHintBackground)));
|
|
mediaBanTooltip.setTextColor(Theme.getColor(Theme.key_chat_gifSaveHintText));
|
|
mediaBanTooltip.setPadding(AndroidUtilities.dp(8), AndroidUtilities.dp(7), AndroidUtilities.dp(8), AndroidUtilities.dp(7));
|
|
mediaBanTooltip.setGravity(Gravity.CENTER_VERTICAL);
|
|
mediaBanTooltip.setTextSize(TypedValue.COMPLEX_UNIT_DIP, 14);
|
|
frameLayout.addView(mediaBanTooltip, index + 1, LayoutHelper.createFrame(LayoutHelper.WRAP_CONTENT, LayoutHelper.WRAP_CONTENT, Gravity.RIGHT | Gravity.BOTTOM, 30, 0, 5, 3));
|
|
}
|
|
|
|
if (AndroidUtilities.isBannedForever(currentChat.banned_rights.until_date)) {
|
|
mediaBanTooltip.setText(LocaleController.getString("AttachMediaRestrictedForever", R.string.AttachMediaRestrictedForever));
|
|
} else {
|
|
mediaBanTooltip.setText(LocaleController.formatString("AttachMediaRestricted", R.string.AttachMediaRestricted, LocaleController.formatDateForBan(currentChat.banned_rights.until_date)));
|
|
}
|
|
mediaBanTooltip.setVisibility(View.VISIBLE);
|
|
AnimatorSet AnimatorSet = new AnimatorSet();
|
|
AnimatorSet.playTogether(
|
|
ObjectAnimator.ofFloat(mediaBanTooltip, "alpha", 0.0f, 1.0f)
|
|
);
|
|
AnimatorSet.addListener(new AnimatorListenerAdapter() {
|
|
@Override
|
|
public void onAnimationEnd(Animator animation) {
|
|
AndroidUtilities.runOnUIThread(new Runnable() {
|
|
@Override
|
|
public void run() {
|
|
if (mediaBanTooltip == null) {
|
|
return;
|
|
}
|
|
AnimatorSet AnimatorSet = new AnimatorSet();
|
|
AnimatorSet.playTogether(
|
|
ObjectAnimator.ofFloat(mediaBanTooltip, "alpha", 0.0f)
|
|
);
|
|
AnimatorSet.addListener(new AnimatorListenerAdapter() {
|
|
@Override
|
|
public void onAnimationEnd(Animator animation) {
|
|
if (mediaBanTooltip != null) {
|
|
mediaBanTooltip.setVisibility(View.GONE);
|
|
}
|
|
}
|
|
});
|
|
AnimatorSet.setDuration(300);
|
|
AnimatorSet.start();
|
|
}
|
|
}, 5000);
|
|
}
|
|
});
|
|
AnimatorSet.setDuration(300);
|
|
AnimatorSet.start();
|
|
}
|
|
|
|
private void showGifHint() {
|
|
SharedPreferences preferences = ApplicationLoader.applicationContext.getSharedPreferences("mainconfig", Activity.MODE_PRIVATE);
|
|
if (preferences.getBoolean("gifhint", false)) {
|
|
return;
|
|
}
|
|
preferences.edit().putBoolean("gifhint", true).commit();
|
|
|
|
if (getParentActivity() == null || fragmentView == null || gifHintTextView != null) {
|
|
return;
|
|
}
|
|
if (!allowContextBotPanelSecond) {
|
|
if (chatActivityEnterView != null) {
|
|
chatActivityEnterView.setOpenGifsTabFirst();
|
|
}
|
|
return;
|
|
}
|
|
SizeNotifierFrameLayout frameLayout = (SizeNotifierFrameLayout) fragmentView;
|
|
int index = frameLayout.indexOfChild(chatActivityEnterView);
|
|
if (index == -1) {
|
|
return;
|
|
}
|
|
chatActivityEnterView.setOpenGifsTabFirst();
|
|
emojiButtonRed = new View(getParentActivity());
|
|
emojiButtonRed.setBackgroundResource(R.drawable.redcircle);
|
|
frameLayout.addView(emojiButtonRed, index + 1, LayoutHelper.createFrame(10, 10, Gravity.BOTTOM | Gravity.LEFT, 30, 0, 0, 27));
|
|
|
|
gifHintTextView = new TextView(getParentActivity());
|
|
gifHintTextView.setBackgroundDrawable(Theme.createRoundRectDrawable(AndroidUtilities.dp(3), Theme.getColor(Theme.key_chat_gifSaveHintBackground)));
|
|
gifHintTextView.setTextColor(Theme.getColor(Theme.key_chat_gifSaveHintText));
|
|
gifHintTextView.setTextSize(TypedValue.COMPLEX_UNIT_DIP, 14);
|
|
gifHintTextView.setPadding(AndroidUtilities.dp(8), AndroidUtilities.dp(7), AndroidUtilities.dp(8), AndroidUtilities.dp(7));
|
|
gifHintTextView.setText(LocaleController.getString("TapHereGifs", R.string.TapHereGifs));
|
|
gifHintTextView.setGravity(Gravity.CENTER_VERTICAL);
|
|
frameLayout.addView(gifHintTextView, index + 1, LayoutHelper.createFrame(LayoutHelper.WRAP_CONTENT, LayoutHelper.WRAP_CONTENT, Gravity.LEFT | Gravity.BOTTOM, 5, 0, 5, 3));
|
|
|
|
AnimatorSet AnimatorSet = new AnimatorSet();
|
|
AnimatorSet.playTogether(
|
|
ObjectAnimator.ofFloat(gifHintTextView, "alpha", 0.0f, 1.0f),
|
|
ObjectAnimator.ofFloat(emojiButtonRed, "alpha", 0.0f, 1.0f)
|
|
);
|
|
AnimatorSet.addListener(new AnimatorListenerAdapter() {
|
|
@Override
|
|
public void onAnimationEnd(Animator animation) {
|
|
AndroidUtilities.runOnUIThread(new Runnable() {
|
|
@Override
|
|
public void run() {
|
|
if (gifHintTextView == null) {
|
|
return;
|
|
}
|
|
AnimatorSet AnimatorSet = new AnimatorSet();
|
|
AnimatorSet.playTogether(
|
|
ObjectAnimator.ofFloat(gifHintTextView, "alpha", 0.0f)
|
|
);
|
|
AnimatorSet.addListener(new AnimatorListenerAdapter() {
|
|
@Override
|
|
public void onAnimationEnd(Animator animation) {
|
|
if (gifHintTextView != null) {
|
|
gifHintTextView.setVisibility(View.GONE);
|
|
}
|
|
}
|
|
});
|
|
AnimatorSet.setDuration(300);
|
|
AnimatorSet.start();
|
|
}
|
|
}, 2000);
|
|
}
|
|
});
|
|
AnimatorSet.setDuration(300);
|
|
AnimatorSet.start();
|
|
}
|
|
|
|
private void openAttachMenu() {
|
|
if (getParentActivity() == null) {
|
|
return;
|
|
}
|
|
createChatAttachView();
|
|
chatAttachAlert.loadGalleryPhotos();
|
|
if (Build.VERSION.SDK_INT == 21 || Build.VERSION.SDK_INT == 22) {
|
|
chatActivityEnterView.closeKeyboard();
|
|
}
|
|
chatAttachAlert.init();
|
|
showDialog(chatAttachAlert);
|
|
}
|
|
|
|
private void checkContextBotPanel() {
|
|
if (allowStickersPanel && mentionsAdapter != null && mentionsAdapter.isBotContext()) {
|
|
if (!allowContextBotPanel && !allowContextBotPanelSecond) {
|
|
if (mentionContainer.getVisibility() == View.VISIBLE && mentionContainer.getTag() == null) {
|
|
if (mentionListAnimation != null) {
|
|
mentionListAnimation.cancel();
|
|
}
|
|
|
|
mentionContainer.setTag(1);
|
|
mentionListAnimation = new AnimatorSet();
|
|
mentionListAnimation.playTogether(
|
|
ObjectAnimator.ofFloat(mentionContainer, "alpha", 0.0f)
|
|
);
|
|
mentionListAnimation.addListener(new AnimatorListenerAdapter() {
|
|
@Override
|
|
public void onAnimationEnd(Animator animation) {
|
|
if (mentionListAnimation != null && mentionListAnimation.equals(animation)) {
|
|
mentionContainer.setVisibility(View.INVISIBLE);
|
|
mentionListAnimation = null;
|
|
}
|
|
}
|
|
|
|
@Override
|
|
public void onAnimationCancel(Animator animation) {
|
|
if (mentionListAnimation != null && mentionListAnimation.equals(animation)) {
|
|
mentionListAnimation = null;
|
|
}
|
|
}
|
|
});
|
|
mentionListAnimation.setDuration(200);
|
|
mentionListAnimation.start();
|
|
}
|
|
} else {
|
|
if (mentionContainer.getVisibility() == View.INVISIBLE || mentionContainer.getTag() != null) {
|
|
if (mentionListAnimation != null) {
|
|
mentionListAnimation.cancel();
|
|
}
|
|
mentionContainer.setTag(null);
|
|
mentionContainer.setVisibility(View.VISIBLE);
|
|
mentionListAnimation = new AnimatorSet();
|
|
mentionListAnimation.playTogether(
|
|
ObjectAnimator.ofFloat(mentionContainer, "alpha", 0.0f, 1.0f)
|
|
);
|
|
mentionListAnimation.addListener(new AnimatorListenerAdapter() {
|
|
@Override
|
|
public void onAnimationEnd(Animator animation) {
|
|
if (mentionListAnimation != null && mentionListAnimation.equals(animation)) {
|
|
mentionListAnimation = null;
|
|
}
|
|
}
|
|
|
|
@Override
|
|
public void onAnimationCancel(Animator animation) {
|
|
if (mentionListAnimation != null && mentionListAnimation.equals(animation)) {
|
|
mentionListAnimation = null;
|
|
}
|
|
}
|
|
});
|
|
mentionListAnimation.setDuration(200);
|
|
mentionListAnimation.start();
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
private void hideFloatingDateView(boolean animated) {
|
|
if (floatingDateView.getTag() != null && !currentFloatingDateOnScreen && (!scrollingFloatingDate || currentFloatingTopIsNotMessage)) {
|
|
floatingDateView.setTag(null);
|
|
if (animated) {
|
|
floatingDateAnimation = new AnimatorSet();
|
|
floatingDateAnimation.setDuration(150);
|
|
floatingDateAnimation.playTogether(ObjectAnimator.ofFloat(floatingDateView, "alpha", 0.0f));
|
|
floatingDateAnimation.addListener(new AnimatorListenerAdapter() {
|
|
@Override
|
|
public void onAnimationEnd(Animator animation) {
|
|
if (animation.equals(floatingDateAnimation)) {
|
|
floatingDateAnimation = null;
|
|
}
|
|
}
|
|
});
|
|
floatingDateAnimation.setStartDelay(500);
|
|
floatingDateAnimation.start();
|
|
} else {
|
|
if (floatingDateAnimation != null) {
|
|
floatingDateAnimation.cancel();
|
|
floatingDateAnimation = null;
|
|
}
|
|
floatingDateView.setAlpha(0.0f);
|
|
}
|
|
}
|
|
}
|
|
|
|
@Override
|
|
protected void onRemoveFromParent() {
|
|
MediaController.getInstance().setTextureView(videoTextureView, null, null, false);
|
|
}
|
|
|
|
protected void setIgnoreAttachOnPause(boolean value) {
|
|
ignoreAttachOnPause = value;
|
|
}
|
|
|
|
private void checkScrollForLoad(boolean scroll) {
|
|
if (chatLayoutManager == null || paused) {
|
|
return;
|
|
}
|
|
int firstVisibleItem = chatLayoutManager.findFirstVisibleItemPosition();
|
|
int visibleItemCount = firstVisibleItem == RecyclerView.NO_POSITION ? 0 : Math.abs(chatLayoutManager.findLastVisibleItemPosition() - firstVisibleItem) + 1;
|
|
if (visibleItemCount > 0 || currentEncryptedChat != null) {
|
|
int totalItemCount = chatAdapter.getItemCount();
|
|
int checkLoadCount;
|
|
if (scroll) {
|
|
checkLoadCount = 25;
|
|
} else {
|
|
checkLoadCount = 5;
|
|
}
|
|
if (totalItemCount - firstVisibleItem - visibleItemCount <= checkLoadCount && !loading) {
|
|
if (!endReached[0]) {
|
|
loading = true;
|
|
waitingForLoad.add(lastLoadIndex);
|
|
if (messagesByDays.size() != 0) {
|
|
MessagesController.getInstance().loadMessages(dialog_id, 50, maxMessageId[0], 0, !cacheEndReached[0], minDate[0], classGuid, 0, 0, ChatObject.isChannel(currentChat), lastLoadIndex++);
|
|
} else {
|
|
MessagesController.getInstance().loadMessages(dialog_id, 50, 0, 0, !cacheEndReached[0], minDate[0], classGuid, 0, 0, ChatObject.isChannel(currentChat), lastLoadIndex++);
|
|
}
|
|
} else if (mergeDialogId != 0 && !endReached[1]) {
|
|
loading = true;
|
|
waitingForLoad.add(lastLoadIndex);
|
|
MessagesController.getInstance().loadMessages(mergeDialogId, 50, maxMessageId[1], 0, !cacheEndReached[1], minDate[1], classGuid, 0, 0, ChatObject.isChannel(currentChat), lastLoadIndex++);
|
|
}
|
|
}
|
|
if (visibleItemCount > 0 && !loadingForward && firstVisibleItem <= 10) {
|
|
if (mergeDialogId != 0 && !forwardEndReached[1]) {
|
|
waitingForLoad.add(lastLoadIndex);
|
|
MessagesController.getInstance().loadMessages(mergeDialogId, 50, minMessageId[1], 0, true, maxDate[1], classGuid, 1, 0, ChatObject.isChannel(currentChat), lastLoadIndex++);
|
|
loadingForward = true;
|
|
} else if (!forwardEndReached[0]) {
|
|
waitingForLoad.add(lastLoadIndex);
|
|
MessagesController.getInstance().loadMessages(dialog_id, 50, minMessageId[0], 0, true, maxDate[0], classGuid, 1, 0, ChatObject.isChannel(currentChat), lastLoadIndex++);
|
|
loadingForward = true;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
private void processSelectedAttach(int which) {
|
|
if (which == attach_photo || which == attach_gallery || which == attach_document || which == attach_video) {
|
|
String action;
|
|
if (currentChat != null) {
|
|
if (currentChat.participants_count > MessagesController.getInstance().groupBigSize) {
|
|
if (which == attach_photo || which == attach_gallery) {
|
|
action = "bigchat_upload_photo";
|
|
} else {
|
|
action = "bigchat_upload_document";
|
|
}
|
|
} else {
|
|
if (which == attach_photo || which == attach_gallery) {
|
|
action = "chat_upload_photo";
|
|
} else {
|
|
action = "chat_upload_document";
|
|
}
|
|
}
|
|
} else {
|
|
if (which == attach_photo || which == attach_gallery) {
|
|
action = "pm_upload_photo";
|
|
} else {
|
|
action = "pm_upload_document";
|
|
}
|
|
}
|
|
if (!MessagesController.isFeatureEnabled(action, ChatActivity.this)) {
|
|
return;
|
|
}
|
|
}
|
|
|
|
if (which == attach_photo) {
|
|
if (Build.VERSION.SDK_INT >= 23 && getParentActivity().checkSelfPermission(Manifest.permission.CAMERA) != PackageManager.PERMISSION_GRANTED) {
|
|
getParentActivity().requestPermissions(new String[]{Manifest.permission.CAMERA}, 19);
|
|
return;
|
|
}
|
|
try {
|
|
Intent takePictureIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
|
|
File image = AndroidUtilities.generatePicturePath();
|
|
if (image != null) {
|
|
if (Build.VERSION.SDK_INT >= 24) {
|
|
takePictureIntent.putExtra(MediaStore.EXTRA_OUTPUT, FileProvider.getUriForFile(getParentActivity(), BuildConfig.APPLICATION_ID + ".provider", image));
|
|
takePictureIntent.addFlags(Intent.FLAG_GRANT_WRITE_URI_PERMISSION);
|
|
takePictureIntent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
|
|
} else {
|
|
takePictureIntent.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(image));
|
|
}
|
|
currentPicturePath = image.getAbsolutePath();
|
|
}
|
|
startActivityForResult(takePictureIntent, 0);
|
|
} catch (Exception e) {
|
|
FileLog.e(e);
|
|
}
|
|
} else if (which == attach_gallery) {
|
|
if (Build.VERSION.SDK_INT >= 23 && getParentActivity().checkSelfPermission(Manifest.permission.READ_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) {
|
|
getParentActivity().requestPermissions(new String[]{Manifest.permission.READ_EXTERNAL_STORAGE}, 4);
|
|
return;
|
|
}
|
|
PhotoAlbumPickerActivity fragment = new PhotoAlbumPickerActivity(false, currentEncryptedChat == null || AndroidUtilities.getPeerLayerVersion(currentEncryptedChat.layer) >= 46, true, ChatActivity.this);
|
|
fragment.setDelegate(new PhotoAlbumPickerActivity.PhotoAlbumPickerActivityDelegate() {
|
|
@Override
|
|
public void didSelectPhotos(ArrayList<SendMessagesHelper.SendingMediaInfo> photos) {
|
|
SendMessagesHelper.prepareSendingMedia(photos, dialog_id, replyingMessageObject, null, false, MediaController.getInstance().isGroupPhotosEnabled());
|
|
showReplyPanel(false, null, null, null, false);
|
|
DraftQuery.cleanDraft(dialog_id, true);
|
|
}
|
|
|
|
@Override
|
|
public void startPhotoSelectActivity() {
|
|
try {
|
|
Intent videoPickerIntent = new Intent();
|
|
videoPickerIntent.setType("video/*");
|
|
videoPickerIntent.setAction(Intent.ACTION_GET_CONTENT);
|
|
videoPickerIntent.putExtra(MediaStore.EXTRA_SIZE_LIMIT, (long) (1024 * 1024 * 1536));
|
|
|
|
Intent photoPickerIntent = new Intent(Intent.ACTION_PICK);
|
|
photoPickerIntent.setType("image/*");
|
|
Intent chooserIntent = Intent.createChooser(photoPickerIntent, null);
|
|
chooserIntent.putExtra(Intent.EXTRA_INITIAL_INTENTS, new Intent[]{videoPickerIntent});
|
|
|
|
startActivityForResult(chooserIntent, 1);
|
|
} catch (Exception e) {
|
|
FileLog.e(e);
|
|
}
|
|
}
|
|
});
|
|
presentFragment(fragment);
|
|
} else if (which == attach_video) {
|
|
if (Build.VERSION.SDK_INT >= 23 && getParentActivity().checkSelfPermission(Manifest.permission.CAMERA) != PackageManager.PERMISSION_GRANTED) {
|
|
getParentActivity().requestPermissions(new String[]{Manifest.permission.CAMERA}, 20);
|
|
return;
|
|
}
|
|
try {
|
|
Intent takeVideoIntent = new Intent(MediaStore.ACTION_VIDEO_CAPTURE);
|
|
File video = AndroidUtilities.generateVideoPath();
|
|
if (video != null) {
|
|
if (Build.VERSION.SDK_INT >= 24) {
|
|
takeVideoIntent.putExtra(MediaStore.EXTRA_OUTPUT, FileProvider.getUriForFile(getParentActivity(), BuildConfig.APPLICATION_ID + ".provider", video));
|
|
takeVideoIntent.addFlags(Intent.FLAG_GRANT_WRITE_URI_PERMISSION);
|
|
takeVideoIntent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
|
|
} else if (Build.VERSION.SDK_INT >= 18) {
|
|
takeVideoIntent.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(video));
|
|
}
|
|
takeVideoIntent.putExtra(MediaStore.EXTRA_SIZE_LIMIT, (long) (1024 * 1024 * 1536));
|
|
currentPicturePath = video.getAbsolutePath();
|
|
}
|
|
startActivityForResult(takeVideoIntent, 2);
|
|
} catch (Exception e) {
|
|
FileLog.e(e);
|
|
}
|
|
} else if (which == attach_location) {
|
|
if (!AndroidUtilities.isGoogleMapsInstalled(ChatActivity.this)) {
|
|
return;
|
|
}
|
|
LocationActivity fragment = new LocationActivity(currentEncryptedChat == null ? 1 : 0);
|
|
fragment.setDialogId(dialog_id);
|
|
fragment.setDelegate(this);
|
|
presentFragment(fragment);
|
|
} else if (which == attach_document) {
|
|
if (Build.VERSION.SDK_INT >= 23 && getParentActivity().checkSelfPermission(Manifest.permission.READ_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) {
|
|
getParentActivity().requestPermissions(new String[]{Manifest.permission.READ_EXTERNAL_STORAGE}, 4);
|
|
return;
|
|
}
|
|
DocumentSelectActivity fragment = new DocumentSelectActivity();
|
|
fragment.setDelegate(new DocumentSelectActivity.DocumentSelectActivityDelegate() {
|
|
@Override
|
|
public void didSelectFiles(DocumentSelectActivity activity, ArrayList<String> files) {
|
|
activity.finishFragment();
|
|
SendMessagesHelper.prepareSendingDocuments(files, files, null, null, dialog_id, replyingMessageObject, null);
|
|
showReplyPanel(false, null, null, null, false);
|
|
DraftQuery.cleanDraft(dialog_id, true);
|
|
}
|
|
|
|
@Override
|
|
public void startDocumentSelectActivity() {
|
|
try {
|
|
Intent photoPickerIntent = new Intent(Intent.ACTION_GET_CONTENT);
|
|
if (Build.VERSION.SDK_INT >= 18) {
|
|
photoPickerIntent.putExtra(Intent.EXTRA_ALLOW_MULTIPLE, true);
|
|
}
|
|
photoPickerIntent.setType("*/*");
|
|
startActivityForResult(photoPickerIntent, 21);
|
|
} catch (Exception e) {
|
|
FileLog.e(e);
|
|
}
|
|
}
|
|
});
|
|
presentFragment(fragment);
|
|
} else if (which == attach_audio) {
|
|
if (Build.VERSION.SDK_INT >= 23 && getParentActivity().checkSelfPermission(Manifest.permission.READ_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) {
|
|
getParentActivity().requestPermissions(new String[]{Manifest.permission.READ_EXTERNAL_STORAGE}, 4);
|
|
return;
|
|
}
|
|
AudioSelectActivity fragment = new AudioSelectActivity();
|
|
fragment.setDelegate(new AudioSelectActivity.AudioSelectActivityDelegate() {
|
|
@Override
|
|
public void didSelectAudio(ArrayList<MessageObject> audios) {
|
|
SendMessagesHelper.prepareSendingAudioDocuments(audios, dialog_id, replyingMessageObject);
|
|
showReplyPanel(false, null, null, null, false);
|
|
DraftQuery.cleanDraft(dialog_id, true);
|
|
}
|
|
});
|
|
presentFragment(fragment);
|
|
} else if (which == attach_contact) {
|
|
if (Build.VERSION.SDK_INT >= 23) {
|
|
if (getParentActivity().checkSelfPermission(Manifest.permission.READ_CONTACTS) != PackageManager.PERMISSION_GRANTED) {
|
|
getParentActivity().requestPermissions(new String[]{Manifest.permission.READ_CONTACTS}, 5);
|
|
return;
|
|
}
|
|
}
|
|
try {
|
|
Intent intent = new Intent(Intent.ACTION_PICK, ContactsContract.Contacts.CONTENT_URI);
|
|
intent.setType(ContactsContract.CommonDataKinds.Phone.CONTENT_TYPE);
|
|
startActivityForResult(intent, 31);
|
|
} catch (Exception e) {
|
|
FileLog.e(e);
|
|
}
|
|
}
|
|
}
|
|
|
|
@Override
|
|
public boolean dismissDialogOnPause(Dialog dialog) {
|
|
return dialog != chatAttachAlert && super.dismissDialogOnPause(dialog);
|
|
}
|
|
|
|
private void searchLinks(final CharSequence charSequence, final boolean force) {
|
|
if (currentEncryptedChat != null && (MessagesController.getInstance().secretWebpagePreview == 0 || AndroidUtilities.getPeerLayerVersion(currentEncryptedChat.layer) < 46)) {
|
|
return;
|
|
}
|
|
if (force && foundWebPage != null) {
|
|
if (foundWebPage.url != null) {
|
|
int index = TextUtils.indexOf(charSequence, foundWebPage.url);
|
|
char lastChar = 0;
|
|
boolean lenEqual = false;
|
|
if (index == -1) {
|
|
if (foundWebPage.display_url != null) {
|
|
index = TextUtils.indexOf(charSequence, foundWebPage.display_url);
|
|
lenEqual = index != -1 && index + foundWebPage.display_url.length() == charSequence.length();
|
|
lastChar = index != -1 && !lenEqual ? charSequence.charAt(index + foundWebPage.display_url.length()) : 0;
|
|
}
|
|
} else {
|
|
lenEqual = index + foundWebPage.url.length() == charSequence.length();
|
|
lastChar = !lenEqual ? charSequence.charAt(index + foundWebPage.url.length()) : 0;
|
|
}
|
|
if (index != -1 && (lenEqual || lastChar == ' ' || lastChar == ',' || lastChar == '.' || lastChar == '!' || lastChar == '/')) {
|
|
return;
|
|
}
|
|
}
|
|
pendingLinkSearchString = null;
|
|
showReplyPanel(false, null, null, foundWebPage, false);
|
|
}
|
|
Utilities.searchQueue.postRunnable(new Runnable() {
|
|
@Override
|
|
public void run() {
|
|
if (linkSearchRequestId != 0) {
|
|
ConnectionsManager.getInstance().cancelRequest(linkSearchRequestId, true);
|
|
linkSearchRequestId = 0;
|
|
}
|
|
ArrayList<CharSequence> urls = null;
|
|
CharSequence textToCheck;
|
|
try {
|
|
Matcher m = AndroidUtilities.WEB_URL.matcher(charSequence);
|
|
while (m.find()) {
|
|
if (m.start() > 0) {
|
|
if (charSequence.charAt(m.start() - 1) == '@') {
|
|
continue;
|
|
}
|
|
}
|
|
if (urls == null) {
|
|
urls = new ArrayList<>();
|
|
}
|
|
urls.add(charSequence.subSequence(m.start(), m.end()));
|
|
}
|
|
if (urls != null && foundUrls != null && urls.size() == foundUrls.size()) {
|
|
boolean clear = true;
|
|
for (int a = 0; a < urls.size(); a++) {
|
|
if (!TextUtils.equals(urls.get(a), foundUrls.get(a))) {
|
|
clear = false;
|
|
}
|
|
}
|
|
if (clear) {
|
|
return;
|
|
}
|
|
}
|
|
foundUrls = urls;
|
|
if (urls == null) {
|
|
AndroidUtilities.runOnUIThread(new Runnable() {
|
|
@Override
|
|
public void run() {
|
|
if (foundWebPage != null) {
|
|
showReplyPanel(false, null, null, foundWebPage, false);
|
|
foundWebPage = null;
|
|
}
|
|
}
|
|
});
|
|
return;
|
|
}
|
|
textToCheck = TextUtils.join(" ", urls);
|
|
} catch (Exception e) {
|
|
FileLog.e(e);
|
|
String text = charSequence.toString().toLowerCase();
|
|
if (charSequence.length() < 13 || !text.contains("http://") && !text.contains("https://")) {
|
|
AndroidUtilities.runOnUIThread(new Runnable() {
|
|
@Override
|
|
public void run() {
|
|
if (foundWebPage != null) {
|
|
showReplyPanel(false, null, null, foundWebPage, false);
|
|
foundWebPage = null;
|
|
}
|
|
}
|
|
});
|
|
return;
|
|
}
|
|
textToCheck = charSequence;
|
|
}
|
|
|
|
if (currentEncryptedChat != null && MessagesController.getInstance().secretWebpagePreview == 2) {
|
|
AndroidUtilities.runOnUIThread(new Runnable() {
|
|
@Override
|
|
public void run() {
|
|
AlertDialog.Builder builder = new AlertDialog.Builder(getParentActivity());
|
|
builder.setTitle(LocaleController.getString("AppName", R.string.AppName));
|
|
builder.setPositiveButton(LocaleController.getString("OK", R.string.OK), new DialogInterface.OnClickListener() {
|
|
@Override
|
|
public void onClick(DialogInterface dialog, int which) {
|
|
MessagesController.getInstance().secretWebpagePreview = 1;
|
|
ApplicationLoader.applicationContext.getSharedPreferences("mainconfig", Activity.MODE_PRIVATE).edit().putInt("secretWebpage2", MessagesController.getInstance().secretWebpagePreview).commit();
|
|
foundUrls = null;
|
|
searchLinks(charSequence, force);
|
|
}
|
|
});
|
|
builder.setNegativeButton(LocaleController.getString("Cancel", R.string.Cancel), null);
|
|
builder.setMessage(LocaleController.getString("SecretLinkPreviewAlert", R.string.SecretLinkPreviewAlert));
|
|
showDialog(builder.create());
|
|
|
|
MessagesController.getInstance().secretWebpagePreview = 0;
|
|
ApplicationLoader.applicationContext.getSharedPreferences("mainconfig", Activity.MODE_PRIVATE).edit().putInt("secretWebpage2", MessagesController.getInstance().secretWebpagePreview).commit();
|
|
}
|
|
});
|
|
return;
|
|
}
|
|
|
|
final TLRPC.TL_messages_getWebPagePreview req = new TLRPC.TL_messages_getWebPagePreview();
|
|
if (textToCheck instanceof String) {
|
|
req.message = (String) textToCheck;
|
|
} else {
|
|
req.message = textToCheck.toString();
|
|
}
|
|
linkSearchRequestId = ConnectionsManager.getInstance().sendRequest(req, new RequestDelegate() {
|
|
@Override
|
|
public void run(final TLObject response, final TLRPC.TL_error error) {
|
|
AndroidUtilities.runOnUIThread(new Runnable() {
|
|
@Override
|
|
public void run() {
|
|
linkSearchRequestId = 0;
|
|
if (error == null) {
|
|
if (response instanceof TLRPC.TL_messageMediaWebPage) {
|
|
foundWebPage = ((TLRPC.TL_messageMediaWebPage) response).webpage;
|
|
if (foundWebPage instanceof TLRPC.TL_webPage || foundWebPage instanceof TLRPC.TL_webPagePending) {
|
|
if (foundWebPage instanceof TLRPC.TL_webPagePending) {
|
|
pendingLinkSearchString = req.message;
|
|
}
|
|
if (currentEncryptedChat != null && foundWebPage instanceof TLRPC.TL_webPagePending) {
|
|
foundWebPage.url = req.message;
|
|
}
|
|
showReplyPanel(true, null, null, foundWebPage, false);
|
|
} else {
|
|
if (foundWebPage != null) {
|
|
showReplyPanel(false, null, null, foundWebPage, false);
|
|
foundWebPage = null;
|
|
}
|
|
}
|
|
} else {
|
|
if (foundWebPage != null) {
|
|
showReplyPanel(false, null, null, foundWebPage, false);
|
|
foundWebPage = null;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
});
|
|
}
|
|
});
|
|
ConnectionsManager.getInstance().bindRequestToGuid(linkSearchRequestId, classGuid);
|
|
}
|
|
});
|
|
}
|
|
|
|
private void forwardMessages(ArrayList<MessageObject> arrayList, boolean fromMyName) {
|
|
if (arrayList == null || arrayList.isEmpty()) {
|
|
return;
|
|
}
|
|
if (!fromMyName) {
|
|
AlertsCreator.showSendMediaAlert(SendMessagesHelper.getInstance().sendMessage(arrayList, dialog_id), this);
|
|
} else {
|
|
for (MessageObject object : arrayList) {
|
|
SendMessagesHelper.getInstance().processForwardFromMyName(object, dialog_id);
|
|
}
|
|
}
|
|
}
|
|
|
|
public void showReplyPanel(boolean show, MessageObject messageObjectToReply, ArrayList<MessageObject> messageObjectsToForward, TLRPC.WebPage webPage, boolean cancel) {
|
|
if (chatActivityEnterView == null) {
|
|
return;
|
|
}
|
|
if (show) {
|
|
if (messageObjectToReply == null && messageObjectsToForward == null && webPage == null) {
|
|
return;
|
|
}
|
|
if (searchItem != null && actionBar.isSearchFieldVisible()) {
|
|
actionBar.closeSearchField(false);
|
|
chatActivityEnterView.setFieldFocused();
|
|
AndroidUtilities.runOnUIThread(new Runnable() {
|
|
@Override
|
|
public void run() {
|
|
if (chatActivityEnterView != null) {
|
|
chatActivityEnterView.openKeyboard();
|
|
}
|
|
}
|
|
}, 100);
|
|
}
|
|
boolean openKeyboard = false;
|
|
if (messageObjectToReply != null && messageObjectToReply.getDialogId() != dialog_id) {
|
|
messageObjectsToForward = new ArrayList<>();
|
|
messageObjectsToForward.add(messageObjectToReply);
|
|
messageObjectToReply = null;
|
|
openKeyboard = true;
|
|
}
|
|
if (messageObjectToReply != null) {
|
|
forwardingMessages = null;
|
|
replyingMessageObject = messageObjectToReply;
|
|
chatActivityEnterView.setReplyingMessageObject(messageObjectToReply);
|
|
if (foundWebPage != null) {
|
|
return;
|
|
}
|
|
String name;
|
|
if (messageObjectToReply.isFromUser()) {
|
|
TLRPC.User user = MessagesController.getInstance().getUser(messageObjectToReply.messageOwner.from_id);
|
|
if (user == null) {
|
|
return;
|
|
}
|
|
name = UserObject.getUserName(user);
|
|
} else {
|
|
TLRPC.Chat chat = MessagesController.getInstance().getChat(messageObjectToReply.messageOwner.to_id.channel_id);
|
|
if (chat == null) {
|
|
return;
|
|
}
|
|
name = chat.title;
|
|
}
|
|
replyIconImageView.setImageResource(R.drawable.msg_panel_reply);
|
|
replyNameTextView.setText(name);
|
|
|
|
if (messageObjectToReply.messageOwner.media instanceof TLRPC.TL_messageMediaGame) {
|
|
replyObjectTextView.setText(Emoji.replaceEmoji(messageObjectToReply.messageOwner.media.game.title, replyObjectTextView.getPaint().getFontMetricsInt(), AndroidUtilities.dp(14), false));
|
|
} else if (messageObjectToReply.messageText != null) {
|
|
String mess = messageObjectToReply.messageText.toString();
|
|
if (mess.length() > 150) {
|
|
mess = mess.substring(0, 150);
|
|
}
|
|
mess = mess.replace('\n', ' ');
|
|
replyObjectTextView.setText(Emoji.replaceEmoji(mess, replyObjectTextView.getPaint().getFontMetricsInt(), AndroidUtilities.dp(14), false));
|
|
}
|
|
} else if (messageObjectsToForward != null) {
|
|
if (messageObjectsToForward.isEmpty()) {
|
|
return;
|
|
}
|
|
replyingMessageObject = null;
|
|
chatActivityEnterView.setReplyingMessageObject(null);
|
|
forwardingMessages = messageObjectsToForward;
|
|
if (foundWebPage != null) {
|
|
return;
|
|
}
|
|
chatActivityEnterView.setForceShowSendButton(true, false);
|
|
ArrayList<Integer> uids = new ArrayList<>();
|
|
replyIconImageView.setImageResource(R.drawable.msg_panel_forward);
|
|
MessageObject object = messageObjectsToForward.get(0);
|
|
if (object.isFromUser()) {
|
|
uids.add(object.messageOwner.from_id);
|
|
} else {
|
|
uids.add(-object.messageOwner.to_id.channel_id);
|
|
}
|
|
int type = messageObjectsToForward.get(0).type;
|
|
for (int a = 1; a < messageObjectsToForward.size(); a++) {
|
|
object = messageObjectsToForward.get(a);
|
|
Integer uid;
|
|
if (object.isFromUser()) {
|
|
uid = object.messageOwner.from_id;
|
|
} else {
|
|
uid = -object.messageOwner.to_id.channel_id;
|
|
}
|
|
if (!uids.contains(uid)) {
|
|
uids.add(uid);
|
|
}
|
|
if (messageObjectsToForward.get(a).type != type) {
|
|
type = -1;
|
|
}
|
|
}
|
|
StringBuilder userNames = new StringBuilder();
|
|
for (int a = 0; a < uids.size(); a++) {
|
|
Integer uid = uids.get(a);
|
|
TLRPC.Chat chat = null;
|
|
TLRPC.User user = null;
|
|
if (uid > 0) {
|
|
user = MessagesController.getInstance().getUser(uid);
|
|
} else {
|
|
chat = MessagesController.getInstance().getChat(-uid);
|
|
}
|
|
if (user == null && chat == null) {
|
|
continue;
|
|
}
|
|
if (uids.size() == 1) {
|
|
if (user != null) {
|
|
userNames.append(UserObject.getUserName(user));
|
|
} else {
|
|
userNames.append(chat.title);
|
|
}
|
|
} else if (uids.size() == 2 || userNames.length() == 0) {
|
|
if (userNames.length() > 0) {
|
|
userNames.append(", ");
|
|
}
|
|
if (user != null) {
|
|
if (!TextUtils.isEmpty(user.first_name)) {
|
|
userNames.append(user.first_name);
|
|
} else if (!TextUtils.isEmpty(user.last_name)) {
|
|
userNames.append(user.last_name);
|
|
} else {
|
|
userNames.append(" ");
|
|
}
|
|
} else {
|
|
userNames.append(chat.title);
|
|
}
|
|
} else {
|
|
userNames.append(" ");
|
|
userNames.append(LocaleController.formatPluralString("AndOther", uids.size() - 1));
|
|
break;
|
|
}
|
|
}
|
|
replyNameTextView.setText(userNames);
|
|
if (type == -1 || type == 0 || type == 10 || type == 11) {
|
|
if (messageObjectsToForward.size() == 1 && messageObjectsToForward.get(0).messageText != null) {
|
|
MessageObject messageObject = messageObjectsToForward.get(0);
|
|
if (messageObject.messageOwner.media instanceof TLRPC.TL_messageMediaGame) {
|
|
replyObjectTextView.setText(Emoji.replaceEmoji(messageObject.messageOwner.media.game.title, replyObjectTextView.getPaint().getFontMetricsInt(), AndroidUtilities.dp(14), false));
|
|
} else {
|
|
String mess = messageObject.messageText.toString();
|
|
if (mess.length() > 150) {
|
|
mess = mess.substring(0, 150);
|
|
}
|
|
mess = mess.replace('\n', ' ');
|
|
replyObjectTextView.setText(Emoji.replaceEmoji(mess, replyObjectTextView.getPaint().getFontMetricsInt(), AndroidUtilities.dp(14), false));
|
|
}
|
|
} else {
|
|
replyObjectTextView.setText(LocaleController.formatPluralString("ForwardedMessageCount", messageObjectsToForward.size()));
|
|
}
|
|
} else {
|
|
if (type == 1) {
|
|
replyObjectTextView.setText(LocaleController.formatPluralString("ForwardedPhoto", messageObjectsToForward.size()));
|
|
if (messageObjectsToForward.size() == 1) {
|
|
messageObjectToReply = messageObjectsToForward.get(0);
|
|
}
|
|
} else if (type == 4) {
|
|
replyObjectTextView.setText(LocaleController.formatPluralString("ForwardedLocation", messageObjectsToForward.size()));
|
|
} else if (type == 3) {
|
|
replyObjectTextView.setText(LocaleController.formatPluralString("ForwardedVideo", messageObjectsToForward.size()));
|
|
if (messageObjectsToForward.size() == 1) {
|
|
messageObjectToReply = messageObjectsToForward.get(0);
|
|
}
|
|
} else if (type == 12) {
|
|
replyObjectTextView.setText(LocaleController.formatPluralString("ForwardedContact", messageObjectsToForward.size()));
|
|
} else if (type == 2) {
|
|
replyObjectTextView.setText(LocaleController.formatPluralString("ForwardedAudio", messageObjectsToForward.size()));
|
|
} else if (type == 5) {
|
|
replyObjectTextView.setText(LocaleController.formatPluralString("ForwardedRound", messageObjectsToForward.size()));
|
|
} else if (type == 14) {
|
|
replyObjectTextView.setText(LocaleController.formatPluralString("ForwardedMusic", messageObjectsToForward.size()));
|
|
} else if (type == 13) {
|
|
replyObjectTextView.setText(LocaleController.formatPluralString("ForwardedSticker", messageObjectsToForward.size()));
|
|
} else if (type == 8 || type == 9) {
|
|
if (messageObjectsToForward.size() == 1) {
|
|
if (type == 8) {
|
|
replyObjectTextView.setText(LocaleController.getString("AttachGif", R.string.AttachGif));
|
|
} else {
|
|
String name;
|
|
if ((name = FileLoader.getDocumentFileName(messageObjectsToForward.get(0).getDocument())).length() != 0) {
|
|
replyObjectTextView.setText(name);
|
|
}
|
|
messageObjectToReply = messageObjectsToForward.get(0);
|
|
}
|
|
} else {
|
|
replyObjectTextView.setText(LocaleController.formatPluralString("ForwardedFile", messageObjectsToForward.size()));
|
|
}
|
|
}
|
|
}
|
|
} else {
|
|
replyIconImageView.setImageResource(R.drawable.msg_panel_link);
|
|
if (webPage instanceof TLRPC.TL_webPagePending) {
|
|
replyNameTextView.setText(LocaleController.getString("GettingLinkInfo", R.string.GettingLinkInfo));
|
|
replyObjectTextView.setText(pendingLinkSearchString);
|
|
} else {
|
|
if (webPage.site_name != null) {
|
|
replyNameTextView.setText(webPage.site_name);
|
|
} else if (webPage.title != null) {
|
|
replyNameTextView.setText(webPage.title);
|
|
} else {
|
|
replyNameTextView.setText(LocaleController.getString("LinkPreview", R.string.LinkPreview));
|
|
}
|
|
if (webPage.title != null) {
|
|
replyObjectTextView.setText(webPage.title);
|
|
} else if (webPage.description != null) {
|
|
replyObjectTextView.setText(webPage.description);
|
|
} else if (webPage.author != null) {
|
|
replyObjectTextView.setText(webPage.author);
|
|
} else {
|
|
replyObjectTextView.setText(webPage.display_url);
|
|
}
|
|
chatActivityEnterView.setWebPage(webPage, true);
|
|
}
|
|
}
|
|
FrameLayout.LayoutParams layoutParams1 = (FrameLayout.LayoutParams) replyNameTextView.getLayoutParams();
|
|
FrameLayout.LayoutParams layoutParams2 = (FrameLayout.LayoutParams) replyObjectTextView.getLayoutParams();
|
|
TLRPC.PhotoSize photoSize = null;
|
|
if (messageObjectToReply != null) {
|
|
photoSize = FileLoader.getClosestPhotoSizeWithSize(messageObjectToReply.photoThumbs2, 80);
|
|
if (photoSize == null) {
|
|
photoSize = FileLoader.getClosestPhotoSizeWithSize(messageObjectToReply.photoThumbs, 80);
|
|
}
|
|
}
|
|
if (photoSize == null || photoSize instanceof TLRPC.TL_photoSizeEmpty || photoSize.location instanceof TLRPC.TL_fileLocationUnavailable || messageObjectToReply.type == 13 || messageObjectToReply != null && messageObjectToReply.isSecretMedia()) {
|
|
replyImageView.setImageBitmap(null);
|
|
replyImageLocation = null;
|
|
replyImageView.setVisibility(View.INVISIBLE);
|
|
layoutParams1.leftMargin = layoutParams2.leftMargin = AndroidUtilities.dp(52);
|
|
} else {
|
|
if (messageObjectToReply.isRoundVideo()) {
|
|
replyImageView.setRoundRadius(AndroidUtilities.dp(17));
|
|
} else {
|
|
replyImageView.setRoundRadius(0);
|
|
}
|
|
replyImageLocation = photoSize.location;
|
|
replyImageView.setImage(replyImageLocation, "50_50", (Drawable) null);
|
|
replyImageView.setVisibility(View.VISIBLE);
|
|
layoutParams1.leftMargin = layoutParams2.leftMargin = AndroidUtilities.dp(96);
|
|
}
|
|
replyNameTextView.setLayoutParams(layoutParams1);
|
|
replyObjectTextView.setLayoutParams(layoutParams2);
|
|
chatActivityEnterView.showTopView(false, openKeyboard);
|
|
} else {
|
|
if (replyingMessageObject == null && forwardingMessages == null && foundWebPage == null) {
|
|
return;
|
|
}
|
|
if (replyingMessageObject != null && replyingMessageObject.messageOwner.reply_markup instanceof TLRPC.TL_replyKeyboardForceReply) {
|
|
SharedPreferences preferences = ApplicationLoader.applicationContext.getSharedPreferences("mainconfig", Activity.MODE_PRIVATE);
|
|
preferences.edit().putInt("answered_" + dialog_id, replyingMessageObject.getId()).commit();
|
|
}
|
|
if (foundWebPage != null) {
|
|
foundWebPage = null;
|
|
chatActivityEnterView.setWebPage(null, !cancel);
|
|
if (webPage != null && (replyingMessageObject != null || forwardingMessages != null)) {
|
|
showReplyPanel(true, replyingMessageObject, forwardingMessages, null, false);
|
|
return;
|
|
}
|
|
}
|
|
if (forwardingMessages != null) {
|
|
forwardMessages(forwardingMessages, false);
|
|
}
|
|
chatActivityEnterView.setForceShowSendButton(false, false);
|
|
chatActivityEnterView.hideTopView(false);
|
|
chatActivityEnterView.setReplyingMessageObject(null);
|
|
replyingMessageObject = null;
|
|
forwardingMessages = null;
|
|
replyImageLocation = null;
|
|
}
|
|
}
|
|
|
|
private void moveScrollToLastMessage() {
|
|
if (chatListView != null && !messages.isEmpty()) {
|
|
chatLayoutManager.scrollToPositionWithOffset(0, 0);
|
|
}
|
|
}
|
|
|
|
private boolean sendSecretMessageRead(MessageObject messageObject) {
|
|
if (messageObject == null || messageObject.isOut() || !messageObject.isSecretMedia() || messageObject.messageOwner.destroyTime != 0 || messageObject.messageOwner.ttl <= 0) {
|
|
return false;
|
|
}
|
|
if (currentEncryptedChat != null) {
|
|
MessagesController.getInstance().markMessageAsRead(dialog_id, messageObject.messageOwner.random_id, messageObject.messageOwner.ttl);
|
|
} else {
|
|
MessagesController.getInstance().markMessageAsRead(messageObject.getId(), ChatObject.isChannel(currentChat) ? currentChat.id : 0, messageObject.messageOwner.ttl);
|
|
}
|
|
messageObject.messageOwner.destroyTime = messageObject.messageOwner.ttl + ConnectionsManager.getInstance().getCurrentTime();
|
|
return true;
|
|
}
|
|
|
|
private void clearChatData() {
|
|
messages.clear();
|
|
messagesByDays.clear();
|
|
waitingForLoad.clear();
|
|
groupedMessagesMap.clear();
|
|
|
|
progressView.setVisibility(chatAdapter.botInfoRow == -1 ? View.VISIBLE : View.INVISIBLE);
|
|
chatListView.setEmptyView(null);
|
|
for (int a = 0; a < 2; a++) {
|
|
messagesDict[a].clear();
|
|
if (currentEncryptedChat == null) {
|
|
maxMessageId[a] = Integer.MAX_VALUE;
|
|
minMessageId[a] = Integer.MIN_VALUE;
|
|
} else {
|
|
maxMessageId[a] = Integer.MIN_VALUE;
|
|
minMessageId[a] = Integer.MAX_VALUE;
|
|
}
|
|
maxDate[a] = Integer.MIN_VALUE;
|
|
minDate[a] = 0;
|
|
endReached[a] = false;
|
|
cacheEndReached[a] = false;
|
|
forwardEndReached[a] = true;
|
|
}
|
|
first = true;
|
|
firstLoading = true;
|
|
loading = true;
|
|
loadingForward = false;
|
|
waitingForReplyMessageLoad = false;
|
|
startLoadFromMessageId = 0;
|
|
last_message_id = 0;
|
|
unreadMessageObject = null;
|
|
createUnreadMessageAfterId = 0;
|
|
createUnreadMessageAfterIdLoading = false;
|
|
needSelectFromMessageId = false;
|
|
chatAdapter.notifyDataSetChanged();
|
|
}
|
|
|
|
private void scrollToLastMessage(boolean pagedown) {
|
|
if (forwardEndReached[0] && first_unread_id == 0 && startLoadFromMessageId == 0) {
|
|
if (pagedown && chatLayoutManager.findFirstCompletelyVisibleItemPosition() == 0) {
|
|
showPagedownButton(false, true);
|
|
highlightMessageId = Integer.MAX_VALUE;
|
|
updateVisibleRows();
|
|
} else {
|
|
chatLayoutManager.scrollToPositionWithOffset(0, 0);
|
|
}
|
|
} else {
|
|
clearChatData();
|
|
waitingForLoad.add(lastLoadIndex);
|
|
MessagesController.getInstance().loadMessages(dialog_id, 30, 0, 0, true, 0, classGuid, 0, 0, ChatObject.isChannel(currentChat), lastLoadIndex++);
|
|
}
|
|
}
|
|
|
|
private void updateTextureViewPosition() {
|
|
if (fragmentView == null) {
|
|
return;
|
|
}
|
|
boolean foundTextureViewMessage = false;
|
|
int count = chatListView.getChildCount();
|
|
int additionalTop = chatActivityEnterView.isTopViewVisible() ? AndroidUtilities.dp(48) : 0;
|
|
for (int a = 0; a < count; a++) {
|
|
View view = chatListView.getChildAt(a);
|
|
if (view instanceof ChatMessageCell) {
|
|
ChatMessageCell messageCell = (ChatMessageCell) view;
|
|
MessageObject messageObject = messageCell.getMessageObject();
|
|
if (roundVideoContainer != null && messageObject.isRoundVideo() && MediaController.getInstance().isPlayingMessage(messageObject)) {
|
|
ImageReceiver imageReceiver = messageCell.getPhotoImage();
|
|
roundVideoContainer.setTranslationX(imageReceiver.getImageX());
|
|
roundVideoContainer.setTranslationY(fragmentView.getPaddingTop() + messageCell.getTop() + imageReceiver.getImageY() - additionalTop);
|
|
fragmentView.invalidate();
|
|
roundVideoContainer.invalidate();
|
|
foundTextureViewMessage = true;
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
if (roundVideoContainer != null) {
|
|
MessageObject messageObject = MediaController.getInstance().getPlayingMessageObject();
|
|
if (messageObject.eventId == 0) {
|
|
if (!foundTextureViewMessage) {
|
|
roundVideoContainer.setTranslationY(-AndroidUtilities.roundMessageSize - 100);
|
|
fragmentView.invalidate();
|
|
if (messageObject != null && messageObject.isRoundVideo()) {
|
|
if (checkTextureViewPosition || PipRoundVideoView.getInstance() != null) {
|
|
MediaController.getInstance().setCurrentRoundVisible(false);
|
|
} else {
|
|
scrollToMessageId(messageObject.getId(), 0, false, 0, true);
|
|
}
|
|
}
|
|
} else {
|
|
MediaController.getInstance().setCurrentRoundVisible(true);
|
|
scrollToMessageId(messageObject.getId(), 0, false, 0, true);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
private void updateMessagesVisisblePart() {
|
|
if (chatListView == null) {
|
|
return;
|
|
}
|
|
int count = chatListView.getChildCount();
|
|
int additionalTop = chatActivityEnterView.isTopViewVisible() ? AndroidUtilities.dp(48) : 0;
|
|
int height = chatListView.getMeasuredHeight();
|
|
int minPositionHolder = Integer.MAX_VALUE;
|
|
int minPositionDateHolder = Integer.MAX_VALUE;
|
|
View minDateChild = null;
|
|
View minChild = null;
|
|
View minMessageChild = null;
|
|
boolean foundTextureViewMessage = false;
|
|
for (int a = 0; a < count; a++) {
|
|
View view = chatListView.getChildAt(a);
|
|
if (view instanceof ChatMessageCell) {
|
|
ChatMessageCell messageCell = (ChatMessageCell) view;
|
|
int top = messageCell.getTop();
|
|
int bottom = messageCell.getBottom();
|
|
int viewTop = top >= 0 ? 0 : -top;
|
|
int viewBottom = messageCell.getMeasuredHeight();
|
|
if (viewBottom > height) {
|
|
viewBottom = viewTop + height;
|
|
}
|
|
messageCell.setVisiblePart(viewTop, viewBottom - viewTop);
|
|
|
|
MessageObject messageObject = messageCell.getMessageObject();
|
|
if (roundVideoContainer != null && messageObject.isRoundVideo() && MediaController.getInstance().isPlayingMessage(messageObject)) {
|
|
ImageReceiver imageReceiver = messageCell.getPhotoImage();
|
|
roundVideoContainer.setTranslationX(imageReceiver.getImageX());
|
|
roundVideoContainer.setTranslationY(fragmentView.getPaddingTop() + top + imageReceiver.getImageY() - additionalTop);
|
|
fragmentView.invalidate();
|
|
roundVideoContainer.invalidate();
|
|
foundTextureViewMessage = true;
|
|
}
|
|
}
|
|
if (view.getBottom() <= chatListView.getPaddingTop()) {
|
|
continue;
|
|
}
|
|
int position = view.getBottom();
|
|
if (position < minPositionHolder) {
|
|
minPositionHolder = position;
|
|
if (view instanceof ChatMessageCell || view instanceof ChatActionCell) {
|
|
minMessageChild = view;
|
|
}
|
|
minChild = view;
|
|
}
|
|
if (view instanceof ChatActionCell && ((ChatActionCell) view).getMessageObject().isDateObject) {
|
|
if (view.getAlpha() != 1.0f) {
|
|
view.setAlpha(1.0f);
|
|
}
|
|
if (position < minPositionDateHolder) {
|
|
minPositionDateHolder = position;
|
|
minDateChild = view;
|
|
}
|
|
}
|
|
}
|
|
if (roundVideoContainer != null) {
|
|
if (!foundTextureViewMessage) {
|
|
roundVideoContainer.setTranslationY(-AndroidUtilities.roundMessageSize - 100);
|
|
fragmentView.invalidate();
|
|
MessageObject messageObject = MediaController.getInstance().getPlayingMessageObject();
|
|
if (messageObject != null && messageObject.isRoundVideo() && messageObject.eventId == 0 &&checkTextureViewPosition) {
|
|
MediaController.getInstance().setCurrentRoundVisible(false);
|
|
}
|
|
} else {
|
|
MediaController.getInstance().setCurrentRoundVisible(true);
|
|
}
|
|
}
|
|
if (minMessageChild != null) {
|
|
MessageObject messageObject;
|
|
if (minMessageChild instanceof ChatMessageCell) {
|
|
messageObject = ((ChatMessageCell) minMessageChild).getMessageObject();
|
|
} else {
|
|
messageObject = ((ChatActionCell) minMessageChild).getMessageObject();
|
|
}
|
|
floatingDateView.setCustomDate(messageObject.messageOwner.date);
|
|
}
|
|
currentFloatingDateOnScreen = false;
|
|
currentFloatingTopIsNotMessage = !(minChild instanceof ChatMessageCell || minChild instanceof ChatActionCell);
|
|
if (minDateChild != null) {
|
|
if (minDateChild.getTop() > chatListView.getPaddingTop() || currentFloatingTopIsNotMessage) {
|
|
if (minDateChild.getAlpha() != 1.0f) {
|
|
minDateChild.setAlpha(1.0f);
|
|
}
|
|
hideFloatingDateView(!currentFloatingTopIsNotMessage);
|
|
} else {
|
|
if (minDateChild.getAlpha() != 0.0f) {
|
|
minDateChild.setAlpha(0.0f);
|
|
}
|
|
if (floatingDateAnimation != null) {
|
|
floatingDateAnimation.cancel();
|
|
floatingDateAnimation = null;
|
|
}
|
|
if (floatingDateView.getTag() == null) {
|
|
floatingDateView.setTag(1);
|
|
}
|
|
if (floatingDateView.getAlpha() != 1.0f) {
|
|
floatingDateView.setAlpha(1.0f);
|
|
}
|
|
currentFloatingDateOnScreen = true;
|
|
}
|
|
int offset = minDateChild.getBottom() - chatListView.getPaddingTop();
|
|
if (offset > floatingDateView.getMeasuredHeight() && offset < floatingDateView.getMeasuredHeight() * 2) {
|
|
floatingDateView.setTranslationY(-floatingDateView.getMeasuredHeight() * 2 + offset);
|
|
} else {
|
|
floatingDateView.setTranslationY(0);
|
|
}
|
|
} else {
|
|
hideFloatingDateView(true);
|
|
floatingDateView.setTranslationY(0);
|
|
}
|
|
}
|
|
|
|
private void toggleMute(boolean instant) {
|
|
boolean muted = MessagesController.getInstance().isDialogMuted(dialog_id);
|
|
if (!muted) {
|
|
if (instant) {
|
|
long flags;
|
|
SharedPreferences preferences = ApplicationLoader.applicationContext.getSharedPreferences("Notifications", Activity.MODE_PRIVATE);
|
|
SharedPreferences.Editor editor = preferences.edit();
|
|
editor.putInt("notify2_" + dialog_id, 2);
|
|
flags = 1;
|
|
MessagesStorage.getInstance().setDialogFlags(dialog_id, flags);
|
|
editor.commit();
|
|
TLRPC.TL_dialog dialog = MessagesController.getInstance().dialogs_dict.get(dialog_id);
|
|
if (dialog != null) {
|
|
dialog.notify_settings = new TLRPC.TL_peerNotifySettings();
|
|
dialog.notify_settings.mute_until = Integer.MAX_VALUE;
|
|
}
|
|
NotificationsController.updateServerNotificationsSettings(dialog_id);
|
|
NotificationsController.getInstance().removeNotificationsForDialog(dialog_id);
|
|
} else {
|
|
showDialog(AlertsCreator.createMuteAlert(getParentActivity(), dialog_id));
|
|
}
|
|
} else {
|
|
SharedPreferences preferences = ApplicationLoader.applicationContext.getSharedPreferences("Notifications", Activity.MODE_PRIVATE);
|
|
SharedPreferences.Editor editor = preferences.edit();
|
|
editor.putInt("notify2_" + dialog_id, 0);
|
|
MessagesStorage.getInstance().setDialogFlags(dialog_id, 0);
|
|
editor.commit();
|
|
TLRPC.TL_dialog dialog = MessagesController.getInstance().dialogs_dict.get(dialog_id);
|
|
if (dialog != null) {
|
|
dialog.notify_settings = new TLRPC.TL_peerNotifySettings();
|
|
}
|
|
NotificationsController.updateServerNotificationsSettings(dialog_id);
|
|
}
|
|
}
|
|
|
|
private int getScrollOffsetForMessage(MessageObject object) {
|
|
int offset = Integer.MAX_VALUE;
|
|
MessageObject.GroupedMessages groupedMessages = getValidGroupedMessage(object);
|
|
if (groupedMessages != null) {
|
|
MessageObject.GroupedMessagePosition currentPosition = groupedMessages.positions.get(object);
|
|
float maxH = Math.max(AndroidUtilities.displaySize.x, AndroidUtilities.displaySize.y) * 0.5f;
|
|
|
|
float itemHeight;
|
|
if (currentPosition.siblingHeights != null) {
|
|
itemHeight = currentPosition.siblingHeights[0];
|
|
} else {
|
|
itemHeight = currentPosition.ph;
|
|
}
|
|
float totalHeight = 0.0f;
|
|
float moveDiff = 0.0f;
|
|
SparseBooleanArray array = new SparseBooleanArray();
|
|
for (int a = 0; a < groupedMessages.posArray.size(); a++) {
|
|
MessageObject.GroupedMessagePosition pos = groupedMessages.posArray.get(a);
|
|
if (array.indexOfKey(pos.minY) < 0 && pos.siblingHeights == null) {
|
|
array.put(pos.minY, true);
|
|
if (pos.minY < currentPosition.minY) {
|
|
moveDiff -= pos.ph;
|
|
} else if (pos.minY > currentPosition.minY) {
|
|
moveDiff += pos.ph;
|
|
}
|
|
totalHeight += pos.ph;
|
|
}
|
|
}
|
|
if (Math.abs(totalHeight - itemHeight) < 0.02f) {
|
|
offset = (int) (chatListView.getMeasuredHeight() - totalHeight * maxH) / 2 - chatListView.getPaddingTop() - AndroidUtilities.dp(7);
|
|
} else {
|
|
offset = (int) (chatListView.getMeasuredHeight() - (itemHeight + moveDiff) * maxH) / 2 - chatListView.getPaddingTop() - AndroidUtilities.dp(7);
|
|
}
|
|
}
|
|
return Math.max(0, offset == Integer.MAX_VALUE ? (chatListView.getMeasuredHeight() - object.getApproximateHeight()) / 2 : offset);
|
|
}
|
|
|
|
public void scrollToMessageId(int id, int fromMessageId, boolean select, int loadIndex, boolean smooth) {
|
|
MessageObject object = messagesDict[loadIndex].get(id);
|
|
boolean query = false;
|
|
if (object != null) {
|
|
int index = messages.indexOf(object);
|
|
if (index != -1) {
|
|
if (select) {
|
|
highlightMessageId = id;
|
|
} else {
|
|
highlightMessageId = Integer.MAX_VALUE;
|
|
}
|
|
int yOffset = getScrollOffsetForMessage(object);
|
|
if (smooth) {
|
|
if (messages.get(messages.size() - 1) == object) {
|
|
chatListView.smoothScrollToPosition(chatAdapter.getItemCount() - 1);
|
|
} else {
|
|
chatListView.smoothScrollToPosition(chatAdapter.messagesStartRow + messages.indexOf(object));
|
|
}
|
|
} else {
|
|
if (messages.get(messages.size() - 1) == object) {
|
|
chatLayoutManager.scrollToPositionWithOffset(chatAdapter.getItemCount() - 1, yOffset, false);
|
|
} else {
|
|
chatLayoutManager.scrollToPositionWithOffset(chatAdapter.messagesStartRow + messages.indexOf(object), yOffset, false);
|
|
}
|
|
}
|
|
updateVisibleRows();
|
|
boolean found = false;
|
|
int count = chatListView.getChildCount();
|
|
for (int a = 0; a < count; a++) {
|
|
View view = chatListView.getChildAt(a);
|
|
if (view instanceof ChatMessageCell) {
|
|
ChatMessageCell cell = (ChatMessageCell) view;
|
|
MessageObject messageObject = cell.getMessageObject();
|
|
if (messageObject != null && messageObject.getId() == object.getId()) {
|
|
found = true;
|
|
break;
|
|
}
|
|
} else if (view instanceof ChatActionCell) {
|
|
ChatActionCell cell = (ChatActionCell) view;
|
|
MessageObject messageObject = cell.getMessageObject();
|
|
if (messageObject != null && messageObject.getId() == object.getId()) {
|
|
found = true;
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
if (!found) {
|
|
showPagedownButton(true, true);
|
|
}
|
|
} else {
|
|
query = true;
|
|
}
|
|
} else {
|
|
query = true;
|
|
}
|
|
|
|
if (query) {
|
|
if (currentEncryptedChat != null && !MessagesStorage.getInstance().checkMessageId(dialog_id, startLoadFromMessageId)) {
|
|
return;
|
|
}
|
|
/*clearChatData();
|
|
loadsCount = 0;
|
|
unread_to_load = 0;
|
|
first_unread_id = 0;
|
|
loadingForward = false;
|
|
unreadMessageObject = null;
|
|
scrollToMessage = null;*/
|
|
|
|
waitingForLoad.clear();
|
|
waitingForReplyMessageLoad = true;
|
|
highlightMessageId = Integer.MAX_VALUE;
|
|
scrollToMessagePosition = -10000;
|
|
startLoadFromMessageId = id;
|
|
if (id == createUnreadMessageAfterId) {
|
|
createUnreadMessageAfterIdLoading = true;
|
|
}
|
|
waitingForLoad.add(lastLoadIndex);
|
|
MessagesController.getInstance().loadMessages(loadIndex == 0 ? dialog_id : mergeDialogId, AndroidUtilities.isTablet() ? 30 : 20, startLoadFromMessageId, 0, true, 0, classGuid, 3, 0, ChatObject.isChannel(currentChat), lastLoadIndex++);
|
|
//emptyViewContainer.setVisibility(View.INVISIBLE);
|
|
}
|
|
returnToMessageId = fromMessageId;
|
|
returnToLoadIndex = loadIndex;
|
|
needSelectFromMessageId = select;
|
|
}
|
|
|
|
private void showPagedownButton(boolean show, boolean animated) {
|
|
if (pagedownButton == null) {
|
|
return;
|
|
}
|
|
if (show) {
|
|
pagedownButtonShowedByScroll = false;
|
|
if (pagedownButton.getTag() == null) {
|
|
if (pagedownButtonAnimation != null) {
|
|
pagedownButtonAnimation.cancel();
|
|
pagedownButtonAnimation = null;
|
|
}
|
|
if (animated) {
|
|
if (pagedownButton.getTranslationY() == 0) {
|
|
pagedownButton.setTranslationY(AndroidUtilities.dp(100));
|
|
}
|
|
pagedownButton.setVisibility(View.VISIBLE);
|
|
pagedownButton.setTag(1);
|
|
pagedownButtonAnimation = new AnimatorSet();
|
|
if (mentiondownButton.getVisibility() == View.VISIBLE) {
|
|
pagedownButtonAnimation.playTogether(
|
|
ObjectAnimator.ofFloat(pagedownButton, "translationY", 0),
|
|
ObjectAnimator.ofFloat(mentiondownButton, "translationY", -AndroidUtilities.dp(72)));
|
|
} else {
|
|
pagedownButtonAnimation.playTogether(ObjectAnimator.ofFloat(pagedownButton, "translationY", 0));
|
|
}
|
|
pagedownButtonAnimation.setDuration(200);
|
|
pagedownButtonAnimation.start();
|
|
} else {
|
|
pagedownButton.setVisibility(View.VISIBLE);
|
|
}
|
|
}
|
|
} else {
|
|
returnToMessageId = 0;
|
|
newUnreadMessageCount = 0;
|
|
if (pagedownButton.getTag() != null) {
|
|
pagedownButton.setTag(null);
|
|
if (pagedownButtonAnimation != null) {
|
|
pagedownButtonAnimation.cancel();
|
|
pagedownButtonAnimation = null;
|
|
}
|
|
if (animated) {
|
|
pagedownButtonAnimation = new AnimatorSet();
|
|
if (mentiondownButton.getVisibility() == View.VISIBLE) {
|
|
pagedownButtonAnimation.playTogether(
|
|
ObjectAnimator.ofFloat(pagedownButton, "translationY", AndroidUtilities.dp(100)),
|
|
ObjectAnimator.ofFloat(mentiondownButton, "translationY", 0));
|
|
} else {
|
|
pagedownButtonAnimation.playTogether(ObjectAnimator.ofFloat(pagedownButton, "translationY", AndroidUtilities.dp(100)));
|
|
}
|
|
pagedownButtonAnimation.setDuration(200);
|
|
pagedownButtonAnimation.addListener(new AnimatorListenerAdapter() {
|
|
@Override
|
|
public void onAnimationEnd(Animator animation) {
|
|
pagedownButtonCounter.setVisibility(View.INVISIBLE);
|
|
pagedownButton.setVisibility(View.INVISIBLE);
|
|
}
|
|
});
|
|
pagedownButtonAnimation.start();
|
|
} else {
|
|
pagedownButton.setVisibility(View.INVISIBLE);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
private void showMentiondownButton(boolean show, boolean animated) {
|
|
if (mentiondownButton == null) {
|
|
return;
|
|
}
|
|
if (show) {
|
|
if (mentiondownButton.getTag() == null) {
|
|
if (mentiondownButtonAnimation != null) {
|
|
mentiondownButtonAnimation.cancel();
|
|
mentiondownButtonAnimation = null;
|
|
}
|
|
if (animated) {
|
|
mentiondownButton.setVisibility(View.VISIBLE);
|
|
mentiondownButton.setTag(1);
|
|
if (pagedownButton.getVisibility() == View.VISIBLE) {
|
|
mentiondownButton.setTranslationY(-AndroidUtilities.dp(72));
|
|
mentiondownButtonAnimation = ObjectAnimator.ofFloat(mentiondownButton, "alpha", 0.0f, 1.0f).setDuration(200);
|
|
} else {
|
|
if (mentiondownButton.getTranslationY() == 0) {
|
|
mentiondownButton.setTranslationY(AndroidUtilities.dp(100));
|
|
}
|
|
mentiondownButtonAnimation = ObjectAnimator.ofFloat(mentiondownButton, "translationY", 0).setDuration(200);
|
|
}
|
|
mentiondownButtonAnimation.start();
|
|
} else {
|
|
mentiondownButton.setVisibility(View.VISIBLE);
|
|
}
|
|
}
|
|
} else {
|
|
returnToMessageId = 0;
|
|
if (mentiondownButton.getTag() != null) {
|
|
mentiondownButton.setTag(null);
|
|
if (mentiondownButtonAnimation != null) {
|
|
mentiondownButtonAnimation.cancel();
|
|
mentiondownButtonAnimation = null;
|
|
}
|
|
if (animated) {
|
|
if (pagedownButton.getVisibility() == View.VISIBLE) {
|
|
mentiondownButtonAnimation = ObjectAnimator.ofFloat(mentiondownButton, "alpha", 1.0f, 0.0f).setDuration(200);
|
|
} else {
|
|
mentiondownButtonAnimation = ObjectAnimator.ofFloat(mentiondownButton, "translationY", AndroidUtilities.dp(100)).setDuration(200);
|
|
}
|
|
mentiondownButtonAnimation.addListener(new AnimatorListenerAdapter() {
|
|
@Override
|
|
public void onAnimationEnd(Animator animation) {
|
|
mentiondownButtonCounter.setVisibility(View.INVISIBLE);
|
|
mentiondownButton.setVisibility(View.INVISIBLE);
|
|
}
|
|
});
|
|
mentiondownButtonAnimation.start();
|
|
} else {
|
|
mentiondownButton.setVisibility(View.INVISIBLE);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
private void updateSecretStatus() {
|
|
if (bottomOverlay == null) {
|
|
return;
|
|
}
|
|
boolean hideKeyboard = false;
|
|
if (ChatObject.isChannel(currentChat) && currentChat.banned_rights != null && currentChat.banned_rights.send_messages) {
|
|
if (AndroidUtilities.isBannedForever(currentChat.banned_rights.until_date)) {
|
|
bottomOverlayText.setText(LocaleController.getString("SendMessageRestrictedForever", R.string.SendMessageRestrictedForever));
|
|
} else {
|
|
bottomOverlayText.setText(LocaleController.formatString("SendMessageRestricted", R.string.SendMessageRestricted, LocaleController.formatDateForBan(currentChat.banned_rights.until_date)));
|
|
}
|
|
bottomOverlay.setVisibility(View.VISIBLE);
|
|
if (mentionListAnimation != null) {
|
|
mentionListAnimation.cancel();
|
|
mentionListAnimation = null;
|
|
}
|
|
mentionContainer.setVisibility(View.GONE);
|
|
mentionContainer.setTag(null);
|
|
hideKeyboard = true;
|
|
} else {
|
|
if (currentEncryptedChat == null || bigEmptyView == null) {
|
|
bottomOverlay.setVisibility(View.INVISIBLE);
|
|
return;
|
|
}
|
|
if (currentEncryptedChat instanceof TLRPC.TL_encryptedChatRequested) {
|
|
bottomOverlayText.setText(LocaleController.getString("EncryptionProcessing", R.string.EncryptionProcessing));
|
|
bottomOverlay.setVisibility(View.VISIBLE);
|
|
hideKeyboard = true;
|
|
} else if (currentEncryptedChat instanceof TLRPC.TL_encryptedChatWaiting) {
|
|
bottomOverlayText.setText(AndroidUtilities.replaceTags(LocaleController.formatString("AwaitingEncryption", R.string.AwaitingEncryption, "<b>" + currentUser.first_name + "</b>")));
|
|
bottomOverlay.setVisibility(View.VISIBLE);
|
|
hideKeyboard = true;
|
|
} else if (currentEncryptedChat instanceof TLRPC.TL_encryptedChatDiscarded) {
|
|
bottomOverlayText.setText(LocaleController.getString("EncryptionRejected", R.string.EncryptionRejected));
|
|
bottomOverlay.setVisibility(View.VISIBLE);
|
|
chatActivityEnterView.setFieldText("");
|
|
DraftQuery.cleanDraft(dialog_id, false);
|
|
hideKeyboard = true;
|
|
} else if (currentEncryptedChat instanceof TLRPC.TL_encryptedChat) {
|
|
bottomOverlay.setVisibility(View.INVISIBLE);
|
|
}
|
|
checkRaiseSensors();
|
|
checkActionBarMenu();
|
|
}
|
|
if (hideKeyboard) {
|
|
chatActivityEnterView.hidePopup(false);
|
|
if (getParentActivity() != null) {
|
|
AndroidUtilities.hideKeyboard(getParentActivity().getCurrentFocus());
|
|
}
|
|
}
|
|
}
|
|
|
|
@Override
|
|
public void onRequestPermissionsResultFragment(int requestCode, String[] permissions, int[] grantResults) {
|
|
if (chatActivityEnterView != null) {
|
|
chatActivityEnterView.onRequestPermissionsResultFragment(requestCode, permissions, grantResults);
|
|
}
|
|
if (mentionsAdapter != null) {
|
|
mentionsAdapter.onRequestPermissionsResultFragment(requestCode, permissions, grantResults);
|
|
}
|
|
if (requestCode == 17 && chatAttachAlert != null) {
|
|
chatAttachAlert.checkCamera(false);
|
|
} else if (requestCode == 21) {
|
|
if (getParentActivity() == null) {
|
|
return;
|
|
}
|
|
if (grantResults != null && grantResults.length != 0 && grantResults[0] != PackageManager.PERMISSION_GRANTED) {
|
|
AlertDialog.Builder builder = new AlertDialog.Builder(getParentActivity());
|
|
builder.setTitle(LocaleController.getString("AppName", R.string.AppName));
|
|
builder.setMessage(LocaleController.getString("PermissionNoAudioVideo", R.string.PermissionNoAudioVideo));
|
|
builder.setNegativeButton(LocaleController.getString("PermissionOpenSettings", R.string.PermissionOpenSettings), new DialogInterface.OnClickListener() {
|
|
@TargetApi(Build.VERSION_CODES.GINGERBREAD)
|
|
@Override
|
|
public void onClick(DialogInterface dialog, int which) {
|
|
try {
|
|
Intent intent = new Intent(android.provider.Settings.ACTION_APPLICATION_DETAILS_SETTINGS);
|
|
intent.setData(Uri.parse("package:" + ApplicationLoader.applicationContext.getPackageName()));
|
|
getParentActivity().startActivity(intent);
|
|
} catch (Exception e) {
|
|
FileLog.e(e);
|
|
}
|
|
}
|
|
});
|
|
builder.setPositiveButton(LocaleController.getString("OK", R.string.OK), null);
|
|
builder.show();
|
|
}
|
|
} else if (requestCode == 19 && grantResults != null && grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
|
|
processSelectedAttach(attach_photo);
|
|
} else if (requestCode == 20 && grantResults != null && grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
|
|
processSelectedAttach(attach_video);
|
|
} else if (requestCode == 101 && currentUser != null) {
|
|
if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
|
|
VoIPHelper.startCall(currentUser, getParentActivity(), MessagesController.getInstance().getUserFull(currentUser.id));
|
|
} else {
|
|
VoIPHelper.permissionDenied(getParentActivity(), null);
|
|
}
|
|
}
|
|
}
|
|
|
|
private void checkActionBarMenu() {
|
|
if (currentEncryptedChat != null && !(currentEncryptedChat instanceof TLRPC.TL_encryptedChat) ||
|
|
currentChat != null && ChatObject.isNotInChat(currentChat) ||
|
|
currentUser != null && UserObject.isDeleted(currentUser)) {
|
|
if (timeItem2 != null) {
|
|
timeItem2.setVisibility(View.GONE);
|
|
}
|
|
if (avatarContainer != null) {
|
|
avatarContainer.hideTimeItem();
|
|
}
|
|
} else {
|
|
if (timeItem2 != null) {
|
|
timeItem2.setVisibility(View.VISIBLE);
|
|
}
|
|
if (avatarContainer != null) {
|
|
avatarContainer.showTimeItem();
|
|
}
|
|
}
|
|
if (avatarContainer != null && currentEncryptedChat != null) {
|
|
avatarContainer.setTime(currentEncryptedChat.ttl);
|
|
}
|
|
checkAndUpdateAvatar();
|
|
}
|
|
|
|
private int getMessageType(MessageObject messageObject) {
|
|
if (messageObject == null) {
|
|
return -1;
|
|
}
|
|
if (currentEncryptedChat == null) {
|
|
boolean isBroadcastError = isBroadcast && messageObject.getId() <= 0 && messageObject.isSendError();
|
|
if (!isBroadcast && messageObject.getId() <= 0 && messageObject.isOut() || isBroadcastError) {
|
|
if (messageObject.isSendError()) {
|
|
if (!messageObject.isMediaEmpty()) {
|
|
return 0;
|
|
} else {
|
|
return 20;
|
|
}
|
|
} else {
|
|
return -1;
|
|
}
|
|
} else {
|
|
if (messageObject.type == 6) {
|
|
return -1;
|
|
} else if (messageObject.type == 10 || messageObject.type == 11 || messageObject.type == 16) {
|
|
if (messageObject.getId() == 0) {
|
|
return -1;
|
|
}
|
|
return 1;
|
|
} else {
|
|
if (messageObject.isVoice()) {
|
|
return 2;
|
|
} else if (messageObject.isSticker()) {
|
|
TLRPC.InputStickerSet inputStickerSet = messageObject.getInputStickerSet();
|
|
if (inputStickerSet instanceof TLRPC.TL_inputStickerSetID) {
|
|
if (!StickersQuery.isStickerPackInstalled(inputStickerSet.id)) {
|
|
return 7;
|
|
}
|
|
} else if (inputStickerSet instanceof TLRPC.TL_inputStickerSetShortName) {
|
|
if (!StickersQuery.isStickerPackInstalled(inputStickerSet.short_name)) {
|
|
return 7;
|
|
}
|
|
}
|
|
return 9;
|
|
} else if ((!messageObject.isRoundVideo() || messageObject.isRoundVideo() && BuildVars.DEBUG_VERSION) && (messageObject.messageOwner.media instanceof TLRPC.TL_messageMediaPhoto || messageObject.getDocument() != null || messageObject.isMusic() || messageObject.isVideo())) {
|
|
boolean canSave = false;
|
|
if (!TextUtils.isEmpty(messageObject.messageOwner.attachPath)) {
|
|
File f = new File(messageObject.messageOwner.attachPath);
|
|
if (f.exists()) {
|
|
canSave = true;
|
|
}
|
|
}
|
|
if (!canSave) {
|
|
File f = FileLoader.getPathToMessage(messageObject.messageOwner);
|
|
if (f.exists()) {
|
|
canSave = true;
|
|
}
|
|
}
|
|
if (canSave) {
|
|
if (messageObject.getDocument() != null) {
|
|
String mime = messageObject.getDocument().mime_type;
|
|
if (mime != null) {
|
|
if (messageObject.getDocumentName().endsWith("attheme")) {
|
|
return 10;
|
|
} else if (mime.endsWith("/xml")) {
|
|
return 5;
|
|
} else if (mime.endsWith("/png") || mime.endsWith("/jpg") || mime.endsWith("/jpeg")) {
|
|
return 6;
|
|
}
|
|
}
|
|
}
|
|
return 4;
|
|
}
|
|
} else if (messageObject.type == 12) {
|
|
return 8;
|
|
} else if (messageObject.isMediaEmpty()) {
|
|
return 3;
|
|
}
|
|
return 2;
|
|
}
|
|
}
|
|
} else {
|
|
if (messageObject.isSending()) {
|
|
return -1;
|
|
}
|
|
if (messageObject.type == 6) {
|
|
return -1;
|
|
} else if (messageObject.isSendError()) {
|
|
if (!messageObject.isMediaEmpty()) {
|
|
return 0;
|
|
} else {
|
|
return 20;
|
|
}
|
|
} else if (messageObject.type == 10 || messageObject.type == 11) {
|
|
if (messageObject.getId() == 0 || messageObject.isSending()) {
|
|
return -1;
|
|
} else {
|
|
return 1;
|
|
}
|
|
} else {
|
|
if (messageObject.isVoice()) {
|
|
return 2;
|
|
} else if (messageObject.isSticker()) {
|
|
TLRPC.InputStickerSet inputStickerSet = messageObject.getInputStickerSet();
|
|
if (inputStickerSet instanceof TLRPC.TL_inputStickerSetShortName) {
|
|
if (!StickersQuery.isStickerPackInstalled(inputStickerSet.short_name)) {
|
|
return 7;
|
|
}
|
|
}
|
|
} else if (!messageObject.isRoundVideo() && (messageObject.messageOwner.media instanceof TLRPC.TL_messageMediaPhoto || messageObject.getDocument() != null || messageObject.isMusic() || messageObject.isVideo())) {
|
|
boolean canSave = false;
|
|
if (!TextUtils.isEmpty(messageObject.messageOwner.attachPath)) {
|
|
File f = new File(messageObject.messageOwner.attachPath);
|
|
if (f.exists()) {
|
|
canSave = true;
|
|
}
|
|
}
|
|
if (!canSave) {
|
|
File f = FileLoader.getPathToMessage(messageObject.messageOwner);
|
|
if (f.exists()) {
|
|
canSave = true;
|
|
}
|
|
}
|
|
if (canSave) {
|
|
if (messageObject.getDocument() != null) {
|
|
String mime = messageObject.getDocument().mime_type;
|
|
if (mime != null && mime.endsWith("text/xml")) {
|
|
return 5;
|
|
}
|
|
}
|
|
if (messageObject.messageOwner.ttl <= 0) {
|
|
return 4;
|
|
}
|
|
}
|
|
} else if (messageObject.type == 12) {
|
|
return 8;
|
|
} else if (messageObject.isMediaEmpty()) {
|
|
return 3;
|
|
}
|
|
return 2;
|
|
}
|
|
}
|
|
}
|
|
|
|
private void addToSelectedMessages(MessageObject messageObject, boolean outside) {
|
|
addToSelectedMessages(messageObject, outside, true);
|
|
}
|
|
|
|
private void addToSelectedMessages(MessageObject messageObject, boolean outside, boolean last) {
|
|
int index = messageObject.getDialogId() == dialog_id ? 0 : 1;
|
|
if (outside && messageObject.getGroupId() != 0) {
|
|
boolean hasUnselected = false;
|
|
MessageObject.GroupedMessages groupedMessages = groupedMessagesMap.get(messageObject.getGroupId());
|
|
if (groupedMessages != null) {
|
|
int lastNum = 0;
|
|
for (int a = 0; a < groupedMessages.messages.size(); a++) {
|
|
MessageObject message = groupedMessages.messages.get(a);
|
|
if (!selectedMessagesIds[index].containsKey(message.getId())) {
|
|
hasUnselected = true;
|
|
lastNum = a;
|
|
}
|
|
}
|
|
|
|
for (int a = 0; a < groupedMessages.messages.size(); a++) {
|
|
MessageObject message = groupedMessages.messages.get(a);
|
|
if (hasUnselected) {
|
|
if (!selectedMessagesIds[index].containsKey(message.getId())) {
|
|
addToSelectedMessages(message, false, a == lastNum);
|
|
}
|
|
} else {
|
|
addToSelectedMessages(message, false, a == groupedMessages.messages.size() - 1);
|
|
}
|
|
}
|
|
}
|
|
return;
|
|
}
|
|
if (selectedMessagesIds[index].containsKey(messageObject.getId())) {
|
|
selectedMessagesIds[index].remove(messageObject.getId());
|
|
if (messageObject.type == 0 || messageObject.caption != null) {
|
|
selectedMessagesCanCopyIds[index].remove(messageObject.getId());
|
|
}
|
|
if (messageObject.isSticker()) {
|
|
selectedMessagesCanStarIds[index].remove(messageObject.getId());
|
|
}
|
|
if (messageObject.canEditMessage(currentChat) && messageObject.getGroupId() != 0) {
|
|
MessageObject.GroupedMessages groupedMessages = groupedMessagesMap.get(messageObject.getGroupId());
|
|
if (groupedMessages != null && groupedMessages.messages.size() > 1) {
|
|
canEditMessagesCount--;
|
|
}
|
|
}
|
|
if (!messageObject.canDeleteMessage(currentChat)) {
|
|
cantDeleteMessagesCount--;
|
|
}
|
|
} else {
|
|
if (selectedMessagesIds[0].size() + selectedMessagesIds[1].size() >= 100) {
|
|
return;
|
|
}
|
|
selectedMessagesIds[index].put(messageObject.getId(), messageObject);
|
|
if (messageObject.type == 0 || messageObject.caption != null) {
|
|
selectedMessagesCanCopyIds[index].put(messageObject.getId(), messageObject);
|
|
}
|
|
if (messageObject.isSticker()) {
|
|
selectedMessagesCanStarIds[index].put(messageObject.getId(), messageObject);
|
|
}
|
|
if (messageObject.canEditMessage(currentChat) && messageObject.getGroupId() != 0) {
|
|
MessageObject.GroupedMessages groupedMessages = groupedMessagesMap.get(messageObject.getGroupId());
|
|
if (groupedMessages != null && groupedMessages.messages.size() > 1) {
|
|
canEditMessagesCount++;
|
|
}
|
|
}
|
|
if (!messageObject.canDeleteMessage(currentChat)) {
|
|
cantDeleteMessagesCount++;
|
|
}
|
|
}
|
|
if (last && actionBar.isActionModeShowed()) {
|
|
int selectedCount = selectedMessagesIds[0].size() + selectedMessagesIds[1].size();
|
|
if (selectedCount == 0) {
|
|
actionBar.hideActionMode();
|
|
updatePinnedMessageView(true);
|
|
startReplyOnTextChange = false;
|
|
} else {
|
|
ActionBarMenuItem copyItem = actionBar.createActionMode().getItem(copy);
|
|
ActionBarMenuItem starItem = actionBar.createActionMode().getItem(star);
|
|
ActionBarMenuItem editItem = actionBar.createActionMode().getItem(edit);
|
|
final ActionBarMenuItem replyItem = actionBar.createActionMode().getItem(reply);
|
|
int copyVisible = copyItem.getVisibility();
|
|
int starVisible = starItem.getVisibility();
|
|
copyItem.setVisibility(selectedMessagesCanCopyIds[0].size() + selectedMessagesCanCopyIds[1].size() != 0 ? View.VISIBLE : View.GONE);
|
|
starItem.setVisibility(StickersQuery.canAddStickerToFavorites() && (selectedMessagesCanStarIds[0].size() + selectedMessagesCanStarIds[1].size()) == selectedCount ? View.VISIBLE : View.GONE);
|
|
int newCopyVisible = copyItem.getVisibility();
|
|
int newStarVisible = starItem.getVisibility();
|
|
actionBar.createActionMode().getItem(delete).setVisibility(cantDeleteMessagesCount == 0 ? View.VISIBLE : View.GONE);
|
|
if (editItem != null) {
|
|
editItem.setVisibility(canEditMessagesCount == 1 && selectedMessagesIds[0].size() + selectedMessagesIds[1].size() == 1 ? View.VISIBLE : View.GONE);
|
|
}
|
|
hasUnfavedSelected = false;
|
|
for (int a = 0; a < 2; a++) {
|
|
for (HashMap.Entry<Integer, MessageObject> entry : selectedMessagesCanStarIds[a].entrySet()) {
|
|
MessageObject msg = entry.getValue();
|
|
if (!StickersQuery.isStickerInFavorites(msg.getDocument())) {
|
|
hasUnfavedSelected = true;
|
|
break;
|
|
}
|
|
}
|
|
if (hasUnfavedSelected) {
|
|
break;
|
|
}
|
|
}
|
|
starItem.setIcon(hasUnfavedSelected ? R.drawable.ic_ab_fave : R.drawable.ic_ab_unfave);
|
|
if (replyItem != null) {
|
|
boolean allowChatActions = true;
|
|
if (currentEncryptedChat != null && AndroidUtilities.getPeerLayerVersion(currentEncryptedChat.layer) < 46 ||
|
|
isBroadcast ||
|
|
bottomOverlayChat != null && bottomOverlayChat.getVisibility() == View.VISIBLE ||
|
|
currentChat != null && (ChatObject.isNotInChat(currentChat) || ChatObject.isChannel(currentChat) && !ChatObject.canPost(currentChat) && !currentChat.megagroup || !ChatObject.canSendMessages(currentChat))) {
|
|
allowChatActions = false;
|
|
}
|
|
final int newVisibility = allowChatActions && selectedMessagesIds[0].size() + selectedMessagesIds[1].size() == 1 ? View.VISIBLE : View.GONE;
|
|
startReplyOnTextChange = newVisibility == View.VISIBLE && !chatActivityEnterView.hasText();
|
|
if (replyItem.getVisibility() != newVisibility) {
|
|
if (replyButtonAnimation != null) {
|
|
replyButtonAnimation.cancel();
|
|
}
|
|
if (copyVisible != newCopyVisible || starVisible != newStarVisible) {
|
|
if (newVisibility == View.VISIBLE) {
|
|
replyItem.setAlpha(1.0f);
|
|
replyItem.setScaleX(1.0f);
|
|
} else {
|
|
replyItem.setAlpha(0.0f);
|
|
replyItem.setScaleX(0.0f);
|
|
}
|
|
replyItem.setVisibility(newVisibility);
|
|
} else {
|
|
replyButtonAnimation = new AnimatorSet();
|
|
replyItem.setPivotX(AndroidUtilities.dp(54));
|
|
editItem.setPivotX(AndroidUtilities.dp(54));
|
|
if (newVisibility == View.VISIBLE) {
|
|
replyItem.setVisibility(newVisibility);
|
|
replyButtonAnimation.playTogether(
|
|
ObjectAnimator.ofFloat(replyItem, "alpha", 1.0f),
|
|
ObjectAnimator.ofFloat(replyItem, "scaleX", 1.0f),
|
|
ObjectAnimator.ofFloat(editItem, "alpha", 1.0f),
|
|
ObjectAnimator.ofFloat(editItem, "scaleX", 1.0f)
|
|
);
|
|
} else {
|
|
replyButtonAnimation.playTogether(
|
|
ObjectAnimator.ofFloat(replyItem, "alpha", 0.0f),
|
|
ObjectAnimator.ofFloat(replyItem, "scaleX", 0.0f),
|
|
ObjectAnimator.ofFloat(editItem, "alpha", 0.0f),
|
|
ObjectAnimator.ofFloat(editItem, "scaleX", 0.0f)
|
|
);
|
|
}
|
|
replyButtonAnimation.setDuration(100);
|
|
replyButtonAnimation.addListener(new AnimatorListenerAdapter() {
|
|
@Override
|
|
public void onAnimationEnd(Animator animation) {
|
|
if (replyButtonAnimation != null && replyButtonAnimation.equals(animation)) {
|
|
if (newVisibility == View.GONE) {
|
|
replyItem.setVisibility(View.GONE);
|
|
}
|
|
}
|
|
}
|
|
|
|
@Override
|
|
public void onAnimationCancel(Animator animation) {
|
|
if (replyButtonAnimation != null && replyButtonAnimation.equals(animation)) {
|
|
replyButtonAnimation = null;
|
|
}
|
|
}
|
|
});
|
|
replyButtonAnimation.start();
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
private void processRowSelect(View view, boolean outside) {
|
|
MessageObject message = null;
|
|
if (view instanceof ChatMessageCell) {
|
|
message = ((ChatMessageCell) view).getMessageObject();
|
|
} else if (view instanceof ChatActionCell) {
|
|
message = ((ChatActionCell) view).getMessageObject();
|
|
}
|
|
|
|
int type = getMessageType(message);
|
|
|
|
if (type < 2 || type == 20) {
|
|
return;
|
|
}
|
|
addToSelectedMessages(message, outside);
|
|
updateActionModeTitle();
|
|
updateVisibleRows();
|
|
}
|
|
|
|
private void updateActionModeTitle() {
|
|
if (!actionBar.isActionModeShowed()) {
|
|
return;
|
|
}
|
|
if (!selectedMessagesIds[0].isEmpty() || !selectedMessagesIds[1].isEmpty()) {
|
|
selectedMessagesCountTextView.setNumber(selectedMessagesIds[0].size() + selectedMessagesIds[1].size(), true);
|
|
}
|
|
}
|
|
|
|
private void updateTitle() {
|
|
if (avatarContainer == null) {
|
|
return;
|
|
}
|
|
if (currentChat != null) {
|
|
avatarContainer.setTitle(currentChat.title);
|
|
} else if (currentUser != null) {
|
|
if (currentUser.self) {
|
|
avatarContainer.setTitle(LocaleController.getString("SavedMessages", R.string.SavedMessages));
|
|
} else if (!MessagesController.isSupportId(currentUser.id) && ContactsController.getInstance().contactsDict.get(currentUser.id) == null && (ContactsController.getInstance().contactsDict.size() != 0 || !ContactsController.getInstance().isLoadingContacts())) {
|
|
if (!TextUtils.isEmpty(currentUser.phone)) {
|
|
avatarContainer.setTitle(PhoneFormat.getInstance().format("+" + currentUser.phone));
|
|
} else {
|
|
avatarContainer.setTitle(UserObject.getUserName(currentUser));
|
|
}
|
|
} else {
|
|
avatarContainer.setTitle(UserObject.getUserName(currentUser));
|
|
}
|
|
}
|
|
}
|
|
|
|
private void updateBotButtons() {
|
|
if (headerItem == null || currentUser == null || currentEncryptedChat != null || !currentUser.bot) {
|
|
return;
|
|
}
|
|
boolean hasHelp = false;
|
|
boolean hasSettings = false;
|
|
if (!botInfo.isEmpty()) {
|
|
for (HashMap.Entry<Integer, TLRPC.BotInfo> entry : botInfo.entrySet()) {
|
|
TLRPC.BotInfo info = entry.getValue();
|
|
for (int a = 0; a < info.commands.size(); a++) {
|
|
TLRPC.TL_botCommand command = info.commands.get(a);
|
|
if (command.command.toLowerCase().equals("help")) {
|
|
hasHelp = true;
|
|
} else if (command.command.toLowerCase().equals("settings")) {
|
|
hasSettings = true;
|
|
}
|
|
if (hasSettings && hasHelp) {
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
if (hasHelp) {
|
|
headerItem.showSubItem(bot_help);
|
|
} else {
|
|
headerItem.hideSubItem(bot_help);
|
|
}
|
|
if (hasSettings) {
|
|
headerItem.showSubItem(bot_settings);
|
|
} else {
|
|
headerItem.hideSubItem(bot_settings);
|
|
}
|
|
}
|
|
|
|
private void updateTitleIcons() {
|
|
if (avatarContainer == null) {
|
|
return;
|
|
}
|
|
Drawable rightIcon = MessagesController.getInstance().isDialogMuted(dialog_id) ? Theme.chat_muteIconDrawable : null;
|
|
avatarContainer.setTitleIcons(currentEncryptedChat != null ? Theme.chat_lockIconDrawable : null, rightIcon);
|
|
if (muteItem != null) {
|
|
if (rightIcon != null) {
|
|
muteItem.setText(LocaleController.getString("UnmuteNotifications", R.string.UnmuteNotifications));
|
|
} else {
|
|
muteItem.setText(LocaleController.getString("MuteNotifications", R.string.MuteNotifications));
|
|
}
|
|
}
|
|
}
|
|
|
|
private void checkAndUpdateAvatar() {
|
|
if (currentUser != null) {
|
|
TLRPC.User user = MessagesController.getInstance().getUser(currentUser.id);
|
|
if (user == null) {
|
|
return;
|
|
}
|
|
currentUser = user;
|
|
} else if (currentChat != null) {
|
|
TLRPC.Chat chat = MessagesController.getInstance().getChat(currentChat.id);
|
|
if (chat == null) {
|
|
return;
|
|
}
|
|
currentChat = chat;
|
|
}
|
|
if (avatarContainer != null) {
|
|
avatarContainer.checkAndUpdateAvatar();
|
|
}
|
|
}
|
|
|
|
public void openVideoEditor(String videoPath, String caption) {
|
|
if (getParentActivity() != null) {
|
|
final Bitmap thumb = ThumbnailUtils.createVideoThumbnail(videoPath, MediaStore.Video.Thumbnails.MINI_KIND);
|
|
PhotoViewer.getInstance().setParentActivity(getParentActivity());
|
|
final ArrayList<Object> cameraPhoto = new ArrayList<>();
|
|
MediaController.PhotoEntry entry = new MediaController.PhotoEntry(0, 0, 0, videoPath, 0, true);
|
|
entry.caption = caption;
|
|
cameraPhoto.add(entry);
|
|
PhotoViewer.getInstance().openPhotoForSelect(cameraPhoto, 0, 2, new PhotoViewer.EmptyPhotoViewerProvider() {
|
|
@Override
|
|
public Bitmap getThumbForPhoto(MessageObject messageObject, TLRPC.FileLocation fileLocation, int index) {
|
|
return thumb;
|
|
}
|
|
|
|
@Override
|
|
public void sendButtonPressed(int index, VideoEditedInfo videoEditedInfo) {
|
|
sendMedia((MediaController.PhotoEntry) cameraPhoto.get(0), videoEditedInfo);
|
|
}
|
|
|
|
@Override
|
|
public boolean canScrollAway() {
|
|
return false;
|
|
}
|
|
}, this);
|
|
} else {
|
|
SendMessagesHelper.prepareSendingVideo(videoPath, 0, 0, 0, 0, null, dialog_id, replyingMessageObject, null, 0);
|
|
showReplyPanel(false, null, null, null, false);
|
|
DraftQuery.cleanDraft(dialog_id, true);
|
|
}
|
|
}
|
|
|
|
private void showAttachmentError() {
|
|
if (getParentActivity() == null) {
|
|
return;
|
|
}
|
|
Toast toast = Toast.makeText(getParentActivity(), LocaleController.getString("UnsupportedAttachment", R.string.UnsupportedAttachment), Toast.LENGTH_SHORT);
|
|
toast.show();
|
|
}
|
|
|
|
private void sendUriAsDocument(Uri uri) {
|
|
if (uri == null) {
|
|
return;
|
|
}
|
|
String extractUriFrom = uri.toString();
|
|
if (extractUriFrom.contains("com.google.android.apps.photos.contentprovider")) {
|
|
try {
|
|
String firstExtraction = extractUriFrom.split("/1/")[1];
|
|
int index = firstExtraction.indexOf("/ACTUAL");
|
|
if (index != -1) {
|
|
firstExtraction = firstExtraction.substring(0, index);
|
|
String secondExtraction = URLDecoder.decode(firstExtraction, "UTF-8");
|
|
uri = Uri.parse(secondExtraction);
|
|
}
|
|
} catch (Exception e) {
|
|
FileLog.e(e);
|
|
}
|
|
}
|
|
String tempPath = AndroidUtilities.getPath(uri);
|
|
String originalPath = tempPath;
|
|
if (tempPath == null) {
|
|
originalPath = uri.toString();
|
|
tempPath = MediaController.copyFileToCache(uri, "file");
|
|
}
|
|
if (tempPath == null) {
|
|
showAttachmentError();
|
|
return;
|
|
}
|
|
SendMessagesHelper.prepareSendingDocument(tempPath, originalPath, null, null, dialog_id, replyingMessageObject, null);
|
|
}
|
|
|
|
@Override
|
|
public void onActivityResultFragment(int requestCode, int resultCode, Intent data) {
|
|
if (resultCode == Activity.RESULT_OK) {
|
|
if (requestCode == 0) {
|
|
PhotoViewer.getInstance().setParentActivity(getParentActivity());
|
|
final ArrayList<Object> arrayList = new ArrayList<>();
|
|
int orientation = 0;
|
|
try {
|
|
ExifInterface ei = new ExifInterface(currentPicturePath);
|
|
int exif = ei.getAttributeInt(ExifInterface.TAG_ORIENTATION, ExifInterface.ORIENTATION_NORMAL);
|
|
switch (exif) {
|
|
case ExifInterface.ORIENTATION_ROTATE_90:
|
|
orientation = 90;
|
|
break;
|
|
case ExifInterface.ORIENTATION_ROTATE_180:
|
|
orientation = 180;
|
|
break;
|
|
case ExifInterface.ORIENTATION_ROTATE_270:
|
|
orientation = 270;
|
|
break;
|
|
}
|
|
} catch (Exception e) {
|
|
FileLog.e(e);
|
|
}
|
|
arrayList.add(new MediaController.PhotoEntry(0, 0, 0, currentPicturePath, orientation, false));
|
|
|
|
PhotoViewer.getInstance().openPhotoForSelect(arrayList, 0, 2, new PhotoViewer.EmptyPhotoViewerProvider() {
|
|
@Override
|
|
public void sendButtonPressed(int index, VideoEditedInfo videoEditedInfo) {
|
|
sendMedia((MediaController.PhotoEntry) arrayList.get(0), null);
|
|
}
|
|
}, this);
|
|
AndroidUtilities.addMediaToGallery(currentPicturePath);
|
|
currentPicturePath = null;
|
|
} else if (requestCode == 1) {
|
|
if (data == null || data.getData() == null) {
|
|
showAttachmentError();
|
|
return;
|
|
}
|
|
Uri uri = data.getData();
|
|
if (uri.toString().contains("video")) {
|
|
String videoPath = null;
|
|
try {
|
|
videoPath = AndroidUtilities.getPath(uri);
|
|
} catch (Exception e) {
|
|
FileLog.e(e);
|
|
}
|
|
if (videoPath == null) {
|
|
showAttachmentError();
|
|
}
|
|
if (paused) {
|
|
startVideoEdit = videoPath;
|
|
} else {
|
|
openVideoEditor(videoPath, null);
|
|
}
|
|
} else {
|
|
SendMessagesHelper.prepareSendingPhoto(null, uri, dialog_id, replyingMessageObject, null, null, null, 0);
|
|
}
|
|
showReplyPanel(false, null, null, null, false);
|
|
DraftQuery.cleanDraft(dialog_id, true);
|
|
} else if (requestCode == 2) {
|
|
String videoPath = null;
|
|
FileLog.d("pic path " + currentPicturePath);
|
|
if (data != null && currentPicturePath != null) {
|
|
if (new File(currentPicturePath).exists()) {
|
|
data = null;
|
|
}
|
|
}
|
|
if (data != null) {
|
|
Uri uri = data.getData();
|
|
if (uri != null) {
|
|
FileLog.d("video record uri " + uri.toString());
|
|
videoPath = AndroidUtilities.getPath(uri);
|
|
FileLog.d("resolved path = " + videoPath);
|
|
if (videoPath == null || !(new File(videoPath).exists())) {
|
|
videoPath = currentPicturePath;
|
|
}
|
|
} else {
|
|
videoPath = currentPicturePath;
|
|
}
|
|
AndroidUtilities.addMediaToGallery(currentPicturePath);
|
|
currentPicturePath = null;
|
|
}
|
|
if (videoPath == null && currentPicturePath != null) {
|
|
File f = new File(currentPicturePath);
|
|
if (f.exists()) {
|
|
videoPath = currentPicturePath;
|
|
}
|
|
currentPicturePath = null;
|
|
}
|
|
if (paused) {
|
|
startVideoEdit = videoPath;
|
|
} else {
|
|
openVideoEditor(videoPath, null);
|
|
}
|
|
} else if (requestCode == 21) {
|
|
if (data == null) {
|
|
showAttachmentError();
|
|
return;
|
|
}
|
|
if (data.getData() != null) {
|
|
sendUriAsDocument(data.getData());
|
|
} else if (data.getClipData() != null) {
|
|
ClipData clipData = data.getClipData();
|
|
for (int i = 0; i < clipData.getItemCount(); i++) {
|
|
sendUriAsDocument(clipData.getItemAt(i).getUri());
|
|
}
|
|
} else {
|
|
showAttachmentError();
|
|
}
|
|
showReplyPanel(false, null, null, null, false);
|
|
DraftQuery.cleanDraft(dialog_id, true);
|
|
} else if (requestCode == 31) {
|
|
if (data == null || data.getData() == null) {
|
|
showAttachmentError();
|
|
return;
|
|
}
|
|
Uri uri = data.getData();
|
|
Cursor c = null;
|
|
try {
|
|
c = getParentActivity().getContentResolver().query(uri, new String[]{ContactsContract.Data.DISPLAY_NAME, ContactsContract.CommonDataKinds.Phone.NUMBER}, null, null, null);
|
|
if (c != null) {
|
|
boolean sent = false;
|
|
while (c.moveToNext()) {
|
|
sent = true;
|
|
String name = c.getString(0);
|
|
String number = c.getString(1);
|
|
TLRPC.User user = new TLRPC.TL_user();
|
|
user.first_name = name;
|
|
user.last_name = "";
|
|
user.phone = number;
|
|
SendMessagesHelper.getInstance().sendMessage(user, dialog_id, replyingMessageObject, null, null);
|
|
}
|
|
if (sent) {
|
|
showReplyPanel(false, null, null, null, false);
|
|
DraftQuery.cleanDraft(dialog_id, true);
|
|
}
|
|
}
|
|
} finally {
|
|
try {
|
|
if (c != null && !c.isClosed()) {
|
|
c.close();
|
|
}
|
|
} catch (Exception e) {
|
|
FileLog.e(e);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
@Override
|
|
public void saveSelfArgs(Bundle args) {
|
|
if (currentPicturePath != null) {
|
|
args.putString("path", currentPicturePath);
|
|
}
|
|
}
|
|
|
|
@Override
|
|
public void restoreSelfArgs(Bundle args) {
|
|
currentPicturePath = args.getString("path");
|
|
}
|
|
|
|
private void removeUnreadPlane() {
|
|
if (unreadMessageObject != null) {
|
|
forwardEndReached[0] = forwardEndReached[1] = true;
|
|
first_unread_id = 0;
|
|
last_message_id = 0;
|
|
createUnreadMessageAfterId = 0;
|
|
createUnreadMessageAfterIdLoading = false;
|
|
unread_to_load = 0;
|
|
removeMessageObject(unreadMessageObject);
|
|
unreadMessageObject = null;
|
|
}
|
|
}
|
|
|
|
public boolean processSendingText(String text) {
|
|
return chatActivityEnterView.processSendingText(text);
|
|
}
|
|
|
|
@Override
|
|
public void didReceivedNotification(int id, final Object... args) {
|
|
if (id == NotificationCenter.messagesDidLoaded) {
|
|
int guid = (Integer) args[10];
|
|
if (guid == classGuid) {
|
|
if (!openAnimationEnded) {
|
|
NotificationCenter.getInstance().setAllowedNotificationsDutingAnimation(new int[]{NotificationCenter.chatInfoDidLoaded, NotificationCenter.dialogsNeedReload,
|
|
NotificationCenter.closeChats, NotificationCenter.botKeyboardDidLoaded/*, NotificationCenter.botInfoDidLoaded*/});
|
|
}
|
|
int queryLoadIndex = (Integer) args[11];
|
|
int index = waitingForLoad.indexOf(queryLoadIndex);
|
|
int currentUserId = UserConfig.getClientUserId();
|
|
if (index == -1) {
|
|
return;
|
|
} else {
|
|
waitingForLoad.remove(index);
|
|
}
|
|
ArrayList<MessageObject> messArr = (ArrayList<MessageObject>) args[2];
|
|
boolean createUnreadLoading = false;
|
|
if (waitingForReplyMessageLoad) {
|
|
if (!createUnreadMessageAfterIdLoading) {
|
|
boolean found = false;
|
|
for (int a = 0; a < messArr.size(); a++) {
|
|
MessageObject obj = messArr.get(a);
|
|
if (obj.getId() == startLoadFromMessageId) {
|
|
found = true;
|
|
break;
|
|
}
|
|
if (a + 1 < messArr.size()) {
|
|
MessageObject obj2 = messArr.get(a + 1);
|
|
if (obj.getId() >= startLoadFromMessageId && obj2.getId() < startLoadFromMessageId) {
|
|
startLoadFromMessageId = obj.getId();
|
|
found = true;
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
if (!found) {
|
|
startLoadFromMessageId = 0;
|
|
return;
|
|
}
|
|
}
|
|
int startLoadFrom = startLoadFromMessageId;
|
|
boolean needSelect = needSelectFromMessageId;
|
|
int unreadAfterId = createUnreadMessageAfterId;
|
|
createUnreadLoading = createUnreadMessageAfterIdLoading;
|
|
clearChatData();
|
|
createUnreadMessageAfterId = unreadAfterId;
|
|
startLoadFromMessageId = startLoadFrom;
|
|
needSelectFromMessageId = needSelect;
|
|
}
|
|
|
|
loadsCount++;
|
|
long did = (Long) args[0];
|
|
int loadIndex = did == dialog_id ? 0 : 1;
|
|
int count = (Integer) args[1];
|
|
boolean isCache = (Boolean) args[3];
|
|
int fnid = (Integer) args[4];
|
|
int last_unread_date = (Integer) args[7];
|
|
int load_type = (Integer) args[8];
|
|
int loaded_max_id = (Integer) args[12];
|
|
int loaded_mentions_count = (Integer) args[13];
|
|
if (loaded_mentions_count < 0) {
|
|
loaded_mentions_count *= -1;
|
|
hasAllMentionsLocal = false;
|
|
} else if (first) {
|
|
hasAllMentionsLocal = true;
|
|
}
|
|
if (load_type == 4) {
|
|
startLoadFromMessageId = loaded_max_id;
|
|
|
|
for (int a = messArr.size() - 1; a > 0; a--) {
|
|
MessageObject obj = messArr.get(a);
|
|
if (obj.type < 0 && obj.getId() == startLoadFromMessageId) {
|
|
startLoadFromMessageId = messArr.get(a - 1).getId();
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
boolean wasUnread = false;
|
|
boolean showUnreadCounter = false;
|
|
if (fnid != 0) {
|
|
last_message_id = (Integer) args[5];
|
|
if (load_type == 3) {
|
|
if (loadingFromOldPosition) {
|
|
unread_to_load = (Integer) args[6];
|
|
if (unread_to_load != 0) {
|
|
createUnreadMessageAfterId = fnid;
|
|
}
|
|
showUnreadCounter = true;
|
|
loadingFromOldPosition = false;
|
|
}
|
|
first_unread_id = 0;
|
|
} else {
|
|
first_unread_id = fnid;
|
|
unread_to_load = (Integer) args[6];
|
|
}
|
|
} else if (startLoadFromMessageId != 0 && (load_type == 3 || load_type == 4)) {
|
|
last_message_id = (Integer) args[5];
|
|
}
|
|
int newRowsCount = 0;
|
|
|
|
if (load_type != 0) {
|
|
forwardEndReached[loadIndex] = startLoadFromMessageId == 0 && last_message_id == 0;
|
|
}
|
|
if ((load_type == 1 || load_type == 3) && loadIndex == 1) {
|
|
endReached[0] = cacheEndReached[0] = true;
|
|
forwardEndReached[0] = false;
|
|
minMessageId[0] = 0;
|
|
}
|
|
|
|
if (loadsCount == 1 && messArr.size() > 20) {
|
|
loadsCount++;
|
|
}
|
|
|
|
if (firstLoading) {
|
|
if (!forwardEndReached[loadIndex]) {
|
|
messages.clear();
|
|
messagesByDays.clear();
|
|
groupedMessagesMap.clear();
|
|
for (int a = 0; a < 2; a++) {
|
|
messagesDict[a].clear();
|
|
if (currentEncryptedChat == null) {
|
|
maxMessageId[a] = Integer.MAX_VALUE;
|
|
minMessageId[a] = Integer.MIN_VALUE;
|
|
} else {
|
|
maxMessageId[a] = Integer.MIN_VALUE;
|
|
minMessageId[a] = Integer.MAX_VALUE;
|
|
}
|
|
maxDate[a] = Integer.MIN_VALUE;
|
|
minDate[a] = 0;
|
|
}
|
|
}
|
|
firstLoading = false;
|
|
AndroidUtilities.runOnUIThread(new Runnable() {
|
|
@Override
|
|
public void run() {
|
|
if (parentLayout != null) {
|
|
parentLayout.resumeDelayedFragmentAnimation();
|
|
}
|
|
}
|
|
});
|
|
}
|
|
|
|
if (load_type == 1) {
|
|
Collections.reverse(messArr);
|
|
}
|
|
if (currentEncryptedChat == null) {
|
|
MessagesQuery.loadReplyMessagesForMessages(messArr, dialog_id);
|
|
}
|
|
int approximateHeightSum = 0;
|
|
if (load_type == 2 && messArr.isEmpty() && !isCache) {
|
|
forwardEndReached[0] = true;
|
|
}
|
|
HashMap<Long, MessageObject.GroupedMessages> newGroups = null;
|
|
HashMap<Long, MessageObject.GroupedMessages> changedGroups = null;
|
|
for (int a = 0; a < messArr.size(); a++) {
|
|
MessageObject obj = messArr.get(a);
|
|
approximateHeightSum += obj.getApproximateHeight();
|
|
if (currentUser != null) {
|
|
if (currentUser.self) {
|
|
obj.messageOwner.out = true;
|
|
}
|
|
if (currentUser.bot && obj.isOut() || currentUser.id == currentUserId) {
|
|
obj.setIsRead();
|
|
}
|
|
}
|
|
if (messagesDict[loadIndex].containsKey(obj.getId())) {
|
|
continue;
|
|
}
|
|
if (loadIndex == 1) {
|
|
obj.setIsRead();
|
|
}
|
|
if (loadIndex == 0 && ChatObject.isChannel(currentChat) && obj.getId() == 1) {
|
|
endReached[loadIndex] = true;
|
|
cacheEndReached[loadIndex] = true;
|
|
}
|
|
if (obj.getId() > 0) {
|
|
maxMessageId[loadIndex] = Math.min(obj.getId(), maxMessageId[loadIndex]);
|
|
minMessageId[loadIndex] = Math.max(obj.getId(), minMessageId[loadIndex]);
|
|
} else if (currentEncryptedChat != null) {
|
|
maxMessageId[loadIndex] = Math.max(obj.getId(), maxMessageId[loadIndex]);
|
|
minMessageId[loadIndex] = Math.min(obj.getId(), minMessageId[loadIndex]);
|
|
}
|
|
if (obj.messageOwner.date != 0) {
|
|
maxDate[loadIndex] = Math.max(maxDate[loadIndex], obj.messageOwner.date);
|
|
if (minDate[loadIndex] == 0 || obj.messageOwner.date < minDate[loadIndex]) {
|
|
minDate[loadIndex] = obj.messageOwner.date;
|
|
}
|
|
}
|
|
|
|
if (obj.getId() == last_message_id) {
|
|
forwardEndReached[loadIndex] = true;
|
|
}
|
|
|
|
if (obj.type < 0 || loadIndex == 1 && obj.messageOwner.action instanceof TLRPC.TL_messageActionChatMigrateTo) {
|
|
continue;
|
|
}
|
|
|
|
if (!obj.isOut() && obj.isUnread()) {
|
|
wasUnread = true;
|
|
}
|
|
messagesDict[loadIndex].put(obj.getId(), obj);
|
|
ArrayList<MessageObject> dayArray = messagesByDays.get(obj.dateKey);
|
|
|
|
if (dayArray == null) {
|
|
dayArray = new ArrayList<>();
|
|
messagesByDays.put(obj.dateKey, dayArray);
|
|
TLRPC.Message dateMsg = new TLRPC.TL_message();
|
|
dateMsg.message = LocaleController.formatDateChat(obj.messageOwner.date);
|
|
dateMsg.id = 0;
|
|
dateMsg.date = obj.messageOwner.date;
|
|
MessageObject dateObj = new MessageObject(dateMsg, null, false);
|
|
dateObj.type = 10;
|
|
dateObj.contentType = 1;
|
|
dateObj.isDateObject = true;
|
|
if (load_type == 1) {
|
|
messages.add(0, dateObj);
|
|
} else {
|
|
messages.add(dateObj);
|
|
}
|
|
newRowsCount++;
|
|
}
|
|
|
|
if (obj.hasValidGroupId()) {
|
|
MessageObject.GroupedMessages groupedMessages = groupedMessagesMap.get(obj.messageOwner.grouped_id);
|
|
if (groupedMessages != null) {
|
|
if (messages.size() > 1) {
|
|
MessageObject previous;
|
|
if (load_type == 1) {
|
|
previous = messages.get(0);
|
|
} else {
|
|
previous = messages.get(messages.size() - 2);
|
|
}
|
|
if (previous.messageOwner.grouped_id == obj.messageOwner.grouped_id) {
|
|
if (previous.localGroupId != 0) {
|
|
obj.localGroupId = previous.localGroupId;
|
|
groupedMessages = groupedMessagesMap.get(previous.localGroupId);
|
|
}
|
|
} else if (previous.messageOwner.grouped_id != obj.messageOwner.grouped_id) {
|
|
obj.localGroupId = Utilities.random.nextLong();
|
|
groupedMessages = null;
|
|
}
|
|
}
|
|
}
|
|
if (groupedMessages == null) {
|
|
groupedMessages = new MessageObject.GroupedMessages();
|
|
groupedMessages.groupId = obj.getGroupId();
|
|
groupedMessagesMap.put(groupedMessages.groupId, groupedMessages);
|
|
} else if (newGroups == null || !newGroups.containsKey(obj.getGroupId())) {
|
|
if (changedGroups == null) {
|
|
changedGroups = new HashMap<>();
|
|
}
|
|
changedGroups.put(obj.getGroupId(), groupedMessages);
|
|
}
|
|
if (newGroups == null) {
|
|
newGroups = new HashMap<>();
|
|
}
|
|
newGroups.put(groupedMessages.groupId, groupedMessages);
|
|
if (load_type == 1) {
|
|
groupedMessages.messages.add(obj);
|
|
} else {
|
|
groupedMessages.messages.add(0, obj);
|
|
}
|
|
} else if (obj.messageOwner.grouped_id != 0) {
|
|
obj.messageOwner.grouped_id = 0;
|
|
}
|
|
|
|
newRowsCount++;
|
|
dayArray.add(obj);
|
|
if (load_type == 1) {
|
|
messages.add(0, obj);
|
|
} else {
|
|
messages.add(messages.size() - 1, obj);
|
|
}
|
|
|
|
MessageObject prevObj;
|
|
if (currentEncryptedChat == null) {
|
|
if (createUnreadMessageAfterId != 0 && load_type != 1 && a + 1 < messArr.size()) {
|
|
prevObj = messArr.get(a + 1);
|
|
if (obj.isOut() || prevObj.getId() >= createUnreadMessageAfterId) {
|
|
prevObj = null;
|
|
}
|
|
} else {
|
|
prevObj = null;
|
|
}
|
|
} else {
|
|
if (createUnreadMessageAfterId != 0 && load_type != 1 && a - 1 >= 0) {
|
|
prevObj = messArr.get(a - 1);
|
|
if (obj.isOut() || prevObj.getId() >= createUnreadMessageAfterId) {
|
|
prevObj = null;
|
|
}
|
|
} else {
|
|
prevObj = null;
|
|
}
|
|
}
|
|
if (load_type == 2 && obj.getId() == first_unread_id) {
|
|
if (approximateHeightSum > AndroidUtilities.displaySize.y / 2 || !forwardEndReached[0]) {
|
|
TLRPC.Message dateMsg = new TLRPC.TL_message();
|
|
dateMsg.message = "";
|
|
dateMsg.id = 0;
|
|
MessageObject dateObj = new MessageObject(dateMsg, null, false);
|
|
dateObj.type = 6;
|
|
dateObj.contentType = 2;
|
|
messages.add(messages.size() - 1, dateObj);
|
|
unreadMessageObject = dateObj;
|
|
scrollToMessage = unreadMessageObject;
|
|
scrollToMessagePosition = -10000;
|
|
newRowsCount++;
|
|
}
|
|
} else if ((load_type == 3 || load_type == 4) && obj.getId() == startLoadFromMessageId) {
|
|
if (needSelectFromMessageId) {
|
|
highlightMessageId = obj.getId();
|
|
} else {
|
|
highlightMessageId = Integer.MAX_VALUE;
|
|
}
|
|
scrollToMessage = obj;
|
|
startLoadFromMessageId = 0;
|
|
if (scrollToMessagePosition == -10000) {
|
|
scrollToMessagePosition = -9000;
|
|
}
|
|
}
|
|
if (load_type != 2 && unreadMessageObject == null && createUnreadMessageAfterId != 0 &&
|
|
(currentEncryptedChat == null && !obj.isOut() && obj.getId() >= createUnreadMessageAfterId || currentEncryptedChat != null && !obj.isOut() && obj.getId() <= createUnreadMessageAfterId) &&
|
|
(load_type == 1 || prevObj != null || prevObj == null && createUnreadLoading && a == messArr.size() - 1)) {
|
|
TLRPC.Message dateMsg = new TLRPC.TL_message();
|
|
dateMsg.message = "";
|
|
dateMsg.id = 0;
|
|
MessageObject dateObj = new MessageObject(dateMsg, null, false);
|
|
dateObj.type = 6;
|
|
dateObj.contentType = 2;
|
|
if (load_type == 1) {
|
|
messages.add(1, dateObj);
|
|
} else {
|
|
messages.add(messages.size() - 1, dateObj);
|
|
}
|
|
unreadMessageObject = dateObj;
|
|
if (load_type == 3) {
|
|
scrollToMessage = unreadMessageObject;
|
|
startLoadFromMessageId = 0;
|
|
scrollToMessagePosition = -9000;
|
|
}
|
|
newRowsCount++;
|
|
}
|
|
}
|
|
if (createUnreadLoading) {
|
|
createUnreadMessageAfterId = 0;
|
|
}
|
|
if (load_type == 0 && newRowsCount == 0) {
|
|
loadsCount--;
|
|
}
|
|
if (newGroups != null) {
|
|
for (HashMap.Entry<Long, MessageObject.GroupedMessages> entry : newGroups.entrySet()) {
|
|
MessageObject.GroupedMessages groupedMessages = entry.getValue();
|
|
groupedMessages.calculate();
|
|
if (chatAdapter != null && changedGroups != null && changedGroups.containsKey(entry.getKey())) {
|
|
MessageObject messageObject = groupedMessages.messages.get(groupedMessages.messages.size() - 1);
|
|
int idx = messages.indexOf(messageObject);
|
|
if (idx >= 0) {
|
|
chatAdapter.notifyItemRangeChanged(idx + chatAdapter.messagesStartRow, groupedMessages.messages.size());
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
if (forwardEndReached[loadIndex] && loadIndex != 1) {
|
|
first_unread_id = 0;
|
|
last_message_id = 0;
|
|
createUnreadMessageAfterId = 0;
|
|
}
|
|
|
|
if (load_type == 1) {
|
|
int rowsRemoved = 0;
|
|
if (messArr.size() != count && (!isCache || currentEncryptedChat != null || forwardEndReached[loadIndex])) {
|
|
forwardEndReached[loadIndex] = true;
|
|
if (loadIndex != 1) {
|
|
first_unread_id = 0;
|
|
last_message_id = 0;
|
|
createUnreadMessageAfterId = 0;
|
|
chatAdapter.notifyItemRemoved(chatAdapter.loadingDownRow);
|
|
rowsRemoved++;
|
|
}
|
|
startLoadFromMessageId = 0;
|
|
}
|
|
if (newRowsCount > 0) {
|
|
int firstVisPos = chatLayoutManager.findFirstVisibleItemPosition();
|
|
int top = 0;
|
|
if (firstVisPos == 0) {
|
|
firstVisPos++;
|
|
}
|
|
View firstVisView = chatLayoutManager.findViewByPosition(firstVisPos);
|
|
top = ((firstVisView == null) ? 0 : chatListView.getMeasuredHeight() - firstVisView.getBottom() - chatListView.getPaddingBottom());
|
|
chatAdapter.notifyItemRangeInserted(1, newRowsCount);
|
|
if (firstVisPos != RecyclerView.NO_POSITION) {
|
|
chatLayoutManager.scrollToPositionWithOffset(firstVisPos + newRowsCount - rowsRemoved, top);
|
|
}
|
|
}
|
|
loadingForward = false;
|
|
} else {
|
|
if (messArr.size() < count && load_type != 3 && load_type != 4) {
|
|
if (isCache) {
|
|
if (currentEncryptedChat != null || isBroadcast) {
|
|
endReached[loadIndex] = true;
|
|
}
|
|
if (load_type != 2) {
|
|
cacheEndReached[loadIndex] = true;
|
|
}
|
|
} else if (load_type != 2 || messArr.size() == 0 && messages.isEmpty()) {
|
|
endReached[loadIndex] = true;
|
|
}
|
|
}
|
|
loading = false;
|
|
|
|
if (chatListView != null) {
|
|
if (first || scrollToTopOnResume || forceScrollToTop) {
|
|
forceScrollToTop = false;
|
|
chatAdapter.notifyDataSetChanged();
|
|
if (scrollToMessage != null) {
|
|
int yOffset;
|
|
boolean bottom = true;
|
|
if (startLoadFromMessageOffset != Integer.MAX_VALUE) {
|
|
yOffset = -startLoadFromMessageOffset - chatListView.getPaddingBottom();
|
|
startLoadFromMessageOffset = Integer.MAX_VALUE;
|
|
} else if (scrollToMessagePosition == -9000) {
|
|
yOffset = getScrollOffsetForMessage(scrollToMessage);
|
|
bottom = false;
|
|
} else if (scrollToMessagePosition == -10000) {
|
|
yOffset = -chatListView.getPaddingTop() - AndroidUtilities.dp(7);
|
|
bottom = false;
|
|
} else {
|
|
yOffset = scrollToMessagePosition;
|
|
}
|
|
if (!messages.isEmpty()) {
|
|
if (messages.get(messages.size() - 1) == scrollToMessage || messages.get(messages.size() - 2) == scrollToMessage) {
|
|
chatLayoutManager.scrollToPositionWithOffset(chatAdapter.loadingUpRow, yOffset, bottom);
|
|
} else {
|
|
chatLayoutManager.scrollToPositionWithOffset(chatAdapter.messagesStartRow + messages.indexOf(scrollToMessage), yOffset, bottom);
|
|
}
|
|
}
|
|
chatListView.invalidate();
|
|
if (scrollToMessagePosition == -10000 || scrollToMessagePosition == -9000) {
|
|
showPagedownButton(true, true);
|
|
if (load_type == 3 && unread_to_load != 0 && showUnreadCounter) {
|
|
pagedownButtonCounter.setVisibility(View.VISIBLE);
|
|
pagedownButtonCounter.setText(String.format("%d", newUnreadMessageCount = unread_to_load));
|
|
}
|
|
}
|
|
scrollToMessagePosition = -10000;
|
|
scrollToMessage = null;
|
|
} else {
|
|
moveScrollToLastMessage();
|
|
}
|
|
if (loaded_mentions_count != 0) {
|
|
showMentiondownButton(true, true);
|
|
mentiondownButtonCounter.setVisibility(View.VISIBLE);
|
|
mentiondownButtonCounter.setText(String.format("%d", newMentionsCount = loaded_mentions_count));
|
|
}
|
|
} else {
|
|
if (newRowsCount != 0) {
|
|
boolean end = false;
|
|
if (endReached[loadIndex] && (loadIndex == 0 && mergeDialogId == 0 || loadIndex == 1)) {
|
|
end = true;
|
|
chatAdapter.notifyItemRangeChanged(chatAdapter.loadingUpRow - 1, 2);
|
|
chatAdapter.updateRows();
|
|
}
|
|
int firstVisPos = chatLayoutManager.findFirstVisibleItemPosition();
|
|
View firstVisView = chatLayoutManager.findViewByPosition(firstVisPos);
|
|
int top = ((firstVisView == null) ? 0 : chatListView.getMeasuredHeight() - firstVisView.getBottom() - chatListView.getPaddingBottom());
|
|
if (newRowsCount - (end ? 1 : 0) > 0) {
|
|
int insertStart = chatAdapter.messagesEndRow;/* (chatAdapter.isBot ? 2 : 1) + (end ? 0 : 1); TODO check with bot*/
|
|
chatAdapter.notifyItemChanged(chatAdapter.loadingUpRow);
|
|
chatAdapter.notifyItemRangeInserted(insertStart, newRowsCount - (end ? 1 : 0));
|
|
}
|
|
if (firstVisPos != -1) {
|
|
chatLayoutManager.scrollToPositionWithOffset(firstVisPos, top);
|
|
}
|
|
} else if (endReached[loadIndex] && (loadIndex == 0 && mergeDialogId == 0 || loadIndex == 1)) {
|
|
chatAdapter.notifyItemRemoved(chatAdapter.loadingUpRow);
|
|
}
|
|
}
|
|
|
|
if (paused) {
|
|
scrollToTopOnResume = true;
|
|
if (scrollToMessage != null) {
|
|
scrollToTopUnReadOnResume = true;
|
|
}
|
|
}
|
|
|
|
if (first) {
|
|
if (chatListView != null) {
|
|
chatListView.setEmptyView(emptyViewContainer);
|
|
}
|
|
}
|
|
} else {
|
|
scrollToTopOnResume = true;
|
|
if (scrollToMessage != null) {
|
|
scrollToTopUnReadOnResume = true;
|
|
}
|
|
}
|
|
}
|
|
|
|
if (first && messages.size() > 0) {
|
|
if (loadIndex == 0) {
|
|
final boolean wasUnreadFinal = wasUnread;
|
|
final int last_unread_date_final = last_unread_date;
|
|
final int lastid = messages.get(0).getId();
|
|
AndroidUtilities.runOnUIThread(new Runnable() {
|
|
@Override
|
|
public void run() {
|
|
if (last_message_id != 0) {
|
|
MessagesController.getInstance().markDialogAsRead(dialog_id, lastid, last_message_id, last_unread_date_final, wasUnreadFinal, false);
|
|
} else {
|
|
MessagesController.getInstance().markDialogAsRead(dialog_id, lastid, minMessageId[0], maxDate[0], wasUnreadFinal, false);
|
|
}
|
|
}
|
|
}, 700);
|
|
}
|
|
first = false;
|
|
}
|
|
if (messages.isEmpty() && currentEncryptedChat == null && currentUser != null && currentUser.bot && botUser == null) {
|
|
botUser = "";
|
|
updateBottomOverlay();
|
|
}
|
|
|
|
if (newRowsCount == 0 && currentEncryptedChat != null && !endReached[0]) {
|
|
first = true;
|
|
if (chatListView != null) {
|
|
chatListView.setEmptyView(null);
|
|
}
|
|
if (emptyViewContainer != null) {
|
|
emptyViewContainer.setVisibility(View.INVISIBLE);
|
|
}
|
|
} else {
|
|
if (progressView != null) {
|
|
progressView.setVisibility(View.INVISIBLE);
|
|
}
|
|
}
|
|
checkScrollForLoad(false);
|
|
}
|
|
} else if (id == NotificationCenter.emojiDidLoaded) {
|
|
if (chatListView != null) {
|
|
chatListView.invalidateViews();
|
|
}
|
|
if (replyObjectTextView != null) {
|
|
replyObjectTextView.invalidate();
|
|
}
|
|
if (alertTextView != null) {
|
|
alertTextView.invalidate();
|
|
}
|
|
if (pinnedMessageTextView != null) {
|
|
pinnedMessageTextView.invalidate();
|
|
}
|
|
if (mentionListView != null) {
|
|
mentionListView.invalidateViews();
|
|
}
|
|
} else if (id == NotificationCenter.updateInterfaces) {
|
|
int updateMask = (Integer) args[0];
|
|
if ((updateMask & MessagesController.UPDATE_MASK_NAME) != 0 || (updateMask & MessagesController.UPDATE_MASK_CHAT_NAME) != 0) {
|
|
if (currentChat != null) {
|
|
TLRPC.Chat chat = MessagesController.getInstance().getChat(currentChat.id);
|
|
if (chat != null) {
|
|
currentChat = chat;
|
|
}
|
|
} else if (currentUser != null) {
|
|
TLRPC.User user = MessagesController.getInstance().getUser(currentUser.id);
|
|
if (user != null) {
|
|
currentUser = user;
|
|
}
|
|
}
|
|
updateTitle();
|
|
}
|
|
boolean updateSubtitle = false;
|
|
if ((updateMask & MessagesController.UPDATE_MASK_CHAT_MEMBERS) != 0 || (updateMask & MessagesController.UPDATE_MASK_STATUS) != 0) {
|
|
if (currentChat != null && avatarContainer != null) {
|
|
avatarContainer.updateOnlineCount();
|
|
}
|
|
updateSubtitle = true;
|
|
}
|
|
if ((updateMask & MessagesController.UPDATE_MASK_AVATAR) != 0 || (updateMask & MessagesController.UPDATE_MASK_CHAT_AVATAR) != 0 || (updateMask & MessagesController.UPDATE_MASK_NAME) != 0) {
|
|
checkAndUpdateAvatar();
|
|
updateVisibleRows();
|
|
}
|
|
if ((updateMask & MessagesController.UPDATE_MASK_USER_PRINT) != 0) {
|
|
updateSubtitle = true;
|
|
}
|
|
if ((updateMask & MessagesController.UPDATE_MASK_CHANNEL) != 0 && ChatObject.isChannel(currentChat)) {
|
|
TLRPC.Chat chat = MessagesController.getInstance().getChat(currentChat.id);
|
|
if (chat == null) {
|
|
return;
|
|
}
|
|
currentChat = chat;
|
|
updateSubtitle = true;
|
|
updateBottomOverlay();
|
|
if (chatActivityEnterView != null) {
|
|
chatActivityEnterView.setDialogId(dialog_id);
|
|
}
|
|
}
|
|
if (avatarContainer != null && updateSubtitle) {
|
|
avatarContainer.updateSubtitle();
|
|
}
|
|
if ((updateMask & MessagesController.UPDATE_MASK_USER_PHONE) != 0) {
|
|
updateContactStatus();
|
|
}
|
|
} else if (id == NotificationCenter.didReceivedNewMessages) {
|
|
long did = (Long) args[0];
|
|
if (did == dialog_id) {
|
|
int currentUserId = UserConfig.getClientUserId();
|
|
boolean updateChat = false;
|
|
boolean hasFromMe = false;
|
|
ArrayList<MessageObject> arr = (ArrayList<MessageObject>) args[1];
|
|
if (currentEncryptedChat != null && arr.size() == 1) {
|
|
MessageObject obj = arr.get(0);
|
|
|
|
if (currentEncryptedChat != null && obj.isOut() && obj.messageOwner.action != null && obj.messageOwner.action instanceof TLRPC.TL_messageEncryptedAction &&
|
|
obj.messageOwner.action.encryptedAction instanceof TLRPC.TL_decryptedMessageActionSetMessageTTL && getParentActivity() != null) {
|
|
if (AndroidUtilities.getPeerLayerVersion(currentEncryptedChat.layer) < 17 && currentEncryptedChat.ttl > 0 && currentEncryptedChat.ttl <= 60) {
|
|
AlertDialog.Builder builder = new AlertDialog.Builder(getParentActivity());
|
|
builder.setTitle(LocaleController.getString("AppName", R.string.AppName));
|
|
builder.setPositiveButton(LocaleController.getString("OK", R.string.OK), null);
|
|
builder.setMessage(LocaleController.formatString("CompatibilityChat", R.string.CompatibilityChat, currentUser.first_name, currentUser.first_name));
|
|
showDialog(builder.create());
|
|
}
|
|
}
|
|
}
|
|
if (currentChat != null || inlineReturn != 0) {
|
|
for (int a = 0; a < arr.size(); a++) {
|
|
MessageObject messageObject = arr.get(a);
|
|
if (currentChat != null) {
|
|
if (messageObject.messageOwner.action instanceof TLRPC.TL_messageActionChatDeleteUser && messageObject.messageOwner.action.user_id == currentUserId ||
|
|
messageObject.messageOwner.action instanceof TLRPC.TL_messageActionChatAddUser && messageObject.messageOwner.action.users.contains(currentUserId)) {
|
|
TLRPC.Chat newChat = MessagesController.getInstance().getChat(currentChat.id);
|
|
if (newChat != null) {
|
|
currentChat = newChat;
|
|
checkActionBarMenu();
|
|
updateBottomOverlay();
|
|
if (avatarContainer != null) {
|
|
avatarContainer.updateSubtitle();
|
|
}
|
|
}
|
|
} else if (messageObject.messageOwner.reply_to_msg_id != 0 && messageObject.replyMessageObject == null) {
|
|
messageObject.replyMessageObject = messagesDict[0].get(messageObject.messageOwner.reply_to_msg_id);
|
|
if (messageObject.messageOwner.action instanceof TLRPC.TL_messageActionPinMessage) {
|
|
messageObject.generatePinMessageText(null, null);
|
|
} else if (messageObject.messageOwner.action instanceof TLRPC.TL_messageActionGameScore) {
|
|
messageObject.generateGameMessageText(null);
|
|
} else if (messageObject.messageOwner.action instanceof TLRPC.TL_messageActionPaymentSent) {
|
|
messageObject.generatePaymentSentMessageText(null);
|
|
}
|
|
if (messageObject.isMegagroup() && messageObject.replyMessageObject != null && messageObject.replyMessageObject.messageOwner != null) {
|
|
messageObject.replyMessageObject.messageOwner.flags |= TLRPC.MESSAGE_FLAG_MEGAGROUP;
|
|
}
|
|
}
|
|
} else if (inlineReturn != 0) {
|
|
if (messageObject.messageOwner.reply_markup != null) {
|
|
for (int b = 0; b < messageObject.messageOwner.reply_markup.rows.size(); b++) {
|
|
TLRPC.TL_keyboardButtonRow row = messageObject.messageOwner.reply_markup.rows.get(b);
|
|
for (int c = 0; c < row.buttons.size(); c++) {
|
|
TLRPC.KeyboardButton button = row.buttons.get(c);
|
|
if (button instanceof TLRPC.TL_keyboardButtonSwitchInline) {
|
|
processSwitchButton((TLRPC.TL_keyboardButtonSwitchInline) button);
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
boolean reloadMegagroup = false;
|
|
if (!forwardEndReached[0]) {
|
|
int currentMaxDate = Integer.MIN_VALUE;
|
|
int currentMinMsgId = Integer.MIN_VALUE;
|
|
if (currentEncryptedChat != null) {
|
|
currentMinMsgId = Integer.MAX_VALUE;
|
|
}
|
|
boolean currentMarkAsRead = false;
|
|
|
|
for (int a = 0; a < arr.size(); a++) {
|
|
MessageObject obj = arr.get(a);
|
|
if (currentUser != null && (currentUser.bot && obj.isOut() || currentUser.id == currentUserId)) {
|
|
obj.setIsRead();
|
|
}
|
|
if (avatarContainer != null && currentEncryptedChat != null && obj.messageOwner.action != null && obj.messageOwner.action instanceof TLRPC.TL_messageEncryptedAction && obj.messageOwner.action.encryptedAction instanceof TLRPC.TL_decryptedMessageActionSetMessageTTL) {
|
|
avatarContainer.setTime(((TLRPC.TL_decryptedMessageActionSetMessageTTL) obj.messageOwner.action.encryptedAction).ttl_seconds);
|
|
}
|
|
if (obj.messageOwner.action instanceof TLRPC.TL_messageActionChatMigrateTo) {
|
|
final Bundle bundle = new Bundle();
|
|
bundle.putInt("chat_id", obj.messageOwner.action.channel_id);
|
|
final BaseFragment lastFragment = parentLayout.fragmentsStack.size() > 0 ? parentLayout.fragmentsStack.get(parentLayout.fragmentsStack.size() - 1) : null;
|
|
final int channel_id = obj.messageOwner.action.channel_id;
|
|
AndroidUtilities.runOnUIThread(new Runnable() {
|
|
@Override
|
|
public void run() {
|
|
ActionBarLayout parentLayout = ChatActivity.this.parentLayout;
|
|
if (lastFragment != null) {
|
|
NotificationCenter.getInstance().removeObserver(lastFragment, NotificationCenter.closeChats);
|
|
}
|
|
NotificationCenter.getInstance().postNotificationName(NotificationCenter.closeChats);
|
|
parentLayout.presentFragment(new ChatActivity(bundle), true);
|
|
AndroidUtilities.runOnUIThread(new Runnable() {
|
|
@Override
|
|
public void run() {
|
|
MessagesController.getInstance().loadFullChat(channel_id, 0, true);
|
|
}
|
|
}, 1000);
|
|
}
|
|
});
|
|
return;
|
|
} else if (currentChat != null && currentChat.megagroup && (obj.messageOwner.action instanceof TLRPC.TL_messageActionChatAddUser || obj.messageOwner.action instanceof TLRPC.TL_messageActionChatDeleteUser)) {
|
|
reloadMegagroup = true;
|
|
}
|
|
if (obj.isOut() && obj.isSending()) {
|
|
scrollToLastMessage(false);
|
|
return;
|
|
}
|
|
if (obj.type < 0 || messagesDict[0].containsKey(obj.getId())) {
|
|
continue;
|
|
}
|
|
obj.checkLayout();
|
|
currentMaxDate = Math.max(currentMaxDate, obj.messageOwner.date);
|
|
if (obj.getId() > 0) {
|
|
currentMinMsgId = Math.max(obj.getId(), currentMinMsgId);
|
|
last_message_id = Math.max(last_message_id, obj.getId());
|
|
} else if (currentEncryptedChat != null) {
|
|
currentMinMsgId = Math.min(obj.getId(), currentMinMsgId);
|
|
last_message_id = Math.min(last_message_id, obj.getId());
|
|
}
|
|
|
|
if (!obj.isOut() && obj.isUnread()) {
|
|
unread_to_load++;
|
|
currentMarkAsRead = true;
|
|
}
|
|
if (obj.messageOwner.mentioned && obj.isContentUnread()) {
|
|
newMentionsCount++;
|
|
}
|
|
newUnreadMessageCount++;
|
|
if (obj.type == 10 || obj.type == 11) {
|
|
updateChat = true;
|
|
}
|
|
}
|
|
if (newUnreadMessageCount != 0 && pagedownButtonCounter != null) {
|
|
pagedownButtonCounter.setVisibility(View.VISIBLE);
|
|
pagedownButtonCounter.setText(String.format("%d", newUnreadMessageCount));
|
|
}
|
|
if (newMentionsCount != 0 && mentiondownButtonCounter != null) {
|
|
mentiondownButtonCounter.setVisibility(View.VISIBLE);
|
|
mentiondownButtonCounter.setText(String.format("%d", newMentionsCount));
|
|
showMentiondownButton(true, true);
|
|
}
|
|
|
|
if (currentMarkAsRead) {
|
|
if (paused) {
|
|
readWhenResume = true;
|
|
readWithDate = currentMaxDate;
|
|
readWithMid = currentMinMsgId;
|
|
} else {
|
|
if (messages.size() > 0) {
|
|
MessagesController.getInstance().markDialogAsRead(dialog_id, messages.get(0).getId(), currentMinMsgId, currentMaxDate, true, false);
|
|
}
|
|
}
|
|
}
|
|
updateVisibleRows();
|
|
} else {
|
|
HashMap<Long, MessageObject.GroupedMessages> newGroups = null;
|
|
boolean markAsRead = false;
|
|
boolean unreadUpdated = true;
|
|
HashMap<String, ArrayList<MessageObject>> webpagesToReload = null;
|
|
if (BuildVars.DEBUG_VERSION) {
|
|
FileLog.d("received new messages " + arr.size() + " in dialog " + dialog_id);
|
|
}
|
|
for (int a = 0; a < arr.size(); a++) {
|
|
int placeToPaste = -1;
|
|
MessageObject obj = arr.get(a);
|
|
|
|
if (currentUser != null && (currentUser.bot && obj.isOut() || currentUser.id == currentUserId)) {
|
|
obj.setIsRead();
|
|
}
|
|
if (avatarContainer != null && currentEncryptedChat != null && obj.messageOwner.action != null && obj.messageOwner.action instanceof TLRPC.TL_messageEncryptedAction && obj.messageOwner.action.encryptedAction instanceof TLRPC.TL_decryptedMessageActionSetMessageTTL) {
|
|
avatarContainer.setTime(((TLRPC.TL_decryptedMessageActionSetMessageTTL) obj.messageOwner.action.encryptedAction).ttl_seconds);
|
|
}
|
|
if (obj.type < 0 || messagesDict[0].containsKey(obj.getId())) {
|
|
continue;
|
|
}
|
|
|
|
if (a == 0 && obj.messageOwner.id < 0 && obj.type == 5) {
|
|
animatingMessageObjects.add(obj);
|
|
}
|
|
|
|
MessageObject.GroupedMessages groupedMessages;
|
|
if (obj.hasValidGroupId()) {
|
|
groupedMessages = groupedMessagesMap.get(obj.getGroupId());
|
|
if (groupedMessages == null) {
|
|
groupedMessages = new MessageObject.GroupedMessages();
|
|
groupedMessages.groupId = obj.getGroupId();
|
|
groupedMessagesMap.put(groupedMessages.groupId, groupedMessages);
|
|
}
|
|
if (newGroups == null) {
|
|
newGroups = new HashMap<>();
|
|
}
|
|
newGroups.put(groupedMessages.groupId, groupedMessages);
|
|
groupedMessages.messages.add(obj);
|
|
} else {
|
|
groupedMessages = null;
|
|
}
|
|
|
|
if (groupedMessages != null) {
|
|
int size = groupedMessages.messages.size();
|
|
MessageObject messageObject = size > 1 ? groupedMessages.messages.get(groupedMessages.messages.size() - 2) : null;
|
|
if (messageObject != null) {
|
|
placeToPaste = messages.indexOf(messageObject);
|
|
}
|
|
}
|
|
|
|
if (placeToPaste == -1) {
|
|
if (obj.messageOwner.id < 0 || messages.isEmpty()) {
|
|
placeToPaste = 0;
|
|
} else {
|
|
int size = messages.size();
|
|
for (int b = 0; b < size; b++) {
|
|
MessageObject lastMessage = messages.get(b);
|
|
if (lastMessage.type >= 0 && lastMessage.messageOwner.date > 0) {
|
|
if (lastMessage.messageOwner.id > 0 && obj.messageOwner.id > 0 && lastMessage.messageOwner.id < obj.messageOwner.id || lastMessage.messageOwner.date < obj.messageOwner.date) {
|
|
MessageObject.GroupedMessages lastGroupedMessages;
|
|
if (lastMessage.getGroupId() != 0) {
|
|
lastGroupedMessages = groupedMessagesMap.get(lastMessage.getGroupId());
|
|
if (lastGroupedMessages != null && lastGroupedMessages.messages.size() == 0) {
|
|
lastGroupedMessages = null;
|
|
}
|
|
} else {
|
|
lastGroupedMessages = null;
|
|
}
|
|
if (lastGroupedMessages == null) {
|
|
placeToPaste = b;
|
|
} else {
|
|
placeToPaste = messages.indexOf(lastGroupedMessages.messages.get(lastGroupedMessages.messages.size() - 1));
|
|
}
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
if (placeToPaste == -1 || placeToPaste > messages.size()) {
|
|
placeToPaste = messages.size();
|
|
}
|
|
}
|
|
}
|
|
if (currentEncryptedChat != null && obj.messageOwner.media instanceof TLRPC.TL_messageMediaWebPage && obj.messageOwner.media.webpage instanceof TLRPC.TL_webPageUrlPending) {
|
|
if (webpagesToReload == null) {
|
|
webpagesToReload = new HashMap<>();
|
|
}
|
|
ArrayList<MessageObject> arrayList = webpagesToReload.get(obj.messageOwner.media.webpage.url);
|
|
if (arrayList == null) {
|
|
arrayList = new ArrayList<>();
|
|
webpagesToReload.put(obj.messageOwner.media.webpage.url, arrayList);
|
|
}
|
|
arrayList.add(obj);
|
|
}
|
|
obj.checkLayout();
|
|
if (obj.messageOwner.action instanceof TLRPC.TL_messageActionChatMigrateTo) {
|
|
final Bundle bundle = new Bundle();
|
|
bundle.putInt("chat_id", obj.messageOwner.action.channel_id);
|
|
final BaseFragment lastFragment = parentLayout.fragmentsStack.size() > 0 ? parentLayout.fragmentsStack.get(parentLayout.fragmentsStack.size() - 1) : null;
|
|
final int channel_id = obj.messageOwner.action.channel_id;
|
|
AndroidUtilities.runOnUIThread(new Runnable() {
|
|
@Override
|
|
public void run() {
|
|
ActionBarLayout parentLayout = ChatActivity.this.parentLayout;
|
|
if (lastFragment != null) {
|
|
NotificationCenter.getInstance().removeObserver(lastFragment, NotificationCenter.closeChats);
|
|
}
|
|
NotificationCenter.getInstance().postNotificationName(NotificationCenter.closeChats);
|
|
parentLayout.presentFragment(new ChatActivity(bundle), true);
|
|
AndroidUtilities.runOnUIThread(new Runnable() {
|
|
@Override
|
|
public void run() {
|
|
MessagesController.getInstance().loadFullChat(channel_id, 0, true);
|
|
}
|
|
}, 1000);
|
|
}
|
|
});
|
|
if (newGroups != null) {
|
|
for (HashMap.Entry<Long, MessageObject.GroupedMessages> entry : newGroups.entrySet()) {
|
|
entry.getValue().calculate();
|
|
}
|
|
}
|
|
return;
|
|
} else if (currentChat != null && currentChat.megagroup && (obj.messageOwner.action instanceof TLRPC.TL_messageActionChatAddUser || obj.messageOwner.action instanceof TLRPC.TL_messageActionChatDeleteUser)) {
|
|
reloadMegagroup = true;
|
|
}
|
|
if (minDate[0] == 0 || obj.messageOwner.date < minDate[0]) {
|
|
minDate[0] = obj.messageOwner.date;
|
|
}
|
|
|
|
if (obj.isOut()) {
|
|
removeUnreadPlane();
|
|
hasFromMe = true;
|
|
}
|
|
|
|
if (obj.getId() > 0) {
|
|
maxMessageId[0] = Math.min(obj.getId(), maxMessageId[0]);
|
|
minMessageId[0] = Math.max(obj.getId(), minMessageId[0]);
|
|
} else if (currentEncryptedChat != null) {
|
|
maxMessageId[0] = Math.max(obj.getId(), maxMessageId[0]);
|
|
minMessageId[0] = Math.min(obj.getId(), minMessageId[0]);
|
|
}
|
|
maxDate[0] = Math.max(maxDate[0], obj.messageOwner.date);
|
|
messagesDict[0].put(obj.getId(), obj);
|
|
ArrayList<MessageObject> dayArray = messagesByDays.get(obj.dateKey);
|
|
if (dayArray == null) {
|
|
dayArray = new ArrayList<>();
|
|
messagesByDays.put(obj.dateKey, dayArray);
|
|
TLRPC.Message dateMsg = new TLRPC.TL_message();
|
|
dateMsg.message = LocaleController.formatDateChat(obj.messageOwner.date);
|
|
dateMsg.id = 0;
|
|
dateMsg.date = obj.messageOwner.date;
|
|
MessageObject dateObj = new MessageObject(dateMsg, null, false);
|
|
dateObj.type = 10;
|
|
dateObj.contentType = 1;
|
|
dateObj.isDateObject = true;
|
|
messages.add(placeToPaste, dateObj);
|
|
if (chatAdapter != null) {
|
|
chatAdapter.notifyItemInserted(placeToPaste);
|
|
}
|
|
}
|
|
if (!obj.isOut()) {
|
|
if (paused && placeToPaste == 0) {
|
|
if (!scrollToTopUnReadOnResume && unreadMessageObject != null) {
|
|
removeMessageObject(unreadMessageObject);
|
|
if (placeToPaste > 0) {
|
|
placeToPaste--;
|
|
}
|
|
unreadMessageObject = null;
|
|
}
|
|
if (unreadMessageObject == null) {
|
|
TLRPC.Message dateMsg = new TLRPC.TL_message();
|
|
dateMsg.message = "";
|
|
dateMsg.id = 0;
|
|
MessageObject dateObj = new MessageObject(dateMsg, null, false);
|
|
dateObj.type = 6;
|
|
dateObj.contentType = 2;
|
|
messages.add(0, dateObj);
|
|
if (chatAdapter != null) {
|
|
chatAdapter.notifyItemInserted(0);
|
|
}
|
|
unreadMessageObject = dateObj;
|
|
scrollToMessage = unreadMessageObject;
|
|
scrollToMessagePosition = -10000;
|
|
unreadUpdated = false;
|
|
unread_to_load = 0;
|
|
scrollToTopUnReadOnResume = true;
|
|
}
|
|
}
|
|
if (unreadMessageObject != null) {
|
|
unread_to_load++;
|
|
unreadUpdated = true;
|
|
}
|
|
if (obj.isUnread()) {
|
|
if (!paused) {
|
|
obj.setIsRead();
|
|
}
|
|
markAsRead = true;
|
|
}
|
|
}
|
|
|
|
dayArray.add(0, obj);
|
|
if (placeToPaste > messages.size()) {
|
|
placeToPaste = messages.size();
|
|
}
|
|
|
|
messages.add(placeToPaste, obj);
|
|
if (chatAdapter != null) {
|
|
chatAdapter.notifyItemChanged(placeToPaste);
|
|
chatAdapter.notifyItemInserted(placeToPaste);
|
|
}
|
|
if (!obj.isOut() && obj.messageOwner.mentioned && obj.isContentUnread()) {
|
|
newMentionsCount++;
|
|
}
|
|
newUnreadMessageCount++;
|
|
if (obj.type == 10 || obj.type == 11) {
|
|
updateChat = true;
|
|
}
|
|
}
|
|
if (webpagesToReload != null) {
|
|
MessagesController.getInstance().reloadWebPages(dialog_id, webpagesToReload);
|
|
}
|
|
if (newGroups != null) {
|
|
for (HashMap.Entry<Long, MessageObject.GroupedMessages> entry : newGroups.entrySet()) {
|
|
MessageObject.GroupedMessages groupedMessages = entry.getValue();
|
|
int oldCount = groupedMessages.posArray.size();
|
|
entry.getValue().calculate();
|
|
int newCount = groupedMessages.posArray.size();
|
|
if (newCount - oldCount > 0) {
|
|
int index = messages.indexOf(groupedMessages.messages.get(groupedMessages.messages.size() - 1));
|
|
if (index >= 0) {
|
|
chatAdapter.notifyItemRangeChanged(index, newCount);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
if (progressView != null) {
|
|
progressView.setVisibility(View.INVISIBLE);
|
|
}
|
|
if (chatAdapter != null) {
|
|
if (unreadUpdated) {
|
|
chatAdapter.updateRowWithMessageObject(unreadMessageObject);
|
|
}
|
|
} else {
|
|
scrollToTopOnResume = true;
|
|
}
|
|
|
|
if (chatListView != null && chatAdapter != null) {
|
|
int lastVisible = chatLayoutManager.findFirstVisibleItemPosition();
|
|
if (lastVisible == RecyclerView.NO_POSITION) {
|
|
lastVisible = 0;
|
|
}
|
|
if (lastVisible == 0 || hasFromMe) {
|
|
newUnreadMessageCount = 0;
|
|
if (!firstLoading) {
|
|
if (paused) {
|
|
scrollToTopOnResume = true;
|
|
} else {
|
|
forceScrollToTop = true;
|
|
moveScrollToLastMessage();
|
|
}
|
|
}
|
|
} else {
|
|
if (newUnreadMessageCount != 0 && pagedownButtonCounter != null) {
|
|
pagedownButtonCounter.setVisibility(View.VISIBLE);
|
|
pagedownButtonCounter.setText(String.format("%d", newUnreadMessageCount));
|
|
}
|
|
showPagedownButton(true, true);
|
|
}
|
|
if (newMentionsCount != 0 && mentiondownButtonCounter != null) {
|
|
mentiondownButtonCounter.setVisibility(View.VISIBLE);
|
|
mentiondownButtonCounter.setText(String.format("%d", newMentionsCount));
|
|
showMentiondownButton(true, true);
|
|
}
|
|
} else {
|
|
scrollToTopOnResume = true;
|
|
}
|
|
|
|
if (markAsRead) {
|
|
if (paused) {
|
|
readWhenResume = true;
|
|
readWithDate = maxDate[0];
|
|
readWithMid = minMessageId[0];
|
|
} else {
|
|
MessagesController.getInstance().markDialogAsRead(dialog_id, messages.get(0).getId(), minMessageId[0], maxDate[0], true, false);
|
|
}
|
|
}
|
|
}
|
|
if (!messages.isEmpty() && botUser != null && botUser.length() == 0) {
|
|
botUser = null;
|
|
updateBottomOverlay();
|
|
}
|
|
if (updateChat) {
|
|
updateTitle();
|
|
checkAndUpdateAvatar();
|
|
}
|
|
if (reloadMegagroup) {
|
|
MessagesController.getInstance().loadFullChat(currentChat.id, 0, true);
|
|
}
|
|
}
|
|
} else if (id == NotificationCenter.closeChats) {
|
|
if (args != null && args.length > 0) {
|
|
long did = (Long) args[0];
|
|
if (did == dialog_id) {
|
|
finishFragment();
|
|
}
|
|
} else {
|
|
removeSelfFromStack();
|
|
}
|
|
} else if (id == NotificationCenter.messagesRead) {
|
|
SparseArray<Long> inbox = (SparseArray<Long>) args[0];
|
|
SparseArray<Long> outbox = (SparseArray<Long>) args[1];
|
|
boolean updated = false;
|
|
for (int b = 0; b < inbox.size(); b++) {
|
|
int key = inbox.keyAt(b);
|
|
long messageId = inbox.get(key);
|
|
if (key != dialog_id) {
|
|
continue;
|
|
}
|
|
for (int a = 0; a < messages.size(); a++) {
|
|
MessageObject obj = messages.get(a);
|
|
if (!obj.isOut() && obj.getId() > 0 && obj.getId() <= (int) messageId) {
|
|
if (!obj.isUnread()) {
|
|
break;
|
|
}
|
|
obj.setIsRead();
|
|
updated = true;
|
|
}
|
|
}
|
|
break;
|
|
}
|
|
for (int b = 0; b < outbox.size(); b++) {
|
|
int key = outbox.keyAt(b);
|
|
int messageId = (int) ((long) outbox.get(key));
|
|
if (key != dialog_id) {
|
|
continue;
|
|
}
|
|
for (int a = 0; a < messages.size(); a++) {
|
|
MessageObject obj = messages.get(a);
|
|
if (obj.isOut() && obj.getId() > 0 && obj.getId() <= messageId) {
|
|
if (!obj.isUnread()) {
|
|
break;
|
|
}
|
|
obj.setIsRead();
|
|
updated = true;
|
|
}
|
|
}
|
|
break;
|
|
}
|
|
if (inbox.size() != 0) {
|
|
removeUnreadPlane();
|
|
}
|
|
if (updated) {
|
|
updateVisibleRows();
|
|
}
|
|
} else if (id == NotificationCenter.historyCleared) {
|
|
long did = (Long) args[0];
|
|
if (did != dialog_id) {
|
|
return;
|
|
}
|
|
int max_id = (Integer) args[1];
|
|
boolean updated = false;
|
|
|
|
for (int b = 0; b < messages.size(); b++) {
|
|
MessageObject obj = messages.get(b);
|
|
int mid = obj.getId();
|
|
if (mid <= 0 || mid > max_id) {
|
|
continue;
|
|
}
|
|
if (info != null && info.pinned_msg_id == mid) {
|
|
pinnedMessageObject = null;
|
|
info.pinned_msg_id = 0;
|
|
MessagesStorage.getInstance().updateChannelPinnedMessage(info.id, 0);
|
|
updatePinnedMessageView(true);
|
|
}
|
|
messages.remove(b);
|
|
b--;
|
|
messagesDict[0].remove(mid);
|
|
ArrayList<MessageObject> dayArr = messagesByDays.get(obj.dateKey);
|
|
if (dayArr != null) {
|
|
dayArr.remove(obj);
|
|
if (dayArr.isEmpty()) {
|
|
messagesByDays.remove(obj.dateKey);
|
|
if (b >= 0 && b < messages.size()) {
|
|
messages.remove(b);
|
|
b--;
|
|
}
|
|
}
|
|
}
|
|
updated = true;
|
|
}
|
|
|
|
if (messages.isEmpty()) {
|
|
if (!endReached[0] && !loading) {
|
|
if (progressView != null) {
|
|
progressView.setVisibility(View.INVISIBLE);
|
|
}
|
|
if (chatListView != null) {
|
|
chatListView.setEmptyView(null);
|
|
}
|
|
if (currentEncryptedChat == null) {
|
|
maxMessageId[0] = maxMessageId[1] = Integer.MAX_VALUE;
|
|
minMessageId[0] = minMessageId[1] = Integer.MIN_VALUE;
|
|
} else {
|
|
maxMessageId[0] = maxMessageId[1] = Integer.MIN_VALUE;
|
|
minMessageId[0] = minMessageId[1] = Integer.MAX_VALUE;
|
|
}
|
|
maxDate[0] = maxDate[1] = Integer.MIN_VALUE;
|
|
minDate[0] = minDate[1] = 0;
|
|
waitingForLoad.add(lastLoadIndex);
|
|
MessagesController.getInstance().loadMessages(dialog_id, 30, 0, 0, !cacheEndReached[0], minDate[0], classGuid, 0, 0, ChatObject.isChannel(currentChat), lastLoadIndex++);
|
|
loading = true;
|
|
} else {
|
|
if (botButtons != null) {
|
|
botButtons = null;
|
|
if (chatActivityEnterView != null) {
|
|
chatActivityEnterView.setButtons(null, false);
|
|
}
|
|
}
|
|
if (currentEncryptedChat == null && currentUser != null && currentUser.bot && botUser == null) {
|
|
botUser = "";
|
|
updateBottomOverlay();
|
|
}
|
|
}
|
|
}
|
|
if (updated && chatAdapter != null) {
|
|
removeUnreadPlane();
|
|
chatAdapter.notifyDataSetChanged();
|
|
}
|
|
} else if (id == NotificationCenter.messagesDeleted) {
|
|
ArrayList<Integer> markAsDeletedMessages = (ArrayList<Integer>) args[0];
|
|
int channelId = (Integer) args[1];
|
|
int loadIndex = 0;
|
|
if (ChatObject.isChannel(currentChat)) {
|
|
if (channelId == 0 && mergeDialogId != 0) {
|
|
loadIndex = 1;
|
|
} else if (channelId == currentChat.id) {
|
|
loadIndex = 0;
|
|
} else {
|
|
return;
|
|
}
|
|
} else if (channelId != 0) {
|
|
return;
|
|
}
|
|
boolean updated = false;
|
|
HashMap<Long, MessageObject.GroupedMessages> newGroups = null;
|
|
for (int a = 0; a < markAsDeletedMessages.size(); a++) {
|
|
Integer ids = markAsDeletedMessages.get(a);
|
|
MessageObject obj = messagesDict[loadIndex].get(ids);
|
|
if (loadIndex == 0 && info != null && info.pinned_msg_id == ids) {
|
|
pinnedMessageObject = null;
|
|
info.pinned_msg_id = 0;
|
|
MessagesStorage.getInstance().updateChannelPinnedMessage(channelId, 0);
|
|
updatePinnedMessageView(true);
|
|
}
|
|
if (obj != null) {
|
|
int index = messages.indexOf(obj);
|
|
if (index != -1) {
|
|
MessageObject removed = messages.remove(index);
|
|
if (removed.getGroupId() != 0) {
|
|
MessageObject.GroupedMessages groupedMessages = groupedMessagesMap.get(removed.getGroupId());
|
|
if (groupedMessages != null) {
|
|
if (newGroups == null) {
|
|
newGroups = new HashMap<>();
|
|
}
|
|
newGroups.put(groupedMessages.groupId, groupedMessages);
|
|
groupedMessages.messages.remove(obj);
|
|
}
|
|
}
|
|
messagesDict[loadIndex].remove(ids);
|
|
ArrayList<MessageObject> dayArr = messagesByDays.get(obj.dateKey);
|
|
if (dayArr != null) {
|
|
dayArr.remove(obj);
|
|
if (dayArr.isEmpty()) {
|
|
messagesByDays.remove(obj.dateKey);
|
|
if (index >= 0 && index < messages.size()) {
|
|
messages.remove(index);
|
|
}
|
|
}
|
|
}
|
|
updated = true;
|
|
}
|
|
}
|
|
}
|
|
if (newGroups != null) {
|
|
for (HashMap.Entry<Long, MessageObject.GroupedMessages> entry : newGroups.entrySet()) {
|
|
MessageObject.GroupedMessages groupedMessages = entry.getValue();
|
|
if (groupedMessages.messages.isEmpty()) {
|
|
groupedMessagesMap.remove(groupedMessages.groupId);
|
|
} else {
|
|
groupedMessages.calculate();
|
|
MessageObject messageObject = groupedMessages.messages.get(groupedMessages.messages.size() - 1);
|
|
int index = messages.indexOf(messageObject);
|
|
if (index >= 0) {
|
|
if (chatAdapter != null) {
|
|
chatAdapter.notifyItemRangeChanged(index + chatAdapter.messagesStartRow, groupedMessages.messages.size());
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
if (messages.isEmpty()) {
|
|
if (!endReached[0] && !loading) {
|
|
if (progressView != null) {
|
|
progressView.setVisibility(View.INVISIBLE);
|
|
}
|
|
if (chatListView != null) {
|
|
chatListView.setEmptyView(null);
|
|
}
|
|
if (currentEncryptedChat == null) {
|
|
maxMessageId[0] = maxMessageId[1] = Integer.MAX_VALUE;
|
|
minMessageId[0] = minMessageId[1] = Integer.MIN_VALUE;
|
|
} else {
|
|
maxMessageId[0] = maxMessageId[1] = Integer.MIN_VALUE;
|
|
minMessageId[0] = minMessageId[1] = Integer.MAX_VALUE;
|
|
}
|
|
maxDate[0] = maxDate[1] = Integer.MIN_VALUE;
|
|
minDate[0] = minDate[1] = 0;
|
|
waitingForLoad.add(lastLoadIndex);
|
|
MessagesController.getInstance().loadMessages(dialog_id, 30, 0, 0, !cacheEndReached[0], minDate[0], classGuid, 0, 0, ChatObject.isChannel(currentChat), lastLoadIndex++);
|
|
loading = true;
|
|
} else {
|
|
if (botButtons != null) {
|
|
botButtons = null;
|
|
if (chatActivityEnterView != null) {
|
|
chatActivityEnterView.setButtons(null, false);
|
|
}
|
|
}
|
|
if (currentEncryptedChat == null && currentUser != null && currentUser.bot && botUser == null) {
|
|
botUser = "";
|
|
updateBottomOverlay();
|
|
}
|
|
}
|
|
}
|
|
if (chatAdapter != null) {
|
|
if (updated) {
|
|
removeUnreadPlane();
|
|
chatAdapter.notifyDataSetChanged();
|
|
} else {
|
|
first_unread_id = 0;
|
|
last_message_id = 0;
|
|
createUnreadMessageAfterId = 0;
|
|
unread_to_load = 0;
|
|
removeMessageObject(unreadMessageObject);
|
|
unreadMessageObject = null;
|
|
if (pagedownButtonCounter != null) {
|
|
pagedownButtonCounter.setVisibility(View.INVISIBLE);
|
|
}
|
|
}
|
|
}
|
|
} else if (id == NotificationCenter.messageReceivedByServer) {
|
|
Integer msgId = (Integer) args[0];
|
|
MessageObject obj = messagesDict[0].get(msgId);
|
|
if (obj != null) {
|
|
Integer newMsgId = (Integer) args[1];
|
|
if (!newMsgId.equals(msgId) && messagesDict[0].containsKey(newMsgId)) {
|
|
MessageObject removed = messagesDict[0].remove(msgId);
|
|
if (removed != null) {
|
|
int index = messages.indexOf(removed);
|
|
messages.remove(index);
|
|
ArrayList<MessageObject> dayArr = messagesByDays.get(removed.dateKey);
|
|
dayArr.remove(obj);
|
|
if (dayArr.isEmpty()) {
|
|
messagesByDays.remove(obj.dateKey);
|
|
if (index >= 0 && index < messages.size()) {
|
|
messages.remove(index);
|
|
}
|
|
}
|
|
if (chatAdapter != null) {
|
|
chatAdapter.notifyDataSetChanged();
|
|
}
|
|
}
|
|
return;
|
|
}
|
|
TLRPC.Message newMsgObj = (TLRPC.Message) args[2];
|
|
boolean mediaUpdated = false;
|
|
boolean updatedForward = false;
|
|
if (newMsgObj != null) {
|
|
try {
|
|
updatedForward = obj.isForwarded() && (obj.messageOwner.reply_markup == null && newMsgObj.reply_markup != null || !obj.messageOwner.message.equals(newMsgObj.message));
|
|
mediaUpdated = updatedForward ||
|
|
obj.messageOwner.params != null && obj.messageOwner.params.containsKey("query_id") ||
|
|
newMsgObj.media != null && obj.messageOwner.media != null && !newMsgObj.media.getClass().equals(obj.messageOwner.media.getClass());
|
|
} catch (Exception e) {
|
|
FileLog.e(e);
|
|
}
|
|
if (obj.getGroupId() != 0 && newMsgObj.grouped_id != 0) {
|
|
MessageObject.GroupedMessages oldGroup = groupedMessagesMap.get(obj.getGroupId());
|
|
if (oldGroup != null) {
|
|
groupedMessagesMap.put(newMsgObj.grouped_id, oldGroup);
|
|
}
|
|
}
|
|
obj.messageOwner = newMsgObj;
|
|
obj.generateThumbs(true);
|
|
obj.setType();
|
|
|
|
if (newMsgObj.media instanceof TLRPC.TL_messageMediaGame) {
|
|
obj.applyNewText();
|
|
}
|
|
}
|
|
if (updatedForward) {
|
|
obj.measureInlineBotButtons();
|
|
}
|
|
messagesDict[0].remove(msgId);
|
|
messagesDict[0].put(newMsgId, obj);
|
|
obj.messageOwner.id = newMsgId;
|
|
obj.messageOwner.send_state = MessageObject.MESSAGE_SEND_STATE_SENT;
|
|
obj.forceUpdate = mediaUpdated;
|
|
ArrayList<MessageObject> messArr = new ArrayList<>();
|
|
messArr.add(obj);
|
|
if (currentEncryptedChat == null) {
|
|
MessagesQuery.loadReplyMessagesForMessages(messArr, dialog_id);
|
|
}
|
|
if (chatAdapter != null) {
|
|
chatAdapter.updateRowWithMessageObject(obj);
|
|
}
|
|
if (chatLayoutManager != null) {
|
|
if (mediaUpdated && chatLayoutManager.findFirstVisibleItemPosition() == 0) {
|
|
moveScrollToLastMessage();
|
|
}
|
|
}
|
|
NotificationsController.getInstance().playOutChatSound();
|
|
}
|
|
} else if (id == NotificationCenter.messageReceivedByAck) {
|
|
Integer msgId = (Integer) args[0];
|
|
MessageObject obj = messagesDict[0].get(msgId);
|
|
if (obj != null) {
|
|
obj.messageOwner.send_state = MessageObject.MESSAGE_SEND_STATE_SENT;
|
|
if (chatAdapter != null) {
|
|
chatAdapter.updateRowWithMessageObject(obj);
|
|
}
|
|
}
|
|
} else if (id == NotificationCenter.messageSendError) {
|
|
Integer msgId = (Integer) args[0];
|
|
MessageObject obj = messagesDict[0].get(msgId);
|
|
if (obj != null) {
|
|
obj.messageOwner.send_state = MessageObject.MESSAGE_SEND_STATE_SEND_ERROR;
|
|
updateVisibleRows();
|
|
}
|
|
} else if (id == NotificationCenter.chatInfoDidLoaded) {
|
|
TLRPC.ChatFull chatFull = (TLRPC.ChatFull) args[0];
|
|
if (currentChat != null && chatFull.id == currentChat.id) {
|
|
if (chatFull instanceof TLRPC.TL_channelFull) {
|
|
if (currentChat.megagroup) {
|
|
int lastDate = 0;
|
|
if (chatFull.participants != null) {
|
|
for (int a = 0; a < chatFull.participants.participants.size(); a++) {
|
|
lastDate = Math.max(chatFull.participants.participants.get(a).date, lastDate);
|
|
}
|
|
}
|
|
if (lastDate == 0 || Math.abs(System.currentTimeMillis() / 1000 - lastDate) > 60 * 60) {
|
|
MessagesController.getInstance().loadChannelParticipants(currentChat.id);
|
|
}
|
|
}
|
|
if (chatFull.participants == null && info != null) {
|
|
chatFull.participants = info.participants;
|
|
}
|
|
}
|
|
info = chatFull;
|
|
if (chatActivityEnterView != null) {
|
|
chatActivityEnterView.setChatInfo(info);
|
|
}
|
|
if (mentionsAdapter != null) {
|
|
mentionsAdapter.setChatInfo(info);
|
|
}
|
|
if (args[3] instanceof MessageObject) {
|
|
pinnedMessageObject = (MessageObject) args[3];
|
|
updatePinnedMessageView(false);
|
|
} else {
|
|
updatePinnedMessageView(true);
|
|
}
|
|
if (avatarContainer != null) {
|
|
avatarContainer.updateOnlineCount();
|
|
avatarContainer.updateSubtitle();
|
|
}
|
|
if (isBroadcast) {
|
|
SendMessagesHelper.getInstance().setCurrentChatInfo(info);
|
|
}
|
|
if (info instanceof TLRPC.TL_chatFull) {
|
|
hasBotsCommands = false;
|
|
botInfo.clear();
|
|
botsCount = 0;
|
|
URLSpanBotCommand.enabled = false;
|
|
for (int a = 0; a < info.participants.participants.size(); a++) {
|
|
TLRPC.ChatParticipant participant = info.participants.participants.get(a);
|
|
TLRPC.User user = MessagesController.getInstance().getUser(participant.user_id);
|
|
if (user != null && user.bot) {
|
|
URLSpanBotCommand.enabled = true;
|
|
botsCount++;
|
|
BotQuery.loadBotInfo(user.id, true, classGuid);
|
|
}
|
|
}
|
|
if (chatListView != null) {
|
|
chatListView.invalidateViews();
|
|
}
|
|
} else if (info instanceof TLRPC.TL_channelFull) {
|
|
hasBotsCommands = false;
|
|
botInfo.clear();
|
|
botsCount = 0;
|
|
URLSpanBotCommand.enabled = !info.bot_info.isEmpty() && currentChat != null && currentChat.megagroup;
|
|
botsCount = info.bot_info.size();
|
|
for (int a = 0; a < info.bot_info.size(); a++) {
|
|
TLRPC.BotInfo bot = info.bot_info.get(a);
|
|
if (!bot.commands.isEmpty() && (!ChatObject.isChannel(currentChat) || currentChat != null && currentChat.megagroup)) {
|
|
hasBotsCommands = true;
|
|
}
|
|
botInfo.put(bot.user_id, bot);
|
|
}
|
|
if (chatListView != null) {
|
|
chatListView.invalidateViews();
|
|
}
|
|
if (mentionsAdapter != null && (!ChatObject.isChannel(currentChat) || currentChat != null && currentChat.megagroup)) {
|
|
mentionsAdapter.setBotInfo(botInfo);
|
|
}
|
|
}
|
|
if (chatActivityEnterView != null) {
|
|
chatActivityEnterView.setBotsCount(botsCount, hasBotsCommands);
|
|
}
|
|
if (mentionsAdapter != null) {
|
|
mentionsAdapter.setBotsCount(botsCount);
|
|
}
|
|
if (ChatObject.isChannel(currentChat) && mergeDialogId == 0 && info.migrated_from_chat_id != 0) {
|
|
mergeDialogId = -info.migrated_from_chat_id;
|
|
maxMessageId[1] = info.migrated_from_max_id;
|
|
if (chatAdapter != null) {
|
|
chatAdapter.notifyDataSetChanged();
|
|
}
|
|
}
|
|
}
|
|
} else if (id == NotificationCenter.chatInfoCantLoad) {
|
|
int chatId = (Integer) args[0];
|
|
if (currentChat != null && currentChat.id == chatId) {
|
|
int reason = (Integer) args[1];
|
|
if (getParentActivity() == null || closeChatDialog != null) {
|
|
return;
|
|
}
|
|
AlertDialog.Builder builder = new AlertDialog.Builder(getParentActivity());
|
|
builder.setTitle(LocaleController.getString("AppName", R.string.AppName));
|
|
if (reason == 0) {
|
|
builder.setMessage(LocaleController.getString("ChannelCantOpenPrivate", R.string.ChannelCantOpenPrivate));
|
|
} else if (reason == 1) {
|
|
builder.setMessage(LocaleController.getString("ChannelCantOpenNa", R.string.ChannelCantOpenNa));
|
|
} else if (reason == 2) {
|
|
builder.setMessage(LocaleController.getString("ChannelCantOpenBanned", R.string.ChannelCantOpenBanned));
|
|
}
|
|
builder.setPositiveButton(LocaleController.getString("OK", R.string.OK), null);
|
|
showDialog(closeChatDialog = builder.create());
|
|
|
|
loading = false;
|
|
if (progressView != null) {
|
|
progressView.setVisibility(View.INVISIBLE);
|
|
}
|
|
if (chatAdapter != null) {
|
|
chatAdapter.notifyDataSetChanged();
|
|
}
|
|
}
|
|
} else if (id == NotificationCenter.contactsDidLoaded) {
|
|
updateContactStatus();
|
|
if (currentEncryptedChat != null) {
|
|
updateSpamView();
|
|
}
|
|
if (avatarContainer != null) {
|
|
avatarContainer.updateSubtitle();
|
|
}
|
|
} else if (id == NotificationCenter.encryptedChatUpdated) {
|
|
TLRPC.EncryptedChat chat = (TLRPC.EncryptedChat) args[0];
|
|
if (currentEncryptedChat != null && chat.id == currentEncryptedChat.id) {
|
|
currentEncryptedChat = chat;
|
|
updateContactStatus();
|
|
updateSecretStatus();
|
|
initStickers();
|
|
if (chatActivityEnterView != null) {
|
|
chatActivityEnterView.setAllowStickersAndGifs(currentEncryptedChat == null || AndroidUtilities.getPeerLayerVersion(currentEncryptedChat.layer) >= 23, currentEncryptedChat == null || AndroidUtilities.getPeerLayerVersion(currentEncryptedChat.layer) >= 46);
|
|
chatActivityEnterView.checkRoundVideo();
|
|
}
|
|
if (mentionsAdapter != null) {
|
|
mentionsAdapter.setNeedBotContext(!chatActivityEnterView.isEditingMessage() && (currentEncryptedChat == null || AndroidUtilities.getPeerLayerVersion(currentEncryptedChat.layer) >= 46));
|
|
}
|
|
}
|
|
} else if (id == NotificationCenter.messagesReadEncrypted) {
|
|
int encId = (Integer) args[0];
|
|
if (currentEncryptedChat != null && currentEncryptedChat.id == encId) {
|
|
int date = (Integer) args[1];
|
|
for (MessageObject obj : messages) {
|
|
if (!obj.isOut()) {
|
|
continue;
|
|
} else if (obj.isOut() && !obj.isUnread()) {
|
|
break;
|
|
}
|
|
if (obj.messageOwner.date - 1 <= date) {
|
|
obj.setIsRead();
|
|
}
|
|
}
|
|
updateVisibleRows();
|
|
}
|
|
} else if (id == NotificationCenter.removeAllMessagesFromDialog) {
|
|
long did = (Long) args[0];
|
|
if (dialog_id == did) {
|
|
messages.clear();
|
|
waitingForLoad.clear();
|
|
messagesByDays.clear();
|
|
groupedMessagesMap.clear();
|
|
for (int a = 1; a >= 0; a--) {
|
|
messagesDict[a].clear();
|
|
if (currentEncryptedChat == null) {
|
|
maxMessageId[a] = Integer.MAX_VALUE;
|
|
minMessageId[a] = Integer.MIN_VALUE;
|
|
} else {
|
|
maxMessageId[a] = Integer.MIN_VALUE;
|
|
minMessageId[a] = Integer.MAX_VALUE;
|
|
}
|
|
maxDate[a] = Integer.MIN_VALUE;
|
|
minDate[a] = 0;
|
|
selectedMessagesIds[a].clear();
|
|
selectedMessagesCanCopyIds[a].clear();
|
|
selectedMessagesCanStarIds[a].clear();
|
|
}
|
|
cantDeleteMessagesCount = 0;
|
|
canEditMessagesCount = 0;
|
|
actionBar.hideActionMode();
|
|
updatePinnedMessageView(true);
|
|
|
|
if (botButtons != null) {
|
|
botButtons = null;
|
|
if (chatActivityEnterView != null) {
|
|
chatActivityEnterView.setButtons(null, false);
|
|
}
|
|
}
|
|
if ((Boolean) args[1]) {
|
|
if (chatAdapter != null) {
|
|
progressView.setVisibility(chatAdapter.botInfoRow == -1 ? View.VISIBLE : View.INVISIBLE);
|
|
chatListView.setEmptyView(null);
|
|
}
|
|
for (int a = 0; a < 2; a++) {
|
|
endReached[a] = false;
|
|
cacheEndReached[a] = false;
|
|
forwardEndReached[a] = true;
|
|
}
|
|
first = true;
|
|
firstLoading = true;
|
|
loading = true;
|
|
startLoadFromMessageId = 0;
|
|
needSelectFromMessageId = false;
|
|
waitingForLoad.add(lastLoadIndex);
|
|
MessagesController.getInstance().loadMessages(dialog_id, AndroidUtilities.isTablet() ? 30 : 20, 0, 0, true, 0, classGuid, 2, 0, ChatObject.isChannel(currentChat), lastLoadIndex++);
|
|
} else {
|
|
if (progressView != null) {
|
|
progressView.setVisibility(View.INVISIBLE);
|
|
chatListView.setEmptyView(emptyViewContainer);
|
|
}
|
|
}
|
|
|
|
if (chatAdapter != null) {
|
|
chatAdapter.notifyDataSetChanged();
|
|
}
|
|
if (currentEncryptedChat == null && currentUser != null && currentUser.bot && botUser == null) {
|
|
botUser = "";
|
|
updateBottomOverlay();
|
|
}
|
|
}
|
|
} else if (id == NotificationCenter.screenshotTook) {
|
|
updateInformationForScreenshotDetector();
|
|
} else if (id == NotificationCenter.blockedUsersDidLoaded) {
|
|
if (currentUser != null) {
|
|
boolean oldValue = userBlocked;
|
|
userBlocked = MessagesController.getInstance().blockedUsers.contains(currentUser.id);
|
|
if (oldValue != userBlocked) {
|
|
updateBottomOverlay();
|
|
}
|
|
}
|
|
} else if (id == NotificationCenter.FileNewChunkAvailable) {
|
|
MessageObject messageObject = (MessageObject) args[0];
|
|
long finalSize = (Long) args[2];
|
|
if (finalSize != 0 && dialog_id == messageObject.getDialogId()) {
|
|
MessageObject currentObject = messagesDict[0].get(messageObject.getId());
|
|
if (currentObject != null) {
|
|
currentObject.messageOwner.media.document.size = (int) finalSize;
|
|
updateVisibleRows();
|
|
}
|
|
}
|
|
} else if (id == NotificationCenter.didCreatedNewDeleteTask) {
|
|
SparseArray<ArrayList<Long>> mids = (SparseArray<ArrayList<Long>>) args[0];
|
|
boolean changed = false;
|
|
for (int i = 0; i < mids.size(); i++) {
|
|
int key = mids.keyAt(i);
|
|
ArrayList<Long> arr = mids.get(key);
|
|
for (int a = 0; a < arr.size(); a++) {
|
|
long mid = arr.get(a);
|
|
if (a == 0) {
|
|
int channelId = (int) (mid >> 32);
|
|
if (channelId < 0) {
|
|
channelId = 0;
|
|
}
|
|
if (channelId != (ChatObject.isChannel(currentChat) ? currentChat.id : 0)) {
|
|
return;
|
|
}
|
|
}
|
|
MessageObject messageObject = messagesDict[0].get((int) mid);
|
|
if (messageObject != null) {
|
|
messageObject.messageOwner.destroyTime = key;
|
|
changed = true;
|
|
}
|
|
}
|
|
}
|
|
if (changed) {
|
|
updateVisibleRows();
|
|
}
|
|
} else if (id == NotificationCenter.messagePlayingDidStarted) {
|
|
MessageObject messageObject = (MessageObject) args[0];
|
|
if (messageObject.eventId != 0) {
|
|
return;
|
|
}
|
|
sendSecretMessageRead(messageObject);
|
|
|
|
if (messageObject.isRoundVideo()) {
|
|
MediaController.getInstance().setTextureView(createTextureView(true), aspectRatioFrameLayout, roundVideoContainer, true);
|
|
updateTextureViewPosition();
|
|
}
|
|
|
|
if (chatListView != null) {
|
|
int count = chatListView.getChildCount();
|
|
for (int a = 0; a < count; a++) {
|
|
View view = chatListView.getChildAt(a);
|
|
if (view instanceof ChatMessageCell) {
|
|
ChatMessageCell cell = (ChatMessageCell) view;
|
|
MessageObject messageObject1 = cell.getMessageObject();
|
|
if (messageObject1 != null) {
|
|
if (messageObject1.isVoice() || messageObject1.isMusic()) {
|
|
cell.updateButtonState(false);
|
|
} else if (messageObject1.isRoundVideo()) {
|
|
cell.checkRoundVideoPlayback(false);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
count = mentionListView.getChildCount();
|
|
for (int a = 0; a < count; a++) {
|
|
View view = mentionListView.getChildAt(a);
|
|
if (view instanceof ContextLinkCell) {
|
|
ContextLinkCell cell = (ContextLinkCell) view;
|
|
MessageObject messageObject1 = cell.getMessageObject();
|
|
if (messageObject1 != null && (messageObject1.isVoice() || messageObject1.isMusic())) {
|
|
cell.updateButtonState(false);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
} else if (id == NotificationCenter.messagePlayingDidReset || id == NotificationCenter.messagePlayingPlayStateChanged) {
|
|
if (id == NotificationCenter.messagePlayingDidReset) {
|
|
destroyTextureView();
|
|
}
|
|
if (chatListView != null) {
|
|
int count = chatListView.getChildCount();
|
|
for (int a = 0; a < count; a++) {
|
|
View view = chatListView.getChildAt(a);
|
|
if (view instanceof ChatMessageCell) {
|
|
ChatMessageCell cell = (ChatMessageCell) view;
|
|
MessageObject messageObject = cell.getMessageObject();
|
|
if (messageObject != null) {
|
|
if (messageObject.isVoice() || messageObject.isMusic()) {
|
|
cell.updateButtonState(false);
|
|
} else if (messageObject.isRoundVideo()) {
|
|
if (!MediaController.getInstance().isPlayingMessage(messageObject)) {
|
|
cell.checkRoundVideoPlayback(true);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
count = mentionListView.getChildCount();
|
|
for (int a = 0; a < count; a++) {
|
|
View view = mentionListView.getChildAt(a);
|
|
if (view instanceof ContextLinkCell) {
|
|
ContextLinkCell cell = (ContextLinkCell) view;
|
|
MessageObject messageObject = cell.getMessageObject();
|
|
if (messageObject != null && (messageObject.isVoice() || messageObject.isMusic())) {
|
|
cell.updateButtonState(false);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
} else if (id == NotificationCenter.messagePlayingProgressDidChanged) {
|
|
Integer mid = (Integer) args[0];
|
|
if (chatListView != null) {
|
|
int count = chatListView.getChildCount();
|
|
for (int a = 0; a < count; a++) {
|
|
View view = chatListView.getChildAt(a);
|
|
if (view instanceof ChatMessageCell) {
|
|
ChatMessageCell cell = (ChatMessageCell) view;
|
|
MessageObject playing = cell.getMessageObject();
|
|
if (playing != null && playing.getId() == mid) {
|
|
MessageObject player = MediaController.getInstance().getPlayingMessageObject();
|
|
if (player != null) {
|
|
playing.audioProgress = player.audioProgress;
|
|
playing.audioProgressSec = player.audioProgressSec;
|
|
cell.updatePlayingMessageProgress();
|
|
}
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
} else if (id == NotificationCenter.updateMessageMedia) {
|
|
TLRPC.Message message = (TLRPC.Message) args[0];
|
|
MessageObject existMessageObject = messagesDict[0].get(message.id);
|
|
if (existMessageObject != null) {
|
|
existMessageObject.messageOwner.media = message.media;
|
|
existMessageObject.messageOwner.attachPath = message.attachPath;
|
|
existMessageObject.generateThumbs(false);
|
|
if (existMessageObject.getGroupId() != 0 && (existMessageObject.photoThumbs == null || existMessageObject.photoThumbs.isEmpty())) {
|
|
MessageObject.GroupedMessages groupedMessages = groupedMessagesMap.get(existMessageObject.getGroupId());
|
|
if (groupedMessages != null) {
|
|
int idx = groupedMessages.messages.indexOf(existMessageObject);
|
|
if (idx >= 0) {
|
|
int updateCount = groupedMessages.messages.size();
|
|
MessageObject messageObject = null;
|
|
if (idx > 0 && idx < groupedMessages.messages.size() - 1) {
|
|
MessageObject.GroupedMessages slicedGroup = new MessageObject.GroupedMessages();
|
|
slicedGroup.groupId = Utilities.random.nextLong();
|
|
slicedGroup.messages.addAll(groupedMessages.messages.subList(idx + 1, groupedMessages.messages.size()));
|
|
for (int b = 0; b < slicedGroup.messages.size(); b++) {
|
|
slicedGroup.messages.get(b).localGroupId = slicedGroup.groupId;
|
|
groupedMessages.messages.remove(idx + 1);
|
|
}
|
|
groupedMessagesMap.put(slicedGroup.groupId, slicedGroup);
|
|
messageObject = slicedGroup.messages.get(slicedGroup.messages.size() - 1);
|
|
slicedGroup.calculate();
|
|
}
|
|
groupedMessages.messages.remove(idx);
|
|
if (messageObject == null) {
|
|
messageObject = groupedMessages.messages.get(groupedMessages.messages.size() - 1);
|
|
}
|
|
if (groupedMessages.messages.isEmpty()) {
|
|
groupedMessagesMap.remove(groupedMessages.groupId);
|
|
} else {
|
|
groupedMessages.calculate();
|
|
int index = messages.indexOf(messageObject);
|
|
if (index >= 0) {
|
|
if (chatAdapter != null) {
|
|
chatAdapter.notifyItemRangeChanged(index + chatAdapter.messagesStartRow, updateCount);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
if (message.media.ttl_seconds != 0 && (message.media.photo instanceof TLRPC.TL_photoEmpty || message.media.document instanceof TLRPC.TL_documentEmpty)) {
|
|
existMessageObject.setType();
|
|
chatAdapter.updateRowWithMessageObject(existMessageObject);
|
|
} else {
|
|
updateVisibleRows();
|
|
}
|
|
}
|
|
} else if (id == NotificationCenter.replaceMessagesObjects) {
|
|
long did = (long) args[0];
|
|
if (did != dialog_id && did != mergeDialogId) {
|
|
return;
|
|
}
|
|
int loadIndex = did == dialog_id ? 0 : 1;
|
|
boolean changed = false;
|
|
boolean mediaUpdated = false;
|
|
ArrayList<MessageObject> messageObjects = (ArrayList<MessageObject>) args[1];
|
|
HashMap<Long, MessageObject.GroupedMessages> newGroups = null;
|
|
for (int a = 0; a < messageObjects.size(); a++) {
|
|
MessageObject messageObject = messageObjects.get(a);
|
|
MessageObject old = messagesDict[loadIndex].get(messageObject.getId());
|
|
if (pinnedMessageObject != null && pinnedMessageObject.getId() == messageObject.getId()) {
|
|
pinnedMessageObject = messageObject;
|
|
updatePinnedMessageView(true);
|
|
}
|
|
if (old != null) {
|
|
if (messageObject.type >= 0) {
|
|
if (!mediaUpdated && messageObject.messageOwner.media instanceof TLRPC.TL_messageMediaWebPage) {
|
|
mediaUpdated = true;
|
|
}
|
|
if (old.replyMessageObject != null) {
|
|
messageObject.replyMessageObject = old.replyMessageObject;
|
|
if (messageObject.messageOwner.action instanceof TLRPC.TL_messageActionGameScore) {
|
|
messageObject.generateGameMessageText(null);
|
|
} else if (messageObject.messageOwner.action instanceof TLRPC.TL_messageActionPaymentSent) {
|
|
messageObject.generatePaymentSentMessageText(null);
|
|
}
|
|
}
|
|
messageObject.messageOwner.attachPath = old.messageOwner.attachPath;
|
|
messageObject.attachPathExists = old.attachPathExists;
|
|
messageObject.mediaExists = old.mediaExists;
|
|
messagesDict[loadIndex].put(old.getId(), messageObject);
|
|
} else {
|
|
messagesDict[loadIndex].remove(old.getId());
|
|
}
|
|
int index = messages.indexOf(old);
|
|
if (index >= 0) {
|
|
ArrayList<MessageObject> dayArr = messagesByDays.get(old.dateKey);
|
|
int index2 = -1;
|
|
if (dayArr != null) {
|
|
index2 = dayArr.indexOf(old);
|
|
}
|
|
if (old.getGroupId() != 0) {
|
|
MessageObject.GroupedMessages groupedMessages = groupedMessagesMap.get(old.getGroupId());
|
|
if (groupedMessages != null) {
|
|
int idx = groupedMessages.messages.indexOf(old);
|
|
if (idx >= 0) {
|
|
if (old.getGroupId() != messageObject.getGroupId()) {
|
|
groupedMessagesMap.put(messageObject.getGroupId(), groupedMessages);
|
|
}
|
|
if (messageObject.photoThumbs == null || messageObject.photoThumbs.isEmpty()) {
|
|
if (newGroups == null) {
|
|
newGroups = new HashMap<>();
|
|
}
|
|
newGroups.put(groupedMessages.groupId, groupedMessages);
|
|
if (idx > 0 && idx < groupedMessages.messages.size() - 1) {
|
|
MessageObject.GroupedMessages slicedGroup = new MessageObject.GroupedMessages();
|
|
slicedGroup.groupId = Utilities.random.nextLong();
|
|
slicedGroup.messages.addAll(groupedMessages.messages.subList(idx + 1, groupedMessages.messages.size()));
|
|
for (int b = 0; b < slicedGroup.messages.size(); b++) {
|
|
slicedGroup.messages.get(b).localGroupId = slicedGroup.groupId;
|
|
groupedMessages.messages.remove(idx + 1);
|
|
}
|
|
newGroups.put(slicedGroup.groupId, slicedGroup);
|
|
groupedMessagesMap.put(slicedGroup.groupId, slicedGroup);
|
|
}
|
|
groupedMessages.messages.remove(idx);
|
|
} else {
|
|
groupedMessages.messages.set(idx, messageObject);
|
|
MessageObject.GroupedMessagePosition oldPosition = groupedMessages.positions.remove(old);
|
|
if (oldPosition != null) {
|
|
groupedMessages.positions.put(messageObject, oldPosition);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
if (messageObject.type >= 0) {
|
|
messages.set(index, messageObject);
|
|
if (chatAdapter != null) {
|
|
chatAdapter.notifyItemChanged(chatAdapter.messagesStartRow + index);
|
|
}
|
|
if (index2 >= 0) {
|
|
dayArr.set(index2, messageObject);
|
|
}
|
|
} else {
|
|
messages.remove(index);
|
|
if (chatAdapter != null) {
|
|
chatAdapter.notifyItemRemoved(chatAdapter.messagesStartRow + index);
|
|
}
|
|
if (index2 >= 0) {
|
|
dayArr.remove(index2);
|
|
if (dayArr.isEmpty()) {
|
|
messagesByDays.remove(old.dateKey);
|
|
messages.remove(index);
|
|
chatAdapter.notifyItemRemoved(chatAdapter.messagesStartRow);
|
|
}
|
|
}
|
|
}
|
|
changed = true;
|
|
}
|
|
}
|
|
}
|
|
if (newGroups != null) {
|
|
for (HashMap.Entry<Long, MessageObject.GroupedMessages> entry : newGroups.entrySet()) {
|
|
MessageObject.GroupedMessages groupedMessages = entry.getValue();
|
|
if (groupedMessages.messages.isEmpty()) {
|
|
groupedMessagesMap.remove(groupedMessages.groupId);
|
|
} else {
|
|
groupedMessages.calculate();
|
|
MessageObject messageObject = groupedMessages.messages.get(groupedMessages.messages.size() - 1);
|
|
int index = messages.indexOf(messageObject);
|
|
if (index >= 0) {
|
|
if (chatAdapter != null) {
|
|
chatAdapter.notifyItemRangeChanged(index + chatAdapter.messagesStartRow, groupedMessages.messages.size());
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
if (changed && chatLayoutManager != null) {
|
|
if (mediaUpdated && chatLayoutManager.findFirstVisibleItemPosition() == 0) {
|
|
//moveScrollToLastMessage();
|
|
}
|
|
}
|
|
} else if (id == NotificationCenter.notificationsSettingsUpdated) {
|
|
updateTitleIcons();
|
|
if (ChatObject.isChannel(currentChat)) {
|
|
updateBottomOverlay();
|
|
}
|
|
} else if (id == NotificationCenter.didLoadedReplyMessages) {
|
|
long did = (Long) args[0];
|
|
if (did == dialog_id) {
|
|
updateVisibleRows();
|
|
}
|
|
} else if (id == NotificationCenter.didLoadedPinnedMessage) {
|
|
MessageObject message = (MessageObject) args[0];
|
|
if (message.getDialogId() == dialog_id && info != null && info.pinned_msg_id == message.getId()) {
|
|
pinnedMessageObject = message;
|
|
loadingPinnedMessage = 0;
|
|
updatePinnedMessageView(true);
|
|
}
|
|
} else if (id == NotificationCenter.didReceivedWebpages) {
|
|
ArrayList<TLRPC.Message> arrayList = (ArrayList<TLRPC.Message>) args[0];
|
|
boolean updated = false;
|
|
for (int a = 0; a < arrayList.size(); a++) {
|
|
TLRPC.Message message = arrayList.get(a);
|
|
long did = MessageObject.getDialogId(message);
|
|
if (did != dialog_id && did != mergeDialogId) {
|
|
continue;
|
|
}
|
|
MessageObject currentMessage = messagesDict[did == dialog_id ? 0 : 1].get(message.id);
|
|
if (currentMessage != null) {
|
|
currentMessage.messageOwner.media = new TLRPC.TL_messageMediaWebPage();
|
|
currentMessage.messageOwner.media.webpage = message.media.webpage;
|
|
currentMessage.generateThumbs(true);
|
|
updated = true;
|
|
}
|
|
}
|
|
if (updated) {
|
|
updateVisibleRows();
|
|
if (chatLayoutManager != null && chatLayoutManager.findFirstVisibleItemPosition() == 0) {
|
|
moveScrollToLastMessage();
|
|
}
|
|
}
|
|
} else if (id == NotificationCenter.didReceivedWebpagesInUpdates) {
|
|
if (foundWebPage != null) {
|
|
HashMap<Long, TLRPC.WebPage> hashMap = (HashMap<Long, TLRPC.WebPage>) args[0];
|
|
for (TLRPC.WebPage webPage : hashMap.values()) {
|
|
if (webPage.id == foundWebPage.id) {
|
|
showReplyPanel(!(webPage instanceof TLRPC.TL_webPageEmpty), null, null, webPage, false);
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
} else if (id == NotificationCenter.messagesReadContent) {
|
|
ArrayList<Long> arrayList = (ArrayList<Long>) args[0];
|
|
boolean updated = false;
|
|
int currentChannelId = ChatObject.isChannel(currentChat) ? currentChat.id : 0;
|
|
for (int a = 0; a < arrayList.size(); a++) {
|
|
long mid = arrayList.get(a);
|
|
int channelId = (int) (mid >> 32);
|
|
if (channelId < 0) {
|
|
channelId = 0;
|
|
}
|
|
if (channelId != currentChannelId) {
|
|
continue;
|
|
}
|
|
MessageObject currentMessage = messagesDict[0].get((int) mid);
|
|
if (currentMessage != null) {
|
|
currentMessage.setContentIsRead();
|
|
updated = true;
|
|
if (currentMessage.messageOwner.mentioned) {
|
|
newMentionsCount--;
|
|
if (newMentionsCount <= 0) {
|
|
newMentionsCount = 0;
|
|
hasAllMentionsLocal = true;
|
|
showMentiondownButton(false, true);
|
|
} else {
|
|
mentiondownButtonCounter.setText(String.format("%d", newMentionsCount));
|
|
}
|
|
}
|
|
}
|
|
}
|
|
if (updated) {
|
|
updateVisibleRows();
|
|
}
|
|
} else if (id == NotificationCenter.botInfoDidLoaded) {
|
|
int guid = (Integer) args[1];
|
|
if (classGuid == guid) {
|
|
TLRPC.BotInfo info = (TLRPC.BotInfo) args[0];
|
|
if (currentEncryptedChat == null) {
|
|
if (!info.commands.isEmpty() && !ChatObject.isChannel(currentChat)) {
|
|
hasBotsCommands = true;
|
|
}
|
|
botInfo.put(info.user_id, info);
|
|
if (chatAdapter != null) {
|
|
chatAdapter.notifyItemChanged(chatAdapter.botInfoRow);
|
|
}
|
|
if (mentionsAdapter != null && (!ChatObject.isChannel(currentChat) || currentChat != null && currentChat.megagroup)) {
|
|
mentionsAdapter.setBotInfo(botInfo);
|
|
}
|
|
if (chatActivityEnterView != null) {
|
|
chatActivityEnterView.setBotsCount(botsCount, hasBotsCommands);
|
|
}
|
|
}
|
|
updateBotButtons();
|
|
}
|
|
} else if (id == NotificationCenter.botKeyboardDidLoaded) {
|
|
if (dialog_id == (Long) args[1]) {
|
|
TLRPC.Message message = (TLRPC.Message) args[0];
|
|
if (message != null && !userBlocked) {
|
|
botButtons = new MessageObject(message, null, false);
|
|
if (chatActivityEnterView != null) {
|
|
if (botButtons.messageOwner.reply_markup instanceof TLRPC.TL_replyKeyboardForceReply) {
|
|
SharedPreferences preferences = ApplicationLoader.applicationContext.getSharedPreferences("mainconfig", Activity.MODE_PRIVATE);
|
|
if (preferences.getInt("answered_" + dialog_id, 0) != botButtons.getId() && (replyingMessageObject == null || chatActivityEnterView.getFieldText() == null)) {
|
|
botReplyButtons = botButtons;
|
|
chatActivityEnterView.setButtons(botButtons);
|
|
showReplyPanel(true, botButtons, null, null, false);
|
|
}
|
|
} else {
|
|
if (replyingMessageObject != null && botReplyButtons == replyingMessageObject) {
|
|
botReplyButtons = null;
|
|
showReplyPanel(false, null, null, null, false);
|
|
}
|
|
chatActivityEnterView.setButtons(botButtons);
|
|
}
|
|
}
|
|
} else {
|
|
botButtons = null;
|
|
if (chatActivityEnterView != null) {
|
|
if (replyingMessageObject != null && botReplyButtons == replyingMessageObject) {
|
|
botReplyButtons = null;
|
|
showReplyPanel(false, null, null, null, false);
|
|
}
|
|
chatActivityEnterView.setButtons(botButtons);
|
|
}
|
|
}
|
|
}
|
|
} else if (id == NotificationCenter.chatSearchResultsAvailable) {
|
|
if (classGuid == (Integer) args[0]) {
|
|
int messageId = (Integer) args[1];
|
|
long did = (Long) args[3];
|
|
if (messageId != 0) {
|
|
scrollToMessageId(messageId, 0, true, did == dialog_id ? 0 : 1, false);
|
|
}
|
|
updateSearchButtons((Integer) args[2], (Integer) args[4], (Integer) args[5]);
|
|
if (searchItem != null) {
|
|
searchItem.setShowSearchProgress(false);
|
|
}
|
|
}
|
|
} else if (id == NotificationCenter.chatSearchResultsLoading) {
|
|
if (classGuid == (Integer) args[0] && searchItem != null) {
|
|
searchItem.setShowSearchProgress(true);
|
|
}
|
|
} else if (id == NotificationCenter.didUpdatedMessagesViews) {
|
|
SparseArray<SparseIntArray> channelViews = (SparseArray<SparseIntArray>) args[0];
|
|
SparseIntArray array = channelViews.get((int) dialog_id);
|
|
if (array != null) {
|
|
boolean updated = false;
|
|
for (int a = 0; a < array.size(); a++) {
|
|
int messageId = array.keyAt(a);
|
|
MessageObject messageObject = messagesDict[0].get(messageId);
|
|
if (messageObject != null) {
|
|
int newValue = array.get(messageId);
|
|
if (newValue > messageObject.messageOwner.views) {
|
|
messageObject.messageOwner.views = newValue;
|
|
updated = true;
|
|
}
|
|
}
|
|
}
|
|
if (updated) {
|
|
updateVisibleRows();
|
|
}
|
|
}
|
|
} else if (id == NotificationCenter.peerSettingsDidLoaded) {
|
|
long did = (Long) args[0];
|
|
if (did == dialog_id) {
|
|
updateSpamView();
|
|
}
|
|
} else if (id == NotificationCenter.newDraftReceived) {
|
|
long did = (Long) args[0];
|
|
if (did == dialog_id) {
|
|
applyDraftMaybe(true);
|
|
}
|
|
} else if (id == NotificationCenter.userInfoDidLoaded) {
|
|
Integer uid = (Integer) args[0];
|
|
if (currentUser != null && currentUser.id == uid) {
|
|
TLRPC.TL_userFull userFull = (TLRPC.TL_userFull) args[1];
|
|
if (headerItem != null) {
|
|
if (userFull.phone_calls_available) {
|
|
headerItem.showSubItem(call);
|
|
} else {
|
|
headerItem.hideSubItem(call);
|
|
}
|
|
}
|
|
}
|
|
} else if (id == NotificationCenter.didSetNewWallpapper) {
|
|
if (fragmentView != null) {
|
|
((SizeNotifierFrameLayout) fragmentView).setBackgroundImage(Theme.getCachedWallpaper());
|
|
progressView2.getBackground().setColorFilter(Theme.colorFilter);
|
|
if (emptyView != null) {
|
|
emptyView.getBackground().setColorFilter(Theme.colorFilter);
|
|
}
|
|
if (bigEmptyView != null) {
|
|
bigEmptyView.getBackground().setColorFilter(Theme.colorFilter);
|
|
}
|
|
chatListView.invalidateViews();
|
|
}
|
|
} else if (id == NotificationCenter.channelRightsUpdated) {
|
|
TLRPC.Chat chat = (TLRPC.Chat) args[0];
|
|
if (currentChat != null && chat.id == currentChat.id && chatActivityEnterView != null) {
|
|
currentChat = chat;
|
|
chatActivityEnterView.checkChannelRights();
|
|
checkRaiseSensors();
|
|
updateSecretStatus();
|
|
}
|
|
} else if (id == NotificationCenter.updateMentionsCount) {
|
|
if (dialog_id == (Long) args[0]) {
|
|
int count = (int) args[1];
|
|
if (newMentionsCount > count) {
|
|
newMentionsCount = count;
|
|
if (newMentionsCount <= 0) {
|
|
newMentionsCount = 0;
|
|
hasAllMentionsLocal = true;
|
|
showMentiondownButton(false, true);
|
|
} else {
|
|
mentiondownButtonCounter.setText(String.format("%d", newMentionsCount));
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
public boolean processSwitchButton(TLRPC.TL_keyboardButtonSwitchInline button) {
|
|
if (inlineReturn == 0 || button.same_peer || parentLayout == null) {
|
|
return false;
|
|
}
|
|
String query = "@" + currentUser.username + " " + button.query;
|
|
if (inlineReturn == dialog_id) {
|
|
inlineReturn = 0;
|
|
chatActivityEnterView.setFieldText(query);
|
|
} else {
|
|
DraftQuery.saveDraft(inlineReturn, query, null, null, false);
|
|
if (parentLayout.fragmentsStack.size() > 1) {
|
|
BaseFragment prevFragment = parentLayout.fragmentsStack.get(parentLayout.fragmentsStack.size() - 2);
|
|
if (prevFragment instanceof ChatActivity && ((ChatActivity) prevFragment).dialog_id == inlineReturn) {
|
|
finishFragment();
|
|
} else {
|
|
Bundle bundle = new Bundle();
|
|
int lower_part = (int) inlineReturn;
|
|
int high_part = (int) (inlineReturn >> 32);
|
|
if (lower_part != 0) {
|
|
if (lower_part > 0) {
|
|
bundle.putInt("user_id", lower_part);
|
|
} else if (lower_part < 0) {
|
|
bundle.putInt("chat_id", -lower_part);
|
|
}
|
|
} else {
|
|
bundle.putInt("enc_id", high_part);
|
|
}
|
|
/*ActionBarLayout parentLayout = ChatActivity.this.parentLayout;
|
|
if (lastFragment != null) {
|
|
NotificationCenter.getInstance().removeObserver(lastFragment, NotificationCenter.closeChats);
|
|
}
|
|
NotificationCenter.getInstance().postNotificationName(NotificationCenter.closeChats);*/
|
|
presentFragment(new ChatActivity(bundle), true);
|
|
}
|
|
}
|
|
}
|
|
return true;
|
|
}
|
|
|
|
private void updateSearchButtons(int mask, int num, int count) {
|
|
if (searchUpButton != null) {
|
|
searchUpButton.setEnabled((mask & 1) != 0);
|
|
searchDownButton.setEnabled((mask & 2) != 0);
|
|
searchUpButton.setAlpha(searchUpButton.isEnabled() ? 1.0f : 0.5f);
|
|
searchDownButton.setAlpha(searchDownButton.isEnabled() ? 1.0f : 0.5f);
|
|
if (count < 0) {
|
|
searchCountText.setText("");
|
|
} else if (count == 0) {
|
|
searchCountText.setText(LocaleController.getString("NoResult", R.string.NoResult));
|
|
} else {
|
|
searchCountText.setText(LocaleController.formatString("Of", R.string.Of, num + 1, count));
|
|
}
|
|
}
|
|
}
|
|
|
|
@Override
|
|
public boolean needDelayOpenAnimation() {
|
|
return firstLoading;
|
|
}
|
|
|
|
@Override
|
|
public void onTransitionAnimationStart(boolean isOpen, boolean backward) {
|
|
NotificationCenter.getInstance().setAllowedNotificationsDutingAnimation(new int[]{NotificationCenter.chatInfoDidLoaded, NotificationCenter.dialogsNeedReload,
|
|
NotificationCenter.closeChats, NotificationCenter.messagesDidLoaded, NotificationCenter.botKeyboardDidLoaded/*, NotificationCenter.botInfoDidLoaded*/});
|
|
NotificationCenter.getInstance().setAnimationInProgress(true);
|
|
if (isOpen) {
|
|
openAnimationEnded = false;
|
|
}
|
|
}
|
|
|
|
@Override
|
|
public void onTransitionAnimationEnd(boolean isOpen, boolean backward) {
|
|
NotificationCenter.getInstance().setAnimationInProgress(false);
|
|
if (isOpen) {
|
|
openAnimationEnded = true;
|
|
if (currentUser != null) {
|
|
MessagesController.getInstance().loadFullUser(currentUser, classGuid, false);
|
|
}
|
|
if (Build.VERSION.SDK_INT >= 21) {
|
|
createChatAttachView();
|
|
}
|
|
|
|
if (chatActivityEnterView.hasRecordVideo() && !chatActivityEnterView.isSendButtonVisible()) {
|
|
boolean isChannel = false;
|
|
if (currentChat != null) {
|
|
isChannel = ChatObject.isChannel(currentChat) && !currentChat.megagroup;
|
|
}
|
|
SharedPreferences preferences = ApplicationLoader.applicationContext.getSharedPreferences("mainconfig", Activity.MODE_PRIVATE);
|
|
String key = isChannel ? "needShowRoundHintChannel" : "needShowRoundHint";
|
|
if (preferences.getBoolean(key, true)) {
|
|
if (Utilities.random.nextFloat() < 0.2f) {
|
|
showVoiceHint(false, chatActivityEnterView.isInVideoMode());
|
|
preferences.edit().putBoolean(key, false).commit();
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
@Override
|
|
protected void onDialogDismiss(Dialog dialog) {
|
|
if (closeChatDialog != null && dialog == closeChatDialog) {
|
|
MessagesController.getInstance().deleteDialog(dialog_id, 0);
|
|
if (parentLayout != null && !parentLayout.fragmentsStack.isEmpty() && parentLayout.fragmentsStack.get(parentLayout.fragmentsStack.size() - 1) != this) {
|
|
BaseFragment fragment = parentLayout.fragmentsStack.get(parentLayout.fragmentsStack.size() - 1);
|
|
removeSelfFromStack();
|
|
fragment.finishFragment();
|
|
} else {
|
|
finishFragment();
|
|
}
|
|
}
|
|
}
|
|
|
|
@Override
|
|
public boolean extendActionMode(Menu menu) {
|
|
if (chatActivityEnterView.getSelectionLength() == 0 || menu.findItem(android.R.id.copy) == null) {
|
|
return true;
|
|
}
|
|
if (Build.VERSION.SDK_INT >= 23) {
|
|
menu.removeItem(android.R.id.shareText);
|
|
}
|
|
SpannableStringBuilder stringBuilder = new SpannableStringBuilder(LocaleController.getString("Bold", R.string.Bold));
|
|
stringBuilder.setSpan(new TypefaceSpan(AndroidUtilities.getTypeface("fonts/rmedium.ttf")), 0, stringBuilder.length(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
|
|
menu.add(R.id.menu_groupbolditalic, R.id.menu_bold, 6, stringBuilder);
|
|
stringBuilder = new SpannableStringBuilder(LocaleController.getString("Italic", R.string.Italic));
|
|
stringBuilder.setSpan(new TypefaceSpan(AndroidUtilities.getTypeface("fonts/ritalic.ttf")), 0, stringBuilder.length(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
|
|
menu.add(R.id.menu_groupbolditalic, R.id.menu_italic, 7, stringBuilder);
|
|
menu.add(R.id.menu_groupbolditalic, R.id.menu_regular, 8, LocaleController.getString("Regular", R.string.Regular));
|
|
return true;
|
|
}
|
|
|
|
private void updateBottomOverlay() {
|
|
if (bottomOverlayChatText == null) {
|
|
return;
|
|
}
|
|
if (currentChat != null) {
|
|
if (ChatObject.isChannel(currentChat) && !(currentChat instanceof TLRPC.TL_channelForbidden)) {
|
|
if (ChatObject.isNotInChat(currentChat)) {
|
|
bottomOverlayChatText.setText(LocaleController.getString("ChannelJoin", R.string.ChannelJoin));
|
|
} else {
|
|
if (!MessagesController.getInstance().isDialogMuted(dialog_id)) {
|
|
bottomOverlayChatText.setText(LocaleController.getString("ChannelMute", R.string.ChannelMute));
|
|
} else {
|
|
bottomOverlayChatText.setText(LocaleController.getString("ChannelUnmute", R.string.ChannelUnmute));
|
|
}
|
|
}
|
|
} else {
|
|
bottomOverlayChatText.setText(LocaleController.getString("DeleteThisGroup", R.string.DeleteThisGroup));
|
|
}
|
|
} else {
|
|
if (userBlocked) {
|
|
if (currentUser.bot) {
|
|
bottomOverlayChatText.setText(LocaleController.getString("BotUnblock", R.string.BotUnblock));
|
|
} else {
|
|
bottomOverlayChatText.setText(LocaleController.getString("Unblock", R.string.Unblock));
|
|
}
|
|
if (botButtons != null) {
|
|
botButtons = null;
|
|
if (chatActivityEnterView != null) {
|
|
if (replyingMessageObject != null && botReplyButtons == replyingMessageObject) {
|
|
botReplyButtons = null;
|
|
showReplyPanel(false, null, null, null, false);
|
|
}
|
|
chatActivityEnterView.setButtons(botButtons, false);
|
|
}
|
|
}
|
|
} else if (botUser != null && currentUser.bot) {
|
|
bottomOverlayChatText.setText(LocaleController.getString("BotStart", R.string.BotStart));
|
|
chatActivityEnterView.hidePopup(false);
|
|
if (getParentActivity() != null) {
|
|
AndroidUtilities.hideKeyboard(getParentActivity().getCurrentFocus());
|
|
}
|
|
} else {
|
|
bottomOverlayChatText.setText(LocaleController.getString("DeleteThisChat", R.string.DeleteThisChat));
|
|
}
|
|
}
|
|
|
|
if (searchItem != null && searchItem.getVisibility() == View.VISIBLE) {
|
|
searchContainer.setVisibility(View.VISIBLE);
|
|
bottomOverlayChat.setVisibility(View.INVISIBLE);
|
|
chatActivityEnterView.setFieldFocused(false);
|
|
chatActivityEnterView.setVisibility(View.INVISIBLE);
|
|
if (chatActivityEnterView.isTopViewVisible()) {
|
|
topViewWasVisible = 1;
|
|
chatActivityEnterView.hideTopView(false);
|
|
} else {
|
|
topViewWasVisible = 2;
|
|
}
|
|
} else {
|
|
searchContainer.setVisibility(View.INVISIBLE);
|
|
if (currentChat != null && (ChatObject.isNotInChat(currentChat) || !ChatObject.canWriteToChat(currentChat)) ||
|
|
currentUser != null && (UserObject.isDeleted(currentUser) || userBlocked)) {
|
|
if (chatActivityEnterView.isEditingMessage()) {
|
|
chatActivityEnterView.setVisibility(View.VISIBLE);
|
|
bottomOverlayChat.setVisibility(View.INVISIBLE);
|
|
chatActivityEnterView.setFieldFocused();
|
|
AndroidUtilities.runOnUIThread(new Runnable() {
|
|
@Override
|
|
public void run() {
|
|
chatActivityEnterView.openKeyboard();
|
|
}
|
|
}, 100);
|
|
} else {
|
|
bottomOverlayChat.setVisibility(View.VISIBLE);
|
|
chatActivityEnterView.setFieldFocused(false);
|
|
chatActivityEnterView.setVisibility(View.INVISIBLE);
|
|
chatActivityEnterView.closeKeyboard();
|
|
}
|
|
if (muteItem != null) {
|
|
muteItem.setVisibility(View.GONE);
|
|
}
|
|
attachItem.setVisibility(View.GONE);
|
|
headerItem.setVisibility(View.VISIBLE);
|
|
} else {
|
|
if (botUser != null && currentUser.bot) {
|
|
bottomOverlayChat.setVisibility(View.VISIBLE);
|
|
chatActivityEnterView.setVisibility(View.INVISIBLE);
|
|
} else {
|
|
chatActivityEnterView.setVisibility(View.VISIBLE);
|
|
bottomOverlayChat.setVisibility(View.INVISIBLE);
|
|
}
|
|
if (muteItem != null) {
|
|
muteItem.setVisibility(View.VISIBLE);
|
|
}
|
|
}
|
|
if (topViewWasVisible == 1) {
|
|
chatActivityEnterView.showTopView(false, false);
|
|
topViewWasVisible = 0;
|
|
}
|
|
}
|
|
checkRaiseSensors();
|
|
}
|
|
|
|
public void showAlert(String name, String message) {
|
|
if (alertView == null || name == null || message == null) {
|
|
return;
|
|
}
|
|
|
|
if (alertView.getTag() != null) {
|
|
alertView.setTag(null);
|
|
if (alertViewAnimator != null) {
|
|
alertViewAnimator.cancel();
|
|
alertViewAnimator = null;
|
|
}
|
|
|
|
alertView.setVisibility(View.VISIBLE);
|
|
alertViewAnimator = new AnimatorSet();
|
|
alertViewAnimator.playTogether(ObjectAnimator.ofFloat(alertView, "translationY", 0));
|
|
alertViewAnimator.setDuration(200);
|
|
alertViewAnimator.addListener(new AnimatorListenerAdapter() {
|
|
@Override
|
|
public void onAnimationEnd(Animator animation) {
|
|
if (alertViewAnimator != null && alertViewAnimator.equals(animation)) {
|
|
alertViewAnimator = null;
|
|
}
|
|
}
|
|
|
|
@Override
|
|
public void onAnimationCancel(Animator animation) {
|
|
if (alertViewAnimator != null && alertViewAnimator.equals(animation)) {
|
|
alertViewAnimator = null;
|
|
}
|
|
}
|
|
});
|
|
alertViewAnimator.start();
|
|
}
|
|
alertNameTextView.setText(name);
|
|
alertTextView.setText(Emoji.replaceEmoji(message.replace('\n', ' '), alertTextView.getPaint().getFontMetricsInt(), AndroidUtilities.dp(14), false));
|
|
if (hideAlertViewRunnable != null) {
|
|
AndroidUtilities.cancelRunOnUIThread(hideAlertViewRunnable);
|
|
}
|
|
AndroidUtilities.runOnUIThread(hideAlertViewRunnable = new Runnable() {
|
|
@Override
|
|
public void run() {
|
|
if (hideAlertViewRunnable != this) {
|
|
return;
|
|
}
|
|
if (alertView.getTag() == null) {
|
|
alertView.setTag(1);
|
|
if (alertViewAnimator != null) {
|
|
alertViewAnimator.cancel();
|
|
alertViewAnimator = null;
|
|
}
|
|
alertViewAnimator = new AnimatorSet();
|
|
alertViewAnimator.playTogether(ObjectAnimator.ofFloat(alertView, "translationY", -AndroidUtilities.dp(50)));
|
|
alertViewAnimator.setDuration(200);
|
|
alertViewAnimator.addListener(new AnimatorListenerAdapter() {
|
|
@Override
|
|
public void onAnimationEnd(Animator animation) {
|
|
if (alertViewAnimator != null && alertViewAnimator.equals(animation)) {
|
|
alertView.setVisibility(View.GONE);
|
|
alertViewAnimator = null;
|
|
}
|
|
}
|
|
|
|
@Override
|
|
public void onAnimationCancel(Animator animation) {
|
|
if (alertViewAnimator != null && alertViewAnimator.equals(animation)) {
|
|
alertViewAnimator = null;
|
|
}
|
|
}
|
|
});
|
|
alertViewAnimator.start();
|
|
}
|
|
}
|
|
}, 3000);
|
|
}
|
|
|
|
private void hidePinnedMessageView(boolean animated) {
|
|
if (pinnedMessageView.getTag() == null) {
|
|
pinnedMessageView.setTag(1);
|
|
if (pinnedMessageViewAnimator != null) {
|
|
pinnedMessageViewAnimator.cancel();
|
|
pinnedMessageViewAnimator = null;
|
|
}
|
|
if (animated) {
|
|
pinnedMessageViewAnimator = new AnimatorSet();
|
|
pinnedMessageViewAnimator.playTogether(ObjectAnimator.ofFloat(pinnedMessageView, "translationY", -AndroidUtilities.dp(50)));
|
|
pinnedMessageViewAnimator.setDuration(200);
|
|
pinnedMessageViewAnimator.addListener(new AnimatorListenerAdapter() {
|
|
@Override
|
|
public void onAnimationEnd(Animator animation) {
|
|
if (pinnedMessageViewAnimator != null && pinnedMessageViewAnimator.equals(animation)) {
|
|
pinnedMessageView.setVisibility(View.GONE);
|
|
pinnedMessageViewAnimator = null;
|
|
}
|
|
}
|
|
|
|
@Override
|
|
public void onAnimationCancel(Animator animation) {
|
|
if (pinnedMessageViewAnimator != null && pinnedMessageViewAnimator.equals(animation)) {
|
|
pinnedMessageViewAnimator = null;
|
|
}
|
|
}
|
|
});
|
|
pinnedMessageViewAnimator.start();
|
|
} else {
|
|
pinnedMessageView.setTranslationY(-AndroidUtilities.dp(50));
|
|
pinnedMessageView.setVisibility(View.GONE);
|
|
}
|
|
}
|
|
}
|
|
|
|
private void updatePinnedMessageView(boolean animated) {
|
|
if (pinnedMessageView == null) {
|
|
return;
|
|
}
|
|
if (info != null) {
|
|
if (pinnedMessageObject != null && info.pinned_msg_id != pinnedMessageObject.getId()) {
|
|
pinnedMessageObject = null;
|
|
}
|
|
if (info.pinned_msg_id != 0 && pinnedMessageObject == null) {
|
|
pinnedMessageObject = messagesDict[0].get(info.pinned_msg_id);
|
|
}
|
|
}
|
|
SharedPreferences preferences = ApplicationLoader.applicationContext.getSharedPreferences("Notifications", Activity.MODE_PRIVATE);
|
|
if (info == null || info.pinned_msg_id == 0 || info.pinned_msg_id == preferences.getInt("pin_" + dialog_id, 0) || actionBar != null && (actionBar.isActionModeShowed() || actionBar.isSearchFieldVisible())) {
|
|
hidePinnedMessageView(animated);
|
|
} else {
|
|
if (pinnedMessageObject != null) {
|
|
if (pinnedMessageView.getTag() != null) {
|
|
pinnedMessageView.setTag(null);
|
|
if (pinnedMessageViewAnimator != null) {
|
|
pinnedMessageViewAnimator.cancel();
|
|
pinnedMessageViewAnimator = null;
|
|
}
|
|
if (animated) {
|
|
pinnedMessageView.setVisibility(View.VISIBLE);
|
|
pinnedMessageViewAnimator = new AnimatorSet();
|
|
pinnedMessageViewAnimator.playTogether(ObjectAnimator.ofFloat(pinnedMessageView, "translationY", 0));
|
|
pinnedMessageViewAnimator.setDuration(200);
|
|
pinnedMessageViewAnimator.addListener(new AnimatorListenerAdapter() {
|
|
@Override
|
|
public void onAnimationEnd(Animator animation) {
|
|
if (pinnedMessageViewAnimator != null && pinnedMessageViewAnimator.equals(animation)) {
|
|
pinnedMessageViewAnimator = null;
|
|
}
|
|
}
|
|
|
|
@Override
|
|
public void onAnimationCancel(Animator animation) {
|
|
if (pinnedMessageViewAnimator != null && pinnedMessageViewAnimator.equals(animation)) {
|
|
pinnedMessageViewAnimator = null;
|
|
}
|
|
}
|
|
});
|
|
pinnedMessageViewAnimator.start();
|
|
} else {
|
|
pinnedMessageView.setTranslationY(0);
|
|
pinnedMessageView.setVisibility(View.VISIBLE);
|
|
}
|
|
}
|
|
FrameLayout.LayoutParams layoutParams1 = (FrameLayout.LayoutParams) pinnedMessageNameTextView.getLayoutParams();
|
|
FrameLayout.LayoutParams layoutParams2 = (FrameLayout.LayoutParams) pinnedMessageTextView.getLayoutParams();
|
|
TLRPC.PhotoSize photoSize = FileLoader.getClosestPhotoSizeWithSize(pinnedMessageObject.photoThumbs2, AndroidUtilities.dp(50));
|
|
if (photoSize == null) {
|
|
photoSize = FileLoader.getClosestPhotoSizeWithSize(pinnedMessageObject.photoThumbs, AndroidUtilities.dp(50));
|
|
}
|
|
if (photoSize == null || photoSize instanceof TLRPC.TL_photoSizeEmpty || photoSize.location instanceof TLRPC.TL_fileLocationUnavailable || pinnedMessageObject.type == 13) {
|
|
pinnedMessageImageView.setImageBitmap(null);
|
|
pinnedImageLocation = null;
|
|
pinnedMessageImageView.setVisibility(View.INVISIBLE);
|
|
layoutParams1.leftMargin = layoutParams2.leftMargin = AndroidUtilities.dp(18);
|
|
} else {
|
|
if (pinnedMessageObject.isRoundVideo()) {
|
|
pinnedMessageImageView.setRoundRadius(AndroidUtilities.dp(16));
|
|
} else {
|
|
pinnedMessageImageView.setRoundRadius(0);
|
|
}
|
|
pinnedImageLocation = photoSize.location;
|
|
pinnedMessageImageView.setImage(pinnedImageLocation, "50_50", (Drawable) null);
|
|
pinnedMessageImageView.setVisibility(View.VISIBLE);
|
|
layoutParams1.leftMargin = layoutParams2.leftMargin = AndroidUtilities.dp(55);
|
|
}
|
|
pinnedMessageNameTextView.setLayoutParams(layoutParams1);
|
|
pinnedMessageTextView.setLayoutParams(layoutParams2);
|
|
|
|
pinnedMessageNameTextView.setText(LocaleController.getString("PinnedMessage", R.string.PinnedMessage));
|
|
if (pinnedMessageObject.type == 14) {
|
|
pinnedMessageTextView.setText(String.format("%s - %s", pinnedMessageObject.getMusicAuthor(), pinnedMessageObject.getMusicTitle()));
|
|
} else if (pinnedMessageObject.messageOwner.media instanceof TLRPC.TL_messageMediaGame) {
|
|
pinnedMessageTextView.setText(Emoji.replaceEmoji(pinnedMessageObject.messageOwner.media.game.title, pinnedMessageTextView.getPaint().getFontMetricsInt(), AndroidUtilities.dp(14), false));
|
|
} else if (pinnedMessageObject.messageText != null) {
|
|
String mess = pinnedMessageObject.messageText.toString();
|
|
if (mess.length() > 150) {
|
|
mess = mess.substring(0, 150);
|
|
}
|
|
mess = mess.replace('\n', ' ');
|
|
pinnedMessageTextView.setText(Emoji.replaceEmoji(mess, pinnedMessageTextView.getPaint().getFontMetricsInt(), AndroidUtilities.dp(14), false));
|
|
}
|
|
} else {
|
|
pinnedImageLocation = null;
|
|
hidePinnedMessageView(animated);
|
|
if (loadingPinnedMessage != info.pinned_msg_id) {
|
|
loadingPinnedMessage = info.pinned_msg_id;
|
|
MessagesQuery.loadPinnedMessage(currentChat.id, info.pinned_msg_id, true);
|
|
}
|
|
}
|
|
}
|
|
checkListViewPaddings();
|
|
}
|
|
|
|
private void updateSpamView() {
|
|
if (reportSpamView == null) {
|
|
FileLog.d("no spam view found");
|
|
return;
|
|
}
|
|
SharedPreferences preferences = ApplicationLoader.applicationContext.getSharedPreferences("Notifications", Activity.MODE_PRIVATE);
|
|
boolean show;
|
|
if (currentEncryptedChat != null) {
|
|
show = !(currentEncryptedChat.admin_id == UserConfig.getClientUserId() || ContactsController.getInstance().isLoadingContacts()) && ContactsController.getInstance().contactsDict.get(currentUser.id) == null;
|
|
if (show && preferences.getInt("spam3_" + dialog_id, 0) == 1) {
|
|
show = false;
|
|
}
|
|
} else {
|
|
show = preferences.getInt("spam3_" + dialog_id, 0) == 2;
|
|
}
|
|
if (!show) {
|
|
if (reportSpamView.getTag() == null) {
|
|
FileLog.d("hide spam button");
|
|
reportSpamView.setTag(1);
|
|
|
|
if (reportSpamViewAnimator != null) {
|
|
reportSpamViewAnimator.cancel();
|
|
}
|
|
reportSpamViewAnimator = new AnimatorSet();
|
|
reportSpamViewAnimator.playTogether(ObjectAnimator.ofFloat(reportSpamView, "translationY", -AndroidUtilities.dp(50)));
|
|
reportSpamViewAnimator.setDuration(200);
|
|
reportSpamViewAnimator.addListener(new AnimatorListenerAdapter() {
|
|
@Override
|
|
public void onAnimationEnd(Animator animation) {
|
|
if (reportSpamViewAnimator != null && reportSpamViewAnimator.equals(animation)) {
|
|
reportSpamView.setVisibility(View.GONE);
|
|
reportSpamViewAnimator = null;
|
|
}
|
|
}
|
|
|
|
@Override
|
|
public void onAnimationCancel(Animator animation) {
|
|
if (reportSpamViewAnimator != null && reportSpamViewAnimator.equals(animation)) {
|
|
reportSpamViewAnimator = null;
|
|
}
|
|
}
|
|
});
|
|
reportSpamViewAnimator.start();
|
|
}
|
|
} else {
|
|
if (reportSpamView.getTag() != null) {
|
|
FileLog.d("show spam button");
|
|
reportSpamView.setTag(null);
|
|
reportSpamView.setVisibility(View.VISIBLE);
|
|
if (reportSpamViewAnimator != null) {
|
|
reportSpamViewAnimator.cancel();
|
|
}
|
|
reportSpamViewAnimator = new AnimatorSet();
|
|
reportSpamViewAnimator.playTogether(ObjectAnimator.ofFloat(reportSpamView, "translationY", 0));
|
|
reportSpamViewAnimator.setDuration(200);
|
|
reportSpamViewAnimator.addListener(new AnimatorListenerAdapter() {
|
|
@Override
|
|
public void onAnimationEnd(Animator animation) {
|
|
if (reportSpamViewAnimator != null && reportSpamViewAnimator.equals(animation)) {
|
|
reportSpamViewAnimator = null;
|
|
}
|
|
}
|
|
|
|
@Override
|
|
public void onAnimationCancel(Animator animation) {
|
|
if (reportSpamViewAnimator != null && reportSpamViewAnimator.equals(animation)) {
|
|
reportSpamViewAnimator = null;
|
|
}
|
|
}
|
|
});
|
|
reportSpamViewAnimator.start();
|
|
}
|
|
}
|
|
checkListViewPaddings();
|
|
}
|
|
|
|
private void updateContactStatus() {
|
|
if (addContactItem == null) {
|
|
return;
|
|
}
|
|
if (currentUser == null) {
|
|
addContactItem.setVisibility(View.GONE);
|
|
} else {
|
|
TLRPC.User user = MessagesController.getInstance().getUser(currentUser.id);
|
|
if (user != null) {
|
|
currentUser = user;
|
|
}
|
|
if (currentEncryptedChat != null && !(currentEncryptedChat instanceof TLRPC.TL_encryptedChat)
|
|
|| MessagesController.isSupportId(currentUser.id)
|
|
|| UserObject.isDeleted(currentUser)
|
|
|| ContactsController.getInstance().isLoadingContacts()
|
|
|| (!TextUtils.isEmpty(currentUser.phone) && ContactsController.getInstance().contactsDict.get(currentUser.id) != null && (ContactsController.getInstance().contactsDict.size() != 0 || !ContactsController.getInstance().isLoadingContacts()))) {
|
|
addContactItem.setVisibility(View.GONE);
|
|
} else {
|
|
addContactItem.setVisibility(View.VISIBLE);
|
|
if (!TextUtils.isEmpty(currentUser.phone)) {
|
|
addContactItem.setText(LocaleController.getString("AddToContacts", R.string.AddToContacts));
|
|
reportSpamButton.setPadding(AndroidUtilities.dp(4), 0, AndroidUtilities.dp(50), 0);
|
|
addToContactsButton.setVisibility(View.VISIBLE);
|
|
reportSpamContainer.setLayoutParams(LayoutHelper.createLinear(LayoutHelper.MATCH_PARENT, LayoutHelper.MATCH_PARENT, 0.5f, Gravity.LEFT | Gravity.TOP, 0, 0, 0, AndroidUtilities.dp(1)));
|
|
} else {
|
|
addContactItem.setText(LocaleController.getString("ShareMyContactInfo", R.string.ShareMyContactInfo));
|
|
addToContactsButton.setVisibility(View.GONE);
|
|
reportSpamButton.setPadding(AndroidUtilities.dp(50), 0, AndroidUtilities.dp(50), 0);
|
|
reportSpamContainer.setLayoutParams(LayoutHelper.createLinear(LayoutHelper.MATCH_PARENT, LayoutHelper.MATCH_PARENT, 1.0f, Gravity.LEFT | Gravity.TOP, 0, 0, 0, AndroidUtilities.dp(1)));
|
|
}
|
|
}
|
|
}
|
|
checkListViewPaddings();
|
|
}
|
|
|
|
private void checkListViewPaddings() {
|
|
AndroidUtilities.runOnUIThread(new Runnable() {
|
|
@Override
|
|
public void run() {
|
|
try {
|
|
int firstVisPos = chatLayoutManager.findFirstVisibleItemPosition();
|
|
int top = 0;
|
|
if (firstVisPos != RecyclerView.NO_POSITION) {
|
|
View firstVisView = chatLayoutManager.findViewByPosition(firstVisPos);
|
|
top = ((firstVisView == null) ? 0 : chatListView.getMeasuredHeight() - firstVisView.getBottom() - chatListView.getPaddingBottom());
|
|
}
|
|
if (chatListView.getPaddingTop() != AndroidUtilities.dp(52) && (pinnedMessageView != null && pinnedMessageView.getTag() == null || reportSpamView != null && reportSpamView.getTag() == null)) {
|
|
chatListView.setPadding(0, AndroidUtilities.dp(52), 0, AndroidUtilities.dp(3));
|
|
FrameLayout.LayoutParams layoutParams = (FrameLayout.LayoutParams) floatingDateView.getLayoutParams();
|
|
layoutParams.topMargin = AndroidUtilities.dp(52);
|
|
floatingDateView.setLayoutParams(layoutParams);
|
|
chatListView.setTopGlowOffset(AndroidUtilities.dp(48));
|
|
} else if (chatListView.getPaddingTop() != AndroidUtilities.dp(4) && (pinnedMessageView == null || pinnedMessageView.getTag() != null) && (reportSpamView == null || reportSpamView.getTag() != null)) {
|
|
chatListView.setPadding(0, AndroidUtilities.dp(4), 0, AndroidUtilities.dp(3));
|
|
FrameLayout.LayoutParams layoutParams = (FrameLayout.LayoutParams) floatingDateView.getLayoutParams();
|
|
layoutParams.topMargin = AndroidUtilities.dp(4);
|
|
floatingDateView.setLayoutParams(layoutParams);
|
|
chatListView.setTopGlowOffset(0);
|
|
} else {
|
|
firstVisPos = RecyclerView.NO_POSITION;
|
|
}
|
|
if (firstVisPos != RecyclerView.NO_POSITION) {
|
|
chatLayoutManager.scrollToPositionWithOffset(firstVisPos, top);
|
|
}
|
|
} catch (Exception e) {
|
|
FileLog.e(e);
|
|
}
|
|
}
|
|
});
|
|
}
|
|
|
|
private void checkRaiseSensors() {
|
|
if (ChatObject.isChannel(currentChat) && currentChat.banned_rights != null && currentChat.banned_rights.send_media) {
|
|
MediaController.getInstance().setAllowStartRecord(false);
|
|
} else if (!ApplicationLoader.mainInterfacePaused && (bottomOverlayChat == null || bottomOverlayChat.getVisibility() != View.VISIBLE) && (bottomOverlay == null || bottomOverlay.getVisibility() != View.VISIBLE) && (searchContainer == null || searchContainer.getVisibility() != View.VISIBLE)) {
|
|
MediaController.getInstance().setAllowStartRecord(true);
|
|
} else {
|
|
MediaController.getInstance().setAllowStartRecord(false);
|
|
}
|
|
}
|
|
|
|
@Override
|
|
public void dismissCurrentDialig() {
|
|
if (chatAttachAlert != null && visibleDialog == chatAttachAlert) {
|
|
chatAttachAlert.closeCamera(false);
|
|
chatAttachAlert.dismissInternal();
|
|
chatAttachAlert.hideCamera(true);
|
|
return;
|
|
}
|
|
super.dismissCurrentDialig();
|
|
}
|
|
|
|
@Override
|
|
public void onResume() {
|
|
super.onResume();
|
|
|
|
AndroidUtilities.requestAdjustResize(getParentActivity(), classGuid);
|
|
MediaController.getInstance().startRaiseToEarSensors(this);
|
|
checkRaiseSensors();
|
|
if (chatAttachAlert != null) {
|
|
chatAttachAlert.onResume();
|
|
}
|
|
|
|
checkActionBarMenu();
|
|
if (replyImageLocation != null && replyImageView != null) {
|
|
replyImageView.setImage(replyImageLocation, "50_50", (Drawable) null);
|
|
}
|
|
if (pinnedImageLocation != null && pinnedMessageImageView != null) {
|
|
pinnedMessageImageView.setImage(pinnedImageLocation, "50_50", (Drawable) null);
|
|
}
|
|
|
|
NotificationsController.getInstance().setOpenedDialogId(dialog_id);
|
|
if (scrollToTopOnResume) {
|
|
if (scrollToTopUnReadOnResume && scrollToMessage != null) {
|
|
if (chatListView != null) {
|
|
int yOffset;
|
|
boolean bottom = true;
|
|
if (scrollToMessagePosition == -9000) {
|
|
yOffset = getScrollOffsetForMessage(scrollToMessage);
|
|
bottom = false;
|
|
} else if (scrollToMessagePosition == -10000) {
|
|
yOffset = -chatListView.getPaddingTop() - AndroidUtilities.dp(7);
|
|
bottom = false;
|
|
} else {
|
|
yOffset = scrollToMessagePosition;
|
|
}
|
|
chatLayoutManager.scrollToPositionWithOffset(chatAdapter.messagesStartRow + messages.indexOf(scrollToMessage), yOffset, bottom);
|
|
}
|
|
} else {
|
|
moveScrollToLastMessage();
|
|
}
|
|
scrollToTopUnReadOnResume = false;
|
|
scrollToTopOnResume = false;
|
|
scrollToMessage = null;
|
|
}
|
|
paused = false;
|
|
pausedOnLastMessage = false;
|
|
AndroidUtilities.runOnUIThread(readRunnable, 500);
|
|
checkScrollForLoad(false);
|
|
if (wasPaused) {
|
|
wasPaused = false;
|
|
if (chatAdapter != null) {
|
|
chatAdapter.notifyDataSetChanged();
|
|
}
|
|
}
|
|
|
|
fixLayout();
|
|
applyDraftMaybe(false);
|
|
if (bottomOverlayChat != null && bottomOverlayChat.getVisibility() != View.VISIBLE) {
|
|
chatActivityEnterView.setFieldFocused(true);
|
|
}
|
|
if (chatActivityEnterView != null) {
|
|
chatActivityEnterView.onResume();
|
|
}
|
|
if (currentUser != null) {
|
|
chatEnterTime = System.currentTimeMillis();
|
|
chatLeaveTime = 0;
|
|
}
|
|
|
|
if (startVideoEdit != null) {
|
|
AndroidUtilities.runOnUIThread(new Runnable() {
|
|
@Override
|
|
public void run() {
|
|
openVideoEditor(startVideoEdit, null);
|
|
startVideoEdit = null;
|
|
}
|
|
});
|
|
}
|
|
|
|
if (chatListView != null && (chatActivityEnterView == null || !chatActivityEnterView.isEditingMessage())) {
|
|
chatListView.setOnItemLongClickListener(onItemLongClickListener);
|
|
chatListView.setOnItemClickListener(onItemClickListener);
|
|
chatListView.setLongClickable(true);
|
|
}
|
|
checkBotCommands();
|
|
}
|
|
|
|
@Override
|
|
public void onPause() {
|
|
super.onPause();
|
|
AndroidUtilities.cancelRunOnUIThread(readRunnable);
|
|
MediaController.getInstance().stopRaiseToEarSensors(this);
|
|
paused = true;
|
|
wasPaused = true;
|
|
NotificationsController.getInstance().setOpenedDialogId(0);
|
|
CharSequence draftMessage = null;
|
|
MessageObject replyMessage = null;
|
|
boolean searchWebpage = true;
|
|
if (!ignoreAttachOnPause && chatActivityEnterView != null && bottomOverlayChat.getVisibility() != View.VISIBLE) {
|
|
chatActivityEnterView.onPause();
|
|
replyMessage = replyingMessageObject;
|
|
if (!chatActivityEnterView.isEditingMessage()) {
|
|
CharSequence text = AndroidUtilities.getTrimmedString(chatActivityEnterView.getFieldText());
|
|
if (!TextUtils.isEmpty(text) && !TextUtils.equals(text, "@gif")) {
|
|
draftMessage = text;
|
|
}
|
|
}
|
|
searchWebpage = chatActivityEnterView.isMessageWebPageSearchEnabled();
|
|
chatActivityEnterView.setFieldFocused(false);
|
|
}
|
|
if (chatAttachAlert != null) {
|
|
if (!ignoreAttachOnPause){
|
|
chatAttachAlert.onPause();
|
|
} else {
|
|
ignoreAttachOnPause = false;
|
|
}
|
|
}
|
|
CharSequence[] message = new CharSequence[] {draftMessage};
|
|
ArrayList<TLRPC.MessageEntity> entities = MessagesQuery.getEntities(message);
|
|
DraftQuery.saveDraft(dialog_id, message[0], entities, replyMessage != null ? replyMessage.messageOwner : null, !searchWebpage);
|
|
|
|
MessagesController.getInstance().cancelTyping(0, dialog_id);
|
|
|
|
if (!pausedOnLastMessage) {
|
|
SharedPreferences.Editor editor = ApplicationLoader.applicationContext.getSharedPreferences("Notifications", Activity.MODE_PRIVATE).edit();
|
|
int messageId = 0;
|
|
int offset = 0;
|
|
if (chatLayoutManager != null) {
|
|
int position = chatLayoutManager.findFirstVisibleItemPosition();
|
|
if (position != 0) {
|
|
RecyclerListView.Holder holder = (RecyclerListView.Holder) chatListView.findViewHolderForAdapterPosition(position);
|
|
if (holder != null) {
|
|
if (holder.itemView instanceof ChatMessageCell) {
|
|
messageId = ((ChatMessageCell) holder.itemView).getMessageObject().getId();
|
|
} else if (holder.itemView instanceof ChatActionCell) {
|
|
messageId = ((ChatActionCell) holder.itemView).getMessageObject().getId();
|
|
}
|
|
if (messageId != 0) {
|
|
offset = holder.itemView.getBottom() - chatListView.getMeasuredHeight();
|
|
FileLog.d("save offset = " + offset + " for mid " + messageId);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
if (messageId != 0) {
|
|
editor.putInt("diditem" + dialog_id, messageId);
|
|
editor.putInt("diditemo" + dialog_id, offset);
|
|
} else {
|
|
pausedOnLastMessage = true;
|
|
editor.remove("diditem" + dialog_id);
|
|
editor.remove("diditemo" + dialog_id);
|
|
}
|
|
editor.commit();
|
|
}
|
|
|
|
if (currentUser != null) {
|
|
chatLeaveTime = System.currentTimeMillis();
|
|
updateInformationForScreenshotDetector();
|
|
}
|
|
}
|
|
|
|
private void applyDraftMaybe(boolean canClear) {
|
|
if (chatActivityEnterView == null) {
|
|
return;
|
|
}
|
|
TLRPC.DraftMessage draftMessage = DraftQuery.getDraft(dialog_id);
|
|
TLRPC.Message draftReplyMessage = draftMessage != null && draftMessage.reply_to_msg_id != 0 ? DraftQuery.getDraftMessage(dialog_id) : null;
|
|
if (chatActivityEnterView.getFieldText() == null) {
|
|
if (draftMessage != null) {
|
|
chatActivityEnterView.setWebPage(null, !draftMessage.no_webpage);
|
|
CharSequence message;
|
|
if (!draftMessage.entities.isEmpty()) {
|
|
SpannableStringBuilder stringBuilder = SpannableStringBuilder.valueOf(draftMessage.message);
|
|
MessagesQuery.sortEntities(draftMessage.entities);
|
|
int addToOffset = 0;
|
|
for (int a = 0; a < draftMessage.entities.size(); a++) {
|
|
TLRPC.MessageEntity entity = draftMessage.entities.get(a);
|
|
if (entity instanceof TLRPC.TL_inputMessageEntityMentionName || entity instanceof TLRPC.TL_messageEntityMentionName) {
|
|
int user_id;
|
|
if (entity instanceof TLRPC.TL_inputMessageEntityMentionName) {
|
|
user_id = ((TLRPC.TL_inputMessageEntityMentionName) entity).user_id.user_id;
|
|
} else {
|
|
user_id = ((TLRPC.TL_messageEntityMentionName) entity).user_id;
|
|
}
|
|
if (entity.offset + addToOffset + entity.length < stringBuilder.length() && stringBuilder.charAt(entity.offset + addToOffset + entity.length) == ' ') {
|
|
entity.length++;
|
|
}
|
|
stringBuilder.setSpan(new URLSpanUserMention("" + user_id, true), entity.offset + addToOffset, entity.offset + addToOffset + entity.length, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
|
|
} else if (entity instanceof TLRPC.TL_messageEntityCode) {
|
|
stringBuilder.insert(entity.offset + entity.length + addToOffset, "`");
|
|
stringBuilder.insert(entity.offset + addToOffset, "`");
|
|
addToOffset += 2;
|
|
} else if (entity instanceof TLRPC.TL_messageEntityPre) {
|
|
stringBuilder.insert(entity.offset + entity.length + addToOffset, "```");
|
|
stringBuilder.insert(entity.offset + addToOffset, "```");
|
|
addToOffset += 6;
|
|
} else if (entity instanceof TLRPC.TL_messageEntityBold) {
|
|
stringBuilder.setSpan(new TypefaceSpan(AndroidUtilities.getTypeface("fonts/rmedium.ttf")), entity.offset + addToOffset, entity.offset + entity.length + addToOffset, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
|
|
} else if (entity instanceof TLRPC.TL_messageEntityItalic) {
|
|
stringBuilder.setSpan(new TypefaceSpan(AndroidUtilities.getTypeface("fonts/ritalic.ttf")), entity.offset + addToOffset, entity.offset + entity.length + addToOffset, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
|
|
}
|
|
}
|
|
message = stringBuilder;
|
|
} else {
|
|
message = draftMessage.message;
|
|
}
|
|
chatActivityEnterView.setFieldText(message);
|
|
if (getArguments().getBoolean("hasUrl", false)) {
|
|
chatActivityEnterView.setSelection(draftMessage.message.indexOf('\n') + 1);
|
|
AndroidUtilities.runOnUIThread(new Runnable() {
|
|
@Override
|
|
public void run() {
|
|
if (chatActivityEnterView != null) {
|
|
chatActivityEnterView.setFieldFocused(true);
|
|
chatActivityEnterView.openKeyboard();
|
|
}
|
|
}
|
|
}, 700);
|
|
}
|
|
}
|
|
} else if (canClear && draftMessage == null) {
|
|
chatActivityEnterView.setFieldText("");
|
|
showReplyPanel(false, null, null, null, false);
|
|
}
|
|
if (replyingMessageObject == null && draftReplyMessage != null) {
|
|
replyingMessageObject = new MessageObject(draftReplyMessage, MessagesController.getInstance().getUsers(), false);
|
|
showReplyPanel(true, replyingMessageObject, null, null, false);
|
|
}
|
|
}
|
|
|
|
private void updateInformationForScreenshotDetector() {
|
|
if (currentUser == null) {
|
|
return;
|
|
}
|
|
ArrayList<Long> visibleMessages;
|
|
int messageId = 0;
|
|
if (currentEncryptedChat != null) {
|
|
visibleMessages = new ArrayList<>();
|
|
if (chatListView != null) {
|
|
int count = chatListView.getChildCount();
|
|
for (int a = 0; a < count; a++) {
|
|
View view = chatListView.getChildAt(a);
|
|
MessageObject object = null;
|
|
if (view instanceof ChatMessageCell) {
|
|
ChatMessageCell cell = (ChatMessageCell) view;
|
|
object = cell.getMessageObject();
|
|
}
|
|
if (object != null && object.getId() < 0 && object.messageOwner.random_id != 0) {
|
|
visibleMessages.add(object.messageOwner.random_id);
|
|
}
|
|
}
|
|
}
|
|
MediaController.getInstance().setLastVisibleMessageIds(chatEnterTime, chatLeaveTime, currentUser, currentEncryptedChat, visibleMessages, messageId);
|
|
} else {
|
|
SecretMediaViewer viewer = SecretMediaViewer.getInstance();
|
|
MessageObject messageObject = viewer.getCurrentMessageObject();
|
|
if (messageObject != null && !messageObject.isOut()) {
|
|
MediaController.getInstance().setLastVisibleMessageIds(viewer.getOpenTime(), viewer.getCloseTime(), currentUser, null, null, messageObject.getId());
|
|
}
|
|
}
|
|
}
|
|
|
|
private boolean fixLayoutInternal() {
|
|
if (!AndroidUtilities.isTablet() && ApplicationLoader.applicationContext.getResources().getConfiguration().orientation == Configuration.ORIENTATION_LANDSCAPE) {
|
|
selectedMessagesCountTextView.setTextSize(18);
|
|
} else {
|
|
selectedMessagesCountTextView.setTextSize(20);
|
|
}
|
|
|
|
HashMap<Long, MessageObject.GroupedMessages> newGroups = null;
|
|
int count = chatListView.getChildCount();
|
|
for (int a = 0; a < count; a++) {
|
|
View child = chatListView.getChildAt(a);
|
|
if (child instanceof ChatMessageCell) {
|
|
MessageObject.GroupedMessages groupedMessages = ((ChatMessageCell) child).getCurrentMessagesGroup();
|
|
if (groupedMessages != null && groupedMessages.hasSibling) {
|
|
if (newGroups == null) {
|
|
newGroups = new HashMap<>();
|
|
}
|
|
if (!newGroups.containsKey(groupedMessages.groupId)) {
|
|
newGroups.put(groupedMessages.groupId, groupedMessages);
|
|
|
|
MessageObject messageObject = groupedMessages.messages.get(groupedMessages.messages.size() - 1);
|
|
int idx = messages.indexOf(messageObject);
|
|
if (idx >= 0) {
|
|
chatAdapter.notifyItemRangeChanged(idx + chatAdapter.messagesStartRow, groupedMessages.messages.size());
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
if (AndroidUtilities.isTablet()) {
|
|
if (AndroidUtilities.isSmallTablet() && ApplicationLoader.applicationContext.getResources().getConfiguration().orientation == Configuration.ORIENTATION_PORTRAIT) {
|
|
actionBar.setBackButtonDrawable(new BackDrawable(false));
|
|
if (fragmentContextView != null && fragmentContextView.getParent() == null) {
|
|
((ViewGroup) fragmentView).addView(fragmentContextView, LayoutHelper.createFrame(LayoutHelper.MATCH_PARENT, 39, Gravity.TOP | Gravity.LEFT, 0, -36, 0, 0));
|
|
}
|
|
} else {
|
|
actionBar.setBackButtonDrawable(new BackDrawable(parentLayout == null || parentLayout.fragmentsStack.isEmpty() || parentLayout.fragmentsStack.get(0) == ChatActivity.this || parentLayout.fragmentsStack.size() == 1));
|
|
if (fragmentContextView != null && fragmentContextView.getParent() != null) {
|
|
fragmentView.setPadding(0, 0, 0, 0);
|
|
((ViewGroup) fragmentView).removeView(fragmentContextView);
|
|
}
|
|
}
|
|
return false;
|
|
}
|
|
return true;
|
|
}
|
|
|
|
private void fixLayout() {
|
|
if (avatarContainer != null) {
|
|
avatarContainer.getViewTreeObserver().addOnPreDrawListener(new ViewTreeObserver.OnPreDrawListener() {
|
|
@Override
|
|
public boolean onPreDraw() {
|
|
if (avatarContainer != null) {
|
|
avatarContainer.getViewTreeObserver().removeOnPreDrawListener(this);
|
|
}
|
|
return fixLayoutInternal();
|
|
}
|
|
});
|
|
}
|
|
}
|
|
|
|
@Override
|
|
public void onConfigurationChanged(android.content.res.Configuration newConfig) {
|
|
fixLayout();
|
|
if (visibleDialog instanceof DatePickerDialog) {
|
|
visibleDialog.dismiss();
|
|
}
|
|
}
|
|
|
|
private void createDeleteMessagesAlert(final MessageObject finalSelectedObject, final MessageObject.GroupedMessages selectedGroup) {
|
|
createDeleteMessagesAlert(finalSelectedObject, selectedGroup, 1);
|
|
}
|
|
|
|
private void createDeleteMessagesAlert(final MessageObject finalSelectedObject, final MessageObject.GroupedMessages finalSelectedGroup, int loadParticipant) {
|
|
if (getParentActivity() == null) {
|
|
return;
|
|
}
|
|
AlertDialog.Builder builder = new AlertDialog.Builder(getParentActivity());
|
|
int count;
|
|
if (finalSelectedGroup != null) {
|
|
count = finalSelectedGroup.messages.size();
|
|
} else if (finalSelectedObject != null) {
|
|
count = 1;
|
|
} else {
|
|
count = selectedMessagesIds[0].size() + selectedMessagesIds[1].size();
|
|
}
|
|
builder.setMessage(LocaleController.formatString("AreYouSureDeleteMessages", R.string.AreYouSureDeleteMessages, LocaleController.formatPluralString("messages", count)));
|
|
builder.setTitle(LocaleController.getString("Message", R.string.Message));
|
|
|
|
final boolean[] checks = new boolean[3];
|
|
final boolean[] deleteForAll = new boolean[1];
|
|
TLRPC.User user = null;
|
|
if (currentChat != null && currentChat.megagroup) {
|
|
boolean hasOutgoing = false;
|
|
boolean canBan = ChatObject.canBlockUsers(currentChat);
|
|
int currentDate = ConnectionsManager.getInstance().getCurrentTime();
|
|
if (finalSelectedObject != null) {
|
|
if (finalSelectedObject.messageOwner.action == null || finalSelectedObject.messageOwner.action instanceof TLRPC.TL_messageActionEmpty || finalSelectedObject.messageOwner.action instanceof TLRPC.TL_messageActionChatDeleteUser) {
|
|
user = MessagesController.getInstance().getUser(finalSelectedObject.messageOwner.from_id);
|
|
}
|
|
hasOutgoing = !finalSelectedObject.isSendError() && finalSelectedObject.getDialogId() == mergeDialogId && (finalSelectedObject.messageOwner.action == null || finalSelectedObject.messageOwner.action instanceof TLRPC.TL_messageActionEmpty) && finalSelectedObject.isOut() && (currentDate - finalSelectedObject.messageOwner.date) <= 2 * 24 * 60 * 60;
|
|
} else {
|
|
int from_id = -1;
|
|
for (int a = 1; a >= 0; a--) {
|
|
int channelId = 0;
|
|
for (HashMap.Entry<Integer, MessageObject> entry : selectedMessagesIds[a].entrySet()) {
|
|
MessageObject msg = entry.getValue();
|
|
if (from_id == -1) {
|
|
from_id = msg.messageOwner.from_id;
|
|
}
|
|
if (from_id < 0 || from_id != msg.messageOwner.from_id) {
|
|
from_id = -2;
|
|
break;
|
|
}
|
|
}
|
|
if (from_id == -2) {
|
|
break;
|
|
}
|
|
}
|
|
boolean exit = false;
|
|
for (int a = 1; a >= 0; a--) {
|
|
for (HashMap.Entry<Integer, MessageObject> entry : selectedMessagesIds[a].entrySet()) {
|
|
MessageObject msg = entry.getValue();
|
|
if (a == 1) {
|
|
if (msg.isOut() && msg.messageOwner.action == null) {
|
|
if ((currentDate - msg.messageOwner.date) <= 2 * 24 * 60 * 60) {
|
|
hasOutgoing = true;
|
|
}
|
|
} else {
|
|
hasOutgoing = false;
|
|
exit = true;
|
|
break;
|
|
}
|
|
} else if (a == 0) {
|
|
if (!msg.isOut()) {
|
|
hasOutgoing = false;
|
|
exit = true;
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
if (exit) {
|
|
break;
|
|
}
|
|
}
|
|
if (from_id != -1) {
|
|
user = MessagesController.getInstance().getUser(from_id);
|
|
}
|
|
}
|
|
if (user != null && user.id != UserConfig.getClientUserId() && loadParticipant != 2) {
|
|
if (loadParticipant == 1 && !currentChat.creator) {
|
|
final AlertDialog progressDialog[] = new AlertDialog[] {new AlertDialog(getParentActivity(), 1)};
|
|
|
|
TLRPC.TL_channels_getParticipant req = new TLRPC.TL_channels_getParticipant();
|
|
req.channel = MessagesController.getInputChannel(currentChat);
|
|
req.user_id = MessagesController.getInputUser(user);
|
|
int requestId = ConnectionsManager.getInstance().sendRequest(req, new RequestDelegate() {
|
|
@Override
|
|
public void run(final TLObject response, TLRPC.TL_error error) {
|
|
AndroidUtilities.runOnUIThread(new Runnable() {
|
|
@Override
|
|
public void run() {
|
|
try {
|
|
progressDialog[0].dismiss();
|
|
} catch (Throwable ignore) {
|
|
|
|
}
|
|
progressDialog[0] = null;
|
|
int loadType = 2;
|
|
if (response != null) {
|
|
TLRPC.TL_channels_channelParticipant participant = (TLRPC.TL_channels_channelParticipant) response;
|
|
if (!(participant.participant instanceof TLRPC.TL_channelParticipantAdmin || participant.participant instanceof TLRPC.TL_channelParticipantCreator)) {
|
|
loadType = 0;
|
|
}
|
|
}
|
|
createDeleteMessagesAlert(finalSelectedObject, finalSelectedGroup, loadType);
|
|
}
|
|
});
|
|
}
|
|
});
|
|
if (requestId != 0) {
|
|
final int reqId = requestId;
|
|
AndroidUtilities.runOnUIThread(new Runnable() {
|
|
@Override
|
|
public void run() {
|
|
if (progressDialog[0] == null) {
|
|
return;
|
|
}
|
|
progressDialog[0].setMessage(LocaleController.getString("Loading", R.string.Loading));
|
|
progressDialog[0].setCanceledOnTouchOutside(false);
|
|
progressDialog[0].setCancelable(false);
|
|
progressDialog[0].setButton(DialogInterface.BUTTON_NEGATIVE, LocaleController.getString("Cancel", R.string.Cancel), new DialogInterface.OnClickListener() {
|
|
@Override
|
|
public void onClick(DialogInterface dialog, int which) {
|
|
ConnectionsManager.getInstance().cancelRequest(reqId, true);
|
|
try {
|
|
dialog.dismiss();
|
|
} catch (Exception e) {
|
|
FileLog.e(e);
|
|
}
|
|
}
|
|
});
|
|
showDialog(progressDialog[0]);
|
|
}
|
|
}, 1000);
|
|
}
|
|
return;
|
|
}
|
|
FrameLayout frameLayout = new FrameLayout(getParentActivity());
|
|
int num = 0;
|
|
for (int a = 0; a < 3; a++) {
|
|
if (!canBan && a == 0) {
|
|
continue;
|
|
}
|
|
CheckBoxCell cell = new CheckBoxCell(getParentActivity(), true);
|
|
cell.setBackgroundDrawable(Theme.getSelectorDrawable(false));
|
|
cell.setTag(a);
|
|
if (a == 0) {
|
|
cell.setText(LocaleController.getString("DeleteBanUser", R.string.DeleteBanUser), "", false, false);
|
|
} else if (a == 1) {
|
|
cell.setText(LocaleController.getString("DeleteReportSpam", R.string.DeleteReportSpam), "", false, false);
|
|
} else if (a == 2) {
|
|
cell.setText(LocaleController.formatString("DeleteAllFrom", R.string.DeleteAllFrom, ContactsController.formatName(user.first_name, user.last_name)), "", false, false);
|
|
}
|
|
cell.setPadding(LocaleController.isRTL ? AndroidUtilities.dp(16) : AndroidUtilities.dp(8), 0, LocaleController.isRTL ? AndroidUtilities.dp(8) : AndroidUtilities.dp(16), 0);
|
|
frameLayout.addView(cell, LayoutHelper.createFrame(LayoutHelper.MATCH_PARENT, 48, Gravity.TOP | Gravity.LEFT, 0, 48 * num, 0, 0));
|
|
cell.setOnClickListener(new View.OnClickListener() {
|
|
@Override
|
|
public void onClick(View v) {
|
|
if (!v.isEnabled()) {
|
|
return;
|
|
}
|
|
CheckBoxCell cell = (CheckBoxCell) v;
|
|
Integer num = (Integer) cell.getTag();
|
|
checks[num] = !checks[num];
|
|
cell.setChecked(checks[num], true);
|
|
}
|
|
});
|
|
num++;
|
|
}
|
|
builder.setView(frameLayout);
|
|
} else if (hasOutgoing) {
|
|
FrameLayout frameLayout = new FrameLayout(getParentActivity());
|
|
CheckBoxCell cell = new CheckBoxCell(getParentActivity(), true);
|
|
cell.setBackgroundDrawable(Theme.getSelectorDrawable(false));
|
|
if (currentChat != null) {
|
|
cell.setText(LocaleController.getString("DeleteForAll", R.string.DeleteForAll), "", false, false);
|
|
} else {
|
|
cell.setText(LocaleController.formatString("DeleteForUser", R.string.DeleteForUser, UserObject.getFirstName(currentUser)), "", false, false);
|
|
}
|
|
cell.setPadding(LocaleController.isRTL ? AndroidUtilities.dp(16) : AndroidUtilities.dp(8), 0, LocaleController.isRTL ? AndroidUtilities.dp(8) : AndroidUtilities.dp(16), 0);
|
|
frameLayout.addView(cell, LayoutHelper.createFrame(LayoutHelper.MATCH_PARENT, 48, Gravity.TOP | Gravity.LEFT, 0, 0, 0, 0));
|
|
cell.setOnClickListener(new View.OnClickListener() {
|
|
@Override
|
|
public void onClick(View v) {
|
|
CheckBoxCell cell = (CheckBoxCell) v;
|
|
deleteForAll[0] = !deleteForAll[0];
|
|
cell.setChecked(deleteForAll[0], true);
|
|
}
|
|
});
|
|
builder.setView(frameLayout);
|
|
} else {
|
|
user = null;
|
|
}
|
|
} else if (!ChatObject.isChannel(currentChat) && currentEncryptedChat == null) {
|
|
boolean hasOutgoing = false;
|
|
int currentDate = ConnectionsManager.getInstance().getCurrentTime();
|
|
if (currentUser != null && currentUser.id != UserConfig.getClientUserId() && !currentUser.bot || currentChat != null) {
|
|
if (finalSelectedObject != null) {
|
|
hasOutgoing = !finalSelectedObject.isSendError() && (finalSelectedObject.messageOwner.action == null || finalSelectedObject.messageOwner.action instanceof TLRPC.TL_messageActionEmpty) && (finalSelectedObject.isOut() || currentChat != null && (currentChat.creator || currentChat.admin && currentChat.admins_enabled)) && (currentDate - finalSelectedObject.messageOwner.date) <= 2 * 24 * 60 * 60;
|
|
} else {
|
|
boolean exit = false;
|
|
for (int a = 1; a >= 0; a--) {
|
|
int channelId = 0;
|
|
for (HashMap.Entry<Integer, MessageObject> entry : selectedMessagesIds[a].entrySet()) {
|
|
MessageObject msg = entry.getValue();
|
|
if (msg.messageOwner.action != null) {
|
|
continue;
|
|
}
|
|
if (msg.isOut() || currentChat != null && (currentChat.creator || currentChat.admin && currentChat.admins_enabled)) {
|
|
if (!hasOutgoing && (currentDate - msg.messageOwner.date) <= 2 * 24 * 60 * 60) {
|
|
hasOutgoing = true;
|
|
}
|
|
} else {
|
|
exit = true;
|
|
hasOutgoing = false;
|
|
break;
|
|
}
|
|
}
|
|
if (exit) {
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
if (hasOutgoing) {
|
|
FrameLayout frameLayout = new FrameLayout(getParentActivity());
|
|
CheckBoxCell cell = new CheckBoxCell(getParentActivity(), true);
|
|
cell.setBackgroundDrawable(Theme.getSelectorDrawable(false));
|
|
if (currentChat != null) {
|
|
cell.setText(LocaleController.getString("DeleteForAll", R.string.DeleteForAll), "", false, false);
|
|
} else {
|
|
cell.setText(LocaleController.formatString("DeleteForUser", R.string.DeleteForUser, UserObject.getFirstName(currentUser)), "", false, false);
|
|
}
|
|
cell.setPadding(LocaleController.isRTL ? AndroidUtilities.dp(16) : AndroidUtilities.dp(8), 0, LocaleController.isRTL ? AndroidUtilities.dp(8) : AndroidUtilities.dp(16), 0);
|
|
frameLayout.addView(cell, LayoutHelper.createFrame(LayoutHelper.MATCH_PARENT, 48, Gravity.TOP | Gravity.LEFT, 0, 0, 0, 0));
|
|
cell.setOnClickListener(new View.OnClickListener() {
|
|
@Override
|
|
public void onClick(View v) {
|
|
CheckBoxCell cell = (CheckBoxCell) v;
|
|
deleteForAll[0] = !deleteForAll[0];
|
|
cell.setChecked(deleteForAll[0], true);
|
|
}
|
|
});
|
|
builder.setView(frameLayout);
|
|
}
|
|
}
|
|
final TLRPC.User userFinal = user;
|
|
builder.setPositiveButton(LocaleController.getString("OK", R.string.OK), new DialogInterface.OnClickListener() {
|
|
@Override
|
|
public void onClick(DialogInterface dialogInterface, int i) {
|
|
ArrayList<Integer> ids = null;
|
|
if (finalSelectedObject != null) {
|
|
ids = new ArrayList<>();
|
|
ArrayList<Long> random_ids = null;
|
|
if (finalSelectedGroup != null) {
|
|
for (int a = 0; a < finalSelectedGroup.messages.size(); a++) {
|
|
MessageObject messageObject = finalSelectedGroup.messages.get(a);
|
|
ids.add(messageObject.getId());
|
|
if (currentEncryptedChat != null && messageObject.messageOwner.random_id != 0 && messageObject.type != 10) {
|
|
if (random_ids == null) {
|
|
random_ids = new ArrayList<>();
|
|
}
|
|
random_ids.add(messageObject.messageOwner.random_id);
|
|
}
|
|
}
|
|
} else {
|
|
ids.add(finalSelectedObject.getId());
|
|
if (currentEncryptedChat != null && finalSelectedObject.messageOwner.random_id != 0 && finalSelectedObject.type != 10) {
|
|
random_ids = new ArrayList<>();
|
|
random_ids.add(finalSelectedObject.messageOwner.random_id);
|
|
}
|
|
}
|
|
MessagesController.getInstance().deleteMessages(ids, random_ids, currentEncryptedChat, finalSelectedObject.messageOwner.to_id.channel_id, deleteForAll[0]);
|
|
} else {
|
|
for (int a = 1; a >= 0; a--) {
|
|
ids = new ArrayList<>(selectedMessagesIds[a].keySet());
|
|
ArrayList<Long> random_ids = null;
|
|
int channelId = 0;
|
|
if (!ids.isEmpty()) {
|
|
MessageObject msg = selectedMessagesIds[a].get(ids.get(0));
|
|
if (channelId == 0 && msg.messageOwner.to_id.channel_id != 0) {
|
|
channelId = msg.messageOwner.to_id.channel_id;
|
|
}
|
|
}
|
|
if (currentEncryptedChat != null) {
|
|
random_ids = new ArrayList<>();
|
|
for (HashMap.Entry<Integer, MessageObject> entry : selectedMessagesIds[a].entrySet()) {
|
|
MessageObject msg = entry.getValue();
|
|
if (msg.messageOwner.random_id != 0 && msg.type != 10) {
|
|
random_ids.add(msg.messageOwner.random_id);
|
|
}
|
|
}
|
|
}
|
|
MessagesController.getInstance().deleteMessages(ids, random_ids, currentEncryptedChat, channelId, deleteForAll[0]);
|
|
}
|
|
actionBar.hideActionMode();
|
|
updatePinnedMessageView(true);
|
|
}
|
|
if (userFinal != null) {
|
|
if (checks[0]) {
|
|
MessagesController.getInstance().deleteUserFromChat(currentChat.id, userFinal, info);
|
|
}
|
|
if (checks[1]) {
|
|
TLRPC.TL_channels_reportSpam req = new TLRPC.TL_channels_reportSpam();
|
|
req.channel = MessagesController.getInputChannel(currentChat);
|
|
req.user_id = MessagesController.getInputUser(userFinal);
|
|
req.id = ids;
|
|
ConnectionsManager.getInstance().sendRequest(req, new RequestDelegate() {
|
|
@Override
|
|
public void run(TLObject response, TLRPC.TL_error error) {
|
|
|
|
}
|
|
});
|
|
}
|
|
if (checks[2]) {
|
|
MessagesController.getInstance().deleteUserChannelHistory(currentChat, userFinal, 0);
|
|
}
|
|
}
|
|
}
|
|
});
|
|
builder.setNegativeButton(LocaleController.getString("Cancel", R.string.Cancel), null);
|
|
showDialog(builder.create());
|
|
}
|
|
|
|
private void createMenu(View v, boolean single, boolean listView) {
|
|
createMenu(v, single, listView, true);
|
|
}
|
|
|
|
private void createMenu(View v, boolean single, boolean listView, boolean searchGroup) {
|
|
if (actionBar.isActionModeShowed()) {
|
|
return;
|
|
}
|
|
|
|
MessageObject message = null;
|
|
if (v instanceof ChatMessageCell) {
|
|
message = ((ChatMessageCell) v).getMessageObject();
|
|
} else if (v instanceof ChatActionCell) {
|
|
message = ((ChatActionCell) v).getMessageObject();
|
|
}
|
|
if (message == null) {
|
|
return;
|
|
}
|
|
final int type = getMessageType(message);
|
|
if (single) {
|
|
if (message.messageOwner.action instanceof TLRPC.TL_messageActionPinMessage) {
|
|
scrollToMessageId(message.messageOwner.reply_to_msg_id, message.messageOwner.id, true, 0, false);
|
|
return;
|
|
}
|
|
}
|
|
|
|
selectedObject = null;
|
|
selectedObjectGroup = null;
|
|
forwardingMessage = null;
|
|
forwardingMessageGroup = null;
|
|
for (int a = 1; a >= 0; a--) {
|
|
selectedMessagesCanCopyIds[a].clear();
|
|
selectedMessagesCanStarIds[a].clear();
|
|
selectedMessagesIds[a].clear();
|
|
}
|
|
cantDeleteMessagesCount = 0;
|
|
canEditMessagesCount = 0;
|
|
actionBar.hideActionMode();
|
|
updatePinnedMessageView(true);
|
|
|
|
MessageObject.GroupedMessages groupedMessages;
|
|
if (searchGroup) {
|
|
groupedMessages = getValidGroupedMessage(message);
|
|
} else {
|
|
groupedMessages = null;
|
|
}
|
|
|
|
boolean allowChatActions = true;
|
|
boolean allowPin = message.getDialogId() != mergeDialogId && message.getId() > 0 && ChatObject.isChannel(currentChat) && (currentChat.creator || currentChat.admin_rights != null && (currentChat.megagroup && currentChat.admin_rights.pin_messages || !currentChat.megagroup && currentChat.admin_rights.edit_messages)) && (message.messageOwner.action == null || message.messageOwner.action instanceof TLRPC.TL_messageActionEmpty);
|
|
boolean allowUnpin = message.getDialogId() != mergeDialogId && info != null && info.pinned_msg_id == message.getId() && (currentChat.creator || currentChat.admin_rights != null && (currentChat.megagroup && currentChat.admin_rights.pin_messages || !currentChat.megagroup && currentChat.admin_rights.edit_messages));
|
|
boolean allowEdit = groupedMessages == null && message.canEditMessage(currentChat) && !chatActivityEnterView.hasAudioToSend() && message.getDialogId() != mergeDialogId;
|
|
if (currentEncryptedChat != null && AndroidUtilities.getPeerLayerVersion(currentEncryptedChat.layer) < 46 ||
|
|
type == 1 && (message.getDialogId() == mergeDialogId || message.isSecretPhoto()) ||
|
|
currentEncryptedChat == null && message.getId() < 0 ||
|
|
bottomOverlayChat != null && bottomOverlayChat.getVisibility() == View.VISIBLE ||
|
|
isBroadcast ||
|
|
currentChat != null && (ChatObject.isNotInChat(currentChat) || ChatObject.isChannel(currentChat) && !ChatObject.canPost(currentChat) && !currentChat.megagroup || !ChatObject.canSendMessages(currentChat))) {
|
|
allowChatActions = false;
|
|
}
|
|
|
|
if (single || type < 2 || type == 20 || message.isSecretPhoto() || message.isLiveLocation()) {
|
|
if (type >= 0) {
|
|
selectedObject = message;
|
|
selectedObjectGroup = groupedMessages;
|
|
if (getParentActivity() == null) {
|
|
return;
|
|
}
|
|
AlertDialog.Builder builder = new AlertDialog.Builder(getParentActivity());
|
|
|
|
ArrayList<CharSequence> items = new ArrayList<>();
|
|
final ArrayList<Integer> options = new ArrayList<>();
|
|
|
|
if (type == 0) {
|
|
items.add(LocaleController.getString("Retry", R.string.Retry));
|
|
options.add(0);
|
|
items.add(LocaleController.getString("Delete", R.string.Delete));
|
|
options.add(1);
|
|
} else if (type == 1) {
|
|
if (currentChat != null && !isBroadcast) {
|
|
if (allowChatActions) {
|
|
items.add(LocaleController.getString("Reply", R.string.Reply));
|
|
options.add(8);
|
|
}
|
|
if (allowUnpin) {
|
|
items.add(LocaleController.getString("UnpinMessage", R.string.UnpinMessage));
|
|
options.add(14);
|
|
} else if (allowPin) {
|
|
items.add(LocaleController.getString("PinMessage", R.string.PinMessage));
|
|
options.add(13);
|
|
}
|
|
if (allowEdit) {
|
|
items.add(LocaleController.getString("Edit", R.string.Edit));
|
|
options.add(12);
|
|
}
|
|
if (message.canDeleteMessage(currentChat)) {
|
|
items.add(LocaleController.getString("Delete", R.string.Delete));
|
|
options.add(1);
|
|
}
|
|
} else {
|
|
if (message.messageOwner.action != null && message.messageOwner.action instanceof TLRPC.TL_messageActionPhoneCall) {
|
|
TLRPC.TL_messageActionPhoneCall call = (TLRPC.TL_messageActionPhoneCall) message.messageOwner.action;
|
|
items.add((call.reason instanceof TLRPC.TL_phoneCallDiscardReasonMissed || call.reason instanceof TLRPC.TL_phoneCallDiscardReasonBusy) && !message.isOutOwner() ? LocaleController.getString("CallBack", R.string.CallBack) : LocaleController.getString("CallAgain", R.string.CallAgain));
|
|
options.add(18);
|
|
if(VoIPHelper.canRateCall(call)){
|
|
items.add(LocaleController.getString("CallMessageReportProblem", R.string.CallMessageReportProblem));
|
|
options.add(19);
|
|
}
|
|
}
|
|
if (single && selectedObject.getId() > 0 && allowChatActions) {
|
|
items.add(LocaleController.getString("Reply", R.string.Reply));
|
|
options.add(8);
|
|
}
|
|
if (message.canDeleteMessage(currentChat)) {
|
|
items.add(LocaleController.getString("Delete", R.string.Delete));
|
|
options.add(1);
|
|
}
|
|
}
|
|
} else if (type == 20) {
|
|
items.add(LocaleController.getString("Retry", R.string.Retry));
|
|
options.add(0);
|
|
items.add(LocaleController.getString("Copy", R.string.Copy));
|
|
options.add(3);
|
|
items.add(LocaleController.getString("Delete", R.string.Delete));
|
|
options.add(1);
|
|
} else {
|
|
if (currentEncryptedChat == null) {
|
|
if (allowChatActions) {
|
|
items.add(LocaleController.getString("Reply", R.string.Reply));
|
|
options.add(8);
|
|
}
|
|
if (selectedObject.type == 0 || selectedObject.caption != null) {
|
|
items.add(LocaleController.getString("Copy", R.string.Copy));
|
|
options.add(3);
|
|
}
|
|
if (ChatObject.isChannel(currentChat) && currentChat.megagroup && !TextUtils.isEmpty(currentChat.username) && ChatObject.hasAdminRights(currentChat)) {
|
|
items.add(LocaleController.getString("CopyLink", R.string.CopyLink));
|
|
options.add(22);
|
|
}
|
|
if (type == 3) {
|
|
if (selectedObject.messageOwner.media instanceof TLRPC.TL_messageMediaWebPage && MessageObject.isNewGifDocument(selectedObject.messageOwner.media.webpage.document)) {
|
|
items.add(LocaleController.getString("SaveToGIFs", R.string.SaveToGIFs));
|
|
options.add(11);
|
|
}
|
|
} else if (type == 4) {
|
|
if (selectedObject.isVideo()) {
|
|
if (!selectedObject.isSecretPhoto()) {
|
|
items.add(LocaleController.getString("SaveToGallery", R.string.SaveToGallery));
|
|
options.add(4);
|
|
items.add(LocaleController.getString("ShareFile", R.string.ShareFile));
|
|
options.add(6);
|
|
}
|
|
} else if (selectedObject.isMusic()) {
|
|
items.add(LocaleController.getString("SaveToMusic", R.string.SaveToMusic));
|
|
options.add(10);
|
|
items.add(LocaleController.getString("ShareFile", R.string.ShareFile));
|
|
options.add(6);
|
|
} else if (selectedObject.getDocument() != null) {
|
|
if (MessageObject.isNewGifDocument(selectedObject.getDocument())) {
|
|
items.add(LocaleController.getString("SaveToGIFs", R.string.SaveToGIFs));
|
|
options.add(11);
|
|
}
|
|
items.add(LocaleController.getString("SaveToDownloads", R.string.SaveToDownloads));
|
|
options.add(10);
|
|
items.add(LocaleController.getString("ShareFile", R.string.ShareFile));
|
|
options.add(6);
|
|
} else {
|
|
if (!selectedObject.isSecretPhoto()) {
|
|
items.add(LocaleController.getString("SaveToGallery", R.string.SaveToGallery));
|
|
options.add(4);
|
|
}
|
|
}
|
|
} else if (type == 5) {
|
|
items.add(LocaleController.getString("ApplyLocalizationFile", R.string.ApplyLocalizationFile));
|
|
options.add(5);
|
|
items.add(LocaleController.getString("SaveToDownloads", R.string.SaveToDownloads));
|
|
options.add(10);
|
|
items.add(LocaleController.getString("ShareFile", R.string.ShareFile));
|
|
options.add(6);
|
|
} else if (type == 10) {
|
|
items.add(LocaleController.getString("ApplyThemeFile", R.string.ApplyThemeFile));
|
|
options.add(5);
|
|
items.add(LocaleController.getString("SaveToDownloads", R.string.SaveToDownloads));
|
|
options.add(10);
|
|
items.add(LocaleController.getString("ShareFile", R.string.ShareFile));
|
|
options.add(6);
|
|
} else if (type == 6) {
|
|
items.add(LocaleController.getString("SaveToGallery", R.string.SaveToGallery));
|
|
options.add(7);
|
|
items.add(LocaleController.getString("SaveToDownloads", R.string.SaveToDownloads));
|
|
options.add(10);
|
|
items.add(LocaleController.getString("ShareFile", R.string.ShareFile));
|
|
options.add(6);
|
|
} else if (type == 7) {
|
|
if (selectedObject.isMask()) {
|
|
items.add(LocaleController.getString("AddToMasks", R.string.AddToMasks));
|
|
options.add(9);
|
|
} else {
|
|
items.add(LocaleController.getString("AddToStickers", R.string.AddToStickers));
|
|
options.add(9);
|
|
if (!StickersQuery.isStickerInFavorites(selectedObject.getDocument())) {
|
|
if (StickersQuery.canAddStickerToFavorites()) {
|
|
items.add(LocaleController.getString("AddToFavorites", R.string.AddToFavorites));
|
|
options.add(20);
|
|
}
|
|
} else {
|
|
items.add(LocaleController.getString("DeleteFromFavorites", R.string.DeleteFromFavorites));
|
|
options.add(21);
|
|
}
|
|
}
|
|
} else if (type == 8) {
|
|
TLRPC.User user = MessagesController.getInstance().getUser(selectedObject.messageOwner.media.user_id);
|
|
if (user != null && user.id != UserConfig.getClientUserId() && ContactsController.getInstance().contactsDict.get(user.id) == null) {
|
|
items.add(LocaleController.getString("AddContactTitle", R.string.AddContactTitle));
|
|
options.add(15);
|
|
}
|
|
if (!TextUtils.isEmpty(selectedObject.messageOwner.media.phone_number)) {
|
|
items.add(LocaleController.getString("Copy", R.string.Copy));
|
|
options.add(16);
|
|
items.add(LocaleController.getString("Call", R.string.Call));
|
|
options.add(17);
|
|
}
|
|
} else if (type == 9) {
|
|
if (!StickersQuery.isStickerInFavorites(selectedObject.getDocument())) {
|
|
items.add(LocaleController.getString("AddToFavorites", R.string.AddToFavorites));
|
|
options.add(20);
|
|
} else {
|
|
items.add(LocaleController.getString("DeleteFromFavorites", R.string.DeleteFromFavorites));
|
|
options.add(21);
|
|
}
|
|
}
|
|
if (!selectedObject.isSecretPhoto() && !selectedObject.isLiveLocation()) {
|
|
items.add(LocaleController.getString("Forward", R.string.Forward));
|
|
options.add(2);
|
|
}
|
|
if (allowUnpin) {
|
|
items.add(LocaleController.getString("UnpinMessage", R.string.UnpinMessage));
|
|
options.add(14);
|
|
} else if (allowPin) {
|
|
items.add(LocaleController.getString("PinMessage", R.string.PinMessage));
|
|
options.add(13);
|
|
}
|
|
if (allowEdit) {
|
|
items.add(LocaleController.getString("Edit", R.string.Edit));
|
|
options.add(12);
|
|
}
|
|
if (message.canDeleteMessage(currentChat)) {
|
|
items.add(LocaleController.getString("Delete", R.string.Delete));
|
|
options.add(1);
|
|
}
|
|
} else {
|
|
if (allowChatActions) {
|
|
items.add(LocaleController.getString("Reply", R.string.Reply));
|
|
options.add(8);
|
|
}
|
|
if (selectedObject.type == 0 || selectedObject.caption != null) {
|
|
items.add(LocaleController.getString("Copy", R.string.Copy));
|
|
options.add(3);
|
|
}
|
|
if (type == 4) {
|
|
if (selectedObject.isVideo()) {
|
|
items.add(LocaleController.getString("SaveToGallery", R.string.SaveToGallery));
|
|
options.add(4);
|
|
items.add(LocaleController.getString("ShareFile", R.string.ShareFile));
|
|
options.add(6);
|
|
} else if (selectedObject.isMusic()) {
|
|
items.add(LocaleController.getString("SaveToMusic", R.string.SaveToMusic));
|
|
options.add(10);
|
|
items.add(LocaleController.getString("ShareFile", R.string.ShareFile));
|
|
options.add(6);
|
|
} else if (!selectedObject.isVideo() && selectedObject.getDocument() != null) {
|
|
items.add(LocaleController.getString("SaveToDownloads", R.string.SaveToDownloads));
|
|
options.add(10);
|
|
items.add(LocaleController.getString("ShareFile", R.string.ShareFile));
|
|
options.add(6);
|
|
} else {
|
|
items.add(LocaleController.getString("SaveToGallery", R.string.SaveToGallery));
|
|
options.add(4);
|
|
}
|
|
} else if (type == 5) {
|
|
items.add(LocaleController.getString("ApplyLocalizationFile", R.string.ApplyLocalizationFile));
|
|
options.add(5);
|
|
} else if (type == 10) {
|
|
items.add(LocaleController.getString("ApplyThemeFile", R.string.ApplyThemeFile));
|
|
options.add(5);
|
|
} else if (type == 7) {
|
|
items.add(LocaleController.getString("AddToStickers", R.string.AddToStickers));
|
|
options.add(9);
|
|
}
|
|
items.add(LocaleController.getString("Delete", R.string.Delete));
|
|
options.add(1);
|
|
}
|
|
}
|
|
|
|
if (options.isEmpty()) {
|
|
return;
|
|
}
|
|
final CharSequence[] finalItems = items.toArray(new CharSequence[items.size()]);
|
|
builder.setItems(finalItems, new DialogInterface.OnClickListener() {
|
|
@Override
|
|
public void onClick(DialogInterface dialogInterface, int i) {
|
|
if (selectedObject == null || i < 0 || i >= options.size()) {
|
|
return;
|
|
}
|
|
processSelectedOption(options.get(i));
|
|
}
|
|
});
|
|
|
|
builder.setTitle(LocaleController.getString("Message", R.string.Message));
|
|
showDialog(builder.create());
|
|
}
|
|
return;
|
|
}
|
|
|
|
final ActionBarMenu actionMode = actionBar.createActionMode();
|
|
View item = actionMode.getItem(forward);
|
|
if (item != null) {
|
|
item.setVisibility(View.VISIBLE);
|
|
}
|
|
item = actionMode.getItem(delete);
|
|
if (item != null) {
|
|
item.setVisibility(View.VISIBLE);
|
|
}
|
|
|
|
actionBar.showActionMode();
|
|
updatePinnedMessageView(true);
|
|
|
|
AnimatorSet animatorSet = new AnimatorSet();
|
|
ArrayList<Animator> animators = new ArrayList<>();
|
|
for (int a = 0; a < actionModeViews.size(); a++) {
|
|
View view = actionModeViews.get(a);
|
|
view.setPivotY(ActionBar.getCurrentActionBarHeight() / 2);
|
|
AndroidUtilities.clearDrawableAnimation(view);
|
|
animators.add(ObjectAnimator.ofFloat(view, "scaleY", 0.1f, 1.0f));
|
|
}
|
|
animatorSet.playTogether(animators);
|
|
animatorSet.setDuration(250);
|
|
animatorSet.start();
|
|
|
|
addToSelectedMessages(message, listView);
|
|
|
|
selectedMessagesCountTextView.setNumber(selectedMessagesIds[0].size() + selectedMessagesIds[1].size(), false);
|
|
updateVisibleRows();
|
|
}
|
|
|
|
private void startEditingMessageObject(MessageObject messageObject) {
|
|
if (messageObject == null || getParentActivity() == null) {
|
|
return;
|
|
}
|
|
if (searchItem != null && actionBar.isSearchFieldVisible()) {
|
|
actionBar.closeSearchField();
|
|
chatActivityEnterView.setFieldFocused();
|
|
}
|
|
|
|
mentionsAdapter.setNeedBotContext(false);
|
|
chatListView.setOnItemLongClickListener(null);
|
|
chatListView.setOnItemClickListener((RecyclerListView.OnItemClickListenerExtended) null);
|
|
chatListView.setClickable(false);
|
|
chatListView.setLongClickable(false);
|
|
chatActivityEnterView.setEditingMessageObject(messageObject, !messageObject.isMediaEmpty());
|
|
updateBottomOverlay();
|
|
if (chatActivityEnterView.isEditingCaption()) {
|
|
mentionsAdapter.setAllowNewMentions(false);
|
|
}
|
|
actionModeTitleContainer.setVisibility(View.VISIBLE);
|
|
selectedMessagesCountTextView.setVisibility(View.GONE);
|
|
checkEditTimer();
|
|
|
|
chatActivityEnterView.setAllowStickersAndGifs(false, false);
|
|
final ActionBarMenu actionMode = actionBar.createActionMode();
|
|
actionMode.getItem(reply).setVisibility(View.GONE);
|
|
actionMode.getItem(copy).setVisibility(View.GONE);
|
|
actionMode.getItem(forward).setVisibility(View.GONE);
|
|
actionMode.getItem(delete).setVisibility(View.GONE);
|
|
actionMode.getItem(edit).setVisibility(View.GONE);
|
|
|
|
actionBar.showActionMode();
|
|
updatePinnedMessageView(true);
|
|
updateVisibleRows();
|
|
|
|
TLRPC.TL_messages_getMessageEditData req = new TLRPC.TL_messages_getMessageEditData();
|
|
req.peer = MessagesController.getInputPeer((int) dialog_id);
|
|
req.id = messageObject.getId();
|
|
editingMessageObjectReqId = ConnectionsManager.getInstance().sendRequest(req, new RequestDelegate() {
|
|
@Override
|
|
public void run(final TLObject response, TLRPC.TL_error error) {
|
|
AndroidUtilities.runOnUIThread(new Runnable() {
|
|
@Override
|
|
public void run() {
|
|
editingMessageObjectReqId = 0;
|
|
if (response == null) {
|
|
AlertDialog.Builder builder = new AlertDialog.Builder(getParentActivity());
|
|
builder.setTitle(LocaleController.getString("AppName", R.string.AppName));
|
|
builder.setMessage(LocaleController.getString("EditMessageError", R.string.EditMessageError));
|
|
builder.setPositiveButton(LocaleController.getString("OK", R.string.OK), null);
|
|
showDialog(builder.create());
|
|
|
|
if (chatActivityEnterView != null) {
|
|
chatActivityEnterView.setEditingMessageObject(null, false);
|
|
}
|
|
} else {
|
|
if (chatActivityEnterView != null) {
|
|
chatActivityEnterView.showEditDoneProgress(false, true);
|
|
}
|
|
}
|
|
}
|
|
});
|
|
}
|
|
});
|
|
}
|
|
|
|
private String getMessageContent(MessageObject messageObject, int previousUid, boolean name) {
|
|
String str = "";
|
|
if (name) {
|
|
if (previousUid != messageObject.messageOwner.from_id) {
|
|
if (messageObject.messageOwner.from_id > 0) {
|
|
TLRPC.User user = MessagesController.getInstance().getUser(messageObject.messageOwner.from_id);
|
|
if (user != null) {
|
|
str = ContactsController.formatName(user.first_name, user.last_name) + ":\n";
|
|
}
|
|
} else if (messageObject.messageOwner.from_id < 0) {
|
|
TLRPC.Chat chat = MessagesController.getInstance().getChat(-messageObject.messageOwner.from_id);
|
|
if (chat != null) {
|
|
str = chat.title + ":\n";
|
|
}
|
|
}
|
|
}
|
|
}
|
|
if (messageObject.type == 0 && messageObject.messageOwner.message != null) {
|
|
str += messageObject.messageOwner.message;
|
|
} else if (messageObject.messageOwner.media != null && messageObject.messageOwner.media.caption != null) {
|
|
str += messageObject.messageOwner.media.caption;
|
|
} else {
|
|
str += messageObject.messageText;
|
|
}
|
|
return str;
|
|
}
|
|
|
|
private void saveMessageToGallery(MessageObject messageObject) {
|
|
String path = messageObject.messageOwner.attachPath;
|
|
if (!TextUtils.isEmpty(path)) {
|
|
File temp = new File(path);
|
|
if (!temp.exists()) {
|
|
path = null;
|
|
}
|
|
}
|
|
if (TextUtils.isEmpty(path)) {
|
|
path = FileLoader.getPathToMessage(messageObject.messageOwner).toString();
|
|
}
|
|
MediaController.saveFile(path, getParentActivity(), messageObject.type == 3 ? 1 : 0, null, null);
|
|
}
|
|
|
|
private void processSelectedOption(int option) {
|
|
if (selectedObject == null) {
|
|
return;
|
|
}
|
|
switch (option) {
|
|
case 0: {
|
|
if (selectedObjectGroup != null) {
|
|
boolean success = true;
|
|
for (int a = 0; a < selectedObjectGroup.messages.size(); a++) {
|
|
if (!SendMessagesHelper.getInstance().retrySendMessage(selectedObjectGroup.messages.get(a), false)) {
|
|
success = false;
|
|
}
|
|
}
|
|
if (success) {
|
|
moveScrollToLastMessage();
|
|
}
|
|
} else {
|
|
if (SendMessagesHelper.getInstance().retrySendMessage(selectedObject, false)) {
|
|
moveScrollToLastMessage();
|
|
}
|
|
}
|
|
break;
|
|
}
|
|
case 1: {
|
|
if (getParentActivity() == null) {
|
|
selectedObject = null;
|
|
selectedObjectGroup = null;
|
|
return;
|
|
}
|
|
createDeleteMessagesAlert(selectedObject, selectedObjectGroup);
|
|
break;
|
|
}
|
|
case 2: {
|
|
forwardingMessage = selectedObject;
|
|
forwardingMessageGroup = selectedObjectGroup;
|
|
Bundle args = new Bundle();
|
|
args.putBoolean("onlySelect", true);
|
|
args.putInt("dialogsType", 3);
|
|
DialogsActivity fragment = new DialogsActivity(args);
|
|
fragment.setDelegate(this);
|
|
presentFragment(fragment);
|
|
break;
|
|
}
|
|
case 3: {
|
|
AndroidUtilities.addToClipboard(getMessageContent(selectedObject, 0, false));
|
|
break;
|
|
}
|
|
case 4: {
|
|
if (Build.VERSION.SDK_INT >= 23 && getParentActivity().checkSelfPermission(Manifest.permission.WRITE_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) {
|
|
getParentActivity().requestPermissions(new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE}, 4);
|
|
selectedObject = null;
|
|
selectedObjectGroup = null;
|
|
return;
|
|
}
|
|
if (selectedObjectGroup != null) {
|
|
for (int a = 0; a < selectedObjectGroup.messages.size(); a++) {
|
|
saveMessageToGallery(selectedObjectGroup.messages.get(a));
|
|
}
|
|
} else {
|
|
saveMessageToGallery(selectedObject);
|
|
}
|
|
break;
|
|
}
|
|
case 5: {
|
|
File locFile = null;
|
|
if (!TextUtils.isEmpty(selectedObject.messageOwner.attachPath)) {
|
|
File f = new File(selectedObject.messageOwner.attachPath);
|
|
if (f.exists()) {
|
|
locFile = f;
|
|
}
|
|
}
|
|
if (locFile == null) {
|
|
File f = FileLoader.getPathToMessage(selectedObject.messageOwner);
|
|
if (f.exists()) {
|
|
locFile = f;
|
|
}
|
|
}
|
|
if (locFile != null) {
|
|
if (locFile.getName().endsWith("attheme")) {
|
|
if (chatLayoutManager != null) {
|
|
int lastPosition = chatLayoutManager.findFirstVisibleItemPosition();
|
|
if (lastPosition != 0) {
|
|
scrollToPositionOnRecreate = lastPosition;
|
|
RecyclerListView.Holder holder = (RecyclerListView.Holder) chatListView.findViewHolderForAdapterPosition(scrollToPositionOnRecreate);
|
|
if (holder != null) {
|
|
scrollToOffsetOnRecreate = chatListView.getMeasuredHeight() - holder.itemView.getBottom() - chatListView.getPaddingBottom();
|
|
} else {
|
|
scrollToPositionOnRecreate = -1;
|
|
}
|
|
} else {
|
|
scrollToPositionOnRecreate = -1;
|
|
}
|
|
}
|
|
|
|
Theme.ThemeInfo themeInfo = Theme.applyThemeFile(locFile, selectedObject.getDocumentName(), true);
|
|
if (themeInfo != null) {
|
|
presentFragment(new ThemePreviewActivity(locFile, themeInfo));
|
|
} else {
|
|
scrollToPositionOnRecreate = -1;
|
|
if (getParentActivity() == null) {
|
|
selectedObject = null;
|
|
selectedObjectGroup = null;
|
|
return;
|
|
}
|
|
AlertDialog.Builder builder = new AlertDialog.Builder(getParentActivity());
|
|
builder.setTitle(LocaleController.getString("AppName", R.string.AppName));
|
|
builder.setMessage(LocaleController.getString("IncorrectTheme", R.string.IncorrectTheme));
|
|
builder.setPositiveButton(LocaleController.getString("OK", R.string.OK), null);
|
|
showDialog(builder.create());
|
|
}
|
|
} else {
|
|
if (LocaleController.getInstance().applyLanguageFile(locFile)) {
|
|
presentFragment(new LanguageSelectActivity());
|
|
} else {
|
|
if (getParentActivity() == null) {
|
|
selectedObject = null;
|
|
selectedObjectGroup = null;
|
|
return;
|
|
}
|
|
AlertDialog.Builder builder = new AlertDialog.Builder(getParentActivity());
|
|
builder.setTitle(LocaleController.getString("AppName", R.string.AppName));
|
|
builder.setMessage(LocaleController.getString("IncorrectLocalization", R.string.IncorrectLocalization));
|
|
builder.setPositiveButton(LocaleController.getString("OK", R.string.OK), null);
|
|
showDialog(builder.create());
|
|
}
|
|
}
|
|
}
|
|
break;
|
|
}
|
|
case 6: {
|
|
String path = selectedObject.messageOwner.attachPath;
|
|
if (path != null && path.length() > 0) {
|
|
File temp = new File(path);
|
|
if (!temp.exists()) {
|
|
path = null;
|
|
}
|
|
}
|
|
if (path == null || path.length() == 0) {
|
|
path = FileLoader.getPathToMessage(selectedObject.messageOwner).toString();
|
|
}
|
|
Intent intent = new Intent(Intent.ACTION_SEND);
|
|
intent.setType(selectedObject.getDocument().mime_type);
|
|
File f = new File(path);
|
|
if (Build.VERSION.SDK_INT >= 24) {
|
|
try {
|
|
intent.putExtra(Intent.EXTRA_STREAM, FileProvider.getUriForFile(getParentActivity(), BuildConfig.APPLICATION_ID + ".provider", f));
|
|
intent.setFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
|
|
} catch (Exception ignore) {
|
|
intent.putExtra(Intent.EXTRA_STREAM, Uri.fromFile(f));
|
|
}
|
|
} else {
|
|
intent.putExtra(Intent.EXTRA_STREAM, Uri.fromFile(f));
|
|
}
|
|
getParentActivity().startActivityForResult(Intent.createChooser(intent, LocaleController.getString("ShareFile", R.string.ShareFile)), 500);
|
|
break;
|
|
}
|
|
case 7: {
|
|
String path = selectedObject.messageOwner.attachPath;
|
|
if (path != null && path.length() > 0) {
|
|
File temp = new File(path);
|
|
if (!temp.exists()) {
|
|
path = null;
|
|
}
|
|
}
|
|
if (path == null || path.length() == 0) {
|
|
path = FileLoader.getPathToMessage(selectedObject.messageOwner).toString();
|
|
}
|
|
if (Build.VERSION.SDK_INT >= 23 && getParentActivity().checkSelfPermission(Manifest.permission.WRITE_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) {
|
|
getParentActivity().requestPermissions(new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE}, 4);
|
|
selectedObject = null;
|
|
selectedObjectGroup = null;
|
|
return;
|
|
}
|
|
MediaController.saveFile(path, getParentActivity(), 0, null, null);
|
|
break;
|
|
}
|
|
case 8: {
|
|
showReplyPanel(true, selectedObject, null, null, false);
|
|
break;
|
|
}
|
|
case 9: {
|
|
showDialog(new StickersAlert(getParentActivity(), this, selectedObject.getInputStickerSet(), null, bottomOverlayChat.getVisibility() != View.VISIBLE && ChatObject.canSendStickers(currentChat) ? chatActivityEnterView : null));
|
|
break;
|
|
}
|
|
case 10: {
|
|
if (Build.VERSION.SDK_INT >= 23 && getParentActivity().checkSelfPermission(Manifest.permission.WRITE_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) {
|
|
getParentActivity().requestPermissions(new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE}, 4);
|
|
selectedObject = null;
|
|
selectedObjectGroup = null;
|
|
return;
|
|
}
|
|
String fileName = FileLoader.getDocumentFileName(selectedObject.getDocument());
|
|
if (TextUtils.isEmpty(fileName)) {
|
|
fileName = selectedObject.getFileName();
|
|
}
|
|
String path = selectedObject.messageOwner.attachPath;
|
|
if (path != null && path.length() > 0) {
|
|
File temp = new File(path);
|
|
if (!temp.exists()) {
|
|
path = null;
|
|
}
|
|
}
|
|
if (path == null || path.length() == 0) {
|
|
path = FileLoader.getPathToMessage(selectedObject.messageOwner).toString();
|
|
}
|
|
MediaController.saveFile(path, getParentActivity(), selectedObject.isMusic() ? 3 : 2, fileName, selectedObject.getDocument() != null ? selectedObject.getDocument().mime_type : "");
|
|
break;
|
|
}
|
|
case 11: {
|
|
TLRPC.Document document = selectedObject.getDocument();
|
|
MessagesController.getInstance().saveGif(document);
|
|
showGifHint();
|
|
chatActivityEnterView.addRecentGif(document);
|
|
break;
|
|
}
|
|
case 12: {
|
|
startEditingMessageObject(selectedObject);
|
|
selectedObject = null;
|
|
selectedObjectGroup = null;
|
|
break;
|
|
}
|
|
case 13: {
|
|
final int mid = selectedObject.getId();
|
|
AlertDialog.Builder builder = new AlertDialog.Builder(getParentActivity());
|
|
|
|
final boolean[] checks;
|
|
if (ChatObject.isChannel(currentChat) && currentChat.megagroup) {
|
|
builder.setMessage(LocaleController.getString("PinMessageAlert", R.string.PinMessageAlert));
|
|
checks = new boolean[]{true};
|
|
FrameLayout frameLayout = new FrameLayout(getParentActivity());
|
|
CheckBoxCell cell = new CheckBoxCell(getParentActivity(), true);
|
|
cell.setBackgroundDrawable(Theme.getSelectorDrawable(false));
|
|
cell.setText(LocaleController.getString("PinNotify", R.string.PinNotify), "", true, false);
|
|
cell.setPadding(LocaleController.isRTL ? AndroidUtilities.dp(8) : 0, 0, LocaleController.isRTL ? 0 : AndroidUtilities.dp(8), 0);
|
|
frameLayout.addView(cell, LayoutHelper.createFrame(LayoutHelper.MATCH_PARENT, 48, Gravity.TOP | Gravity.LEFT, 8, 0, 8, 0));
|
|
cell.setOnClickListener(new View.OnClickListener() {
|
|
@Override
|
|
public void onClick(View v) {
|
|
CheckBoxCell cell = (CheckBoxCell) v;
|
|
checks[0] = !checks[0];
|
|
cell.setChecked(checks[0], true);
|
|
}
|
|
});
|
|
builder.setView(frameLayout);
|
|
} else {
|
|
builder.setMessage(LocaleController.getString("PinMessageAlertChannel", R.string.PinMessageAlertChannel));
|
|
checks = new boolean[]{false};
|
|
}
|
|
builder.setPositiveButton(LocaleController.getString("OK", R.string.OK), new DialogInterface.OnClickListener() {
|
|
@Override
|
|
public void onClick(DialogInterface dialogInterface, int i) {
|
|
MessagesController.getInstance().pinChannelMessage(currentChat, mid, checks[0]);
|
|
}
|
|
});
|
|
builder.setTitle(LocaleController.getString("AppName", R.string.AppName));
|
|
builder.setNegativeButton(LocaleController.getString("Cancel", R.string.Cancel), null);
|
|
showDialog(builder.create());
|
|
break;
|
|
}
|
|
case 14: {
|
|
AlertDialog.Builder builder = new AlertDialog.Builder(getParentActivity());
|
|
builder.setMessage(LocaleController.getString("UnpinMessageAlert", R.string.UnpinMessageAlert));
|
|
builder.setPositiveButton(LocaleController.getString("OK", R.string.OK), new DialogInterface.OnClickListener() {
|
|
@Override
|
|
public void onClick(DialogInterface dialogInterface, int i) {
|
|
MessagesController.getInstance().pinChannelMessage(currentChat, 0, false);
|
|
}
|
|
});
|
|
builder.setTitle(LocaleController.getString("AppName", R.string.AppName));
|
|
builder.setNegativeButton(LocaleController.getString("Cancel", R.string.Cancel), null);
|
|
showDialog(builder.create());
|
|
break;
|
|
}
|
|
case 15: {
|
|
Bundle args = new Bundle();
|
|
args.putInt("user_id", selectedObject.messageOwner.media.user_id);
|
|
args.putString("phone", selectedObject.messageOwner.media.phone_number);
|
|
args.putBoolean("addContact", true);
|
|
presentFragment(new ContactAddActivity(args));
|
|
break;
|
|
}
|
|
case 16: {
|
|
AndroidUtilities.addToClipboard(selectedObject.messageOwner.media.phone_number);
|
|
break;
|
|
}
|
|
case 17: {
|
|
try {
|
|
Intent intent = new Intent(Intent.ACTION_DIAL, Uri.parse("tel:" + selectedObject.messageOwner.media.phone_number));
|
|
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
|
|
getParentActivity().startActivityForResult(intent, 500);
|
|
} catch (Exception e) {
|
|
FileLog.e(e);
|
|
}
|
|
break;
|
|
}
|
|
case 18: {
|
|
if (currentUser != null) {
|
|
VoIPHelper.startCall(currentUser, getParentActivity(), MessagesController.getInstance().getUserFull(currentUser.id));
|
|
}
|
|
break;
|
|
}
|
|
case 19: {
|
|
VoIPHelper.showRateAlert(getParentActivity(), (TLRPC.TL_messageActionPhoneCall) selectedObject.messageOwner.action);
|
|
break;
|
|
}
|
|
case 20: {
|
|
StickersQuery.addRecentSticker(StickersQuery.TYPE_FAVE, selectedObject.getDocument(), (int) (System.currentTimeMillis() / 1000), false);
|
|
break;
|
|
}
|
|
case 21: {
|
|
StickersQuery.addRecentSticker(StickersQuery.TYPE_FAVE, selectedObject.getDocument(), (int) (System.currentTimeMillis() / 1000), true);
|
|
break;
|
|
}
|
|
case 22: {
|
|
TLRPC.TL_channels_exportMessageLink req = new TLRPC.TL_channels_exportMessageLink();
|
|
req.id = selectedObject.getId();
|
|
req.channel = MessagesController.getInputChannel(currentChat);
|
|
ConnectionsManager.getInstance().sendRequest(req, new RequestDelegate() {
|
|
@Override
|
|
public void run(final TLObject response, TLRPC.TL_error error) {
|
|
AndroidUtilities.runOnUIThread(new Runnable() {
|
|
@Override
|
|
public void run() {
|
|
if (response != null) {
|
|
TLRPC.TL_exportedMessageLink exportedMessageLink = (TLRPC.TL_exportedMessageLink) response;
|
|
try {
|
|
android.content.ClipboardManager clipboard = (android.content.ClipboardManager) ApplicationLoader.applicationContext.getSystemService(Context.CLIPBOARD_SERVICE);
|
|
android.content.ClipData clip = android.content.ClipData.newPlainText("label", exportedMessageLink.link);
|
|
clipboard.setPrimaryClip(clip);
|
|
Toast.makeText(ApplicationLoader.applicationContext, LocaleController.getString("LinkCopied", R.string.LinkCopied), Toast.LENGTH_SHORT).show();
|
|
} catch (Exception e) {
|
|
FileLog.e(e);
|
|
}
|
|
}
|
|
|
|
}
|
|
});
|
|
}
|
|
});
|
|
break;
|
|
}
|
|
}
|
|
selectedObject = null;
|
|
selectedObjectGroup = null;
|
|
}
|
|
|
|
@Override
|
|
public void didSelectDialogs(DialogsActivity fragment, ArrayList<Long> dids, CharSequence message, boolean param) {
|
|
if (forwardingMessage == null && selectedMessagesIds[0].isEmpty() && selectedMessagesIds[1].isEmpty()) {
|
|
return;
|
|
}
|
|
ArrayList<MessageObject> fmessages = new ArrayList<>();
|
|
if (forwardingMessage != null) {
|
|
if (forwardingMessageGroup != null) {
|
|
fmessages.addAll(forwardingMessageGroup.messages);
|
|
} else {
|
|
fmessages.add(forwardingMessage);
|
|
}
|
|
forwardingMessage = null;
|
|
forwardingMessageGroup = null;
|
|
} else {
|
|
for (int a = 1; a >= 0; a--) {
|
|
ArrayList<Integer> ids = new ArrayList<>(selectedMessagesIds[a].keySet());
|
|
Collections.sort(ids);
|
|
for (int b = 0; b < ids.size(); b++) {
|
|
Integer id = ids.get(b);
|
|
MessageObject messageObject = selectedMessagesIds[a].get(id);
|
|
if (messageObject != null && id > 0) {
|
|
fmessages.add(messageObject);
|
|
}
|
|
}
|
|
selectedMessagesCanCopyIds[a].clear();
|
|
selectedMessagesCanStarIds[a].clear();
|
|
selectedMessagesIds[a].clear();
|
|
}
|
|
cantDeleteMessagesCount = 0;
|
|
canEditMessagesCount = 0;
|
|
actionBar.hideActionMode();
|
|
updatePinnedMessageView(true);
|
|
}
|
|
|
|
if (dids.size() > 1 || dids.get(0) == UserConfig.getClientUserId() || message != null) {
|
|
for (int a = 0; a < dids.size(); a++) {
|
|
long did = dids.get(a);
|
|
if (message != null) {
|
|
SendMessagesHelper.getInstance().sendMessage(message.toString(), did, null, null, true, null, null, null);
|
|
}
|
|
SendMessagesHelper.getInstance().sendMessage(fmessages, did);
|
|
}
|
|
fragment.finishFragment();
|
|
} else {
|
|
long did = dids.get(0);
|
|
if (did != dialog_id) {
|
|
int lower_part = (int) did;
|
|
int high_part = (int) (did >> 32);
|
|
Bundle args = new Bundle();
|
|
args.putBoolean("scrollToTopOnResume", scrollToTopOnResume);
|
|
if (lower_part != 0) {
|
|
if (lower_part > 0) {
|
|
args.putInt("user_id", lower_part);
|
|
} else if (lower_part < 0) {
|
|
args.putInt("chat_id", -lower_part);
|
|
}
|
|
} else {
|
|
args.putInt("enc_id", high_part);
|
|
}
|
|
if (lower_part != 0) {
|
|
if (!MessagesController.checkCanOpenChat(args, fragment)) {
|
|
return;
|
|
}
|
|
}
|
|
ChatActivity chatActivity = new ChatActivity(args);
|
|
if (presentFragment(chatActivity, true)) {
|
|
chatActivity.showReplyPanel(true, null, fmessages, null, false);
|
|
if (!AndroidUtilities.isTablet()) {
|
|
removeSelfFromStack();
|
|
}
|
|
} else {
|
|
fragment.finishFragment();
|
|
}
|
|
} else {
|
|
fragment.finishFragment();
|
|
moveScrollToLastMessage();
|
|
showReplyPanel(true, null, fmessages, null, false);
|
|
if (AndroidUtilities.isTablet()) {
|
|
actionBar.hideActionMode();
|
|
updatePinnedMessageView(true);
|
|
}
|
|
updateVisibleRows();
|
|
}
|
|
}
|
|
}
|
|
|
|
public boolean checkRecordLocked() {
|
|
if (chatActivityEnterView != null && chatActivityEnterView.isRecordLocked()) {
|
|
AlertDialog.Builder builder = new AlertDialog.Builder(getParentActivity());
|
|
if (chatActivityEnterView.isInVideoMode()) {
|
|
builder.setTitle(LocaleController.getString("DiscardVideoMessageTitle", R.string.DiscardVideoMessageTitle));
|
|
builder.setMessage(LocaleController.getString("DiscardVideoMessageDescription", R.string.DiscardVideoMessageDescription));
|
|
} else {
|
|
builder.setTitle(LocaleController.getString("DiscardVoiceMessageTitle", R.string.DiscardVoiceMessageTitle));
|
|
builder.setMessage(LocaleController.getString("DiscardVoiceMessageDescription", R.string.DiscardVoiceMessageDescription));
|
|
}
|
|
builder.setPositiveButton(LocaleController.getString("DiscardVoiceMessageAction", R.string.DiscardVoiceMessageAction), new DialogInterface.OnClickListener() {
|
|
@Override
|
|
public void onClick(DialogInterface dialog, int which) {
|
|
if (chatActivityEnterView != null) {
|
|
chatActivityEnterView.cancelRecordingAudioVideo();
|
|
}
|
|
}
|
|
});
|
|
builder.setNegativeButton(LocaleController.getString("Cancel", R.string.Cancel), null);
|
|
showDialog(builder.create());
|
|
return true;
|
|
}
|
|
return false;
|
|
}
|
|
|
|
@Override
|
|
public boolean onBackPressed() {
|
|
if (checkRecordLocked()) {
|
|
return false;
|
|
} else if (actionBar != null && actionBar.isActionModeShowed()) {
|
|
for (int a = 1; a >= 0; a--) {
|
|
selectedMessagesIds[a].clear();
|
|
selectedMessagesCanCopyIds[a].clear();
|
|
selectedMessagesCanStarIds[a].clear();
|
|
}
|
|
chatActivityEnterView.setEditingMessageObject(null, false);
|
|
actionBar.hideActionMode();
|
|
updatePinnedMessageView(true);
|
|
cantDeleteMessagesCount = 0;
|
|
canEditMessagesCount = 0;
|
|
updateVisibleRows();
|
|
return false;
|
|
} else if (chatActivityEnterView != null && chatActivityEnterView.isPopupShowing()) {
|
|
chatActivityEnterView.hidePopup(true);
|
|
return false;
|
|
}
|
|
return true;
|
|
}
|
|
|
|
private void updateVisibleRows() {
|
|
if (chatListView == null) {
|
|
return;
|
|
}
|
|
int count = chatListView.getChildCount();
|
|
MessageObject editingMessageObject = chatActivityEnterView != null ? chatActivityEnterView.getEditingMessageObject() : null;
|
|
for (int a = 0; a < count; a++) {
|
|
View view = chatListView.getChildAt(a);
|
|
if (view instanceof ChatMessageCell) {
|
|
ChatMessageCell cell = (ChatMessageCell) view;
|
|
MessageObject messageObject = cell.getMessageObject();
|
|
|
|
boolean disableSelection = false;
|
|
boolean selected = false;
|
|
if (actionBar.isActionModeShowed()) {
|
|
int idx = messageObject.getDialogId() == dialog_id ? 0 : 1;
|
|
if (messageObject == editingMessageObject || selectedMessagesIds[idx].containsKey(messageObject.getId())) {
|
|
setCellSelectionBackground(messageObject, cell, idx);
|
|
selected = true;
|
|
} else {
|
|
view.setBackgroundDrawable(null);
|
|
}
|
|
disableSelection = true;
|
|
} else {
|
|
view.setBackgroundDrawable(null);
|
|
}
|
|
|
|
cell.setMessageObject(cell.getMessageObject(), cell.getCurrentMessagesGroup(), cell.isPinnedBottom(), cell.isPinnedTop());
|
|
cell.setCheckPressed(!disableSelection, disableSelection && selected);
|
|
cell.setHighlighted(highlightMessageId != Integer.MAX_VALUE && messageObject != null && messageObject.getId() == highlightMessageId);
|
|
if (searchContainer != null && searchContainer.getVisibility() == View.VISIBLE && MessagesSearchQuery.isMessageFound(messageObject.getId(), messageObject.getDialogId() == mergeDialogId) && MessagesSearchQuery.getLastSearchQuery() != null) {
|
|
cell.setHighlightedText(MessagesSearchQuery.getLastSearchQuery());
|
|
} else {
|
|
cell.setHighlightedText(null);
|
|
}
|
|
} else if (view instanceof ChatActionCell) {
|
|
ChatActionCell cell = (ChatActionCell) view;
|
|
cell.setMessageObject(cell.getMessageObject());
|
|
}
|
|
}
|
|
chatListView.invalidate();
|
|
}
|
|
|
|
private void checkEditTimer() {
|
|
if (chatActivityEnterView == null) {
|
|
return;
|
|
}
|
|
MessageObject messageObject = chatActivityEnterView.getEditingMessageObject();
|
|
if (messageObject == null) {
|
|
return;
|
|
}
|
|
if (currentUser != null && currentUser.self) {
|
|
if (actionModeSubTextView.getVisibility() != View.GONE) {
|
|
actionModeSubTextView.setVisibility(View.GONE);
|
|
}
|
|
return;
|
|
}
|
|
int dt = messageObject.canEditMessageAnytime(currentChat) ? 6 * 60 : MessagesController.getInstance().maxEditTime + 5 * 60 - Math.abs(ConnectionsManager.getInstance().getCurrentTime() - messageObject.messageOwner.date);
|
|
if (dt > 0) {
|
|
if (dt > 5 * 60) {
|
|
if (actionModeSubTextView.getVisibility() != View.GONE) {
|
|
actionModeSubTextView.setVisibility(View.GONE);
|
|
}
|
|
} else {
|
|
if (actionModeSubTextView.getVisibility() != View.VISIBLE) {
|
|
actionModeSubTextView.setVisibility(View.VISIBLE);
|
|
}
|
|
actionModeSubTextView.setText(LocaleController.formatString("TimeToEdit", R.string.TimeToEdit, String.format("%d:%02d", dt / 60, dt % 60)));
|
|
}
|
|
AndroidUtilities.runOnUIThread(new Runnable() {
|
|
@Override
|
|
public void run() {
|
|
checkEditTimer();
|
|
}
|
|
}, 1000);
|
|
} else {
|
|
chatActivityEnterView.onEditTimeExpired();
|
|
actionModeSubTextView.setText(LocaleController.formatString("TimeToEditExpired", R.string.TimeToEditExpired));
|
|
}
|
|
}
|
|
|
|
private ArrayList<MessageObject> createVoiceMessagesPlaylist(MessageObject startMessageObject, boolean playingUnreadMedia) {
|
|
ArrayList<MessageObject> messageObjects = new ArrayList<>();
|
|
messageObjects.add(startMessageObject);
|
|
int messageId = startMessageObject.getId();
|
|
long startDialogId = startMessageObject.getDialogId();
|
|
if (messageId != 0) {
|
|
boolean started = false;
|
|
for (int a = messages.size() - 1; a >= 0; a--) {
|
|
MessageObject messageObject = messages.get(a);
|
|
if (messageObject.getDialogId() == mergeDialogId && startMessageObject.getDialogId() != mergeDialogId) {
|
|
continue;
|
|
}
|
|
/*if (startDialogId == mergeDialogId && messageId != 0 && messageObject.getDialogId() != mergeDialogId) {
|
|
messageId = 0;
|
|
}*/
|
|
if ((currentEncryptedChat == null && messageObject.getId() > messageId || currentEncryptedChat != null && messageObject.getId() < messageId) && (messageObject.isVoice() || messageObject.isRoundVideo()) && (!playingUnreadMedia || messageObject.isContentUnread() && !messageObject.isOut())) {
|
|
messageObjects.add(messageObject);
|
|
}
|
|
}
|
|
}
|
|
return messageObjects;
|
|
}
|
|
|
|
private void alertUserOpenError(MessageObject message) {
|
|
if (getParentActivity() == null) {
|
|
return;
|
|
}
|
|
AlertDialog.Builder builder = new AlertDialog.Builder(getParentActivity());
|
|
builder.setTitle(LocaleController.getString("AppName", R.string.AppName));
|
|
builder.setPositiveButton(LocaleController.getString("OK", R.string.OK), null);
|
|
if (message.type == 3) {
|
|
builder.setMessage(LocaleController.getString("NoPlayerInstalled", R.string.NoPlayerInstalled));
|
|
} else {
|
|
builder.setMessage(LocaleController.formatString("NoHandleAppInstalled", R.string.NoHandleAppInstalled, message.getDocument().mime_type));
|
|
}
|
|
showDialog(builder.create());
|
|
}
|
|
|
|
private void openSearchWithText(String text) {
|
|
avatarContainer.setVisibility(View.GONE);
|
|
headerItem.setVisibility(View.GONE);
|
|
attachItem.setVisibility(View.GONE);
|
|
searchItem.setVisibility(View.VISIBLE);
|
|
updateSearchButtons(0, 0, -1);
|
|
updateBottomOverlay();
|
|
openSearchKeyboard = text == null;
|
|
searchItem.openSearch(openSearchKeyboard);
|
|
if (text != null) {
|
|
searchItem.getSearchField().setText(text);
|
|
searchItem.getSearchField().setSelection(searchItem.getSearchField().length());
|
|
MessagesSearchQuery.searchMessagesInChat(text, dialog_id, mergeDialogId, classGuid, 0, searchingUserMessages);
|
|
}
|
|
updatePinnedMessageView(true);
|
|
}
|
|
|
|
@Override
|
|
public void didSelectLocation(TLRPC.MessageMedia location, int live) {
|
|
SendMessagesHelper.getInstance().sendMessage(location, dialog_id, replyingMessageObject, null, null);
|
|
moveScrollToLastMessage();
|
|
if (live == 1) {
|
|
showReplyPanel(false, null, null, null, false);
|
|
DraftQuery.cleanDraft(dialog_id, true);
|
|
}
|
|
if (paused) {
|
|
scrollToTopOnResume = true;
|
|
}
|
|
}
|
|
|
|
public boolean isSecretChat() {
|
|
return currentEncryptedChat != null;
|
|
}
|
|
|
|
public TLRPC.User getCurrentUser() {
|
|
return currentUser;
|
|
}
|
|
|
|
public TLRPC.Chat getCurrentChat() {
|
|
return currentChat;
|
|
}
|
|
|
|
public boolean allowGroupPhotos() {
|
|
return currentEncryptedChat == null || AndroidUtilities.getPeerLayerVersion(currentEncryptedChat.layer) >= 73;
|
|
}
|
|
|
|
public TLRPC.EncryptedChat getCurrentEncryptedChat() {
|
|
return currentEncryptedChat;
|
|
}
|
|
|
|
public TLRPC.ChatFull getCurrentChatInfo() {
|
|
return info;
|
|
}
|
|
|
|
public void sendMedia(MediaController.PhotoEntry photoEntry, VideoEditedInfo videoEditedInfo) {
|
|
if (photoEntry.isVideo) {
|
|
if (videoEditedInfo != null) {
|
|
SendMessagesHelper.prepareSendingVideo(photoEntry.path, videoEditedInfo.estimatedSize, videoEditedInfo.estimatedDuration, videoEditedInfo.resultWidth, videoEditedInfo.resultHeight, videoEditedInfo, dialog_id, replyingMessageObject, photoEntry.caption != null ? photoEntry.caption.toString() : null, photoEntry.ttl);
|
|
} else {
|
|
SendMessagesHelper.prepareSendingVideo(photoEntry.path, 0, 0, 0, 0, null, dialog_id, replyingMessageObject, photoEntry.caption != null ? photoEntry.caption.toString() : null, photoEntry.ttl);
|
|
}
|
|
showReplyPanel(false, null, null, null, false);
|
|
DraftQuery.cleanDraft(dialog_id, true);
|
|
} else {
|
|
if (photoEntry.imagePath != null) {
|
|
SendMessagesHelper.prepareSendingPhoto(photoEntry.imagePath, null, dialog_id, replyingMessageObject, photoEntry.caption, photoEntry.stickers, null, photoEntry.ttl);
|
|
showReplyPanel(false, null, null, null, false);
|
|
DraftQuery.cleanDraft(dialog_id, true);
|
|
} else if (photoEntry.path != null) {
|
|
SendMessagesHelper.prepareSendingPhoto(photoEntry.path, null, dialog_id, replyingMessageObject, photoEntry.caption, photoEntry.stickers, null, photoEntry.ttl);
|
|
showReplyPanel(false, null, null, null, false);
|
|
DraftQuery.cleanDraft(dialog_id, true);
|
|
}
|
|
}
|
|
}
|
|
|
|
public void showOpenGameAlert(final TLRPC.TL_game game, final MessageObject messageObject, final String urlStr, boolean ask, final int uid) {
|
|
TLRPC.User user = MessagesController.getInstance().getUser(uid);
|
|
if (ask) {
|
|
AlertDialog.Builder builder = new AlertDialog.Builder(getParentActivity());
|
|
builder.setTitle(LocaleController.getString("AppName", R.string.AppName));
|
|
String name;
|
|
if (user != null) {
|
|
name = ContactsController.formatName(user.first_name, user.last_name);
|
|
} else {
|
|
name = "";
|
|
}
|
|
builder.setMessage(LocaleController.formatString("BotPermissionGameAlert", R.string.BotPermissionGameAlert, name));
|
|
builder.setPositiveButton(LocaleController.getString("OK", R.string.OK), new DialogInterface.OnClickListener() {
|
|
@Override
|
|
public void onClick(DialogInterface dialogInterface, int i) {
|
|
showOpenGameAlert(game, messageObject, urlStr, false, uid);
|
|
ApplicationLoader.applicationContext.getSharedPreferences("Notifications", Activity.MODE_PRIVATE).edit().putBoolean("askgame_" + uid, false).commit();
|
|
}
|
|
});
|
|
builder.setNegativeButton(LocaleController.getString("Cancel", R.string.Cancel), null);
|
|
showDialog(builder.create());
|
|
} else {
|
|
if (Build.VERSION.SDK_INT >= 21 && !AndroidUtilities.isTablet() && WebviewActivity.supportWebview()) {
|
|
if (parentLayout.fragmentsStack.get(parentLayout.fragmentsStack.size() - 1) == this) {
|
|
presentFragment(new WebviewActivity(urlStr, user != null && !TextUtils.isEmpty(user.username) ? user.username : "", game.title, game.short_name, messageObject));
|
|
}
|
|
} else {
|
|
WebviewActivity.openGameInBrowser(urlStr, messageObject, getParentActivity(), game.short_name, user != null && user.username != null ? user.username : "");
|
|
}
|
|
}
|
|
}
|
|
|
|
public void showOpenUrlAlert(final String url, boolean ask) {
|
|
if (Browser.isInternalUrl(url, null) || !ask) {
|
|
Browser.openUrl(getParentActivity(), url, inlineReturn == 0);
|
|
} else {
|
|
AlertDialog.Builder builder = new AlertDialog.Builder(getParentActivity());
|
|
builder.setTitle(LocaleController.getString("AppName", R.string.AppName));
|
|
builder.setMessage(LocaleController.formatString("OpenUrlAlert", R.string.OpenUrlAlert, url));
|
|
builder.setPositiveButton(LocaleController.getString("Open", R.string.Open), new DialogInterface.OnClickListener() {
|
|
@Override
|
|
public void onClick(DialogInterface dialogInterface, int i) {
|
|
Browser.openUrl(getParentActivity(), url, inlineReturn == 0);
|
|
}
|
|
});
|
|
builder.setNegativeButton(LocaleController.getString("Cancel", R.string.Cancel), null);
|
|
showDialog(builder.create());
|
|
}
|
|
}
|
|
|
|
private void removeMessageObject(MessageObject messageObject) {
|
|
int index = messages.indexOf(messageObject);
|
|
if (index == -1) {
|
|
return;
|
|
}
|
|
messages.remove(index);
|
|
if (chatAdapter != null) {
|
|
chatAdapter.notifyItemRemoved(chatAdapter.messagesStartRow + index);
|
|
}
|
|
}
|
|
|
|
private void setCellSelectionBackground(MessageObject message, ChatMessageCell messageCell, int idx) {
|
|
MessageObject.GroupedMessages groupedMessages = getValidGroupedMessage(message);
|
|
if (groupedMessages != null) {
|
|
boolean hasUnselected = false;
|
|
for (int a = 0; a < groupedMessages.messages.size(); a++) {
|
|
if (!selectedMessagesIds[idx].containsKey(groupedMessages.messages.get(a).getId())) {
|
|
hasUnselected = true;
|
|
break;
|
|
}
|
|
}
|
|
if (!hasUnselected) {
|
|
groupedMessages = null;
|
|
}
|
|
}
|
|
if (groupedMessages == null) {
|
|
messageCell.setBackgroundColor(Theme.getColor(Theme.key_chat_selectedBackground));
|
|
} else {
|
|
messageCell.setBackground(null);
|
|
}
|
|
}
|
|
|
|
public class ChatActivityAdapter extends RecyclerView.Adapter {
|
|
|
|
private Context mContext;
|
|
private boolean isBot;
|
|
private int rowCount;
|
|
private int botInfoRow = -1;
|
|
private int loadingUpRow;
|
|
private int loadingDownRow;
|
|
private int messagesStartRow;
|
|
private int messagesEndRow;
|
|
|
|
public ChatActivityAdapter(Context context) {
|
|
mContext = context;
|
|
isBot = currentUser != null && currentUser.bot;
|
|
}
|
|
|
|
public void updateRows() {
|
|
rowCount = 0;
|
|
if (!messages.isEmpty()) {
|
|
if (!forwardEndReached[0] || mergeDialogId != 0 && !forwardEndReached[1]) {
|
|
loadingDownRow = rowCount++;
|
|
} else {
|
|
loadingDownRow = -1;
|
|
}
|
|
messagesStartRow = rowCount;
|
|
rowCount += messages.size();
|
|
messagesEndRow = rowCount;
|
|
if (!endReached[0] || mergeDialogId != 0 && !endReached[1]) {
|
|
loadingUpRow = rowCount++;
|
|
} else {
|
|
loadingUpRow = -1;
|
|
}
|
|
} else {
|
|
loadingUpRow = -1;
|
|
loadingDownRow = -1;
|
|
messagesStartRow = -1;
|
|
messagesEndRow = -1;
|
|
}
|
|
if (currentUser != null && currentUser.bot) {
|
|
botInfoRow = rowCount++;
|
|
} else {
|
|
botInfoRow = -1;
|
|
}
|
|
}
|
|
|
|
@Override
|
|
public int getItemCount() {
|
|
return rowCount;
|
|
}
|
|
|
|
@Override
|
|
public long getItemId(int i) {
|
|
return RecyclerListView.NO_ID;
|
|
}
|
|
|
|
@Override
|
|
public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
|
|
View view = null;
|
|
if (viewType == 0) {
|
|
if (!chatMessageCellsCache.isEmpty()) {
|
|
view = chatMessageCellsCache.get(0);
|
|
chatMessageCellsCache.remove(0);
|
|
} else {
|
|
view = new ChatMessageCell(mContext);
|
|
}
|
|
ChatMessageCell chatMessageCell = (ChatMessageCell) view;
|
|
chatMessageCell.setDelegate(new ChatMessageCell.ChatMessageCellDelegate() {
|
|
@Override
|
|
public void didPressedShare(ChatMessageCell cell) {
|
|
if (getParentActivity() == null) {
|
|
return;
|
|
}
|
|
if (chatActivityEnterView != null) {
|
|
chatActivityEnterView.closeKeyboard();
|
|
}
|
|
MessageObject messageObject = cell.getMessageObject();
|
|
if (UserObject.isUserSelf(currentUser) && messageObject.messageOwner.fwd_from.saved_from_peer != null) {
|
|
Bundle args = new Bundle();
|
|
if (messageObject.messageOwner.fwd_from.saved_from_peer.channel_id != 0) {
|
|
args.putInt("chat_id", messageObject.messageOwner.fwd_from.saved_from_peer.channel_id);
|
|
} else if (messageObject.messageOwner.fwd_from.saved_from_peer.chat_id != 0) {
|
|
args.putInt("chat_id", messageObject.messageOwner.fwd_from.saved_from_peer.chat_id);
|
|
} else if (messageObject.messageOwner.fwd_from.saved_from_peer.user_id != 0) {
|
|
args.putInt("user_id", messageObject.messageOwner.fwd_from.saved_from_peer.user_id);
|
|
}
|
|
args.putInt("message_id", messageObject.messageOwner.fwd_from.saved_from_msg_id);
|
|
if (MessagesController.checkCanOpenChat(args, ChatActivity.this)) {
|
|
presentFragment(new ChatActivity(args));
|
|
}
|
|
} else {
|
|
ArrayList<MessageObject> arrayList = null;
|
|
if (messageObject.getGroupId() != 0) {
|
|
MessageObject.GroupedMessages groupedMessages = groupedMessagesMap.get(messageObject.getGroupId());
|
|
if (groupedMessages != null) {
|
|
arrayList = groupedMessages.messages;
|
|
}
|
|
}
|
|
if (arrayList == null) {
|
|
arrayList = new ArrayList<>();
|
|
arrayList.add(messageObject);
|
|
}
|
|
showDialog(new ShareAlert(mContext, arrayList, null, ChatObject.isChannel(currentChat) && !currentChat.megagroup && currentChat.username != null && currentChat.username.length() > 0, null, false));
|
|
}
|
|
}
|
|
|
|
@Override
|
|
public boolean needPlayMessage(MessageObject messageObject) {
|
|
if (messageObject.isVoice() || messageObject.isRoundVideo()) {
|
|
boolean result = MediaController.getInstance().playMessage(messageObject);
|
|
MediaController.getInstance().setVoiceMessagesPlaylist(result ? createVoiceMessagesPlaylist(messageObject, false) : null, false);
|
|
return result;
|
|
} else if (messageObject.isMusic()) {
|
|
return MediaController.getInstance().setPlaylist(messages, messageObject);
|
|
}
|
|
return false;
|
|
}
|
|
|
|
@Override
|
|
public void didPressedChannelAvatar(ChatMessageCell cell, TLRPC.Chat chat, int postId) {
|
|
if (actionBar.isActionModeShowed()) {
|
|
processRowSelect(cell, true);
|
|
return;
|
|
}
|
|
if (chat != null && chat != currentChat) {
|
|
Bundle args = new Bundle();
|
|
args.putInt("chat_id", chat.id);
|
|
if (postId != 0) {
|
|
args.putInt("message_id", postId);
|
|
}
|
|
if (MessagesController.checkCanOpenChat(args, ChatActivity.this, cell.getMessageObject())) {
|
|
presentFragment(new ChatActivity(args), true);
|
|
}
|
|
}
|
|
}
|
|
|
|
@Override
|
|
public void didPressedOther(ChatMessageCell cell) {
|
|
if (cell.getMessageObject().type == 16) {
|
|
if (currentUser != null) {
|
|
VoIPHelper.startCall(currentUser, getParentActivity(), MessagesController.getInstance().getUserFull(currentUser.id));
|
|
}
|
|
} else {
|
|
createMenu(cell, true, false, false);
|
|
}
|
|
}
|
|
|
|
@Override
|
|
public void didPressedUserAvatar(ChatMessageCell cell, TLRPC.User user) {
|
|
if (actionBar.isActionModeShowed()) {
|
|
processRowSelect(cell, true);
|
|
return;
|
|
}
|
|
if (user != null && user.id != UserConfig.getClientUserId()) {
|
|
Bundle args = new Bundle();
|
|
args.putInt("user_id", user.id);
|
|
ProfileActivity fragment = new ProfileActivity(args);
|
|
fragment.setPlayProfileAnimation(currentUser != null && currentUser.id == user.id);
|
|
presentFragment(fragment);
|
|
}
|
|
}
|
|
|
|
@Override
|
|
public void didPressedBotButton(ChatMessageCell cell, TLRPC.KeyboardButton button) {
|
|
if (getParentActivity() == null || bottomOverlayChat.getVisibility() == View.VISIBLE &&
|
|
!(button instanceof TLRPC.TL_keyboardButtonSwitchInline) && !(button instanceof TLRPC.TL_keyboardButtonCallback) &&
|
|
!(button instanceof TLRPC.TL_keyboardButtonGame) && !(button instanceof TLRPC.TL_keyboardButtonUrl) &&
|
|
!(button instanceof TLRPC.TL_keyboardButtonBuy)) {
|
|
return;
|
|
}
|
|
chatActivityEnterView.didPressedBotButton(button, cell.getMessageObject(), cell.getMessageObject());
|
|
}
|
|
|
|
@Override
|
|
public void didPressedCancelSendButton(ChatMessageCell cell) {
|
|
MessageObject message = cell.getMessageObject();
|
|
if (message.messageOwner.send_state != 0) {
|
|
SendMessagesHelper.getInstance().cancelSendingMessage(message);
|
|
}
|
|
}
|
|
|
|
@Override
|
|
public void didLongPressed(ChatMessageCell cell) {
|
|
createMenu(cell, false, false);
|
|
}
|
|
|
|
@Override
|
|
public boolean canPerformActions() {
|
|
return actionBar != null && !actionBar.isActionModeShowed();
|
|
}
|
|
|
|
@Override
|
|
public void didPressedUrl(MessageObject messageObject, final CharacterStyle url, boolean longPress) {
|
|
if (url == null) {
|
|
return;
|
|
}
|
|
if (url instanceof URLSpanMono) {
|
|
((URLSpanMono) url).copyToClipboard();
|
|
Toast.makeText(getParentActivity(), LocaleController.getString("TextCopied", R.string.TextCopied), Toast.LENGTH_SHORT).show();
|
|
} else if (url instanceof URLSpanUserMention) {
|
|
TLRPC.User user = MessagesController.getInstance().getUser(Utilities.parseInt(((URLSpanUserMention) url).getURL()));
|
|
if (user != null) {
|
|
MessagesController.openChatOrProfileWith(user, null, ChatActivity.this, 0, false);
|
|
}
|
|
} else if (url instanceof URLSpanNoUnderline) {
|
|
String str = ((URLSpanNoUnderline) url).getURL();
|
|
if (str.startsWith("@")) {
|
|
MessagesController.openByUserName(str.substring(1), ChatActivity.this, 0);
|
|
} else if (str.startsWith("#")) {
|
|
if (ChatObject.isChannel(currentChat)) {
|
|
openSearchWithText(str);
|
|
} else {
|
|
DialogsActivity fragment = new DialogsActivity(null);
|
|
fragment.setSearchString(str);
|
|
presentFragment(fragment);
|
|
}
|
|
} else if (str.startsWith("/")) {
|
|
if (URLSpanBotCommand.enabled) {
|
|
chatActivityEnterView.setCommand(messageObject, str, longPress, currentChat != null && currentChat.megagroup);
|
|
if (!longPress && chatActivityEnterView.getFieldText() == null) {
|
|
showReplyPanel(false, null, null, null, false);
|
|
}
|
|
}
|
|
}
|
|
} else {
|
|
final String urlFinal = ((URLSpan) url).getURL();
|
|
if (longPress) {
|
|
BottomSheet.Builder builder = new BottomSheet.Builder(getParentActivity());
|
|
builder.setTitle(urlFinal);
|
|
builder.setItems(new CharSequence[]{LocaleController.getString("Open", R.string.Open), LocaleController.getString("Copy", R.string.Copy)}, new DialogInterface.OnClickListener() {
|
|
@Override
|
|
public void onClick(DialogInterface dialog, final int which) {
|
|
if (which == 0) {
|
|
Browser.openUrl(getParentActivity(), urlFinal, inlineReturn == 0);
|
|
} else if (which == 1) {
|
|
String url = urlFinal;
|
|
if (url.startsWith("mailto:")) {
|
|
url = url.substring(7);
|
|
} else if (url.startsWith("tel:")) {
|
|
url = url.substring(4);
|
|
}
|
|
AndroidUtilities.addToClipboard(url);
|
|
}
|
|
}
|
|
});
|
|
showDialog(builder.create());
|
|
} else {
|
|
if (url instanceof URLSpanReplacement) {
|
|
showOpenUrlAlert(((URLSpanReplacement) url).getURL(), true);
|
|
} else if (url instanceof URLSpan) {
|
|
if (messageObject.messageOwner.media instanceof TLRPC.TL_messageMediaWebPage && messageObject.messageOwner.media.webpage != null && messageObject.messageOwner.media.webpage.cached_page != null) {
|
|
String lowerUrl = urlFinal.toLowerCase();
|
|
String lowerUrl2 = messageObject.messageOwner.media.webpage.url.toLowerCase();
|
|
if ((lowerUrl.contains("telegra.ph") || lowerUrl.contains("t.me/iv")) && (lowerUrl.contains(lowerUrl2) || lowerUrl2.contains(lowerUrl))) {
|
|
ArticleViewer.getInstance().setParentActivity(getParentActivity(), ChatActivity.this);
|
|
ArticleViewer.getInstance().open(messageObject);
|
|
return;
|
|
}
|
|
}
|
|
Browser.openUrl(getParentActivity(), urlFinal, inlineReturn == 0);
|
|
} else if (url instanceof ClickableSpan) {
|
|
((ClickableSpan) url).onClick(fragmentView);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
@Override
|
|
public void needOpenWebView(String url, String title, String description, String originalUrl, int w, int h) {
|
|
EmbedBottomSheet.show(mContext, title, description, originalUrl, url, w, h);
|
|
}
|
|
|
|
@Override
|
|
public void didPressedReplyMessage(ChatMessageCell cell, int id) {
|
|
MessageObject messageObject = cell.getMessageObject();
|
|
scrollToMessageId(id, messageObject.getId(), true, messageObject.getDialogId() == mergeDialogId ? 1 : 0, false);
|
|
}
|
|
|
|
@Override
|
|
public void didPressedViaBot(ChatMessageCell cell, String username) {
|
|
if (bottomOverlayChat != null && bottomOverlayChat.getVisibility() == View.VISIBLE || bottomOverlay != null && bottomOverlay.getVisibility() == View.VISIBLE) {
|
|
return;
|
|
}
|
|
if (chatActivityEnterView != null && username != null && username.length() > 0) {
|
|
chatActivityEnterView.setFieldText("@" + username + " ");
|
|
chatActivityEnterView.openKeyboard();
|
|
}
|
|
}
|
|
|
|
@Override
|
|
public void didPressedImage(ChatMessageCell cell) {
|
|
MessageObject message = cell.getMessageObject();
|
|
if (message.isSendError()) {
|
|
createMenu(cell, false, false);
|
|
return;
|
|
} else if (message.isSending()) {
|
|
return;
|
|
}
|
|
if (message.isSecretPhoto()) {
|
|
if (sendSecretMessageRead(message)) {
|
|
cell.invalidate();
|
|
}
|
|
SecretMediaViewer.getInstance().setParentActivity(getParentActivity());
|
|
SecretMediaViewer.getInstance().openMedia(message, photoViewerProvider);
|
|
} else if (message.type == 13) {
|
|
showDialog(new StickersAlert(getParentActivity(), ChatActivity.this, message.getInputStickerSet(), null, bottomOverlayChat.getVisibility() != View.VISIBLE && ChatObject.canSendStickers(currentChat) ? chatActivityEnterView : null));
|
|
} else if (message.isVideo() || message.type == 1 || message.type == 0 && !message.isWebpageDocument() || message.isGif()) {
|
|
if (message.isVideo()) {
|
|
sendSecretMessageRead(message);
|
|
}
|
|
PhotoViewer.getInstance().setParentActivity(getParentActivity());
|
|
if (PhotoViewer.getInstance().openPhoto(message, message.type != 0 ? dialog_id : 0, message.type != 0 ? mergeDialogId : 0, photoViewerProvider)) {
|
|
PhotoViewer.getInstance().setParentChatActivity(ChatActivity.this);
|
|
}
|
|
} else if (message.type == 3) {
|
|
sendSecretMessageRead(message);
|
|
try {
|
|
File f = null;
|
|
if (message.messageOwner.attachPath != null && message.messageOwner.attachPath.length() != 0) {
|
|
f = new File(message.messageOwner.attachPath);
|
|
}
|
|
if (f == null || !f.exists()) {
|
|
f = FileLoader.getPathToMessage(message.messageOwner);
|
|
}
|
|
Intent intent = new Intent(Intent.ACTION_VIEW);
|
|
if (Build.VERSION.SDK_INT >= 24) {
|
|
intent.setFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
|
|
intent.setDataAndType(FileProvider.getUriForFile(getParentActivity(), BuildConfig.APPLICATION_ID + ".provider", f), "video/mp4");
|
|
} else {
|
|
intent.setDataAndType(Uri.fromFile(f), "video/mp4");
|
|
}
|
|
getParentActivity().startActivityForResult(intent, 500);
|
|
} catch (Exception e) {
|
|
FileLog.e(e);
|
|
alertUserOpenError(message);
|
|
}
|
|
} else if (message.type == 4) {
|
|
if (!AndroidUtilities.isGoogleMapsInstalled(ChatActivity.this)) {
|
|
return;
|
|
}
|
|
if (message.isLiveLocation()) {
|
|
LocationActivity fragment = new LocationActivity(2);
|
|
fragment.setMessageObject(message);
|
|
fragment.setDelegate(ChatActivity.this);
|
|
presentFragment(fragment);
|
|
} else {
|
|
LocationActivity fragment = new LocationActivity(currentEncryptedChat == null ? 3 : 0);
|
|
fragment.setMessageObject(message);
|
|
fragment.setDelegate(ChatActivity.this);
|
|
presentFragment(fragment);
|
|
}
|
|
} else if (message.type == 9 || message.type == 0) {
|
|
if (message.getDocumentName().endsWith("attheme")) {
|
|
File locFile = null;
|
|
if (message.messageOwner.attachPath != null && message.messageOwner.attachPath.length() != 0) {
|
|
File f = new File(message.messageOwner.attachPath);
|
|
if (f.exists()) {
|
|
locFile = f;
|
|
}
|
|
}
|
|
if (locFile == null) {
|
|
File f = FileLoader.getPathToMessage(message.messageOwner);
|
|
if (f.exists()) {
|
|
locFile = f;
|
|
}
|
|
}
|
|
if (chatLayoutManager != null) {
|
|
int lastPosition = chatLayoutManager.findFirstVisibleItemPosition();
|
|
if (lastPosition != 0) {
|
|
scrollToPositionOnRecreate = lastPosition;
|
|
RecyclerListView.Holder holder = (RecyclerListView.Holder) chatListView.findViewHolderForAdapterPosition(scrollToPositionOnRecreate);
|
|
if (holder != null) {
|
|
scrollToOffsetOnRecreate = chatListView.getMeasuredHeight() - holder.itemView.getBottom() - chatListView.getPaddingBottom();
|
|
} else {
|
|
scrollToPositionOnRecreate = -1;
|
|
}
|
|
} else {
|
|
scrollToPositionOnRecreate = -1;
|
|
}
|
|
}
|
|
Theme.ThemeInfo themeInfo = Theme.applyThemeFile(locFile, message.getDocumentName(), true);
|
|
if (themeInfo != null) {
|
|
presentFragment(new ThemePreviewActivity(locFile, themeInfo));
|
|
return;
|
|
} else {
|
|
scrollToPositionOnRecreate = -1;
|
|
}
|
|
}
|
|
try {
|
|
AndroidUtilities.openForView(message, getParentActivity());
|
|
} catch (Exception e) {
|
|
FileLog.e(e);
|
|
alertUserOpenError(message);
|
|
}
|
|
}
|
|
}
|
|
|
|
@Override
|
|
public void didPressedInstantButton(ChatMessageCell cell, int type) {
|
|
MessageObject messageObject = cell.getMessageObject();
|
|
if (type == 0) {
|
|
if (messageObject.messageOwner.media != null && messageObject.messageOwner.media.webpage != null && messageObject.messageOwner.media.webpage.cached_page != null) {
|
|
ArticleViewer.getInstance().setParentActivity(getParentActivity(), ChatActivity.this);
|
|
ArticleViewer.getInstance().open(messageObject);
|
|
}
|
|
} else {
|
|
if (messageObject.messageOwner.media != null && messageObject.messageOwner.media.webpage != null) {
|
|
Browser.openUrl(getParentActivity(), messageObject.messageOwner.media.webpage.url);
|
|
}
|
|
}
|
|
}
|
|
|
|
@Override
|
|
public boolean isChatAdminCell(int uid) {
|
|
if (ChatObject.isChannel(currentChat) && currentChat.megagroup) {
|
|
return MessagesController.getInstance().isChannelAdmin(currentChat.id, uid);
|
|
}
|
|
return false;
|
|
}
|
|
});
|
|
if (currentEncryptedChat == null) {
|
|
chatMessageCell.setAllowAssistant(true);
|
|
}
|
|
} else if (viewType == 1) {
|
|
view = new ChatActionCell(mContext);
|
|
((ChatActionCell) view).setDelegate(new ChatActionCell.ChatActionCellDelegate() {
|
|
@Override
|
|
public void didClickedImage(ChatActionCell cell) {
|
|
MessageObject message = cell.getMessageObject();
|
|
PhotoViewer.getInstance().setParentActivity(getParentActivity());
|
|
TLRPC.PhotoSize photoSize = FileLoader.getClosestPhotoSizeWithSize(message.photoThumbs, 640);
|
|
if (photoSize != null) {
|
|
PhotoViewer.getInstance().openPhoto(photoSize.location, photoViewerProvider);
|
|
} else {
|
|
PhotoViewer.getInstance().openPhoto(message, 0, 0, photoViewerProvider);
|
|
}
|
|
}
|
|
|
|
@Override
|
|
public void didLongPressed(ChatActionCell cell) {
|
|
createMenu(cell, false, false);
|
|
}
|
|
|
|
@Override
|
|
public void needOpenUserProfile(int uid) {
|
|
if (uid < 0) {
|
|
Bundle args = new Bundle();
|
|
args.putInt("chat_id", -uid);
|
|
if (MessagesController.checkCanOpenChat(args, ChatActivity.this)) {
|
|
presentFragment(new ChatActivity(args), true);
|
|
}
|
|
} else if (uid != UserConfig.getClientUserId()) {
|
|
Bundle args = new Bundle();
|
|
args.putInt("user_id", uid);
|
|
if (currentEncryptedChat != null && uid == currentUser.id) {
|
|
args.putLong("dialog_id", dialog_id);
|
|
}
|
|
ProfileActivity fragment = new ProfileActivity(args);
|
|
fragment.setPlayProfileAnimation(currentUser != null && currentUser.id == uid);
|
|
presentFragment(fragment);
|
|
}
|
|
}
|
|
|
|
@Override
|
|
public void didPressedReplyMessage(ChatActionCell cell, int id) {
|
|
MessageObject messageObject = cell.getMessageObject();
|
|
scrollToMessageId(id, messageObject.getId(), true, messageObject.getDialogId() == mergeDialogId ? 1 : 0, false);
|
|
}
|
|
|
|
@Override
|
|
public void didPressedBotButton(MessageObject messageObject, TLRPC.KeyboardButton button) {
|
|
if (getParentActivity() == null || bottomOverlayChat.getVisibility() == View.VISIBLE &&
|
|
!(button instanceof TLRPC.TL_keyboardButtonSwitchInline) && !(button instanceof TLRPC.TL_keyboardButtonCallback) &&
|
|
!(button instanceof TLRPC.TL_keyboardButtonGame) && !(button instanceof TLRPC.TL_keyboardButtonUrl) &&
|
|
!(button instanceof TLRPC.TL_keyboardButtonBuy)) {
|
|
return;
|
|
}
|
|
chatActivityEnterView.didPressedBotButton(button, messageObject, messageObject);
|
|
}
|
|
});
|
|
} else if (viewType == 2) {
|
|
view = new ChatUnreadCell(mContext);
|
|
} else if (viewType == 3) {
|
|
view = new BotHelpCell(mContext);
|
|
((BotHelpCell) view).setDelegate(new BotHelpCell.BotHelpCellDelegate() {
|
|
@Override
|
|
public void didPressUrl(String url) {
|
|
if (url.startsWith("@")) {
|
|
MessagesController.openByUserName(url.substring(1), ChatActivity.this, 0);
|
|
} else if (url.startsWith("#")) {
|
|
DialogsActivity fragment = new DialogsActivity(null);
|
|
fragment.setSearchString(url);
|
|
presentFragment(fragment);
|
|
} else if (url.startsWith("/")) {
|
|
chatActivityEnterView.setCommand(null, url, false, false);
|
|
if (chatActivityEnterView.getFieldText() == null) {
|
|
showReplyPanel(false, null, null, null, false);
|
|
}
|
|
}
|
|
}
|
|
});
|
|
} else if (viewType == 4) {
|
|
view = new ChatLoadingCell(mContext);
|
|
}
|
|
view.setLayoutParams(new RecyclerView.LayoutParams(RecyclerView.LayoutParams.MATCH_PARENT, RecyclerView.LayoutParams.WRAP_CONTENT));
|
|
return new RecyclerListView.Holder(view);
|
|
}
|
|
|
|
@Override
|
|
public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) {
|
|
if (position == botInfoRow) {
|
|
BotHelpCell helpView = (BotHelpCell) holder.itemView;
|
|
helpView.setText(!botInfo.isEmpty() ? botInfo.get(currentUser.id).description : null);
|
|
} else if (position == loadingDownRow || position == loadingUpRow) {
|
|
ChatLoadingCell loadingCell = (ChatLoadingCell) holder.itemView;
|
|
loadingCell.setProgressVisible(loadsCount > 1);
|
|
} else if (position >= messagesStartRow && position < messagesEndRow) {
|
|
MessageObject message = messages.get(position - messagesStartRow);
|
|
View view = holder.itemView;
|
|
|
|
if (view instanceof ChatMessageCell) {
|
|
final ChatMessageCell messageCell = (ChatMessageCell) view;
|
|
messageCell.isChat = currentChat != null || UserObject.isUserSelf(currentUser);
|
|
boolean pinnedBottom = false;
|
|
boolean pinnedTop = false;
|
|
MessageObject.GroupedMessages groupedMessages = getValidGroupedMessage(message);
|
|
|
|
int prevPosition;
|
|
int nextPosition;
|
|
if (groupedMessages != null) {
|
|
MessageObject.GroupedMessagePosition pos = groupedMessages.positions.get(message);
|
|
if (pos != null) {
|
|
if ((pos.flags & MessageObject.POSITION_FLAG_TOP) != 0) {
|
|
prevPosition = position + groupedMessages.posArray.indexOf(pos) + 1;
|
|
} else {
|
|
pinnedTop = true;
|
|
prevPosition = -100;
|
|
}
|
|
if ((pos.flags & MessageObject.POSITION_FLAG_BOTTOM) != 0) {
|
|
nextPosition = position - groupedMessages.posArray.size() + groupedMessages.posArray.indexOf(pos);
|
|
} else {
|
|
pinnedBottom = true;
|
|
nextPosition = -100;
|
|
}
|
|
} else {
|
|
prevPosition = -100;
|
|
nextPosition = -100;
|
|
}
|
|
} else {
|
|
nextPosition = position - 1;
|
|
prevPosition = position + 1;
|
|
}
|
|
int nextType = getItemViewType(nextPosition);
|
|
int prevType = getItemViewType(prevPosition);
|
|
if (!(message.messageOwner.reply_markup instanceof TLRPC.TL_replyInlineMarkup) && nextType == holder.getItemViewType()) {
|
|
MessageObject nextMessage = messages.get(nextPosition - messagesStartRow);
|
|
pinnedBottom = nextMessage.isOutOwner() == message.isOutOwner() && Math.abs(nextMessage.messageOwner.date - message.messageOwner.date) <= 5 * 60;
|
|
if (pinnedBottom) {
|
|
if (currentChat != null) {
|
|
pinnedBottom = nextMessage.messageOwner.from_id == message.messageOwner.from_id;
|
|
} else if (UserObject.isUserSelf(currentUser)) {
|
|
pinnedBottom = nextMessage.getFromId() == message.getFromId();
|
|
}
|
|
}
|
|
}
|
|
if (prevType == holder.getItemViewType()) {
|
|
MessageObject prevMessage = messages.get(prevPosition - messagesStartRow);
|
|
pinnedTop = !(prevMessage.messageOwner.reply_markup instanceof TLRPC.TL_replyInlineMarkup) && prevMessage.isOutOwner() == message.isOutOwner() && Math.abs(prevMessage.messageOwner.date - message.messageOwner.date) <= 5 * 60;
|
|
if (pinnedTop) {
|
|
if (currentChat != null) {
|
|
pinnedTop = prevMessage.messageOwner.from_id == message.messageOwner.from_id;
|
|
} else if (UserObject.isUserSelf(currentUser)) {
|
|
pinnedTop = prevMessage.getFromId() == message.getFromId();
|
|
}
|
|
}
|
|
}
|
|
|
|
messageCell.setMessageObject(message, groupedMessages, pinnedBottom, pinnedTop);
|
|
if (view instanceof ChatMessageCell && MediaController.getInstance().canDownloadMedia(message)) {
|
|
((ChatMessageCell) view).downloadAudioIfNeed();
|
|
}
|
|
messageCell.setHighlighted(highlightMessageId != Integer.MAX_VALUE && message.getId() == highlightMessageId);
|
|
if (searchContainer != null && searchContainer.getVisibility() == View.VISIBLE && MessagesSearchQuery.isMessageFound(message.getId(), message.getDialogId() == mergeDialogId) && MessagesSearchQuery.getLastSearchQuery() != null) {
|
|
messageCell.setHighlightedText(MessagesSearchQuery.getLastSearchQuery());
|
|
} else {
|
|
messageCell.setHighlightedText(null);
|
|
}
|
|
int index;
|
|
if ((index = animatingMessageObjects.indexOf(message)) != -1) {
|
|
animatingMessageObjects.remove(index);
|
|
messageCell.getViewTreeObserver().addOnPreDrawListener(new ViewTreeObserver.OnPreDrawListener() {
|
|
@Override
|
|
public boolean onPreDraw() {
|
|
PipRoundVideoView pipRoundVideoView = PipRoundVideoView.getInstance();
|
|
if (pipRoundVideoView != null) {
|
|
pipRoundVideoView.showTemporary(true);
|
|
}
|
|
|
|
messageCell.getViewTreeObserver().removeOnPreDrawListener(this);
|
|
ImageReceiver imageReceiver = messageCell.getPhotoImage();
|
|
int w = imageReceiver.getImageWidth();
|
|
org.telegram.ui.Components.Rect rect = instantCameraView.getCameraRect();
|
|
float scale = w / rect.width;
|
|
int position[] = new int[2];
|
|
messageCell.setAlpha(0.0f);
|
|
messageCell.getLocationOnScreen(position);
|
|
position[0] += imageReceiver.getImageX();
|
|
position[1] += imageReceiver.getImageY();
|
|
final View cameraContainer = instantCameraView.getCameraContainer();
|
|
cameraContainer.setPivotX(0.0f);
|
|
cameraContainer.setPivotY(0.0f);
|
|
AnimatorSet animatorSet = new AnimatorSet();
|
|
animatorSet.playTogether(
|
|
ObjectAnimator.ofFloat(instantCameraView, "alpha", 0.0f),
|
|
ObjectAnimator.ofFloat(cameraContainer, "scaleX", scale),
|
|
ObjectAnimator.ofFloat(cameraContainer, "scaleY", scale),
|
|
ObjectAnimator.ofFloat(cameraContainer, "translationX", position[0] - rect.x),
|
|
ObjectAnimator.ofFloat(cameraContainer, "translationY", position[1] - rect.y),
|
|
ObjectAnimator.ofFloat(instantCameraView.getSwitchButtonView(), "alpha", 0.0f),
|
|
ObjectAnimator.ofInt(instantCameraView.getPaint(), "alpha", 0),
|
|
ObjectAnimator.ofFloat(instantCameraView.getMuteImageView(), "alpha", 0.0f));
|
|
animatorSet.setDuration(180);
|
|
animatorSet.setInterpolator(new DecelerateInterpolator());
|
|
animatorSet.addListener(new AnimatorListenerAdapter() {
|
|
@Override
|
|
public void onAnimationEnd(Animator animation) {
|
|
//messageCell.setAlpha(1.0f);
|
|
AnimatorSet animatorSet = new AnimatorSet();
|
|
animatorSet.playTogether(
|
|
ObjectAnimator.ofFloat(cameraContainer, "alpha", 0.0f),
|
|
ObjectAnimator.ofFloat(messageCell, "alpha", 1.0f)
|
|
);
|
|
animatorSet.setDuration(100);
|
|
animatorSet.setInterpolator(new DecelerateInterpolator());
|
|
animatorSet.addListener(new AnimatorListenerAdapter() {
|
|
@Override
|
|
public void onAnimationEnd(Animator animation) {
|
|
instantCameraView.hideCamera(true);
|
|
instantCameraView.setVisibility(View.INVISIBLE);
|
|
}
|
|
});
|
|
animatorSet.start();
|
|
}
|
|
});
|
|
animatorSet.start();
|
|
return true;
|
|
}
|
|
});
|
|
}
|
|
} else if (view instanceof ChatActionCell) {
|
|
ChatActionCell actionCell = (ChatActionCell) view;
|
|
actionCell.setMessageObject(message);
|
|
actionCell.setAlpha(1.0f);
|
|
} else if (view instanceof ChatUnreadCell) {
|
|
ChatUnreadCell unreadCell = (ChatUnreadCell) view;
|
|
unreadCell.setText(LocaleController.formatPluralString("NewMessages", unread_to_load));
|
|
if (createUnreadMessageAfterId != 0) {
|
|
createUnreadMessageAfterId = 0;
|
|
}
|
|
}
|
|
if (message != null && message.messageOwner != null && message.messageOwner.media_unread && message.messageOwner.mentioned) {
|
|
if (!message.isVoice() && !message.isRoundVideo()) {
|
|
newMentionsCount--;
|
|
if (newMentionsCount <= 0) {
|
|
newMentionsCount = 0;
|
|
hasAllMentionsLocal = true;
|
|
showMentiondownButton(false, true);
|
|
} else {
|
|
mentiondownButtonCounter.setText(String.format("%d", newMentionsCount));
|
|
}
|
|
MessagesController.getInstance().markMentionMessageAsRead(message.getId(), ChatObject.isChannel(currentChat) ? currentChat.id : 0, dialog_id);
|
|
message.setContentIsRead();
|
|
}
|
|
if (view instanceof ChatMessageCell) {
|
|
((ChatMessageCell) view).setHighlightedAnimated();
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
@Override
|
|
public int getItemViewType(int position) {
|
|
if (position >= messagesStartRow && position < messagesEndRow) {
|
|
return messages.get(position - messagesStartRow).contentType;
|
|
} else if (position == botInfoRow) {
|
|
return 3;
|
|
}
|
|
return 4;
|
|
}
|
|
|
|
@Override
|
|
public void onViewAttachedToWindow(RecyclerView.ViewHolder holder) {
|
|
if (holder.itemView instanceof ChatMessageCell) {
|
|
final ChatMessageCell messageCell = (ChatMessageCell) holder.itemView;
|
|
MessageObject message = messageCell.getMessageObject();
|
|
|
|
boolean selected = false;
|
|
boolean disableSelection = false;
|
|
if (actionBar.isActionModeShowed()) {
|
|
MessageObject messageObject = chatActivityEnterView != null ? chatActivityEnterView.getEditingMessageObject() : null;
|
|
int idx = message.getDialogId() == dialog_id ? 0 : 1;
|
|
if (messageObject == message || selectedMessagesIds[idx].containsKey(message.getId())) {
|
|
setCellSelectionBackground(message, messageCell, idx);
|
|
selected = true;
|
|
} else {
|
|
messageCell.setBackgroundDrawable(null);
|
|
}
|
|
disableSelection = true;
|
|
} else {
|
|
messageCell.setBackgroundDrawable(null);
|
|
}
|
|
messageCell.setCheckPressed(!disableSelection, disableSelection && selected);
|
|
|
|
messageCell.getViewTreeObserver().addOnPreDrawListener(new ViewTreeObserver.OnPreDrawListener() {
|
|
@Override
|
|
public boolean onPreDraw() {
|
|
messageCell.getViewTreeObserver().removeOnPreDrawListener(this);
|
|
|
|
int height = chatListView.getMeasuredHeight();
|
|
int top = messageCell.getTop();
|
|
int bottom = messageCell.getBottom();
|
|
int viewTop = top >= 0 ? 0 : -top;
|
|
int viewBottom = messageCell.getMeasuredHeight();
|
|
if (viewBottom > height) {
|
|
viewBottom = viewTop + height;
|
|
}
|
|
messageCell.setVisiblePart(viewTop, viewBottom - viewTop);
|
|
|
|
return true;
|
|
}
|
|
});
|
|
messageCell.setHighlighted(highlightMessageId != Integer.MAX_VALUE && messageCell.getMessageObject().getId() == highlightMessageId);
|
|
}
|
|
}
|
|
|
|
public void updateRowWithMessageObject(MessageObject messageObject) {
|
|
int index = messages.indexOf(messageObject);
|
|
if (index == -1) {
|
|
return;
|
|
}
|
|
notifyItemChanged(index + messagesStartRow);
|
|
}
|
|
|
|
@Override
|
|
public void notifyDataSetChanged() {
|
|
updateRows();
|
|
try {
|
|
super.notifyDataSetChanged();
|
|
} catch (Exception e) {
|
|
FileLog.e(e);
|
|
}
|
|
}
|
|
|
|
@Override
|
|
public void notifyItemChanged(int position) {
|
|
try {
|
|
super.notifyItemChanged(position);
|
|
} catch (Exception e) {
|
|
FileLog.e(e);
|
|
}
|
|
}
|
|
|
|
@Override
|
|
public void notifyItemRangeChanged(int positionStart, int itemCount) {
|
|
try {
|
|
super.notifyItemRangeChanged(positionStart, itemCount);
|
|
} catch (Exception e) {
|
|
FileLog.e(e);
|
|
}
|
|
}
|
|
|
|
@Override
|
|
public void notifyItemInserted(int position) {
|
|
updateRows();
|
|
try {
|
|
super.notifyItemInserted(position);
|
|
} catch (Exception e) {
|
|
FileLog.e(e);
|
|
}
|
|
}
|
|
|
|
@Override
|
|
public void notifyItemMoved(int fromPosition, int toPosition) {
|
|
updateRows();
|
|
try {
|
|
super.notifyItemMoved(fromPosition, toPosition);
|
|
} catch (Exception e) {
|
|
FileLog.e(e);
|
|
}
|
|
}
|
|
|
|
@Override
|
|
public void notifyItemRangeInserted(int positionStart, int itemCount) {
|
|
updateRows();
|
|
try {
|
|
super.notifyItemRangeInserted(positionStart, itemCount);
|
|
} catch (Exception e) {
|
|
FileLog.e(e);
|
|
}
|
|
}
|
|
|
|
@Override
|
|
public void notifyItemRemoved(int position) {
|
|
updateRows();
|
|
try {
|
|
super.notifyItemRemoved(position);
|
|
} catch (Exception e) {
|
|
FileLog.e(e);
|
|
}
|
|
}
|
|
|
|
@Override
|
|
public void notifyItemRangeRemoved(int positionStart, int itemCount) {
|
|
updateRows();
|
|
try {
|
|
super.notifyItemRangeRemoved(positionStart, itemCount);
|
|
} catch (Exception e) {
|
|
FileLog.e(e);
|
|
}
|
|
}
|
|
}
|
|
|
|
@Override
|
|
public ThemeDescription[] getThemeDescriptions() {
|
|
ThemeDescription.ThemeDescriptionDelegate selectedBackgroundDelegate = new ThemeDescription.ThemeDescriptionDelegate() {
|
|
@Override
|
|
public void didSetColor(int color) {
|
|
updateVisibleRows();
|
|
}
|
|
};
|
|
return new ThemeDescription[]{
|
|
new ThemeDescription(fragmentView, 0, null, null, null, null, Theme.key_chat_wallpaper),
|
|
|
|
new ThemeDescription(actionBar, ThemeDescription.FLAG_BACKGROUND, null, null, null, null, Theme.key_actionBarDefault),
|
|
new ThemeDescription(chatListView, ThemeDescription.FLAG_LISTGLOWCOLOR, null, null, null, null, Theme.key_actionBarDefault),
|
|
new ThemeDescription(actionBar, ThemeDescription.FLAG_AB_ITEMSCOLOR, null, null, null, null, Theme.key_actionBarDefaultIcon),
|
|
new ThemeDescription(actionBar, ThemeDescription.FLAG_AB_SELECTORCOLOR, null, null, null, null, Theme.key_actionBarDefaultSelector),
|
|
new ThemeDescription(actionBar, ThemeDescription.FLAG_AB_SUBMENUBACKGROUND, null, null, null, null, Theme.key_actionBarDefaultSubmenuBackground),
|
|
new ThemeDescription(actionBar, ThemeDescription.FLAG_AB_SUBMENUITEM, null, null, null, null, Theme.key_actionBarDefaultSubmenuItem),
|
|
|
|
new ThemeDescription(actionBar, ThemeDescription.FLAG_BACKGROUND, null, null, null, null, Theme.key_actionBarDefault),
|
|
new ThemeDescription(chatListView, ThemeDescription.FLAG_LISTGLOWCOLOR, null, null, null, null, Theme.key_actionBarDefault),
|
|
new ThemeDescription(actionBar, ThemeDescription.FLAG_AB_ITEMSCOLOR, null, null, null, null, Theme.key_actionBarDefaultIcon),
|
|
new ThemeDescription(avatarContainer.getTitleTextView(), ThemeDescription.FLAG_TEXTCOLOR, null, null, null, null, Theme.key_actionBarDefaultTitle),
|
|
new ThemeDescription(avatarContainer.getSubtitleTextView(), ThemeDescription.FLAG_TEXTCOLOR, null, new Paint[]{Theme.chat_statusPaint, Theme.chat_statusRecordPaint}, null, null, Theme.key_actionBarDefaultSubtitle, null),
|
|
new ThemeDescription(actionBar, ThemeDescription.FLAG_AB_SELECTORCOLOR, null, null, null, null, Theme.key_actionBarDefaultSelector),
|
|
new ThemeDescription(actionBar, ThemeDescription.FLAG_AB_SEARCH, null, null, null, null, Theme.key_actionBarDefaultSearch),
|
|
new ThemeDescription(actionBar, ThemeDescription.FLAG_AB_SEARCHPLACEHOLDER, null, null, null, null, Theme.key_actionBarDefaultSearchPlaceholder),
|
|
|
|
new ThemeDescription(actionBar, ThemeDescription.FLAG_AB_AM_ITEMSCOLOR, null, null, null, null, Theme.key_actionBarActionModeDefaultIcon),
|
|
new ThemeDescription(actionBar, ThemeDescription.FLAG_AB_AM_BACKGROUND, null, null, null, null, Theme.key_actionBarActionModeDefault),
|
|
new ThemeDescription(actionBar, ThemeDescription.FLAG_AB_AM_TOPBACKGROUND, null, null, null, null, Theme.key_actionBarActionModeDefaultTop),
|
|
new ThemeDescription(actionBar, ThemeDescription.FLAG_AB_AM_SELECTORCOLOR, null, null, null, null, Theme.key_actionBarActionModeDefaultSelector),
|
|
new ThemeDescription(selectedMessagesCountTextView, ThemeDescription.FLAG_TEXTCOLOR, null, null, null, null, Theme.key_actionBarActionModeDefaultIcon),
|
|
new ThemeDescription(actionModeTextView, ThemeDescription.FLAG_TEXTCOLOR, null, null, null, null, Theme.key_actionBarActionModeDefaultIcon),
|
|
new ThemeDescription(actionModeSubTextView, ThemeDescription.FLAG_TEXTCOLOR, null, null, null, null, Theme.key_actionBarActionModeDefaultIcon),
|
|
|
|
new ThemeDescription(avatarContainer.getTitleTextView(), 0, null, null, new Drawable[]{Theme.chat_muteIconDrawable}, null, Theme.key_chat_muteIcon),
|
|
new ThemeDescription(avatarContainer.getTitleTextView(), 0, null, null, new Drawable[]{Theme.chat_lockIconDrawable}, null, Theme.key_chat_lockIcon),
|
|
|
|
new ThemeDescription(chatListView, 0, new Class[]{ChatMessageCell.class}, null, new Drawable[]{Theme.avatar_photoDrawable, Theme.avatar_broadcastDrawable, Theme.avatar_savedDrawable}, null, Theme.key_avatar_text),
|
|
new ThemeDescription(chatListView, 0, new Class[]{ChatMessageCell.class}, null, null, null, Theme.key_avatar_backgroundRed),
|
|
new ThemeDescription(chatListView, 0, new Class[]{ChatMessageCell.class}, null, null, null, Theme.key_avatar_backgroundOrange),
|
|
new ThemeDescription(chatListView, 0, new Class[]{ChatMessageCell.class}, null, null, null, Theme.key_avatar_backgroundViolet),
|
|
new ThemeDescription(chatListView, 0, new Class[]{ChatMessageCell.class}, null, null, null, Theme.key_avatar_backgroundGreen),
|
|
new ThemeDescription(chatListView, 0, new Class[]{ChatMessageCell.class}, null, null, null, Theme.key_avatar_backgroundCyan),
|
|
new ThemeDescription(chatListView, 0, new Class[]{ChatMessageCell.class}, null, null, null, Theme.key_avatar_backgroundBlue),
|
|
new ThemeDescription(chatListView, 0, new Class[]{ChatMessageCell.class}, null, null, null, Theme.key_avatar_backgroundPink),
|
|
new ThemeDescription(chatListView, 0, new Class[]{ChatMessageCell.class}, null, null, null, Theme.key_avatar_nameInMessageRed),
|
|
new ThemeDescription(chatListView, 0, new Class[]{ChatMessageCell.class}, null, null, null, Theme.key_avatar_nameInMessageOrange),
|
|
new ThemeDescription(chatListView, 0, new Class[]{ChatMessageCell.class}, null, null, null, Theme.key_avatar_nameInMessageViolet),
|
|
new ThemeDescription(chatListView, 0, new Class[]{ChatMessageCell.class}, null, null, null, Theme.key_avatar_nameInMessageGreen),
|
|
new ThemeDescription(chatListView, 0, new Class[]{ChatMessageCell.class}, null, null, null, Theme.key_avatar_nameInMessageCyan),
|
|
new ThemeDescription(chatListView, 0, new Class[]{ChatMessageCell.class}, null, null, null, Theme.key_avatar_nameInMessageBlue),
|
|
new ThemeDescription(chatListView, 0, new Class[]{ChatMessageCell.class}, null, null, null, Theme.key_avatar_nameInMessagePink),
|
|
new ThemeDescription(chatListView, 0, new Class[]{ChatMessageCell.class}, null, new Drawable[]{Theme.chat_msgInDrawable, Theme.chat_msgInMediaDrawable}, null, Theme.key_chat_inBubble),
|
|
new ThemeDescription(chatListView, 0, new Class[]{ChatMessageCell.class}, null, new Drawable[]{Theme.chat_msgInSelectedDrawable, Theme.chat_msgInMediaSelectedDrawable}, null, Theme.key_chat_inBubbleSelected),
|
|
new ThemeDescription(chatListView, 0, new Class[]{ChatMessageCell.class}, null, new Drawable[]{Theme.chat_msgInShadowDrawable, Theme.chat_msgInMediaShadowDrawable}, null, Theme.key_chat_inBubbleShadow),
|
|
new ThemeDescription(chatListView, 0, new Class[]{ChatMessageCell.class}, null, new Drawable[]{Theme.chat_msgOutDrawable, Theme.chat_msgOutMediaDrawable}, null, Theme.key_chat_outBubble),
|
|
new ThemeDescription(chatListView, 0, new Class[]{ChatMessageCell.class}, null, new Drawable[]{Theme.chat_msgOutSelectedDrawable, Theme.chat_msgOutMediaSelectedDrawable}, null, Theme.key_chat_outBubbleSelected),
|
|
new ThemeDescription(chatListView, 0, new Class[]{ChatMessageCell.class}, null, new Drawable[]{Theme.chat_msgOutShadowDrawable, Theme.chat_msgOutMediaShadowDrawable}, null, Theme.key_chat_outBubbleShadow),
|
|
new ThemeDescription(chatListView, ThemeDescription.FLAG_TEXTCOLOR, new Class[]{ChatActionCell.class}, Theme.chat_actionTextPaint, null, null, Theme.key_chat_serviceText),
|
|
new ThemeDescription(chatListView, ThemeDescription.FLAG_LINKCOLOR, new Class[]{ChatActionCell.class}, Theme.chat_actionTextPaint, null, null, Theme.key_chat_serviceLink),
|
|
|
|
new ThemeDescription(chatListView, 0, new Class[]{ChatMessageCell.class}, null, new Drawable[]{Theme.chat_shareIconDrawable, Theme.chat_botInlineDrawable, Theme.chat_botLinkDrawalbe, Theme.chat_goIconDrawable}, null, Theme.key_chat_serviceIcon),
|
|
|
|
new ThemeDescription(chatListView, 0, new Class[]{ChatMessageCell.class, ChatActionCell.class}, null, null, null, Theme.key_chat_serviceBackground),
|
|
new ThemeDescription(chatListView, 0, new Class[]{ChatMessageCell.class, ChatActionCell.class}, null, null, null, Theme.key_chat_serviceBackgroundSelected),
|
|
new ThemeDescription(chatListView, 0, new Class[]{ChatMessageCell.class}, null, null, null, Theme.key_chat_messageTextIn),
|
|
new ThemeDescription(chatListView, 0, new Class[]{ChatMessageCell.class}, null, null, null, Theme.key_chat_messageTextOut),
|
|
new ThemeDescription(chatListView, ThemeDescription.FLAG_LINKCOLOR, new Class[]{ChatMessageCell.class}, null, null, null, Theme.key_chat_messageLinkIn, null),
|
|
new ThemeDescription(chatListView, ThemeDescription.FLAG_LINKCOLOR, new Class[]{ChatMessageCell.class}, null, null, null, Theme.key_chat_messageLinkOut, null),
|
|
new ThemeDescription(chatListView, 0, new Class[]{ChatMessageCell.class}, null, new Drawable[]{Theme.chat_msgOutCheckDrawable, Theme.chat_msgOutHalfCheckDrawable}, null, Theme.key_chat_outSentCheck),
|
|
new ThemeDescription(chatListView, 0, new Class[]{ChatMessageCell.class}, null, new Drawable[]{Theme.chat_msgOutCheckSelectedDrawable, Theme.chat_msgOutHalfCheckSelectedDrawable}, null, Theme.key_chat_outSentCheckSelected),
|
|
new ThemeDescription(chatListView, 0, new Class[]{ChatMessageCell.class}, null, new Drawable[]{Theme.chat_msgOutClockDrawable}, null, Theme.key_chat_outSentClock),
|
|
new ThemeDescription(chatListView, 0, new Class[]{ChatMessageCell.class}, null, new Drawable[]{Theme.chat_msgOutSelectedClockDrawable}, null, Theme.key_chat_outSentClockSelected),
|
|
new ThemeDescription(chatListView, 0, new Class[]{ChatMessageCell.class}, null, new Drawable[]{Theme.chat_msgInClockDrawable}, null, Theme.key_chat_inSentClock),
|
|
new ThemeDescription(chatListView, 0, new Class[]{ChatMessageCell.class}, null, new Drawable[]{Theme.chat_msgInSelectedClockDrawable}, null, Theme.key_chat_inSentClockSelected),
|
|
new ThemeDescription(chatListView, 0, new Class[]{ChatMessageCell.class}, null, new Drawable[]{Theme.chat_msgMediaCheckDrawable, Theme.chat_msgMediaHalfCheckDrawable}, null, Theme.key_chat_mediaSentCheck),
|
|
new ThemeDescription(chatListView, 0, new Class[]{ChatMessageCell.class}, null, new Drawable[]{Theme.chat_msgStickerHalfCheckDrawable, Theme.chat_msgStickerCheckDrawable, Theme.chat_msgStickerClockDrawable, Theme.chat_msgStickerViewsDrawable}, null, Theme.key_chat_serviceText),
|
|
new ThemeDescription(chatListView, 0, new Class[]{ChatMessageCell.class}, null, new Drawable[]{Theme.chat_msgMediaClockDrawable}, null, Theme.key_chat_mediaSentClock),
|
|
new ThemeDescription(chatListView, 0, new Class[]{ChatMessageCell.class}, null, new Drawable[]{Theme.chat_msgOutViewsDrawable}, null, Theme.key_chat_outViews),
|
|
new ThemeDescription(chatListView, 0, new Class[]{ChatMessageCell.class}, null, new Drawable[]{Theme.chat_msgOutViewsSelectedDrawable}, null, Theme.key_chat_outViewsSelected),
|
|
new ThemeDescription(chatListView, 0, new Class[]{ChatMessageCell.class}, null, new Drawable[]{Theme.chat_msgInViewsDrawable}, null, Theme.key_chat_inViews),
|
|
new ThemeDescription(chatListView, 0, new Class[]{ChatMessageCell.class}, null, new Drawable[]{Theme.chat_msgInViewsSelectedDrawable}, null, Theme.key_chat_inViewsSelected),
|
|
new ThemeDescription(chatListView, 0, new Class[]{ChatMessageCell.class}, null, new Drawable[]{Theme.chat_msgMediaViewsDrawable}, null, Theme.key_chat_mediaViews),
|
|
new ThemeDescription(chatListView, 0, new Class[]{ChatMessageCell.class}, null, new Drawable[]{Theme.chat_msgOutMenuDrawable}, null, Theme.key_chat_outMenu),
|
|
new ThemeDescription(chatListView, 0, new Class[]{ChatMessageCell.class}, null, new Drawable[]{Theme.chat_msgOutMenuSelectedDrawable}, null, Theme.key_chat_outMenuSelected),
|
|
new ThemeDescription(chatListView, 0, new Class[]{ChatMessageCell.class}, null, new Drawable[]{Theme.chat_msgInMenuDrawable}, null, Theme.key_chat_inMenu),
|
|
new ThemeDescription(chatListView, 0, new Class[]{ChatMessageCell.class}, null, new Drawable[]{Theme.chat_msgInMenuSelectedDrawable}, null, Theme.key_chat_inMenuSelected),
|
|
new ThemeDescription(chatListView, 0, new Class[]{ChatMessageCell.class}, null, new Drawable[]{Theme.chat_msgMediaMenuDrawable}, null, Theme.key_chat_mediaMenu),
|
|
new ThemeDescription(chatListView, 0, new Class[]{ChatMessageCell.class}, null, new Drawable[]{Theme.chat_msgOutInstantDrawable, Theme.chat_msgOutCallDrawable}, null, Theme.key_chat_outInstant),
|
|
new ThemeDescription(chatListView, 0, new Class[]{ChatMessageCell.class}, null, new Drawable[]{Theme.chat_msgOutCallSelectedDrawable}, null, Theme.key_chat_outInstantSelected),
|
|
new ThemeDescription(chatListView, 0, new Class[]{ChatMessageCell.class}, null, new Drawable[]{Theme.chat_msgInInstantDrawable, Theme.chat_msgInCallDrawable}, null, Theme.key_chat_inInstant),
|
|
new ThemeDescription(chatListView, 0, new Class[]{ChatMessageCell.class}, null, new Drawable[]{Theme.chat_msgInCallSelectedDrawable}, null, Theme.key_chat_inInstantSelected),
|
|
new ThemeDescription(chatListView, 0, new Class[]{ChatMessageCell.class}, null, new Drawable[]{Theme.chat_msgCallUpRedDrawable, Theme.chat_msgCallDownRedDrawable}, null, Theme.key_calls_callReceivedRedIcon),
|
|
new ThemeDescription(chatListView, 0, new Class[]{ChatMessageCell.class}, null, new Drawable[]{Theme.chat_msgCallUpGreenDrawable, Theme.chat_msgCallDownGreenDrawable}, null, Theme.key_calls_callReceivedGreenIcon),
|
|
new ThemeDescription(chatListView, 0, new Class[]{ChatMessageCell.class}, Theme.chat_msgErrorPaint, null, null, Theme.key_chat_sentError),
|
|
new ThemeDescription(chatListView, 0, new Class[]{ChatMessageCell.class}, null, new Drawable[]{Theme.chat_msgErrorDrawable}, null, Theme.key_chat_sentErrorIcon),
|
|
new ThemeDescription(chatListView, 0, new Class[]{ChatMessageCell.class}, null, null, selectedBackgroundDelegate, Theme.key_chat_selectedBackground),
|
|
new ThemeDescription(chatListView, 0, new Class[]{ChatMessageCell.class}, Theme.chat_durationPaint, null, null, Theme.key_chat_previewDurationText),
|
|
new ThemeDescription(chatListView, 0, new Class[]{ChatMessageCell.class}, Theme.chat_gamePaint, null, null, Theme.key_chat_previewGameText),
|
|
new ThemeDescription(chatListView, 0, new Class[]{ChatMessageCell.class}, null, null, null, Theme.key_chat_inPreviewInstantText),
|
|
new ThemeDescription(chatListView, 0, new Class[]{ChatMessageCell.class}, null, null, null, Theme.key_chat_outPreviewInstantText),
|
|
new ThemeDescription(chatListView, 0, new Class[]{ChatMessageCell.class}, null, null, null, Theme.key_chat_inPreviewInstantSelectedText),
|
|
new ThemeDescription(chatListView, 0, new Class[]{ChatMessageCell.class}, null, null, null, Theme.key_chat_outPreviewInstantSelectedText),
|
|
new ThemeDescription(chatListView, 0, new Class[]{ChatMessageCell.class}, Theme.chat_deleteProgressPaint, null, null, Theme.key_chat_secretTimeText),
|
|
new ThemeDescription(chatListView, 0, new Class[]{ChatMessageCell.class}, null, null, null, Theme.key_chat_stickerNameText),
|
|
new ThemeDescription(chatListView, 0, new Class[]{ChatMessageCell.class}, Theme.chat_botButtonPaint, null, null, Theme.key_chat_botButtonText),
|
|
new ThemeDescription(chatListView, 0, new Class[]{ChatMessageCell.class}, Theme.chat_botProgressPaint, null, null, Theme.key_chat_botProgress),
|
|
new ThemeDescription(chatListView, 0, new Class[]{ChatMessageCell.class}, null, null, null, Theme.key_chat_inForwardedNameText),
|
|
new ThemeDescription(chatListView, 0, new Class[]{ChatMessageCell.class}, null, null, null, Theme.key_chat_outForwardedNameText),
|
|
new ThemeDescription(chatListView, 0, new Class[]{ChatMessageCell.class}, null, null, null, Theme.key_chat_inViaBotNameText),
|
|
new ThemeDescription(chatListView, 0, new Class[]{ChatMessageCell.class}, null, null, null, Theme.key_chat_outViaBotNameText),
|
|
new ThemeDescription(chatListView, 0, new Class[]{ChatMessageCell.class}, null, null, null, Theme.key_chat_stickerViaBotNameText),
|
|
new ThemeDescription(chatListView, 0, new Class[]{ChatMessageCell.class}, null, null, null, Theme.key_chat_inReplyLine),
|
|
new ThemeDescription(chatListView, 0, new Class[]{ChatMessageCell.class}, null, null, null, Theme.key_chat_outReplyLine),
|
|
new ThemeDescription(chatListView, 0, new Class[]{ChatMessageCell.class}, null, null, null, Theme.key_chat_stickerReplyLine),
|
|
new ThemeDescription(chatListView, 0, new Class[]{ChatMessageCell.class}, null, null, null, Theme.key_chat_inReplyNameText),
|
|
new ThemeDescription(chatListView, 0, new Class[]{ChatMessageCell.class}, null, null, null, Theme.key_chat_outReplyNameText),
|
|
new ThemeDescription(chatListView, 0, new Class[]{ChatMessageCell.class}, null, null, null, Theme.key_chat_stickerReplyNameText),
|
|
new ThemeDescription(chatListView, 0, new Class[]{ChatMessageCell.class}, null, null, null, Theme.key_chat_inReplyMessageText),
|
|
new ThemeDescription(chatListView, 0, new Class[]{ChatMessageCell.class}, null, null, null, Theme.key_chat_outReplyMessageText),
|
|
new ThemeDescription(chatListView, 0, new Class[]{ChatMessageCell.class}, null, null, null, Theme.key_chat_inReplyMediaMessageText),
|
|
new ThemeDescription(chatListView, 0, new Class[]{ChatMessageCell.class}, null, null, null, Theme.key_chat_outReplyMediaMessageText),
|
|
new ThemeDescription(chatListView, 0, new Class[]{ChatMessageCell.class}, null, null, null, Theme.key_chat_inReplyMediaMessageSelectedText),
|
|
new ThemeDescription(chatListView, 0, new Class[]{ChatMessageCell.class}, null, null, null, Theme.key_chat_outReplyMediaMessageSelectedText),
|
|
new ThemeDescription(chatListView, 0, new Class[]{ChatMessageCell.class}, null, null, null, Theme.key_chat_stickerReplyMessageText),
|
|
new ThemeDescription(chatListView, 0, new Class[]{ChatMessageCell.class}, null, null, null, Theme.key_chat_inPreviewLine),
|
|
new ThemeDescription(chatListView, 0, new Class[]{ChatMessageCell.class}, null, null, null, Theme.key_chat_outPreviewLine),
|
|
new ThemeDescription(chatListView, 0, new Class[]{ChatMessageCell.class}, null, null, null, Theme.key_chat_inSiteNameText),
|
|
new ThemeDescription(chatListView, 0, new Class[]{ChatMessageCell.class}, null, null, null, Theme.key_chat_outSiteNameText),
|
|
new ThemeDescription(chatListView, 0, new Class[]{ChatMessageCell.class}, null, null, null, Theme.key_chat_inContactNameText),
|
|
new ThemeDescription(chatListView, 0, new Class[]{ChatMessageCell.class}, null, null, null, Theme.key_chat_outContactNameText),
|
|
new ThemeDescription(chatListView, 0, new Class[]{ChatMessageCell.class}, null, null, null, Theme.key_chat_inContactPhoneText),
|
|
new ThemeDescription(chatListView, 0, new Class[]{ChatMessageCell.class}, null, null, null, Theme.key_chat_outContactPhoneText),
|
|
new ThemeDescription(chatListView, 0, new Class[]{ChatMessageCell.class}, null, null, null, Theme.key_chat_mediaProgress),
|
|
new ThemeDescription(chatListView, 0, new Class[]{ChatMessageCell.class}, null, null, null, Theme.key_chat_inAudioProgress),
|
|
new ThemeDescription(chatListView, 0, new Class[]{ChatMessageCell.class}, null, null, null, Theme.key_chat_outAudioProgress),
|
|
new ThemeDescription(chatListView, 0, new Class[]{ChatMessageCell.class}, null, null, null, Theme.key_chat_inAudioSelectedProgress),
|
|
new ThemeDescription(chatListView, 0, new Class[]{ChatMessageCell.class}, null, null, null, Theme.key_chat_outAudioSelectedProgress),
|
|
new ThemeDescription(chatListView, 0, new Class[]{ChatMessageCell.class}, null, null, null, Theme.key_chat_mediaTimeText),
|
|
new ThemeDescription(chatListView, 0, new Class[]{ChatMessageCell.class}, null, null, null, Theme.key_chat_inTimeText),
|
|
new ThemeDescription(chatListView, 0, new Class[]{ChatMessageCell.class}, null, null, null, Theme.key_chat_outTimeText),
|
|
new ThemeDescription(chatListView, 0, new Class[]{ChatMessageCell.class}, null, null, null, Theme.key_chat_inTimeSelectedText),
|
|
new ThemeDescription(chatListView, 0, new Class[]{ChatMessageCell.class}, null, null, null, Theme.key_chat_adminText),
|
|
new ThemeDescription(chatListView, 0, new Class[]{ChatMessageCell.class}, null, null, null, Theme.key_chat_adminSelectedText),
|
|
new ThemeDescription(chatListView, 0, new Class[]{ChatMessageCell.class}, null, null, null, Theme.key_chat_outTimeSelectedText),
|
|
new ThemeDescription(chatListView, 0, new Class[]{ChatMessageCell.class}, null, null, null, Theme.key_chat_inAudioPerfomerText),
|
|
new ThemeDescription(chatListView, 0, new Class[]{ChatMessageCell.class}, null, null, null, Theme.key_chat_outAudioPerfomerText),
|
|
new ThemeDescription(chatListView, 0, new Class[]{ChatMessageCell.class}, null, null, null, Theme.key_chat_inAudioTitleText),
|
|
new ThemeDescription(chatListView, 0, new Class[]{ChatMessageCell.class}, null, null, null, Theme.key_chat_outAudioTitleText),
|
|
new ThemeDescription(chatListView, 0, new Class[]{ChatMessageCell.class}, null, null, null, Theme.key_chat_inAudioDurationText),
|
|
new ThemeDescription(chatListView, 0, new Class[]{ChatMessageCell.class}, null, null, null, Theme.key_chat_outAudioDurationText),
|
|
new ThemeDescription(chatListView, 0, new Class[]{ChatMessageCell.class}, null, null, null, Theme.key_chat_inAudioDurationSelectedText),
|
|
new ThemeDescription(chatListView, 0, new Class[]{ChatMessageCell.class}, null, null, null, Theme.key_chat_outAudioDurationSelectedText),
|
|
new ThemeDescription(chatListView, 0, new Class[]{ChatMessageCell.class}, null, null, null, Theme.key_chat_inAudioSeekbar),
|
|
new ThemeDescription(chatListView, 0, new Class[]{ChatMessageCell.class}, null, null, null, Theme.key_chat_outAudioSeekbar),
|
|
new ThemeDescription(chatListView, 0, new Class[]{ChatMessageCell.class}, null, null, null, Theme.key_chat_inAudioSeekbarSelected),
|
|
new ThemeDescription(chatListView, 0, new Class[]{ChatMessageCell.class}, null, null, null, Theme.key_chat_outAudioSeekbarSelected),
|
|
new ThemeDescription(chatListView, 0, new Class[]{ChatMessageCell.class}, null, null, null, Theme.key_chat_inAudioSeekbarFill),
|
|
new ThemeDescription(chatListView, 0, new Class[]{ChatMessageCell.class}, null, null, null, Theme.key_chat_outAudioSeekbarFill),
|
|
new ThemeDescription(chatListView, 0, new Class[]{ChatMessageCell.class}, null, null, null, Theme.key_chat_inVoiceSeekbar),
|
|
new ThemeDescription(chatListView, 0, new Class[]{ChatMessageCell.class}, null, null, null, Theme.key_chat_outVoiceSeekbar),
|
|
new ThemeDescription(chatListView, 0, new Class[]{ChatMessageCell.class}, null, null, null, Theme.key_chat_inVoiceSeekbarSelected),
|
|
new ThemeDescription(chatListView, 0, new Class[]{ChatMessageCell.class}, null, null, null, Theme.key_chat_outVoiceSeekbarSelected),
|
|
new ThemeDescription(chatListView, 0, new Class[]{ChatMessageCell.class}, null, null, null, Theme.key_chat_inVoiceSeekbarFill),
|
|
new ThemeDescription(chatListView, 0, new Class[]{ChatMessageCell.class}, null, null, null, Theme.key_chat_outVoiceSeekbarFill),
|
|
new ThemeDescription(chatListView, 0, new Class[]{ChatMessageCell.class}, null, null, null, Theme.key_chat_inFileProgress),
|
|
new ThemeDescription(chatListView, 0, new Class[]{ChatMessageCell.class}, null, null, null, Theme.key_chat_outFileProgress),
|
|
new ThemeDescription(chatListView, 0, new Class[]{ChatMessageCell.class}, null, null, null, Theme.key_chat_inFileProgressSelected),
|
|
new ThemeDescription(chatListView, 0, new Class[]{ChatMessageCell.class}, null, null, null, Theme.key_chat_outFileProgressSelected),
|
|
new ThemeDescription(chatListView, 0, new Class[]{ChatMessageCell.class}, null, null, null, Theme.key_chat_inFileNameText),
|
|
new ThemeDescription(chatListView, 0, new Class[]{ChatMessageCell.class}, null, null, null, Theme.key_chat_outFileNameText),
|
|
new ThemeDescription(chatListView, 0, new Class[]{ChatMessageCell.class}, null, null, null, Theme.key_chat_inFileInfoText),
|
|
new ThemeDescription(chatListView, 0, new Class[]{ChatMessageCell.class}, null, null, null, Theme.key_chat_outFileInfoText),
|
|
new ThemeDescription(chatListView, 0, new Class[]{ChatMessageCell.class}, null, null, null, Theme.key_chat_inFileInfoSelectedText),
|
|
new ThemeDescription(chatListView, 0, new Class[]{ChatMessageCell.class}, null, null, null, Theme.key_chat_outFileInfoSelectedText),
|
|
new ThemeDescription(chatListView, 0, new Class[]{ChatMessageCell.class}, null, null, null, Theme.key_chat_inFileBackground),
|
|
new ThemeDescription(chatListView, 0, new Class[]{ChatMessageCell.class}, null, null, null, Theme.key_chat_outFileBackground),
|
|
new ThemeDescription(chatListView, 0, new Class[]{ChatMessageCell.class}, null, null, null, Theme.key_chat_inFileBackgroundSelected),
|
|
new ThemeDescription(chatListView, 0, new Class[]{ChatMessageCell.class}, null, null, null, Theme.key_chat_outFileBackgroundSelected),
|
|
new ThemeDescription(chatListView, 0, new Class[]{ChatMessageCell.class}, null, null, null, Theme.key_chat_inVenueNameText),
|
|
new ThemeDescription(chatListView, 0, new Class[]{ChatMessageCell.class}, null, null, null, Theme.key_chat_outVenueNameText),
|
|
new ThemeDescription(chatListView, 0, new Class[]{ChatMessageCell.class}, null, null, null, Theme.key_chat_inVenueInfoText),
|
|
new ThemeDescription(chatListView, 0, new Class[]{ChatMessageCell.class}, null, null, null, Theme.key_chat_outVenueInfoText),
|
|
new ThemeDescription(chatListView, 0, new Class[]{ChatMessageCell.class}, null, null, null, Theme.key_chat_inVenueInfoSelectedText),
|
|
new ThemeDescription(chatListView, 0, new Class[]{ChatMessageCell.class}, null, null, null, Theme.key_chat_outVenueInfoSelectedText),
|
|
new ThemeDescription(chatListView, 0, new Class[]{ChatMessageCell.class}, null, null, null, Theme.key_chat_mediaInfoText),
|
|
new ThemeDescription(chatListView, 0, new Class[]{ChatMessageCell.class}, Theme.chat_urlPaint, null, null, Theme.key_chat_linkSelectBackground),
|
|
new ThemeDescription(chatListView, 0, new Class[]{ChatMessageCell.class}, Theme.chat_textSearchSelectionPaint, null, null, Theme.key_chat_textSelectBackground),
|
|
new ThemeDescription(chatListView, ThemeDescription.FLAG_BACKGROUNDFILTER, new Class[]{ChatMessageCell.class}, null, new Drawable[]{Theme.chat_fileStatesDrawable[0][0], Theme.chat_fileStatesDrawable[1][0], Theme.chat_fileStatesDrawable[2][0], Theme.chat_fileStatesDrawable[3][0], Theme.chat_fileStatesDrawable[4][0]}, null, Theme.key_chat_outLoader),
|
|
new ThemeDescription(chatListView, 0, new Class[]{ChatMessageCell.class}, null, new Drawable[]{Theme.chat_fileStatesDrawable[0][0], Theme.chat_fileStatesDrawable[1][0], Theme.chat_fileStatesDrawable[2][0], Theme.chat_fileStatesDrawable[3][0], Theme.chat_fileStatesDrawable[4][0]}, null, Theme.key_chat_outBubble),
|
|
new ThemeDescription(chatListView, ThemeDescription.FLAG_BACKGROUNDFILTER, new Class[]{ChatMessageCell.class}, null, new Drawable[]{Theme.chat_fileStatesDrawable[0][1], Theme.chat_fileStatesDrawable[1][1], Theme.chat_fileStatesDrawable[2][1], Theme.chat_fileStatesDrawable[3][1], Theme.chat_fileStatesDrawable[4][1]}, null, Theme.key_chat_outLoaderSelected),
|
|
new ThemeDescription(chatListView, 0, new Class[]{ChatMessageCell.class}, null, new Drawable[]{Theme.chat_fileStatesDrawable[0][1], Theme.chat_fileStatesDrawable[1][1], Theme.chat_fileStatesDrawable[2][1], Theme.chat_fileStatesDrawable[3][1], Theme.chat_fileStatesDrawable[4][1]}, null, Theme.key_chat_outBubbleSelected),
|
|
new ThemeDescription(chatListView, ThemeDescription.FLAG_BACKGROUNDFILTER, new Class[]{ChatMessageCell.class}, null, new Drawable[]{Theme.chat_fileStatesDrawable[5][0], Theme.chat_fileStatesDrawable[6][0], Theme.chat_fileStatesDrawable[7][0], Theme.chat_fileStatesDrawable[8][0], Theme.chat_fileStatesDrawable[9][0]}, null, Theme.key_chat_inLoader),
|
|
new ThemeDescription(chatListView, 0, new Class[]{ChatMessageCell.class}, null, new Drawable[]{Theme.chat_fileStatesDrawable[5][0], Theme.chat_fileStatesDrawable[6][0], Theme.chat_fileStatesDrawable[7][0], Theme.chat_fileStatesDrawable[8][0], Theme.chat_fileStatesDrawable[9][0]}, null, Theme.key_chat_inBubble),
|
|
new ThemeDescription(chatListView, ThemeDescription.FLAG_BACKGROUNDFILTER, new Class[]{ChatMessageCell.class}, null, new Drawable[]{Theme.chat_fileStatesDrawable[5][1], Theme.chat_fileStatesDrawable[6][1], Theme.chat_fileStatesDrawable[7][1], Theme.chat_fileStatesDrawable[8][1], Theme.chat_fileStatesDrawable[9][1]}, null, Theme.key_chat_inLoaderSelected),
|
|
new ThemeDescription(chatListView, 0, new Class[]{ChatMessageCell.class}, null, new Drawable[]{Theme.chat_fileStatesDrawable[5][1], Theme.chat_fileStatesDrawable[6][1], Theme.chat_fileStatesDrawable[7][1], Theme.chat_fileStatesDrawable[8][1], Theme.chat_fileStatesDrawable[9][1]}, null, Theme.key_chat_inBubbleSelected),
|
|
new ThemeDescription(chatListView, ThemeDescription.FLAG_BACKGROUNDFILTER, new Class[]{ChatMessageCell.class}, null, new Drawable[]{Theme.chat_photoStatesDrawables[0][0], Theme.chat_photoStatesDrawables[1][0], Theme.chat_photoStatesDrawables[2][0], Theme.chat_photoStatesDrawables[3][0]}, null, Theme.key_chat_mediaLoaderPhoto),
|
|
new ThemeDescription(chatListView, 0, new Class[]{ChatMessageCell.class}, null, new Drawable[]{Theme.chat_photoStatesDrawables[0][0], Theme.chat_photoStatesDrawables[1][0], Theme.chat_photoStatesDrawables[2][0], Theme.chat_photoStatesDrawables[3][0]}, null, Theme.key_chat_mediaLoaderPhotoIcon),
|
|
new ThemeDescription(chatListView, ThemeDescription.FLAG_BACKGROUNDFILTER, new Class[]{ChatMessageCell.class}, null, new Drawable[]{Theme.chat_photoStatesDrawables[0][1], Theme.chat_photoStatesDrawables[1][1], Theme.chat_photoStatesDrawables[2][1], Theme.chat_photoStatesDrawables[3][1]}, null, Theme.key_chat_mediaLoaderPhotoSelected),
|
|
new ThemeDescription(chatListView, 0, new Class[]{ChatMessageCell.class}, null, new Drawable[]{Theme.chat_photoStatesDrawables[0][1], Theme.chat_photoStatesDrawables[1][1], Theme.chat_photoStatesDrawables[2][1], Theme.chat_photoStatesDrawables[3][1]}, null, Theme.key_chat_mediaLoaderPhotoIconSelected),
|
|
new ThemeDescription(chatListView, ThemeDescription.FLAG_BACKGROUNDFILTER, new Class[]{ChatMessageCell.class}, null, new Drawable[]{Theme.chat_photoStatesDrawables[7][0], Theme.chat_photoStatesDrawables[8][0]}, null, Theme.key_chat_outLoaderPhoto),
|
|
new ThemeDescription(chatListView, 0, new Class[]{ChatMessageCell.class}, null, new Drawable[]{Theme.chat_photoStatesDrawables[7][0], Theme.chat_photoStatesDrawables[8][0]}, null, Theme.key_chat_outLoaderPhotoIcon),
|
|
new ThemeDescription(chatListView, ThemeDescription.FLAG_BACKGROUNDFILTER, new Class[]{ChatMessageCell.class}, null, new Drawable[]{Theme.chat_photoStatesDrawables[7][1], Theme.chat_photoStatesDrawables[8][1]}, null, Theme.key_chat_outLoaderPhotoSelected),
|
|
new ThemeDescription(chatListView, 0, new Class[]{ChatMessageCell.class}, null, new Drawable[]{Theme.chat_photoStatesDrawables[7][1], Theme.chat_photoStatesDrawables[8][1]}, null, Theme.key_chat_outLoaderPhotoIconSelected),
|
|
new ThemeDescription(chatListView, ThemeDescription.FLAG_BACKGROUNDFILTER, new Class[]{ChatMessageCell.class}, null, new Drawable[]{Theme.chat_photoStatesDrawables[10][0], Theme.chat_photoStatesDrawables[11][0]}, null, Theme.key_chat_inLoaderPhoto),
|
|
new ThemeDescription(chatListView, 0, new Class[]{ChatMessageCell.class}, null, new Drawable[]{Theme.chat_photoStatesDrawables[10][0], Theme.chat_photoStatesDrawables[11][0]}, null, Theme.key_chat_inLoaderPhotoIcon),
|
|
new ThemeDescription(chatListView, ThemeDescription.FLAG_BACKGROUNDFILTER, new Class[]{ChatMessageCell.class}, null, new Drawable[]{Theme.chat_photoStatesDrawables[10][1], Theme.chat_photoStatesDrawables[11][1]}, null, Theme.key_chat_inLoaderPhotoSelected),
|
|
new ThemeDescription(chatListView, 0, new Class[]{ChatMessageCell.class}, null, new Drawable[]{Theme.chat_photoStatesDrawables[10][1], Theme.chat_photoStatesDrawables[11][1]}, null, Theme.key_chat_inLoaderPhotoIconSelected),
|
|
new ThemeDescription(chatListView, 0, new Class[]{ChatMessageCell.class}, null, new Drawable[]{Theme.chat_photoStatesDrawables[9][0]}, null, Theme.key_chat_outFileIcon),
|
|
new ThemeDescription(chatListView, 0, new Class[]{ChatMessageCell.class}, null, new Drawable[]{Theme.chat_photoStatesDrawables[9][1]}, null, Theme.key_chat_outFileSelectedIcon),
|
|
new ThemeDescription(chatListView, 0, new Class[]{ChatMessageCell.class}, null, new Drawable[]{Theme.chat_photoStatesDrawables[12][0]}, null, Theme.key_chat_inFileIcon),
|
|
new ThemeDescription(chatListView, 0, new Class[]{ChatMessageCell.class}, null, new Drawable[]{Theme.chat_photoStatesDrawables[12][1]}, null, Theme.key_chat_inFileSelectedIcon),
|
|
new ThemeDescription(chatListView, ThemeDescription.FLAG_BACKGROUNDFILTER, new Class[]{ChatMessageCell.class}, null, new Drawable[]{Theme.chat_contactDrawable[0]}, null, Theme.key_chat_inContactBackground),
|
|
new ThemeDescription(chatListView, 0, new Class[]{ChatMessageCell.class}, null, new Drawable[]{Theme.chat_contactDrawable[0]}, null, Theme.key_chat_inContactIcon),
|
|
new ThemeDescription(chatListView, ThemeDescription.FLAG_BACKGROUNDFILTER, new Class[]{ChatMessageCell.class}, null, new Drawable[]{Theme.chat_contactDrawable[1]}, null, Theme.key_chat_outContactBackground),
|
|
new ThemeDescription(chatListView, 0, new Class[]{ChatMessageCell.class}, null, new Drawable[]{Theme.chat_contactDrawable[1]}, null, Theme.key_chat_outContactIcon),
|
|
new ThemeDescription(chatListView, ThemeDescription.FLAG_BACKGROUNDFILTER, new Class[]{ChatMessageCell.class}, null, new Drawable[]{Theme.chat_locationDrawable[0]}, null, Theme.key_chat_inLocationBackground),
|
|
new ThemeDescription(chatListView, 0, new Class[]{ChatMessageCell.class}, null, new Drawable[]{Theme.chat_locationDrawable[0]}, null, Theme.key_chat_inLocationIcon),
|
|
new ThemeDescription(chatListView, ThemeDescription.FLAG_BACKGROUNDFILTER, new Class[]{ChatMessageCell.class}, null, new Drawable[]{Theme.chat_locationDrawable[1]}, null, Theme.key_chat_outLocationBackground),
|
|
new ThemeDescription(chatListView, 0, new Class[]{ChatMessageCell.class}, null, new Drawable[]{Theme.chat_locationDrawable[1]}, null, Theme.key_chat_outLocationIcon),
|
|
|
|
new ThemeDescription(mentionContainer, 0, null, Theme.chat_composeBackgroundPaint, null, null, Theme.key_chat_messagePanelBackground),
|
|
new ThemeDescription(mentionContainer, 0, null, null, new Drawable[]{Theme.chat_composeShadowDrawable}, null, Theme.key_chat_messagePanelShadow),
|
|
new ThemeDescription(searchContainer, 0, null, Theme.chat_composeBackgroundPaint, null, null, Theme.key_chat_messagePanelBackground),
|
|
new ThemeDescription(searchContainer, 0, null, null, new Drawable[]{Theme.chat_composeShadowDrawable}, null, Theme.key_chat_messagePanelShadow),
|
|
new ThemeDescription(bottomOverlay, 0, null, Theme.chat_composeBackgroundPaint, null, null, Theme.key_chat_messagePanelBackground),
|
|
new ThemeDescription(bottomOverlay, 0, null, null, new Drawable[]{Theme.chat_composeShadowDrawable}, null, Theme.key_chat_messagePanelShadow),
|
|
new ThemeDescription(bottomOverlayChat, 0, null, Theme.chat_composeBackgroundPaint, null, null, Theme.key_chat_messagePanelBackground),
|
|
new ThemeDescription(bottomOverlayChat, 0, null, null, new Drawable[]{Theme.chat_composeShadowDrawable}, null, Theme.key_chat_messagePanelShadow),
|
|
|
|
new ThemeDescription(chatActivityEnterView, 0, null, Theme.chat_composeBackgroundPaint, null, null, Theme.key_chat_messagePanelBackground),
|
|
new ThemeDescription(chatActivityEnterView, 0, null, null, new Drawable[]{Theme.chat_composeShadowDrawable}, null, Theme.key_chat_messagePanelShadow),
|
|
new ThemeDescription(chatActivityEnterView, ThemeDescription.FLAG_BACKGROUND, new Class[]{ChatActivityEnterView.class}, new String[]{"audioVideoButtonContainer"}, null, null, null, Theme.key_chat_messagePanelBackground),
|
|
new ThemeDescription(chatActivityEnterView, ThemeDescription.FLAG_TEXTCOLOR, new Class[]{ChatActivityEnterView.class}, new String[]{"messageEditText"}, null, null, null, Theme.key_chat_messagePanelText),
|
|
new ThemeDescription(chatActivityEnterView, ThemeDescription.FLAG_TEXTCOLOR, new Class[]{ChatActivityEnterView.class}, new String[]{"recordSendText"}, null, null, null, Theme.key_chat_fieldOverlayText),
|
|
new ThemeDescription(chatActivityEnterView, ThemeDescription.FLAG_HINTTEXTCOLOR, new Class[]{ChatActivityEnterView.class}, new String[]{"messageEditText"}, null, null, null, Theme.key_chat_messagePanelHint),
|
|
new ThemeDescription(chatActivityEnterView, 0, new Class[]{ChatActivityEnterView.class}, new String[]{"sendButton"}, null, null, null, Theme.key_chat_messagePanelSend),
|
|
new ThemeDescription(chatActivityEnterView, 0, new Class[]{ChatActivityEnterView.class}, new String[]{"emojiButton"}, null, null, null, Theme.key_chat_messagePanelIcons),
|
|
new ThemeDescription(chatActivityEnterView, 0, new Class[]{ChatActivityEnterView.class}, new String[]{"botButton"}, null, null, null, Theme.key_chat_messagePanelIcons),
|
|
new ThemeDescription(chatActivityEnterView, 0, new Class[]{ChatActivityEnterView.class}, new String[]{"notifyButton"}, null, null, null, Theme.key_chat_messagePanelIcons),
|
|
new ThemeDescription(chatActivityEnterView, 0, new Class[]{ChatActivityEnterView.class}, new String[]{"attachButton"}, null, null, null, Theme.key_chat_messagePanelIcons),
|
|
new ThemeDescription(chatActivityEnterView, 0, new Class[]{ChatActivityEnterView.class}, new String[]{"audioSendButton"}, null, null, null, Theme.key_chat_messagePanelIcons),
|
|
new ThemeDescription(chatActivityEnterView, 0, new Class[]{ChatActivityEnterView.class}, new String[]{"videoSendButton"}, null, null, null, Theme.key_chat_messagePanelIcons),
|
|
new ThemeDescription(chatActivityEnterView, ThemeDescription.FLAG_IMAGECOLOR, new Class[]{ChatActivityEnterView.class}, new String[]{"doneButtonImage"}, null, null, null, Theme.key_chat_editDoneIcon),
|
|
new ThemeDescription(chatActivityEnterView, ThemeDescription.FLAG_BACKGROUND, new Class[]{ChatActivityEnterView.class}, new String[]{"recordedAudioPanel"}, null, null, null, Theme.key_chat_messagePanelBackground),
|
|
new ThemeDescription(chatActivityEnterView, 0, new Class[]{ChatActivityEnterView.class}, new String[]{"micDrawable"}, null, null, null, Theme.key_chat_messagePanelVoicePressed),
|
|
new ThemeDescription(chatActivityEnterView, 0, new Class[]{ChatActivityEnterView.class}, new String[]{"cameraDrawable"}, null, null, null, Theme.key_chat_messagePanelVoicePressed),
|
|
new ThemeDescription(chatActivityEnterView, 0, new Class[]{ChatActivityEnterView.class}, new String[]{"sendDrawable"}, null, null, null, Theme.key_chat_messagePanelVoicePressed),
|
|
new ThemeDescription(chatActivityEnterView, 0, new Class[]{ChatActivityEnterView.class}, new String[]{"lockDrawable"}, null, null, null, Theme.key_chat_messagePanelVoiceLock),
|
|
new ThemeDescription(chatActivityEnterView, 0, new Class[]{ChatActivityEnterView.class}, new String[]{"lockTopDrawable"}, null, null, null, Theme.key_chat_messagePanelVoiceLock),
|
|
new ThemeDescription(chatActivityEnterView, 0, new Class[]{ChatActivityEnterView.class}, new String[]{"lockArrowDrawable"}, null, null, null, Theme.key_chat_messagePanelVoiceLock),
|
|
new ThemeDescription(chatActivityEnterView, 0, new Class[]{ChatActivityEnterView.class}, new String[]{"lockBackgroundDrawable"}, null, null, null, Theme.key_chat_messagePanelVoiceLockBackground),
|
|
new ThemeDescription(chatActivityEnterView, 0, new Class[]{ChatActivityEnterView.class}, new String[]{"lockShadowDrawable"}, null, null, null, Theme.key_chat_messagePanelVoiceLockShadow),
|
|
new ThemeDescription(chatActivityEnterView, ThemeDescription.FLAG_IMAGECOLOR, new Class[]{ChatActivityEnterView.class}, new String[]{"recordDeleteImageView"}, null, null, null, Theme.key_chat_messagePanelVoiceDelete),
|
|
new ThemeDescription(chatActivityEnterView, ThemeDescription.FLAG_BACKGROUNDFILTER, new Class[]{ChatActivityEnterView.class}, new String[]{"recordedAudioBackground"}, null, null, null, Theme.key_chat_recordedVoiceBackground),
|
|
new ThemeDescription(chatActivityEnterView, ThemeDescription.FLAG_TEXTCOLOR, new Class[]{ChatActivityEnterView.class}, new String[]{"recordTimeText"}, null, null, null, Theme.key_chat_recordTime),
|
|
new ThemeDescription(chatActivityEnterView, ThemeDescription.FLAG_BACKGROUND, new Class[]{ChatActivityEnterView.class}, new String[]{"recordTimeContainer"}, null, null, null, Theme.key_chat_messagePanelBackground),
|
|
new ThemeDescription(chatActivityEnterView, ThemeDescription.FLAG_TEXTCOLOR, new Class[]{ChatActivityEnterView.class}, new String[]{"recordCancelText"}, null, null, null, Theme.key_chat_recordVoiceCancel),
|
|
new ThemeDescription(chatActivityEnterView, ThemeDescription.FLAG_BACKGROUND, new Class[]{ChatActivityEnterView.class}, new String[]{"recordPanel"}, null, null, null, Theme.key_chat_messagePanelBackground),
|
|
new ThemeDescription(chatActivityEnterView, ThemeDescription.FLAG_TEXTCOLOR, new Class[]{ChatActivityEnterView.class}, new String[]{"recordedAudioTimeTextView"}, null, null, null, Theme.key_chat_messagePanelVoiceDuration),
|
|
new ThemeDescription(chatActivityEnterView, ThemeDescription.FLAG_IMAGECOLOR, new Class[]{ChatActivityEnterView.class}, new String[]{"recordCancelImage"}, null, null, null, Theme.key_chat_recordVoiceCancel),
|
|
new ThemeDescription(chatActivityEnterView, 0, new Class[]{ChatActivityEnterView.class}, new String[]{"doneButtonProgress"}, null, null, null, Theme.key_contextProgressInner1),
|
|
new ThemeDescription(chatActivityEnterView, 0, new Class[]{ChatActivityEnterView.class}, new String[]{"doneButtonProgress"}, null, null, null, Theme.key_contextProgressOuter1),
|
|
new ThemeDescription(chatActivityEnterView, ThemeDescription.FLAG_IMAGECOLOR, new Class[]{ChatActivityEnterView.class}, new String[]{"cancelBotButton"}, null, null, null, Theme.key_chat_messagePanelCancelInlineBot),
|
|
new ThemeDescription(chatActivityEnterView, 0, new Class[]{ChatActivityEnterView.class}, new String[]{"redDotPaint"}, null, null, null, Theme.key_chat_recordedVoiceDot),
|
|
new ThemeDescription(chatActivityEnterView, 0, new Class[]{ChatActivityEnterView.class}, new String[]{"paint"}, null, null, null, Theme.key_chat_messagePanelVoiceBackground),
|
|
new ThemeDescription(chatActivityEnterView, 0, new Class[]{ChatActivityEnterView.class}, new String[]{"paintRecord"}, null, null, null, Theme.key_chat_messagePanelVoiceShadow),
|
|
new ThemeDescription(chatActivityEnterView, 0, new Class[]{ChatActivityEnterView.class}, new String[]{"seekBarWaveform"}, null, null, null, Theme.key_chat_recordedVoiceProgress),
|
|
new ThemeDescription(chatActivityEnterView, 0, new Class[]{ChatActivityEnterView.class}, new String[]{"seekBarWaveform"}, null, null, null, Theme.key_chat_recordedVoiceProgressInner),
|
|
new ThemeDescription(chatActivityEnterView, 0, new Class[]{ChatActivityEnterView.class}, new String[]{"playDrawable"}, null, null, null, Theme.key_chat_recordedVoicePlayPause),
|
|
new ThemeDescription(chatActivityEnterView, 0, new Class[]{ChatActivityEnterView.class}, new String[]{"pauseDrawable"}, null, null, null, Theme.key_chat_recordedVoicePlayPause),
|
|
new ThemeDescription(chatActivityEnterView, 0, new Class[]{ChatActivityEnterView.class}, new String[]{"dotPaint"}, null, null, null, Theme.key_chat_emojiPanelNewTrending),
|
|
new ThemeDescription(chatActivityEnterView, ThemeDescription.FLAG_DRAWABLESELECTEDSTATE, new Class[]{ChatActivityEnterView.class}, new String[]{"playDrawable"}, null, null, null, Theme.key_chat_recordedVoicePlayPausePressed),
|
|
new ThemeDescription(chatActivityEnterView, ThemeDescription.FLAG_DRAWABLESELECTEDSTATE, new Class[]{ChatActivityEnterView.class}, new String[]{"pauseDrawable"}, null, null, null, Theme.key_chat_recordedVoicePlayPausePressed),
|
|
|
|
new ThemeDescription(chatActivityEnterView.getEmojiView(), 0, new Class[]{EmojiView.class}, new String[]{""}, null, null, null, Theme.key_chat_emojiPanelBackground),
|
|
new ThemeDescription(chatActivityEnterView.getEmojiView(), 0, new Class[]{EmojiView.class}, new String[]{""}, null, null, null, Theme.key_chat_emojiPanelShadowLine),
|
|
new ThemeDescription(chatActivityEnterView.getEmojiView(), 0, new Class[]{EmojiView.class}, new String[]{""}, null, null, null, Theme.key_chat_emojiPanelEmptyText),
|
|
new ThemeDescription(chatActivityEnterView.getEmojiView(), 0, new Class[]{EmojiView.class}, new String[]{""}, null, null, null, Theme.key_chat_emojiPanelIcon),
|
|
new ThemeDescription(chatActivityEnterView.getEmojiView(), 0, new Class[]{EmojiView.class}, new String[]{""}, null, null, null, Theme.key_chat_emojiPanelIconSelected),
|
|
new ThemeDescription(chatActivityEnterView.getEmojiView(), 0, new Class[]{EmojiView.class}, new String[]{""}, null, null, null, Theme.key_chat_emojiPanelStickerPackSelector),
|
|
new ThemeDescription(chatActivityEnterView.getEmojiView(), 0, new Class[]{EmojiView.class}, new String[]{""}, null, null, null, Theme.key_chat_emojiPanelIconSelector),
|
|
new ThemeDescription(chatActivityEnterView.getEmojiView(), 0, new Class[]{EmojiView.class}, new String[]{""}, null, null, null, Theme.key_chat_emojiPanelBackspace),
|
|
new ThemeDescription(chatActivityEnterView.getEmojiView(), 0, new Class[]{EmojiView.class}, new String[]{""}, null, null, null, Theme.key_chat_emojiPanelTrendingTitle),
|
|
new ThemeDescription(chatActivityEnterView.getEmojiView(), 0, new Class[]{EmojiView.class}, new String[]{""}, null, null, null, Theme.key_chat_emojiPanelTrendingDescription),
|
|
|
|
new ThemeDescription(null, 0, null, null, null, null, Theme.key_chat_botKeyboardButtonText),
|
|
new ThemeDescription(null, 0, null, null, null, null, Theme.key_chat_botKeyboardButtonBackground),
|
|
new ThemeDescription(null, 0, null, null, null, null, Theme.key_chat_botKeyboardButtonBackgroundPressed),
|
|
|
|
new ThemeDescription(fragmentContextView, ThemeDescription.FLAG_CELLBACKGROUNDCOLOR, new Class[]{FragmentContextView.class}, new String[]{"frameLayout"}, null, null, null, Theme.key_inappPlayerBackground),
|
|
new ThemeDescription(fragmentContextView, 0, new Class[]{FragmentContextView.class}, new String[]{"playButton"}, null, null, null, Theme.key_inappPlayerPlayPause),
|
|
new ThemeDescription(fragmentContextView, ThemeDescription.FLAG_TEXTCOLOR, new Class[]{FragmentContextView.class}, new String[]{"titleTextView"}, null, null, null, Theme.key_inappPlayerTitle),
|
|
new ThemeDescription(fragmentContextView, ThemeDescription.FLAG_TEXTCOLOR, new Class[]{FragmentContextView.class}, new String[]{"frameLayout"}, null, null, null, Theme.key_inappPlayerPerformer),
|
|
new ThemeDescription(fragmentContextView, ThemeDescription.FLAG_CELLBACKGROUNDCOLOR, new Class[]{FragmentContextView.class}, new String[]{"closeButton"}, null, null, null, Theme.key_inappPlayerClose),
|
|
|
|
new ThemeDescription(fragmentContextView, ThemeDescription.FLAG_CELLBACKGROUNDCOLOR, new Class[]{FragmentContextView.class}, new String[]{"frameLayout"}, null, null, null, Theme.key_returnToCallBackground),
|
|
new ThemeDescription(fragmentContextView, 0, new Class[]{FragmentContextView.class}, new String[]{"titleTextView"}, null, null, null, Theme.key_returnToCallText),
|
|
|
|
new ThemeDescription(pinnedLineView, ThemeDescription.FLAG_BACKGROUND, null, null, null, null, Theme.key_chat_topPanelLine),
|
|
new ThemeDescription(pinnedMessageNameTextView, ThemeDescription.FLAG_TEXTCOLOR, null, null, null, null, Theme.key_chat_topPanelTitle),
|
|
new ThemeDescription(pinnedMessageTextView, ThemeDescription.FLAG_TEXTCOLOR, null, null, null, null, Theme.key_chat_topPanelMessage),
|
|
new ThemeDescription(alertNameTextView, ThemeDescription.FLAG_TEXTCOLOR, null, null, null, null, Theme.key_chat_topPanelTitle),
|
|
new ThemeDescription(alertTextView, ThemeDescription.FLAG_TEXTCOLOR, null, null, null, null, Theme.key_chat_topPanelMessage),
|
|
new ThemeDescription(closePinned, ThemeDescription.FLAG_IMAGECOLOR, null, null, null, null, Theme.key_chat_topPanelClose),
|
|
new ThemeDescription(closeReportSpam, ThemeDescription.FLAG_IMAGECOLOR, null, null, null, null, Theme.key_chat_topPanelClose),
|
|
new ThemeDescription(reportSpamView, ThemeDescription.FLAG_BACKGROUNDFILTER, null, null, null, null, Theme.key_chat_topPanelBackground),
|
|
new ThemeDescription(alertView, ThemeDescription.FLAG_BACKGROUNDFILTER, null, null, null, null, Theme.key_chat_topPanelBackground),
|
|
new ThemeDescription(pinnedMessageView, ThemeDescription.FLAG_BACKGROUNDFILTER, null, null, null, null, Theme.key_chat_topPanelBackground),
|
|
new ThemeDescription(addToContactsButton, ThemeDescription.FLAG_TEXTCOLOR, null, null, null, null, Theme.key_chat_addContact),
|
|
new ThemeDescription(reportSpamButton, ThemeDescription.FLAG_TEXTCOLOR, null, null, null, null, Theme.key_chat_reportSpam),
|
|
|
|
new ThemeDescription(replyLineView, ThemeDescription.FLAG_BACKGROUND, null, null, null, null, Theme.key_chat_replyPanelLine),
|
|
new ThemeDescription(replyNameTextView, ThemeDescription.FLAG_TEXTCOLOR, null, null, null, null, Theme.key_chat_replyPanelName),
|
|
new ThemeDescription(replyObjectTextView, ThemeDescription.FLAG_TEXTCOLOR, null, null, null, null, Theme.key_chat_replyPanelMessage),
|
|
new ThemeDescription(replyIconImageView, ThemeDescription.FLAG_IMAGECOLOR, null, null, null, null, Theme.key_chat_replyPanelIcons),
|
|
new ThemeDescription(replyCloseImageView, ThemeDescription.FLAG_IMAGECOLOR, null, null, null, null, Theme.key_chat_replyPanelClose),
|
|
|
|
new ThemeDescription(searchUpButton, ThemeDescription.FLAG_IMAGECOLOR, null, null, null, null, Theme.key_chat_searchPanelIcons),
|
|
new ThemeDescription(searchDownButton, ThemeDescription.FLAG_IMAGECOLOR, null, null, null, null, Theme.key_chat_searchPanelIcons),
|
|
new ThemeDescription(searchCalendarButton, ThemeDescription.FLAG_IMAGECOLOR, null, null, null, null, Theme.key_chat_searchPanelIcons),
|
|
new ThemeDescription(searchUserButton, ThemeDescription.FLAG_IMAGECOLOR, null, null, null, null, Theme.key_chat_searchPanelIcons),
|
|
new ThemeDescription(searchCountText, ThemeDescription.FLAG_TEXTCOLOR, null, null, null, null, Theme.key_chat_searchPanelText),
|
|
|
|
new ThemeDescription(bottomOverlayText, ThemeDescription.FLAG_TEXTCOLOR, null, null, null, null, Theme.key_chat_secretChatStatusText),
|
|
new ThemeDescription(bottomOverlayChatText, ThemeDescription.FLAG_TEXTCOLOR, null, null, null, null, Theme.key_chat_fieldOverlayText),
|
|
|
|
new ThemeDescription(bigEmptyView, ThemeDescription.FLAG_TEXTCOLOR, null, null, null, null, Theme.key_chat_serviceText),
|
|
new ThemeDescription(emptyView, ThemeDescription.FLAG_TEXTCOLOR, null, null, null, null, Theme.key_chat_serviceText),
|
|
|
|
new ThemeDescription(progressBar, ThemeDescription.FLAG_PROGRESSBAR, null, null, null, null, Theme.key_chat_serviceText),
|
|
|
|
new ThemeDescription(stickersPanelArrow, ThemeDescription.FLAG_IMAGECOLOR, null, null, null, null, Theme.key_chat_stickersHintPanel),
|
|
new ThemeDescription(stickersListView, ThemeDescription.FLAG_BACKGROUNDFILTER, new Class[]{StickerCell.class}, null, null, null, Theme.key_chat_stickersHintPanel),
|
|
|
|
new ThemeDescription(chatListView, ThemeDescription.FLAG_USEBACKGROUNDDRAWABLE, new Class[]{ChatUnreadCell.class}, new String[]{"backgroundLayout"}, null, null, null, Theme.key_chat_unreadMessagesStartBackground),
|
|
new ThemeDescription(chatListView, ThemeDescription.FLAG_IMAGECOLOR, new Class[]{ChatUnreadCell.class}, new String[]{"imageView"}, null, null, null, Theme.key_chat_unreadMessagesStartArrowIcon),
|
|
new ThemeDescription(chatListView, ThemeDescription.FLAG_TEXTCOLOR, new Class[]{ChatUnreadCell.class}, new String[]{"textView"}, null, null, null, Theme.key_chat_unreadMessagesStartText),
|
|
|
|
new ThemeDescription(progressView2, ThemeDescription.FLAG_SERVICEBACKGROUND, null, null, null, null, Theme.key_chat_serviceBackground),
|
|
new ThemeDescription(emptyView, ThemeDescription.FLAG_SERVICEBACKGROUND, null, null, null, null, Theme.key_chat_serviceBackground),
|
|
new ThemeDescription(bigEmptyView, ThemeDescription.FLAG_SERVICEBACKGROUND, null, null, null, null, Theme.key_chat_serviceBackground),
|
|
|
|
new ThemeDescription(chatListView, ThemeDescription.FLAG_SERVICEBACKGROUND, new Class[]{ChatLoadingCell.class}, new String[]{"textView"}, null, null, null, Theme.key_chat_serviceBackground),
|
|
new ThemeDescription(chatListView, ThemeDescription.FLAG_PROGRESSBAR, new Class[]{ChatLoadingCell.class}, new String[]{"textView"}, null, null, null, Theme.key_chat_serviceText),
|
|
|
|
new ThemeDescription(mentionListView, ThemeDescription.FLAG_TEXTCOLOR, new Class[]{BotSwitchCell.class}, new String[]{"textView"}, null, null, null, Theme.key_chat_botSwitchToInlineText),
|
|
|
|
new ThemeDescription(mentionListView, ThemeDescription.FLAG_TEXTCOLOR, new Class[]{MentionCell.class}, new String[]{"nameTextView"}, null, null, null, Theme.key_windowBackgroundWhiteBlackText),
|
|
new ThemeDescription(mentionListView, ThemeDescription.FLAG_TEXTCOLOR, new Class[]{MentionCell.class}, new String[]{"usernameTextView"}, null, null, null, Theme.key_windowBackgroundWhiteGrayText3),
|
|
|
|
new ThemeDescription(mentionListView, 0, new Class[]{ContextLinkCell.class}, null, new Drawable[]{Theme.chat_inlineResultFile, Theme.chat_inlineResultAudio, Theme.chat_inlineResultLocation}, null, Theme.key_chat_inlineResultIcon),
|
|
new ThemeDescription(mentionListView, 0, new Class[]{ContextLinkCell.class}, null, null, null, Theme.key_windowBackgroundWhiteGrayText2),
|
|
new ThemeDescription(mentionListView, 0, new Class[]{ContextLinkCell.class}, null, null, null, Theme.key_windowBackgroundWhiteLinkText),
|
|
new ThemeDescription(mentionListView, 0, new Class[]{ContextLinkCell.class}, null, null, null, Theme.key_windowBackgroundWhiteBlackText),
|
|
new ThemeDescription(mentionListView, 0, new Class[]{ContextLinkCell.class}, null, null, null, Theme.key_chat_inAudioProgress),
|
|
new ThemeDescription(mentionListView, 0, new Class[]{ContextLinkCell.class}, null, null, null, Theme.key_chat_inAudioSelectedProgress),
|
|
new ThemeDescription(mentionListView, 0, new Class[]{ContextLinkCell.class}, null, null, null, Theme.key_divider),
|
|
|
|
new ThemeDescription(gifHintTextView, ThemeDescription.FLAG_BACKGROUNDFILTER, null, null, null, null, Theme.key_chat_gifSaveHintBackground),
|
|
new ThemeDescription(gifHintTextView, ThemeDescription.FLAG_TEXTCOLOR, null, null, null, null, Theme.key_chat_gifSaveHintText),
|
|
|
|
new ThemeDescription(pagedownButtonCounter, ThemeDescription.FLAG_BACKGROUNDFILTER, null, null, null, null, Theme.key_chat_goDownButtonCounterBackground),
|
|
new ThemeDescription(pagedownButtonCounter, ThemeDescription.FLAG_TEXTCOLOR, null, null, null, null, Theme.key_chat_goDownButtonCounter),
|
|
new ThemeDescription(pagedownButtonImage, ThemeDescription.FLAG_BACKGROUNDFILTER, null, null, null, null, Theme.key_chat_goDownButton),
|
|
new ThemeDescription(pagedownButtonImage, ThemeDescription.FLAG_BACKGROUNDFILTER | ThemeDescription.FLAG_DRAWABLESELECTEDSTATE, null, null, null, null, Theme.key_chat_goDownButtonShadow),
|
|
new ThemeDescription(pagedownButtonImage, ThemeDescription.FLAG_IMAGECOLOR, null, null, null, null, Theme.key_chat_goDownButtonIcon),
|
|
|
|
new ThemeDescription(mentiondownButtonCounter, ThemeDescription.FLAG_BACKGROUNDFILTER, null, null, null, null, Theme.key_chat_goDownButtonCounterBackground),
|
|
new ThemeDescription(mentiondownButtonCounter, ThemeDescription.FLAG_TEXTCOLOR, null, null, null, null, Theme.key_chat_goDownButtonCounter),
|
|
new ThemeDescription(mentiondownButtonImage, ThemeDescription.FLAG_BACKGROUNDFILTER, null, null, null, null, Theme.key_chat_goDownButton),
|
|
new ThemeDescription(mentiondownButtonImage, ThemeDescription.FLAG_BACKGROUNDFILTER | ThemeDescription.FLAG_DRAWABLESELECTEDSTATE, null, null, null, null, Theme.key_chat_goDownButtonShadow),
|
|
new ThemeDescription(mentiondownButtonImage, ThemeDescription.FLAG_IMAGECOLOR, null, null, null, null, Theme.key_chat_goDownButtonIcon),
|
|
|
|
new ThemeDescription(avatarContainer.getTimeItem(), 0, null, null, null, null, Theme.key_chat_secretTimerBackground),
|
|
new ThemeDescription(avatarContainer.getTimeItem(), 0, null, null, null, null, Theme.key_chat_secretTimerText),
|
|
};
|
|
}
|
|
}
|