Search in sources :

Example 1 with ReactionTabHolderView

use of org.telegram.ui.Components.ReactionTabHolderView in project Telegram-FOSS by Telegram-FOSS-Team.

the class ChatActivity method createMenu.

private void createMenu(View v, boolean single, boolean listView, float x, float y, boolean searchGroup) {
    if (actionBar.isActionModeShowed() || reportType >= 0) {
        return;
    }
    MessageObject message;
    MessageObject primaryMessage;
    if (v instanceof ChatMessageCell) {
        message = ((ChatMessageCell) v).getMessageObject();
        primaryMessage = ((ChatMessageCell) v).getPrimaryMessageObject();
    } else if (v instanceof ChatActionCell) {
        message = ((ChatActionCell) v).getMessageObject();
        primaryMessage = message;
    } else {
        primaryMessage = null;
        message = null;
    }
    if (message == null) {
        return;
    }
    final int type = getMessageType(message);
    if (single) {
        if (message.messageOwner.action instanceof TLRPC.TL_messageActionPinMessage) {
            if (message.getReplyMsgId() != 0) {
                scrollToMessageId(message.getReplyMsgId(), message.messageOwner.id, true, message.getDialogId() == mergeDialogId ? 1 : 0, false, 0);
            } else {
                Toast.makeText(getParentActivity(), LocaleController.getString("MessageNotFound", R.string.MessageNotFound), Toast.LENGTH_SHORT).show();
            }
            return;
        } else if (message.messageOwner.action instanceof TLRPC.TL_messageActionSetMessagesTTL) {
            if (avatarContainer.openSetTimer()) {
                return;
            }
        } else if (message.messageOwner.action instanceof TLRPC.TL_messageActionPaymentSent && message.replyMessageObject != null && message.replyMessageObject.isInvoice()) {
            TLRPC.TL_payments_getPaymentReceipt req = new TLRPC.TL_payments_getPaymentReceipt();
            req.msg_id = message.getId();
            req.peer = getMessagesController().getInputPeer(message.messageOwner.peer_id);
            getConnectionsManager().sendRequest(req, (response, error) -> AndroidUtilities.runOnUIThread(() -> {
                if (response instanceof TLRPC.TL_payments_paymentReceipt) {
                    presentFragment(new PaymentFormActivity((TLRPC.TL_payments_paymentReceipt) response));
                }
            }), ConnectionsManager.RequestFlagFailOnServerErrors);
            return;
        } else if (message.messageOwner.action instanceof TLRPC.TL_messageActionGroupCall || message.messageOwner.action instanceof TLRPC.TL_messageActionInviteToGroupCall || message.messageOwner.action instanceof TLRPC.TL_messageActionGroupCallScheduled) {
            if (getParentActivity() == null) {
                return;
            }
            VoIPService sharedInstance = VoIPService.getSharedInstance();
            if (sharedInstance != null) {
                if (sharedInstance.groupCall != null && message.messageOwner.action.call.id == sharedInstance.groupCall.call.id) {
                    if (getParentActivity() instanceof LaunchActivity) {
                        GroupCallActivity.create((LaunchActivity) getParentActivity(), AccountInstance.getInstance(currentAccount), null, null, false, null);
                    } else {
                        Intent intent = new Intent(getParentActivity(), LaunchActivity.class).setAction("voip_chat");
                        intent.putExtra("currentAccount", VoIPService.getSharedInstance().getAccount());
                        getParentActivity().startActivity(intent);
                    }
                } else {
                    createGroupCall = getGroupCall() == null;
                    VoIPHelper.startCall(currentChat, null, null, createGroupCall, getParentActivity(), ChatActivity.this, getAccountInstance());
                }
                return;
            } else if (fragmentContextView != null && getGroupCall() != null) {
                if (VoIPService.getSharedInstance() != null) {
                    GroupCallActivity.create((LaunchActivity) getParentActivity(), AccountInstance.getInstance(VoIPService.getSharedInstance().getAccount()), null, null, false, null);
                } else {
                    ChatObject.Call call = getGroupCall();
                    if (call == null) {
                        return;
                    }
                    VoIPHelper.startCall(getMessagesController().getChat(call.chatId), null, null, false, getParentActivity(), ChatActivity.this, getAccountInstance());
                }
                return;
            } else if (ChatObject.canManageCalls(currentChat)) {
                VoIPHelper.showGroupCallAlert(ChatActivity.this, currentChat, null, true, getAccountInstance());
                return;
            }
        } else if (message.messageOwner.action instanceof TLRPC.TL_messageActionSetChatTheme) {
            showChatThemeBottomSheet();
            return;
        }
    }
    if (message.isSponsored() || threadMessageObjects != null && threadMessageObjects.contains(message)) {
        single = true;
    }
    selectedObject = null;
    selectedObjectGroup = null;
    forwardingMessage = null;
    forwardingMessageGroup = null;
    selectedObjectToEditCaption = null;
    for (int a = 1; a >= 0; a--) {
        selectedMessagesCanCopyIds[a].clear();
        selectedMessagesCanStarIds[a].clear();
        selectedMessagesIds[a].clear();
    }
    hideActionMode();
    updatePinnedMessageView(true);
    MessageObject.GroupedMessages groupedMessages;
    if (searchGroup) {
        groupedMessages = getValidGroupedMessage(message);
    } else {
        groupedMessages = null;
    }
    boolean allowChatActions = true;
    boolean allowPin;
    if (chatMode == MODE_SCHEDULED || isThreadChat()) {
        allowPin = false;
    } else if (currentChat != null) {
        allowPin = message.getDialogId() != mergeDialogId && ChatObject.canPinMessages(currentChat);
    } else if (currentEncryptedChat == null) {
        if (UserObject.isDeleted(currentUser)) {
            allowPin = false;
        } else if (userInfo != null) {
            allowPin = userInfo.can_pin_message;
        } else {
            allowPin = false;
        }
    } else {
        allowPin = false;
    }
    allowPin = allowPin && message.getId() > 0 && (message.messageOwner.action == null || message.messageOwner.action instanceof TLRPC.TL_messageActionEmpty);
    boolean noforwards = getMessagesController().isChatNoForwards(currentChat) || message.messageOwner.noforwards;
    boolean allowUnpin = message.getDialogId() != mergeDialogId && allowPin && (pinnedMessageObjects.containsKey(message.getId()) || groupedMessages != null && !groupedMessages.messages.isEmpty() && pinnedMessageObjects.containsKey(groupedMessages.messages.get(0).getId()));
    boolean allowEdit = message.canEditMessage(currentChat) && !chatActivityEnterView.hasAudioToSend() && message.getDialogId() != mergeDialogId;
    if (allowEdit && groupedMessages != null) {
        int captionsCount = 0;
        for (int a = 0, N = groupedMessages.messages.size(); a < N; a++) {
            MessageObject messageObject = groupedMessages.messages.get(a);
            if (a == 0 || !TextUtils.isEmpty(messageObject.caption)) {
                selectedObjectToEditCaption = messageObject;
                if (!TextUtils.isEmpty(messageObject.caption)) {
                    captionsCount++;
                }
            }
        }
        allowEdit = captionsCount < 2;
    }
    if (chatMode == MODE_SCHEDULED || threadMessageObjects != null && threadMessageObjects.contains(message) || message.isSponsored() || type == 1 && message.getDialogId() == mergeDialogId || message.messageOwner.action instanceof TLRPC.TL_messageActionSecureValuesSent || currentEncryptedChat == null && message.getId() < 0 || bottomOverlayChat != null && bottomOverlayChat.getVisibility() == View.VISIBLE || currentChat != null && (ChatObject.isNotInChat(currentChat) && !isThreadChat() || ChatObject.isChannel(currentChat) && !ChatObject.canPost(currentChat) && !currentChat.megagroup || !ChatObject.canSendMessages(currentChat))) {
        allowChatActions = false;
    }
    if (single || type < 2 || type == 20) {
        if (getParentActivity() == null) {
            return;
        }
        ArrayList<Integer> icons = new ArrayList<>();
        ArrayList<CharSequence> items = new ArrayList<>();
        final ArrayList<Integer> options = new ArrayList<>();
        CharSequence messageText = null;
        if (type >= 0 || type == -1 && single && (message.isSending() || message.isEditing()) && currentEncryptedChat == null) {
            selectedObject = message;
            selectedObjectGroup = groupedMessages;
            // used only in translations
            messageText = getMessageCaption(selectedObject, selectedObjectGroup);
            if (messageText == null && selectedObject.isPoll()) {
                try {
                    TLRPC.Poll poll = ((TLRPC.TL_messageMediaPoll) selectedObject.messageOwner.media).poll;
                    StringBuilder pollText = new StringBuilder();
                    pollText = new StringBuilder(poll.question).append("\n");
                    for (TLRPC.TL_pollAnswer answer : poll.answers) pollText.append("\n\uD83D\uDD18 ").append(answer.text);
                    messageText = pollText.toString();
                } catch (Exception e) {
                }
            }
            if (messageText == null)
                messageText = getMessageContent(selectedObject, 0, false);
            if (messageText != null) {
                if (isEmoji(messageText.toString()))
                    // message fully consists of emojis, do not translate
                    messageText = null;
            }
            if (type == -1) {
                if ((selectedObject.type == 0 || selectedObject.isAnimatedEmoji() || getMessageCaption(selectedObject, selectedObjectGroup) != null) && !noforwards) {
                    items.add(LocaleController.getString("Copy", R.string.Copy));
                    options.add(OPTION_COPY);
                    icons.add(R.drawable.msg_copy);
                }
                items.add(LocaleController.getString("CancelSending", R.string.CancelSending));
                options.add(OPTION_CANCEL_SENDING);
                icons.add(R.drawable.msg_delete);
            } else if (type == 0) {
                items.add(LocaleController.getString("Retry", R.string.Retry));
                options.add(OPTION_RETRY);
                icons.add(R.drawable.msg_retry);
                items.add(LocaleController.getString("Delete", R.string.Delete));
                options.add(OPTION_DELETE);
                icons.add(selectedObject.messageOwner.ttl_period != 0 ? R.drawable.msg_delete_auto : R.drawable.msg_delete);
            } else if (type == 1) {
                if (currentChat != null) {
                    if (allowChatActions) {
                        items.add(LocaleController.getString("Reply", R.string.Reply));
                        options.add(OPTION_REPLY);
                        icons.add(R.drawable.msg_reply);
                    }
                    if (!isThreadChat() && chatMode != MODE_SCHEDULED && message.hasReplies() && currentChat.megagroup && message.canViewThread()) {
                        items.add(LocaleController.formatPluralString("ViewReplies", message.getRepliesCount()));
                        options.add(OPTION_VIEW_REPLIES_OR_THREAD);
                        icons.add(R.drawable.msg_viewreplies);
                    }
                    if (allowUnpin) {
                        items.add(LocaleController.getString("UnpinMessage", R.string.UnpinMessage));
                        options.add(OPTION_UNPIN);
                        icons.add(R.drawable.msg_unpin);
                    } else if (allowPin) {
                        items.add(LocaleController.getString("PinMessage", R.string.PinMessage));
                        options.add(OPTION_PIN);
                        icons.add(R.drawable.msg_pin);
                    }
                    if (selectedObject != null && selectedObject.contentType == 0 && (messageText != null && messageText.length() > 0 && !selectedObject.isAnimatedEmoji() && !selectedObject.isDice()) && MessagesController.getGlobalMainSettings().getBoolean("translate_button", false)) {
                        items.add(LocaleController.getString("TranslateMessage", R.string.TranslateMessage));
                        options.add(29);
                        icons.add(R.drawable.msg_translate);
                    }
                    if (message.canEditMessage(currentChat)) {
                        items.add(LocaleController.getString("Edit", R.string.Edit));
                        options.add(OPTION_EDIT);
                        icons.add(R.drawable.msg_edit);
                    }
                    if (selectedObject.contentType == 0 && !selectedObject.isMediaEmptyWebpage() && selectedObject.getId() > 0 && !selectedObject.isOut() && (currentChat != null || currentUser != null && currentUser.bot)) {
                        items.add(LocaleController.getString("ReportChat", R.string.ReportChat));
                        options.add(OPTION_REPORT_CHAT);
                        icons.add(R.drawable.msg_report);
                    }
                } else {
                    if (selectedObject.getId() > 0 && allowChatActions) {
                        items.add(LocaleController.getString("Reply", R.string.Reply));
                        options.add(OPTION_REPLY);
                        icons.add(R.drawable.msg_reply);
                    }
                }
                if (message.canDeleteMessage(chatMode == MODE_SCHEDULED, currentChat) && (threadMessageObjects == null || !threadMessageObjects.contains(message))) {
                    items.add(LocaleController.getString("Delete", R.string.Delete));
                    options.add(OPTION_DELETE);
                    icons.add(selectedObject.messageOwner.ttl_period != 0 ? R.drawable.msg_delete_auto : R.drawable.msg_delete);
                }
            } else if (type == 20) {
                items.add(LocaleController.getString("Retry", R.string.Retry));
                options.add(OPTION_RETRY);
                icons.add(R.drawable.msg_retry);
                if (!noforwards) {
                    items.add(LocaleController.getString("Copy", R.string.Copy));
                    options.add(OPTION_COPY);
                    icons.add(R.drawable.msg_copy);
                }
                items.add(LocaleController.getString("Delete", R.string.Delete));
                options.add(OPTION_DELETE);
                icons.add(selectedObject.messageOwner.ttl_period != 0 ? R.drawable.msg_delete_auto : R.drawable.msg_delete);
            } else {
                if (currentEncryptedChat == null) {
                    if (chatMode == MODE_SCHEDULED) {
                        items.add(LocaleController.getString("MessageScheduleSend", R.string.MessageScheduleSend));
                        options.add(OPTION_SEND_NOW);
                        icons.add(R.drawable.outline_send);
                    }
                    if (selectedObject.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(OPTION_CALL_AGAIN);
                        icons.add(R.drawable.msg_callback);
                        if (VoIPHelper.canRateCall(call)) {
                            items.add(LocaleController.getString("CallMessageReportProblem", R.string.CallMessageReportProblem));
                            options.add(OPTION_RATE_CALL);
                            icons.add(R.drawable.msg_fave);
                        }
                    }
                    if (allowChatActions) {
                        items.add(LocaleController.getString("Reply", R.string.Reply));
                        options.add(8);
                        icons.add(R.drawable.msg_reply);
                    }
                    if ((selectedObject.type == 0 || selectedObject.isDice() || selectedObject.isAnimatedEmoji() || getMessageCaption(selectedObject, selectedObjectGroup) != null) && !noforwards) {
                        items.add(LocaleController.getString("Copy", R.string.Copy));
                        options.add(3);
                        icons.add(R.drawable.msg_copy);
                    }
                    if (!isThreadChat() && chatMode != MODE_SCHEDULED && currentChat != null && (currentChat.has_link || message.hasReplies()) && currentChat.megagroup && message.canViewThread()) {
                        if (message.hasReplies()) {
                            items.add(LocaleController.formatPluralString("ViewReplies", message.getRepliesCount()));
                        } else {
                            items.add(LocaleController.getString("ViewThread", R.string.ViewThread));
                        }
                        options.add(27);
                        icons.add(R.drawable.msg_viewreplies);
                    }
                    if (!selectedObject.isSponsored() && chatMode != MODE_SCHEDULED && ChatObject.isChannel(currentChat) && selectedObject.getDialogId() != mergeDialogId) {
                        items.add(LocaleController.getString("CopyLink", R.string.CopyLink));
                        options.add(22);
                        icons.add(R.drawable.msg_link);
                    }
                    if (type == 2) {
                        if (chatMode != MODE_SCHEDULED) {
                            if (selectedObject.type == MessageObject.TYPE_POLL && !message.isPollClosed()) {
                                if (message.canUnvote()) {
                                    items.add(LocaleController.getString("Unvote", R.string.Unvote));
                                    options.add(25);
                                    icons.add(R.drawable.msg_unvote);
                                }
                                if (!message.isForwarded() && (message.isOut() && (!ChatObject.isChannel(currentChat) || currentChat.megagroup) || ChatObject.isChannel(currentChat) && !currentChat.megagroup && (currentChat.creator || currentChat.admin_rights != null && currentChat.admin_rights.edit_messages))) {
                                    if (message.isQuiz()) {
                                        items.add(LocaleController.getString("StopQuiz", R.string.StopQuiz));
                                    } else {
                                        items.add(LocaleController.getString("StopPoll", R.string.StopPoll));
                                    }
                                    options.add(26);
                                    icons.add(R.drawable.msg_pollstop);
                                }
                            } else if (selectedObject.isMusic() && !noforwards) {
                                items.add(LocaleController.getString("SaveToMusic", R.string.SaveToMusic));
                                options.add(OPTION_SAVE_TO_DOWNLOADS_OR_MUSIC);
                                icons.add(R.drawable.msg_download);
                            } else if (selectedObject.isDocument() && !noforwards) {
                                items.add(LocaleController.getString("SaveToDownloads", R.string.SaveToDownloads));
                                options.add(OPTION_SAVE_TO_DOWNLOADS_OR_MUSIC);
                                icons.add(R.drawable.msg_download);
                            }
                        }
                    } else if (type == 3 && !noforwards) {
                        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);
                            icons.add(R.drawable.msg_gif);
                        }
                    } else if (type == 4) {
                        if (!noforwards) {
                            if (selectedObject.isVideo()) {
                                if (!selectedObject.needDrawBluredPreview()) {
                                    items.add(LocaleController.getString("SaveToGallery", R.string.SaveToGallery));
                                    options.add(4);
                                    icons.add(R.drawable.msg_gallery);
                                    items.add(LocaleController.getString("ShareFile", R.string.ShareFile));
                                    options.add(6);
                                    icons.add(R.drawable.msg_shareout);
                                }
                            } else if (selectedObject.isMusic()) {
                                items.add(LocaleController.getString("SaveToMusic", R.string.SaveToMusic));
                                options.add(OPTION_SAVE_TO_DOWNLOADS_OR_MUSIC);
                                icons.add(R.drawable.msg_download);
                                items.add(LocaleController.getString("ShareFile", R.string.ShareFile));
                                options.add(6);
                                icons.add(R.drawable.msg_shareout);
                            } else if (selectedObject.getDocument() != null) {
                                if (MessageObject.isNewGifDocument(selectedObject.getDocument())) {
                                    items.add(LocaleController.getString("SaveToGIFs", R.string.SaveToGIFs));
                                    options.add(11);
                                    icons.add(R.drawable.msg_gif);
                                }
                                items.add(LocaleController.getString("SaveToDownloads", R.string.SaveToDownloads));
                                options.add(OPTION_SAVE_TO_DOWNLOADS_OR_MUSIC);
                                icons.add(R.drawable.msg_download);
                                items.add(LocaleController.getString("ShareFile", R.string.ShareFile));
                                options.add(6);
                                icons.add(R.drawable.msg_shareout);
                            } else {
                                if (!selectedObject.needDrawBluredPreview()) {
                                    items.add(LocaleController.getString("SaveToGallery", R.string.SaveToGallery));
                                    options.add(4);
                                    icons.add(R.drawable.msg_gallery);
                                }
                            }
                        }
                    } else if (type == 5) {
                        items.add(LocaleController.getString("ApplyLocalizationFile", R.string.ApplyLocalizationFile));
                        options.add(5);
                        icons.add(R.drawable.msg_language);
                        if (!noforwards) {
                            items.add(LocaleController.getString("SaveToDownloads", R.string.SaveToDownloads));
                            options.add(OPTION_SAVE_TO_DOWNLOADS_OR_MUSIC);
                            icons.add(R.drawable.msg_download);
                            items.add(LocaleController.getString("ShareFile", R.string.ShareFile));
                            options.add(6);
                            icons.add(R.drawable.msg_shareout);
                        }
                    } else if (type == 10) {
                        items.add(LocaleController.getString("ApplyThemeFile", R.string.ApplyThemeFile));
                        options.add(5);
                        icons.add(R.drawable.msg_theme);
                        if (!noforwards) {
                            items.add(LocaleController.getString("SaveToDownloads", R.string.SaveToDownloads));
                            options.add(OPTION_SAVE_TO_DOWNLOADS_OR_MUSIC);
                            icons.add(R.drawable.msg_download);
                            items.add(LocaleController.getString("ShareFile", R.string.ShareFile));
                            options.add(6);
                            icons.add(R.drawable.msg_shareout);
                        }
                    } else if (type == 6 && !noforwards) {
                        items.add(LocaleController.getString("SaveToGallery", R.string.SaveToGallery));
                        options.add(7);
                        icons.add(R.drawable.msg_gallery);
                        items.add(LocaleController.getString("SaveToDownloads", R.string.SaveToDownloads));
                        options.add(OPTION_SAVE_TO_DOWNLOADS_OR_MUSIC);
                        icons.add(R.drawable.msg_download);
                        items.add(LocaleController.getString("ShareFile", R.string.ShareFile));
                        options.add(6);
                        icons.add(R.drawable.msg_shareout);
                    } else if (type == 7) {
                        if (selectedObject.isMask()) {
                            items.add(LocaleController.getString("AddToMasks", R.string.AddToMasks));
                            options.add(9);
                            icons.add(R.drawable.msg_sticker);
                        } else {
                            items.add(LocaleController.getString("AddToStickers", R.string.AddToStickers));
                            options.add(9);
                            icons.add(R.drawable.msg_sticker);
                            TLRPC.Document document = selectedObject.getDocument();
                            if (!getMediaDataController().isStickerInFavorites(document)) {
                                if (getMediaDataController().canAddStickerToFavorites() && MessageObject.isStickerHasSet(document)) {
                                    items.add(LocaleController.getString("AddToFavorites", R.string.AddToFavorites));
                                    options.add(20);
                                    icons.add(R.drawable.msg_fave);
                                }
                            } else {
                                items.add(LocaleController.getString("DeleteFromFavorites", R.string.DeleteFromFavorites));
                                options.add(21);
                                icons.add(R.drawable.msg_unfave);
                            }
                        }
                    } else if (type == 8) {
                        long uid = selectedObject.messageOwner.media.user_id;
                        TLRPC.User user = null;
                        if (uid != 0) {
                            user = MessagesController.getInstance(currentAccount).getUser(uid);
                        }
                        if (user != null && user.id != getUserConfig().getClientUserId() && getContactsController().contactsDict.get(user.id) == null) {
                            items.add(LocaleController.getString("AddContactTitle", R.string.AddContactTitle));
                            options.add(15);
                            icons.add(R.drawable.msg_addcontact);
                        }
                        if (!TextUtils.isEmpty(selectedObject.messageOwner.media.phone_number)) {
                            if (!noforwards) {
                                items.add(LocaleController.getString("Copy", R.string.Copy));
                                options.add(16);
                                icons.add(R.drawable.msg_copy);
                            }
                            items.add(LocaleController.getString("Call", R.string.Call));
                            options.add(17);
                            icons.add(R.drawable.msg_callback);
                        }
                    } else if (type == 9) {
                        TLRPC.Document document = selectedObject.getDocument();
                        if (!getMediaDataController().isStickerInFavorites(document)) {
                            if (MessageObject.isStickerHasSet(document)) {
                                items.add(LocaleController.getString("AddToFavorites", R.string.AddToFavorites));
                                options.add(20);
                                icons.add(R.drawable.msg_fave);
                            }
                        } else {
                            items.add(LocaleController.getString("DeleteFromFavorites", R.string.DeleteFromFavorites));
                            options.add(21);
                            icons.add(R.drawable.msg_unfave);
                        }
                    }
                    if (!selectedObject.isSponsored() && chatMode != MODE_SCHEDULED && !selectedObject.needDrawBluredPreview() && !selectedObject.isLiveLocation() && selectedObject.type != 16 && !noforwards) {
                        items.add(LocaleController.getString("Forward", R.string.Forward));
                        options.add(2);
                        icons.add(R.drawable.msg_forward);
                    }
                    if (allowUnpin) {
                        items.add(LocaleController.getString("UnpinMessage", R.string.UnpinMessage));
                        options.add(14);
                        icons.add(R.drawable.msg_unpin);
                    } else if (allowPin) {
                        items.add(LocaleController.getString("PinMessage", R.string.PinMessage));
                        options.add(13);
                        icons.add(R.drawable.msg_pin);
                    }
                    if (selectedObject != null && selectedObject.contentType == 0 && (messageText != null && messageText.length() > 0 && !selectedObject.isAnimatedEmoji() && !selectedObject.isDice()) && MessagesController.getGlobalMainSettings().getBoolean("translate_button", false)) {
                        items.add(LocaleController.getString("TranslateMessage", R.string.TranslateMessage));
                        options.add(29);
                        icons.add(R.drawable.msg_translate);
                    }
                    if (allowEdit) {
                        items.add(LocaleController.getString("Edit", R.string.Edit));
                        options.add(12);
                        icons.add(R.drawable.msg_edit);
                    }
                    if (chatMode == MODE_SCHEDULED && selectedObject.canEditMessageScheduleTime(currentChat)) {
                        items.add(LocaleController.getString("MessageScheduleEditTime", R.string.MessageScheduleEditTime));
                        options.add(102);
                        icons.add(R.drawable.msg_schedule);
                    }
                    if (chatMode != MODE_SCHEDULED && selectedObject.contentType == 0 && selectedObject.getId() > 0 && !selectedObject.isOut() && (currentChat != null || currentUser != null && currentUser.bot)) {
                        if (UserObject.isReplyUser(currentUser)) {
                            items.add(LocaleController.getString("BlockContact", R.string.BlockContact));
                            options.add(23);
                            icons.add(R.drawable.msg_block2);
                        } else {
                            items.add(LocaleController.getString("ReportChat", R.string.ReportChat));
                            options.add(23);
                            icons.add(R.drawable.msg_report);
                        }
                    }
                    if (message.canDeleteMessage(chatMode == MODE_SCHEDULED, currentChat) && (threadMessageObjects == null || !threadMessageObjects.contains(message))) {
                        items.add(LocaleController.getString("Delete", R.string.Delete));
                        options.add(1);
                        icons.add(selectedObject.messageOwner.ttl_period != 0 ? R.drawable.msg_delete_auto : R.drawable.msg_delete);
                    }
                } else {
                    if (allowChatActions) {
                        items.add(LocaleController.getString("Reply", R.string.Reply));
                        options.add(8);
                        icons.add(R.drawable.msg_reply);
                    }
                    if ((selectedObject.type == 0 || selectedObject.isAnimatedEmoji() || getMessageCaption(selectedObject, selectedObjectGroup) != null) && !noforwards) {
                        items.add(LocaleController.getString("Copy", R.string.Copy));
                        options.add(3);
                        icons.add(R.drawable.msg_copy);
                    }
                    if (!isThreadChat() && chatMode != MODE_SCHEDULED && currentChat != null && (currentChat.has_link || message.hasReplies()) && currentChat.megagroup && message.canViewThread()) {
                        if (message.hasReplies()) {
                            items.add(LocaleController.formatPluralString("ViewReplies", message.getRepliesCount()));
                        } else {
                            items.add(LocaleController.getString("ViewThread", R.string.ViewThread));
                        }
                        options.add(27);
                        icons.add(R.drawable.msg_viewreplies);
                    }
                    if (type == 4 && !noforwards) {
                        if (selectedObject.isVideo()) {
                            items.add(LocaleController.getString("SaveToGallery", R.string.SaveToGallery));
                            options.add(4);
                            icons.add(R.drawable.msg_gallery);
                            items.add(LocaleController.getString("ShareFile", R.string.ShareFile));
                            options.add(6);
                            icons.add(R.drawable.msg_shareout);
                        } else if (selectedObject.isMusic()) {
                            items.add(LocaleController.getString("SaveToMusic", R.string.SaveToMusic));
                            options.add(OPTION_SAVE_TO_DOWNLOADS_OR_MUSIC);
                            icons.add(R.drawable.msg_download);
                            items.add(LocaleController.getString("ShareFile", R.string.ShareFile));
                            options.add(6);
                            icons.add(R.drawable.msg_shareout);
                        } else if (!selectedObject.isVideo() && selectedObject.getDocument() != null) {
                            items.add(LocaleController.getString("SaveToDownloads", R.string.SaveToDownloads));
                            options.add(OPTION_SAVE_TO_DOWNLOADS_OR_MUSIC);
                            icons.add(R.drawable.msg_download);
                            items.add(LocaleController.getString("ShareFile", R.string.ShareFile));
                            options.add(6);
                            icons.add(R.drawable.msg_shareout);
                        } else {
                            items.add(LocaleController.getString("SaveToGallery", R.string.SaveToGallery));
                            options.add(4);
                            icons.add(R.drawable.msg_gallery);
                        }
                    } else if (type == 5) {
                        items.add(LocaleController.getString("ApplyLocalizationFile", R.string.ApplyLocalizationFile));
                        options.add(5);
                        icons.add(R.drawable.msg_language);
                    } else if (type == 10) {
                        items.add(LocaleController.getString("ApplyThemeFile", R.string.ApplyThemeFile));
                        options.add(5);
                        icons.add(R.drawable.msg_theme);
                    } else if (type == 7) {
                        items.add(LocaleController.getString("AddToStickers", R.string.AddToStickers));
                        options.add(9);
                        icons.add(R.drawable.msg_sticker);
                    } else if (type == 8) {
                        long uid = selectedObject.messageOwner.media.user_id;
                        TLRPC.User user = null;
                        if (uid != 0) {
                            user = MessagesController.getInstance(currentAccount).getUser(uid);
                        }
                        if (user != null && user.id != getUserConfig().getClientUserId() && getContactsController().contactsDict.get(user.id) == null) {
                            items.add(LocaleController.getString("AddContactTitle", R.string.AddContactTitle));
                            options.add(15);
                            icons.add(R.drawable.msg_addcontact);
                        }
                        if (!TextUtils.isEmpty(selectedObject.messageOwner.media.phone_number)) {
                            if (!noforwards) {
                                items.add(LocaleController.getString("Copy", R.string.Copy));
                                options.add(16);
                                icons.add(R.drawable.msg_copy);
                            }
                            items.add(LocaleController.getString("Call", R.string.Call));
                            options.add(17);
                            icons.add(R.drawable.msg_callback);
                        }
                    }
                    items.add(LocaleController.getString("Delete", R.string.Delete));
                    options.add(1);
                    icons.add(selectedObject.messageOwner.ttl_period != 0 ? R.drawable.msg_delete_auto : R.drawable.msg_delete);
                }
            }
        }
        if (options.isEmpty()) {
            return;
        }
        if (scrimPopupWindow != null) {
            closeMenu();
            menuDeleteItem = null;
            scrimPopupWindowItems = null;
            return;
        }
        final AtomicBoolean waitForLangDetection = new AtomicBoolean(false);
        final AtomicReference<Runnable> onLangDetectionDone = new AtomicReference(null);
        Rect rect = new Rect();
        List<TLRPC.TL_availableReaction> availableReacts = getMediaDataController().getEnabledReactionsList();
        boolean isReactionsViewAvailable = !isSecretChat() && !isInScheduleMode() && currentUser == null && message.hasReactions() && (!ChatObject.isChannel(currentChat) || currentChat.megagroup) && !availableReacts.isEmpty() && message.messageOwner.reactions.can_see_list;
        boolean isReactionsAvailable;
        if (message.isForwardedChannelPost()) {
            TLRPC.ChatFull chatInfo = getMessagesController().getChatFull(-message.getFromChatId());
            if (chatInfo == null) {
                isReactionsAvailable = true;
            } else {
                isReactionsAvailable = !isSecretChat() && !isInScheduleMode() && message.isReactionsAvailable() && (chatInfo != null && !chatInfo.available_reactions.isEmpty()) && !availableReacts.isEmpty();
            }
        } else {
            isReactionsAvailable = !isSecretChat() && !isInScheduleMode() && message.isReactionsAvailable() && (chatInfo != null && !chatInfo.available_reactions.isEmpty() || (chatInfo == null && !ChatObject.isChannel(currentChat)) || currentUser != null) && !availableReacts.isEmpty();
        }
        boolean showMessageSeen = !isReactionsViewAvailable && !isInScheduleMode() && currentChat != null && message.isOutOwner() && message.isSent() && !message.isEditing() && !message.isSending() && !message.isSendError() && !message.isContentUnread() && !message.isUnread() && (ConnectionsManager.getInstance(currentAccount).getCurrentTime() - message.messageOwner.date < getMessagesController().chatReadMarkExpirePeriod) && (ChatObject.isMegagroup(currentChat) || !ChatObject.isChannel(currentChat)) && chatInfo != null && chatInfo.participants_count < getMessagesController().chatReadMarkSizeThreshold && !(message.messageOwner.action instanceof TLRPC.TL_messageActionChatJoinedByRequest) && (v instanceof ChatMessageCell);
        int flags = 0;
        if (isReactionsViewAvailable || showMessageSeen) {
            flags |= ActionBarPopupWindow.ActionBarPopupWindowLayout.FLAG_USE_SWIPEBACK;
        }
        ActionBarPopupWindow.ActionBarPopupWindowLayout popupLayout = new ActionBarPopupWindow.ActionBarPopupWindowLayout(getParentActivity(), R.drawable.popup_fixed_alert, themeDelegate, flags);
        popupLayout.setMinimumWidth(AndroidUtilities.dp(200));
        Rect backgroundPaddings = new Rect();
        Drawable shadowDrawable = getParentActivity().getResources().getDrawable(R.drawable.popup_fixed_alert).mutate();
        shadowDrawable.getPadding(backgroundPaddings);
        popupLayout.setBackgroundColor(getThemedColor(Theme.key_actionBarDefaultSubmenuBackground));
        if (isReactionsViewAvailable) {
            ReactedHeaderView reactedView = new ReactedHeaderView(contentView.getContext(), currentAccount, message, dialog_id);
            int count = 0;
            if (message.messageOwner.reactions != null) {
                for (TLRPC.TL_reactionCount r : message.messageOwner.reactions.results) {
                    count += r.count;
                }
            }
            boolean hasHeader = count > 10;
            LinearLayout linearLayout = new LinearLayout(contentView.getContext()) {

                @Override
                protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
                    int size = MeasureSpec.getSize(widthMeasureSpec);
                    if (size < AndroidUtilities.dp(240)) {
                        size = AndroidUtilities.dp(240);
                    }
                    super.onMeasure(MeasureSpec.makeMeasureSpec(size, MeasureSpec.EXACTLY), heightMeasureSpec);
                }
            };
            linearLayout.setOrientation(LinearLayout.VERTICAL);
            linearLayout.setLayoutParams(new FrameLayout.LayoutParams(AndroidUtilities.dp(200), AndroidUtilities.dp(6 * 48 + (hasHeader ? 44 * 2 + 8 : 44)) + (!hasHeader ? 1 : 0)));
            ActionBarMenuSubItem backCell = new ActionBarMenuSubItem(getParentActivity(), true, false, themeDelegate);
            backCell.setItemHeight(44);
            backCell.setTextAndIcon(LocaleController.getString("Back", R.string.Back), R.drawable.msg_arrow_back);
            backCell.getTextView().setPadding(LocaleController.isRTL ? 0 : AndroidUtilities.dp(40), 0, LocaleController.isRTL ? AndroidUtilities.dp(40) : 0, 0);
            backCell.setOnClickListener(v1 -> popupLayout.getSwipeBack().closeForeground());
            linearLayout.addView(backCell, LayoutHelper.createLinear(LayoutHelper.MATCH_PARENT, LayoutHelper.WRAP_CONTENT));
            int[] foregroundIndex = new int[1];
            if (hasHeader) {
                List<TLRPC.TL_reactionCount> counters = message.messageOwner.reactions.results;
                LinearLayout tabsView = new LinearLayout(contentView.getContext());
                tabsView.setOrientation(LinearLayout.HORIZONTAL);
                ViewPager pager = new ViewPager(contentView.getContext());
                HorizontalScrollView tabsScrollView = new HorizontalScrollView(contentView.getContext());
                AtomicBoolean suppressTabsScroll = new AtomicBoolean();
                int size = counters.size() + 1;
                for (int i = 0; i < size; i++) {
                    ReactionTabHolderView hv = new ReactionTabHolderView(contentView.getContext());
                    if (i == 0) {
                        hv.setCounter(count);
                    } else
                        hv.setCounter(currentAccount, counters.get(i - 1));
                    int finalI = i;
                    hv.setOnClickListener(v1 -> {
                        int from = pager.getCurrentItem();
                        if (finalI == from)
                            return;
                        ReactionTabHolderView fv = (ReactionTabHolderView) tabsView.getChildAt(from);
                        suppressTabsScroll.set(true);
                        pager.setCurrentItem(finalI, true);
                        float fSX = tabsScrollView.getScrollX(), tSX = hv.getX() - (tabsScrollView.getWidth() - hv.getWidth()) / 2f;
                        ValueAnimator a = ValueAnimator.ofFloat(0, 1).setDuration(150);
                        a.setInterpolator(CubicBezierInterpolator.DEFAULT);
                        a.addUpdateListener(animation -> {
                            float f = (float) animation.getAnimatedValue();
                            tabsScrollView.setScrollX((int) (fSX + (tSX - fSX) * f));
                            fv.setOutlineProgress(1f - f);
                            hv.setOutlineProgress(f);
                        });
                        a.start();
                    });
                    tabsView.addView(hv, LayoutHelper.createFrameRelatively(LayoutHelper.WRAP_CONTENT, LayoutHelper.MATCH_PARENT, Gravity.CENTER_VERTICAL, i == 0 ? 6 : 0, 6, 6, 6));
                }
                tabsScrollView.setHorizontalScrollBarEnabled(false);
                tabsScrollView.addView(tabsView);
                linearLayout.addView(tabsScrollView, LayoutHelper.createLinear(LayoutHelper.MATCH_PARENT, 44));
                View divider = new FrameLayout(contentView.getContext());
                divider.setBackgroundColor(Theme.getColor(Theme.key_graySection));
                linearLayout.addView(divider, new LinearLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, (int) Theme.dividerPaint.getStrokeWidth()));
                int head = AndroidUtilities.dp(44 * 2) + 1;
                SparseArray<ReactedUsersListView> cachedViews = new SparseArray<>();
                SparseIntArray cachedHeights = new SparseIntArray();
                for (int i = 0; i < counters.size() + 1; i++) cachedHeights.put(i, head + AndroidUtilities.dp(ReactedUsersListView.ITEM_HEIGHT_DP * ReactedUsersListView.VISIBLE_ITEMS));
                pager.setAdapter(new PagerAdapter() {

                    @Override
                    public int getCount() {
                        return counters.size() + 1;
                    }

                    @Override
                    public boolean isViewFromObject(View view, Object object) {
                        return view == object;
                    }

                    @Override
                    public Object instantiateItem(ViewGroup container, int position) {
                        View cached = cachedViews.get(position);
                        if (cached != null) {
                            container.addView(cached);
                            return cached;
                        }
                        ReactedUsersListView v = new ReactedUsersListView(container.getContext(), themeDelegate, currentAccount, message, position == 0 ? null : counters.get(position - 1), true).setSeenUsers(reactedView.getSeenUsers()).setOnProfileSelectedListener((view, userId) -> {
                            Bundle args = new Bundle();
                            args.putLong("user_id", userId);
                            ProfileActivity fragment = new ProfileActivity(args);
                            presentFragment(fragment);
                            closeMenu();
                        }).setOnHeightChangedListener((view, newHeight) -> {
                            cachedHeights.put(position, head + newHeight);
                            if (pager.getCurrentItem() == position)
                                popupLayout.getSwipeBack().setNewForegroundHeight(foregroundIndex[0], head + newHeight);
                        });
                        if (position == 0)
                            reactedView.setSeenCallback(v::setSeenUsers);
                        container.addView(v);
                        cachedViews.put(position, v);
                        return v;
                    }

                    @Override
                    public void destroyItem(ViewGroup container, int position, Object object) {
                        container.removeView((View) object);
                    }
                });
                pager.addOnPageChangeListener(new ViewPager.OnPageChangeListener() {

                    @Override
                    public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {
                        if (!suppressTabsScroll.get()) {
                            float fX = -1, tX = -1;
                            for (int i = 0; i < tabsView.getChildCount(); i++) {
                                ReactionTabHolderView ch = (ReactionTabHolderView) tabsView.getChildAt(i);
                                ch.setOutlineProgress(i == position ? 1f - positionOffset : i == (position + 1) % size ? positionOffset : 0);
                                if (i == position) {
                                    fX = ch.getX() - (tabsScrollView.getWidth() - ch.getWidth()) / 2f;
                                }
                                if (i == position + 1) {
                                    tX = ch.getX() - (tabsScrollView.getWidth() - ch.getWidth()) / 2f;
                                }
                            }
                            if (fX != -1 && tX != -1)
                                tabsScrollView.setScrollX((int) (fX + (tX - fX) * positionOffset));
                        }
                    }

                    @Override
                    public void onPageSelected(int position) {
                        int h = cachedHeights.get(position);
                        popupLayout.getSwipeBack().setNewForegroundHeight(foregroundIndex[0], h);
                    }

                    @Override
                    public void onPageScrollStateChanged(int state) {
                        if (state == ViewPager.SCROLL_STATE_IDLE) {
                            suppressTabsScroll.set(false);
                        }
                    }
                });
                linearLayout.addView(pager, LayoutHelper.createLinear(LayoutHelper.MATCH_PARENT, 0, 1f));
            } else {
                View gap = new FrameLayout(contentView.getContext());
                gap.setBackgroundColor(Theme.getColor(Theme.key_graySection));
                linearLayout.addView(gap, LayoutHelper.createLinear(LayoutHelper.MATCH_PARENT, 8));
                ReactedUsersListView lv = new ReactedUsersListView(contentView.getContext(), themeDelegate, currentAccount, message, null, true).setSeenUsers(reactedView.getSeenUsers()).setOnProfileSelectedListener((view, userId) -> {
                    Bundle args = new Bundle();
                    args.putLong("user_id", userId);
                    ProfileActivity fragment = new ProfileActivity(args);
                    presentFragment(fragment);
                    closeMenu();
                }).setOnHeightChangedListener((view, newHeight) -> popupLayout.getSwipeBack().setNewForegroundHeight(foregroundIndex[0], AndroidUtilities.dp(44 + 8) + newHeight));
                reactedView.setSeenCallback(lv::setSeenUsers);
                linearLayout.addView(lv, LayoutHelper.createLinear(LayoutHelper.MATCH_PARENT, 0, 1f));
            }
            foregroundIndex[0] = popupLayout.addViewToSwipeBack(linearLayout);
            reactedView.setOnClickListener(v1 -> {
                popupLayout.getSwipeBack().openForeground(foregroundIndex[0]);
            });
            popupLayout.addView(reactedView, LayoutHelper.createLinear(LayoutHelper.MATCH_PARENT, 48));
            View gap = new FrameLayout(contentView.getContext());
            gap.setBackgroundColor(Theme.getColor(Theme.key_graySection));
            popupLayout.addView(gap, LayoutHelper.createLinear(LayoutHelper.MATCH_PARENT, 8));
        }
        MessageSeenView messageSeenView = null;
        if (showMessageSeen) {
            messageSeenView = new MessageSeenView(contentView.getContext(), currentAccount, message, currentChat);
            FrameLayout messageSeenLayout = new FrameLayout(contentView.getContext());
            messageSeenLayout.addView(messageSeenView, LayoutHelper.createFrame(LayoutHelper.MATCH_PARENT, LayoutHelper.WRAP_CONTENT));
            MessageSeenView finalMessageSeenView = messageSeenView;
            ActionBarMenuSubItem cell = new ActionBarMenuSubItem(getParentActivity(), true, true, themeDelegate);
            cell.setItemHeight(44);
            cell.setTextAndIcon(LocaleController.getString("Back", R.string.Back), R.drawable.msg_arrow_back);
            cell.getTextView().setPadding(LocaleController.isRTL ? 0 : AndroidUtilities.dp(40), 0, LocaleController.isRTL ? AndroidUtilities.dp(40) : 0, 0);
            FrameLayout backContainer = new FrameLayout(contentView.getContext());
            LinearLayout linearLayout = new LinearLayout(contentView.getContext());
            linearLayout.setBackgroundColor(getThemedColor(Theme.key_actionBarDefaultSubmenuBackground));
            linearLayout.setOrientation(LinearLayout.VERTICAL);
            RecyclerListView listView2 = finalMessageSeenView.createListView();
            backContainer.addView(cell);
            linearLayout.addView(backContainer);
            backContainer.setOnClickListener(new View.OnClickListener() {

                @Override
                public void onClick(View view) {
                    popupLayout.getSwipeBack().closeForeground();
                }
            });
            int[] foregroundIndex = new int[1];
            messageSeenView.setOnClickListener(new View.OnClickListener() {

                @Override
                public void onClick(View view) {
                    if (scrimPopupWindow == null || finalMessageSeenView.users.isEmpty()) {
                        return;
                    }
                    if (finalMessageSeenView.users.size() == 1) {
                        TLRPC.User user = finalMessageSeenView.users.get(0);
                        if (user == null) {
                            return;
                        }
                        Bundle args = new Bundle();
                        args.putLong("user_id", user.id);
                        ProfileActivity fragment = new ProfileActivity(args);
                        presentFragment(fragment);
                        closeMenu();
                        return;
                    }
                    int totalHeight = contentView.getHeightWithKeyboard();
                    int availableHeight = totalHeight - scrimPopupY - AndroidUtilities.dp(46 + 16) - (isReactionsAvailable ? AndroidUtilities.dp(52) : 0);
                    if (SharedConfig.messageSeenHintCount > 0 && contentView.getKeyboardHeight() < AndroidUtilities.dp(20)) {
                        availableHeight -= AndroidUtilities.dp(52);
                        Bulletin bulletin = BulletinFactory.of(ChatActivity.this).createErrorBulletin(AndroidUtilities.replaceTags(LocaleController.getString("MessageSeenTooltipMessage", R.string.MessageSeenTooltipMessage)));
                        bulletin.tag = 1;
                        bulletin.setDuration(4000);
                        bulletin.show();
                        SharedConfig.updateMessageSeenHintCount(SharedConfig.messageSeenHintCount - 1);
                    } else if (contentView.getKeyboardHeight() > AndroidUtilities.dp(20)) {
                        availableHeight -= contentView.getKeyboardHeight() / 3f;
                    }
                    int listViewTotalHeight = AndroidUtilities.dp(8) + AndroidUtilities.dp(44) * listView2.getAdapter().getItemCount();
                    if (listViewTotalHeight > availableHeight) {
                        if (availableHeight > AndroidUtilities.dp(620)) {
                            listView2.getLayoutParams().height = AndroidUtilities.dp(620);
                        } else {
                            listView2.getLayoutParams().height = availableHeight;
                        }
                    } else {
                        listView2.getLayoutParams().height = listViewTotalHeight;
                    }
                    linearLayout.getLayoutParams().height = AndroidUtilities.dp(44) + listView2.getLayoutParams().height;
                    listView2.requestLayout();
                    linearLayout.requestLayout();
                    listView2.getAdapter().notifyDataSetChanged();
                    popupLayout.getSwipeBack().openForeground(foregroundIndex[0]);
                }
            });
            linearLayout.addView(listView2, LayoutHelper.createLinear(LayoutHelper.MATCH_PARENT, 320));
            listView2.setOnItemClickListener((view1, position) -> {
                TLRPC.User user = finalMessageSeenView.users.get(position);
                if (user == null) {
                    return;
                }
                Bundle args = new Bundle();
                args.putLong("user_id", user.id);
                ProfileActivity fragment = new ProfileActivity(args);
                presentFragment(fragment);
            });
            foregroundIndex[0] = popupLayout.addViewToSwipeBack(linearLayout);
            popupLayout.addView(messageSeenLayout, LayoutHelper.createLinear(LayoutHelper.MATCH_PARENT, 44));
            View gap = new FrameLayout(contentView.getContext());
            gap.setBackgroundColor(Theme.getColor(Theme.key_graySection));
            popupLayout.addView(gap, LayoutHelper.createLinear(LayoutHelper.MATCH_PARENT, 8));
        }
        if (popupLayout.getSwipeBack() != null) {
            popupLayout.getSwipeBack().setOnClickListener(e -> closeMenu());
        }
        scrimPopupWindowItems = new ActionBarMenuSubItem[items.size() + (selectedObject.isSponsored() ? 1 : 0)];
        for (int a = 0, N = items.size(); a < N; a++) {
            if (a == 0 && selectedObject.isSponsored()) {
                ActionBarMenuSubItem cell = new ActionBarMenuSubItem(getParentActivity(), true, true, themeDelegate);
                cell.setTextAndIcon(LocaleController.getString("SponsoredMessageInfo", R.string.SponsoredMessageInfo), R.drawable.menu_info);
                cell.setItemHeight(56);
                cell.setTag(R.id.width_tag, 240);
                cell.setMultiline();
                scrimPopupWindowItems[scrimPopupWindowItems.length - 1] = cell;
                popupLayout.addView(cell);
                cell.setOnClickListener(v1 -> {
                    if (contentView == null || getParentActivity() == null) {
                        return;
                    }
                    BottomSheet.Builder builder = new BottomSheet.Builder(contentView.getContext());
                    builder.setCustomView(new SponsoredMessageInfoView(getParentActivity(), themeDelegate));
                    builder.show();
                });
                View gap = new View(getParentActivity());
                gap.setMinimumWidth(AndroidUtilities.dp(196));
                gap.setTag(1000);
                gap.setTag(R.id.object_tag, 1);
                popupLayout.addView(gap);
                LinearLayout.LayoutParams layoutParams = (LinearLayout.LayoutParams) cell.getLayoutParams();
                if (LocaleController.isRTL) {
                    layoutParams.gravity = Gravity.RIGHT;
                }
                layoutParams.width = LayoutHelper.MATCH_PARENT;
                layoutParams.height = AndroidUtilities.dp(6);
                gap.setLayoutParams(layoutParams);
            }
            ActionBarMenuSubItem cell = new ActionBarMenuSubItem(getParentActivity(), a == 0, a == N - 1, themeDelegate);
            cell.setMinimumWidth(AndroidUtilities.dp(200));
            cell.setTextAndIcon(items.get(a), icons.get(a));
            Integer option = options.get(a);
            if (option == 1 && selectedObject.messageOwner.ttl_period != 0) {
                menuDeleteItem = cell;
                updateDeleteItemRunnable.run();
                cell.setSubtextColor(getThemedColor(Theme.key_windowBackgroundWhiteGrayText6));
            }
            scrimPopupWindowItems[a] = cell;
            popupLayout.addView(cell);
            final int i = a;
            cell.setOnClickListener(v1 -> {
                if (selectedObject == null || i >= options.size()) {
                    return;
                }
                processSelectedOption(options.get(i));
            });
            if (option == 29) {
                // "Translate" button
                String toLang = LocaleController.getInstance().getCurrentLocale().getLanguage();
                final CharSequence finalMessageText = messageText;
                TranslateAlert.OnLinkPress onLinkPress = (link) -> {
                    didPressMessageUrl(link, false, selectedObject, v instanceof ChatMessageCell ? (ChatMessageCell) v : null);
                };
                TLRPC.InputPeer inputPeer = getMessagesController().getInputPeer(dialog_id);
                int messageId = selectedObject.messageOwner.id;
                /*if (LanguageDetector.hasSupport()) {
                        final String[] fromLang = { null };
                        cell.setVisibility(View.GONE);
                        waitForLangDetection.set(true);
                        LanguageDetector.detectLanguage(
                            finalMessageText.toString(),
                            (String lang) -> {
                                fromLang[0] = lang;
                                if (fromLang[0] != null && (!fromLang[0].equals(toLang) || fromLang[0].equals("und")) &&
                                        !RestrictedLanguagesSelectActivity.getRestrictedLanguages().contains(fromLang[0])) {
                                    cell.setVisibility(View.VISIBLE);
                                }
                                waitForLangDetection.set(false);
                                if (onLangDetectionDone.get() != null) {
                                    onLangDetectionDone.get().run();
                                    onLangDetectionDone.set(null);
                                }
                            },
                            (Exception e) -> {
                                FileLog.e("mlkit: failed to detect language in message");
                                e.printStackTrace();
                                waitForLangDetection.set(false);
                                if (onLangDetectionDone.get() != null) {
                                    onLangDetectionDone.get().run();
                                    onLangDetectionDone.set(null);
                                }
                            }
                        );
                        cell.setOnClickListener(e -> {
                            if (selectedObject == null || i >= options.size() || getParentActivity() == null) {
                                return;
                            }
                            TranslateAlert alert = TranslateAlert.showAlert(getParentActivity(), this, currentAccount, inputPeer, messageId, fromLang[0], toLang, finalMessageText, noforwards, onLinkPress, () -> dimBehindView(false));
                            alert.showDim(false);
                            closeMenu(false);
                        });
                        cell.postDelayed(() -> {
                            if (onLangDetectionDone.get() != null) {
                                onLangDetectionDone.getAndSet(null).run();
                            }
                        }, 250);
                    } else {*/
                cell.setOnClickListener(e -> {
                    if (selectedObject == null || i >= options.size() || getParentActivity() == null) {
                        return;
                    }
                    TranslateAlert alert = TranslateAlert.showAlert(getParentActivity(), this, currentAccount, inputPeer, messageId, "und", toLang, finalMessageText, noforwards, onLinkPress, () -> dimBehindView(false));
                    alert.showDim(false);
                    closeMenu(false);
                });
            // }
            }
        }
        ChatScrimPopupContainerLayout scrimPopupContainerLayout = new ChatScrimPopupContainerLayout(contentView.getContext()) {

            @Override
            public boolean dispatchKeyEvent(KeyEvent event) {
                if (event.getKeyCode() == KeyEvent.KEYCODE_BACK && event.getRepeatCount() == 0) {
                    closeMenu();
                }
                return super.dispatchKeyEvent(event);
            }

            @Override
            public boolean dispatchTouchEvent(MotionEvent ev) {
                boolean b = super.dispatchTouchEvent(ev);
                if (ev.getAction() == MotionEvent.ACTION_DOWN && !b) {
                    closeMenu();
                }
                return b;
            }
        };
        scrimPopupContainerLayout.setOnTouchListener(new View.OnTouchListener() {

            private int[] pos = new int[2];

            @Override
            public boolean onTouch(View v, MotionEvent event) {
                if (event.getActionMasked() == MotionEvent.ACTION_DOWN) {
                    if (scrimPopupWindow != null && scrimPopupWindow.isShowing()) {
                        View contentView = scrimPopupWindow.getContentView();
                        contentView.getLocationInWindow(pos);
                        rect.set(pos[0], pos[1], pos[0] + contentView.getMeasuredWidth(), pos[1] + contentView.getMeasuredHeight());
                        if (!rect.contains((int) event.getX(), (int) event.getY())) {
                            closeMenu();
                        }
                    }
                } else if (event.getActionMasked() == MotionEvent.ACTION_OUTSIDE) {
                    closeMenu();
                }
                return false;
            }
        });
        ReactionsContainerLayout reactionsLayout = new ReactionsContainerLayout(contentView.getContext(), currentAccount, getResourceProvider());
        if (isReactionsAvailable) {
            int pad = 22;
            int sPad = 24;
            reactionsLayout.setPadding(AndroidUtilities.dp(4) + (LocaleController.isRTL ? 0 : sPad), AndroidUtilities.dp(4), AndroidUtilities.dp(4) + (LocaleController.isRTL ? sPad : 0), AndroidUtilities.dp(pad));
            reactionsLayout.setDelegate((rView, reaction, longress) -> {
                selectReaction(primaryMessage, reactionsLayout, 0, 0, reaction, false, longress);
            });
            LinearLayout.LayoutParams params = LayoutHelper.createLinear(LayoutHelper.MATCH_PARENT, 52 + pad, Gravity.RIGHT, 0, 50, 0, -20);
            scrimPopupContainerLayout.addView(reactionsLayout, params);
            scrimPopupContainerLayout.reactionsLayout = reactionsLayout;
            scrimPopupContainerLayout.setClipChildren(false);
            reactionsLayout.setMessage(message, chatInfo);
            reactionsLayout.setTransitionProgress(0);
            if (popupLayout.getSwipeBack() != null) {
                popupLayout.getSwipeBack().setOnSwipeBackProgressListener((layout, toProgress, progress) -> {
                    if (toProgress == 0) {
                        reactionsLayout.startEnterAnimation();
                    } else if (toProgress == 1)
                        reactionsLayout.setAlpha(1f - progress);
                });
            }
        }
        boolean showNoForwards = noforwards && message.messageOwner.action == null && message.isSent() && !message.isEditing() && chatMode != MODE_SCHEDULED;
        scrimPopupContainerLayout.addView(popupLayout, LayoutHelper.createLinearRelatively(LayoutHelper.WRAP_CONTENT, LayoutHelper.WRAP_CONTENT, Gravity.LEFT, isReactionsAvailable ? 16 : 0, 0, isReactionsAvailable ? 36 : 0, 0));
        scrimPopupContainerLayout.popupWindowLayout = popupLayout;
        if (showNoForwards) {
            popupLayout.measure(View.MeasureSpec.makeMeasureSpec(0, View.MeasureSpec.UNSPECIFIED), View.MeasureSpec.makeMeasureSpec(0, View.MeasureSpec.UNSPECIFIED));
            boolean isChannel = ChatObject.isChannel(currentChat) && !currentChat.megagroup;
            TextView tv = new TextView(contentView.getContext());
            tv.setTextSize(TypedValue.COMPLEX_UNIT_DIP, 14);
            tv.setTextColor(Theme.getColor(Theme.key_actionBarDefaultSubmenuItem));
            if (getMessagesController().isChatNoForwards(currentChat)) {
                tv.setText(isChannel ? LocaleController.getString("ForwardsRestrictedInfoChannel", R.string.ForwardsRestrictedInfoChannel) : LocaleController.getString("ForwardsRestrictedInfoGroup", R.string.ForwardsRestrictedInfoGroup));
            } else {
                tv.setText(LocaleController.getString("ForwardsRestrictedInfoBot", R.string.ForwardsRestrictedInfoBot));
            }
            tv.setMaxWidth(popupLayout.getMeasuredWidth() - AndroidUtilities.dp(38));
            Drawable shadowDrawable2 = ContextCompat.getDrawable(contentView.getContext(), R.drawable.popup_fixed_alert).mutate();
            shadowDrawable2.setColorFilter(new PorterDuffColorFilter(Theme.getColor(Theme.key_actionBarDefaultSubmenuBackground), PorterDuff.Mode.MULTIPLY));
            FrameLayout fl = new FrameLayout(contentView.getContext());
            fl.setBackground(shadowDrawable2);
            fl.addView(tv, LayoutHelper.createFrame(LayoutHelper.MATCH_PARENT, LayoutHelper.WRAP_CONTENT, 0, 11, 11, 11, 11));
            scrimPopupContainerLayout.addView(fl, LayoutHelper.createLinear(LayoutHelper.MATCH_PARENT, LayoutHelper.WRAP_CONTENT, Gravity.LEFT, isReactionsAvailable ? 16 : 0, -8, isReactionsAvailable ? 36 : 0, 0));
        }
        scrimPopupWindow = new ActionBarPopupWindow(scrimPopupContainerLayout, LayoutHelper.WRAP_CONTENT, LayoutHelper.WRAP_CONTENT) {

            @Override
            public void dismiss() {
                super.dismiss();
                if (scrimPopupWindow != this) {
                    return;
                }
                scrimPopupWindow = null;
                menuDeleteItem = null;
                scrimPopupWindowItems = null;
                chatLayoutManager.setCanScrollVertically(true);
                if (scrimPopupWindowHideDimOnDismiss) {
                    dimBehindView(false);
                } else {
                    scrimPopupWindowHideDimOnDismiss = true;
                }
                if (chatActivityEnterView != null) {
                    chatActivityEnterView.getEditField().setAllowDrawCursor(true);
                }
            }
        };
        scrimPopupWindow.setPauseNotifications(true);
        scrimPopupWindow.setDismissAnimationDuration(220);
        scrimPopupWindow.setOutsideTouchable(true);
        scrimPopupWindow.setClippingEnabled(true);
        scrimPopupWindow.setAnimationStyle(R.style.PopupContextAnimation);
        scrimPopupWindow.setFocusable(true);
        scrimPopupContainerLayout.measure(View.MeasureSpec.makeMeasureSpec(AndroidUtilities.dp(1000), View.MeasureSpec.AT_MOST), View.MeasureSpec.makeMeasureSpec(AndroidUtilities.dp(1000), View.MeasureSpec.AT_MOST));
        scrimPopupWindow.setInputMethodMode(ActionBarPopupWindow.INPUT_METHOD_NOT_NEEDED);
        scrimPopupWindow.setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_UNSPECIFIED);
        scrimPopupWindow.getContentView().setFocusableInTouchMode(true);
        popupLayout.setFitItems(true);
        int popupX = v.getLeft() + (int) x - scrimPopupContainerLayout.getMeasuredWidth() + backgroundPaddings.left - AndroidUtilities.dp(28);
        if (popupX < AndroidUtilities.dp(6)) {
            popupX = AndroidUtilities.dp(6);
        } else if (popupX > chatListView.getMeasuredWidth() - AndroidUtilities.dp(6) - scrimPopupContainerLayout.getMeasuredWidth()) {
            popupX = chatListView.getMeasuredWidth() - AndroidUtilities.dp(6) - scrimPopupContainerLayout.getMeasuredWidth();
        }
        if (AndroidUtilities.isTablet()) {
            int[] location = new int[2];
            fragmentView.getLocationInWindow(location);
            popupX += location[0];
        }
        int totalHeight = contentView.getHeight();
        int height = scrimPopupContainerLayout.getMeasuredHeight() + AndroidUtilities.dp(48);
        int keyboardHeight = contentView.measureKeyboardHeight();
        if (keyboardHeight > AndroidUtilities.dp(20)) {
            totalHeight += keyboardHeight;
        }
        int popupY;
        if (height < totalHeight) {
            popupY = (int) (chatListView.getY() + v.getTop() + y);
            if (height - backgroundPaddings.top - backgroundPaddings.bottom > AndroidUtilities.dp(240)) {
                popupY += AndroidUtilities.dp(240) - height;
            }
            if (popupY < chatListView.getY() + AndroidUtilities.dp(24)) {
                popupY = (int) (chatListView.getY() + AndroidUtilities.dp(24));
            } else if (popupY > totalHeight - height - AndroidUtilities.dp(8)) {
                popupY = totalHeight - height - AndroidUtilities.dp(8);
            }
        } else {
            popupY = inBubbleMode ? 0 : AndroidUtilities.statusBarHeight;
        }
        final int finalPopupX = scrimPopupX = popupX;
        final int finalPopupY = scrimPopupY = popupY;
        Runnable showMenu = () -> {
            if (scrimPopupWindow == null || fragmentView == null) {
                return;
            }
            scrimPopupWindow.showAtLocation(chatListView, Gravity.LEFT | Gravity.TOP, finalPopupX, finalPopupY);
            if (isReactionsAvailable) {
                reactionsLayout.startEnterAnimation();
            }
        };
        if (waitForLangDetection.get()) {
            onLangDetectionDone.set(showMenu);
        } else {
            showMenu.run();
        }
        chatListView.stopScroll();
        chatLayoutManager.setCanScrollVertically(false);
        dimBehindView(v, true);
        hideHints(false);
        if (topUndoView != null) {
            topUndoView.hide(true, 1);
        }
        if (undoView != null) {
            undoView.hide(true, 1);
        }
        if (chatActivityEnterView != null) {
            chatActivityEnterView.getEditField().setAllowDrawCursor(false);
        }
        return;
    }
    if (chatActivityEnterView != null && (chatActivityEnterView.isRecordingAudioVideo() || chatActivityEnterView.isRecordLocked())) {
        return;
    }
    final ActionBarMenu actionMode = actionBar.createActionMode();
    View item = actionMode.getItem(delete);
    if (item != null) {
        item.setVisibility(View.VISIBLE);
    }
    bottomMessagesActionContainer.setVisibility(View.VISIBLE);
    int translationY = chatActivityEnterView.getMeasuredHeight() - AndroidUtilities.dp(51);
    if (chatActivityEnterView.getVisibility() == View.VISIBLE) {
        ArrayList<View> views = new ArrayList<>();
        views.add(chatActivityEnterView);
        if (mentionContainer != null && mentionContainer.getVisibility() == View.VISIBLE) {
            views.add(mentionContainer);
        }
        if (stickersPanel != null && stickersPanel.getVisibility() == View.VISIBLE) {
            views.add(stickersPanel);
        }
        actionBar.showActionMode(true, bottomMessagesActionContainer, null, views.toArray(new View[0]), new boolean[] { false, true, true }, chatListView, translationY);
        if (getParentActivity() instanceof LaunchActivity) {
            ((LaunchActivity) getParentActivity()).hideVisibleActionMode();
        }
        chatActivityEnterView.getEditField().setAllowDrawCursor(false);
    } else if (bottomOverlayChat.getVisibility() == View.VISIBLE) {
        actionBar.showActionMode(true, bottomMessagesActionContainer, null, new View[] { bottomOverlayChat }, new boolean[] { true }, chatListView, translationY);
    } else {
        actionBar.showActionMode(true, bottomMessagesActionContainer, null, null, null, chatListView, translationY);
    }
    closeMenu();
    chatLayoutManager.setCanScrollVertically(true);
    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, View.SCALE_Y, 0.1f, 1.0f));
    }
    animatorSet.playTogether(animators);
    animatorSet.setDuration(250);
    animatorSet.start();
    addToSelectedMessages(message, listView);
    if (chatActivityEnterView != null) {
        chatActivityEnterView.preventInput = true;
    }
    selectedMessagesCountTextView.setNumber(selectedMessagesIds[0].size() + selectedMessagesIds[1].size(), false);
    updateVisibleRows();
    if (chatActivityEnterView != null) {
        chatActivityEnterView.hideBotCommands();
    }
}
Also used : ViewHelper(org.telegram.ui.Components.ViewHelper) Bundle(android.os.Bundle) BotHelpCell(org.telegram.ui.Cells.BotHelpCell) AdjustPanLayoutHelper(org.telegram.ui.ActionBar.AdjustPanLayoutHelper) StickersAlert(org.telegram.ui.Components.StickersAlert) RecyclerAnimationScrollHelper(org.telegram.ui.Components.RecyclerAnimationScrollHelper) URLSpanUserMention(org.telegram.ui.Components.URLSpanUserMention) Property(android.util.Property) HorizontalScrollView(android.widget.HorizontalScrollView) ChatThemeController(org.telegram.messenger.ChatThemeController) MediaStore(android.provider.MediaStore) Map(java.util.Map) Shader(android.graphics.Shader) ContextCompat(androidx.core.content.ContextCompat) NotificationCenter(org.telegram.messenger.NotificationCenter) PinnedLineView(org.telegram.ui.Components.PinnedLineView) CountDownLatch(java.util.concurrent.CountDownLatch) Layout(android.text.Layout) EmojiData(org.telegram.messenger.EmojiData) ForwardingMessagesParams(org.telegram.messenger.ForwardingMessagesParams) BotCommandsMenuView(org.telegram.ui.Components.BotCommandsMenuView) Paint(android.graphics.Paint) Path(android.graphics.Path) ReactedHeaderView(org.telegram.ui.Components.ReactedHeaderView) PipRoundVideoView(org.telegram.ui.Components.PipRoundVideoView) SystemClock(android.os.SystemClock) ChatBlurredFrameLayout(org.telegram.ui.Components.ChatBlurredFrameLayout) SpannableStringBuilder(android.text.SpannableStringBuilder) Calendar(java.util.Calendar) Toast(android.widget.Toast) PhoneFormat(org.telegram.PhoneFormat.PhoneFormat) Menu(android.view.Menu) SizeNotifierFrameLayout(org.telegram.ui.Components.SizeNotifierFrameLayout) JoinGroupAlert(org.telegram.ui.Components.JoinGroupAlert) AspectRatioFrameLayout(com.google.android.exoplayer2.ui.AspectRatioFrameLayout) LongSparseIntArray(org.telegram.messenger.support.LongSparseIntArray) SimpleTextView(org.telegram.ui.ActionBar.SimpleTextView) URLSpan(android.text.style.URLSpan) ActionBarMenu(org.telegram.ui.ActionBar.ActionBarMenu) R(org.telegram.messenger.R) BottomSheet(org.telegram.ui.ActionBar.BottomSheet) ChatActivityMemberRequestsDelegate(org.telegram.ui.Delegates.ChatActivityMemberRequestsDelegate) UserObject(org.telegram.messenger.UserObject) SharedPreferences(android.content.SharedPreferences) ContactsController(org.telegram.messenger.ContactsController) MessagesStorage(org.telegram.messenger.MessagesStorage) EditText(android.widget.EditText) Rect(android.graphics.Rect) LinearLayout(android.widget.LinearLayout) URLDecoder(java.net.URLDecoder) PackageManager(android.content.pm.PackageManager) WindowManager(android.view.WindowManager) Animator(android.animation.Animator) TypefaceSpan(org.telegram.ui.Components.TypefaceSpan) ChatAttachAlertDocumentLayout(org.telegram.ui.Components.ChatAttachAlertDocumentLayout) DatePickerDialog(android.app.DatePickerDialog) ChatMessageCell(org.telegram.ui.Cells.ChatMessageCell) RecyclerView(androidx.recyclerview.widget.RecyclerView) StickersAdapter(org.telegram.ui.Adapters.StickersAdapter) RectF(android.graphics.RectF) ReportAlert(org.telegram.ui.Components.ReportAlert) TextSelectionHint(org.telegram.ui.Components.TextSelectionHint) BaseFragment(org.telegram.ui.ActionBar.BaseFragment) ChatActionCell(org.telegram.ui.Cells.ChatActionCell) ChatThemeBottomSheet(org.telegram.ui.Components.ChatThemeBottomSheet) PorterDuff(android.graphics.PorterDuff) SendMessagesHelper(org.telegram.messenger.SendMessagesHelper) BackDrawable(org.telegram.ui.ActionBar.BackDrawable) ShareAlert(org.telegram.ui.Components.ShareAlert) BluredView(org.telegram.ui.Components.BluredView) UserConfig(org.telegram.messenger.UserConfig) TextStyleSpan(org.telegram.ui.Components.TextStyleSpan) EmojiThemes(org.telegram.ui.ActionBar.EmojiThemes) InstantCameraView(org.telegram.ui.Components.InstantCameraView) PhonebookShareAlert(org.telegram.ui.Components.PhonebookShareAlert) ChatActivityEnterView(org.telegram.ui.Components.ChatActivityEnterView) ImportingAlert(org.telegram.ui.Components.ImportingAlert) Spanned(android.text.Spanned) GridLayoutManager(androidx.recyclerview.widget.GridLayoutManager) SparseIntArray(android.util.SparseIntArray) AtomicBoolean(java.util.concurrent.atomic.AtomicBoolean) LocaleController(org.telegram.messenger.LocaleController) ChatActivityEnterTopView(org.telegram.ui.Components.ChatActivityEnterTopView) ExtendedGridLayoutManager(org.telegram.ui.Components.ExtendedGridLayoutManager) ChatBigEmptyView(org.telegram.ui.Components.ChatBigEmptyView) ActionBar(org.telegram.ui.ActionBar.ActionBar) LinearSmoothScrollerCustom(androidx.recyclerview.widget.LinearSmoothScrollerCustom) TLObject(org.telegram.tgnet.TLObject) Size(org.telegram.ui.Components.Size) MessageObject(org.telegram.messenger.MessageObject) SharedConfig(org.telegram.messenger.SharedConfig) BuildVars(org.telegram.messenger.BuildVars) Build(android.os.Build) ChatAvatarContainer(org.telegram.ui.Components.ChatAvatarContainer) PollVotesAlert(org.telegram.ui.Components.PollVotesAlert) EmbedBottomSheet(org.telegram.ui.Components.EmbedBottomSheet) DialogObject(org.telegram.messenger.DialogObject) BackupImageView(org.telegram.ui.Components.BackupImageView) LayoutHelper(org.telegram.ui.Components.LayoutHelper) TextureView(android.view.TextureView) Color(android.graphics.Color) Bitmap(android.graphics.Bitmap) CharacterStyle(android.text.style.CharacterStyle) ViewTreeObserver(android.view.ViewTreeObserver) Vibrator(android.os.Vibrator) Comparator(java.util.Comparator) Activity(android.app.Activity) ImageReceiver(org.telegram.messenger.ImageReceiver) RecyclerListView(org.telegram.ui.Components.RecyclerListView) Arrays(java.util.Arrays) Uri(android.net.Uri) FrameLayout(android.widget.FrameLayout) ImageView(android.widget.ImageView) AnimatedFileDrawable(org.telegram.ui.Components.AnimatedFileDrawable) EditTextBoldCursor(org.telegram.ui.Components.EditTextBoldCursor) Drawable(android.graphics.drawable.Drawable) Bulletin(org.telegram.ui.Components.Bulletin) RadialProgressView(org.telegram.ui.Components.RadialProgressView) Manifest(android.Manifest) ActionBarMenuSubItem(org.telegram.ui.ActionBar.ActionBarMenuSubItem) Matcher(java.util.regex.Matcher) ChatGreetingsView(org.telegram.ui.Components.ChatGreetingsView) Canvas(android.graphics.Canvas) AccessibilityEvent(android.view.accessibility.AccessibilityEvent) Emoji(org.telegram.messenger.Emoji) MessagesSearchAdapter(org.telegram.ui.Adapters.MessagesSearchAdapter) ColorMatrix(android.graphics.ColorMatrix) ForegroundColorSpan(android.text.style.ForegroundColorSpan) TargetApi(android.annotation.TargetApi) CombinedDrawable(org.telegram.ui.Components.CombinedDrawable) BackButtonMenu(org.telegram.ui.Components.BackButtonMenu) ChatListItemAnimator(androidx.recyclerview.widget.ChatListItemAnimator) MentionsAdapter(org.telegram.ui.Adapters.MentionsAdapter) UndoView(org.telegram.ui.Components.UndoView) AnimationProperties(org.telegram.ui.Components.AnimationProperties) ColorMatrixColorFilter(android.graphics.ColorMatrixColorFilter) CounterView(org.telegram.ui.Components.CounterView) AnimatorListenerAdapter(android.animation.AnimatorListenerAdapter) TrendingStickersAlert(org.telegram.ui.Components.TrendingStickersAlert) Outline(android.graphics.Outline) HapticFeedbackConstants(android.view.HapticFeedbackConstants) TextPaint(android.text.TextPaint) BotSwitchCell(org.telegram.ui.Cells.BotSwitchCell) HintView(org.telegram.ui.Components.HintView) MessageBackgroundDrawable(org.telegram.ui.Components.MessageBackgroundDrawable) PorterDuffColorFilter(android.graphics.PorterDuffColorFilter) LinearLayoutManager(androidx.recyclerview.widget.LinearLayoutManager) URLSpanBotCommand(org.telegram.ui.Components.URLSpanBotCommand) ReactionsLayoutInBubble(org.telegram.ui.Components.Reactions.ReactionsLayoutInBubble) ExifInterface(androidx.exifinterface.media.ExifInterface) FileLoader(org.telegram.messenger.FileLoader) ContextLinkCell(org.telegram.ui.Cells.ContextLinkCell) ClearHistoryAlert(org.telegram.ui.Components.ClearHistoryAlert) Space(android.widget.Space) ViewPager(androidx.viewpager.widget.ViewPager) Dialog(android.app.Dialog) BitmapFactory(android.graphics.BitmapFactory) GigagroupConvertAlert(org.telegram.ui.Components.GigagroupConvertAlert) URLSpanMono(org.telegram.ui.Components.URLSpanMono) URLSpanNoUnderline(org.telegram.ui.Components.URLSpanNoUnderline) AlertsCreator(org.telegram.ui.Components.AlertsCreator) BlurBehindDrawable(org.telegram.ui.Components.BlurBehindDrawable) ArrayList(java.util.ArrayList) SharedMediaLayout(org.telegram.ui.Components.SharedMediaLayout) FragmentContextView(org.telegram.ui.Components.FragmentContextView) TLRPC(org.telegram.tgnet.TLRPC) EditTextCaption(org.telegram.ui.Components.EditTextCaption) BuildConfig(org.telegram.messenger.BuildConfig) DialogCell(org.telegram.ui.Cells.DialogCell) SpannableString(android.text.SpannableString) BufferedWriter(java.io.BufferedWriter) FileOutputStream(java.io.FileOutputStream) TextUtils(android.text.TextUtils) ChatUnreadCell(org.telegram.ui.Cells.ChatUnreadCell) ChatLoadingCell(org.telegram.ui.Cells.ChatLoadingCell) ClippingImageView(org.telegram.ui.Components.ClippingImageView) File(java.io.File) ReactionsEffectOverlay(org.telegram.ui.Components.Reactions.ReactionsEffectOverlay) Gravity(android.view.Gravity) PorterDuffXfermode(android.graphics.PorterDuffXfermode) TypedValue(android.util.TypedValue) Configuration(android.content.res.Configuration) StickerCell(org.telegram.ui.Cells.StickerCell) ReactionsContainerLayout(org.telegram.ui.Components.ReactionsContainerLayout) ColorUtils(androidx.core.graphics.ColorUtils) ChatObject(org.telegram.messenger.ChatObject) AlertDialog(org.telegram.ui.ActionBar.AlertDialog) VoIPHelper(org.telegram.ui.Components.voip.VoIPHelper) EmojiView(org.telegram.ui.Components.EmojiView) ValueAnimator(android.animation.ValueAnimator) ThemeDescription(org.telegram.ui.ActionBar.ThemeDescription) ChatScrimPopupContainerLayout(org.telegram.ui.Components.ChatScrimPopupContainerLayout) ActionBarMenuItem(org.telegram.ui.ActionBar.ActionBarMenuItem) Spannable(android.text.Spannable) AccountInstance(org.telegram.messenger.AccountInstance) AndroidUtilities(org.telegram.messenger.AndroidUtilities) CubicBezierInterpolator(org.telegram.ui.Components.CubicBezierInterpolator) CheckBoxCell(org.telegram.ui.Cells.CheckBoxCell) ApplicationLoader(org.telegram.messenger.ApplicationLoader) ChecksHintView(org.telegram.ui.Components.ChecksHintView) MediaController(org.telegram.messenger.MediaController) ThemeEditorView(org.telegram.ui.Components.ThemeEditorView) View(android.view.View) Matrix(android.graphics.Matrix) SearchCounterView(org.telegram.ui.Components.SearchCounterView) ForwardingPreviewView(org.telegram.ui.Components.ForwardingPreviewView) BitmapShader(android.graphics.BitmapShader) Utilities(org.telegram.messenger.Utilities) HideViewAfterAnimation(org.telegram.ui.Components.HideViewAfterAnimation) ObjectAnimator(android.animation.ObjectAnimator) GridLayoutManagerFixed(androidx.recyclerview.widget.GridLayoutManagerFixed) ImageLocation(org.telegram.messenger.ImageLocation) MentionCell(org.telegram.ui.Cells.MentionCell) ReactionTabHolderView(org.telegram.ui.Components.ReactionTabHolderView) ConnectionsManager(org.telegram.tgnet.ConnectionsManager) ViewGroup(android.view.ViewGroup) SparseArray(android.util.SparseArray) List(java.util.List) TextView(android.widget.TextView) MotionBackgroundDrawable(org.telegram.ui.Components.MotionBackgroundDrawable) SecretChatHelper(org.telegram.messenger.SecretChatHelper) FileProvider(androidx.core.content.FileProvider) Pattern(java.util.regex.Pattern) DecelerateInterpolator(android.view.animation.DecelerateInterpolator) ActionBarPopupWindow(org.telegram.ui.ActionBar.ActionBarPopupWindow) Typeface(android.graphics.Typeface) Context(android.content.Context) StaticLayout(android.text.StaticLayout) AccessibilityNodeInfo(android.view.accessibility.AccessibilityNodeInfo) TextSelectionHelper(org.telegram.ui.Cells.TextSelectionHelper) ReactedUsersListView(org.telegram.ui.Components.ReactedUsersListView) KeyEvent(android.view.KeyEvent) VoIPService(org.telegram.messenger.voip.VoIPService) Theme(org.telegram.ui.ActionBar.Theme) PagerAdapter(androidx.viewpager.widget.PagerAdapter) ViewOutlineProvider(android.view.ViewOutlineProvider) BulletinFactory(org.telegram.ui.Components.BulletinFactory) Intent(android.content.Intent) HashMap(java.util.HashMap) ActionBarLayout(org.telegram.ui.ActionBar.ActionBarLayout) TranslateAlert(org.telegram.ui.Components.TranslateAlert) AtomicReference(java.util.concurrent.atomic.AtomicReference) ClipData(android.content.ClipData) SuppressLint(android.annotation.SuppressLint) VideoEditedInfo(org.telegram.messenger.VideoEditedInfo) MotionEvent(android.view.MotionEvent) AnimatorSet(android.animation.AnimatorSet) MediaDataController(org.telegram.messenger.MediaDataController) DialogInterface(android.content.DialogInterface) Browser(org.telegram.messenger.browser.Browser) FireworksOverlay(org.telegram.ui.Components.FireworksOverlay) LongSparseArray(androidx.collection.LongSparseArray) FileWriter(java.io.FileWriter) FileLog(org.telegram.messenger.FileLog) URLSpanReplacement(org.telegram.ui.Components.URLSpanReplacement) MessagesController(org.telegram.messenger.MessagesController) NumberTextView(org.telegram.ui.Components.NumberTextView) ChatAttachAlert(org.telegram.ui.Components.ChatAttachAlert) InviteMembersBottomSheet(org.telegram.ui.Components.InviteMembersBottomSheet) Collections(java.util.Collections) RLottieDrawable(org.telegram.ui.Components.RLottieDrawable) InputStream(java.io.InputStream) ArrayList(java.util.ArrayList) SpannableString(android.text.SpannableString) ActionBarPopupWindow(org.telegram.ui.ActionBar.ActionBarPopupWindow) Rect(android.graphics.Rect) BackDrawable(org.telegram.ui.ActionBar.BackDrawable) AnimatedFileDrawable(org.telegram.ui.Components.AnimatedFileDrawable) Drawable(android.graphics.drawable.Drawable) CombinedDrawable(org.telegram.ui.Components.CombinedDrawable) MessageBackgroundDrawable(org.telegram.ui.Components.MessageBackgroundDrawable) BlurBehindDrawable(org.telegram.ui.Components.BlurBehindDrawable) MotionBackgroundDrawable(org.telegram.ui.Components.MotionBackgroundDrawable) RLottieDrawable(org.telegram.ui.Components.RLottieDrawable) ViewPager(androidx.viewpager.widget.ViewPager) AtomicBoolean(java.util.concurrent.atomic.AtomicBoolean) ChatActionCell(org.telegram.ui.Cells.ChatActionCell) LongSparseIntArray(org.telegram.messenger.support.LongSparseIntArray) SparseIntArray(android.util.SparseIntArray) UserObject(org.telegram.messenger.UserObject) TLObject(org.telegram.tgnet.TLObject) MessageObject(org.telegram.messenger.MessageObject) DialogObject(org.telegram.messenger.DialogObject) ChatObject(org.telegram.messenger.ChatObject) PorterDuffColorFilter(android.graphics.PorterDuffColorFilter) RecyclerListView(org.telegram.ui.Components.RecyclerListView) ChatScrimPopupContainerLayout(org.telegram.ui.Components.ChatScrimPopupContainerLayout) Intent(android.content.Intent) AtomicReference(java.util.concurrent.atomic.AtomicReference) ReactionsContainerLayout(org.telegram.ui.Components.ReactionsContainerLayout) ChatMessageCell(org.telegram.ui.Cells.ChatMessageCell) Animator(android.animation.Animator) ChatListItemAnimator(androidx.recyclerview.widget.ChatListItemAnimator) ValueAnimator(android.animation.ValueAnimator) ObjectAnimator(android.animation.ObjectAnimator) Bulletin(org.telegram.ui.Components.Bulletin) SpannableStringBuilder(android.text.SpannableStringBuilder) ValueAnimator(android.animation.ValueAnimator) TLRPC(org.telegram.tgnet.TLRPC) PagerAdapter(androidx.viewpager.widget.PagerAdapter) SimpleTextView(org.telegram.ui.ActionBar.SimpleTextView) TextView(android.widget.TextView) NumberTextView(org.telegram.ui.Components.NumberTextView) TranslateAlert(org.telegram.ui.Components.TranslateAlert) HorizontalScrollView(android.widget.HorizontalScrollView) ActionBarMenu(org.telegram.ui.ActionBar.ActionBarMenu) ReactedUsersListView(org.telegram.ui.Components.ReactedUsersListView) BottomSheet(org.telegram.ui.ActionBar.BottomSheet) ChatThemeBottomSheet(org.telegram.ui.Components.ChatThemeBottomSheet) EmbedBottomSheet(org.telegram.ui.Components.EmbedBottomSheet) InviteMembersBottomSheet(org.telegram.ui.Components.InviteMembersBottomSheet) SpannableStringBuilder(android.text.SpannableStringBuilder) ChatObject(org.telegram.messenger.ChatObject) AnimatorSet(android.animation.AnimatorSet) KeyEvent(android.view.KeyEvent) ActionBarMenuSubItem(org.telegram.ui.ActionBar.ActionBarMenuSubItem) VoIPService(org.telegram.messenger.voip.VoIPService) ViewGroup(android.view.ViewGroup) Bundle(android.os.Bundle) ReactedHeaderView(org.telegram.ui.Components.ReactedHeaderView) HorizontalScrollView(android.widget.HorizontalScrollView) PinnedLineView(org.telegram.ui.Components.PinnedLineView) BotCommandsMenuView(org.telegram.ui.Components.BotCommandsMenuView) ReactedHeaderView(org.telegram.ui.Components.ReactedHeaderView) PipRoundVideoView(org.telegram.ui.Components.PipRoundVideoView) SimpleTextView(org.telegram.ui.ActionBar.SimpleTextView) RecyclerView(androidx.recyclerview.widget.RecyclerView) BluredView(org.telegram.ui.Components.BluredView) InstantCameraView(org.telegram.ui.Components.InstantCameraView) ChatActivityEnterView(org.telegram.ui.Components.ChatActivityEnterView) ChatActivityEnterTopView(org.telegram.ui.Components.ChatActivityEnterTopView) ChatBigEmptyView(org.telegram.ui.Components.ChatBigEmptyView) BackupImageView(org.telegram.ui.Components.BackupImageView) TextureView(android.view.TextureView) RecyclerListView(org.telegram.ui.Components.RecyclerListView) ImageView(android.widget.ImageView) RadialProgressView(org.telegram.ui.Components.RadialProgressView) ChatGreetingsView(org.telegram.ui.Components.ChatGreetingsView) UndoView(org.telegram.ui.Components.UndoView) CounterView(org.telegram.ui.Components.CounterView) HintView(org.telegram.ui.Components.HintView) FragmentContextView(org.telegram.ui.Components.FragmentContextView) ClippingImageView(org.telegram.ui.Components.ClippingImageView) EmojiView(org.telegram.ui.Components.EmojiView) ChecksHintView(org.telegram.ui.Components.ChecksHintView) ThemeEditorView(org.telegram.ui.Components.ThemeEditorView) View(android.view.View) SearchCounterView(org.telegram.ui.Components.SearchCounterView) ForwardingPreviewView(org.telegram.ui.Components.ForwardingPreviewView) ReactionTabHolderView(org.telegram.ui.Components.ReactionTabHolderView) TextView(android.widget.TextView) ReactedUsersListView(org.telegram.ui.Components.ReactedUsersListView) NumberTextView(org.telegram.ui.Components.NumberTextView) Paint(android.graphics.Paint) TextSelectionHint(org.telegram.ui.Components.TextSelectionHint) TextPaint(android.text.TextPaint) SuppressLint(android.annotation.SuppressLint) ReactionTabHolderView(org.telegram.ui.Components.ReactionTabHolderView) MotionEvent(android.view.MotionEvent) SparseArray(android.util.SparseArray) LongSparseArray(androidx.collection.LongSparseArray) ChatBlurredFrameLayout(org.telegram.ui.Components.ChatBlurredFrameLayout) SizeNotifierFrameLayout(org.telegram.ui.Components.SizeNotifierFrameLayout) AspectRatioFrameLayout(com.google.android.exoplayer2.ui.AspectRatioFrameLayout) FrameLayout(android.widget.FrameLayout) MessageObject(org.telegram.messenger.MessageObject) LinearLayout(android.widget.LinearLayout)

Aggregations

Manifest (android.Manifest)1 Animator (android.animation.Animator)1 AnimatorListenerAdapter (android.animation.AnimatorListenerAdapter)1 AnimatorSet (android.animation.AnimatorSet)1 ObjectAnimator (android.animation.ObjectAnimator)1 ValueAnimator (android.animation.ValueAnimator)1 SuppressLint (android.annotation.SuppressLint)1 TargetApi (android.annotation.TargetApi)1 Activity (android.app.Activity)1 DatePickerDialog (android.app.DatePickerDialog)1 Dialog (android.app.Dialog)1 ClipData (android.content.ClipData)1 Context (android.content.Context)1 DialogInterface (android.content.DialogInterface)1 Intent (android.content.Intent)1 SharedPreferences (android.content.SharedPreferences)1 PackageManager (android.content.pm.PackageManager)1 Configuration (android.content.res.Configuration)1 Bitmap (android.graphics.Bitmap)1 BitmapFactory (android.graphics.BitmapFactory)1