Attempt to detect screenshots(not perfect now, disabled)

This commit is contained in:
DrKLO 2014-04-04 21:58:33 +04:00
parent cea585cd39
commit 0b01da670a
26 changed files with 509 additions and 61 deletions

View file

@ -1,6 +1,7 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android" <manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="org.telegram.messenger"> package="org.telegram.messenger"
android:installLocation="auto">
<supports-screens android:anyDensity="true" <supports-screens android:anyDensity="true"
android:smallScreens="true" android:smallScreens="true"
@ -45,8 +46,7 @@
android:theme="@style/Theme.TMessages.Start" android:theme="@style/Theme.TMessages.Start"
android:name="org.telegram.ui.ApplicationLoader" android:name="org.telegram.ui.ApplicationLoader"
android:hardwareAccelerated="true" android:hardwareAccelerated="true"
android:largeHeap="true" android:largeHeap="true">
android:installLocation="auto">
<activity <activity
android:name="org.telegram.ui.LaunchActivity" android:name="org.telegram.ui.LaunchActivity"

View file

@ -212,6 +212,7 @@
45;DK;Denmark 45;DK;Denmark
44;GB;United Kingdom 44;GB;United Kingdom
43;AT;Austria 43;AT;Austria
42;YL;Y-land
41;CH;Switzerland 41;CH;Switzerland
40;RO;Romania 40;RO;Romania
39;IT;Italy 39;IT;Italy

View file

