From fea5ca949acc2afeaa3f724e4e25e04a15b96c35 Mon Sep 17 00:00:00 2001 From: xaxtix Date: Sat, 23 Sep 2023 22:46:49 +0400 Subject: [PATCH] update to 10.1.1 (3926) --- Dockerfile | 3 +- .../org/telegram/messenger/BuildVars.java | 4 +- .../telegram/messenger/FileRefController.java | 21 +- .../messenger/NotificationCenter.java | 2 +- .../messenger/NotificationsController.java | 19 ++ .../NotificationsSettingsFacade.java | 16 +- .../video/VideoPlayerHolderBase.java | 9 +- .../telegram/ui/ActionBar/BaseFragment.java | 1 + .../telegram/ui/Cells/ChatMessageCell.java | 31 +-- .../ui/Cells/FeaturedStickerSetCell2.java | 2 +- .../ui/Cells/ReactedUserHolderView.java | 12 +- .../org/telegram/ui/Cells/StickerSetCell.java | 2 +- .../org/telegram/ui/ChannelBoostLayout.java | 6 +- .../ui/Components/BotWebViewSheet.java | 14 +- .../ui/Components/ChatAttachAlert.java | 2 +- .../ChatAttachAlertPhotoLayout.java | 62 ++++- .../ui/Components/EmojiPacksAlert.java | 4 +- .../org/telegram/ui/Components/EmojiView.java | 4 +- .../telegram/ui/Components/Paint/Brush.java | 24 ++ .../telegram/ui/Components/Paint/Input.java | 21 +- .../Components/Paint/PersistColorPalette.java | 229 +++++++++++++----- .../Paint/Views/LPhotoPaintView.java | 56 ++++- .../Paint/Views/PaintColorsListView.java | 8 +- .../Paint/Views/PaintToolsView.java | 2 +- .../ui/Components/PhotoFilterView.java | 1 - .../Premium/DoubledLimitsBottomSheet.java | 2 +- .../Premium/GiftPremiumBottomSheet.java | 2 +- .../Components/Premium/LimitPreviewView.java | 1 + .../Premium/LimitReachedBottomSheet.java | 30 ++- .../Components/Premium/PremiumButtonView.java | 10 +- .../Premium/PremiumFeatureBottomSheet.java | 2 +- .../Premium/PremiumPreviewBottomSheet.java | 2 +- .../telegram/ui/Components/StickersAlert.java | 2 +- .../ui/Components/ViewPagerFixed.java | 5 + .../ui/Components/spoilers/SpoilerEffect.java | 3 + .../java/org/telegram/ui/LaunchActivity.java | 48 ++-- .../java/org/telegram/ui/PhotoViewer.java | 7 +- .../telegram/ui/PremiumPreviewFragment.java | 2 +- .../java/org/telegram/ui/ProfileActivity.java | 36 +-- .../ui/SelectAnimatedEmojiDialog.java | 2 +- .../org/telegram/ui/StatisticActivity.java | 2 + .../telegram/ui/Stories/PeerStoriesView.java | 60 +++-- .../ui/Stories/SelfStoryViewsPage.java | 2 +- .../telegram/ui/Stories/StealthModeAlert.java | 2 +- .../ui/Stories/StoriesController.java | 2 +- .../telegram/ui/Stories/StoriesViewPager.java | 3 +- .../org/telegram/ui/Stories/StoryViewer.java | 38 ++- .../recorder/CaptionContainerView.java | 2 + .../ui/Stories/recorder/PaintView.java | 57 ++++- .../ui/Stories/recorder/PreviewView.java | 9 +- .../ui/Stories/recorder/StoryRecorder.java | 30 ++- .../ui/Stories/recorder/TimelineView.java | 32 +-- .../org/telegram/ui/UnlockPremiumView.java | 2 +- TMessagesProj/src/main/res/values/strings.xml | 3 +- gradle.properties | 4 +- 55 files changed, 680 insertions(+), 277 deletions(-) diff --git a/Dockerfile b/Dockerfile index 58fb99ac6..3ded9c17f 100644 --- a/Dockerfile +++ b/Dockerfile @@ -34,10 +34,11 @@ CMD mkdir -p /home/source/TMessagesProj/build/outputs/apk && \ cd /home/gradle && \ gradle :TMessagesProj_App:bundleBundleAfat_SDK23Release && \ gradle :TMessagesProj_App:bundleBundleAfatRelease && \ - gradle :TMessagesProj_App:assembleAfatStandalone && \ + gradle :TMessagesProj_AppStandalone:assembleAfatStandalone && \ gradle :TMessagesProj_App:assembleAfatRelease && \ gradle :TMessagesProj_AppHuawei:assembleAfatRelease && \ cp -R /home/gradle/TMessagesProj_App/build/outputs/apk/. /home/source/TMessagesProj/build/outputs/apk && \ cp -R /home/gradle/TMessagesProj_AppHuawei/build/outputs/apk/. /home/source/TMessagesProj/build/outputs/apk && \ + cp -R /home/gradle/TMessagesProj_AppStandalone/build/outputs/apk/. /home/source/TMessagesProj/build/outputs/apk && \ cp -R /home/gradle/TMessagesProj_App/build/outputs/bundle/. /home/source/TMessagesProj/build/outputs/bundle && \ cp -R /home/gradle/TMessagesProj_App/build/outputs/native-debug-symbols/. /home/source/TMessagesProj/build/outputs/native-debug-symbols \ No newline at end of file diff --git a/TMessagesProj/src/main/java/org/telegram/messenger/BuildVars.java b/TMessagesProj/src/main/java/org/telegram/messenger/BuildVars.java index 0580dd0e9..ebc585944 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 = 3919; - public static String BUILD_VERSION_STRING = "10.1.0"; + public static int BUILD_VERSION = 3926; + public static String BUILD_VERSION_STRING = "10.1.1"; public static int APP_ID = 4; public static String APP_HASH = "014b35b6184100b085b0d0572f9b5103"; diff --git a/TMessagesProj/src/main/java/org/telegram/messenger/FileRefController.java b/TMessagesProj/src/main/java/org/telegram/messenger/FileRefController.java index 74c96b113..b0349c096 100644 --- a/TMessagesProj/src/main/java/org/telegram/messenger/FileRefController.java +++ b/TMessagesProj/src/main/java/org/telegram/messenger/FileRefController.java @@ -1046,13 +1046,14 @@ public class FileRefController extends BaseController { TLRPC.TL_stories_stories stories = (TLRPC.TL_stories_stories) response; TLRPC.StoryItem newStoryItem = null; if (!stories.stories.isEmpty()) { - if (stories.stories.get(0).media != null) { - newStoryItem = stories.stories.get(0); - if (stories.stories.get(0).media.photo != null) { - result = getFileReference(stories.stories.get(0).media.photo, requester.location, needReplacement, locationReplacement); + TLRPC.StoryItem storyItem = stories.stories.get(0); + if (storyItem.media != null) { + newStoryItem = storyItem; + if (storyItem.media.photo != null) { + result = getFileReference(storyItem.media.photo, requester.location, needReplacement, locationReplacement); } - if (stories.stories.get(0).media.document != null) { - result = getFileReference(stories.stories.get(0).media.document, requester.location, needReplacement, locationReplacement); + if (storyItem.media.document != null) { + result = getFileReference(storyItem.media.document, requester.location, needReplacement, locationReplacement); } } } @@ -1075,6 +1076,14 @@ public class FileRefController extends BaseController { MessagesController.getInstance(currentAccount).getStoriesController().getStoriesStorage().updateStoryItem(storyItem.dialogId, newStoryItem); } } + if (newStoryItem != null && result == null) { + TLRPC.TL_updateStory updateStory = new TLRPC.TL_updateStory(); + updateStory.peer = MessagesController.getInstance(currentAccount).getPeer(storyItem.dialogId); + updateStory.story = newStoryItem; + ArrayList updates = new ArrayList<>(); + updates.add(updateStory); + MessagesController.getInstance(currentAccount).processUpdateArray(updates, null, null, false, 0); + } } } } diff --git a/TMessagesProj/src/main/java/org/telegram/messenger/NotificationCenter.java b/TMessagesProj/src/main/java/org/telegram/messenger/NotificationCenter.java index b304dde64..808755c59 100644 --- a/TMessagesProj/src/main/java/org/telegram/messenger/NotificationCenter.java +++ b/TMessagesProj/src/main/java/org/telegram/messenger/NotificationCenter.java @@ -294,7 +294,7 @@ public class NotificationCenter { public static final int uploadStoryEnd = totalEvents++; public static final int customTypefacesLoaded = totalEvents++; public static final int stealthModeChanged = totalEvents++; - public static final int onReceivedChannelDifference = totalEvents++; + public static final int onReceivedChannelDifference = totalEvents++;; public static boolean alreadyLogged; diff --git a/TMessagesProj/src/main/java/org/telegram/messenger/NotificationsController.java b/TMessagesProj/src/main/java/org/telegram/messenger/NotificationsController.java index 9ef27e6d1..8e6a2cbe5 100644 --- a/TMessagesProj/src/main/java/org/telegram/messenger/NotificationsController.java +++ b/TMessagesProj/src/main/java/org/telegram/messenger/NotificationsController.java @@ -44,6 +44,7 @@ import android.media.AudioManager; import android.media.SoundPool; import android.net.Uri; import android.os.Build; +import android.os.Looper; import android.os.PowerManager; import android.os.SystemClock; import android.provider.Settings; @@ -284,6 +285,24 @@ public class NotificationsController extends BaseController { private static final LongSparseArray sharedPrefCachedKeys = new LongSparseArray<>(); public static String getSharedPrefKey(long dialog_id, int topicId) { + return getSharedPrefKey(dialog_id, topicId, false); + } + + public static String getSharedPrefKey(long dialog_id, int topicId, boolean backgroundThread) { + if (backgroundThread) { + String key; + if (topicId != 0) { + key = String.format(Locale.US, "%d_%d",dialog_id, topicId); + } else { + key = String.valueOf(dialog_id); + } + return key; + } +// if (BuildVars.DEBUG_PRIVATE_VERSION) { +// if (Thread.currentThread() != Looper.getMainLooper().getThread()) { +// throw new IllegalStateException("Not on main thread!"); +// } +// } long hash = dialog_id + ((long) topicId << 12); int index = sharedPrefCachedKeys.indexOfKey(hash); if (index >= 0) { diff --git a/TMessagesProj/src/main/java/org/telegram/messenger/NotificationsSettingsFacade.java b/TMessagesProj/src/main/java/org/telegram/messenger/NotificationsSettingsFacade.java index 1a14b51ac..5cce19407 100644 --- a/TMessagesProj/src/main/java/org/telegram/messenger/NotificationsSettingsFacade.java +++ b/TMessagesProj/src/main/java/org/telegram/messenger/NotificationsSettingsFacade.java @@ -25,12 +25,12 @@ public class NotificationsSettingsFacade { public boolean isDefault(long dialogId, int topicId) { - String key = NotificationsController.getSharedPrefKey(dialogId, topicId); + String key = NotificationsController.getSharedPrefKey(dialogId, topicId, true); return false; } public void clearPreference(long dialogId, int topicId) { - String key = NotificationsController.getSharedPrefKey(dialogId, topicId); + String key = NotificationsController.getSharedPrefKey(dialogId, topicId, true); getPreferences().edit() .remove(PROPERTY_NOTIFY + key) .remove(PROPERTY_CUSTOM + key) @@ -44,20 +44,20 @@ public class NotificationsSettingsFacade { public int getProperty(String property, long dialogId, int topicId, int defaultValue) { - String key = NotificationsController.getSharedPrefKey(dialogId, topicId); + String key = NotificationsController.getSharedPrefKey(dialogId, topicId, true); if (getPreferences().contains(property + key)) { return getPreferences().getInt(property + key, defaultValue); } - key = NotificationsController.getSharedPrefKey(dialogId, 0); + key = NotificationsController.getSharedPrefKey(dialogId, 0, true); return getPreferences().getInt(property + key, defaultValue); } public long getProperty(String property, long dialogId, int topicId, long defaultValue) { - String key = NotificationsController.getSharedPrefKey(dialogId, topicId); + String key = NotificationsController.getSharedPrefKey(dialogId, topicId, true); if (getPreferences().contains(property + key)) { return getPreferences().getLong(property + key, defaultValue); } - key = NotificationsController.getSharedPrefKey(dialogId, 0); + key = NotificationsController.getSharedPrefKey(dialogId, 0, true); return getPreferences().getLong(property + key, defaultValue); } @@ -94,7 +94,7 @@ public class NotificationsSettingsFacade { return; } Utilities.globalQueue.postRunnable(() -> { - String key = NotificationsController.getSharedPrefKey(dialogId, topicId); + String key = NotificationsController.getSharedPrefKey(dialogId, topicId, true); MessagesController messagesController = MessagesController.getInstance(currentAccount); ConnectionsManager connectionsManager = ConnectionsManager.getInstance(currentAccount); MessagesStorage messagesStorage = MessagesStorage.getInstance(currentAccount); @@ -191,7 +191,7 @@ public class NotificationsSettingsFacade { String soundPathPref; String soundDocPref; if (dialogId != 0) { - String key = NotificationsController.getSharedPrefKey(dialogId, topicId); + String key = NotificationsController.getSharedPrefKey(dialogId, topicId, true); soundPref = "sound_" + key; soundPathPref = "sound_path_" + key; soundDocPref = "sound_document_id_" + key; diff --git a/TMessagesProj/src/main/java/org/telegram/messenger/video/VideoPlayerHolderBase.java b/TMessagesProj/src/main/java/org/telegram/messenger/video/VideoPlayerHolderBase.java index e381099e9..49af6f5ce 100644 --- a/TMessagesProj/src/main/java/org/telegram/messenger/video/VideoPlayerHolderBase.java +++ b/TMessagesProj/src/main/java/org/telegram/messenger/video/VideoPlayerHolderBase.java @@ -104,10 +104,13 @@ public class VideoPlayerHolderBase { }); } - public void start(boolean paused, Uri uri, long t, boolean audioDisabled) { + public void start(boolean paused, Uri uri, long position, boolean audioDisabled) { startTime = System.currentTimeMillis(); this.audioDisabled = audioDisabled; this.paused = paused; + if (position > 0) { + currentPosition = position; + } dispatchQueue.postRunnable(initRunnable = () -> { if (released) { return; @@ -134,8 +137,8 @@ public class VideoPlayerHolderBase { videoPlayer.play(); } } - if (t > 0) { - videoPlayer.seekTo(t); + if (position > 0) { + videoPlayer.seekTo(position); } // videoPlayer.setVolume(isInSilentMode ? 0 : 1f); diff --git a/TMessagesProj/src/main/java/org/telegram/ui/ActionBar/BaseFragment.java b/TMessagesProj/src/main/java/org/telegram/ui/ActionBar/BaseFragment.java index 25c1b8d27..8ac687ad9 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/ActionBar/BaseFragment.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/ActionBar/BaseFragment.java @@ -416,6 +416,7 @@ public abstract class BaseFragment { FileLog.e(e); } if (storyViewer != null) { + storyViewer.onPause(); storyViewer.updatePlayingMode(); } if (overlayStoryViewer != null) { 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 5d8d66473..36f52304d 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/Cells/ChatMessageCell.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/Cells/ChatMessageCell.java @@ -782,7 +782,7 @@ public class ChatMessageCell extends BaseCell implements SeekBar.SeekBarDelegate private int descriptionX; private int titleX; private int authorX; - private boolean siteNameRtl; + private float siteNameLeft, siteNameLayoutWidth; private int siteNameWidth; private StaticLayout siteNameLayout; private StaticLayout titleLayout; @@ -5046,7 +5046,11 @@ public class ChatMessageCell extends BaseCell implements SeekBar.SeekBarDelegate siteNameLayout = generateStaticLayout(site_name, Theme.chat_replyNamePaint, linkPreviewMaxWidth, linkPreviewMaxWidth - smallImageSide - smallSideMargin, restLinesCount, 1); restLinesCount -= siteNameLayout.getLineCount(); } - siteNameRtl = Math.max(siteNameLayout.getLineLeft(0), 0) != 0; + siteNameLeft = siteNameLayoutWidth = 0; + for (int i = 0; i < siteNameLayout.getLineCount(); ++i) { + siteNameLeft = siteNameLayout.getLineLeft(i); + siteNameLayoutWidth = siteNameLayout.getLineWidth(i); + } int height = siteNameLayout.getLineBottom(siteNameLayout.getLineCount() - 1); linkPreviewHeight += height; totalHeight += height; @@ -7675,7 +7679,11 @@ public class ChatMessageCell extends BaseCell implements SeekBar.SeekBarDelegate try { int width = siteNameWidth = (int) Math.ceil(Theme.chat_replyNamePaint.measureText(webPage.site_name) + 1); siteNameLayout = new StaticLayout(webPage.site_name, Theme.chat_replyNamePaint, Math.min(width, linkPreviewMaxWidth), Layout.Alignment.ALIGN_NORMAL, 1.0f, 0.0f, false); - siteNameRtl = siteNameLayout.getLineLeft(0) != 0; + siteNameLeft = siteNameLayoutWidth = 0; + for (int i = 0; i < siteNameLayout.getLineCount(); ++i) { + siteNameLeft = siteNameLayout.getLineLeft(i); + siteNameLayoutWidth = siteNameLayout.getLineWidth(i); + } int height = siteNameLayout.getLineBottom(siteNameLayout.getLineCount() - 1); linkPreviewHeight += height; totalHeight += height; @@ -10233,12 +10241,7 @@ public class ChatMessageCell extends BaseCell implements SeekBar.SeekBarDelegate if (siteNameLayout != null) { Theme.chat_replyNamePaint.setColor(getThemedColor(currentMessageObject.isOutOwner() ? Theme.key_chat_outSiteNameText : Theme.key_chat_inSiteNameText)); canvas.save(); - int x; - if (siteNameRtl) { - x = backgroundWidth - siteNameWidth - AndroidUtilities.dp(32); - } else { - x = (hasInvoicePreview ? 0 : AndroidUtilities.dp(10)); - } + float x = -siteNameLeft + (hasInvoicePreview ? 0 : AndroidUtilities.dp(10)); canvas.translate(linkX + x, linkPreviewY - AndroidUtilities.dp(3)); siteNameLayout.draw(canvas); canvas.restore(); @@ -10599,15 +10602,7 @@ public class ChatMessageCell extends BaseCell implements SeekBar.SeekBarDelegate Theme.chat_replyNamePaint.setAlpha((int) (alpha * Theme.chat_replyLinePaint.getAlpha())); } canvas.save(); - int x; - if (siteNameRtl) { - x = backgroundWidth - siteNameWidth - AndroidUtilities.dp(32); - if (isSmallImage) { - x -= AndroidUtilities.dp(48 + 6); - } - } else { - x = (hasInvoicePreview ? 0 : AndroidUtilities.dp(10)); - } + float x = -siteNameLeft + (hasInvoicePreview ? 0 : AndroidUtilities.dp(10)); canvas.translate(linkX + x, linkPreviewY - AndroidUtilities.dp(3)); siteNameLayout.draw(canvas); canvas.restore(); diff --git a/TMessagesProj/src/main/java/org/telegram/ui/Cells/FeaturedStickerSetCell2.java b/TMessagesProj/src/main/java/org/telegram/ui/Cells/FeaturedStickerSetCell2.java index 2b2dcca1f..d2cdd10b5 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/Cells/FeaturedStickerSetCell2.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/Cells/FeaturedStickerSetCell2.java @@ -115,7 +115,7 @@ public class FeaturedStickerSetCell2 extends FrameLayout implements Notification delButton.setText(LocaleController.getString("StickersRemove", R.string.StickersRemove)); addView(delButton, LayoutHelper.createFrameRelatively(LayoutHelper.WRAP_CONTENT, 28, Gravity.TOP | Gravity.END, 0, 16, 14, 0)); - unlockButton = new PremiumButtonView(context, AndroidUtilities.dp(4), false); + unlockButton = new PremiumButtonView(context, AndroidUtilities.dp(4), false, resourcesProvider); unlockButton.setIcon(R.raw.unlock_icon); unlockButton.setButton(LocaleController.getString("Unlock", R.string.Unlock), e -> onPremiumButtonClick()); unlockButton.setVisibility(View.GONE); diff --git a/TMessagesProj/src/main/java/org/telegram/ui/Cells/ReactedUserHolderView.java b/TMessagesProj/src/main/java/org/telegram/ui/Cells/ReactedUserHolderView.java index 5f5c4d905..ae37d0cc6 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/Cells/ReactedUserHolderView.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/Cells/ReactedUserHolderView.java @@ -76,6 +76,10 @@ public class ReactedUserHolderView extends FrameLayout { public static final MessageSeenCheckDrawable reactDrawable = new MessageSeenCheckDrawable(R.drawable.msg_reactions, Theme.key_windowBackgroundWhiteGrayText, 16, 16, 5.66f); public ReactedUserHolderView(int style, int currentAccount, @NonNull Context context, Theme.ResourcesProvider resourcesProvider) { + this(style, currentAccount, context, resourcesProvider, true); + } + + public ReactedUserHolderView(int style, int currentAccount, @NonNull Context context, Theme.ResourcesProvider resourcesProvider, boolean useOverlaySelector) { super(context); this.style = style; this.currentAccount = currentAccount; @@ -145,9 +149,11 @@ public class ReactedUserHolderView extends FrameLayout { reactView = new BackupImageView(context); addView(reactView, LayoutHelper.createFrameRelatively(24, 24, Gravity.END | Gravity.CENTER_VERTICAL, 0, 0, 12, 0)); - overlaySelectorView = new View(context); - overlaySelectorView.setBackground(Theme.getSelectorDrawable(false)); - addView(overlaySelectorView, LayoutHelper.createFrame(LayoutHelper.MATCH_PARENT, LayoutHelper.MATCH_PARENT)); + if (useOverlaySelector) { + overlaySelectorView = new View(context); + overlaySelectorView.setBackground(Theme.getSelectorDrawable(false)); + addView(overlaySelectorView, LayoutHelper.createFrame(LayoutHelper.MATCH_PARENT, LayoutHelper.MATCH_PARENT)); + } } public void setUserReaction(TLRPC.User user, TLRPC.Chat chat, TLRPC.Reaction reaction, boolean like, long date, boolean dateIsSeen, boolean animated) { diff --git a/TMessagesProj/src/main/java/org/telegram/ui/Cells/StickerSetCell.java b/TMessagesProj/src/main/java/org/telegram/ui/Cells/StickerSetCell.java index 0c8e4dc5d..2c4d6a7c5 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/Cells/StickerSetCell.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/Cells/StickerSetCell.java @@ -149,7 +149,7 @@ public class StickerSetCell extends FrameLayout { removeButtonView.setOnClickListener(e -> onRemoveButtonClick()); sideButtons.addView(removeButtonView, LayoutHelper.createFrameRelatively(LayoutHelper.WRAP_CONTENT, 32, (LocaleController.isRTL ? Gravity.LEFT : Gravity.RIGHT) | Gravity.CENTER_VERTICAL, 0, -2, 0, 0)); - premiumButtonView = new PremiumButtonView(context, AndroidUtilities.dp(4), false); + premiumButtonView = new PremiumButtonView(context, AndroidUtilities.dp(4), false, resourcesProvider); premiumButtonView.setIcon(R.raw.unlock_icon); premiumButtonView.setButton(LocaleController.getString("Unlock", R.string.Unlock), e -> onPremiumButtonClick()); try { diff --git a/TMessagesProj/src/main/java/org/telegram/ui/ChannelBoostLayout.java b/TMessagesProj/src/main/java/org/telegram/ui/ChannelBoostLayout.java index d5753612d..9a3d3805c 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/ChannelBoostLayout.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/ChannelBoostLayout.java @@ -171,8 +171,9 @@ public class ChannelBoostLayout extends FrameLayout { StatisticActivity.OverviewCell overviewCell = (StatisticActivity.OverviewCell) holder.itemView; overviewCell.setData(0, Integer.toString(boostsStatus.level), null, LocaleController.getString("BoostsLevel2", R.string.BoostsLevel2)); - if (boostsStatus.premium_audience != null || boostsStatus.premium_audience.total == 0) { - overviewCell.setData(1, "~" + (int) boostsStatus.premium_audience.part, String.format(Locale.US, "%.1f", (float) boostsStatus.premium_audience.part / (float) boostsStatus.premium_audience.total) + "%", LocaleController.getString("PremiumSubscribers", R.string.PremiumSubscribers)); + if (boostsStatus.premium_audience != null && boostsStatus.premium_audience.total == 0) { + float percent = (((float) boostsStatus.premium_audience.part / (float) boostsStatus.premium_audience.total) * 100f); + overviewCell.setData(1, "~" + (int) boostsStatus.premium_audience.part, String.format(Locale.US, "%.1f",percent) + "%", LocaleController.getString("PremiumSubscribers", R.string.PremiumSubscribers)); } else { overviewCell.setData(1, "~0", "0%", LocaleController.getString("PremiumSubscribers", R.string.PremiumSubscribers)); } @@ -303,6 +304,7 @@ public class ChannelBoostLayout extends FrameLayout { usersLoading = false; if (response != null) { TLRPC.TL_stories_boostersList list = (TLRPC.TL_stories_boostersList) response; + MessagesController.getInstance(currentAccount).putUsers(list.users, false); boosters.addAll(list.boosters); hasNext = !TextUtils.isEmpty(list.next_offset) && boosters.size() < list.count; nextRemaining = list.count - boosters.size(); 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 d6a049106..70855e961 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/Components/BotWebViewSheet.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/Components/BotWebViewSheet.java @@ -959,14 +959,20 @@ public class BotWebViewSheet extends Dialog implements NotificationCenter.Notifi req.from_switch_webview = (flags & FLAG_FROM_INLINE_SWITCH) != 0; req.bot = MessagesController.getInstance(currentAccount).getInputUser(botId); req.platform = "android"; - req.from_side_menu = (flags & FLAG_FROM_SIDE_MENU) != 0;; + req.from_side_menu = (flags & FLAG_FROM_SIDE_MENU) != 0; if (hasThemeParams) { req.theme_params = new TLRPC.TL_dataJSON(); req.theme_params.data = themeParams; req.flags |= 1; } - req.flags |= 8; - req.url = buttonUrl; + if (!TextUtils.isEmpty(buttonUrl)) { + req.flags |= 8; + req.url = buttonUrl; + } + if (!TextUtils.isEmpty(startParam)) { + req.start_param = startParam; + req.flags |= 16; + } ConnectionsManager.getInstance(currentAccount).sendRequest(req, (response, error) -> AndroidUtilities.runOnUIThread(() -> { if (response instanceof TLRPC.TL_simpleWebViewResultUrl) { @@ -1058,7 +1064,7 @@ public class BotWebViewSheet extends Dialog implements NotificationCenter.Notifi return; } String botName = currentBot.short_name; - description = LocaleController.formatString("BotRemoveFromMenuAll", R.string.BotRemoveFromMenuAll, botName); + description = LocaleController.formatString("BotRemoveFromMenu", R.string.BotRemoveFromMenu, 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 c31e7cbc5..480ffb488 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/Components/ChatAttachAlert.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/Components/ChatAttachAlert.java @@ -2855,7 +2855,7 @@ public class ChatAttachAlert extends BottomSheet implements NotificationCenter.N break; } } - description = LocaleController.formatString("BotRemoveFromMenuAll", R.string.BotRemoveFromMenuAll, botName); + description = LocaleController.formatString("BotRemoveFromMenu", R.string.BotRemoveFromMenu, 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/ChatAttachAlertPhotoLayout.java b/TMessagesProj/src/main/java/org/telegram/ui/Components/ChatAttachAlertPhotoLayout.java index df79fe294..1f3e7eb30 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/Components/ChatAttachAlertPhotoLayout.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/Components/ChatAttachAlertPhotoLayout.java @@ -166,6 +166,8 @@ public class ChatAttachAlertPhotoLayout extends ChatAttachAlert.AttachAlertLayou private ZoomControlView zoomControlView; private AnimatorSet zoomControlAnimation; private Runnable zoomControlHideRunnable; + private Runnable afterCameraInitRunnable; + private Boolean isCameraFrontfaceBeforeEnteringEditMode = null; private TextView counterTextView; private TextView tooltipTextView; private ImageView switchCameraButton; @@ -359,7 +361,12 @@ public class ChatAttachAlertPhotoLayout extends ChatAttachAlert.AttachAlertLayou resumeCameraPreview(); AndroidUtilities.runOnUIThread(()-> setCurrentSpoilerVisible(-1, true), 150); } - + + @Override + public void onEditModeChanged(boolean isEditMode) { + onPhotoEditModeChanged(isEditMode); + } + @Override public PhotoViewer.PlaceProviderObject getPlaceForPhoto(MessageObject messageObject, TLRPC.FileLocation fileLocation, int index, boolean needPreview) { PhotoAttachPhotoCell cell = getCellForIndex(index); @@ -1753,6 +1760,20 @@ public class ChatAttachAlertPhotoLayout extends ChatAttachAlert.AttachAlertLayou } PhotoViewer.getInstance().openPhotoForSelect(arrayList, index, type, false, new BasePhotoProvider() { + @Override + public void onOpen() { + pauseCameraPreview(); + } + + @Override + public void onClose() { + resumeCameraPreview(); + } + + public void onEditModeChanged(boolean isEditMode) { + onPhotoEditModeChanged(isEditMode); + } + @Override public ImageReceiver.BitmapHolder getThumbForPhoto(MessageObject messageObject, TLRPC.FileLocation fileLocation, int index) { return null; @@ -2155,7 +2176,7 @@ public class ChatAttachAlertPhotoLayout extends ChatAttachAlert.AttachAlertLayou } if (cameraView == null) { final boolean lazy = !LiteMode.isEnabled(LiteMode.FLAGS_CHAT); - cameraView = new CameraView(getContext(), parentAlert.openWithFrontFaceCamera, lazy) { + cameraView = new CameraView(getContext(), isCameraFrontfaceBeforeEnteringEditMode != null ? isCameraFrontfaceBeforeEnteringEditMode : parentAlert.openWithFrontFaceCamera, lazy) { Bulletin.Delegate bulletinDelegate = new Bulletin.Delegate() { @Override @@ -2279,6 +2300,9 @@ public class ChatAttachAlertPhotoLayout extends ChatAttachAlert.AttachAlertLayou }); cameraInitAnimation.start(); } + if (afterCameraInitRunnable != null) { + afterCameraInitRunnable.run(); + } } }); @@ -2324,17 +2348,23 @@ public class ChatAttachAlertPhotoLayout extends ChatAttachAlert.AttachAlertLayou cameraView.setVisibility(GONE); cameraIcon.setVisibility(GONE); } - checkCameraViewPosition(); + if (cameraOpened) { + cameraIcon.setAlpha(0f); + } else { + checkCameraViewPosition(); + } invalidate(); } if (zoomControlView != null) { zoomControlView.setZoom(0.0f, false); cameraZoom = 0.0f; } - cameraView.setTranslationX(cameraViewLocation[0]); - cameraView.setTranslationY(cameraViewLocation[1] + currentPanTranslationY); - cameraIcon.setTranslationX(cameraViewLocation[0]); - cameraIcon.setTranslationY(cameraViewLocation[1] + cameraViewOffsetY + currentPanTranslationY); + if (!cameraOpened) { + cameraView.setTranslationX(cameraViewLocation[0]); + cameraView.setTranslationY(cameraViewLocation[1] + currentPanTranslationY); + cameraIcon.setTranslationX(cameraViewLocation[0]); + cameraIcon.setTranslationY(cameraViewLocation[1] + cameraViewOffsetY + currentPanTranslationY); + } } public void hideCamera(boolean async) { @@ -3488,6 +3518,24 @@ public class ChatAttachAlertPhotoLayout extends ChatAttachAlert.AttachAlertLayou } } + private void onPhotoEditModeChanged(boolean isEditMode) { + if (needCamera && !noCameraPermissions) { + if (isEditMode) { + if (cameraView != null) { + isCameraFrontfaceBeforeEnteringEditMode = cameraView.isFrontface(); + hideCamera(true); + } + } else { + afterCameraInitRunnable = () -> { + pauseCameraPreview(); + afterCameraInitRunnable = null; + isCameraFrontfaceBeforeEnteringEditMode = null; + }; + showCamera(); + } + } + } + @Override void onHidden() { if (cameraView != null) { 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 16cbad5a7..b3f396c50 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/Components/EmojiPacksAlert.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/Components/EmojiPacksAlert.java @@ -514,7 +514,7 @@ public class EmojiPacksAlert extends BottomSheet implements NotificationCenter.N removeButtonView.setClickable(true); buttonsView.addView(removeButtonView, LayoutHelper.createFrame(LayoutHelper.MATCH_PARENT, LayoutHelper.MATCH_PARENT, Gravity.BOTTOM, 0, 0, 0, 19)); - premiumButtonView = new PremiumButtonView(context, false); + premiumButtonView = new PremiumButtonView(context, false, resourcesProvider); premiumButtonView.setButton(LocaleController.getString("UnlockPremiumEmoji", R.string.UnlockPremiumEmoji), ev -> { showPremiumAlert(); }); @@ -1560,7 +1560,7 @@ public class EmojiPacksAlert extends BottomSheet implements NotificationCenter.N float endMarginDp = 8; if (!single) { if (!UserConfig.getInstance(currentAccount).isPremium()) { - unlockButtonView = new PremiumButtonView(context, AndroidUtilities.dp(4), false); + unlockButtonView = new PremiumButtonView(context, AndroidUtilities.dp(4), false, resourcesProvider); unlockButtonView.setButton(LocaleController.getString("Unlock", R.string.Unlock), ev -> { premiumButtonClicked = SystemClock.elapsedRealtime(); showPremiumAlert(); 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 b13678b7e..34c2a3321 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/Components/EmojiView.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/Components/EmojiView.java @@ -3493,7 +3493,7 @@ public class EmojiView extends FrameLayout implements NotificationCenter.Notific addButtonView.addView(addButtonTextView, LayoutHelper.createFrame(LayoutHelper.MATCH_PARENT, LayoutHelper.WRAP_CONTENT, Gravity.CENTER)); addView(addButtonView, LayoutHelper.createFrame(LayoutHelper.MATCH_PARENT, LayoutHelper.MATCH_PARENT)); - premiumButtonView = new PremiumButtonView(getContext(), false); + premiumButtonView = new PremiumButtonView(getContext(), false, resourcesProvider); premiumButtonView.setIcon(R.raw.unlock_icon); addView(premiumButtonView, LayoutHelper.createFrame(LayoutHelper.MATCH_PARENT, LayoutHelper.MATCH_PARENT)); } @@ -3736,7 +3736,7 @@ public class EmojiView extends FrameLayout implements NotificationCenter.Notific }); buttonsView.addView(removeButtonView, LayoutHelper.createFrameRelatively(LayoutHelper.WRAP_CONTENT, 26, Gravity.END | Gravity.TOP)); - premiumButtonView = new PremiumButtonView(context, AndroidUtilities.dp(16), false); + premiumButtonView = new PremiumButtonView(context, AndroidUtilities.dp(16), false, resourcesProvider); premiumButtonView.setIcon(R.raw.unlock_icon); premiumButtonView.setButton(LocaleController.getString("Unlock", R.string.Unlock), e -> openPremiumAnimatedEmojiFeature()); diff --git a/TMessagesProj/src/main/java/org/telegram/ui/Components/Paint/Brush.java b/TMessagesProj/src/main/java/org/telegram/ui/Components/Paint/Brush.java index 1bcca0c18..f25bcbe6a 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/Components/Paint/Brush.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/Components/Paint/Brush.java @@ -86,12 +86,21 @@ public abstract class Brush { return 0; } + public int getDefaultColor() { + return PersistColorPalette.COLOR_BLACK; + } + public static class Radial extends Brush { @Override public int getIconRes() { return R.raw.photo_pen; } + + @Override + public int getDefaultColor() { + return PersistColorPalette.COLOR_RED; + } } public static class Elliptical extends Brush { @@ -140,6 +149,11 @@ public abstract class Brush { public float getDefaultWeight() { return 0.5f; } + + @Override + public int getDefaultColor() { + return PersistColorPalette.COLOR_YELLOW; + } } public static class Neon extends Brush { @@ -191,6 +205,11 @@ public abstract class Brush { public float getDefaultWeight() { return 0.5f; } + + @Override + public int getDefaultColor() { + return PersistColorPalette.COLOR_GREEN; + } } public static class Arrow extends Brush { @@ -209,6 +228,11 @@ public abstract class Brush { public float getDefaultWeight() { return 0.25f; } + + @Override + public int getDefaultColor() { + return PersistColorPalette.COLOR_ORANGE; + } } public static class Eraser extends Brush { diff --git a/TMessagesProj/src/main/java/org/telegram/ui/Components/Paint/Input.java b/TMessagesProj/src/main/java/org/telegram/ui/Components/Paint/Input.java index e4c1c3629..901462234 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/Components/Paint/Input.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/Components/Paint/Input.java @@ -185,6 +185,9 @@ public class Input { long dt = System.currentTimeMillis() - lastVelocityUpdate; velocity = MathUtils.clamp(velocity - dt / 125f, 0.6f, 1f); + if (renderView.getCurrentBrush() != null && renderView.getCurrentBrush() instanceof Brush.Arrow) { + velocity = 1 - velocity; + } lastScale = scale; lastVelocityUpdate = System.currentTimeMillis(); @@ -195,7 +198,7 @@ public class Input { stylusToolPressed = (event.getButtonState() & MotionEvent.BUTTON_STYLUS_PRIMARY) == MotionEvent.BUTTON_STYLUS_PRIMARY; } if (renderView.getCurrentBrush() != null) { - weight = 1 + (weight - 1) * AndroidUtilities.lerp(1, renderView.getCurrentBrush().getSmoothThicknessRate(), MathUtils.clamp(realPointsCount / 16f, 0, 1)); + weight = 1 + (weight - 1) * AndroidUtilities.lerp(renderView.getCurrentBrush().getSmoothThicknessRate(), 1, MathUtils.clamp(realPointsCount / 16f, 0, 1)); } Point location = new Point(tempPoint[0], tempPoint[1], weight); @@ -299,7 +302,7 @@ public class Input { float angle = lastAngle; final Point loc = points[pointsCount - 1]; double z = lastThickLocation == null ? location.z : lastThickLocation.z; - float arrowLength = renderView.getCurrentWeight() * (float) z * 4.5f; + float arrowLength = renderView.getCurrentWeight() * (float) z * 12f; commit = false; if (arrowAnimator != null) { @@ -311,13 +314,17 @@ public class Input { arrowAnimator.addUpdateListener(anm -> { float t = (float) anm.getAnimatedValue(); + double leftCos = Math.cos(angle - Math.PI / 4 * 3.3); + double leftSin = Math.sin(angle - Math.PI / 4 * 3.5); paintPath(new Path(new Point[]{ - new Point(loc.x + Math.cos(angle - Math.PI / 4 * 3) * arrowLength * lastT[0], loc.y + Math.sin(angle - Math.PI / 4 * 3.2) * arrowLength * lastT[0], z), - new Point(loc.x + Math.cos(angle - Math.PI / 4 * 3) * arrowLength * t, loc.y + Math.sin(angle - Math.PI / 4 * 3.2) * arrowLength * t, z, true) + new Point(loc.x + leftCos * arrowLength * lastT[0], loc.y + leftSin * arrowLength * lastT[0], z), + new Point(loc.x + leftCos * arrowLength * t, loc.y + leftSin * arrowLength * t, z, true) })); + double rightCos = Math.cos(angle + Math.PI / 4 * 3.3); + double rightSin = Math.sin(angle + Math.PI / 4 * 3.5); paintPath(new Path(new Point[]{ - new Point(loc.x + Math.cos(angle + Math.PI / 4 * 3) * arrowLength * lastT[0], loc.y + Math.sin(angle + Math.PI / 4 * 3.2) * arrowLength * lastT[0], z), - new Point(loc.x + Math.cos(angle + Math.PI / 4 * 3) * arrowLength * t, loc.y + Math.sin(angle + Math.PI / 4 * 3.2) * arrowLength * t, z, true) + new Point(loc.x + rightCos * arrowLength * lastT[0], loc.y + rightSin * arrowLength * lastT[0], z), + new Point(loc.x + rightCos * arrowLength * t, loc.y + rightSin * arrowLength * t, z, true) })); if (!vibrated[0] && t > .4f) { @@ -467,7 +474,7 @@ public class Input { double x = midPoint1.x * minus_t_squard + 2 * prev1.x * t * (1 - t) + midPoint2.x * t_squared; double y = midPoint1.y * minus_t_squard + 2 * prev1.y * t * (1 - t) + midPoint2.y * t_squared; double z = midPoint1.z * a1 + prev1.z * a2 + midPoint2.z * a3; - z = 1 + (z - 1) * AndroidUtilities.lerp(1, smoothThickness, MathUtils.clamp(realPointsCount / 16f, 0, 1)); + z = 1 + (z - 1) * AndroidUtilities.lerp(smoothThickness, 1, MathUtils.clamp(realPointsCount / 16f, 0, 1)); return new Point(x, y, z); } diff --git a/TMessagesProj/src/main/java/org/telegram/ui/Components/Paint/PersistColorPalette.java b/TMessagesProj/src/main/java/org/telegram/ui/Components/Paint/PersistColorPalette.java index 2dde2322e..a65223b18 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/Components/Paint/PersistColorPalette.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/Components/Paint/PersistColorPalette.java @@ -9,35 +9,53 @@ import org.telegram.ui.Components.Paint.Views.PaintTextOptionsView; import java.util.ArrayList; import java.util.Arrays; +import java.util.HashMap; import java.util.List; public class PersistColorPalette { - public final static int COLORS_COUNT = 14; - private final static List DEFAULT_COLORS = Arrays.asList( - 0xff000000, - 0xffFFFFFF, - 0xff1D99FF, - 0xff03BCD4, - 0xff39BA2B, - 0xffF9A30F, - 0xffFA6E16, - 0xffE83544, - 0xffB24DFF, + public final static int COLOR_BLACK = 0xff000000; + public final static int COLOR_WHITE = 0xffffffff; + public final static int COLOR_RED = 0xffff453a; + public final static int COLOR_ORANGE = 0xffff8a00; + public final static int COLOR_YELLOW = 0xffffd60a; + public final static int COLOR_GREEN = 0xff34c759; + public final static int COLOR_LIGHT_BLUE = 0xff63e6e2; + public final static int COLOR_BLUE = 0xff0a84ff; + public final static int COLOR_VIOLET = 0xffbf5af2; + + private final static List DEFAULT_MODIFIABLE_COLORS = Arrays.asList( 0xffD7A07C, - 0xffAC734C, - 0xff90512C, - 0xff532E1F, - 0xff818181 + 0xff7faffe, + 0xffA58FDB, + 0xffDB95AE, + 0xffBADC9F ); - private final static Integer DEFAULT_MARKER_COLOR = 0xff0a84ff; + private final static List PRESET_COLORS = Arrays.asList( + COLOR_RED, + COLOR_ORANGE, + COLOR_YELLOW, + COLOR_GREEN, + COLOR_LIGHT_BLUE, + COLOR_BLUE, + COLOR_VIOLET, + COLOR_BLACK, + COLOR_WHITE + ); + + public final static int MODIFIABLE_COLORS_COUNT = DEFAULT_MODIFIABLE_COLORS.size(); + public final static int PRESET_COLORS_COUNT = PRESET_COLORS.size(); + public final static int COLORS_COUNT = MODIFIABLE_COLORS_COUNT + PRESET_COLORS_COUNT; + + private final static int BRUSH_TEXT = -1; private static PersistColorPalette[] instances = new PersistColorPalette[UserConfig.MAX_ACCOUNT_COUNT]; - private SharedPreferences mConfig; - private List colors = new ArrayList<>(COLORS_COUNT); + private final SharedPreferences mConfig; + private final List colors = new ArrayList<>(COLORS_COUNT); + private final HashMap brushColor = new HashMap<>(Brush.BRUSHES_LIST.size()); private List pendingChange = new ArrayList<>(COLORS_COUNT); - private Integer markerColor; + private boolean needSaveBrushColor; private int currentBrush; private int currentAlignment; @@ -45,6 +63,7 @@ public class PersistColorPalette { private float currentWeight; private String currentTypeface; private boolean fillShapes; + private boolean inTextMode; public PersistColorPalette(int currentUser) { mConfig = ApplicationLoader.applicationContext.getSharedPreferences("photo_color_palette_" + currentUser, Context.MODE_PRIVATE); @@ -74,6 +93,17 @@ public class PersistColorPalette { mConfig.edit().putInt("text_type", currentTextType).apply(); } + public void setInTextMode(boolean inTextMode) { + if (this.inTextMode != inTextMode) { + this.inTextMode = inTextMode; + if (inTextMode) { + setCurrentBrush(BRUSH_TEXT, false); + } else { + setCurrentBrush(mConfig.getInt("brush", 0), false); + } + } + } + public int getCurrentAlignment() { return currentAlignment; } @@ -114,8 +144,20 @@ public class PersistColorPalette { } public void setCurrentBrush(int currentBrush) { + setCurrentBrush(currentBrush, true); + } + + public void setCurrentBrush(int currentBrush, boolean saveBrush) { this.currentBrush = currentBrush; - mConfig.edit().putInt("brush", currentBrush).apply(); + if (saveBrush) { + mConfig.edit().putInt("brush", currentBrush).apply(); + } + + Integer color = brushColor.get(currentBrush); + if (color != null) { + selectColor(color, false); + saveColors(); + } } public boolean getFillShapes() { @@ -129,7 +171,15 @@ public class PersistColorPalette { public void cleanup() { pendingChange.clear(); - pendingChange.addAll(DEFAULT_COLORS); + pendingChange.addAll(DEFAULT_MODIFIABLE_COLORS); + SharedPreferences.Editor editor = mConfig.edit(); + for (int i = 0; i < Brush.BRUSHES_LIST.size(); i++) { + editor.remove("brush_color_" + i); + } + editor.remove("brush_color_" + BRUSH_TEXT); + brushColor.clear(); + editor.apply(); + saveColors(); } @@ -141,76 +191,123 @@ public class PersistColorPalette { public int getColor(int index) { checkIndex(index); - if (index < 0 || index >= colors.size()) { - if (index >= 0 && index < DEFAULT_COLORS.size()) { - return DEFAULT_COLORS.get(index); + List allColors = getAllColors(); + if (index >= allColors.size()) { + if (index < PRESET_COLORS_COUNT) { + return PRESET_COLORS.get(index); + } else { + return DEFAULT_MODIFIABLE_COLORS.get(index - PRESET_COLORS_COUNT); } - return DEFAULT_COLORS.get(0); } - return colors.get(index); + return allColors.get(index); + } + + public int getCurrentColor() { + Integer currentColor = brushColor.get(currentBrush); + if (currentColor == null) { + currentColor = (int) mConfig.getLong("brush_color_" + currentBrush, currentBrush == BRUSH_TEXT ? COLOR_WHITE : Brush.BRUSHES_LIST.get(currentBrush).getDefaultColor()); + brushColor.put(currentBrush, currentColor); + } + return currentColor; + } + + public int getCurrentColorPosition() { + int currentColor = getCurrentColor(); + List allColors = getAllColors(); + for (int i = 0; i < allColors.size(); i++) { + if (allColors.get(i) == currentColor) { + return i; + } + } + return 0; + } + + private List getAllColors() { + List allColors = new ArrayList<>(PRESET_COLORS); + allColors.addAll(colors); + return allColors; } public void selectColor(int color) { - int i = colors.indexOf(color); + selectColor(color, true); + } + + public void selectColor(int color, boolean updateBrush) { + List allColors = getAllColors(); + int i = allColors.indexOf(color); if (i != -1) { - selectColorIndex(i); + if (updateBrush) { + setCurrentBrushColorByColorIndex(i); + } } else { List from = new ArrayList<>(pendingChange.isEmpty() ? colors : pendingChange); - pendingChange.clear(); pendingChange.add(color); - pendingChange.addAll(from); - if (pendingChange.size() < DEFAULT_COLORS.size()) { - for (int j = pendingChange.size(); j < DEFAULT_COLORS.size(); ++j) { - pendingChange.add(DEFAULT_COLORS.get(j)); + + for (int j = 0; j < from.size() - 1; j++) { + pendingChange.add(from.get(j)); + } + + if (pendingChange.size() < DEFAULT_MODIFIABLE_COLORS.size()) { + for (int j = pendingChange.size(); j < DEFAULT_MODIFIABLE_COLORS.size(); ++j) { + pendingChange.add(DEFAULT_MODIFIABLE_COLORS.get(j)); } - } else if (pendingChange.size() > DEFAULT_COLORS.size()) { - pendingChange = pendingChange.subList(0, DEFAULT_COLORS.size()); + } else if (pendingChange.size() > DEFAULT_MODIFIABLE_COLORS.size()) { + pendingChange = pendingChange.subList(0, DEFAULT_MODIFIABLE_COLORS.size()); + } + if (updateBrush) { + brushColor.put(currentBrush, color); + needSaveBrushColor = true; } } } - public void selectColorIndex(int index) { - int color = index < 0 || index >= colors.size() ? DEFAULT_COLORS.get(index) : colors.get(index); - List from = new ArrayList<>(pendingChange.isEmpty() ? colors : pendingChange); - pendingChange.clear(); - pendingChange.add(color); - for (int i = 0; i < COLORS_COUNT; i++) { - if (i >= from.size()) { - pendingChange.add(DEFAULT_COLORS.get(i)); - } else if (from.get(i) != color) { - pendingChange.add(from.get(i)); - } - } - if (pendingChange.size() < DEFAULT_COLORS.size()) { - for (int j = pendingChange.size(); j < DEFAULT_COLORS.size(); ++j) { - pendingChange.add(DEFAULT_COLORS.get(j)); - } - } else if (pendingChange.size() > DEFAULT_COLORS.size()) { - pendingChange = pendingChange.subList(0, DEFAULT_COLORS.size()); - } + public void setCurrentBrushColorByColorIndex(int index) { + int color = getColor(index); + brushColor.put(currentBrush, color); + needSaveBrushColor = true; } private void loadColors() { - for (int i = 0; i < COLORS_COUNT; i++) { - colors.add((int) mConfig.getLong("color_" + i, DEFAULT_COLORS.get(i))); + for (int i = 0; i < MODIFIABLE_COLORS_COUNT; i++) { + colors.add((int) mConfig.getLong("color_" + i, DEFAULT_MODIFIABLE_COLORS.get(i))); } - markerColor = (int) mConfig.getLong("color_marker", DEFAULT_MARKER_COLOR); + + for (int i = 0; i < Brush.BRUSHES_LIST.size(); i++) { + int color = (int) mConfig.getLong("brush_color_" + i, Brush.BRUSHES_LIST.get(i).getDefaultColor()); + brushColor.put(i, color); + } + + int color = (int) mConfig.getLong("brush_color_" + BRUSH_TEXT, COLOR_WHITE); + brushColor.put(BRUSH_TEXT, color); + } + + public void resetCurrentColor() { + setCurrentBrush(0); } public void saveColors() { - if (pendingChange.isEmpty()) { + if (pendingChange.isEmpty() && !needSaveBrushColor) { return; } - SharedPreferences.Editor editor = mConfig.edit(); - for (int i = 0; i < COLORS_COUNT; i++) { - editor.putLong("color_" + i, i < pendingChange.size() ? pendingChange.get(i) : (long) DEFAULT_COLORS.get(i)); + if (!pendingChange.isEmpty()) { + for (int i = 0; i < MODIFIABLE_COLORS_COUNT; i++) { + editor.putLong("color_" + i, i < pendingChange.size() ? pendingChange.get(i) : (long) DEFAULT_MODIFIABLE_COLORS.get(i)); + } + + colors.clear(); + colors.addAll(pendingChange); + pendingChange.clear(); + } + + if (needSaveBrushColor) { + Integer currentBrushColor = brushColor.get(currentBrush); + if (currentBrushColor != null) { + editor.putLong("brush_color_" + currentBrush, currentBrushColor); + } + needSaveBrushColor = false; } editor.apply(); - - colors.clear(); - colors.addAll(pendingChange); - pendingChange.clear(); } -} +} \ No newline at end of file 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 baa8a146f..326860c0a 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 @@ -269,7 +269,8 @@ public class LPhotoPaintView extends SizeNotifierFrameLayoutPhoto implements IPh inBubbleMode = context instanceof BubbleActivity; PersistColorPalette palette = PersistColorPalette.getInstance(currentAccount); - colorSwatch.color = palette.getColor(0); + palette.resetCurrentColor(); + colorSwatch.color = palette.getCurrentColor(); colorSwatch.brushWeight = palette.getCurrentWeight(); queue = new DispatchQueue("Paint"); @@ -664,6 +665,7 @@ public class LPhotoPaintView extends SizeNotifierFrameLayoutPhoto implements IPh int childWidth = child.getWidth() - child.getPaddingLeft() - child.getPaddingRight(); int childHeight = child.getHeight() - child.getPaddingTop() - child.getPaddingBottom(); float cx = child.getX() + child.getPaddingLeft() + childWidth / 2f, cy = child.getY() + child.getPaddingTop() + childHeight / 2f; + int colorCircle = colorSwatch.color; if (tabsNewSelectedIndex != -1) { ViewGroup barView2 = (ViewGroup) getBarView(tabsNewSelectedIndex); View newView = (barView2 == null ? barView : barView2).getChildAt(0); @@ -677,6 +679,8 @@ public class LPhotoPaintView extends SizeNotifierFrameLayoutPhoto implements IPh View animateToView = colorsListView.getChildAt(0); cx = AndroidUtilities.lerp(cx, colorsListView.getX() - barView.getLeft() + animateToView.getX() + animateToView.getWidth() / 2f, toolsTransformProgress); cy = AndroidUtilities.lerp(cy, colorsListView.getY() - barView.getTop() + animateToView.getY() + animateToView.getHeight() / 2f, toolsTransformProgress); + int paletteFirstColor = palette.getColor(0); + colorCircle = ColorUtils.blendARGB(colorSwatch.color, paletteFirstColor, toolsTransformProgress); } checkRainbow(cx, cy); @@ -688,16 +692,21 @@ public class LPhotoPaintView extends SizeNotifierFrameLayoutPhoto implements IPh AndroidUtilities.rectTmp.set(cx - rad, cy - rad, cx + rad, cy + rad); canvas.drawArc(AndroidUtilities.rectTmp, 0, 360, false, colorPickerRainbowPaint); - colorSwatchPaint.setColor(colorSwatch.color); + colorSwatchPaint.setColor(colorCircle); colorSwatchPaint.setAlpha((int) (colorSwatchPaint.getAlpha() * child.getAlpha())); - colorSwatchOutlinePaint.setColor(colorSwatch.color); + colorSwatchOutlinePaint.setColor(colorCircle); colorSwatchOutlinePaint.setAlpha((int) (0xFF * child.getAlpha())); float rad2 = rad - AndroidUtilities.dp(3f); + if (colorsListView != null && colorsListView.getSelectedColorIndex() != 0) { + rad2 = AndroidUtilities.lerp(rad - AndroidUtilities.dp(3f), rad + AndroidUtilities.dp(2), toolsTransformProgress); + } PaintColorsListView.drawColorCircle(canvas, cx, cy, rad2, colorSwatchPaint.getColor()); - colorSwatchOutlinePaint.setAlpha((int) (colorSwatchOutlinePaint.getAlpha() * toolsTransformProgress * child.getAlpha())); - canvas.drawCircle(cx, cy, rad - (AndroidUtilities.dp(3f) + colorSwatchOutlinePaint.getStrokeWidth()) * (1f - toolsTransformProgress), colorSwatchOutlinePaint); + if (colorsListView != null && colorsListView.getSelectedColorIndex() == 0) { + colorSwatchOutlinePaint.setAlpha((int) (colorSwatchOutlinePaint.getAlpha() * toolsTransformProgress * child.getAlpha())); + canvas.drawCircle(cx, cy, rad - (AndroidUtilities.dp(3f) + colorSwatchOutlinePaint.getStrokeWidth()) * (1f - toolsTransformProgress), colorSwatchOutlinePaint); + } } canvas.restore(); @@ -867,16 +876,18 @@ public class LPhotoPaintView extends SizeNotifierFrameLayoutPhoto implements IPh @Override public void onColorSelected(int color) { showColorList(false); + palette.selectColor(color); + palette.saveColors(); - PersistColorPalette.getInstance(currentAccount).selectColor(color); - PersistColorPalette.getInstance(currentAccount).saveColors(); setNewColor(color); + colorsListView.setSelectedColorIndex(palette.getCurrentColorPosition()); colorsListView.getAdapter().notifyDataSetChanged(); } }).setColorListener(color -> { - PersistColorPalette.getInstance(currentAccount).selectColor(color); - PersistColorPalette.getInstance(currentAccount).saveColors(); + palette.selectColor(color); + palette.saveColors(); setNewColor(color); + colorsListView.setSelectedColorIndex(palette.getCurrentColorPosition()); colorsListView.getAdapter().notifyDataSetChanged(); }).show(); return; @@ -1275,6 +1286,10 @@ public class LPhotoPaintView extends SizeNotifierFrameLayoutPhoto implements IPh tabsNewSelectedIndex = index; final View newView = getBarView(tabsNewSelectedIndex); + PersistColorPalette.getInstance(currentAccount).setInTextMode(index == 2); + colorSwatch.color = PersistColorPalette.getInstance(currentAccount).getCurrentColor(); + setCurrentSwatch(colorSwatch, true); + tabsSelectionAnimator = ValueAnimator.ofFloat(0, 1).setDuration(300); tabsSelectionAnimator.setInterpolator(CubicBezierInterpolator.DEFAULT); tabsSelectionAnimator.addUpdateListener(animation -> { @@ -2028,8 +2043,10 @@ public class LPhotoPaintView extends SizeNotifierFrameLayoutPhoto implements IPh ignoreToolChangeAnimationOnce = true; } renderView.setBrush(brush); + int wasColor = colorSwatch.color; + colorSwatch.color = PersistColorPalette.getInstance(currentAccount).getCurrentColor(); colorSwatch.brushWeight = weightDefaultValueOverride.get(); - setCurrentSwatch(colorSwatch, true); + setCurrentSwatch(colorSwatch, true, wasColor); renderInputView.invalidate(); } @@ -2141,12 +2158,16 @@ public class LPhotoPaintView extends SizeNotifierFrameLayoutPhoto implements IPh if (show) { colorsListView.setVisibility(VISIBLE); - colorsListView.setSelectedColorIndex(0); + colorsListView.setSelectedColorIndex(PersistColorPalette.getInstance(currentAccount).getCurrentColorPosition()); } } } private void setCurrentSwatch(Swatch swatch, boolean updateInterface) { + setCurrentSwatch(swatch, updateInterface, null); + } + + private void setCurrentSwatch(Swatch swatch, boolean updateInterface, Integer prevColor) { if (colorSwatch != swatch) { colorSwatch.color = swatch.color; colorSwatch.colorLocation = swatch.colorLocation; @@ -2160,7 +2181,18 @@ public class LPhotoPaintView extends SizeNotifierFrameLayoutPhoto implements IPh renderView.setBrushSize(swatch.brushWeight); if (updateInterface) { - if (bottomLayout != null) { + int newColor = colorSwatch.color; + if (prevColor != null && prevColor != newColor) { + ValueAnimator animator = ValueAnimator.ofFloat(0f, 1f).setDuration(150); + animator.addUpdateListener(animation -> { + float val = (float) animation.getAnimatedValue(); + colorSwatch.color = ColorUtils.blendARGB(prevColor, newColor, val); + if (bottomLayout != null) { + bottomLayout.invalidate(); + } + }); + animator.start(); + } else if (bottomLayout != null) { bottomLayout.invalidate(); } } diff --git a/TMessagesProj/src/main/java/org/telegram/ui/Components/Paint/Views/PaintColorsListView.java b/TMessagesProj/src/main/java/org/telegram/ui/Components/Paint/Views/PaintColorsListView.java index d7046471f..f3c8c0e65 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/Components/Paint/Views/PaintColorsListView.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/Components/Paint/Views/PaintColorsListView.java @@ -25,7 +25,7 @@ public class PaintColorsListView extends RecyclerListView { private Paint paint = new Paint(Paint.ANTI_ALIAS_FLAG); private Paint outlinePaint = new Paint(Paint.ANTI_ALIAS_FLAG); - private int selectedColorIndex = 0; + private int selectedColorIndex = -1; private PersistColorPalette colorPalette; private Consumer colorListener; @@ -69,7 +69,7 @@ public class PaintColorsListView extends RecyclerListView { setOverScrollMode(OVER_SCROLL_NEVER); setOnItemClickListener((view, position) -> { colorListener.accept(colorPalette.getColor(position)); - colorPalette.selectColorIndex(position); + colorPalette.setCurrentBrushColorByColorIndex(position); }); } @@ -129,6 +129,10 @@ public class PaintColorsListView extends RecyclerListView { getAdapter().notifyDataSetChanged(); } + public int getSelectedColorIndex() { + return selectedColorIndex; + } + public void setProgress(float progress, boolean toShow) { if (toShow) { progress = CubicBezierInterpolator.EASE_OUT.getInterpolation(progress); diff --git a/TMessagesProj/src/main/java/org/telegram/ui/Components/Paint/Views/PaintToolsView.java b/TMessagesProj/src/main/java/org/telegram/ui/Components/Paint/Views/PaintToolsView.java index ddfdecda9..7767d540d 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/Components/Paint/Views/PaintToolsView.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/Components/Paint/Views/PaintToolsView.java @@ -62,8 +62,8 @@ public class PaintToolsView extends LinearLayout { buttons[a].setAnimation(brush.getIconRes(), 28, 28); buttons[a].setOnClickListener(v -> { animateNextIndex(finalI); - delegate.onBrushSelected(brush); delegate.onGetPalette().setCurrentBrush(finalI - 1); + delegate.onBrushSelected(brush); }); } else if (i == Brush.BRUSHES_LIST.size() + 1) { buttons[a].setImageResource(R.drawable.msg_add); 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 df2e23f75..96b90672f 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/Components/PhotoFilterView.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/Components/PhotoFilterView.java @@ -725,7 +725,6 @@ 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/Components/Premium/DoubledLimitsBottomSheet.java b/TMessagesProj/src/main/java/org/telegram/ui/Components/Premium/DoubledLimitsBottomSheet.java index a3ad0a45e..ba68888ad 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/Components/Premium/DoubledLimitsBottomSheet.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/Components/Premium/DoubledLimitsBottomSheet.java @@ -85,7 +85,7 @@ public class DoubledLimitsBottomSheet extends BottomSheetWithRecyclerListView im divider.setBackgroundColor(Theme.getColor(Theme.key_dialogBackground, resourcesProvider)); containerView.addView(divider, LayoutHelper.createFrame(LayoutHelper.MATCH_PARENT, 72, Gravity.BOTTOM, 0, 0, 0, 0)); - premiumButtonView = new PremiumButtonView(getContext(), true); + premiumButtonView = new PremiumButtonView(getContext(), true, resourcesProvider); premiumButtonView.buttonTextView.setText(PremiumPreviewFragment.getPremiumButtonText(currentAccount, selectedTier)); containerView.addView(premiumButtonView, LayoutHelper.createFrame(LayoutHelper.MATCH_PARENT, 48, Gravity.BOTTOM, 16, 0, 16, 12)); diff --git a/TMessagesProj/src/main/java/org/telegram/ui/Components/Premium/GiftPremiumBottomSheet.java b/TMessagesProj/src/main/java/org/telegram/ui/Components/Premium/GiftPremiumBottomSheet.java index 048731994..3b64852b5 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/Components/Premium/GiftPremiumBottomSheet.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/Components/Premium/GiftPremiumBottomSheet.java @@ -336,7 +336,7 @@ public class GiftPremiumBottomSheet extends BottomSheetWithRecyclerListView impl public void onViewCreated(FrameLayout containerView) { super.onViewCreated(containerView); - premiumButtonView = new PremiumButtonView(getContext(), true); + premiumButtonView = new PremiumButtonView(getContext(), true, resourcesProvider); FrameLayout buttonContainer = new FrameLayout(getContext()); buttonContainer.addView(premiumButtonView, LayoutHelper.createFrame(LayoutHelper.MATCH_PARENT, 48, Gravity.CENTER_VERTICAL, 16, 0, 16, 0)); diff --git a/TMessagesProj/src/main/java/org/telegram/ui/Components/Premium/LimitPreviewView.java b/TMessagesProj/src/main/java/org/telegram/ui/Components/Premium/LimitPreviewView.java index 57e03ac11..a7546d2ee 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/Components/Premium/LimitPreviewView.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/Components/Premium/LimitPreviewView.java @@ -463,6 +463,7 @@ public class LimitPreviewView extends LinearLayout { defaultText.setText(LocaleController.formatString("BoostsLevel", R.string.BoostsLevel, boosts.level)); premiumCount.setText(LocaleController.formatString("BoostsLevel", R.string.BoostsLevel, boosts.level + 1)); } + ((FrameLayout.LayoutParams) premiumCount.getLayoutParams()).gravity = Gravity.RIGHT; setType(LimitReachedBottomSheet.TYPE_BOOSTS); defaultCount.setVisibility(View.GONE); premiumText.setVisibility(View.GONE); diff --git a/TMessagesProj/src/main/java/org/telegram/ui/Components/Premium/LimitReachedBottomSheet.java b/TMessagesProj/src/main/java/org/telegram/ui/Components/Premium/LimitReachedBottomSheet.java index 15f1d744e..a486a551a 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/Components/Premium/LimitReachedBottomSheet.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/Components/Premium/LimitReachedBottomSheet.java @@ -192,7 +192,7 @@ public class LimitReachedBottomSheet extends BottomSheetWithRecyclerListView { super.onViewCreated(containerView); Context context = containerView.getContext(); - premiumButtonView = new PremiumButtonView(context, true); + premiumButtonView = new PremiumButtonView(context, true, resourcesProvider); if (!hasFixedSize) { divider = new View(context) { @@ -820,10 +820,18 @@ public class LimitReachedBottomSheet extends BottomSheetWithRecyclerListView { if (type == TYPE_BOOSTS_FOR_USERS) { descriptionStr = getBoostsDescriptionString(); } else if (type == TYPE_BOOSTS_FOR_POSTING) { - descriptionStr = LocaleController.formatString( - "ChannelNeedBoostsDescription", R.string.ChannelNeedBoostsDescription, - LocaleController.formatPluralString("MoreBoosts", boostsStatus.next_level_boosts, boostsStatus.next_level_boosts) - ); + if (boostsStatus.level == 0) { + descriptionStr = LocaleController.formatString( + "ChannelNeedBoostsDescription", R.string.ChannelNeedBoostsDescription, + LocaleController.formatPluralString("MoreBoosts", boostsStatus.next_level_boosts, boostsStatus.next_level_boosts) + ); + } else { + descriptionStr = LocaleController.formatString( + "ChannelNeedBoostsDescriptionNextLevel", R.string.ChannelNeedBoostsDescriptionNextLevel, + LocaleController.formatPluralString("MoreBoosts", boostsStatus.next_level_boosts, boostsStatus.next_level_boosts), + LocaleController.formatPluralString("BoostStories", boostsStatus.level) + ); + } } else if (type == TYPE_ADD_MEMBERS_RESTRICTED) { premiumLocked = true; if (!canSendLink) { @@ -944,7 +952,11 @@ public class LimitReachedBottomSheet extends BottomSheetWithRecyclerListView { if (type == TYPE_BOOSTS_FOR_USERS) { title.setText(getBoostsTitleString()); } else if (type == TYPE_BOOSTS_FOR_POSTING) { - title.setText(LocaleController.getString("BoostingEnableStories", R.string.BoostingEnableStories)); + if (boostsStatus.level == 0) { + title.setText(LocaleController.getString("BoostingEnableStories", R.string.BoostingEnableStories)); + } else { + title.setText(LocaleController.getString("BoostingIncreaseLevel", R.string.BoostingIncreaseLevel)); + } } else if (type == TYPE_ADD_MEMBERS_RESTRICTED) { if (canSendLink) { title.setText(LocaleController.getString("ChannelInviteViaLink", R.string.ChannelInviteViaLink)); @@ -990,7 +1002,11 @@ public class LimitReachedBottomSheet extends BottomSheetWithRecyclerListView { description.setText(AndroidUtilities.replaceTags(descriptionStr)); description.setTextSize(TypedValue.COMPLEX_UNIT_DIP, 14); description.setGravity(Gravity.CENTER_HORIZONTAL); - description.setTextColor(Theme.getColor(Theme.key_windowBackgroundWhiteBlackText, resourcesProvider)); + if (type == TYPE_BOOSTS_FOR_POSTING) { + description.setTextColor(Theme.getColor(Theme.key_windowBackgroundWhiteGrayText, resourcesProvider)); + } else { + description.setTextColor(Theme.getColor(Theme.key_windowBackgroundWhiteBlackText, resourcesProvider)); + } addView(description, LayoutHelper.createLinear(LayoutHelper.WRAP_CONTENT, LayoutHelper.WRAP_CONTENT, Gravity.CENTER_HORIZONTAL, 24, 0, 24, 24)); updatePremiumButtonText(); diff --git a/TMessagesProj/src/main/java/org/telegram/ui/Components/Premium/PremiumButtonView.java b/TMessagesProj/src/main/java/org/telegram/ui/Components/Premium/PremiumButtonView.java index b40fb5905..67456404b 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/Components/Premium/PremiumButtonView.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/Components/Premium/PremiumButtonView.java @@ -56,11 +56,11 @@ public class PremiumButtonView extends FrameLayout { CounterView counterView; public boolean drawGradient = true; - public PremiumButtonView(@NonNull Context context, boolean createOverlayTextView) { - this(context, AndroidUtilities.dp(8), createOverlayTextView); + public PremiumButtonView(@NonNull Context context, boolean createOverlayTextView, Theme.ResourcesProvider resourcesProvider) { + this(context, AndroidUtilities.dp(8), createOverlayTextView, resourcesProvider); } - public PremiumButtonView(@NonNull Context context, int radius, boolean createOverlayTextView) { + public PremiumButtonView(@NonNull Context context, int radius, boolean createOverlayTextView, Theme.ResourcesProvider resourcesProvider) { super(context); this.radius = radius; @@ -93,14 +93,14 @@ public class PremiumButtonView extends FrameLayout { overlayTextView = new AnimatedTextView(context, true, true, true); overlayTextView.setPadding(AndroidUtilities.dp(34), 0, AndroidUtilities.dp(34), 0); overlayTextView.setGravity(Gravity.CENTER); - overlayTextView.setTextColor(Theme.getColor(Theme.key_featuredStickers_buttonText)); + overlayTextView.setTextColor(Theme.getColor(Theme.key_featuredStickers_buttonText, resourcesProvider)); overlayTextView.setTextSize(AndroidUtilities.dp(14)); overlayTextView.setTypeface(AndroidUtilities.getTypeface("fonts/rmedium.ttf")); overlayTextView.getDrawable().setAllowCancel(true); overlayTextView.setBackground(Theme.createSimpleSelectorRoundRectDrawable(AndroidUtilities.dp(8), Color.TRANSPARENT, ColorUtils.setAlphaComponent(Color.WHITE, 120))); addView(overlayTextView); - paintOverlayPaint.setColor(Theme.getColor(Theme.key_featuredStickers_addButton)); + paintOverlayPaint.setColor(Theme.getColor(Theme.key_featuredStickers_addButton, resourcesProvider)); updateOverlayProgress(); } } diff --git a/TMessagesProj/src/main/java/org/telegram/ui/Components/Premium/PremiumFeatureBottomSheet.java b/TMessagesProj/src/main/java/org/telegram/ui/Components/Premium/PremiumFeatureBottomSheet.java index e2957c303..35664bff4 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/Components/Premium/PremiumFeatureBottomSheet.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/Components/Premium/PremiumFeatureBottomSheet.java @@ -320,7 +320,7 @@ public class PremiumFeatureBottomSheet extends BottomSheet implements Notificati if (!onlySelectedType) { linearLayout.addView(bottomPages, LayoutHelper.createLinear(11 * premiumFeatures.size(), 5, Gravity.CENTER_HORIZONTAL, 0, 0, 0, 10)); } - premiumButtonView = new PremiumButtonView(getContext(), true); + premiumButtonView = new PremiumButtonView(getContext(), true, resourcesProvider); premiumButtonView.buttonLayout.setOnClickListener(v -> { if (fragment instanceof ChatActivity) { ((ChatActivity) fragment).closeMenu(); diff --git a/TMessagesProj/src/main/java/org/telegram/ui/Components/Premium/PremiumPreviewBottomSheet.java b/TMessagesProj/src/main/java/org/telegram/ui/Components/Premium/PremiumPreviewBottomSheet.java index 44a6bc144..d920164cc 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/Components/Premium/PremiumPreviewBottomSheet.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/Components/Premium/PremiumPreviewBottomSheet.java @@ -195,7 +195,7 @@ public class PremiumPreviewBottomSheet extends BottomSheetWithRecyclerListView i super.onViewCreated(containerView); currentAccount = UserConfig.selectedAccount; - PremiumButtonView premiumButtonView = new PremiumButtonView(getContext(), false); + PremiumButtonView premiumButtonView = new PremiumButtonView(getContext(), false, resourcesProvider); premiumButtonView.setButton(PremiumPreviewFragment.getPremiumButtonText(currentAccount, null), v -> { PremiumPreviewFragment.sentPremiumButtonClick(); PremiumPreviewFragment.buyPremium(fragment, "profile"); diff --git a/TMessagesProj/src/main/java/org/telegram/ui/Components/StickersAlert.java b/TMessagesProj/src/main/java/org/telegram/ui/Components/StickersAlert.java index 9534e202c..d8e971451 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/Components/StickersAlert.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/Components/StickersAlert.java @@ -871,7 +871,7 @@ public class StickersAlert extends BottomSheet implements NotificationCenter.Not pickerBottomFrameLayout.addView(pickerBottomLayout, LayoutHelper.createFrame(LayoutHelper.MATCH_PARENT, 48)); containerView.addView(pickerBottomFrameLayout, LayoutHelper.createFrame(LayoutHelper.MATCH_PARENT, LayoutHelper.WRAP_CONTENT, Gravity.LEFT | Gravity.BOTTOM)); - premiumButtonView = new PremiumButtonView(context, false); + premiumButtonView = new PremiumButtonView(context, false, resourcesProvider); premiumButtonView.setIcon(R.raw.unlock_icon); premiumButtonView.setVisibility(View.INVISIBLE); containerView.addView(premiumButtonView, LayoutHelper.createFrame(LayoutHelper.MATCH_PARENT, 48, Gravity.BOTTOM | Gravity.FILL_HORIZONTAL, 8, 0, 8, 8)); diff --git a/TMessagesProj/src/main/java/org/telegram/ui/Components/ViewPagerFixed.java b/TMessagesProj/src/main/java/org/telegram/ui/Components/ViewPagerFixed.java index 74cfd24de..567bebe80 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/Components/ViewPagerFixed.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/Components/ViewPagerFixed.java @@ -146,6 +146,11 @@ public class ViewPagerFixed extends FrameLayout { this.adapter = adapter; viewTypes[0] = adapter.getItemViewType(currentPosition); viewPages[0] = adapter.createView(viewTypes[0]); + if (viewPages[0] == null && currentPosition != 0) { + currentPosition = 0; + viewTypes[0] = adapter.getItemViewType(currentPosition); + viewPages[0] = adapter.createView(viewTypes[0]); + } adapter.bindView(viewPages[0], currentPosition, viewTypes[0]); addView(viewPages[0]); viewPages[0].setVisibility(View.VISIBLE); diff --git a/TMessagesProj/src/main/java/org/telegram/ui/Components/spoilers/SpoilerEffect.java b/TMessagesProj/src/main/java/org/telegram/ui/Components/spoilers/SpoilerEffect.java index 5236856cb..c978e7a21 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/Components/spoilers/SpoilerEffect.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/Components/spoilers/SpoilerEffect.java @@ -367,6 +367,9 @@ public class SpoilerEffect extends Drawable { continue; } + if (renderCount >= particlePoints[a].length - 2) { + continue; + } particlePoints[a][renderCount] = p.x; particlePoints[a][renderCount + 1] = p.y; renderCount += 2; diff --git a/TMessagesProj/src/main/java/org/telegram/ui/LaunchActivity.java b/TMessagesProj/src/main/java/org/telegram/ui/LaunchActivity.java index 118cf8c9c..248e25a2d 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/LaunchActivity.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/LaunchActivity.java @@ -547,11 +547,11 @@ public class LaunchActivity extends BasePermissionsActivity implements INavigati if (attachMenuBot.side_menu_disclaimer_needed) { WebAppDisclaimerAlert.show(this, (ignore) -> { attachMenuBot.side_menu_disclaimer_needed = false; - showAttachMenuBot(attachMenuBot); + showAttachMenuBot(attachMenuBot, null); MediaDataController.getInstance(currentAccount).updateAttachMenuBotsInCache(); }, null); } else { - showAttachMenuBot(attachMenuBot); + showAttachMenuBot(attachMenuBot, null); } return; } @@ -948,10 +948,10 @@ public class LaunchActivity extends BasePermissionsActivity implements INavigati RestrictedLanguagesSelectActivity.checkRestrictedLanguages(false); } - private void showAttachMenuBot(TLRPC.TL_attachMenuBot attachMenuBot) { + private void showAttachMenuBot(TLRPC.TL_attachMenuBot attachMenuBot, String startApp) { BotWebViewSheet webViewSheet = new BotWebViewSheet(this, getLastFragment().getResourceProvider()); webViewSheet.setParentActivity(this); - webViewSheet.requestWebView(currentAccount, attachMenuBot.bot_id, attachMenuBot.bot_id, attachMenuBot.short_name, null, BotWebViewSheet.TYPE_SIMPLE_WEB_VIEW_BUTTON, 0, false, BotWebViewSheet.FLAG_FROM_SIDE_MENU); + webViewSheet.requestWebView(currentAccount, attachMenuBot.bot_id, attachMenuBot.bot_id, attachMenuBot.short_name, null, BotWebViewSheet.TYPE_SIMPLE_WEB_VIEW_BUTTON, 0, false, null, null, false, startApp, null, BotWebViewSheet.FLAG_FROM_SIDE_MENU); webViewSheet.show(); } @@ -2239,6 +2239,8 @@ public class LaunchActivity extends BasePermissionsActivity implements INavigati } catch (NumberFormatException ignored) { messageId = null; } + } else if (segments.size() == 1) { + startApp = data.getQueryParameter("startapp"); } } if (messageId != null) { @@ -3724,15 +3726,18 @@ public class LaunchActivity extends BasePermissionsActivity implements INavigati } if (isBoost) { - processBoostDialog(peerId, dismissLoading); - return; + TLRPC.Chat chat = MessagesController.getInstance(intentAccount).getChat(-peerId); + if (ChatObject.isChannelAndNotMegaGroup(chat)) { + processBoostDialog(peerId, dismissLoading); + return; + } } - if (setAsAttachBot != null && attachMenuBotToOpen == null) { + if ((setAsAttachBot != null || botAppStartParam != null) && attachMenuBotToOpen == null) { TLRPC.User user = MessagesController.getInstance(intentAccount).getUser(peerId); if (user != null && user.bot) { if (user.bot_attach_menu) { - processAttachMenuBot(intentAccount, peerId, attachMenuBotChoose, user, setAsAttachBot); + processAttachMenuBot(intentAccount, peerId, attachMenuBotChoose, user, setAsAttachBot, botAppStartParam); } else { BulletinFactory.of(mainFragmentsStack.get(mainFragmentsStack.size() - 1)).createErrorBulletin(LocaleController.getString(R.string.BotCantAddToAttachMenu)).show(); } @@ -4569,7 +4574,7 @@ public class LaunchActivity extends BasePermissionsActivity implements INavigati args.putInt("message_id", messageId); } TLRPC.Chat chatLocal = MessagesController.getInstance(currentAccount).getChat(channelId); - if (chatLocal != null && isBoost) { + if (chatLocal != null && ChatObject.isChannelAndNotMegaGroup(chatLocal) && isBoost) { processBoostDialog(-channelId, dismissLoading); } else if (chatLocal != null && chatLocal.forum) { openForumFromLink(-channelId, 0, messageId, () -> { @@ -4601,7 +4606,7 @@ public class LaunchActivity extends BasePermissionsActivity implements INavigati notFound = false; MessagesController.getInstance(currentAccount).putChats(res.chats, false); TLRPC.Chat chat = res.chats.get(0); - if (chat != null && isBoost) { + if (chat != null && isBoost && ChatObject.isChannelAndNotMegaGroup(chat)) { processBoostDialog(-channelId, null); } else if (chat != null && chat.forum) { if (threadId != null) { @@ -4742,16 +4747,24 @@ public class LaunchActivity extends BasePermissionsActivity implements INavigati return; } boostsController.userCanBoostChannel(peerId, canApplyBoost -> { - LimitReachedBottomSheet limitReachedBottomSheet = new LimitReachedBottomSheet(getLastFragment(), this, TYPE_BOOSTS_FOR_USERS, currentAccount, null); - limitReachedBottomSheet.setCanApplyBoost(canApplyBoost); BaseFragment lastFragment = getLastFragment(); + if (lastFragment == null) { + return; + } + Theme.ResourcesProvider resourcesProvider = lastFragment.getResourceProvider(); + if (lastFragment.storyViewer != null && lastFragment.storyViewer.isFullyVisible()) { + resourcesProvider = lastFragment.storyViewer.getResourceProvider(); + } + LimitReachedBottomSheet limitReachedBottomSheet = new LimitReachedBottomSheet(lastFragment, this, TYPE_BOOSTS_FOR_USERS, currentAccount, resourcesProvider); + limitReachedBottomSheet.setCanApplyBoost(canApplyBoost); + boolean isCurrentChat = false; if (lastFragment instanceof ChatActivity) { isCurrentChat = ((ChatActivity) lastFragment).getDialogId() == peerId; } limitReachedBottomSheet.setBoostsStats(boostsStatus, isCurrentChat); limitReachedBottomSheet.setDialogId(peerId); - limitReachedBottomSheet.show(); + lastFragment.showDialog(limitReachedBottomSheet); try { if (dismissLoading != null) { dismissLoading.run(); @@ -4763,7 +4776,7 @@ public class LaunchActivity extends BasePermissionsActivity implements INavigati }); } - private void processAttachMenuBot(int intentAccount, long peerId, String attachMenuBotChoose, TLRPC.User user, String setAsAttachBot) { + private void processAttachMenuBot(int intentAccount, long peerId, String attachMenuBotChoose, TLRPC.User user, String setAsAttachBot, String startAppParam) { 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(() -> { @@ -4771,6 +4784,10 @@ public class LaunchActivity extends BasePermissionsActivity implements INavigati TLRPC.TL_attachMenuBotsBot attachMenuBotsBot = (TLRPC.TL_attachMenuBotsBot) response1; MessagesController.getInstance(intentAccount).putUsers(attachMenuBotsBot.users, false); TLRPC.TL_attachMenuBot attachMenuBot = attachMenuBotsBot.bot; + if (startAppParam != null) { + showAttachMenuBot(attachMenuBot, startAppParam); + return; + } BaseFragment lastFragment_ = mainFragmentsStack.get(mainFragmentsStack.size() - 1); if (AndroidUtilities.isTablet() && !(lastFragment_ instanceof ChatActivity) && !rightFragmentsStack.isEmpty()) { lastFragment_ = rightFragmentsStack.get(rightFragmentsStack.size() - 1); @@ -5169,9 +5186,6 @@ public class LaunchActivity extends BasePermissionsActivity implements INavigati } public void checkAppUpdate(boolean force) { - if (!BuildVars.isStandaloneApp()) { - return; - } if (!force && BuildVars.DEBUG_VERSION || !force && !BuildVars.CHECK_UPDATES) { return; } diff --git a/TMessagesProj/src/main/java/org/telegram/ui/PhotoViewer.java b/TMessagesProj/src/main/java/org/telegram/ui/PhotoViewer.java index 7a9fe42d1..0cc86af50 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/PhotoViewer.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/PhotoViewer.java @@ -2715,6 +2715,7 @@ public class PhotoViewer implements NotificationCenter.NotificationCenterDelegat default void onPreOpen() {} default void onPreClose() {} + default void onEditModeChanged(boolean isEditMode) {} default boolean onDeletePhoto(int index) { return true; } @@ -6039,9 +6040,6 @@ public class PhotoViewer implements NotificationCenter.NotificationCenterDelegat @Override protected void setupMentionContainer() { - if (parentChatActivity != null) { - return; - } mentionContainer.getAdapter().setAllowStickers(false); mentionContainer.getAdapter().setAllowBots(false); mentionContainer.getAdapter().setAllowChats(false); @@ -9875,6 +9873,9 @@ public class PhotoViewer implements NotificationCenter.NotificationCenterDelegat if (currentEditMode == mode || (isCurrentVideo && photoProgressViews[0].backgroundState != 3) && !isCurrentVideo && (centerImage.getBitmap() == null || photoProgressViews[0].backgroundState != -1) || changeModeAnimation != null || imageMoveAnimation != null || isCaptionOpen()) { return; } + if (placeProvider != null && (currentEditMode == EDIT_MODE_NONE || mode == EDIT_MODE_NONE)) { + placeProvider.onEditModeChanged(mode != EDIT_MODE_NONE); + } windowView.setClipChildren(mode == EDIT_MODE_FILTER); int navigationBarColorFrom = 0x7f000000; if (navigationBar.getBackground() instanceof ColorDrawable) { diff --git a/TMessagesProj/src/main/java/org/telegram/ui/PremiumPreviewFragment.java b/TMessagesProj/src/main/java/org/telegram/ui/PremiumPreviewFragment.java index 6be7483f4..bc7f26139 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/PremiumPreviewFragment.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/PremiumPreviewFragment.java @@ -583,7 +583,7 @@ public class PremiumPreviewFragment extends BaseFragment implements Notification }); contentView.addView(listView); - premiumButtonView = new PremiumButtonView(context, false); + premiumButtonView = new PremiumButtonView(context, false, getResourceProvider()); updateButtonText(false); buttonContainer = new FrameLayout(context); diff --git a/TMessagesProj/src/main/java/org/telegram/ui/ProfileActivity.java b/TMessagesProj/src/main/java/org/telegram/ui/ProfileActivity.java index 529c82d74..b69353653 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/ProfileActivity.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/ProfileActivity.java @@ -2161,7 +2161,7 @@ public class ProfileActivity extends BaseFragment implements NotificationCenter. args.putLong("chat_id", chatId); args.putBoolean("is_megagroup", chat.megagroup); if (!chatInfo.can_view_stats) { - args.putBoolean("only_boosts", chat.megagroup); + args.putBoolean("only_boosts", true); } StatisticActivity fragment = new StatisticActivity(args); presentFragment(fragment); @@ -4448,9 +4448,15 @@ public class ProfileActivity extends BaseFragment implements NotificationCenter. private final AccelerateDecelerateInterpolator floatingInterpolator = new AccelerateDecelerateInterpolator(); private void createFloatingActionButton(Context context) { + if (!getMessagesController().storiesEnabled()) { + return; + } if (getDialogId() > 0L) { return; } + if (!ChatObject.isChannelAndNotMegaGroup(-getDialogId(), currentAccount)) { + return; + } StoriesController storiesController = getMessagesController().getStoriesController(); if (!storiesController.canPostStories(getDialogId())) { return; @@ -4489,7 +4495,7 @@ public class ProfileActivity extends BaseFragment implements NotificationCenter. args.putBoolean("is_megagroup", chat.megagroup); args.putBoolean("start_from_boosts", true); if (chatInfo == null || !chatInfo.can_view_stats) { - args.putBoolean("only_boosts", chat.megagroup); + args.putBoolean("only_boosts", true); }; StatisticActivity fragment = new StatisticActivity(args); presentFragment(fragment); @@ -5933,18 +5939,14 @@ public class ProfileActivity extends BaseFragment implements NotificationCenter. if (writeButton != null) { writeButton.setTranslationY((actionBar.getOccupyStatusBar() ? AndroidUtilities.statusBarHeight : 0) + ActionBar.getCurrentActionBarHeight() + extraHeight + searchTransitionOffset - AndroidUtilities.dp(29.5f)); - if (storyView != null) { - storyView.setExpandCoords(avatarContainer2.getMeasuredWidth() - AndroidUtilities.dp(111), (actionBar.getOccupyStatusBar() ? AndroidUtilities.statusBarHeight : 0) + ActionBar.getCurrentActionBarHeight() + extraHeight + searchTransitionOffset); + boolean writeButtonVisible = diff > 0.2f && !searchMode && (imageUpdater == null || setAvatarRow == -1); + if (writeButtonVisible && chatId != 0) { + writeButtonVisible = ChatObject.isChannel(currentChat) && !currentChat.megagroup && chatInfo != null && chatInfo.linked_chat_id != 0 && infoHeaderRow != -1; } - if (!openAnimationInProgress) { - boolean setVisible = diff > 0.2f && !searchMode && (imageUpdater == null || setAvatarRow == -1); - if (setVisible && chatId != 0) { - setVisible = ChatObject.isChannel(currentChat) && !currentChat.megagroup && chatInfo != null && chatInfo.linked_chat_id != 0 && infoHeaderRow != -1; - } boolean currentVisible = writeButton.getTag() == null; - if (setVisible != currentVisible) { - if (setVisible) { + if (writeButtonVisible != currentVisible) { + if (writeButtonVisible) { writeButton.setTag(null); } else { writeButton.setTag(0); @@ -5956,7 +5958,7 @@ public class ProfileActivity extends BaseFragment implements NotificationCenter. } if (animated) { writeButtonAnimation = new AnimatorSet(); - if (setVisible) { + if (writeButtonVisible) { writeButtonAnimation.setInterpolator(new DecelerateInterpolator()); writeButtonAnimation.playTogether( ObjectAnimator.ofFloat(writeButton, View.SCALE_X, 1.0f), @@ -5982,9 +5984,9 @@ public class ProfileActivity extends BaseFragment implements NotificationCenter. }); writeButtonAnimation.start(); } else { - writeButton.setScaleX(setVisible ? 1.0f : 0.2f); - writeButton.setScaleY(setVisible ? 1.0f : 0.2f); - writeButton.setAlpha(setVisible ? 1.0f : 0.0f); + writeButton.setScaleX(writeButtonVisible ? 1.0f : 0.2f); + writeButton.setScaleY(writeButtonVisible ? 1.0f : 0.2f); + writeButton.setAlpha(writeButtonVisible ? 1.0f : 0.0f); } } @@ -5999,6 +6001,10 @@ public class ProfileActivity extends BaseFragment implements NotificationCenter. } } } + + if (storyView != null) { + storyView.setExpandCoords(avatarContainer2.getMeasuredWidth() - AndroidUtilities.dp(writeButtonVisible ? 111 : 40), (actionBar.getOccupyStatusBar() ? AndroidUtilities.statusBarHeight : 0) + ActionBar.getCurrentActionBarHeight() + extraHeight + searchTransitionOffset); + } } avatarX = -AndroidUtilities.dpf2(47f) * diff; diff --git a/TMessagesProj/src/main/java/org/telegram/ui/SelectAnimatedEmojiDialog.java b/TMessagesProj/src/main/java/org/telegram/ui/SelectAnimatedEmojiDialog.java index a232674d5..7c901a7f8 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/SelectAnimatedEmojiDialog.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/SelectAnimatedEmojiDialog.java @@ -2536,7 +2536,7 @@ public class SelectAnimatedEmojiDialog extends FrameLayout implements Notificati addButtonView.addView(addButtonTextView, LayoutHelper.createFrame(LayoutHelper.MATCH_PARENT, LayoutHelper.WRAP_CONTENT, Gravity.CENTER)); addView(addButtonView, LayoutHelper.createFrame(LayoutHelper.MATCH_PARENT, LayoutHelper.MATCH_PARENT)); - premiumButtonView = new PremiumButtonView(getContext(), false); + premiumButtonView = new PremiumButtonView(getContext(), false, resourcesProvider); premiumButtonView.setIcon(R.raw.unlock_icon); addView(premiumButtonView, LayoutHelper.createFrame(LayoutHelper.MATCH_PARENT, LayoutHelper.MATCH_PARENT)); } diff --git a/TMessagesProj/src/main/java/org/telegram/ui/StatisticActivity.java b/TMessagesProj/src/main/java/org/telegram/ui/StatisticActivity.java index d0eb28908..d8921e230 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/StatisticActivity.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/StatisticActivity.java @@ -2572,6 +2572,8 @@ public class StatisticActivity extends BaseFragment implements NotificationCente Integer colorKey = (Integer) secondary[i].getTag(); if (colorKey != null) { secondary[i].setTextColor(Theme.getColor(colorKey)); + } else { + secondary[i].setTextColor(Theme.getColor(Theme.key_windowBackgroundWhiteBlackText)); } } } diff --git a/TMessagesProj/src/main/java/org/telegram/ui/Stories/PeerStoriesView.java b/TMessagesProj/src/main/java/org/telegram/ui/Stories/PeerStoriesView.java index 7d20dedd3..d638d1073 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/Stories/PeerStoriesView.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/Stories/PeerStoriesView.java @@ -1035,8 +1035,7 @@ public class PeerStoriesView extends SizeNotifierFrameLayout implements Notifica if (popupMenu != null) { popupMenu.dismiss(); } - setActive(false); - final Runnable openEdit = () -> { + Runnable openEdit = () -> { StoryRecorder editor = StoryRecorder.getInstance(activity, currentAccount); long time = 0; if (playerSharedScope != null && playerSharedScope.player != null) { @@ -1051,11 +1050,16 @@ public class PeerStoriesView extends SizeNotifierFrameLayout implements Notifica entry = entry.copy(); } editor.openEdit(StoryRecorder.SourceView.fromStoryViewer(storyViewer), entry, time, true); + editor.setOnFullyOpenListener(() -> { + editOpened = true; + setActive(false); + }); editor.setOnPrepareCloseListener((t, close, sent) -> { final long start = System.currentTimeMillis(); if (playerSharedScope.player == null) { delegate.setPopupIsVisible(false); setActive(true); + editOpened = false; onImageReceiverThumbLoaded = () -> { AndroidUtilities.cancelRunOnUIThread(close); AndroidUtilities.runOnUIThread(close); @@ -1075,10 +1079,11 @@ public class PeerStoriesView extends SizeNotifierFrameLayout implements Notifica if (muteIconView != null) { muteIconView.setAnimation(sharedResources.muteDrawable); } - if (videoDuration > 0 && t > videoDuration * .4f) { + if (videoDuration > 0 && t > videoDuration - 1400) { t = 0L; } setActive(t, true); + editOpened = false; AndroidUtilities.runOnUIThread(close, 400); if (sent) { updatePosition(); @@ -1721,10 +1726,27 @@ public class PeerStoriesView extends SizeNotifierFrameLayout implements Notifica } private void toggleArchiveForStory(long dialogId) { - TLRPC.User user = MessagesController.getInstance(currentAccount).getUser(dialogId); - boolean hide = !user.stories_hidden; + boolean hide; + TLRPC.User user = null; + TLRPC.Chat chat = null; + TLObject object = null; + String name = null; + if (dialogId > 0) { + user = MessagesController.getInstance(currentAccount).getUser(dialogId); + object = user; + name = user.first_name; + hide = !user.stories_hidden; + } else { + chat = MessagesController.getInstance(currentAccount).getChat(-dialogId); + object = chat; + name = chat.title; + hide = !chat.stories_hidden; + } MessagesController messagesController = MessagesController.getInstance(currentAccount); + TLObject finalObject = object; + + String finalName = name; AndroidUtilities.runOnUIThread(() -> { messagesController.getStoriesController().toggleHidden(dialogId, hide, false, true); BulletinFactory.UndoObject undoObject = new BulletinFactory.UndoObject(); @@ -1736,11 +1758,11 @@ public class PeerStoriesView extends SizeNotifierFrameLayout implements Notifica }; CharSequence str; if (!hide) { - str = AndroidUtilities.replaceTags(LocaleController.formatString("StoriesMovedToDialogs", R.string.StoriesMovedToDialogs, ContactsController.formatName(user.first_name, null, 10))); + str = AndroidUtilities.replaceTags(LocaleController.formatString("StoriesMovedToDialogs", R.string.StoriesMovedToDialogs, ContactsController.formatName(finalName, null, 10))); } else { - str = AndroidUtilities.replaceTags(LocaleController.formatString("StoriesMovedToContacts", R.string.StoriesMovedToContacts, ContactsController.formatName(user.first_name, null, 10))); + str = AndroidUtilities.replaceTags(LocaleController.formatString("StoriesMovedToContacts", R.string.StoriesMovedToContacts, ContactsController.formatName(finalName, null, 10))); } - BulletinFactory.of(storyContainer, resourcesProvider).createUsersBulletin(Arrays.asList(user), str, null, undoObject).setTag(2).show(); + BulletinFactory.of(storyContainer, resourcesProvider).createUsersBulletin(Arrays.asList(finalObject), str, null, undoObject).setTag(2).show(); }, 200); } @@ -3174,8 +3196,7 @@ public class PeerStoriesView extends SizeNotifierFrameLayout implements Notifica if (thumbDrawable == null) { thumbDrawable = ImageLoader.createStripedBitmap(storyItem.media.document.thumbs); } - // imageReceiver.setImage(null, null, ImageLocation.getForDocument(storyItem.media.document), filter + "_pframe", ImageLocation.getForDocument(size, storyItem.media.document), filter, thumbDrawable, 0, null, storyItem, 0); - imageReceiver.setImage(null, null, ImageLocation.getForDocument(size, storyItem.media.document), filter, null, null, thumbDrawable, 0, null, storyItem, 0); + imageReceiver.setImage(null, null, ImageLocation.getForDocument(storyItem.media.document), filter + "_pframe", ImageLocation.getForDocument(size, storyItem.media.document), filter, thumbDrawable, 0, null, storyItem, 0); } else { TLRPC.Photo photo = storyItem.media != null ? storyItem.media.photo : null; if (photo != null && photo.sizes != null) { @@ -3183,12 +3204,12 @@ public class PeerStoriesView extends SizeNotifierFrameLayout implements Notifica thumbDrawable = ImageLoader.createStripedBitmap(photo.sizes); } TLRPC.PhotoSize size = FileLoader.getClosestPhotoSizeWithSize(photo.sizes, Integer.MAX_VALUE); -// TLRPC.PhotoSize thumbSize = FileLoader.getClosestPhotoSizeWithSize(photo.sizes, 800); + TLRPC.PhotoSize thumbSize = FileLoader.getClosestPhotoSizeWithSize(photo.sizes, 800); // if (thumbSize != size) { -// imageReceiver.setImage(ImageLocation.getForPhoto(size, photo), filter, ImageLocation.getForPhoto(thumbSize, photo), filter, null, null, thumbDrawable, 0, null, storyItem, 0); +// imageReceiver.setImage(null, null, ImageLocation.getForPhoto(size, photo), filter, ImageLocation.getForPhoto(thumbSize, photo), filter, thumbDrawable, 0, null, storyItem, 0); // } else { imageReceiver.setImage(null, null, ImageLocation.getForPhoto(size, photo), filter, null, null, thumbDrawable, 0, null, storyItem, 0); - // } + // } } else { imageReceiver.clearImage(); } @@ -3999,6 +4020,8 @@ public class PeerStoriesView extends SizeNotifierFrameLayout implements Notifica } } + public boolean editOpened; + public void setActive(boolean active) { setActive(0, active); } @@ -4570,7 +4593,7 @@ public class PeerStoriesView extends SizeNotifierFrameLayout implements Notifica caption = Emoji.replaceEmoji(caption, storyCaptionView.captionTextview.getPaint().getFontMetricsInt(), AndroidUtilities.dp(20), false); SpannableStringBuilder spannableStringBuilder = SpannableStringBuilder.valueOf(caption); TLRPC.User user = MessagesController.getInstance(currentAccount).getUser(dialogId); - if (MessagesController.getInstance(currentAccount).storyEntitiesAllowed(user)) { + if (dialogId < 0 || MessagesController.getInstance(currentAccount).storyEntitiesAllowed(user)) { MessageObject.addLinks(true, spannableStringBuilder); } } else if (currentStory.storyItem != null) { @@ -4584,7 +4607,7 @@ public class PeerStoriesView extends SizeNotifierFrameLayout implements Notifica spannableStringBuilder = SpannableStringBuilder.valueOf(MessageObject.replaceAnimatedEmoji(spannableStringBuilder, text.entities, storyCaptionView.captionTextview.getPaint().getFontMetricsInt(), false)); SpannableStringBuilder.valueOf(Emoji.replaceEmoji(spannableStringBuilder, storyCaptionView.captionTextview.getPaint().getFontMetricsInt(), false)); TLRPC.User user = MessagesController.getInstance(currentAccount).getUser(dialogId); - if (MessagesController.getInstance(currentAccount).storyEntitiesAllowed(user)) { + if (dialogId < 0 || MessagesController.getInstance(currentAccount).storyEntitiesAllowed(user)) { MessageObject.addLinks(true, spannableStringBuilder); MessageObject.addEntitiesToText(spannableStringBuilder, text.entities, false, true, true, false); } @@ -4598,7 +4621,7 @@ public class PeerStoriesView extends SizeNotifierFrameLayout implements Notifica spannableStringBuilder = SpannableStringBuilder.valueOf(MessageObject.replaceAnimatedEmoji(spannableStringBuilder, currentStory.storyItem.entities, storyCaptionView.captionTextview.getPaint().getFontMetricsInt(), false)); SpannableStringBuilder.valueOf(Emoji.replaceEmoji(spannableStringBuilder, storyCaptionView.captionTextview.getPaint().getFontMetricsInt(), false)); TLRPC.User user = MessagesController.getInstance(currentAccount).getUser(dialogId); - if (MessagesController.getInstance(currentAccount).storyEntitiesAllowed(user)) { + if (dialogId < 0 || MessagesController.getInstance(currentAccount).storyEntitiesAllowed(user)) { MessageObject.addLinks(true, spannableStringBuilder); MessageObject.addEntitiesToText(spannableStringBuilder, currentStory.storyItem.entities, false, true, true, false); } @@ -4713,15 +4736,14 @@ public class PeerStoriesView extends SizeNotifierFrameLayout implements Notifica if (UserObject.getPublicUsername(user) == null) { return null; } - return String.format(Locale.US, "https://t.me/%s/s/%s", UserObject.getPublicUsername(user), currentStory.storyItem.id); + return String.format(Locale.US, "https://t.me/%1$s/s/%2$s", UserObject.getPublicUsername(user), currentStory.storyItem.id); } else { TLRPC.Chat chat = MessagesController.getInstance(currentAccount).getChat(-dialogId); if (ChatObject.getPublicUsername(chat) == null) { return null; } - return String.format(Locale.US, "https://t.me/%s/s/%s", ChatObject.getPublicUsername(chat), currentStory.storyItem.id); + return String.format(Locale.US, "https://t.me/%1$s/s/%2$s", ChatObject.getPublicUsername(chat), currentStory.storyItem.id); } - // return String.format(Locale.US, "tg://resolve?domain=%s&story=%s", user.username, currentStory.storyItem.id); } public File getPath() { diff --git a/TMessagesProj/src/main/java/org/telegram/ui/Stories/SelfStoryViewsPage.java b/TMessagesProj/src/main/java/org/telegram/ui/Stories/SelfStoryViewsPage.java index e95b549b8..0fc79d8ef 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/Stories/SelfStoryViewsPage.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/Stories/SelfStoryViewsPage.java @@ -737,7 +737,7 @@ public class SelfStoryViewsPage extends FrameLayout implements NotificationCente view = new FixedHeightEmptyCell(getContext(), 70); break; case USER_ITEM: - view = new ReactedUserHolderView(ReactedUserHolderView.STYLE_STORY, currentAccount, getContext(), resourcesProvider) { + view = new ReactedUserHolderView(ReactedUserHolderView.STYLE_STORY, currentAccount, getContext(), resourcesProvider, false) { @Override public void openStory(long dialogId, Runnable onDone) { BaseFragment lastFragment = LaunchActivity.getLastFragment(); diff --git a/TMessagesProj/src/main/java/org/telegram/ui/Stories/StealthModeAlert.java b/TMessagesProj/src/main/java/org/telegram/ui/Stories/StealthModeAlert.java index 576cbc835..9e690d573 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/Stories/StealthModeAlert.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/Stories/StealthModeAlert.java @@ -110,7 +110,7 @@ public class StealthModeAlert extends BottomSheet { linearLayout.addView(itemCell2, LayoutHelper.createLinear(LayoutHelper.MATCH_PARENT, LayoutHelper.WRAP_CONTENT,0, 0, 10, 0, 0)); - button = new PremiumButtonView(context, AndroidUtilities.dp(8), true); + button = new PremiumButtonView(context, AndroidUtilities.dp(8), true, resourcesProvider); button.drawGradient = false; button.overlayTextView.getDrawable().setSplitByWords(false); button.setIcon(R.raw.unlock_icon); diff --git a/TMessagesProj/src/main/java/org/telegram/ui/Stories/StoriesController.java b/TMessagesProj/src/main/java/org/telegram/ui/Stories/StoriesController.java index 4ad0efb02..b121edf43 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/Stories/StoriesController.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/Stories/StoriesController.java @@ -3208,7 +3208,7 @@ public class StoriesController { public boolean canPostStories(long dialogId) { if (dialogId < 0) { TLRPC.Chat chat = MessagesController.getInstance(currentAccount).getChat(-dialogId); - if (chat == null) { + if (chat == null || !ChatObject.isChannelAndNotMegaGroup(chat)) { return false; } return chat.creator || chat.admin_rights != null && chat.admin_rights.post_stories; diff --git a/TMessagesProj/src/main/java/org/telegram/ui/Stories/StoriesViewPager.java b/TMessagesProj/src/main/java/org/telegram/ui/Stories/StoriesViewPager.java index 39ea58819..66beedaae 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/Stories/StoriesViewPager.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/Stories/StoriesViewPager.java @@ -202,7 +202,8 @@ public class StoriesViewPager extends ViewPager { private void updateActiveStory() { for (int i = 0; i < getChildCount(); i++) { - ((PeerStoriesView) ((FrameLayout) getChildAt(i)).getChildAt(0)).setActive((Integer) getChildAt(i).getTag() == getCurrentItem()); + PeerStoriesView peerStoriesView = ((PeerStoriesView) ((FrameLayout) getChildAt(i)).getChildAt(0)); + peerStoriesView.setActive((Integer) getChildAt(i).getTag() == getCurrentItem() && !peerStoriesView.editOpened); } } diff --git a/TMessagesProj/src/main/java/org/telegram/ui/Stories/StoryViewer.java b/TMessagesProj/src/main/java/org/telegram/ui/Stories/StoryViewer.java index b34f09049..a7809e74b 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/Stories/StoryViewer.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/Stories/StoryViewer.java @@ -221,6 +221,8 @@ public class StoryViewer implements NotificationCenter.NotificationCenterDelegat private static final LongSparseArray replyDrafts = new LongSparseArray<>(); public boolean fromBottomSheet; + private boolean paused; + private long playerSavedPosition; public static boolean isShowingImage(MessageObject messageObject) { if (lastStoryItem == null || messageObject.type != MessageObject.TYPE_STORY && !messageObject.isWebpage() || runOpenAnimationAfterLayout) { @@ -1301,6 +1303,10 @@ public class StoryViewer implements NotificationCenter.NotificationCenterDelegat currentPlayerScope.surfaceView = surfaceView; FileStreamLoadOperation.setPriorityForDocument(playerHolder.document, FileLoader.PRIORITY_HIGH); FileLoader.getInstance(currentAccount).changePriority(FileLoader.PRIORITY_HIGH, playerHolder.document, null, null, null, null, null); + if (t == 0 && playerSavedPosition != 0) { + t = playerSavedPosition; + currentPlayerScope.firstFrameRendered = true; + } currentPlayerScope.player.start(isPaused(), uri, t, isInSilentMode); currentPlayerScope.invalidate(); } @@ -1319,6 +1325,7 @@ public class StoryViewer implements NotificationCenter.NotificationCenterDelegat surfaceView.setVisibility(View.VISIBLE); } } + playerSavedPosition = 0; updatePlayingMode(); } @@ -2501,6 +2508,20 @@ public class StoryViewer implements NotificationCenter.NotificationCenterDelegat } } else if (id == NotificationCenter.openArticle || id == NotificationCenter.articleClosed) { updatePlayingMode(); + if (id == NotificationCenter.openArticle) { + if (playerHolder != null) { + playerSavedPosition = playerHolder.currentPosition; + playerHolder.release(null); + playerHolder = null; + } else { + playerSavedPosition = 0; + } + } else if (!paused) { + PeerStoriesView peerView = getCurrentPeerView(); + if (peerView != null) { + getCurrentPeerView().updatePosition(); + } + } } } @@ -2530,9 +2551,20 @@ public class StoryViewer implements NotificationCenter.NotificationCenterDelegat } public void onResume() { - PeerStoriesView peerView = getCurrentPeerView(); - if (peerView != null) { - getCurrentPeerView().updatePosition(); + paused = false; + if (!ArticleViewer.getInstance().isVisible()) { + PeerStoriesView peerView = getCurrentPeerView(); + if (peerView != null) { + getCurrentPeerView().updatePosition(); + } + } + } + + public void onPause() { + paused = true; + if (playerHolder != null) { + playerHolder.release(null); + playerHolder = null; } } diff --git a/TMessagesProj/src/main/java/org/telegram/ui/Stories/recorder/CaptionContainerView.java b/TMessagesProj/src/main/java/org/telegram/ui/Stories/recorder/CaptionContainerView.java index 3631309cd..556273338 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/Stories/recorder/CaptionContainerView.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/Stories/recorder/CaptionContainerView.java @@ -217,6 +217,7 @@ public class CaptionContainerView extends FrameLayout { editText.setFocusableInTouchMode(true); editText.getEditText().hintLayoutYFix = true; editText.getEditText().drawHint = this::drawHint; + editText.getEditText().setSupportRtlHint(true); captionBlur = new BlurringShader.StoryBlurDrawer(blurManager, editText.getEditText(), customBlur() ? BlurringShader.StoryBlurDrawer.BLUR_TYPE_CAPTION : BlurringShader.StoryBlurDrawer.BLUR_TYPE_CAPTION_XFER); editText.getEditText().setHintColor(0x80ffffff); editText.getEditText().setHintText(LocaleController.getString("AddCaption", R.string.AddCaption), false); @@ -800,6 +801,7 @@ public class CaptionContainerView extends FrameLayout { return; } final EditTextCaption e = editText.getEditText(); + canvas.translate(-e.hintLayoutX, 0); canvas.saveLayerAlpha(0, 0, hintTextBitmap.getWidth(), hintTextBitmap.getHeight(), 0xff, Canvas.ALL_SAVE_FLAG); rectF.set(0, 1, hintTextBitmap.getWidth(), hintTextBitmap.getHeight() - 1); drawBlur(captionBlur, canvas, rectF, 0, true, -editText.getX() - e.getPaddingLeft(), -editText.getY() - e.getPaddingTop() - e.getExtendedPaddingTop(), true); diff --git a/TMessagesProj/src/main/java/org/telegram/ui/Stories/recorder/PaintView.java b/TMessagesProj/src/main/java/org/telegram/ui/Stories/recorder/PaintView.java index c08668463..728df74cb 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/Stories/recorder/PaintView.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/Stories/recorder/PaintView.java @@ -358,7 +358,8 @@ public class PaintView extends SizeNotifierFrameLayoutPhoto implements IPhotoPai inBubbleMode = context instanceof BubbleActivity; PersistColorPalette palette = PersistColorPalette.getInstance(currentAccount); - colorSwatch.color = palette.getColor(0); + palette.resetCurrentColor(); + colorSwatch.color = palette.getCurrentColor(); colorSwatch.brushWeight = palette.getCurrentWeight(); queue = new DispatchQueue("Paint"); @@ -745,6 +746,7 @@ public class PaintView extends SizeNotifierFrameLayoutPhoto implements IPhotoPai int childWidth = child.getWidth() - child.getPaddingLeft() - child.getPaddingRight(); int childHeight = child.getHeight() - child.getPaddingTop() - child.getPaddingBottom(); float cx = child.getX() + child.getPaddingLeft() + childWidth / 2f, cy = child.getY() + child.getPaddingTop() + childHeight / 2f; + int colorCircle = colorSwatch.color; if (tabsNewSelectedIndex != -1) { ViewGroup barView2 = (ViewGroup) getBarView(tabsNewSelectedIndex); View newView = (barView2 == null ? barView : barView2).getChildAt(0); @@ -758,6 +760,8 @@ public class PaintView extends SizeNotifierFrameLayoutPhoto implements IPhotoPai View animateToView = colorsListView.getChildAt(0); cx = lerp(cx, colorsListView.getX() - barView.getLeft() + animateToView.getX() + animateToView.getWidth() / 2f, toolsTransformProgress); cy = lerp(cy, colorsListView.getY() - barView.getTop() + animateToView.getY() + animateToView.getHeight() / 2f, toolsTransformProgress); + int paletteFirstColor = palette.getColor(0); + colorCircle = ColorUtils.blendARGB(colorSwatch.color, paletteFirstColor, toolsTransformProgress); } checkRainbow(cx, cy); @@ -769,16 +773,21 @@ public class PaintView extends SizeNotifierFrameLayoutPhoto implements IPhotoPai AndroidUtilities.rectTmp.set(cx - rad, cy - rad, cx + rad, cy + rad); canvas.drawArc(AndroidUtilities.rectTmp, 0, 360, false, colorPickerRainbowPaint); - colorSwatchPaint.setColor(colorSwatch.color); + colorSwatchPaint.setColor(colorCircle); colorSwatchPaint.setAlpha((int) (colorSwatchPaint.getAlpha() * child.getAlpha())); - colorSwatchOutlinePaint.setColor(colorSwatch.color); + colorSwatchOutlinePaint.setColor(colorCircle); colorSwatchOutlinePaint.setAlpha((int) (0xFF * child.getAlpha())); float rad2 = rad - dp(3f); + if (colorsListView != null && colorsListView.getSelectedColorIndex() != 0) { + rad2 = lerp(rad - dp(3f), rad + dp(2), toolsTransformProgress); + } PaintColorsListView.drawColorCircle(canvas, cx, cy, rad2, colorSwatchPaint.getColor()); - colorSwatchOutlinePaint.setAlpha((int) (colorSwatchOutlinePaint.getAlpha() * toolsTransformProgress * child.getAlpha())); - canvas.drawCircle(cx, cy, rad - (dp(3f) + colorSwatchOutlinePaint.getStrokeWidth()) * (1f - toolsTransformProgress), colorSwatchOutlinePaint); + if (colorsListView != null && colorsListView.getSelectedColorIndex() == 0) { + colorSwatchOutlinePaint.setAlpha((int) (colorSwatchOutlinePaint.getAlpha() * toolsTransformProgress * child.getAlpha())); + canvas.drawCircle(cx, cy, rad - (AndroidUtilities.dp(3f) + colorSwatchOutlinePaint.getStrokeWidth()) * (1f - toolsTransformProgress), colorSwatchOutlinePaint); + } } canvas.restore(); @@ -970,16 +979,17 @@ public class PaintView extends SizeNotifierFrameLayoutPhoto implements IPhotoPai public void onColorSelected(int color) { showColorList(false); - PersistColorPalette.getInstance(currentAccount).selectColor(color); - PersistColorPalette.getInstance(currentAccount).saveColors(); + palette.selectColor(color); + palette.saveColors(); setNewColor(color); + colorsListView.setSelectedColorIndex(palette.getCurrentColorPosition()); colorsListView.getAdapter().notifyDataSetChanged(); } }).setColorListener(color -> { - PersistColorPalette.getInstance(currentAccount).selectColor(color); - PersistColorPalette.getInstance(currentAccount).saveColors(); + palette.selectColor(color); + palette.saveColors(); setNewColor(color); - colorsListView.getAdapter().notifyDataSetChanged(); + colorsListView.setSelectedColorIndex(palette.getCurrentColorPosition()); colorPickerBottomSheet = null; }).show(); return; @@ -1648,6 +1658,10 @@ public class PaintView extends SizeNotifierFrameLayoutPhoto implements IPhotoPai tabsNewSelectedIndex = index; final View newView = getBarView(tabsNewSelectedIndex); + PersistColorPalette.getInstance(currentAccount).setInTextMode(index == 2); + colorSwatch.color = PersistColorPalette.getInstance(currentAccount).getCurrentColor(); + setCurrentSwatch(colorSwatch, true); + tabsSelectionAnimator = ValueAnimator.ofFloat(0, 1).setDuration(300); tabsSelectionAnimator.setInterpolator(CubicBezierInterpolator.DEFAULT); tabsSelectionAnimator.addUpdateListener(animation -> { @@ -2836,8 +2850,10 @@ public class PaintView extends SizeNotifierFrameLayoutPhoto implements IPhotoPai ignoreToolChangeAnimationOnce = true; } renderView.setBrush(brush); + int wasColor = colorSwatch.color; + colorSwatch.color = PersistColorPalette.getInstance(currentAccount).getCurrentColor(); colorSwatch.brushWeight = weightDefaultValueOverride.get(); - setCurrentSwatch(colorSwatch, true); + setCurrentSwatch(colorSwatch, true, wasColor); renderInputView.invalidate(); } @@ -2952,12 +2968,16 @@ public class PaintView extends SizeNotifierFrameLayoutPhoto implements IPhotoPai if (show) { colorsListView.setVisibility(VISIBLE); - colorsListView.setSelectedColorIndex(0); + colorsListView.setSelectedColorIndex(PersistColorPalette.getInstance(currentAccount).getCurrentColorPosition()); } } } private void setCurrentSwatch(Swatch swatch, boolean updateInterface) { + setCurrentSwatch(swatch, updateInterface, null); + } + + private void setCurrentSwatch(Swatch swatch, boolean updateInterface, Integer prevColor) { if (colorSwatch != swatch) { colorSwatch.color = swatch.color; colorSwatch.colorLocation = swatch.colorLocation; @@ -2971,7 +2991,18 @@ public class PaintView extends SizeNotifierFrameLayoutPhoto implements IPhotoPai renderView.setBrushSize(swatch.brushWeight); if (updateInterface) { - if (bottomLayout != null) { + int newColor = colorSwatch.color; + if (prevColor != null && prevColor != newColor) { + ValueAnimator animator = ValueAnimator.ofFloat(0f, 1f).setDuration(150); + animator.addUpdateListener(animation -> { + float val = (float) animation.getAnimatedValue(); + colorSwatch.color = ColorUtils.blendARGB(prevColor, newColor, val); + if (bottomLayout != null) { + bottomLayout.invalidate(); + } + }); + animator.start(); + } else if (bottomLayout != null) { bottomLayout.invalidate(); } } diff --git a/TMessagesProj/src/main/java/org/telegram/ui/Stories/recorder/PreviewView.java b/TMessagesProj/src/main/java/org/telegram/ui/Stories/recorder/PreviewView.java index 761747a7e..060bf8efc 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/Stories/recorder/PreviewView.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/Stories/recorder/PreviewView.java @@ -180,6 +180,7 @@ public class PreviewView extends FrameLayout { } }); audioPlayer.preparePlayer(Uri.fromFile(new File(entry.audioPath)), "other"); + audioPlayer.setVolume(entry.audioVolume); if (videoPlayer != null && getDuration() > 0) { long startPos = (long) (entry.left * getDuration()); @@ -605,6 +606,9 @@ public class PreviewView extends FrameLayout { videoPlayer.preparePlayer(uri, "other"); videoPlayer.setPlayWhenReady(pauseLinks.isEmpty()); videoPlayer.setLooping(true); + if (entry.isEditSaved) { + seekTo = (long) ((entry.left * entry.duration) + seekTo); + } if (seekTo > 0) { videoPlayer.seekTo(seekTo); } @@ -614,6 +618,9 @@ public class PreviewView extends FrameLayout { timelineView.setVideo(entry.getOriginalFile().getAbsolutePath(), getDuration()); timelineView.setVideoLeft(entry.left); timelineView.setVideoRight(entry.right); + if (timelineView != null && seekTo > 0) { + timelineView.setProgress(seekTo); + } } } @@ -703,7 +710,7 @@ public class PreviewView extends FrameLayout { } long pos = videoPlayer.getCurrentPosition(); - if (getDuration() > 0) { + if (getDuration() > 1) { final float progress = pos / (float) getDuration(); if (!timelineView.isDragging() && (progress < entry.left || progress > entry.right) && System.currentTimeMillis() - seekedLastTime > MIN_DURATION / 2) { seekedLastTime = System.currentTimeMillis(); 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 313388372..d73f391b0 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 @@ -578,6 +578,11 @@ public class StoryRecorder implements NotificationCenter.NotificationCenterDeleg NotificationCenter.getGlobalInstance().postNotificationName(NotificationCenter.startAllHeavyOperations, 512); NotificationCenter.getGlobalInstance().runDelayedNotifications(); checkBackgroundVisibility(); + + if (onFullyOpenListener != null) { + onFullyOpenListener.run(); + onFullyOpenListener = null; + } } }); if (value < 1 && wasSend) { @@ -679,6 +684,11 @@ public class StoryRecorder implements NotificationCenter.NotificationCenterDeleg onCloseListener = listener; } + private Runnable onFullyOpenListener; + public void setOnFullyOpenListener(Runnable listener) { + onFullyOpenListener = listener; + } + private Utilities.Callback3 onClosePrepareListener; public void setOnPrepareCloseListener(Utilities.Callback3 listener) { onClosePrepareListener = listener; @@ -2311,7 +2321,7 @@ public class StoryRecorder implements NotificationCenter.NotificationCenterDeleg file = StoryEntry.makeCacheFile(currentAccount, false); try { - bitmap.compress(Bitmap.CompressFormat.JPEG, forDraft ? 95 : 75, new FileOutputStream(file)); + bitmap.compress(Bitmap.CompressFormat.JPEG, forDraft ? 95 : 99, new FileOutputStream(file)); } catch (FileNotFoundException e) { e.printStackTrace(); } @@ -2764,10 +2774,10 @@ public class StoryRecorder implements NotificationCenter.NotificationCenterDeleg } else if (currentEditMode > EDIT_MODE_NONE) { switchToEditMode(EDIT_MODE_NONE, true); return false; - } else if (currentPage == PAGE_PREVIEW && (outputEntry == null || !outputEntry.isEdit)) { - if (paintView != null && paintView.onBackPressed()){ + } else if (currentPage == PAGE_PREVIEW && (outputEntry == null || !outputEntry.isEdit || (paintView != null && paintView.hasChanges()) || outputEntry.editedMedia || outputEntry.editedCaption)) { + if (paintView != null && paintView.onBackPressed()) { return false; - } else if (fromGallery && (paintView == null || !paintView.hasChanges()) && (outputEntry == null || outputEntry.filterFile == null) || !previewButtons.isShareEnabled()) { + } else if ((fromGallery && (paintView == null || !paintView.hasChanges()) && (outputEntry == null || outputEntry.filterFile == null) || !previewButtons.isShareEnabled()) && (outputEntry == null || !outputEntry.isEdit)) { navigateTo(PAGE_CAMERA, true); } else { showDismissEntry(); @@ -4179,7 +4189,7 @@ public class StoryRecorder implements NotificationCenter.NotificationCenterDeleg AlertDialog.Builder builder = new AlertDialog.Builder(getContext(), resourcesProvider); builder.setTitle(LocaleController.getString("DiscardChanges", R.string.DiscardChanges)); builder.setMessage(LocaleController.getString("PhotoEditorDiscardAlert", R.string.PhotoEditorDiscardAlert)); - if (outputEntry != null) { + if (outputEntry != null && !outputEntry.isEdit) { builder.setNeutralButton(outputEntry.isDraft ? LocaleController.getString("StoryKeepDraft") : LocaleController.getString("StorySaveDraft"), (di, i) -> { if (outputEntry == null) { return; @@ -4203,12 +4213,16 @@ public class StoryRecorder implements NotificationCenter.NotificationCenterDeleg navigateTo(PAGE_CAMERA, true); }); } - builder.setPositiveButton(outputEntry != null && outputEntry.isDraft ? LocaleController.getString("StoryDeleteDraft") : LocaleController.getString("Discard", R.string.Discard), (dialogInterface, i) -> { - if (outputEntry != null && outputEntry.isDraft) { + builder.setPositiveButton(outputEntry != null && outputEntry.isDraft && !outputEntry.isEdit ? LocaleController.getString("StoryDeleteDraft") : LocaleController.getString("Discard", R.string.Discard), (dialogInterface, i) -> { + if (outputEntry != null && !outputEntry.isEdit && outputEntry.isDraft) { MessagesController.getInstance(currentAccount).getStoriesController().getDraftsController().delete(outputEntry); outputEntry = null; } - navigateTo(PAGE_CAMERA, true); + if (outputEntry != null && outputEntry.isEdit) { + close(true); + } else { + navigateTo(PAGE_CAMERA, true); + } }); builder.setNegativeButton(LocaleController.getString("Cancel", R.string.Cancel), null); AlertDialog dialog = builder.create(); diff --git a/TMessagesProj/src/main/java/org/telegram/ui/Stories/recorder/TimelineView.java b/TMessagesProj/src/main/java/org/telegram/ui/Stories/recorder/TimelineView.java index c3747009b..54f0ef781 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/Stories/recorder/TimelineView.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/Stories/recorder/TimelineView.java @@ -491,7 +491,11 @@ public class TimelineView extends View { return false; } - if (hasVideo && !hasAudio && event.getY() < h - py - getVideoHeight() - py && event.getAction() == MotionEvent.ACTION_DOWN) { + if (hasVideo && !hasAudio && event.getAction() == MotionEvent.ACTION_DOWN && event.getY() < h - py - getVideoHeight() - py) { + return false; + } + + if (hasAudio && !hasVideo && event.getAction() == MotionEvent.ACTION_DOWN && event.getY() < h - py - getAudioHeight() - py) { return false; } @@ -583,6 +587,8 @@ public class TimelineView extends View { if (!hadDragChange && d < 0 && audioLeft <= (audioRight - MAX_SELECT_DURATION / (float) audioDuration)) { pressHandle = HANDLE_AUDIO_REGION; } + } else { + minValue = Math.max(minValue, (videoLeft * videoDuration + scroll - audioOffset) / (float) audioDuration); } float wasAudioLeft = audioLeft; audioLeft = Utilities.clamp(audioLeft + d, maxValue, minValue); @@ -603,6 +609,8 @@ public class TimelineView extends View { if (!hadDragChange && d > 0 && audioRight >= (audioLeft + MAX_SELECT_DURATION / (float) audioDuration)) { pressHandle = HANDLE_AUDIO_REGION; } + } else { + maxValue = Math.min(maxValue, (videoRight * videoDuration + scroll - audioOffset) / (float) audioDuration); } float wasAudioRight = audioRight; audioRight = Utilities.clamp(audioRight + d, maxValue, minValue); @@ -731,7 +739,7 @@ public class TimelineView extends View { } private long minAudioSelect() { - return (long) Math.max(MIN_SELECT_DURATION, Math.min(videoDuration, MAX_SELECT_DURATION) * 0.25f); + return (long) Math.max(MIN_SELECT_DURATION, Math.min(videoDuration, MAX_SELECT_DURATION) * 0.15f); } private void moveAudioOffset(final float d) { @@ -754,6 +762,7 @@ public class TimelineView extends View { } audioOffset = Utilities.clamp(audioOffset + (long) d, mmx, mmn); if (delegate != null) { + delegate.onAudioLeftChange(audioLeft); delegate.onAudioRightChange(audioRight); } } else if (audioOffset + (long) d < mn) { @@ -769,6 +778,7 @@ public class TimelineView extends View { audioOffset = Utilities.clamp(audioOffset + (long) d, mmx, mmn); if (delegate != null) { delegate.onAudioLeftChange(audioLeft); + delegate.onAudioRightChange(audioRight); } } else { audioOffset += (long) d; @@ -776,24 +786,6 @@ public class TimelineView extends View { } else { audioOffset = Utilities.clamp(audioOffset + (long) d, (long) (getBaseDuration() - audioDuration * audioRight), (long) (-audioLeft * audioDuration)); } -// final float minLeft = Math.max(0, scroll - audioOffset) / (float) audioDuration; -// final float maxRight = Math.min(1, Math.max(0, scroll - audioOffset + videoScrollDuration) / (float) audioDuration); -// boolean changedLeftRight = false; -// final float pastDuration = audioRight - audioLeft; -// if (audioLeft < minLeft) { -// audioLeft = minLeft; -// audioRight = Math.min(1, audioLeft + pastDuration); -// changedLeftRight = true; -// } -// if (audioRight > maxRight) { -// audioRight = maxRight; -// audioLeft = Math.max(0, audioRight - pastDuration); -// changedLeftRight = true; -// } -// if (delegate != null && changedLeftRight) { -// delegate.onAudioLeftChange(audioLeft); -// delegate.onAudioRightChange(audioRight); -// } if (!hasVideo && (progress / (float) audioDuration < audioLeft || progress / (float) audioDuration > audioRight)) { progress = (long) (audioLeft * audioDuration); if (delegate != null) { diff --git a/TMessagesProj/src/main/java/org/telegram/ui/UnlockPremiumView.java b/TMessagesProj/src/main/java/org/telegram/ui/UnlockPremiumView.java index d333d6552..49645f2d2 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/UnlockPremiumView.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/UnlockPremiumView.java @@ -43,7 +43,7 @@ public class UnlockPremiumView extends FrameLayout { } linearLayout.addView(descriptionTextView, LayoutHelper.createLinear(LayoutHelper.MATCH_PARENT, LayoutHelper.WRAP_CONTENT, 0, 16, 17, 17, 16)); - premiumButtonView = new PremiumButtonView(context, false); + premiumButtonView = new PremiumButtonView(context, false, resourcesProvider); String text; if (type == TYPE_STICKERS) { diff --git a/TMessagesProj/src/main/res/values/strings.xml b/TMessagesProj/src/main/res/values/strings.xml index 3b3dc98ad..2dec575fd 100644 --- a/TMessagesProj/src/main/res/values/strings.xml +++ b/TMessagesProj/src/main/res/values/strings.xml @@ -5758,7 +5758,6 @@ 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. @@ -7223,6 +7222,7 @@ Terms of Use boost expires on %s Your channel need %s to enable posting stories.\n\nAsk your Premium subscribers to boost your channel with this link: + Your channel need %1$s to be able post **%2$s** per day.\n\nAsk your Premium subscribers to boost your channel with this link: This channel need %s to enable stories. Help make it possible! This channel need %1$s to be able post **%2$s** per day. Help make it possible! This channel need %s more boosts to enable stories. @@ -7245,4 +7245,5 @@ **%d** stories **%d** stories **%d** stories + Increase Story Limit diff --git a/gradle.properties b/gradle.properties index b50b7cbea..80d2f8393 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=3919 -APP_VERSION_NAME=10.1.0 +APP_VERSION_CODE=3926 +APP_VERSION_NAME=10.1.1 APP_PACKAGE=org.telegram.messenger RELEASE_KEY_PASSWORD=android RELEASE_KEY_ALIAS=androidkey