Update to 7.5.0 (2245)

This commit is contained in:
DrKLO 2021-02-24 08:02:54 +07:00
parent 31b580133f
commit c44841a55b
31 changed files with 197 additions and 55 deletions

View file

@ -288,7 +288,7 @@ android {
} }
} }
defaultConfig.versionCode = 2244 defaultConfig.versionCode = 2245
applicationVariants.all { variant -> applicationVariants.all { variant ->
variant.outputs.all { output -> variant.outputs.all { output ->

View file

@ -395,7 +395,7 @@ target_compile_definitions(sqlite PUBLIC
#voip #voip
include(${CMAKE_HOME_DIRECTORY}/voip/CMakeLists.txt) include(${CMAKE_HOME_DIRECTORY}/voip/CMakeLists.txt)
set(NATIVE_LIB "tmessages.35") set(NATIVE_LIB "tmessages.36")
#tmessages #tmessages
add_library(${NATIVE_LIB} SHARED add_library(${NATIVE_LIB} SHARED

View file

@ -210,8 +210,8 @@ void updateDcSettings(JNIEnv *env, jclass c, jint instanceNum) {
ConnectionsManager::getInstance(instanceNum).updateDcSettings(0, false); ConnectionsManager::getInstance(instanceNum).updateDcSettings(0, false);
} }
void setUseIpv6(JNIEnv *env, jclass c, jint instanceNum, jboolean value) { void setIpStrategy(JNIEnv *env, jclass c, jint instanceNum, jbyte value) {
ConnectionsManager::getInstance(instanceNum).setUseIpv6(value); ConnectionsManager::getInstance(instanceNum).setIpStrategy((uint8_t) value);
} }
void setNetworkAvailable(JNIEnv *env, jclass c, jint instanceNum, jboolean value, jint networkType, jboolean slow) { void setNetworkAvailable(JNIEnv *env, jclass c, jint instanceNum, jboolean value, jint networkType, jboolean slow) {
@ -448,7 +448,7 @@ static JNINativeMethod ConnectionsManagerMethods[] = {
{"native_pauseNetwork", "(I)V", (void *) pauseNetwork}, {"native_pauseNetwork", "(I)V", (void *) pauseNetwork},
{"native_resumeNetwork", "(IZ)V", (void *) resumeNetwork}, {"native_resumeNetwork", "(IZ)V", (void *) resumeNetwork},
{"native_updateDcSettings", "(I)V", (void *) updateDcSettings}, {"native_updateDcSettings", "(I)V", (void *) updateDcSettings},
{"native_setUseIpv6", "(IZ)V", (void *) setUseIpv6}, {"native_setIpStrategy", "(IB)V", (void *) setIpStrategy},
{"native_setNetworkAvailable", "(IZIZ)V", (void *) setNetworkAvailable}, {"native_setNetworkAvailable", "(IZIZ)V", (void *) setNetworkAvailable},
{"native_setPushConnectionEnabled", "(IZ)V", (void *) setPushConnectionEnabled}, {"native_setPushConnectionEnabled", "(IZ)V", (void *) setPushConnectionEnabled},
{"native_setJava", "(Z)V", (void *) setJava}, {"native_setJava", "(Z)V", (void *) setJava},

View file

@ -292,7 +292,17 @@ void Connection::connect() {
connectionInProcess = true; connectionInProcess = true;
connectionState = TcpConnectionStageConnecting; connectionState = TcpConnectionStageConnecting;
isMediaConnection = false; isMediaConnection = false;
uint32_t ipv6 = ConnectionsManager::getInstance(currentDatacenter->instanceNum).isIpv6Enabled() ? TcpAddressFlagIpv6 : 0; uint8_t strategy = ConnectionsManager::getInstance(currentDatacenter->instanceNum).getIpStratagy();
uint32_t ipv6;
if (strategy == USE_IPV6_ONLY) {
ipv6 = TcpAddressFlagIpv6;
} else if (strategy == USE_IPV4_IPV6_RANDOM) {
uint8_t value;
RAND_bytes(&value, 1);
ipv6 = value % 2 == 0 ? TcpAddressFlagIpv6 : 0;
} else {
ipv6 = 0;
}
uint32_t isStatic = connectionType == ConnectionTypeProxy || !ConnectionsManager::getInstance(currentDatacenter->instanceNum).proxyAddress.empty() ? TcpAddressFlagStatic : 0; uint32_t isStatic = connectionType == ConnectionTypeProxy || !ConnectionsManager::getInstance(currentDatacenter->instanceNum).proxyAddress.empty() ? TcpAddressFlagStatic : 0;
TcpAddress *tcpAddress = nullptr; TcpAddress *tcpAddress = nullptr;
if (isMediaConnectionType(connectionType)) { if (isMediaConnectionType(connectionType)) {

View file

@ -1660,8 +1660,8 @@ void ConnectionsManager::sendPing(Datacenter *datacenter, bool usePushConnection
connection->sendData(transportData, false, true); connection->sendData(transportData, false, true);
} }
bool ConnectionsManager::isIpv6Enabled() { uint8_t ConnectionsManager::getIpStratagy() {
return ipv6Enabled; return ipStrategy;
} }
void ConnectionsManager::initDatacenters() { void ConnectionsManager::initDatacenters() {
@ -3419,9 +3419,9 @@ void ConnectionsManager::setNetworkAvailable(bool value, int32_t type, bool slow
}); });
} }
void ConnectionsManager::setUseIpv6(bool value) { void ConnectionsManager::setIpStrategy(uint8_t value) {
scheduleTask([&, value] { scheduleTask([&, value] {
ipv6Enabled = value; ipStrategy = value;
}); });
} }

View file

@ -62,7 +62,7 @@ public:
void resumeNetwork(bool partial); void resumeNetwork(bool partial);
void pauseNetwork(); void pauseNetwork();
void setNetworkAvailable(bool value, int32_t type, bool slow); void setNetworkAvailable(bool value, int32_t type, bool slow);
void setUseIpv6(bool value); void setIpStrategy(uint8_t value);
void init(uint32_t version, int32_t layer, int32_t apiId, std::string deviceModel, std::string systemVersion, std::string appVersion, std::string langCode, std::string systemLangCode, std::string configPath, std::string logPath, std::string regId, std::string cFingerprint, std::string installerId, int32_t timezoneOffset, int32_t userId, bool isPaused, bool enablePushConnection, bool hasNetwork, int32_t networkType); void init(uint32_t version, int32_t layer, int32_t apiId, std::string deviceModel, std::string systemVersion, std::string appVersion, std::string langCode, std::string systemLangCode, std::string configPath, std::string logPath, std::string regId, std::string cFingerprint, std::string installerId, int32_t timezoneOffset, int32_t userId, bool isPaused, bool enablePushConnection, bool hasNetwork, int32_t networkType);
void setProxySettings(std::string address, uint16_t port, std::string username, std::string password, std::string secret); void setProxySettings(std::string address, uint16_t port, std::string username, std::string password, std::string secret);
void setLangCode(std::string langCode); void setLangCode(std::string langCode);
@ -123,7 +123,7 @@ private:
void onDatacenterHandshakeComplete(Datacenter *datacenter, HandshakeType type, int32_t timeDiff); void onDatacenterHandshakeComplete(Datacenter *datacenter, HandshakeType type, int32_t timeDiff);
void onDatacenterExportAuthorizationComplete(Datacenter *datacenter); void onDatacenterExportAuthorizationComplete(Datacenter *datacenter);
int64_t generateMessageId(); int64_t generateMessageId();
bool isIpv6Enabled(); uint8_t getIpStratagy();
bool isNetworkAvailable(); bool isNetworkAvailable();
void scheduleCheckProxyInternal(ProxyCheckInfo *proxyCheckInfo); void scheduleCheckProxyInternal(ProxyCheckInfo *proxyCheckInfo);
@ -192,7 +192,7 @@ private:
int64_t lastOutgoingMessageId = 0; int64_t lastOutgoingMessageId = 0;
bool networkAvailable = true; bool networkAvailable = true;
bool networkSlow = false; bool networkSlow = false;
bool ipv6Enabled = false; uint8_t ipStrategy = USE_IPV4_ONLY;
std::vector<ConnectionSocket *> activeConnections; std::vector<ConnectionSocket *> activeConnections;
std::vector<ConnectionSocket *> activeConnectionsCopy; std::vector<ConnectionSocket *> activeConnectionsCopy;
int epolFd; int epolFd;

View file

@ -1477,7 +1477,8 @@ bool Datacenter::isExportingAuthorization() {
bool Datacenter::hasMediaAddress() { bool Datacenter::hasMediaAddress() {
std::vector<TcpAddress> *addresses; std::vector<TcpAddress> *addresses;
if (ConnectionsManager::getInstance(instanceNum).isIpv6Enabled()) { int strategy = ConnectionsManager::getInstance(instanceNum).getIpStratagy();
if (strategy == USE_IPV6_ONLY) {
addresses = &addressesIpv6Download; addresses = &addressesIpv6Download;
} else { } else {
addresses = &addressesIpv4Download; addresses = &addressesIpv4Download;

View file

@ -31,6 +31,10 @@
#define MAX_ACCOUNT_COUNT 3 #define MAX_ACCOUNT_COUNT 3
#define USE_DELEGATE_HOST_RESOLVE #define USE_DELEGATE_HOST_RESOLVE
#define USE_IPV4_ONLY 0
#define USE_IPV6_ONLY 1
#define USE_IPV4_IPV6_RANDOM 2
#define NETWORK_TYPE_MOBILE 0 #define NETWORK_TYPE_MOBILE 0
#define NETWORK_TYPE_WIFI 1 #define NETWORK_TYPE_WIFI 1
#define NETWORK_TYPE_ROAMING 2 #define NETWORK_TYPE_ROAMING 2

View file

@ -18,7 +18,7 @@ public class BuildVars {
public static boolean LOGS_ENABLED = false; public static boolean LOGS_ENABLED = false;
public static boolean USE_CLOUD_STRINGS = true; public static boolean USE_CLOUD_STRINGS = true;
public static boolean CHECK_UPDATES = true; public static boolean CHECK_UPDATES = true;
public static int BUILD_VERSION = 2244; public static int BUILD_VERSION = 2245;
public static String BUILD_VERSION_STRING = "7.5.0"; public static String BUILD_VERSION_STRING = "7.5.0";
public static int APP_ID = 4; public static int APP_ID = 4;
public static String APP_HASH = "014b35b6184100b085b0d0572f9b5103"; public static String APP_HASH = "014b35b6184100b085b0d0572f9b5103";

View file

@ -41,6 +41,7 @@ public class ChatsWidgetProvider extends AppWidgetProvider {
@Override @Override
public void onDeleted(Context context, int[] appWidgetIds) { public void onDeleted(Context context, int[] appWidgetIds) {
super.onDeleted(context, appWidgetIds); super.onDeleted(context, appWidgetIds);
ApplicationLoader.postInitApplication();
SharedPreferences preferences = context.getSharedPreferences("shortcut_widget", Activity.MODE_PRIVATE); SharedPreferences preferences = context.getSharedPreferences("shortcut_widget", Activity.MODE_PRIVATE);
SharedPreferences.Editor editor = preferences.edit(); SharedPreferences.Editor editor = preferences.edit();
for (int a = 0; a < appWidgetIds.length; a++) { for (int a = 0; a < appWidgetIds.length; a++) {
@ -58,15 +59,16 @@ public class ChatsWidgetProvider extends AppWidgetProvider {
private static int getCellsForSize(int size) { private static int getCellsForSize(int size) {
int n = 2; int n = 2;
while (70 * n - 30 < size) { while (72 * n < size) {
++n; ++n;
} }
return n - 1; return n - 1;
} }
public static void updateWidget(Context context, AppWidgetManager appWidgetManager, int appWidgetId, boolean edit) { public static void updateWidget(Context context, AppWidgetManager appWidgetManager, int appWidgetId, boolean edit) {
ApplicationLoader.postInitApplication();
Bundle options = appWidgetManager.getAppWidgetOptions(appWidgetId); Bundle options = appWidgetManager.getAppWidgetOptions(appWidgetId);
int minHeight = options.getInt(AppWidgetManager.OPTION_APPWIDGET_MIN_HEIGHT); int minHeight = options.getInt(AppWidgetManager.OPTION_APPWIDGET_MAX_HEIGHT);
int rows = getCellsForSize(minHeight); int rows = getCellsForSize(minHeight);
Intent intent2 = new Intent(context, ChatsWidgetService.class); Intent intent2 = new Intent(context, ChatsWidgetService.class);

View file

@ -35,6 +35,7 @@ public class ContactsWidgetProvider extends AppWidgetProvider {
@Override @Override
public void onDeleted(Context context, int[] appWidgetIds) { public void onDeleted(Context context, int[] appWidgetIds) {
super.onDeleted(context, appWidgetIds); super.onDeleted(context, appWidgetIds);
ApplicationLoader.postInitApplication();
SharedPreferences preferences = context.getSharedPreferences("shortcut_widget", Activity.MODE_PRIVATE); SharedPreferences preferences = context.getSharedPreferences("shortcut_widget", Activity.MODE_PRIVATE);
SharedPreferences.Editor editor = preferences.edit(); SharedPreferences.Editor editor = preferences.edit();
for (int a = 0; a < appWidgetIds.length; a++) { for (int a = 0; a < appWidgetIds.length; a++) {
@ -58,16 +59,17 @@ public class ContactsWidgetProvider extends AppWidgetProvider {
private static int getCellsForSize(int size) { private static int getCellsForSize(int size) {
int n = 2; int n = 2;
while (86 * n - 30 < size) { while (86 * n < size) {
++n; ++n;
} }
return n - 1; return n - 1;
} }
public static void updateWidget(Context context, AppWidgetManager appWidgetManager, int appWidgetId, boolean edit) { public static void updateWidget(Context context, AppWidgetManager appWidgetManager, int appWidgetId, boolean edit) {
ApplicationLoader.postInitApplication();
Bundle options = appWidgetManager.getAppWidgetOptions(appWidgetId); Bundle options = appWidgetManager.getAppWidgetOptions(appWidgetId);
int minHeight = options.getInt(AppWidgetManager.OPTION_APPWIDGET_MIN_HEIGHT); int maxHeight = options.getInt(AppWidgetManager.OPTION_APPWIDGET_MAX_HEIGHT);
int rows = getCellsForSize(minHeight); int rows = getCellsForSize(maxHeight);
Intent intent2 = new Intent(context, ContactsWidgetService.class); Intent intent2 = new Intent(context, ContactsWidgetService.class);
intent2.putExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, appWidgetId); intent2.putExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, appWidgetId);

View file

@ -120,9 +120,13 @@ class ContactsRemoteViewsFactory implements RemoteViewsService.RemoteViewsFactor
} }
} else { } else {
chat = accountInstance.getMessagesController().getChat(-(int) (long) id); chat = accountInstance.getMessagesController().getChat(-(int) (long) id);
name = chat.title; if (chat != null) {
if (chat.photo != null && chat.photo.photo_small != null && chat.photo.photo_small.volume_id != 0 && chat.photo.photo_small.local_id != 0) { name = chat.title;
photoPath = chat.photo.photo_small; if (chat.photo != null && chat.photo.photo_small != null && chat.photo.photo_small.volume_id != 0 && chat.photo.photo_small.local_id != 0) {
photoPath = chat.photo.photo_small;
}
} else {
name = "";
} }
} }
rv.setTextViewText(a == 0 ? R.id.contacts_widget_item_text1 : R.id.contacts_widget_item_text2, name); rv.setTextViewText(a == 0 ? R.id.contacts_widget_item_text1 : R.id.contacts_widget_item_text2, name);
@ -175,7 +179,13 @@ class ContactsRemoteViewsFactory implements RemoteViewsService.RemoteViewsFactor
TLRPC.Dialog dialog = dialogs.get(id); TLRPC.Dialog dialog = dialogs.get(id);
if (dialog != null && dialog.unread_count > 0) { if (dialog != null && dialog.unread_count > 0) {
rv.setTextViewText(a == 0 ? R.id.contacts_widget_item_badge1 : R.id.contacts_widget_item_badge2, String.format("%d", dialog.unread_count)); String count;
if (dialog.unread_count > 99) {
count = String.format("%d+", 99);
} else {
count = String.format("%d", dialog.unread_count);
}
rv.setTextViewText(a == 0 ? R.id.contacts_widget_item_badge1 : R.id.contacts_widget_item_badge2, count);
rv.setViewVisibility(a == 0 ? R.id.contacts_widget_item_badge_bg1 : R.id.contacts_widget_item_badge_bg2, View.VISIBLE); rv.setViewVisibility(a == 0 ? R.id.contacts_widget_item_badge_bg1 : R.id.contacts_widget_item_badge_bg2, View.VISIBLE);
} else { } else {
rv.setViewVisibility(a == 0 ? R.id.contacts_widget_item_badge_bg1 : R.id.contacts_widget_item_badge_bg2, View.GONE); rv.setViewVisibility(a == 0 ? R.id.contacts_widget_item_badge_bg1 : R.id.contacts_widget_item_badge_bg2, View.GONE);

View file

@ -3486,7 +3486,7 @@ public class MessagesController extends BaseController implements NotificationCe
editor.remove("dialog_bar_distance" + dialogId); editor.remove("dialog_bar_distance" + dialogId);
} }
} }
editor.commit(); editor.apply();
getNotificationCenter().postNotificationName(NotificationCenter.peerSettingsDidLoad, dialogId); getNotificationCenter().postNotificationName(NotificationCenter.peerSettingsDidLoad, dialogId);
} }
@ -9713,6 +9713,9 @@ public class MessagesController extends BaseController implements NotificationCe
for (int a = 0; a < res.new_messages.size(); a++) { for (int a = 0; a < res.new_messages.size(); a++) {
TLRPC.Message message = res.new_messages.get(a); TLRPC.Message message = res.new_messages.get(a);
if (message instanceof TLRPC.TL_messageEmpty) {
continue;
}
message.unread = !(channelFinal != null && channelFinal.left || (message.out ? outboxValue : inboxValue) >= message.id || message.action instanceof TLRPC.TL_messageActionChannelCreate); message.unread = !(channelFinal != null && channelFinal.left || (message.out ? outboxValue : inboxValue) >= message.id || message.action instanceof TLRPC.TL_messageActionChannelCreate);
boolean isDialogCreated = createdDialogIds.contains(dialog_id); boolean isDialogCreated = createdDialogIds.contains(dialog_id);
@ -9949,6 +9952,9 @@ public class MessagesController extends BaseController implements NotificationCe
int clientUserId = getUserConfig().getClientUserId(); int clientUserId = getUserConfig().getClientUserId();
for (int a = 0; a < res.new_messages.size(); a++) { for (int a = 0; a < res.new_messages.size(); a++) {
TLRPC.Message message = res.new_messages.get(a); TLRPC.Message message = res.new_messages.get(a);
if (message instanceof TLRPC.TL_messageEmpty) {
continue;
}
MessageObject.getDialogId(message); MessageObject.getDialogId(message);
if ((int) message.dialog_id != 0) { if ((int) message.dialog_id != 0) {
@ -11355,6 +11361,9 @@ public class MessagesController extends BaseController implements NotificationCe
message.out = true; message.out = true;
} }
} }
if (message instanceof TLRPC.TL_messageEmpty) {
continue;
}
TLRPC.Chat chat = null; TLRPC.Chat chat = null;
int chat_id = 0; int chat_id = 0;
int user_id = 0; int user_id = 0;

View file

@ -8267,6 +8267,9 @@ public class MessagesStorage extends BaseController {
for (int a = 0; a < messages.size(); a++) { for (int a = 0; a < messages.size(); a++) {
TLRPC.Message message = messages.get(a); TLRPC.Message message = messages.get(a);
if (message instanceof TLRPC.TL_messageEmpty) {
continue;
}
fixUnsupportedMedia(message); fixUnsupportedMedia(message);
state_messages.requery(); state_messages.requery();
@ -10166,6 +10169,9 @@ public class MessagesStorage extends BaseController {
int count = messages.messages.size(); int count = messages.messages.size();
for (int a = 0; a < count; a++) { for (int a = 0; a < count; a++) {
TLRPC.Message message = messages.messages.get(a); TLRPC.Message message = messages.messages.get(a);
if (message instanceof TLRPC.TL_messageEmpty) {
continue;
}
long messageId = message.id; long messageId = message.id;
if (channelId == 0) { if (channelId == 0) {

View file

@ -22,7 +22,7 @@ import java.util.zip.ZipFile;
public class NativeLoader { public class NativeLoader {
private final static int LIB_VERSION = 35; private final static int LIB_VERSION = 36;
private final static String LIB_NAME = "tmessages." + LIB_VERSION; private final static String LIB_NAME = "tmessages." + LIB_VERSION;
private final static String LIB_SO_NAME = "lib" + LIB_NAME + ".so"; private final static String LIB_SO_NAME = "lib" + LIB_NAME + ".so";
private final static String LOCALE_LIB_SO_NAME = "lib" + LIB_NAME + "loc.so"; private final static String LOCALE_LIB_SO_NAME = "lib" + LIB_NAME + "loc.so";

View file

@ -1598,6 +1598,9 @@ public class SendMessagesHelper extends BaseController implements NotificationCe
newMsg.flags |= 8388608; newMsg.flags |= 8388608;
} }
newMsg.message = msgObj.messageOwner.message; newMsg.message = msgObj.messageOwner.message;
if (newMsg.message == null) {
newMsg.message = "";
}
newMsg.fwd_msg_id = msgObj.getId(); newMsg.fwd_msg_id = msgObj.getId();
newMsg.attachPath = msgObj.messageOwner.attachPath; newMsg.attachPath = msgObj.messageOwner.attachPath;
newMsg.entities = msgObj.messageOwner.entities; newMsg.entities = msgObj.messageOwner.entities;

View file

@ -82,6 +82,10 @@ public class ConnectionsManager extends BaseController {
public final static int ConnectionStateConnectingToProxy = 4; public final static int ConnectionStateConnectingToProxy = 4;
public final static int ConnectionStateUpdating = 5; public final static int ConnectionStateUpdating = 5;
public final static byte USE_IPV4_ONLY = 0;
public final static byte USE_IPV6_ONLY = 1;
public final static byte USE_IPV4_IPV6_RANDOM = 2;
private static long lastDnsRequestTime; private static long lastDnsRequestTime;
public final static int DEFAULT_DATACENTER_ID = Integer.MAX_VALUE; public final static int DEFAULT_DATACENTER_ID = Integer.MAX_VALUE;
@ -333,7 +337,7 @@ public class ConnectionsManager extends BaseController {
} }
public void checkConnection() { public void checkConnection() {
native_setUseIpv6(currentAccount, useIpv6Address()); native_setIpStrategy(currentAccount, getIpStrategy());
native_setNetworkAvailable(currentAccount, ApplicationLoader.isNetworkOnline(), ApplicationLoader.getCurrentNetworkType(), ApplicationLoader.isConnectionSlow()); native_setNetworkAvailable(currentAccount, ApplicationLoader.isNetworkOnline(), ApplicationLoader.getCurrentNetworkType(), ApplicationLoader.isConnectionSlow());
} }
@ -656,7 +660,7 @@ public class ConnectionsManager extends BaseController {
public static native void native_switchBackend(int currentAccount); public static native void native_switchBackend(int currentAccount);
public static native int native_isTestBackend(int currentAccount); public static native int native_isTestBackend(int currentAccount);
public static native void native_pauseNetwork(int currentAccount); public static native void native_pauseNetwork(int currentAccount);
public static native void native_setUseIpv6(int currentAccount, boolean value); public static native void native_setIpStrategy(int currentAccount, byte value);
public static native void native_updateDcSettings(int currentAccount); public static native void native_updateDcSettings(int currentAccount);
public static native void native_setNetworkAvailable(int currentAccount, boolean value, int networkType, boolean slow); public static native void native_setNetworkAvailable(int currentAccount, boolean value, int networkType, boolean slow);
public static native void native_resumeNetwork(int currentAccount, boolean partial); public static native void native_resumeNetwork(int currentAccount, boolean partial);
@ -701,9 +705,9 @@ public class ConnectionsManager extends BaseController {
} }
@SuppressLint("NewApi") @SuppressLint("NewApi")
protected static boolean useIpv6Address() { protected static byte getIpStrategy() {
if (Build.VERSION.SDK_INT < 19) { if (Build.VERSION.SDK_INT < 19) {
return false; return USE_IPV4_ONLY;
} }
if (BuildVars.LOGS_ENABLED) { if (BuildVars.LOGS_ENABLED) {
try { try {
@ -741,6 +745,7 @@ public class ConnectionsManager extends BaseController {
Enumeration<NetworkInterface> networkInterfaces = NetworkInterface.getNetworkInterfaces(); Enumeration<NetworkInterface> networkInterfaces = NetworkInterface.getNetworkInterfaces();
boolean hasIpv4 = false; boolean hasIpv4 = false;
boolean hasIpv6 = false; boolean hasIpv6 = false;
boolean hasStrangeIpv4 = false;
while (networkInterfaces.hasMoreElements()) { while (networkInterfaces.hasMoreElements()) {
networkInterface = networkInterfaces.nextElement(); networkInterface = networkInterfaces.nextElement();
if (!networkInterface.isUp() || networkInterface.isLoopback()) { if (!networkInterface.isUp() || networkInterface.isLoopback()) {
@ -759,18 +764,25 @@ public class ConnectionsManager extends BaseController {
String addrr = inetAddress.getHostAddress(); String addrr = inetAddress.getHostAddress();
if (!addrr.startsWith("192.0.0.")) { if (!addrr.startsWith("192.0.0.")) {
hasIpv4 = true; hasIpv4 = true;
} else {
hasStrangeIpv4 = true;
} }
} }
} }
} }
if (!hasIpv4 && hasIpv6) { if (hasIpv6) {
return true; if (hasStrangeIpv4) {
return USE_IPV4_IPV6_RANDOM;
}
if (!hasIpv4) {
return USE_IPV6_ONLY;
}
} }
} catch (Throwable e) { } catch (Throwable e) {
FileLog.e(e); FileLog.e(e);
} }
return false; return USE_IPV4_ONLY;
} }
private static class ResolveHostByNameTask extends AsyncTask<Void, Void, ResolvedDomain> { private static class ResolveHostByNameTask extends AsyncTask<Void, Void, ResolvedDomain> {

View file

@ -1998,7 +1998,7 @@ public class ChatMessageCell extends BaseCell implements SeekBar.SeekBarDelegate
if (isAvatarVisible && avatarImage.isInsideImage(x, y + getTop())) { if (isAvatarVisible && avatarImage.isInsideImage(x, y + getTop())) {
avatarPressed = true; avatarPressed = true;
result = true; result = true;
} else if (psaButtonVisible && psaHelpX != -1 && x >= psaHelpX && x <= psaHelpX + AndroidUtilities.dp(40) && y >= psaHelpY && y <= psaHelpY + AndroidUtilities.dp(40)) { } else if (psaButtonVisible && hasPsaHint && x >= psaHelpX && x <= psaHelpX + AndroidUtilities.dp(40) && y >= psaHelpY && y <= psaHelpY + AndroidUtilities.dp(40)) {
psaHintPressed = true; psaHintPressed = true;
createSelectorDrawable(0); createSelectorDrawable(0);
selectorDrawableMaskType[0] = 3; selectorDrawableMaskType[0] = 3;

View file

@ -20222,6 +20222,9 @@ public class ChatActivity extends BaseFragment implements NotificationCenter.Not
AlertDialog alertDialog = builder.create(); AlertDialog alertDialog = builder.create();
showDialog(builder.create()); showDialog(builder.create());
} }
AndroidUtilities.cancelRunOnUIThread(progressRunnable);
commentLoadingMessageId = 0;
chatListView.invalidateViews();
return; return;
} }
savedNoHistory = true; savedNoHistory = true;
@ -20829,7 +20832,7 @@ public class ChatActivity extends BaseFragment implements NotificationCenter.Not
showPollSolution(cell.getMessageObject(), media.results); showPollSolution(cell.getMessageObject(), media.results);
} else if (type == 1) { } else if (type == 1) {
MessageObject messageObject = cell.getMessageObject(); MessageObject messageObject = cell.getMessageObject();
if (TextUtils.isEmpty(messageObject.messageOwner.fwd_from.psa_type)) { if (messageObject.messageOwner.fwd_from == null || TextUtils.isEmpty(messageObject.messageOwner.fwd_from.psa_type)) {
return; return;
} }
CharSequence text = LocaleController.getString("PsaMessageInfo_" + messageObject.messageOwner.fwd_from.psa_type); CharSequence text = LocaleController.getString("PsaMessageInfo_" + messageObject.messageOwner.fwd_from.psa_type);

View file

@ -164,7 +164,7 @@ public class ClearHistoryAlert extends BottomSheet {
if (autoDeleteOnly || contentHeight - visiblePart < AndroidUtilities.dp(90) || contentHeight < height / 2 + AndroidUtilities.dp(90)) { if (autoDeleteOnly || contentHeight - visiblePart < AndroidUtilities.dp(90) || contentHeight < height / 2 + AndroidUtilities.dp(90)) {
padding = height - contentHeight; padding = height - contentHeight;
} else { } else {
int minHeight = contentHeight / 2 + AndroidUtilities.dp(40); int minHeight = contentHeight / 2 + AndroidUtilities.dp(108);
if (visiblePart < minHeight) { if (visiblePart < minHeight) {
padding = height - minHeight; padding = height - minHeight;
} }

View file

@ -293,7 +293,14 @@ public class InviteLinkBottomSheet extends BottomSheet {
titleTextView.setGravity(Gravity.CENTER_VERTICAL); titleTextView.setGravity(Gravity.CENTER_VERTICAL);
titleTextView.setTypeface(AndroidUtilities.getTypeface("fonts/rmedium.ttf")); titleTextView.setTypeface(AndroidUtilities.getTypeface("fonts/rmedium.ttf"));
if (!permanent) { if (!permanent) {
titleTextView.setText(invite.revoked ? LocaleController.getString("RevokedLink", R.string.RevokedLink) : LocaleController.getString("InviteLink", R.string.InviteLink)); if (invite.expired) {
titleTextView.setText(LocaleController.getString("ExpiredLink", R.string.ExpiredLink));
} else if (invite.revoked) {
titleTextView.setText(LocaleController.getString("RevokedLink", R.string.RevokedLink));
} else {
titleTextView.setText(LocaleController.getString("InviteLink", R.string.InviteLink));
}
titleVisible = true; titleVisible = true;
} else { } else {
titleTextView.setText(LocaleController.getString("InviteLink", R.string.InviteLink)); titleTextView.setText(LocaleController.getString("InviteLink", R.string.InviteLink));

View file

@ -459,6 +459,9 @@ public class LinkActionView extends LinearLayout {
} }
private void revokeLink() { private void revokeLink() {
if (fragment.getParentActivity() == null) {
return;
}
AlertDialog.Builder builder = new AlertDialog.Builder(fragment.getParentActivity()); AlertDialog.Builder builder = new AlertDialog.Builder(fragment.getParentActivity());
builder.setMessage(LocaleController.getString("RevokeAlert", R.string.RevokeAlert)); builder.setMessage(LocaleController.getString("RevokeAlert", R.string.RevokeAlert));
builder.setTitle(LocaleController.getString("RevokeLink", R.string.RevokeLink)); builder.setTitle(LocaleController.getString("RevokeLink", R.string.RevokeLink));

View file

@ -75,7 +75,6 @@ public class ReportAlert extends BottomSheet {
setCustomView(frameLayout); setCustomView(frameLayout);
RLottieImageView imageView = new RLottieImageView(context); RLottieImageView imageView = new RLottieImageView(context);
imageView.setAutoRepeat(true);
imageView.setAnimation(R.raw.report_police, 120, 120); imageView.setAnimation(R.raw.report_police, 120, 120);
imageView.playAnimation(); imageView.playAnimation();
frameLayout.addView(imageView, LayoutHelper.createFrame(160, 160, Gravity.CENTER_HORIZONTAL | Gravity.TOP, 17, 14, 17, 0)); frameLayout.addView(imageView, LayoutHelper.createFrame(160, 160, Gravity.CENTER_HORIZONTAL | Gravity.TOP, 17, 14, 17, 0));

View file

@ -6,6 +6,7 @@ import android.content.Context;
import androidx.annotation.IntDef; import androidx.annotation.IntDef;
import androidx.annotation.NonNull; import androidx.annotation.NonNull;
import org.telegram.messenger.BuildVars;
import org.telegram.messenger.FileLoader; import org.telegram.messenger.FileLoader;
import org.telegram.messenger.ImageLocation; import org.telegram.messenger.ImageLocation;
import org.telegram.messenger.LocaleController; import org.telegram.messenger.LocaleController;
@ -26,7 +27,7 @@ public class StickerSetBulletinLayout extends Bulletin.TwoLineLayout {
public static final int TYPE_REMOVED_FROM_FAVORITES = 4; public static final int TYPE_REMOVED_FROM_FAVORITES = 4;
public static final int TYPE_ADDED_TO_FAVORITES = 5; public static final int TYPE_ADDED_TO_FAVORITES = 5;
@IntDef(value = {TYPE_REMOVED, TYPE_ARCHIVED, TYPE_ADDED}) @IntDef(value = {TYPE_REMOVED, TYPE_ARCHIVED, TYPE_ADDED, TYPE_REMOVED_FROM_RECENT, TYPE_REMOVED_FROM_FAVORITES, TYPE_ADDED_TO_FAVORITES})
public @interface Type {} public @interface Type {}
public StickerSetBulletinLayout(@NonNull Context context, TLObject setObject, @Type int type) { public StickerSetBulletinLayout(@NonNull Context context, TLObject setObject, @Type int type) {
@ -61,7 +62,7 @@ public class StickerSetBulletinLayout extends Bulletin.TwoLineLayout {
stickerSet = null; stickerSet = null;
} }
if (sticker == null) { if (sticker == null && BuildVars.DEBUG_VERSION) {
throw new IllegalArgumentException("Invalid type of the given setObject: " + setObject.getClass()); throw new IllegalArgumentException("Invalid type of the given setObject: " + setObject.getClass());
} }

View file

@ -12,10 +12,12 @@ import android.graphics.PorterDuffColorFilter;
import android.graphics.RectF; import android.graphics.RectF;
import android.graphics.Typeface; import android.graphics.Typeface;
import android.os.SystemClock; import android.os.SystemClock;
import android.text.Layout;
import android.text.Selection; import android.text.Selection;
import android.text.Spannable; import android.text.Spannable;
import android.text.SpannableStringBuilder; import android.text.SpannableStringBuilder;
import android.text.Spanned; import android.text.Spanned;
import android.text.StaticLayout;
import android.text.TextPaint; import android.text.TextPaint;
import android.text.TextUtils; import android.text.TextUtils;
import android.text.method.LinkMovementMethod; import android.text.method.LinkMovementMethod;
@ -1067,6 +1069,12 @@ public class UndoView extends FrameLayout {
super.onMeasure(MeasureSpec.makeMeasureSpec(MeasureSpec.getSize(widthMeasureSpec), MeasureSpec.EXACTLY), MeasureSpec.makeMeasureSpec(undoViewHeight, MeasureSpec.EXACTLY)); super.onMeasure(MeasureSpec.makeMeasureSpec(MeasureSpec.getSize(widthMeasureSpec), MeasureSpec.EXACTLY), MeasureSpec.makeMeasureSpec(undoViewHeight, MeasureSpec.EXACTLY));
} }
StaticLayout timeLayout;
StaticLayout timeLayoutOut;
int textWidthOut;
float timeReplaceProgress = 1f;
@Override @Override
protected void onDraw(Canvas canvas) { protected void onDraw(Canvas canvas) {
if (currentAction == ACTION_DELETE || currentAction == ACTION_CLEAR) { if (currentAction == ACTION_DELETE || currentAction == ACTION_CLEAR) {
@ -1074,9 +1082,50 @@ public class UndoView extends FrameLayout {
if (prevSeconds != newSeconds) { if (prevSeconds != newSeconds) {
prevSeconds = newSeconds; prevSeconds = newSeconds;
timeLeftString = String.format("%d", Math.max(1, newSeconds)); timeLeftString = String.format("%d", Math.max(1, newSeconds));
if (timeLayout != null) {
timeLayoutOut = timeLayout;
timeReplaceProgress = 0;
textWidthOut = textWidth;
}
textWidth = (int) Math.ceil(textPaint.measureText(timeLeftString)); textWidth = (int) Math.ceil(textPaint.measureText(timeLeftString));
timeLayout = new StaticLayout(timeLeftString, textPaint, Integer.MAX_VALUE, Layout.Alignment.ALIGN_NORMAL, 1.0f, 0.0f, false);
} }
canvas.drawText(timeLeftString, rect.centerX() - textWidth / 2, AndroidUtilities.dp(28.2f), textPaint);
if (timeReplaceProgress < 1f) {
timeReplaceProgress += 16f / 150f;
if (timeReplaceProgress > 1f) {
timeReplaceProgress = 1f;
} else {
invalidate();
}
}
int alpha = textPaint.getAlpha();
if (timeLayoutOut != null && timeReplaceProgress < 1f) {
textPaint.setAlpha((int) (alpha * (1f - timeReplaceProgress)));
canvas.save();
canvas.translate(rect.centerX() - textWidth / 2, AndroidUtilities.dp(17.2f) + AndroidUtilities.dp(10) * timeReplaceProgress);
timeLayoutOut.draw(canvas);
textPaint.setAlpha(alpha);
canvas.restore();
}
if (timeLayout != null) {
if (timeReplaceProgress != 1f) {
textPaint.setAlpha((int) (alpha * timeReplaceProgress));
}
canvas.save();
canvas.translate(rect.centerX() - textWidth / 2, AndroidUtilities.dp(17.2f) - AndroidUtilities.dp(10) * (1f - timeReplaceProgress));
timeLayout.draw(canvas);
if (timeReplaceProgress != 1f) {
textPaint.setAlpha(alpha);
}
canvas.restore();
}
// canvas.drawText(timeLeftString, rect.centerX() - textWidth / 2, AndroidUtilities.dp(28.2f), textPaint);
// canvas.drawText(timeLeftString, , textPaint);
canvas.drawArc(rect, -90, -360 * (timeLeft / 5000.0f), false, progressPaint); canvas.drawArc(rect, -90, -360 * (timeLeft / 5000.0f), false, progressPaint);
} }

View file

@ -606,7 +606,13 @@ public class EditWidgetActivity extends BaseFragment {
} }
if (dialog != null && dialog.unread_count > 0) { if (dialog != null && dialog.unread_count > 0) {
((TextView) cells[position].findViewById(a == 0 ? R.id.contacts_widget_item_badge1 : R.id.contacts_widget_item_badge2)).setText(String.format("%d", dialog.unread_count)); String count;
if (dialog.unread_count > 99) {
count = String.format("%d+", 99);
} else {
count = String.format("%d", dialog.unread_count);
}
((TextView) cells[position].findViewById(a == 0 ? R.id.contacts_widget_item_badge1 : R.id.contacts_widget_item_badge2)).setText(count);
cells[position].findViewById(a == 0 ? R.id.contacts_widget_item_badge_bg1 : R.id.contacts_widget_item_badge_bg2).setVisibility(VISIBLE); cells[position].findViewById(a == 0 ? R.id.contacts_widget_item_badge_bg1 : R.id.contacts_widget_item_badge_bg2).setVisibility(VISIBLE);
} else { } else {
cells[position].findViewById(a == 0 ? R.id.contacts_widget_item_badge_bg1 : R.id.contacts_widget_item_badge_bg2).setVisibility(GONE); cells[position].findViewById(a == 0 ? R.id.contacts_widget_item_badge_bg1 : R.id.contacts_widget_item_badge_bg2).setVisibility(GONE);

View file

@ -848,7 +848,7 @@ public class ManageLinksActivity extends BaseFragment implements NotificationCen
if (isPublic && adminId == getAccountInstance().getUserConfig().clientUserId) { if (isPublic && adminId == getAccountInstance().getUserConfig().clientUserId) {
headerCell.setText(LocaleController.getString("PublicLink", R.string.PublicLink)); headerCell.setText(LocaleController.getString("PublicLink", R.string.PublicLink));
} else if (adminId == getAccountInstance().getUserConfig().clientUserId) { } else if (adminId == getAccountInstance().getUserConfig().clientUserId) {
headerCell.setText(LocaleController.getString("ChannelLinkTitle", R.string.ChannelLinkTitle)); headerCell.setText(LocaleController.getString("ChannelInviteLinkTitle", R.string.ChannelInviteLinkTitle));
} else { } else {
headerCell.setText(LocaleController.getString("PermanentLinkForThisAdmin", R.string.PermanentLinkForThisAdmin)); headerCell.setText(LocaleController.getString("PermanentLinkForThisAdmin", R.string.PermanentLinkForThisAdmin));
} }
@ -1123,7 +1123,7 @@ public class ManageLinksActivity extends BaseFragment implements NotificationCen
icons.add(R.drawable.msg_copy); icons.add(R.drawable.msg_copy);
actions.add(0); actions.add(0);
items.add(LocaleController.getString("Share", R.string.ShareLink)); items.add(LocaleController.getString("ShareLink", R.string.ShareLink));
icons.add(R.drawable.msg_share); icons.add(R.drawable.msg_share);
actions.add(1); actions.add(1);
@ -1765,11 +1765,19 @@ public class ManageLinksActivity extends BaseFragment implements NotificationCen
return true; return true;
} }
int animationIndex = -1;
@Override @Override
protected void onTransitionAnimationEnd(boolean isOpen, boolean backward) { protected void onTransitionAnimationEnd(boolean isOpen, boolean backward) {
super.onTransitionAnimationEnd(isOpen, backward); super.onTransitionAnimationEnd(isOpen, backward);
if (isOpen) { if (isOpen) {
isOpened = true; isOpened = true;
} }
NotificationCenter.getInstance(currentAccount).onAnimationFinish(animationIndex);
}
@Override
protected void onTransitionAnimationStart(boolean isOpen, boolean backward) {
super.onTransitionAnimationStart(isOpen, backward);
animationIndex = NotificationCenter.getInstance(currentAccount).setAnimationInProgress(animationIndex, null);
} }
} }

View file

@ -3001,7 +3001,7 @@ public class PhotoViewer implements NotificationCenter.NotificationCenterDelegat
ArrayList<MessageObject> arr = (ArrayList<MessageObject>) args[2]; ArrayList<MessageObject> arr = (ArrayList<MessageObject>) args[2];
endReached[loadIndex] = (Boolean) args[5]; endReached[loadIndex] = (Boolean) args[5];
if (needSearchImageInArr) { if (needSearchImageInArr) {
if (arr.isEmpty() && (loadIndex != 0 || mergeDialogId == 0)) { if (arr.isEmpty() && (loadIndex != 0 || mergeDialogId == 0) || currentIndex < 0 || currentIndex >= imagesArr.size()) {
needSearchImageInArr = false; needSearchImageInArr = false;
return; return;
} }
@ -3181,7 +3181,7 @@ public class PhotoViewer implements NotificationCenter.NotificationCenterDelegat
} }
setImageIndex(index); setImageIndex(index);
} else { } else {
closePhoto(false, false); closePhoto(false, true);
} }
} }
} }

View file

@ -5455,6 +5455,9 @@ public class ProfileActivity extends BaseFragment implements NotificationCenter.
if (user_id != 0) { if (user_id != 0) {
TLRPC.User user = getMessagesController().getUser(user_id); TLRPC.User user = getMessagesController().getUser(user_id);
if (user == null) {
return;
}
TLRPC.FileLocation photoBig = null; TLRPC.FileLocation photoBig = null;
if (user.photo != null) { if (user.photo != null) {
photoBig = user.photo.photo_big; photoBig = user.photo.photo_big;

View file

@ -43,6 +43,7 @@
android:layout_gravity="center" android:layout_gravity="center"
android:layout_marginBottom="27dp" android:layout_marginBottom="27dp"
android:layout_marginLeft="20dp" android:layout_marginLeft="20dp"
android:layout_marginRight="2dp"
android:id="@+id/contacts_widget_item_badge_bg1"> android:id="@+id/contacts_widget_item_badge_bg1">
<TextView android:id="@+id/contacts_widget_item_badge1" <TextView android:id="@+id/contacts_widget_item_badge1"
@ -98,6 +99,7 @@
android:layout_gravity="center" android:layout_gravity="center"
android:layout_marginBottom="27dp" android:layout_marginBottom="27dp"
android:layout_marginLeft="20dp" android:layout_marginLeft="20dp"
android:layout_marginRight="2dp"
android:id="@+id/contacts_widget_item_badge_bg2"> android:id="@+id/contacts_widget_item_badge_bg2">
<TextView android:id="@+id/contacts_widget_item_badge2" <TextView android:id="@+id/contacts_widget_item_badge2"

View file

@ -1,6 +1,5 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android" <FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="horizontal"
android:layout_width="match_parent" android:layout_width="match_parent"
android:minHeight="72dp" android:minHeight="72dp"
android:id="@+id/shortcut_widget_item" android:id="@+id/shortcut_widget_item"
@ -12,7 +11,7 @@
android:layout_marginStart="10dp" android:layout_marginStart="10dp"
android:layout_marginLeft="10dp" android:layout_marginLeft="10dp"
android:layout_marginRight="10dp" android:layout_marginRight="10dp"
android:layout_gravity="center_vertical" android:layout_gravity="start|center_vertical"
android:gravity="start" /> android:gravity="start" />
<RelativeLayout <RelativeLayout
@ -32,13 +31,14 @@
android:textSize="17dp" android:textSize="17dp"
android:fontFamily="sans-serif-medium" android:fontFamily="sans-serif-medium"
android:textColor="@color/widget_name" android:textColor="@color/widget_name"
android:layout_alignParentLeft="true" android:layout_alignParentStart="true"
android:layout_toLeftOf="@+id/shortcut_widget_item_time"/> android:layout_marginEnd="4dp"
android:layout_toStartOf="@+id/shortcut_widget_item_time"/>
<TextView android:id="@+id/shortcut_widget_item_time" <TextView android:id="@+id/shortcut_widget_item_time"
android:layout_width="wrap_content" android:layout_width="wrap_content"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_alignParentRight="true" android:layout_alignParentEnd="true"
android:layout_marginTop="3dp" android:layout_marginTop="3dp"
android:textSize="13dp" android:textSize="13dp"
android:textColor="@color/widget_time" /> android:textColor="@color/widget_time" />
@ -64,8 +64,8 @@
android:textColor="@color/widget_text" android:textColor="@color/widget_text"
android:autoLink="none" android:autoLink="none"
android:textColorLink="@color/widget_text" android:textColorLink="@color/widget_text"
android:layout_alignParentLeft="true" android:layout_alignParentStart="true"
android:layout_toLeftOf="@+id/shortcut_widget_item_badge"/> android:layout_toStartOf="@+id/shortcut_widget_item_badge"/>
<TextView android:id="@+id/shortcut_widget_item_badge" <TextView android:id="@+id/shortcut_widget_item_badge"
android:layout_width="wrap_content" android:layout_width="wrap_content"
@ -77,7 +77,8 @@
android:gravity="center" android:gravity="center"
android:minWidth="23dp" android:minWidth="23dp"
android:textSize="13dp" android:textSize="13dp"
android:layout_alignParentRight="true" android:layout_marginStart="4dp"
android:layout_alignParentEnd="true"
android:background="@drawable/widget_counter" android:background="@drawable/widget_counter"
android:textColor="@color/widget_badge" /> android:textColor="@color/widget_badge" />
@ -87,6 +88,7 @@
android:layout_marginStart="76dp" android:layout_marginStart="76dp"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="1px" android:layout_height="1px"
android:layout_marginEnd="8dp"
android:layout_gravity="bottom|start" android:layout_gravity="bottom|start"
android:background="@color/widget_divider"/> android:background="@color/widget_divider"/>