Update to 8.5.1

This commit is contained in:
xaxtix 2022-02-12 08:22:45 +03:00
parent 146cea26cd
commit 3b4919a542
99 changed files with 1900 additions and 816 deletions

View File

@ -300,7 +300,7 @@ android {
}
}
defaultConfig.versionCode = 2551
defaultConfig.versionCode = 2563
applicationVariants.all { variant ->
variant.outputs.all { output ->
@ -319,7 +319,7 @@ android {
defaultConfig {
minSdkVersion 16
targetSdkVersion 30
versionName "8.5.1"
versionName "8.5.2"
vectorDrawables.generatedDensities = ['mdpi', 'hdpi', 'xhdpi', 'xxhdpi']

View File

@ -1179,9 +1179,9 @@ static inline void writeFrameToBitmap(JNIEnv *env, VideoInfo *info, jintArray da
void *pixels;
if (AndroidBitmap_lockPixels(env, bitmap, &pixels) >= 0) {
if (info->sws_ctx == nullptr) {
if (info->frame->format > AV_PIX_FMT_NONE && info->frame->format < AV_PIX_FMT_NB && !info->frame->format == AV_PIX_FMT_YUVA420P) {
if (info->frame->format > AV_PIX_FMT_NONE && info->frame->format < AV_PIX_FMT_NB && info->frame->format != AV_PIX_FMT_YUVA420P) {
info->sws_ctx = sws_getContext(info->frame->width, info->frame->height, (AVPixelFormat) info->frame->format, bitmapWidth, bitmapHeight, AV_PIX_FMT_RGBA, SWS_BILINEAR, NULL, NULL, NULL);
} else if (info->video_dec_ctx->pix_fmt > AV_PIX_FMT_NONE && info->video_dec_ctx->pix_fmt < AV_PIX_FMT_NB && !info->frame->format == AV_PIX_FMT_YUVA420P) {
} else if (info->video_dec_ctx->pix_fmt > AV_PIX_FMT_NONE && info->video_dec_ctx->pix_fmt < AV_PIX_FMT_NB && info->frame->format != AV_PIX_FMT_YUVA420P) {
info->sws_ctx = sws_getContext(info->video_dec_ctx->width, info->video_dec_ctx->height, info->video_dec_ctx->pix_fmt, bitmapWidth, bitmapHeight, AV_PIX_FMT_RGBA, SWS_BILINEAR, NULL, NULL, NULL);
}
}
@ -1203,8 +1203,7 @@ static inline void writeFrameToBitmap(JNIEnv *env, VideoInfo *info, jintArray da
uint8_t __attribute__ ((aligned (16))) *dst_data[1];
dst_data[0] = (uint8_t *) pixels;
info->dst_linesize[0] = stride;
sws_scale(info->sws_ctx, info->frame->data, info->frame->linesize, 0,
info->frame->height, dst_data, info->dst_linesize);
sws_scale(info->sws_ctx, info->frame->data, info->frame->linesize, 0, info->frame->height, dst_data, info->dst_linesize);
}
}
AndroidBitmap_unlockPixels(env, bitmap);

View File

@ -740,7 +740,7 @@ public class AndroidUtilities {
writer.flush();
writer.close();
} catch (Throwable e) {
FileLog.e(e);
FileLog.e(e, false);
}
}

View File

@ -77,7 +77,7 @@ public class AnimatedFileDrawableStream implements FileLoadOperationStream {
}
lastOffset = offset + availableLength;
} catch (Exception e) {
FileLog.e(e);
FileLog.e(e, false);
}
return availableLength;
}

View File

@ -21,13 +21,19 @@ import android.content.SharedPreferences;
import android.content.pm.ApplicationInfo;
import android.content.res.Configuration;
import android.net.ConnectivityManager;
import android.net.Network;
import android.net.NetworkCapabilities;
import android.net.NetworkInfo;
import android.os.Build;
import android.os.Handler;
import android.os.PowerManager;
import android.os.SystemClock;
import android.telephony.TelephonyManager;
import android.text.TextUtils;
import androidx.annotation.NonNull;
import androidx.multidex.MultiDex;
import com.google.android.gms.common.ConnectionResult;
import com.google.android.gms.common.GooglePlayServicesUtil;
import com.google.firebase.messaging.FirebaseMessaging;
@ -39,8 +45,6 @@ import org.telegram.ui.Components.ForegroundDetector;
import java.io.File;
import androidx.multidex.MultiDex;
public class ApplicationLoader extends Application {
@SuppressLint("StaticFieldLeak")
@ -50,6 +54,8 @@ public class ApplicationLoader extends Application {
private static ConnectivityManager connectivityManager;
private static volatile boolean applicationInited = false;
private static long lastNetworkCheckTypeTime;
private static int lastKnownNetworkType = -1;
public static long startTime;
@ -312,6 +318,20 @@ public class ApplicationLoader extends Application {
connectivityManager = (ConnectivityManager) ApplicationLoader.applicationContext.getSystemService(Context.CONNECTIVITY_SERVICE);
}
currentNetworkInfo = connectivityManager.getActiveNetworkInfo();
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
connectivityManager.registerDefaultNetworkCallback(new ConnectivityManager.NetworkCallback() {
@Override
public void onAvailable(@NonNull Network network) {
lastKnownNetworkType = -1;
}
@Override
public void onCapabilitiesChanged(@NonNull Network network, @NonNull NetworkCapabilities networkCapabilities) {
super.onCapabilitiesChanged(network, networkCapabilities);
lastKnownNetworkType = -1;
}
});
}
} catch (Throwable ignore) {
}
@ -381,11 +401,16 @@ public class ApplicationLoader extends Application {
return StatsController.TYPE_MOBILE;
}
if (currentNetworkInfo.getType() == ConnectivityManager.TYPE_WIFI || currentNetworkInfo.getType() == ConnectivityManager.TYPE_ETHERNET) {
if (connectivityManager.isActiveNetworkMetered()) {
return StatsController.TYPE_MOBILE;
} else {
return StatsController.TYPE_WIFI;
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N && (lastKnownNetworkType == StatsController.TYPE_MOBILE || lastKnownNetworkType == StatsController.TYPE_WIFI) && System.currentTimeMillis() - lastNetworkCheckTypeTime < 5000) {
return lastKnownNetworkType;
}
if (connectivityManager.isActiveNetworkMetered()) {
lastKnownNetworkType = StatsController.TYPE_MOBILE;
} else {
lastKnownNetworkType = StatsController.TYPE_WIFI;
}
lastNetworkCheckTypeTime = System.currentTimeMillis();
return lastKnownNetworkType;
}
if (currentNetworkInfo.isRoaming()) {
return StatsController.TYPE_ROAMING;

View File

@ -20,8 +20,8 @@ public class BuildVars {
public static boolean USE_CLOUD_STRINGS = true;
public static boolean CHECK_UPDATES = true;
public static boolean NO_SCOPED_STORAGE = Build.VERSION.SDK_INT <= 29;
public static int BUILD_VERSION = 2551;
public static String BUILD_VERSION_STRING = "8.5.1";
public static int BUILD_VERSION = 2563;
public static String BUILD_VERSION_STRING = "8.5.2";
public static int APP_ID = 4;
public static String APP_HASH = "014b35b6184100b085b0d0572f9b5103";

View File

@ -1107,6 +1107,9 @@ public class FileLoader extends BaseController {
}
public static String getDocumentFileName(TLRPC.Document document) {
if (document.file_name_fixed != null) {
return document.file_name_fixed;
}
String fileName = null;
if (document != null) {
if (document.file_name != null) {

View File

@ -1074,6 +1074,7 @@ public class GcmPushListenerService extends FirebaseMessagingService {
messageOwner.from_scheduled = scheduled;
MessageObject messageObject = new MessageObject(currentAccount, messageOwner, messageText, name, userName, localMessage, channel, supergroup, edited);
messageObject.isReactionPush = loc_key.startsWith("REACT_") || loc_key.startsWith("CHAT_REACT_");
ArrayList<MessageObject> arrayList = new ArrayList<>();
arrayList.add(messageObject);
canRelease = false;

View File

@ -51,6 +51,7 @@ import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.InterruptedIOException;
import java.io.RandomAccessFile;
import java.net.HttpURLConnection;
import java.net.SocketException;
@ -534,7 +535,7 @@ public class ImageLoader {
} else if (e instanceof FileNotFoundException) {
canRetry = false;
sentLogs = false;
} else if (e instanceof InterruptedException) {
} else if (e instanceof InterruptedIOException) {
sentLogs = false;
}
FileLog.e(e, sentLogs);

View File

@ -418,6 +418,7 @@ public class ImageReceiver implements NotificationCenter.NotificationCenterDeleg
currentExt = ext;
currentParentObject = null;
currentCacheType = 0;
roundPaint.setShader(null);
staticThumbDrawable = thumb;
currentAlpha = 1.0f;
previousAlpha = 1f;
@ -573,6 +574,7 @@ public class ImageReceiver implements NotificationCenter.NotificationCenterDeleg
mediaShader = null;
legacyShader = null;
legacyCanvas = null;
roundPaint.setShader(null);
if (legacyBitmap != null) {
legacyBitmap.recycle();
legacyBitmap = null;
@ -721,6 +723,7 @@ public class ImageReceiver implements NotificationCenter.NotificationCenterDeleg
fileDrawable.setAllowDecodeSingleFrame(true);
}
thumbShader = null;
roundPaint.setShader(null);
staticThumbDrawable = bitmap;
updateDrawableRadius(bitmap);
currentMediaLocation = null;
@ -865,6 +868,7 @@ public class ImageReceiver implements NotificationCenter.NotificationCenterDeleg
if (staticThumbDrawable != null) {
staticThumbDrawable = null;
thumbShader = null;
roundPaint.setShader(null);
}
clearImage();
if (isPressed == 0) {
@ -1005,9 +1009,6 @@ public class ImageReceiver implements NotificationCenter.NotificationCenterDeleg
bitmapW = bitmapDrawable.getIntrinsicWidth();
bitmapH = bitmapDrawable.getIntrinsicHeight();
}
if (parentView != null) {
parentView.invalidate();
}
} else {
Bitmap bitmap = bitmapDrawable.getBitmap();
if (bitmap != null && bitmap.isRecycled()) {
@ -2408,6 +2409,7 @@ public class ImageReceiver implements NotificationCenter.NotificationCenterDeleg
currentThumbKey = null;
currentThumbDrawable = null;
thumbShader = null;
roundPaint.setShader(null);
staticThumbDrawable = new BitmapDrawable(null, thumb);
crossfadeWithThumb = true;
currentAlpha = 0f;

View File

@ -3694,6 +3694,7 @@ public class MediaController implements AudioManager.OnAudioFocusChangeListener,
}
if (sourceFile.exists()) {
saveFileInternal(isMusic ? 3 : 2, sourceFile, name);
copiedFiles++;
}
}
} else {
@ -3744,6 +3745,7 @@ public class MediaController implements AudioManager.OnAudioFocusChangeListener,
}
if (sourceFile.exists()) {
copyFile(sourceFile, destFile, message.getMimeType());
copiedFiles++;
}
}
}
@ -3863,7 +3865,6 @@ public class MediaController implements AudioManager.OnAudioFocusChangeListener,
FileLog.e(e);
}
});
copiedFiles++;
return true;
}
} catch (Exception e) {

View File

@ -98,6 +98,7 @@ public class MessageObject {
public long reactionsLastCheckTime;
public String customName;
public boolean reactionsChanged;
public boolean isReactionPush;
private int isRoundVideoCached;
public long eventId;
public int contentType;
@ -5057,7 +5058,7 @@ public class MessageObject {
}
public static boolean canAutoplayAnimatedSticker(TLRPC.Document document) {
return isAnimatedStickerDocument(document, true) && SharedConfig.getDevicePerformanceClass() != SharedConfig.PERFORMANCE_CLASS_LOW;
return (isAnimatedStickerDocument(document, true) || isVideoStickerDocument(document)) && SharedConfig.getDevicePerformanceClass() != SharedConfig.PERFORMANCE_CLASS_LOW;
}
public static boolean isMaskDocument(TLRPC.Document document) {
@ -6318,7 +6319,7 @@ public class MessageObject {
return !isEditing() && !isSponsored() && isSent() && messageOwner.action == null;
}
public boolean selectReaction(String reaction, boolean fromDoubleTap) {
public boolean selectReaction(String reaction, boolean big, boolean fromDoubleTap) {
if (messageOwner.reactions == null) {
messageOwner.reactions = new TLRPC.TL_messageReactions();
messageOwner.reactions.can_see_list = isFromGroup() || isFromUser();
@ -6335,6 +6336,10 @@ public class MessageObject {
}
}
if (choosenReaction != null && choosenReaction == newReaction && big) {
return true;
}
if (choosenReaction != null && (choosenReaction == newReaction || fromDoubleTap)) {
choosenReaction.chosen = false;
choosenReaction.count--;

View File

@ -14004,7 +14004,7 @@ public class MessagesController extends BaseController implements NotificationCe
return true;
}
private void checkUnreadReactions(long dialogId, SparseBooleanArray unreadReactions) {
public void checkUnreadReactions(long dialogId, SparseBooleanArray unreadReactions) {
getMessagesStorage().getStorageQueue().postRunnable(() -> {
boolean needReload = false;
boolean changed = false;
@ -14071,6 +14071,7 @@ public class MessagesController extends BaseController implements NotificationCe
AndroidUtilities.runOnUIThread(() -> {
TLRPC.Dialog dialog = dialogs_dict.get(dialogId);
if (dialog == null) {
getMessagesStorage().updateDialogUnreadReactions(dialogId, count, false);
return;
}
dialog.unread_reactions_count = count;
@ -14084,6 +14085,7 @@ public class MessagesController extends BaseController implements NotificationCe
AndroidUtilities.runOnUIThread(() -> {
TLRPC.Dialog dialog = dialogs_dict.get(dialogId);
if (dialog == null) {
getMessagesStorage().updateDialogUnreadReactions(dialogId, finalNewUnreadCount, true);
return;
}
dialog.unread_reactions_count += finalNewUnreadCount;

View File

@ -134,18 +134,38 @@ public class MessagesStorage extends BaseController {
state.dispose();
data.reuse();
} catch (Exception e) {
e.printStackTrace();
FileLog.e(e);
}
}
getMessagesStorage().getDatabase().executeFast("UPDATE reaction_mentions SET state = 0 WHERE uid = %d AND ");
} catch (SQLiteException e) {
e.printStackTrace();
FileLog.e(e);
}
}
public void updateDialogUnreadReactions(long dialogId, int newUnreadCount, boolean increment) {
storageQueue.postRunnable(() -> {
try {
int oldUnreadRactions = 0;
if (increment) {
SQLiteCursor cursor = database.queryFinalized("SELECT unread_reactions FROM dialogs WHERE did = " + dialogId);
if (cursor.next()) {
oldUnreadRactions = Math.max(0, cursor.intValue(0));
}
cursor.dispose();
}
oldUnreadRactions += newUnreadCount;
SQLitePreparedStatement state = getMessagesStorage().getDatabase().executeFast("UPDATE dialogs SET unread_reactions = ? WHERE did = ?");
state.bindInteger(1, oldUnreadRactions);
state.bindLong(2, dialogId);
state.step();
state.dispose();
} catch (SQLiteException e) {
e.printStackTrace();
}
});
}
public interface IntCallback {
void run(int param);
}
@ -194,7 +214,7 @@ public class MessagesStorage extends BaseController {
private CountDownLatch openSync = new CountDownLatch(1);
private static volatile MessagesStorage[] Instance = new MessagesStorage[UserConfig.MAX_ACCOUNT_COUNT];
private final static int LAST_DB_VERSION = 89;
private final static int LAST_DB_VERSION = 90;
private boolean databaseMigrationInProgress;
public static MessagesStorage getInstance(int num) {
@ -438,7 +458,7 @@ public class MessagesStorage extends BaseController {
database.executeFast("INSERT INTO params VALUES(1, 0, 0, 0, 0, 0, 0, NULL)").stepThis().dispose();
database.executeFast("CREATE TABLE media_v4(mid INTEGER, uid INTEGER, date INTEGER, type INTEGER, data BLOB, PRIMARY KEY(mid, uid, type))").stepThis().dispose();
database.executeFast("CREATE INDEX IF NOT EXISTS uid_mid_type_date_idx_media_v3 ON media_v4(uid, mid, type, date);").stepThis().dispose();
database.executeFast("CREATE INDEX IF NOT EXISTS uid_mid_type_date_idx_media_v4 ON media_v4(uid, mid, type, date);").stepThis().dispose();
database.executeFast("CREATE TABLE bot_keyboard(uid INTEGER PRIMARY KEY, mid INTEGER, info BLOB)").stepThis().dispose();
database.executeFast("CREATE INDEX IF NOT EXISTS bot_keyboard_idx_mid_v2 ON bot_keyboard(mid, uid);").stepThis().dispose();
@ -500,7 +520,9 @@ public class MessagesStorage extends BaseController {
database.executeFast("CREATE INDEX IF NOT EXISTS polls_id_v2 ON polls_v2(id);").stepThis().dispose();
database.executeFast("CREATE TABLE reactions(data BLOB, hash INTEGER, date INTEGER);").stepThis().dispose();
database.executeFast("CREATE TABLE reaction_mentions(message_id INTEGER PRIMARY KEY, state INTEGER, dialog_id INTEGER);").stepThis().dispose();
database.executeFast("CREATE TABLE reaction_mentions(message_id INTEGER, state INTEGER, dialog_id INTEGER, PRIMARY KEY(message_id, dialog_id))").stepThis().dispose();
database.executeFast("CREATE INDEX IF NOT EXISTS reaction_mentions_did ON reaction_mentions(dialog_id);").stepThis().dispose();
//version
database.executeFast("PRAGMA user_version = " + LAST_DB_VERSION).stepThis().dispose();
} else {
@ -1641,11 +1663,18 @@ public class MessagesStorage extends BaseController {
version = 88;
}
if (version == 88) {
if (version == 88 || version == 89) {
long time = System.currentTimeMillis();
database.executeFast("DROP TABLE IF EXISTS reaction_mentions;").stepThis().dispose();
database.executeFast("CREATE TABLE reaction_mentions(message_id INTEGER PRIMARY KEY, state INTEGER, dialog_id INTEGER);").stepThis().dispose();
database.executeFast("PRAGMA user_version = 89").stepThis().dispose();
version = 89;
database.executeFast("CREATE TABLE IF NOT EXISTS reaction_mentions(message_id INTEGER, state INTEGER, dialog_id INTEGER, PRIMARY KEY(dialog_id, message_id));").stepThis().dispose();
database.executeFast("CREATE INDEX IF NOT EXISTS reaction_mentions_did ON reaction_mentions(dialog_id);").stepThis().dispose();
database.executeFast("DROP INDEX IF EXISTS uid_mid_type_date_idx_media_v3").stepThis().dispose();
database.executeFast("CREATE INDEX IF NOT EXISTS uid_mid_type_date_idx_media_v4 ON media_v4(uid, mid, type, date);").stepThis().dispose();
database.executeFast("PRAGMA user_version = 90").stepThis().dispose();
version = 90;
}
FileLog.d("MessagesStorage db migration finished");
@ -10279,6 +10308,7 @@ public class MessagesStorage extends BaseController {
state.dispose();
}
}
long time = System.currentTimeMillis();
database.executeFast(String.format(Locale.US, "DELETE FROM media_v4 WHERE mid IN(%s) AND uid = %d", ids, did)).stepThis().dispose();
}
database.executeFast(String.format(Locale.US, "DELETE FROM messages_seq WHERE mid IN(%s)", ids)).stepThis().dispose();

View File

@ -55,6 +55,7 @@ import androidx.core.content.pm.ShortcutManagerCompat;
import androidx.core.graphics.drawable.IconCompat;
import android.text.TextUtils;
import android.util.SparseArray;
import android.util.SparseBooleanArray;
import org.telegram.messenger.support.LongSparseIntArray;
import org.telegram.tgnet.ConnectionsManager;
@ -675,6 +676,9 @@ public class NotificationsController extends BaseController {
break;
}
MessageObject oldMessage = sparseArray.get(messageObject.getId());
if (oldMessage != null && oldMessage.isReactionPush) {
oldMessage = null;
}
if (oldMessage != null) {
updated = true;
sparseArray.put(messageObject.getId(), messageObject);
@ -831,6 +835,11 @@ public class NotificationsController extends BaseController {
pushDialogsOverrideMention.put(originalDialogId, current == null ? 1 : current + 1);
}
}
if (messageObject.isReactionPush) {
SparseBooleanArray sparseBooleanArray = new SparseBooleanArray();
sparseBooleanArray.put(mid, true);
getMessagesController().checkUnreadReactions(dialogId, sparseBooleanArray);
}
}
if (added) {
@ -873,9 +882,6 @@ public class NotificationsController extends BaseController {
boolean canAddValue;
if (notifyOverride == -1) {
canAddValue = isGlobalNotificationsEnabled(dialog_id, isChannel);
/*if (BuildVars.DEBUG_PRIVATE_VERSION && BuildVars.LOGS_ENABLED) {
FileLog.d("global notify settings for " + dialog_id + " = " + canAddValue);
}*/
} else {
canAddValue = notifyOverride != 2;
}
@ -3913,6 +3919,7 @@ public class NotificationsController extends BaseController {
arrayList.add(messageObject);
}
LongSparseArray<Integer> oldIdsWear = new LongSparseArray<>();
for (int i = 0; i < wearNotificationsIds.size(); i++) {
oldIdsWear.put(wearNotificationsIds.keyAt(i), wearNotificationsIds.valueAt(i));
@ -3977,7 +3984,13 @@ public class NotificationsController extends BaseController {
}
MessageObject lastMessageObject = messageObjects.get(0);
int maxDate = lastMessageObject.messageOwner.date;
int maxDate = 0;
for (int i = 0; i < messageObjects.size(); i++) {
if (maxDate < messageObjects.get(i).messageOwner.date) {
maxDate = messageObjects.get(i).messageOwner.date;
}
}
TLRPC.Chat chat = null;
TLRPC.User user = null;
boolean isChannel = false;

View File

@ -94,7 +94,7 @@ public class SharedConfig {
public static boolean chatBubbles = Build.VERSION.SDK_INT >= 30;
public static boolean autoplayGifs = true;
public static boolean autoplayVideo = true;
public static boolean raiseToSpeak = true;
public static boolean raiseToSpeak = false;
public static boolean customTabs = true;
public static boolean directShare = true;
public static boolean inappCamera = true;
@ -331,7 +331,7 @@ public class SharedConfig {
autoplayGifs = preferences.getBoolean("autoplay_gif", true);
autoplayVideo = preferences.getBoolean("autoplay_video", true);
mapPreviewType = preferences.getInt("mapPreviewType", 2);
raiseToSpeak = preferences.getBoolean("raise_to_speak", true);
raiseToSpeak = preferences.getBoolean("raise_to_speak", false);
customTabs = preferences.getBoolean("custom_tabs", true);
directShare = preferences.getBoolean("direct_share", true);
shuffleMusic = preferences.getBoolean("shuffleMusic", false);

View File

@ -172,10 +172,21 @@ public class Browser {
}
public static boolean isTelegraphUrl(String url, boolean equals) {
return isTelegraphUrl(url, equals, false);
}
public static boolean isTelegraphUrl(String url, boolean equals, boolean forceHttps) {
if (equals) {
return url.equals("telegra.ph") || url.equals("te.legra.ph") || url.equals("graph.org");
}
return url.matches("^(https?://)?(te\\.?legra\\.ph|graph\\.org).*"); // telegra.ph, te.legra.ph, graph.org
return url.matches("^(https" + (forceHttps ? "" : "?") + "://)?(te\\.?legra\\.ph|graph\\.org).*"); // telegra.ph, te.legra.ph, graph.org
}
public static boolean urlMustNotHaveConfirmation(String url) {
return (
isTelegraphUrl(url, false, true) ||
url.matches("^(https://)?t\\.me/iv\\??.*") || // t.me/iv?
url.matches("^(https://)?telegram\\.org/(blog|tour)/?.*") // telegram.org/blog, telegram.org/tour
);
}
public static void openUrl(final Context context, Uri uri, final boolean allowCustom, boolean tryTelegraph) {

View File

@ -12,6 +12,7 @@ import android.graphics.drawable.BitmapDrawable;
import android.os.Build;
import android.text.TextUtils;
import org.telegram.messenger.FileLoader;
import org.telegram.messenger.FileLog;
import org.telegram.messenger.ImageLoader;
import org.telegram.messenger.Utilities;
@ -24200,6 +24201,7 @@ public class TLRPC {
public byte[] key;
public byte[] iv;
public ArrayList<DocumentAttribute> attributes = new ArrayList<>();
public String file_name_fixed; //custom
public static Document TLdeserialize(AbstractSerializedData stream, int constructor, boolean exception) {
Document result = null;
@ -24237,6 +24239,7 @@ public class TLRPC {
}
if (result != null) {
result.readParams(stream, exception);
result.file_name_fixed = FileLoader.getDocumentFileName(result);
}
return result;
}

View File

@ -14,8 +14,6 @@ import android.widget.TextView;
import org.telegram.messenger.AndroidUtilities;
import org.telegram.messenger.LocaleController;
import org.telegram.messenger.R;
import org.telegram.ui.Components.CheckBox;
import org.telegram.ui.Components.CheckBox2;
import org.telegram.ui.Components.LayoutHelper;
@ -128,6 +126,7 @@ public class ActionBarMenuSubItem extends FrameLayout {
textView.setLines(2);
textView.setTextSize(TypedValue.COMPLEX_UNIT_DIP, 14);
textView.setSingleLine(false);
textView.setGravity(Gravity.CENTER_VERTICAL);
}
public void setTextAndIcon(CharSequence text, int icon, Drawable iconDrawable) {

View File

@ -868,6 +868,9 @@ public class AlertDialog extends Dialog implements Drawable.Callback {
if (dimEnabled) {
params.dimAmount = 0.6f;
params.flags |= WindowManager.LayoutParams.FLAG_DIM_BEHIND;
} else {
params.dimAmount = 0f;
params.flags ^= WindowManager.LayoutParams.FLAG_DIM_BEHIND;
}
lastScreenWidth = AndroidUtilities.displaySize.x;

View File

@ -842,12 +842,7 @@ public final class FloatingToolbar {
if (menuItemButton instanceof LinearLayout) {
((LinearLayout) menuItemButton).setGravity(Gravity.CENTER);
}
if (isFirstItem) {
menuItemButton.setPaddingRelative((int) (1.5 * menuItemButton.getPaddingStart()), menuItemButton.getPaddingTop(), menuItemButton.getPaddingEnd(), menuItemButton.getPaddingBottom());
}
if (isLastItem) {
menuItemButton.setPaddingRelative(menuItemButton.getPaddingStart(), menuItemButton.getPaddingTop(), (int) (1.5 * menuItemButton.getPaddingEnd()), menuItemButton.getPaddingBottom());
}
menuItemButton.setPaddingRelative((int) ((isFirstItem ? 1.5 : 1) * menuItemButton.getPaddingStart()), menuItemButton.getPaddingTop(), (int) ((isLastItem ? 1.5 : 1) * menuItemButton.getPaddingEnd()), menuItemButton.getPaddingBottom());
menuItemButton.measure(MeasureSpec.UNSPECIFIED, MeasureSpec.UNSPECIFIED);
final int menuItemButtonWidth = Math.min(menuItemButton.getMeasuredWidth(), toolbarWidth);
final boolean canFitWithOverflow = menuItemButtonWidth <= availableWidth - mOverflowButtonSize.getWidth();
@ -873,6 +868,10 @@ public final class FloatingToolbar {
return remainingMenuItems;
}
private void updateMainPanelItemsSelectors() {
}
@SuppressWarnings("unchecked")
private void layoutOverflowPanelItems(List<MenuItem> menuItems) {
ArrayAdapter<MenuItem> overflowPanelAdapter = (ArrayAdapter<MenuItem>) mOverflowPanel.getAdapter();
@ -1216,8 +1215,8 @@ public final class FloatingToolbar {
} else if (currentStyle == STYLE_THEME) {
textView.setTextColor(getThemedColor(Theme.key_windowBackgroundWhiteBlackText));
}
if (first) {
menuItemButton.setBackgroundDrawable(Theme.createRadSelectorDrawable(selectorColor, first ? 6 : 0, 0, 0, first ? 6 : 0));
if (first || last) {
menuItemButton.setBackgroundDrawable(Theme.createRadSelectorDrawable(selectorColor, first ? 6 : 0, last ? 6 : 0, last ? 6 : 0, first ? 6 : 0));
} else {
menuItemButton.setBackgroundDrawable(Theme.getSelectorDrawable(selectorColor, false));
}

View File

@ -95,6 +95,7 @@ import org.telegram.ui.Components.ChatThemeBottomSheet;
import org.telegram.ui.Components.ChoosingStickerStatusDrawable;
import org.telegram.ui.Components.CombinedDrawable;
import org.telegram.ui.Components.FragmentContextViewWavesDrawable;
import org.telegram.ui.Components.LinkPath;
import org.telegram.ui.Components.MotionBackgroundDrawable;
import org.telegram.ui.Components.MsgClockDrawable;
import org.telegram.ui.Components.PathAnimator;
@ -1517,9 +1518,129 @@ public class Theme {
if (backgroundRotation != 45) {
currentColors.put(key_chat_wallpaper_gradient_rotation, backgroundRotation);
}
if (!isDarkTheme) {
int outBubble;
if (isDarkTheme) {
outBubble = averageColor(currentColors, key_chat_outBubbleGradient1, key_chat_outBubbleGradient2, key_chat_outBubbleGradient3);
} else if (currentColors.containsKey(key_chat_outBubble)) {
outBubble = currentColors.get(key_chat_outBubble);
} else {
outBubble = getColor(key_chat_outBubble);
}
int inBubbleSelected;
if (currentColors.containsKey(key_chat_inBubbleSelected)) {
inBubbleSelected = currentColors.get(key_chat_inBubbleSelected);
} else {
inBubbleSelected = getColor(key_chat_inBubbleSelected);
}
int gradientAverageColor = 0;
if (isDarkTheme) {
gradientAverageColor = outBubble;
}
if (gradientAverageColor == 0) {
gradientAverageColor = averageColor(currentColors, key_chat_wallpaper_gradient_to1, key_chat_wallpaper_gradient_to2, key_chat_wallpaper_gradient_to3);
}
if (gradientAverageColor == 0) {
gradientAverageColor = averageColor(currentColors, key_chat_wallpaper);
}
int selectedBackground = currentColors.containsKey(key_chat_selectedBackground) ? currentColors.get(key_chat_selectedBackground) : getColor(key_chat_selectedBackground);
selectedBackground = applyHue(selectedBackground, gradientAverageColor);
selectedBackground = darkenColor(selectedBackground, .1f);
selectedBackground = Color.argb((int) (Color.alpha(selectedBackground) * 0.8f), Color.red(selectedBackground), Color.green(selectedBackground), Color.blue(selectedBackground));
currentColors.put(key_chat_selectedBackground, selectedBackground);
int outBubbleOverlay = bubbleSelectedOverlay(outBubble);
currentColors.put(key_chat_outBubbleGradientSelectedOverlay, outBubbleOverlay);
inBubbleSelected = applyHue(inBubbleSelected, gradientAverageColor);
inBubbleSelected = shiftHSV(inBubbleSelected, 0, .04f, 0);
currentColors.put(key_chat_inBubbleSelected, inBubbleSelected);
final String[] inTextSelectedKeys = new String[] {
key_chat_inTimeSelectedText, key_chat_inAdminSelectedText, key_chat_inAudioDurationSelectedText,
key_chat_inAudioPerformerSelectedText, key_chat_inFileInfoSelectedText, key_chat_inContactPhoneSelectedText,
key_chat_inPreviewInstantSelectedText, key_chat_inVenueInfoSelectedText, key_chat_inReplyMediaMessageSelectedText
};
for (String inTextSelectedKey : inTextSelectedKeys) {
int color = currentColors.containsKey(inTextSelectedKey) ? currentColors.get(inTextSelectedKey) : getColor(inTextSelectedKey);
currentColors.put(inTextSelectedKey, applyHue(color, gradientAverageColor));
}
int outTimeSelected = currentColors.containsKey(key_chat_outTimeSelectedText) ? currentColors.get(key_chat_outTimeSelectedText) : getColor(key_chat_outTimeSelectedText);
double contrast = ColorUtils.calculateContrast(outTimeSelected, mix(outBubble, outBubbleOverlay));
currentColors.put(key_chat_outTimeSelectedText, shiftHSV(outTimeSelected, .02f, .01f, contrast < 1.9d ? -.1f : 0f));
// currentColors.put(key_chat_outTimeSelectedText, applyHue(outTimeSelected, gradientAverageColor));
}
return !isMyMessagesGradientColorsNear;
}
private float[] tempHSV = new float[3];
private int bubbleSelectedOverlay(int bubble) {
Color.colorToHSV(bubble, tempHSV);
if (tempHSV[1] > 0) {
tempHSV[1] = Math.max(0, Math.min(1, tempHSV[1] + .6f));
tempHSV[2] = Math.max(0, Math.min(1, tempHSV[2] - .05f));
} else {
tempHSV[2] = Math.max(0, Math.min(1, tempHSV[2] - .6f));
}
return Color.HSVToColor(30, tempHSV);
}
private int applyHue(int base, int colorWithHue) {
Color.colorToHSV(colorWithHue, tempHSV);
float h = tempHSV[0];
Color.colorToHSV(base, tempHSV);
tempHSV[0] = h;
return Color.HSVToColor(Color.alpha(base), tempHSV);
}
private int shiftHSV(int color, float hue, float sat, float val) {
Color.colorToHSV(color, tempHSV);
tempHSV[0] += hue;
tempHSV[1] += sat;
tempHSV[2] += val;
return Color.HSVToColor(Color.alpha(color), tempHSV);
}
private int darkenColor(int color, float subtractValue) {
Color.colorToHSV(color, tempHSV);
tempHSV[2] = Math.max(0, Math.min(1, tempHSV[2] - subtractValue));
return Color.HSVToColor(Color.alpha(color), tempHSV);
}
private int mix(int y, int x) {
float ax = Color.alpha(x) / 255f,
ay = Color.alpha(y) / 255f,
az = (ax + ay * (1 - ax));
if (az == 0f)
return 0;
return Color.argb(
(int) (az * 255),
(int) ((Color.red(x) * ax + Color.red(y) * ay * (1 - ax)) / az),
(int) ((Color.green(x) * ax + Color.green(y) * ay * (1 - ax)) / az),
(int) ((Color.blue(x) * ax + Color.blue(y) * ay * (1 - ax)) / az)
);
}
private int averageColor(HashMap<String, Integer> colors, int alpha, String ...keys) {
int r = 0, g = 0, b = 0, c = 0;
for (int i = 0; i < keys.length; ++i) {
if (!colors.containsKey(keys[i])) {
continue;
}
try {
int color = colors.get(keys[i]);
r += Color.red(color);
g += Color.green(color);
b += Color.blue(color);
c++;
} catch (Exception ignore) {}
}
if (c == 0) {
return 0;
}
return Color.argb(alpha, r / c, g / c, b / c);
}
private int averageColor(HashMap<String, Integer> colors, String ...keys) {
return averageColor(colors, 255, keys);
}
public File getPathToWallpaper() {
if (id < 100) {
return !TextUtils.isEmpty(patternSlug) ? new File(ApplicationLoader.getFilesDirFixed(), String.format(Locale.US, "%s_%d_%s_v5.jpg", parentTheme.getKey(), id, patternSlug)) : null;
@ -2375,6 +2496,9 @@ public class Theme {
return null;
}
ThemeAccent accent = themeAccentsMap.get(currentAccentId);
if (accent == null) {
return null;
}
if (createNew) {
int id = ++lastAccentId;
ThemeAccent themeAccent = new ThemeAccent();
@ -2663,6 +2787,7 @@ public class Theme {
public static Paint dialogs_errorPaint;
public static Paint dialogs_countGrayPaint;
public static Paint dialogs_actionMessagePaint;
public static Paint dialogs_reactionsCountPaint;
public static TextPaint[] dialogs_namePaint;
public static TextPaint[] dialogs_nameEncryptedPaint;
public static TextPaint dialogs_searchNamePaint;
@ -2937,6 +3062,7 @@ public class Theme {
public static final String key_dialogEmptyImage = "dialogEmptyImage";
public static final String key_dialogEmptyText = "dialogEmptyText";
public static final String key_dialogSwipeRemove = "dialogSwipeRemove";
public static final String key_dialogReactionMentionBackground = "dialogReactionMentionBackground";
public static final String key_windowBackgroundWhite = "windowBackgroundWhite";
public static final String key_windowBackgroundUnchecked = "windowBackgroundUnchecked";
@ -3818,6 +3944,8 @@ public class Theme {
defaultColors.put(key_dialogEmptyImage, 0xff9fa4a8);
defaultColors.put(key_dialogEmptyText, 0xff8c9094);
defaultColors.put(key_dialogSwipeRemove, 0xffe56555);
defaultColors.put(key_dialogSwipeRemove, 0xffe56555);
defaultColors.put(key_dialogReactionMentionBackground, 0xffF05459);
defaultColors.put(key_windowBackgroundWhite, 0xffffffff);
defaultColors.put(key_windowBackgroundUnchecked, 0xff9da7b1);
@ -4689,6 +4817,7 @@ public class Theme {
fallbackKeys.put(key_chat_outReactionButtonText, key_chat_outPreviewInstantText);
fallbackKeys.put(key_chat_inReactionButtonTextSelected, key_windowBackgroundWhite);
fallbackKeys.put(key_chat_outReactionButtonTextSelected, key_windowBackgroundWhite);
fallbackKeys.put(key_dialogReactionMentionBackground, key_voipgroup_mutedByAdminGradient2);
themeAccentExclusionKeys.addAll(Arrays.asList(keys_avatar_background));
themeAccentExclusionKeys.addAll(Arrays.asList(keys_avatar_nameInMessage));
@ -7943,6 +8072,7 @@ public class Theme {
checkboxSquare_backgroundPaint = new Paint(Paint.ANTI_ALIAS_FLAG);
linkSelectionPaint = new Paint();
linkSelectionPaint.setPathEffect(LinkPath.roundedEffect);
Resources resources = context.getResources();
@ -8057,9 +8187,8 @@ public class Theme {
if (dialogs_countTextPaint == null) {
dialogs_countTextPaint = new TextPaint(TextPaint.ANTI_ALIAS_FLAG);
dialogs_countTextPaint.setTypeface(AndroidUtilities.getTypeface("fonts/rmedium.ttf"));
dialogs_countPaint = new Paint(Paint.ANTI_ALIAS_FLAG);
dialogs_reactionsCountPaint = new Paint(Paint.ANTI_ALIAS_FLAG);
dialogs_onlineCirclePaint = new Paint(Paint.ANTI_ALIAS_FLAG);
}
@ -8177,6 +8306,7 @@ public class Theme {
dialogs_archiveTextPaint.setColor(getColor(key_chats_archiveText));
dialogs_archiveTextPaintSmall.setColor(getColor(key_chats_archiveText));
dialogs_countPaint.setColor(getColor(key_chats_unreadCounter));
dialogs_reactionsCountPaint.setColor(getColor(key_dialogReactionMentionBackground));
dialogs_countGrayPaint.setColor(getColor(key_chats_unreadCounterMuted));
dialogs_actionMessagePaint.setColor(getColor(key_chats_actionMessage));
dialogs_errorPaint.setColor(getColor(key_chats_sentError));
@ -8264,7 +8394,9 @@ public class Theme {
chat_locationTitlePaint.setTypeface(AndroidUtilities.getTypeface("fonts/rmedium.ttf"));
chat_locationAddressPaint = new TextPaint(Paint.ANTI_ALIAS_FLAG);
chat_urlPaint = new Paint();
chat_urlPaint.setPathEffect(LinkPath.roundedEffect);
chat_textSearchSelectionPaint = new Paint();
chat_textSearchSelectionPaint.setPathEffect(LinkPath.roundedEffect);
chat_radialProgressPaint = new Paint(Paint.ANTI_ALIAS_FLAG);
chat_radialProgressPaint.setStrokeCap(Paint.Cap.ROUND);
chat_radialProgressPaint.setStyle(Paint.Style.STROKE);

View File

@ -177,7 +177,7 @@ public class SearchAdapterHelper {
if (query.length() > 0) {
TLRPC.TL_contacts_search req = new TLRPC.TL_contacts_search();
req.q = query;
req.limit = 10;
req.limit = 20;
requests.add(new Pair<>(req, (response, error) -> {
if (delegate.canApplySearchResults(searchId)) {
if (error == null) {

View File

@ -401,7 +401,6 @@ public class ArticleViewer implements NotificationCenter.NotificationCenterDeleg
searchPath.setCurrentLayout(textLayout, result.index, 0);
searchPath.setBaselineShift(0);
textLayout.getSelectionPath(result.index, result.index + searchText.length(), searchPath);
searchPath.onPathEnd();
searchPath.setAllowReset(true);
}
} else {
@ -1147,13 +1146,16 @@ public class ArticleViewer implements NotificationCenter.NotificationCenterDeleg
float lightness = (0.2126f * Color.red(color2) + 0.7152f * Color.green(color2) + 0.0722f * Color.blue(color2)) / 255.0f;
webpageSearchPaint.setColor(lightness <= 0.705f ? 0xffd1982e : 0xffffe669);
webpageUrlPaint.setColor(Theme.getColor(Theme.key_windowBackgroundWhiteLinkSelection) & 0x33ffffff);
webpageUrlPaint.setPathEffect(LinkPath.roundedEffect);
urlPaint.setColor(Theme.getColor(Theme.key_windowBackgroundWhiteLinkSelection) & 0x33ffffff);
urlPaint.setPathEffect(LinkPath.roundedEffect);
tableHalfLinePaint.setColor(Theme.getColor(Theme.key_windowBackgroundWhiteInputField));
tableLinePaint.setColor(Theme.getColor(Theme.key_windowBackgroundWhiteInputField));
photoBackgroundPaint.setColor(0x0f000000);
dividerPaint.setColor(Theme.getColor(Theme.key_divider));
webpageMarkPaint.setColor(Theme.getColor(Theme.key_windowBackgroundWhiteLinkSelection) & 0x33ffffff);
webpageMarkPaint.setPathEffect(LinkPath.roundedEffect);
int color = Theme.getColor(Theme.key_switchTrack);
int r = Color.red(color);
@ -2537,7 +2539,6 @@ public class ArticleViewer implements NotificationCenter.NotificationCenterDeleg
int shift = innerSpans[a].getTextPaint() != null ? innerSpans[a].getTextPaint().baselineShift : 0;
textPath.setBaselineShift(shift != 0 ? shift + AndroidUtilities.dp(shift > 0 ? 5 : -2) : 0);
result.getSelectionPath(start, end, textPath);
textPath.onPathEnd();
}
textPath.setAllowReset(true);
}
@ -2556,7 +2557,6 @@ public class ArticleViewer implements NotificationCenter.NotificationCenterDeleg
int shift = innerSpans[a].getTextPaint() != null ? innerSpans[a].getTextPaint().baselineShift : 0;
markPath.setBaselineShift(shift != 0 ? shift + AndroidUtilities.dp(shift > 0 ? 5 : -2) : 0);
result.getSelectionPath(start, end, markPath);
markPath.onPathEnd();
}
markPath.setAllowReset(true);
}
@ -2645,7 +2645,6 @@ public class ArticleViewer implements NotificationCenter.NotificationCenterDeleg
int shift = pressedLink.getTextPaint() != null ? pressedLink.getTextPaint().baselineShift : 0;
urlPath.setBaselineShift(shift != 0 ? shift + AndroidUtilities.dp(shift > 0 ? 5 : -2) : 0);
layout.getSelectionPath(pressedStart, pressedEnd, urlPath);
urlPath.onPathEnd();
parentView.invalidate();
} catch (Exception e) {
FileLog.e(e);

View File

@ -390,7 +390,6 @@ public class CameraScanActivity extends BaseFragment implements Camera.PreviewCa
int shift = getText() != null ? getPaint().baselineShift : 0;
textPath.setBaselineShift(shift != 0 ? shift + AndroidUtilities.dp(shift > 0 ? 5 : -2) : 0);
getLayout().getSelectionPath(start, end, textPath);
textPath.onPathEnd();
}
textPath.setAllowReset(true);
}

View File

@ -353,12 +353,16 @@ public class AboutLinkCell extends FrameLayout {
}
checkTextLayout(lastMaxWidth, true);
updateHeight();
int wasValueVisibility = valueTextView.getVisibility();
if (TextUtils.isEmpty(value)) {
valueTextView.setVisibility(GONE);
} else {
valueTextView.setText(value);
valueTextView.setVisibility(VISIBLE);
}
if (wasValueVisibility != valueTextView.getVisibility()) {
checkTextLayout(lastMaxWidth, true);
}
requestLayout();
}
@ -419,7 +423,6 @@ public class AboutLinkCell extends FrameLayout {
urlPathOffset.set(textX, textY);
urlPath.setCurrentLayout(textLayout, start, 0);
textLayout.getSelectionPath(start, buffer.getSpanEnd(pressedLink), urlPath);
urlPath.onPathEnd();
} catch (Exception e) {
FileLog.e(e);
}
@ -559,9 +562,12 @@ public class AboutLinkCell extends FrameLayout {
}
}
private int fromHeight() {
return Math.min(COLLAPSED_HEIGHT + (valueTextView.getVisibility() == View.VISIBLE ? AndroidUtilities.dp(20) : 0), textHeight());
}
private int updateHeight() {
int textHeight = textHeight();
float fromHeight = Math.min(COLLAPSED_HEIGHT, textHeight);
float fromHeight = fromHeight();
int height = shouldExpand ? (int) AndroidUtilities.lerp(fromHeight, textHeight, expandT) : textHeight;
setHeight(height);
return height;
@ -618,7 +624,7 @@ public class AboutLinkCell extends FrameLayout {
private void checkTextLayout(int maxWidth, boolean force) {
if (stringBuilder != null && (maxWidth != lastMaxWidth || force)) {
textLayout = makeTextLayout(stringBuilder, maxWidth);
shouldExpand = textLayout.getLineCount() >= 4 && valueTextView.getVisibility() != View.VISIBLE;
shouldExpand = textLayout.getLineCount() >= 4; // && valueTextView.getVisibility() != View.VISIBLE;
if (textLayout.getLineCount() >= 3 && shouldExpand) {
int end = Math.max(textLayout.getLineStart(2), textLayout.getLineEnd(2));
@ -658,8 +664,15 @@ public class AboutLinkCell extends FrameLayout {
container.setMinimumHeight(textHeight());
if (shouldExpand) {
setShowMoreMarginBottom(textHeight() - AndroidUtilities.dp(8) - textLayout.getLineBottom(textLayout.getLineCount() - 1) - showMoreTextBackgroundView.getPaddingBottom());
if (shouldExpand && firstThreeLinesLayout != null) {
setShowMoreMarginBottom(
fromHeight()
-AndroidUtilities.dp(8)
-firstThreeLinesLayout.getLineBottom(firstThreeLinesLayout.getLineCount() - 1)
-showMoreTextBackgroundView.getPaddingBottom()
-showMoreTextView.getPaddingBottom()
-(showMoreTextView.getLayout() == null ? 0 : showMoreTextView.getLayout().getHeight() - showMoreTextView.getLayout().getLineBottom(showMoreTextView.getLineCount() - 1))
);
}
}
showMoreTextView.setVisibility(shouldExpand ? View.VISIBLE : View.GONE);

View File

@ -151,7 +151,6 @@ public class BotHelpCell extends View {
int start = buffer.getSpanStart(pressedLink);
urlPath.setCurrentLayout(textLayout, start, 0);
textLayout.getSelectionPath(start, buffer.getSpanEnd(pressedLink), urlPath);
urlPath.onPathEnd();
} catch (Exception e) {
FileLog.e(e);
}

View File

@ -179,10 +179,10 @@ public class ChatActionCell extends BaseCell implements DownloadController.FileD
} else {
newText = LocaleController.formatDateChat(date);
}
customDate = date;
if (customText != null && TextUtils.equals(newText, customText)) {
return;
}
customDate = date;
customText = newText;
updateTextInternal(inLayout);
}

View File

@ -69,8 +69,6 @@ import android.widget.Toast;
import androidx.core.graphics.ColorUtils;
import com.google.android.exoplayer2.util.Log;
import org.telegram.PhoneFormat.PhoneFormat;
import org.telegram.messenger.AndroidUtilities;
import org.telegram.messenger.ChatObject;
@ -398,6 +396,10 @@ public class ChatMessageCell extends BaseCell implements SeekBar.SeekBarDelegate
}
default void invalidateBlur() { }
default boolean canDrawOutboundsContent() {
return true;
}
}
private final static int DOCUMENT_ATTACH_TYPE_NONE = 0;
@ -1192,7 +1194,6 @@ public class ChatMessageCell extends BaseCell implements SeekBar.SeekBarDelegate
pos[1] -= block.charactersOffset;
path.setCurrentLayout(block.textLayout, pos[0], 0);
block.textLayout.getSelectionPath(pos[0], pos[1], path);
path.onPathEnd();
if (pos[1] >= block.charactersEnd) {
for (int a = blockNum + 1; a < currentMessageObject.textLayoutBlocks.size(); a++) {
MessageObject.TextLayoutBlock nextBlock = currentMessageObject.textLayoutBlocks.get(a);
@ -1209,7 +1210,6 @@ public class ChatMessageCell extends BaseCell implements SeekBar.SeekBarDelegate
path.setCurrentLayout(nextBlock.textLayout, 0, nextBlock.textYOffset - block.textYOffset);
int p1 = pos[1] + block.charactersOffset - nextBlock.charactersOffset;
nextBlock.textLayout.getSelectionPath(0, p1, path);
path.onPathEnd();
if (p1 < nextBlock.charactersEnd - 1) {
break;
}
@ -1234,7 +1234,6 @@ public class ChatMessageCell extends BaseCell implements SeekBar.SeekBarDelegate
int p1 = pos[1] + block.charactersOffset - nextBlock.charactersOffset;
path.setCurrentLayout(nextBlock.textLayout, p0, offsetY);
nextBlock.textLayout.getSelectionPath(p0, p1, path);
path.onPathEnd();
if (p0 > nextBlock.charactersOffset) {
break;
}
@ -1299,7 +1298,6 @@ public class ChatMessageCell extends BaseCell implements SeekBar.SeekBarDelegate
int[] pos = getRealSpanStartAndEnd(buffer, pressedLink);
path.setCurrentLayout(captionLayout, pos[0], 0);
captionLayout.getSelectionPath(pos[0], pos[1], path);
path.onPathEnd();
} catch (Exception e) {
FileLog.e(e);
}
@ -1362,7 +1360,6 @@ public class ChatMessageCell extends BaseCell implements SeekBar.SeekBarDelegate
int[] pos = getRealSpanStartAndEnd(buffer, pressedLink);
path.setCurrentLayout(descriptionLayout, pos[0], 0);
descriptionLayout.getSelectionPath(pos[0], pos[1], path);
path.onPathEnd();
} catch (Exception e) {
FileLog.e(e);
}
@ -1445,7 +1442,6 @@ public class ChatMessageCell extends BaseCell implements SeekBar.SeekBarDelegate
int[] pos = getRealSpanStartAndEnd(buffer, pressedLink);
path.setCurrentLayout(descriptionLayout, pos[0], 0);
descriptionLayout.getSelectionPath(pos[0], pos[1], path);
path.onPathEnd();
} catch (Exception e) {
FileLog.e(e);
}
@ -2881,7 +2877,7 @@ public class ChatMessageCell extends BaseCell implements SeekBar.SeekBarDelegate
parentHeight = parentH;
backgroundHeight = parentH;
if (currentMessageObject != null && (hasGradientService() && currentMessageObject.shouldDrawWithoutBackground() || drawSideButton != 0 || !botButtons.isEmpty()) || currentBackgroundDrawable != null && currentBackgroundDrawable.getGradientShader() != null) {
if (currentMessageObject != null && (hasGradientService() && currentMessageObject.shouldDrawWithoutBackground()) || currentBackgroundDrawable != null && currentBackgroundDrawable.getGradientShader() != null) {
invalidate();
}
}
@ -2896,7 +2892,7 @@ public class ChatMessageCell extends BaseCell implements SeekBar.SeekBarDelegate
this.parentViewTopOffset = parentOffset;
parentHeight = parent;
}
if (currentMessageObject != null && (hasGradientService() && currentMessageObject.shouldDrawWithoutBackground() || drawSideButton != 0 || !botButtons.isEmpty())) {
if (currentMessageObject != null && (hasGradientService() && currentMessageObject.shouldDrawWithoutBackground())) {
invalidate();
}
@ -4011,6 +4007,7 @@ public class ChatMessageCell extends BaseCell implements SeekBar.SeekBarDelegate
int duration;
boolean smallImage;
String type;
final int smallImageSide = AndroidUtilities.dp(48), smallSideMargin = AndroidUtilities.dp(10);
if (hasLinkPreview) {
TLRPC.TL_webPage webPage = (TLRPC.TL_webPage) messageObject.messageOwner.media.webpage;
site_name = webPage.site_name;
@ -4036,9 +4033,10 @@ public class ChatMessageCell extends BaseCell implements SeekBar.SeekBarDelegate
boolean isSmallImageType = "app".equals(type) || "profile".equals(type) ||
"article".equals(type) || "telegram_bot".equals(type) ||
"telegram_user".equals(type) || "telegram_channel".equals(type) ||
"telegram_megagroup".equals(type) || "telegram_voicechat".equals(type);
"telegram_megagroup".equals(type) || "telegram_voicechat".equals(type) ||
"telegram_livestream".equals(type);
smallImage = !slideshow && (!drawInstantView || drawInstantViewType == 1 || drawInstantViewType == 9 || drawInstantViewType == 11 || drawInstantViewType == 13) && document == null && isSmallImageType;
isSmallImage = smallImage && (drawInstantViewType == 13 || description != null) && type != null && currentMessageObject.photoThumbs != null;
isSmallImage = smallImage && type != null && currentMessageObject.photoThumbs != null;
} else if (hasInvoicePreview) {
TLRPC.TL_messageMediaInvoice invoice = (TLRPC.TL_messageMediaInvoice) messageObject.messageOwner.media;
site_name = messageObject.messageOwner.media.title;
@ -4091,17 +4089,37 @@ public class ChatMessageCell extends BaseCell implements SeekBar.SeekBarDelegate
if (site_name != null) {
try {
int width = (int) Math.ceil(Theme.chat_replyNamePaint.measureText(site_name) + 1);
if (!isSmallImage || description == null) {
int restLines = 0;
if (!isSmallImage) {
siteNameLayout = new StaticLayout(site_name, Theme.chat_replyNamePaint, Math.min(width, linkPreviewMaxWidth), Layout.Alignment.ALIGN_NORMAL, 1.0f, 0.0f, false);
} else {
siteNameLayout = generateStaticLayout(site_name, Theme.chat_replyNamePaint, linkPreviewMaxWidth, linkPreviewMaxWidth - AndroidUtilities.dp(48 + 4), restLinesCount, 1);
restLines = restLinesCount;
siteNameLayout = generateStaticLayout(site_name, Theme.chat_replyNamePaint, linkPreviewMaxWidth, linkPreviewMaxWidth - smallImageSide - smallSideMargin, restLinesCount, 1);
restLinesCount -= siteNameLayout.getLineCount();
}
siteNameRtl = Math.max(siteNameLayout.getLineLeft(0), 0) != 0;
int height = siteNameLayout.getLineBottom(siteNameLayout.getLineCount() - 1);
linkPreviewHeight += height;
totalHeight += height;
siteNameWidth = width = siteNameLayout.getWidth();
int layoutWidth = 0;
for (int a = 0; a < siteNameLayout.getLineCount(); ++a) {
int lineLeft = (int) Math.max(0, siteNameLayout.getLineLeft(a));
int lineWidth;
if (lineLeft != 0) {
lineWidth = siteNameLayout.getWidth() - lineLeft;
} else {
int max = linkPreviewMaxWidth;
if (a < restLines || lineLeft != 0 && isSmallImage) {
max -= smallImageSide + smallSideMargin;
}
lineWidth = (int) Math.min(max, Math.ceil(siteNameLayout.getLineWidth(a)));
}
if (a < restLines || lineLeft != 0 && isSmallImage) {
lineWidth += smallImageSide + smallSideMargin;
}
layoutWidth = Math.max(layoutWidth, lineWidth);
}
siteNameWidth = width = layoutWidth;
maxChildWidth = Math.max(maxChildWidth, width + additinalWidth);
maxWebWidth = Math.max(maxWebWidth, width + additinalWidth);
} catch (Exception e) {
@ -4118,11 +4136,11 @@ public class ChatMessageCell extends BaseCell implements SeekBar.SeekBarDelegate
totalHeight += AndroidUtilities.dp(2);
}
int restLines = 0;
if (!isSmallImage || description == null) {
if (!isSmallImage) {
titleLayout = StaticLayoutEx.createStaticLayout(title, Theme.chat_replyNamePaint, linkPreviewMaxWidth, Layout.Alignment.ALIGN_NORMAL, 1.0f, AndroidUtilities.dp(1), false, TextUtils.TruncateAt.END, linkPreviewMaxWidth, 4);
} else {
restLines = restLinesCount;
titleLayout = generateStaticLayout(title, Theme.chat_replyNamePaint, linkPreviewMaxWidth, linkPreviewMaxWidth - AndroidUtilities.dp(48 + 4), restLinesCount, 4);
titleLayout = generateStaticLayout(title, Theme.chat_replyNamePaint, linkPreviewMaxWidth, linkPreviewMaxWidth - smallImageSide - smallSideMargin, restLinesCount, 4);
restLinesCount -= titleLayout.getLineCount();
}
int height = titleLayout.getLineBottom(titleLayout.getLineCount() - 1);
@ -4144,12 +4162,12 @@ public class ChatMessageCell extends BaseCell implements SeekBar.SeekBarDelegate
} else {
int max = linkPreviewMaxWidth;
if (a < restLines || lineLeft != 0 && isSmallImage) {
max -= AndroidUtilities.dp(48 + 4);
max -= smallImageSide + smallSideMargin;
}
width = (int) Math.min(max, Math.ceil(titleLayout.getLineWidth(a)));
}
if (a < restLines || lineLeft != 0 && isSmallImage) {
width += AndroidUtilities.dp(48 + 4);
width += smallImageSide + smallSideMargin;
}
maxChildWidth = Math.max(maxChildWidth, width + additinalWidth);
maxWebWidth = Math.max(maxWebWidth, width + additinalWidth);
@ -4172,7 +4190,7 @@ public class ChatMessageCell extends BaseCell implements SeekBar.SeekBarDelegate
if (restLinesCount == 3 && (!isSmallImage || description == null)) {
authorLayout = new StaticLayout(author, Theme.chat_replyNamePaint, linkPreviewMaxWidth, Layout.Alignment.ALIGN_NORMAL, 1.0f, 0.0f, false);
} else {
authorLayout = generateStaticLayout(author, Theme.chat_replyNamePaint, linkPreviewMaxWidth, linkPreviewMaxWidth - AndroidUtilities.dp(48 + 4), restLinesCount, 1);
authorLayout = generateStaticLayout(author, Theme.chat_replyNamePaint, linkPreviewMaxWidth, linkPreviewMaxWidth - smallImageSide - smallSideMargin, restLinesCount, 1);
restLinesCount -= authorLayout.getLineCount();
}
int height = authorLayout.getLineBottom(authorLayout.getLineCount() - 1);
@ -4208,7 +4226,7 @@ public class ChatMessageCell extends BaseCell implements SeekBar.SeekBarDelegate
descriptionLayout = StaticLayoutEx.createStaticLayout(messageObject.linkDescription, Theme.chat_replyTextPaint, linkPreviewMaxWidth, Layout.Alignment.ALIGN_NORMAL, 1.0f, AndroidUtilities.dp(1), false, TextUtils.TruncateAt.END, linkPreviewMaxWidth, allowAllLines ? 100 : 6);
} else {
restLines = restLinesCount;
descriptionLayout = generateStaticLayout(messageObject.linkDescription, Theme.chat_replyTextPaint, linkPreviewMaxWidth, linkPreviewMaxWidth - AndroidUtilities.dp(48 + 4), restLinesCount, allowAllLines ? 100 : 6);
descriptionLayout = generateStaticLayout(messageObject.linkDescription, Theme.chat_replyTextPaint, linkPreviewMaxWidth, linkPreviewMaxWidth - smallImageSide - smallSideMargin, restLinesCount, allowAllLines ? 100 : 6);
}
int height = descriptionLayout.getLineBottom(descriptionLayout.getLineCount() - 1);
linkPreviewHeight += height;
@ -4245,7 +4263,7 @@ public class ChatMessageCell extends BaseCell implements SeekBar.SeekBarDelegate
}
}
if (a < restLines || restLines != 0 && lineLeft != 0 && isSmallImage) {
width += AndroidUtilities.dp(48 + 4);
width += smallImageSide + smallSideMargin;
}
if (maxWebWidth < width + additinalWidth) {
if (titleIsRTL) {
@ -4267,7 +4285,7 @@ public class ChatMessageCell extends BaseCell implements SeekBar.SeekBarDelegate
smallImage = false;
isSmallImage = false;
}
int maxPhotoWidth = smallImage ? AndroidUtilities.dp(48) : linkPreviewMaxWidth;
int maxPhotoWidth = smallImage ? smallImageSide : linkPreviewMaxWidth;
if (document != null) {
if (MessageObject.isRoundVideoDocument(document)) {
@ -4614,7 +4632,7 @@ public class ChatMessageCell extends BaseCell implements SeekBar.SeekBarDelegate
}
} else if (documentAttachType == DOCUMENT_ATTACH_TYPE_STICKER) {
boolean isWebpSticker = messageObject.isSticker();
if (SharedConfig.loopStickers || isWebpSticker) {
if (SharedConfig.loopStickers || (isWebpSticker && !messageObject.isVideoSticker())) {
photoImage.setAutoRepeat(1);
} else {
currentPhotoFilter = String.format(Locale.US, "%d_%d_nr_%s", w, h, messageObject.toString());
@ -5647,7 +5665,7 @@ public class ChatMessageCell extends BaseCell implements SeekBar.SeekBarDelegate
filter = String.format(Locale.US, "%d_%d_nr_%s" + messageObject.emojiAnimatedStickerColor, w, h, messageObject.toString());
photoImage.setAutoRepeat(shouldRepeatSticker ? 2 : 3);
parentObject = MessageObject.getInputStickerSet(messageObject.emojiAnimatedSticker);
} else if (SharedConfig.loopStickers || isWebpSticker) {
} else if (SharedConfig.loopStickers || (isWebpSticker && !messageObject.isVideoSticker())) {
filter = String.format(Locale.US, "%d_%d", w, h);
photoImage.setAutoRepeat(1);
} else {
@ -5684,7 +5702,8 @@ public class ChatMessageCell extends BaseCell implements SeekBar.SeekBarDelegate
if (!reactionsLayoutInBubble.isSmall) {
reactionsLayoutInBubble.measure(maxWidth);
reactionsLayoutInBubble.drawServiceShaderBackground = true;
additionHeight += reactionsLayoutInBubble.height + AndroidUtilities.dp(8);
reactionsLayoutInBubble.totalHeight = reactionsLayoutInBubble.height + AndroidUtilities.dp(8);
additionHeight += reactionsLayoutInBubble.totalHeight;
reactionsLayoutInBubble.positionOffsetY += AndroidUtilities.dp(4);
}
} else {
@ -7140,11 +7159,7 @@ public class ChatMessageCell extends BaseCell implements SeekBar.SeekBarDelegate
if (drawPhotoImage) {
currentPhotoObject = FileLoader.getClosestPhotoSizeWithSize(messageObject.photoThumbs, 320);
if (currentMessageObject.strippedThumb == null) {
currentPhotoObjectThumb = FileLoader.getClosestPhotoSizeWithSize(messageObject.photoThumbs, 40);
} else {
currentPhotoObjectThumbStripped = currentMessageObject.strippedThumb;
}
currentPhotoObjectThumb = FileLoader.getClosestPhotoSizeWithSize(messageObject.photoThumbs, 40);
if ((DownloadController.getInstance(currentAccount).getAutodownloadMask() & DownloadController.AUTODOWNLOAD_TYPE_PHOTO) == 0) {
currentPhotoObject = null;
@ -7153,6 +7168,9 @@ public class ChatMessageCell extends BaseCell implements SeekBar.SeekBarDelegate
currentPhotoObject = null;
photoImage.setNeedsQualityThumb(true);
photoImage.setShouldGenerateQualityThumb(true);
} else if (currentMessageObject.strippedThumb != null) {
currentPhotoObjectThumb = null;
currentPhotoObjectThumbStripped = currentMessageObject.strippedThumb;
}
currentPhotoFilter = "86_86_b";
photoImage.setImage(ImageLocation.getForObject(currentPhotoObject, messageObject.photoThumbsObject), "86_86", ImageLocation.getForObject(currentPhotoObjectThumb, messageObject.photoThumbsObject), currentPhotoFilter, currentPhotoObjectThumbStripped, 0, null, messageObject, 1);
@ -7242,7 +7260,6 @@ public class ChatMessageCell extends BaseCell implements SeekBar.SeekBarDelegate
LinkPath path = obtainNewUrlPath(true);
path.setCurrentLayout(captionLayout, start, 0);
captionLayout.getSelectionPath(start, end, path);
path.onPathEnd();
} catch (Exception e) {
FileLog.e(e);
}
@ -7257,7 +7274,6 @@ public class ChatMessageCell extends BaseCell implements SeekBar.SeekBarDelegate
LinkPath path = obtainNewUrlPath(true);
path.setCurrentLayout(block.textLayout, start, 0);
block.textLayout.getSelectionPath(start, end, path);
path.onPathEnd();
if (end >= block.charactersOffset + length) {
for (int a = c + 1; a < messageObject.textLayoutBlocks.size(); a++) {
MessageObject.TextLayoutBlock nextBlock = messageObject.textLayoutBlocks.get(a);
@ -7265,7 +7281,6 @@ public class ChatMessageCell extends BaseCell implements SeekBar.SeekBarDelegate
path = obtainNewUrlPath(true);
path.setCurrentLayout(nextBlock.textLayout, 0, nextBlock.height);
nextBlock.textLayout.getSelectionPath(0, end - nextBlock.charactersOffset, path);
path.onPathEnd();
if (end < block.charactersOffset + length - 1) {
break;
}
@ -8625,7 +8640,7 @@ public class ChatMessageCell extends BaseCell implements SeekBar.SeekBarDelegate
linkPreviewY += currentMessageObject.textHeight + AndroidUtilities.dp(4);
}
if (drawPhotoImage && drawInstantView && drawInstantViewType != 9 && drawInstantViewType != 13 && drawInstantViewType != 1 || drawInstantViewType == 6 && imageBackgroundColor != 0) {
if (drawPhotoImage && drawInstantView && drawInstantViewType != 9 && drawInstantViewType != 13 && drawInstantViewType != 11 && drawInstantViewType != 1 || drawInstantViewType == 6 && imageBackgroundColor != 0) {
if (linkPreviewY != startY) {
linkPreviewY += AndroidUtilities.dp(2);
}
@ -8777,7 +8792,7 @@ public class ChatMessageCell extends BaseCell implements SeekBar.SeekBarDelegate
imageDrawn = true;
drawTime = true;
} else {
if (delegate == null || delegate.getPinchToZoomHelper() == null || !delegate.getPinchToZoomHelper().isInOverlayModeFor(this) && drawInstantViewType != 11) {
if (delegate == null || delegate.getPinchToZoomHelper() == null || !delegate.getPinchToZoomHelper().isInOverlayModeFor(this)) {
if (alpha != 1f) {
photoImage.setAlpha(alpha);
imageDrawn = photoImage.draw(canvas);
@ -11041,7 +11056,7 @@ public class ChatMessageCell extends BaseCell implements SeekBar.SeekBarDelegate
canvas.restore();
}
if (!clipToGroupBounds) {
if (delegate == null || delegate.canDrawOutboundsContent()) {
drawOutboundsContent(canvas);
}
@ -11521,6 +11536,10 @@ public class ChatMessageCell extends BaseCell implements SeekBar.SeekBarDelegate
}
}
public boolean hasOutboundsContent() {
return (!transitionParams.transitionBotButtons.isEmpty() && transitionParams.animateBotButtonsChanged) || !botButtons.isEmpty() || drawSideButton != 0;
}
public void drawOutboundsContent(Canvas canvas) {
if (!transitionParams.transitionBotButtons.isEmpty() && transitionParams.animateBotButtonsChanged) {
drawBotButtons(canvas, transitionParams.transitionBotButtons, 1f - transitionParams.animateChangeProgress);
@ -11534,12 +11553,12 @@ public class ChatMessageCell extends BaseCell implements SeekBar.SeekBarDelegate
private void drawSideButton(Canvas canvas) {
if (drawSideButton != 0) {
if (currentMessageObject.isOutOwner()) {
sideStartX = getCurrentBackgroundLeft() - AndroidUtilities.dp(8 + 32);
sideStartX = transitionParams.lastBackgroundLeft - AndroidUtilities.dp(8 + 32);
if (currentMessagesGroup != null) {
sideStartX += currentMessagesGroup.transitionParams.offsetLeft - animationOffsetX;
}
} else {
sideStartX = currentBackgroundDrawable.getBounds().right + AndroidUtilities.dp(8);
sideStartX = transitionParams.lastBackgroundRight + AndroidUtilities.dp(8);
if (currentMessagesGroup != null) {
sideStartX += currentMessagesGroup.transitionParams.offsetRight - animationOffsetX;
}
@ -14809,7 +14828,13 @@ public class ChatMessageCell extends BaseCell implements SeekBar.SeekBarDelegate
}
accessibilityText = sb;
}
info.setText(accessibilityText);
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.N) {
info.setContentDescription(accessibilityText.toString());
} else {
info.setText(accessibilityText);
}
info.setEnabled(true);
if (Build.VERSION.SDK_INT >= 19) {
AccessibilityNodeInfo.CollectionItemInfo itemInfo = info.getCollectionItemInfo();
@ -14857,7 +14882,28 @@ public class ChatMessageCell extends BaseCell implements SeekBar.SeekBarDelegate
seekBarAccessibilityDelegate.onInitializeAccessibilityNodeInfoInternal(info);
}
int i = 0;
int i;
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.N) {
if (currentMessageObject.messageText instanceof Spannable) {
Spannable buffer = (Spannable) currentMessageObject.messageText;
CharacterStyle[] links = buffer.getSpans(0, buffer.length(), ClickableSpan.class);
i = 0;
for (CharacterStyle link : links) {
info.addChild(ChatMessageCell.this, LINK_IDS_START + i);
i++;
}
}
if (currentMessageObject.caption instanceof Spannable && captionLayout != null) {
Spannable buffer = (Spannable) currentMessageObject.caption;
CharacterStyle[] links = buffer.getSpans(0, buffer.length(), ClickableSpan.class);
i = 0;
for (CharacterStyle link : links) {
info.addChild(ChatMessageCell.this, LINK_CAPTION_IDS_START + i);
i++;
}
}
}
i = 0;
for (BotButton button : botButtons) {
info.addChild(ChatMessageCell.this, BOT_BUTTONS_START + i);
i++;
@ -15413,6 +15459,7 @@ public class ChatMessageCell extends BaseCell implements SeekBar.SeekBarDelegate
public int lastTimeX;
public int animateFromTimeX;
public boolean shouldAnimateTimeX;
public int lastBackgroundLeft, lastBackgroundRight;
public boolean animateDrawingTimeAlpha;
@ -15478,7 +15525,9 @@ public class ChatMessageCell extends BaseCell implements SeekBar.SeekBarDelegate
lastDrawingCaptionLayout = captionLayout;
lastDrawBotButtons.clear();
lastDrawBotButtons.addAll(botButtons);
if (!botButtons.isEmpty()) {
lastDrawBotButtons.addAll(botButtons);
}
if (commentLayout != null) {
lastCommentsCount = getRepliesCount();
@ -15524,6 +15573,8 @@ public class ChatMessageCell extends BaseCell implements SeekBar.SeekBarDelegate
lastForwardNameX = forwardNameX;
lastForwardedNamesOffset = namesOffset;
lastForwardNameWidth = forwardedNameWidth;
lastBackgroundLeft = getCurrentBackgroundLeft();
lastBackgroundRight = currentBackgroundDrawable.getBounds().right;
reactionsLayoutInBubble.recordDrawingState();
}

View File

@ -358,8 +358,7 @@ public class ContextLinkCell extends FrameLayout implements DownloadController.F
linkImageView.setImage(ImageLocation.getForDocument(currentPhotoObject, documentAttach), currentPhotoFilter, ImageLocation.getForPhoto(currentPhotoObjectThumb, photoAttach), currentPhotoFilterThumb, currentPhotoObject.size, ext, parentObject, 0);
}
} else {
linkImageView.setImage(ImageLocation.getForPhoto(currentPhotoObject, photoAttach), currentPhotoFilter, ImageLocation.getForPhoto(currentPhotoObjectThumb, photoAttach), currentPhotoFilterThumb, currentPhotoObject.size, ext, parentObject, 0);
}
linkImageView.setImage(ImageLocation.getForPhoto(currentPhotoObject, photoAttach), currentPhotoFilter, ImageLocation.getForPhoto(currentPhotoObjectThumb, photoAttach), currentPhotoFilterThumb, currentPhotoObject.size, ext, parentObject, 0); }
}
} else if (webFile != null) {
linkImageView.setImage(ImageLocation.getForWebFile(webFile), currentPhotoFilter, ImageLocation.getForPhoto(currentPhotoObjectThumb, photoAttach), currentPhotoFilterThumb, -1, ext, parentObject, 1);
@ -579,9 +578,8 @@ public class ContextLinkCell extends FrameLayout implements DownloadController.F
@Override
protected void onDetachedFromWindow() {
super.onDetachedFromWindow();
if (drawLinkImageView) {
linkImageView.onDetachedFromWindow();
}
linkImageView.onDetachedFromWindow();
radialProgress.onDetachedFromWindow();
DownloadController.getInstance(currentAccount).removeLoadingFileObserver(this);
}
@ -589,10 +587,8 @@ public class ContextLinkCell extends FrameLayout implements DownloadController.F
@Override
protected void onAttachedToWindow() {
super.onAttachedToWindow();
if (drawLinkImageView) {
if (linkImageView.onAttachedToWindow()) {
updateButtonState(false, false);
}
if (linkImageView.onAttachedToWindow()) {
updateButtonState(false, false);
}
radialProgress.onAttachedToWindow();
}

View File

@ -27,8 +27,10 @@ import android.text.Spanned;
import android.text.StaticLayout;
import android.text.TextPaint;
import android.text.TextUtils;
import android.text.style.CharacterStyle;
import android.text.style.ClickableSpan;
import android.text.style.ReplacementSpan;
import android.text.style.StyleSpan;
import android.view.HapticFeedbackConstants;
import android.view.accessibility.AccessibilityEvent;
import android.view.accessibility.AccessibilityNodeInfo;
@ -1327,6 +1329,7 @@ public class DialogCell extends BaseCell {
drawCount = false;
drawMention = false;
}
drawReactionMention = false;
} else {
if (clearingDialog) {
drawCount = false;
@ -1627,7 +1630,7 @@ public class DialogCell extends BaseCell {
int w = AndroidUtilities.dp(24);
messageWidth -= w;
if (!LocaleController.isRTL) {
reactionMentionLeft = getMeasuredWidth() - AndroidUtilities.dp(32) - (mentionWidth != 0 ? (mentionWidth + AndroidUtilities.dp(20)) : 0) - (countWidth != 0 ? countWidth + AndroidUtilities.dp(18) : 0);
reactionMentionLeft = getMeasuredWidth() - AndroidUtilities.dp(32) - (mentionWidth != 0 ? (mentionWidth + AndroidUtilities.dp(18)) : 0) - (countWidth != 0 ? countWidth + AndroidUtilities.dp(18) : 0);
} else {
reactionMentionLeft = AndroidUtilities.dp(20) + (countWidth != 0 ? countWidth + AndroidUtilities.dp(18) : 0);
messageLeft += w;
@ -1704,12 +1707,13 @@ public class DialogCell extends BaseCell {
} else {
messageStringFinal = messageString;
}
// Removing links to get rid of underlining
// Removing links and bold spans to get rid of underlining and boldness
if (messageStringFinal instanceof Spannable) {
Spannable messageStringSpannable = (Spannable) messageStringFinal;
ClickableSpan[] spans = messageStringSpannable.getSpans(0, messageStringSpannable.length(), ClickableSpan.class);
for (ClickableSpan span : spans) {
messageStringSpannable.removeSpan(span);
for (CharacterStyle span : messageStringSpannable.getSpans(0, messageStringSpannable.length(), CharacterStyle.class)) {
if (span instanceof ClickableSpan || (span instanceof StyleSpan && ((StyleSpan) span).getStyle() == android.graphics.Typeface.BOLD)) {
messageStringSpannable.removeSpan(span);
}
}
}
@ -2057,6 +2061,7 @@ public class DialogCell extends BaseCell {
if (dialog instanceof TLRPC.TL_dialogFolder) {
unreadCount = MessagesStorage.getInstance(currentAccount).getArchiveUnreadCount();
mentionCount = 0;
reactionMentionCount = 0;
} else {
unreadCount = dialog.unread_count;
mentionCount = dialog.unread_mentions_count;
@ -2078,6 +2083,7 @@ public class DialogCell extends BaseCell {
} else {
unreadCount = 0;
mentionCount = 0;
reactionMentionCount = 0;
currentEditDate = 0;
lastMessageDate = 0;
clearingDialog = false;
@ -2140,20 +2146,23 @@ public class DialogCell extends BaseCell {
TLRPC.Dialog dialog = MessagesController.getInstance(currentAccount).dialogs_dict.get(currentDialogId);
int newCount;
int newMentionCount;
int newReactionCout = 0;
if (dialog instanceof TLRPC.TL_dialogFolder) {
newCount = MessagesStorage.getInstance(currentAccount).getArchiveUnreadCount();
newMentionCount = 0;
} else if (dialog != null) {
newCount = dialog.unread_count;
newMentionCount = dialog.unread_mentions_count;
newReactionCout = dialog.unread_reactions_count;
} else {
newCount = 0;
newMentionCount = 0;
}
if (dialog != null && (unreadCount != newCount || markUnread != dialog.unread_mark || mentionCount != newMentionCount)) {
if (dialog != null && (unreadCount != newCount || markUnread != dialog.unread_mark || mentionCount != newMentionCount || reactionMentionCount != newReactionCout)) {
unreadCount = newCount;
mentionCount = newMentionCount;
markUnread = dialog.unread_mark;
reactionMentionCount = newReactionCout;
continueUpdate = true;
}
}
@ -2914,11 +2923,11 @@ public class DialogCell extends BaseCell {
if (drawReactionMention || reactionsMentionsChangeProgress != 1f) {
Theme.dialogs_countPaint.setAlpha((int) ((1.0f - reorderIconProgress) * 255));
Theme.dialogs_reactionsCountPaint.setAlpha((int) ((1.0f - reorderIconProgress) * 255));
int x = reactionMentionLeft - AndroidUtilities.dp(5.5f);
rect.set(x, countTop, x + AndroidUtilities.dp(23), countTop + AndroidUtilities.dp(23));
Paint paint = dialogMuted && folderId != 0 ? Theme.dialogs_countGrayPaint : Theme.dialogs_countPaint;
Paint paint = Theme.dialogs_reactionsCountPaint;
canvas.save();
if (reactionsMentionsChangeProgress != 1f) {

View File

@ -90,6 +90,8 @@ public class ShareDialogCell extends FrameLayout {
invalidate();
});
addView(checkBox, LayoutHelper.createFrame(24, 24, Gravity.CENTER_HORIZONTAL | Gravity.TOP, 19, currentType == TYPE_CREATE ? -40 : 42, 0, 0));
setBackground(Theme.createRadSelectorDrawable(Theme.getColor(Theme.key_listSelector), AndroidUtilities.dp(2), AndroidUtilities.dp(2)));
}
@Override
@ -196,6 +198,7 @@ public class ShareDialogCell extends FrameLayout {
Theme.checkboxSquare_checkPaint.setColor(getThemedColor(Theme.key_dialogRoundCheckBox));
Theme.checkboxSquare_checkPaint.setAlpha((int) (checkBox.getProgress() * 255));
canvas.drawCircle(cx, cy, AndroidUtilities.dp(currentType == TYPE_CREATE ? 24 : 28), Theme.checkboxSquare_checkPaint);
super.onDraw(canvas);
}
private int getThemedColor(String key) {

View File

@ -580,7 +580,6 @@ public class SharedLinkCell extends FrameLayout {
try {
urlPath.setCurrentLayout(layout, 0, 0);
layout.getSelectionPath(0, layout.getText().length(), urlPath);
urlPath.onPathEnd();
} catch (Exception e) {
FileLog.e(e);
}
@ -809,7 +808,9 @@ public class SharedLinkCell extends FrameLayout {
}
canvas.save();
canvas.clipPath(path, Region.Op.DIFFERENCE);
if (pressedLink == a) canvas.drawPath(urlPath, Theme.linkSelectionPaint);
if (pressedLink == a) {
canvas.drawPath(urlPath, Theme.linkSelectionPaint);
}
layout.draw(canvas);
canvas.restore();
@ -820,7 +821,9 @@ public class SharedLinkCell extends FrameLayout {
spoilers.get(0).getRipplePath(path);
canvas.clipPath(path);
if (pressedLink == a) canvas.drawPath(urlPath, Theme.linkSelectionPaint);
if (pressedLink == a) {
canvas.drawPath(urlPath, Theme.linkSelectionPaint);
}
layout.draw(canvas);
canvas.restore();

View File

@ -137,7 +137,7 @@ public class StickerEmojiCell extends FrameLayout {
sticker = document;
parentObject = parent;
boolean isVideoSticker = MessageObject.isVideoSticker(document);
TLRPC.PhotoSize thumb = isVideoSticker ? null : FileLoader.getClosestPhotoSizeWithSize(document.thumbs, 90);
TLRPC.PhotoSize thumb = (isVideoSticker && MessageObject.canAutoplayAnimatedSticker(document)) ? null : FileLoader.getClosestPhotoSizeWithSize(document.thumbs, 90);
SvgHelper.SvgDrawable svgThumb = DocumentObject.getSvgThumb(document, fromEmojiPanel ? Theme.key_emptyListPlaceholder : Theme.key_windowBackgroundGray, fromEmojiPanel ? 0.2f : 1.0f);
if (MessageObject.canAutoplayAnimatedSticker(document)) {
if (svgThumb != null) {

View File

@ -1245,7 +1245,7 @@ public abstract class TextSelectionHelper<Cell extends TextSelectionHelper.Selec
menu.getItem(1).setVisible(true);
}
}
if (LanguageDetector.hasSupport() && getSelectedText() != null) {
if (onTranslateListener != null && LanguageDetector.hasSupport() && getSelectedText() != null) {
LanguageDetector.detectLanguage(getSelectedText().toString(), lng -> {
translateFromLanguage = lng;
updateTranslateButton(menu);
@ -1360,7 +1360,6 @@ public abstract class TextSelectionHelper<Cell extends TextSelectionHelper.Selec
if (selectedView != null) {
int[] coords = offsetToCord(selectionEnd);
x2 = coords[0] + textX;
}
outRect.set(
Math.min(x1, x2), y1,

View File

@ -172,7 +172,7 @@ public class ThemePreviewMessagesCell extends LinearLayout {
private GestureDetector gestureDetector = new GestureDetector(context, new GestureDetector.SimpleOnGestureListener() {
@Override
public boolean onDoubleTap(MotionEvent e) {
boolean added = getMessageObject().selectReaction(MediaDataController.getInstance(currentAccount).getDoubleTapReaction(), false);
boolean added = getMessageObject().selectReaction(MediaDataController.getInstance(currentAccount).getDoubleTapReaction(), false, false);
setMessageObject(getMessageObject(), null, false, false);
requestLayout();
ReactionsEffectOverlay.removeCurrent(false);

View File

@ -2164,7 +2164,7 @@ public class ChannelAdminLogActivity extends BaseFragment implements Notificatio
Toast.makeText(getParentActivity(), LocaleController.getString("TextCopied", R.string.TextCopied), Toast.LENGTH_SHORT).show();
}
} else if (url instanceof URLSpanUserMention) {
long peerId = Utilities.parseInt(((URLSpanUserMention) url).getURL());
long peerId = Utilities.parseLong(((URLSpanUserMention) url).getURL());
if (peerId > 0) {
TLRPC.User user = MessagesController.getInstance(currentAccount).getUser(peerId);
if (user != null) {

File diff suppressed because it is too large Load Diff

View File

@ -121,6 +121,7 @@ public class AnimatedFileDrawable extends BitmapDrawable implements Animatable {
private int renderingWidth;
private float scaleFactor = 1f;
public final boolean isWebmSticker;
private final TLRPC.Document document;
private View parentView;
private ArrayList<View> secondParentViews = new ArrayList<>();
@ -171,6 +172,9 @@ public class AnimatedFileDrawable extends BitmapDrawable implements Animatable {
}
loadFrameTask = null;
scheduleNextGetFrame();
for (int i = 0; i < parents.size(); i++) {
parents.get(i).invalidate();
}
}
};
@ -229,8 +233,8 @@ public class AnimatedFileDrawable extends BitmapDrawable implements Animatable {
secondParentViews.get(a).invalidate();
}
}
if ((secondParentViews.isEmpty() || invalidateParentViewWithSecond) && parentView != null) {
parentView.invalidate();
for (int i = 0; i < parents.size(); i++) {
parents.get(i).invalidate();
}
scheduleNextGetFrame();
}
@ -331,7 +335,8 @@ public class AnimatedFileDrawable extends BitmapDrawable implements Animatable {
currentAccount = account;
renderingHeight = h;
renderingWidth = w;
isWebmSticker = MessageObject.isVideoSticker(document);
this.document = document;
isWebmSticker = MessageObject.isWebM(document) || MessageObject.isVideoSticker(document);
if (isWebmSticker) {
useSharedQueue = true;
}
@ -388,7 +393,7 @@ public class AnimatedFileDrawable extends BitmapDrawable implements Animatable {
}
public void addParent(View view) {
if (!parents.contains(view)) {
if (view != null && !parents.contains(view)) {
parents.add(view);
if (isRunning) {
scheduleNextGetFrame();
@ -482,6 +487,7 @@ public class AnimatedFileDrawable extends BitmapDrawable implements Animatable {
decodeQueue.recycle();
decodeQueue = null;
}
getPaint().setShader(null);
} else {
destroyWhenDone = true;
}
@ -534,7 +540,7 @@ public class AnimatedFileDrawable extends BitmapDrawable implements Animatable {
@Override
public void start() {
if (isRunning) {
if (isRunning || parents.size() == 0) {
return;
}
isRunning = true;
@ -623,8 +629,6 @@ public class AnimatedFileDrawable extends BitmapDrawable implements Animatable {
applyTransformation = true;
}
Paint paint;
@Override
public void draw(Canvas canvas) {
if (nativePtr == 0 && decoderCreated || destroyWhenDone) {
@ -714,12 +718,6 @@ public class AnimatedFileDrawable extends BitmapDrawable implements Animatable {
canvas.scale(scaleX, scaleY);
canvas.drawBitmap(renderingBitmap, 0, 0, getPaint());
}
if (isRunning && !invalidateTaskIsRunning) {
invalidateTaskIsRunning = true;
long timeToNextFrame = Math.max(1, invalidateAfter - (now - lastFrameTime) - 17);
uiHandler.removeCallbacks(mInvalidateTask);
uiHandler.postDelayed(mInvalidateTask, Math.min(timeToNextFrame, invalidateAfter));
}
}
}
@ -808,7 +806,7 @@ public class AnimatedFileDrawable extends BitmapDrawable implements Animatable {
if (stream != null) {
drawable = new AnimatedFileDrawable(path, false, streamFileSize, stream.getDocument(), stream.getLocation(), stream.getParentObject(), pendingSeekToUI, currentAccount, stream != null && stream.isPreview());
} else {
drawable = new AnimatedFileDrawable(path, false, streamFileSize, null, null, null, pendingSeekToUI, currentAccount, stream != null && stream.isPreview());
drawable = new AnimatedFileDrawable(path, false, streamFileSize, document, null, null, pendingSeekToUI, currentAccount, stream != null && stream.isPreview());
}
drawable.metaData[0] = metaData[0];
drawable.metaData[1] = metaData[1];

View File

@ -10,6 +10,7 @@ import android.graphics.PorterDuffXfermode;
import android.graphics.drawable.Drawable;
import android.os.SystemClock;
import android.view.View;
import android.view.animation.Interpolator;
import androidx.core.graphics.ColorUtils;
@ -57,6 +58,8 @@ public class AvatarsDarawable {
View parent;
private int overrideSize;
private float overrideAlpha = 1f;
public long transitionDuration = 220;
public Interpolator transitionInterpolator = CubicBezierInterpolator.DEFAULT;
public void commitTransition(boolean animated) {
if (!wasDraw || !animated) {
@ -133,7 +136,7 @@ public class AvatarsDarawable {
transitionProgressAnimator = null;
}
});
transitionProgressAnimator.setDuration(220);
transitionProgressAnimator.setDuration(transitionDuration);
transitionProgressAnimator.setInterpolator(CubicBezierInterpolator.DEFAULT);
transitionProgressAnimator.start();
invalidate();

View File

@ -0,0 +1,337 @@
package org.telegram.ui.Components;
import android.content.Context;
import android.graphics.Rect;
import android.graphics.drawable.Drawable;
import android.os.Bundle;
import android.text.TextUtils;
import android.util.TypedValue;
import android.view.Gravity;
import android.view.HapticFeedbackConstants;
import android.view.View;
import android.view.WindowManager;
import android.widget.FrameLayout;
import android.widget.TextView;
import org.telegram.messenger.AndroidUtilities;
import org.telegram.messenger.ImageLocation;
import org.telegram.messenger.LocaleController;
import org.telegram.messenger.R;
import org.telegram.messenger.UserObject;
import org.telegram.tgnet.TLRPC;
import org.telegram.ui.ActionBar.ActionBarLayout;
import org.telegram.ui.ActionBar.ActionBarPopupWindow;
import org.telegram.ui.ActionBar.BaseFragment;
import org.telegram.ui.ActionBar.Theme;
import org.telegram.ui.ChatActivity;
import org.telegram.ui.ProfileActivity;
import java.util.ArrayList;
import java.util.Collections;
import java.util.HashMap;
import java.util.concurrent.atomic.AtomicReference;
public class BackButtonMenu {
public static class PulledDialog<T> {
Class<T> activity;
int stackIndex;
TLRPC.Chat chat;
TLRPC.User user;
long dialogId;
int folderId;
int filterId;
}
private static HashMap<Integer, ArrayList<PulledDialog>> pulledDialogs;
public static ActionBarPopupWindow show(BaseFragment fragment, View backButton, long currentDialogId) {
if (fragment == null) {
return null;
}
final ActionBarLayout parentLayout = fragment.getParentLayout();
ArrayList<PulledDialog> dialogs = getStackedHistoryDialogs(fragment.getCurrentAccount(), parentLayout == null ? null : parentLayout.fragmentsStack, currentDialogId);
if (dialogs.size() <= 0) {
return null;
}
Context context = fragment.getParentActivity();
ActionBarPopupWindow.ActionBarPopupWindowLayout layout = new ActionBarPopupWindow.ActionBarPopupWindowLayout(context);
android.graphics.Rect backgroundPaddings = new Rect();
Drawable shadowDrawable = fragment.getParentActivity().getResources().getDrawable(R.drawable.popup_fixed_alert).mutate();
shadowDrawable.getPadding(backgroundPaddings);
layout.setBackgroundColor(Theme.getColor(Theme.key_actionBarDefaultSubmenuBackground));
AtomicReference<ActionBarPopupWindow> scrimPopupWindowRef = new AtomicReference<>();
for (int i = 0; i < dialogs.size(); ++i) {
final PulledDialog pDialog = dialogs.get(i);
final TLRPC.Chat chat = pDialog.chat;
final TLRPC.User user = pDialog.user;
FrameLayout cell = new FrameLayout(context);
cell.setMinimumWidth(AndroidUtilities.dp(200));
BackupImageView imageView = new BackupImageView(context);
imageView.setRoundRadius(AndroidUtilities.dp(32));
cell.addView(imageView, LayoutHelper.createFrameRelatively(32, 32, Gravity.START | Gravity.CENTER_VERTICAL, 13, 0, 0, 0));
TextView titleView = new TextView(context);
titleView.setLines(1);
titleView.setTextSize(TypedValue.COMPLEX_UNIT_DIP, 16);
titleView.setTextColor(Theme.getColor(Theme.key_actionBarDefaultSubmenuItem));
titleView.setEllipsize(TextUtils.TruncateAt.END);
cell.addView(titleView, LayoutHelper.createFrameRelatively(LayoutHelper.MATCH_PARENT, LayoutHelper.WRAP_CONTENT, Gravity.START | Gravity.CENTER_VERTICAL, 59, 0, 12, 0));
AvatarDrawable avatarDrawable = new AvatarDrawable();
avatarDrawable.setSmallSize(true);
if (chat != null) {
avatarDrawable.setInfo(chat);
imageView.setImage(ImageLocation.getForChat(chat, ImageLocation.TYPE_SMALL), "50_50", avatarDrawable, chat);
titleView.setText(chat.title);
} else if (user != null) {
String name;
if (pDialog.activity == ChatActivity.class && UserObject.isUserSelf(user)) {
name = LocaleController.getString("SavedMessages", R.string.SavedMessages);
avatarDrawable.setAvatarType(AvatarDrawable.AVATAR_TYPE_SAVED);
imageView.setImageDrawable(avatarDrawable);
} else if (UserObject.isReplyUser(user)) {
name = LocaleController.getString("RepliesTitle", R.string.RepliesTitle);
avatarDrawable.setAvatarType(AvatarDrawable.AVATAR_TYPE_REPLIES);
imageView.setImageDrawable(avatarDrawable);
} else if (UserObject.isDeleted(user)) {
name = LocaleController.getString("HiddenName", R.string.HiddenName);
avatarDrawable.setInfo(user);
imageView.setImage(ImageLocation.getForUser(user, ImageLocation.TYPE_SMALL), "50_50", avatarDrawable, user);
} else {
name = UserObject.getUserName(user);
avatarDrawable.setInfo(user);
imageView.setImage(ImageLocation.getForUser(user, ImageLocation.TYPE_SMALL), "50_50", avatarDrawable, user);
}
titleView.setText(name);
}
cell.setBackground(Theme.getSelectorDrawable(Theme.getColor(Theme.key_listSelector), false));
cell.setOnClickListener(e2 -> {
if (scrimPopupWindowRef.get() != null) {
scrimPopupWindowRef.getAndSet(null).dismiss();
}
if (pDialog.stackIndex >= 0) {
Long nextFragmentDialogId = null;
if (parentLayout == null || parentLayout.fragmentsStack == null || pDialog.stackIndex >= parentLayout.fragmentsStack.size()) {
nextFragmentDialogId = null;
} else {
BaseFragment nextFragment = parentLayout.fragmentsStack.get(pDialog.stackIndex);
if (nextFragment instanceof ChatActivity) {
nextFragmentDialogId = ((ChatActivity) nextFragment).getDialogId();
} else if (nextFragment instanceof ProfileActivity) {
nextFragmentDialogId = ((ProfileActivity) nextFragment).getDialogId();
}
}
if (nextFragmentDialogId != null && nextFragmentDialogId != pDialog.dialogId) {
for (int j = parentLayout.fragmentsStack.size() - 2; j > pDialog.stackIndex; --j) {
parentLayout.removeFragmentFromStack(j);
}
} else {
if (parentLayout != null && parentLayout.fragmentsStack != null) {
for (int j = parentLayout.fragmentsStack.size() - 2; j > pDialog.stackIndex; --j) {
if (j >= 0 && j < parentLayout.fragmentsStack.size()) {
parentLayout.removeFragmentFromStack(j);
}
}
if (pDialog.stackIndex < parentLayout.fragmentsStack.size()) {
parentLayout.showFragment(pDialog.stackIndex);
parentLayout.closeLastFragment(true);
return;
}
}
}
}
goToPulledDialog(fragment, pDialog);
});
layout.addView(cell, LayoutHelper.createLinear(LayoutHelper.MATCH_PARENT, 48));
}
ActionBarPopupWindow scrimPopupWindow = new ActionBarPopupWindow(layout, LayoutHelper.WRAP_CONTENT, LayoutHelper.WRAP_CONTENT);
scrimPopupWindowRef.set(scrimPopupWindow);
scrimPopupWindow.setPauseNotifications(true);
scrimPopupWindow.setDismissAnimationDuration(220);
scrimPopupWindow.setOutsideTouchable(true);
scrimPopupWindow.setClippingEnabled(true);
scrimPopupWindow.setAnimationStyle(R.style.PopupContextAnimation);
scrimPopupWindow.setFocusable(true);
layout.measure(View.MeasureSpec.makeMeasureSpec(AndroidUtilities.dp(1000), View.MeasureSpec.AT_MOST), View.MeasureSpec.makeMeasureSpec(AndroidUtilities.dp(1000), View.MeasureSpec.AT_MOST));
scrimPopupWindow.setInputMethodMode(ActionBarPopupWindow.INPUT_METHOD_NOT_NEEDED);
scrimPopupWindow.setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_UNSPECIFIED);
scrimPopupWindow.getContentView().setFocusableInTouchMode(true);
layout.setFitItems(true);
View fragmentView = fragment.getFragmentView();
if (fragmentView != null) {
int popupX = AndroidUtilities.dp(8) - backgroundPaddings.left;
if (AndroidUtilities.isTablet()) {
int[] location = new int[2];
fragmentView.getLocationInWindow(location);
popupX += location[0];
}
int popupY = (int) (backButton.getBottom() - backgroundPaddings.top - AndroidUtilities.dp(8));
scrimPopupWindow.showAtLocation(fragmentView, Gravity.LEFT | Gravity.TOP, popupX, popupY);
try {
fragmentView.performHapticFeedback(HapticFeedbackConstants.KEYBOARD_TAP, HapticFeedbackConstants.FLAG_IGNORE_GLOBAL_SETTING);
} catch (Exception ignore) {}
}
return scrimPopupWindow;
}
public static void goToPulledDialog(BaseFragment fragment, PulledDialog dialog) {
if (dialog == null) {
return;
}
if (dialog.activity == ChatActivity.class) {
Bundle bundle = new Bundle();
if (dialog.chat != null) {
bundle.putLong("chat_id", dialog.chat.id);
} else if (dialog.user != null) {
bundle.putLong("user_id", dialog.user.id);
}
bundle.putInt("dialog_folder_id", dialog.folderId);
bundle.putInt("dialog_filter_id", dialog.filterId);
fragment.presentFragment(new ChatActivity(bundle), true);
} else if (dialog.activity == ProfileActivity.class) {
Bundle bundle = new Bundle();
bundle.putLong("dialog_id", dialog.dialogId);
fragment.presentFragment(new ProfileActivity(bundle), true);
}
}
public static ArrayList<PulledDialog> getStackedHistoryDialogs(int account, ArrayList<BaseFragment> fragmentsStack, long ignoreDialogId) {
ArrayList<PulledDialog> dialogs = new ArrayList<>();
if (fragmentsStack != null) {
final int count = fragmentsStack.size();
for (int i = 0; i < count; ++i) {
BaseFragment fragment = fragmentsStack.get(i);
Class activity;
TLRPC.Chat chat;
TLRPC.User user = null;
long dialogId;
int folderId, filterId;
if (fragment instanceof ChatActivity) {
activity = ChatActivity.class;
ChatActivity chatActivity = (ChatActivity) fragment;
if (chatActivity.getChatMode() != 0 || chatActivity.isReport()) {
continue;
}
chat = chatActivity.getCurrentChat();
user = chatActivity.getCurrentUser();
dialogId = chatActivity.getDialogId();
folderId = chatActivity.getDialogFolderId();
filterId = chatActivity.getDialogFilterId();
} else if (fragment instanceof ProfileActivity) {
activity = ProfileActivity.class;
ProfileActivity profileActivity = (ProfileActivity) fragment;
chat = profileActivity.getCurrentChat();
try {
user = profileActivity.getUserInfo().user;
} catch (Exception ignore) {}
dialogId = profileActivity.getDialogId();
folderId = 0;
filterId = 0;
} else {
continue;
}
if (dialogId != ignoreDialogId && !(ignoreDialogId == 0 && UserObject.isUserSelf(user))) {
boolean alreadyAddedDialog = false;
for (int d = 0; d < dialogs.size(); ++d) {
if (dialogs.get(d).dialogId == dialogId) {
alreadyAddedDialog = true;
break;
}
}
if (!alreadyAddedDialog) {
PulledDialog pDialog = new PulledDialog();
pDialog.activity = activity;
pDialog.stackIndex = i;
pDialog.chat = chat;
pDialog.user = user;
pDialog.dialogId = dialogId;
pDialog.folderId = folderId;
pDialog.filterId = filterId;
if (pDialog.chat != null || pDialog.user != null) {
dialogs.add(pDialog);
}
}
}
}
}
if (pulledDialogs != null) {
ArrayList<PulledDialog> pulledDialogsAccount = pulledDialogs.get(account);
if (pulledDialogsAccount != null) {
for (PulledDialog pulledDialog : pulledDialogsAccount) {
if (pulledDialog.dialogId == ignoreDialogId) {
continue;
}
boolean alreadyAddedDialog = false;
for (int d = 0; d < dialogs.size(); ++d) {
if (dialogs.get(d).dialogId == pulledDialog.dialogId) {
alreadyAddedDialog = true;
break;
}
}
if (!alreadyAddedDialog) {
dialogs.add(pulledDialog);
}
}
}
}
Collections.sort(dialogs, (d1, d2) -> d2.stackIndex - d1.stackIndex);
return dialogs;
}
public static void addToPulledDialogs(int account, int stackIndex, TLRPC.Chat chat, TLRPC.User user, long dialogId, int folderId, int filterId) {
if (chat == null && user == null) {
return;
}
if (pulledDialogs == null) {
pulledDialogs = new HashMap<>();
}
ArrayList<PulledDialog> dialogs = null;
if (pulledDialogs.containsKey(account)) {
dialogs = pulledDialogs.get(account);
}
if (dialogs == null) {
pulledDialogs.put(account, dialogs = new ArrayList<>());
}
boolean alreadyAdded = false;
for (PulledDialog d : dialogs) {
if (d.dialogId == dialogId) {
alreadyAdded = true;
break;
}
}
if (!alreadyAdded) {
PulledDialog d = new PulledDialog();
d.activity = ChatActivity.class;
d.stackIndex = stackIndex;
d.dialogId = dialogId;
d.filterId = filterId;
d.folderId = folderId;
d.chat = chat;
d.user = user;
dialogs.add(d);
}
}
public static void clearPulledDialogs(int account, int fromIndex) {
if (pulledDialogs != null && pulledDialogs.containsKey(account)) {
ArrayList<PulledDialog> dialogs = pulledDialogs.get(account);
if (dialogs != null) {
for (int i = 0; i < dialogs.size(); ++i) {
if (dialogs.get(i).stackIndex > fromIndex) {
dialogs.remove(i);
i--;
}
}
}
}
}
}

View File

@ -44,7 +44,8 @@ public final class BulletinFactory {
PHOTO_TO_DOWNLOADS("PhotoSavedToDownloadsHint", R.string.PhotoSavedToDownloadsHint, Icon.SAVED_TO_DOWNLOADS),
VIDEO_TO_DOWNLOADS("VideoSavedToDownloadsHint", R.string.VideoSavedToDownloadsHint, Icon.SAVED_TO_DOWNLOADS),
GIF("GifSavedToDownloadsHint", Icon.SAVED_TO_DOWNLOADS),
GIF("GifSavedHint", R.string.GifSavedHint, Icon.SAVED_TO_GIFS),
GIF_TO_DOWNLOADS("GifSavedToDownloadsHint", R.string.GifSavedToDownloadsHint, Icon.SAVED_TO_DOWNLOADS),
AUDIO("AudioSavedHint", R.string.AudioSavedHint, Icon.SAVED_TO_MUSIC),
AUDIOS("AudiosSavedHint", Icon.SAVED_TO_MUSIC),
@ -87,7 +88,8 @@ public final class BulletinFactory {
SAVED_TO_DOWNLOADS(R.raw.ic_download, 2, "Box", "Arrow"),
SAVED_TO_GALLERY(R.raw.ic_save_to_gallery, 0, "Box", "Arrow", "Mask", "Arrow 2", "Splash"),
SAVED_TO_MUSIC(R.raw.ic_save_to_music, 2, "Box", "Arrow");
SAVED_TO_MUSIC(R.raw.ic_save_to_music, 2, "Box", "Arrow"),
SAVED_TO_GIFS(R.raw.ic_save_to_gifs, 0, "gif");
private final int resId;
private final String[] layers;

View File

@ -99,8 +99,6 @@ import androidx.recyclerview.widget.ChatListItemAnimator;
import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.recyclerview.widget.RecyclerView;
import com.google.android.exoplayer2.util.Log;
import org.telegram.messenger.AccountInstance;
import org.telegram.messenger.AndroidUtilities;
import org.telegram.messenger.ApplicationLoader;
@ -1965,7 +1963,7 @@ public class ChatActivityEnterView extends ChatBlurredFrameLayout implements Not
}
private void editPhoto(Uri uri, String mime) {
final File file = AndroidUtilities.generatePicturePath(fragment.isSecretChat(), MimeTypeMap.getSingleton().getExtensionFromMimeType(mime));
final File file = AndroidUtilities.generatePicturePath(fragment != null && fragment.isSecretChat(), MimeTypeMap.getSingleton().getExtensionFromMimeType(mime));
Utilities.globalQueue.postRunnable(() -> {
try {
InputStream in = context.getContentResolver().openInputStream(uri);
@ -6571,6 +6569,10 @@ public class ChatActivityEnterView extends ChatBlurredFrameLayout implements Not
return audioVideoButtonContainer;
}
public View getEmojiButton() {
return emojiButton[0];
}
public EmojiView getEmojiView() {
return emojiView;
}

View File

@ -2305,8 +2305,25 @@ public class EmojiView extends FrameLayout implements NotificationCenter.Notific
@Override
public void setTranslationY(float translationY) {
super.setTranslationY(translationY);
updateBottomTabContainerPosition();
updateStickerTabsPosition();
updateBottomTabContainerPosition();
}
private void updateBottomTabContainerPosition() {
if (bottomTabContainer.getTag() == null && (delegate == null || !delegate.isSearchOpened()) && (pager == null || pager.getCurrentItem() != 0)) {
View parent = (View) getParent();
if (parent != null) {
float y = getY() - parent.getHeight();
if (getLayoutParams().height > 0) {
y += getLayoutParams().height;
} else {
y += getMeasuredHeight();
}
if (bottomTabContainer.getTop() - y < 0) {
y = bottomTabContainer.getTop();
}
bottomTabContainer.setTranslationY(-y);
}
}
}
Rect rect = new Rect();
@ -2342,24 +2359,6 @@ public class EmojiView extends FrameLayout implements NotificationCenter.Notific
}
}
private void updateBottomTabContainerPosition() {
if (bottomTabContainer.getTag() == null && (delegate == null || !delegate.isSearchOpened())) {
View parent = (View) getParent();
if (parent != null) {
float y = getY() - parent.getHeight();
if (getLayoutParams().height > 0) {
y += getLayoutParams().height;
} else {
y += getMeasuredHeight();
}
if (bottomTabContainer.getTop() - y < 0) {
y = bottomTabContainer.getTop();
}
bottomTabContainer.setTranslationY(-y);
}
}
}
@Override
protected void dispatchDraw(Canvas canvas) {
updateBottomTabContainerPosition();
@ -3619,11 +3618,11 @@ public class EmojiView extends FrameLayout implements NotificationCenter.Notific
if (newHeight <= lastNotifyHeight) {
bottomTabContainer.setTranslationY(0);
} else {
float y = getY() + getMeasuredHeight() - parent.getHeight();
if (bottomTabContainer.getTop() - y < 0) {
y = bottomTabContainer.getTop();
}
bottomTabContainer.setTranslationY(-y);
// float y = getY() + getMeasuredHeight() - parent.getHeight() - bottomTabContainer.getTop();
// if (bottomTabContainer.getTop() - y < 0) {
// y = bottomTabContainer.getTop();
// }
// bottomTabContainer.setTranslationY(-y);
}
}
}

View File

@ -1043,6 +1043,7 @@ public class FragmentContextView extends FrameLayout implements NotificationCent
} else if (fragment instanceof ChatActivity && ((ChatActivity) fragment).getGroupCall() != null && ((ChatActivity) fragment).getGroupCall().shouldShowPanel() && !GroupCallPip.isShowing() && !isPlayingVoice()) {
checkCall(true);
} else {
checkCall(true);
checkPlayer(true);
updatePlaybackButton();
}
@ -1779,6 +1780,10 @@ public class FragmentContextView extends FrameLayout implements NotificationCent
visible = false;
setVisibility(GONE);
}
if (create && fragment instanceof ChatActivity && ((ChatActivity) fragment).openedWithLivestream() && !GroupCallPip.isShowing()) {
BulletinFactory.of(fragment).createSimpleBulletin(R.raw.linkbroken, LocaleController.getString("InviteExpired", R.string.InviteExpired)).show();
}
} else {
int newStyle;
if (groupActive) {

View File

@ -129,7 +129,7 @@ public class GroupedPhotosListView extends View implements GestureDetector.OnGes
}
MessageObject messageObject = imagesArr.get(currentIndex);
currentObject = messageObject;
long localGroupId = delegate.validGroupId(messageObject.getGroupIdForUse()) ? messageObject.getGroupIdForUse() : 0;
long localGroupId = messageObject.getGroupIdForUse();
if (localGroupId != currentGroupId) {
changed = true;
currentGroupId = localGroupId;

View File

@ -437,6 +437,7 @@ public class JoinCallAlert extends BottomSheet {
listView.setVerticalScrollBarEnabled(false);
listView.setClipToPadding(false);
listView.setEnabled(true);
listView.setSelectorDrawableColor(0);
listView.setGlowColor(Theme.getColor(Theme.key_dialogScrollGlow));
listView.setOnScrollListener(new RecyclerView.OnScrollListener() {
@Override

View File

@ -8,11 +8,11 @@
package org.telegram.ui.Components;
import android.graphics.CornerPathEffect;
import android.graphics.Path;
import android.graphics.RectF;
import android.os.Build;
import android.text.Layout;
import android.text.StaticLayout;
import org.telegram.messenger.AndroidUtilities;
@ -28,10 +28,10 @@ public class LinkPath extends Path {
private boolean allowReset = true;
private int baselineShift;
private int lineHeight;
private ArrayList<RectF> rects = new ArrayList<>();
private final int radius = AndroidUtilities.dp(4);
private final int halfRadius = radius >> 1;
private static final int radius = AndroidUtilities.dp(4);
private static final int halfRadius = radius >> 1;
public static final CornerPathEffect roundedEffect = new CornerPathEffect(radius);
public LinkPath() {
super();
@ -108,9 +108,7 @@ public class LinkPath extends Path {
y += baselineShift;
}
if (useRoundRect) {
RectF rect = new RectF();
rect.set(left - halfRadius, y, right + halfRadius, y2);
rects.add(rect);
super.addRect(left - halfRadius, y, right + halfRadius, y2, dir);
} else {
super.addRect(left, y, right, y2, dir);
}
@ -122,34 +120,5 @@ public class LinkPath extends Path {
return;
}
super.reset();
rects.clear();
}
private boolean containsPoint(float x, float y) {
for (RectF rect : rects) {
if (rect.contains(x, y)) {
return true;
}
}
return false;
}
public void onPathEnd() {
if (useRoundRect) {
super.reset();
final int count = rects.size();
for (int i = 0; i < count; ++i) {
float[] radii = new float[8];
RectF rect = rects.get(i);
radii[0] = radii[1] = containsPoint(rect.left, rect.top - radius) ? 0 : radius; // top left
radii[2] = radii[3] = containsPoint(rect.right, rect.top - radius) ? 0 : radius; // top right
radii[4] = radii[5] = containsPoint(rect.right, rect.bottom + radius) ? 0 : radius; // bottom right
radii[6] = radii[7] = containsPoint(rect.left, rect.bottom + radius) ? 0 : radius; // bottom left
super.addRoundRect(rect, radii, Direction.CW);
}
}
}
}

View File

@ -22,8 +22,6 @@ import android.text.TextUtils;
import android.view.HapticFeedbackConstants;
import android.view.View;
import com.google.android.exoplayer2.util.Log;
import org.telegram.messenger.AndroidUtilities;
import org.telegram.messenger.ApplicationLoader;
import org.telegram.messenger.DispatchQueuePool;
@ -211,12 +209,18 @@ public class RLottieDrawable extends BitmapDrawable implements Animatable {
}
protected void recycleResources() {
if (renderingBitmap != null) {
renderingBitmap.recycle();
try {
if (renderingBitmap != null) {
renderingBitmap.recycle();
renderingBitmap = null;
}
if (backgroundBitmap != null) {
backgroundBitmap.recycle();
backgroundBitmap = null;
}
} catch (Exception e) {
FileLog.e(e);
renderingBitmap = null;
}
if (backgroundBitmap != null) {
backgroundBitmap.recycle();
backgroundBitmap = null;
}
}

View File

@ -100,7 +100,7 @@ public class ReactedHeaderView extends FrameLayout {
MessagesController ctrl = MessagesController.getInstance(currentAccount);
TLRPC.Chat chat = ctrl.getChat(message.getChatId());
TLRPC.ChatFull chatInfo = ctrl.getChatFull(message.getChatId());
boolean showSeen = chat != null && message.isOutOwner() && message.isSent() && !message.isEditing() && !message.isSending() && !message.isSendError() && !message.isContentUnread() && !message.isUnread() && (ConnectionsManager.getInstance(currentAccount).getCurrentTime() - message.messageOwner.date < 7 * 86400) && (ChatObject.isMegagroup(chat) || !ChatObject.isChannel(chat)) && chatInfo != null && chatInfo.participants_count < MessagesController.getInstance(currentAccount).chatReadMarkSizeThreshold && !(message.messageOwner.action instanceof TLRPC.TL_messageActionChatJoinedByRequest);
boolean showSeen = chat != null && message.isOutOwner() && message.isSent() && !message.isEditing() && !message.isSending() && !message.isSendError() && !message.isContentUnread() && !message.isUnread() && (ConnectionsManager.getInstance(currentAccount).getCurrentTime() - message.messageOwner.date < 7 * 86400) && (ChatObject.isMegagroup(chat) || !ChatObject.isChannel(chat)) && chatInfo != null && chatInfo.participants_count <= MessagesController.getInstance(currentAccount).chatReadMarkSizeThreshold && !(message.messageOwner.action instanceof TLRPC.TL_messageActionChatJoinedByRequest);
if (showSeen) {
TLRPC.TL_messages_getMessageReadParticipants req = new TLRPC.TL_messages_getMessageReadParticipants();

View File

@ -12,16 +12,23 @@ import android.widget.FrameLayout;
import org.telegram.messenger.AndroidUtilities;
import org.telegram.messenger.ImageLocation;
import org.telegram.messenger.ImageReceiver;
import org.telegram.messenger.MediaDataController;
import org.telegram.messenger.MessageObject;
import org.telegram.messenger.MessagesController;
import org.telegram.tgnet.TLRPC;
import org.telegram.ui.ActionBar.BaseFragment;
import org.telegram.ui.Cells.ChatMessageCell;
import org.telegram.ui.ChatActivity;
import org.telegram.ui.Components.AvatarDrawable;
import org.telegram.ui.Components.BackupImageView;
import org.telegram.ui.Components.CubicBezierInterpolator;
import org.telegram.ui.Components.RLottieDrawable;
import org.telegram.ui.Components.ReactionsContainerLayout;
import java.util.ArrayList;
import java.util.Random;
public class ReactionsEffectOverlay {
public final static int LONG_ANIMATION = 0;
@ -31,6 +38,7 @@ public class ReactionsEffectOverlay {
private final int animationType;
@SuppressLint("StaticFieldLeak")
public static ReactionsEffectOverlay currentOverlay;
@SuppressLint("StaticFieldLeak")
public static ReactionsEffectOverlay currentShortOverlay;
private final AnimationView effectImageView;
@ -63,6 +71,9 @@ public class ReactionsEffectOverlay {
private boolean finished;
private boolean useWindow;
private ViewGroup decorView;
private static long lastHapticTime;
ArrayList<AvatarParticle> avatars = new ArrayList<>();
private ReactionsEffectOverlay(Context context, BaseFragment fragment, ReactionsContainerLayout reactionsLayout, ChatMessageCell cell, float x, float y, String reaction, int currentAccount, int animationType) {
this.fragment = fragment;
@ -83,6 +94,82 @@ public class ReactionsEffectOverlay {
}
}
}
if (animationType == SHORT_ANIMATION) {
Random random = new Random();
ArrayList<TLRPC.TL_messagePeerReaction> recentReactions = null;
if (cell.getMessageObject().messageOwner.reactions != null) {
recentReactions = cell.getMessageObject().messageOwner.reactions.recent_reactions;
}
if (recentReactions != null) {
for (int i = 0; i < recentReactions.size(); i++) {
if (reaction.equals(recentReactions.get(i).reaction) && recentReactions.get(i).unread) {
TLRPC.User user;
TLRPC.Chat chat;
AvatarDrawable avatarDrawable = new AvatarDrawable();
ImageReceiver imageReceiver = new ImageReceiver();
long peerId = MessageObject.getPeerId(recentReactions.get(i).peer_id);
if (peerId < 0) {
chat = MessagesController.getInstance(currentAccount).getChat(-peerId);
if (chat == null) {
continue;
}
avatarDrawable.setInfo(chat);
imageReceiver.setForUserOrChat(chat, avatarDrawable);
} else {
user = MessagesController.getInstance(currentAccount).getUser(peerId);
if (user == null) {
continue;
}
avatarDrawable.setInfo(user);
imageReceiver.setForUserOrChat(user, avatarDrawable);
}
AvatarParticle avatarParticle = new AvatarParticle();
avatarParticle.imageReceiver = imageReceiver;
avatarParticle.fromX = 0.5f;// + Math.abs(random.nextInt() % 100) / 100f * 0.2f;
avatarParticle.fromY = 0.5f;// + Math.abs(random.nextInt() % 100) / 100f * 0.2f;
avatarParticle.jumpY = 0.3f + Math.abs(random.nextInt() % 100) / 100f * 0.1f;
avatarParticle.randomScale = 0.8f + Math.abs(random.nextInt() % 100) / 100f * 0.4f;
avatarParticle.randomRotation = 60 * Math.abs(random.nextInt() % 100) / 100f;
avatarParticle.leftTime = (int) (400 + Math.abs(random.nextInt() % 100) / 100f * 200);
if (avatars.isEmpty()) {
avatarParticle.toX = 0.2f + 0.6f * Math.abs(random.nextInt() % 100) / 100f;
avatarParticle.toY = 0.4f * Math.abs(random.nextInt() % 100) / 100f;
} else {
float bestDistance = 0;
float bestX = 0;
float bestY = 0;
for (int k = 0; k < 10; k++) {
float randX = 0.2f + 0.6f * Math.abs(random.nextInt() % 100) / 100f;
float randY = 0.2f + 0.4f * Math.abs(random.nextInt() % 100) / 100f;
float minDistance = Integer.MAX_VALUE;
for (int j = 0; j < avatars.size(); j++) {
float rx = avatars.get(j).toX - randX;
float ry = avatars.get(j).toY - randY;
float distance = rx * rx + ry * ry;
if (distance < minDistance) {
minDistance = distance;
}
}
if (minDistance > bestDistance) {
bestDistance = minDistance;
bestX = randX;
bestY = randY;
}
}
avatarParticle.toX = bestX;
avatarParticle.toY = bestY;
}
avatars.add(avatarParticle);
}
}
}
}
boolean fromHolder = holderView != null || (x != 0 && y != 0);
if (holderView != null) {
holderView.getLocationOnScreen(loc);
@ -306,8 +393,90 @@ public class ReactionsEffectOverlay {
}
}
if (!avatars.isEmpty() && effectImageView.wasPlaying) {
RLottieDrawable animation = effectImageView.getImageReceiver().getLottieAnimation();
for (int i = 0; i < avatars.size(); i++) {
AvatarParticle particle = avatars.get(i);
float progress = particle.progress;
boolean isLeft;
if (animation != null && animation.isRunning()) {
long duration = effectImageView.getImageReceiver().getLottieAnimation().getDuration();
int totalFramesCount = effectImageView.getImageReceiver().getLottieAnimation().getFramesCount();
int currentFrame = effectImageView.getImageReceiver().getLottieAnimation().getCurrentFrame();
int timeLeft = (int) (duration - duration * (currentFrame / (float) totalFramesCount));
isLeft = timeLeft < particle.leftTime;
} else {
isLeft = true;
}
if (isLeft && particle.outProgress != 1f) {
particle.outProgress += 16f / 150f;
if (particle.outProgress > 1f) {
particle.outProgress = 1f;
}
}
float jumpProgress = progress < 0.5f ? (progress / 0.5f) : (1f - ((progress - 0.5f) / 0.5f));
float avatarX = particle.fromX * (1f - progress) + particle.toX * progress;
float avatarY = particle.fromY * (1f - progress) + particle.toY * progress - particle.jumpY * jumpProgress;
float s = progress * particle.randomScale * (1f - particle.outProgress);
float cx = effectImageView.getX() + (effectImageView.getWidth() * effectImageView.getScaleX()) * avatarX;
float cy = effectImageView.getY() + (effectImageView.getHeight() * effectImageView.getScaleY()) * avatarY;
int size = AndroidUtilities.dp(16);
avatars.get(i).imageReceiver.setImageCoords(cx - size / 2f, cy - size / 2f, size, size);
avatars.get(i).imageReceiver.setRoundRadius(size >> 1);
canvas.save();
canvas.translate(0, particle.globalTranslationY);
canvas.scale(s, s, cx, cy);
canvas.rotate(particle.currentRotation, cx, cy);
avatars.get(i).imageReceiver.draw(canvas);
canvas.restore();
if (particle.progress < 1f) {
particle.progress += 16f / 350f;
if (particle.progress > 1f) {
particle.progress = 1f;
}
}
if (progress >= 1f) {
particle.globalTranslationY += AndroidUtilities.dp(20) * 16f / 500f;
}
if (particle.incrementRotation) {
particle.currentRotation += particle.randomRotation / 250f;
if (particle.currentRotation > particle.randomRotation) {
particle.incrementRotation = false;
}
} else {
particle.currentRotation -= particle.randomRotation / 250f;
if (particle.currentRotation < -particle.randomRotation) {
particle.incrementRotation = true;
}
}
}
}
invalidate();
}
@Override
protected void onAttachedToWindow() {
super.onAttachedToWindow();
for (int i = 0; i < avatars.size(); i++) {
avatars.get(i).imageReceiver.onAttachedToWindow();
}
}
@Override
protected void onDetachedFromWindow() {
super.onDetachedFromWindow();
for (int i = 0; i < avatars.size(); i++) {
avatars.get(i).imageReceiver.onDetachedFromWindow();
}
}
};
effectImageView = new AnimationView(context);
emojiImageView = new AnimationView(context);
@ -461,6 +630,10 @@ public class ReactionsEffectOverlay {
public static void startAnimation() {
if (currentOverlay != null) {
currentOverlay.started = true;
if (currentOverlay.animationType == LONG_ANIMATION && System.currentTimeMillis() - lastHapticTime > 200) {
lastHapticTime = System.currentTimeMillis();
currentOverlay.cell.performHapticFeedback(HapticFeedbackConstants.KEYBOARD_TAP);
}
} else {
startShortAnimation();
if (currentShortOverlay != null) {
@ -472,7 +645,8 @@ public class ReactionsEffectOverlay {
public static void startShortAnimation() {
if (currentShortOverlay != null && !currentShortOverlay.started) {
currentShortOverlay.started = true;
if (currentShortOverlay.animationType == SHORT_ANIMATION) {
if (currentShortOverlay.animationType == SHORT_ANIMATION && System.currentTimeMillis() - lastHapticTime > 200) {
lastHapticTime = System.currentTimeMillis();
currentShortOverlay.cell.performHapticFeedback(HapticFeedbackConstants.KEYBOARD_TAP);
}
}
@ -534,4 +708,23 @@ public class ReactionsEffectOverlay {
}
}
}
private class AvatarParticle {
ImageReceiver imageReceiver;
public int leftTime;
float progress;
float outProgress;
float jumpY;
float fromX;
float fromY;
float toX;
float toY;
float randomScale;
float randomRotation;
float currentRotation;
boolean incrementRotation;
float globalTranslationY;
}
}

View File

@ -9,8 +9,7 @@ import android.view.MotionEvent;
import android.view.ViewConfiguration;
import androidx.core.graphics.ColorUtils;
import com.google.android.exoplayer2.util.Log;
import androidx.recyclerview.widget.ChatListItemAnimator;
import org.telegram.messenger.AndroidUtilities;
import org.telegram.messenger.ApplicationLoader;
@ -560,6 +559,8 @@ public class ReactionsLayoutInBubble {
if (users != null) {
if (avatarsDarawable == null) {
avatarsDarawable = new AvatarsDarawable(parentView, false);
avatarsDarawable.transitionDuration = ChatListItemAnimator.DEFAULT_DURATION;
avatarsDarawable.transitionInterpolator = ChatListItemAnimator.DEFAULT_INTERPOLATOR;
avatarsDarawable.setSize(AndroidUtilities.dp(20));
avatarsDarawable.width = AndroidUtilities.dp(100);
avatarsDarawable.height = height;

View File

@ -51,7 +51,6 @@ import java.util.ArrayList;
import java.util.Collections;
import java.util.HashSet;
import java.util.List;
import java.util.Random;
public class ReactionsContainerLayout extends FrameLayout implements NotificationCenter.NotificationCenterDelegate {
public final static Property<ReactionsContainerLayout, Float> TRANSITION_PROGRESS_VALUE = new Property<ReactionsContainerLayout, Float>(Float.class, "transitionProgress") {
@ -66,8 +65,6 @@ public class ReactionsContainerLayout extends FrameLayout implements Notificatio
}
};
private final static Random RANDOM = new Random();
private final static int ALPHA_DURATION = 150;
private final static float SIDE_SCALE = 0.6f;
private final static float SCALE_PROGRESS = 0.75f;
@ -127,7 +124,7 @@ public class ReactionsContainerLayout extends FrameLayout implements Notificatio
recyclerListView = new RecyclerListView(context) {
@Override
public boolean drawChild(Canvas canvas, View child, long drawingTime) {
if (pressedReaction != null && ((ReactionHolderView) child).currentReaction.equals(pressedReaction)) {
if (pressedReaction != null && ((ReactionHolderView) child).currentReaction.reaction.equals(pressedReaction)) {
return true;
}
return super.drawChild(canvas, child, drawingTime);
@ -377,7 +374,17 @@ public class ReactionsContainerLayout extends FrameLayout implements Notificatio
}
canvas.save();
canvas.translate(recyclerListView.getX() + view.getX(), recyclerListView.getY() + view.getY());
float x = recyclerListView.getX() + view.getX();
float additionalWidth = (view.getMeasuredWidth() * view.getScaleX() - view.getMeasuredWidth()) / 2f;
if (x - additionalWidth < 0) {
view.setTranslationX(-(x - additionalWidth));
} else if (x + view.getMeasuredWidth() + additionalWidth > getMeasuredWidth()) {
view.setTranslationX(getMeasuredWidth() - x - view.getMeasuredWidth() - additionalWidth);
} else {
view.setTranslationX(0);
}
x = recyclerListView.getX() + view.getX();
canvas.translate(x, recyclerListView.getY() + view.getY());
canvas.scale(view.getScaleX(), view.getScaleY(), view.getPivotX(), view.getPivotY());
view.draw(canvas);
canvas.restore();

View File

@ -912,8 +912,7 @@ public class ShareAlert extends BottomSheet implements NotificationCenter.Notifi
return y >= AndroidUtilities.dp(darkTheme && linkToCopy[1] != null ? 111 : 58) + (Build.VERSION.SDK_INT >= 21 ? AndroidUtilities.statusBarHeight : 0);
}
};
gridView.setSelectorRadius(AndroidUtilities.dp(8));
gridView.setSelectorDrawableColor(Theme.getColor(Theme.key_listSelector));
gridView.setSelectorDrawableColor(0);
gridView.setPadding(0, 0, 0, AndroidUtilities.dp(48));
gridView.setClipToPadding(false);
gridView.setLayoutManager(layoutManager = new GridLayoutManager(getContext(), 4));
@ -973,6 +972,7 @@ public class ShareAlert extends BottomSheet implements NotificationCenter.Notifi
return y >= AndroidUtilities.dp(darkTheme && linkToCopy[1] != null ? 111 : 58) + (Build.VERSION.SDK_INT >= 21 ? AndroidUtilities.statusBarHeight : 0);
}
};
searchGridView.setSelectorDrawableColor(0);
searchGridView.setPadding(0, 0, 0, AndroidUtilities.dp(48));
searchGridView.setClipToPadding(false);
searchGridView.setLayoutManager(searchLayoutManager = new FillLastGridLayoutManager(getContext(), 4, 0, searchGridView));

View File

@ -2220,6 +2220,9 @@ public class SharedMediaLayout extends FrameLayout implements NotificationCenter
}
private void updateForwardItem() {
if (forwardItem == null) {
return;
}
boolean noforwards = profileActivity.getMessagesController().isChatNoForwards(-dialog_id) || hasNoforwardsMessage();
forwardItem.setAlpha(noforwards ? 0.5f : 1f);
if (noforwards && forwardItem.getBackground() != null) {

View File

@ -87,7 +87,6 @@ public class SizeNotifierFrameLayout extends FrameLayout {
@Override
protected void onDraw(Canvas canvas) {
if (backgroundDrawable == null || skipBackgroundDrawing) {
super.onDraw(canvas);
return;
}
Drawable newDrawable = getNewDrawable();

View File

@ -172,6 +172,7 @@ public class StaticLayoutEx {
.setAlignment(align)
.setLineSpacing(spacingAdd, spacingMult)
.setIncludePad(includePad)
.setEllipsize(ellipsize)
.setEllipsizedWidth(ellipsisWidth)
.setMaxLines(maxLines)
.setBreakStrategy(canContainUrl ? StaticLayout.BREAK_STRATEGY_HIGH_QUALITY : StaticLayout.BREAK_STRATEGY_SIMPLE)

View File

@ -864,18 +864,22 @@ public class TranslateAlert extends Dialog {
}
public String languageName(String locale) {
// sorry, no more vodka
if (locale == null || locale.equals("und") || locale.equals("auto")) {
return null;
}
LocaleController.LocaleInfo localeInfo = LocaleController.getInstance().getBuiltinLanguageByPlural(locale);
if (localeInfo == null) {
LocaleController.LocaleInfo thisLanguageInfo = LocaleController.getInstance().getBuiltinLanguageByPlural(locale),
currentLanguageInfo = LocaleController.getInstance().getCurrentLocaleInfo();
if (thisLanguageInfo == null) {
return null;
}
boolean isCurrentLanguageEnglish = false;
try {
isCurrentLanguageEnglish = LocaleController.getInstance().getCurrentLocaleInfo().pluralLangCode.equals("en");
} catch (Exception e) {}
return isCurrentLanguageEnglish ? localeInfo.nameEnglish : localeInfo.name;
boolean isCurrentLanguageEnglish = currentLanguageInfo != null && "en".equals(currentLanguageInfo.pluralLangCode);
if (isCurrentLanguageEnglish) {
// trying to show this language in a language of the interface, but there are only names in english and its own
return thisLanguageInfo.nameEnglish;
} else {
return thisLanguageInfo.name;
}
}
public void updateSourceLanguage() {

View File

@ -163,7 +163,7 @@ public class VideoPlayer implements ExoPlayer.EventListener, SimpleExoPlayer.Vid
}
}
private void ensurePleyaerCreated() {
private void ensurePlayerCreated() {
DefaultLoadControl loadControl = new DefaultLoadControl(
new DefaultAllocator(true, C.DEFAULT_BUFFER_SEGMENT_SIZE),
DefaultLoadControl.DEFAULT_MIN_BUFFER_MS,
@ -266,7 +266,7 @@ public class VideoPlayer implements ExoPlayer.EventListener, SimpleExoPlayer.Vid
mixedAudio = true;
audioPlayerReady = false;
videoPlayerReady = false;
ensurePleyaerCreated();
ensurePlayerCreated();
MediaSource mediaSource1 = null, mediaSource2 = null;
for (int a = 0; a < 2; a++) {
MediaSource mediaSource;
@ -316,7 +316,7 @@ public class VideoPlayer implements ExoPlayer.EventListener, SimpleExoPlayer.Vid
currentUri = uri;
String scheme = uri.getScheme();
isStreaming = scheme != null && !scheme.startsWith("file");
ensurePleyaerCreated();
ensurePlayerCreated();
MediaSource mediaSource;
switch (type) {
case "dash":

View File

@ -712,6 +712,7 @@ public class SpoilerEffect extends Drawable {
public static void renderWithRipple(View v, boolean invalidateSpoilersParent, int spoilersColor, int verticalOffset, AtomicReference<Layout> patchedLayoutRef, Layout textLayout, List<SpoilerEffect> spoilers, Canvas canvas) {
if (spoilers.isEmpty()) {
textLayout.draw(canvas);
return;
}
Layout pl = patchedLayoutRef.get();
@ -748,8 +749,9 @@ public class SpoilerEffect extends Drawable {
.setAlignment(Layout.Alignment.ALIGN_NORMAL)
.setLineSpacing(textLayout.getSpacingAdd(), textLayout.getSpacingMultiplier())
.build();
} else
} else {
layout = new StaticLayout(sb, textLayout.getPaint(), textLayout.getWidth(), textLayout.getAlignment(), textLayout.getSpacingMultiplier(), textLayout.getSpacingAdd(), false);
}
patchedLayoutRef.set(pl = layout);
}

View File

@ -213,7 +213,7 @@ public class AcceptDeclineView extends View {
leftAnimator = animator;
if (listener != null) {
if ((!startDrag && Math.abs(dy) < touchSlop && !screenWasWakeup) || leftOffsetX > maxOffset * 0.8f) {
listener.onDicline();
listener.onDecline();
}
}
} else {
@ -387,7 +387,7 @@ public class AcceptDeclineView extends View {
public interface Listener {
void onAccept();
void onDicline();
void onDecline();
}
public void setRetryMod(boolean retryMod) {
@ -481,7 +481,7 @@ public class AcceptDeclineView extends View {
if (virtualViewId == ACCEPT_VIEW_ID) {
listener.onAccept();
} else if (virtualViewId == DECLINE_VIEW_ID) {
listener.onDicline();
listener.onDecline();
}
}
}

View File

@ -534,7 +534,7 @@ public class VoIPFloatingLayout extends FrameLayout {
active = b;
}
public void saveRelatedPosition() {
public void saveRelativePosition() {
if (getMeasuredWidth() > 0 && relativePositionToSetX < 0) {
ViewParent parent = getParent();
if (parent == null) {

View File

@ -363,9 +363,7 @@ public class VoIPTextureView extends FrameLayout {
super.onMeasure(widthMeasureSpec, heightMeasureSpec);
updateRendererSize();
super.onMeasure(widthMeasureSpec, heightMeasureSpec);
if (!applyRotation) {
renderer.updateRotation();
}
renderer.updateRotation();
}
protected void updateRendererSize() {

View File

@ -732,7 +732,11 @@ public class ContentPreviewViewer {
}
currentStickerSet = newSet;
TLRPC.PhotoSize thumb = FileLoader.getClosestPhotoSizeWithSize(document.thumbs, 90);
centerImage.setImage(ImageLocation.getForDocument(document), null, ImageLocation.getForDocument(thumb, document), null, "webp", currentStickerSet, 1);
if (MessageObject.isVideoStickerDocument(document)) {
centerImage.setImage(ImageLocation.getForDocument(document), null, ImageLocation.getForDocument(thumb, document), null, null, 0, "webp", currentStickerSet, 1);
} else {
centerImage.setImage(ImageLocation.getForDocument(document), null, ImageLocation.getForDocument(thumb, document), null, "webp", currentStickerSet, 1);
}
for (int a = 0; a < document.attributes.size(); a++) {
TLRPC.DocumentAttribute attribute = document.attributes.get(a);
if (attribute instanceof TLRPC.TL_documentAttributeSticker) {
@ -972,5 +976,4 @@ public class ContentPreviewViewer {
Integer color = resourcesProvider != null ? resourcesProvider.getColor(key) : null;
return color != null ? color : Theme.getColor(key);
}
}

View File

@ -13,7 +13,6 @@ import android.content.Context;
import android.content.DialogInterface;
import android.content.SharedPreferences;
import android.content.res.Configuration;
import android.view.Gravity;
import android.view.View;
import android.view.ViewGroup;
import android.widget.EditText;
@ -32,11 +31,6 @@ import org.telegram.messenger.MessagesController;
import org.telegram.messenger.NotificationCenter;
import org.telegram.messenger.R;
import org.telegram.messenger.Utilities;
import org.telegram.ui.ActionBar.AlertDialog;
import org.telegram.ui.ActionBar.Theme;
import org.telegram.ui.ActionBar.ThemeDescription;
import org.telegram.ui.Cells.HeaderCell;
import org.telegram.ui.Cells.LanguageCell;
import org.telegram.ui.ActionBar.ActionBar;
import org.telegram.ui.ActionBar.ActionBarMenu;
import org.telegram.ui.ActionBar.ActionBarMenuItem;
@ -60,7 +54,6 @@ import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.HashSet;
import java.util.Set;
import java.util.Timer;
public class LanguageSelectActivity extends BaseFragment implements NotificationCenter.NotificationCenterDelegate {
@ -175,8 +168,9 @@ public class LanguageSelectActivity extends BaseFragment implements Notification
return;
}
boolean search = listView.getAdapter() == searchListViewAdapter;
if (!search)
if (!search) {
position -= 2;
}
LocaleController.LocaleInfo localeInfo;
if (search) {
localeInfo = searchResult.get(position);
@ -219,8 +213,9 @@ public class LanguageSelectActivity extends BaseFragment implements Notification
return false;
}
boolean search = listView.getAdapter() == searchListViewAdapter;
if (!search)
position--;
if (!search) {
position -= 2;
}
LocaleController.LocaleInfo localeInfo;
if (search) {
localeInfo = searchResult.get(position);

View File

@ -49,6 +49,7 @@ import android.view.MotionEvent;
import android.view.View;
import android.view.ViewAnimationUtils;
import android.view.ViewGroup;
import android.view.ViewParent;
import android.view.ViewTreeObserver;
import android.view.Window;
import android.view.WindowManager;
@ -103,6 +104,7 @@ import org.telegram.messenger.camera.CameraController;
import org.telegram.messenger.voip.VideoCapturerDevice;
import org.telegram.messenger.voip.VoIPPendingCall;
import org.telegram.messenger.voip.VoIPService;
import org.telegram.tgnet.AbstractSerializedData;
import org.telegram.tgnet.ConnectionsManager;
import org.telegram.tgnet.TLObject;
import org.telegram.tgnet.TLRPC;
@ -1562,6 +1564,7 @@ public class LaunchActivity extends Activity implements ActionBarLayout.ActionBa
String phone = null;
String game = null;
String voicechat = null;
String livestream = null;
String phoneHash = null;
String lang = null;
String theme = null;
@ -1740,6 +1743,7 @@ public class LaunchActivity extends Activity implements ActionBarLayout.ActionBa
botChat = data.getQueryParameter("startgroup");
game = data.getQueryParameter("game");
voicechat = data.getQueryParameter("voicechat");
livestream = data.getQueryParameter("livestream");
threadId = Utilities.parseInt(data.getQueryParameter("thread"));
if (threadId == 0) {
threadId = null;
@ -1777,6 +1781,7 @@ public class LaunchActivity extends Activity implements ActionBarLayout.ActionBa
botChat = data.getQueryParameter("startgroup");
game = data.getQueryParameter("game");
voicechat = data.getQueryParameter("voicechat");
livestream = data.getQueryParameter("livestream");
messageId = Utilities.parseInt(data.getQueryParameter("post"));
if (messageId == 0) {
messageId = null;
@ -2077,7 +2082,7 @@ public class LaunchActivity extends Activity implements ActionBarLayout.ActionBa
if (message != null && message.startsWith("@")) {
message = " " + message;
}
runLinkRequest(intentAccount[0], username, group, sticker, botUser, botChat, message, hasUrl, messageId, channelId, threadId, commentId, game, auth, lang, unsupportedUrl, code, login, wallPaper, theme, voicechat, 0, videoTimestamp);
runLinkRequest(intentAccount[0], username, group, sticker, botUser, botChat, message, hasUrl, messageId, channelId, threadId, commentId, game, auth, lang, unsupportedUrl, code, login, wallPaper, theme, voicechat, livestream, 0, videoTimestamp);
} else {
try (Cursor cursor = getContentResolver().query(intent.getData(), null, null, null, null)) {
if (cursor != null) {
@ -2749,6 +2754,7 @@ public class LaunchActivity extends Activity implements ActionBarLayout.ActionBa
final TLRPC.TL_wallPaper wallPaper,
final String theme,
final String voicechat,
final String livestream,
final int state,
final int videoTimestamp) {
if (state == 0 && UserConfig.getActivatedAccountsCount() >= 2 && auth != null) {
@ -2756,7 +2762,7 @@ public class LaunchActivity extends Activity implements ActionBarLayout.ActionBa
if (account != intentAccount) {
switchToAccount(account, true);
}
runLinkRequest(account, username, group, sticker, botUser, botChat, message, hasUrl, messageId, channelId, threadId, commentId, game, auth, lang, unsupportedUrl, code, loginToken, wallPaper, theme, voicechat, 1, videoTimestamp);
runLinkRequest(account, username, group, sticker, botUser, botChat, message, hasUrl, messageId, channelId, threadId, commentId, game, auth, lang, unsupportedUrl, code, loginToken, wallPaper, theme, voicechat, livestream, 1, videoTimestamp);
}).show();
return;
} else if (code != null) {
@ -2789,7 +2795,7 @@ public class LaunchActivity extends Activity implements ActionBarLayout.ActionBa
if (!LaunchActivity.this.isFinishing()) {
boolean hideProgressDialog = true;
final TLRPC.TL_contacts_resolvedPeer res = (TLRPC.TL_contacts_resolvedPeer) response;
if (error == null && actionBarLayout != null && (game == null && voicechat == null || game != null && !res.users.isEmpty() || voicechat != null && !res.chats.isEmpty())) {
if (error == null && actionBarLayout != null && (game == null && voicechat == null || game != null && !res.users.isEmpty() || voicechat != null && !res.chats.isEmpty() || livestream != null && !res.chats.isEmpty())) {
MessagesController.getInstance(intentAccount).putUsers(res.users, false);
MessagesController.getInstance(intentAccount).putChats(res.chats, false);
MessagesStorage.getInstance(intentAccount).putUsersAndChats(res.users, res.chats, false, true);
@ -2902,6 +2908,9 @@ public class LaunchActivity extends Activity implements ActionBarLayout.ActionBa
if (voicechat != null) {
args.putString("voicechat", voicechat);
}
if (livestream != null) {
args.putString("livestream", livestream);
}
if (videoTimestamp >= 0) {
args.putInt("video_timestamp", videoTimestamp);
}
@ -3590,23 +3599,25 @@ public class LaunchActivity extends Activity implements ActionBarLayout.ActionBa
return;
}
if (SharedConfig.isAppUpdateAvailable()) {
View prevUpdateLayout = updateLayout;
createUpdateUI();
updateSizeTextView.setText(AndroidUtilities.formatFileSize(SharedConfig.pendingAppUpdate.document.size));
String fileName = FileLoader.getAttachFileName(SharedConfig.pendingAppUpdate.document);
File path = FileLoader.getPathToAttach(SharedConfig.pendingAppUpdate.document, true);
boolean showSize;
if (path.exists()) {
updateLayoutIcon.setIcon(MediaActionDrawable.ICON_UPDATE, true, animated);
updateLayoutIcon.setIcon(MediaActionDrawable.ICON_UPDATE, true, false);
updateTextView.setText(LocaleController.getString("AppUpdateNow", R.string.AppUpdateNow));
showSize = false;
} else {
if (FileLoader.getInstance(currentAccount).isLoadingFile(fileName)) {
updateLayoutIcon.setIcon(MediaActionDrawable.ICON_CANCEL, true, animated);
updateLayoutIcon.setIcon(MediaActionDrawable.ICON_CANCEL, true, false);
updateLayoutIcon.setProgress(0, false);
Float p = ImageLoader.getInstance().getFileProgress(fileName);
updateTextView.setText(LocaleController.formatString("AppUpdateDownloading", R.string.AppUpdateDownloading, (int) ((p != null ? p : 0.0f) * 100)));
showSize = false;
} else {
updateLayoutIcon.setIcon(MediaActionDrawable.ICON_DOWNLOAD, true, animated);
updateLayoutIcon.setIcon(MediaActionDrawable.ICON_DOWNLOAD, true, false);
updateTextView.setText(LocaleController.getString("AppUpdate", R.string.AppUpdate));
showSize = true;
}
@ -3640,9 +3651,18 @@ public class LaunchActivity extends Activity implements ActionBarLayout.ActionBa
updateLayout.setVisibility(View.VISIBLE);
updateLayout.setTag(1);
if (animated) {
updateLayout.animate().translationY(0).setInterpolator(CubicBezierInterpolator.EASE_OUT).setListener(null).setDuration(180).start();
updateLayout.animate().translationY(0).setInterpolator(CubicBezierInterpolator.EASE_OUT).setListener(null).setDuration(180).withEndAction(() -> {
if (prevUpdateLayout != null) {
ViewGroup parent = (ViewGroup) prevUpdateLayout.getParent();
parent.removeView(prevUpdateLayout);
}
}).start();
} else {
updateLayout.setTranslationY(0);
if (prevUpdateLayout != null) {
ViewGroup parent = (ViewGroup) prevUpdateLayout.getParent();
parent.removeView(prevUpdateLayout);
}
}
sideMenu.setPadding(0, 0, 0, AndroidUtilities.dp(44));
} else {
@ -3884,11 +3904,17 @@ public class LaunchActivity extends Activity implements ActionBarLayout.ActionBa
final long did = dids.get(i);
AccountInstance accountInstance = AccountInstance.getInstance(UserConfig.selectedAccount);
boolean photosEditorOpened = false;
if (fragment != null) {
actionBarLayout.presentFragment(fragment, dialogsFragment != null, dialogsFragment == null, true, false);
if (videoPath != null) {
fragment.openVideoEditor(videoPath, sendingText);
sendingText = null;
} else if (photoPathsArray != null && photoPathsArray.size() > 0) {
photosEditorOpened = fragment.openPhotosEditor(photoPathsArray, message == null || message.length() == 0 ? sendingText : message);
if (photosEditorOpened) {
sendingText = null;
}
}
} else {
if (videoPath != null) {
@ -3901,7 +3927,7 @@ public class LaunchActivity extends Activity implements ActionBarLayout.ActionBa
SendMessagesHelper.prepareSendingDocuments(accountInstance, arrayList, arrayList, null, captionToSend, null, did, null, null, null, null, true, 0);
}
}
if (photoPathsArray != null) {
if (photoPathsArray != null && !photosEditorOpened) {
if (sendingText != null && sendingText.length() <= 1024 && photoPathsArray.size() == 1) {
photoPathsArray.get(0).caption = sendingText;
sendingText = null;

View File

@ -1,9 +1,9 @@
package org.telegram.ui;
import android.annotation.SuppressLint;
import android.content.Context;
import android.graphics.Canvas;
import android.view.View;
import android.view.ViewGroup;
import org.telegram.messenger.NotificationCenter;
@ -14,11 +14,13 @@ public class MessageEnterTransitionContainer extends View {
private ArrayList<Transition> transitions = new ArrayList<>();
private final int currentAccount;
private final ViewGroup parent;
Runnable hideRunnable = () -> setVisibility(View.GONE);
public MessageEnterTransitionContainer(Context context, int currentAccount) {
super(context);
public MessageEnterTransitionContainer(ViewGroup parent, int currentAccount) {
super(parent.getContext());
this.parent = parent;
this.currentAccount = currentAccount;
}
@ -29,11 +31,13 @@ public class MessageEnterTransitionContainer extends View {
void addTransition(Transition transition) {
transitions.add(transition);
checkVisibility();
parent.invalidate();
}
void removeTransition(Transition transition) {
transitions.remove(transition);
checkVisibility();
parent.invalidate();
}
@Override
@ -55,4 +59,8 @@ public class MessageEnterTransitionContainer extends View {
setVisibility(View.VISIBLE);
}
}
public boolean isRunning() {
return transitions.size() > 0;
}
}

View File

@ -126,7 +126,7 @@ public class MessageSeenView extends FrameLayout {
} else {
if (ChatObject.isChannel(chat)) {
TLRPC.TL_channels_getParticipants usersReq = new TLRPC.TL_channels_getParticipants();
usersReq.limit = 50;
usersReq.limit = MessagesController.getInstance(currentAccount).chatReadMarkSizeThreshold;
usersReq.offset = 0;
usersReq.filter = new TLRPC.TL_channelParticipantsRecent();
usersReq.channel = MessagesController.getInstance(currentAccount).getInputChannel(chat.id);
@ -185,6 +185,10 @@ public class MessageSeenView extends FrameLayout {
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
View parent = (View) getParent();
if (parent != null && parent.getWidth() > 0) {
widthMeasureSpec = MeasureSpec.makeMeasureSpec(parent.getWidth(), MeasureSpec.EXACTLY);
}
if (flickerLoadingView.getVisibility() == View.VISIBLE) {
ignoreLayout = true;
flickerLoadingView.setVisibility(View.GONE);

View File

@ -105,6 +105,7 @@ import android.view.VelocityTracker;
import android.view.View;
import android.view.ViewConfiguration;
import android.view.ViewGroup;
import android.view.ViewPropertyAnimator;
import android.view.ViewTreeObserver;
import android.view.WindowInsets;
import android.view.WindowManager;
@ -419,6 +420,8 @@ public class PhotoViewer implements NotificationCenter.NotificationCenterDelegat
private View flashView;
private AnimatorSet flashAnimator;
private TextureView videoTextureView;
private boolean firstFrameSet = false;
private ImageView firstFrameView;
private VideoPlayer videoPlayer;
private boolean manuallyPaused;
private Runnable videoPlayRunnable;
@ -797,6 +800,9 @@ public class PhotoViewer implements NotificationCenter.NotificationCenterDelegat
if (isCurrentVideo) {
if (!videoTimelineView.isDragging()) {
float progress = videoPlayer.getCurrentPosition() / (float) videoPlayer.getDuration();
if (shownControlsByEnd && !actionBarWasShownBeforeByEnd) {
progress = 0;
}
if (!inPreview && (currentEditMode != 0 || videoTimelineView.getVisibility() == View.VISIBLE)) {
if (progress >= videoTimelineView.getRightProgress()) {
videoTimelineView.setProgress(videoTimelineView.getLeftProgress());
@ -819,6 +825,9 @@ public class PhotoViewer implements NotificationCenter.NotificationCenterDelegat
}
} else {
float progress = videoPlayer.getCurrentPosition() / (float) videoPlayer.getDuration();
if (shownControlsByEnd && !actionBarWasShownBeforeByEnd) {
progress = 0;
}
float bufferedProgress;
if (currentVideoFinishedLoading) {
bufferedProgress = 1.0f;
@ -874,6 +883,7 @@ public class PhotoViewer implements NotificationCenter.NotificationCenterDelegat
}
updateVideoPlayerTime();
}
updateFirstFrameView();
}
if (isPlaying) {
AndroidUtilities.runOnUIThread(updateProgressRunnable, 17);
@ -4256,6 +4266,11 @@ public class PhotoViewer implements NotificationCenter.NotificationCenterDelegat
MediaDataController.getInstance(currentAccount).addRecentGif(document, (int) (System.currentTimeMillis() / 1000));
MessagesController.getInstance(currentAccount).saveGif(pageBlocksAdapter.getParentObject(), document);
}
} else {
return;
}
if (containerView != null) {
BulletinFactory.of(containerView, resourcesProvider).createDownloadBulletin(BulletinFactory.FileType.GIF, resourcesProvider).show();
}
} else if (id == gallery_menu_set_as_main) {
TLRPC.Photo photo = avatarsArr.get(currentIndex);
@ -6264,6 +6279,9 @@ public class PhotoViewer implements NotificationCenter.NotificationCenterDelegat
textureImageView.setTranslationY(fromY2);
videoTextureView.setTranslationY(fromY);
if (firstFrameView != null) {
firstFrameView.setTranslationY(fromY);
}
translationY = 0;
containerView.invalidate();
@ -6286,6 +6304,13 @@ public class PhotoViewer implements NotificationCenter.NotificationCenterDelegat
videoTextureView.setTranslationX(fromX * (1f - xValue) + (toX2) * xValue);
videoTextureView.setTranslationY(fromY * (1f - yValue) + (toY2) * yValue);
if (firstFrameView != null) {
firstFrameView.setTranslationX(videoTextureView.getTranslationX());
firstFrameView.setTranslationY(videoTextureView.getTranslationY());
firstFrameView.setScaleX(videoTextureView.getScaleX());
firstFrameView.setScaleY(videoTextureView.getScaleY());
}
});
AnimatorSet animatorSet = new AnimatorSet();
@ -6378,6 +6403,12 @@ public class PhotoViewer implements NotificationCenter.NotificationCenterDelegat
videoTextureView.setScaleY(scale);
videoTextureView.setTranslationX(rect.x - aspectRatioFrameLayout.getX());
videoTextureView.setTranslationY(rect.y - aspectRatioFrameLayout.getY());
if (firstFrameView != null) {
firstFrameView.setScaleX(scale);
firstFrameView.setScaleY(scale);
firstFrameView.setTranslationX(videoTextureView.getTranslationX());
firstFrameView.setTranslationY(videoTextureView.getTranslationY());
}
} else {
pipVideoView.close();
pipVideoView = null;
@ -6795,6 +6826,9 @@ public class PhotoViewer implements NotificationCenter.NotificationCenterDelegat
Arrays.fill(videoPlayerTotalTime, 0);
if (videoPlayer != null) {
long current = Math.max(0, videoPlayer.getCurrentPosition());
if (shownControlsByEnd && !actionBarWasShownBeforeByEnd) {
current = 0;
}
long total = Math.max(0, videoPlayer.getDuration());
if (!inPreview && videoTimelineView.getVisibility() == View.VISIBLE) {
total *= (videoTimelineView.getRightProgress() - videoTimelineView.getLeftProgress());
@ -7173,6 +7207,7 @@ public class PhotoViewer implements NotificationCenter.NotificationCenterDelegat
if (videoTextureView != null) {
videoPlayer.setTextureView(videoTextureView);
}
firstFrameSet = false;
videoPlayer.setDelegate(new VideoPlayer.VideoPlayerDelegate() {
@Override
public void onStateChanged(boolean playWhenReady, int playbackState) {
@ -7228,6 +7263,11 @@ public class PhotoViewer implements NotificationCenter.NotificationCenterDelegat
textureUploaded = true;
containerView.invalidate();
}
if (videoTextureView != null && !firstFrameSet && videoPlayer.getCurrentPosition() <= 60) {
firstFrameView.setImageBitmap(videoTextureView.getBitmap());
firstFrameSet = true;
}
}
@Override
@ -7273,19 +7313,28 @@ public class PhotoViewer implements NotificationCenter.NotificationCenterDelegat
pipPosition[1] -= containerView.getTranslationY();
textureImageView.setTranslationX(textureImageView.getTranslationX() + getLeftInset());
videoTextureView.setTranslationX(videoTextureView.getTranslationX() + getLeftInset() - aspectRatioFrameLayout.getX());
if (firstFrameView != null) {
firstFrameView.setTranslationX(videoTextureView.getTranslationX());
}
AnimatorSet animatorSet = new AnimatorSet();
animatorSet.playTogether(
ObjectAnimator.ofFloat(textureImageView, View.SCALE_X, 1.0f),
ObjectAnimator.ofFloat(textureImageView, View.SCALE_Y, 1.0f),
ObjectAnimator.ofFloat(textureImageView, View.TRANSLATION_X, pipPosition[0]),
ObjectAnimator.ofFloat(textureImageView, View.TRANSLATION_Y, pipPosition[1]),
ObjectAnimator.ofFloat(videoTextureView, View.SCALE_X, 1.0f),
ObjectAnimator.ofFloat(videoTextureView, View.SCALE_Y, 1.0f),
ObjectAnimator.ofFloat(videoTextureView, View.TRANSLATION_X, pipPosition[0] - aspectRatioFrameLayout.getX()),
ObjectAnimator.ofFloat(videoTextureView, View.TRANSLATION_Y, pipPosition[1] - aspectRatioFrameLayout.getY()),
ObjectAnimator.ofInt(backgroundDrawable, AnimationProperties.COLOR_DRAWABLE_ALPHA, 255)
);
ArrayList<Animator> animators = new ArrayList<>();
animators.add(ObjectAnimator.ofFloat(textureImageView, View.SCALE_X, 1.0f));
animators.add(ObjectAnimator.ofFloat(textureImageView, View.SCALE_Y, 1.0f));
animators.add(ObjectAnimator.ofFloat(textureImageView, View.TRANSLATION_X, pipPosition[0]));
animators.add(ObjectAnimator.ofFloat(textureImageView, View.TRANSLATION_Y, pipPosition[1]));
animators.add(ObjectAnimator.ofFloat(videoTextureView, View.SCALE_X, 1.0f));
animators.add(ObjectAnimator.ofFloat(videoTextureView, View.SCALE_Y, 1.0f));
animators.add(ObjectAnimator.ofFloat(videoTextureView, View.TRANSLATION_X, pipPosition[0] - aspectRatioFrameLayout.getX()));
animators.add(ObjectAnimator.ofFloat(videoTextureView, View.TRANSLATION_Y, pipPosition[1] - aspectRatioFrameLayout.getY()));
animators.add(ObjectAnimator.ofInt(backgroundDrawable, AnimationProperties.COLOR_DRAWABLE_ALPHA, 255));
if (firstFrameView != null) {
animators.add(ObjectAnimator.ofFloat(firstFrameView, View.SCALE_X, 1.0f));
animators.add(ObjectAnimator.ofFloat(firstFrameView, View.SCALE_Y, 1.0f));
animators.add(ObjectAnimator.ofFloat(firstFrameView, View.TRANSLATION_X, pipPosition[0] - aspectRatioFrameLayout.getX()));
animators.add(ObjectAnimator.ofFloat(firstFrameView, View.TRANSLATION_Y, pipPosition[1] - aspectRatioFrameLayout.getY()));
}
animatorSet.playTogether(animators);
final DecelerateInterpolator interpolator = new DecelerateInterpolator();
animatorSet.setInterpolator(interpolator);
animatorSet.setDuration(250);
@ -7477,12 +7526,15 @@ public class PhotoViewer implements NotificationCenter.NotificationCenterDelegat
}
if (videoTextureView instanceof VideoEditTextureView) {
videoTextureView.setPivotX(videoTextureView.getMeasuredWidth() / 2);
firstFrameView.setPivotX(videoTextureView.getMeasuredWidth() / 2);
} else {
videoTextureView.setPivotX(0);
firstFrameView.setPivotX(0);
}
checkFullscreenButton();
}
};
aspectRatioFrameLayout.setWillNotDraw(false);
aspectRatioFrameLayout.setVisibility(View.INVISIBLE);
containerView.addView(aspectRatioFrameLayout, 0, LayoutHelper.createFrame(LayoutHelper.MATCH_PARENT, LayoutHelper.MATCH_PARENT, Gravity.CENTER));
@ -7506,6 +7558,12 @@ public class PhotoViewer implements NotificationCenter.NotificationCenterDelegat
videoTextureView.setOpaque(false);
aspectRatioFrameLayout.addView(videoTextureView, LayoutHelper.createFrame(LayoutHelper.MATCH_PARENT, LayoutHelper.MATCH_PARENT, Gravity.CENTER));
firstFrameView = new ImageView(parentActivity);
firstFrameView.setPivotX(0);
firstFrameView.setPivotY(0);
firstFrameView.setScaleType(ImageView.ScaleType.FIT_XY);
aspectRatioFrameLayout.addView(firstFrameView, LayoutHelper.createFrame(LayoutHelper.MATCH_PARENT, LayoutHelper.MATCH_PARENT, Gravity.CENTER));
if (sendPhotoType == SELECT_TYPE_AVATAR) {
flashView = new View(parentActivity);
flashView.setBackgroundColor(0xffffffff);
@ -7514,6 +7572,51 @@ public class PhotoViewer implements NotificationCenter.NotificationCenterDelegat
}
}
private final static float firstFrameFadeDuration = 200;
private boolean shownControlsByEnd = false;
private boolean actionBarWasShownBeforeByEnd = false;
private ViewPropertyAnimator firstFrameViewAnimator = null;
private void updateFirstFrameView() {
if (videoPlayer != null && firstFrameView != null) {
long toDuration = videoPlayer.getDuration() - videoPlayer.getCurrentPosition();
float alpha = 1f - Math.max(Math.min(toDuration / firstFrameFadeDuration, 1), 0);
if (!videoPlayer.isPlaying()) {
if (firstFrameViewAnimator != null) {
firstFrameViewAnimator.cancel();
firstFrameViewAnimator = null;
}
firstFrameView.clearAnimation();
firstFrameView.setAlpha(alpha);
} else {
if (toDuration <= firstFrameFadeDuration) {
if (firstFrameViewAnimator == null) {
firstFrameView.setAlpha(alpha);
firstFrameViewAnimator = firstFrameView.animate().alpha(1).withEndAction(() -> {
if (firstFrameViewAnimator != null) {
firstFrameViewAnimator.cancel();
firstFrameViewAnimator = null;
}
}).setDuration(Math.max(0, toDuration));
firstFrameViewAnimator.start();
}
} else {
firstFrameView.setAlpha(alpha);
}
}
if (!videoPlayer.isLooping()) {
if (!shownControlsByEnd && videoPlayer.getCurrentPosition() > videoPlayer.getDuration() - firstFrameFadeDuration) {
actionBarWasShownBeforeByEnd = isActionBarVisible;
shownControlsByEnd = true;
toggleActionBar(true, true);
checkProgress(0, false, false);
} else if (videoPlayer.getCurrentPosition() < videoPlayer.getDuration() - firstFrameFadeDuration) {
shownControlsByEnd = false;
actionBarWasShownBeforeByEnd = false;
}
}
}
}
private void releasePlayer(boolean onClose) {
if (videoPlayer != null) {
cancelVideoPlayRunnable();
@ -9638,6 +9741,7 @@ public class PhotoViewer implements NotificationCenter.NotificationCenterDelegat
containerView.setTag(1);
playerAutoStarted = false;
isCurrentVideo = false;
shownControlsByEnd = false;
imagesArr.clear();
imagesArrLocations.clear();
imagesArrLocationsSizes.clear();
@ -10081,6 +10185,7 @@ public class PhotoViewer implements NotificationCenter.NotificationCenterDelegat
nameTextView.setText("");
dateTextView.setText("");
} else {
allowShare = !noforwards;
if (newMessageObject.isNewGif() && allowShare) {
menuItem.showSubItem(gallery_menu_savegif);
}
@ -10541,11 +10646,12 @@ public class PhotoViewer implements NotificationCenter.NotificationCenterDelegat
if (switchingToIndex < 0 || switchingToIndex >= size) {
return;
}
allowShare = !MessagesController.getInstance(currentAccount).isChatNoForwards(-currentDialogId);
TLRPC.PageBlock pageBlock = pageBlocksAdapter.get(switchingToIndex);
caption = pageBlocksAdapter.getCaption(switchingToIndex);
isVideo = pageBlocksAdapter.isVideo(switchingToIndex);
if (isVideo) {
if (!MessagesController.getInstance(currentAccount).isChatNoForwards(-currentDialogId)) {
if (allowShare) {
menuItem.showSubItem(gallery_menu_openin);
} else {
menuItem.hideSubItem(gallery_menu_openin);
@ -10567,7 +10673,6 @@ public class PhotoViewer implements NotificationCenter.NotificationCenterDelegat
}
bottomLayout.setTag(null);
allowShare = !MessagesController.getInstance(currentAccount).isChatNoForwards(-currentDialogId);
shareItem.setVisibility(allowShare ? View.VISIBLE : View.GONE);
if (currentAnimation != null) {
@ -11306,6 +11411,10 @@ public class PhotoViewer implements NotificationCenter.NotificationCenterDelegat
}
boolean existsFinal = exists;
AndroidUtilities.runOnUIThread(() -> {
if (shownControlsByEnd && !actionBarWasShownBeforeByEnd && isPlaying) {
photoProgressViews[a].setBackgroundState(PROGRESS_PLAY, false, false);
return;
}
if ((f1Final != null || f2Final != null) && (existsFinal || canStreamFinal)) {
if (a != 0 || !isPlaying) {
if (isVideoFinal && (!canAutoPlayFinal || a == 0 && playerWasPlaying)) {
@ -13016,6 +13125,7 @@ public class PhotoViewer implements NotificationCenter.NotificationCenterDelegat
selectedPhotosAdapter.notifyDataSetChanged();
pageBlocksAdapter = null;
disableShowCheck = false;
shownControlsByEnd = false;
videoCutStart = 0;
videoCutEnd = 1f;
if (object != null) {
@ -13975,6 +14085,9 @@ public class PhotoViewer implements NotificationCenter.NotificationCenterDelegat
if (currentEditMode == 1 || sendPhotoType == SELECT_TYPE_AVATAR) {
if (videoTextureView != null) {
videoTextureView.setScaleX(cropTransform.isMirrored() ? -1.0f : 1.0f);
if (firstFrameView != null) {
firstFrameView.setScaleX(videoTextureView.getScaleX());
}
}
float trueScale = 1.0f + (cropTransform.getTrueCropScale() - 1.0f) * (1.0f - cropAnimationValue);
cropScale = cropTransform.getScale() / trueScale;
@ -13993,6 +14106,9 @@ public class PhotoViewer implements NotificationCenter.NotificationCenterDelegat
} else {
if (videoTextureView != null) {
videoTextureView.setScaleX(editState.cropState != null && editState.cropState.mirrored ? -1.0f : 1.0f);
if (firstFrameView != null) {
firstFrameView.setScaleX(videoTextureView.getScaleX());
}
}
cropScale = editState.cropState != null ? editState.cropState.cropScale : 1.0f;
float trueScale = 1.0f + (cropScale - 1.0f) * (1.0f - cropAnimationValue);
@ -14015,6 +14131,10 @@ public class PhotoViewer implements NotificationCenter.NotificationCenterDelegat
if (videoTextureView != null) {
videoTextureView.setScaleX(1.0f);
videoTextureView.setScaleY(1.0f);
if (firstFrameView != null) {
firstFrameView.setScaleX(1);
firstFrameView.setScaleY(1);
}
}
}
}

View File

@ -140,6 +140,7 @@ import org.telegram.ui.Components.AnimatedFileDrawable;
import org.telegram.ui.Components.AnimationProperties;
import org.telegram.ui.Components.AudioPlayerAlert;
import org.telegram.ui.Components.AvatarDrawable;
import org.telegram.ui.Components.BackButtonMenu;
import org.telegram.ui.Components.BackupImageView;
import org.telegram.ui.Components.BulletinFactory;
import org.telegram.ui.Components.ChatAvatarContainer;
@ -1502,126 +1503,17 @@ public class ProfileActivity extends BaseFragment implements NotificationCenter.
actionBar.setOccupyStatusBar(Build.VERSION.SDK_INT >= 21 && !AndroidUtilities.isTablet() && !inBubbleMode);
ImageView backButton = actionBar.getBackButton();
backButton.setOnLongClickListener(e -> {
ArrayList<ChatActivity.PulledDialog> dialogs = ChatActivity.getStackedHistoryDialogs(currentAccount, getParentLayout().fragmentsStack, dialogId);
if (dialogs.size() <= 0) {
ActionBarPopupWindow menu = BackButtonMenu.show(this, backButton, getDialogId());
if (menu != null) {
menu.setOnDismissListener(() -> dimBehindView(false));
dimBehindView(backButton, 0.3f);
if (undoView != null) {
undoView.hide(true, 1);
}
return true;
} else {
return false;
}
ActionBarPopupWindow.ActionBarPopupWindowLayout layout = new ActionBarPopupWindow.ActionBarPopupWindowLayout(context);
Rect backgroundPaddings = new Rect();
Drawable shadowDrawable = getParentActivity().getResources().getDrawable(R.drawable.popup_fixed_alert).mutate();
shadowDrawable.getPadding(backgroundPaddings);
layout.setBackgroundColor(getThemedColor(Theme.key_actionBarDefaultSubmenuBackground));
for (int i = 0; i < dialogs.size(); ++i) {
final ChatActivity.PulledDialog pDialog = dialogs.get(i);
final TLRPC.Chat chat = pDialog.chat;
final TLRPC.User user = pDialog.user;
FrameLayout cell = new FrameLayout(context);
cell.setMinimumWidth(AndroidUtilities.dp(200));
BackupImageView imageView = new BackupImageView(context);
imageView.setRoundRadius(AndroidUtilities.dp(32));
cell.addView(imageView, LayoutHelper.createFrameRelatively(32, 32, Gravity.START | Gravity.CENTER_VERTICAL, 13, 0, 0, 0));
TextView titleView = new TextView(context);
titleView.setLines(1);
titleView.setTextSize(TypedValue.COMPLEX_UNIT_DIP, 16);
titleView.setTextColor(Theme.getColor(Theme.key_actionBarDefaultSubmenuItem));
titleView.setEllipsize(TextUtils.TruncateAt.END);
cell.addView(titleView, LayoutHelper.createFrameRelatively(LayoutHelper.MATCH_PARENT, LayoutHelper.WRAP_CONTENT, Gravity.START | Gravity.CENTER_VERTICAL, 59, 0, 12, 0));
AvatarDrawable avatarDrawable = new AvatarDrawable();
if (chat != null) {
avatarDrawable.setInfo(chat);
imageView.setImage(ImageLocation.getForChat(chat, ImageLocation.TYPE_SMALL), "50_50", avatarDrawable, chat);
titleView.setText(chat.title);
} else if (user != null) {
avatarDrawable.setInfo(user);
imageView.setImage(ImageLocation.getForUser(user, ImageLocation.TYPE_SMALL), "50_50", avatarDrawable, user);
titleView.setText(UserObject.getUserName(user));
}
boolean isFirst = i == 0, isLast = i == dialogs.size() - 1;
cell.setBackground(Theme.getSelectorDrawable(Theme.getColor(Theme.key_listSelector), false));
cell.setOnClickListener(e2 -> {
if (scrimPopupWindow != null) {
scrimPopupWindow.dismiss();
}
if (pDialog.stackIndex >= 0) {
final ActionBarLayout parentLayout = getParentLayout();
BaseFragment fragment;
if (parentLayout == null || parentLayout.fragmentsStack == null || pDialog.stackIndex >= parentLayout.fragmentsStack.size()) {
fragment = null;
} else {
fragment = parentLayout.fragmentsStack.get(pDialog.stackIndex);
}
if (fragment instanceof ChatActivity && ((ChatActivity) fragment).getDialogId() != pDialog.dialogId) {
for (int j = parentLayout.fragmentsStack.size() - 2; j > pDialog.stackIndex; --j) {
parentLayout.removeFragmentFromStack(j);
}
} else {
if (parentLayout != null && parentLayout.fragmentsStack != null) {
for (int j = parentLayout.fragmentsStack.size() - 2; j > pDialog.stackIndex; --j) {
if (j >= 0 && j < parentLayout.fragmentsStack.size()) {
parentLayout.removeFragmentFromStack(j);
}
}
if (pDialog.stackIndex < parentLayout.fragmentsStack.size()) {
parentLayout.showFragment(pDialog.stackIndex);
parentLayout.closeLastFragment(true);
return;
}
}
}
}
ChatActivity.goTo(this, chat != null ? chat : user, pDialog.dialogId, pDialog.folderId, pDialog.filterId);
});
// layout.addView(cell, LayoutHelper.createLinear(LayoutHelper.MATCH_PARENT, 44 + (isFirst ? 4 : 0) + (isLast ? 4 : 0)));
layout.addView(cell, LayoutHelper.createLinear(LayoutHelper.MATCH_PARENT, 44, 0, isFirst ? 4 : 0, 0, isLast ? 4 : 0));
}
scrimPopupWindow = new ActionBarPopupWindow(layout, LayoutHelper.WRAP_CONTENT, LayoutHelper.WRAP_CONTENT) {
@Override
public void dismiss() {
super.dismiss();
if (scrimPopupWindow != this) {
return;
}
scrimPopupWindow = null;
dimBehindView(false);
}
};
scrimPopupWindow.setPauseNotifications(true);
scrimPopupWindow.setDismissAnimationDuration(220);
scrimPopupWindow.setOutsideTouchable(true);
scrimPopupWindow.setClippingEnabled(true);
scrimPopupWindow.setAnimationStyle(R.style.PopupContextAnimation);
scrimPopupWindow.setFocusable(true);
layout.measure(View.MeasureSpec.makeMeasureSpec(AndroidUtilities.dp(1000), View.MeasureSpec.AT_MOST), View.MeasureSpec.makeMeasureSpec(AndroidUtilities.dp(1000), View.MeasureSpec.AT_MOST));
scrimPopupWindow.setInputMethodMode(ActionBarPopupWindow.INPUT_METHOD_NOT_NEEDED);
scrimPopupWindow.setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_UNSPECIFIED);
scrimPopupWindow.getContentView().setFocusableInTouchMode(true);
layout.setFitItems(true);
int popupX = AndroidUtilities.dp(8) - backgroundPaddings.left;
if (AndroidUtilities.isTablet()) {
int[] location = new int[2];
fragmentView.getLocationInWindow(location);
popupX += location[0];
}
int popupY = (int) (backButton.getBottom() - backgroundPaddings.top - AndroidUtilities.dp(8));
final int finalPopupX = popupX;
final int finalPopupY = popupY;
scrimPopupWindow.showAtLocation(fragmentView, Gravity.LEFT | Gravity.TOP, finalPopupX, finalPopupY);
try {
actionBar.performHapticFeedback(HapticFeedbackConstants.KEYBOARD_TAP, HapticFeedbackConstants.FLAG_IGNORE_GLOBAL_SETTING);
} catch (Exception ignore) {}
dimBehindView(backButton, 0.3f);
if (undoView != null) {
undoView.hide(true, 1);
}
return true;
});
return actionBar;
}
@ -3580,6 +3472,9 @@ public class ProfileActivity extends BaseFragment implements NotificationCenter.
public TLRPC.Chat getCurrentChat() {
return currentChat;
}
public TLRPC.UserFull getUserInfo() {
return userInfo;
}
@Override
public boolean isFragmentOpened() {

View File

@ -0,0 +1,53 @@
package org.telegram.ui;
import android.app.Activity;
import android.view.Gravity;
import android.view.View;
import android.view.WindowManager;
import android.widget.FrameLayout;
import org.telegram.messenger.AndroidUtilities;
import org.telegram.messenger.LocaleController;
import org.telegram.messenger.R;
import org.telegram.ui.ActionBar.ActionBarMenuSubItem;
import org.telegram.ui.ActionBar.ActionBarPopupWindow;
import org.telegram.ui.ActionBar.Theme;
import org.telegram.ui.Components.LayoutHelper;
public class ReadAllMentionsMenu {
public final static int TYPE_REACTIONS = 0;
public final static int TYPE_MENTIONS = 1;
public static ActionBarPopupWindow show(int type, Activity activity, FrameLayout contentView, View mentionButton, Theme.ResourcesProvider resourcesProvider, Runnable onRead) {
ActionBarPopupWindow.ActionBarPopupWindowLayout popupWindowLayout = new ActionBarPopupWindow.ActionBarPopupWindowLayout(activity);
popupWindowLayout.setMinimumWidth(AndroidUtilities.dp(200));
ActionBarMenuSubItem cell = new ActionBarMenuSubItem(activity, true,true, resourcesProvider);
cell.setMinimumWidth(AndroidUtilities.dp(200));
cell.setTextAndIcon(type == TYPE_REACTIONS ? LocaleController.getString("ReadAllReactions", R.string.ReadAllReactions) : LocaleController.getString("ReadAllMentions", R.string.ReadAllMentions) , R.drawable.msg_seen);
cell.setOnClickListener(view -> {
if (onRead != null) {
onRead.run();
}
});
popupWindowLayout.addView(cell);
ActionBarPopupWindow scrimPopupWindow = new ActionBarPopupWindow(popupWindowLayout, LayoutHelper.WRAP_CONTENT, LayoutHelper.WRAP_CONTENT);
scrimPopupWindow.setPauseNotifications(true);
scrimPopupWindow.setDismissAnimationDuration(220);
scrimPopupWindow.setOutsideTouchable(true);
scrimPopupWindow.setClippingEnabled(true);
scrimPopupWindow.setAnimationStyle(R.style.PopupContextAnimation);
scrimPopupWindow.setFocusable(true);
popupWindowLayout.measure(View.MeasureSpec.makeMeasureSpec(AndroidUtilities.dp(1000), View.MeasureSpec.AT_MOST), View.MeasureSpec.makeMeasureSpec(AndroidUtilities.dp(1000), View.MeasureSpec.AT_MOST));
scrimPopupWindow.setInputMethodMode(ActionBarPopupWindow.INPUT_METHOD_NOT_NEEDED);
scrimPopupWindow.setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_UNSPECIFIED);
scrimPopupWindow.getContentView().setFocusableInTouchMode(true);
float x = mentionButton.getX() + mentionButton.getWidth() - popupWindowLayout.getMeasuredWidth() + AndroidUtilities.dp(8);
float y = mentionButton.getY() - popupWindowLayout.getMeasuredHeight();
scrimPopupWindow.showAtLocation(contentView, Gravity.LEFT | Gravity.TOP, (int) x, (int) y);
return scrimPopupWindow;
}
}

View File

@ -35,14 +35,6 @@ import android.graphics.drawable.ColorDrawable;
import android.graphics.drawable.Drawable;
import android.graphics.drawable.GradientDrawable;
import android.os.Build;
import androidx.collection.LongSparseArray;
import androidx.recyclerview.widget.DefaultItemAnimator;
import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.recyclerview.widget.RecyclerView;
import androidx.viewpager.widget.PagerAdapter;
import androidx.viewpager.widget.ViewPager;
import android.os.SystemClock;
import android.text.TextPaint;
import android.text.TextUtils;
@ -59,7 +51,12 @@ import android.widget.FrameLayout;
import android.widget.ImageView;
import android.widget.TextView;
import com.google.android.exoplayer2.util.Log;
import androidx.collection.LongSparseArray;
import androidx.recyclerview.widget.DefaultItemAnimator;
import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.recyclerview.widget.RecyclerView;
import androidx.viewpager.widget.PagerAdapter;
import androidx.viewpager.widget.ViewPager;
import org.telegram.messenger.AndroidUtilities;
import org.telegram.messenger.ApplicationLoader;
@ -326,21 +323,23 @@ public class ThemePreviewActivity extends BaseFragment implements DownloadContro
if (screenType == SCREEN_TYPE_ACCENT_COLOR) {
accent = applyingTheme.getAccent(!edit);
useDefaultThemeForButtons = false;
backupAccentColor = accent.accentColor;
backupAccentColor2 = accent.accentColor2;
backupMyMessagesAccentColor = accent.myMessagesAccentColor;
backupMyMessagesGradientAccentColor1 = accent.myMessagesGradientAccentColor1;
backupMyMessagesGradientAccentColor2 = accent.myMessagesGradientAccentColor2;
backupMyMessagesGradientAccentColor3 = accent.myMessagesGradientAccentColor3;
backupMyMessagesAnimated = accent.myMessagesAnimated;
backupBackgroundOverrideColor = accent.backgroundOverrideColor;
backupBackgroundGradientOverrideColor1 = accent.backgroundGradientOverrideColor1;
backupBackgroundGradientOverrideColor2 = accent.backgroundGradientOverrideColor2;
backupBackgroundGradientOverrideColor3 = accent.backgroundGradientOverrideColor3;
backupIntensity = accent.patternIntensity;
backupSlug = accent.patternSlug;
backupBackgroundRotation = accent.backgroundRotation;
if (accent != null) {
useDefaultThemeForButtons = false;
backupAccentColor = accent.accentColor;
backupAccentColor2 = accent.accentColor2;
backupMyMessagesAccentColor = accent.myMessagesAccentColor;
backupMyMessagesGradientAccentColor1 = accent.myMessagesGradientAccentColor1;
backupMyMessagesGradientAccentColor2 = accent.myMessagesGradientAccentColor2;
backupMyMessagesGradientAccentColor3 = accent.myMessagesGradientAccentColor3;
backupMyMessagesAnimated = accent.myMessagesAnimated;
backupBackgroundOverrideColor = accent.backgroundOverrideColor;
backupBackgroundGradientOverrideColor1 = accent.backgroundGradientOverrideColor1;
backupBackgroundGradientOverrideColor2 = accent.backgroundGradientOverrideColor2;
backupBackgroundGradientOverrideColor3 = accent.backgroundGradientOverrideColor3;
backupIntensity = accent.patternIntensity;
backupSlug = accent.patternSlug;
backupBackgroundRotation = accent.backgroundRotation;
}
} else {
if (screenType == SCREEN_TYPE_PREVIEW) {
useDefaultThemeForButtons = false;

View File

@ -1,5 +1,7 @@
package org.telegram.ui;
import static org.telegram.ui.GroupCallActivity.TRANSITION_DURATION;
import android.Manifest;
import android.animation.Animator;
import android.animation.AnimatorListenerAdapter;
@ -66,6 +68,7 @@ import org.telegram.messenger.voip.Instance;
import org.telegram.messenger.voip.VideoCapturerDevice;
import org.telegram.messenger.voip.VoIPService;
import org.telegram.tgnet.TLRPC;
import org.telegram.ui.ActionBar.ActionBar;
import org.telegram.ui.ActionBar.AlertDialog;
import org.telegram.ui.ActionBar.DarkAlertDialog;
import org.telegram.ui.ActionBar.Theme;
@ -128,6 +131,7 @@ public class VoIPFragment implements VoIPService.StateListener, NotificationCent
LinearLayout statusLayout;
private VoIPFloatingLayout currentUserCameraFloatingLayout;
private VoIPFloatingLayout callingUserMiniFloatingLayout;
private boolean currentUserCameraIsFullscreen;
private TextureViewRenderer callingUserMiniTextureRenderer;
private VoIPTextureView callingUserTextureView;
@ -210,6 +214,25 @@ public class VoIPFragment implements VoIPService.StateListener, NotificationCent
private boolean screenWasWakeup;
private boolean isVideoCall;
/* === pinch to zoom === */
private float pinchStartCenterX;
private float pinchStartCenterY;
private float pinchStartDistance;
private float pinchTranslationX;
private float pinchTranslationY;
private boolean isInPinchToZoomTouchMode;
private float pinchCenterX;
private float pinchCenterY;
private int pointerId1, pointerId2;
float pinchScale = 1f;
private boolean zoomStarted;
private boolean canZoomGesture;
ValueAnimator zoomBackAnimator;
/* === pinch to zoom === */
public static void show(Activity activity, int account) {
show(activity, false, account);
}
@ -316,6 +339,7 @@ public class VoIPFragment implements VoIPService.StateListener, NotificationCent
if (callingUserIsVideo && currentUserIsVideo && cameraForceExpanded) {
cameraForceExpanded = false;
currentUserCameraFloatingLayout.setRelativePosition(callingUserMiniFloatingLayout);
currentUserCameraIsFullscreen = false;
previousState = currentState;
updateViewState();
return;
@ -507,11 +531,93 @@ public class VoIPFragment implements VoIPService.StateListener, NotificationCent
long pressedTime;
@Override
public boolean onTouchEvent(MotionEvent event) {
switch (event.getAction()) {
public boolean onTouchEvent(MotionEvent ev) {
/* === pinch to zoom === */
if (!canZoomGesture && !isInPinchToZoomTouchMode && !zoomStarted && ev.getActionMasked() != MotionEvent.ACTION_DOWN) {
finishZoom();
return false;
}
if (ev.getActionMasked() == MotionEvent.ACTION_DOWN) {
canZoomGesture = false;
isInPinchToZoomTouchMode = false;
zoomStarted = false;
}
VoIPTextureView currentTextureView = getFullscreenTextureView();
if (ev.getActionMasked() == MotionEvent.ACTION_DOWN || ev.getActionMasked() == MotionEvent.ACTION_POINTER_DOWN) {
if (ev.getActionMasked() == MotionEvent.ACTION_DOWN) {
AndroidUtilities.rectTmp.set(currentTextureView.getX(), currentTextureView.getY(), currentTextureView.getX() + currentTextureView.getMeasuredWidth(), currentTextureView.getY() + currentTextureView.getMeasuredHeight());
AndroidUtilities.rectTmp.inset((currentTextureView.getMeasuredHeight() * currentTextureView.scaleTextureToFill - currentTextureView.getMeasuredHeight()) / 2, (currentTextureView.getMeasuredWidth() * currentTextureView.scaleTextureToFill - currentTextureView.getMeasuredWidth()) / 2);
if (!GroupCallActivity.isLandscapeMode) {
AndroidUtilities.rectTmp.top = Math.max(AndroidUtilities.rectTmp.top, ActionBar.getCurrentActionBarHeight());
AndroidUtilities.rectTmp.bottom = Math.min(AndroidUtilities.rectTmp.bottom, currentTextureView.getMeasuredHeight() - AndroidUtilities.dp(90));
} else {
AndroidUtilities.rectTmp.top = Math.max(AndroidUtilities.rectTmp.top, ActionBar.getCurrentActionBarHeight());
AndroidUtilities.rectTmp.right = Math.min(AndroidUtilities.rectTmp.right, currentTextureView.getMeasuredWidth() - AndroidUtilities.dp(90));
}
canZoomGesture = AndroidUtilities.rectTmp.contains(ev.getX(), ev.getY());
if (!canZoomGesture) {
finishZoom();
// return maybeSwipeToBackGesture;
}
}
if (!isInPinchToZoomTouchMode && ev.getPointerCount() == 2) {
pinchStartDistance = (float) Math.hypot(ev.getX(1) - ev.getX(0), ev.getY(1) - ev.getY(0));
pinchStartCenterX = pinchCenterX = (ev.getX(0) + ev.getX(1)) / 2.0f;
pinchStartCenterY = pinchCenterY = (ev.getY(0) + ev.getY(1)) / 2.0f;
pinchScale = 1f;
pointerId1 = ev.getPointerId(0);
pointerId2 = ev.getPointerId(1);
isInPinchToZoomTouchMode = true;
}
} else if (ev.getActionMasked() == MotionEvent.ACTION_MOVE && isInPinchToZoomTouchMode) {
int index1 = -1;
int index2 = -1;
for (int i = 0; i < ev.getPointerCount(); i++) {
if (pointerId1 == ev.getPointerId(i)) {
index1 = i;
}
if (pointerId2 == ev.getPointerId(i)) {
index2 = i;
}
}
if (index1 == -1 || index2 == -1) {
getParent().requestDisallowInterceptTouchEvent(false);
finishZoom();
// return maybeSwipeToBackGesture;
}
pinchScale = (float) Math.hypot(ev.getX(index2) - ev.getX(index1), ev.getY(index2) - ev.getY(index1)) / pinchStartDistance;
if (pinchScale > 1.005f && !zoomStarted) {
pinchStartDistance = (float) Math.hypot(ev.getX(index2) - ev.getX(index1), ev.getY(index2) - ev.getY(index1));
pinchStartCenterX = pinchCenterX = (ev.getX(index1) + ev.getX(index2)) / 2.0f;
pinchStartCenterY = pinchCenterY = (ev.getY(index1) + ev.getY(index2)) / 2.0f;
pinchScale = 1f;
pinchTranslationX = 0f;
pinchTranslationY = 0f;
getParent().requestDisallowInterceptTouchEvent(true);
zoomStarted = true;//
isInPinchToZoomTouchMode = true;
}
float newPinchCenterX = (ev.getX(index1) + ev.getX(index2)) / 2.0f;
float newPinchCenterY = (ev.getY(index1) + ev.getY(index2)) / 2.0f;
float moveDx = pinchStartCenterX - newPinchCenterX;
float moveDy = pinchStartCenterY - newPinchCenterY;
pinchTranslationX = -moveDx / pinchScale;
pinchTranslationY = -moveDy / pinchScale;
invalidate();
} else if ((ev.getActionMasked() == MotionEvent.ACTION_UP || (ev.getActionMasked() == MotionEvent.ACTION_POINTER_UP && checkPointerIds(ev)) || ev.getActionMasked() == MotionEvent.ACTION_CANCEL)) {
getParent().requestDisallowInterceptTouchEvent(false);
finishZoom();
}
fragmentView.invalidate();
switch (ev.getAction()) {
case MotionEvent.ACTION_DOWN:
pressedX = event.getX();
pressedY = event.getY();
pressedX = ev.getX();
pressedY = ev.getY();
check = true;
pressedTime = System.currentTimeMillis();
break;
@ -520,8 +626,8 @@ public class VoIPFragment implements VoIPService.StateListener, NotificationCent
break;
case MotionEvent.ACTION_UP:
if (check) {
float dx = event.getX() - pressedX;
float dy = event.getY() - pressedY;
float dx = ev.getX() - pressedX;
float dy = ev.getY() - pressedY;
long currentTime = System.currentTimeMillis();
if (dx * dx + dy * dy < touchSlop * touchSlop && currentTime - pressedTime < 300 && currentTime - lastContentTapTime > 300) {
lastContentTapTime = System.currentTimeMillis();
@ -537,11 +643,34 @@ public class VoIPFragment implements VoIPService.StateListener, NotificationCent
}
break;
}
return check;
return canZoomGesture || check;
}
@Override
protected boolean drawChild(Canvas canvas, View child, long drawingTime) {
if (child == callingUserPhotoView && (currentUserIsVideo || callingUserIsVideo)) {
return false;
}
if (
child == callingUserPhotoView ||
child == callingUserTextureView ||
(child == currentUserCameraFloatingLayout && currentUserCameraIsFullscreen)
) {
if (zoomStarted || zoomBackAnimator != null) {
canvas.save();
canvas.scale(pinchScale, pinchScale, pinchCenterX, pinchCenterY);
canvas.translate(pinchTranslationX, pinchTranslationY);
boolean b = super.drawChild(canvas, child, drawingTime);
canvas.restore();
return b;
}
}
return super.drawChild(canvas, child, drawingTime);
}
};
frameLayout.setClipToPadding(false);
frameLayout.setClipChildren(false);
frameLayout.setBackgroundColor(0xff000000);
updateSystemBarColors();
fragmentView = frameLayout;
frameLayout.setFitsSystemWindows(true);
@ -558,6 +687,7 @@ public class VoIPFragment implements VoIPService.StateListener, NotificationCent
callingUserTextureView = new VoIPTextureView(context, false, true, false, false);
callingUserTextureView.renderer.setScalingType(RendererCommon.ScalingType.SCALE_ASPECT_FIT);
callingUserTextureView.renderer.setEnableHardwareScaler(true);
callingUserTextureView.renderer.setRotateTextureWithScreen(true);
callingUserTextureView.scaleType = VoIPTextureView.SCALE_TYPE_FIT;
// callingUserTextureView.attachBackgroundRenderer();
@ -588,6 +718,7 @@ public class VoIPFragment implements VoIPService.StateListener, NotificationCent
currentUserCameraFloatingLayout = new VoIPFloatingLayout(context);
currentUserCameraFloatingLayout.setDelegate((progress, value) -> currentUserTextureView.setScreenshareMiniProgress(progress, value));
currentUserCameraFloatingLayout.setRelativePosition(1f, 1f);
currentUserCameraIsFullscreen = true;
currentUserTextureView = new VoIPTextureView(context, true, false);
currentUserTextureView.renderer.setIsCamera(true);
currentUserTextureView.renderer.setUseCameraRotation(true);
@ -597,6 +728,7 @@ public class VoIPFragment implements VoIPService.StateListener, NotificationCent
hideUiRunnableWaiting = false;
lastContentTapTime = System.currentTimeMillis();
callingUserMiniFloatingLayout.setRelativePosition(currentUserCameraFloatingLayout);
currentUserCameraIsFullscreen = true;
cameraForceExpanded = true;
previousState = currentState;
updateViewState();
@ -624,6 +756,7 @@ public class VoIPFragment implements VoIPService.StateListener, NotificationCent
hideUiRunnableWaiting = false;
lastContentTapTime = System.currentTimeMillis();
currentUserCameraFloatingLayout.setRelativePosition(callingUserMiniFloatingLayout);
currentUserCameraIsFullscreen = false;
cameraForceExpanded = false;
previousState = currentState;
updateViewState();
@ -772,7 +905,7 @@ public class VoIPFragment implements VoIPService.StateListener, NotificationCent
}
@Override
public void onDicline() {
public void onDecline() {
if (currentState == VoIPService.STATE_BUSY) {
windowView.finish();
} else {
@ -855,6 +988,60 @@ public class VoIPFragment implements VoIPService.StateListener, NotificationCent
return frameLayout;
}
private boolean checkPointerIds(MotionEvent ev) {
if (ev.getPointerCount() < 2) {
return false;
}
if (pointerId1 == ev.getPointerId(0) && pointerId2 == ev.getPointerId(1)) {
return true;
}
if (pointerId1 == ev.getPointerId(1) && pointerId2 == ev.getPointerId(0)) {
return true;
}
return false;
}
private VoIPTextureView getFullscreenTextureView() {
if (callingUserIsVideo) {
return callingUserTextureView;
}
return currentUserTextureView;
}
private void finishZoom() {
if (zoomStarted) {
zoomStarted = false;
zoomBackAnimator = ValueAnimator.ofFloat(1f, 0);
float fromScale = pinchScale;
float fromTranslateX = pinchTranslationX;
float fromTranslateY = pinchTranslationY;
zoomBackAnimator.addUpdateListener(valueAnimator -> {
float v = (float) valueAnimator.getAnimatedValue();
pinchScale = fromScale * v + 1f * (1f - v);
pinchTranslationX = fromTranslateX * v;
pinchTranslationY = fromTranslateY * v;
fragmentView.invalidate();
});
zoomBackAnimator.addListener(new AnimatorListenerAdapter() {
@Override
public void onAnimationEnd(Animator animation) {
zoomBackAnimator = null;
pinchScale = 1f;
pinchTranslationX = 0;
pinchTranslationY = 0;
fragmentView.invalidate();
}
});
zoomBackAnimator.setDuration(TRANSITION_DURATION);
zoomBackAnimator.setInterpolator(CubicBezierInterpolator.DEFAULT);
zoomBackAnimator.start();
}
canZoomGesture = false;
isInPinchToZoomTouchMode = false;
}
private void initRenderers() {
currentUserTextureView.renderer.init(VideoCapturerDevice.getEglBase().getEglBaseContext(), new RendererCommon.RendererEvents() {
@Override
@ -1323,8 +1510,8 @@ public class VoIPFragment implements VoIPService.StateListener, NotificationCent
}
if (animated) {
currentUserCameraFloatingLayout.saveRelatedPosition();
callingUserMiniFloatingLayout.saveRelatedPosition();
currentUserCameraFloatingLayout.saveRelativePosition();
callingUserMiniFloatingLayout.saveRelativePosition();
}
if (callingUserIsVideo) {
@ -1620,9 +1807,9 @@ public class VoIPFragment implements VoIPService.StateListener, NotificationCent
currentUserCameraFloatingLayout.setVisibility(View.GONE);
}
} else {
boolean swtichToFloatAnimated = animated;
boolean switchToFloatAnimated = animated;
if (currentUserCameraFloatingLayout.getTag() == null || (int) currentUserCameraFloatingLayout.getTag() == STATE_GONE) {
swtichToFloatAnimated = false;
switchToFloatAnimated = false;
}
if (animated) {
if (currentUserCameraFloatingLayout.getTag() != null && (int) currentUserCameraFloatingLayout.getTag() == STATE_GONE) {
@ -1650,8 +1837,10 @@ public class VoIPFragment implements VoIPService.StateListener, NotificationCent
}
if ((currentUserCameraFloatingLayout.getTag() == null || (int) currentUserCameraFloatingLayout.getTag() != STATE_FLOATING) && currentUserCameraFloatingLayout.relativePositionToSetX < 0) {
currentUserCameraFloatingLayout.setRelativePosition(1f, 1f);
currentUserCameraIsFullscreen = true;
}
currentUserCameraFloatingLayout.setFloatingMode(state == STATE_FLOATING, swtichToFloatAnimated);
currentUserCameraFloatingLayout.setFloatingMode(state == STATE_FLOATING, switchToFloatAnimated);
currentUserCameraIsFullscreen = state != STATE_FLOATING;
}
currentUserCameraFloatingLayout.setTag(state);
}

Binary file not shown.

Before

Width:  |  Height:  |  Size: 500 B

After

Width:  |  Height:  |  Size: 680 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 314 B

After

Width:  |  Height:  |  Size: 566 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 424 B

After

Width:  |  Height:  |  Size: 821 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 176 B

After

Width:  |  Height:  |  Size: 402 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 344 B

After

Width:  |  Height:  |  Size: 1.2 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 341 B

After

Width:  |  Height:  |  Size: 680 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 341 B

After

Width:  |  Height:  |  Size: 461 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 235 B

After

Width:  |  Height:  |  Size: 431 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 314 B

After

Width:  |  Height:  |  Size: 593 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 136 B

After

Width:  |  Height:  |  Size: 348 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 242 B

After

Width:  |  Height:  |  Size: 807 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 237 B

After

Width:  |  Height:  |  Size: 461 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 794 B

After

Width:  |  Height:  |  Size: 805 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 389 B

After

Width:  |  Height:  |  Size: 721 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 553 B

After

Width:  |  Height:  |  Size: 1.0 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 191 B

After

Width:  |  Height:  |  Size: 484 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 419 B

After

Width:  |  Height:  |  Size: 1.7 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 433 B

After

Width:  |  Height:  |  Size: 805 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.1 KiB

After

Width:  |  Height:  |  Size: 1.2 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 553 B

After

Width:  |  Height:  |  Size: 1.1 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 778 B

After

Width:  |  Height:  |  Size: 1.6 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 224 B

After

Width:  |  Height:  |  Size: 603 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 581 B

After

Width:  |  Height:  |  Size: 2.6 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 588 B

After

Width:  |  Height:  |  Size: 1.2 KiB

View File

@ -0,0 +1 @@
{"v":"5.8.1","fr":60,"ip":0,"op":90,"w":512,"h":512,"nm":"gif","ddd":0,"assets":[],"layers":[{"ddd":0,"ind":1,"ty":4,"nm":"Gif","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[256,256,0],"ix":2,"l":2},"a":{"a":0,"k":[256,256,0],"ix":1,"l":2},"s":{"a":1,"k":[{"i":{"x":[0.4,0.4,0.4],"y":[1,1,1]},"o":{"x":[0.6,0.6,0.6],"y":[0,0,0]},"t":0,"s":[0,0,100]},{"i":{"x":[0.4,0.4,0.4],"y":[1,1,1]},"o":{"x":[0.6,0.6,0.6],"y":[0,0,0]},"t":15,"s":[120,120,100]},{"i":{"x":[0.4,0.4,0.4],"y":[1,1,1]},"o":{"x":[0.6,0.6,0.6],"y":[0,0,0]},"t":25,"s":[96,96,100]},{"t":35,"s":[100,100,100]}],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[357.564,262.852],[318.756,262.852]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ind":1,"ty":"sh","ix":2,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,-2.761],[0,0]],"o":[[0,0],[-2.761,0],[0,0],[0,0]],"v":[[376.934,206],[323.756,206],[318.756,211],[318.756,306]],"c":false},"ix":2},"nm":"Path 2","mn":"ADBE Vector Shape - Group","hd":false},{"ind":2,"ty":"sh","ix":3,"ks":{"a":0,"k":{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[265.097,206],[265.097,306]],"c":false},"ix":2},"nm":"Path 3","mn":"ADBE Vector Shape - Group","hd":false},{"ind":3,"ty":"sh","ix":4,"ks":{"a":0,"k":{"i":[[0,0],[10.112,0],[0,-27.614],[-27.614,0],[-7.761,4.955],[0,0],[3.368,0],[0,0]],"o":[[-7.867,-5.161],[-27.614,0],[0,27.614],[9.891,0],[0,0],[0,-3.368],[0,0],[0,0]],"v":[[212.39,214.163],[185,206],[135,256],[185,306],[211.871,298.173],[211.871,267.678],[205.774,261.581],[189.708,261.581]],"c":false},"ix":2},"nm":"Path 4","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"tm","s":{"a":1,"k":[{"i":{"x":[0],"y":[1]},"o":{"x":[0.167],"y":[0.167]},"t":10,"s":[100]},{"t":35,"s":[0]}],"ix":1},"e":{"a":0,"k":100,"ix":2},"o":{"a":0,"k":0,"ix":3},"m":1,"ix":5,"nm":"Trim Paths 1","mn":"ADBE Vector Filter - Trim","hd":false},{"ty":"st","c":{"a":0,"k":[0,0,0,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":24,"ix":5},"lc":2,"lj":2,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":6,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-28.529,0],[0,0],[-10.43,-5.578],[-5.578,-10.43],[0,-28.529],[0,0],[5.578,-10.43],[10.43,-5.578],[28.529,0],[0,0],[10.43,5.578],[5.578,10.43],[0,28.529],[0,0],[-5.578,10.43],[-10.43,5.578]],"o":[[0,0],[28.529,0],[10.43,5.578],[5.578,10.43],[0,0],[0,28.529],[-5.578,10.43],[-10.43,5.578],[0,0],[-28.529,0],[-10.43,-5.578],[-5.578,-10.43],[0,0],[0,-28.529],[5.578,-10.43],[10.43,-5.578]],"v":[[-98.956,-140],[99.956,-140],[149.259,-131.452],[173.452,-107.259],[182,-57.956],[182,57.956],[173.452,107.259],[149.259,131.452],[99.956,140],[-98.956,140],[-148.259,131.452],[-172.452,107.259],[-181,57.956],[-181,-57.956],[-172.452,-107.259],[-148.259,-131.452]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[256,256],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 5","np":2,"cix":2,"bm":0,"ix":2,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":90,"st":0,"bm":0}],"markers":[]}

View File

@ -2825,6 +2825,7 @@
<string name="VideoSavedHint">Video saved to gallery</string>
<string name="PhotoSavedToDownloadsHint">Photo saved to downloads</string>
<string name="VideoSavedToDownloadsHint">Video saved to downloads</string>
<string name="GifSavedHint">Added to saved GIFs</string>
<string name="GifSavedToDownloadsHint">GIF saved to downloads</string>
<string name="AudioSavedHint">File saved to music</string>
<string name="FileSavedHint">File saved to downloads</string>
@ -4979,4 +4980,6 @@
<string name="PushChatReactInvoice">%1$s: %3$s to your invoice in %2$s</string>
<string name="PushChatReactGif">%1$s: %3$s to your GIF in %2$s</string>
<string name="BlurInChat">Blur in chat</string>
<string name="ReadAllReactions">Read all reactions</string>
<string name="ReadAllMentions">Read all mentions</string>
</resources>