@ -149,7 +149,7 @@ public class ContactsController {
public void checkAppAccount() { public void checkAppAccount() {
AccountManager am = AccountManager.get(ApplicationLoader.applicationContext); AccountManager am = AccountManager.get(ApplicationLoader.applicationContext);
Account[] accounts = am.getAccountsByType("org.telegram.messenger.account"); Account[] accounts = am.getAccountsByType("org.telegram.account");
boolean recreateAccount = false; boolean recreateAccount = false;
if (UserConfig.currentUser != null) { if (UserConfig.currentUser != null) {
if (accounts.length == 1) { if (accounts.length == 1) {
@ -173,8 +173,12 @@ public class ContactsController {
am.removeAccount(c, null, null); am.removeAccount(c, null, null);
} }
if (UserConfig.currentUser != null) { if (UserConfig.currentUser != null) {
currentAccount = new Account(UserConfig.currentUser.phone, "org.telegram.messenger.account"); try {
am.addAccountExplicitly(currentAccount, "", null); currentAccount = new Account(UserConfig.currentUser.phone, "org.telegram.account");
am.addAccountExplicitly(currentAccount, "", null);
} catch (Exception e) {
FileLog.e("tmessages", e);
}
} }
} }
} }
@ -376,12 +380,12 @@ public class ContactsController {
if (schedule) { if (schedule) {
try { try {
AccountManager am = AccountManager.get(ApplicationLoader.applicationContext); AccountManager am = AccountManager.get(ApplicationLoader.applicationContext);
Account[] accounts = am.getAccountsByType("org.telegram.messenger.account"); Account[] accounts = am.getAccountsByType("org.telegram.account");
boolean recreateAccount = false; boolean recreateAccount = false;
if (UserConfig.currentUser != null) { if (UserConfig.currentUser != null) {
if (accounts.length != 1) { if (accounts.length != 1) {
FileLog.e("tmessages", "detected account deletion!"); FileLog.e("tmessages", "detected account deletion!");
currentAccount = new Account(UserConfig.currentUser.phone, "org.telegram.messenger.account"); currentAccount = new Account(UserConfig.currentUser.phone, "org.telegram.account");
am.addAccountExplicitly(currentAccount, "", null); am.addAccountExplicitly(currentAccount, "", null);
performWriteContactsToPhoneBookInternal(); performWriteContactsToPhoneBookInternal();
} }

View file

@ -113,8 +113,7 @@ public class FileLoader {
try { try {
Class cl = Class.forName("dalvik.system.VMRuntime"); Class cl = Class.forName("dalvik.system.VMRuntime");
Method getRt = cl.getMethod("getRuntime", new Class[0]); Method getRt = cl.getMethod("getRuntime", new Class[0]);
Object obj = new Object[0]; runtime = getRt.invoke(null, new Object[0]);
runtime = getRt.invoke(null, obj);
trackAllocation = cl.getMethod("trackExternalAllocation", new Class[] {long.class}); trackAllocation = cl.getMethod("trackExternalAllocation", new Class[] {long.class});
trackFree = cl.getMethod("trackExternalFree", new Class[] {long.class}); trackFree = cl.getMethod("trackExternalFree", new Class[] {long.class});
success = true; success = true;

View file

@ -10,6 +10,8 @@ package org.telegram.messenger;
import android.app.ProgressDialog; import android.app.ProgressDialog;
import android.content.Context; import android.content.Context;
import android.database.ContentObserver;
import android.database.Cursor;
import android.media.AudioFormat; import android.media.AudioFormat;
import android.media.AudioManager; import android.media.AudioManager;
import android.media.AudioRecord; import android.media.AudioRecord;
@ -20,6 +22,7 @@ import android.media.audiofx.AutomaticGainControl;
import android.net.Uri; import android.net.Uri;
import android.os.Environment; import android.os.Environment;
import android.os.Vibrator; import android.os.Vibrator;
import android.provider.MediaStore;
import android.view.View; import android.view.View;
import org.telegram.objects.MessageObject; import org.telegram.objects.MessageObject;
@ -80,6 +83,7 @@ public class MediaController implements NotificationCenter.NotificationCenterDel
public final static int recordStarted = 50004; public final static int recordStarted = 50004;
public final static int recordStartError = 50005; public final static int recordStartError = 50005;
public final static int recordStopped = 50006; public final static int recordStopped = 50006;
public final static int screenshotTook = 50007;
private HashMap<String, ArrayList<WeakReference<FileDownloadProgressListener>>> loadingFileObservers = new HashMap<String, ArrayList<WeakReference<FileDownloadProgressListener>>>(); private HashMap<String, ArrayList<WeakReference<FileDownloadProgressListener>>> loadingFileObservers = new HashMap<String, ArrayList<WeakReference<FileDownloadProgressListener>>>();
private HashMap<Integer, String> observersByTag = new HashMap<Integer, String>(); private HashMap<Integer, String> observersByTag = new HashMap<Integer, String>();
@ -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<Long> 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; private static volatile MediaController Instance = null;
public static MediaController getInstance() { public static MediaController getInstance() {
MediaController localInstance = Instance; MediaController localInstance = Instance;
@ -290,6 +360,165 @@ public class MediaController implements NotificationCenter.NotificationCenterDel
currentGifMessageObject = null; 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<Long> screenshotDates = new ArrayList<Long>();
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<Long> 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<Long> visibleMessages) {
lastSecretChatEnterTime = enterTime;
lastSecretChatLeaveTime = leaveTime;
lastSecretChat = encryptedChat;
lastSecretChatVisibleMessages = visibleMessages;
}
public int generateObserverTag() { public int generateObserverTag() {
return lastTag++; return lastTag++;
} }
@ -1159,7 +1388,8 @@ public class MediaController implements NotificationCenter.NotificationCenterDel
if (f.length() > 0) { if (f.length() > 0) {
cacheFile = f; cacheFile = f;
} }
} else { }
if (cacheFile == null) {
cacheFile = new File(Utilities.getCacheDir(), messageObject.getFileName()); cacheFile = new File(Utilities.getCacheDir(), messageObject.getFileName());
} }
try { try {

View file

@ -401,7 +401,7 @@ public class MessagesController implements NotificationCenter.NotificationCenter
public void deleteAllAppAccounts() { public void deleteAllAppAccounts() {
try { try {
AccountManager am = AccountManager.get(ApplicationLoader.applicationContext); 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) { for (Account c : accounts) {
am.removeAccount(c, null, null); am.removeAccount(c, null, null);
} }
@ -1613,6 +1613,9 @@ public class MessagesController implements NotificationCenter.NotificationCenter
} }
private void sendMessagesDeleteMessage(ArrayList<Long> random_ids, TLRPC.EncryptedChat encryptedChat) { private void sendMessagesDeleteMessage(ArrayList<Long> random_ids, TLRPC.EncryptedChat encryptedChat) {
if (!(encryptedChat instanceof TLRPC.TL_encryptedChat)) {
return;
}
TLRPC.TL_decryptedMessageService reqSend = new TLRPC.TL_decryptedMessageService(); TLRPC.TL_decryptedMessageService reqSend = new TLRPC.TL_decryptedMessageService();
reqSend.random_id = getNextRandomId(); reqSend.random_id = getNextRandomId();
reqSend.random_bytes = new byte[Math.max(1, (int)Math.ceil(random.nextDouble() * 16))]; 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 = new TLRPC.TL_decryptedMessageActionDeleteMessages();
reqSend.action.random_ids = random_ids; reqSend.action.random_ids = random_ids;
performSendEncryptedRequest(reqSend, null, encryptedChat, null); performSendEncryptedRequest(reqSend, null, encryptedChat, null);
} }
private void sendClearHistoryMessage(TLRPC.EncryptedChat encryptedChat) { private void sendClearHistoryMessage(TLRPC.EncryptedChat encryptedChat) {
if (!(encryptedChat instanceof TLRPC.TL_encryptedChat)) {
return;
}
TLRPC.TL_decryptedMessageService reqSend = new TLRPC.TL_decryptedMessageService(); TLRPC.TL_decryptedMessageService reqSend = new TLRPC.TL_decryptedMessageService();
reqSend.random_id = getNextRandomId(); reqSend.random_id = getNextRandomId();
reqSend.random_bytes = new byte[Math.max(1, (int)Math.ceil(random.nextDouble() * 16))]; 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) { public void sendTTLMessage(TLRPC.EncryptedChat encryptedChat) {
if (!(encryptedChat instanceof TLRPC.TL_encryptedChat)) {
return;
}
TLRPC.TL_messageService newMsg = new TLRPC.TL_messageService(); TLRPC.TL_messageService newMsg = new TLRPC.TL_messageService();
newMsg.action = new TLRPC.TL_messageActionTTLChange(); newMsg.action = new TLRPC.TL_messageActionTTLChange();
@ -1672,6 +1682,54 @@ public class MessagesController implements NotificationCenter.NotificationCenter
performSendEncryptedRequest(reqSend, newMsgObj, encryptedChat, null); performSendEncryptedRequest(reqSend, newMsgObj, encryptedChat, null);
} }
public void sendScreenshotMessage(TLRPC.EncryptedChat encryptedChat, ArrayList<Long> 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<MessageObject> objArr = new ArrayList<MessageObject>();
objArr.add(newMsgObj);
ArrayList<TLRPC.Message> arr = new ArrayList<TLRPC.Message>();
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) { 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; TLRPC.Message newMsg = null;
int type = -1; int type = -1;
@ -4542,6 +4600,7 @@ public class MessagesController implements NotificationCenter.NotificationCenter
notification.ledOnMS = 1000; notification.ledOnMS = 1000;
notification.ledOffMS = 1000; notification.ledOffMS = 1000;
notification.flags |= Notification.FLAG_SHOW_LIGHTS; notification.flags |= Notification.FLAG_SHOW_LIGHTS;
notification.defaults = 0;
try { try {
mNotificationManager.notify(1, notification); mNotificationManager.notify(1, notification);
if (preferences.getBoolean("EnablePebbleNotifications", false)) { if (preferences.getBoolean("EnablePebbleNotifications", false)) {
@ -4827,10 +4886,17 @@ public class MessagesController implements NotificationCenter.NotificationCenter
return newMessage; return newMessage;
} else if (object instanceof TLRPC.TL_decryptedMessageService) { } else if (object instanceof TLRPC.TL_decryptedMessageService) {
TLRPC.TL_decryptedMessageService serviceMessage = (TLRPC.TL_decryptedMessageService)object; 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(); TLRPC.TL_messageService newMessage = new TLRPC.TL_messageService();
newMessage.action = new TLRPC.TL_messageActionTTLChange(); if (serviceMessage.action instanceof TLRPC.TL_decryptedMessageActionSetMessageTTL) {
newMessage.action.ttl = chat.ttl = serviceMessage.action.ttl_seconds; 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(); newMessage.local_id = newMessage.id = UserConfig.getNewMessageId();
UserConfig.saveConfig(false); UserConfig.saveConfig(false);
newMessage.unread = true; newMessage.unread = true;

View file

@ -410,6 +410,8 @@ public class TLClassStore {
classStore.put(TLRPC.TL_help_getSupport.constructor, TLRPC.TL_help_getSupport.class); 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_decryptedMessageActionDeleteMessages.constructor, TLRPC.TL_decryptedMessageActionDeleteMessages.class);
classStore.put(TLRPC.TL_decryptedMessageActionFlushHistory.constructor, TLRPC.TL_decryptedMessageActionFlushHistory.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_msg_container.constructor, TLRPC.TL_msg_container.class);
classStore.put(TLRPC.TL_fileEncryptedLocation.constructor, TLRPC.TL_fileEncryptedLocation.class); classStore.put(TLRPC.TL_fileEncryptedLocation.constructor, TLRPC.TL_fileEncryptedLocation.class);

View file

@ -8818,6 +8818,7 @@ public class TLRPC {
public ArrayList<Integer> users = new ArrayList<Integer>(); public ArrayList<Integer> users = new ArrayList<Integer>();
public String address; public String address;
public int ttl; public int ttl;
public DecryptedMessageAction encryptedAction;
} }
public static class TL_messageActionTTLChange extends MessageAction { 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 class TL_upload_saveBigFilePart extends TLObject {
public static int constructor = 0xde7b673d; public static int constructor = 0xde7b673d;

View file

@ -217,6 +217,18 @@ public class MessageObject {
} else { } else {
messageText = LocaleController.formatString("NotificationContactNewPhoto", R.string.NotificationContactNewPhoto, ""); 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)) { } else if (message.media != null && !(message.media instanceof TLRPC.TL_messageMediaEmpty)) {

View file

@ -411,7 +411,8 @@ public class ChatMediaCell extends ChatBaseCell implements MediaController.FileD
fileName = currentMessageObject.messageOwner.attachPath; fileName = currentMessageObject.messageOwner.attachPath;
cacheFile = f; cacheFile = f;
} }
} else { }
if (fileName == null) {
fileName = currentMessageObject.getFileName(); fileName = currentMessageObject.getFileName();
cacheFile = new File(Utilities.getCacheDir(), fileName); cacheFile = new File(Utilities.getCacheDir(), fileName);
} }

View file

@ -196,6 +196,9 @@ public class ChatActivity extends BaseFragment implements SizeNotifierRelativeLa
private CharSequence lastPrintString; private CharSequence lastPrintString;
private long chatEnterTime = 0;
private long chatLeaveTime = 0;
private final static int copy = 1; private final static int copy = 1;
private final static int forward = 2; private final static int forward = 2;
private final static int delete = 3; private final static int delete = 3;
@ -268,7 +271,7 @@ public class ChatActivity extends BaseFragment implements SizeNotifierRelativeLa
random_ids = new ArrayList<Long>(); random_ids = new ArrayList<Long>();
for (HashMap.Entry<Integer, MessageObject> entry : selectedMessagesIds.entrySet()) { for (HashMap.Entry<Integer, MessageObject> entry : selectedMessagesIds.entrySet()) {
MessageObject msg = entry.getValue(); 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); random_ids.add(msg.messageOwner.random_id);
} }
} }
@ -401,6 +404,7 @@ public class ChatActivity extends BaseFragment implements SizeNotifierRelativeLa
dialog_id = ((long)encId) << 32; dialog_id = ((long)encId) << 32;
maxMessageId = Integer.MIN_VALUE; maxMessageId = Integer.MIN_VALUE;
minMessageId = Integer.MAX_VALUE; minMessageId = Integer.MAX_VALUE;
MediaController.getInstance().startMediaObserver();
} else { } else {
return false; return false;
} }
@ -429,6 +433,7 @@ public class ChatActivity extends BaseFragment implements SizeNotifierRelativeLa
NotificationCenter.getInstance().addObserver(this, MediaController.recordStarted); NotificationCenter.getInstance().addObserver(this, MediaController.recordStarted);
NotificationCenter.getInstance().addObserver(this, MediaController.recordStartError); NotificationCenter.getInstance().addObserver(this, MediaController.recordStartError);
NotificationCenter.getInstance().addObserver(this, MediaController.recordStopped); NotificationCenter.getInstance().addObserver(this, MediaController.recordStopped);
NotificationCenter.getInstance().addObserver(this, MediaController.screenshotTook);
NotificationCenter.getInstance().addObserver(this, 997); NotificationCenter.getInstance().addObserver(this, 997);
loading = true; loading = true;
@ -478,7 +483,11 @@ public class ChatActivity extends BaseFragment implements SizeNotifierRelativeLa
NotificationCenter.getInstance().removeObserver(this, MediaController.recordStarted); NotificationCenter.getInstance().removeObserver(this, MediaController.recordStarted);
NotificationCenter.getInstance().removeObserver(this, MediaController.recordStartError); NotificationCenter.getInstance().removeObserver(this, MediaController.recordStartError);
NotificationCenter.getInstance().removeObserver(this, MediaController.recordStopped); NotificationCenter.getInstance().removeObserver(this, MediaController.recordStopped);
NotificationCenter.getInstance().removeObserver(this, MediaController.screenshotTook);
NotificationCenter.getInstance().removeObserver(this, 997); NotificationCenter.getInstance().removeObserver(this, 997);
if (currentEncryptedChat != null) {
MediaController.getInstance().stopMediaObserver();
}
if (sizeNotifierRelativeLayout != null) { if (sizeNotifierRelativeLayout != null) {
sizeNotifierRelativeLayout.delegate = null; sizeNotifierRelativeLayout.delegate = null;
sizeNotifierRelativeLayout = null; sizeNotifierRelativeLayout = null;
@ -1263,7 +1272,7 @@ public class ChatActivity extends BaseFragment implements SizeNotifierRelativeLa
if (canSave) { if (canSave) {
if (messageObject.messageOwner.media instanceof TLRPC.TL_messageMediaDocument) { if (messageObject.messageOwner.media instanceof TLRPC.TL_messageMediaDocument) {
String mime = messageObject.messageOwner.media.document.mime_type; String mime = messageObject.messageOwner.media.document.mime_type;
if (mime != null && mime.equals("text/xml")) { if (mime != null && mime.endsWith("/xml")) {
return 5; return 5;
} }
} }
@ -1307,7 +1316,7 @@ public class ChatActivity extends BaseFragment implements SizeNotifierRelativeLa
if (canSave) { if (canSave) {
if (messageObject.messageOwner.media instanceof TLRPC.TL_messageMediaDocument) { if (messageObject.messageOwner.media instanceof TLRPC.TL_messageMediaDocument) {
String mime = messageObject.messageOwner.media.document.mime_type; String mime = messageObject.messageOwner.media.document.mime_type;
if (mime != null && mime.equals("text/xml")) { if (mime != null && mime.endsWith("text/xml")) {
return 5; return 5;
} }
} }
@ -2404,6 +2413,8 @@ public class ChatActivity extends BaseFragment implements SizeNotifierRelativeLa
recordingAudio = true; recordingAudio = true;
updateAudioRecordIntefrace(); updateAudioRecordIntefrace();
} }
} else if (id == MediaController.screenshotTook) {
updateInformationForScreenshotDetector();
} }
} }
@ -2635,10 +2646,10 @@ public class ChatActivity extends BaseFragment implements SizeNotifierRelativeLa
} }
}, 400); }, 400);
} }
if (currentEncryptedChat != null) {
// if (currentEncryptedChat != null && parentActivity != null) { chatEnterTime = System.currentTimeMillis();
// parentActivity.getWindow().addFlags(WindowManager.LayoutParams.FLAG_SECURE); chatLeaveTime = 0;
// } }
} }
private void setTypingAnimation(boolean start) { private void setTypingAnimation(boolean start) {
@ -2686,9 +2697,35 @@ public class ChatActivity extends BaseFragment implements SizeNotifierRelativeLa
editor.commit(); editor.commit();
} }
// if (currentEncryptedChat != null && parentActivity != null) { if (currentEncryptedChat != null) {
// parentActivity.getWindow().clearFlags(WindowManager.LayoutParams.FLAG_SECURE); chatLeaveTime = System.currentTimeMillis();
// } updateInformationForScreenshotDetector();
}
}
private void updateInformationForScreenshotDetector() {
ArrayList<Long> visibleMessages = new ArrayList<Long>();
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() { private void fixLayout() {
@ -3155,7 +3192,7 @@ public class ChatActivity extends BaseFragment implements SizeNotifierRelativeLa
ArrayList<Integer> arr = new ArrayList<Integer>(); ArrayList<Integer> arr = new ArrayList<Integer>();
arr.add(selectedObject.messageOwner.id); arr.add(selectedObject.messageOwner.id);
ArrayList<Long> random_ids = null; ArrayList<Long> 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<Long>(); random_ids = new ArrayList<Long>();
random_ids.add(selectedObject.messageOwner.random_id); random_ids.add(selectedObject.messageOwner.random_id);
} }
@ -3168,7 +3205,7 @@ public class ChatActivity extends BaseFragment implements SizeNotifierRelativeLa
ids.add(selectedObject.messageOwner.id); ids.add(selectedObject.messageOwner.id);
removeUnreadPlane(true); removeUnreadPlane(true);
ArrayList<Long> random_ids = null; ArrayList<Long> 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<Long>(); random_ids = new ArrayList<Long>();
random_ids.add(selectedObject.messageOwner.random_id); random_ids.add(selectedObject.messageOwner.random_id);
} }

View file

@ -380,6 +380,14 @@ public class ContactsActivity extends BaseFragment implements NotificationCenter
((LaunchActivity)parentActivity).updateActionBar(); ((LaunchActivity)parentActivity).updateActionBar();
} }
@Override
public void onPause() {
super.onPause();
if (searchItem != null && searchItem.isActionViewExpanded()) {
searchItem.collapseActionView();
}
}
@Override @Override
public boolean onOptionsItemSelected(MenuItem item) { public boolean onOptionsItemSelected(MenuItem item) {
int itemId = item.getItemId(); int itemId = item.getItemId();

View file

@ -172,6 +172,14 @@ public class CountrySelectActivity extends ActionBarActivity {
applySelfActionBar(); applySelfActionBar();
} }
@Override
public void onPause() {
super.onPause();
if (searchItem != null && searchItem.isActionViewExpanded()) {
searchItem.collapseActionView();
}
}
@Override @Override
public boolean onOptionsItemSelected(MenuItem item) { public boolean onOptionsItemSelected(MenuItem item) {
int itemId = item.getItemId(); int itemId = item.getItemId();

View file

@ -233,6 +233,14 @@ public class LanguageSelectActivity extends BaseFragment {
((LaunchActivity)parentActivity).updateActionBar(); ((LaunchActivity)parentActivity).updateActionBar();
} }
@Override
public void onPause() {
super.onPause();
if (searchItem != null && searchItem.isActionViewExpanded()) {
searchItem.collapseActionView();
}
}
@Override @Override
public boolean onOptionsItemSelected(MenuItem item) { public boolean onOptionsItemSelected(MenuItem item) {
int itemId = item.getItemId(); int itemId = item.getItemId();

View file

@ -322,7 +322,7 @@ public class LoginActivityPhoneView extends SlideView implements AdapterView.OnI
delegate.needShowAlert(LocaleController.getString("WrongCountry", R.string.WrongCountry)); delegate.needShowAlert(LocaleController.getString("WrongCountry", R.string.WrongCountry));
return; return;
} }
if (codeField.length() == 0 || phoneField.length() == 0) { if (codeField.length() == 0) {
delegate.needShowAlert(LocaleController.getString("InvalidPhoneNumber", R.string.InvalidPhoneNumber)); delegate.needShowAlert(LocaleController.getString("InvalidPhoneNumber", R.string.InvalidPhoneNumber));
return; return;
} }

View file

@ -37,7 +37,6 @@ import org.telegram.messenger.R;
import org.telegram.ui.Views.BackupImageView; import org.telegram.ui.Views.BackupImageView;
import org.telegram.ui.Views.BaseFragment; import org.telegram.ui.Views.BaseFragment;
import org.telegram.ui.Views.OnSwipeTouchListener; import org.telegram.ui.Views.OnSwipeTouchListener;
import org.w3c.dom.Text;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.HashMap; import java.util.HashMap;

View file

@ -361,10 +361,19 @@ public class MessagesActivity extends BaseFragment implements NotificationCenter
if (messagesListViewAdapter != null) { if (messagesListViewAdapter != null) {
messagesListViewAdapter.notifyDataSetChanged(); messagesListViewAdapter.notifyDataSetChanged();
} }
((LaunchActivity)parentActivity).showActionBar(); ((LaunchActivity)parentActivity).showActionBar();
((LaunchActivity)parentActivity).updateActionBar(); ((LaunchActivity)parentActivity).updateActionBar();
} }
@Override
public void onPause() {
super.onPause();
if (searchItem != null && searchItem.isActionViewExpanded()) {
searchItem.collapseActionView();
}
}
@Override @Override
@SuppressWarnings("unchecked") @SuppressWarnings("unchecked")
public void didReceivedNotification(int id, Object... args) { public void didReceivedNotification(int id, Object... args) {
@ -541,6 +550,9 @@ public class MessagesActivity extends BaseFragment implements NotificationCenter
@Override @Override
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) { 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 = (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.setShowAsAction(SupportMenuItem.SHOW_AS_ACTION_ALWAYS|SupportMenuItem.SHOW_AS_ACTION_COLLAPSE_ACTION_VIEW);
searchItem.setActionView(searchView = new SearchView(parentActivity)); searchItem.setActionView(searchView = new SearchView(parentActivity));

View file

@ -533,7 +533,9 @@ public class SettingsWallpapersActivity extends BaseFragment implements Notifica
View selection = view.findViewById(R.id.selection); View selection = view.findViewById(R.id.selection);
TLRPC.WallPaper wallPaper = wallPapers.get(i - 1); TLRPC.WallPaper wallPaper = wallPapers.get(i - 1);
TLRPC.PhotoSize size = PhotoObject.getClosestPhotoSizeWithSize(wallPaper.sizes, Utilities.dp(100), Utilities.dp(100)); 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) { if (wallPaper.id == selectedBackground) {
selection.setVisibility(View.VISIBLE); selection.setVisibility(View.VISIBLE);
} else { } else {

View file

@ -329,6 +329,8 @@
<string name="AttachDocument">مستند</string> <string name="AttachDocument">مستند</string>
<string name="AttachAudio">مقطع صوتي</string> <string name="AttachAudio">مقطع صوتي</string>
<string name="FromYou">أنت</string> <string name="FromYou">أنت</string>
<string name="ActionTakeScreenshootYou">You took a screenshot!</string>
<string name="ActionTakeScreenshoot">un1 took a screenshot!</string>
<!--Alert messages--> <!--Alert messages-->
<string name="InvalidPhoneNumber">رقم الهاتف غير صحيح</string> <string name="InvalidPhoneNumber">رقم الهاتف غير صحيح</string>

View file

@ -224,7 +224,7 @@
<string name="NoBlocked">Keine blockierten Benutzer</string> <string name="NoBlocked">Keine blockierten Benutzer</string>
<string name="YourPhoneNumber">DEINE TELEFONNUMMER</string> <string name="YourPhoneNumber">DEINE TELEFONNUMMER</string>
<string name="MessageNotifications">NACHRICHTEN</string> <string name="MessageNotifications">NACHRICHTEN</string>
<string name="Alert">Nachrichtenton</string> <string name="Alert">Benachrichtigung</string>
<string name="MessagePreview">Nachrichtenvorschau</string> <string name="MessagePreview">Nachrichtenvorschau</string>
<string name="GroupNotifications">GRUPPEN</string> <string name="GroupNotifications">GRUPPEN</string>
<string name="Sound">Nachrichtenton auswählen</string> <string name="Sound">Nachrichtenton auswählen</string>
@ -256,12 +256,12 @@
<string name="ContactJoined">Kontakt ist Telegram beigetreten</string> <string name="ContactJoined">Kontakt ist Telegram beigetreten</string>
<string name="Pebble">PEBBLE</string> <string name="Pebble">PEBBLE</string>
<string name="Language">Sprache</string> <string name="Language">Sprache</string>
<string name="AskAQuestionInfo">Please note that Telegram Support is done by volunteers. We try to respond as quickly as possible, but it may take a while.<![CDATA[<br><br>]]>Please take a look at the <![CDATA[<a href="http://telegram.org/faq#general">Telegram FAQ</a>]]>: it has important <![CDATA[<a href="http://telegram.org/faq#troubleshooting">troubleshooting tips</a>]]> and answers to most questions.</string> <string name="AskAQuestionInfo">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.<![CDATA[<br><br>]]>Bitte schau in den <![CDATA[<a href="http://telegram.org/faq#general">Telegram FAQ</a>]]>: nach. Dort findest du Antworten auf die meisten Fragen und wichtige Tipps zur <![CDATA[<a href="http://telegram.org/faq#troubleshooting">Problemlösung</a>]]>.</string>
<string name="AskButton">Ask a volunteer</string> <string name="AskButton">Frage einen Freiwilligen</string>
<string name="TelegramFaq">Telegram-FAQ</string> <string name="TelegramFaq">Telegram-FAQ</string>
<string name="TelegramFaqUrl">https://telegram.org/faq</string> <string name="TelegramFaqUrl">https://telegram.org/faq</string>
<string name="DeleteLocalization">Lokalisierung löschen?</string> <string name="DeleteLocalization">Lokalisierung löschen?</string>
<string name="IncorrectLocalization">Incorrect localization file</string> <string name="IncorrectLocalization">Falsche Sprachdatei</string>
<!--media view--> <!--media view-->
<string name="NoMedia">Noch keine geteilten Medien vorhanden</string> <string name="NoMedia">Noch keine geteilten Medien vorhanden</string>
@ -321,7 +321,7 @@
<string name="ActionYouCreateGroup">Du hast die Gruppe erstellt</string> <string name="ActionYouCreateGroup">Du hast die Gruppe erstellt</string>
<string name="ActionKickUserYou">un1 hat dich aus der Gruppe entfernt</string> <string name="ActionKickUserYou">un1 hat dich aus der Gruppe entfernt</string>
<string name="ActionAddUserYou">un1 hat dich hinzugefügt</string> <string name="ActionAddUserYou">un1 hat dich hinzugefügt</string>
<string name="UnsuppotedMedia">Diese Nachricht wird von deiner Telegram-Version nicht unterstützt.</string> <string name="UnsuppotedMedia">Diese Nachricht wird auf deiner Version von Telegram nicht unterstützt. Bitte aktualisiere die App um sie zu sehen: http://telegram.org/update</string>
<string name="AttachPhoto">Foto</string> <string name="AttachPhoto">Foto</string>
<string name="AttachVideo">Video</string> <string name="AttachVideo">Video</string>
<string name="AttachLocation">Standort</string> <string name="AttachLocation">Standort</string>
@ -329,6 +329,8 @@
<string name="AttachDocument">Dokument</string> <string name="AttachDocument">Dokument</string>
<string name="AttachAudio">Audio</string> <string name="AttachAudio">Audio</string>
<string name="FromYou">Du</string> <string name="FromYou">Du</string>
<string name="ActionTakeScreenshootYou">You took a screenshot!</string>
<string name="ActionTakeScreenshoot">un1 took a screenshot!</string>
<!--Alert messages--> <!--Alert messages-->
<string name="InvalidPhoneNumber">Ungültige Telefonnummer</string> <string name="InvalidPhoneNumber">Ungültige Telefonnummer</string>
@ -356,12 +358,12 @@
<string name="Page6Title">Cloud-Basiert</string> <string name="Page6Title">Cloud-Basiert</string>
<string name="Page7Title">Vertraulich</string> <string name="Page7Title">Vertraulich</string>
<string name="Page1Message">Willkommen im Zeitalter der sicheren und schnellen Kommunikation.</string> <string name="Page1Message">Willkommen im Zeitalter der sicheren und schnellen Kommunikation.</string>
<string name="Page2Message"><![CDATA[<b>Telegram</b>]]> stellt Nachrichten schneller<![CDATA[<br/>]]>zu als andere Anwendungen</string> <string name="Page2Message"><![CDATA[<b>Telegram</b>]]> stellt Nachrichten schneller zu als andere Anwendungen</string>
<string name="Page3Message"><![CDATA[<b>Telegram</b>]]> ist für immer kostenlos.<![CDATA[<br/>]]>Keine Werbung. Keine wiederkehrenden Kosten.</string> <string name="Page3Message"><![CDATA[<b>Telegram</b>]]> ist für immer kostenlos. Keine Werbung. Keine wiederkehrenden Kosten.</string>
<string name="Page4Message"><![CDATA[<b>Telegram</b>]]> schützt deine Nachrichten<![CDATA[<br/>]]>vor Hacker-Angriffen</string> <string name="Page4Message"><![CDATA[<b>Telegram</b>]]> schützt deine Nachrichten vor Hacker-Angriffen</string>
<string name="Page5Message"><![CDATA[<b>Telegram</b>]]> hat keine Grenzen in Sachen<![CDATA[<br/>]]>Größe deiner Chats und Medien</string> <string name="Page5Message"><![CDATA[<b>Telegram</b>]]> hat keine Grenzen in Sachen Größe deiner Chats und Medien</string>
<string name="Page6Message"><![CDATA[<b>Telegram</b>]]> lässt sich von verschiedenen<![CDATA[<br/>]]>Geräten gleichzeitig nutzen</string> <string name="Page6Message"><![CDATA[<b>Telegram</b>]]> lässt sich von verschiedenen Geräten gleichzeitig nutzen</string>
<string name="Page7Message"><![CDATA[<b>Telegram</b>]]>-Nachrichten sind stark<![CDATA[<br/>]]>verschlüsselt und können sich selbst zerstören</string> <string name="Page7Message"><![CDATA[<b>Telegram</b>]]>-Nachrichten sind stark verschlüsselt und können sich selbst zerstören</string>
<string name="StartMessaging">Jetzt beginnen</string> <string name="StartMessaging">Jetzt beginnen</string>
<!--Don't change this! Not for localization!--> <!--Don't change this! Not for localization!-->

View file

@ -329,6 +329,8 @@
<string name="AttachDocument">Archivo</string> <string name="AttachDocument">Archivo</string>
<string name="AttachAudio">Audio</string> <string name="AttachAudio">Audio</string>
<string name="FromYou"></string> <string name="FromYou"></string>
<string name="ActionTakeScreenshootYou">You took a screenshot!</string>
<string name="ActionTakeScreenshoot">un1 took a screenshot!</string>
<!--Alert messages--> <!--Alert messages-->
<string name="InvalidPhoneNumber">Número de teléfono inválido</string> <string name="InvalidPhoneNumber">Número de teléfono inválido</string>

View file

@ -321,7 +321,7 @@
<string name="ActionYouCreateGroup">Hai creato il gruppo</string> <string name="ActionYouCreateGroup">Hai creato il gruppo</string>
<string name="ActionKickUserYou">un1 ti ha rimosso</string> <string name="ActionKickUserYou">un1 ti ha rimosso</string>
<string name="ActionAddUserYou">un1 ti ha aggiunto</string> <string name="ActionAddUserYou">un1 ti ha aggiunto</string>
<string name="UnsuppotedMedia">Questo messaggio non è supportato dalla tua versione di Telegram.</string> <string name="UnsuppotedMedia">Questo messaggio non è supportato sulla tua versione di Telegram. Aggiorna l\'applicazione per\nvisualizzarlo: http://telegram.org/update</string>
<string name="AttachPhoto">Foto</string> <string name="AttachPhoto">Foto</string>
<string name="AttachVideo">Video</string> <string name="AttachVideo">Video</string>
<string name="AttachLocation">Posizione</string> <string name="AttachLocation">Posizione</string>
@ -329,6 +329,8 @@
<string name="AttachDocument">Documento</string> <string name="AttachDocument">Documento</string>
<string name="AttachAudio">Audio</string> <string name="AttachAudio">Audio</string>
<string name="FromYou">Tu</string> <string name="FromYou">Tu</string>
<string name="ActionTakeScreenshootYou">You took a screenshot!</string>
<string name="ActionTakeScreenshoot">un1 took a screenshot!</string>
<!--Alert messages--> <!--Alert messages-->
<string name="InvalidPhoneNumber">Numero di telefono non valido</string> <string name="InvalidPhoneNumber">Numero di telefono non valido</string>
@ -358,7 +360,7 @@
<string name="Page1Message">Benvenuto nell\'era della messaggistica veloce e sicura</string> <string name="Page1Message">Benvenuto nell\'era della messaggistica veloce e sicura</string>
<string name="Page2Message"><![CDATA[<b>Telegram</b>]]> consegna i messaggi più velocemente di qualsiasi altra applicazione</string> <string name="Page2Message"><![CDATA[<b>Telegram</b>]]> consegna i messaggi più velocemente di qualsiasi altra applicazione</string>
<string name="Page3Message"><![CDATA[<b>Telegram</b>]]> è gratuita per sempre. Nessuna pubblicità. Nessun costo di abbonamento</string> <string name="Page3Message"><![CDATA[<b>Telegram</b>]]> è gratuita per sempre. Nessuna pubblicità. Nessun costo di abbonamento</string>
<string name="Page4Message"><![CDATA[<b>Telegram</b>]]> tiene al sicuro i tuoi messaggi dagli attacchi dei hacker</string> <string name="Page4Message"><![CDATA[<b>Telegram</b>]]> tiene al sicuro i tuoi messaggi dagli attacchi degli hacker</string>
<string name="Page5Message"><![CDATA[<b>Telegram</b>]]> non ha limiti sulle dimensioni dei tuoi file multimediali e delle chat</string> <string name="Page5Message"><![CDATA[<b>Telegram</b>]]> non ha limiti sulle dimensioni dei tuoi file multimediali e delle chat</string>
<string name="Page6Message"><![CDATA[<b>Telegram</b>]]> ti consente di accedere ai messaggi da più dispositivi</string> <string name="Page6Message"><![CDATA[<b>Telegram</b>]]> ti consente di accedere ai messaggi da più dispositivi</string>
<string name="Page7Message"><![CDATA[<b>Telegram</b>]]> cifra in maniera sicura i messaggi e può far sì che si autodistruggano</string> <string name="Page7Message"><![CDATA[<b>Telegram</b>]]> cifra in maniera sicura i messaggi e può far sì che si autodistruggano</string>

View file

@ -110,7 +110,7 @@
<string name="YouLeft">U hebt deze groep verlaten</string> <string name="YouLeft">U hebt deze groep verlaten</string>
<string name="DeleteThisGroup">Deze groep verwijderen</string> <string name="DeleteThisGroup">Deze groep verwijderen</string>
<string name="SlideToCancel">SLEEP OM TE ANNULEREN</string> <string name="SlideToCancel">SLEEP OM TE ANNULEREN</string>
<string name="SaveToDownloads">Opslaan in downloads</string> <string name="SaveToDownloads">Opslaan in Downloads</string>
<string name="ApplyLocalizationFile">Vertaling toepassen</string> <string name="ApplyLocalizationFile">Vertaling toepassen</string>
<!--notification--> <!--notification-->
@ -256,12 +256,12 @@
<string name="ContactJoined">Contact lid geworden van Telegram</string> <string name="ContactJoined">Contact lid geworden van Telegram</string>
<string name="Pebble">PEBBLE</string> <string name="Pebble">PEBBLE</string>
<string name="Language">Taal</string> <string name="Language">Taal</string>
<string name="AskAQuestionInfo">Please note that Telegram Support is done by volunteers. We try to respond as quickly as possible, but it may take a while.<![CDATA[<br><br>]]>Please take a look at the <![CDATA[<a href="http://telegram.org/faq#general">Telegram FAQ</a>]]>: it has important <![CDATA[<a href="http://telegram.org/faq#troubleshooting">troubleshooting tips</a>]]> and answers to most questions.</string> <string name="AskAQuestionInfo">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.<![CDATA[<br><br>]]>Bekijk ook de <![CDATA[<a href="http://telegram.org/faq#general">veelgestelde vragen (FAQ)</a>]]>: hier staan de antwoorden op de meeste vragen en belangrijke tips voor <![CDATA[<a href="http://telegram.org/faq#troubleshooting">het oplossen van problemen</a>]]>.</string>
<string name="AskButton">Ask a volunteer</string> <string name="AskButton">Vraag een vrijwilliger</string>
<string name="TelegramFaq">Telegram FAQ</string> <string name="TelegramFaq">Telegram veelgestelde vragen (FAQ)</string>
<string name="TelegramFaqUrl">https://telegram.org/faq</string> <string name="TelegramFaqUrl">https://telegram.org/faq</string>
<string name="DeleteLocalization">Delete localization?</string> <string name="DeleteLocalization">Verwijder vertaling?</string>
<string name="IncorrectLocalization">Incorrect localization file</string> <string name="IncorrectLocalization">Ongeldig vertalingsbestand</string>
<!--media view--> <!--media view-->
<string name="NoMedia">Nog geen media gedeeld</string> <string name="NoMedia">Nog geen media gedeeld</string>
@ -280,7 +280,7 @@
<!--photo gallery view--> <!--photo gallery view-->
<string name="ShowAllMedia">Alle media weergeven</string> <string name="ShowAllMedia">Alle media weergeven</string>
<string name="SaveToGallery">Opslaan in galerij</string> <string name="SaveToGallery">Opslaan in galerij</string>
<string name="Of">%1$d van %1$d</string> <string name="Of">%1$d van %2$d</string>
<string name="Gallery">Galerij</string> <string name="Gallery">Galerij</string>
<!--button titles--> <!--button titles-->
@ -321,7 +321,7 @@
<string name="ActionYouCreateGroup">U hebt de groep gemaakt</string> <string name="ActionYouCreateGroup">U hebt de groep gemaakt</string>
<string name="ActionKickUserYou">un1 heeft u verwijderd</string> <string name="ActionKickUserYou">un1 heeft u verwijderd</string>
<string name="ActionAddUserYou">un1 heeft u toegevoegd</string> <string name="ActionAddUserYou">un1 heeft u toegevoegd</string>
<string name="UnsuppotedMedia">Dit bericht wordt niet ondersteund in uw versie van Telegram.</string> <string name="UnsuppotedMedia">Dit bericht wordt niet ondersteund door uw versie van Telegram. Werk Telegram bij om dit bericht te bekijken: http://telegram.org/update</string>
<string name="AttachPhoto">Foto</string> <string name="AttachPhoto">Foto</string>
<string name="AttachVideo">Video</string> <string name="AttachVideo">Video</string>
<string name="AttachLocation">Locatie</string> <string name="AttachLocation">Locatie</string>
@ -329,6 +329,8 @@
<string name="AttachDocument">Document</string> <string name="AttachDocument">Document</string>
<string name="AttachAudio">Geluidsbestand</string> <string name="AttachAudio">Geluidsbestand</string>
<string name="FromYou">U</string> <string name="FromYou">U</string>
<string name="ActionTakeScreenshootYou">You took a screenshot!</string>
<string name="ActionTakeScreenshoot">un1 took a screenshot!</string>
<!--Alert messages--> <!--Alert messages-->
<string name="InvalidPhoneNumber">Ongeldig telefoonnummer</string> <string name="InvalidPhoneNumber">Ongeldig telefoonnummer</string>

View file

@ -329,6 +329,8 @@
<string name="AttachDocument">Document</string> <string name="AttachDocument">Document</string>
<string name="AttachAudio">Audio</string> <string name="AttachAudio">Audio</string>
<string name="FromYou">You</string> <string name="FromYou">You</string>
<string name="ActionTakeScreenshootYou">You took a screenshot!</string>
<string name="ActionTakeScreenshoot">un1 took a screenshot!</string>
<!--Alert messages--> <!--Alert messages-->
<string name="InvalidPhoneNumber">Invalid phone number</string> <string name="InvalidPhoneNumber">Invalid phone number</string>

View file

@ -1,7 +1,7 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<account-authenticator xmlns:android="http://schemas.android.com/apk/res/android" <account-authenticator xmlns:android="http://schemas.android.com/apk/res/android"
android:accountType="org.telegram.messenger.account" android:accountType="org.telegram.account"
android:icon="@drawable/ic_launcher" android:icon="@drawable/ic_launcher"
android:smallIcon="@drawable/ic_launcher" android:smallIcon="@drawable/ic_launcher"
android:label="@string/AppName" android:label="@string/AppName"

View file

@ -1,3 +1,3 @@
<sync-adapter xmlns:android="http://schemas.android.com/apk/res/android" <sync-adapter xmlns:android="http://schemas.android.com/apk/res/android"
android:contentAuthority="com.android.contacts" android:contentAuthority="com.android.contacts"
android:accountType="org.telegram.messenger.account"/> android:accountType="org.telegram.account"/>