/* * This is the source code of Telegram for Android v. 5.x.x. * It is licensed under GNU GPL v. 2 or later. * You should have received a copy of the license in this archive (see LICENSE). * * Copyright Nikolai Kudashov, 2013-2018. */ package org.telegram.ui; import android.animation.Animator; import android.animation.AnimatorListenerAdapter; import android.animation.AnimatorSet; import android.animation.ObjectAnimator; import android.app.Activity; import android.app.KeyguardManager; import android.content.Context; import android.content.Intent; import android.content.pm.PackageManager; import android.content.res.Configuration; import android.net.Uri; import android.os.Bundle; import android.os.PowerManager; import android.text.TextUtils; import android.util.AttributeSet; import android.util.TypedValue; import android.view.Gravity; import android.view.MotionEvent; import android.view.VelocityTracker; import android.view.View; import android.view.ViewGroup; import android.view.ViewTreeObserver; import android.view.WindowManager; import android.widget.FrameLayout; import android.widget.LinearLayout; import android.widget.RelativeLayout; import android.widget.ScrollView; import android.widget.TextView; import org.telegram.messenger.AndroidUtilities; import org.telegram.messenger.ContactsController; import org.telegram.messenger.DownloadController; import org.telegram.messenger.ImageLocation; import org.telegram.messenger.LocaleController; import org.telegram.messenger.MediaController; import org.telegram.messenger.MessagesController; import org.telegram.PhoneFormat.PhoneFormat; import org.telegram.messenger.NotificationsController; import org.telegram.messenger.SendMessagesHelper; import org.telegram.messenger.SharedConfig; import org.telegram.messenger.UserConfig; import org.telegram.messenger.UserObject; import org.telegram.messenger.ApplicationLoader; import org.telegram.messenger.FileLoader; import org.telegram.messenger.FileLog; import org.telegram.messenger.NotificationCenter; import org.telegram.messenger.R; import org.telegram.messenger.WebFile; import org.telegram.tgnet.ConnectionsManager; import org.telegram.tgnet.TLRPC; import org.telegram.messenger.MessageObject; import org.telegram.ui.ActionBar.ActionBar; import org.telegram.ui.ActionBar.ActionBarMenu; import org.telegram.ui.ActionBar.ActionBarMenuItem; import org.telegram.ui.ActionBar.AlertDialog; import org.telegram.ui.Components.AvatarDrawable; import org.telegram.ui.Components.BackupImageView; import org.telegram.ui.Components.ChatActivityEnterView; import org.telegram.ui.Components.LayoutHelper; import org.telegram.ui.Components.PlayingGameDrawable; import org.telegram.ui.Components.PopupAudioView; import org.telegram.ui.Components.RecordStatusDrawable; import org.telegram.ui.Components.RoundStatusDrawable; import org.telegram.ui.Components.SendingFileDrawable; import org.telegram.ui.Components.SizeNotifierFrameLayout; import org.telegram.ui.ActionBar.Theme; import org.telegram.ui.Components.StatusDrawable; import org.telegram.ui.Components.TypingDotsDrawable; import java.io.File; import java.util.ArrayList; public class PopupNotificationActivity extends Activity implements NotificationCenter.NotificationCenterDelegate { private ActionBar actionBar; private ChatActivityEnterView chatActivityEnterView; private BackupImageView avatarImageView; private TextView nameTextView; private TextView onlineTextView; private FrameLayout avatarContainer; private TextView countText; private ViewGroup messageContainer; private ViewGroup centerView; private ViewGroup leftView; private ViewGroup rightView; private ViewGroup centerButtonsView; private ViewGroup leftButtonsView; private ViewGroup rightButtonsView; private RelativeLayout popupContainer; private ArrayList textViews = new ArrayList<>(); private ArrayList imageViews = new ArrayList<>(); private ArrayList audioViews = new ArrayList<>(); private VelocityTracker velocityTracker = null; private StatusDrawable[] statusDrawables = new StatusDrawable[5]; private final static int id_chat_compose_panel = 1000; private int classGuid; private int lastResumedAccount = -1; private TLRPC.User currentUser; private TLRPC.Chat currentChat; private boolean finished = false; private CharSequence lastPrintString; private MessageObject currentMessageObject = null; private MessageObject[] setMessageObjects = new MessageObject[3]; private int currentMessageNum = 0; private PowerManager.WakeLock wakeLock = null; private boolean animationInProgress = false; private long animationStartTime = 0; private float moveStartX = -1; private boolean startedMoving = false; private Runnable onAnimationEndRunnable = null; private boolean isReply; private ArrayList popupMessages = new ArrayList<>(); private class FrameLayoutTouch extends FrameLayout { public FrameLayoutTouch(Context context) { super(context); } public FrameLayoutTouch(Context context, AttributeSet attrs) { super(context, attrs); } public FrameLayoutTouch(Context context, AttributeSet attrs, int defStyle) { super(context, attrs, defStyle); } @Override public boolean onInterceptTouchEvent(MotionEvent ev) { return checkTransitionAnimation() || ((PopupNotificationActivity) getContext()).onTouchEventMy(ev); } @Override public boolean onTouchEvent(MotionEvent ev) { return checkTransitionAnimation() || ((PopupNotificationActivity) getContext()).onTouchEventMy(ev); } @Override public void requestDisallowInterceptTouchEvent(boolean disallowIntercept) { ((PopupNotificationActivity) getContext()).onTouchEventMy(null); super.requestDisallowInterceptTouchEvent(disallowIntercept); } } @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); Theme.createDialogsResources(this); Theme.createChatResources(this, false); AndroidUtilities.fillStatusBarHeight(this); for (int a = 0; a < UserConfig.MAX_ACCOUNT_COUNT; a++) { NotificationCenter.getInstance(a).addObserver(this, NotificationCenter.appDidLogout); NotificationCenter.getInstance(a).addObserver(this, NotificationCenter.updateInterfaces); NotificationCenter.getInstance(a).addObserver(this, NotificationCenter.messagePlayingProgressDidChanged); NotificationCenter.getInstance(a).addObserver(this, NotificationCenter.messagePlayingDidReset); NotificationCenter.getInstance(a).addObserver(this, NotificationCenter.contactsDidLoad); } NotificationCenter.getGlobalInstance().addObserver(this, NotificationCenter.pushMessagesUpdated); NotificationCenter.getGlobalInstance().addObserver(this, NotificationCenter.emojiDidLoad); classGuid = ConnectionsManager.generateClassGuid(); statusDrawables[0] = new TypingDotsDrawable(false); statusDrawables[1] = new RecordStatusDrawable(false); statusDrawables[2] = new SendingFileDrawable(false); statusDrawables[3] = new PlayingGameDrawable(false); statusDrawables[4] = new RoundStatusDrawable(false); SizeNotifierFrameLayout contentView = new SizeNotifierFrameLayout(this) { @Override protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { int widthMode = MeasureSpec.getMode(widthMeasureSpec); int heightMode = MeasureSpec.getMode(heightMeasureSpec); int widthSize = MeasureSpec.getSize(widthMeasureSpec); int heightSize = MeasureSpec.getSize(heightMeasureSpec); setMeasuredDimension(widthSize, heightSize); int keyboardSize = measureKeyboardHeight(); if (keyboardSize <= AndroidUtilities.dp(20)) { heightSize -= chatActivityEnterView.getEmojiPadding(); } int childCount = getChildCount(); for (int i = 0; i < childCount; i++) { View child = getChildAt(i); if (child.getVisibility() == GONE) { continue; } if (chatActivityEnterView.isPopupView(child)) { child.measure(MeasureSpec.makeMeasureSpec(widthSize, MeasureSpec.EXACTLY), MeasureSpec.makeMeasureSpec(child.getLayoutParams().height, MeasureSpec.EXACTLY)); } else if (chatActivityEnterView.isRecordCircle(child)) { measureChildWithMargins(child, widthMeasureSpec, 0, heightMeasureSpec, 0); } else { child.measure(MeasureSpec.makeMeasureSpec(widthSize, MeasureSpec.EXACTLY), MeasureSpec.makeMeasureSpec(Math.max(AndroidUtilities.dp(10), heightSize + AndroidUtilities.dp(2)), MeasureSpec.EXACTLY)); } } } @Override protected void onLayout(boolean changed, int l, int t, int r, int b) { final int count = getChildCount(); int paddingBottom = measureKeyboardHeight() <= AndroidUtilities.dp(20) ? chatActivityEnterView.getEmojiPadding() : 0; for (int i = 0; i < count; i++) { final View child = getChildAt(i); if (child.getVisibility() == GONE) { continue; } final LayoutParams lp = (LayoutParams) child.getLayoutParams(); int width = child.getMeasuredWidth(); int height = child.getMeasuredHeight(); int childLeft; int childTop; int gravity = lp.gravity; if (gravity == -1) { gravity = Gravity.TOP | Gravity.LEFT; } final int absoluteGravity = gravity & Gravity.HORIZONTAL_GRAVITY_MASK; final int verticalGravity = gravity & Gravity.VERTICAL_GRAVITY_MASK; switch (absoluteGravity & Gravity.HORIZONTAL_GRAVITY_MASK) { case Gravity.CENTER_HORIZONTAL: childLeft = (r - l - width) / 2 + lp.leftMargin - lp.rightMargin; break; case Gravity.RIGHT: childLeft = r - width - lp.rightMargin; break; case Gravity.LEFT: default: childLeft = lp.leftMargin; } switch (verticalGravity) { case Gravity.CENTER_VERTICAL: childTop = ((b - paddingBottom) - t - height) / 2 + lp.topMargin - lp.bottomMargin; break; case Gravity.BOTTOM: childTop = ((b - paddingBottom) - t) - height - lp.bottomMargin; break; default: childTop = lp.topMargin; } if (chatActivityEnterView.isPopupView(child)) { childTop = paddingBottom != 0 ? getMeasuredHeight() - paddingBottom : getMeasuredHeight(); } else if (chatActivityEnterView.isRecordCircle(child)) { childTop = popupContainer.getTop() + popupContainer.getMeasuredHeight() - child.getMeasuredHeight() - lp.bottomMargin; childLeft = popupContainer.getLeft() + popupContainer.getMeasuredWidth() - child.getMeasuredWidth() - lp.rightMargin; } child.layout(childLeft, childTop, childLeft + width, childTop + height); } notifyHeightChanged(); } }; setContentView(contentView); contentView.setBackgroundColor(0x99000000); RelativeLayout relativeLayout = new RelativeLayout(this); contentView.addView(relativeLayout, LayoutHelper.createFrame(LayoutHelper.MATCH_PARENT, LayoutHelper.MATCH_PARENT)); popupContainer = new RelativeLayout(this) { @Override protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { super.onMeasure(widthMeasureSpec, heightMeasureSpec); int w = chatActivityEnterView.getMeasuredWidth(); int h = chatActivityEnterView.getMeasuredHeight(); for (int a = 0, count; a < getChildCount(); a++) { View v = getChildAt(a); if (v.getTag() instanceof String) { v.measure(MeasureSpec.makeMeasureSpec(w, MeasureSpec.EXACTLY), MeasureSpec.makeMeasureSpec(h - AndroidUtilities.dp(3), MeasureSpec.EXACTLY)); } } } @Override protected void onLayout(boolean changed, int l, int t, int r, int b) { super.onLayout(changed, l, t, r, b); for (int a = 0, count; a < getChildCount(); a++) { View v = getChildAt(a); if (v.getTag() instanceof String) { v.layout(v.getLeft(), chatActivityEnterView.getTop() + AndroidUtilities.dp(3), v.getRight(), chatActivityEnterView.getBottom()); } } } }; popupContainer.setBackgroundColor(Theme.getColor(Theme.key_windowBackgroundWhite)); relativeLayout.addView(popupContainer, LayoutHelper.createRelative(LayoutHelper.MATCH_PARENT, 240, 12, 0, 12, 0, RelativeLayout.CENTER_IN_PARENT)); if (chatActivityEnterView != null) { chatActivityEnterView.onDestroy(); } chatActivityEnterView = new ChatActivityEnterView(this, contentView, null, false); chatActivityEnterView.setId(id_chat_compose_panel); popupContainer.addView(chatActivityEnterView, LayoutHelper.createRelative(LayoutHelper.MATCH_PARENT, LayoutHelper.WRAP_CONTENT, RelativeLayout.ALIGN_PARENT_BOTTOM)); chatActivityEnterView.setDelegate(new ChatActivityEnterView.ChatActivityEnterViewDelegate() { @Override public void onMessageSend(CharSequence message, boolean notify, int scheduleDate) { if (currentMessageObject == null) { return; } if (currentMessageNum >= 0 && currentMessageNum < popupMessages.size()) { popupMessages.remove(currentMessageNum); } MessagesController.getInstance(currentMessageObject.currentAccount).markDialogAsRead(currentMessageObject.getDialogId(), currentMessageObject.getId(), Math.max(0, currentMessageObject.getId()), currentMessageObject.messageOwner.date, true, 0, 0, true, 0); currentMessageObject = null; getNewMessage(); } @Override public void onTextChanged(CharSequence text, boolean big) { } @Override public void onTextSelectionChanged(int start, int end) { } @Override public void onTextSpansChanged(CharSequence text) { } @Override public void onStickersExpandedChange() { } @Override public void onSwitchRecordMode(boolean video) { } @Override public void onPreAudioVideoRecord() { } @Override public void onMessageEditEnd(boolean loading) { } @Override public void needSendTyping() { if (currentMessageObject != null) { MessagesController.getInstance(currentMessageObject.currentAccount).sendTyping(currentMessageObject.getDialogId(), 0, 0, classGuid); } } @Override public void onAttachButtonHidden() { } @Override public void onAttachButtonShow() { } @Override public void onWindowSizeChanged(int size) { } @Override public void onStickersTab(boolean opened) { } @Override public void didPressAttachButton() { } @Override public void needStartRecordVideo(int state, boolean notify, int scheduleDate) { } @Override public void needStartRecordAudio(int state) { } @Override public void needChangeVideoPreviewState(int state, float seekProgress) { } @Override public void needShowMediaBanHint() { } @Override public void onUpdateSlowModeButton(View button, boolean show, CharSequence time) { } @Override public void onSendLongClick() { } @Override public void onAudioVideoInterfaceUpdated() { } }); messageContainer = new FrameLayoutTouch(this); popupContainer.addView(messageContainer, 0); actionBar = new ActionBar(this); actionBar.setOccupyStatusBar(false); actionBar.setBackButtonImage(R.drawable.ic_close_white); actionBar.setBackgroundColor(Theme.getColor(Theme.key_actionBarDefault)); actionBar.setItemsBackgroundColor(Theme.getColor(Theme.key_actionBarDefaultSelector), false); popupContainer.addView(actionBar); ViewGroup.LayoutParams layoutParams = actionBar.getLayoutParams(); layoutParams.width = ViewGroup.LayoutParams.MATCH_PARENT; actionBar.setLayoutParams(layoutParams); ActionBarMenu menu = actionBar.createMenu(); ActionBarMenuItem view = menu.addItemWithWidth(2, 0, AndroidUtilities.dp(56)); countText = new TextView(this); countText.setTextColor(Theme.getColor(Theme.key_actionBarDefaultSubtitle)); countText.setTextSize(TypedValue.COMPLEX_UNIT_DIP, 14); countText.setGravity(Gravity.CENTER); view.addView(countText, LayoutHelper.createFrame(56, LayoutHelper.MATCH_PARENT)); avatarContainer = new FrameLayout(this); avatarContainer.setPadding(AndroidUtilities.dp(4), 0, AndroidUtilities.dp(4), 0); actionBar.addView(avatarContainer); FrameLayout.LayoutParams layoutParams2 = (FrameLayout.LayoutParams) avatarContainer.getLayoutParams(); layoutParams2.height = LayoutHelper.MATCH_PARENT; layoutParams2.width = LayoutHelper.WRAP_CONTENT; layoutParams2.rightMargin = AndroidUtilities.dp(48); layoutParams2.leftMargin = AndroidUtilities.dp(60); layoutParams2.gravity = Gravity.TOP | Gravity.LEFT; avatarContainer.setLayoutParams(layoutParams2); avatarImageView = new BackupImageView(this); avatarImageView.setRoundRadius(AndroidUtilities.dp(21)); avatarContainer.addView(avatarImageView); layoutParams2 = (FrameLayout.LayoutParams) avatarImageView.getLayoutParams(); layoutParams2.width = AndroidUtilities.dp(42); layoutParams2.height = AndroidUtilities.dp(42); layoutParams2.topMargin = AndroidUtilities.dp(3); avatarImageView.setLayoutParams(layoutParams2); nameTextView = new TextView(this); nameTextView.setTextColor(Theme.getColor(Theme.key_actionBarDefaultTitle)); nameTextView.setTextSize(TypedValue.COMPLEX_UNIT_DIP, 18); nameTextView.setLines(1); nameTextView.setMaxLines(1); nameTextView.setSingleLine(true); nameTextView.setEllipsize(TextUtils.TruncateAt.END); nameTextView.setGravity(Gravity.LEFT); nameTextView.setTypeface(AndroidUtilities.getTypeface("fonts/rmedium.ttf")); avatarContainer.addView(nameTextView); layoutParams2 = (FrameLayout.LayoutParams) nameTextView.getLayoutParams(); layoutParams2.width = LayoutHelper.WRAP_CONTENT; layoutParams2.height = LayoutHelper.WRAP_CONTENT; layoutParams2.leftMargin = AndroidUtilities.dp(54); layoutParams2.bottomMargin = AndroidUtilities.dp(22); layoutParams2.gravity = Gravity.BOTTOM; nameTextView.setLayoutParams(layoutParams2); onlineTextView = new TextView(this); onlineTextView.setTextColor(Theme.getColor(Theme.key_actionBarDefaultSubtitle)); onlineTextView.setTextSize(TypedValue.COMPLEX_UNIT_DIP, 14); onlineTextView.setLines(1); onlineTextView.setMaxLines(1); onlineTextView.setSingleLine(true); onlineTextView.setEllipsize(TextUtils.TruncateAt.END); onlineTextView.setGravity(Gravity.LEFT); avatarContainer.addView(onlineTextView); layoutParams2 = (FrameLayout.LayoutParams) onlineTextView.getLayoutParams(); layoutParams2.width = LayoutHelper.WRAP_CONTENT; layoutParams2.height = LayoutHelper.WRAP_CONTENT; layoutParams2.leftMargin = AndroidUtilities.dp(54); layoutParams2.bottomMargin = AndroidUtilities.dp(4); layoutParams2.gravity = Gravity.BOTTOM; onlineTextView.setLayoutParams(layoutParams2); actionBar.setActionBarMenuOnItemClick(new ActionBar.ActionBarMenuOnItemClick() { @Override public void onItemClick(int id) { if (id == -1) { onFinish(); finish(); } else if (id == 1) { openCurrentMessage(); } else if (id == 2) { switchToNextMessage(); } } }); PowerManager pm = (PowerManager) ApplicationLoader.applicationContext.getSystemService(Context.POWER_SERVICE); wakeLock = pm.newWakeLock(PowerManager.SCREEN_DIM_WAKE_LOCK | PowerManager.ACQUIRE_CAUSES_WAKEUP, "screen"); wakeLock.setReferenceCounted(false); handleIntent(getIntent()); } @Override public void onConfigurationChanged(Configuration newConfig) { super.onConfigurationChanged(newConfig); AndroidUtilities.checkDisplaySize(this, newConfig); fixLayout(); } @Override protected void onNewIntent(Intent intent) { super.onNewIntent(intent); handleIntent(intent); } @Override public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) { super.onRequestPermissionsResult(requestCode, permissions, grantResults); if (requestCode == 3) { if (grantResults[0] == PackageManager.PERMISSION_GRANTED) { return; } AlertDialog.Builder builder = new AlertDialog.Builder(this); builder.setTitle(LocaleController.getString("AppName", R.string.AppName)); builder.setMessage(LocaleController.getString("PermissionNoAudio", R.string.PermissionNoAudio)); builder.setNegativeButton(LocaleController.getString("PermissionOpenSettings", R.string.PermissionOpenSettings), (dialog, which) -> { try { Intent intent = new Intent(android.provider.Settings.ACTION_APPLICATION_DETAILS_SETTINGS); intent.setData(Uri.parse("package:" + ApplicationLoader.applicationContext.getPackageName())); startActivity(intent); } catch (Exception e) { FileLog.e(e); } }); builder.setPositiveButton(LocaleController.getString("OK", R.string.OK), null); builder.show(); } } private void switchToNextMessage() { if (popupMessages.size() > 1) { if (currentMessageNum < popupMessages.size() - 1) { currentMessageNum++; } else { currentMessageNum = 0; } currentMessageObject = popupMessages.get(currentMessageNum); updateInterfaceForCurrentMessage(2); countText.setText(String.format("%d/%d", currentMessageNum + 1, popupMessages.size())); } } private void switchToPreviousMessage() { if (popupMessages.size() > 1) { if (currentMessageNum > 0) { currentMessageNum--; } else { currentMessageNum = popupMessages.size() - 1; } currentMessageObject = popupMessages.get(currentMessageNum); updateInterfaceForCurrentMessage(1); countText.setText(String.format("%d/%d", currentMessageNum + 1, popupMessages.size())); } } public boolean checkTransitionAnimation() { if (animationInProgress && animationStartTime < System.currentTimeMillis() - 400) { animationInProgress = false; if (onAnimationEndRunnable != null) { onAnimationEndRunnable.run(); onAnimationEndRunnable = null; } } return animationInProgress; } public boolean onTouchEventMy(MotionEvent motionEvent) { if (checkTransitionAnimation()) { return false; } if (motionEvent != null && motionEvent.getAction() == MotionEvent.ACTION_DOWN) { moveStartX = motionEvent.getX(); } else if (motionEvent != null && motionEvent.getAction() == MotionEvent.ACTION_MOVE) { float x = motionEvent.getX(); int diff = (int) (x - moveStartX); if (moveStartX != -1 && !startedMoving) { if (Math.abs(diff) > AndroidUtilities.dp(10)) { startedMoving = true; moveStartX = x; AndroidUtilities.lockOrientation(this); diff = 0; if (velocityTracker == null) { velocityTracker = VelocityTracker.obtain(); } else { velocityTracker.clear(); } } } if (startedMoving) { if (leftView == null && diff > 0) { diff = 0; } if (rightView == null && diff < 0) { diff = 0; } if (velocityTracker != null) { velocityTracker.addMovement(motionEvent); } applyViewsLayoutParams(diff); } } else if (motionEvent == null || motionEvent.getAction() == MotionEvent.ACTION_UP || motionEvent.getAction() == MotionEvent.ACTION_CANCEL) { if (motionEvent != null && startedMoving) { int diff = (int) (motionEvent.getX() - moveStartX); int width = AndroidUtilities.displaySize.x - AndroidUtilities.dp(24); float moveDiff = 0; int forceMove = 0; View otherView = null; View otherButtonsView = null; if (velocityTracker != null) { velocityTracker.computeCurrentVelocity(1000); if (velocityTracker.getXVelocity() >= 3500) { forceMove = 1; } else if (velocityTracker.getXVelocity() <= -3500) { forceMove = 2; } } if ((forceMove == 1 || diff > width / 3) && leftView != null) { moveDiff = width - centerView.getTranslationX(); otherView = leftView; otherButtonsView = leftButtonsView; onAnimationEndRunnable = () -> { animationInProgress = false; switchToPreviousMessage(); AndroidUtilities.unlockOrientation(PopupNotificationActivity.this); }; } else if ((forceMove == 2 || diff < -width / 3) && rightView != null) { moveDiff = -width - centerView.getTranslationX(); otherView = rightView; otherButtonsView = rightButtonsView; onAnimationEndRunnable = () -> { animationInProgress = false; switchToNextMessage(); AndroidUtilities.unlockOrientation(PopupNotificationActivity.this); }; } else if (centerView.getTranslationX() != 0) { moveDiff = -centerView.getTranslationX(); otherView = diff > 0 ? leftView : rightView; otherButtonsView = diff > 0 ? leftButtonsView : rightButtonsView; onAnimationEndRunnable = () -> { animationInProgress = false; applyViewsLayoutParams(0); AndroidUtilities.unlockOrientation(PopupNotificationActivity.this); }; } if (moveDiff != 0) { int time = (int) (Math.abs(moveDiff / (float) width) * 200); ArrayList animators = new ArrayList<>(); animators.add(ObjectAnimator.ofFloat(centerView, "translationX", centerView.getTranslationX() + moveDiff)); if (centerButtonsView != null) { animators.add(ObjectAnimator.ofFloat(centerButtonsView, "translationX", centerButtonsView.getTranslationX() + moveDiff)); } if (otherView != null) { animators.add(ObjectAnimator.ofFloat(otherView, "translationX", otherView.getTranslationX() + moveDiff)); } if (otherButtonsView != null) { animators.add(ObjectAnimator.ofFloat(otherButtonsView, "translationX", otherButtonsView.getTranslationX() + moveDiff)); } AnimatorSet animatorSet = new AnimatorSet(); animatorSet.playTogether(animators); animatorSet.setDuration(time); animatorSet.addListener(new AnimatorListenerAdapter() { @Override public void onAnimationEnd(Animator animation) { if (onAnimationEndRunnable != null) { onAnimationEndRunnable.run(); onAnimationEndRunnable = null; } } }); animatorSet.start(); animationInProgress = true; animationStartTime = System.currentTimeMillis(); } } else { applyViewsLayoutParams(0); } if (velocityTracker != null) { velocityTracker.recycle(); velocityTracker = null; } startedMoving = false; moveStartX = -1; } return startedMoving; } private void applyViewsLayoutParams(int xOffset) { FrameLayout.LayoutParams layoutParams; RelativeLayout.LayoutParams rLayoutParams; int widht = AndroidUtilities.displaySize.x - AndroidUtilities.dp(24); if (leftView != null) { layoutParams = (FrameLayout.LayoutParams) leftView.getLayoutParams(); if (layoutParams.width != widht) { layoutParams.width = widht; leftView.setLayoutParams(layoutParams); } leftView.setTranslationX(-widht + xOffset); } if (leftButtonsView != null) { leftButtonsView.setTranslationX(-widht + xOffset); } if (centerView != null) { layoutParams = (FrameLayout.LayoutParams) centerView.getLayoutParams(); if (layoutParams.width != widht) { layoutParams.width = widht; centerView.setLayoutParams(layoutParams); } centerView.setTranslationX(xOffset); } if (centerButtonsView != null) { centerButtonsView.setTranslationX(xOffset); } if (rightView != null) { layoutParams = (FrameLayout.LayoutParams) rightView.getLayoutParams(); if (layoutParams.width != widht) { layoutParams.width = widht; rightView.setLayoutParams(layoutParams); } rightView.setTranslationX(widht + xOffset); } if (rightButtonsView != null) { rightButtonsView.setTranslationX(widht + xOffset); } messageContainer.invalidate(); } private LinearLayout getButtonsViewForMessage(int num, boolean applyOffset) { if (popupMessages.size() == 1 && (num < 0 || num >= popupMessages.size())) { return null; } if (num == -1) { num = popupMessages.size() - 1; } else if (num == popupMessages.size()) { num = 0; } LinearLayout view = null; final MessageObject messageObject = popupMessages.get(num); int buttonsCount = 0; TLRPC.ReplyMarkup markup = messageObject.messageOwner.reply_markup; if (messageObject.getDialogId() == 777000 && markup != null) { ArrayList rows = markup.rows; for (int a = 0, size = rows.size(); a < size; a++) { TLRPC.TL_keyboardButtonRow row = rows.get(a); for (int b = 0, size2 = row.buttons.size(); b < size2; b++) { TLRPC.KeyboardButton button = row.buttons.get(b); if (button instanceof TLRPC.TL_keyboardButtonCallback) { buttonsCount++; } } } } final int account = messageObject.currentAccount; if (buttonsCount > 0) { ArrayList rows = markup.rows; for (int a = 0, size = rows.size(); a < size; a++) { TLRPC.TL_keyboardButtonRow row = rows.get(a); for (int b = 0, size2 = row.buttons.size(); b < size2; b++) { TLRPC.KeyboardButton button = row.buttons.get(b); if (button instanceof TLRPC.TL_keyboardButtonCallback) { if (view == null) { view = new LinearLayout(this); view.setOrientation(LinearLayout.HORIZONTAL); view.setBackgroundColor(Theme.getColor(Theme.key_windowBackgroundWhite)); view.setWeightSum(100); view.setTag("b"); view.setOnTouchListener((v, event) -> true); } TextView textView = new TextView(this); textView.setTextSize(TypedValue.COMPLEX_UNIT_DIP, 16); textView.setTextColor(Theme.getColor(Theme.key_windowBackgroundWhiteBlueText)); textView.setTypeface(AndroidUtilities.getTypeface("fonts/rmedium.ttf")); textView.setText(button.text.toUpperCase()); textView.setTag(button); textView.setGravity(Gravity.CENTER); textView.setBackgroundDrawable(Theme.getSelectorDrawable(true)); view.addView(textView, LayoutHelper.createLinear(LayoutHelper.MATCH_PARENT, LayoutHelper.MATCH_PARENT, 100.0f / buttonsCount)); textView.setOnClickListener(v -> { TLRPC.KeyboardButton button1 = (TLRPC.KeyboardButton) v.getTag(); if (button1 != null) { SendMessagesHelper.getInstance(account).sendNotificationCallback(messageObject.getDialogId(), messageObject.getId(), button1.data); } }); } } } } if (view != null) { int widht = AndroidUtilities.displaySize.x - AndroidUtilities.dp(24); RelativeLayout.LayoutParams layoutParams = new RelativeLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT); layoutParams.addRule(RelativeLayout.ALIGN_PARENT_BOTTOM); if (applyOffset) { if (num == currentMessageNum) { view.setTranslationX(0); } else if (num == currentMessageNum - 1) { view.setTranslationX(-widht); } else if (num == currentMessageNum + 1) { view.setTranslationX(widht); } } popupContainer.addView(view, layoutParams); } return view; } private ViewGroup getViewForMessage(int num, boolean applyOffset) { if (popupMessages.size() == 1 && (num < 0 || num >= popupMessages.size())) { return null; } if (num == -1) { num = popupMessages.size() - 1; } else if (num == popupMessages.size()) { num = 0; } ViewGroup view; MessageObject messageObject = popupMessages.get(num); if ((messageObject.type == 1 || messageObject.type == 4) && !messageObject.isSecretMedia()) { if (imageViews.size() > 0) { view = imageViews.get(0); imageViews.remove(0); } else { view = new FrameLayout(this); FrameLayout frameLayout = new FrameLayout(this); frameLayout.setPadding(AndroidUtilities.dp(10), AndroidUtilities.dp(10), AndroidUtilities.dp(10), AndroidUtilities.dp(10)); frameLayout.setBackgroundDrawable(Theme.getSelectorDrawable(false)); view.addView(frameLayout, LayoutHelper.createFrame(LayoutHelper.MATCH_PARENT, LayoutHelper.MATCH_PARENT)); BackupImageView backupImageView = new BackupImageView(this); backupImageView.setTag(311); frameLayout.addView(backupImageView, LayoutHelper.createFrame(LayoutHelper.MATCH_PARENT, LayoutHelper.MATCH_PARENT)); TextView textView = new TextView(this); textView.setTextColor(Theme.getColor(Theme.key_windowBackgroundWhiteBlackText)); textView.setTextSize(TypedValue.COMPLEX_UNIT_DIP, 16); textView.setGravity(Gravity.CENTER); textView.setTag(312); frameLayout.addView(textView, LayoutHelper.createFrame(LayoutHelper.MATCH_PARENT, LayoutHelper.WRAP_CONTENT, Gravity.CENTER)); view.setTag(2); view.setOnClickListener(v -> openCurrentMessage()); } TextView messageText = view.findViewWithTag(312); BackupImageView imageView = view.findViewWithTag(311); imageView.setAspectFit(true); if (messageObject.type == 1) { TLRPC.PhotoSize currentPhotoObject = FileLoader.getClosestPhotoSizeWithSize(messageObject.photoThumbs, AndroidUtilities.getPhotoSize()); TLRPC.PhotoSize thumb = FileLoader.getClosestPhotoSizeWithSize(messageObject.photoThumbs, 100); boolean photoSet = false; if (currentPhotoObject != null) { boolean photoExist = true; if (messageObject.type == 1) { File cacheFile = FileLoader.getPathToMessage(messageObject.messageOwner); if (!cacheFile.exists()) { photoExist = false; } } if (!messageObject.needDrawBluredPreview()) { if (photoExist || DownloadController.getInstance(messageObject.currentAccount).canDownloadMedia(messageObject)) { imageView.setImage(ImageLocation.getForObject(currentPhotoObject, messageObject.photoThumbsObject), "100_100", ImageLocation.getForObject(thumb, messageObject.photoThumbsObject), "100_100_b", currentPhotoObject.size, messageObject); photoSet = true; } else { if (thumb != null) { imageView.setImage(ImageLocation.getForObject(thumb, messageObject.photoThumbsObject), "100_100_b", null, null, messageObject); photoSet = true; } } } } if (!photoSet) { imageView.setVisibility(View.GONE); messageText.setVisibility(View.VISIBLE); messageText.setTextSize(TypedValue.COMPLEX_UNIT_SP, SharedConfig.fontSize); messageText.setText(messageObject.messageText); } else { imageView.setVisibility(View.VISIBLE); messageText.setVisibility(View.GONE); } } else if (messageObject.type == 4) { messageText.setVisibility(View.GONE); messageText.setText(messageObject.messageText); imageView.setVisibility(View.VISIBLE); TLRPC.GeoPoint geoPoint = messageObject.messageOwner.media.geo; double lat = geoPoint.lat; double lon = geoPoint._long; if (MessagesController.getInstance(messageObject.currentAccount).mapProvider == 2) { imageView.setImage(ImageLocation.getForWebFile(WebFile.createWithGeoPoint(geoPoint, 100, 100, 15, Math.min(2, (int) Math.ceil(AndroidUtilities.density)))), null, null, null, messageObject); } else { String currentUrl = AndroidUtilities.formapMapUrl(messageObject.currentAccount, lat, lon, 100, 100, true, 15, -1); imageView.setImage(currentUrl, null, null); } } } else if (messageObject.type == 2) { PopupAudioView cell; if (audioViews.size() > 0) { view = audioViews.get(0); audioViews.remove(0); cell = view.findViewWithTag(300); } else { view = new FrameLayout(this); FrameLayout frameLayout = new FrameLayout(this); frameLayout.setPadding(AndroidUtilities.dp(10), AndroidUtilities.dp(10), AndroidUtilities.dp(10), AndroidUtilities.dp(10)); frameLayout.setBackgroundDrawable(Theme.getSelectorDrawable(false)); view.addView(frameLayout, LayoutHelper.createFrame(LayoutHelper.MATCH_PARENT, LayoutHelper.MATCH_PARENT)); FrameLayout frameLayout1 = new FrameLayout(this); frameLayout.addView(frameLayout1, LayoutHelper.createFrame(LayoutHelper.MATCH_PARENT, LayoutHelper.WRAP_CONTENT, Gravity.CENTER, 20, 0, 20, 0)); cell = new PopupAudioView(this); cell.setTag(300); frameLayout1.addView(cell); view.setTag(3); view.setOnClickListener(v -> openCurrentMessage()); } cell.setMessageObject(messageObject); if (DownloadController.getInstance(messageObject.currentAccount).canDownloadMedia(messageObject)) { cell.downloadAudioIfNeed(); } } else { if (textViews.size() > 0) { view = textViews.get(0); textViews.remove(0); } else { view = new FrameLayout(this); ScrollView scrollView = new ScrollView(this); scrollView.setFillViewport(true); view.addView(scrollView, LayoutHelper.createFrame(LayoutHelper.MATCH_PARENT, LayoutHelper.MATCH_PARENT)); LinearLayout linearLayout = new LinearLayout(this); linearLayout.setOrientation(LinearLayout.HORIZONTAL); linearLayout.setBackgroundDrawable(Theme.getSelectorDrawable(false)); scrollView.addView(linearLayout, LayoutHelper.createScroll(LayoutHelper.MATCH_PARENT, LayoutHelper.WRAP_CONTENT, Gravity.CENTER_HORIZONTAL)); linearLayout.setPadding(AndroidUtilities.dp(10), AndroidUtilities.dp(10), AndroidUtilities.dp(10), AndroidUtilities.dp(10)); linearLayout.setOnClickListener(v -> openCurrentMessage()); TextView textView = new TextView(this); textView.setTextSize(TypedValue.COMPLEX_UNIT_DIP, 16); textView.setTag(301); textView.setTextColor(Theme.getColor(Theme.key_windowBackgroundWhiteBlackText)); textView.setLinkTextColor(Theme.getColor(Theme.key_windowBackgroundWhiteBlackText)); textView.setGravity(Gravity.CENTER); linearLayout.addView(textView, LayoutHelper.createLinear(LayoutHelper.MATCH_PARENT, LayoutHelper.WRAP_CONTENT, Gravity.CENTER)); view.setTag(1); } TextView messageText = view.findViewWithTag(301); messageText.setTextSize(TypedValue.COMPLEX_UNIT_SP, SharedConfig.fontSize); messageText.setText(messageObject.messageText); } if (view.getParent() == null) { messageContainer.addView(view); } view.setVisibility(View.VISIBLE); if (applyOffset) { int widht = AndroidUtilities.displaySize.x - AndroidUtilities.dp(24); FrameLayout.LayoutParams layoutParams = (FrameLayout.LayoutParams) view.getLayoutParams(); layoutParams.gravity = Gravity.TOP | Gravity.LEFT; layoutParams.height = ViewGroup.LayoutParams.MATCH_PARENT; layoutParams.width = widht; if (num == currentMessageNum) { view.setTranslationX(0); } else if (num == currentMessageNum - 1) { view.setTranslationX(-widht); } else if (num == currentMessageNum + 1) { view.setTranslationX(widht); } view.setLayoutParams(layoutParams); view.invalidate(); } return view; } private void reuseButtonsView(ViewGroup view) { if (view == null) { return; } popupContainer.removeView(view); } private void reuseView(ViewGroup view) { if (view == null) { return; } int tag = (Integer) view.getTag(); view.setVisibility(View.GONE); if (tag == 1) { textViews.add(view); } else if (tag == 2) { imageViews.add(view); } else if (tag == 3) { audioViews.add(view); } } private void prepareLayouts(int move) { int widht = AndroidUtilities.displaySize.x - AndroidUtilities.dp(24); if (move == 0) { reuseView(centerView); reuseView(leftView); reuseView(rightView); reuseButtonsView(centerButtonsView); reuseButtonsView(leftButtonsView); reuseButtonsView(rightButtonsView); for (int a = currentMessageNum - 1; a < currentMessageNum + 2; a++) { if (a == currentMessageNum - 1) { leftView = getViewForMessage(a, true); leftButtonsView = getButtonsViewForMessage(a, true); } else if (a == currentMessageNum) { centerView = getViewForMessage(a, true); centerButtonsView = getButtonsViewForMessage(a, true); } else if (a == currentMessageNum + 1) { rightView = getViewForMessage(a, true); rightButtonsView = getButtonsViewForMessage(a, true); } } } else if (move == 1) { reuseView(rightView); reuseButtonsView(rightButtonsView); rightView = centerView; centerView = leftView; leftView = getViewForMessage(currentMessageNum - 1, true); rightButtonsView = centerButtonsView; centerButtonsView = leftButtonsView; leftButtonsView = getButtonsViewForMessage(currentMessageNum - 1, true); } else if (move == 2) { reuseView(leftView); reuseButtonsView(leftButtonsView); leftView = centerView; centerView = rightView; rightView = getViewForMessage(currentMessageNum + 1, true); leftButtonsView = centerButtonsView; centerButtonsView = rightButtonsView; rightButtonsView = getButtonsViewForMessage(currentMessageNum + 1, true); } else if (move == 3) { if (rightView != null) { float offset = rightView.getTranslationX(); reuseView(rightView); if ((rightView = getViewForMessage(currentMessageNum + 1, false)) != null) { FrameLayout.LayoutParams layoutParams = (FrameLayout.LayoutParams) rightView.getLayoutParams(); layoutParams.width = widht; rightView.setLayoutParams(layoutParams); rightView.setTranslationX(offset); rightView.invalidate(); } } if (rightButtonsView != null) { float offset = rightButtonsView.getTranslationX(); reuseButtonsView(rightButtonsView); if ((rightButtonsView = getButtonsViewForMessage(currentMessageNum + 1, false)) != null) { rightButtonsView.setTranslationX(offset); } } } else if (move == 4) { if (leftView != null) { float offset = leftView.getTranslationX(); reuseView(leftView); if ((leftView = getViewForMessage(0, false)) != null) { FrameLayout.LayoutParams layoutParams = (FrameLayout.LayoutParams) leftView.getLayoutParams(); layoutParams.width = widht; leftView.setLayoutParams(layoutParams); leftView.setTranslationX(offset); leftView.invalidate(); } } if (leftButtonsView != null) { float offset = leftButtonsView.getTranslationX(); reuseButtonsView(leftButtonsView); if ((leftButtonsView = getButtonsViewForMessage(0, false)) != null) { leftButtonsView.setTranslationX(offset); } } } for (int a = 0; a < 3; a++) { int num = currentMessageNum - 1 + a; MessageObject messageObject; if (popupMessages.size() == 1 && (num < 0 || num >= popupMessages.size())) { messageObject = null; } else { if (num == -1) { num = popupMessages.size() - 1; } else if (num == popupMessages.size()) { num = 0; } messageObject = popupMessages.get(num); } setMessageObjects[a] = messageObject; } } private void fixLayout() { if (avatarContainer != null) { avatarContainer.getViewTreeObserver().addOnPreDrawListener(new ViewTreeObserver.OnPreDrawListener() { @Override public boolean onPreDraw() { if (avatarContainer != null) { avatarContainer.getViewTreeObserver().removeOnPreDrawListener(this); } int padding = (ActionBar.getCurrentActionBarHeight() - AndroidUtilities.dp(48)) / 2; avatarContainer.setPadding(avatarContainer.getPaddingLeft(), padding, avatarContainer.getPaddingRight(), padding); return true; } }); } if (messageContainer != null) { messageContainer.getViewTreeObserver().addOnPreDrawListener(new ViewTreeObserver.OnPreDrawListener() { @Override public boolean onPreDraw() { messageContainer.getViewTreeObserver().removeOnPreDrawListener(this); if (!checkTransitionAnimation() && !startedMoving) { ViewGroup.MarginLayoutParams layoutParams = (ViewGroup.MarginLayoutParams) messageContainer.getLayoutParams(); layoutParams.topMargin = ActionBar.getCurrentActionBarHeight(); layoutParams.bottomMargin = AndroidUtilities.dp(48); layoutParams.width = ViewGroup.MarginLayoutParams.MATCH_PARENT; layoutParams.height = ViewGroup.MarginLayoutParams.MATCH_PARENT; messageContainer.setLayoutParams(layoutParams); applyViewsLayoutParams(0); } return true; } }); } } private void handleIntent(Intent intent) { isReply = intent != null && intent.getBooleanExtra("force", false); popupMessages.clear(); if (isReply) { int account = intent != null ? intent.getIntExtra("currentAccount", UserConfig.selectedAccount) : UserConfig.selectedAccount; if (!UserConfig.isValidAccount(account)) { return; } popupMessages.addAll(NotificationsController.getInstance(account).popupReplyMessages); } else { for (int a = 0; a < UserConfig.MAX_ACCOUNT_COUNT; a++) { if (UserConfig.getInstance(a).isClientActivated()) { popupMessages.addAll(NotificationsController.getInstance(a).popupMessages); } } } KeyguardManager km = (KeyguardManager) getSystemService(KEYGUARD_SERVICE); if (km.inKeyguardRestrictedInputMode() || !ApplicationLoader.isScreenOn) { getWindow().addFlags( WindowManager.LayoutParams.FLAG_DIM_BEHIND | WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED | WindowManager.LayoutParams.FLAG_TURN_SCREEN_ON | WindowManager.LayoutParams.FLAG_FORCE_NOT_FULLSCREEN); } else { getWindow().addFlags( WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED | WindowManager.LayoutParams.FLAG_TURN_SCREEN_ON | WindowManager.LayoutParams.FLAG_FORCE_NOT_FULLSCREEN); getWindow().clearFlags(WindowManager.LayoutParams.FLAG_DIM_BEHIND); } if (currentMessageObject == null) { currentMessageNum = 0; } getNewMessage(); } private void getNewMessage() { if (popupMessages.isEmpty()) { onFinish(); finish(); return; } boolean found = false; if ((currentMessageNum != 0 || chatActivityEnterView.hasText() || startedMoving) && currentMessageObject != null) { for (int a = 0, size = popupMessages.size(); a < size; a++) { MessageObject messageObject = popupMessages.get(a); if (messageObject.currentAccount == currentMessageObject.currentAccount && messageObject.getDialogId() == currentMessageObject.getDialogId() && messageObject.getId() == currentMessageObject.getId()) { currentMessageNum = a; found = true; break; } } } if (!found) { currentMessageNum = 0; currentMessageObject = popupMessages.get(0); updateInterfaceForCurrentMessage(0); } else if (startedMoving) { if (currentMessageNum == popupMessages.size() - 1) { prepareLayouts(3); } else if (currentMessageNum == 1) { prepareLayouts(4); } } countText.setText(String.format("%d/%d", currentMessageNum + 1, popupMessages.size())); } private void openCurrentMessage() { if (currentMessageObject == null) { return; } Intent intent = new Intent(ApplicationLoader.applicationContext, LaunchActivity.class); long dialog_id = currentMessageObject.getDialogId(); if ((int) dialog_id != 0) { int lower_id = (int) dialog_id; if (lower_id < 0) { intent.putExtra("chatId", -lower_id); } else { intent.putExtra("userId", lower_id); } } else { intent.putExtra("encId", (int) (dialog_id >> 32)); } intent.putExtra("currentAccount", currentMessageObject.currentAccount); intent.setAction("com.tmessages.openchat" + Math.random() + Integer.MAX_VALUE); intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK); startActivity(intent); onFinish(); finish(); } private void updateInterfaceForCurrentMessage(int move) { if (actionBar == null) { return; } if (lastResumedAccount != currentMessageObject.currentAccount) { if (lastResumedAccount >= 0) { ConnectionsManager.getInstance(lastResumedAccount).setAppPaused(true, false); } lastResumedAccount = currentMessageObject.currentAccount; ConnectionsManager.getInstance(lastResumedAccount).setAppPaused(false, false); } currentChat = null; currentUser = null; long dialog_id = currentMessageObject.getDialogId(); chatActivityEnterView.setDialogId(dialog_id, currentMessageObject.currentAccount); if ((int) dialog_id != 0) { int lower_id = (int) dialog_id; if (lower_id > 0) { currentUser = MessagesController.getInstance(currentMessageObject.currentAccount).getUser(lower_id); } else { currentChat = MessagesController.getInstance(currentMessageObject.currentAccount).getChat(-lower_id); if (currentMessageObject.isFromUser()) { currentUser = MessagesController.getInstance(currentMessageObject.currentAccount).getUser(currentMessageObject.messageOwner.from_id.user_id); } } } else { TLRPC.EncryptedChat encryptedChat = MessagesController.getInstance(currentMessageObject.currentAccount).getEncryptedChat((int) (dialog_id >> 32)); currentUser = MessagesController.getInstance(currentMessageObject.currentAccount).getUser(encryptedChat.user_id); } if (currentChat != null) { nameTextView.setText(currentChat.title); if (currentUser != null) { onlineTextView.setText(UserObject.getUserName(currentUser)); } else { onlineTextView.setText(null); } nameTextView.setCompoundDrawablesWithIntrinsicBounds(0, 0, 0, 0); nameTextView.setCompoundDrawablePadding(0); } else if (currentUser != null) { nameTextView.setText(UserObject.getUserName(currentUser)); if ((int) dialog_id == 0) { nameTextView.setCompoundDrawablesWithIntrinsicBounds(R.drawable.ic_lock_white, 0, 0, 0); nameTextView.setCompoundDrawablePadding(AndroidUtilities.dp(4)); } else { nameTextView.setCompoundDrawablesWithIntrinsicBounds(0, 0, 0, 0); nameTextView.setCompoundDrawablePadding(0); } } prepareLayouts(move); updateSubtitle(); checkAndUpdateAvatar(); applyViewsLayoutParams(0); } private void updateSubtitle() { if (actionBar == null || currentMessageObject == null) { return; } if (currentChat != null || currentUser == null) { return; } if (currentUser.id / 1000 != 777 && currentUser.id / 1000 != 333 && ContactsController.getInstance(currentMessageObject.currentAccount).contactsDict.get(currentUser.id) == null && (ContactsController.getInstance(currentMessageObject.currentAccount).contactsDict.size() != 0 || !ContactsController.getInstance(currentMessageObject.currentAccount).isLoadingContacts())) { if (currentUser.phone != null && currentUser.phone.length() != 0) { nameTextView.setText(PhoneFormat.getInstance().format("+" + currentUser.phone)); } else { nameTextView.setText(UserObject.getUserName(currentUser)); } } else { nameTextView.setText(UserObject.getUserName(currentUser)); } if (currentUser != null && currentUser.id == 777000) { onlineTextView.setText(LocaleController.getString("ServiceNotifications", R.string.ServiceNotifications)); } else { CharSequence printString = MessagesController.getInstance(currentMessageObject.currentAccount).getPrintingString(currentMessageObject.getDialogId(), 0, false); if (printString == null || printString.length() == 0) { lastPrintString = null; setTypingAnimation(false); TLRPC.User user = MessagesController.getInstance(currentMessageObject.currentAccount).getUser(currentUser.id); if (user != null) { currentUser = user; } onlineTextView.setText(LocaleController.formatUserStatus(currentMessageObject.currentAccount, currentUser)); } else { lastPrintString = printString; onlineTextView.setText(printString); setTypingAnimation(true); } } } private void checkAndUpdateAvatar() { if (currentMessageObject == null) { return; } if (currentChat != null) { TLRPC.Chat chat = MessagesController.getInstance(currentMessageObject.currentAccount).getChat(currentChat.id); if (chat == null) { return; } currentChat = chat; if (avatarImageView != null) { AvatarDrawable avatarDrawable = new AvatarDrawable(currentChat); avatarImageView.setImage(ImageLocation.getForChat(chat, false), "50_50", avatarDrawable, chat); } } else if (currentUser != null) { TLRPC.User user = MessagesController.getInstance(currentMessageObject.currentAccount).getUser(currentUser.id); if (user == null) { return; } currentUser = user; if (avatarImageView != null) { AvatarDrawable avatarDrawable = new AvatarDrawable(currentUser); avatarImageView.setImage(ImageLocation.getForUser(user, false), "50_50", avatarDrawable, user); } } } private void setTypingAnimation(boolean start) { if (actionBar == null) { return; } if (start) { try { Integer type = MessagesController.getInstance(currentMessageObject.currentAccount).getPrintingStringType(currentMessageObject.getDialogId(), 0); onlineTextView.setCompoundDrawablesWithIntrinsicBounds(statusDrawables[type], null, null, null); onlineTextView.setCompoundDrawablePadding(AndroidUtilities.dp(4)); for (int a = 0; a < statusDrawables.length; a++) { if (a == type) { statusDrawables[a].start(); } else { statusDrawables[a].stop(); } } } catch (Exception e) { FileLog.e(e); } } else { onlineTextView.setCompoundDrawablesWithIntrinsicBounds(null, null, null, null); onlineTextView.setCompoundDrawablePadding(0); for (int a = 0; a < statusDrawables.length; a++) { statusDrawables[a].stop(); } } } @Override public void onBackPressed() { if (chatActivityEnterView.isPopupShowing()) { chatActivityEnterView.hidePopup(true); return; } super.onBackPressed(); } @Override protected void onResume() { super.onResume(); MediaController.getInstance().setFeedbackView(chatActivityEnterView, true); if (chatActivityEnterView != null) { chatActivityEnterView.setFieldFocused(true); } fixLayout(); checkAndUpdateAvatar(); wakeLock.acquire(7000); } @Override protected void onPause() { super.onPause(); overridePendingTransition(0, 0); if (chatActivityEnterView != null) { chatActivityEnterView.hidePopup(false); chatActivityEnterView.setFieldFocused(false); } if (lastResumedAccount >= 0) { ConnectionsManager.getInstance(lastResumedAccount).setAppPaused(true, false); } } @Override public void didReceivedNotification(int id, int account, Object... args) { if (id == NotificationCenter.appDidLogout) { if (account == lastResumedAccount) { onFinish(); finish(); } } else if (id == NotificationCenter.pushMessagesUpdated) { if (!isReply) { popupMessages.clear(); for (int a = 0; a < UserConfig.MAX_ACCOUNT_COUNT; a++) { if (UserConfig.getInstance(a).isClientActivated()) { popupMessages.addAll(NotificationsController.getInstance(a).popupMessages); } } getNewMessage(); if (!popupMessages.isEmpty()) { for (int a = 0; a < 3; a++) { int num = currentMessageNum - 1 + a; MessageObject messageObject; if (popupMessages.size() == 1 && (num < 0 || num >= popupMessages.size())) { messageObject = null; } else { if (num == -1) { num = popupMessages.size() - 1; } else if (num == popupMessages.size()) { num = 0; } messageObject = popupMessages.get(num); } if (setMessageObjects[a] != messageObject) { updateInterfaceForCurrentMessage(0); } } } } } else if (id == NotificationCenter.updateInterfaces) { if (currentMessageObject == null || account != lastResumedAccount) { return; } int updateMask = (Integer) args[0]; if ((updateMask & MessagesController.UPDATE_MASK_NAME) != 0 || (updateMask & MessagesController.UPDATE_MASK_STATUS) != 0 || (updateMask & MessagesController.UPDATE_MASK_CHAT_NAME) != 0 || (updateMask & MessagesController.UPDATE_MASK_CHAT_MEMBERS) != 0) { updateSubtitle(); } if ((updateMask & MessagesController.UPDATE_MASK_AVATAR) != 0 || (updateMask & MessagesController.UPDATE_MASK_CHAT_AVATAR) != 0) { checkAndUpdateAvatar(); } if ((updateMask & MessagesController.UPDATE_MASK_USER_PRINT) != 0) { CharSequence printString = MessagesController.getInstance(currentMessageObject.currentAccount).getPrintingString(currentMessageObject.getDialogId(), 0, false); if (lastPrintString != null && printString == null || lastPrintString == null && printString != null || lastPrintString != null && printString != null && !lastPrintString.equals(printString)) { updateSubtitle(); } } } else if (id == NotificationCenter.messagePlayingDidReset) { Integer mid = (Integer) args[0]; if (messageContainer != null) { int count = messageContainer.getChildCount(); for (int a = 0; a < count; a++) { View view = messageContainer.getChildAt(a); if ((Integer) view.getTag() == 3) { PopupAudioView cell = view.findViewWithTag(300); MessageObject messageObject = cell.getMessageObject(); if (messageObject != null && messageObject.currentAccount == account && messageObject.getId() == mid) { cell.updateButtonState(); break; } } } } } else if (id == NotificationCenter.messagePlayingProgressDidChanged) { Integer mid = (Integer) args[0]; if (messageContainer != null) { int count = messageContainer.getChildCount(); for (int a = 0; a < count; a++) { View view = messageContainer.getChildAt(a); if ((Integer) view.getTag() == 3) { PopupAudioView cell = view.findViewWithTag(300); MessageObject messageObject = cell.getMessageObject(); if (messageObject != null && messageObject.currentAccount == account && messageObject.getId() == mid) { cell.updateProgress(); break; } } } } } else if (id == NotificationCenter.emojiDidLoad) { if (messageContainer != null) { int count = messageContainer.getChildCount(); for (int a = 0; a < count; a++) { View view = messageContainer.getChildAt(a); if ((Integer) view.getTag() == 1) { TextView textView = view.findViewWithTag(301); if (textView != null) { textView.invalidate(); } } } } } else if (id == NotificationCenter.contactsDidLoad) { if (account == lastResumedAccount) { updateSubtitle(); } } } @Override protected void onDestroy() { super.onDestroy(); onFinish(); MediaController.getInstance().setFeedbackView(chatActivityEnterView, false); if (wakeLock.isHeld()) { wakeLock.release(); } if (avatarImageView != null) { avatarImageView.setImageDrawable(null); } } protected void onFinish() { if (finished) { return; } finished = true; if (isReply) { popupMessages.clear(); } for (int a = 0; a < UserConfig.MAX_ACCOUNT_COUNT; a++) { NotificationCenter.getInstance(a).removeObserver(this, NotificationCenter.appDidLogout); NotificationCenter.getInstance(a).removeObserver(this, NotificationCenter.updateInterfaces); NotificationCenter.getInstance(a).removeObserver(this, NotificationCenter.messagePlayingProgressDidChanged); NotificationCenter.getInstance(a).removeObserver(this, NotificationCenter.messagePlayingDidReset); NotificationCenter.getInstance(a).removeObserver(this, NotificationCenter.contactsDidLoad); } NotificationCenter.getGlobalInstance().removeObserver(this, NotificationCenter.pushMessagesUpdated); NotificationCenter.getGlobalInstance().removeObserver(this, NotificationCenter.emojiDidLoad); if (chatActivityEnterView != null) { chatActivityEnterView.onDestroy(); } if (wakeLock.isHeld()) { wakeLock.release(); } } }