From 0b01da670a004f6cd26ddbd59165ee66022ed5a1 Mon Sep 17 00:00:00 2001 From: DrKLO Date: Fri, 4 Apr 2014 21:58:33 +0400 Subject: [PATCH] Attempt to detect screenshots(not perfect now, disabled) --- TMessagesProj/src/main/AndroidManifest.xml | 6 +- TMessagesProj/src/main/assets/countries.txt | 15 +- .../messenger/ContactsController.java | 14 +- .../org/telegram/messenger/FileLoader.java | 3 +- .../telegram/messenger/MediaController.java | 232 +++++++++++++++++- .../messenger/MessagesController.java | 74 +++++- .../org/telegram/messenger/TLClassStore.java | 2 + .../java/org/telegram/messenger/TLRPC.java | 47 ++++ .../org/telegram/objects/MessageObject.java | 12 + .../org/telegram/ui/Cells/ChatMediaCell.java | 3 +- .../java/org/telegram/ui/ChatActivity.java | 61 ++++- .../org/telegram/ui/ContactsActivity.java | 8 + .../telegram/ui/CountrySelectActivity.java | 8 + .../telegram/ui/LanguageSelectActivity.java | 8 + .../telegram/ui/LoginActivityPhoneView.java | 2 +- .../java/org/telegram/ui/MediaActivity.java | 1 - .../org/telegram/ui/MessagesActivity.java | 12 + .../ui/SettingsWallpapersActivity.java | 4 +- .../src/main/res/values-ar/strings.xml | 2 + .../src/main/res/values-de/strings.xml | 24 +- .../src/main/res/values-es/strings.xml | 2 + .../src/main/res/values-it/strings.xml | 6 +- .../src/main/res/values-nl/strings.xml | 18 +- TMessagesProj/src/main/res/values/strings.xml | 2 + TMessagesProj/src/main/res/xml/auth.xml | 2 +- .../src/main/res/xml/sync_contacts.xml | 2 +- 26 files changed, 509 insertions(+), 61 deletions(-) diff --git a/TMessagesProj/src/main/AndroidManifest.xml b/TMessagesProj/src/main/AndroidManifest.xml index 2deb2e199..b2e98731d 100644 --- a/TMessagesProj/src/main/AndroidManifest.xml +++ b/TMessagesProj/src/main/AndroidManifest.xml @@ -1,6 +1,7 @@ + package="org.telegram.messenger" + android:installLocation="auto"> + android:largeHeap="true"> >> loadingFileObservers = new HashMap>>(); private HashMap observersByTag = new HashMap(); @@ -188,6 +192,72 @@ public class MediaController implements NotificationCenter.NotificationCenterDel } }; + private class InternalObserver extends ContentObserver { + public InternalObserver() { + super(null); + } + + @Override + public void onChange(boolean selfChange) { + super.onChange(selfChange); + processMediaObserver(MediaStore.Images.Media.INTERNAL_CONTENT_URI); + } + } + + private class ExternalObserver extends ContentObserver { + public ExternalObserver() { + super(null); + } + + @Override + public void onChange(boolean selfChange) { + super.onChange(selfChange); + processMediaObserver(MediaStore.Images.Media.EXTERNAL_CONTENT_URI); + } + } + + private ExternalObserver externalObserver = null; + private InternalObserver internalObserver = null; + private long lastSecretChatEnterTime = 0; + private long lastSecretChatLeaveTime = 0; + private long lastMediaCheckTime = 0; + private TLRPC.EncryptedChat lastSecretChat = null; + private ArrayList lastSecretChatVisibleMessages = null; + private int startObserverToken = 0; + private StopMediaObserverRunnable stopMediaObserverRunnable = null; + private final class StopMediaObserverRunnable implements Runnable { + public int currentObserverToken = 0; + + @Override + public void run() { + if (currentObserverToken == startObserverToken) { + try { + if (internalObserver != null) { + ApplicationLoader.applicationContext.getContentResolver().unregisterContentObserver(internalObserver); + internalObserver = null; + } + } catch (Exception e) { + FileLog.e("tmessages", e); + } + try { + if (externalObserver != null) { + ApplicationLoader.applicationContext.getContentResolver().unregisterContentObserver(externalObserver); + externalObserver = null; + } + } catch (Exception e) { + FileLog.e("tmessages", e); + } + } + } + } + private String[] mediaProjections = new String[] { + MediaStore.Images.ImageColumns.DATA, + MediaStore.Images.ImageColumns.DISPLAY_NAME, + MediaStore.Images.ImageColumns.BUCKET_DISPLAY_NAME, + MediaStore.Images.ImageColumns.DATE_TAKEN, + MediaStore.Images.ImageColumns.TITLE + }; + private static volatile MediaController Instance = null; public static MediaController getInstance() { MediaController localInstance = Instance; @@ -290,6 +360,165 @@ public class MediaController implements NotificationCenter.NotificationCenterDel currentGifMessageObject = null; } + public void startMediaObserver() { + if (android.os.Build.VERSION.SDK_INT > 0) { //disable while it's not perferct + return; + } + ApplicationLoader.applicationHandler.removeCallbacks(stopMediaObserverRunnable); + startObserverToken++; + try { + if (internalObserver == null) { + ApplicationLoader.applicationContext.getContentResolver().registerContentObserver(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, false, externalObserver = new ExternalObserver()); + } + } catch (Exception e) { + FileLog.e("tmessages", e); + } + try { + if (externalObserver == null) { + ApplicationLoader.applicationContext.getContentResolver().registerContentObserver(MediaStore.Images.Media.INTERNAL_CONTENT_URI, false, internalObserver = new InternalObserver()); + } + } catch (Exception e) { + FileLog.e("tmessages", e); + } + } + + public void stopMediaObserver() { + if (android.os.Build.VERSION.SDK_INT < 10) { //disable while it's not perferct + return; + } + if (stopMediaObserverRunnable == null) { + stopMediaObserverRunnable = new StopMediaObserverRunnable(); + } + stopMediaObserverRunnable.currentObserverToken = startObserverToken; + ApplicationLoader.applicationHandler.postDelayed(stopMediaObserverRunnable, 5000); + } + + public void processMediaObserver(Uri uri) { + try { + Cursor cursor = ApplicationLoader.applicationContext.getContentResolver().query(uri, mediaProjections, null, null, "date_added DESC LIMIT 1"); + final ArrayList screenshotDates = new ArrayList(); + if (cursor != null) { + while (cursor.moveToNext()) { + String val = ""; + String data = cursor.getString(0); + String display_name = cursor.getString(1); + String album_name = cursor.getString(2); + String title = cursor.getString(4); + long date = cursor.getLong(3); + if (data != null && data.toLowerCase().contains("screenshot") || + display_name != null && display_name.toLowerCase().contains("screenshot") || + album_name != null && album_name.toLowerCase().contains("screenshot") || + title != null && title.toLowerCase().contains("screenshot")) { + /*BitmapRegionDecoder bitmapRegionDecoder = null; + boolean added = false; + try { + int waitCount = 0; + while (waitCount < 5 && bitmapRegionDecoder == null) { + try { + bitmapRegionDecoder = BitmapRegionDecoder.newInstance(data, true); + if (bitmapRegionDecoder != null) { + break; + } + } catch (Exception e) { + FileLog.e("tmessages", e); + } + Thread.sleep(1000); + } + if (bitmapRegionDecoder != null) { + Bitmap bitmap = bitmapRegionDecoder.decodeRegion(new Rect(0, 0, Utilities.dp(44), Utilities.dp(44)), null); + int w = bitmap.getWidth(); + int h = bitmap.getHeight(); + for (int y = 0; y < h; y++) { + int rowCount = 0; + for (int x = 0; x < w; x++) { + int px = bitmap.getPixel(x, y); + if (px == 0xffffffff) { + rowCount++; + } else { + rowCount = 0; + } + if (rowCount > 8) { + break; + } + } + if (rowCount > 8) { + screenshotDates.add(date); + added = true; + break; + } + } + bitmapRegionDecoder.recycle(); + try { + if (bitmap != null) { + bitmap.recycle(); + } + } catch (Exception e) { + FileLog.e("tmessages", e); + } + } + } catch (Exception e) { + FileLog.e("tmessages", e); + try { + if (bitmapRegionDecoder != null) { + bitmapRegionDecoder.recycle(); + } + } catch (Exception e2) { + FileLog.e("tmessages", e2); + } + if (!added) { + screenshotDates.add(date); + } + }*/ + screenshotDates.add(date); + } + FileLog.e("tmessages", "screenshot!"); + } + cursor.close(); + } + if (!screenshotDates.isEmpty()) { + Utilities.RunOnUIThread(new Runnable() { + @Override + public void run() { + NotificationCenter.getInstance().postNotificationName(screenshotTook); + checkScreenshots(screenshotDates); + } + }); + } + } catch (Exception e) { + FileLog.e("tmessages", e); + } + } + + private void checkScreenshots(ArrayList dates) { + if (dates == null || dates.isEmpty() || lastSecretChatEnterTime == 0 || lastSecretChat == null || !(lastSecretChat instanceof TLRPC.TL_encryptedChat)) { + return; + } + long dt = 2000; + boolean send = false; + for (Long date : dates) { + if (lastMediaCheckTime != 0 && date <= lastMediaCheckTime) { + continue; + } + + if (date >= lastSecretChatEnterTime) { + if (lastSecretChatLeaveTime == 0 || date <= lastSecretChatLeaveTime + dt) { + lastMediaCheckTime = Math.max(lastMediaCheckTime, date); + send = true; + } + } + } + if (send) { + MessagesController.getInstance().sendScreenshotMessage(lastSecretChat, lastSecretChatVisibleMessages); + } + } + + public void setLastEncryptedChatParams(long enterTime, long leaveTime, TLRPC.EncryptedChat encryptedChat, ArrayList visibleMessages) { + lastSecretChatEnterTime = enterTime; + lastSecretChatLeaveTime = leaveTime; + lastSecretChat = encryptedChat; + lastSecretChatVisibleMessages = visibleMessages; + } + public int generateObserverTag() { return lastTag++; } @@ -1159,7 +1388,8 @@ public class MediaController implements NotificationCenter.NotificationCenterDel if (f.length() > 0) { cacheFile = f; } - } else { + } + if (cacheFile == null) { cacheFile = new File(Utilities.getCacheDir(), messageObject.getFileName()); } try { diff --git a/TMessagesProj/src/main/java/org/telegram/messenger/MessagesController.java b/TMessagesProj/src/main/java/org/telegram/messenger/MessagesController.java index 8ba0b1100..80c77d25a 100644 --- a/TMessagesProj/src/main/java/org/telegram/messenger/MessagesController.java +++ b/TMessagesProj/src/main/java/org/telegram/messenger/MessagesController.java @@ -401,7 +401,7 @@ public class MessagesController implements NotificationCenter.NotificationCenter public void deleteAllAppAccounts() { try { AccountManager am = AccountManager.get(ApplicationLoader.applicationContext); - Account[] accounts = am.getAccountsByType("org.telegram.messenger.account"); + Account[] accounts = am.getAccountsByType("org.telegram.account"); for (Account c : accounts) { am.removeAccount(c, null, null); } @@ -1613,6 +1613,9 @@ public class MessagesController implements NotificationCenter.NotificationCenter } private void sendMessagesDeleteMessage(ArrayList random_ids, TLRPC.EncryptedChat encryptedChat) { + if (!(encryptedChat instanceof TLRPC.TL_encryptedChat)) { + return; + } TLRPC.TL_decryptedMessageService reqSend = new TLRPC.TL_decryptedMessageService(); reqSend.random_id = getNextRandomId(); reqSend.random_bytes = new byte[Math.max(1, (int)Math.ceil(random.nextDouble() * 16))]; @@ -1620,9 +1623,13 @@ public class MessagesController implements NotificationCenter.NotificationCenter reqSend.action = new TLRPC.TL_decryptedMessageActionDeleteMessages(); reqSend.action.random_ids = random_ids; performSendEncryptedRequest(reqSend, null, encryptedChat, null); + } private void sendClearHistoryMessage(TLRPC.EncryptedChat encryptedChat) { + if (!(encryptedChat instanceof TLRPC.TL_encryptedChat)) { + return; + } TLRPC.TL_decryptedMessageService reqSend = new TLRPC.TL_decryptedMessageService(); reqSend.random_id = getNextRandomId(); reqSend.random_bytes = new byte[Math.max(1, (int)Math.ceil(random.nextDouble() * 16))]; @@ -1632,6 +1639,9 @@ public class MessagesController implements NotificationCenter.NotificationCenter } public void sendTTLMessage(TLRPC.EncryptedChat encryptedChat) { + if (!(encryptedChat instanceof TLRPC.TL_encryptedChat)) { + return; + } TLRPC.TL_messageService newMsg = new TLRPC.TL_messageService(); newMsg.action = new TLRPC.TL_messageActionTTLChange(); @@ -1672,6 +1682,54 @@ public class MessagesController implements NotificationCenter.NotificationCenter performSendEncryptedRequest(reqSend, newMsgObj, encryptedChat, null); } + public void sendScreenshotMessage(TLRPC.EncryptedChat encryptedChat, ArrayList random_ids) { + if (!(encryptedChat instanceof TLRPC.TL_encryptedChat)) { + return; + } + + TLRPC.TL_decryptedMessageActionScreenshotMessages action = new TLRPC.TL_decryptedMessageActionScreenshotMessages(); + action.random_ids = random_ids; + + TLRPC.TL_messageService newMsg = new TLRPC.TL_messageService(); + + newMsg.action = new TLRPC.TL_messageEcryptedAction(); + newMsg.action.encryptedAction = action; + + newMsg.local_id = newMsg.id = UserConfig.getNewMessageId(); + newMsg.from_id = UserConfig.clientUserId; + newMsg.unread = true; + newMsg.dialog_id = ((long)encryptedChat.id) << 32; + newMsg.to_id = new TLRPC.TL_peerUser(); + if (encryptedChat.participant_id == UserConfig.clientUserId) { + newMsg.to_id.user_id = encryptedChat.admin_id; + } else { + newMsg.to_id.user_id = encryptedChat.participant_id; + } + newMsg.out = true; + newMsg.date = ConnectionsManager.getInstance().getCurrentTime(); + newMsg.random_id = getNextRandomId(); + UserConfig.saveConfig(false); + final MessageObject newMsgObj = new MessageObject(newMsg, users); + newMsgObj.messageOwner.send_state = MESSAGE_SEND_STATE_SENDING; + + final ArrayList objArr = new ArrayList(); + objArr.add(newMsgObj); + ArrayList arr = new ArrayList(); + arr.add(newMsg); + MessagesStorage.getInstance().putMessages(arr, false, true); + updateInterfaceWithMessages(newMsg.dialog_id, objArr); + NotificationCenter.getInstance().postNotificationName(dialogsNeedReload); + + sendingMessages.put(newMsg.id, newMsgObj); + + TLRPC.TL_decryptedMessageService reqSend = new TLRPC.TL_decryptedMessageService(); + reqSend.random_id = newMsg.random_id; + reqSend.random_bytes = new byte[Math.max(1, (int)Math.ceil(random.nextDouble() * 16))]; + random.nextBytes(reqSend.random_bytes); + reqSend.action = action; + performSendEncryptedRequest(reqSend, newMsgObj, encryptedChat, null); + } + private void sendMessage(String message, double lat, double lon, TLRPC.TL_photo photo, TLRPC.TL_video video, MessageObject msgObj, TLRPC.FileLocation location, TLRPC.User user, TLRPC.TL_document document, TLRPC.TL_audio audio, long peer) { TLRPC.Message newMsg = null; int type = -1; @@ -4542,6 +4600,7 @@ public class MessagesController implements NotificationCenter.NotificationCenter notification.ledOnMS = 1000; notification.ledOffMS = 1000; notification.flags |= Notification.FLAG_SHOW_LIGHTS; + notification.defaults = 0; try { mNotificationManager.notify(1, notification); if (preferences.getBoolean("EnablePebbleNotifications", false)) { @@ -4827,10 +4886,17 @@ public class MessagesController implements NotificationCenter.NotificationCenter return newMessage; } else if (object instanceof TLRPC.TL_decryptedMessageService) { TLRPC.TL_decryptedMessageService serviceMessage = (TLRPC.TL_decryptedMessageService)object; - if (serviceMessage.action instanceof TLRPC.TL_decryptedMessageActionSetMessageTTL) { + if (serviceMessage.action instanceof TLRPC.TL_decryptedMessageActionSetMessageTTL || serviceMessage.action instanceof TLRPC.TL_decryptedMessageActionScreenshotMessages) { TLRPC.TL_messageService newMessage = new TLRPC.TL_messageService(); - newMessage.action = new TLRPC.TL_messageActionTTLChange(); - newMessage.action.ttl = chat.ttl = serviceMessage.action.ttl_seconds; + if (serviceMessage.action instanceof TLRPC.TL_decryptedMessageActionSetMessageTTL) { + newMessage.action = new TLRPC.TL_messageActionTTLChange(); + newMessage.action.ttl = chat.ttl = serviceMessage.action.ttl_seconds; + } else if (serviceMessage.action instanceof TLRPC.TL_decryptedMessageActionScreenshotMessages) { + newMessage.action = new TLRPC.TL_messageEcryptedAction(); + newMessage.action.encryptedAction = serviceMessage.action; + } else { + return null; + } newMessage.local_id = newMessage.id = UserConfig.getNewMessageId(); UserConfig.saveConfig(false); newMessage.unread = true; diff --git a/TMessagesProj/src/main/java/org/telegram/messenger/TLClassStore.java b/TMessagesProj/src/main/java/org/telegram/messenger/TLClassStore.java index 40580e068..2e1895e5c 100644 --- a/TMessagesProj/src/main/java/org/telegram/messenger/TLClassStore.java +++ b/TMessagesProj/src/main/java/org/telegram/messenger/TLClassStore.java @@ -410,6 +410,8 @@ public class TLClassStore { classStore.put(TLRPC.TL_help_getSupport.constructor, TLRPC.TL_help_getSupport.class); classStore.put(TLRPC.TL_decryptedMessageActionDeleteMessages.constructor, TLRPC.TL_decryptedMessageActionDeleteMessages.class); classStore.put(TLRPC.TL_decryptedMessageActionFlushHistory.constructor, TLRPC.TL_decryptedMessageActionFlushHistory.class); + classStore.put(TLRPC.TL_decryptedMessageActionScreenshotMessages.constructor, TLRPC.TL_decryptedMessageActionScreenshotMessages.class); + classStore.put(TLRPC.TL_messageEcryptedAction.constructor, TLRPC.TL_messageEcryptedAction.class); classStore.put(TLRPC.TL_msg_container.constructor, TLRPC.TL_msg_container.class); classStore.put(TLRPC.TL_fileEncryptedLocation.constructor, TLRPC.TL_fileEncryptedLocation.class); diff --git a/TMessagesProj/src/main/java/org/telegram/messenger/TLRPC.java b/TMessagesProj/src/main/java/org/telegram/messenger/TLRPC.java index c624ee7f0..e1fa97689 100644 --- a/TMessagesProj/src/main/java/org/telegram/messenger/TLRPC.java +++ b/TMessagesProj/src/main/java/org/telegram/messenger/TLRPC.java @@ -8818,6 +8818,7 @@ public class TLRPC { public ArrayList users = new ArrayList(); public String address; public int ttl; + public DecryptedMessageAction encryptedAction; } public static class TL_messageActionTTLChange extends MessageAction { @@ -9110,6 +9111,52 @@ public class TLRPC { } } + public static class TL_decryptedMessageActionScreenshotMessages extends DecryptedMessageAction { + public static int constructor = 0x954bd30; + + + public void readParams(AbsSerializedData stream) { + boolean[] error = new boolean[1]; + stream.readInt32(error); + if (error[0]) { + return; + } + int count = stream.readInt32(error); + if (error[0]) { + return; + } + for (long a = 0; a < count; a++) { + random_ids.add(stream.readInt64(error)); + if (error[0]) { + return; + } + } + } + + public void serializeToStream(AbsSerializedData stream) { + stream.writeInt32(constructor); + stream.writeInt32(0x1cb5c415); + int count = random_ids.size(); + stream.writeInt32(count); + for (Long value : random_ids) { + stream.writeInt64(value); + } + } + } + + public static class TL_messageEcryptedAction extends MessageAction { + public static int constructor = 0x555555F7; + + public void readParams(AbsSerializedData stream) { + encryptedAction = (DecryptedMessageAction)TLClassStore.Instance().TLdeserialize(stream, stream.readInt32()); + } + + public void serializeToStream(AbsSerializedData stream) { + stream.writeInt32(constructor); + encryptedAction.serializeToStream(stream); + } + } + public static class TL_upload_saveBigFilePart extends TLObject { public static int constructor = 0xde7b673d; diff --git a/TMessagesProj/src/main/java/org/telegram/objects/MessageObject.java b/TMessagesProj/src/main/java/org/telegram/objects/MessageObject.java index 732bc887f..f414a9c8e 100644 --- a/TMessagesProj/src/main/java/org/telegram/objects/MessageObject.java +++ b/TMessagesProj/src/main/java/org/telegram/objects/MessageObject.java @@ -217,6 +217,18 @@ public class MessageObject { } else { messageText = LocaleController.formatString("NotificationContactNewPhoto", R.string.NotificationContactNewPhoto, ""); } + } else if (message.action instanceof TLRPC.TL_messageEcryptedAction) { + if (message.action.encryptedAction instanceof TLRPC.TL_decryptedMessageActionScreenshotMessages) { + if (isFromMe()) { + messageText = LocaleController.formatString("ActionTakeScreenshootYou", R.string.ActionTakeScreenshootYou); + } else { + if (fromUser != null) { + messageText = LocaleController.formatString("ActionTakeScreenshoot", R.string.ActionTakeScreenshoot).replace("un1", fromUser.first_name); + } else { + messageText = LocaleController.formatString("ActionTakeScreenshoot", R.string.ActionTakeScreenshoot).replace("un1", ""); + } + } + } } } } else if (message.media != null && !(message.media instanceof TLRPC.TL_messageMediaEmpty)) { diff --git a/TMessagesProj/src/main/java/org/telegram/ui/Cells/ChatMediaCell.java b/TMessagesProj/src/main/java/org/telegram/ui/Cells/ChatMediaCell.java index 17b98dc18..137003d20 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/Cells/ChatMediaCell.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/Cells/ChatMediaCell.java @@ -411,7 +411,8 @@ public class ChatMediaCell extends ChatBaseCell implements MediaController.FileD fileName = currentMessageObject.messageOwner.attachPath; cacheFile = f; } - } else { + } + if (fileName == null) { fileName = currentMessageObject.getFileName(); cacheFile = new File(Utilities.getCacheDir(), fileName); } diff --git a/TMessagesProj/src/main/java/org/telegram/ui/ChatActivity.java b/TMessagesProj/src/main/java/org/telegram/ui/ChatActivity.java index a9971c075..6fb02986f 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/ChatActivity.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/ChatActivity.java @@ -196,6 +196,9 @@ public class ChatActivity extends BaseFragment implements SizeNotifierRelativeLa private CharSequence lastPrintString; + private long chatEnterTime = 0; + private long chatLeaveTime = 0; + private final static int copy = 1; private final static int forward = 2; private final static int delete = 3; @@ -268,7 +271,7 @@ public class ChatActivity extends BaseFragment implements SizeNotifierRelativeLa random_ids = new ArrayList(); for (HashMap.Entry entry : selectedMessagesIds.entrySet()) { MessageObject msg = entry.getValue(); - if (msg.messageOwner.random_id != 0) { + if (msg.messageOwner.random_id != 0 && msg.type != 10) { random_ids.add(msg.messageOwner.random_id); } } @@ -401,6 +404,7 @@ public class ChatActivity extends BaseFragment implements SizeNotifierRelativeLa dialog_id = ((long)encId) << 32; maxMessageId = Integer.MIN_VALUE; minMessageId = Integer.MAX_VALUE; + MediaController.getInstance().startMediaObserver(); } else { return false; } @@ -429,6 +433,7 @@ public class ChatActivity extends BaseFragment implements SizeNotifierRelativeLa NotificationCenter.getInstance().addObserver(this, MediaController.recordStarted); NotificationCenter.getInstance().addObserver(this, MediaController.recordStartError); NotificationCenter.getInstance().addObserver(this, MediaController.recordStopped); + NotificationCenter.getInstance().addObserver(this, MediaController.screenshotTook); NotificationCenter.getInstance().addObserver(this, 997); loading = true; @@ -478,7 +483,11 @@ public class ChatActivity extends BaseFragment implements SizeNotifierRelativeLa NotificationCenter.getInstance().removeObserver(this, MediaController.recordStarted); NotificationCenter.getInstance().removeObserver(this, MediaController.recordStartError); NotificationCenter.getInstance().removeObserver(this, MediaController.recordStopped); + NotificationCenter.getInstance().removeObserver(this, MediaController.screenshotTook); NotificationCenter.getInstance().removeObserver(this, 997); + if (currentEncryptedChat != null) { + MediaController.getInstance().stopMediaObserver(); + } if (sizeNotifierRelativeLayout != null) { sizeNotifierRelativeLayout.delegate = null; sizeNotifierRelativeLayout = null; @@ -1263,7 +1272,7 @@ public class ChatActivity extends BaseFragment implements SizeNotifierRelativeLa if (canSave) { if (messageObject.messageOwner.media instanceof TLRPC.TL_messageMediaDocument) { String mime = messageObject.messageOwner.media.document.mime_type; - if (mime != null && mime.equals("text/xml")) { + if (mime != null && mime.endsWith("/xml")) { return 5; } } @@ -1307,7 +1316,7 @@ public class ChatActivity extends BaseFragment implements SizeNotifierRelativeLa if (canSave) { if (messageObject.messageOwner.media instanceof TLRPC.TL_messageMediaDocument) { String mime = messageObject.messageOwner.media.document.mime_type; - if (mime != null && mime.equals("text/xml")) { + if (mime != null && mime.endsWith("text/xml")) { return 5; } } @@ -2404,6 +2413,8 @@ public class ChatActivity extends BaseFragment implements SizeNotifierRelativeLa recordingAudio = true; updateAudioRecordIntefrace(); } + } else if (id == MediaController.screenshotTook) { + updateInformationForScreenshotDetector(); } } @@ -2635,10 +2646,10 @@ public class ChatActivity extends BaseFragment implements SizeNotifierRelativeLa } }, 400); } - -// if (currentEncryptedChat != null && parentActivity != null) { -// parentActivity.getWindow().addFlags(WindowManager.LayoutParams.FLAG_SECURE); -// } + if (currentEncryptedChat != null) { + chatEnterTime = System.currentTimeMillis(); + chatLeaveTime = 0; + } } private void setTypingAnimation(boolean start) { @@ -2686,9 +2697,35 @@ public class ChatActivity extends BaseFragment implements SizeNotifierRelativeLa editor.commit(); } -// if (currentEncryptedChat != null && parentActivity != null) { -// parentActivity.getWindow().clearFlags(WindowManager.LayoutParams.FLAG_SECURE); -// } + if (currentEncryptedChat != null) { + chatLeaveTime = System.currentTimeMillis(); + updateInformationForScreenshotDetector(); + } + } + + private void updateInformationForScreenshotDetector() { + ArrayList visibleMessages = new ArrayList(); + if (chatListView != null) { + int count = chatListView.getChildCount(); + for (int a = 0; a < count; a++) { + View view = chatListView.getChildAt(a); + MessageObject object = null; + if (view instanceof ChatBaseCell) { + ChatBaseCell cell = (ChatBaseCell) view; + object = cell.getMessageObject(); + } else { + Object tag = view.getTag(); + if (tag instanceof ChatListRowHolderEx) { + ChatListRowHolderEx holder = (ChatListRowHolderEx) tag; + object = holder.message; + } + } + if (object != null && object.messageOwner.id < 0 && object.messageOwner.random_id != 0) { + visibleMessages.add(object.messageOwner.random_id); + } + } + } + MediaController.getInstance().setLastEncryptedChatParams(chatEnterTime, chatLeaveTime, currentEncryptedChat, visibleMessages); } private void fixLayout() { @@ -3155,7 +3192,7 @@ public class ChatActivity extends BaseFragment implements SizeNotifierRelativeLa ArrayList arr = new ArrayList(); arr.add(selectedObject.messageOwner.id); ArrayList random_ids = null; - if (currentEncryptedChat != null && selectedObject.messageOwner.random_id != 0) { + if (currentEncryptedChat != null && selectedObject.messageOwner.random_id != 0 && selectedObject.type != 10) { random_ids = new ArrayList(); random_ids.add(selectedObject.messageOwner.random_id); } @@ -3168,7 +3205,7 @@ public class ChatActivity extends BaseFragment implements SizeNotifierRelativeLa ids.add(selectedObject.messageOwner.id); removeUnreadPlane(true); ArrayList random_ids = null; - if (currentEncryptedChat != null && selectedObject.messageOwner.random_id != 0) { + if (currentEncryptedChat != null && selectedObject.messageOwner.random_id != 0 && selectedObject.type != 10) { random_ids = new ArrayList(); random_ids.add(selectedObject.messageOwner.random_id); } diff --git a/TMessagesProj/src/main/java/org/telegram/ui/ContactsActivity.java b/TMessagesProj/src/main/java/org/telegram/ui/ContactsActivity.java index a5fe2b81a..f0a3b6c61 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/ContactsActivity.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/ContactsActivity.java @@ -380,6 +380,14 @@ public class ContactsActivity extends BaseFragment implements NotificationCenter ((LaunchActivity)parentActivity).updateActionBar(); } + @Override + public void onPause() { + super.onPause(); + if (searchItem != null && searchItem.isActionViewExpanded()) { + searchItem.collapseActionView(); + } + } + @Override public boolean onOptionsItemSelected(MenuItem item) { int itemId = item.getItemId(); diff --git a/TMessagesProj/src/main/java/org/telegram/ui/CountrySelectActivity.java b/TMessagesProj/src/main/java/org/telegram/ui/CountrySelectActivity.java index 23f58c303..7c220f551 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/CountrySelectActivity.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/CountrySelectActivity.java @@ -172,6 +172,14 @@ public class CountrySelectActivity extends ActionBarActivity { applySelfActionBar(); } + @Override + public void onPause() { + super.onPause(); + if (searchItem != null && searchItem.isActionViewExpanded()) { + searchItem.collapseActionView(); + } + } + @Override public boolean onOptionsItemSelected(MenuItem item) { int itemId = item.getItemId(); diff --git a/TMessagesProj/src/main/java/org/telegram/ui/LanguageSelectActivity.java b/TMessagesProj/src/main/java/org/telegram/ui/LanguageSelectActivity.java index fa6cf2dca..d95c21d47 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/LanguageSelectActivity.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/LanguageSelectActivity.java @@ -233,6 +233,14 @@ public class LanguageSelectActivity extends BaseFragment { ((LaunchActivity)parentActivity).updateActionBar(); } + @Override + public void onPause() { + super.onPause(); + if (searchItem != null && searchItem.isActionViewExpanded()) { + searchItem.collapseActionView(); + } + } + @Override public boolean onOptionsItemSelected(MenuItem item) { int itemId = item.getItemId(); diff --git a/TMessagesProj/src/main/java/org/telegram/ui/LoginActivityPhoneView.java b/TMessagesProj/src/main/java/org/telegram/ui/LoginActivityPhoneView.java index a9f693dca..f01445c2b 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/LoginActivityPhoneView.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/LoginActivityPhoneView.java @@ -322,7 +322,7 @@ public class LoginActivityPhoneView extends SlideView implements AdapterView.OnI delegate.needShowAlert(LocaleController.getString("WrongCountry", R.string.WrongCountry)); return; } - if (codeField.length() == 0 || phoneField.length() == 0) { + if (codeField.length() == 0) { delegate.needShowAlert(LocaleController.getString("InvalidPhoneNumber", R.string.InvalidPhoneNumber)); return; } diff --git a/TMessagesProj/src/main/java/org/telegram/ui/MediaActivity.java b/TMessagesProj/src/main/java/org/telegram/ui/MediaActivity.java index 22faf2e17..df1c05fad 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/MediaActivity.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/MediaActivity.java @@ -37,7 +37,6 @@ import org.telegram.messenger.R; import org.telegram.ui.Views.BackupImageView; import org.telegram.ui.Views.BaseFragment; import org.telegram.ui.Views.OnSwipeTouchListener; -import org.w3c.dom.Text; import java.util.ArrayList; import java.util.HashMap; diff --git a/TMessagesProj/src/main/java/org/telegram/ui/MessagesActivity.java b/TMessagesProj/src/main/java/org/telegram/ui/MessagesActivity.java index 77a364c14..badde5789 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/MessagesActivity.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/MessagesActivity.java @@ -361,10 +361,19 @@ public class MessagesActivity extends BaseFragment implements NotificationCenter if (messagesListViewAdapter != null) { messagesListViewAdapter.notifyDataSetChanged(); } + ((LaunchActivity)parentActivity).showActionBar(); ((LaunchActivity)parentActivity).updateActionBar(); } + @Override + public void onPause() { + super.onPause(); + if (searchItem != null && searchItem.isActionViewExpanded()) { + searchItem.collapseActionView(); + } + } + @Override @SuppressWarnings("unchecked") public void didReceivedNotification(int id, Object... args) { @@ -541,6 +550,9 @@ public class MessagesActivity extends BaseFragment implements NotificationCenter @Override public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) { + if (parentActivity == null) { + return; + } searchItem = (SupportMenuItem)menu.add(Menu.NONE, 0, Menu.NONE, LocaleController.getString("Search", R.string.Search)).setIcon(R.drawable.ic_ab_search); searchItem.setShowAsAction(SupportMenuItem.SHOW_AS_ACTION_ALWAYS|SupportMenuItem.SHOW_AS_ACTION_COLLAPSE_ACTION_VIEW); searchItem.setActionView(searchView = new SearchView(parentActivity)); diff --git a/TMessagesProj/src/main/java/org/telegram/ui/SettingsWallpapersActivity.java b/TMessagesProj/src/main/java/org/telegram/ui/SettingsWallpapersActivity.java index 4cb4165da..9c1304f9b 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/SettingsWallpapersActivity.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/SettingsWallpapersActivity.java @@ -533,7 +533,9 @@ public class SettingsWallpapersActivity extends BaseFragment implements Notifica View selection = view.findViewById(R.id.selection); TLRPC.WallPaper wallPaper = wallPapers.get(i - 1); TLRPC.PhotoSize size = PhotoObject.getClosestPhotoSizeWithSize(wallPaper.sizes, Utilities.dp(100), Utilities.dp(100)); - image.setImage(size.location, "100_100", 0); + if (size != null && size.location != null) { + image.setImage(size.location, "100_100", 0); + } if (wallPaper.id == selectedBackground) { selection.setVisibility(View.VISIBLE); } else { diff --git a/TMessagesProj/src/main/res/values-ar/strings.xml b/TMessagesProj/src/main/res/values-ar/strings.xml index b347218cc..c6ab87364 100644 --- a/TMessagesProj/src/main/res/values-ar/strings.xml +++ b/TMessagesProj/src/main/res/values-ar/strings.xml @@ -329,6 +329,8 @@ مستند مقطع صوتي أنت + You took a screenshot! + un1 took a screenshot! رقم الهاتف غير صحيح diff --git a/TMessagesProj/src/main/res/values-de/strings.xml b/TMessagesProj/src/main/res/values-de/strings.xml index 445a805da..28bac65bf 100644 --- a/TMessagesProj/src/main/res/values-de/strings.xml +++ b/TMessagesProj/src/main/res/values-de/strings.xml @@ -224,7 +224,7 @@ Keine blockierten Benutzer DEINE TELEFONNUMMER NACHRICHTEN - Nachrichtenton + Benachrichtigung Nachrichtenvorschau GRUPPEN Nachrichtenton auswählen @@ -256,12 +256,12 @@ Kontakt ist Telegram beigetreten PEBBLE Sprache - Please note that Telegram Support is done by volunteers. We try to respond as quickly as possible, but it may take a while.
]]>Please take a look at the Telegram FAQ]]>: it has important troubleshooting tips]]> and answers to most questions.
- Ask a volunteer + Bedenke bitte, dass der Telegram Support von Freiwilligen geleistet wird. Wir versuchen so schnell wie möglich zu antworten. Dies kann jedoch manchmal etwas länger dauern.
]]>Bitte schau in den Telegram FAQ]]>: nach. Dort findest du Antworten auf die meisten Fragen und wichtige Tipps zur Problemlösung]]>.
+ Frage einen Freiwilligen Telegram-FAQ https://telegram.org/faq Lokalisierung löschen? - Incorrect localization file + Falsche Sprachdatei Noch keine geteilten Medien vorhanden @@ -321,7 +321,7 @@ Du hast die Gruppe erstellt un1 hat dich aus der Gruppe entfernt un1 hat dich hinzugefügt - Diese Nachricht wird von deiner Telegram-Version nicht unterstützt. + Diese Nachricht wird auf deiner Version von Telegram nicht unterstützt. Bitte aktualisiere die App um sie zu sehen: http://telegram.org/update Foto Video Standort @@ -329,6 +329,8 @@ Dokument Audio Du + You took a screenshot! + un1 took a screenshot! Ungültige Telefonnummer @@ -356,12 +358,12 @@ Cloud-Basiert Vertraulich Willkommen im Zeitalter der sicheren und schnellen Kommunikation. - Telegram]]> stellt Nachrichten schneller]]>zu als andere Anwendungen - Telegram]]> ist für immer kostenlos.]]>Keine Werbung. Keine wiederkehrenden Kosten. - Telegram]]> schützt deine Nachrichten]]>vor Hacker-Angriffen - Telegram]]> hat keine Grenzen in Sachen]]>Größe deiner Chats und Medien - Telegram]]> lässt sich von verschiedenen]]>Geräten gleichzeitig nutzen - Telegram]]>-Nachrichten sind stark]]>verschlüsselt und können sich selbst zerstören + Telegram]]> stellt Nachrichten schneller zu als andere Anwendungen + Telegram]]> ist für immer kostenlos. Keine Werbung. Keine wiederkehrenden Kosten. + Telegram]]> schützt deine Nachrichten vor Hacker-Angriffen + Telegram]]> hat keine Grenzen in Sachen Größe deiner Chats und Medien + Telegram]]> lässt sich von verschiedenen Geräten gleichzeitig nutzen + Telegram]]>-Nachrichten sind stark verschlüsselt und können sich selbst zerstören Jetzt beginnen diff --git a/TMessagesProj/src/main/res/values-es/strings.xml b/TMessagesProj/src/main/res/values-es/strings.xml index 0a709c4f4..f5a341b0e 100644 --- a/TMessagesProj/src/main/res/values-es/strings.xml +++ b/TMessagesProj/src/main/res/values-es/strings.xml @@ -329,6 +329,8 @@ Archivo Audio + You took a screenshot! + un1 took a screenshot! Número de teléfono inválido diff --git a/TMessagesProj/src/main/res/values-it/strings.xml b/TMessagesProj/src/main/res/values-it/strings.xml index 1edff811d..2e051f588 100644 --- a/TMessagesProj/src/main/res/values-it/strings.xml +++ b/TMessagesProj/src/main/res/values-it/strings.xml @@ -321,7 +321,7 @@ Hai creato il gruppo un1 ti ha rimosso un1 ti ha aggiunto - Questo messaggio non è supportato dalla tua versione di Telegram. + Questo messaggio non è supportato sulla tua versione di Telegram. Aggiorna l\'applicazione per\nvisualizzarlo: http://telegram.org/update Foto Video Posizione @@ -329,6 +329,8 @@ Documento Audio Tu + You took a screenshot! + un1 took a screenshot! Numero di telefono non valido @@ -358,7 +360,7 @@ Benvenuto nell\'era della messaggistica veloce e sicura Telegram]]> consegna i messaggi più velocemente di qualsiasi altra applicazione Telegram]]> è gratuita per sempre. Nessuna pubblicità. Nessun costo di abbonamento - Telegram]]> tiene al sicuro i tuoi messaggi dagli attacchi dei hacker + Telegram]]> tiene al sicuro i tuoi messaggi dagli attacchi degli hacker Telegram]]> non ha limiti sulle dimensioni dei tuoi file multimediali e delle chat Telegram]]> ti consente di accedere ai messaggi da più dispositivi Telegram]]> cifra in maniera sicura i messaggi e può far sì che si autodistruggano diff --git a/TMessagesProj/src/main/res/values-nl/strings.xml b/TMessagesProj/src/main/res/values-nl/strings.xml index 3913b251f..c6ef21e91 100644 --- a/TMessagesProj/src/main/res/values-nl/strings.xml +++ b/TMessagesProj/src/main/res/values-nl/strings.xml @@ -110,7 +110,7 @@ U hebt deze groep verlaten Deze groep verwijderen SLEEP OM TE ANNULEREN - Opslaan in downloads + Opslaan in Downloads Vertaling toepassen @@ -256,12 +256,12 @@ Contact lid geworden van Telegram PEBBLE Taal - Please note that Telegram Support is done by volunteers. We try to respond as quickly as possible, but it may take a while.
]]>Please take a look at the Telegram FAQ]]>: it has important troubleshooting tips]]> and answers to most questions.
- Ask a volunteer - Telegram FAQ + Houd er rekening mee dat de ondersteuning van Telegram door vrijwilligers wordt gedaan. We doen ons best om zo snel als mogelijk te antwoorden, maar het kan even even duren.
]]>Bekijk ook de veelgestelde vragen (FAQ)]]>: hier staan de antwoorden op de meeste vragen en belangrijke tips voor het oplossen van problemen]]>.
+ Vraag een vrijwilliger + Telegram veelgestelde vragen (FAQ) https://telegram.org/faq - Delete localization? - Incorrect localization file + Verwijder vertaling? + Ongeldig vertalingsbestand Nog geen media gedeeld @@ -280,7 +280,7 @@ Alle media weergeven Opslaan in galerij - %1$d van %1$d + %1$d van %2$d Galerij @@ -321,7 +321,7 @@ U hebt de groep gemaakt un1 heeft u verwijderd un1 heeft u toegevoegd - Dit bericht wordt niet ondersteund in uw versie van Telegram. + Dit bericht wordt niet ondersteund door uw versie van Telegram. Werk Telegram bij om dit bericht te bekijken: http://telegram.org/update Foto Video Locatie @@ -329,6 +329,8 @@ Document Geluidsbestand U + You took a screenshot! + un1 took a screenshot! Ongeldig telefoonnummer diff --git a/TMessagesProj/src/main/res/values/strings.xml b/TMessagesProj/src/main/res/values/strings.xml index c0bda50b1..365e4f84d 100644 --- a/TMessagesProj/src/main/res/values/strings.xml +++ b/TMessagesProj/src/main/res/values/strings.xml @@ -329,6 +329,8 @@ Document Audio You + You took a screenshot! + un1 took a screenshot! Invalid phone number diff --git a/TMessagesProj/src/main/res/xml/auth.xml b/TMessagesProj/src/main/res/xml/auth.xml index 2d2c8a729..7856d0c83 100644 --- a/TMessagesProj/src/main/res/xml/auth.xml +++ b/TMessagesProj/src/main/res/xml/auth.xml @@ -1,7 +1,7 @@ \ No newline at end of file + android:accountType="org.telegram.account"/> \ No newline at end of file