Merge branch 'dev' into m_10.1.0
This commit is contained in:
commit
7ce29193d2
@ -3,12 +3,12 @@ import cn.hutool.core.util.RuntimeUtil
|
||||
apply plugin: "com.android.application"
|
||||
apply plugin: "kotlin-android"
|
||||
|
||||
def verName = "10.1.0"
|
||||
def verCode = 1141
|
||||
def verName = "10.1.1"
|
||||
def verCode = 1142
|
||||
|
||||
|
||||
def officialVer = "10.1.0"
|
||||
def officialCode = 3919
|
||||
def officialVer = "10.1.1"
|
||||
def officialCode = 3926
|
||||
|
||||
def serviceAccountCredentialsFile = rootProject.file("service_account_credentials.json")
|
||||
|
||||
|
@ -1047,13 +1047,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);
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -1076,6 +1077,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<TLRPC.Update> updates = new ArrayList<>();
|
||||
updates.add(updateStory);
|
||||
MessagesController.getInstance(currentAccount).processUpdateArray(updates, null, null, false, 0);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -296,7 +296,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;
|
||||
|
||||
|
@ -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;
|
||||
@ -287,6 +288,24 @@ public class NotificationsController extends BaseController {
|
||||
private static final LongSparseArray<String> 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) {
|
||||
|
@ -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;
|
||||
|
@ -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);
|
||||
|
@ -425,6 +425,7 @@ public abstract class BaseFragment {
|
||||
FileLog.e(e);
|
||||
}
|
||||
if (storyViewer != null) {
|
||||
storyViewer.onPause();
|
||||
storyViewer.updatePlayingMode();
|
||||
}
|
||||
if (overlayStoryViewer != null) {
|
||||
|
@ -790,7 +790,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;
|
||||
@ -5077,7 +5077,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;
|
||||
@ -7740,7 +7744,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;
|
||||
@ -10322,12 +10330,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();
|
||||
@ -10688,15 +10691,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();
|
||||
|
@ -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);
|
||||
|
@ -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) {
|
||||
|
@ -163,7 +163,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 {
|
||||
|
@ -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();
|
||||
|
@ -934,14 +934,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) {
|
||||
@ -1033,7 +1039,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))
|
||||
|
@ -2864,7 +2864,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)))
|
||||
|
@ -179,6 +179,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;
|
||||
@ -379,6 +381,11 @@ public class ChatAttachAlertPhotoLayout extends ChatAttachAlert.AttachAlertLayou
|
||||
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);
|
||||
@ -1779,6 +1786,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;
|
||||
@ -2186,7 +2207,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
|
||||
@ -2310,6 +2331,9 @@ public class ChatAttachAlertPhotoLayout extends ChatAttachAlert.AttachAlertLayou
|
||||
});
|
||||
cameraInitAnimation.start();
|
||||
}
|
||||
if (afterCameraInitRunnable != null) {
|
||||
afterCameraInitRunnable.run();
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
@ -2355,17 +2379,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) {
|
||||
@ -3519,6 +3549,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) {
|
||||
|
@ -522,7 +522,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();
|
||||
});
|
||||
@ -1568,7 +1568,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();
|
||||
|
@ -3497,7 +3497,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));
|
||||
}
|
||||
@ -3740,7 +3740,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());
|
||||
|
||||
|
@ -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 {
|
||||
|
@ -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);
|
||||
}
|
||||
|
@ -11,35 +11,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<Integer> 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<Integer> 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<Integer> 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 SparseArray<PersistColorPalette> instances = new SparseArray<>();
|
||||
|
||||
private SharedPreferences mConfig;
|
||||
private List<Integer> colors = new ArrayList<>(COLORS_COUNT);
|
||||
private final SharedPreferences mConfig;
|
||||
private final List<Integer> colors = new ArrayList<>(COLORS_COUNT);
|
||||
private final HashMap<Integer, Integer> brushColor = new HashMap<>(Brush.BRUSHES_LIST.size());
|
||||
private List<Integer> pendingChange = new ArrayList<>(COLORS_COUNT);
|
||||
private Integer markerColor;
|
||||
private boolean needSaveBrushColor;
|
||||
|
||||
private int currentBrush;
|
||||
private int currentAlignment;
|
||||
@ -47,6 +65,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);
|
||||
@ -76,6 +95,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;
|
||||
}
|
||||
@ -116,8 +146,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() {
|
||||
@ -131,7 +173,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();
|
||||
}
|
||||
|
||||
@ -143,76 +193,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<Integer> 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<Integer> allColors = getAllColors();
|
||||
for (int i = 0; i < allColors.size(); i++) {
|
||||
if (allColors.get(i) == currentColor) {
|
||||
return i;
|
||||
}
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
private List<Integer> getAllColors() {
|
||||
List<Integer> 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<Integer> allColors = getAllColors();
|
||||
int i = allColors.indexOf(color);
|
||||
if (i != -1) {
|
||||
selectColorIndex(i);
|
||||
if (updateBrush) {
|
||||
setCurrentBrushColorByColorIndex(i);
|
||||
}
|
||||
} else {
|
||||
List<Integer> 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<Integer> 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();
|
||||
}
|
||||
}
|
||||
}
|
@ -264,7 +264,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");
|
||||
@ -660,6 +661,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);
|
||||
@ -673,6 +675,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);
|
||||
|
||||
@ -684,16 +688,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();
|
||||
@ -863,16 +872,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;
|
||||
@ -1271,6 +1282,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 -> {
|
||||
@ -1983,8 +1998,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();
|
||||
}
|
||||
|
||||
@ -2096,12 +2113,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;
|
||||
@ -2115,7 +2136,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();
|
||||
}
|
||||
}
|
||||
|
@ -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<Integer> 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);
|
||||
|
@ -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);
|
||||
|
@ -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() {
|
||||
|
@ -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));
|
||||
|
@ -280,7 +280,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));
|
||||
|
@ -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);
|
||||
|
@ -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();
|
||||
|
@ -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();
|
||||
}
|
||||
}
|
||||
|
@ -321,7 +321,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();
|
||||
|
@ -197,7 +197,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");
|
||||
|
@ -892,7 +892,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));
|
||||
|
@ -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);
|
||||
|
@ -369,6 +369,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;
|
||||
|
@ -585,11 +585,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;
|
||||
}
|
||||
@ -1006,10 +1006,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();
|
||||
}
|
||||
|
||||
@ -2336,6 +2336,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) {
|
||||
@ -3833,15 +3835,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();
|
||||
}
|
||||
@ -4688,7 +4693,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, () -> {
|
||||
@ -4720,7 +4725,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) {
|
||||
@ -4861,16 +4866,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();
|
||||
@ -4882,7 +4895,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(() -> {
|
||||
@ -4890,6 +4903,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);
|
||||
|
@ -2785,7 +2785,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;
|
||||
}
|
||||
@ -6224,9 +6224,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);
|
||||
@ -10217,6 +10214,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) {
|
||||
|
@ -578,7 +578,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);
|
||||
|
||||
|
@ -2280,7 +2280,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);
|
||||
@ -4974,9 +4974,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;
|
||||
@ -5015,7 +5021,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);
|
||||
@ -6461,18 +6467,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);
|
||||
@ -6484,7 +6486,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),
|
||||
@ -6510,9 +6512,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);
|
||||
}
|
||||
}
|
||||
|
||||
@ -6520,6 +6522,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;
|
||||
|
@ -2544,7 +2544,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));
|
||||
}
|
||||
|
@ -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));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -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);
|
||||
}
|
||||
|
||||
@ -3175,8 +3197,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) {
|
||||
@ -3184,12 +3205,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();
|
||||
}
|
||||
@ -4000,6 +4021,8 @@ public class PeerStoriesView extends SizeNotifierFrameLayout implements Notifica
|
||||
}
|
||||
}
|
||||
|
||||
public boolean editOpened;
|
||||
|
||||
public void setActive(boolean active) {
|
||||
setActive(0, active);
|
||||
}
|
||||
@ -4571,7 +4594,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) {
|
||||
@ -4585,7 +4608,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);
|
||||
}
|
||||
@ -4599,7 +4622,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);
|
||||
}
|
||||
@ -4714,15 +4737,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() {
|
||||
|
@ -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();
|
||||
|
@ -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);
|
||||
|
@ -3213,7 +3213,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;
|
||||
|
@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -221,6 +221,8 @@ public class StoryViewer implements NotificationCenter.NotificationCenterDelegat
|
||||
|
||||
private static final LongSparseArray<CharSequence> 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;
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -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);
|
||||
|
@ -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();
|
||||
}
|
||||
}
|
||||
|
@ -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();
|
||||
|
@ -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<Long, Runnable, Boolean> onClosePrepareListener;
|
||||
public void setOnPrepareCloseListener(Utilities.Callback3<Long, Runnable, Boolean> 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();
|
||||
|
@ -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) {
|
||||
|
@ -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) {
|
||||
|
@ -5759,7 +5759,6 @@
|
||||
<string name="BotCantAddToAttachMenu">This bot can\'t be added to the attachment menu.</string>
|
||||
<string name="BotAlreadyAddedToAttachMenu">This bot is already in your attachment menu.</string>
|
||||
<string name="BotRemoveFromMenu">This will remove **%1$s** shortcuts from all menus.</string>
|
||||
<string name="BotRemoveFromMenuAll">This will remove **%1$s** shortcuts from all menus.</string>
|
||||
<string name="BotRemoveInlineFromMenu">Remove **%1$s** from suggestions?</string>
|
||||
<string name="BotWebViewRequestGeolocationPermission">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.</string>
|
||||
<string name="BotWebViewRequestGeolocationPermissionWithHint">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.</string>
|
||||
@ -7224,6 +7223,7 @@
|
||||
<string name="TermsOfUse">Terms of Use</string>
|
||||
<string name="BoostExpireOn">boost expires on %s</string>
|
||||
<string name="ChannelNeedBoostsDescription">Your channel need %s to enable posting stories.\n\nAsk your Premium subscribers to boost your channel with this link:</string>
|
||||
<string name="ChannelNeedBoostsDescriptionNextLevel">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:</string>
|
||||
<string name="ChannelNeedBoostsDescriptionLevel1">This channel need %s to enable stories. Help make it possible!</string>
|
||||
<string name="ChannelNeedBoostsDescriptionLevelNext">This channel need %1$s to be able post **%2$s** per day. Help make it possible!</string>
|
||||
<string name="ChannelNeedBoostsAlreadyBoostedDescriptionLevel1">This channel need %s more boosts to enable stories.</string>
|
||||
@ -7246,4 +7246,5 @@
|
||||
<string name="BoostStories_few">**%d** stories</string>
|
||||
<string name="BoostStories_many">**%d** stories</string>
|
||||
<string name="BoostStories_other">**%d** stories</string>
|
||||
<string name="BoostingIncreaseLevel">Increase Story Limit</string>
|
||||
</resources>
|
||||
|
Loading…
Reference in New Issue
Block a user