diff --git a/TMessagesProj/src/main/java/org/telegram/messenger/ContactsController.java b/TMessagesProj/src/main/java/org/telegram/messenger/ContactsController.java index c03022cd0..982c64748 100644 --- a/TMessagesProj/src/main/java/org/telegram/messenger/ContactsController.java +++ b/TMessagesProj/src/main/java/org/telegram/messenger/ContactsController.java @@ -175,7 +175,7 @@ public class ContactsController extends BaseController { public HashMap contactsByShortPhone = new HashMap<>(); private int completedRequestsCount; - + private static volatile ContactsController[] Instance = new ContactsController[UserConfig.MAX_ACCOUNT_COUNT]; public static ContactsController getInstance(int num) { ContactsController localInstance = Instance[num]; @@ -313,7 +313,7 @@ public class ContactsController extends BaseController { public void checkAppAccount() { AccountManager am = AccountManager.get(ApplicationLoader.applicationContext); try { - Account[] accounts = am.getAccountsByType("tw.nekomimi.nekogram"); + Account[] accounts = am.getAccountsByType(BuildConfig.APPLICATION_ID); systemAccount = null; for (int a = 0; a < accounts.length; a++) { Account acc = accounts[a]; @@ -321,7 +321,7 @@ public class ContactsController extends BaseController { for (int b = 0; b < UserConfig.MAX_ACCOUNT_COUNT; b++) { TLRPC.User user = UserConfig.getInstance(b).getCurrentUser(); if (user != null) { - if (acc.name.equals("" + user.id)) { + if (acc.name.equals(formatName(user.first_name, user.last_name))) { if (b == currentAccount) { systemAccount = acc; } @@ -330,26 +330,26 @@ public class ContactsController extends BaseController { } } } - if (!found) { + if (!found || NekoConfig.disableSystemAccount) { try { am.removeAccount(accounts[a], null, null); } catch (Exception ignore) { - } } } - } catch (Throwable ignore) { - + } catch (Throwable e) { + FileLog.e(e); } if (getUserConfig().isClientActivated()) { readContacts(); - if (systemAccount == null) { + if (systemAccount == null && !NekoConfig.disableSystemAccount) { try { - systemAccount = new Account("" + UserConfig.getInstance(currentAccount).getClientUserId(), "tw.nekomimi.nekogram"); + TLRPC.User user = UserConfig.getInstance(currentAccount).getCurrentUser(); + systemAccount = new Account(formatName(user.first_name, user.last_name), BuildConfig.APPLICATION_ID); am.addAccountExplicitly(systemAccount, "", null); - } catch (Exception ignore) { - + } catch (Exception e) { + FileLog.e(e); } } } @@ -359,25 +359,33 @@ public class ContactsController extends BaseController { try { systemAccount = null; AccountManager am = AccountManager.get(ApplicationLoader.applicationContext); - Account[] accounts = am.getAccountsByType("tw.nekomimi.nekogram"); + Account[] accounts = am.getAccountsByType(BuildConfig.APPLICATION_ID); for (int a = 0; a < accounts.length; a++) { Account acc = accounts[a]; - boolean found = false; - for (int b = 0; b < UserConfig.MAX_ACCOUNT_COUNT; b++) { - TLRPC.User user = UserConfig.getInstance(b).getCurrentUser(); - if (user != null) { - if (acc.name.equals("" + user.id)) { - found = true; - break; - } - } - } - if (!found) { + if (NekoConfig.disableSystemAccount) { try { am.removeAccount(accounts[a], null, null); } catch (Exception ignore) { } + } else { + boolean found = false; + for (int b = 0; b < UserConfig.MAX_ACCOUNT_COUNT; b++) { + TLRPC.User user = UserConfig.getInstance(b).getCurrentUser(); + if (user != null) { + if (acc.name.equals(formatName(user.first_name, user.last_name))) { + found = true; + break; + } + } + } + if (!found) { + try { + am.removeAccount(accounts[a], null, null); + } catch (Exception ignore) { + + } + } } } } catch (Exception e) { @@ -435,7 +443,7 @@ public class ContactsController extends BaseController { AndroidUtilities.runOnUIThread(() -> { AccountManager am = AccountManager.get(ApplicationLoader.applicationContext); try { - Account[] accounts = am.getAccountsByType("tw.nekomimi.nekogram"); + Account[] accounts = am.getAccountsByType(BuildConfig.APPLICATION_ID); systemAccount = null; for (int a = 0; a < accounts.length; a++) { Account acc = accounts[a]; @@ -453,7 +461,7 @@ public class ContactsController extends BaseController { } try { - systemAccount = new Account("" + UserConfig.getInstance(currentAccount).getClientUserId(), "tw.nekomimi.nekogram"); + systemAccount = new Account("" + UserConfig.getInstance(currentAccount).getClientUserId(), BuildConfig.APPLICATION_ID); am.addAccountExplicitly(systemAccount, "", null); } catch (Exception ignore) { @@ -1600,7 +1608,7 @@ public class ContactsController extends BaseController { private void saveContactsLoadTime() { try { SharedPreferences preferences = MessagesController.getMainSettings(currentAccount); - preferences.edit().putLong("lastReloadStatusTime", System.currentTimeMillis()).commit(); + preferences.edit().putLong("lastReloadStatusTime", System.currentTimeMillis()).apply(); } catch (Exception e) { FileLog.e(e); } @@ -2246,7 +2254,7 @@ public class ContactsController extends BaseController { getMessagesController().clearFullUsers(); SharedPreferences preferences = MessagesController.getMainSettings(currentAccount); final SharedPreferences.Editor editor = preferences.edit(); - editor.putBoolean("needGetStatuses", true).commit(); + editor.putBoolean("needGetStatuses", true).apply(); TLRPC.TL_contacts_getStatuses req = new TLRPC.TL_contacts_getStatuses(); getConnectionsManager().sendRequest(req, (response, error) -> { if (error == null) { diff --git a/TMessagesProj/src/main/java/org/telegram/messenger/MediaController.java b/TMessagesProj/src/main/java/org/telegram/messenger/MediaController.java index 2228b7ff9..3a0cb2a87 100644 --- a/TMessagesProj/src/main/java/org/telegram/messenger/MediaController.java +++ b/TMessagesProj/src/main/java/org/telegram/messenger/MediaController.java @@ -86,6 +86,8 @@ import java.util.Locale; import java.util.Timer; import java.util.TimerTask; +import tw.nekomimi.nekogram.NekoXConfig; + public class MediaController implements AudioManager.OnAudioFocusChangeListener, NotificationCenter.NotificationCenterDelegate, SensorEventListener { private native int startRecord(String path, int sampleRate); @@ -1133,7 +1135,7 @@ public class MediaController implements AudioManager.OnAudioFocusChangeListener, } } } - if (send) { + if (send && !NekoXConfig.disableScreenshotDetection) { if (lastSecretChat != null) { SecretChatHelper.getInstance(lastChatAccount).sendScreenshotMessage(lastSecretChat, lastChatVisibleMessages, null); } else { @@ -1142,6 +1144,10 @@ public class MediaController implements AudioManager.OnAudioFocusChangeListener, } } + public ArrayList getLastVisibleMessageIds() { + return lastChatVisibleMessages; + } + public void setLastVisibleMessageIds(int account, long enterTime, long leaveTime, TLRPC.User user, TLRPC.EncryptedChat encryptedChat, ArrayList visibleMessages, int visibleMessage) { lastChatEnterTime = enterTime; lastChatLeaveTime = leaveTime; diff --git a/TMessagesProj/src/main/java/org/telegram/messenger/MessagesController.java b/TMessagesProj/src/main/java/org/telegram/messenger/MessagesController.java index 17377f056..658325e1b 100644 --- a/TMessagesProj/src/main/java/org/telegram/messenger/MessagesController.java +++ b/TMessagesProj/src/main/java/org/telegram/messenger/MessagesController.java @@ -55,7 +55,12 @@ import java.util.Set; import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.CountDownLatch; +import tw.nekomimi.nekogram.ExternalGcm; +import tw.nekomimi.nekogram.InternalFilters; import tw.nekomimi.nekogram.NekoConfig; +import tw.nekomimi.nekogram.utils.AlertUtil; +import tw.nekomimi.nekogram.utils.ThreadUtil; +import tw.nekomimi.nekogram.utils.UIUtil; public class MessagesController extends BaseController implements NotificationCenter.NotificationCenterDelegate { @@ -234,6 +239,8 @@ public class MessagesController extends BaseController implements NotificationCe private boolean loadingAppConfig; + public int thisDc; + public boolean enableJoined; public String linkPrefix; public int maxGroupCount; @@ -348,16 +355,16 @@ public class MessagesController extends BaseController implements NotificationCe public TLRPC.SendMessageAction action; } - public static int DIALOG_FILTER_FLAG_CONTACTS = 0x00000001; - public static int DIALOG_FILTER_FLAG_NON_CONTACTS = 0x00000002; - public static int DIALOG_FILTER_FLAG_GROUPS = 0x00000004; - public static int DIALOG_FILTER_FLAG_CHANNELS = 0x00000008; - public static int DIALOG_FILTER_FLAG_BOTS = 0x00000010; - public static int DIALOG_FILTER_FLAG_EXCLUDE_MUTED = 0x00000020; - public static int DIALOG_FILTER_FLAG_EXCLUDE_READ = 0x00000040; - public static int DIALOG_FILTER_FLAG_EXCLUDE_ARCHIVED = 0x00000080; - public static int DIALOG_FILTER_FLAG_ONLY_ARCHIVED = 0x00000100; - public static int DIALOG_FILTER_FLAG_ALL_CHATS = DIALOG_FILTER_FLAG_CONTACTS | DIALOG_FILTER_FLAG_NON_CONTACTS | DIALOG_FILTER_FLAG_GROUPS | DIALOG_FILTER_FLAG_CHANNELS | DIALOG_FILTER_FLAG_BOTS; + public static int DIALOG_FILTER_FLAG_CONTACTS = 0x00000001; + public static int DIALOG_FILTER_FLAG_NON_CONTACTS = 0x00000002; + public static int DIALOG_FILTER_FLAG_GROUPS = 0x00000004; + public static int DIALOG_FILTER_FLAG_CHANNELS = 0x00000008; + public static int DIALOG_FILTER_FLAG_BOTS = 0x00000010; + public static int DIALOG_FILTER_FLAG_EXCLUDE_MUTED = 0x00000020; + public static int DIALOG_FILTER_FLAG_EXCLUDE_READ = 0x00000040; + public static int DIALOG_FILTER_FLAG_EXCLUDE_ARCHIVED = 0x00000080; + public static int DIALOG_FILTER_FLAG_ONLY_ARCHIVED = 0x00000100; + public static int DIALOG_FILTER_FLAG_ALL_CHATS = DIALOG_FILTER_FLAG_CONTACTS | DIALOG_FILTER_FLAG_NON_CONTACTS | DIALOG_FILTER_FLAG_GROUPS | DIALOG_FILTER_FLAG_CHANNELS | DIALOG_FILTER_FLAG_BOTS; public static class DialogFilter { @@ -435,6 +442,7 @@ public class MessagesController extends BaseController implements NotificationCe } private DialogFilter sortingDialogFilter; + private final Comparator dialogDateComparator = (dialog1, dialog2) -> { int pinnedNum1 = sortingDialogFilter.pinnedDialogs.get(dialog1.id, Integer.MIN_VALUE); int pinnedNum2 = sortingDialogFilter.pinnedDialogs.get(dialog2.id, Integer.MIN_VALUE); @@ -484,6 +492,82 @@ public class MessagesController extends BaseController implements NotificationCe return 0; } } + + boolean is1user = !DialogObject.isChannel(dialog1) && dialog1.id > 0; + boolean is2user = !DialogObject.isChannel(dialog2) && dialog2.id > 0; + + if (NekoConfig.sortByUnread) { + if (dialog1.unread_count == 0 && dialog2.unread_count > 0) { + return 1; + } else if (dialog1.unread_count > 0 && dialog2.unread_count == 0) { + return -1; + } else if (dialog1.unread_count > 0 && dialog2.unread_count > 0) { + if (NekoConfig.sortByUnmuted) { + if (isDialogMuted(dialog1.id) && !isDialogMuted(dialog2.id)) { + return 1; + } else if (!isDialogMuted(dialog1.id) && isDialogMuted(dialog2.id)) { + return -1; + } else if (!isDialogMuted(dialog1.id) && !isDialogMuted(dialog2.id)) { + if (NekoConfig.sortByUser) { + if (!is1user && is2user) { + return 1; + } else if (is1user && !is2user) { + return -1; + } else if (is1user && is2user) { + if (NekoConfig.sortByContacts) { + boolean is1contact = is1user && getContactsController().isContact((int) dialog1.id); + boolean is2contact = is2user && getContactsController().isContact((int) dialog2.id); + if (!is1contact && is2contact) { + return 1; + } else if (is1contact && !is2contact) { + return -1; + } else { + return 0; + } + } else { + return 0; + } + } + } else { + return 0; + } + } + } else { + return 0; + } + } + } else if (NekoConfig.sortByUnmuted) { + if (dialog1.unread_count == 0 && dialog2.unread_count > 0 && isDialogMuted(dialog1.id) && !isDialogMuted(dialog2.id)) { + return 1; + } else if (dialog1.unread_count > 0 && dialog2.unread_count == 0 && !isDialogMuted(dialog1.id) && isDialogMuted(dialog2.id)) { + return -1; + } else if (dialog1.unread_count > 0 && dialog2.unread_count > 0 && !isDialogMuted(dialog1.id) && !isDialogMuted(dialog2.id)) { + if (NekoConfig.sortByUser) { + if (!is1user && is2user) { + return 1; + } else if (is1user && !is2user) { + return -1; + } else if (is1user && is2user) { + if (NekoConfig.sortByContacts) { + boolean is1contact = is1user && getContactsController().isContact((int) dialog1.id); + boolean is2contact = is2user && getContactsController().isContact((int) dialog2.id); + if (!is1contact && is2contact) { + return 1; + } else if (is1contact && !is2contact) { + return -1; + } else { + return 0; + } + } else { + return 0; + } + } + } else { + return 0; + } + } + } + final MediaDataController mediaDataController = getMediaDataController(); final long date1 = DialogObject.getLastMessageOrDraftDate(dialog1, mediaDataController.getDraft(dialog1.id)); final long date2 = DialogObject.getLastMessageOrDraftDate(dialog2, mediaDataController.getDraft(dialog2.id)); @@ -492,6 +576,7 @@ public class MessagesController extends BaseController implements NotificationCe } else if (date1 > date2) { return -1; } + return 0; }; @@ -517,6 +602,7 @@ public class MessagesController extends BaseController implements NotificationCe }; private static volatile MessagesController[] Instance = new MessagesController[UserConfig.MAX_ACCOUNT_COUNT]; + public static MessagesController getInstance(int num) { MessagesController localInstance = Instance[num]; if (localInstance == null) { @@ -607,8 +693,8 @@ public class MessagesController extends BaseController implements NotificationCe canRevokePmInbox = mainPreferences.getBoolean("canRevokePmInbox", canRevokePmInbox); preloadFeaturedStickers = mainPreferences.getBoolean("preloadFeaturedStickers", false); youtubePipType = mainPreferences.getString("youtubePipType", "disabled"); - keepAliveService = mainPreferences.getBoolean("keepAliveService", false); - backgroundConnection = mainPreferences.getBoolean("keepAliveService", false); + keepAliveService = mainPreferences.getBoolean("keepAliveService", true); + backgroundConnection = mainPreferences.getBoolean("keepAliveService", true); promoDialogId = mainPreferences.getLong("proxy_dialog", 0); nextPromoInfoCheckTime = mainPreferences.getInt("nextPromoInfoCheckTime", 0); promoDialogType = mainPreferences.getInt("promo_dialog_type", 0); @@ -1038,6 +1124,8 @@ public class MessagesController extends BaseController implements NotificationCe } loadingSuggestedFilters = true; + /* + TLRPC.TL_messages_getSuggestedDialogFilters req = new TLRPC.TL_messages_getSuggestedDialogFilters(); getConnectionsManager().sendRequest(req, (response, error) -> AndroidUtilities.runOnUIThread(() -> { loadingSuggestedFilters = false; @@ -1050,6 +1138,27 @@ public class MessagesController extends BaseController implements NotificationCe } getNotificationCenter().postNotificationName(NotificationCenter.suggestedFiltersLoaded); })); + + */ + + suggestedFilters.clear(); + + s: + for (TLRPC.TL_dialogFilterSuggested suggested : InternalFilters.internalFilters) { + + for (DialogFilter filter : dialogFilters) { + + if (suggested.filter.flags == filter.flags) continue s; + + } + + suggestedFilters.add(suggested); + + } + + loadingSuggestedFilters = false; + getNotificationCenter().postNotificationName(NotificationCenter.suggestedFiltersLoaded); + } public void loadRemoteFilters(boolean force) { @@ -1062,11 +1171,12 @@ public class MessagesController extends BaseController implements NotificationCe } TLRPC.TL_messages_getDialogFilters req = new TLRPC.TL_messages_getDialogFilters(); getConnectionsManager().sendRequest(req, (response, error) -> { - if (response instanceof TLRPC.Vector) { - getMessagesStorage().checkLoadedRemoteFilters((TLRPC.Vector) response); - } else { - AndroidUtilities.runOnUIThread(() -> loadingRemoteFilters = false); - } + if (response instanceof TLRPC.Vector) { + getMessagesStorage().checkLoadedRemoteFilters((TLRPC.Vector) response); + + } else { + AndroidUtilities.runOnUIThread(() -> loadingRemoteFilters = false); + } }); } @@ -1338,6 +1448,7 @@ public class MessagesController extends BaseController implements NotificationCe AndroidUtilities.runOnUIThread(() -> { getDownloadController().loadAutoDownloadConfig(false); loadAppConfig(); + thisDc = config.this_dc; maxMegagroupCount = config.megagroup_size_max; maxGroupCount = config.chat_size_max; maxEditTime = config.edit_time_limit; @@ -2189,7 +2300,7 @@ public class MessagesController extends BaseController implements NotificationCe oldUser.photo = user.photo; oldUser.flags |= 32; } else { - oldUser.flags = oldUser.flags &~ 32; + oldUser.flags = oldUser.flags & ~32; oldUser.photo = null; } } @@ -2223,7 +2334,7 @@ public class MessagesController extends BaseController implements NotificationCe user.photo = oldUser.photo; user.flags |= 32; } else { - user.flags = user.flags &~ 32; + user.flags = user.flags & ~32; user.photo = null; } users.put(user.id, user); @@ -2287,7 +2398,7 @@ public class MessagesController extends BaseController implements NotificationCe oldChat.username = chat.username; oldChat.flags |= 64; } else { - oldChat.flags = oldChat.flags &~ 64; + oldChat.flags = oldChat.flags & ~64; oldChat.username = null; } if (chat.participants_count != 0) { @@ -2314,19 +2425,19 @@ public class MessagesController extends BaseController implements NotificationCe int newFlags2 = chat.default_banned_rights != null ? chat.default_banned_rights.flags : 0; oldChat.default_banned_rights = chat.default_banned_rights; if (oldChat.default_banned_rights == null) { - oldChat.flags &=~ 262144; + oldChat.flags &= ~262144; } else { oldChat.flags |= 262144; } oldChat.banned_rights = chat.banned_rights; if (oldChat.banned_rights == null) { - oldChat.flags &=~ 32768; + oldChat.flags &= ~32768; } else { oldChat.flags |= 32768; } oldChat.admin_rights = chat.admin_rights; if (oldChat.admin_rights == null) { - oldChat.flags &=~ 16384; + oldChat.flags &= ~16384; } else { oldChat.flags |= 16384; } @@ -2361,7 +2472,7 @@ public class MessagesController extends BaseController implements NotificationCe chat.username = oldChat.username; chat.flags |= 64; } else { - chat.flags = chat.flags &~ 64; + chat.flags = chat.flags & ~64; chat.username = null; } if (oldChat.participants_count != 0 && chat.participants_count == 0) { @@ -2925,7 +3036,7 @@ public class MessagesController extends BaseController implements NotificationCe SharedPreferences.Editor editor = notificationsPreferences.edit(); boolean bar_hidden = !settings.report_spam && !settings.add_contact && !settings.block_contact && !settings.share_contact && !settings.report_geo; if (BuildVars.LOGS_ENABLED) { - FileLog.d("peer settings loaded for " + dialogId + " add = " + settings.add_contact + " block = " + settings.block_contact + " spam = " + settings.report_spam + " share = " + settings.share_contact + " geo = " + settings.report_geo + " hide = " + bar_hidden); + FileLog.d("peer settings loaded for " + dialogId + " add = " + settings.add_contact + " block = " + settings.block_contact + " spam = " + settings.report_spam + " share = " + settings.share_contact + " geo = " + settings.report_geo + " hide = " + bar_hidden); } editor.putInt("dialog_bar_vis3" + dialogId, bar_hidden ? 1 : 2); editor.putBoolean("dialog_bar_share" + dialogId, settings.share_contact); @@ -2976,7 +3087,7 @@ public class MessagesController extends BaseController implements NotificationCe })); } - protected void processNewChannelDifferenceParams(int pts, int pts_count, int channelId) { + public void processNewChannelDifferenceParams(int pts, int pts_count, int channelId) { if (BuildVars.LOGS_ENABLED) { FileLog.d("processNewChannelDifferenceParams pts = " + pts + " pts_count = " + pts_count + " channeldId = " + channelId); } @@ -3322,7 +3433,7 @@ public class MessagesController extends BaseController implements NotificationCe loadingBlockedUsers = true; TLRPC.TL_contacts_getBlocked req = new TLRPC.TL_contacts_getBlocked(); req.offset = reset ? 0 : blockedUsers.size(); - req.limit = reset ? 20 : 100; + req.limit = 100; getConnectionsManager().sendRequest(req, (response, error) -> AndroidUtilities.runOnUIThread(() -> { if (response != null) { TLRPC.contacts_Blocked res = (TLRPC.contacts_Blocked) response; @@ -3343,6 +3454,38 @@ public class MessagesController extends BaseController implements NotificationCe })); } + public void unblockAllUsers() { + + if (totalBlockedCount == 0) return; + + if (blockedUsers.size() == 0) getBlockedUsers(true); + + SparseIntArray blockedCopy = blockedUsers.clone(); + + if (blockedCopy.size() == 0) return; + + for (int index = 0; index < blockedCopy.size(); index++) { + + TLRPC.TL_contacts_unblock req = new TLRPC.TL_contacts_unblock(); + int user_id = blockedCopy.keyAt(index); + req.id = getInputUser(user_id); + getConnectionsManager().sendRequest(req, (response, error) -> { + + totalBlockedCount--; + blockedUsers.delete(user_id); + + UIUtil.runOnUIThread(() -> getNotificationCenter().postNotificationName(NotificationCenter.blockedUsersDidLoad)); + + }); + + ThreadUtil.sleep(233); + + } + + unblockAllUsers(); + + } + public void deleteUserPhoto(TLRPC.InputPhoto photo) { if (photo == null) { TLRPC.TL_photos_updateProfilePhoto req = new TLRPC.TL_photos_updateProfilePhoto(); @@ -4135,7 +4278,7 @@ public class MessagesController extends BaseController implements NotificationCe } public void saveRecentSticker(Object parentObject, TLRPC.Document document, boolean asMask) { - if (parentObject == null || document == null) { + if (document == null) { return; } TLRPC.TL_messages_saveRecentSticker req = new TLRPC.TL_messages_saveRecentSticker(); @@ -4226,6 +4369,7 @@ public class MessagesController extends BaseController implements NotificationCe checkReadTasks(); if (getUserConfig().isClientActivated() && !getUserConfig().isBot) { + if (getConnectionsManager().getPauseTime() == 0 && ApplicationLoader.isScreenOn && !ApplicationLoader.mainInterfacePausedStageQueue) { if (ApplicationLoader.mainInterfacePausedStageQueueTime != 0 && Math.abs(ApplicationLoader.mainInterfacePausedStageQueueTime - System.currentTimeMillis()) > 1000) { if (statusSettingState != 1 && (lastStatusUpdateTime == 0 || Math.abs(System.currentTimeMillis() - lastStatusUpdateTime) >= 55000 || offlineSent)) { @@ -4485,6 +4629,9 @@ public class MessagesController extends BaseController implements NotificationCe AndroidUtilities.runOnUIThread(passwordCheckRunnable); lastPasswordCheckTime = currentTime; } + if (lastPushRegisterSendTime != 0 && Math.abs(SystemClock.elapsedRealtime() - lastPushRegisterSendTime) >= 3 * 60 * 60 * 1000) { + ExternalGcm.sendRegistrationToServer(); + } getLocationController().update(); checkPromoInfoInternal(false); checkTosUpdate(); @@ -4532,12 +4679,12 @@ public class MessagesController extends BaseController implements NotificationCe String proxyAddress = preferences.getString("proxy_ip", ""); String proxySecret = preferences.getString("proxy_secret", ""); int removeCurrent = 0; - if (promoDialogId != 0 && promoDialogType == PROMO_TYPE_PROXY && proxyDialogAddress != null && !proxyDialogAddress.equals(proxyAddress + proxySecret)) { + if ((promoDialogId != 0 && promoDialogType == PROMO_TYPE_PROXY && proxyDialogAddress != null && !proxyDialogAddress.equals(proxyAddress + proxySecret))) { removeCurrent = 1; } lastCheckPromoId++; - checkingPromoInfo = true; + int checkPromoId = lastCheckPromoId; TLRPC.TL_help_getPromoData req = new TLRPC.TL_help_getPromoData(); checkingPromoInfoRequestId = getConnectionsManager().sendRequest(req, (response, error) -> { @@ -4552,204 +4699,207 @@ public class MessagesController extends BaseController implements NotificationCe } else if (response instanceof TLRPC.TL_help_promoData) { final TLRPC.TL_help_promoData res = (TLRPC.TL_help_promoData) response; - final long did; - if (res.peer.user_id != 0) { - did = res.peer.user_id; - } else if (res.peer.chat_id != 0) { - did = -res.peer.chat_id; - for (int a = 0; a < res.chats.size(); a++) { - TLRPC.Chat chat = res.chats.get(a); - if (chat.id == res.peer.chat_id) { - if (chat.kicked || chat.restricted) { - noDialog = true; + if (res.proxy && NekoConfig.hideProxySponsorChannel) { + nextPromoInfoCheckTime = getConnectionsManager().getCurrentTime() + 60 * 60; + noDialog = true; + } else { + + final long did; + if (res.peer.user_id != 0) { + did = res.peer.user_id; + } else if (res.peer.chat_id != 0) { + did = -res.peer.chat_id; + for (int a = 0; a < res.chats.size(); a++) { + TLRPC.Chat chat = res.chats.get(a); + if (chat.id == res.peer.chat_id) { + if (chat.kicked || chat.restricted) { + noDialog = true; + } + break; + } + } + } else { + did = -res.peer.channel_id; + for (int a = 0; a < res.chats.size(); a++) { + TLRPC.Chat chat = res.chats.get(a); + if (chat.id == res.peer.channel_id) { + if (chat.kicked || chat.restricted) { + noDialog = true; + } + break; } - break; } } - } else { - did = -res.peer.channel_id; - for (int a = 0; a < res.chats.size(); a++) { - TLRPC.Chat chat = res.chats.get(a); - if (chat.id == res.peer.channel_id) { - if (chat.kicked || chat.restricted) { - noDialog = true; - } - break; - } + promoDialogId = did; + if (res.proxy) { + promoDialogType = PROMO_TYPE_PROXY; + } else if (!TextUtils.isEmpty(res.psa_type)) { + promoDialogType = PROMO_TYPE_PSA; + promoPsaType = res.psa_type; + } else { + promoDialogType = PROMO_TYPE_OTHER; } - } - promoDialogId = did; - if (res.proxy) { - promoDialogType = PROMO_TYPE_PROXY; - if (NekoConfig.hideProxySponsorChannel) { - noDialog = true; + proxyDialogAddress = proxyAddress + proxySecret; + promoPsaMessage = res.psa_message; + nextPromoInfoCheckTime = res.expires; + SharedPreferences.Editor editor = getGlobalMainSettings().edit(); + editor.putLong("proxy_dialog", promoDialogId); + editor.putString("proxyDialogAddress", proxyDialogAddress); + editor.putInt("promo_dialog_type", promoDialogType); + if (promoPsaMessage != null) { + editor.putString("promo_psa_message", promoPsaMessage); + } else { + editor.remove("promo_psa_message"); } - } else if (!TextUtils.isEmpty(res.psa_type)) { - promoDialogType = PROMO_TYPE_PSA; - promoPsaType = res.psa_type; - } else { - promoDialogType = PROMO_TYPE_OTHER; - } - proxyDialogAddress = proxyAddress + proxySecret; - promoPsaMessage = res.psa_message; - nextPromoInfoCheckTime = res.expires; - SharedPreferences.Editor editor = getGlobalMainSettings().edit(); - editor.putLong("proxy_dialog", promoDialogId); - editor.putString("proxyDialogAddress", proxyDialogAddress); - editor.putInt("promo_dialog_type", promoDialogType); - if (promoPsaMessage != null) { - editor.putString("promo_psa_message", promoPsaMessage); - } else { - editor.remove("promo_psa_message"); - } - if (promoPsaType != null) { - editor.putString("promo_psa_type", promoPsaType); - } else { - editor.remove("promo_psa_type"); - } - editor.putInt("nextPromoInfoCheckTime", nextPromoInfoCheckTime); - editor.commit(); + if (promoPsaType != null) { + editor.putString("promo_psa_type", promoPsaType); + } else { + editor.remove("promo_psa_type"); + } + editor.putInt("nextPromoInfoCheckTime", nextPromoInfoCheckTime); + editor.commit(); - if (!noDialog) { - AndroidUtilities.runOnUIThread(() -> { - if (promoDialog != null && did != promoDialog.id) { - removePromoDialog(); - } - promoDialog = dialogs_dict.get(did); - - if (promoDialog != null) { - checkingPromoInfo = false; - sortDialogs(null); - getNotificationCenter().postNotificationName(NotificationCenter.dialogsNeedReload, true); - } else { - final SparseArray usersDict = new SparseArray<>(); - final SparseArray chatsDict = new SparseArray<>(); - for (int a = 0; a < res.users.size(); a++) { - TLRPC.User u = res.users.get(a); - usersDict.put(u.id, u); - } - for (int a = 0; a < res.chats.size(); a++) { - TLRPC.Chat c = res.chats.get(a); - chatsDict.put(c.id, c); + if (!noDialog) { + AndroidUtilities.runOnUIThread(() -> { + if (promoDialog != null && did != promoDialog.id) { + removePromoDialog(); } + promoDialog = dialogs_dict.get(did); - TLRPC.TL_messages_getPeerDialogs req1 = new TLRPC.TL_messages_getPeerDialogs(); - TLRPC.TL_inputDialogPeer peer = new TLRPC.TL_inputDialogPeer(); - if (res.peer.user_id != 0) { - peer.peer = new TLRPC.TL_inputPeerUser(); - peer.peer.user_id = res.peer.user_id; - TLRPC.User user = usersDict.get(res.peer.user_id); - if (user != null) { - peer.peer.access_hash = user.access_hash; - } - } else if (res.peer.chat_id != 0) { - peer.peer = new TLRPC.TL_inputPeerChat(); - peer.peer.chat_id = res.peer.chat_id; - TLRPC.Chat chat = chatsDict.get(res.peer.chat_id); - if (chat != null) { - peer.peer.access_hash = chat.access_hash; - } - } else { - peer.peer = new TLRPC.TL_inputPeerChannel(); - peer.peer.channel_id = res.peer.channel_id; - TLRPC.Chat chat = chatsDict.get(res.peer.channel_id); - if (chat != null) { - peer.peer.access_hash = chat.access_hash; - } - } - - req1.peers.add(peer); - checkingPromoInfoRequestId = getConnectionsManager().sendRequest(req1, (response1, error1) -> { - if (checkPromoId != lastCheckPromoId) { - return; - } - checkingPromoInfoRequestId = 0; - final TLRPC.TL_messages_peerDialogs res2 = (TLRPC.TL_messages_peerDialogs) response1; - if (res2 != null && !res2.dialogs.isEmpty()) { - getMessagesStorage().putUsersAndChats(res.users, res.chats, true, true); - TLRPC.TL_messages_dialogs dialogs = new TLRPC.TL_messages_dialogs(); - dialogs.chats = res2.chats; - dialogs.users = res2.users; - dialogs.dialogs = res2.dialogs; - dialogs.messages = res2.messages; - getMessagesStorage().putDialogs(dialogs, 2); - AndroidUtilities.runOnUIThread(() -> { - putUsers(res.users, false); - putChats(res.chats, false); - putUsers(res2.users, false); - putChats(res2.chats, false); - - if (promoDialog != null) { - int lowerId = (int) promoDialog.id; - if (lowerId < 0) { - TLRPC.Chat chat = getChat(-lowerId); - if (ChatObject.isNotInChat(chat) || chat.restricted) { - removeDialog(promoDialog); - } - } else { - removeDialog(promoDialog); - } - } - - promoDialog = res2.dialogs.get(0); - promoDialog.id = did; - promoDialog.folder_id = 0; - if (DialogObject.isChannel(promoDialog)) { - channelsPts.put(-(int) promoDialog.id, promoDialog.pts); - } - Integer value = dialogs_read_inbox_max.get(promoDialog.id); - if (value == null) { - value = 0; - } - dialogs_read_inbox_max.put(promoDialog.id, Math.max(value, promoDialog.read_inbox_max_id)); - value = dialogs_read_outbox_max.get(promoDialog.id); - if (value == null) { - value = 0; - } - dialogs_read_outbox_max.put(promoDialog.id, Math.max(value, promoDialog.read_outbox_max_id)); - dialogs_dict.put(did, promoDialog); - if (!res2.messages.isEmpty()) { - final SparseArray usersDict1 = new SparseArray<>(); - final SparseArray chatsDict1 = new SparseArray<>(); - for (int a = 0; a < res2.users.size(); a++) { - TLRPC.User u = res2.users.get(a); - usersDict1.put(u.id, u); - } - for (int a = 0; a < res2.chats.size(); a++) { - TLRPC.Chat c = res2.chats.get(a); - chatsDict1.put(c.id, c); - } - MessageObject messageObject = new MessageObject(currentAccount, res2.messages.get(0), usersDict1, chatsDict1, false); - dialogMessage.put(did, messageObject); - if (promoDialog.last_message_date == 0) { - promoDialog.last_message_date = messageObject.messageOwner.date; - } - } - sortDialogs(null); - getNotificationCenter().postNotificationName(NotificationCenter.dialogsNeedReload, true); - }); - } else { - AndroidUtilities.runOnUIThread(() -> { - if (promoDialog != null) { - int lowerId = (int) promoDialog.id; - if (lowerId < 0) { - TLRPC.Chat chat = getChat(-lowerId); - if (ChatObject.isNotInChat(chat) || chat.restricted) { - removeDialog(promoDialog); - } - } else { - removeDialog(promoDialog); - } - promoDialog = null; - sortDialogs(null); - getNotificationCenter().postNotificationName(NotificationCenter.dialogsNeedReload); - } - }); - } + if (promoDialog != null) { checkingPromoInfo = false; - }); - } - }); + sortDialogs(null); + getNotificationCenter().postNotificationName(NotificationCenter.dialogsNeedReload, true); + } else { + final SparseArray usersDict = new SparseArray<>(); + final SparseArray chatsDict = new SparseArray<>(); + for (int a = 0; a < res.users.size(); a++) { + TLRPC.User u = res.users.get(a); + usersDict.put(u.id, u); + } + for (int a = 0; a < res.chats.size(); a++) { + TLRPC.Chat c = res.chats.get(a); + chatsDict.put(c.id, c); + } + + TLRPC.TL_messages_getPeerDialogs req1 = new TLRPC.TL_messages_getPeerDialogs(); + TLRPC.TL_inputDialogPeer peer = new TLRPC.TL_inputDialogPeer(); + if (res.peer.user_id != 0) { + peer.peer = new TLRPC.TL_inputPeerUser(); + peer.peer.user_id = res.peer.user_id; + TLRPC.User user = usersDict.get(res.peer.user_id); + if (user != null) { + peer.peer.access_hash = user.access_hash; + } + } else if (res.peer.chat_id != 0) { + peer.peer = new TLRPC.TL_inputPeerChat(); + peer.peer.chat_id = res.peer.chat_id; + TLRPC.Chat chat = chatsDict.get(res.peer.chat_id); + if (chat != null) { + peer.peer.access_hash = chat.access_hash; + } + } else { + peer.peer = new TLRPC.TL_inputPeerChannel(); + peer.peer.channel_id = res.peer.channel_id; + TLRPC.Chat chat = chatsDict.get(res.peer.channel_id); + if (chat != null) { + peer.peer.access_hash = chat.access_hash; + } + } + + req1.peers.add(peer); + checkingPromoInfoRequestId = getConnectionsManager().sendRequest(req1, (response1, error1) -> { + if (checkPromoId != lastCheckPromoId) { + return; + } + checkingPromoInfoRequestId = 0; + final TLRPC.TL_messages_peerDialogs res2 = (TLRPC.TL_messages_peerDialogs) response1; + if (res2 != null && !res2.dialogs.isEmpty()) { + getMessagesStorage().putUsersAndChats(res.users, res.chats, true, true); + TLRPC.TL_messages_dialogs dialogs = new TLRPC.TL_messages_dialogs(); + dialogs.chats = res2.chats; + dialogs.users = res2.users; + dialogs.dialogs = res2.dialogs; + dialogs.messages = res2.messages; + getMessagesStorage().putDialogs(dialogs, 2); + AndroidUtilities.runOnUIThread(() -> { + putUsers(res.users, false); + putChats(res.chats, false); + putUsers(res2.users, false); + putChats(res2.chats, false); + + if (promoDialog != null) { + int lowerId = (int) promoDialog.id; + if (lowerId < 0) { + TLRPC.Chat chat = getChat(-lowerId); + if (ChatObject.isNotInChat(chat) || chat.restricted) { + removeDialog(promoDialog); + } + } else { + removeDialog(promoDialog); + } + } + + promoDialog = res2.dialogs.get(0); + promoDialog.id = did; + promoDialog.folder_id = 0; + if (DialogObject.isChannel(promoDialog)) { + channelsPts.put(-(int) promoDialog.id, promoDialog.pts); + } + Integer value = dialogs_read_inbox_max.get(promoDialog.id); + if (value == null) { + value = 0; + } + dialogs_read_inbox_max.put(promoDialog.id, Math.max(value, promoDialog.read_inbox_max_id)); + value = dialogs_read_outbox_max.get(promoDialog.id); + if (value == null) { + value = 0; + } + dialogs_read_outbox_max.put(promoDialog.id, Math.max(value, promoDialog.read_outbox_max_id)); + dialogs_dict.put(did, promoDialog); + if (!res2.messages.isEmpty()) { + final SparseArray usersDict1 = new SparseArray<>(); + final SparseArray chatsDict1 = new SparseArray<>(); + for (int a = 0; a < res2.users.size(); a++) { + TLRPC.User u = res2.users.get(a); + usersDict1.put(u.id, u); + } + for (int a = 0; a < res2.chats.size(); a++) { + TLRPC.Chat c = res2.chats.get(a); + chatsDict1.put(c.id, c); + } + MessageObject messageObject = new MessageObject(currentAccount, res2.messages.get(0), usersDict1, chatsDict1, false); + dialogMessage.put(did, messageObject); + if (promoDialog.last_message_date == 0) { + promoDialog.last_message_date = messageObject.messageOwner.date; + } + } + sortDialogs(null); + getNotificationCenter().postNotificationName(NotificationCenter.dialogsNeedReload, true); + }); + } else { + AndroidUtilities.runOnUIThread(() -> { + if (promoDialog != null) { + int lowerId = (int) promoDialog.id; + if (lowerId < 0) { + TLRPC.Chat chat = getChat(-lowerId); + if (ChatObject.isNotInChat(chat) || chat.restricted) { + removeDialog(promoDialog); + } + } else { + removeDialog(promoDialog); + } + promoDialog = null; + sortDialogs(null); + getNotificationCenter().postNotificationName(NotificationCenter.dialogsNeedReload); + } + }); + } + checkingPromoInfo = false; + }); + } + }); + } } } else { nextPromoInfoCheckTime = getConnectionsManager().getCurrentTime() + 60 * 60; @@ -4931,6 +5081,7 @@ public class MessagesController extends BaseController implements NotificationCe } public void sendTyping(final long dialog_id, final int action, int classGuid) { + if (NekoConfig.disableChatAction) return; if (dialog_id == 0) { return; } @@ -6670,7 +6821,7 @@ public class MessagesController extends BaseController implements NotificationCe allDialogs.add(dialogs_dict.valueAt(a)); } sortDialogs(migrate ? chatsDict : null); - + putAllNeededDraftDialogs(); if (loadType != DIALOGS_LOAD_TYPE_CHANNEL && loadType != DIALOGS_LOAD_TYPE_UNKNOWN) { @@ -8167,9 +8318,11 @@ public class MessagesController extends BaseController implements NotificationCe if (ConnectionsManager.native_isTestBackend(currentAccount) != 0) { ConnectionsManager.native_switchBackend(currentAccount); } + MessagesController.getMainSettings(currentAccount).edit().remove("custom_dc").apply(); } private boolean gettingAppChangelog; + public void generateUpdateMessage() { if (gettingAppChangelog || BuildVars.DEBUG_VERSION || SharedConfig.lastUpdateVersion == null || SharedConfig.lastUpdateVersion.equals(BuildVars.BUILD_VERSION_STRING)) { return; @@ -12295,7 +12448,9 @@ public class MessagesController extends BaseController implements NotificationCe continue; } sortingDialogFilter = selectedDialogFilter[b]; + Collections.sort(allDialogs, dialogDateComparator); + ArrayList dialogsByFilter = selectedDialogFilter[b].dialogs; for (int a = 0, N = allDialogs.size(); a < N; a++) { @@ -12317,7 +12472,28 @@ public class MessagesController extends BaseController implements NotificationCe } } - Collections.sort(allDialogs, dialogComparator); + try { + + Collections.sort(allDialogs, dialogComparator); + + } catch (Exception e) { + + NekoConfig.sortByUnread = false; + NekoConfig.sortByUnmuted = false; + NekoConfig.sortByUser = false; + NekoConfig.sortByContacts = false; + + try { + + Collections.sort(allDialogs, dialogComparator); + + } catch (Exception ex) { + + FileLog.e(ex); + + } + + } isLeftPromoChannel = true; if (promoDialog != null && promoDialog.id < 0) { TLRPC.Chat chat = getChat(-(int) promoDialog.id); @@ -12447,14 +12623,7 @@ public class MessagesController extends BaseController implements NotificationCe } private static void showCantOpenAlert(BaseFragment fragment, String reason) { - if (fragment == null || fragment.getParentActivity() == null) { - return; - } - AlertDialog.Builder builder = new AlertDialog.Builder(fragment.getParentActivity()); - builder.setTitle(LocaleController.getString("AppName", R.string.AppName)); - builder.setPositiveButton(LocaleController.getString("OK", R.string.OK), null); - builder.setMessage(reason); - fragment.showDialog(builder.create()); + AlertUtil.showToast(reason); } public boolean checkCanOpenChat(Bundle bundle, BaseFragment fragment) { diff --git a/TMessagesProj/src/main/java/org/telegram/messenger/MessagesStorage.java b/TMessagesProj/src/main/java/org/telegram/messenger/MessagesStorage.java index 6440437aa..7d2edd468 100644 --- a/TMessagesProj/src/main/java/org/telegram/messenger/MessagesStorage.java +++ b/TMessagesProj/src/main/java/org/telegram/messenger/MessagesStorage.java @@ -14,6 +14,8 @@ import android.util.LongSparseArray; import android.util.SparseArray; import android.util.SparseIntArray; +import androidx.annotation.UiThread; + import org.telegram.PhoneFormat.PhoneFormat; import org.telegram.SQLite.SQLiteCursor; import org.telegram.SQLite.SQLiteDatabase; @@ -37,7 +39,7 @@ import java.util.Map; import java.util.concurrent.CountDownLatch; import java.util.concurrent.atomic.AtomicLong; -import androidx.annotation.UiThread; +import tw.nekomimi.nekogram.NekoConfig; public class MessagesStorage extends BaseController { @@ -1874,6 +1876,9 @@ public class MessagesStorage extends BaseController { continue; } flags = filter.flags; + if (NekoConfig.ignoreMutedCount && (flags & MessagesController.DIALOG_FILTER_FLAG_EXCLUDE_MUTED) == 0) { + flags |= MessagesController.DIALOG_FILTER_FLAG_EXCLUDE_MUTED; + } } else { filter = null; flags = MessagesController.DIALOG_FILTER_FLAG_ALL_CHATS; @@ -3897,6 +3902,9 @@ public class MessagesStorage extends BaseController { } unreadCount = filter.pendingUnreadCount; flags = filter.flags; + if (NekoConfig.ignoreMutedCount && (flags & MessagesController.DIALOG_FILTER_FLAG_EXCLUDE_MUTED) == 0) { + flags |= MessagesController.DIALOG_FILTER_FLAG_EXCLUDE_MUTED; + } } else { filter = null; flags = MessagesController.DIALOG_FILTER_FLAG_ALL_CHATS; diff --git a/TMessagesProj/src/main/java/org/telegram/ui/CameraScanActivity.java b/TMessagesProj/src/main/java/org/telegram/ui/CameraScanActivity.java index 224a01716..79e0b69a4 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/CameraScanActivity.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/CameraScanActivity.java @@ -89,6 +89,7 @@ public class CameraScanActivity extends BaseFragment implements Camera.PreviewCa //private BarcodeDetector visionQrReader; private boolean needGalleryButton; + private boolean any; private int currentType; @@ -160,6 +161,62 @@ public class CameraScanActivity extends BaseFragment implements Camera.PreviewCa return actionBarLayout; } + public static ActionBarLayout[] showAsSheet(BaseFragment parentFragment, CameraScanActivityDelegate delegate) { + if (parentFragment == null || parentFragment.getParentActivity() == null) { + return null; + } + ActionBarLayout[] actionBarLayout = new ActionBarLayout[]{new ActionBarLayout(parentFragment.getParentActivity())}; + BottomSheet bottomSheet = new BottomSheet(parentFragment.getParentActivity(), false) { + { + actionBarLayout[0].init(new ArrayList<>()); + CameraScanActivity fragment = new CameraScanActivity(TYPE_QR) { + @Override + public void finishFragment() { + dismiss(); + } + + @Override + public void removeSelfFromStack() { + dismiss(); + } + }; + fragment.needGalleryButton = true; + fragment.any = true; + actionBarLayout[0].addFragmentToStack(fragment); + actionBarLayout[0].showLastFragment(); + actionBarLayout[0].setPadding(backgroundPaddingLeft, 0, backgroundPaddingLeft, 0); + fragment.setDelegate(delegate); + containerView = actionBarLayout[0]; + setApplyBottomPadding(false); + setApplyBottomPadding(false); + setOnDismissListener(dialog -> fragment.onFragmentDestroy()); + } + + @Override + protected boolean canDismissWithSwipe() { + return false; + } + + @Override + public void onBackPressed() { + if (actionBarLayout[0] == null || actionBarLayout[0].fragmentsStack.size() <= 1) { + super.onBackPressed(); + } else { + actionBarLayout[0].onBackPressed(); + } + } + + @Override + public void dismiss() { + super.dismiss(); + actionBarLayout[0] = null; + } + }; + + bottomSheet.show(); + return actionBarLayout; + } + public CameraScanActivity(int type) { super(); CameraController.getInstance().initCamera(() -> { @@ -627,6 +684,7 @@ public class CameraScanActivity extends BaseFragment implements Camera.PreviewCa onNoQrFound(); return null; } + if (any) return text; if (needGalleryButton) { if (!text.startsWith("ton://transfer/")) { //onNoWalletFound(bitmap != null); diff --git a/TMessagesProj/src/main/java/org/telegram/ui/Cells/DrawerProfileCell.java b/TMessagesProj/src/main/java/org/telegram/ui/Cells/DrawerProfileCell.java index 8f910ba07..5099b5559 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/Cells/DrawerProfileCell.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/Cells/DrawerProfileCell.java @@ -8,9 +8,7 @@ package org.telegram.ui.Cells; -import android.app.Activity; import android.content.Context; -import android.content.SharedPreferences; import android.graphics.Bitmap; import android.graphics.Canvas; import android.graphics.Paint; @@ -21,7 +19,6 @@ import android.graphics.drawable.BitmapDrawable; import android.graphics.drawable.ColorDrawable; import android.graphics.drawable.Drawable; import android.graphics.drawable.GradientDrawable; -import android.graphics.drawable.RippleDrawable; import android.os.Build; import android.text.TextUtils; import android.util.TypedValue; @@ -29,23 +26,20 @@ import android.view.Gravity; import android.widget.FrameLayout; import android.widget.ImageView; import android.widget.TextView; -import android.widget.Toast; import org.telegram.PhoneFormat.PhoneFormat; import org.telegram.messenger.AndroidUtilities; -import org.telegram.messenger.ApplicationLoader; +import org.telegram.messenger.FileLog; import org.telegram.messenger.ImageLocation; import org.telegram.messenger.LocaleController; -import org.telegram.messenger.NotificationCenter; -import org.telegram.messenger.UserObject; -import org.telegram.messenger.FileLog; import org.telegram.messenger.R; +import org.telegram.messenger.UserObject; import org.telegram.tgnet.TLRPC; +import org.telegram.ui.ActionBar.Theme; import org.telegram.ui.Components.AvatarDrawable; import org.telegram.ui.Components.BackupImageView; import org.telegram.ui.Components.CubicBezierInterpolator; import org.telegram.ui.Components.LayoutHelper; -import org.telegram.ui.ActionBar.Theme; import org.telegram.ui.Components.SnowflakesEffect; import tw.nekomimi.nekogram.NekoConfig; @@ -58,7 +52,6 @@ public class DrawerProfileCell extends FrameLayout { private TextView phoneTextView; private ImageView shadowView; private ImageView arrowView; - private ImageView darkThemeView; private Rect srcRect = new Rect(); private Rect destRect = new Rect(); @@ -70,6 +63,8 @@ public class DrawerProfileCell extends FrameLayout { private boolean accountsShown; private int darkThemeBackgroundColor; + private TLRPC.User user; + public DrawerProfileCell(Context context) { super(context); @@ -111,52 +106,6 @@ public class DrawerProfileCell extends FrameLayout { addView(arrowView, LayoutHelper.createFrame(59, 59, Gravity.RIGHT | Gravity.BOTTOM)); setArrowState(false); - darkThemeView = new ImageView(context); - darkThemeView.setScaleType(ImageView.ScaleType.CENTER); - darkThemeView.setImageResource(R.drawable.menu_night); - darkThemeView.setColorFilter(new PorterDuffColorFilter(Theme.getColor(Theme.key_chats_menuName), PorterDuff.Mode.MULTIPLY)); - if (Build.VERSION.SDK_INT >= 21) { - darkThemeView.setBackgroundDrawable(Theme.createSelectorDrawable(darkThemeBackgroundColor = Theme.getColor(Theme.key_listSelector), 1, AndroidUtilities.dp(17))); - Theme.setRippleDrawableForceSoftware((RippleDrawable) darkThemeView.getBackground()); - } - darkThemeView.setOnClickListener(v -> { - SharedPreferences preferences = ApplicationLoader.applicationContext.getSharedPreferences("themeconfig", Activity.MODE_PRIVATE); - String dayThemeName = preferences.getString("lastDayTheme", "Blue"); - if (Theme.getTheme(dayThemeName) == null) { - dayThemeName = "Blue"; - } - String nightThemeName = preferences.getString("lastDarkTheme", "Dark Blue"); - if (Theme.getTheme(nightThemeName) == null) { - nightThemeName = "Dark Blue"; - } - Theme.ThemeInfo themeInfo = Theme.getActiveTheme(); - if (dayThemeName.equals(nightThemeName)) { - if (themeInfo.isDark()) { - dayThemeName = "Blue"; - } else { - nightThemeName = "Dark Blue"; - } - } - - if (dayThemeName.equals(themeInfo.getKey())) { - themeInfo = Theme.getTheme(nightThemeName); - } else { - themeInfo = Theme.getTheme(dayThemeName); - } - if (Theme.selectedAutoNightType != Theme.AUTO_NIGHT_TYPE_NONE) { - Toast.makeText(getContext(), LocaleController.getString("AutoNightModeOff", R.string.AutoNightModeOff), Toast.LENGTH_SHORT).show(); - Theme.selectedAutoNightType = Theme.AUTO_NIGHT_TYPE_NONE; - Theme.saveAutoNightThemeConfig(); - Theme.cancelAutoNightThemeCallbacks(); - } - int[] pos = new int[2]; - darkThemeView.getLocationInWindow(pos); - pos[0] += darkThemeView.getMeasuredWidth() / 2; - pos[1] += darkThemeView.getMeasuredHeight() / 2; - NotificationCenter.getGlobalInstance().postNotificationName(NotificationCenter.needSetDayNightTheme, themeInfo, false, pos, -1); - }); - addView(darkThemeView, LayoutHelper.createFrame(48, 48, Gravity.RIGHT | Gravity.BOTTOM, 0, 0, 6, 90)); - if (Theme.getEventType() == 0) { snowflakesEffect = new SnowflakesEffect(); snowflakesEffect.setColorKey(Theme.key_chats_menuName); @@ -183,6 +132,12 @@ public class DrawerProfileCell extends FrameLayout { } } + private boolean useAdb() { + + return NekoConfig.avatarAsDrawerBackground && ImageLocation.isUserHasPhoto(user); + + } + @Override protected void onDraw(Canvas canvas) { Drawable backgroundDrawable = Theme.getCachedWallpaper(); @@ -190,8 +145,7 @@ public class DrawerProfileCell extends FrameLayout { boolean useImageBackground = !backgroundKey.equals(Theme.key_chats_menuTopBackground) && Theme.isCustomTheme() && !Theme.isPatternWallpaper() && backgroundDrawable != null && !(backgroundDrawable instanceof ColorDrawable) && !(backgroundDrawable instanceof GradientDrawable); boolean drawCatsShadow = false; int color; - int darkBackColor = 0; - if (!NekoConfig.avatarAsDrawerBackground && !useImageBackground && Theme.hasThemeKey(Theme.key_chats_menuTopShadowCats)) { + if (!useAdb() && !useImageBackground && Theme.hasThemeKey(Theme.key_chats_menuTopShadowCats)) { color = Theme.getColor(Theme.key_chats_menuTopShadowCats); drawCatsShadow = true; } else { @@ -203,15 +157,10 @@ public class DrawerProfileCell extends FrameLayout { } if (currentColor == null || currentColor != color) { currentColor = color; - shadowView.getDrawable().setColorFilter(new PorterDuffColorFilter(color, PorterDuff.Mode.MULTIPLY)); - } - color = Theme.getColor(Theme.key_chats_menuName); - if (currentMoonColor == null || currentColor != color) { - currentMoonColor = color; - darkThemeView.getDrawable().setColorFilter(new PorterDuffColorFilter(color, PorterDuff.Mode.MULTIPLY)); + shadowView.getDrawable().setColorFilter(new PorterDuffColorFilter(color, PorterDuff.Mode.SRC_IN)); } nameTextView.setTextColor(Theme.getColor(Theme.key_chats_menuName)); - if (NekoConfig.avatarAsDrawerBackground || useImageBackground) { + if (useAdb() || useImageBackground) { phoneTextView.setTextColor(Theme.getColor(Theme.key_chats_menuPhone)); if (shadowView.getVisibility() != VISIBLE) { shadowView.setVisibility(VISIBLE); @@ -219,7 +168,6 @@ public class DrawerProfileCell extends FrameLayout { if (backgroundDrawable instanceof ColorDrawable || backgroundDrawable instanceof GradientDrawable) { backgroundDrawable.setBounds(0, 0, getMeasuredWidth(), getMeasuredHeight()); backgroundDrawable.draw(canvas); - darkBackColor = Theme.getColor(Theme.key_listSelector); } else if (backgroundDrawable instanceof BitmapDrawable) { Bitmap bitmap = ((BitmapDrawable) backgroundDrawable).getBitmap(); float scaleX = (float) getMeasuredWidth() / (float) bitmap.getWidth(); @@ -236,7 +184,6 @@ public class DrawerProfileCell extends FrameLayout { } catch (Throwable e) { FileLog.e(e); } - darkBackColor = (Theme.getServiceMessageColor() & 0x00ffffff) | 0x50000000; } } else { int visibility = drawCatsShadow? VISIBLE : INVISIBLE; @@ -245,19 +192,6 @@ public class DrawerProfileCell extends FrameLayout { } phoneTextView.setTextColor(Theme.getColor(Theme.key_chats_menuPhoneCats)); super.onDraw(canvas); - darkBackColor = Theme.getColor(Theme.key_listSelector); - } - - if (darkBackColor != 0) { - if (darkBackColor != darkThemeBackgroundColor) { - backPaint.setColor(darkThemeBackgroundColor = darkBackColor); - if (Build.VERSION.SDK_INT >= 21) { - Theme.setSelectorDrawableColor(darkThemeView.getBackground(), darkThemeBackgroundColor = darkBackColor, true); - } - } - if (useImageBackground && backgroundDrawable instanceof BitmapDrawable) { - canvas.drawCircle(darkThemeView.getX() + darkThemeView.getMeasuredWidth() / 2, darkThemeView.getY() + darkThemeView.getMeasuredHeight() / 2, AndroidUtilities.dp(17), backPaint); - } } if (snowflakesEffect != null) { @@ -281,6 +215,7 @@ public class DrawerProfileCell extends FrameLayout { if (user == null) { return; } + this.user = user; accountsShown = accounts; setArrowState(false); nameTextView.setText(UserObject.getUserName(user)); @@ -294,7 +229,7 @@ public class DrawerProfileCell extends FrameLayout { AvatarDrawable avatarDrawable = new AvatarDrawable(user); avatarDrawable.setColor(Theme.getColor(Theme.key_avatar_backgroundInProfileBlue)); avatarImageView.setImage(ImageLocation.getForUser(user, false), "50_50", avatarDrawable, user); - if (NekoConfig.avatarAsDrawerBackground) { + if (useAdb()) { avatarBackgroundView.setImage(ImageLocation.getForUser(user, true), "512_512", avatarDrawable, user); avatarBackgroundView.setVisibility(VISIBLE); avatarImageView.setVisibility(INVISIBLE); diff --git a/TMessagesProj/src/main/java/org/telegram/ui/ChannelAdminLogActivity.java b/TMessagesProj/src/main/java/org/telegram/ui/ChannelAdminLogActivity.java index 8706c388b..a00325d36 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/ChannelAdminLogActivity.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/ChannelAdminLogActivity.java @@ -116,6 +116,10 @@ import java.util.ArrayList; import java.util.Calendar; import java.util.HashMap; +import tw.nekomimi.nekogram.NekoConfig; +import tw.nekomimi.nekogram.NekoXConfig; +import tw.nekomimi.nekogram.utils.AlertUtil; + public class ChannelAdminLogActivity extends BaseFragment implements NotificationCenter.NotificationCenterDelegate { protected TLRPC.Chat currentChat; @@ -891,7 +895,7 @@ public class ChannelAdminLogActivity extends BaseFragment implements Notificatio bottomOverlayImage = new ImageView(context); bottomOverlayImage.setImageResource(R.drawable.log_info); - bottomOverlayImage.setColorFilter(new PorterDuffColorFilter(Theme.getColor(Theme.key_chat_fieldOverlayText), PorterDuff.Mode.MULTIPLY)); + bottomOverlayImage.setColorFilter(new PorterDuffColorFilter(Theme.getColor(Theme.key_chat_fieldOverlayText), PorterDuff.Mode.SRC_IN)); bottomOverlayImage.setScaleType(ImageView.ScaleType.CENTER); bottomOverlayChat.addView(bottomOverlayImage, LayoutHelper.createFrame(48, 48, Gravity.RIGHT | Gravity.TOP, 3, 0, 0, 0)); bottomOverlayImage.setContentDescription(LocaleController.getString("BotHelp", R.string.BotHelp)); @@ -927,7 +931,7 @@ public class ChannelAdminLogActivity extends BaseFragment implements Notificatio /*searchUpButton = new ImageView(context); searchUpButton.setScaleType(ImageView.ScaleType.CENTER); searchUpButton.setImageResource(R.drawable.msg_go_up); - searchUpButton.setColorFilter(new PorterDuffColorFilter(Theme.getColor(Theme.key_chat_searchPanelIcons), PorterDuff.Mode.MULTIPLY)); + searchUpButton.setColorFilter(new PorterDuffColorFilter(Theme.getColor(Theme.key_chat_searchPanelIcons), PorterDuff.Mode.SRC_IN)); searchContainer.addView(searchUpButton, LayoutHelper.createFrame(48, 48)); searchUpButton.setOnClickListener(new View.OnClickListener() { @Override @@ -939,7 +943,7 @@ public class ChannelAdminLogActivity extends BaseFragment implements Notificatio searchDownButton = new ImageView(context); searchDownButton.setScaleType(ImageView.ScaleType.CENTER); searchDownButton.setImageResource(R.drawable.msg_go_down); - searchDownButton.setColorFilter(new PorterDuffColorFilter(Theme.getColor(Theme.key_chat_searchPanelIcons), PorterDuff.Mode.MULTIPLY)); + searchDownButton.setColorFilter(new PorterDuffColorFilter(Theme.getColor(Theme.key_chat_searchPanelIcons), PorterDuff.Mode.SRC_IN)); searchContainer.addView(searchDownButton, LayoutHelper.createFrame(48, 48, Gravity.LEFT | Gravity.TOP, 48, 0, 0, 0)); searchDownButton.setOnClickListener(new View.OnClickListener() { @Override @@ -950,8 +954,8 @@ public class ChannelAdminLogActivity extends BaseFragment implements Notificatio searchCalendarButton = new ImageView(context); searchCalendarButton.setScaleType(ImageView.ScaleType.CENTER); - searchCalendarButton.setImageResource(R.drawable.msg_calendar); - searchCalendarButton.setColorFilter(new PorterDuffColorFilter(Theme.getColor(Theme.key_chat_searchPanelIcons), PorterDuff.Mode.MULTIPLY)); + searchCalendarButton.setImageResource(R.drawable.baseline_date_range_24); + searchCalendarButton.setColorFilter(new PorterDuffColorFilter(Theme.getColor(Theme.key_chat_searchPanelIcons), PorterDuff.Mode.SRC_IN)); searchContainer.addView(searchCalendarButton, LayoutHelper.createFrame(48, 48, Gravity.RIGHT | Gravity.TOP)); searchCalendarButton.setOnClickListener(view -> { if (getParentActivity() == null) { @@ -1320,11 +1324,7 @@ public class ChannelAdminLogActivity extends BaseFragment implements Notificatio selectedObject = null; return; } - AlertDialog.Builder builder = new AlertDialog.Builder(getParentActivity()); - builder.setTitle(LocaleController.getString("AppName", R.string.AppName)); - builder.setMessage(LocaleController.getString("IncorrectTheme", R.string.IncorrectTheme)); - builder.setPositiveButton(LocaleController.getString("OK", R.string.OK), null); - showDialog(builder.create()); + AlertUtil.showToast(LocaleController.getString("IncorrectTheme", R.string.IncorrectTheme)); } } else { if (LocaleController.getInstance().applyLanguageFile(locFile, currentAccount)) { @@ -1334,11 +1334,7 @@ public class ChannelAdminLogActivity extends BaseFragment implements Notificatio selectedObject = null; return; } - AlertDialog.Builder builder = new AlertDialog.Builder(getParentActivity()); - builder.setTitle(LocaleController.getString("AppName", R.string.AppName)); - builder.setMessage(LocaleController.getString("IncorrectLocalization", R.string.IncorrectLocalization)); - builder.setPositiveButton(LocaleController.getString("OK", R.string.OK), null); - showDialog(builder.create()); + AlertUtil.showToast(LocaleController.getString("IncorrectLocalization", R.string.IncorrectLocalization)); } } } @@ -1836,7 +1832,7 @@ public class ChannelAdminLogActivity extends BaseFragment implements Notificatio } public void showOpenUrlAlert(final String url, boolean ask) { - if (Browser.isInternalUrl(url, null) || !ask) { + if (Browser.isInternalUrl(url, null) || !ask || NekoConfig.skipOpenLinkConfirm) { Browser.openUrl(getParentActivity(), url, true); } else { AlertDialog.Builder builder = new AlertDialog.Builder(getParentActivity()); diff --git a/TMessagesProj/src/main/java/org/telegram/ui/ChatEditTypeActivity.java b/TMessagesProj/src/main/java/org/telegram/ui/ChatEditTypeActivity.java index a61d9cfc0..1f2ecaced 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/ChatEditTypeActivity.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/ChatEditTypeActivity.java @@ -54,6 +54,8 @@ import org.telegram.ui.Components.LayoutHelper; import java.util.ArrayList; import java.util.concurrent.CountDownLatch; +import tw.nekomimi.nekogram.utils.ProxyUtil; + public class ChatEditTypeActivity extends BaseFragment implements NotificationCenter.NotificationCenterDelegate { private EditTextBoldCursor usernameTextView; @@ -76,6 +78,7 @@ public class ChatEditTypeActivity extends BaseFragment implements NotificationCe private TextSettingsCell copyCell; private TextSettingsCell revokeCell; private TextSettingsCell shareCell; + private TextSettingsCell shareQRCell; private ShadowSectionCell sectionCell2; private TextInfoPrivacyCell infoCell; private TextSettingsCell textCell; @@ -234,9 +237,9 @@ public class ChatEditTypeActivity extends BaseFragment implements NotificationCe radioButtonCell2 = new RadioButtonCell(context); radioButtonCell2.setBackgroundDrawable(Theme.getSelectorDrawable(false)); if (isChannel) { - radioButtonCell2.setTextAndValue(LocaleController.getString("ChannelPrivate", R.string.ChannelPrivate), LocaleController.getString("ChannelPrivateInfo", R.string.ChannelPrivateInfo), false, isPrivate); + radioButtonCell2.setTextAndValueAndCheck(LocaleController.getString("ChannelPrivate", R.string.ChannelPrivate), LocaleController.getString("ChannelPrivateInfo", R.string.ChannelPrivateInfo), false, isPrivate); } else { - radioButtonCell2.setTextAndValue(LocaleController.getString("MegaPrivate", R.string.MegaPrivate), LocaleController.getString("MegaPrivateInfo", R.string.MegaPrivateInfo), false, isPrivate); + radioButtonCell2.setTextAndValueAndCheck(LocaleController.getString("MegaPrivate", R.string.MegaPrivate), LocaleController.getString("MegaPrivateInfo", R.string.MegaPrivateInfo), false, isPrivate); } linearLayoutTypeContainer.addView(radioButtonCell2, LayoutHelper.createLinear(LayoutHelper.MATCH_PARENT, LayoutHelper.WRAP_CONTENT)); radioButtonCell2.setOnClickListener(v -> { @@ -250,9 +253,9 @@ public class ChatEditTypeActivity extends BaseFragment implements NotificationCe radioButtonCell1 = new RadioButtonCell(context); radioButtonCell1.setBackgroundDrawable(Theme.getSelectorDrawable(false)); if (isChannel) { - radioButtonCell1.setTextAndValue(LocaleController.getString("ChannelPublic", R.string.ChannelPublic), LocaleController.getString("ChannelPublicInfo", R.string.ChannelPublicInfo), false, !isPrivate); + radioButtonCell1.setTextAndValueAndCheck(LocaleController.getString("ChannelPublic", R.string.ChannelPublic), LocaleController.getString("ChannelPublicInfo", R.string.ChannelPublicInfo), false, !isPrivate); } else { - radioButtonCell1.setTextAndValue(LocaleController.getString("MegaPublic", R.string.MegaPublic), LocaleController.getString("MegaPublicInfo", R.string.MegaPublicInfo), false, !isPrivate); + radioButtonCell1.setTextAndValueAndCheck(LocaleController.getString("MegaPublic", R.string.MegaPublic), LocaleController.getString("MegaPublicInfo", R.string.MegaPublicInfo), false, !isPrivate); } linearLayoutTypeContainer.addView(radioButtonCell1, LayoutHelper.createLinear(LayoutHelper.MATCH_PARENT, LayoutHelper.WRAP_CONTENT)); radioButtonCell1.setOnClickListener(v -> { @@ -406,6 +409,17 @@ public class ChatEditTypeActivity extends BaseFragment implements NotificationCe } }); + shareQRCell = new TextSettingsCell(context); + shareQRCell.setBackgroundDrawable(Theme.getSelectorDrawable(false)); + shareQRCell.setText(LocaleController.getString("ShareQRCode", R.string.ShareQRCode), false); + privateContainer.addView(shareQRCell, LayoutHelper.createLinear(LayoutHelper.MATCH_PARENT, LayoutHelper.WRAP_CONTENT)); + shareQRCell.setOnClickListener(v -> { + if (invite == null) { + return; + } + ProxyUtil.showQrDialog(getParentActivity(),invite.link); + }); + checkTextView = new TextInfoPrivacyCell(context); checkTextView.setBackgroundDrawable(Theme.getThemedDrawable(context, R.drawable.greydivider_bottom, Theme.key_windowBackgroundGrayShadow)); checkTextView.setBottomPadding(6); diff --git a/TMessagesProj/src/main/java/org/telegram/ui/Components/StickersAlert.java b/TMessagesProj/src/main/java/org/telegram/ui/Components/StickersAlert.java index 7fbecccea..970bdbe59 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/Components/StickersAlert.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/Components/StickersAlert.java @@ -15,8 +15,10 @@ import android.animation.ObjectAnimator; import android.annotation.SuppressLint; import android.app.Activity; import android.content.Context; -import android.graphics.*; +import android.graphics.Canvas; +import android.graphics.Color; import android.graphics.Rect; +import android.graphics.RectF; import android.graphics.drawable.Drawable; import android.os.Build; import android.text.Selection; @@ -34,15 +36,18 @@ import android.widget.FrameLayout; import android.widget.TextView; import android.widget.Toast; +import androidx.recyclerview.widget.GridLayoutManager; +import androidx.recyclerview.widget.RecyclerView; + import org.telegram.messenger.AndroidUtilities; import org.telegram.messenger.ApplicationLoader; -import org.telegram.messenger.MediaDataController; import org.telegram.messenger.Emoji; import org.telegram.messenger.FileLoader; import org.telegram.messenger.FileLog; import org.telegram.messenger.FileRefController; import org.telegram.messenger.ImageLocation; import org.telegram.messenger.LocaleController; +import org.telegram.messenger.MediaDataController; import org.telegram.messenger.MessagesController; import org.telegram.messenger.NotificationCenter; import org.telegram.messenger.R; @@ -66,8 +71,7 @@ import java.util.List; import java.util.regex.Matcher; import java.util.regex.Pattern; -import androidx.recyclerview.widget.GridLayoutManager; -import androidx.recyclerview.widget.RecyclerView; +import tw.nekomimi.nekogram.utils.ProxyUtil; public class StickersAlert extends BottomSheet implements NotificationCenter.NotificationCenterDelegate { @@ -118,6 +122,8 @@ public class StickersAlert extends BottomSheet implements NotificationCenter.Not private Activity parentActivity; private int itemSize; + private int menu_archive = 4; + private TLRPC.TL_messages_stickerSet stickerSet; private TLRPC.Document selectedSticker; private TLRPC.InputStickerSet inputStickerSet; @@ -569,8 +575,11 @@ public class StickersAlert extends BottomSheet implements NotificationCenter.Not optionsButton.setIcon(R.drawable.ic_ab_other); optionsButton.setBackgroundDrawable(Theme.createSelectorDrawable(Theme.getColor(Theme.key_player_actionBarSelector), 1)); containerView.addView(optionsButton, LayoutHelper.createFrame(40, 40, Gravity.TOP | Gravity.RIGHT, 0, 5, 5, 0)); - optionsButton.addSubItem(1, R.drawable.msg_share, LocaleController.getString("StickersShare", R.string.StickersShare)); - optionsButton.addSubItem(2, R.drawable.msg_link, LocaleController.getString("CopyLink", R.string.CopyLink)); + optionsButton.addSubItem(1, R.drawable.baseline_forward_24, LocaleController.getString("StickersShare", R.string.StickersShare)); + optionsButton.addSubItem(2, R.drawable.baseline_link_24, LocaleController.getString("CopyLink", R.string.CopyLink)); + optionsButton.addSubItem(3, R.drawable.wallet_qr, LocaleController.getString("ShareQRCode", R.string.ShareQRCode)); + optionsButton.addSubItem(menu_archive, R.drawable.baseline_archive_24, LocaleController.getString("Archive", R.string.Archive)); + optionsButton.setOnClickListener(v -> optionsButton.toggleSubMenu()); optionsButton.setDelegate(this::onSubItemClick); optionsButton.setContentDescription(LocaleController.getString("AccDescrMoreOptions", R.string.AccDescrMoreOptions)); @@ -677,6 +686,11 @@ public class StickersAlert extends BottomSheet implements NotificationCenter.Not } catch (Exception e) { FileLog.e(e); } + } else if (id == 3) { + ProxyUtil.showQrDialog(getContext(), stickersUrl); + } else if (id == menu_archive) { + dismiss(); + MediaDataController.getInstance(currentAccount).toggleStickerSet(parentActivity, stickerSet, 1, parentFragment, false, true); } } @@ -684,7 +698,8 @@ public class StickersAlert extends BottomSheet implements NotificationCenter.Not if (titleTextView == null) { return; } - if (stickerSet != null) { + if (stickerSet != null && stickerSet.set != null) { + SpannableStringBuilder stringBuilder = null; try { if (urlPattern == null) { @@ -717,7 +732,8 @@ public class StickersAlert extends BottomSheet implements NotificationCenter.Not } titleTextView.setText(stringBuilder != null ? stringBuilder : stickerSet.set.title); - if (stickerSet.set == null || !MediaDataController.getInstance(currentAccount).isStickerPackInstalled(stickerSet.set.id)) { + if (!MediaDataController.getInstance(currentAccount).isStickerPackInstalled(stickerSet.set.id)) { + optionsButton.hideSubItem(menu_archive); String text; if (stickerSet.set.masks) { text = LocaleController.formatString("AddStickersCount", R.string.AddStickersCount, LocaleController.formatPluralString("MasksCount", stickerSet.documents.size())).toUpperCase(); @@ -754,6 +770,7 @@ public class StickersAlert extends BottomSheet implements NotificationCenter.Not })); }, text, Theme.key_dialogTextBlue2); } else { + optionsButton.showSubItem(menu_archive); String text; if (stickerSet.set.masks) { text = LocaleController.formatString("RemoveStickersCount", R.string.RemoveStickersCount, LocaleController.formatPluralString("MasksCount", stickerSet.documents.size())).toUpperCase(); diff --git a/TMessagesProj/src/main/java/org/telegram/ui/Components/UndoView.java b/TMessagesProj/src/main/java/org/telegram/ui/Components/UndoView.java index 90cc2dc88..704f4a755 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/Components/UndoView.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/Components/UndoView.java @@ -43,6 +43,8 @@ import org.telegram.messenger.UserObject; import org.telegram.tgnet.TLRPC; import org.telegram.ui.ActionBar.Theme; +import tw.nekomimi.nekogram.NekoConfig; + @SuppressWarnings("FieldCanBeLocal") public class UndoView extends FrameLayout { @@ -184,7 +186,7 @@ public class UndoView extends FrameLayout { undoImageView = new ImageView(context); undoImageView.setImageResource(R.drawable.chats_undo); - undoImageView.setColorFilter(new PorterDuffColorFilter(Theme.getColor(Theme.key_undo_cancelColor), PorterDuff.Mode.MULTIPLY)); + undoImageView.setColorFilter(new PorterDuffColorFilter(Theme.getColor(Theme.key_undo_cancelColor), PorterDuff.Mode.SRC_IN)); undoButton.addView(undoImageView, LayoutHelper.createLinear(LayoutHelper.WRAP_CONTENT, LayoutHelper.WRAP_CONTENT, Gravity.CENTER_VERTICAL | Gravity.LEFT)); undoTextView = new TextView(context); @@ -313,6 +315,10 @@ public class UndoView extends FrameLayout { if (currentActionRunnable != null) { currentActionRunnable.run(); } + if (NekoConfig.disableUndo && action < ACTION_QUIZ_CORRECT) { + if (actionRunnable != null) actionRunnable.run(); + return; + } isShown = true; currentActionRunnable = actionRunnable; currentCancelRunnable = cancelRunnable; diff --git a/TMessagesProj/src/main/java/org/telegram/ui/DialogsActivity.java b/TMessagesProj/src/main/java/org/telegram/ui/DialogsActivity.java index 95d3dc3a6..cfe0a6dd1 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/DialogsActivity.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/DialogsActivity.java @@ -39,14 +39,6 @@ import android.net.Uri; import android.os.Build; import android.os.Bundle; import android.os.Vibrator; - -import androidx.annotation.NonNull; -import androidx.recyclerview.widget.ItemTouchHelper; -import androidx.recyclerview.widget.LinearLayoutManager; -import androidx.recyclerview.widget.LinearSmoothScrollerCustom; -import androidx.recyclerview.widget.RecyclerView; -import androidx.viewpager.widget.ViewPager; - import android.text.TextUtils; import android.util.Property; import android.util.StateSet; @@ -71,41 +63,54 @@ import android.widget.LinearLayout; import android.widget.ScrollView; import android.widget.TextView; +import androidx.annotation.NonNull; +import androidx.recyclerview.widget.ItemTouchHelper; +import androidx.recyclerview.widget.LinearLayoutManager; +import androidx.recyclerview.widget.LinearSmoothScrollerCustom; +import androidx.recyclerview.widget.RecyclerView; +import androidx.viewpager.widget.ViewPager; + import org.telegram.messenger.AccountInstance; import org.telegram.messenger.AndroidUtilities; import org.telegram.messenger.ApplicationLoader; -import org.telegram.messenger.BuildVars; import org.telegram.messenger.ChatObject; -import org.telegram.messenger.MediaDataController; +import org.telegram.messenger.ContactsController; import org.telegram.messenger.DialogObject; +import org.telegram.messenger.FileLog; import org.telegram.messenger.ImageLoader; import org.telegram.messenger.ImageLocation; import org.telegram.messenger.LocaleController; +import org.telegram.messenger.MediaDataController; import org.telegram.messenger.MessageObject; +import org.telegram.messenger.MessagesController; +import org.telegram.messenger.NotificationCenter; import org.telegram.messenger.NotificationsController; +import org.telegram.messenger.R; import org.telegram.messenger.SharedConfig; +import org.telegram.messenger.UserConfig; import org.telegram.messenger.UserObject; import org.telegram.messenger.Utilities; import org.telegram.messenger.XiaomiUtilities; -import org.telegram.messenger.FileLog; import org.telegram.tgnet.ConnectionsManager; import org.telegram.tgnet.TLObject; import org.telegram.tgnet.TLRPC; -import org.telegram.messenger.ContactsController; -import org.telegram.messenger.MessagesController; -import org.telegram.messenger.NotificationCenter; -import org.telegram.messenger.R; -import org.telegram.messenger.UserConfig; +import org.telegram.ui.ActionBar.ActionBar; +import org.telegram.ui.ActionBar.ActionBarMenu; +import org.telegram.ui.ActionBar.ActionBarMenuItem; import org.telegram.ui.ActionBar.ActionBarMenuSubItem; import org.telegram.ui.ActionBar.ActionBarPopupWindow; import org.telegram.ui.ActionBar.AlertDialog; import org.telegram.ui.ActionBar.BackDrawable; +import org.telegram.ui.ActionBar.BaseFragment; import org.telegram.ui.ActionBar.BottomSheet; +import org.telegram.ui.ActionBar.MenuDrawable; +import org.telegram.ui.ActionBar.Theme; import org.telegram.ui.ActionBar.ThemeDescription; import org.telegram.ui.Adapters.DialogsAdapter; import org.telegram.ui.Adapters.DialogsSearchAdapter; import org.telegram.ui.Cells.AccountSelectCell; import org.telegram.ui.Cells.ArchiveHintInnerCell; +import org.telegram.ui.Cells.DialogCell; import org.telegram.ui.Cells.DialogsEmptyCell; import org.telegram.ui.Cells.DividerCell; import org.telegram.ui.Cells.DrawerActionCell; @@ -120,36 +125,29 @@ import org.telegram.ui.Cells.ProfileSearchCell; import org.telegram.ui.Cells.ShadowSectionCell; import org.telegram.ui.Cells.TextCell; import org.telegram.ui.Cells.UserCell; -import org.telegram.ui.Cells.DialogCell; -import org.telegram.ui.ActionBar.ActionBar; -import org.telegram.ui.ActionBar.ActionBarMenu; -import org.telegram.ui.ActionBar.ActionBarMenuItem; -import org.telegram.ui.ActionBar.BaseFragment; -import org.telegram.ui.ActionBar.MenuDrawable; import org.telegram.ui.Components.AlertsCreator; import org.telegram.ui.Components.AnimatedArrowDrawable; import org.telegram.ui.Components.AnimationProperties; -import org.telegram.ui.Components.FilterTabsView; -import org.telegram.ui.Components.FiltersListBottomSheet; -import org.telegram.ui.Components.PullForegroundDrawable; import org.telegram.ui.Components.AvatarDrawable; import org.telegram.ui.Components.BackupImageView; import org.telegram.ui.Components.ChatActivityEnterView; import org.telegram.ui.Components.CombinedDrawable; import org.telegram.ui.Components.CubicBezierInterpolator; import org.telegram.ui.Components.DialogsItemAnimator; -import org.telegram.ui.Components.FragmentContextView; import org.telegram.ui.Components.EmptyTextProgressView; +import org.telegram.ui.Components.FilterTabsView; +import org.telegram.ui.Components.FiltersListBottomSheet; +import org.telegram.ui.Components.FragmentContextView; import org.telegram.ui.Components.JoinGroupAlert; import org.telegram.ui.Components.LayoutHelper; import org.telegram.ui.Components.NumberTextView; import org.telegram.ui.Components.PacmanAnimation; import org.telegram.ui.Components.ProxyDrawable; +import org.telegram.ui.Components.PullForegroundDrawable; import org.telegram.ui.Components.RLottieDrawable; import org.telegram.ui.Components.RadialProgressView; import org.telegram.ui.Components.RecyclerAnimationScrollHelper; import org.telegram.ui.Components.RecyclerListView; -import org.telegram.ui.ActionBar.Theme; import org.telegram.ui.Components.SizeNotifierFrameLayout; import org.telegram.ui.Components.StickersAlert; import org.telegram.ui.Components.UndoView; @@ -157,6 +155,8 @@ import org.telegram.ui.Components.UndoView; import java.util.ArrayList; import tw.nekomimi.nekogram.NekoConfig; +import tw.nekomimi.nekogram.utils.PrivacyUtil; +import tw.nekomimi.nekogram.utils.ProxyUtil; public class DialogsActivity extends BaseFragment implements NotificationCenter.NotificationCenterDelegate { @@ -193,6 +193,7 @@ public class DialogsActivity extends BaseFragment implements NotificationCenter. private boolean passcodeItemVisible; private ActionBarMenuItem proxyItem; private boolean proxyItemVisible; + private ActionBarMenuItem scanItem; private ActionBarMenuItem searchItem; private ActionBarMenuItem doneItem; private ProxyDrawable proxyDrawable; @@ -316,7 +317,7 @@ public class DialogsActivity extends BaseFragment implements NotificationCenter. private boolean canDeletePsaSelected; private int topPadding; - + private int folderId; private final static int pin = 100; @@ -667,7 +668,7 @@ public class DialogsActivity extends BaseFragment implements NotificationCenter. @Override public boolean onTouchEvent(MotionEvent ev) { - if (filterTabsView != null && !filterTabsView.isEditing() && !searching && + if (filterTabsView != null && !filterTabsView.isEditing() && !searching && !parentLayout.checkTransitionAnimation() && !parentLayout.isInPreviewMode() && !parentLayout.isPreviewOpenAnimationInProgress() && !parentLayout.getDrawerLayoutContainer().isDrawerOpened() && (ev == null || startedTracking || ev.getY() > actionBar.getMeasuredHeight() + actionBar.getTranslationY())) { if (ev != null) { @@ -1298,7 +1299,7 @@ public class DialogsActivity extends BaseFragment implements NotificationCenter. SharedPreferences preferences = MessagesController.getGlobalMainSettings(); boolean hintShowed = preferences.getBoolean("archivehint_l", false) || SharedConfig.archiveHidden; if (!hintShowed) { - preferences.edit().putBoolean("archivehint_l", true).commit(); + preferences.edit().putBoolean("archivehint_l", true).apply(); } getUndoView().showWithAction(dialog.id, hintShowed ? UndoView.ACTION_ARCHIVE : UndoView.ACTION_ARCHIVE_HINT, null, () -> { dialogsListFrozen = true; @@ -1404,6 +1405,7 @@ public class DialogsActivity extends BaseFragment implements NotificationCenter. public boolean onFragmentCreate() { super.onFragmentCreate(); + getConnectionsManager().updateDcSettings(); getMessagesController().getBlockedUsers(true); if (getArguments() != null) { @@ -1424,7 +1426,6 @@ public class DialogsActivity extends BaseFragment implements NotificationCenter. if (initialDialogsType == 0) { askAboutContacts = MessagesController.getGlobalNotificationsSettings().getBoolean("askAboutContacts", true); - SharedConfig.loadProxyList(); } if (searchString == null) { @@ -1564,6 +1565,11 @@ public class DialogsActivity extends BaseFragment implements NotificationCenter. updatePasscodeButton(); updateProxyButton(false); } + + scanItem = menu.addItem(3, R.drawable.wallet_qr); + scanItem.setContentDescription(LocaleController.getString("ScanQRCode", R.string.ScanQRCode)); + scanItem.setVisibility(View.GONE); + searchItem = menu.addItem(0, R.drawable.ic_ab_search).setIsSearchField(true).setActionBarMenuItemSearchListener(new ActionBarMenuItem.ActionBarMenuItemSearchListener() { @Override public void onSearchExpand() { @@ -1574,6 +1580,9 @@ public class DialogsActivity extends BaseFragment implements NotificationCenter. if (proxyItem != null && proxyItemVisible) { proxyItem.setVisibility(View.GONE); } + if (scanItem != null) { + scanItem.setVisibility(View.VISIBLE); + } if (viewPages[0] != null) { if (searchString != null) { viewPages[0].listView.hide(); @@ -1596,6 +1605,9 @@ public class DialogsActivity extends BaseFragment implements NotificationCenter. if (proxyItem != null && proxyItemVisible) { proxyItem.setVisibility(View.VISIBLE); } + if (scanItem != null) { + scanItem.setVisibility(View.GONE); + } if (searchString != null) { finishFragment(); return false; @@ -1657,13 +1669,9 @@ public class DialogsActivity extends BaseFragment implements NotificationCenter. actionBar.setBackButtonContentDescription(LocaleController.getString("AccDescrOpenMenu", R.string.AccDescrOpenMenu)); } if (folderId != 0) { - actionBar.setTitle(getNekoTitle(LocaleController.getString("ArchivedChats", R.string.ArchivedChats))); + actionBar.setTitle(LocaleController.getString("ArchivedChats", R.string.ArchivedChats)); } else { - if (BuildVars.DEBUG_VERSION) { - actionBar.setTitle("Telegram Beta"); - } else { - actionBar.setTitle(getNekoTitle(LocaleController.getString("Nekogram", R.string.Nekogram))); - } + actionBar.setTitle(getNekoTitle(LocaleController.getString("NekoX", R.string.NekoX))); } if (folderId == 0) { actionBar.setSupportsHolidayImage(true); @@ -1824,7 +1832,7 @@ public class DialogsActivity extends BaseFragment implements NotificationCenter. if (tabId < 0 || tabId >= dialogFilters.size()) { return 0; } - return getMessagesController().dialogFilters.get(tabId).unreadCount; + return dialogFilters.get(tabId).unreadCount; } @Override @@ -1910,12 +1918,12 @@ public class DialogsActivity extends BaseFragment implements NotificationCenter. cell.setTextAndIcon(LocaleController.getString("FilterReorder", R.string.FilterReorder), R.drawable.tabs_reorder); } else if (a == 1) { if (N == 2) { - cell.setTextAndIcon(LocaleController.getString("FilterEditAll", R.string.FilterEditAll), R.drawable.msg_edit); + cell.setTextAndIcon(LocaleController.getString("FilterEditAll", R.string.FilterEditAll), R.drawable.baseline_edit_24); } else { - cell.setTextAndIcon(LocaleController.getString("FilterEdit", R.string.FilterEdit), R.drawable.msg_edit); + cell.setTextAndIcon(LocaleController.getString("FilterEdit", R.string.FilterEdit), R.drawable.baseline_edit_24); } } else { - cell.setTextAndIcon(LocaleController.getString("FilterDeleteItem", R.string.FilterDeleteItem), R.drawable.msg_delete); + cell.setTextAndIcon(LocaleController.getString("FilterDeleteItem", R.string.FilterDeleteItem), R.drawable.baseline_delete_24); } scrimPopupWindowItems[a] = cell; linearLayout.addView(cell); @@ -2069,6 +2077,26 @@ public class DialogsActivity extends BaseFragment implements NotificationCenter. updatePasscodeButton(); } else if (id == 2) { presentFragment(new ProxyListActivity()); + } else if (id == 3) { + + if (Build.VERSION.SDK_INT >= 23) { + if (getParentActivity().checkSelfPermission(Manifest.permission.CAMERA) != PackageManager.PERMISSION_GRANTED) { + getParentActivity().requestPermissions(new String[]{Manifest.permission.CAMERA}, 22); + return; + } + } + + CameraScanActivity.showAsSheet(DialogsActivity.this, new CameraScanActivity.CameraScanActivityDelegate() { + + @Override + public void didFindQr(String text) { + + ProxyUtil.showLinkAlert(getParentActivity(), text); + + } + }); + + } else if (id >= 10 && id < 10 + UserConfig.MAX_ACCOUNT_COUNT) { if (getParentActivity() == null) { return; @@ -2167,18 +2195,18 @@ public class DialogsActivity extends BaseFragment implements NotificationCenter. actionMode.addView(selectedDialogsCountTextView, LayoutHelper.createLinear(0, LayoutHelper.MATCH_PARENT, 1.0f, 72, 0, 0, 0)); selectedDialogsCountTextView.setOnTouchListener((v, event) -> true); - pinItem = actionMode.addItemWithWidth(pin, R.drawable.msg_pin, AndroidUtilities.dp(54)); - muteItem = actionMode.addItemWithWidth(mute, R.drawable.msg_mute, AndroidUtilities.dp(54)); - archive2Item = actionMode.addItemWithWidth(archive2, R.drawable.msg_archive, AndroidUtilities.dp(54)); - deleteItem = actionMode.addItemWithWidth(delete, R.drawable.msg_delete, AndroidUtilities.dp(54), LocaleController.getString("Delete", R.string.Delete)); + pinItem = actionMode.addItemWithWidth(pin, R.drawable.deproko_baseline_pin_24, AndroidUtilities.dp(54)); + muteItem = actionMode.addItemWithWidth(mute, R.drawable.baseline_volume_off_24_white, AndroidUtilities.dp(54)); + archive2Item = actionMode.addItemWithWidth(archive2, R.drawable.baseline_archive_24, AndroidUtilities.dp(54)); + deleteItem = actionMode.addItemWithWidth(delete, R.drawable.baseline_delete_24, AndroidUtilities.dp(54), LocaleController.getString("Delete", R.string.Delete)); ActionBarMenuItem otherItem = actionMode.addItemWithWidth(0, R.drawable.ic_ab_other, AndroidUtilities.dp(54), LocaleController.getString("AccDescrMoreOptions", R.string.AccDescrMoreOptions)); - archiveItem = otherItem.addSubItem(archive, R.drawable.msg_archive, LocaleController.getString("Archive", R.string.Archive)); - pin2Item = otherItem.addSubItem(pin2, R.drawable.msg_pin, LocaleController.getString("DialogPin", R.string.DialogPin)); + archiveItem = otherItem.addSubItem(archive, R.drawable.baseline_archive_24, LocaleController.getString("Archive", R.string.Archive)); + pin2Item = otherItem.addSubItem(pin2, R.drawable.deproko_baseline_pin_24, LocaleController.getString("DialogPin", R.string.DialogPin)); addToFolderItem = otherItem.addSubItem(add_to_folder, R.drawable.msg_addfolder, LocaleController.getString("FilterAddTo", R.string.FilterAddTo)); removeFromFolderItem = otherItem.addSubItem(remove_from_folder, R.drawable.msg_removefolder, LocaleController.getString("FilterRemoveFrom", R.string.FilterRemoveFrom)); - readItem = otherItem.addSubItem(read, R.drawable.msg_markread, LocaleController.getString("MarkAsRead", R.string.MarkAsRead)); - clearItem = otherItem.addSubItem(clear, R.drawable.msg_clear, LocaleController.getString("ClearHistory", R.string.ClearHistory)); - blockItem = otherItem.addSubItem(block, R.drawable.msg_block, LocaleController.getString("BlockUser", R.string.BlockUser)); + readItem = otherItem.addSubItem(read, R.drawable.deproko_baseline_check_double_24, LocaleController.getString("MarkAsRead", R.string.MarkAsRead)); + clearItem = otherItem.addSubItem(clear, R.drawable.baseline_delete_sweep_24, LocaleController.getString("ClearHistory", R.string.ClearHistory)); + blockItem = otherItem.addSubItem(block, R.drawable.baseline_block_24, LocaleController.getString("BlockUser", R.string.BlockUser)); actionModeViews.add(pinItem); actionModeViews.add(archive2Item); @@ -2738,13 +2766,13 @@ public class DialogsActivity extends BaseFragment implements NotificationCenter. Drawable drawable = Theme.createSimpleSelectorCircleDrawable(AndroidUtilities.dp(56), Theme.getColor(Theme.key_chats_actionBackground), Theme.getColor(Theme.key_chats_actionPressedBackground)); if (Build.VERSION.SDK_INT < 21) { Drawable shadowDrawable = context.getResources().getDrawable(R.drawable.floating_shadow).mutate(); - shadowDrawable.setColorFilter(new PorterDuffColorFilter(0xff000000, PorterDuff.Mode.MULTIPLY)); + shadowDrawable.setColorFilter(new PorterDuffColorFilter(0xff000000, PorterDuff.Mode.SRC_IN)); CombinedDrawable combinedDrawable = new CombinedDrawable(shadowDrawable, drawable, 0, 0); combinedDrawable.setIconSize(AndroidUtilities.dp(56), AndroidUtilities.dp(56)); drawable = combinedDrawable; } floatingButton.setBackgroundDrawable(drawable); - floatingButton.setColorFilter(new PorterDuffColorFilter(Theme.getColor(Theme.key_chats_actionIcon), PorterDuff.Mode.MULTIPLY)); + floatingButton.setColorFilter(new PorterDuffColorFilter(Theme.getColor(Theme.key_chats_actionIcon), PorterDuff.Mode.SRC_IN)); floatingButton.setImageResource(R.drawable.floating_pencil); if (Build.VERSION.SDK_INT >= 21) { StateListAnimator animator = new StateListAnimator(); @@ -2979,6 +3007,8 @@ public class DialogsActivity extends BaseFragment implements NotificationCenter. updateFilterTabs(false); + PrivacyUtil.postCheckAll(getParentActivity(), currentAccount); + return fragmentView; } @@ -3008,6 +3038,7 @@ public class DialogsActivity extends BaseFragment implements NotificationCenter. } private boolean scrollBarVisible = true; + private void showScrollbars(boolean show) { if (viewPages == null || scrollBarVisible == show) { return; @@ -3055,7 +3086,8 @@ public class DialogsActivity extends BaseFragment implements NotificationCenter. filterTabsView.resetTabId(); } filterTabsView.removeTabs(); - if (!NekoConfig.hideAllTab) filterTabsView.addTab(Integer.MAX_VALUE, LocaleController.getString("FilterAllChats", R.string.FilterAllChats)); + if (!NekoConfig.hideAllTab) + filterTabsView.addTab(Integer.MAX_VALUE, LocaleController.getString("FilterAllChats", R.string.FilterAllChats)); for (int a = 0, N = filters.size(); a < N; a++) { MessagesController.DialogFilter dialogFilter = filters.get(a); switch (NekoConfig.tabsTitleType) { @@ -3203,7 +3235,7 @@ public class DialogsActivity extends BaseFragment implements NotificationCenter. if (hasNotContactsPermission && askAboutContacts && getUserConfig().syncContacts && activity.shouldShowRequestPermissionRationale(Manifest.permission.READ_CONTACTS)) { AlertDialog.Builder builder = AlertsCreator.createContactsPermissionDialog(activity, param -> { askAboutContacts = param != 0; - MessagesController.getGlobalNotificationsSettings().edit().putBoolean("askAboutContacts", askAboutContacts).commit(); + MessagesController.getGlobalNotificationsSettings().edit().putBoolean("askAboutContacts", askAboutContacts).apply(); askForPermissons(false); }); showDialog(permissionDialog = builder.create()); @@ -3812,8 +3844,8 @@ public class DialogsActivity extends BaseFragment implements NotificationCenter. final boolean hasUnread = getMessagesStorage().getArchiveUnreadCount() != 0; int[] icons = new int[]{ - hasUnread ? R.drawable.menu_read : 0, - SharedConfig.archiveHidden ? R.drawable.chats_pin : R.drawable.chats_unpin, + hasUnread ? R.drawable.deproko_baseline_check_double_24 : 0, + SharedConfig.archiveHidden ? R.drawable.deproko_baseline_pin_24 : R.drawable.deproko_baseline_pin_undo_24, }; CharSequence[] items = new CharSequence[]{ hasUnread ? LocaleController.getString("MarkAllAsRead", R.string.MarkAllAsRead) : null, @@ -4033,7 +4065,7 @@ public class DialogsActivity extends BaseFragment implements NotificationCenter. SharedPreferences preferences = MessagesController.getGlobalMainSettings(); boolean hintShowed = preferences.getBoolean("archivehint_l", false) || SharedConfig.archiveHidden; if (!hintShowed) { - preferences.edit().putBoolean("archivehint_l", true).commit(); + preferences.edit().putBoolean("archivehint_l", true).apply(); } int undoAction; if (hintShowed) { @@ -4513,8 +4545,8 @@ public class DialogsActivity extends BaseFragment implements NotificationCenter. } } if (canUnarchiveCount != 0) { - archiveItem.setTextAndIcon(LocaleController.getString("Unarchive", R.string.Unarchive), R.drawable.msg_unarchive); - archive2Item.setIcon(R.drawable.msg_unarchive); + archiveItem.setTextAndIcon(LocaleController.getString("Unarchive", R.string.Unarchive), R.drawable.baseline_unarchive_24); + archive2Item.setIcon(R.drawable.baseline_unarchive_24); if (filterTabsView != null && filterTabsView.getVisibility() == View.VISIBLE) { archive2Item.setVisibility(View.VISIBLE); archiveItem.setVisibility(View.GONE); @@ -4523,8 +4555,8 @@ public class DialogsActivity extends BaseFragment implements NotificationCenter. archive2Item.setVisibility(View.GONE); } } else if (canArchiveCount != 0) { - archiveItem.setTextAndIcon(LocaleController.getString("Archive", R.string.Archive), R.drawable.msg_archive); - archive2Item.setIcon(R.drawable.msg_archive); + archiveItem.setTextAndIcon(LocaleController.getString("Archive", R.string.Archive), R.drawable.baseline_archive_24); + archive2Item.setIcon(R.drawable.baseline_archive_24); if (filterTabsView != null && filterTabsView.getVisibility() == View.VISIBLE) { archive2Item.setVisibility(View.VISIBLE); archiveItem.setVisibility(View.GONE); @@ -4564,23 +4596,23 @@ public class DialogsActivity extends BaseFragment implements NotificationCenter. addToFolderItem.setVisibility(View.GONE); } if (canUnmuteCount != 0) { - muteItem.setIcon(R.drawable.msg_unmute); + muteItem.setIcon(R.drawable.baseline_bullhorn_24); muteItem.setContentDescription(LocaleController.getString("ChatsUnmute", R.string.ChatsUnmute)); } else { - muteItem.setIcon(R.drawable.msg_mute); + muteItem.setIcon(R.drawable.baseline_volume_off_24_white); muteItem.setContentDescription(LocaleController.getString("ChatsMute", R.string.ChatsMute)); } if (canReadCount != 0) { - readItem.setTextAndIcon(LocaleController.getString("MarkAsRead", R.string.MarkAsRead), R.drawable.msg_markread); + readItem.setTextAndIcon(LocaleController.getString("MarkAsRead", R.string.MarkAsRead), R.drawable.deproko_baseline_check_double_24); } else { - readItem.setTextAndIcon(LocaleController.getString("MarkAsUnread", R.string.MarkAsUnread), R.drawable.msg_markunread); + readItem.setTextAndIcon(LocaleController.getString("MarkAsUnread", R.string.MarkAsUnread), R.drawable.baseline_unsubscribe_24); } if (canPinCount != 0) { - pinItem.setIcon(R.drawable.msg_pin); + pinItem.setIcon(R.drawable.deproko_baseline_pin_24); pinItem.setContentDescription(LocaleController.getString("PinToTop", R.string.PinToTop)); pin2Item.setText(LocaleController.getString("DialogPin", R.string.DialogPin)); } else { - pinItem.setIcon(R.drawable.msg_unpin); + pinItem.setIcon(R.drawable.deproko_baseline_pin_undo_24); pinItem.setContentDescription(LocaleController.getString("UnpinFromTop", R.string.UnpinFromTop)); pin2Item.setText(LocaleController.getString("DialogUnpin", R.string.DialogUnpin)); } @@ -4698,12 +4730,12 @@ public class DialogsActivity extends BaseFragment implements NotificationCenter. SharedPreferences preferences = ApplicationLoader.applicationContext.getSharedPreferences("mainconfig", Activity.MODE_PRIVATE); String proxyAddress = preferences.getString("proxy_ip", ""); boolean proxyEnabled; - if ((proxyEnabled = preferences.getBoolean("proxy_enabled", false) && !TextUtils.isEmpty(proxyAddress)) || getMessagesController().blockedCountry && !SharedConfig.proxyList.isEmpty()) { + if (!NekoConfig.useProxyItem && (!NekoConfig.hideProxyByDefault || (proxyEnabled = preferences.getBoolean("proxy_enabled", false) && !TextUtils.isEmpty(proxyAddress)) || getMessagesController().blockedCountry && !SharedConfig.proxyList.isEmpty())) { if (!actionBar.isSearchFieldVisible() && (doneItem == null || doneItem.getVisibility() != View.VISIBLE)) { proxyItem.setVisibility(View.VISIBLE); } proxyItemVisible = true; - proxyDrawable.setConnected(proxyEnabled, currentConnectionState == ConnectionsManager.ConnectionStateConnected || currentConnectionState == ConnectionsManager.ConnectionStateUpdating, animated); + proxyDrawable.setConnected(true, currentConnectionState == ConnectionsManager.ConnectionStateConnected || currentConnectionState == ConnectionsManager.ConnectionStateUpdating, animated); } else { proxyItemVisible = false; proxyItem.setVisibility(View.GONE); @@ -4711,6 +4743,7 @@ public class DialogsActivity extends BaseFragment implements NotificationCenter. } private AnimatorSet doneItemAnimator; + private void showDoneItem(boolean show) { if (doneItem == null) { return; @@ -4834,7 +4867,7 @@ public class DialogsActivity extends BaseFragment implements NotificationCenter. if (alert) { AlertDialog.Builder builder = AlertsCreator.createContactsPermissionDialog(activity, param -> { askAboutContacts = param != 0; - MessagesController.getGlobalNotificationsSettings().edit().putBoolean("askAboutContacts", askAboutContacts).commit(); + MessagesController.getGlobalNotificationsSettings().edit().putBoolean("askAboutContacts", askAboutContacts).apply(); askForPermissons(false); }); showDialog(permissionDialog = builder.create()); @@ -4903,7 +4936,7 @@ public class DialogsActivity extends BaseFragment implements NotificationCenter. if (grantResults[a] == PackageManager.PERMISSION_GRANTED) { getContactsController().forceImportContacts(); } else { - MessagesController.getGlobalNotificationsSettings().edit().putBoolean("askAboutContacts", askAboutContacts = false).commit(); + MessagesController.getGlobalNotificationsSettings().edit().putBoolean("askAboutContacts", askAboutContacts = false).apply(); } break; case Manifest.permission.WRITE_EXTERNAL_STORAGE: @@ -4921,7 +4954,15 @@ public class DialogsActivity extends BaseFragment implements NotificationCenter. } private String getNekoTitle(String title) { - return LocaleController.getString("NekogramEmojiDialogs", R.string.NekogramEmojiDialogs) + " " + title; + + if (!NekoConfig.removeTitleEmoji) { + + title = LocaleController.getString("NekogramEmojiDialogs", R.string.NekogramEmojiDialogs) + " " + title; + + } + + return title; + //if (FilterPopup.getInstance(currentAccount).getTotalUnreadCount() == 0) { // return LocaleController.getString("NekogramEmojiDialogs", R.string.NekogramEmojiDialogs) + " " + title; //} @@ -5086,7 +5127,7 @@ public class DialogsActivity extends BaseFragment implements NotificationCenter. if (preferences.getBoolean("filterhint", false)) { return; } - preferences.edit().putBoolean("filterhint", true).commit(); + preferences.edit().putBoolean("filterhint", true).apply(); AndroidUtilities.runOnUIThread(() -> getUndoView().showWithAction(0, UndoView.ACTION_FILTERS_AVAILABLE, null, () -> presentFragment(new FiltersSetupActivity())), 1000); } @@ -5170,7 +5211,7 @@ public class DialogsActivity extends BaseFragment implements NotificationCenter. } floatingHidden = hide; AnimatorSet animatorSet = new AnimatorSet(); - ValueAnimator valueAnimator = ValueAnimator.ofFloat(floatingButtonHideProgress,floatingHidden ? 1f : 0f); + ValueAnimator valueAnimator = ValueAnimator.ofFloat(floatingButtonHideProgress, floatingHidden ? 1f : 0f); valueAnimator.addUpdateListener(animation -> { floatingButtonHideProgress = (float) animation.getAnimatedValue(); floatingButtonTranslation = AndroidUtilities.dp(100) * floatingButtonHideProgress; diff --git a/TMessagesProj/src/main/java/org/telegram/ui/ExternalActionActivity.java b/TMessagesProj/src/main/java/org/telegram/ui/ExternalActionActivity.java index 76aa4aecd..dcb556560 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/ExternalActionActivity.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/ExternalActionActivity.java @@ -49,6 +49,8 @@ import org.telegram.ui.Components.PasscodeView; import java.util.ArrayList; +import tw.nekomimi.nekogram.NekoXConfig; + public class ExternalActionActivity extends Activity implements ActionBarLayout.ActionBarLayoutDelegate { private boolean finished; @@ -76,7 +78,7 @@ public class ExternalActionActivity extends Activity implements ActionBarLayout. requestWindowFeature(Window.FEATURE_NO_TITLE); setTheme(R.style.Theme_TMessages); getWindow().setBackgroundDrawableResource(R.drawable.transparent); - if (SharedConfig.passcodeHash.length() > 0 && !SharedConfig.allowScreenCapture) { + if (SharedConfig.passcodeHash.length() > 0 && !SharedConfig.allowScreenCapture && !NekoXConfig.disableFlagSecure) { try { getWindow().setFlags(WindowManager.LayoutParams.FLAG_SECURE, WindowManager.LayoutParams.FLAG_SECURE); } catch (Exception e) { diff --git a/TMessagesProj/src/main/java/org/telegram/ui/FiltersSetupActivity.java b/TMessagesProj/src/main/java/org/telegram/ui/FiltersSetupActivity.java index e2b7bfdb9..5f1fcfcc5 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/FiltersSetupActivity.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/FiltersSetupActivity.java @@ -252,7 +252,7 @@ public class FiltersSetupActivity extends BaseFragment implements NotificationCe moveImageView.setFocusable(false); moveImageView.setScaleType(ImageView.ScaleType.CENTER); moveImageView.setImageResource(R.drawable.list_reorder); - moveImageView.setColorFilter(new PorterDuffColorFilter(Theme.getColor(Theme.key_stickers_menu), PorterDuff.Mode.MULTIPLY)); + moveImageView.setColorFilter(new PorterDuffColorFilter(Theme.getColor(Theme.key_stickers_menu), PorterDuff.Mode.SRC_IN)); moveImageView.setClickable(true); addView(moveImageView, LayoutHelper.createFrame(48, 48, (LocaleController.isRTL ? Gravity.RIGHT : Gravity.LEFT) | Gravity.CENTER_VERTICAL, 6, 0, 6, 0)); @@ -282,7 +282,7 @@ public class FiltersSetupActivity extends BaseFragment implements NotificationCe optionsImageView.setFocusable(false); optionsImageView.setScaleType(ImageView.ScaleType.CENTER); optionsImageView.setBackgroundDrawable(Theme.createSelectorDrawable(Theme.getColor(Theme.key_stickers_menuSelector))); - optionsImageView.setColorFilter(new PorterDuffColorFilter(Theme.getColor(Theme.key_stickers_menu), PorterDuff.Mode.MULTIPLY)); + optionsImageView.setColorFilter(new PorterDuffColorFilter(Theme.getColor(Theme.key_stickers_menu), PorterDuff.Mode.SRC_IN)); optionsImageView.setImageResource(R.drawable.msg_actions); addView(optionsImageView, LayoutHelper.createFrame(40, 40, (LocaleController.isRTL ? Gravity.LEFT : Gravity.RIGHT) | Gravity.CENTER_VERTICAL, 6, 0, 6, 0)); } @@ -372,10 +372,6 @@ public class FiltersSetupActivity extends BaseFragment implements NotificationCe updateRows(true); getMessagesController().loadRemoteFilters(true); getNotificationCenter().addObserver(this, NotificationCenter.dialogFiltersUpdated); - getNotificationCenter().addObserver(this, NotificationCenter.suggestedFiltersLoaded); - if (getMessagesController().suggestedFilters.isEmpty()) { - getMessagesController().loadSuggestedFilters(); - } return super.onFragmentCreate(); } @@ -491,6 +487,10 @@ public class FiltersSetupActivity extends BaseFragment implements NotificationCe return; } updateRows(true); + getNotificationCenter().addObserver(this, NotificationCenter.suggestedFiltersLoaded); + if (getMessagesController().suggestedFilters.isEmpty()) { + getMessagesController().loadSuggestedFilters(); + } } else if (id == NotificationCenter.suggestedFiltersLoaded) { updateRows(true); } @@ -548,8 +548,8 @@ public class FiltersSetupActivity extends BaseFragment implements NotificationCe LocaleController.getString("FilterDeleteItem", R.string.FilterDeleteItem), }; final int[] icons = new int[]{ - R.drawable.msg_edit, - R.drawable.msg_delete + R.drawable.baseline_edit_24, + R.drawable.baseline_delete_24 }; builder1.setItems(items, icons, (dialog, which) -> { if (which == 0) { @@ -746,8 +746,8 @@ public class FiltersSetupActivity extends BaseFragment implements NotificationCe if (position == createFilterRow) { Drawable drawable1 = mContext.getResources().getDrawable(R.drawable.poll_add_circle); Drawable drawable2 = mContext.getResources().getDrawable(R.drawable.poll_add_plus); - drawable1.setColorFilter(new PorterDuffColorFilter(Theme.getColor(Theme.key_switchTrackChecked), PorterDuff.Mode.MULTIPLY)); - drawable2.setColorFilter(new PorterDuffColorFilter(Theme.getColor(Theme.key_checkboxCheck), PorterDuff.Mode.MULTIPLY)); + drawable1.setColorFilter(new PorterDuffColorFilter(Theme.getColor(Theme.key_switchTrackChecked), PorterDuff.Mode.SRC_IN)); + drawable2.setColorFilter(new PorterDuffColorFilter(Theme.getColor(Theme.key_checkboxCheck), PorterDuff.Mode.SRC_IN)); CombinedDrawable combinedDrawable = new CombinedDrawable(drawable1, drawable2); textCell.setTextAndIcon(LocaleController.getString("CreateNewFilter", R.string.CreateNewFilter), combinedDrawable, false); diff --git a/TMessagesProj/src/main/java/org/telegram/ui/GroupInviteActivity.java b/TMessagesProj/src/main/java/org/telegram/ui/GroupInviteActivity.java index e19eb70a2..1a5566353 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/GroupInviteActivity.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/GroupInviteActivity.java @@ -16,13 +16,16 @@ import android.view.ViewGroup; import android.widget.FrameLayout; import android.widget.Toast; +import androidx.recyclerview.widget.LinearLayoutManager; +import androidx.recyclerview.widget.RecyclerView; + import org.telegram.messenger.AndroidUtilities; +import org.telegram.messenger.ApplicationLoader; import org.telegram.messenger.ChatObject; +import org.telegram.messenger.FileLog; import org.telegram.messenger.LocaleController; import org.telegram.messenger.MessagesController; import org.telegram.messenger.NotificationCenter; -import org.telegram.messenger.ApplicationLoader; -import org.telegram.messenger.FileLog; import org.telegram.messenger.R; import org.telegram.tgnet.ConnectionsManager; import org.telegram.tgnet.TLRPC; @@ -40,8 +43,7 @@ import org.telegram.ui.Components.RecyclerListView; import java.util.ArrayList; -import androidx.recyclerview.widget.LinearLayoutManager; -import androidx.recyclerview.widget.RecyclerView; +import tw.nekomimi.nekogram.utils.ProxyUtil; public class GroupInviteActivity extends BaseFragment implements NotificationCenter.NotificationCenterDelegate { @@ -58,6 +60,7 @@ public class GroupInviteActivity extends BaseFragment implements NotificationCen private int copyLinkRow; private int revokeLinkRow; private int shareLinkRow; + private int shareQrCodeRow; private int shadowRow; private int rowCount; @@ -80,6 +83,7 @@ public class GroupInviteActivity extends BaseFragment implements NotificationCen copyLinkRow = rowCount++; revokeLinkRow = rowCount++; shareLinkRow = rowCount++; + shareQrCodeRow = rowCount++; shadowRow = rowCount++; return true; @@ -148,6 +152,11 @@ public class GroupInviteActivity extends BaseFragment implements NotificationCen } catch (Exception e) { FileLog.e(e); } + } else if (position == shareQrCodeRow) { + if (invite == null) { + return; + } + ProxyUtil.showQrDialog(getParentActivity(),invite.link); } else if (position == revokeLinkRow) { AlertDialog.Builder builder = new AlertDialog.Builder(getParentActivity()); builder.setMessage(LocaleController.getString("RevokeAlert", R.string.RevokeAlert)); @@ -216,7 +225,7 @@ public class GroupInviteActivity extends BaseFragment implements NotificationCen } private class ListAdapter extends RecyclerListView.SelectionAdapter { - + private Context mContext; public ListAdapter(Context context) { @@ -226,7 +235,7 @@ public class GroupInviteActivity extends BaseFragment implements NotificationCen @Override public boolean isEnabled(RecyclerView.ViewHolder holder) { int position = holder.getAdapterPosition(); - return position == revokeLinkRow || position == copyLinkRow || position == shareLinkRow || position == linkRow; + return position == revokeLinkRow || position == copyLinkRow || position == shareLinkRow || position == shareQrCodeRow || position == linkRow; } @Override @@ -263,6 +272,8 @@ public class GroupInviteActivity extends BaseFragment implements NotificationCen textCell.setText(LocaleController.getString("CopyLink", R.string.CopyLink), true); } else if (position == shareLinkRow) { textCell.setText(LocaleController.getString("ShareLink", R.string.ShareLink), false); + } else if (position == shareQrCodeRow) { + textCell.setText(LocaleController.getString("ShareQRCode", R.string.ShareQRCode), false); } else if (position == revokeLinkRow) { textCell.setText(LocaleController.getString("RevokeLink", R.string.RevokeLink), true); } @@ -291,7 +302,7 @@ public class GroupInviteActivity extends BaseFragment implements NotificationCen @Override public int getItemViewType(int position) { - if (position == copyLinkRow || position == shareLinkRow || position == revokeLinkRow) { + if (position == copyLinkRow || position == shareLinkRow || position == shareQrCodeRow || position == revokeLinkRow) { return 0; } else if (position == shadowRow || position == linkInfoRow) { return 1; diff --git a/TMessagesProj/src/main/java/org/telegram/ui/LanguageSelectActivity.java b/TMessagesProj/src/main/java/org/telegram/ui/LanguageSelectActivity.java index 3182f4741..ccfc2e182 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/LanguageSelectActivity.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/LanguageSelectActivity.java @@ -16,21 +16,27 @@ import android.widget.EditText; import android.widget.FrameLayout; import android.widget.TextView; +import androidx.recyclerview.widget.LinearLayoutManager; +import androidx.recyclerview.widget.RecyclerView; + import org.telegram.messenger.AndroidUtilities; import org.telegram.messenger.FileLog; import org.telegram.messenger.LocaleController; 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.LanguageCell; +import org.telegram.tgnet.ConnectionsManager; +import org.telegram.tgnet.TLRPC; import org.telegram.ui.ActionBar.ActionBar; import org.telegram.ui.ActionBar.ActionBarMenu; import org.telegram.ui.ActionBar.ActionBarMenuItem; +import org.telegram.ui.ActionBar.AlertDialog; import org.telegram.ui.ActionBar.BaseFragment; +import org.telegram.ui.ActionBar.Theme; +import org.telegram.ui.ActionBar.ThemeDescription; +import org.telegram.ui.Cells.LanguageCell; import org.telegram.ui.Cells.ShadowSectionCell; +import org.telegram.ui.Components.AlertsCreator; import org.telegram.ui.Components.EmptyTextProgressView; import org.telegram.ui.Components.LayoutHelper; import org.telegram.ui.Components.RecyclerListView; @@ -38,11 +44,16 @@ import org.telegram.ui.Components.RecyclerListView; import java.util.ArrayList; import java.util.Collections; import java.util.Comparator; +import java.util.Locale; import java.util.Timer; import java.util.TimerTask; -import androidx.recyclerview.widget.LinearLayoutManager; -import androidx.recyclerview.widget.RecyclerView; +import kotlin.Unit; +import tw.nekomimi.nekogram.BottomBuilder; +import tw.nekomimi.nekogram.transtale.TranslateDb; +import tw.nekomimi.nekogram.utils.AlertUtil; +import tw.nekomimi.nekogram.utils.ShareUtil; +import tw.nekomimi.nekogram.utils.UIUtil; public class LanguageSelectActivity extends BaseFragment implements NotificationCenter.NotificationCenterDelegate { @@ -150,6 +161,12 @@ public class LanguageSelectActivity extends BaseFragment implements Notification LanguageCell cell = (LanguageCell) view; LocaleController.LocaleInfo localeInfo = cell.getCurrentLocale(); if (localeInfo != null) { + if (localeInfo.toInstall) { + AlertsCreator.createLanguageAlert((LaunchActivity) getParentActivity(),localeInfo.pack,() -> { + finishFragment(); + }).show(); + return; + } LocaleController.getInstance().applyLanguage(localeInfo, true, false, false, true, currentAccount); parentLayout.rebuildAllFragmentViews(false, false); } @@ -162,34 +179,57 @@ public class LanguageSelectActivity extends BaseFragment implements Notification } LanguageCell cell = (LanguageCell) view; LocaleController.LocaleInfo localeInfo = cell.getCurrentLocale(); + if (localeInfo == null || localeInfo.pathToFile == null || localeInfo.isRemote() && localeInfo.serverIndex != Integer.MAX_VALUE) { return false; } - final LocaleController.LocaleInfo finalLocaleInfo = localeInfo; - AlertDialog.Builder builder = new AlertDialog.Builder(getParentActivity()); - builder.setTitle(LocaleController.getString("DeleteLocalizationTitle", R.string.DeleteLocalizationTitle)); - builder.setMessage(AndroidUtilities.replaceTags(LocaleController.formatString("DeleteLocalizationText", R.string.DeleteLocalizationText, localeInfo.name))); - builder.setPositiveButton(LocaleController.getString("Delete", R.string.Delete), (dialogInterface, i) -> { - if (LocaleController.getInstance().deleteLanguage(finalLocaleInfo, currentAccount)) { - fillLanguages(); - if (searchResult != null) { - searchResult.remove(finalLocaleInfo); - } - if (listAdapter != null) { - listAdapter.notifyDataSetChanged(); - } - if (searchListViewAdapter != null) { - searchListViewAdapter.notifyDataSetChanged(); - } - } + + BottomBuilder builder = new BottomBuilder(getParentActivity()); + + builder.addItem(LocaleController.getString("BotShare",R.string.BotShare),R.drawable.baseline_send_24,false,(__) -> { + + builder.dismiss(); + + ShareUtil.shareText(getParentActivity(),"https://t.me/setlanguage/" + localeInfo.shortName.replace('_','-')); + + return Unit.INSTANCE; + }); - builder.setNegativeButton(LocaleController.getString("Cancel", R.string.Cancel), null); - AlertDialog alertDialog = builder.create(); - showDialog(alertDialog); - TextView button = (TextView) alertDialog.getButton(DialogInterface.BUTTON_POSITIVE); - if (button != null) { - button.setTextColor(Theme.getColor(Theme.key_dialogTextRed2)); + + if (!localeInfo.isBuiltIn()) { + + builder.addItem(LocaleController.getString("DeleteLocalizationTitle", R.string.DeleteLocalizationTitle), R.drawable.baseline_delete_24, true, (__) -> { + + builder.dismiss(); + + AlertUtil.showConfirm(getParentActivity(), + LocaleController.getString("DeleteLocalizationTitle", R.string.DeleteLocalizationTitle), + R.drawable.baseline_delete_24, + LocaleController.getString("Delete", R.string.Delete), true, () -> { + + if (LocaleController.getInstance().deleteLanguage(localeInfo, currentAccount)) { + fillLanguages(); + if (searchResult != null) { + searchResult.remove(localeInfo); + } + if (listAdapter != null) { + listAdapter.notifyDataSetChanged(); + } + if (searchListViewAdapter != null) { + searchListViewAdapter.notifyDataSetChanged(); + } + } + + }); + + return Unit.INSTANCE; + + }); + } + + builder.show(); + return true; }); @@ -295,21 +335,64 @@ public class LanguageSelectActivity extends BaseFragment implements Notification long time = System.currentTimeMillis(); ArrayList resultArray = new ArrayList<>(); + boolean noSearch = false; + for (int a = 0, N = unofficialLanguages.size(); a < N; a++) { LocaleController.LocaleInfo c = unofficialLanguages.get(a); - if (c.name.toLowerCase().startsWith(query) || c.nameEnglish.toLowerCase().startsWith(query)) { + if (c.name.toLowerCase().contains(query) || c.nameEnglish.toLowerCase().contains(query)) { resultArray.add(c); + } else if (c.shortName.contains(query)) { + resultArray.add(c); + if (c.shortName.equals(query)) { + noSearch = true; + } } } for (int a = 0, N = sortedLanguages.size(); a < N; a++) { LocaleController.LocaleInfo c = sortedLanguages.get(a); - if (c.name.toLowerCase().startsWith(query) || c.nameEnglish.toLowerCase().startsWith(query)) { + if (c.name.toLowerCase().contains(query) || c.nameEnglish.toLowerCase().contains(query)) { resultArray.add(c); + } else if (c.shortName.contains(query)) { + resultArray.add(c); + if (c.shortName.equals(query)) { + noSearch = true; + } } } updateSearchResults(resultArray); + + if (!noSearch) { + + TLRPC.TL_langpack_getLanguage req = new TLRPC.TL_langpack_getLanguage(); + req.lang_code = query.replace('_', '-'); + req.lang_pack = "android"; + ConnectionsManager.getInstance(currentAccount).sendRequest(req, (response, error) -> AndroidUtilities.runOnUIThread(() -> { + if (response instanceof TLRPC.TL_langPackLanguage) { + TLRPC.TL_langPackLanguage res = (TLRPC.TL_langPackLanguage) response; + if (res.strings_count == 0) return; + resultArray.add(new LocaleController.LocaleInfo() {{ + name = res.native_name; + nameEnglish = res.name; + shortName = res.lang_code; + pluralLangCode = res.plural_code; + baseLangCode = res.base_lang_code; + isRtl = res.rtl; + if (res.official) { + pathToFile = "remote"; + } else { + pathToFile = "unofficial"; + } + toInstall = true; + pack = res; + }}); + updateSearchResults(resultArray); + } + })); + + } + }); } diff --git a/TMessagesProj/src/main/java/org/telegram/ui/LoginActivity.java b/TMessagesProj/src/main/java/org/telegram/ui/LoginActivity.java index 83a61bbeb..74a580ad3 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/LoginActivity.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/LoginActivity.java @@ -18,7 +18,6 @@ import android.annotation.SuppressLint; import android.app.Activity; import android.app.Dialog; import android.content.Context; -import android.content.DialogInterface; import android.content.Intent; import android.content.SharedPreferences; import android.content.pm.PackageInfo; @@ -48,7 +47,6 @@ import android.text.TextUtils; import android.text.TextWatcher; import android.text.method.PasswordTransformationMethod; import android.text.style.ClickableSpan; -import android.util.Base64; import android.util.TypedValue; import android.view.Gravity; import android.view.KeyEvent; @@ -60,6 +58,7 @@ import android.view.animation.AccelerateDecelerateInterpolator; import android.view.animation.Interpolator; import android.view.inputmethod.EditorInfo; import android.widget.AdapterView; +import android.widget.EditText; import android.widget.FrameLayout; import android.widget.ImageView; import android.widget.LinearLayout; @@ -67,27 +66,29 @@ import android.widget.ScrollView; import android.widget.TextView; import android.widget.Toast; +import com.v2ray.ang.util.Utils; + import org.telegram.PhoneFormat.PhoneFormat; +import org.telegram.messenger.AccountInstance; import org.telegram.messenger.AndroidUtilities; -import org.telegram.messenger.BuildConfig; +import org.telegram.messenger.ApplicationLoader; +import org.telegram.messenger.BuildVars; import org.telegram.messenger.ContactsController; +import org.telegram.messenger.FileLog; import org.telegram.messenger.ImageLocation; +import org.telegram.messenger.LocaleController; import org.telegram.messenger.MessageObject; import org.telegram.messenger.MessagesController; import org.telegram.messenger.MessagesStorage; import org.telegram.messenger.NotificationCenter; -import org.telegram.messenger.ApplicationLoader; -import org.telegram.messenger.BuildVars; -import org.telegram.messenger.FileLog; -import org.telegram.messenger.LocaleController; import org.telegram.messenger.R; import org.telegram.messenger.SRPHelper; +import org.telegram.messenger.UserConfig; +import org.telegram.messenger.Utilities; import org.telegram.tgnet.ConnectionsManager; import org.telegram.tgnet.RequestDelegate; import org.telegram.tgnet.SerializedData; import org.telegram.tgnet.TLRPC; -import org.telegram.messenger.UserConfig; -import org.telegram.messenger.Utilities; import org.telegram.ui.ActionBar.ActionBar; import org.telegram.ui.ActionBar.ActionBarMenu; import org.telegram.ui.ActionBar.ActionBarMenuItem; @@ -105,11 +106,13 @@ import org.telegram.ui.Components.EditTextBoldCursor; import org.telegram.ui.Components.HintEditText; import org.telegram.ui.Components.ImageUpdater; import org.telegram.ui.Components.LayoutHelper; +import org.telegram.ui.Components.ProxyDrawable; import org.telegram.ui.Components.RadialProgressView; import org.telegram.ui.Components.SlideView; import java.io.BufferedReader; import java.io.InputStreamReader; +import java.math.BigInteger; import java.util.ArrayList; import java.util.Collections; import java.util.HashMap; @@ -118,12 +121,21 @@ import java.util.Map; import java.util.Set; import java.util.Timer; import java.util.TimerTask; +import java.util.concurrent.atomic.AtomicInteger; +import cn.hutool.core.codec.Base64; +import cn.hutool.core.util.NumberUtil; +import cn.hutool.core.util.StrUtil; +import kotlin.Unit; +import tw.nekomimi.nekogram.BottomBuilder; +import tw.nekomimi.nekogram.DataCenter; import tw.nekomimi.nekogram.EditTextAutoFill; -import tw.nekomimi.nekogram.NekoConfig; +import tw.nekomimi.nekogram.NekoXConfig; +import tw.nekomimi.nekogram.parts.PKCS1Pub; +import tw.nekomimi.nekogram.utils.AlertUtil; @SuppressLint("HardwareIds") -public class LoginActivity extends BaseFragment { +public class LoginActivity extends BaseFragment implements NotificationCenter.NotificationCenterDelegate { private int currentViewNum; private SlideView[] views = new SlideView[9]; @@ -137,7 +149,7 @@ public class LoginActivity extends BaseFragment { private boolean checkPermissions = true; private boolean checkShowPermissions = true; private boolean newAccount; - private boolean syncContacts = false; + private boolean syncContacts; private int scrollHeight; @@ -151,13 +163,16 @@ public class LoginActivity extends BaseFragment { private FrameLayout floatingButtonContainer; private RadialProgressView floatingProgressView; private int progressRequestId; - private boolean[] doneButtonVisible = new boolean[] {true, false}; + private boolean[] doneButtonVisible = new boolean[]{true, false}; private static final int DONE_TYPE_FLOATING = 0; private static final int DONE_TYPE_ACTION = 1; private final static int done_button = 1; + private ActionBarMenuItem proxyItem; + private ProxyDrawable proxyDrawable; + private static class ProgressView extends View { private final Path path = new Path(); @@ -245,6 +260,21 @@ public class LoginActivity extends BaseFragment { } } + @Override + public boolean onFragmentCreate() { + + currentConnectionState = getConnectionsManager().getConnectionState(); + + getNotificationCenter().addObserver(this, NotificationCenter.didUpdateConnectionState); + + return true; + + } + + private int menu_other = 5; + private int menu_custom_api = 6; + private int menu_custom_dc = 7; + @Override public View createView(Context context) { actionBar.setTitle(LocaleController.getString("NekogramWithEmoji", R.string.NekogramWithEmoji)); @@ -258,6 +288,10 @@ public class LoginActivity extends BaseFragment { finishFragment(); } } else if (id == 2) { + presentFragment(new ProxyListActivity()); + } else if (id == 3) { + presentFragment(new LanguageSelectActivity()); + } else if (id == 4) { AlertDialog.Builder builder = new AlertDialog.Builder(context); builder.setTitle(LocaleController.getString("BotLogin", R.string.BotLogin)); @@ -288,15 +322,15 @@ public class LoginActivity extends BaseFragment { String token = editText.getText().toString(); if (token.length() == 0) { - needShowAlert(LocaleController.getString("AppName", R.string.AppName), LocaleController.getString("InvalidAccessToken", R.string.InvalidAccessToken)); + needShowAlert(LocaleController.getString("NekoX", R.string.NekoX), LocaleController.getString("InvalidAccessToken", R.string.InvalidAccessToken)); return; } ConnectionsManager.getInstance(currentAccount).cleanup(false); - final TLRPC.TL_auth_importBotAuthorization req = new TLRPC.TL_auth_importBotAuthorization (); + final TLRPC.TL_auth_importBotAuthorization req = new TLRPC.TL_auth_importBotAuthorization(); - req.api_hash = BuildConfig.APP_HASH; - req.api_id = BuildConfig.APP_ID; + req.api_hash = NekoXConfig.currentAppHash(); + req.api_id = NekoXConfig.currentAppId(); req.bot_auth_token = token; req.flags = 0; int reqId = ConnectionsManager.getInstance(currentAccount).sendRequest(req, (response, error) -> AndroidUtilities.runOnUIThread(() -> { @@ -320,13 +354,16 @@ public class LoginActivity extends BaseFragment { ConnectionsManager.getInstance(currentAccount).updateDcSettings(); needFinishActivity(false); } else { + if (error.code == 401) { + ConnectionsManager.native_cleanUp(currentAccount,true); + } if (error.text != null) { if (error.text.contains("ACCESS_TOKEN_INVALID")) { - needShowAlert(LocaleController.getString("AppName", R.string.AppName), LocaleController.getString("InvalidAccessToken", R.string.InvalidAccessToken)); + needShowAlert(LocaleController.getString("NekoX", R.string.NekoX), LocaleController.getString("InvalidAccessToken", R.string.InvalidAccessToken)); } else if (error.text.startsWith("FLOOD_WAIT")) { - needShowAlert(LocaleController.getString("AppName", R.string.AppName), LocaleController.getString("FloodWait", R.string.FloodWait)); + needShowAlert(LocaleController.getString("NekoX", R.string.NekoX), LocaleController.getString("FloodWait", R.string.FloodWait)); } else if (error.code != -1000) { - needShowAlert(LocaleController.getString("AppName", R.string.AppName), error.text); + needShowAlert(LocaleController.getString("NekoX", R.string.NekoX), error.code + ": " + error.text); } } } @@ -350,7 +387,517 @@ public class LoginActivity extends BaseFragment { editText.setLayoutParams(layoutParams); } } + } else if (id == menu_custom_api) { + + AtomicInteger targetApi = new AtomicInteger(-1); + + BottomBuilder builder = new BottomBuilder(getParentActivity()); + + EditText[] inputs = new EditText[2]; + + builder.addTitle(LocaleController.getString("CustomApi", R.string.CustomApi), + true, + LocaleController.getString("UseCustomApiNotice", R.string.UseCustomApiNotice)); + + builder.addRadioItem(LocaleController.getString("", R.string.CustomApiNo), NekoXConfig.customApi == 0, (cell) -> { + + targetApi.set(0); + + builder.doRadioCheck(cell); + + for (EditText input : inputs) input.setVisibility(View.GONE); + + return Unit.INSTANCE; + + }); + + builder.addRadioItem(LocaleController.getString("CustomApiOfficial", R.string.CustomApiOfficial), NekoXConfig.customApi == 1, (cell) -> { + + targetApi.set(1); + + builder.doRadioCheck(cell); + + for (EditText input : inputs) input.setVisibility(View.GONE); + + return Unit.INSTANCE; + + }); + + builder.addRadioItem(LocaleController.getString("CustomApiTGX", R.string.CustomApiTGX), NekoXConfig.customApi == 2, (cell) -> { + + targetApi.set(2); + + builder.doRadioCheck(cell); + + for (EditText input : inputs) input.setVisibility(View.GONE); + + return Unit.INSTANCE; + + }); + + builder.addRadioItem(LocaleController.getString("CustomApiInput", R.string.CustomApiInput), NekoXConfig.customApi > 2, (cell) -> { + + targetApi.set(3); + + builder.doRadioCheck(cell); + + for (EditText input : inputs) input.setVisibility(View.VISIBLE); + + return Unit.INSTANCE; + + }); + + inputs[0] = builder.addEditText("App Id"); + inputs[0].setInputType(InputType.TYPE_CLASS_NUMBER); + if (NekoXConfig.customAppId != 0) { + inputs[0].setText(NekoXConfig.customAppId + ""); + } + inputs[0].addTextChangedListener(new TextWatcher() { + @Override + public void beforeTextChanged(CharSequence s, int start, int count, int after) { + } + + @Override + public void onTextChanged(CharSequence s, int start, int before, int count) { + if (StrUtil.isBlank(s.toString())) { + NekoXConfig.customAppId = 0; + } else if (!NumberUtil.isInteger(s.toString())) { + inputs[0].setText("0"); + } else { + NekoXConfig.customAppId = NumberUtil.parseInt(s.toString()); + } + } + + @Override + public void afterTextChanged(Editable s) { + } + }); + + inputs[1] = builder.addEditText("App Hash"); + inputs[1].setFilters(new InputFilter[]{new InputFilter.LengthFilter(BuildVars.OFFICAL_APP_HASH.length())}); + if (StrUtil.isNotBlank(NekoXConfig.customAppHash)) { + inputs[1].setText(NekoXConfig.customAppHash); + } + inputs[1].addTextChangedListener(new TextWatcher() { + @Override + public void beforeTextChanged(CharSequence s, int start, int count, int after) { + } + + @Override + public void onTextChanged(CharSequence s, int start, int before, int count) { + NekoXConfig.customAppHash = s.toString(); + } + + @Override + public void afterTextChanged(Editable s) { + } + }); + + if (NekoXConfig.customApi <= 2) { + + for (EditText input : inputs) input.setVisibility(View.GONE); + + } + + builder.addCancelButton(); + + builder.addButton(LocaleController.getString("Set", R.string.Set), (it) -> { + + int target = targetApi.get(); + + if (target > 2) { + + if (NekoXConfig.customAppId == 0) { + + inputs[0].requestFocus(); + AndroidUtilities.showKeyboard(inputs[0]); + + return Unit.INSTANCE; + + } else if (StrUtil.isBlank(NekoXConfig.customAppHash)) { + + inputs[1].requestFocus(); + AndroidUtilities.showKeyboard(inputs[1]); + + return Unit.INSTANCE; + + } + + } + + NekoXConfig.customApi = target; + NekoXConfig.saveCustomApi(); + + builder.dismiss(); + + return Unit.INSTANCE; + + }); + + builder.show(); + + } else if (id == menu_custom_dc) { + + AtomicInteger targetDc = new AtomicInteger(-1); + + BottomBuilder builder = new BottomBuilder(getParentActivity()); + + EditText[] inputs = new EditText[6]; + + builder.addTitle(LocaleController.getString("CustomBackend", R.string.CustomBackend), + true, + LocaleController.getString("CustomBackendNotice", R.string.CustomBackendNotice)); + + int dcType; + + if (ConnectionsManager.native_isTestBackend(currentAccount) != 0) { + dcType = 1; + } else if (MessagesController.getMainSettings(currentAccount).getBoolean("custom_dc", false)) { + dcType = 2; + } else { + dcType = 0; + } + + builder.addRadioItem(LocaleController.getString("CustomBackendProduction", R.string.CustomBackendProduction), dcType == 0, (cell) -> { + + targetDc.set(0); + + builder.doRadioCheck(cell); + + for (EditText input : inputs) input.setVisibility(View.GONE); + + return Unit.INSTANCE; + + }); + + builder.addRadioItem(LocaleController.getString("CustomBackendTestDC", R.string.CustomBackendTestDC), dcType == 1, (cell) -> { + + targetDc.set(1); + + builder.doRadioCheck(cell); + + for (EditText input : inputs) input.setVisibility(View.GONE); + + return Unit.INSTANCE; + + }); + + builder.addRadioItem(LocaleController.getString("CustomApiInput", R.string.CustomApiInput), dcType == 2, (cell) -> { + + targetDc.set(2); + + builder.doRadioCheck(cell); + + for (EditText input : inputs) input.setVisibility(View.VISIBLE); + + return Unit.INSTANCE; + + }); + + inputs[0] = builder.addEditText(LocaleController.getString("CustomBackendIpv4", R.string.CustomBackendIpv4)); + inputs[0].setFilters(new InputFilter[]{new InputFilter.LengthFilter(15)}); + if (StrUtil.isNotBlank(NekoXConfig.customDcIpv4)) { + inputs[0].setText(NekoXConfig.customDcIpv4); + } + inputs[0].addTextChangedListener(new TextWatcher() { + @Override + public void beforeTextChanged(CharSequence s, int start, int count, int after) { + } + + @Override + public void onTextChanged(CharSequence s, int start, int before, int count) { + if (StrUtil.isBlank(s) || Utils.isIpv4Address(s.toString())) { + inputs[0].setError(null); + NekoXConfig.customDcIpv4 = s.toString(); + } else { + inputs[0].setError("Invalid Ipv4 Address"); + } + } + + @Override + public void afterTextChanged(Editable s) { + } + }); + + inputs[1] = builder.addEditText(LocaleController.getString("CustomBackendIpv6", R.string.CustomBackendIpv6)); + if (StrUtil.isNotBlank(NekoXConfig.customDcIpv6)) { + inputs[1].setText(NekoXConfig.customDcIpv6); + } + inputs[1].addTextChangedListener(new TextWatcher() { + @Override + public void beforeTextChanged(CharSequence s, int start, int count, int after) { + } + + @Override + public void onTextChanged(CharSequence s, int start, int before, int count) { + if (StrUtil.isBlank(s) || Utils.isIpv6Address(s.toString())) { + inputs[1].setError(null); + NekoXConfig.customDcIpv6 = s.toString(); + } else { + inputs[1].setError("Invalid Ipv6 Address"); + } + } + + @Override + public void afterTextChanged(Editable s) { + } + }); + + inputs[2] = builder.addEditText(LocaleController.getString("UseProxyPort", R.string.UseProxyPort)); + inputs[2].setInputType(InputType.TYPE_CLASS_NUMBER); + if (NekoXConfig.customDcPort != 0) { + inputs[2].setText(NekoXConfig.customDcPort + ""); + } + inputs[2].setFilters(new InputFilter[]{new InputFilter.LengthFilter(5)}); + inputs[2].addTextChangedListener(new TextWatcher() { + @Override + public void beforeTextChanged(CharSequence s, int start, int count, int after) { + } + + @Override + public void onTextChanged(CharSequence s, int start, int before, int count) { + if (StrUtil.isBlank(s.toString())) { + NekoXConfig.customDcPort = 0; + } else { + NekoXConfig.customDcPort = NumberUtil.parseInt(s.toString()); + if (NekoXConfig.customDcPort <= 0 || NekoXConfig.customDcPort > 65535) { + NekoXConfig.customDcPort = 0; + inputs[2].setError("Invalid Port"); + } else { + inputs[2].setError(null); + } + } + } + + @Override + public void afterTextChanged(Editable s) { + } + }); + + inputs[3] = builder.addEditText(LocaleController.getString("CustomBackendLayer", R.string.CustomBackendLayer)); + inputs[3].setInputType(InputType.TYPE_CLASS_NUMBER); + if (NekoXConfig.customDcLayer != 0) { + inputs[3].setText(NekoXConfig.customDcLayer + ""); + } + inputs[3].setFilters(new InputFilter[]{new InputFilter.LengthFilter(3)}); + inputs[3].addTextChangedListener(new TextWatcher() { + @Override + public void beforeTextChanged(CharSequence s, int start, int count, int after) { + } + + @Override + public void onTextChanged(CharSequence s, int start, int before, int count) { + if (StrUtil.isBlank(s.toString())) { + NekoXConfig.customDcLayer = 0; + } else { + NekoXConfig.customDcLayer = NumberUtil.parseInt(s.toString()); + if (NekoXConfig.customDcLayer > TLRPC.LAYER || NekoXConfig.customDcLayer < 85) { + NekoXConfig.customDcLayer = 0; + inputs[3].setError("Layer not supported"); + } else { + inputs[3].setError(null); + } + } + } + + @Override + public void afterTextChanged(Editable s) { + } + }); + + inputs[4] = builder.addEditText(LocaleController.getString("CustomBackendPublicKey", R.string.CustomBackendPublicKey)); + inputs[4].setInputType(InputType.TYPE_CLASS_TEXT); + inputs[4].setGravity(Gravity.TOP | LocaleController.generateFlagStart()); + inputs[4].setSingleLine(false); + inputs[4].setMinLines(6); + if (StrUtil.isNotBlank(NekoXConfig.customDcPublicKey)) { + inputs[4].setText(NekoXConfig.customDcPublicKey); + } + inputs[4].addTextChangedListener(new TextWatcher() { + @Override + public void beforeTextChanged(CharSequence s, int start, int count, int after) { + } + + @Override + public void onTextChanged(CharSequence s, int start, int before, int count) { + if (StrUtil.isBlank(s.toString())) { + NekoXConfig.customDcPublicKey = ""; + inputs[5].setText(""); + } else { + + try { + + String publicKeyBase64 = s.toString() + .replace("-----BEGIN RSA PUBLIC KEY-----", "") + .replace("-----END RSA PUBLIC KEY-----", ""); + + PKCS1Pub.decodePKCS1PublicKey(Base64.decode(publicKeyBase64)); + + NekoXConfig.customDcPublicKey = s.toString(); + inputs[4].setError(null); + + } catch (Exception e) { + + inputs[4].setError("Invalid PKCS1 Key"); + NekoXConfig.customDcPublicKey = ""; + + } + + } + } + + @Override + public void afterTextChanged(Editable s) { + } + }); + + inputs[5] = builder.addEditText(LocaleController.getString("CustomBackendFingerprint", R.string.CustomBackendFingerprint)); + if (NekoXConfig.customDcFingerprint != 0) { + inputs[5].setText("0x" + Long.toString(NekoXConfig.customDcFingerprint, 16)); + } + inputs[5].addTextChangedListener(new TextWatcher() { + @Override + public void beforeTextChanged(CharSequence s, int start, int count, int after) { + } + + @Override + public void onTextChanged(CharSequence s, int start, int before, int count) { + if (StrUtil.isBlank(s.toString())) { + NekoXConfig.customDcFingerprint = 0; + inputs[5].setError(null); + } else { + String f = s.toString(); + int r = 10; + if (f.startsWith("0x")) { + f = f.substring(2); + r = 16; + } + try { + NekoXConfig.customDcFingerprint = new BigInteger(f, r).longValue(); + inputs[5].setError(null); + } catch (NumberFormatException e) { + NekoXConfig.customDcFingerprint = 0; + inputs[5].setError("Invalid Fingerprint"); + } + } + } + + @Override + public void afterTextChanged(Editable s) { + } + }); + + if (dcType < 2) { + + for (EditText input : inputs) input.setVisibility(View.GONE); + + } + + builder.addCancelButton(); + + builder.addButton(LocaleController.getString("Set", R.string.Set), (it) -> { + + int target = targetDc.get(); + + if (target >= 2) { + + if (inputs[0].getError() != null) { + + inputs[0].requestFocus(); + AndroidUtilities.showKeyboard(inputs[0]); + + return Unit.INSTANCE; + + } else if (inputs[1].getError() != null) { + + inputs[1].requestFocus(); + AndroidUtilities.showKeyboard(inputs[1]); + + return Unit.INSTANCE; + + } else if (NekoXConfig.customDcPort == 0) { + + AlertUtil.showToast("Input Port"); + inputs[2].setError("Port required"); + inputs[2].requestFocus(); + AndroidUtilities.showKeyboard(inputs[2]); + + return Unit.INSTANCE; + + } else if (NekoXConfig.customDcLayer == 0) { + + AlertUtil.showToast("Input Layer"); + inputs[3].setError("Layer required"); + inputs[3].requestFocus(); + AndroidUtilities.showKeyboard(inputs[3]); + + return Unit.INSTANCE; + + } else if (StrUtil.isBlank(NekoXConfig.customDcPublicKey)) { + + AlertUtil.showToast("Input PublicKey"); + inputs[4].setError("PublicKey required"); + inputs[4].requestFocus(); + AndroidUtilities.showKeyboard(inputs[5]); + + return Unit.INSTANCE; + + } else if (NekoXConfig.customDcFingerprint == 0L) { + + AlertUtil.showToast("Input Fingerprint"); + inputs[5].setError("Fingerprint required"); + inputs[5].requestFocus(); + AndroidUtilities.showKeyboard(inputs[5]); + + return Unit.INSTANCE; + + } else if (StrUtil.isBlank(NekoXConfig.customDcIpv4) && StrUtil.isBlank(NekoXConfig.customDcIpv6)) { + + AlertUtil.showToast("Input Address"); + inputs[0].requestFocus(); + AndroidUtilities.showKeyboard(inputs[0]); + + return Unit.INSTANCE; + + } + + } + + if (target == dcType) { + + // do nothing + + } else if (target == 0) { + + DataCenter.applyOfficalDataCanter(currentAccount); + + } else if (target == 1) { + + DataCenter.applyTestDataCenter(currentAccount); + + } else { + + DataCenter.applyCustomDataCenter(currentAccount, + NekoXConfig.customDcIpv4, + NekoXConfig.customDcIpv6, + NekoXConfig.customDcPort, + NekoXConfig.customDcLayer, + NekoXConfig.customDcPublicKey, + NekoXConfig.customDcFingerprint); + + NekoXConfig.saveCustomDc(); + + } + + builder.dismiss(); + + return Unit.INSTANCE; + + }); + + builder.show(); } + } }); @@ -359,7 +906,25 @@ public class LoginActivity extends BaseFragment { doneButtonVisible[DONE_TYPE_ACTION] = false; ActionBarMenu menu = actionBar.createMenu(); - menu.addItem(2, R.drawable.list_bot); + + proxyDrawable = new ProxyDrawable(context); + proxyItem = menu.addItem(2, proxyDrawable); + proxyItem.setContentDescription(LocaleController.getString("ProxySettings", R.string.ProxySettings)); + updateProxyButton(false); + + menu.addItem(3, R.drawable.ic_translate); + + ActionBarMenuItem otherItem = menu.addItem(menu_other, R.drawable.ic_ab_other); + + if (NekoXConfig.developerMode) { + + otherItem.addSubItem(4, R.drawable.list_bot, LocaleController.getString("BotLogin", R.string.BotLogin)); + + } + + otherItem.addSubItem(menu_custom_api, R.drawable.baseline_vpn_key_24, LocaleController.getString("CustomApi", R.string.CustomApi)); + otherItem.addSubItem(menu_custom_dc, R.drawable.baseline_sync_24,LocaleController.getString("CustomBackend", R.string.CustomBackend)); + actionBar.setAllowOverlayTitle(true); doneItem = menu.addItemWithWidth(done_button, R.drawable.ic_done, AndroidUtilities.dp(56)); doneProgressView = new ContextProgressView(context, 1); @@ -491,7 +1056,7 @@ public class LoginActivity extends BaseFragment { Drawable drawable = Theme.createSimpleSelectorCircleDrawable(AndroidUtilities.dp(56), Theme.getColor(Theme.key_chats_actionBackground), Theme.getColor(Theme.key_chats_actionPressedBackground)); if (Build.VERSION.SDK_INT < 21) { Drawable shadowDrawable = context.getResources().getDrawable(R.drawable.floating_shadow).mutate(); - shadowDrawable.setColorFilter(new PorterDuffColorFilter(0xff000000, PorterDuff.Mode.MULTIPLY)); + shadowDrawable.setColorFilter(new PorterDuffColorFilter(0xff000000, PorterDuff.Mode.SRC_IN)); CombinedDrawable combinedDrawable = new CombinedDrawable(shadowDrawable, drawable, 0, 0); combinedDrawable.setIconSize(AndroidUtilities.dp(56), AndroidUtilities.dp(56)); drawable = combinedDrawable; @@ -515,7 +1080,7 @@ public class LoginActivity extends BaseFragment { floatingButtonIcon = new ImageView(context); floatingButtonIcon.setScaleType(ImageView.ScaleType.CENTER); - floatingButtonIcon.setColorFilter(new PorterDuffColorFilter(Theme.getColor(Theme.key_chats_actionIcon), PorterDuff.Mode.MULTIPLY)); + floatingButtonIcon.setColorFilter(new PorterDuffColorFilter(Theme.getColor(Theme.key_chats_actionIcon), PorterDuff.Mode.SRC_IN)); floatingButtonIcon.setImageResource(R.drawable.actionbtn_next); floatingButtonContainer.setContentDescription(LocaleController.getString("Done", R.string.Done)); floatingButtonContainer.addView(floatingButtonIcon, LayoutHelper.createFrame(Build.VERSION.SDK_INT >= 21 ? 56 : 60, Build.VERSION.SDK_INT >= 21 ? 56 : 60)); @@ -566,6 +1131,32 @@ public class LoginActivity extends BaseFragment { return fragmentView; } + private int currentConnectionState; + + @Override + public void didReceivedNotification(int id, int account, Object... args) { + if (id == NotificationCenter.didUpdateConnectionState) { + int state = AccountInstance.getInstance(account).getConnectionsManager().getConnectionState(); + if (currentConnectionState != state) { + currentConnectionState = state; + updateProxyButton(true); + } + } + } + + private void updateProxyButton(boolean animated) { + if (proxyDrawable == null) { + return; + } + SharedPreferences preferences = ApplicationLoader.applicationContext.getSharedPreferences("mainconfig", Activity.MODE_PRIVATE); + String proxyAddress = preferences.getString("proxy_ip", ""); + boolean proxyEnabled; + if (!actionBar.isSearchFieldVisible() && (doneItem == null || doneItem.getVisibility() != View.VISIBLE)) { + proxyItem.setVisibility(View.VISIBLE); + } + proxyDrawable.setConnected(true, currentConnectionState == ConnectionsManager.ConnectionStateConnected || currentConnectionState == ConnectionsManager.ConnectionStateUpdating, animated); + } + @Override public void onPause() { super.onPause(); @@ -652,7 +1243,7 @@ public class LoginActivity extends BaseFragment { SharedPreferences preferences = ApplicationLoader.applicationContext.getSharedPreferences("logininfo2", Context.MODE_PRIVATE); SharedPreferences.Editor editor = preferences.edit(); editor.clear(); - editor.commit(); + editor.apply(); } private void putBundleToEditor(Bundle bundle, SharedPreferences.Editor editor, String prefix) { @@ -758,7 +1349,7 @@ public class LoginActivity extends BaseFragment { return; } AlertDialog.Builder builder = new AlertDialog.Builder(getParentActivity()); - builder.setTitle(LocaleController.getString("AppName", R.string.AppName)); + builder.setTitle(LocaleController.getString("NekoX", R.string.NekoX)); if (banned) { builder.setMessage(LocaleController.getString("BannedPhoneNumber", R.string.BannedPhoneNumber)); } else { @@ -781,7 +1372,7 @@ public class LoginActivity extends BaseFragment { } getParentActivity().startActivity(Intent.createChooser(mailer, "Send email...")); } catch (Exception e) { - needShowAlert(LocaleController.getString("AppName", R.string.AppName), LocaleController.getString("NoMailInstalled", R.string.NoMailInstalled)); + needShowAlert(LocaleController.getString("NekoX", R.string.NekoX), LocaleController.getString("NoMailInstalled", R.string.NoMailInstalled)); } }); builder.setPositiveButton(LocaleController.getString("OK", R.string.OK), null); @@ -904,7 +1495,7 @@ public class LoginActivity extends BaseFragment { views[currentViewNum].onNextPressed(); } } - + private void showEditDoneProgress(final boolean show, boolean animated) { if (doneItemAnimation != null) { doneItemAnimation.cancel(); @@ -1136,7 +1727,7 @@ public class LoginActivity extends BaseFragment { SharedPreferences.Editor editor = preferences.edit(); editor.clear(); putBundleToEditor(bundle, editor, null); - editor.commit(); + editor.apply(); } catch (Exception e) { FileLog.e(e); } @@ -1147,7 +1738,7 @@ public class LoginActivity extends BaseFragment { if (getParentActivity() instanceof LaunchActivity) { if (newAccount) { newAccount = false; - ((LaunchActivity) getParentActivity()).switchToAccount(currentAccount, false); + ((LaunchActivity) getParentActivity()).switchToAccount(currentAccount, false, true); finishFragment(); } else { final Bundle args = new Bundle(); @@ -1182,6 +1773,36 @@ public class LoginActivity extends BaseFragment { needFinishActivity(afterSignup); } + private void fillNextCodeParamsSilent(Bundle params, TLRPC.TL_auth_sentCode res) { + params.putString("phoneHash", res.phone_code_hash); + if (res.next_type instanceof TLRPC.TL_auth_codeTypeCall) { + params.putInt("nextType", 4); + } else if (res.next_type instanceof TLRPC.TL_auth_codeTypeFlashCall) { + params.putInt("nextType", 3); + } else if (res.next_type instanceof TLRPC.TL_auth_codeTypeSms) { + params.putInt("nextType", 2); + } + if (res.type instanceof TLRPC.TL_auth_sentCodeTypeApp) { + params.putInt("type", 1); + params.putInt("length", res.type.length); + } else { + if (res.timeout == 0) { + res.timeout = 60; + } + params.putInt("timeout", res.timeout * 1000); + if (res.type instanceof TLRPC.TL_auth_sentCodeTypeCall) { + params.putInt("type", 4); + params.putInt("length", res.type.length); + } else if (res.type instanceof TLRPC.TL_auth_sentCodeTypeFlashCall) { + params.putInt("type", 3); + params.putString("pattern", res.type.pattern); + } else if (res.type instanceof TLRPC.TL_auth_sentCodeTypeSms) { + params.putInt("type", 2); + params.putInt("length", res.type.length); + } + } + } + private void fillNextCodeParams(Bundle params, TLRPC.TL_auth_sentCode res) { params.putString("phoneHash", res.phone_code_hash); if (res.next_type instanceof TLRPC.TL_auth_codeTypeCall) { @@ -1218,6 +1839,8 @@ public class LoginActivity extends BaseFragment { private TLRPC.TL_help_termsOfService currentTermsOfService; + private boolean allowFlashCall; + public class PhoneView extends SlideView implements AdapterView.OnItemSelectedListener { private EditTextBoldCursor codeField; @@ -1227,7 +1850,7 @@ public class LoginActivity extends BaseFragment { private TextView textView; private TextView textView2; private CheckBoxCell checkBoxCell; - private CheckBoxCell testBackendCell; + private CheckBoxCell allowFlashCallCell; private int countryState = 0; @@ -1505,74 +2128,64 @@ public class LoginActivity extends BaseFragment { textView2.setLineSpacing(AndroidUtilities.dp(2), 1.0f); addView(textView2, LayoutHelper.createLinear(LayoutHelper.WRAP_CONTENT, LayoutHelper.WRAP_CONTENT, LocaleController.isRTL ? Gravity.RIGHT : Gravity.LEFT, 0, 28, 0, 10)); - if (true) { - checkBoxCell = new CheckBoxCell(context, 2); - checkBoxCell.setText(LocaleController.getString("SyncContacts", R.string.SyncContacts), "", syncContacts, false); - addView(checkBoxCell, LayoutHelper.createLinear(LayoutHelper.WRAP_CONTENT, LayoutHelper.MATCH_PARENT, Gravity.LEFT | Gravity.TOP, 0, 0, 0, 0)); - checkBoxCell.setOnClickListener(new OnClickListener() { + checkBoxCell = new CheckBoxCell(context, 2); + checkBoxCell.setText(LocaleController.getString("SyncContacts", R.string.SyncContacts), "", syncContacts, false); + addView(checkBoxCell, LayoutHelper.createLinear(LayoutHelper.WRAP_CONTENT, LayoutHelper.MATCH_PARENT, Gravity.LEFT | Gravity.TOP)); + checkBoxCell.setOnClickListener(new OnClickListener() { - private Toast visibleToast; + private Toast visibleToast; - @Override - public void onClick(View v) { - if (getParentActivity() == null) { - return; - } - CheckBoxCell cell = (CheckBoxCell) v; - syncContacts = !syncContacts; - cell.setChecked(syncContacts, true); - try { - if (visibleToast != null) { - visibleToast.cancel(); - } - } catch (Exception e) { - FileLog.e(e); - } - if (syncContacts) { - visibleToast = Toast.makeText(getParentActivity(), LocaleController.getString("SyncContactsOn", R.string.SyncContactsOn), Toast.LENGTH_SHORT); - visibleToast.show(); - } else { - visibleToast = Toast.makeText(getParentActivity(), LocaleController.getString("SyncContactsOff", R.string.SyncContactsOff), Toast.LENGTH_SHORT); - visibleToast.show(); - } + @Override + public void onClick(View v) { + if (getParentActivity() == null) { + return; } - }); - } - - if (NekoConfig.showHiddenFeature) { - testBackendCell = new CheckBoxCell(context, 2); - testBackendCell.setText(LocaleController.getString("TestBackend", R.string.TestBackend), "", ConnectionsManager.native_isTestBackend(currentAccount) != 0, false); - addView(testBackendCell, LayoutHelper.createLinear(LayoutHelper.WRAP_CONTENT, LayoutHelper.MATCH_PARENT, Gravity.LEFT | Gravity.TOP, 0, 0, 0, 0)); - testBackendCell.setOnClickListener(new OnClickListener() { - - private Toast visibleToast; - - @Override - public void onClick(View v) { - if (getParentActivity() == null) { - return; - } - CheckBoxCell cell = (CheckBoxCell) v; - ConnectionsManager.native_switchBackend(currentAccount); - boolean isTestBackend = ConnectionsManager.native_isTestBackend(currentAccount) != 0; - cell.setChecked(isTestBackend, true); - try { - if (visibleToast != null) { - visibleToast.cancel(); - } - } catch (Exception e) { - FileLog.e(e); - } - if (isTestBackend) { - visibleToast = Toast.makeText(getParentActivity(), LocaleController.getString("TestBackendOn", R.string.TestBackendOn), Toast.LENGTH_SHORT); - visibleToast.show(); - } else { - visibleToast = Toast.makeText(getParentActivity(), LocaleController.getString("TestBackendOff", R.string.TestBackendOff), Toast.LENGTH_SHORT); - visibleToast.show(); + CheckBoxCell cell = (CheckBoxCell) v; + syncContacts = !syncContacts; + cell.setChecked(syncContacts, true); + try { + if (visibleToast != null) { + visibleToast.cancel(); } + } catch (Exception e) { + FileLog.e(e); } - }); + if (syncContacts) { + visibleToast = Toast.makeText(getParentActivity(), LocaleController.getString("SyncContactsOn", R.string.SyncContactsOn), Toast.LENGTH_SHORT); + visibleToast.show(); + } else { + visibleToast = Toast.makeText(getParentActivity(), LocaleController.getString("SyncContactsOff", R.string.SyncContactsOff), Toast.LENGTH_SHORT); + visibleToast.show(); + } + } + }); + + TelephonyManager tm = (TelephonyManager) ApplicationLoader.applicationContext.getSystemService(Context.TELEPHONY_SERVICE); + if (BuildVars.DEBUG_VERSION) { + FileLog.d("sim status = " + tm.getSimState()); } + int state = tm.getSimState(); + boolean simcardAvailable = state != TelephonyManager.SIM_STATE_ABSENT && state != TelephonyManager.SIM_STATE_UNKNOWN && tm.getPhoneType() != TelephonyManager.PHONE_TYPE_NONE && !AndroidUtilities.isAirplaneModeOn(); + boolean allowCall = true; + boolean allowCancelCall = true; + boolean allowReadCallLog = true; + if (Build.VERSION.SDK_INT >= 23 && simcardAvailable) { + allowCall = getParentActivity().checkSelfPermission(Manifest.permission.READ_PHONE_STATE) == PackageManager.PERMISSION_GRANTED; + allowCancelCall = getParentActivity().checkSelfPermission(Manifest.permission.CALL_PHONE) == PackageManager.PERMISSION_GRANTED; + allowReadCallLog = Build.VERSION.SDK_INT < 28 || getParentActivity().checkSelfPermission(Manifest.permission.READ_CALL_LOG) == PackageManager.PERMISSION_GRANTED; + } + allowFlashCall = simcardAvailable && allowCall && allowCancelCall && allowReadCallLog; + + allowFlashCallCell = new CheckBoxCell(context, 2); + allowFlashCallCell.setText(LocaleController.getString("AllowFlashCall", R.string.AllowFlashCall), "", allowFlashCall, false); + addView(allowFlashCallCell, LayoutHelper.createLinear(LayoutHelper.WRAP_CONTENT, LayoutHelper.MATCH_PARENT, Gravity.LEFT | Gravity.TOP)); + allowFlashCallCell.setOnClickListener(v -> { + if (getParentActivity() == null) { + return; + } + CheckBoxCell cell = (CheckBoxCell) v; + cell.setChecked(allowFlashCall = !allowFlashCall, true); + }); HashMap languageMap = new HashMap<>(); try { @@ -1686,59 +2299,6 @@ public class LoginActivity extends BaseFragment { if (getParentActivity() == null || nextPressed) { return; } - TelephonyManager tm = (TelephonyManager) ApplicationLoader.applicationContext.getSystemService(Context.TELEPHONY_SERVICE); - if (BuildVars.DEBUG_VERSION) { - FileLog.d("sim status = " + tm.getSimState()); - } - int state = tm.getSimState(); - boolean simcardAvailable = state != TelephonyManager.SIM_STATE_ABSENT && state != TelephonyManager.SIM_STATE_UNKNOWN && tm.getPhoneType() != TelephonyManager.PHONE_TYPE_NONE && !AndroidUtilities.isAirplaneModeOn(); - boolean allowCall = true; - boolean allowCancelCall = true; - boolean allowReadCallLog = true; - if (Build.VERSION.SDK_INT >= 23 && simcardAvailable) { - allowCall = getParentActivity().checkSelfPermission(Manifest.permission.READ_PHONE_STATE) == PackageManager.PERMISSION_GRANTED; - allowCancelCall = getParentActivity().checkSelfPermission(Manifest.permission.CALL_PHONE) == PackageManager.PERMISSION_GRANTED; - allowReadCallLog = Build.VERSION.SDK_INT < 28 || getParentActivity().checkSelfPermission(Manifest.permission.READ_CALL_LOG) == PackageManager.PERMISSION_GRANTED; - /*if (checkPermissions) { - permissionsItems.clear(); - if (!allowCall) { - permissionsItems.add(Manifest.permission.READ_PHONE_STATE); - } - if (!allowCancelCall) { - permissionsItems.add(Manifest.permission.CALL_PHONE); - } - if (!allowReadCallLog) { - permissionsItems.add(Manifest.permission.READ_CALL_LOG); - } - boolean ok = true; - if (!permissionsItems.isEmpty()) { - SharedPreferences preferences = MessagesController.getGlobalMainSettings(); - if (preferences.getBoolean("firstlogin", true) || getParentActivity().shouldShowRequestPermissionRationale(Manifest.permission.READ_PHONE_STATE) || getParentActivity().shouldShowRequestPermissionRationale(Manifest.permission.READ_CALL_LOG)) { - preferences.edit().putBoolean("firstlogin", false).commit(); - AlertDialog.Builder builder = new AlertDialog.Builder(getParentActivity()); - builder.setTitle(LocaleController.getString("AppName", R.string.AppName)); - builder.setPositiveButton(LocaleController.getString("OK", R.string.OK), null); - if (!allowCall && (!allowCancelCall || !allowReadCallLog)) { - builder.setMessage(LocaleController.getString("AllowReadCallAndLog", R.string.AllowReadCallAndLog)); - } else if (!allowCancelCall || !allowReadCallLog) { - builder.setMessage(LocaleController.getString("AllowReadCallLog", R.string.AllowReadCallLog)); - } else { - builder.setMessage(LocaleController.getString("AllowReadCall", R.string.AllowReadCall)); - } - permissionsDialog = showDialog(builder.create()); - } else { - try { - getParentActivity().requestPermissions(permissionsItems.toArray(new String[0]), 6); - } catch (Exception ignore) { - ok = false; - } - } - if (ok) { - return; - } - } - }*/ - } if (countryState == 1) { needShowAlert(LocaleController.getString("NekogramWithEmoji", R.string.NekogramWithEmoji), LocaleController.getString("ChooseCountry", R.string.ChooseCountry)); return; @@ -1747,7 +2307,7 @@ public class LoginActivity extends BaseFragment { return; } if (codeField.length() == 0) { - needShowAlert(LocaleController.getString("NekogramWithEmoji", R.string.NekogramWithEmoji), LocaleController.getString("InvalidPhoneNumber", R.string.InvalidPhoneNumber)); + needShowAlert(LocaleController.getString("NekoX", R.string.NekoX), LocaleController.getString("InvalidPhoneNumber", R.string.InvalidPhoneNumber)); return; } if (phoneField.length() == 0) { @@ -1782,33 +2342,12 @@ public class LoginActivity extends BaseFragment { ConnectionsManager.getInstance(currentAccount).cleanup(false); final TLRPC.TL_auth_sendCode req = new TLRPC.TL_auth_sendCode(); - req.api_hash = BuildConfig.APP_HASH; - req.api_id = BuildConfig.APP_ID; + req.api_hash = NekoXConfig.currentAppHash(); + req.api_id = NekoXConfig.currentAppId(); req.phone_number = phone; req.settings = new TLRPC.TL_codeSettings(); - req.settings.allow_flashcall = simcardAvailable && allowCall && allowCancelCall && allowReadCallLog; - req.settings.allow_app_hash = ApplicationLoader.hasPlayServices; - SharedPreferences preferences = ApplicationLoader.applicationContext.getSharedPreferences("mainconfig", Activity.MODE_PRIVATE); - if (req.settings.allow_flashcall) { - try { - String number = tm.getLine1Number(); - if (!TextUtils.isEmpty(number)) { - req.settings.current_number = PhoneNumberUtils.compare(phone, number); - if (!req.settings.current_number) { - req.settings.allow_flashcall = false; - } - } else { - if (UserConfig.getActivatedAccountsCount() > 0) { - req.settings.allow_flashcall = false; - } else { - req.settings.current_number = false; - } - } - } catch (Exception e) { - req.settings.allow_flashcall = false; - FileLog.e(e); - } - } + req.settings.allow_flashcall = allowFlashCall; + req.settings.allow_app_hash = false; final Bundle params = new Bundle(); params.putString("phone", "+" + codeField.getText() + " " + phoneField.getText()); try { @@ -1822,25 +2361,111 @@ public class LoginActivity extends BaseFragment { int reqId = ConnectionsManager.getInstance(currentAccount).sendRequest(req, (response, error) -> AndroidUtilities.runOnUIThread(() -> { nextPressed = false; if (error == null) { + if (phone.startsWith("99966")) { + fillNextCodeParamsSilent(params, (TLRPC.TL_auth_sentCode) response); + String phoneHash = ((TLRPC.TL_auth_sentCode) response).phone_code_hash; + String dcId = phone.substring(5, 6); + final TLRPC.TL_auth_signIn reqI = new TLRPC.TL_auth_signIn(); + reqI.phone_number = phone; + reqI.phone_code = dcId + dcId + dcId + dcId + dcId; + reqI.phone_code_hash = phoneHash; + int reqIdI = ConnectionsManager.getInstance(currentAccount).sendRequest(reqI, (responseI, errorI) -> AndroidUtilities.runOnUIThread(() -> { + boolean ok = false; + if (errorI == null) { + nextPressed = false; + ok = true; + showDoneButton(false, true); + if (responseI instanceof TLRPC.TL_auth_authorizationSignUpRequired) { + TLRPC.TL_auth_authorizationSignUpRequired authorization = (TLRPC.TL_auth_authorizationSignUpRequired) responseI; + if (authorization.terms_of_service != null) { + currentTermsOfService = authorization.terms_of_service; + } + Bundle paramsI = new Bundle(); + paramsI.putString("phoneFormated", phone); + paramsI.putString("phoneHash", phoneHash); + paramsI.putString("code", reqI.phone_code); + setPage(5, true, params, false); + } else { + onAuthSuccess((TLRPC.TL_auth_authorization) responseI); + } + } else { + if (errorI.text.contains("SESSION_PASSWORD_NEEDED")) { + ok = true; + TLRPC.TL_account_getPassword req2 = new TLRPC.TL_account_getPassword(); + ConnectionsManager.getInstance(currentAccount).sendRequest(req2, (response1, error1) -> AndroidUtilities.runOnUIThread(() -> { + nextPressed = false; + showDoneButton(false, true); + if (error1 == null) { + TLRPC.TL_account_password password = (TLRPC.TL_account_password) response1; + if (!TwoStepVerificationActivity.canHandleCurrentPassword(password, true)) { + AlertsCreator.showUpdateAppAlert(getParentActivity(), LocaleController.getString("UpdateAppAlert", R.string.UpdateAppAlert), true); + return; + } + Bundle bundle = new Bundle(); + if (password.current_algo instanceof TLRPC.TL_passwordKdfAlgoSHA256SHA256PBKDF2HMACSHA512iter100000SHA256ModPow) { + TLRPC.TL_passwordKdfAlgoSHA256SHA256PBKDF2HMACSHA512iter100000SHA256ModPow algo = (TLRPC.TL_passwordKdfAlgoSHA256SHA256PBKDF2HMACSHA512iter100000SHA256ModPow) password.current_algo; + bundle.putString("current_salt1", Utilities.bytesToHex(algo.salt1)); + bundle.putString("current_salt2", Utilities.bytesToHex(algo.salt2)); + bundle.putString("current_p", Utilities.bytesToHex(algo.p)); + bundle.putInt("current_g", algo.g); + bundle.putString("current_srp_B", Utilities.bytesToHex(password.srp_B)); + bundle.putLong("current_srp_id", password.srp_id); + bundle.putInt("passwordType", 1); + } + bundle.putString("hint", password.hint != null ? password.hint : ""); + bundle.putString("email_unconfirmed_pattern", password.email_unconfirmed_pattern != null ? password.email_unconfirmed_pattern : ""); + bundle.putString("phoneFormated", phone); + bundle.putString("phoneHash", phoneHash); + bundle.putString("code", reqI.phone_code); + bundle.putInt("has_recovery", password.has_recovery ? 1 : 0); + setPage(6, true, bundle, false); + } else { + needShowAlert(LocaleController.getString("NekoX", R.string.NekoX), error1.text); + } + }), ConnectionsManager.RequestFlagFailOnServerErrors | ConnectionsManager.RequestFlagWithoutLogin); + } else { + nextPressed = false; + showDoneButton(false, true); + + if (errorI.text.contains("PHONE_NUMBER_INVALID")) { + needShowAlert(LocaleController.getString("NekoX", R.string.NekoX), LocaleController.getString("InvalidPhoneNumber", R.string.InvalidPhoneNumber)); + } else if (errorI.text.contains("PHONE_CODE_EMPTY") || errorI.text.contains("PHONE_CODE_INVALID")) { + needShowAlert(LocaleController.getString("NekoX", R.string.NekoX), LocaleController.getString("InvalidCode", R.string.InvalidCode)); + } else if (errorI.text.contains("PHONE_CODE_EXPIRED")) { + onBackPressed(true); + setPage(0, true, null, true); + needShowAlert(LocaleController.getString("NekoX", R.string.NekoX), LocaleController.getString("CodeExpired", R.string.CodeExpired)); + } else if (errorI.text.startsWith("FLOOD_WAIT")) { + needShowAlert(LocaleController.getString("NekoX", R.string.NekoX), LocaleController.getString("FloodWait", R.string.FloodWait)); + } else { + needShowAlert(LocaleController.getString("NekoX", R.string.NekoX), LocaleController.getString("ErrorOccurred", R.string.ErrorOccurred) + "\n" + errorI.text); + } + } + } + }), ConnectionsManager.RequestFlagFailOnServerErrors | ConnectionsManager.RequestFlagWithoutLogin); + needShowProgress(reqIdI, false); + showDoneButton(true, true); + return; + } fillNextCodeParams(params, (TLRPC.TL_auth_sentCode) response); } else { if (error.text != null) { if (error.text.contains("PHONE_NUMBER_INVALID")) { needShowInvalidAlert(req.phone_number, false); } else if (error.text.contains("PHONE_PASSWORD_FLOOD")) { - needShowAlert(LocaleController.getString("AppName", R.string.AppName), LocaleController.getString("FloodWait", R.string.FloodWait)); + needShowAlert(LocaleController.getString("NekoX", R.string.NekoX), LocaleController.getString("FloodWait", R.string.FloodWait)); } else if (error.text.contains("PHONE_NUMBER_FLOOD")) { - needShowAlert(LocaleController.getString("AppName", R.string.AppName), LocaleController.getString("PhoneNumberFlood", R.string.PhoneNumberFlood)); + needShowAlert(LocaleController.getString("NekoX", R.string.NekoX), LocaleController.getString("PhoneNumberFlood", R.string.PhoneNumberFlood)); } else if (error.text.contains("PHONE_NUMBER_BANNED")) { needShowInvalidAlert(req.phone_number, true); } else if (error.text.contains("PHONE_CODE_EMPTY") || error.text.contains("PHONE_CODE_INVALID")) { - needShowAlert(LocaleController.getString("AppName", R.string.AppName), LocaleController.getString("InvalidCode", R.string.InvalidCode)); + needShowAlert(LocaleController.getString("NekoX", R.string.NekoX), LocaleController.getString("InvalidCode", R.string.InvalidCode)); } else if (error.text.contains("PHONE_CODE_EXPIRED")) { - needShowAlert(LocaleController.getString("AppName", R.string.AppName), LocaleController.getString("CodeExpired", R.string.CodeExpired)); + needShowAlert(LocaleController.getString("NekoX", R.string.NekoX), LocaleController.getString("CodeExpired", R.string.CodeExpired)); } else if (error.text.startsWith("FLOOD_WAIT")) { - needShowAlert(LocaleController.getString("AppName", R.string.AppName), LocaleController.getString("FloodWait", R.string.FloodWait)); + needShowAlert(LocaleController.getString("NekoX", R.string.NekoX), LocaleController.getString("FloodWait", R.string.FloodWait)); } else if (error.code != -1000) { - needShowAlert(LocaleController.getString("AppName", R.string.AppName), error.text); + needShowAlert(LocaleController.getString("NekoX", R.string.NekoX), error.text); } } } @@ -1866,7 +2491,7 @@ public class LoginActivity extends BaseFragment { if (preferences.getBoolean("firstloginshow", true) || getParentActivity().shouldShowRequestPermissionRationale(Manifest.permission.READ_PHONE_STATE)) { preferences.edit().putBoolean("firstloginshow", false).commit(); AlertDialog.Builder builder = new AlertDialog.Builder(getParentActivity()); - builder.setTitle(LocaleController.getString("AppName", R.string.AppName)); + builder.setTitle(LocaleController.getString("NekoX", R.string.NekoX)); builder.setPositiveButton(LocaleController.getString("OK", R.string.OK), null); builder.setMessage(LocaleController.getString("AllowFillNumber", R.string.AllowFillNumber)); permissionsShowDialog = showDialog(builder.create()); @@ -2039,19 +2664,19 @@ public class LoginActivity extends BaseFragment { if (currentType == 1) { blackImageView = new ImageView(context); blackImageView.setImageResource(R.drawable.sms_devices); - blackImageView.setColorFilter(new PorterDuffColorFilter(Theme.getColor(Theme.key_windowBackgroundWhiteBlackText), PorterDuff.Mode.MULTIPLY)); + blackImageView.setColorFilter(new PorterDuffColorFilter(Theme.getColor(Theme.key_windowBackgroundWhiteBlackText), PorterDuff.Mode.SRC_IN)); frameLayout.addView(blackImageView, LayoutHelper.createFrame(LayoutHelper.WRAP_CONTENT, LayoutHelper.WRAP_CONTENT, Gravity.LEFT | Gravity.TOP, 0, 0, 0, 0)); blueImageView = new ImageView(context); blueImageView.setImageResource(R.drawable.sms_bubble); - blueImageView.setColorFilter(new PorterDuffColorFilter(Theme.getColor(Theme.key_chats_actionBackground), PorterDuff.Mode.MULTIPLY)); + blueImageView.setColorFilter(new PorterDuffColorFilter(Theme.getColor(Theme.key_chats_actionBackground), PorterDuff.Mode.SRC_IN)); frameLayout.addView(blueImageView, LayoutHelper.createFrame(LayoutHelper.WRAP_CONTENT, LayoutHelper.WRAP_CONTENT, Gravity.LEFT | Gravity.TOP, 0, 0, 0, 0)); titleTextView.setText(LocaleController.getString("SentAppCodeTitle", R.string.SentAppCodeTitle)); } else { blueImageView = new ImageView(context); blueImageView.setImageResource(R.drawable.sms_code); - blueImageView.setColorFilter(new PorterDuffColorFilter(Theme.getColor(Theme.key_chats_actionBackground), PorterDuff.Mode.MULTIPLY)); + blueImageView.setColorFilter(new PorterDuffColorFilter(Theme.getColor(Theme.key_chats_actionBackground), PorterDuff.Mode.SRC_IN)); frameLayout.addView(blueImageView, LayoutHelper.createFrame(LayoutHelper.WRAP_CONTENT, LayoutHelper.WRAP_CONTENT, Gravity.LEFT | Gravity.TOP, 0, 0, 0, 0)); titleTextView.setText(LocaleController.getString("SentSmsCodeTitle", R.string.SentSmsCodeTitle)); @@ -2128,7 +2753,7 @@ public class LoginActivity extends BaseFragment { mailer.putExtra(Intent.EXTRA_TEXT, "Phone: " + requestPhone + "\nApp version: " + version + "\nOS version: SDK " + Build.VERSION.SDK_INT + "\nDevice Name: " + Build.MANUFACTURER + Build.MODEL + "\nLocale: " + Locale.getDefault() + "\nError: " + lastError); getContext().startActivity(Intent.createChooser(mailer, "Send email...")); } catch (Exception e) { - needShowAlert(LocaleController.getString("AppName", R.string.AppName), LocaleController.getString("NoMailInstalled", R.string.NoMailInstalled)); + needShowAlert(LocaleController.getString("NekoX", R.string.NekoX), LocaleController.getString("NoMailInstalled", R.string.NoMailInstalled)); } } }); @@ -2201,17 +2826,17 @@ public class LoginActivity extends BaseFragment { } else { if (error.text != null) { if (error.text.contains("PHONE_NUMBER_INVALID")) { - needShowAlert(LocaleController.getString("AppName", R.string.AppName), LocaleController.getString("InvalidPhoneNumber", R.string.InvalidPhoneNumber)); + needShowAlert(LocaleController.getString("NekoX", R.string.NekoX), LocaleController.getString("InvalidPhoneNumber", R.string.InvalidPhoneNumber)); } else if (error.text.contains("PHONE_CODE_EMPTY") || error.text.contains("PHONE_CODE_INVALID")) { - needShowAlert(LocaleController.getString("AppName", R.string.AppName), LocaleController.getString("InvalidCode", R.string.InvalidCode)); + needShowAlert(LocaleController.getString("NekoX", R.string.NekoX), LocaleController.getString("InvalidCode", R.string.InvalidCode)); } else if (error.text.contains("PHONE_CODE_EXPIRED")) { onBackPressed(true); setPage(0, true, null, true); - needShowAlert(LocaleController.getString("AppName", R.string.AppName), LocaleController.getString("CodeExpired", R.string.CodeExpired)); + needShowAlert(LocaleController.getString("NekoX", R.string.NekoX), LocaleController.getString("CodeExpired", R.string.CodeExpired)); } else if (error.text.startsWith("FLOOD_WAIT")) { - needShowAlert(LocaleController.getString("AppName", R.string.AppName), LocaleController.getString("FloodWait", R.string.FloodWait)); + needShowAlert(LocaleController.getString("NekoX", R.string.NekoX), LocaleController.getString("FloodWait", R.string.FloodWait)); } else if (error.code != -1000) { - needShowAlert(LocaleController.getString("AppName", R.string.AppName), LocaleController.getString("ErrorOccurred", R.string.ErrorOccurred) + "\n" + error.text); + needShowAlert(LocaleController.getString("NekoX", R.string.NekoX), LocaleController.getString("ErrorOccurred", R.string.ErrorOccurred) + "\n" + error.text); } } } @@ -2273,7 +2898,7 @@ public class LoginActivity extends BaseFragment { codeField[a].setCursorWidth(1.5f); Drawable pressedDrawable = getResources().getDrawable(R.drawable.search_dark_activated).mutate(); - pressedDrawable.setColorFilter(new PorterDuffColorFilter(Theme.getColor(Theme.key_windowBackgroundWhiteInputFieldActivated), PorterDuff.Mode.MULTIPLY)); + pressedDrawable.setColorFilter(new PorterDuffColorFilter(Theme.getColor(Theme.key_windowBackgroundWhiteInputFieldActivated), PorterDuff.Mode.SRC_IN)); codeField[a].setBackgroundDrawable(pressedDrawable); codeField[a].setImeOptions(EditorInfo.IME_ACTION_NEXT | EditorInfo.IME_FLAG_NO_EXTRACT_UI); @@ -2417,23 +3042,7 @@ public class LoginActivity extends BaseFragment { problemText.setVisibility(time < 1000 ? VISIBLE : GONE); timeText.setVisibility(time < 1000 ? GONE : VISIBLE); - SharedPreferences preferences = ApplicationLoader.applicationContext.getSharedPreferences("mainconfig", Activity.MODE_PRIVATE); - String hash = preferences.getString("sms_hash", null); - String savedCode = null; - if (!TextUtils.isEmpty(hash)) { - savedCode = preferences.getString("sms_hash_code", null); - if (savedCode != null && savedCode.contains(hash + "|")) { - savedCode = savedCode.substring(savedCode.indexOf('|') + 1); - } else { - savedCode = null; - } - } - if (savedCode != null) { - codeField[0].setText(savedCode); - onNextPressed(); - } else { - createTimer(); - } + createTimer(); } else if (currentType == 4 && nextType == 2) { timeText.setText(LocaleController.formatString("SmsText", R.string.SmsText, 2, 0)); problemText.setVisibility(time < 1000 ? VISIBLE : GONE); @@ -2655,7 +3264,7 @@ public class LoginActivity extends BaseFragment { bundle.putInt("has_recovery", password.has_recovery ? 1 : 0); setPage(6, true, bundle, false); } else { - needShowAlert(LocaleController.getString("AppName", R.string.AppName), error1.text); + needShowAlert(LocaleController.getString("NekoX", R.string.NekoX), error1.text); } }), ConnectionsManager.RequestFlagFailOnServerErrors | ConnectionsManager.RequestFlagWithoutLogin); destroyTimer(); @@ -2676,9 +3285,9 @@ public class LoginActivity extends BaseFragment { waitingForEvent = true; if (currentType != 3) { if (error.text.contains("PHONE_NUMBER_INVALID")) { - needShowAlert(LocaleController.getString("AppName", R.string.AppName), LocaleController.getString("InvalidPhoneNumber", R.string.InvalidPhoneNumber)); + needShowAlert(LocaleController.getString("NekoX", R.string.NekoX), LocaleController.getString("InvalidPhoneNumber", R.string.InvalidPhoneNumber)); } else if (error.text.contains("PHONE_CODE_EMPTY") || error.text.contains("PHONE_CODE_INVALID")) { - needShowAlert(LocaleController.getString("AppName", R.string.AppName), LocaleController.getString("InvalidCode", R.string.InvalidCode)); + needShowAlert(LocaleController.getString("NekoX", R.string.NekoX), LocaleController.getString("InvalidCode", R.string.InvalidCode)); for (int a = 0; a < codeField.length; a++) { codeField[a].setText(""); } @@ -2686,11 +3295,11 @@ public class LoginActivity extends BaseFragment { } else if (error.text.contains("PHONE_CODE_EXPIRED")) { onBackPressed(true); setPage(0, true, null, true); - needShowAlert(LocaleController.getString("AppName", R.string.AppName), LocaleController.getString("CodeExpired", R.string.CodeExpired)); + needShowAlert(LocaleController.getString("NekoX", R.string.NekoX), LocaleController.getString("CodeExpired", R.string.CodeExpired)); } else if (error.text.startsWith("FLOOD_WAIT")) { - needShowAlert(LocaleController.getString("AppName", R.string.AppName), LocaleController.getString("FloodWait", R.string.FloodWait)); + needShowAlert(LocaleController.getString("NekoX", R.string.NekoX), LocaleController.getString("FloodWait", R.string.FloodWait)); } else { - needShowAlert(LocaleController.getString("AppName", R.string.AppName), LocaleController.getString("ErrorOccurred", R.string.ErrorOccurred) + "\n" + error.text); + needShowAlert(LocaleController.getString("NekoX", R.string.NekoX), LocaleController.getString("ErrorOccurred", R.string.ErrorOccurred) + "\n" + error.text); } } } @@ -2947,9 +3556,9 @@ public class LoginActivity extends BaseFragment { } else { timeString = LocaleController.formatPluralString("Minutes", time / 60); } - needShowAlert(LocaleController.getString("AppName", R.string.AppName), LocaleController.formatString("FloodWaitTime", R.string.FloodWaitTime, timeString)); + needShowAlert(LocaleController.getString("NekoX", R.string.NekoX), LocaleController.formatString("FloodWaitTime", R.string.FloodWaitTime, timeString)); } else { - needShowAlert(LocaleController.getString("AppName", R.string.AppName), error.text); + needShowAlert(LocaleController.getString("NekoX", R.string.NekoX), error.text); } } }), ConnectionsManager.RequestFlagFailOnServerErrors | ConnectionsManager.RequestFlagWithoutLogin); @@ -2992,7 +3601,7 @@ public class LoginActivity extends BaseFragment { setPage(5, true, params, false); } else { if (error.text.equals("2FA_RECENT_CONFIRM")) { - needShowAlert(LocaleController.getString("AppName", R.string.AppName), LocaleController.getString("ResetAccountCancelledAlert", R.string.ResetAccountCancelledAlert)); + needShowAlert(LocaleController.getString("NekoX", R.string.NekoX), LocaleController.getString("ResetAccountCancelledAlert", R.string.ResetAccountCancelledAlert)); } else if (error.text.startsWith("2FA_CONFIRM_WAIT_")) { Bundle params = new Bundle(); params.putString("phoneFormated", requestPhone); @@ -3002,7 +3611,7 @@ public class LoginActivity extends BaseFragment { params.putInt("waitTime", Utilities.parseInt(error.text.replace("2FA_CONFIRM_WAIT_", ""))); setPage(8, true, params, false); } else { - needShowAlert(LocaleController.getString("AppName", R.string.AppName), error.text); + needShowAlert(LocaleController.getString("NekoX", R.string.NekoX), error.text); } } }), ConnectionsManager.RequestFlagWithoutLogin | ConnectionsManager.RequestFlagFailOnServerErrors); @@ -3150,9 +3759,9 @@ public class LoginActivity extends BaseFragment { } else { timeString = LocaleController.formatPluralString("Minutes", time / 60); } - needShowAlert(LocaleController.getString("AppName", R.string.AppName), LocaleController.formatString("FloodWaitTime", R.string.FloodWaitTime, timeString)); + needShowAlert(LocaleController.getString("NekoX", R.string.NekoX), LocaleController.formatString("FloodWaitTime", R.string.FloodWaitTime, timeString)); } else { - needShowAlert(LocaleController.getString("AppName", R.string.AppName), error.text); + needShowAlert(LocaleController.getString("NekoX", R.string.NekoX), error.text); } } }); @@ -3299,9 +3908,9 @@ public class LoginActivity extends BaseFragment { setPage(5, true, params, false); } else { if (error.text.equals("2FA_RECENT_CONFIRM")) { - needShowAlert(LocaleController.getString("AppName", R.string.AppName), LocaleController.getString("ResetAccountCancelledAlert", R.string.ResetAccountCancelledAlert)); + needShowAlert(LocaleController.getString("NekoX", R.string.NekoX), LocaleController.getString("ResetAccountCancelledAlert", R.string.ResetAccountCancelledAlert)); } else { - needShowAlert(LocaleController.getString("AppName", R.string.AppName), error.text); + needShowAlert(LocaleController.getString("NekoX", R.string.NekoX), error.text); } } }), ConnectionsManager.RequestFlagWithoutLogin | ConnectionsManager.RequestFlagFailOnServerErrors); @@ -3530,7 +4139,7 @@ public class LoginActivity extends BaseFragment { AlertDialog.Builder builder = new AlertDialog.Builder(getParentActivity()); builder.setPositiveButton(LocaleController.getString("OK", R.string.OK), (dialogInterface, i) -> onAuthSuccess((TLRPC.TL_auth_authorization) response)); builder.setMessage(LocaleController.getString("PasswordReset", R.string.PasswordReset)); - builder.setTitle(LocaleController.getString("AppName", R.string.AppName)); + builder.setTitle(LocaleController.getString("NekoX", R.string.NekoX)); Dialog dialog = showDialog(builder.create()); if (dialog != null) { dialog.setCanceledOnTouchOutside(false); @@ -3547,9 +4156,9 @@ public class LoginActivity extends BaseFragment { } else { timeString = LocaleController.formatPluralString("Minutes", time / 60); } - needShowAlert(LocaleController.getString("AppName", R.string.AppName), LocaleController.formatString("FloodWaitTime", R.string.FloodWaitTime, timeString)); + needShowAlert(LocaleController.getString("NekoX", R.string.NekoX), LocaleController.formatString("FloodWaitTime", R.string.FloodWaitTime, timeString)); } else { - needShowAlert(LocaleController.getString("AppName", R.string.AppName), error.text); + needShowAlert(LocaleController.getString("NekoX", R.string.NekoX), error.text); } } }), ConnectionsManager.RequestFlagFailOnServerErrors | ConnectionsManager.RequestFlagWithoutLogin); @@ -4030,17 +4639,17 @@ public class LoginActivity extends BaseFragment { } else { needHideProgress(false); if (error.text.contains("PHONE_NUMBER_INVALID")) { - needShowAlert(LocaleController.getString("AppName", R.string.AppName), LocaleController.getString("InvalidPhoneNumber", R.string.InvalidPhoneNumber)); + needShowAlert(LocaleController.getString("NekoX", R.string.NekoX), LocaleController.getString("InvalidPhoneNumber", R.string.InvalidPhoneNumber)); } else if (error.text.contains("PHONE_CODE_EMPTY") || error.text.contains("PHONE_CODE_INVALID")) { - needShowAlert(LocaleController.getString("AppName", R.string.AppName), LocaleController.getString("InvalidCode", R.string.InvalidCode)); + needShowAlert(LocaleController.getString("NekoX", R.string.NekoX), LocaleController.getString("InvalidCode", R.string.InvalidCode)); } else if (error.text.contains("PHONE_CODE_EXPIRED")) { - needShowAlert(LocaleController.getString("AppName", R.string.AppName), LocaleController.getString("CodeExpired", R.string.CodeExpired)); + needShowAlert(LocaleController.getString("NekoX", R.string.NekoX), LocaleController.getString("CodeExpired", R.string.CodeExpired)); } else if (error.text.contains("FIRSTNAME_INVALID")) { - needShowAlert(LocaleController.getString("AppName", R.string.AppName), LocaleController.getString("InvalidFirstName", R.string.InvalidFirstName)); + needShowAlert(LocaleController.getString("NekoX", R.string.NekoX), LocaleController.getString("InvalidFirstName", R.string.InvalidFirstName)); } else if (error.text.contains("LASTNAME_INVALID")) { - needShowAlert(LocaleController.getString("AppName", R.string.AppName), LocaleController.getString("InvalidLastName", R.string.InvalidLastName)); + needShowAlert(LocaleController.getString("NekoX", R.string.NekoX), LocaleController.getString("InvalidLastName", R.string.InvalidLastName)); } else { - needShowAlert(LocaleController.getString("AppName", R.string.AppName), error.text); + needShowAlert(LocaleController.getString("NekoX", R.string.NekoX), error.text); } } }), ConnectionsManager.RequestFlagWithoutLogin | ConnectionsManager.RequestFlagFailOnServerErrors); @@ -4059,7 +4668,7 @@ public class LoginActivity extends BaseFragment { if (currentTermsOfService != null) { SerializedData data = new SerializedData(currentTermsOfService.getObjectSize()); currentTermsOfService.serializeToStream(data); - String str = Base64.encodeToString(data.toByteArray(), Base64.DEFAULT); + String str = Base64.encode(data.toByteArray()); bundle.putString("terms", str); data.cleanup(); } @@ -4078,7 +4687,7 @@ public class LoginActivity extends BaseFragment { try { String terms = bundle.getString("terms"); if (terms != null) { - byte[] arr = Base64.decode(terms, Base64.DEFAULT); + byte[] arr = Base64.decode(terms); if (arr != null) { SerializedData data = new SerializedData(arr); currentTermsOfService = TLRPC.TL_help_termsOfService.TLdeserialize(data, data.readInt32(false), false); @@ -4106,7 +4715,7 @@ public class LoginActivity extends BaseFragment { @Override public ArrayList getThemeDescriptions() { - for (int a = 0;a < views.length; a++) { + for (int a = 0; a < views.length; a++) { if (views[a] == null) { return new ArrayList<>(); } @@ -4246,4 +4855,5 @@ public class LoginActivity extends BaseFragment { return arrayList; } + } diff --git a/TMessagesProj/src/main/java/org/telegram/ui/PrivacyUsersActivity.java b/TMessagesProj/src/main/java/org/telegram/ui/PrivacyUsersActivity.java index fcf85df2a..abedf3e3a 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/PrivacyUsersActivity.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/PrivacyUsersActivity.java @@ -11,6 +11,7 @@ package org.telegram.ui; import android.content.Context; import android.os.Bundle; import android.text.TextUtils; +import android.util.SparseIntArray; import android.view.View; import android.view.ViewGroup; import android.widget.FrameLayout; @@ -21,6 +22,8 @@ import org.telegram.tgnet.TLRPC; import org.telegram.messenger.MessagesController; import org.telegram.messenger.NotificationCenter; import org.telegram.messenger.R; +import org.telegram.ui.ActionBar.ActionBarMenu; +import org.telegram.ui.ActionBar.ActionBarMenuItem; import org.telegram.ui.ActionBar.AlertDialog; import org.telegram.ui.ActionBar.Theme; import org.telegram.ui.ActionBar.ThemeDescription; @@ -69,6 +72,8 @@ public class PrivacyUsersActivity extends BaseFragment implements NotificationCe public static final int TYPE_BLOCKED = 1; public static final int TYPE_FILTER = 2; + private int unblock_all = 1; + public interface PrivacyActivityDelegate { void didUpdateUserList(ArrayList ids, boolean added); } @@ -139,10 +144,34 @@ public class PrivacyUsersActivity extends BaseFragment implements NotificationCe public void onItemClick(int id) { if (id == -1) { finishFragment(); + } else if (id == unblock_all) { + AlertDialog.Builder builder = new AlertDialog.Builder(getParentActivity()); + builder.setTitle(LocaleController.getString("UnblockAll", R.string.UnblockAll)); + if (getMessagesController().totalBlockedCount != 0) { + builder.setMessage(LocaleController.getString("UnblockAllWarn", R.string.UnblockAllWarn)); + builder.setPositiveButton(LocaleController.getString("UnblockAll", R.string.UnblockAll), (dialog, which) -> { + new Thread(() -> getMessagesController().unblockAllUsers()).start(); + }); + builder.setNegativeButton(LocaleController.getString("Cancel", R.string.Cancel), null); + } else { + builder.setMessage(LocaleController.getString("BlockedListEmpty",R.string.BlockedListEmpty)); + builder.setPositiveButton(LocaleController.getString("OK",R.string.OK),null); + } + showDialog(builder.create()); } } }); + if (blockedUsersActivity) { + + ActionBarMenu menu = actionBar.createMenu(); + + ActionBarMenuItem otherItem = menu.addItem(0, R.drawable.ic_ab_other); + otherItem.setContentDescription(LocaleController.getString("AccDescrMoreOptions", R.string.AccDescrMoreOptions)); + otherItem.addSubItem(unblock_all, LocaleController.getString("UnblockAll", R.string.UnblockAll)); + + } + fragmentView = new FrameLayout(context); FrameLayout frameLayout = (FrameLayout) fragmentView; frameLayout.setBackgroundColor(Theme.getColor(Theme.key_windowBackgroundGray)); @@ -470,9 +499,9 @@ public class PrivacyUsersActivity extends BaseFragment implements NotificationCe ManageChatTextCell actionCell = (ManageChatTextCell) holder.itemView; actionCell.setColors(Theme.key_windowBackgroundWhiteBlueIcon, Theme.key_windowBackgroundWhiteBlueButton); if (currentType == TYPE_BLOCKED) { - actionCell.setText(LocaleController.getString("BlockUser", R.string.BlockUser), null, R.drawable.actions_addmember2, false); + actionCell.setText(LocaleController.getString("BlockUser", R.string.BlockUser), null, R.drawable.baseline_person_add_24, false); } else { - actionCell.setText(LocaleController.getString("PrivacyAddAnException", R.string.PrivacyAddAnException), null, R.drawable.actions_addmember2, false); + actionCell.setText(LocaleController.getString("PrivacyAddAnException", R.string.PrivacyAddAnException), null, R.drawable.baseline_person_add_24, false); } break; case 3: diff --git a/TMessagesProj/src/main/java/org/telegram/ui/ProfileActivity.java b/TMessagesProj/src/main/java/org/telegram/ui/ProfileActivity.java index 63237bb8d..6e85415dd 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/ProfileActivity.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/ProfileActivity.java @@ -140,6 +140,7 @@ import java.util.HashMap; import java.util.concurrent.CountDownLatch; import tw.nekomimi.nekogram.NekoConfig; +import tw.nekomimi.nekogram.utils.ProxyUtil; public class ProfileActivity extends BaseFragment implements NotificationCenter.NotificationCenterDelegate, DialogsActivity.DialogsActivityDelegate, SharedMediaLayout.SharedMediaPreloaderDelegate { @@ -251,6 +252,7 @@ public class ProfileActivity extends BaseFragment implements NotificationCenter. private final static int leave_group = 7; private final static int invite_to_group = 9; private final static int share = 10; + private final static int qr_code = 11; private final static int edit_channel = 12; private final static int add_shortcut = 14; private final static int call_item = 15; @@ -519,15 +521,15 @@ public class ProfileActivity extends BaseFragment implements NotificationCenter. selectedBarPaint = new Paint(Paint.ANTI_ALIAS_FLAG); selectedBarPaint.setColor(0xffffffff); - topOverlayGradient = new GradientDrawable(GradientDrawable.Orientation.TOP_BOTTOM, new int[] {0x42000000, 0}); + topOverlayGradient = new GradientDrawable(GradientDrawable.Orientation.TOP_BOTTOM, new int[]{0x42000000, 0}); topOverlayGradient.setShape(GradientDrawable.RECTANGLE); - bottomOverlayGradient = new GradientDrawable(GradientDrawable.Orientation.BOTTOM_TOP, new int[] {0x42000000, 0}); + bottomOverlayGradient = new GradientDrawable(GradientDrawable.Orientation.BOTTOM_TOP, new int[]{0x42000000, 0}); bottomOverlayGradient.setShape(GradientDrawable.RECTANGLE); for (int i = 0; i < 2; i++) { final GradientDrawable.Orientation orientation = i == 0 ? GradientDrawable.Orientation.LEFT_RIGHT : GradientDrawable.Orientation.RIGHT_LEFT; - pressedOverlayGradient[i] = new GradientDrawable(orientation, new int[] {0x32000000, 0}); + pressedOverlayGradient[i] = new GradientDrawable(orientation, new int[]{0x32000000, 0}); pressedOverlayGradient[i].setShape(GradientDrawable.RECTANGLE); } @@ -1279,7 +1281,7 @@ public class ProfileActivity extends BaseFragment implements NotificationCenter. removeSelfFromStack(); }); presentFragment(fragment); - } else if (id == share) { + } else if (id == share || id == qr_code) { try { String text = null; if (user_id != 0) { @@ -1287,7 +1289,7 @@ public class ProfileActivity extends BaseFragment implements NotificationCenter. if (user == null) { return; } - if (botInfo != null && userInfo != null && !TextUtils.isEmpty(userInfo.about)) { + if (botInfo != null && userInfo != null && !TextUtils.isEmpty(userInfo.about) && id == share) { text = String.format("%s https://" + MessagesController.getInstance(currentAccount).linkPrefix + "/%s", userInfo.about, user.username); } else { text = String.format("https://" + MessagesController.getInstance(currentAccount).linkPrefix + "/%s", user.username); @@ -1297,7 +1299,7 @@ public class ProfileActivity extends BaseFragment implements NotificationCenter. if (chat == null) { return; } - if (chatInfo != null && !TextUtils.isEmpty(chatInfo.about)) { + if (chatInfo != null && !TextUtils.isEmpty(chatInfo.about) && id == share) { text = String.format("%s\nhttps://" + MessagesController.getInstance(currentAccount).linkPrefix + "/%s", chatInfo.about, chat.username); } else { text = String.format("https://" + MessagesController.getInstance(currentAccount).linkPrefix + "/%s", chat.username); @@ -1306,10 +1308,14 @@ public class ProfileActivity extends BaseFragment implements NotificationCenter. if (TextUtils.isEmpty(text)) { return; } - Intent intent = new Intent(Intent.ACTION_SEND); - intent.setType("text/plain"); - intent.putExtra(Intent.EXTRA_TEXT, text); - startActivityForResult(Intent.createChooser(intent, LocaleController.getString("BotShare", R.string.BotShare)), 500); + if (id == share) { + Intent intent = new Intent(Intent.ACTION_SEND); + intent.setType("text/plain"); + intent.putExtra(Intent.EXTRA_TEXT, text); + startActivityForResult(Intent.createChooser(intent, LocaleController.getString("BotShare", R.string.BotShare)), 500); + } else { + ProxyUtil.showQrDialog(getParentActivity(), text); + } } catch (Exception e) { FileLog.e(e); } @@ -2031,6 +2037,7 @@ public class ProfileActivity extends BaseFragment implements NotificationCenter. idTextView.setTextSize(14); idTextView.setGravity(Gravity.LEFT); idTextView.setAlpha(1.0f); + frameLayout.addView(idTextView, LayoutHelper.createFrame(LayoutHelper.WRAP_CONTENT, LayoutHelper.WRAP_CONTENT, Gravity.LEFT | Gravity.TOP, 118, 0, 48, 0)); updateProfileData(); @@ -2040,7 +2047,7 @@ public class ProfileActivity extends BaseFragment implements NotificationCenter. Drawable drawable = Theme.createSimpleSelectorCircleDrawable(AndroidUtilities.dp(56), Theme.getColor(Theme.key_profile_actionBackground), Theme.getColor(Theme.key_profile_actionPressedBackground)); if (Build.VERSION.SDK_INT < 21) { Drawable shadowDrawable = context.getResources().getDrawable(R.drawable.floating_shadow_profile).mutate(); - shadowDrawable.setColorFilter(new PorterDuffColorFilter(0xff000000, PorterDuff.Mode.MULTIPLY)); + shadowDrawable.setColorFilter(new PorterDuffColorFilter(0xff000000, PorterDuff.Mode.SRC_IN)); CombinedDrawable combinedDrawable = new CombinedDrawable(shadowDrawable, drawable, 0, 0); combinedDrawable.setIconSize(AndroidUtilities.dp(56), AndroidUtilities.dp(56)); drawable = combinedDrawable; @@ -2048,7 +2055,7 @@ public class ProfileActivity extends BaseFragment implements NotificationCenter. writeButton.setBackgroundDrawable(drawable); writeButton.setImageResource(R.drawable.profile_newmsg); writeButton.setContentDescription(LocaleController.getString("AccDescrOpenChat", R.string.AccDescrOpenChat)); - writeButton.setColorFilter(new PorterDuffColorFilter(Theme.getColor(Theme.key_profile_actionIcon), PorterDuff.Mode.MULTIPLY)); + writeButton.setColorFilter(new PorterDuffColorFilter(Theme.getColor(Theme.key_profile_actionIcon), PorterDuff.Mode.SRC_IN)); writeButton.setScaleType(ImageView.ScaleType.CENTER); if (Build.VERSION.SDK_INT >= 21) { StateListAnimator animator = new StateListAnimator(); @@ -2065,7 +2072,7 @@ public class ProfileActivity extends BaseFragment implements NotificationCenter. } frameLayout.addView(writeButton, LayoutHelper.createFrame(Build.VERSION.SDK_INT >= 21 ? 56 : 60, Build.VERSION.SDK_INT >= 21 ? 56 : 60, Gravity.RIGHT | Gravity.TOP, 0, 0, 16, 0)); writeButton.setOnClickListener(v -> { - if (playProfileAnimation != 0 && parentLayout.fragmentsStack.get(parentLayout.fragmentsStack.size() - 2) instanceof ChatActivity) { + if (playProfileAnimation != 0 && parentLayout.fragmentsStack.get(parentLayout.fragmentsStack.size() - 2) instanceof ChatActivity && !AndroidUtilities.isTablet()) { finishFragment(); } else { TLRPC.User user = MessagesController.getInstance(currentAccount).getUser(user_id); @@ -2134,7 +2141,7 @@ public class ProfileActivity extends BaseFragment implements NotificationCenter. } if (lockIconDrawable != null) { - lockIconDrawable.setColorFilter(ColorUtils.blendARGB(Theme.getColor(Theme.key_chat_lockIcon), Color.WHITE, value), PorterDuff.Mode.MULTIPLY); + lockIconDrawable.setColorFilter(ColorUtils.blendARGB(Theme.getColor(Theme.key_chat_lockIcon), Color.WHITE, value), PorterDuff.Mode.SRC_IN); } if (verifiedCrossfadeDrawable != null) { @@ -2256,6 +2263,7 @@ public class ProfileActivity extends BaseFragment implements NotificationCenter. } } } + public boolean onMemberClick(TLRPC.ChatParticipant participant, boolean isLong) { return onMemberClick(participant, isLong, false); } @@ -2303,7 +2311,7 @@ public class ProfileActivity extends BaseFragment implements NotificationCenter. return true; } items.add(editingAdmin ? LocaleController.getString("EditAdminRights", R.string.EditAdminRights) : LocaleController.getString("SetAsAdmin", R.string.SetAsAdmin)); - icons.add(R.drawable.actions_addadmin); + icons.add(R.drawable.baseline_stars_18); actions.add(0); } if (canRestrict) { @@ -2311,7 +2319,7 @@ public class ProfileActivity extends BaseFragment implements NotificationCenter. return true; } items.add(LocaleController.getString("ChangePermissions", R.string.ChangePermissions)); - icons.add(R.drawable.actions_permissions); + icons.add(R.drawable.baseline_block_24); actions.add(1); } if (allowKick) { @@ -2319,7 +2327,7 @@ public class ProfileActivity extends BaseFragment implements NotificationCenter. return true; } items.add(LocaleController.getString("KickFromGroup", R.string.KickFromGroup)); - icons.add(R.drawable.actions_remove_user); + icons.add(R.drawable.baseline_remove_circle_24); actions.add(2); hasRemove = true; } @@ -2338,7 +2346,7 @@ public class ProfileActivity extends BaseFragment implements NotificationCenter. int action = actions.get(i); if (action == 1 && (channelParticipant instanceof TLRPC.TL_channelParticipantAdmin || participant instanceof TLRPC.TL_chatParticipantAdmin)) { AlertDialog.Builder builder2 = new AlertDialog.Builder(getParentActivity()); - builder2.setTitle(LocaleController.getString("AppName", R.string.AppName)); + builder2.setTitle(LocaleController.getString("NekoX", R.string.NekoX)); builder2.setMessage(LocaleController.formatString("AdminWillBeRemoved", R.string.AdminWillBeRemoved, ContactsController.formatName(user.first_name, user.last_name))); builder2.setPositiveButton(LocaleController.getString("OK", R.string.OK), (dialog, which) -> { if (channelParticipant != null) { @@ -2488,7 +2496,7 @@ public class ProfileActivity extends BaseFragment implements NotificationCenter. } else if (position == phoneRow) { final TLRPC.User user = MessagesController.getInstance(currentAccount).getUser(user_id); if (user == null || user.phone == null || user.phone.length() == 0 || getParentActivity() == null - || (NekoConfig.hidePhone && user.id == UserConfig.getInstance(currentAccount).getClientUserId())) { + || (NekoConfig.hidePhone && user.id == UserConfig.getInstance(currentAccount).getClientUserId())) { return false; } @@ -2627,7 +2635,7 @@ public class ProfileActivity extends BaseFragment implements NotificationCenter. int c = AndroidUtilities.getOffsetColor(color1, color2, value, 1.0f); nameTextView[1].setTextColor(c); if (lockIconDrawable != null) { - lockIconDrawable.setColorFilter(c, PorterDuff.Mode.MULTIPLY); + lockIconDrawable.setColorFilter(c, PorterDuff.Mode.SRC_IN); } if (scamDrawable != null) { color1 = Theme.getColor(Theme.key_avatar_subtitleInProfileBlue); @@ -2650,13 +2658,13 @@ public class ProfileActivity extends BaseFragment implements NotificationCenter. if (verifiedDrawable != null) { color1 = Theme.getColor(Theme.key_profile_verifiedBackground); color2 = Theme.getColor(Theme.key_player_actionBarTitle); - verifiedDrawable.setColorFilter(AndroidUtilities.getOffsetColor(color1, color2, value, 1.0f), PorterDuff.Mode.MULTIPLY); + verifiedDrawable.setColorFilter(AndroidUtilities.getOffsetColor(color1, color2, value, 1.0f), PorterDuff.Mode.SRC_IN); } if (verifiedCheckDrawable != null) { color1 = Theme.getColor(Theme.key_profile_verifiedCheck); color2 = Theme.getColor(Theme.key_windowBackgroundWhite); - verifiedCheckDrawable.setColorFilter(AndroidUtilities.getOffsetColor(color1, color2, value, 1.0f), PorterDuff.Mode.MULTIPLY); + verifiedCheckDrawable.setColorFilter(AndroidUtilities.getOffsetColor(color1, color2, value, 1.0f), PorterDuff.Mode.SRC_IN); } } @@ -3038,7 +3046,7 @@ public class ProfileActivity extends BaseFragment implements NotificationCenter. scamDrawable.setColor(ColorUtils.blendARGB(Theme.getColor(Theme.key_avatar_subtitleInProfileBlue), Color.argb(179, 255, 255, 255), animationProgress)); } if (lockIconDrawable != null) { - lockIconDrawable.setColorFilter(ColorUtils.blendARGB(Theme.getColor(Theme.key_chat_lockIcon), Color.WHITE, animationProgress), PorterDuff.Mode.MULTIPLY); + lockIconDrawable.setColorFilter(ColorUtils.blendARGB(Theme.getColor(Theme.key_chat_lockIcon), Color.WHITE, animationProgress), PorterDuff.Mode.SRC_IN); } if (verifiedCrossfadeDrawable != null) { verifiedCrossfadeDrawable.setProgress(animationProgress); @@ -3085,7 +3093,7 @@ public class ProfileActivity extends BaseFragment implements NotificationCenter. nameTextView[a].setScaleY(nameScale); } - if (diff > 0.85) { + if (diff > 0.85 && NekoConfig.showIdAndDc) { idTextView.setVisibility(View.VISIBLE); } else { idTextView.setVisibility(View.GONE); @@ -3287,7 +3295,9 @@ public class ProfileActivity extends BaseFragment implements NotificationCenter. TLRPC.EncryptedChat encryptedChat = (TLRPC.EncryptedChat) args[0]; Bundle args2 = new Bundle(); args2.putInt("enc_id", encryptedChat.id); - presentFragment(new ChatActivity(args2), true); + if (MessagesController.getInstance(currentAccount).checkCanOpenChat(args2, ProfileActivity.this)) { + presentFragment(new ChatActivity(args2), true); + } }); } } else if (id == NotificationCenter.encryptedChatUpdated) { @@ -3365,7 +3375,9 @@ public class ProfileActivity extends BaseFragment implements NotificationCenter. FileLog.e(e); } } - sharedMediaLayout.setCommonGroupsCount(userInfo.common_chats_count); + if (sharedMediaLayout != null) { + sharedMediaLayout.setCommonGroupsCount(userInfo.common_chats_count); + } updateSelectedMediaTabText(); } } else if (id == NotificationCenter.didReceiveNewMessages) { @@ -4348,39 +4360,40 @@ public class ProfileActivity extends BaseFragment implements NotificationCenter. if (isBot || ContactsController.getInstance(currentAccount).contactsDict.get(user_id) == null) { if (MessagesController.isSupportUser(user)) { if (userBlocked) { - otherItem.addSubItem(block_contact, R.drawable.msg_block, LocaleController.getString("Unblock", R.string.Unblock)); + otherItem.addSubItem(block_contact, R.drawable.baseline_block_24, LocaleController.getString("Unblock", R.string.Unblock)); } } else { if (isBot) { if (!user.bot_nochats) { - otherItem.addSubItem(invite_to_group, R.drawable.msg_addbot, LocaleController.getString("BotInvite", R.string.BotInvite)); + otherItem.addSubItem(invite_to_group, R.drawable.baseline_group_add_24, LocaleController.getString("BotInvite", R.string.BotInvite)); } - otherItem.addSubItem(share, R.drawable.msg_share, LocaleController.getString("BotShare", R.string.BotShare)); + otherItem.addSubItem(share, R.drawable.baseline_forward_24, LocaleController.getString("BotShare", R.string.BotShare)); + otherItem.addSubItem(qr_code, R.drawable.wallet_qr, LocaleController.getString("ShareQRCode", R.string.ShareQRCode)); } else { - otherItem.addSubItem(add_contact, R.drawable.msg_addcontact, LocaleController.getString("AddContact", R.string.AddContact)); + otherItem.addSubItem(add_contact, R.drawable.baseline_person_add_24, LocaleController.getString("AddContact", R.string.AddContact)); } if (!TextUtils.isEmpty(user.phone)) { - otherItem.addSubItem(share_contact, R.drawable.msg_share, LocaleController.getString("ShareContact", R.string.ShareContact)); + otherItem.addSubItem(share_contact, R.drawable.baseline_forward_24, LocaleController.getString("ShareContact", R.string.ShareContact)); } if (isBot) { - otherItem.addSubItem(block_contact, !userBlocked ? R.drawable.msg_block : R.drawable.msg_retry, !userBlocked ? LocaleController.getString("BotStop", R.string.BotStop) : LocaleController.getString("BotRestart", R.string.BotRestart)); + otherItem.addSubItem(block_contact, !userBlocked ? R.drawable.baseline_block_24 : R.drawable.baseline_replay_24, !userBlocked ? LocaleController.getString("BotStop", R.string.BotStop) : LocaleController.getString("BotRestart", R.string.BotRestart)); } else { - otherItem.addSubItem(block_contact, !userBlocked ? R.drawable.msg_block : R.drawable.msg_block, !userBlocked ? LocaleController.getString("BlockContact", R.string.BlockContact) : LocaleController.getString("Unblock", R.string.Unblock)); + otherItem.addSubItem(block_contact, !userBlocked ? R.drawable.baseline_block_24 : R.drawable.baseline_block_24, !userBlocked ? LocaleController.getString("BlockContact", R.string.BlockContact) : LocaleController.getString("Unblock", R.string.Unblock)); } } } else { if (!TextUtils.isEmpty(user.phone)) { - otherItem.addSubItem(share_contact, R.drawable.msg_share, LocaleController.getString("ShareContact", R.string.ShareContact)); + otherItem.addSubItem(share_contact, R.drawable.baseline_forward_24, LocaleController.getString("ShareContact", R.string.ShareContact)); } - otherItem.addSubItem(block_contact, !userBlocked ? R.drawable.msg_block : R.drawable.msg_block, !userBlocked ? LocaleController.getString("BlockContact", R.string.BlockContact) : LocaleController.getString("Unblock", R.string.Unblock)); - otherItem.addSubItem(edit_contact, R.drawable.msg_edit, LocaleController.getString("EditContact", R.string.EditContact)); - otherItem.addSubItem(delete_contact, R.drawable.msg_delete, LocaleController.getString("DeleteContact", R.string.DeleteContact)); + otherItem.addSubItem(block_contact, !userBlocked ? R.drawable.baseline_block_24 : R.drawable.baseline_block_24, !userBlocked ? LocaleController.getString("BlockContact", R.string.BlockContact) : LocaleController.getString("Unblock", R.string.Unblock)); + otherItem.addSubItem(edit_contact, R.drawable.baseline_edit_24, LocaleController.getString("EditContact", R.string.EditContact)); + otherItem.addSubItem(delete_contact, R.drawable.baseline_delete_24, LocaleController.getString("DeleteContact", R.string.DeleteContact)); } } else { - otherItem.addSubItem(share_contact, R.drawable.msg_share, LocaleController.getString("ShareContact", R.string.ShareContact)); + otherItem.addSubItem(share_contact, R.drawable.baseline_forward_24, LocaleController.getString("ShareContact", R.string.ShareContact)); } if (!UserObject.isDeleted(user) && !isBot && currentEncryptedChat == null && user_id != getUserConfig().getClientUserId() && !userBlocked && user_id != 333000 && user_id != 777000 && user_id != 42777) { - otherItem.addSubItem(start_secret_chat, R.drawable.msg_start_secret, LocaleController.getString("StartEncryptedChat", R.string.StartEncryptedChat)); + otherItem.addSubItem(start_secret_chat, R.drawable.deproko_baseline_lock_24, LocaleController.getString("StartEncryptedChat", R.string.StartEncryptedChat)); } } else if (chat_id != 0) { if (chat_id > 0) { @@ -4392,18 +4405,19 @@ public class ProfileActivity extends BaseFragment implements NotificationCenter. if (!chat.megagroup && chatInfo != null && chatInfo.can_view_stats) { otherItem.addSubItem(statistics, R.drawable.msg_stats, LocaleController.getString("Statistics", R.string.Statistics)); } + if (!TextUtils.isEmpty(chat.username)) { + otherItem.addSubItem(share, R.drawable.baseline_forward_24, LocaleController.getString("BotShare", R.string.BotShare)); + otherItem.addSubItem(qr_code, R.drawable.wallet_qr, LocaleController.getString("ShareQRCode", R.string.ShareQRCode)); + } if (chat.megagroup) { canSearchMembers = true; - otherItem.addSubItem(search_members, R.drawable.msg_search, LocaleController.getString("SearchMembers", R.string.SearchMembers)); + otherItem.addSubItem(search_members, R.drawable.baseline_search_24, LocaleController.getString("SearchMembers", R.string.SearchMembers)); if (!chat.creator && !chat.left && !chat.kicked) { - otherItem.addSubItem(leave_group, R.drawable.msg_leave, LocaleController.getString("LeaveMegaMenu", R.string.LeaveMegaMenu)); + otherItem.addSubItem(leave_group, R.drawable.baseline_exit_to_app_24, LocaleController.getString("LeaveMegaMenu", R.string.LeaveMegaMenu)); } } else { - if (!TextUtils.isEmpty(chat.username)) { - otherItem.addSubItem(share, R.drawable.msg_share, LocaleController.getString("BotShare", R.string.BotShare)); - } if (!currentChat.creator && !currentChat.left && !currentChat.kicked) { - otherItem.addSubItem(leave_group, R.drawable.msg_leave, LocaleController.getString("LeaveChannelMenu", R.string.LeaveChannelMenu)); + otherItem.addSubItem(leave_group, R.drawable.baseline_exit_to_app_24, LocaleController.getString("LeaveChannelMenu", R.string.LeaveChannelMenu)); } } if (ChatObject.hasAdminRights(currentChat)) { @@ -4413,14 +4427,14 @@ public class ProfileActivity extends BaseFragment implements NotificationCenter. editItemVisible = true; if (!ChatObject.isKickedFromChat(chat) && !ChatObject.isLeftFromChat(chat)) { canSearchMembers = true; - otherItem.addSubItem(search_members, R.drawable.msg_search, LocaleController.getString("SearchMembers", R.string.SearchMembers)); + otherItem.addSubItem(search_members, R.drawable.baseline_search_24, LocaleController.getString("SearchMembers", R.string.SearchMembers)); } - otherItem.addSubItem(leave_group, R.drawable.msg_leave, LocaleController.getString("DeleteAndExit", R.string.DeleteAndExit)); + otherItem.addSubItem(leave_group, R.drawable.baseline_exit_to_app_24, LocaleController.getString("DeleteAndExit", R.string.DeleteAndExit)); } } } - otherItem.addSubItem(add_shortcut, R.drawable.msg_home, LocaleController.getString("AddShortcut", R.string.AddShortcut)); - otherItem.addSubItem(gallery_menu_save, R.drawable.msg_gallery, LocaleController.getString("SaveToGallery", R.string.SaveToGallery)); + otherItem.addSubItem(add_shortcut, R.drawable.baseline_home_24, LocaleController.getString("AddShortcut", R.string.AddShortcut)); + otherItem.addSubItem(gallery_menu_save, R.drawable.baseline_image_24, LocaleController.getString("SaveToGallery", R.string.SaveToGallery)); if (!isPulledDown) { otherItem.hideSubItem(gallery_menu_save); } @@ -4742,22 +4756,22 @@ public class ProfileActivity extends BaseFragment implements NotificationCenter. } else if (position == subscribersRow) { if (chatInfo != null) { if (ChatObject.isChannel(currentChat) && !currentChat.megagroup) { - textCell.setTextAndValueAndIcon(LocaleController.getString("ChannelSubscribers", R.string.ChannelSubscribers), String.format("%d", chatInfo.participants_count), R.drawable.actions_viewmembers, position != membersSectionRow - 1); + textCell.setTextAndValueAndIcon(LocaleController.getString("ChannelSubscribers", R.string.ChannelSubscribers), String.format("%d", chatInfo.participants_count), R.drawable.baseline_group_24, position != membersSectionRow - 1); } else { - textCell.setTextAndValueAndIcon(LocaleController.getString("ChannelMembers", R.string.ChannelMembers), String.format("%d", chatInfo.participants_count), R.drawable.actions_viewmembers, position != membersSectionRow - 1); + textCell.setTextAndValueAndIcon(LocaleController.getString("ChannelMembers", R.string.ChannelMembers), String.format("%d", chatInfo.participants_count), R.drawable.baseline_group_24, position != membersSectionRow - 1); } } else { if (ChatObject.isChannel(currentChat) && !currentChat.megagroup) { - textCell.setTextAndIcon(LocaleController.getString("ChannelSubscribers", R.string.ChannelSubscribers), R.drawable.actions_viewmembers, position != membersSectionRow - 1); + textCell.setTextAndIcon(LocaleController.getString("ChannelSubscribers", R.string.ChannelSubscribers), R.drawable.baseline_group_24, position != membersSectionRow - 1); } else { - textCell.setTextAndIcon(LocaleController.getString("ChannelMembers", R.string.ChannelMembers), R.drawable.actions_viewmembers, position != membersSectionRow - 1); + textCell.setTextAndIcon(LocaleController.getString("ChannelMembers", R.string.ChannelMembers), R.drawable.baseline_group_24, position != membersSectionRow - 1); } } } else if (position == administratorsRow) { if (chatInfo != null) { - textCell.setTextAndValueAndIcon(LocaleController.getString("ChannelAdministrators", R.string.ChannelAdministrators), String.format("%d", chatInfo.admins_count), R.drawable.actions_addadmin, position != membersSectionRow - 1); + textCell.setTextAndValueAndIcon(LocaleController.getString("ChannelAdministrators", R.string.ChannelAdministrators), String.format("%d", chatInfo.admins_count), R.drawable.baseline_stars_18, position != membersSectionRow - 1); } else { - textCell.setTextAndIcon(LocaleController.getString("ChannelAdministrators", R.string.ChannelAdministrators), R.drawable.actions_addadmin, position != membersSectionRow - 1); + textCell.setTextAndIcon(LocaleController.getString("ChannelAdministrators", R.string.ChannelAdministrators), R.drawable.baseline_stars_18, position != membersSectionRow - 1); } } else if (position == blockedUsersRow) { if (chatInfo != null) { @@ -4767,7 +4781,7 @@ public class ProfileActivity extends BaseFragment implements NotificationCenter. } } else if (position == addMemberRow) { textCell.setColors(Theme.key_windowBackgroundWhiteBlueIcon, Theme.key_windowBackgroundWhiteBlueButton); - textCell.setTextAndIcon(LocaleController.getString("AddMember", R.string.AddMember), R.drawable.actions_addmember2, membersSectionRow == -1); + textCell.setTextAndIcon(LocaleController.getString("AddMember", R.string.AddMember), R.drawable.baseline_person_add_24, membersSectionRow == -1); } else if (position == sendMessageRow) { textCell.setText(LocaleController.getString("SendMessageLocation", R.string.SendMessageLocation), true); } else if (position == reportRow) { @@ -4951,7 +4965,7 @@ public class ProfileActivity extends BaseFragment implements NotificationCenter. onlineTextView[1].setTextColor(Theme.getColor((String) onlineTextViewTag)); } if (lockIconDrawable != null) { - lockIconDrawable.setColorFilter(Theme.getColor(Theme.key_chat_lockIcon), PorterDuff.Mode.MULTIPLY); + lockIconDrawable.setColorFilter(Theme.getColor(Theme.key_chat_lockIcon), PorterDuff.Mode.SRC_IN); } if (scamDrawable != null) { scamDrawable.setColor(Theme.getColor(Theme.key_avatar_subtitleInProfileBlue)); diff --git a/TMessagesProj/src/main/java/org/telegram/ui/SecretMediaViewer.java b/TMessagesProj/src/main/java/org/telegram/ui/SecretMediaViewer.java index d94094dbb..9b8a5fe11 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/SecretMediaViewer.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/SecretMediaViewer.java @@ -66,6 +66,8 @@ import org.telegram.ui.Components.VideoPlayer; import java.io.File; import java.util.ArrayList; +import tw.nekomimi.nekogram.NekoXConfig; + public class SecretMediaViewer implements NotificationCenter.NotificationCenterDelegate, GestureDetector.OnGestureListener, GestureDetector.OnDoubleTapListener { private class FrameLayoutDrawer extends FrameLayout { @@ -653,7 +655,9 @@ public class SecretMediaViewer implements NotificationCenter.NotificationCenterD } else { windowLayoutParams.flags = WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE; } - windowLayoutParams.flags |= WindowManager.LayoutParams.FLAG_SECURE; + if (!NekoXConfig.disableFlagSecure) { + windowLayoutParams.flags |= WindowManager.LayoutParams.FLAG_SECURE; + } centerImage.setParentView(containerView); centerImage.setForceCrossfade(true); } diff --git a/TMessagesProj/src/main/java/org/telegram/ui/StickersActivity.java b/TMessagesProj/src/main/java/org/telegram/ui/StickersActivity.java index e1d721cfc..d89f9fe92 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/StickersActivity.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/StickersActivity.java @@ -8,11 +8,15 @@ package org.telegram.ui; +import android.Manifest; import android.annotation.SuppressLint; +import android.app.Activity; import android.content.Context; import android.content.DialogInterface; import android.content.Intent; +import android.content.pm.PackageManager; import android.graphics.Canvas; +import android.os.Build; import android.text.SpannableStringBuilder; import android.text.Spanned; import android.text.TextUtils; @@ -24,14 +28,30 @@ import android.widget.LinearLayout; import android.widget.TextView; import android.widget.Toast; +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; +import androidx.collection.LongSparseArray; +import androidx.recyclerview.widget.DefaultItemAnimator; +import androidx.recyclerview.widget.DiffUtil; +import androidx.recyclerview.widget.ItemTouchHelper; +import androidx.recyclerview.widget.LinearLayoutManager; +import androidx.recyclerview.widget.ListUpdateCallback; +import androidx.recyclerview.widget.RecyclerView; + +import com.google.gson.Gson; +import com.google.gson.JsonObject; +import com.google.gson.internal.Streams; +import com.google.gson.stream.JsonWriter; + import org.telegram.messenger.AndroidUtilities; -import org.telegram.messenger.MediaDataController; -import org.telegram.messenger.LocaleController; -import org.telegram.messenger.MessagesController; -import org.telegram.messenger.NotificationCenter; import org.telegram.messenger.ApplicationLoader; import org.telegram.messenger.FileLog; +import org.telegram.messenger.LocaleController; +import org.telegram.messenger.MediaDataController; +import org.telegram.messenger.MessagesController; +import org.telegram.messenger.NotificationCenter; import org.telegram.messenger.R; +import org.telegram.messenger.SendMessagesHelper; import org.telegram.messenger.SharedConfig; import org.telegram.tgnet.ConnectionsManager; import org.telegram.tgnet.TLRPC; @@ -60,24 +80,30 @@ import org.telegram.ui.Components.TrendingStickersAlert; import org.telegram.ui.Components.TrendingStickersLayout; import org.telegram.ui.Components.URLSpanNoUnderline; +import java.io.File; +import java.io.IOException; +import java.io.StringWriter; import java.util.ArrayList; +import java.util.Date; import java.util.List; import java.util.Locale; +import java.util.concurrent.atomic.AtomicBoolean; +import java.util.concurrent.atomic.AtomicReference; -import androidx.annotation.NonNull; -import androidx.annotation.Nullable; -import androidx.collection.LongSparseArray; -import androidx.recyclerview.widget.DefaultItemAnimator; -import androidx.recyclerview.widget.DiffUtil; -import androidx.recyclerview.widget.ItemTouchHelper; -import androidx.recyclerview.widget.LinearLayoutManager; -import androidx.recyclerview.widget.ListUpdateCallback; -import androidx.recyclerview.widget.RecyclerView; +import kotlin.Unit; +import tw.nekomimi.nekogram.BottomBuilder; +import tw.nekomimi.nekogram.utils.AlertUtil; +import tw.nekomimi.nekogram.utils.FileUtil; +import tw.nekomimi.nekogram.utils.ShareUtil; +import tw.nekomimi.nekogram.utils.StickersUtil; +import tw.nekomimi.nekogram.utils.UIUtil; public class StickersActivity extends BaseFragment implements NotificationCenter.NotificationCenterDelegate { private static final int MENU_ARCHIVE = 0; private static final int MENU_DELETE = 1; + private static final int MENU_EXPORT = 5; + private RecyclerListView listView; private ListAdapter listAdapter; @@ -88,6 +114,7 @@ public class StickersActivity extends BaseFragment implements NotificationCenter private NumberTextView selectedCountTextView; private TrendingStickersAlert trendingStickersAlert; + private ActionBarMenuItem exportMenuItem; private ActionBarMenuItem archiveMenuItem; private ActionBarMenuItem deleteMenuItem; @@ -166,6 +193,13 @@ public class StickersActivity extends BaseFragment implements NotificationCenter currentType = type; } + private File stickersFile; + + public StickersActivity(File stickersFile) { + this(MediaDataController.TYPE_IMAGE); + this.stickersFile = stickersFile; + } + @Override public boolean onFragmentCreate() { super.onFragmentCreate(); @@ -189,6 +223,10 @@ public class StickersActivity extends BaseFragment implements NotificationCenter NotificationCenter.getInstance(currentAccount).removeObserver(this, NotificationCenter.featuredStickersDidLoad); } + private int menu_other = 2; + private int menu_export = 3; + private int menu_import = 4; + @Override public View createView(Context context) { actionBar.setBackButtonDrawable(new BackDrawable(false)); @@ -205,7 +243,7 @@ public class StickersActivity extends BaseFragment implements NotificationCenter if (onBackPressed()) { finishFragment(); } - } else if (id == MENU_ARCHIVE || id == MENU_DELETE) { + } else if (id == MENU_EXPORT || id == MENU_ARCHIVE || id == MENU_DELETE) { if (!needReorder) { if (activeReorderingRequests == 0) { listAdapter.processSelectionMenu(id); @@ -213,10 +251,45 @@ public class StickersActivity extends BaseFragment implements NotificationCenter } else { sendReorder(); } + } else if (id == menu_export) { + exportStickers(); + } else if (id == menu_import) { + try { + if (Build.VERSION.SDK_INT >= 23 && getParentActivity().checkSelfPermission(Manifest.permission.READ_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) { + getParentActivity().requestPermissions(new String[]{Manifest.permission.READ_EXTERNAL_STORAGE}, 4); + return; + } + } catch (Throwable ignore) { + } + DocumentSelectActivity fragment = new DocumentSelectActivity(false); + fragment.setMaxSelectedFiles(1); + fragment.setAllowPhoto(false); + fragment.setDelegate(new DocumentSelectActivity.DocumentSelectActivityDelegate() { + @Override + public void didSelectFiles(DocumentSelectActivity activity, ArrayList files, String caption, boolean notify, int scheduleDate) { + activity.finishFragment(); + processStickersFile(new File(files.get(0)), false); + } + + @Override + public void didSelectPhotos(ArrayList photos, boolean notify, int scheduleDate) { + } + + @Override + public void startDocumentSelectActivity() { + } + }); + presentFragment(fragment); } } }); + ActionBarMenu menu = actionBar.createMenu(); + + ActionBarMenuItem otherItem = menu.addItem(menu_other, R.drawable.ic_ab_other); + + otherItem.addSubItem(menu_export, R.drawable.baseline_file_download_24, LocaleController.getString("ExportStickers", R.string.ExportStickers)); + otherItem.addSubItem(menu_import, R.drawable.baseline_playlist_add_24, LocaleController.getString("ImportStickers", R.string.ImportStickers)); final ActionBarMenu actionMode = actionBar.createActionMode(); selectedCountTextView = new NumberTextView(actionMode.getContext()); @@ -226,8 +299,9 @@ public class StickersActivity extends BaseFragment implements NotificationCenter actionMode.addView(selectedCountTextView, LayoutHelper.createLinear(0, LayoutHelper.MATCH_PARENT, 1.0f, 72, 0, 0, 0)); selectedCountTextView.setOnTouchListener((v, event) -> true); - archiveMenuItem = actionMode.addItemWithWidth(MENU_ARCHIVE, R.drawable.msg_archive, AndroidUtilities.dp(54)); - deleteMenuItem = actionMode.addItemWithWidth(MENU_DELETE, R.drawable.msg_delete, AndroidUtilities.dp(54)); + exportMenuItem = actionMode.addItemWithWidth(MENU_EXPORT, R.drawable.baseline_file_download_24, AndroidUtilities.dp(54)); + archiveMenuItem = actionMode.addItemWithWidth(MENU_ARCHIVE, R.drawable.baseline_archive_24, AndroidUtilities.dp(54)); + deleteMenuItem = actionMode.addItemWithWidth(MENU_DELETE, R.drawable.baseline_delete_24, AndroidUtilities.dp(54)); listAdapter = new ListAdapter(context, MediaDataController.getInstance(currentAccount).getStickerSets(currentType)); @@ -333,10 +407,175 @@ public class StickersActivity extends BaseFragment implements NotificationCenter } }); + if (stickersFile != null) { + + processStickersFile(stickersFile, true); + stickersFile = null; + + } + return fragmentView; } + public void processStickersFile(File file, boolean exitOnFail) { + if (!file.isFile() || !file.getName().endsWith("nekox-stickers.json")) { + + showError("not a stickers file", exitOnFail); + + return; + + } else if (file.length() > 3 * 1024 * 1024L) { + + showError("file too large", exitOnFail); + + return; + + } + + AlertDialog pro = new AlertDialog(getParentActivity(), 1); + pro.show(); + + UIUtil.runOnIoDispatcher(() -> { + + JsonObject stickerObj = new Gson().fromJson(FileUtil.readUtf8String(file), JsonObject.class); + + StickersUtil.importStickers(stickerObj, this, pro); + + UIUtil.runOnUIThread(() -> { + + pro.dismiss(); + + MediaDataController.getInstance(currentAccount).checkStickers(currentType); + updateRows(); + + }); + + }); + + + } + + private void showError(String msg, boolean exitOnFail) { + + AlertUtil.showSimpleAlert(getParentActivity(), LocaleController.getString("InvalidStickersFile", R.string.InvalidStickersFile) + msg, (__) -> { + + if (exitOnFail) finishFragment(); + + return Unit.INSTANCE; + + }); + + } + + public void exportStickers() { + + BottomBuilder builder = new BottomBuilder(getParentActivity()); + + builder.addTitle(LocaleController.getString("", R.string.ExportStickers), true); + + AtomicBoolean exportSets = new AtomicBoolean(true); + AtomicBoolean exportArchived = new AtomicBoolean(true); + + final AtomicReference exportButton = new AtomicReference<>(); + + builder.addCheckItems(new String[]{ + LocaleController.getString("StickerSets", R.string.StickerSets), + LocaleController.getString("ArchivedStickers", R.string.ArchivedStickers) + }, (__) -> true, false, (index, text, cell) -> { + + boolean export; + + switch (index) { + + case 0: { + + export = exportSets.get(); + exportSets.set(export = !export); + + } + break; + + default: { + + export = exportArchived.get(); + exportArchived.set(export = !export); + + } + break; + + } + + cell.setChecked(export); + + if (!exportSets.get() && !exportArchived.get()) { + + exportButton.get().setEnabled(false); + + } else { + + exportButton.get().setEnabled(true); + + } + + return Unit.INSTANCE; + + }); + + builder.addCancelButton(); + + exportButton.set(builder.addButton(LocaleController.getString("Export", R.string.ExportStickers), (it) -> { + + builder.dismiss(); + + exportStickersFinal(exportSets.get(), exportArchived.get()); + + return Unit.INSTANCE; + + })); + + builder.show(); + + } + + public void exportStickersFinal(boolean exportSets, boolean exportArchived) { + + AlertDialog pro = new AlertDialog(getParentActivity(), 3); + + pro.setCanCacnel(false); + + pro.show(); + + UIUtil.runOnIoDispatcher(() -> { + + Activity ctx = getParentActivity(); + + JsonObject exportObj = StickersUtil.exportStickers(currentAccount, exportSets, exportArchived); + + File cacheFile = new File(ApplicationLoader.applicationContext.getCacheDir(), new Date().toLocaleString() + ".nekox-stickers.json"); + + StringWriter stringWriter = new StringWriter(); + JsonWriter jsonWriter = new JsonWriter(stringWriter); + jsonWriter.setLenient(true); + jsonWriter.setIndent(" "); + try { + Streams.write(exportObj, jsonWriter); + } catch (IOException e) { + } + + FileUtil.writeUtf8String(stringWriter.toString(), cacheFile); + + UIUtil.runOnUIThread(() -> { + + pro.dismiss(); + + ShareUtil.shareFile(ctx, cacheFile); + + }); + + }); + + } @Override public boolean onBackPressed() { @@ -558,7 +797,7 @@ public class StickersActivity extends BaseFragment implements NotificationCenter } private void processSelectionMenu(int which) { - if (which == MENU_ARCHIVE || which == MENU_DELETE) { + if (which == MENU_EXPORT || which == MENU_ARCHIVE || which == MENU_DELETE) { final ArrayList stickerSetList = new ArrayList<>(selectedItems.size()); for (int i = 0, size = stickerSets.size(); i < size; i++) { @@ -568,6 +807,38 @@ public class StickersActivity extends BaseFragment implements NotificationCenter } } + if (which == MENU_EXPORT) { + + AlertDialog pro = new AlertDialog(getParentActivity(), 3); + pro.setCanCacnel(false); + pro.show(); + + UIUtil.runOnIoDispatcher(() -> { + + JsonObject exportObj = StickersUtil.exportStickers(stickerSetList); + + File cacheFile = new File(ApplicationLoader.applicationContext.getCacheDir(), new Date().toLocaleString() + ".nekox-stickers.json"); + + StringWriter stringWriter = new StringWriter(); + JsonWriter jsonWriter = new JsonWriter(stringWriter); + jsonWriter.setLenient(true); + jsonWriter.setIndent(" "); + try { + Streams.write(exportObj, jsonWriter); + } catch (IOException e) { + } + + FileUtil.writeUtf8String(stringWriter.toString(), cacheFile); + + UIUtil.runOnUIThread(() -> { + pro.dismiss(); + ShareUtil.shareFile(getParentActivity(), cacheFile); + }); + + }); + + } + final int count = stickerSetList.size(); switch (count) { @@ -785,7 +1056,7 @@ public class StickersActivity extends BaseFragment implements NotificationCenter LocaleController.getString("StickersHide", R.string.StickersHide), LocaleController.getString("StickersReorder", R.string.StickersReorder) }; - icons = new int[]{R.drawable.msg_archive, R.drawable.msg_reorder}; + icons = new int[]{R.drawable.baseline_archive_24, R.drawable.msg_reorder}; } else { options = new int[]{MENU_ARCHIVE, 3, 4, 2, MENU_DELETE}; items = new CharSequence[]{ @@ -796,11 +1067,11 @@ public class StickersActivity extends BaseFragment implements NotificationCenter LocaleController.getString("StickersRemove", R.string.StickersRemove), }; icons = new int[]{ - R.drawable.msg_archive, - R.drawable.msg_link, + R.drawable.baseline_archive_24, + R.drawable.baseline_link_24, R.drawable.msg_reorder, - R.drawable.msg_share, - R.drawable.msg_delete + R.drawable.baseline_forward_24, + R.drawable.baseline_delete_24 }; } builder.setItems(items, icons, (dialog, which) -> processSelectionOption(options[which], stickerSet)); diff --git a/TMessagesProj/src/main/java/org/telegram/ui/TwoStepVerificationActivity.java b/TMessagesProj/src/main/java/org/telegram/ui/TwoStepVerificationActivity.java index a05ddf5b2..88daead10 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/TwoStepVerificationActivity.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/TwoStepVerificationActivity.java @@ -28,18 +28,21 @@ import android.widget.LinearLayout; import android.widget.ScrollView; import android.widget.TextView; +import androidx.recyclerview.widget.LinearLayoutManager; +import androidx.recyclerview.widget.RecyclerView; + import org.telegram.messenger.AndroidUtilities; +import org.telegram.messenger.FileLog; import org.telegram.messenger.LocaleController; import org.telegram.messenger.NotificationCenter; -import org.telegram.messenger.FileLog; import org.telegram.messenger.R; import org.telegram.messenger.SRPHelper; import org.telegram.messenger.UserConfig; +import org.telegram.messenger.Utilities; import org.telegram.messenger.browser.Browser; import org.telegram.tgnet.ConnectionsManager; import org.telegram.tgnet.RequestDelegate; import org.telegram.tgnet.TLRPC; -import org.telegram.messenger.Utilities; import org.telegram.ui.ActionBar.ActionBar; import org.telegram.ui.ActionBar.ActionBarMenu; import org.telegram.ui.ActionBar.ActionBarMenuItem; @@ -58,9 +61,6 @@ import org.telegram.ui.Components.RecyclerListView; import java.util.ArrayList; -import androidx.recyclerview.widget.LinearLayoutManager; -import androidx.recyclerview.widget.RecyclerView; - import tw.nekomimi.nekogram.EditTextAutoFill; public class TwoStepVerificationActivity extends BaseFragment implements NotificationCenter.NotificationCenterDelegate { @@ -120,6 +120,13 @@ public class TwoStepVerificationActivity extends BaseFragment implements Notific currentPassword = password; } + public TwoStepVerificationActivity(int account, TLRPC.TL_account_password password) { + this(account); + currentPassword = password; + passwordEntered = currentPasswordHash != null && currentPasswordHash.length > 0 || !currentPassword.has_password; + initPasswordNewAlgo(currentPassword); + } + public void setCurrentPasswordParams(TLRPC.TL_account_password password, byte[] passwordHash, long secretId, byte[] secret) { currentPassword = password; currentPasswordHash = passwordHash; @@ -270,9 +277,9 @@ public class TwoStepVerificationActivity extends BaseFragment implements Notific } else { timeString = LocaleController.formatPluralString("Minutes", time / 60); } - showAlertWithText(LocaleController.getString("AppName", R.string.AppName), LocaleController.formatString("FloodWaitTime", R.string.FloodWaitTime, timeString)); + showAlertWithText(LocaleController.getString("NekoX", R.string.NekoX), LocaleController.formatString("FloodWaitTime", R.string.FloodWaitTime, timeString)); } else { - showAlertWithText(LocaleController.getString("AppName", R.string.AppName), error.text); + showAlertWithText(LocaleController.getString("NekoX", R.string.NekoX), error.text); } } }), ConnectionsManager.RequestFlagFailOnServerErrors | ConnectionsManager.RequestFlagWithoutLogin); @@ -384,7 +391,8 @@ public class TwoStepVerificationActivity extends BaseFragment implements Notific currentPassword = password; } - public void setDelegate(TwoStepVerificationActivityDelegate twoStepVerificationActivityDelegate) { + public void setDelegate(TwoStepVerificationActivityDelegate + twoStepVerificationActivityDelegate) { delegate = twoStepVerificationActivityDelegate; } @@ -638,9 +646,9 @@ public class TwoStepVerificationActivity extends BaseFragment implements Notific } else { timeString = LocaleController.formatPluralString("Minutes", time / 60); } - showAlertWithText(LocaleController.getString("AppName", R.string.AppName), LocaleController.formatString("FloodWaitTime", R.string.FloodWaitTime, timeString)); + showAlertWithText(LocaleController.getString("NekoX", R.string.NekoX), LocaleController.formatString("FloodWaitTime", R.string.FloodWaitTime, timeString)); } else { - showAlertWithText(LocaleController.getString("AppName", R.string.AppName), error.text); + showAlertWithText(LocaleController.getString("NekoX", R.string.NekoX), error.text); } } }); @@ -656,7 +664,8 @@ public class TwoStepVerificationActivity extends BaseFragment implements Notific return null; } - private boolean checkSecretValues(byte[] passwordBytes, TLRPC.TL_account_passwordSettings passwordSettings) { + private boolean checkSecretValues(byte[] passwordBytes, TLRPC. + TL_account_passwordSettings passwordSettings) { if (passwordSettings.secure_settings != null) { currentSecret = passwordSettings.secure_settings.secure_secret; byte[] passwordHash; @@ -777,9 +786,9 @@ public class TwoStepVerificationActivity extends BaseFragment implements Notific } else { timeString = LocaleController.formatPluralString("Minutes", time / 60); } - showAlertWithText(LocaleController.getString("AppName", R.string.AppName), LocaleController.formatString("FloodWaitTime", R.string.FloodWaitTime, timeString)); + showAlertWithText(LocaleController.getString("NekoX", R.string.NekoX), LocaleController.formatString("FloodWaitTime", R.string.FloodWaitTime, timeString)); } else { - showAlertWithText(LocaleController.getString("AppName", R.string.AppName), error.text); + showAlertWithText(LocaleController.getString("NekoX", R.string.NekoX), error.text); } }); } @@ -892,6 +901,7 @@ public class TwoStepVerificationActivity extends BaseFragment implements Notific } return 0; } + } @Override