diff --git a/TMessagesProj/src/main/java/org/telegram/messenger/BuildVars.java b/TMessagesProj/src/main/java/org/telegram/messenger/BuildVars.java index 918141694..243cf2c9b 100644 --- a/TMessagesProj/src/main/java/org/telegram/messenger/BuildVars.java +++ b/TMessagesProj/src/main/java/org/telegram/messenger/BuildVars.java @@ -24,8 +24,8 @@ public class BuildVars { public static boolean USE_CLOUD_STRINGS = true; public static boolean CHECK_UPDATES = true; public static boolean NO_SCOPED_STORAGE = Build.VERSION.SDK_INT <= 29; - public static int BUILD_VERSION = 3867; - public static String BUILD_VERSION_STRING = "10.0.8"; + public static int BUILD_VERSION = 3872; + public static String BUILD_VERSION_STRING = "10.0.9"; public static int APP_ID = 4; public static String APP_HASH = "014b35b6184100b085b0d0572f9b5103"; diff --git a/TMessagesProj/src/main/java/org/telegram/messenger/MediaDataController.java b/TMessagesProj/src/main/java/org/telegram/messenger/MediaDataController.java index 22d980f26..bf7b11c55 100644 --- a/TMessagesProj/src/main/java/org/telegram/messenger/MediaDataController.java +++ b/TMessagesProj/src/main/java/org/telegram/messenger/MediaDataController.java @@ -2994,10 +2994,10 @@ public class MediaDataController extends BaseController { * @param toggle 0 - remove, 1 - archive, 2 - add */ public void toggleStickerSet(Context context, TLObject stickerSetObject, int toggle, BaseFragment baseFragment, boolean showSettings, boolean showTooltip) { - toggleStickerSet(context, stickerSetObject, toggle, baseFragment, showSettings, showTooltip, null); + toggleStickerSet(context, stickerSetObject, toggle, baseFragment, showSettings, showTooltip, null, true); } - public void toggleStickerSet(Context context, TLObject stickerSetObject, int toggle, BaseFragment baseFragment, boolean showSettings, boolean showTooltip, Runnable onUndo) { + public void toggleStickerSet(Context context, TLObject stickerSetObject, int toggle, BaseFragment baseFragment, boolean showSettings, boolean showTooltip, Runnable onUndo, boolean forget) { TLRPC.StickerSet stickerSet; TLRPC.TL_messages_stickerSet messages_stickerSet; @@ -3036,7 +3036,7 @@ public class MediaDataController extends BaseController { stickerSets[type].remove(a); if (toggle == 2) { stickerSets[type].add(0, set); - } else { + } else if (forget) { stickerSetsById.remove(set.set.id); installedStickerSetsById.remove(set.set.id); stickerSetsByName.remove(set.set.short_name); @@ -7233,6 +7233,19 @@ public class MediaDataController extends BaseController { } } + public void applyAttachMenuBot(TLRPC.TL_attachMenuBotsBot attachMenuBot) { + attachMenuBots.bots.add(attachMenuBot.bot); + } + + public boolean botInAttachMenu(long id) { + for (int i = 0; i < attachMenuBots.bots.size(); i++) { + if (attachMenuBots.bots.get(i).bot_id == id) { + return true; + } + } + return false; + } + //---------------- BOT END ---------------- //---------------- EMOJI START ---------------- diff --git a/TMessagesProj/src/main/java/org/telegram/messenger/MessageObject.java b/TMessagesProj/src/main/java/org/telegram/messenger/MessageObject.java index b55530625..f1bdfc86d 100644 --- a/TMessagesProj/src/main/java/org/telegram/messenger/MessageObject.java +++ b/TMessagesProj/src/main/java/org/telegram/messenger/MessageObject.java @@ -3604,7 +3604,15 @@ public class MessageObject { } if (object == null && chats != null) { object = chats.get(action.auto_setting_from); - } else { + } + if (object == null) { + if (action.auto_setting_from > 0) { + object = MessagesController.getInstance(currentAccount).getUser(action.auto_setting_from); + } else { + object = MessagesController.getInstance(currentAccount).getChat(-action.auto_setting_from); + } + } + if (object == null) { object = fromObject; } messageText = replaceWithLink(AndroidUtilities.replaceTags(LocaleController.formatString("AutoDeleteGlobalAction", R.string.AutoDeleteGlobalAction, LocaleController.formatTTLString(action.period))), "un1", object); diff --git a/TMessagesProj/src/main/java/org/telegram/ui/Cells/ChatMessageCell.java b/TMessagesProj/src/main/java/org/telegram/ui/Cells/ChatMessageCell.java index 98fe8c683..e45c25665 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/Cells/ChatMessageCell.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/Cells/ChatMessageCell.java @@ -10561,7 +10561,6 @@ public class ChatMessageCell extends BaseCell implements SeekBar.SeekBarDelegate startY = textY + currentMessageObject.textHeight + AndroidUtilities.dp(8); linkX = unmovedTextX + AndroidUtilities.dp(1); } - startY += (int) transitionParams.deltaBottom; int linkPreviewY = startY; int smallImageStartY = 0; diff --git a/TMessagesProj/src/main/java/org/telegram/ui/ChatActivity.java b/TMessagesProj/src/main/java/org/telegram/ui/ChatActivity.java index 5de5978a6..ba35bf6f0 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/ChatActivity.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/ChatActivity.java @@ -423,6 +423,7 @@ public class ChatActivity extends BaseFragment implements NotificationCenter.Not private SimpleTextView mentiondownButtonCounter; private ImageView mentiondownButtonImage; private Bulletin messageSeenPrivacyBulletin; + TextView webBotTitle; private int reactionsMentionCount; private FrameLayout reactionsMentiondownButton; @@ -1198,6 +1199,17 @@ public class ChatActivity extends BaseFragment implements NotificationCenter.Not } } + public TextView getOrCreateWebBotTitleView() { + if (webBotTitle == null) { + webBotTitle = new TextView(getContext()); + webBotTitle.setTextColor(Theme.getColor(Theme.key_windowBackgroundWhiteBlackText)); + webBotTitle.setTypeface(AndroidUtilities.getTypeface("fonts/rmedium.ttf")); + webBotTitle.setGravity(Gravity.CENTER_VERTICAL); + actionBar.addView(webBotTitle, LayoutHelper.createFrame(LayoutHelper.MATCH_PARENT, LayoutHelper.MATCH_PARENT, 0, 72, 0, 72, 0)); + } + return webBotTitle; + } + private interface ChatActivityDelegate { default void openReplyMessage(int mid) { @@ -13460,6 +13472,10 @@ public class ChatActivity extends BaseFragment implements NotificationCenter.Not setMeasuredDimension(widthSize, heightSize); heightSize -= getPaddingTop(); + if (webBotTitle != null) { + ((LayoutParams) webBotTitle.getLayoutParams()).topMargin = AndroidUtilities.statusBarHeight; + webBotTitle.setTextSize(!AndroidUtilities.isTablet() && getResources().getConfiguration().orientation == Configuration.ORIENTATION_LANDSCAPE ? 18 : 20); + } measureChildWithMargins(actionBar, widthMeasureSpec, 0, heightMeasureSpec, 0); int actionBarHeight = actionBar.getMeasuredHeight(); if (actionBar.getVisibility() == VISIBLE) { @@ -14762,6 +14778,11 @@ public class ChatActivity extends BaseFragment implements NotificationCenter.Not public boolean canScrollAway() { return false; } + + @Override + public boolean canCaptureMorePhotos() { + return false; + } }, this); } else { fillEditingMediaWithCaption(caption, null); @@ -24613,7 +24634,7 @@ public class ChatActivity extends BaseFragment implements NotificationCenter.Not didPressMessageUrl(link, false, selectedObject, v instanceof ChatMessageCell ? (ChatMessageCell) v : null); return true; }; - TLRPC.InputPeer inputPeer = selectedObject != null && (selectedObject.isPoll() || selectedObject.isVoiceTranscriptionOpen() || selectedObject.isSponsored()) ? null : getMessagesController().getInputPeer(dialog_id); + TLRPC.InputPeer inputPeer = selectedObject != null && (selectedObject.isPoll() || selectedObject.isVoiceTranscriptionOpen() || selectedObject.isSponsored() || selectedObject.scheduled) ? null : getMessagesController().getInputPeer(dialog_id); if (selectedObject != null && selectedObject.messageOwner != null && selectedObject.messageOwner.originalLanguage != null) { waitForLangDetection.set(false); String fromLang = selectedObject.messageOwner.originalLanguage; diff --git a/TMessagesProj/src/main/java/org/telegram/ui/Components/BotWebViewContainer.java b/TMessagesProj/src/main/java/org/telegram/ui/Components/BotWebViewContainer.java index 0541f0a49..1e62b4e78 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/Components/BotWebViewContainer.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/Components/BotWebViewContainer.java @@ -49,17 +49,14 @@ import org.json.JSONArray; import org.json.JSONException; import org.json.JSONObject; import org.json.JSONTokener; -import org.telegram.PhoneFormat.PhoneFormat; import org.telegram.messenger.AndroidUtilities; import org.telegram.messenger.ApplicationLoader; import org.telegram.messenger.BotWebViewVibrationEffect; -import org.telegram.messenger.ContactsController; import org.telegram.messenger.FileLog; import org.telegram.messenger.ImageLocation; import org.telegram.messenger.ImageReceiver; import org.telegram.messenger.LocaleController; import org.telegram.messenger.MediaDataController; -import org.telegram.messenger.MessageObject; import org.telegram.messenger.MessagesController; import org.telegram.messenger.NotificationCenter; import org.telegram.messenger.R; @@ -1214,20 +1211,28 @@ public abstract class BotWebViewContainer extends FrameLayout implements Notific case "web_app_set_header_color": { try { JSONObject jsonObject = new JSONObject(eventData); - String key = jsonObject.getString("color_key"); - int themeKey = -1; - switch (key) { - case "bg_color": { - themeKey = Theme.key_windowBackgroundWhite; - break; + String overrideColorString = jsonObject.optString("color", null); + if (!TextUtils.isEmpty(overrideColorString)) { + int color = Color.parseColor(overrideColorString); + if (color != 0) { + delegate.onWebAppSetActionBarColor(color, true); } - case "secondary_bg_color": { - themeKey = Theme.key_windowBackgroundGray; - break; + } else { + String key = jsonObject.optString("color_key"); + int themeKey = -1; + switch (key) { + case "bg_color": { + themeKey = Theme.key_windowBackgroundWhite; + break; + } + case "secondary_bg_color": { + themeKey = Theme.key_windowBackgroundGray; + break; + } + } + if (themeKey >= 0) { + delegate.onWebAppSetActionBarColor(Theme.getColor(themeKey, resourcesProvider), false); } - } - if (themeKey >= 0) { - delegate.onWebAppSetActionBarColor(themeKey); } } catch (JSONException e) { FileLog.e(e); @@ -1763,8 +1768,9 @@ public abstract class BotWebViewContainer extends FrameLayout implements Notific * Called when WebView requests to set action bar color * * @param colorKey Color theme key + * @param isOverrideColor */ - void onWebAppSetActionBarColor(int colorKey); + void onWebAppSetActionBarColor(int colorKey, boolean isOverrideColor); /** * Called when WebView requests to set background color diff --git a/TMessagesProj/src/main/java/org/telegram/ui/Components/BotWebViewMenuContainer.java b/TMessagesProj/src/main/java/org/telegram/ui/Components/BotWebViewMenuContainer.java index 599e5c761..3f799b0b2 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/Components/BotWebViewMenuContainer.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/Components/BotWebViewMenuContainer.java @@ -1,15 +1,19 @@ package org.telegram.ui.Components; +import static org.telegram.ui.ActionBar.Theme.key_windowBackgroundWhiteBlackText; + import android.animation.Animator; import android.animation.AnimatorListenerAdapter; import android.animation.ValueAnimator; import android.annotation.SuppressLint; import android.content.Context; import android.graphics.Canvas; +import android.graphics.Color; import android.graphics.Paint; import android.os.Build; import android.os.Bundle; import android.text.Editable; +import android.util.SparseIntArray; import android.view.Gravity; import android.view.MotionEvent; import android.view.View; @@ -106,6 +110,7 @@ public class BotWebViewMenuContainer extends FrameLayout implements Notification private boolean overrideBackgroundColor; private boolean needCloseConfirmation; + ActionBarColorsAnimating actionBarColors; private Runnable pollRunnable = () -> { if (!dismissed) { @@ -126,6 +131,8 @@ public class BotWebViewMenuContainer extends FrameLayout implements Notification })); } }; + private boolean actionBarIsLight; + private int lineColor; private void checkBotMenuItem() { if (botMenuItem == null) { @@ -139,6 +146,9 @@ public class BotWebViewMenuContainer extends FrameLayout implements Notification public BotWebViewMenuContainer(@NonNull Context context, ChatActivityEnterView parentEnterView) { super(context); + actionBarColors = new ActionBarColorsAnimating(); + actionBarColors.setTo(0, null); + actionBarColors.progress = 1; this.parentEnterView = parentEnterView; ChatActivity chatActivity = parentEnterView.getParentFragment(); @@ -164,10 +174,15 @@ public class BotWebViewMenuContainer extends FrameLayout implements Notification } @Override - public void onWebAppSetActionBarColor(int colorKey) { + public void onWebAppSetActionBarColor(int color, boolean isOverrideColor) { int from = overrideActionBarBackground; - int to = getColor(colorKey); + int to = color; + actionBarColors = new BotWebViewMenuContainer.ActionBarColorsAnimating(); + actionBarColors.setFrom(overrideBackgroundColor ? from : 0, null); + overrideBackgroundColor = isOverrideColor; + actionBarIsLight = ColorUtils.calculateLuminance(color) < 0.5f; + actionBarColors.setTo(overrideBackgroundColor ? to : 0, null); if (from == 0) { overrideActionBarBackground = to; } @@ -175,11 +190,13 @@ public class BotWebViewMenuContainer extends FrameLayout implements Notification ValueAnimator animator = ValueAnimator.ofFloat(0, 1).setDuration(200); animator.setInterpolator(CubicBezierInterpolator.DEFAULT); animator.addUpdateListener(animation -> { + float progress = (float) animation.getAnimatedValue(); if (from != 0) { - overrideActionBarBackground = ColorUtils.blendARGB(from, to, (float) animation.getAnimatedValue()); + overrideActionBarBackground = ColorUtils.blendARGB(from, to, progress); } else { - overrideActionBarBackgroundProgress = (float) animation.getAnimatedValue(); + overrideActionBarBackgroundProgress = progress; } + actionBarColors.progress = progress; actionBarPaint.setColor(overrideActionBarBackground); invalidateActionBar(); }); @@ -393,21 +410,22 @@ public class BotWebViewMenuContainer extends FrameLayout implements Notification return; } - ChatAvatarContainer avatarContainer = chatActivity.getAvatarContainer(); - int subtitleDefaultColorKey = avatarContainer.getLastSubtitleColorKey() < 0 ? Theme.key_actionBarDefaultSubtitle : avatarContainer.getLastSubtitleColorKey(); - int subtitleColor = ColorUtils.blendARGB(getColor(subtitleDefaultColorKey), getColor(Theme.key_windowBackgroundWhiteGrayText), actionBarTransitionProgress); ActionBar actionBar = chatActivity.getActionBar(); int backgroundColor = ColorUtils.blendARGB(getColor(Theme.key_actionBarDefault), getColor(Theme.key_windowBackgroundWhite), actionBarTransitionProgress); + if (overrideBackgroundColor) { + backgroundColor = ColorUtils.blendARGB(getColor(Theme.key_actionBarDefault), overrideActionBarBackground, actionBarTransitionProgress); + } else { + ColorUtils.blendARGB(getColor(Theme.key_actionBarDefault), actionBarColors.getColor(Theme.key_windowBackgroundWhite), actionBarTransitionProgress); + } + actionBar.setBackgroundColor(backgroundColor); - actionBar.setItemsColor(ColorUtils.blendARGB(getColor(Theme.key_actionBarDefaultIcon), getColor(Theme.key_windowBackgroundWhiteBlackText), actionBarTransitionProgress), false); - actionBar.setItemsBackgroundColor(ColorUtils.blendARGB(getColor(Theme.key_actionBarDefaultSelector), getColor(Theme.key_actionBarWhiteSelector), actionBarTransitionProgress), false); - actionBar.setSubtitleColor(subtitleColor); + actionBar.setItemsColor(ColorUtils.blendARGB(getColor(Theme.key_actionBarDefaultIcon), actionBarColors.getColor(key_windowBackgroundWhiteBlackText), actionBarTransitionProgress), false); + actionBar.setItemsBackgroundColor(ColorUtils.blendARGB(getColor(Theme.key_actionBarDefaultSelector), actionBarColors.getColor(Theme.key_actionBarWhiteSelector), actionBarTransitionProgress), false); ChatAvatarContainer chatAvatarContainer = chatActivity.getAvatarContainer(); - chatAvatarContainer.getTitleTextView().setTextColor(ColorUtils.blendARGB(getColor(Theme.key_actionBarDefaultTitle), getColor(Theme.key_windowBackgroundWhiteBlackText), actionBarTransitionProgress)); - chatAvatarContainer.getSubtitleTextView().setTextColor(subtitleColor); - chatAvatarContainer.setOverrideSubtitleColor(actionBarTransitionProgress == 0 ? null : subtitleColor); - + chatAvatarContainer.setAlpha(1f - actionBarTransitionProgress); + chatActivity.getOrCreateWebBotTitleView().setAlpha(actionBarTransitionProgress); + chatActivity.getOrCreateWebBotTitleView().setTextColor(ColorUtils.blendARGB(getColor(Theme.key_actionBarDefaultIcon), actionBarColors.getColor(key_windowBackgroundWhiteBlackText), actionBarTransitionProgress)); updateLightStatusBar(); } @@ -652,7 +670,7 @@ public class BotWebViewMenuContainer extends FrameLayout implements Notification float radius = AndroidUtilities.dp(16) * (1f - actionBarTransitionProgress); AndroidUtilities.rectTmp.set(0, AndroidUtilities.lerp(swipeContainer.getTranslationY(), 0, actionBarTransitionProgress), getWidth(), swipeContainer.getTranslationY() + AndroidUtilities.dp(24) + radius); - canvas.drawRoundRect(AndroidUtilities.rectTmp, radius, radius, actionBarPaint); + canvas.drawRoundRect(AndroidUtilities.rectTmp, radius, radius,actionBarPaint ); AndroidUtilities.rectTmp.set(0, swipeContainer.getTranslationY() + AndroidUtilities.dp(24), getWidth(), getHeight() + radius); canvas.drawRect(AndroidUtilities.rectTmp, backgroundPaint); @@ -672,7 +690,9 @@ public class BotWebViewMenuContainer extends FrameLayout implements Notification public void draw(Canvas canvas) { super.draw(canvas); - linePaint.setColor(getColor(Theme.key_sheet_scrollUp)); + lineColor = actionBarColors.getColor(Theme.key_sheet_scrollUp); + + linePaint.setColor(lineColor); linePaint.setAlpha((int) (linePaint.getAlpha() * (1f - Math.min(0.5f, actionBarTransitionProgress) / 0.5f))); canvas.save(); @@ -702,6 +722,8 @@ public class BotWebViewMenuContainer extends FrameLayout implements Notification ChatActivity chatActivity = parentEnterView.getParentFragment(); if (chatActivity != null) { chatActivity.hideFieldPanel(true); + TextView webViewTitle = chatActivity.getOrCreateWebBotTitleView(); + webViewTitle.setText(chatActivity.getCurrentUser().first_name); } if (!isLoaded) { @@ -752,7 +774,7 @@ public class BotWebViewMenuContainer extends FrameLayout implements Notification JSONObject jsonObject = new JSONObject(); jsonObject.put("bg_color", getColor(Theme.key_windowBackgroundWhite)); jsonObject.put("secondary_bg_color", getColor(Theme.key_windowBackgroundGray)); - jsonObject.put("text_color", getColor(Theme.key_windowBackgroundWhiteBlackText)); + jsonObject.put("text_color", getColor(key_windowBackgroundWhiteBlackText)); jsonObject.put("hint_color", getColor(Theme.key_windowBackgroundWhiteHintText)); jsonObject.put("link_color", getColor(Theme.key_windowBackgroundWhiteLinkText)); jsonObject.put("button_color", getColor(Theme.key_featuredStickers_addButton)); @@ -904,4 +926,69 @@ public class BotWebViewMenuContainer extends FrameLayout implements Notification AndroidUtilities.runOnUIThread(this::invalidateActionBar, 300); } } + + public static class ActionBarColorsAnimating { + + SparseIntArray fromColors = new SparseIntArray(); + SparseIntArray toColors = new SparseIntArray(); + + int[] colorKeys = new int[]{ + Theme.key_windowBackgroundWhiteBlackText, + Theme.key_actionBarWhiteSelector, + Theme.key_actionBarDefaultSubmenuBackground, + Theme.key_actionBarDefaultSubmenuItem, + Theme.key_actionBarDefaultSubmenuItemIcon, + Theme.key_dialogButtonSelector, + Theme.key_sheet_scrollUp + }; + + public float progress; + + public void setFrom(int actionBarColor, Theme.ResourcesProvider resourcesProvider) { + updateColors(fromColors, actionBarColor, resourcesProvider); + } + + public void setTo(int actionBarColor, Theme.ResourcesProvider resourcesProvider) { + updateColors(toColors, actionBarColor, resourcesProvider); + } + + private void updateColors(SparseIntArray fromColors, int actionBarColor, Theme.ResourcesProvider resourcesProvider) { + if (actionBarColor == 0) { + for (int i = 0; i < colorKeys.length; i++) { + int key = colorKeys[i]; + fromColors.put(key, Theme.getColor(key, resourcesProvider)); + } + } else { + int color = ColorUtils.calculateLuminance(actionBarColor) < 0.5f ? Color.WHITE : Color.BLACK; + int selectorColor = ColorUtils.setAlphaComponent(color, 60); + for (int i = 0; i < colorKeys.length; i++) { + int key = colorKeys[i]; + if (key == Theme.key_actionBarDefaultSubmenuBackground || key == Theme.key_actionBarDefaultSubmenuItem || key == Theme.key_actionBarDefaultSubmenuItemIcon || key == Theme.key_dialogButtonSelector) { + fromColors.put(key, Theme.getColor(key, resourcesProvider)); + } else if (key == Theme.key_sheet_scrollUp) { + fromColors.put(key, ColorUtils.blendARGB(actionBarColor, color, 0.5f)); + } else if (key == Theme.key_actionBarWhiteSelector || key == Theme.key_dialogButtonSelector) { + fromColors.put(key, selectorColor); + } else { + fromColors.put(key, color); + } + } + } + } + + public int getColor(int key) { + return ColorUtils.blendARGB(fromColors.get(key), toColors.get(key), progress); + } + + public void updateActionBar(ActionBar actionBar, float progress) { + this.progress = progress; + actionBar.setTitleColor(getColor(Theme.key_windowBackgroundWhiteBlackText)); + actionBar.setItemsColor(getColor(Theme.key_windowBackgroundWhiteBlackText), false); + actionBar.setItemsBackgroundColor(getColor(Theme.key_actionBarWhiteSelector), false); + actionBar.setPopupBackgroundColor(getColor(Theme.key_actionBarDefaultSubmenuBackground), false); + actionBar.setPopupItemsColor(getColor(Theme.key_actionBarDefaultSubmenuItem), false, false); + actionBar.setPopupItemsColor(getColor(Theme.key_actionBarDefaultSubmenuItemIcon), true, false); + actionBar.setPopupItemsSelectorColor(getColor(Theme.key_dialogButtonSelector), false); + } + } } diff --git a/TMessagesProj/src/main/java/org/telegram/ui/Components/BotWebViewSheet.java b/TMessagesProj/src/main/java/org/telegram/ui/Components/BotWebViewSheet.java index 2d5ec10e3..d6a049106 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/Components/BotWebViewSheet.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/Components/BotWebViewSheet.java @@ -31,7 +31,6 @@ import androidx.annotation.NonNull; import androidx.core.content.ContextCompat; import androidx.core.graphics.ColorUtils; import androidx.core.math.MathUtils; -import androidx.dynamicanimation.animation.DynamicAnimation; import androidx.dynamicanimation.animation.SpringAnimation; import androidx.dynamicanimation.animation.SpringForce; @@ -75,6 +74,7 @@ public class BotWebViewSheet extends Dialog implements NotificationCenter.Notifi public final static int FLAG_FROM_INLINE_SWITCH = 1; public final static int FLAG_FROM_SIDE_MENU = 2; + private int lineColor; public void showJustAddedBulletin() { TLRPC.User user = MessagesController.getInstance(currentAccount).getUser(botId); @@ -152,6 +152,7 @@ public class BotWebViewSheet extends Dialog implements NotificationCenter.Notifi private Paint backgroundPaint = new Paint(Paint.ANTI_ALIAS_FLAG); private int actionBarColor; + private boolean actionBarIsLight; private Paint actionBarPaint = new Paint(Paint.ANTI_ALIAS_FLAG); private boolean overrideBackgroundColor; @@ -202,6 +203,7 @@ public class BotWebViewSheet extends Dialog implements NotificationCenter.Notifi public BotWebViewSheet(@NonNull Context context, Theme.ResourcesProvider resourcesProvider) { super(context, R.style.TransparentDialog); this.resourcesProvider = resourcesProvider; + lineColor = Theme.getColor(Theme.key_sheet_scrollUp); swipeContainer = new ChatAttachAlertBotWebViewLayout.WebViewSwipeContainer(context) { @Override @@ -279,28 +281,40 @@ public class BotWebViewSheet extends Dialog implements NotificationCenter.Notifi } @Override - public void onWebAppSetActionBarColor(int colorKey) { + public void onWebAppSetActionBarColor(int color, boolean isOverrideColor) { int from = actionBarColor; - int to = getColor(colorKey); + int to = color; + + BotWebViewMenuContainer.ActionBarColorsAnimating actionBarColorsAnimating = new BotWebViewMenuContainer.ActionBarColorsAnimating(); + actionBarColorsAnimating.setFrom(overrideBackgroundColor ? actionBarColor : 0, resourcesProvider); + overrideBackgroundColor = isOverrideColor; + actionBarIsLight = ColorUtils.calculateLuminance(color) < 0.5f; + actionBarColorsAnimating.setTo(overrideBackgroundColor ? to : 0, resourcesProvider); ValueAnimator animator = ValueAnimator.ofFloat(0, 1).setDuration(200); animator.setInterpolator(CubicBezierInterpolator.DEFAULT); animator.addUpdateListener(animation -> { - actionBarColor = ColorUtils.blendARGB(from, to, (Float) animation.getAnimatedValue()); + float progress = (float) animation.getAnimatedValue(); + actionBarColor = ColorUtils.blendARGB(from, to, progress); + actionBar.setBackgroundColor(actionBarColor); + + actionBarColorsAnimating.updateActionBar(actionBar, progress); + lineColor = actionBarColorsAnimating.getColor(Theme.key_sheet_scrollUp); + frameLayout.invalidate(); }); animator.start(); + updateLightStatusBar(); } @Override public void onWebAppSetBackgroundColor(int color) { - overrideBackgroundColor = true; - int from = backgroundPaint.getColor(); ValueAnimator animator = ValueAnimator.ofFloat(0, 1).setDuration(200); animator.setInterpolator(CubicBezierInterpolator.DEFAULT); animator.addUpdateListener(animation -> { backgroundPaint.setColor(ColorUtils.blendARGB(from, color, (Float) animation.getAnimatedValue())); + updateActionBarColors(); frameLayout.invalidate(); }); animator.start(); @@ -488,7 +502,7 @@ public class BotWebViewSheet extends Dialog implements NotificationCenter.Notifi AndroidUtilities.rectTmp.set(0, 0, getWidth(), getHeight()); canvas.drawRect(AndroidUtilities.rectTmp, dimPaint); - actionBarPaint.setColor(ColorUtils.blendARGB(actionBarColor, getColor(Theme.key_windowBackgroundWhite), actionBarTransitionProgress)); + actionBarPaint.setColor(actionBarColor); float radius = AndroidUtilities.dp(16) * (AndroidUtilities.isTablet() ? 1f : 1f - actionBarTransitionProgress); AndroidUtilities.rectTmp.set(swipeContainer.getLeft(), AndroidUtilities.lerp(swipeContainer.getTranslationY(), 0, actionBarTransitionProgress), swipeContainer.getRight(), swipeContainer.getTranslationY() + AndroidUtilities.dp(24) + radius); canvas.drawRoundRect(AndroidUtilities.rectTmp, radius, radius, actionBarPaint); @@ -503,7 +517,7 @@ public class BotWebViewSheet extends Dialog implements NotificationCenter.Notifi super.draw(canvas); float transitionProgress = AndroidUtilities.isTablet() ? 0 : actionBarTransitionProgress; - linePaint.setColor(Theme.getColor(Theme.key_sheet_scrollUp)); + linePaint.setColor(lineColor); linePaint.setAlpha((int) (linePaint.getAlpha() * (1f - Math.min(0.5f, transitionProgress) / 0.5f))); canvas.save(); @@ -716,19 +730,25 @@ public class BotWebViewSheet extends Dialog implements NotificationCenter.Notifi } private void updateActionBarColors() { - actionBar.setTitleColor(getColor(Theme.key_windowBackgroundWhiteBlackText)); - actionBar.setItemsColor(getColor(Theme.key_windowBackgroundWhiteBlackText), false); - actionBar.setItemsBackgroundColor(getColor(Theme.key_actionBarWhiteSelector), false); - actionBar.setPopupBackgroundColor(getColor(Theme.key_actionBarDefaultSubmenuBackground), false); - actionBar.setPopupItemsColor(getColor(Theme.key_actionBarDefaultSubmenuItem), false, false); - actionBar.setPopupItemsColor(getColor(Theme.key_actionBarDefaultSubmenuItemIcon), true, false); - actionBar.setPopupItemsSelectorColor(getColor(Theme.key_dialogButtonSelector), false); + if (!overrideBackgroundColor) { + actionBar.setTitleColor(getColor(Theme.key_windowBackgroundWhiteBlackText)); + actionBar.setItemsColor(getColor(Theme.key_windowBackgroundWhiteBlackText), false); + actionBar.setItemsBackgroundColor(getColor(Theme.key_actionBarWhiteSelector), false); + actionBar.setPopupBackgroundColor(getColor(Theme.key_actionBarDefaultSubmenuBackground), false); + actionBar.setPopupItemsColor(getColor(Theme.key_actionBarDefaultSubmenuItem), false, false); + actionBar.setPopupItemsColor(getColor(Theme.key_actionBarDefaultSubmenuItemIcon), true, false); + actionBar.setPopupItemsSelectorColor(getColor(Theme.key_dialogButtonSelector), false); + } } private void updateLightStatusBar() { - int color = Theme.getColor(Theme.key_windowBackgroundWhite, null, true); - boolean lightStatusBar = !AndroidUtilities.isTablet() && ColorUtils.calculateLuminance(color) >= 0.9 && actionBarTransitionProgress >= 0.85f; - + boolean lightStatusBar; + if (overrideBackgroundColor) { + lightStatusBar = !actionBarIsLight; + } else { + int color = Theme.getColor(Theme.key_windowBackgroundWhite, null, true); + lightStatusBar = !AndroidUtilities.isTablet() && ColorUtils.calculateLuminance(color) >= 0.9 && actionBarTransitionProgress >= 0.85f; + } if (wasLightStatusBar != null && wasLightStatusBar == lightStatusBar) { return; } @@ -945,6 +965,7 @@ public class BotWebViewSheet extends Dialog implements NotificationCenter.Notifi req.theme_params.data = themeParams; req.flags |= 1; } + req.flags |= 8; req.url = buttonUrl; ConnectionsManager.getInstance(currentAccount).sendRequest(req, (response, error) -> AndroidUtilities.runOnUIThread(() -> { @@ -1037,7 +1058,7 @@ public class BotWebViewSheet extends Dialog implements NotificationCenter.Notifi return; } String botName = currentBot.short_name; - description = LocaleController.formatString("BotRemoveFromMenu", R.string.BotRemoveFromMenu, botName); + description = LocaleController.formatString("BotRemoveFromMenuAll", R.string.BotRemoveFromMenuAll, botName); TLRPC.TL_attachMenuBot finalCurrentBot = currentBot; new AlertDialog.Builder(LaunchActivity.getLastFragment().getContext()) .setTitle(LocaleController.getString(R.string.BotRemoveFromMenuTitle)) diff --git a/TMessagesProj/src/main/java/org/telegram/ui/Components/ChatAttachAlert.java b/TMessagesProj/src/main/java/org/telegram/ui/Components/ChatAttachAlert.java index b1f1410c0..b3d904dca 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/Components/ChatAttachAlert.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/Components/ChatAttachAlert.java @@ -142,6 +142,7 @@ public class ChatAttachAlert extends BottomSheet implements NotificationCenter.N public boolean allowEnterCaption; private ChatAttachAlertDocumentLayout.DocumentSelectActivityDelegate documentsDelegate; private long dialogId; + private boolean overrideBackgroundColor; public void setCanOpenPreview(boolean canOpenPreview) { this.canOpenPreview = canOpenPreview; @@ -187,13 +188,26 @@ public class ChatAttachAlert extends BottomSheet implements NotificationCenter.N } @Override - public void onWebAppSetActionBarColor(int colorKey) { + public void onWebAppSetActionBarColor(int color, boolean isOverrideColor) { int from = ((ColorDrawable) actionBar.getBackground()).getColor(); - int to = getThemedColor(colorKey); + int to = color; + + BotWebViewMenuContainer.ActionBarColorsAnimating actionBarColorsAnimating = new BotWebViewMenuContainer.ActionBarColorsAnimating(); + actionBarColorsAnimating.setFrom(overrideBackgroundColor ? from : 0, resourcesProvider); + overrideBackgroundColor = isOverrideColor; + // actionBarIsLight = ColorUtils.calculateLuminance(color) < 0.5f; + actionBarColorsAnimating.setTo(overrideBackgroundColor ? to : 0, resourcesProvider); ValueAnimator animator = ValueAnimator.ofFloat(0, 1).setDuration(200); animator.setInterpolator(CubicBezierInterpolator.DEFAULT); - animator.addUpdateListener(animation -> actionBar.setBackgroundColor(ColorUtils.blendARGB(from, to, (float) animation.getAnimatedValue()))); + animator.addUpdateListener(animation -> { + float progress = (float) animation.getAnimatedValue(); + actionBar.setBackgroundColor(ColorUtils.blendARGB(from, to, progress)); + webViewLayout.setCustomActionBarBackground(ColorUtils.blendARGB(from, to, progress)); + currentAttachLayout.invalidate(); + sizeNotifierFrameLayout.invalidate(); + actionBarColorsAnimating.updateActionBar(actionBar, progress); + }); animator.start(); } @@ -583,6 +597,15 @@ public class ChatAttachAlert extends BottomSheet implements NotificationCenter.N return 0; } + boolean hasCustomActionBarBackground() { + return false; + } + + int getCustomActionBarBackground() { + return 0; + } + + void onButtonsTranslationYUpdated() { } @@ -1617,8 +1640,8 @@ public class ChatAttachAlert extends BottomSheet implements NotificationCenter.N canvas.restore(); } - if (rad != 1.0f && actionBarType != 2) { - Theme.dialogs_onlineCirclePaint.setColor(backgroundColor); + if ((rad != 1.0f && actionBarType != 2) || currentAttachLayout.hasCustomActionBarBackground()) { + Theme.dialogs_onlineCirclePaint.setColor(currentAttachLayout.hasCustomActionBarBackground() ? currentAttachLayout.getCustomActionBarBackground() : backgroundColor); Theme.dialogs_onlineCirclePaint.setAlpha(viewAlpha); rect.set(backgroundPaddingLeft, backgroundPaddingTop + top, getMeasuredWidth() - backgroundPaddingLeft, backgroundPaddingTop + top + AndroidUtilities.dp(24)); canvas.save(); @@ -1627,6 +1650,19 @@ public class ChatAttachAlert extends BottomSheet implements NotificationCenter.N canvas.restore(); } + if (currentAttachLayout.hasCustomActionBarBackground()) { + Theme.dialogs_onlineCirclePaint.setColor(currentAttachLayout.getCustomActionBarBackground()); + Theme.dialogs_onlineCirclePaint.setAlpha(viewAlpha); + int top2 = getScrollOffsetY(0); + if (Build.VERSION.SDK_INT >= 21 && !inBubbleMode) { + top2 += AndroidUtilities.statusBarHeight; + } + rect.set(backgroundPaddingLeft, (backgroundPaddingTop + top + AndroidUtilities.dp(12)) * (rad), getMeasuredWidth() - backgroundPaddingLeft, top2 + AndroidUtilities.dp(12)); + canvas.save(); + canvas.drawRect(rect, Theme.dialogs_onlineCirclePaint); + canvas.restore(); + } + if ((headerView == null || headerView.getAlpha() != 1.0f) && rad != 0) { int w = AndroidUtilities.dp(36); rect.set((getMeasuredWidth() - w) / 2, y, (getMeasuredWidth() + w) / 2, y + AndroidUtilities.dp(4)); @@ -1635,6 +1671,11 @@ public class ChatAttachAlert extends BottomSheet implements NotificationCenter.N if (actionBarType == 2) { color = 0x20000000; alphaProgress = rad; + } else if (currentAttachLayout.hasCustomActionBarBackground()) { + int actionBarColor = currentAttachLayout.getCustomActionBarBackground(); + int blendColor = ColorUtils.calculateLuminance(actionBarColor) < 0.5f ? Color.WHITE : Color.BLACK; + color = ColorUtils.blendARGB(actionBarColor, blendColor, 0.5f); + alphaProgress = headerView == null ? 1.0f : 1.0f - headerView.getAlpha(); } else { color = getThemedColor(Theme.key_sheet_scrollUp); alphaProgress = headerView == null ? 1.0f : 1.0f - headerView.getAlpha(); @@ -1777,10 +1818,6 @@ public class ChatAttachAlert extends BottomSheet implements NotificationCenter.N if (inBubbleMode) { return; } -// int color1 = currentAttachLayout.hasCustomBackground() ? currentAttachLayout.getCustomBackground() : getThemedColor(forceDarkTheme ? Theme.key_voipgroup_listViewBackground : Theme.key_dialogBackground); -// int finalColor = Color.argb((int) (255 * actionBar.getAlpha()), Color.red(color1), Color.green(color1), Color.blue(color1)); -// Theme.dialogs_onlineCirclePaint.setColor(finalColor); -// canvas.drawRect(backgroundPaddingLeft, currentPanTranslationY, getMeasuredWidth() - backgroundPaddingLeft, AndroidUtilities.statusBarHeight + currentPanTranslationY, Theme.dialogs_onlineCirclePaint); } private int getCurrentTop() { @@ -2801,7 +2838,7 @@ public class ChatAttachAlert extends BottomSheet implements NotificationCenter.N break; } } - description = LocaleController.formatString("BotRemoveFromMenu", R.string.BotRemoveFromMenu, botName); + description = LocaleController.formatString("BotRemoveFromMenuAll", R.string.BotRemoveFromMenuAll, botName); new AlertDialog.Builder(getContext()) .setTitle(LocaleController.getString(R.string.BotRemoveFromMenuTitle)) .setMessage(AndroidUtilities.replaceTags(attachMenuBot != null ? description : LocaleController.formatString("BotRemoveInlineFromMenu", R.string.BotRemoveInlineFromMenu, botName))) diff --git a/TMessagesProj/src/main/java/org/telegram/ui/Components/ChatAttachAlertBotWebViewLayout.java b/TMessagesProj/src/main/java/org/telegram/ui/Components/ChatAttachAlertBotWebViewLayout.java index 36602417f..671d81b82 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/Components/ChatAttachAlertBotWebViewLayout.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/Components/ChatAttachAlertBotWebViewLayout.java @@ -122,6 +122,8 @@ public class ChatAttachAlertBotWebViewLayout extends ChatAttachAlert.AttachAlert })); } }; + private boolean hasCustomActionBarBackground; + private int customActionBarBackground; public ChatAttachAlertBotWebViewLayout(ChatAttachAlert alert, Context context, Theme.ResourcesProvider resourcesProvider) { super(alert, context, resourcesProvider); @@ -279,6 +281,21 @@ public class ChatAttachAlertBotWebViewLayout extends ChatAttachAlert.AttachAlert return customBackground; } + @Override + boolean hasCustomActionBarBackground() { + return hasCustomActionBarBackground; + } + + @Override + int getCustomActionBarBackground() { + return customActionBarBackground; + } + + public void setCustomActionBarBackground(int customActionBarBackground) { + hasCustomActionBarBackground = true; + this.customActionBarBackground = customActionBarBackground; + } + public boolean canExpandByRequest() { return /* System.currentTimeMillis() - lastSwipeTime > 1000 && */ !swipeContainer.isSwipeInProgress(); } diff --git a/TMessagesProj/src/main/java/org/telegram/ui/Components/ChatAttachAlertPhotoLayout.java b/TMessagesProj/src/main/java/org/telegram/ui/Components/ChatAttachAlertPhotoLayout.java index e6e8d693b..3cdf97268 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/Components/ChatAttachAlertPhotoLayout.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/Components/ChatAttachAlertPhotoLayout.java @@ -3072,16 +3072,22 @@ public class ChatAttachAlertPhotoLayout extends ChatAttachAlert.AttachAlertLayou if (count == 0) { parentAlert.selectedMenuItem.showSubItem(open_in); parentAlert.selectedMenuItem.hideSubItem(compress); - } else { + } else if (documentsEnabled) { parentAlert.selectedMenuItem.showSubItem(compress); + } else { + parentAlert.selectedMenuItem.hideSubItem(compress); } } else { parentAlert.selectedMenuItem.showSubItem(group); + if (documentsEnabled) { + parentAlert.selectedMenuItem.showSubItem(compress); + } else { + parentAlert.selectedMenuItem.hideSubItem(compress); + } } if (count != 0) { parentAlert.selectedMenuItem.hideSubItem(open_in); } - compressItem.setVisibility(documentsEnabled ? View.VISIBLE : View.GONE); if (count > 1) { parentAlert.selectedMenuItem.showSubItem(preview_gap); parentAlert.selectedMenuItem.showSubItem(preview); diff --git a/TMessagesProj/src/main/java/org/telegram/ui/Components/EmojiPacksAlert.java b/TMessagesProj/src/main/java/org/telegram/ui/Components/EmojiPacksAlert.java index f091f2e1d..16cbad5a7 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/Components/EmojiPacksAlert.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/Components/EmojiPacksAlert.java @@ -994,18 +994,18 @@ public class EmojiPacksAlert extends BottomSheet implements NotificationCenter.N })); } - public static void uninstallSet(BaseFragment fragment, TLRPC.TL_messages_stickerSet set, boolean showBulletin, Runnable onUndo) { + public static void uninstallSet(BaseFragment fragment, TLRPC.TL_messages_stickerSet set, boolean showBulletin, Runnable onUndo, boolean forget) { if (fragment == null || set == null || fragment.getFragmentView() == null) { return; } - MediaDataController.getInstance(fragment.getCurrentAccount()).toggleStickerSet(fragment.getFragmentView().getContext(), set, 0, fragment, true, showBulletin, onUndo); + MediaDataController.getInstance(fragment.getCurrentAccount()).toggleStickerSet(fragment.getFragmentView().getContext(), set, 0, fragment, true, showBulletin, onUndo, forget); } public static void uninstallSet(Context context, TLRPC.TL_messages_stickerSet set, boolean showBulletin, Runnable onUndo) { if (set == null) { return; } - MediaDataController.getInstance(UserConfig.selectedAccount).toggleStickerSet(context, set, 0, null, true, showBulletin, onUndo); + MediaDataController.getInstance(UserConfig.selectedAccount).toggleStickerSet(context, set, 0, null, true, showBulletin, onUndo, true); } private ValueAnimator loadAnimator; @@ -1607,7 +1607,7 @@ public class EmojiPacksAlert extends BottomSheet implements NotificationCenter.N removeButtonView.setOnClickListener(e -> { uninstallSet(dummyFragment, set, true, () -> { toggle(true, true); - }); + }, true); toggle(false, true); }); removeButtonView.setClickable(false); diff --git a/TMessagesProj/src/main/java/org/telegram/ui/Components/EmojiTabsStrip.java b/TMessagesProj/src/main/java/org/telegram/ui/Components/EmojiTabsStrip.java index ce5650be1..66357a354 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/Components/EmojiTabsStrip.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/Components/EmojiTabsStrip.java @@ -25,6 +25,7 @@ import android.widget.LinearLayout; import androidx.annotation.NonNull; import androidx.annotation.Nullable; +import androidx.collection.LongSparseArray; import androidx.core.graphics.ColorUtils; import androidx.core.math.MathUtils; @@ -108,7 +109,7 @@ public class EmojiTabsStrip extends ScrollableHorizontalScrollView { contentView = new LinearLayout(context) { - HashMap lastX = new HashMap<>(); + private final LongSparseArray lastX = new LongSparseArray<>(); @Override protected void onLayout(boolean changed, int l, int t, int r, int b) { @@ -122,7 +123,7 @@ public class EmojiTabsStrip extends ScrollableHorizontalScrollView { } if (child != null) { child.layout(x, cy - child.getMeasuredHeight() / 2, x + child.getMeasuredWidth(), cy + child.getMeasuredHeight() / 2); - Integer id = child instanceof EmojiTabButton ? ((EmojiTabButton) child).id : (child instanceof EmojiTabsView ? ((EmojiTabsView) child).id : null); + Long id = child instanceof EmojiTabButton ? ((EmojiTabButton) child).id() : (child instanceof EmojiTabsView ? (Long) ((EmojiTabsView) child).id : null); if (animateAppear && child instanceof EmojiTabButton && ((EmojiTabButton) child).newly) { ((EmojiTabButton) child).newly = false; child.setScaleX(0); @@ -131,8 +132,9 @@ public class EmojiTabsStrip extends ScrollableHorizontalScrollView { child.animate().scaleX(1f).scaleY(1f).alpha(1f).setDuration(HwEmojis.isHwEnabledOrPreparing() ? 0 : 200).setInterpolator(CubicBezierInterpolator.EASE_OUT_QUINT).start(); } if (id != null) { - if (lastX.get(id) != null && lastX.get(id) != x) { - child.setTranslationX(lastX.get(id) - x); + Integer lx = lastX.get(id); + if (lx != null && lx != x && Math.abs(lx - x) < AndroidUtilities.dp(45)) { + child.setTranslationX(lx - x); child.animate().translationX(0).setDuration(250).setInterpolator(CubicBezierInterpolator.EASE_OUT_QUINT).start(); } lastX.put(id, x); @@ -142,7 +144,7 @@ public class EmojiTabsStrip extends ScrollableHorizontalScrollView { } if (settingsTab != null) { x += (!recentIsShown ? AndroidUtilities.dp(30 + 3) : 0); - Integer id = settingsTab.id; + Long id = settingsTab.id; if (x + settingsTab.getMeasuredWidth() + getPaddingRight() <= EmojiTabsStrip.this.getMeasuredWidth()) { settingsTab.layout(x = (r - l - getPaddingRight() - settingsTab.getMeasuredWidth()), cy - settingsTab.getMeasuredHeight() / 2, r - l - getPaddingRight(), cy + settingsTab.getMeasuredHeight() / 2); } else { @@ -292,7 +294,7 @@ public class EmojiTabsStrip extends ScrollableHorizontalScrollView { } if (includeRecent) { contentView.addView(recentTab = new EmojiTabButton(context, recentDrawableId, false, false)); - recentTab.id = "recent".hashCode(); + recentTab.id = (long) "recent".hashCode(); } if (!includeAnimated) { for (int i = 0; i < emojiTabsDrawableIds.length; ++i) { @@ -302,12 +304,12 @@ public class EmojiTabsStrip extends ScrollableHorizontalScrollView { } else { if (includeStandard) { contentView.addView(emojiTabs = new EmojiTabsView(context)); - emojiTabs.id = "tabs".hashCode(); + emojiTabs.id = (long) "tabs".hashCode(); } packsIndexStart = contentView.getChildCount(); if (onSettingsOpen != null) { contentView.addView(settingsTab = new EmojiTabButton(context, settingsDrawableId, false, true)); - settingsTab.id = "settings".hashCode(); + settingsTab.id = (long) "settings".hashCode(); settingsTab.setAlpha(0); } updateClickListeners(); @@ -415,122 +417,6 @@ public class EmojiTabsStrip extends ScrollableHorizontalScrollView { } } - private static class DelayedAnimatedEmojiDrawable extends Drawable { - - int account; - int cacheType; - TLRPC.Document document; - long documentId; - AnimatedEmojiDrawable drawable; - - int alpha = 0xFF; - - public DelayedAnimatedEmojiDrawable(int account, int cacheType, TLRPC.Document document) { - this.account = account; - this.cacheType = cacheType; - this.document = document; - if (this.document != null) { - this.documentId = this.document.id; - } - } - - public DelayedAnimatedEmojiDrawable(int account, int cacheType, long documentId) { - this.account = account; - this.cacheType = cacheType; - this.documentId = documentId; - } - - public void load() { - if (drawable != null) { - return; - } - if (document != null) { - drawable = AnimatedEmojiDrawable.make(account, cacheType, document); - } else { - drawable = AnimatedEmojiDrawable.make(account, cacheType, documentId); - } - if (lastColorFilter != null) { - drawable.setColorFilter(lastColorFilter); - } - drawable.setAlpha(alpha); - drawable.setCallback(new Callback() { - @Override - public void invalidateDrawable(@NonNull Drawable who) { - DelayedAnimatedEmojiDrawable.this.invalidateSelf(); - } - @Override - public void scheduleDrawable(@NonNull Drawable who, @NonNull Runnable what, long when) { - DelayedAnimatedEmojiDrawable.this.scheduleSelf(what, when); - } - @Override - public void unscheduleDrawable(@NonNull Drawable who, @NonNull Runnable what) { - DelayedAnimatedEmojiDrawable.this.unscheduleSelf(what); - } - }); - if (view != null) { - view.invalidate(); - } - invalidateSelf(); - } - - public boolean equals(long documentId) { - return this.documentId == documentId; - } - - private View view; - public void updateView(View view) { - if (this.view == view) { - return; - } - - if (this.view != null && drawable != null) { - drawable.removeView(this.view); - } - this.view = view; - if (this.view != null && drawable != null) { - drawable.addView(this.view); - } - } - - public void removeView() { - if (view != null && drawable != null) { - drawable.removeView(view); - } - view = null; - } - - @Override - public void draw(@NonNull Canvas canvas) { - if (drawable != null) { - drawable.setBounds(getBounds()); - drawable.draw(canvas); - } - } - - @Override - public void setAlpha(int alpha) { - this.alpha = alpha; - if (drawable != null) { - drawable.setAlpha(alpha); - } - } - - private ColorFilter lastColorFilter; - - @Override - public void setColorFilter(@Nullable ColorFilter colorFilter) { - lastColorFilter = colorFilter; - if (drawable != null) { - drawable.setColorFilter(lastColorFilter); - } - } - - @Override - public int getOpacity() { - return PixelFormat.TRANSPARENT; - } - } - protected boolean isInstalled(EmojiView.EmojiPack pack) { return pack.installed; } @@ -596,19 +482,14 @@ public class EmojiTabsStrip extends ScrollableHorizontalScrollView { currentPackButton.setLock(null); } } else { - final boolean free = newPack.free; // isFreeEmojiPack(newPack.set, newPack.documents); - DelayedAnimatedEmojiDrawable drawable = currentPackButton == null || !(currentPackButton.getDrawable() instanceof DelayedAnimatedEmojiDrawable) ? null : (DelayedAnimatedEmojiDrawable) currentPackButton.getDrawable(); + final boolean free = newPack.free; TLRPC.Document thumbDocument = getThumbDocument(newPack.set, newPack.documents); - if (thumbDocument != null && (drawable == null || drawable.documentId != thumbDocument.id)) { - drawable = new DelayedAnimatedEmojiDrawable(UserConfig.selectedAccount, animatedEmojiCacheType, thumbDocument); - } if (currentPackButton == null) { - currentPackButton = new EmojiTabButton(getContext(), drawable, free, false, false); - currentPackButton.setDrawable(drawable); + currentPackButton = new EmojiTabButton(getContext(), thumbDocument, free, false, false); onTabCreate(currentPackButton); contentView.addView(currentPackButton, packsIndexStart + i); - } else if (currentPackButton.getDrawable() != drawable) { - currentPackButton.setDrawable(drawable); + } else { + currentPackButton.setAnimatedEmojiDocument(thumbDocument); } currentPackButton.updateSelect(selected == i, false); if (currentType == SelectAnimatedEmojiDialog.TYPE_AVATAR_CONSTRUCTOR) { @@ -625,147 +506,12 @@ public class EmojiTabsStrip extends ScrollableHorizontalScrollView { } } } - -// for (int i = 0; i < emojipackTabs.size(); ++i) { -// EmojiTabButton emojipackTab = emojipackTabs.get(i); -// EmojiView.EmojiPack pack = null; -// if (emojipackTab != null && emojipackTab.id != null) { -// for (int j = 0; j < emojiPacks.size(); ++j) { -// EmojiView.EmojiPack p = emojiPacks.get(j); -// if (!includeFeatured && p.featured) { -// continue; -// } -// final int id = Objects.hash(p.set.id, p.featured); -// if (id == emojipackTab.id) { -// pack = p; -// break; -// } -// } -// } -// -// if (pack == null && emojipackTab != null) { -// Rect bounds = new Rect(); -// bounds.set(emojipackTab.getLeft(), emojipackTab.getTop(), emojipackTab.getRight(), emojipackTab.getBottom()); -// removingViews.put(emojipackTab, bounds); -// ValueAnimator anm = ValueAnimator.ofFloat(emojipackTab.getAlpha(), 0f); -// anm.addUpdateListener(a -> { -// float alpha = (float) a.getAnimatedValue(); -// emojipackTab.setAlpha(alpha); -// emojipackTab.setScaleX(alpha); -// emojipackTab.setScaleY(alpha); -// contentView.invalidate(); -// }); -// anm.addListener(new AnimatorListenerAdapter() { -// @Override -// public void onAnimationEnd(Animator animation) { -// removingViews.remove(emojipackTab); -// contentView.invalidate(); -// } -// }); -// anm.setDuration(200); -// anm.setInterpolator(CubicBezierInterpolator.EASE_OUT_QUINT); -// anm.start(); -// emojipackTabs.remove(i--); -// } -// if (emojipackTab != null) { -// emojipackTab.keepAttached = true; -// attachedEmojiPacks.add(emojipackTab); -// } -// contentView.removeView(emojipackTab); -// } -// for (int i = 0; i < emojiPacks.size(); ++i) { -// EmojiView.EmojiPack pack = emojiPacks.get(i); -// if (!includeFeatured && pack.featured) { -// continue; -// } -// final int id = Objects.hash(pack.set.id, pack.featured); -// EmojiTabButton emojipackTab = null; -// for (int j = 0; j < emojipackTabs.size(); ++j) { -// EmojiTabButton tab = emojipackTabs.get(j); -// if (tab != null && tab.id != null && tab.id == id) { -// emojipackTab = tab; -// break; -// } -// } -// final boolean free = isFreeEmojiPack(pack.set, pack.documents); -// DelayedAnimatedEmojiDrawable drawable = emojipackTab == null ? null : (DelayedAnimatedEmojiDrawable) emojipackTab.getDrawable(); -// TLRPC.Document thumbDocument = getThumbDocument(pack.set, pack.documents); -// if (thumbDocument != null && (drawable == null || !drawable.equals(thumbDocument.id))) { -// drawable = new DelayedAnimatedEmojiDrawable(UserConfig.selectedAccount, animatedEmojiCacheType, thumbDocument); -// } -// if (emojipackTab == null) { -// emojipackTab = new EmojiTabButton(getContext(), drawable, free, false, false); -// emojipackTab.id = id; -// emojipackTab.setDrawable(drawable); -// onTabCreate(emojipackTab); -// emojipackTabs.add(emojipackTab); -// } else if (emojipackTab.getDrawable() != drawable) { -// emojipackTab.setDrawable(drawable); -// } -// if (currentType == SelectAnimatedEmojiDialog.TYPE_AVATAR_CONSTRUCTOR) { -// emojipackTab.setLock(null); -// } else if (!isPremium && !free) { -// emojipackTab.setLock(true); -// } else if (!this.isInstalled(pack)) { -// emojipackTab.setLock(false); -// } else { -// emojipackTab.setLock(null); -// } -// if (doAppearAnimation && !first) { -// emojipackTab.newly = false; -// } -// if (emojipackTab.getParent() instanceof ViewGroup) { -// ((ViewGroup) emojipackTab.getParent()).removeView(emojipackTab); -// } -// contentView.addView(emojipackTab); -// } if (settingsTab != null) { settingsTab.bringToFront(); if (settingsTab.getAlpha() < 1) { settingsTab.animate().alpha(1f).setDuration(HwEmojis.isHwEnabledOrPreparing() ? 0 : 200).setInterpolator(CubicBezierInterpolator.DEFAULT).start(); } } -// if (doAppearAnimation) { -// if (emojipackTabs != null) { -// for (int i = 0; i < emojipackTabs.size(); ++i) { -// emojipackTabs.get(i).setScaleX(0); -// emojipackTabs.get(i).setScaleY(0); -// } -// } -// appearAnimation = ValueAnimator.ofFloat(0, 1); -// final OvershootInterpolator innerInterpolator = new OvershootInterpolator(3f); -// appearAnimation.addUpdateListener(anm -> { -// if (emojipackTabs == null) { -// return; -// } -// final float t = (float) anm.getAnimatedValue(); -// final int count = emojipackTabs.size(); -// final float dur = 1f / count * 4.5f; -// for (int i = 0; i < count; ++i) { -// final float off = i / (float) count * (1f - dur); -// final float T = MathUtils.clamp((t - off) / dur, 0, 1); -// final float scale = innerInterpolator.getInterpolation(T); -// emojipackTabs.get(i).setScaleX(scale); -// emojipackTabs.get(i).setScaleY(scale); -// } -// }); -// appearAnimation.addListener(new AnimatorListenerAdapter() { -// @Override -// public void onAnimationCancel(Animator animation) { -// if (emojipackTabs == null) { -// return; -// } -// for (int i = 0; i < emojipackTabs.size(); ++i) { -// emojipackTabs.get(i).setScaleX(1); -// emojipackTabs.get(i).setScaleY(1); -// } -// } -// }); -// appearAnimation.setStartDelay(150); -// appearAnimation.setDuration((emojipackTabs == null ? 0 : emojipackTabs.size()) * 75L); -// appearAnimation.setInterpolator(CubicBezierInterpolator.EASE_OUT); -// appearAnimation.start(); -// } for (int i = 0; i < attachedEmojiPacks.size(); i++) { attachedEmojiPacks.get(i).keepAttached = false; attachedEmojiPacks.get(i).updateAttachState(); @@ -912,7 +658,7 @@ public class EmojiTabsStrip extends ScrollableHorizontalScrollView { public class EmojiTabButton extends ViewGroup { public boolean shown = true; - public Integer id; + public Long id; public boolean newly; public boolean keepAttached; private boolean isAnimatedEmoji; @@ -921,9 +667,20 @@ public class EmojiTabsStrip extends ScrollableHorizontalScrollView { private RLottieDrawable lottieDrawable; private PremiumLockIconView lockView; private boolean round, forceSelector; - DelayedAnimatedEmojiDrawable animatedEmoji; + TLRPC.Document animatedEmojiDocument; + AnimatedEmojiDrawable animatedEmoji; boolean attached; + public Long id() { + if (id != null) { + return id; + } + if (animatedEmojiDocument != null) { + return animatedEmojiDocument.id; + } + return null; + } + public EmojiTabButton(Context context, int drawableId, int lottieId, boolean roundSelector, boolean forceSelector) { super(context); this.round = roundSelector; @@ -965,7 +722,7 @@ public class EmojiTabsStrip extends ScrollableHorizontalScrollView { addView(imageView); } - public EmojiTabButton(Context context, Drawable drawable, boolean free, boolean roundSelector, boolean forceSelector) { + public EmojiTabButton(Context context, TLRPC.Document emojiDocument, boolean free, boolean roundSelector, boolean forceSelector) { super(context); this.newly = true; this.round = roundSelector; @@ -1014,11 +771,9 @@ public class EmojiTabsStrip extends ScrollableHorizontalScrollView { super.setImageDrawable(drawable); } }; - imageView.setImageDrawable(drawable); - if (drawable instanceof AnimatedEmojiDrawable || drawable instanceof DelayedAnimatedEmojiDrawable) { - isAnimatedEmoji = true; - imageView.setColorFilter(getEmojiColorFilter()); - } + animatedEmojiDocument = emojiDocument; + isAnimatedEmoji = true; + imageView.setColorFilter(getEmojiColorFilter()); addView(imageView); lockView = new PremiumLockIconView(context, PremiumLockIconView.TYPE_STICKERS_PREMIUM_LOCKED, resourcesProvider) { @@ -1093,9 +848,26 @@ public class EmojiTabsStrip extends ScrollableHorizontalScrollView { return super.performClick(); } + public void setDrawable(Drawable drawable) { + setAnimatedEmojiDocument(null); + imageView.setImageDrawable(drawable); + } + + public void setAnimatedEmojiDocument(TLRPC.Document document) { + if (animatedEmojiDocument == null || document == null || animatedEmojiDocument.id != document.id) { + if (animatedEmoji != null) { + animatedEmoji.removeView(imageView); + animatedEmoji = null; + imageView.setImageDrawable(null); + } + animatedEmojiDocument = document; + updateAttachState(); + } + } + private void playAnimation() { - if (animatedEmoji != null && animatedEmoji.drawable != null) { - ImageReceiver imageReceiver = animatedEmoji.drawable.getImageReceiver(); + if (animatedEmoji != null) { + ImageReceiver imageReceiver = animatedEmoji.getImageReceiver(); if (imageReceiver != null) { if (imageReceiver.getAnimation() != null) { imageReceiver.getAnimation().seekTo(0, true); @@ -1106,8 +878,8 @@ public class EmojiTabsStrip extends ScrollableHorizontalScrollView { } private void stopAnimation() { - if (animatedEmoji != null && animatedEmoji.drawable != null) { - ImageReceiver imageReceiver = animatedEmoji.drawable.getImageReceiver(); + if (animatedEmoji != null) { + ImageReceiver imageReceiver = animatedEmoji.getImageReceiver(); if (imageReceiver != null) { if (imageReceiver.getLottieAnimation() != null) { imageReceiver.getLottieAnimation().setCurrentFrame(0); @@ -1135,9 +907,6 @@ public class EmojiTabsStrip extends ScrollableHorizontalScrollView { if (lockView != null) { lockView.invalidate(); } - if (imageView != null && imageView.getDrawable() instanceof DelayedAnimatedEmojiDrawable) { - ((DelayedAnimatedEmojiDrawable) imageView.getDrawable()).load(); - } initLock(); if (imageView != null) { imageView.invalidate(); @@ -1150,8 +919,8 @@ public class EmojiTabsStrip extends ScrollableHorizontalScrollView { } private void initLock() { - if (lockView != null && animatedEmoji != null && animatedEmoji.drawable != null) { - ImageReceiver imageReceiver = animatedEmoji.drawable.getImageReceiver(); + if (lockView != null && animatedEmoji != null) { + ImageReceiver imageReceiver = animatedEmoji.getImageReceiver(); if (imageReceiver != null) { lockView.setImageReceiver(imageReceiver); } @@ -1249,29 +1018,6 @@ public class EmojiTabsStrip extends ScrollableHorizontalScrollView { return imageView != null ? imageView.getDrawable() : null; } - public void setDrawable(Drawable drawable) { - DelayedAnimatedEmojiDrawable newEmoji = null; - if (drawable instanceof DelayedAnimatedEmojiDrawable) { - newEmoji = (DelayedAnimatedEmojiDrawable) drawable; - } - if (animatedEmoji != newEmoji) { - if (animatedEmoji != null) { - animatedEmoji.removeView(); - } - animatedEmoji = newEmoji; - if (animatedEmoji != null && attached && isVisible) { - animatedEmoji.updateView(imageView); - } - if (isVisible && animatedEmoji != null) { - animatedEmoji.load(); - } - initLock(); - } - if (imageView != null) { - imageView.setImageDrawable(drawable); - } - } - @Override protected void onAttachedToWindow() { super.onAttachedToWindow(); @@ -1287,13 +1033,27 @@ public class EmojiTabsStrip extends ScrollableHorizontalScrollView { } private void updateAttachState() { - if (animatedEmoji != null) { - if ((keepAttached || attached) && isVisible) { - animatedEmoji.updateView(imageView); - } else { - animatedEmoji.removeView(); + if (imageView == null) { + return; + } + if (animatedEmoji != null && animatedEmojiDocument == null) { + animatedEmoji.removeView(imageView); + animatedEmoji = null; + imageView.setImageDrawable(null); + } else if (attached && isVisible) { + if (animatedEmoji == null && animatedEmojiDocument != null) { + animatedEmoji = AnimatedEmojiDrawable.make(UserConfig.selectedAccount, animatedEmojiCacheType, animatedEmojiDocument); + animatedEmoji.addView(imageView); + imageView.setImageDrawable(animatedEmoji); + } + } else { + if (animatedEmoji != null) { + animatedEmoji.removeView(imageView); + animatedEmoji = null; + imageView.setImageDrawable(null); } } + updateLockImageReceiver(); } private float selectT; @@ -1371,7 +1131,7 @@ public class EmojiTabsStrip extends ScrollableHorizontalScrollView { } private class EmojiTabsView extends ScrollableHorizontalScrollView { - public int id; + public long id; public EmojiTabsView(Context context) { super(context); diff --git a/TMessagesProj/src/main/java/org/telegram/ui/Components/EmojiView.java b/TMessagesProj/src/main/java/org/telegram/ui/Components/EmojiView.java index e09a5cb36..b13678b7e 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/Components/EmojiView.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/Components/EmojiView.java @@ -3850,7 +3850,7 @@ public class EmojiView extends FrameLayout implements NotificationCenter.Notific installedEmojiSets.add(set.set.id); } updateState(true); - }); + }, false); } @Override @@ -5963,7 +5963,12 @@ public class EmojiView extends FrameLayout implements NotificationCenter.Notific checkPanels(); } } else if ((Integer) args[0] == MediaDataController.TYPE_EMOJIPACKS) { - emojiAdapter.notifyDataSetChanged((Boolean) args[1]); + if ((Boolean) args[1]) { + AndroidUtilities.cancelRunOnUIThread(updateStickersLoadedDelayed); + AndroidUtilities.runOnUIThread(updateStickersLoadedDelayed, 100); + } else { + emojiAdapter.notifyDataSetChanged(false); + } } } else if (id == NotificationCenter.recentDocumentsDidLoad) { boolean isGif = (Boolean) args[0]; @@ -7064,6 +7069,9 @@ public class EmojiView extends FrameLayout implements NotificationCenter.Notific } else { pack.documents = set.covers; } + if (pack.documents == null || pack.documents.isEmpty()) { + continue; + } pack.index = index++; boolean premium = false; for (int j = 0; j < pack.documents.size(); ++j) { @@ -7157,6 +7165,9 @@ public class EmojiView extends FrameLayout implements NotificationCenter.Notific trendingHeaderRow = itemCount++; trendingRow = itemCount++; recentlyUsedHeaderRow = itemCount++; + rowHashCodes.add(324953); + rowHashCodes.add(123342); + rowHashCodes.add(929132); } else { trendingHeaderRow = -1; trendingRow = -1; @@ -7199,14 +7210,14 @@ public class EmojiView extends FrameLayout implements NotificationCenter.Notific if (!pack.expanded && pack.documents.size() > maxlen) { count--; } - rowHashCodes.add(Objects.hash(pack.featured ? 56345 : -645231, (pack.set == null ? b : pack.set.id))); + rowHashCodes.add(Objects.hash(pack.featured ? 56345 : -495231, (pack.set == null ? b : pack.set.id))); for (int i = 1; i < count; ++i) { - rowHashCodes.add(Objects.hash(pack.featured ? 3442 : 3213, pack.documents.get(i - 1).id)); + rowHashCodes.add(Objects.hash(pack.featured ? 3442 : -9964, pack.documents.get(i - 1).id)); } itemCount += count; if (!pack.expanded && pack.documents.size() > maxlen) { positionToExpand.put(itemCount, b); - rowHashCodes.add(Objects.hash(-65174, pack.set.id)); + rowHashCodes.add(Objects.hash(pack.featured ? -65174 : 92242, pack.set.id)); itemCount++; } // if (!pack.installed) { diff --git a/TMessagesProj/src/main/java/org/telegram/ui/Components/Paint/Views/EntitiesContainerView.java b/TMessagesProj/src/main/java/org/telegram/ui/Components/Paint/Views/EntitiesContainerView.java index 0b6d45679..0caa6ffb9 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/Components/Paint/Views/EntitiesContainerView.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/Components/Paint/Views/EntitiesContainerView.java @@ -6,7 +6,11 @@ import android.view.ScaleGestureDetector; import android.view.View; import android.widget.FrameLayout; -public class EntitiesContainerView extends FrameLayout implements ScaleGestureDetector.OnScaleGestureListener, RotationGestureDetector.OnRotationGestureListener { +import com.google.zxing.common.detector.MathUtils; + +import org.telegram.messenger.AndroidUtilities; + +public class EntitiesContainerView extends FrameLayout { public interface EntitiesContainerViewDelegate { boolean shouldReceiveTouches(); @@ -15,17 +19,12 @@ public class EntitiesContainerView extends FrameLayout implements ScaleGestureDe } private EntitiesContainerViewDelegate delegate; - private ScaleGestureDetector gestureDetector; - private RotationGestureDetector rotationGestureDetector; private float previousScale = 1.0f; private float previousAngle; private boolean hasTransformed; public EntitiesContainerView(Context context, EntitiesContainerViewDelegate entitiesContainerViewDelegate) { super(context); - - gestureDetector = new ScaleGestureDetector(context, this); - rotationGestureDetector = new RotationGestureDetector(this); delegate = entitiesContainerViewDelegate; } @@ -41,6 +40,9 @@ public class EntitiesContainerView extends FrameLayout implements ScaleGestureDe return count; } + private float px, py; + private boolean cancelled; + @Override public boolean onTouchEvent(MotionEvent event) { EntityView selectedEntity = delegate.onSelectedEntityRequest(); @@ -52,64 +54,40 @@ public class EntitiesContainerView extends FrameLayout implements ScaleGestureDe int action = event.getActionMasked(); if (action == MotionEvent.ACTION_DOWN) { hasTransformed = false; - } else if (action == MotionEvent.ACTION_UP || action == MotionEvent.ACTION_MOVE) { + selectedEntity.hasPanned = false; + selectedEntity.hasReleased = false; + px = event.getX(); + py = event.getY(); + cancelled = false; + } else if (!cancelled && action == MotionEvent.ACTION_MOVE) { + final float x = event.getX(); + final float y = event.getY(); + if (hasTransformed || MathUtils.distance(x, y, px, py) > AndroidUtilities.touchSlop) { + hasTransformed = true; + selectedEntity.hasPanned = true; + selectedEntity.pan(x - px, y - py); + px = x; + py = y; + } + } else if (action == MotionEvent.ACTION_UP || action == MotionEvent.ACTION_CANCEL) { + selectedEntity.hasPanned = false; + selectedEntity.hasReleased = true; if (!hasTransformed && delegate != null) { delegate.onEntityDeselect(); } + invalidate(); return false; } + } else { + selectedEntity.hasPanned = false; + selectedEntity.hasReleased = true; + hasTransformed = false; + cancelled = true; + invalidate(); } - -// gestureDetector.onTouchEvent(event); -// rotationGestureDetector.onTouchEvent(event); return true; } - @Override - public boolean onScale(ScaleGestureDetector detector) { - float sf = detector.getScaleFactor(); - float newScale = sf / previousScale; - - EntityView view = delegate.onSelectedEntityRequest(); - view.scale(newScale); - - previousScale = sf; - - return false; - } - - @Override - public boolean onScaleBegin(ScaleGestureDetector detector) { - previousScale = 1.0f; - hasTransformed = true; - return true; - } - - @Override - public void onScaleEnd(ScaleGestureDetector detector) { - - } - - @Override - public void onRotationBegin(RotationGestureDetector rotationDetector) { - previousAngle = rotationDetector.getStartAngle(); - hasTransformed = true; - } - - @Override - public void onRotation(RotationGestureDetector rotationDetector) { - EntityView view = delegate.onSelectedEntityRequest(); - float angle = rotationDetector.getAngle(); - float delta = previousAngle - angle; - view.rotate(view.getRotation() + delta); - previousAngle = angle; - } - - @Override - public void onRotationEnd(RotationGestureDetector rotationDetector) { - - } - @Override protected void measureChildWithMargins(View child, int parentWidthMeasureSpec, int widthUsed, int parentHeightMeasureSpec, int heightUsed) { if (child instanceof TextPaintView) { diff --git a/TMessagesProj/src/main/java/org/telegram/ui/Components/Paint/Views/EntityView.java b/TMessagesProj/src/main/java/org/telegram/ui/Components/Paint/Views/EntityView.java index aa0119bff..fea750cdc 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/Components/Paint/Views/EntityView.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/Components/Paint/Views/EntityView.java @@ -68,8 +68,8 @@ public class EntityView extends FrameLayout { private float previousLocationX, previousLocationY; private float previousLocationX2, previousLocationY2; private float previousLocationCX, previousLocationCY; - private boolean hasPanned = false; - private boolean hasReleased = false; + public boolean hasPanned = false; + public boolean hasReleased = false; private boolean hasTransformed = false; private boolean announcedDrag = false; private boolean announcedMultitouchDrag = false; diff --git a/TMessagesProj/src/main/java/org/telegram/ui/Components/Paint/Views/LPhotoPaintView.java b/TMessagesProj/src/main/java/org/telegram/ui/Components/Paint/Views/LPhotoPaintView.java index 4c7a3d440..193cff35d 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/Components/Paint/Views/LPhotoPaintView.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/Components/Paint/Views/LPhotoPaintView.java @@ -32,6 +32,7 @@ import android.view.MotionEvent; import android.view.View; import android.view.ViewGroup; import android.view.WindowManager; +import android.view.animation.OvershootInterpolator; import android.widget.FrameLayout; import android.widget.ImageView; import android.widget.LinearLayout; @@ -93,6 +94,7 @@ import org.telegram.ui.Components.SizeNotifierFrameLayout; import org.telegram.ui.Components.SizeNotifierFrameLayoutPhoto; import org.telegram.ui.Components.StickerMasksAlert; import org.telegram.ui.PhotoViewer; +import org.telegram.ui.Stories.recorder.EmojiBottomSheet; import java.math.BigInteger; import java.util.ArrayList; @@ -217,7 +219,7 @@ public class LPhotoPaintView extends SizeNotifierFrameLayoutPhoto implements IPh } else if (key == Theme.key_actionBarDefaultSubmenuItem) { return 0xFFFFFFFF; } else if (key == Theme.key_dialogBackground) { - return -14803426; + return 0xFF1F1F1F; } else if (key == Theme.key_dialogTextBlack) { return -592138; } else if (key == Theme.key_dialogTextGray3) { @@ -233,7 +235,7 @@ public class LPhotoPaintView extends SizeNotifierFrameLayoutPhoto implements IPh } else if (key == Theme.key_chat_emojiPanelIcon) { return -9539985; } else if (key == Theme.key_chat_emojiPanelIconSelected) { - return -10177041; + return 0xffffffff; } else if (key == Theme.key_windowBackgroundWhiteBlackText) { return -1; } else if (key == Theme.key_featuredStickers_addedIcon) { @@ -248,9 +250,14 @@ public class LPhotoPaintView extends SizeNotifierFrameLayoutPhoto implements IPh return 0xFFFFFFFF; } else if (key == Theme.key_profile_tabSelector) { return 0x14FFFFFF; + } else if (key == Theme.key_chat_emojiSearchIcon || key == Theme.key_featuredStickers_addedIcon) { + return 0xFF878787; + } else if (key == Theme.key_chat_emojiSearchBackground) { + return 0x2E878787; + } else if (key == Theme.key_windowBackgroundGray) { + return 0xFF0D0D0D; } - if (resourcesProvider != null) { return resourcesProvider.getColor(key); } else { @@ -1330,20 +1337,23 @@ public class LPhotoPaintView extends SizeNotifierFrameLayoutPhoto implements IPh detectFaces(); } }, 350); - StickerMasksAlert stickerMasksAlert = new StickerMasksAlert(getContext(), facesBitmap == null, resourcesProvider) { + EmojiBottomSheet emojiBottomSheet = new EmojiBottomSheet(getContext(), false, resourcesProvider) { @Override - public void onDismissAnimationStart() { - super.onDismissAnimationStart(); - switchTab(wasSelectedIndex); + public boolean canShowWidget(Integer id) { + return false; } }; - stickerMasksAlert.setImageReceiverNumLevel(4 + 8 + 16, 4 + 8 + 16); - stickerMasksAlert.setDelegate((parentObject, sticker) -> createSticker(parentObject, sticker, true)); - stickerMasksAlert.setOnDismissListener(dialog -> { + emojiBottomSheet.whenDocumentSelected((parentObject, document, isGif) -> { + StickerView stickerView = createSticker(parentObject, document, true); + if (isGif) { + stickerView.setScale(1.5f); + } + }); + emojiBottomSheet.setOnDismissListener(di -> { onOpenCloseStickersAlert(false); switchTab(wasSelectedIndex); }); - stickerMasksAlert.show(); + emojiBottomSheet.show(); onOpenCloseStickersAlert(true); } @@ -2754,6 +2764,9 @@ public class LPhotoPaintView extends SizeNotifierFrameLayoutPhoto implements IPh LPhotoPaintView.this.didSetAnimatedSticker(drawable); } }; + if (MessageObject.isTextColorEmoji(sticker)) { + view.centerImage.setColorFilter(new PorterDuffColorFilter(0xffffffff, PorterDuff.Mode.SRC_IN)); + } view.centerImage.setLayerNum(4 + 8); if (position.position.x == entitiesView.getMeasuredWidth() / 2f) { view.setStickyX(EntityView.STICKY_CENTER); diff --git a/TMessagesProj/src/main/java/org/telegram/ui/Components/PhotoFilterView.java b/TMessagesProj/src/main/java/org/telegram/ui/Components/PhotoFilterView.java index 96b90672f..df2e23f75 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/Components/PhotoFilterView.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/Components/PhotoFilterView.java @@ -725,6 +725,7 @@ public class PhotoFilterView extends FrameLayout implements FilterShaders.Filter blurLinearButton.setCompoundDrawablesWithIntrinsicBounds(null, drawable, null, null); blurLinearButton.setTextColor(getThemedColor(Theme.key_dialogFloatingButton)); } + updateFiltersEmpty(); } public MediaController.SavedFilterState getSavedFilterState() { diff --git a/TMessagesProj/src/main/java/org/telegram/ui/DialogsActivity.java b/TMessagesProj/src/main/java/org/telegram/ui/DialogsActivity.java index 330a5514b..7ef2f7e3f 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/DialogsActivity.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/DialogsActivity.java @@ -5873,20 +5873,20 @@ public class DialogsActivity extends BaseFragment implements NotificationCenter. } totalOffset += storiesOverscroll; - if (dialogsHintCell != null) { + if (dialogsHintCell != null && dialogsHintCell.getVisibility() == View.VISIBLE) { if (rightSlidingDialogContainer != null && rightSlidingDialogContainer.hasFragment()) { totalOffset -= dialogsHintCell.getMeasuredHeight() * rightSlidingDialogContainer.openedProgress; } dialogsHintCell.setTranslationY(totalOffset); totalOffset += dialogsHintCell.getMeasuredHeight(); } - if (authHintCell != null) { + if (authHintCell != null && authHintCell.getVisibility() == View.VISIBLE) { if (rightSlidingDialogContainer != null && rightSlidingDialogContainer.hasFragment()) { totalOffset -= authHintCell.getMeasuredHeight() * rightSlidingDialogContainer.openedProgress; } float authHintCellTranslation = authHintCell.getMeasuredHeight() * (1f - authHintCellProgress); authHintCell.setTranslationY(-authHintCellTranslation + totalOffset); - totalOffset += authHintCellTranslation; + totalOffset += authHintCell.getMeasuredHeight() - authHintCellTranslation; } if (fragmentContextView != null) { float from = 0; @@ -9726,7 +9726,6 @@ public class DialogsActivity extends BaseFragment implements NotificationCenter. if (Build.VERSION.SDK_INT >= 33) { permissons.add(Manifest.permission.READ_MEDIA_IMAGES); permissons.add(Manifest.permission.READ_MEDIA_VIDEO); - permissons.add(Manifest.permission.READ_MEDIA_AUDIO); permissons.add(Manifest.permission.WRITE_EXTERNAL_STORAGE); } else if ((Build.VERSION.SDK_INT <= 28 || BuildVars.NO_SCOPED_STORAGE) && activity.checkSelfPermission(Manifest.permission.WRITE_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) { permissons.add(Manifest.permission.READ_EXTERNAL_STORAGE); diff --git a/TMessagesProj/src/main/java/org/telegram/ui/LaunchActivity.java b/TMessagesProj/src/main/java/org/telegram/ui/LaunchActivity.java index 251974705..c4d5fb832 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/LaunchActivity.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/LaunchActivity.java @@ -3681,57 +3681,38 @@ public class LaunchActivity extends BasePermissionsActivity implements INavigati if (!TextUtils.isEmpty(botAppMaybe)) { TLRPC.User user = MessagesController.getInstance(intentAccount).getUser(peerId); if (user != null && user.bot) { - if (user.bot_attach_menu) { + if (user.bot_attach_menu && !MediaDataController.getInstance(intentAccount).botInAttachMenu(user.id)) { TLRPC.TL_messages_getAttachMenuBot getAttachMenuBot = new TLRPC.TL_messages_getAttachMenuBot(); getAttachMenuBot.bot = MessagesController.getInstance(intentAccount).getInputUser(peerId); ConnectionsManager.getInstance(intentAccount).sendRequest(getAttachMenuBot, (response1, error1) -> AndroidUtilities.runOnUIThread(() -> { - if (response1 instanceof TLRPC.TL_attachMenuBotsBot) { - processAttachMenuBot(intentAccount, peerId, attachMenuBotChoose, user, setAsAttachBot); - if (progress != null) { - progress.end(); - } - AndroidUtilities.runOnUIThread(() -> { + try { + if (dismissLoading != null) { dismissLoading.run(); - }); + } + } catch (Exception e) { + FileLog.e(e); + } + if (response1 instanceof TLRPC.TL_attachMenuBotsBot) { + WebAppDisclaimerAlert.show(this, ignore -> { + user.inactive = false; + MediaDataController.getInstance(currentAccount).applyAttachMenuBot((TLRPC.TL_attachMenuBotsBot) response1); + processWebAppBot(intentAccount, username, group, sticker, emoji, botUser, botChat, botChannel, botChatAdminParams, message, contactToken, folderSlug, hasUrl, messageId, channelId, threadId, commentId, game, auth, lang, unsupportedUrl, code, loginToken, wallPaper, inputInvoiceSlug, theme, voicechat, livestream, state, videoTimestamp, setAsAttachBot, attachMenuBotToOpen, attachMenuBotChoose, botAppMaybe, botAppStartParam, progress, false, storyId, true, user, dismissLoading); + + TLRPC.TL_messages_toggleBotInAttachMenu botRequest = new TLRPC.TL_messages_toggleBotInAttachMenu(); + botRequest.bot = MessagesController.getInstance(intentAccount).getInputUser(peerId); + botRequest.enabled = true; + botRequest.write_allowed = true; + + ConnectionsManager.getInstance(intentAccount).sendRequest(botRequest, (response2, error2) -> AndroidUtilities.runOnUIThread(() -> { + if (response2 instanceof TLRPC.TL_boolTrue) { + MediaDataController.getInstance(intentAccount).loadAttachMenuBots(false, true, null); + } + }), ConnectionsManager.RequestFlagInvokeAfter | ConnectionsManager.RequestFlagFailOnServerErrors); + }, null); } })); } else { - TLRPC.TL_messages_getBotApp getBotApp = new TLRPC.TL_messages_getBotApp(); - TLRPC.TL_inputBotAppShortName app = new TLRPC.TL_inputBotAppShortName(); - app.bot_id = MessagesController.getInstance(intentAccount).getInputUser(user); - app.short_name = botAppMaybe; - getBotApp.app = app; - ConnectionsManager.getInstance(intentAccount).sendRequest(getBotApp, (response1, error1) -> { - if (progress != null) { - progress.end(); - } - if (error1 != null) { - AndroidUtilities.runOnUIThread(() -> runLinkRequest(intentAccount, username, group, sticker, emoji, botUser, botChat, botChannel, botChatAdminParams, message, contactToken, folderSlug, hasUrl, messageId, channelId, threadId, commentId, game, auth, lang, unsupportedUrl, code, loginToken, wallPaper, inputInvoiceSlug, theme, voicechat, livestream, state, videoTimestamp, setAsAttachBot, attachMenuBotToOpen, attachMenuBotChoose, null, null, progress, forceNotInternalForApps, storyId)); - } else { - TLRPC.TL_messages_botApp botApp = (TLRPC.TL_messages_botApp) response1; - AndroidUtilities.runOnUIThread(() -> { - dismissLoading.run(); - - AtomicBoolean allowWrite = new AtomicBoolean(); - BaseFragment lastFragment = mainFragmentsStack.get(mainFragmentsStack.size() - 1); - Runnable loadBotSheet = () -> { - BotWebViewSheet sheet = new BotWebViewSheet(LaunchActivity.this, lastFragment.getResourceProvider()); - sheet.setParentActivity(LaunchActivity.this); - sheet.requestWebView(intentAccount, user.id, user.id, null, null, BotWebViewSheet.TYPE_WEB_VIEW_BOT_APP, 0, false, lastFragment, botApp.app, allowWrite.get(), botAppStartParam, user); - sheet.show(); - if (botApp.inactive || forceNotInternalForApps) { - sheet.showJustAddedBulletin(); - } - }; - - if (botApp.inactive || forceNotInternalForApps) { - AlertsCreator.createBotLaunchAlert(lastFragment, botApp, user, allowWrite, loadBotSheet); - } else { - loadBotSheet.run(); - } - }); - } - }); + processWebAppBot(intentAccount, username, group, sticker, emoji, botUser, botChat, botChannel, botChatAdminParams, message, contactToken, folderSlug, hasUrl, messageId, channelId, threadId, commentId, game, auth, lang, unsupportedUrl, code, loginToken, wallPaper, inputInvoiceSlug, theme, voicechat, livestream, state, videoTimestamp, setAsAttachBot, attachMenuBotToOpen, attachMenuBotChoose, botAppMaybe, botAppStartParam, progress, false, storyId, false, user, dismissLoading); } return; } @@ -4656,6 +4637,87 @@ public class LaunchActivity extends BasePermissionsActivity implements INavigati } } + private void processWebAppBot(final int intentAccount, + final String username, + final String group, + final String sticker, + final String emoji, + final String botUser, + final String botChat, + final String botChannel, + final String botChatAdminParams, + final String message, + final String contactToken, + final String folderSlug, + final boolean hasUrl, + final Integer messageId, + final Long channelId, + final Integer threadId, + final Integer commentId, + final String game, + final HashMap auth, + final String lang, + final String unsupportedUrl, + final String code, + final String loginToken, + final TLRPC.TL_wallPaper wallPaper, + final String inputInvoiceSlug, + final String theme, + final String voicechat, + final String livestream, + final int state, + final int videoTimestamp, + final String setAsAttachBot, + final String attachMenuBotToOpen, + final String attachMenuBotChoose, + final String botAppMaybe, + final String botAppStartParam, + final Browser.Progress progress, + final boolean forceNotInternalForApps, + final int storyId, + boolean justAdded, + TLRPC.User user, + Runnable dismissLoading) { + + TLRPC.TL_messages_getBotApp getBotApp = new TLRPC.TL_messages_getBotApp(); + TLRPC.TL_inputBotAppShortName app = new TLRPC.TL_inputBotAppShortName(); + app.bot_id = MessagesController.getInstance(intentAccount).getInputUser(user); + app.short_name = botAppMaybe; + getBotApp.app = app; + ConnectionsManager.getInstance(intentAccount).sendRequest(getBotApp, (response1, error1) -> { + if (progress != null) { + progress.end(); + } + if (error1 != null) { + AndroidUtilities.runOnUIThread(() -> runLinkRequest(intentAccount, username, group, sticker, emoji, botUser, botChat, botChannel, botChatAdminParams, message, contactToken, folderSlug, hasUrl, messageId, channelId, threadId, commentId, game, auth, lang, unsupportedUrl, code, loginToken, wallPaper, inputInvoiceSlug, theme, voicechat, livestream, state, videoTimestamp, setAsAttachBot, attachMenuBotToOpen, attachMenuBotChoose, null, null, progress, forceNotInternalForApps, storyId)); + } else { + TLRPC.TL_messages_botApp botApp = (TLRPC.TL_messages_botApp) response1; + AndroidUtilities.runOnUIThread(() -> { + dismissLoading.run(); + + AtomicBoolean allowWrite = new AtomicBoolean(); + BaseFragment lastFragment = mainFragmentsStack.get(mainFragmentsStack.size() - 1); + Runnable loadBotSheet = () -> { + BotWebViewSheet sheet = new BotWebViewSheet(LaunchActivity.this, lastFragment.getResourceProvider()); + sheet.setParentActivity(LaunchActivity.this); + sheet.requestWebView(intentAccount, user.id, user.id, null, null, BotWebViewSheet.TYPE_WEB_VIEW_BOT_APP, 0, false, lastFragment, botApp.app, allowWrite.get(), botAppStartParam, user); + sheet.show(); + if (justAdded) { + sheet.showJustAddedBulletin(); + } + }; + + if (!user.bot_attach_menu && (botApp.inactive || forceNotInternalForApps)) { + AlertsCreator.createBotLaunchAlert(lastFragment, botApp, user, allowWrite, loadBotSheet); + } else { + loadBotSheet.run(); + } + }); + } + }); + + } + private void processAttachMenuBot(int intentAccount, long peerId, String attachMenuBotChoose, TLRPC.User user, String setAsAttachBot) { TLRPC.TL_messages_getAttachMenuBot getAttachMenuBot = new TLRPC.TL_messages_getAttachMenuBot(); getAttachMenuBot.bot = MessagesController.getInstance(intentAccount).getInputUser(peerId); diff --git a/TMessagesProj/src/main/java/org/telegram/ui/PhotoViewer.java b/TMessagesProj/src/main/java/org/telegram/ui/PhotoViewer.java index a20feb243..d2b999602 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/PhotoViewer.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/PhotoViewer.java @@ -14680,15 +14680,12 @@ public class PhotoViewer implements NotificationCenter.NotificationCenterDelegat photosCounterView.setTranslationY(-dp(32)); photosCounterView.animate().alpha(1).translationY(0).setDuration(150).setInterpolator(CubicBezierInterpolator.DEFAULT).start(); - pickerView.setTranslationY(dp(32)); pickerView.animate().alpha(1).setDuration(150).setInterpolator(CubicBezierInterpolator.DEFAULT).start(); pickerViewSendButton.setTranslationY(dp(32)); pickerViewSendButton.setAlpha(0f); pickerViewSendButton.animate().alpha(1).translationY(0).setDuration(150).setInterpolator(CubicBezierInterpolator.DEFAULT).start(); - captionEdit.setAddPhotoVisible(true, true); - videoPreviewFrame.setTranslationY(dp(32)); videoPreviewFrame.animate().alpha(1).translationY(0).setDuration(150).setInterpolator(CubicBezierInterpolator.DEFAULT).start(); diff --git a/TMessagesProj/src/main/java/org/telegram/ui/Stories/recorder/EmojiBottomSheet.java b/TMessagesProj/src/main/java/org/telegram/ui/Stories/recorder/EmojiBottomSheet.java index b21f8f0bc..994ee0d50 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/Stories/recorder/EmojiBottomSheet.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/Stories/recorder/EmojiBottomSheet.java @@ -305,6 +305,7 @@ public class EmojiBottomSheet extends BottomSheet implements NotificationCenter. view = new View(getContext()); } else { ContextLinkCell cell = new ContextLinkCell(getContext()); + cell.getPhotoImage().setLayerNum(7); cell.allowButtonBounce(true); cell.setIsKeyboard(true); cell.setCanPreviewGif(true); @@ -825,8 +826,10 @@ public class EmojiBottomSheet extends BottomSheet implements NotificationCenter. packs.clear(); int i = 0; if (currentType == PAGE_TYPE_STICKERS) { - documents.add(widgets); - itemsCount++; + if (hasWidgets()) { + documents.add(widgets); + itemsCount++; + } ArrayList favorites = mediaDataController.getRecentStickers(MediaDataController.TYPE_FAVE); if (favorites != null && !favorites.isEmpty()) { @@ -1268,6 +1271,10 @@ public class EmojiBottomSheet extends BottomSheet implements NotificationCenter. return true; } + public boolean hasWidgets() { + return canShowWidget(WIDGET_LOCATION) || canShowWidget(WIDGET_PHOTO); + } + @Override public void didReceivedNotification(int id, int account, Object... args) { if (id == NotificationCenter.stickersDidLoad || id == NotificationCenter.groupStickersDidLoad) { @@ -2577,8 +2584,10 @@ public class EmojiBottomSheet extends BottomSheet implements NotificationCenter. super(context); setPadding(dp(0), 0, dp(0), 0); - widgets.add(new Button(WIDGET_LOCATION, R.drawable.map_pin3, LocaleController.getString(R.string.StoryWidgetLocation))); - widgets.add(new Button(WIDGET_PHOTO, R.drawable.files_gallery, LocaleController.getString(R.string.StoryWidgetPhoto))); + if (canShowWidget(WIDGET_LOCATION)) + widgets.add(new Button(WIDGET_LOCATION, R.drawable.map_pin3, LocaleController.getString(R.string.StoryWidgetLocation))); + if (canShowWidget(WIDGET_PHOTO)) + widgets.add(new Button(WIDGET_PHOTO, R.drawable.files_gallery, LocaleController.getString(R.string.StoryWidgetPhoto))); } private abstract class BaseWidget { diff --git a/TMessagesProj/src/main/java/org/telegram/ui/Stories/recorder/StoryRecorder.java b/TMessagesProj/src/main/java/org/telegram/ui/Stories/recorder/StoryRecorder.java index d15837c4c..73f6565f1 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/Stories/recorder/StoryRecorder.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/Stories/recorder/StoryRecorder.java @@ -3259,6 +3259,8 @@ public class StoryRecorder implements NotificationCenter.NotificationCenterDeleg previewView.updatePauseReason(5, false); previewView.updatePauseReason(7, false); videoTimeView.setVisibility(outputEntry != null && outputEntry.duration >= 30_000 ? View.VISIBLE : View.GONE); + captionContainer.setAlpha(1f); + captionContainer.setTranslationY(0); } if (toPage == PAGE_CAMERA && showSavedDraftHint) { getDraftSavedHint().setVisibility(View.VISIBLE); diff --git a/TMessagesProj/src/main/res/values/strings.xml b/TMessagesProj/src/main/res/values/strings.xml index 2effbd320..503731c95 100644 --- a/TMessagesProj/src/main/res/values/strings.xml +++ b/TMessagesProj/src/main/res/values/strings.xml @@ -5752,6 +5752,7 @@ This bot can\'t be added to the attachment menu. This bot is already in your attachment menu. This will remove **%1$s** shortcuts from all menus. + This will remove **%1$s** shortcuts from all menus. Remove **%1$s** from suggestions? Allow **%1$s** to access to your location?\n\nThe developer of **%1$s** will be able to access your location when this web app is open. Allow **%1$s** to access to your location?\n\nThe developer of **%1$s** will be able to access your location when this web app is open.\n\nGo to Settings > Permissions and turn **Location** on to share location data. diff --git a/gradle.properties b/gradle.properties index c1bc1ef7a..b25f7af81 100644 --- a/gradle.properties +++ b/gradle.properties @@ -13,8 +13,8 @@ # http://www.gradle.org/docs/current/userguide/multi_project_builds.html#sec:decoupled_projects # org.gradle.parallel=true #Sat Mar 12 05:53:50 MSK 2016 -APP_VERSION_CODE=3867 -APP_VERSION_NAME=10.0.8 +APP_VERSION_CODE=3872 +APP_VERSION_NAME=10.0.9 APP_PACKAGE=org.telegram.messenger RELEASE_KEY_PASSWORD=android RELEASE_KEY_ALIAS=androidkey