From 0f4b89015308ca85c5304dd6e16c0c4b4c3cad3f Mon Sep 17 00:00:00 2001 From: DrKLO Date: Fri, 27 Feb 2015 22:57:58 +0300 Subject: [PATCH] Update to 2.5.2 --- TMessagesProj/build.gradle | 4 +- .../config/debug/AndroidManifest.xml | 2 +- TMessagesProj/config/foss/AndroidManifest.xml | 2 +- .../config/release/AndroidManifest.xml | 2 +- TMessagesProj/src/main/AndroidManifest.xml | 4 +- .../main/java/jawnae/pyronet/ByteStream.java | 2 +- .../org/telegram/PhoneFormat/PhoneFormat.java | 40 +- .../telegram/android/AndroidUtilities.java | 14 + .../org/telegram/android/ImageLoader.java | 9 +- .../telegram/android/LocaleController.java | 13 +- .../org/telegram/android/MediaController.java | 4 +- .../telegram/android/MessagesController.java | 65 +++ .../android/NotificationsController.java | 2 +- .../messenger/ConnectionsManager.java | 14 +- .../messenger/FileUploadOperation.java | 8 + .../telegram/messenger/HandshakeAction.java | 38 +- .../telegram/messenger/SerializedData.java | 35 ++ .../org/telegram/messenger/TLClassStore.java | 2 + .../java/org/telegram/messenger/TLRPC.java | 78 +++- .../org/telegram/messenger/UserConfig.java | 3 + .../org/telegram/messenger/Utilities.java | 82 +++- .../telegram/ui/ActionBar/BaseFragment.java | 2 +- .../org/telegram/ui/ChangePhoneActivity.java | 1 + .../java/org/telegram/ui/ChatActivity.java | 31 +- .../ui/Components/AvatarDrawable.java | 4 +- .../ui/Components/ChatActivityEnterView.java | 53 ++- .../PhotoFilterLinearBlurControl.java | 417 ++++++++++++++++++ .../PhotoFilterRadialBlurControl.java | 12 + .../ui/Components/PhotoFilterView.java | 15 +- .../org/telegram/ui/ContactsActivity.java | 6 + .../java/org/telegram/ui/LaunchActivity.java | 12 + .../java/org/telegram/ui/LoginActivity.java | 14 + .../java/org/telegram/ui/MediaActivity.java | 2 +- .../ui/NotificationsSettingsActivity.java | 2 +- .../java/org/telegram/ui/PhotoViewer.java | 10 +- .../ui/PopupNotificationActivity.java | 2 +- .../java/org/telegram/ui/ProfileActivity.java | 12 +- .../ui/ProfileNotificationsActivity.java | 10 +- .../org/telegram/ui/SettingsActivity.java | 2 + .../org/telegram/ui/WallpapersActivity.java | 11 +- .../src/main/res/values-ar/strings.xml | 22 +- .../src/main/res/values-de/strings.xml | 2 + .../src/main/res/values-es/strings.xml | 2 + .../src/main/res/values-it/strings.xml | 2 + .../src/main/res/values-ko/strings.xml | 2 + .../src/main/res/values-nl/strings.xml | 2 + .../src/main/res/values-pt-rBR/strings.xml | 2 + .../src/main/res/values-pt-rPT/strings.xml | 2 + .../src/main/res/values-v14/bools.xml | 5 + .../src/main/res/values-v15/bools.xml | 5 + .../src/main/res/values-v16/bools.xml | 5 + TMessagesProj/src/main/res/values/bools.xml | 5 + TMessagesProj/src/main/res/values/strings.xml | 2 + 53 files changed, 982 insertions(+), 117 deletions(-) create mode 100644 TMessagesProj/src/main/java/org/telegram/ui/Components/PhotoFilterLinearBlurControl.java create mode 100644 TMessagesProj/src/main/java/org/telegram/ui/Components/PhotoFilterRadialBlurControl.java create mode 100644 TMessagesProj/src/main/res/values-v14/bools.xml create mode 100644 TMessagesProj/src/main/res/values-v15/bools.xml create mode 100644 TMessagesProj/src/main/res/values-v16/bools.xml create mode 100644 TMessagesProj/src/main/res/values/bools.xml diff --git a/TMessagesProj/build.gradle b/TMessagesProj/build.gradle index fe29254bb..910597bbc 100644 --- a/TMessagesProj/build.gradle +++ b/TMessagesProj/build.gradle @@ -82,7 +82,7 @@ android { defaultConfig { minSdkVersion 8 targetSdkVersion 21 - versionCode 454 - versionName "2.5.1" + versionCode 458 + versionName "2.5.2" } } diff --git a/TMessagesProj/config/debug/AndroidManifest.xml b/TMessagesProj/config/debug/AndroidManifest.xml index 7836674f2..a9ed995de 100644 --- a/TMessagesProj/config/debug/AndroidManifest.xml +++ b/TMessagesProj/config/debug/AndroidManifest.xml @@ -24,7 +24,7 @@ android:label="@string/AppName" android:theme="@style/Theme.TMessages.Start" android:name=".ApplicationLoader" - android:hardwareAccelerated="true" + android:hardwareAccelerated="@bool/useHardwareAcceleration" android:largeHeap="true"> diff --git a/TMessagesProj/config/foss/AndroidManifest.xml b/TMessagesProj/config/foss/AndroidManifest.xml index df2d1e24b..59b2f53b4 100644 --- a/TMessagesProj/config/foss/AndroidManifest.xml +++ b/TMessagesProj/config/foss/AndroidManifest.xml @@ -9,7 +9,7 @@ android:label="@string/AppName" android:theme="@style/Theme.TMessages.Start" android:name=".ApplicationLoader" - android:hardwareAccelerated="true" + android:hardwareAccelerated="@bool/useHardwareAcceleration" android:largeHeap="true"> diff --git a/TMessagesProj/config/release/AndroidManifest.xml b/TMessagesProj/config/release/AndroidManifest.xml index 17c2c2458..f2b0b5627 100644 --- a/TMessagesProj/config/release/AndroidManifest.xml +++ b/TMessagesProj/config/release/AndroidManifest.xml @@ -24,7 +24,7 @@ android:label="@string/AppName" android:theme="@style/Theme.TMessages.Start" android:name=".ApplicationLoader" - android:hardwareAccelerated="true" + android:hardwareAccelerated="@bool/useHardwareAcceleration" android:largeHeap="true"> diff --git a/TMessagesProj/src/main/AndroidManifest.xml b/TMessagesProj/src/main/AndroidManifest.xml index 5ca90c91e..dd3c5fc25 100644 --- a/TMessagesProj/src/main/AndroidManifest.xml +++ b/TMessagesProj/src/main/AndroidManifest.xml @@ -43,7 +43,7 @@ diff --git a/TMessagesProj/src/main/java/jawnae/pyronet/ByteStream.java b/TMessagesProj/src/main/java/jawnae/pyronet/ByteStream.java index 39966ac18..878a92acd 100755 --- a/TMessagesProj/src/main/java/jawnae/pyronet/ByteStream.java +++ b/TMessagesProj/src/main/java/jawnae/pyronet/ByteStream.java @@ -28,7 +28,7 @@ public class ByteStream { private final ArrayList queue; public ByteStream() { - this.queue = new ArrayList(); + this.queue = new ArrayList<>(); } public void append(ByteBufferDesc buf) { diff --git a/TMessagesProj/src/main/java/org/telegram/PhoneFormat/PhoneFormat.java b/TMessagesProj/src/main/java/org/telegram/PhoneFormat/PhoneFormat.java index a6dbff0ac..63081ef8b 100644 --- a/TMessagesProj/src/main/java/org/telegram/PhoneFormat/PhoneFormat.java +++ b/TMessagesProj/src/main/java/org/telegram/PhoneFormat/PhoneFormat.java @@ -25,6 +25,7 @@ package org.telegram.PhoneFormat; import org.telegram.messenger.ApplicationLoader; +import org.telegram.messenger.FileLog; import java.io.ByteArrayOutputStream; import java.io.InputStream; @@ -97,9 +98,11 @@ public class PhoneFormat { } public void init(String countryCode) { + InputStream stream = null; + ByteArrayOutputStream bos = null; try { - InputStream stream = ApplicationLoader.applicationContext.getAssets().open("PhoneFormats.dat"); - ByteArrayOutputStream bos = new ByteArrayOutputStream(); + stream = ApplicationLoader.applicationContext.getAssets().open("PhoneFormats.dat"); + bos = new ByteArrayOutputStream(); byte[] buf = new byte[1024]; int len; while ((len = stream.read(buf, 0, 1024)) != -1) { @@ -111,6 +114,21 @@ public class PhoneFormat { } catch (Exception e) { e.printStackTrace(); return; + } finally { + try { + if (bos != null) { + bos.close(); + } + } catch (Exception e) { + FileLog.e("tmessages", e); + } + try { + if (stream != null) { + stream.close(); + } + } catch (Exception e) { + FileLog.e("tmessages", e); + } } if (countryCode != null && countryCode.length() != 0) { @@ -119,10 +137,10 @@ public class PhoneFormat { Locale loc = Locale.getDefault(); defaultCountry = loc.getCountry().toLowerCase(); } - callingCodeOffsets = new HashMap(255); - callingCodeCountries = new HashMap>(255); - callingCodeData = new HashMap(10); - countryCallingCode = new HashMap(255); + callingCodeOffsets = new HashMap<>(255); + callingCodeCountries = new HashMap<>(255); + callingCodeData = new HashMap<>(10); + countryCallingCode = new HashMap<>(255); parseDataHeader(); initialzed = true; @@ -293,7 +311,7 @@ public class PhoneFormat { offset += 2; - ArrayList strs = new ArrayList(5); + ArrayList strs = new ArrayList<>(5); String str; while ((str = valueString(offset)).length() != 0) { strs.add(str); @@ -302,14 +320,14 @@ public class PhoneFormat { res.trunkPrefixes = strs; offset++; - strs = new ArrayList(5); + strs = new ArrayList<>(5); while ((str = valueString(offset)).length() != 0) { strs.add(str); offset += str.length() + 1; } res.intlPrefixes = strs; - ArrayList ruleSets = new ArrayList(setCnt); + ArrayList ruleSets = new ArrayList<>(setCnt); offset = start + block1Len; for (int s = 0; s < setCnt; s++) { RuleSet ruleSet = new RuleSet(); @@ -317,7 +335,7 @@ public class PhoneFormat { offset += 2; int ruleCnt = value16(offset); offset += 2; - ArrayList rules = new ArrayList(ruleCnt); + ArrayList rules = new ArrayList<>(ruleCnt); for (int r = 0; r < ruleCnt; r++) { PhoneRule rule = new PhoneRule(); rule.minVal = value32(offset); @@ -380,7 +398,7 @@ public class PhoneFormat { callingCodeOffsets.put(callingCode, offset); ArrayList countries = callingCodeCountries.get(callingCode); if (countries == null) { - countries = new ArrayList(); + countries = new ArrayList<>(); callingCodeCountries.put(callingCode, countries); } countries.add(country); diff --git a/TMessagesProj/src/main/java/org/telegram/android/AndroidUtilities.java b/TMessagesProj/src/main/java/org/telegram/android/AndroidUtilities.java index c7e2065ac..6e69b4411 100644 --- a/TMessagesProj/src/main/java/org/telegram/android/AndroidUtilities.java +++ b/TMessagesProj/src/main/java/org/telegram/android/AndroidUtilities.java @@ -568,4 +568,18 @@ public class AndroidUtilities { return UserConfig.passcodeHash.length() > 0 && wasInBackground && (UserConfig.appLocked || UserConfig.autoLockIn != 0 && UserConfig.lastPauseTime != 0 && !UserConfig.appLocked && (UserConfig.lastPauseTime + UserConfig.autoLockIn) <= ConnectionsManager.getInstance().getCurrentTime()); } + + /*public static void turnOffHardwareAcceleration(Window window) { + if (window == null || Build.MODEL == null || Build.VERSION.SDK_INT < 11) { + return; + } + if (Build.MODEL.contains("GT-S5301") || + Build.MODEL.contains("GT-S5303") || + Build.MODEL.contains("GT-B5330") || + Build.MODEL.contains("GT-S5302") || + Build.MODEL.contains("GT-S6012B") || + Build.MODEL.contains("MegaFon_SP-AI")) { + window.clearFlags(WindowManager.LayoutParams.FLAG_HARDWARE_ACCELERATED); + } + }*/ } diff --git a/TMessagesProj/src/main/java/org/telegram/android/ImageLoader.java b/TMessagesProj/src/main/java/org/telegram/android/ImageLoader.java index 997488ed5..2cca9e968 100644 --- a/TMessagesProj/src/main/java/org/telegram/android/ImageLoader.java +++ b/TMessagesProj/src/main/java/org/telegram/android/ImageLoader.java @@ -449,6 +449,11 @@ public class ImageLoader { originalBitmap = scaledBitmap; FileOutputStream stream = new FileOutputStream(thumbFile); originalBitmap.compress(Bitmap.CompressFormat.JPEG, 60, stream); + try { + stream.close(); + } catch (Exception e) { + FileLog.e("tmessages", e); + } final BitmapDrawable bitmapDrawable = new BitmapDrawable(originalBitmap); AndroidUtilities.runOnUIThread(new Runnable() { @Override @@ -615,7 +620,9 @@ public class ImageLoader { if (mediaId != null) { MediaStore.Images.Thumbnails.getThumbnail(ApplicationLoader.applicationContext.getContentResolver(), mediaId, MediaStore.Images.Thumbnails.MINI_KIND, opts); } else { - BitmapFactory.decodeFile(cacheImage.finalFilePath.getAbsolutePath(), opts); + FileInputStream is = new FileInputStream(cacheFileFinal); + image = BitmapFactory.decodeStream(is, null, opts); + is.close(); } float photoW = opts.outWidth; diff --git a/TMessagesProj/src/main/java/org/telegram/android/LocaleController.java b/TMessagesProj/src/main/java/org/telegram/android/LocaleController.java index 3fffe63d0..1d2094bc8 100644 --- a/TMessagesProj/src/main/java/org/telegram/android/LocaleController.java +++ b/TMessagesProj/src/main/java/org/telegram/android/LocaleController.java @@ -444,10 +444,12 @@ public class LocaleController { } private HashMap getLocaleFileStrings(File file) { + FileInputStream stream = null; try { HashMap stringMap = new HashMap<>(); XmlPullParser parser = Xml.newPullParser(); - parser.setInput(new FileInputStream(file), "UTF-8"); + stream = new FileInputStream(file); + parser.setInput(stream, "UTF-8"); int eventType = parser.getEventType(); String name = null; String value = null; @@ -484,6 +486,15 @@ public class LocaleController { return stringMap; } catch (Exception e) { FileLog.e("tmessages", e); + } finally { + try { + if (stream != null) { + stream.close(); + stream = null; + } + } catch (Exception e) { + FileLog.e("tmessages", e); + } } return null; } diff --git a/TMessagesProj/src/main/java/org/telegram/android/MediaController.java b/TMessagesProj/src/main/java/org/telegram/android/MediaController.java index b520f8b8f..0207db4ee 100644 --- a/TMessagesProj/src/main/java/org/telegram/android/MediaController.java +++ b/TMessagesProj/src/main/java/org/telegram/android/MediaController.java @@ -1698,10 +1698,10 @@ public class MediaController implements NotificationCenter.NotificationCenterDel FileLog.e("tmessages", e); result = false; } finally { - if(source != null) { + if (source != null) { source.close(); } - if(destination != null) { + if (destination != null) { destination.close(); } } diff --git a/TMessagesProj/src/main/java/org/telegram/android/MessagesController.java b/TMessagesProj/src/main/java/org/telegram/android/MessagesController.java index 1eea13dc7..a7c97325a 100644 --- a/TMessagesProj/src/main/java/org/telegram/android/MessagesController.java +++ b/TMessagesProj/src/main/java/org/telegram/android/MessagesController.java @@ -9,10 +9,12 @@ package org.telegram.android; import android.app.Activity; +import android.app.AlertDialog; import android.content.SharedPreferences; import android.content.pm.PackageInfo; import android.os.Build; import android.text.Html; +import android.util.Base64; import android.util.SparseArray; import org.telegram.messenger.ConnectionsManager; @@ -20,11 +22,14 @@ import org.telegram.messenger.FileLoader; import org.telegram.messenger.FileLog; import org.telegram.messenger.R; import org.telegram.messenger.RPCRequest; +import org.telegram.messenger.SerializedData; +import org.telegram.messenger.TLClassStore; import org.telegram.messenger.TLObject; import org.telegram.messenger.TLRPC; import org.telegram.messenger.UserConfig; import org.telegram.messenger.Utilities; import org.telegram.messenger.ApplicationLoader; +import org.telegram.ui.ActionBar.BaseFragment; import java.util.ArrayList; import java.util.Collections; @@ -86,6 +91,8 @@ public class MessagesController implements NotificationCenter.NotificationCenter public int fontSize = AndroidUtilities.dp(16); public int maxGroupCount = 200; public int maxBroadcastCount = 100; + public int groupBigSize; + private ArrayList disabledFeatures = new ArrayList<>(); private class UserActionUpdates extends TLRPC.Updates { @@ -140,7 +147,26 @@ public class MessagesController implements NotificationCenter.NotificationCenter preferences = ApplicationLoader.applicationContext.getSharedPreferences("mainconfig", Activity.MODE_PRIVATE); maxGroupCount = preferences.getInt("maxGroupCount", 200); maxBroadcastCount = preferences.getInt("maxBroadcastCount", 100); + groupBigSize = preferences.getInt("groupBigSize", 10); fontSize = preferences.getInt("fons_size", AndroidUtilities.isTablet() ? 18 : 16); + String disabledFeaturesString = preferences.getString("disabledFeatures", null); + if (disabledFeaturesString != null && disabledFeaturesString.length() != 0) { + try { + byte[] bytes = Base64.decode(disabledFeaturesString, Base64.DEFAULT); + if (bytes != null) { + SerializedData data = new SerializedData(bytes); + int count = data.readInt32(); + for (int a = 0; a < count; a++) { + TLRPC.TL_disabledFeature feature = (TLRPC.TL_disabledFeature) TLClassStore.Instance().TLdeserialize(data, data.readInt32()); + if (feature != null && feature.feature != null && feature.description != null) { + disabledFeatures.add(feature); + } + } + } + } catch (Exception e) { + FileLog.e("tmessages", e); + } + } } public void updateConfig(final TLRPC.TL_config config) { @@ -149,15 +175,52 @@ public class MessagesController implements NotificationCenter.NotificationCenter public void run() { maxBroadcastCount = config.broadcast_size_max; maxGroupCount = config.chat_size_max; + groupBigSize = config.chat_big_size; + disabledFeatures = config.disabled_features; + SharedPreferences preferences = ApplicationLoader.applicationContext.getSharedPreferences("mainconfig", Activity.MODE_PRIVATE); SharedPreferences.Editor editor = preferences.edit(); editor.putInt("maxGroupCount", maxGroupCount); editor.putInt("maxBroadcastCount", maxBroadcastCount); + editor.putInt("groupBigSize", groupBigSize); + try { + SerializedData data = new SerializedData(); + data.writeInt32(disabledFeatures.size()); + for (TLRPC.TL_disabledFeature disabledFeature : disabledFeatures) { + disabledFeature.serializeToStream(data); + } + String string = Base64.encodeToString(data.toByteArray(), Base64.DEFAULT); + if (string != null && string.length() != 0) { + editor.putString("disabledFeatures", string); + } + } catch (Exception e) { + editor.remove("disabledFeatures"); + FileLog.e("tmessages", e); + } editor.commit(); } }); } + public static boolean isFeatureEnabled(String feature, BaseFragment fragment) { + if (feature == null || feature.length() == 0 || getInstance().disabledFeatures.isEmpty() || fragment == null) { + return true; + } + for (TLRPC.TL_disabledFeature disabledFeature : getInstance().disabledFeatures) { + if (disabledFeature.feature.equals(feature)) { + if (fragment.getParentActivity() != null) { + AlertDialog.Builder builder = new AlertDialog.Builder(fragment.getParentActivity()); + builder.setTitle("Oops!"); + builder.setPositiveButton(R.string.OK, null); + builder.setMessage(disabledFeature.description); + fragment.showAlertDialog(builder); + } + return false; + } + } + return true; + } + public void addSupportUser() { TLRPC.TL_userForeign user = new TLRPC.TL_userForeign(); user.phone = "333"; @@ -3582,4 +3645,6 @@ public class MessagesController implements NotificationCenter.NotificationCenter } } } + + } diff --git a/TMessagesProj/src/main/java/org/telegram/android/NotificationsController.java b/TMessagesProj/src/main/java/org/telegram/android/NotificationsController.java index f90fcef75..ea5942993 100644 --- a/TMessagesProj/src/main/java/org/telegram/android/NotificationsController.java +++ b/TMessagesProj/src/main/java/org/telegram/android/NotificationsController.java @@ -841,7 +841,7 @@ public class NotificationsController { notifyCheck = isLast; } - if (!popupMessages.isEmpty() && oldCount != popupMessages.size() && !AndroidUtilities.needShowPasscode(false)) { + if (!popupMessages.isEmpty() && oldCount != popupMessages.size() && !AndroidUtilities.needShowPasscode(false) && !UserConfig.isWaitingForPasscodeEnter) { if (ApplicationLoader.mainInterfacePaused || !ApplicationLoader.isScreenOn) { MessageObject messageObject = messageObjects.get(0); if (popup == 3 || popup == 1 && ApplicationLoader.isScreenOn || popup == 2 && !ApplicationLoader.isScreenOn) { diff --git a/TMessagesProj/src/main/java/org/telegram/messenger/ConnectionsManager.java b/TMessagesProj/src/main/java/org/telegram/messenger/ConnectionsManager.java index 4661c8b0a..487f019cc 100644 --- a/TMessagesProj/src/main/java/org/telegram/messenger/ConnectionsManager.java +++ b/TMessagesProj/src/main/java/org/telegram/messenger/ConnectionsManager.java @@ -366,6 +366,7 @@ public class ConnectionsManager implements Action.ActionDelegate, TcpConnection. datacenters.put(datacenter.datacenterId, datacenter); } currentDatacenterId = data.readInt32(); + data.cleanup(); } catch (Exception e) { UserConfig.clearConfig(); } @@ -388,6 +389,7 @@ public class ConnectionsManager implements Action.ActionDelegate, TcpConnection. for (int a = 0; a < count; a++) { sessionsToDestroy.add(data.readInt64()); } + data.cleanup(); } } } catch (Exception e) { @@ -405,6 +407,7 @@ public class ConnectionsManager implements Action.ActionDelegate, TcpConnection. Datacenter datacenter = new Datacenter(data, 1); datacenters.put(datacenter.datacenterId, datacenter); } + data.cleanup(); } } } catch (Exception e) { @@ -528,6 +531,7 @@ public class ConnectionsManager implements Action.ActionDelegate, TcpConnection. data.writeInt64(session); } editor.putString("sessionsToDestroy", Base64.encodeToString(data.toByteArray(), Base64.DEFAULT)); + data.cleanup(); } else { editor.remove("sessionsToDestroy"); } @@ -539,6 +543,7 @@ public class ConnectionsManager implements Action.ActionDelegate, TcpConnection. datacenter.SerializeToStream(data); } editor.putString("datacenters", Base64.encodeToString(data.toByteArray(), Base64.DEFAULT)); + data.cleanup(); } else { editor.remove("datacenters"); } @@ -763,8 +768,12 @@ public class ConnectionsManager implements Action.ActionDelegate, TcpConnection. return; } if (error == null) { - lastDcUpdateTime = (int)(System.currentTimeMillis() / 1000); TLRPC.TL_config config = (TLRPC.TL_config)response; + int updateIn = config.expires - getCurrentTime(); + if (updateIn <= 0) { + updateIn = 120; + } + lastDcUpdateTime = (int)(System.currentTimeMillis() / 1000) - DC_UPDATE_TIME + updateIn; ArrayList datacentersArr = new ArrayList<>(); HashMap datacenterMap = new HashMap<>(); for (TLRPC.TL_dcOption datacenterDesc : config.dc_options) { @@ -1338,6 +1347,7 @@ public class ConnectionsManager implements Action.ActionDelegate, TcpConnection. if (canCompress) { try { byte[] data = Utilities.compress(os.toByteArray()); + os.cleanup(); if (data.length < requestLength) { TLRPC.TL_gzip_packed packed = new TLRPC.TL_gzip_packed(); packed.packed_data = data; @@ -1345,6 +1355,7 @@ public class ConnectionsManager implements Action.ActionDelegate, TcpConnection. os = new SerializedData(true); packed.serializeToStream(os); requestLength = os.length(); + os.cleanup(); } } catch (Exception e) { FileLog.e("tmessages", e); @@ -1723,6 +1734,7 @@ public class ConnectionsManager implements Action.ActionDelegate, TcpConnection. if (quickAckId != null) { SerializedData data = new SerializedData(messageKeyFull); quickAckId.add(data.readInt32() & 0x7fffffff); + data.cleanup(); } MessageKeyData keyData = Utilities.generateMessageKeyData(datacenter.authKey, messageKey, false); diff --git a/TMessagesProj/src/main/java/org/telegram/messenger/FileUploadOperation.java b/TMessagesProj/src/main/java/org/telegram/messenger/FileUploadOperation.java index 157103bec..6bf1f236f 100644 --- a/TMessagesProj/src/main/java/org/telegram/messenger/FileUploadOperation.java +++ b/TMessagesProj/src/main/java/org/telegram/messenger/FileUploadOperation.java @@ -91,6 +91,14 @@ public class FileUploadOperation { remove(fileKey + "_iv"). remove(fileKey + "_key"). remove(fileKey + "_ivc").commit(); + try { + if (stream != null) { + stream.close(); + stream = null; + } + } catch (Exception e) { + FileLog.e("tmessages", e); + } } protected void checkNewDataAvailable(final long finalSize) { diff --git a/TMessagesProj/src/main/java/org/telegram/messenger/HandshakeAction.java b/TMessagesProj/src/main/java/org/telegram/messenger/HandshakeAction.java index 770dbd6f3..dc5f426d1 100644 --- a/TMessagesProj/src/main/java/org/telegram/messenger/HandshakeAction.java +++ b/TMessagesProj/src/main/java/org/telegram/messenger/HandshakeAction.java @@ -55,7 +55,7 @@ public class HandshakeAction extends Action implements TcpConnection.TcpConnecti } datacenter.connection.delegate = this; - processedMessageIds = new ArrayList(); + processedMessageIds = new ArrayList<>(); authNonce = null; authServerNonce = null; authNewNonce = null; @@ -92,10 +92,10 @@ public class HandshakeAction extends Action implements TcpConnection.TcpConnecti HashMap selectPublicKey(ArrayList fingerprints) { synchronized (lock) { if (serverPublicKeys == null) { - serverPublicKeys = new ArrayList>(); + serverPublicKeys = new ArrayList<>(); HashMap map; - map = new HashMap(); + map = new HashMap<>(); map.put("key", new BigInteger[]{ new BigInteger("c150023e2f70db7985ded064759cfecf0af328e69a41daf4d6f01b538135" + "a6f91f8f8b2a0ec9ba9720ce352efcf6c5680ffc424bd634864902de0b4bd6d49f4e580230e" + @@ -108,7 +108,7 @@ public class HandshakeAction extends Action implements TcpConnection.TcpConnecti map.put("fingerprint", 0xc3b42b026ce86b21L); serverPublicKeys.add(map); - map = new HashMap(); + map = new HashMap<>(); map.put("key", new BigInteger[]{ new BigInteger("c6aeda78b02a251db4b6441031f467fa871faed32526c436524b1fb3b5dc" + "a28efb8c089dd1b46d92c895993d87108254951c5f001a0f055f3063dcd14d431a300eb9e29" + @@ -121,7 +121,7 @@ public class HandshakeAction extends Action implements TcpConnection.TcpConnecti map.put("fingerprint", 0x9a996a1db11c729bL); serverPublicKeys.add(map); - map = new HashMap(); + map = new HashMap<>(); map.put("key", new BigInteger[]{ new BigInteger("b1066749655935f0a5936f517034c943bea7f3365a8931ae52c8bcb14856" + "f004b83d26cf2839be0f22607470d67481771c1ce5ec31de16b20bbaa4ecd2f7d2ecf6b6356" + @@ -134,7 +134,7 @@ public class HandshakeAction extends Action implements TcpConnection.TcpConnecti map.put("fingerprint", 0xb05b2a6f70cdea78L); serverPublicKeys.add(map); - map = new HashMap(); + map = new HashMap<>(); map.put("key", new BigInteger[]{ new BigInteger("c2a8c55b4a62e2b78a19b91cf692bcdc4ba7c23fe4d06f194e2a0c30f6d9" + "996f7d1a2bcc89bc1ac4333d44359a6c433252d1a8402d9970378b5912b75bc8cc3fa76710a" + @@ -190,7 +190,7 @@ public class HandshakeAction extends Action implements TcpConnection.TcpConnecti if (message instanceof TLRPC.TL_resPQ) { if (processedPQRes) { TLRPC.TL_msgs_ack msgsAck = new TLRPC.TL_msgs_ack(); - msgsAck.msg_ids = new ArrayList(); + msgsAck.msg_ids = new ArrayList<>(); msgsAck.msg_ids.add(messageId); sendMessageData(msgsAck, generateMessageId()); return; @@ -250,6 +250,7 @@ public class HandshakeAction extends Action implements TcpConnection.TcpConnecti innerData.serializeToStream(os); byte[] innerDataBytes = os.toByteArray(); + os.cleanup(); SerializedData dataWithHash = new SerializedData(); dataWithHash.writeRaw(Utilities.computeSHA1(innerDataBytes)); @@ -261,6 +262,7 @@ public class HandshakeAction extends Action implements TcpConnection.TcpConnecti } byte[] encryptedBytes = Utilities.encryptWithRSA((BigInteger[])publicKey.get("key"), dataWithHash.toByteArray()); + dataWithHash.cleanup(); SerializedData encryptedData = new SerializedData(); encryptedData.writeRaw(encryptedBytes); if (encryptedData.length() < 256) { @@ -269,12 +271,14 @@ public class HandshakeAction extends Action implements TcpConnection.TcpConnecti newEncryptedData.writeByte(0); } newEncryptedData.writeRaw(encryptedData.toByteArray()); + encryptedData.cleanup(); encryptedData = newEncryptedData; } reqDH.encrypted_data = encryptedData.toByteArray(); + encryptedData.cleanup(); TLRPC.TL_msgs_ack msgsAck = new TLRPC.TL_msgs_ack(); - msgsAck.msg_ids = new ArrayList(); + msgsAck.msg_ids = new ArrayList<>(); msgsAck.msg_ids.add(messageIdf); sendMessageData(msgsAck, generateMessageId()); @@ -305,8 +309,10 @@ public class HandshakeAction extends Action implements TcpConnection.TcpConnecti serverNonceAndNewNonce.writeRaw(authServerNonce); serverNonceAndNewNonce.writeRaw(authNewNonce); tmpAesKey.writeRaw(Utilities.computeSHA1(newNonceAndServerNonce.toByteArray())); + newNonceAndServerNonce.cleanup(); byte[] serverNonceAndNewNonceHash = Utilities.computeSHA1(serverNonceAndNewNonce.toByteArray()); + serverNonceAndNewNonce.cleanup(); byte[] serverNonceAndNewNonceHash0_12 = new byte[12]; System.arraycopy(serverNonceAndNewNonceHash, 0, serverNonceAndNewNonceHash0_12, 0, 12); @@ -322,6 +328,7 @@ public class HandshakeAction extends Action implements TcpConnection.TcpConnecti newNonceAndNewNonce.writeRaw(authNewNonce); newNonceAndNewNonce.writeRaw(authNewNonce); tmpAesIv.writeRaw(Utilities.computeSHA1(newNonceAndNewNonce.toByteArray())); + newNonceAndNewNonce.cleanup(); byte[] newNonce0_4 = new byte[4]; System.arraycopy(authNewNonce, 0, newNonce0_4, 0, 4); @@ -417,6 +424,7 @@ public class HandshakeAction extends Action implements TcpConnection.TcpConnecti serverSaltData.writeByte(x); } ByteBuffer saltBuffer = ByteBuffer.wrap(serverSaltData.toByteArray()); + serverSaltData.cleanup(); timeDifference = dhInnerData.server_time - (int)(System.currentTimeMillis() / 1000); @@ -455,8 +463,11 @@ public class HandshakeAction extends Action implements TcpConnection.TcpConnecti Utilities.aesIgeEncryption(clientDataWithHash.buffer, tmpAesKey.toByteArray(), tmpAesIv.toByteArray(), true, false, 0, clientDataWithHash.length()); setClientDhParams.encrypted_data = clientDataWithHash; + tmpAesKey.cleanup(); + tmpAesIv.cleanup(); + TLRPC.TL_msgs_ack msgsAck = new TLRPC.TL_msgs_ack(); - msgsAck.msg_ids = new ArrayList(); + msgsAck.msg_ids = new ArrayList<>(); msgsAck.msg_ids.add(messageId); sendMessageData(msgsAck, generateMessageId()); @@ -494,7 +505,7 @@ public class HandshakeAction extends Action implements TcpConnection.TcpConnecti } TLRPC.TL_msgs_ack msgsAck = new TLRPC.TL_msgs_ack(); - msgsAck.msg_ids = new ArrayList(); + msgsAck.msg_ids = new ArrayList<>(); msgsAck.msg_ids.add(messageId); sendMessageData(msgsAck, generateMessageId()); @@ -507,6 +518,7 @@ public class HandshakeAction extends Action implements TcpConnection.TcpConnecti newNonce1.writeByte(1); newNonce1.writeRaw(authKeyAuxHash); byte[] newNonceHash1Full = Utilities.computeSHA1(newNonce1.toByteArray()); + newNonce1.cleanup(); byte[] newNonceHash1 = new byte[16]; System.arraycopy(newNonceHash1Full, newNonceHash1Full.length - 16, newNonceHash1, 0, 16); @@ -515,6 +527,7 @@ public class HandshakeAction extends Action implements TcpConnection.TcpConnecti newNonce2.writeByte(2); newNonce2.writeRaw(authKeyAuxHash); byte[] newNonceHash2Full = Utilities.computeSHA1(newNonce2.toByteArray()); + newNonce2.cleanup(); byte[] newNonceHash2 = new byte[16]; System.arraycopy(newNonceHash2Full, newNonceHash2Full.length - 16, newNonceHash2, 0, 16); @@ -523,6 +536,7 @@ public class HandshakeAction extends Action implements TcpConnection.TcpConnecti newNonce3.writeByte(3); newNonce3.writeRaw(authKeyAuxHash); byte[] newNonceHash3Full = Utilities.computeSHA1(newNonce3.toByteArray()); + newNonce3.cleanup(); byte[] newNonceHash3 = new byte[16]; System.arraycopy(newNonceHash3Full, newNonceHash3Full.length - 16, newNonceHash3, 0, 16); @@ -544,7 +558,7 @@ public class HandshakeAction extends Action implements TcpConnection.TcpConnecti datacenter.authKey = authKey; datacenter.authKeyId = authKeyId; datacenter.addServerSalt(serverSalt); - HashMap resultDict = new HashMap(); + HashMap resultDict = new HashMap<>(); resultDict.put("timeDifference", timeDifference); if (delegate != null) { delegate.ActionDidFinishExecution(parent, resultDict); @@ -575,7 +589,7 @@ public class HandshakeAction extends Action implements TcpConnection.TcpConnecti } } else { TLRPC.TL_msgs_ack msgsAck = new TLRPC.TL_msgs_ack(); - msgsAck.msg_ids = new ArrayList(); + msgsAck.msg_ids = new ArrayList<>(); msgsAck.msg_ids.add(messageId); sendMessageData(msgsAck, generateMessageId()); } diff --git a/TMessagesProj/src/main/java/org/telegram/messenger/SerializedData.java b/TMessagesProj/src/main/java/org/telegram/messenger/SerializedData.java index 59b59e6d5..40847dabb 100644 --- a/TMessagesProj/src/main/java/org/telegram/messenger/SerializedData.java +++ b/TMessagesProj/src/main/java/org/telegram/messenger/SerializedData.java @@ -49,6 +49,41 @@ public class SerializedData extends AbsSerializedData { in = new DataInputStream(inbuf); } + public void cleanup() { + try { + if (inbuf != null) { + inbuf.close(); + inbuf = null; + } + } catch (Exception e) { + FileLog.e("tmessages", e); + } + try { + if (in != null) { + in.close(); + in = null; + } + } catch (Exception e) { + FileLog.e("tmessages", e); + } + try { + if (outbuf != null) { + outbuf.close(); + outbuf = null; + } + } catch (Exception e) { + FileLog.e("tmessages", e); + } + try { + if (out != null) { + out.close(); + out = null; + } + } catch (Exception e) { + FileLog.e("tmessages", e); + } + } + public SerializedData(File file) throws Exception { FileInputStream is = new FileInputStream(file); byte[] data = new byte[(int)file.length()]; diff --git a/TMessagesProj/src/main/java/org/telegram/messenger/TLClassStore.java b/TMessagesProj/src/main/java/org/telegram/messenger/TLClassStore.java index 6d51db703..a2d747a2a 100644 --- a/TMessagesProj/src/main/java/org/telegram/messenger/TLClassStore.java +++ b/TMessagesProj/src/main/java/org/telegram/messenger/TLClassStore.java @@ -216,6 +216,7 @@ public class TLClassStore { classStore.put(TLRPC.TL_userStatusRecently.constructor, TLRPC.TL_userStatusRecently.class); classStore.put(TLRPC.TL_msg_copy.constructor, TLRPC.TL_msg_copy.class); classStore.put(TLRPC.TL_contacts_importedContacts.constructor, TLRPC.TL_contacts_importedContacts.class); + classStore.put(TLRPC.TL_disabledFeature.constructor, TLRPC.TL_disabledFeature.class); classStore.put(TLRPC.TL_futureSalt.constructor, TLRPC.TL_futureSalt.class); classStore.put(TLRPC.TL_updateEncryptedMessagesRead.constructor, TLRPC.TL_updateEncryptedMessagesRead.class); classStore.put(TLRPC.TL_updateContactLink.constructor, TLRPC.TL_updateContactLink.class); @@ -413,6 +414,7 @@ public class TLClassStore { classStore.put(TLRPC.TL_decryptedMessageHolder.constructor, TLRPC.TL_decryptedMessageHolder.class); classStore.put(TLRPC.TL_documentEncrypted_old.constructor, TLRPC.TL_documentEncrypted_old.class); classStore.put(TLRPC.TL_document_old.constructor, TLRPC.TL_document_old.class); + classStore.put(TLRPC.TL_config_old.constructor, TLRPC.TL_config_old.class); } static TLClassStore store = null; diff --git a/TMessagesProj/src/main/java/org/telegram/messenger/TLRPC.java b/TMessagesProj/src/main/java/org/telegram/messenger/TLRPC.java index 2348395b5..6ce1e5194 100644 --- a/TMessagesProj/src/main/java/org/telegram/messenger/TLRPC.java +++ b/TMessagesProj/src/main/java/org/telegram/messenger/TLRPC.java @@ -16,7 +16,7 @@ public class TLRPC { public static final int MESSAGE_FLAG_UNREAD = 1; public static final int MESSAGE_FLAG_OUT = 2; - public static final int LAYER = 22; + public static final int LAYER = 23; public static class ChatPhoto extends TLObject { public FileLocation photo_small; @@ -3743,6 +3743,24 @@ public class TLRPC { } } + public static class TL_disabledFeature extends TLObject { + public static int constructor = 0xae636f24; + + public String feature; + public String description; + + public void readParams(AbsSerializedData stream) { + feature = stream.readString(); + description = stream.readString(); + } + + public void serializeToStream(AbsSerializedData stream) { + stream.writeInt32(constructor); + stream.writeString(feature); + stream.writeString(description); + } + } + public static class TL_futureSalt extends TLObject { public static int constructor = 0x0949d9dc; @@ -5023,17 +5041,21 @@ public class TLRPC { } public static class TL_config extends TLObject { - public static int constructor = 0x2e54dd74; + public static int constructor = 0x7dae33e0; public int date; + public int expires; public boolean test_mode; public int this_dc; public ArrayList dc_options = new ArrayList<>(); + public int chat_big_size; public int chat_size_max; public int broadcast_size_max; + public ArrayList disabled_features = new ArrayList<>(); public void readParams(AbsSerializedData stream) { date = stream.readInt32(); + expires = stream.readInt32(); test_mode = stream.readBool(); this_dc = stream.readInt32(); stream.readInt32(); @@ -5041,23 +5063,37 @@ public class TLRPC { for (int a = 0; a < count; a++) { dc_options.add((TL_dcOption)TLClassStore.Instance().TLdeserialize(stream, stream.readInt32())); } + chat_big_size = stream.readInt32(); chat_size_max = stream.readInt32(); broadcast_size_max = stream.readInt32(); + stream.readInt32(); + count = stream.readInt32(); + for (int a = 0; a < count; a++) { + disabled_features.add((TL_disabledFeature)TLClassStore.Instance().TLdeserialize(stream, stream.readInt32())); + } } public void serializeToStream(AbsSerializedData stream) { stream.writeInt32(constructor); stream.writeInt32(date); + stream.writeInt32(expires); stream.writeBool(test_mode); stream.writeInt32(this_dc); stream.writeInt32(0x1cb5c415); int count = dc_options.size(); stream.writeInt32(count); - for (TL_dcOption dc_option : dc_options) { - dc_option.serializeToStream(stream); + for (int a = 0; a < count; a++) { + dc_options.get(a).serializeToStream(stream); } + stream.writeInt32(chat_big_size); stream.writeInt32(chat_size_max); stream.writeInt32(broadcast_size_max); + stream.writeInt32(0x1cb5c415); + count = disabled_features.size(); + stream.writeInt32(count); + for (int a = 0; a < count; a++) { + disabled_features.get(a).serializeToStream(stream); + } } } @@ -9298,6 +9334,40 @@ public class TLRPC { //manually created + public static class TL_config_old extends TL_config { + public static int constructor = 0x2e54dd74; + + public void readParams(AbsSerializedData stream) { + date = stream.readInt32(); + test_mode = stream.readBool(); + this_dc = stream.readInt32(); + stream.readInt32(); + int count = stream.readInt32(); + for (int a = 0; a < count; a++) { + dc_options.add((TL_dcOption) TLClassStore.Instance().TLdeserialize(stream, stream.readInt32())); + } + chat_size_max = stream.readInt32(); + broadcast_size_max = stream.readInt32(); + expires = (int) (System.currentTimeMillis() / 1000) + 3600; + chat_big_size = 10; + } + + public void serializeToStream(AbsSerializedData stream) { + stream.writeInt32(constructor); + stream.writeInt32(date); + stream.writeBool(test_mode); + stream.writeInt32(this_dc); + stream.writeInt32(0x1cb5c415); + int count = dc_options.size(); + stream.writeInt32(count); + for (TL_dcOption dc_option : dc_options) { + dc_option.serializeToStream(stream); + } + stream.writeInt32(chat_size_max); + stream.writeInt32(broadcast_size_max); + } + } + public static class TL_document_old extends TL_document { public static int constructor = 0x9efc6326; diff --git a/TMessagesProj/src/main/java/org/telegram/messenger/UserConfig.java b/TMessagesProj/src/main/java/org/telegram/messenger/UserConfig.java index 6094e479c..6974ca94c 100644 --- a/TMessagesProj/src/main/java/org/telegram/messenger/UserConfig.java +++ b/TMessagesProj/src/main/java/org/telegram/messenger/UserConfig.java @@ -80,6 +80,7 @@ public class UserConfig { currentUser.serializeToStream(data); String userString = Base64.encodeToString(data.toByteArray(), Base64.DEFAULT); editor.putString("user", userString); + data.cleanup(); } } else { editor.remove("user"); @@ -184,6 +185,7 @@ public class UserConfig { if (lastSendMessageId > -210000) { lastSendMessageId = -210000; } + data.cleanup(); Utilities.stageQueue.postRunnable(new Runnable() { @Override public void run() { @@ -218,6 +220,7 @@ public class UserConfig { if (userBytes != null) { SerializedData data = new SerializedData(userBytes); currentUser = (TLRPC.TL_userSelf)TLClassStore.Instance().TLdeserialize(data, data.readInt32()); + data.cleanup(); } } } diff --git a/TMessagesProj/src/main/java/org/telegram/messenger/Utilities.java b/TMessagesProj/src/main/java/org/telegram/messenger/Utilities.java index 770b439af..47e2c951b 100644 --- a/TMessagesProj/src/main/java/org/telegram/messenger/Utilities.java +++ b/TMessagesProj/src/main/java/org/telegram/messenger/Utilities.java @@ -39,7 +39,6 @@ import java.io.InputStream; import java.io.OutputStream; import java.math.BigInteger; import java.nio.ByteBuffer; -import java.nio.channels.FileChannel; import java.security.KeyFactory; import java.security.MessageDigest; import java.security.PublicKey; @@ -97,6 +96,7 @@ public class Utilities { for (int a = 0; a < count; a++) { goodPrimes.add(data.readString()); } + data.cleanup(); } } catch (Exception e) { FileLog.e("tmessages", e); @@ -229,6 +229,7 @@ public class Utilities { data.writeString(pr); } byte[] bytes = data.toByteArray(); + data.cleanup(); SharedPreferences preferences = ApplicationLoader.applicationContext.getSharedPreferences("primes", Context.MODE_PRIVATE); SharedPreferences.Editor editor = preferences.edit(); editor.putString("primes", Base64.encodeToString(bytes, Base64.DEFAULT)); @@ -364,35 +365,41 @@ public class Utilities { data.writeRaw(messageKey); data.writeRaw(authKey, x, 32); byte[] sha1_a = Utilities.computeSHA1(data.toByteArray()); + data.cleanup(); data = new SerializedData(); data.writeRaw(authKey, 32 + x, 16); data.writeRaw(messageKey); data.writeRaw(authKey, 48 + x, 16); byte[] sha1_b = Utilities.computeSHA1(data.toByteArray()); + data.cleanup(); data = new SerializedData(); data.writeRaw(authKey, 64 + x, 32); data.writeRaw(messageKey); byte[] sha1_c = Utilities.computeSHA1(data.toByteArray()); + data.cleanup(); data = new SerializedData(); data.writeRaw(messageKey); data.writeRaw(authKey, 96 + x, 32); byte[] sha1_d = Utilities.computeSHA1(data.toByteArray()); + data.cleanup(); - SerializedData aesKey = new SerializedData(); - aesKey.writeRaw(sha1_a, 0, 8); - aesKey.writeRaw(sha1_b, 8, 12); - aesKey.writeRaw(sha1_c, 4, 12); - keyData.aesKey = aesKey.toByteArray(); + data = new SerializedData(); + data.writeRaw(sha1_a, 0, 8); + data.writeRaw(sha1_b, 8, 12); + data.writeRaw(sha1_c, 4, 12); + keyData.aesKey = data.toByteArray(); + data.cleanup(); - SerializedData aesIv = new SerializedData(); - aesIv.writeRaw(sha1_a, 8, 12); - aesIv.writeRaw(sha1_b, 0, 8); - aesIv.writeRaw(sha1_c, 16, 4); - aesIv.writeRaw(sha1_d, 0, 8); - keyData.aesIv = aesIv.toByteArray(); + data = new SerializedData(); + data.writeRaw(sha1_a, 8, 12); + data.writeRaw(sha1_b, 0, 8); + data.writeRaw(sha1_c, 16, 4); + data.writeRaw(sha1_d, 0, 8); + keyData.aesIv = data.toByteArray(); + data.cleanup(); return keyData; } @@ -409,10 +416,25 @@ public class Utilities { while ((bytesRead = gis.read(data)) != -1) { bytesOutput.write(data, 0, bytesRead); } - gis.close(); - is.close(); + try { + gis.close(); + } catch (Exception e) { + FileLog.e("tmessages", e); + } + try { + is.close(); + } catch (Exception e) { + FileLog.e("tmessages", e); + } SerializedData stream = new SerializedData(bytesOutput.toByteArray()); - return TLClassStore.Instance().TLdeserialize(stream, stream.readInt32(), parentObject); + try { + bytesOutput.close(); + } catch (Exception e) { + FileLog.e("tmessages", e); + } + TLObject object = TLClassStore.Instance().TLdeserialize(stream, stream.readInt32(), parentObject); + stream.cleanup(); + return object; } catch (IOException e) { FileLog.e("tmessages", e); } @@ -433,6 +455,12 @@ public class Utilities { packedData = bytesStream.toByteArray(); } catch (IOException e) { FileLog.e("tmessages", e); + } finally { + try { + bytesStream.close(); + } catch (Exception e) { + FileLog.e("tmessages", e); + } } return packedData; } @@ -450,23 +478,23 @@ public class Utilities { } public static boolean copyFile(File sourceFile, File destFile) throws IOException { - if(!destFile.exists()) { + if (!destFile.exists()) { destFile.createNewFile(); } - FileChannel source = null; - FileChannel destination = null; + FileInputStream source = null; + FileOutputStream destination = null; try { - source = new FileInputStream(sourceFile).getChannel(); - destination = new FileOutputStream(destFile).getChannel(); - destination.transferFrom(source, 0, source.size()); + source = new FileInputStream(sourceFile); + destination = new FileOutputStream(destFile); + destination.getChannel().transferFrom(source.getChannel(), 0, source.getChannel().size()); } catch (Exception e) { FileLog.e("tmessages", e); return false; } finally { - if(source != null) { + if (source != null) { source.close(); } - if(destination != null) { + if (destination != null) { destination.close(); } } @@ -712,7 +740,13 @@ public class Utilities { buffer.write(b); } } - return buffer.toByteArray(); + byte[] array = buffer.toByteArray(); + try { + buffer.close(); + } catch (Exception e) { + FileLog.e("tmessages", e); + } + return array; } public static void checkForCrashes(Activity context) { diff --git a/TMessagesProj/src/main/java/org/telegram/ui/ActionBar/BaseFragment.java b/TMessagesProj/src/main/java/org/telegram/ui/ActionBar/BaseFragment.java index 46d04896f..91fa7dc3d 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/ActionBar/BaseFragment.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/ActionBar/BaseFragment.java @@ -201,7 +201,7 @@ public class BaseFragment { return true; } - protected void showAlertDialog(AlertDialog.Builder builder) { + public void showAlertDialog(AlertDialog.Builder builder) { if (parentLayout == null || parentLayout.checkTransitionAnimation() || parentLayout.animationInProgress || parentLayout.startedTracking) { return; } diff --git a/TMessagesProj/src/main/java/org/telegram/ui/ChangePhoneActivity.java b/TMessagesProj/src/main/java/org/telegram/ui/ChangePhoneActivity.java index 181158062..18f5423df 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/ChangePhoneActivity.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/ChangePhoneActivity.java @@ -544,6 +544,7 @@ public class ChangePhoneActivity extends BaseFragment { codesMap.put(args[0], args[2]); languageMap.put(args[1], args[2]); } + reader.close(); } catch (Exception e) { FileLog.e("tmessages", e); } diff --git a/TMessagesProj/src/main/java/org/telegram/ui/ChatActivity.java b/TMessagesProj/src/main/java/org/telegram/ui/ChatActivity.java index cc10f3dd0..de91e2207 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/ChatActivity.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/ChatActivity.java @@ -481,6 +481,33 @@ public class ChatActivity extends BaseFragment implements NotificationCenter.Not actionBar.setActionBarMenuOnItemClick(new ActionBar.ActionBarMenuOnItemClick() { @Override public void onItemClick(final int id) { + if (id == attach_photo || id == attach_gallery || id == attach_document || id == attach_video) { + String action = null; + if (currentChat != null) { + if (currentChat.participants_count > MessagesController.getInstance().groupBigSize) { + if (id == attach_photo || id == attach_gallery) { + action = "bigchat_upload_photo"; + } else { + action = "bigchat_upload_document"; + } + } else { + if (id == attach_photo || id == attach_gallery) { + action = "chat_upload_photo"; + } else { + action = "chat_upload_document"; + } + } + } else { + if (id == attach_photo || id == attach_gallery) { + action = "pm_upload_photo"; + } else { + action = "pm_upload_document"; + } + } + if (action != null && !MessagesController.isFeatureEnabled(action, ChatActivity.this)) { + return; + } + } if (id == -1) { finishFragment(); } else if (id == -2) { @@ -1001,7 +1028,7 @@ public class ChatActivity extends BaseFragment implements NotificationCenter.Not if (currentEncryptedChat == null) { TextView emptyView = new TextView(getParentActivity()); - if (currentUser != null && (currentUser.id / 1000 == 333 || currentUser.id % 1000 == 0)) { + if (currentUser != null && currentUser.id != 777000 && (currentUser.id / 1000 == 333 || currentUser.id % 1000 == 0)) { emptyView.setText(LocaleController.getString("GotAQuestion", R.string.GotAQuestion)); } else { emptyView.setText(LocaleController.getString("NoMessages", R.string.NoMessages)); @@ -1324,7 +1351,7 @@ public class ChatActivity extends BaseFragment implements NotificationCenter.Not if (chatActivityEnterView != null) { chatActivityEnterView.onDestroy(); } - chatActivityEnterView = new ChatActivityEnterView(getParentActivity(), contentView, true); + chatActivityEnterView = new ChatActivityEnterView(getParentActivity(), contentView, this, true); chatActivityEnterView.setDialogId(dialog_id); chatActivityEnterView.addToAttachLayout(menuItem); chatActivityEnterView.setId(id_chat_compose_panel); diff --git a/TMessagesProj/src/main/java/org/telegram/ui/Components/AvatarDrawable.java b/TMessagesProj/src/main/java/org/telegram/ui/Components/AvatarDrawable.java index 5538b2233..962d8fe5c 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/Components/AvatarDrawable.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/Components/AvatarDrawable.java @@ -182,7 +182,7 @@ public class AvatarDrawable extends Drawable { } lastch = lastName.substring(a, a + 1); } - if (Build.VERSION.SDK_INT >= 14) { + if (Build.VERSION.SDK_INT >= 16) { text += "\u200C" + lastch; } else { text += lastch; @@ -191,7 +191,7 @@ public class AvatarDrawable extends Drawable { for (int a = firstName.length() - 1; a >= 0; a--) { if (firstName.charAt(a) == ' ') { if (a != firstName.length() - 1 && firstName.charAt(a + 1) != ' ') { - if (Build.VERSION.SDK_INT >= 14) { + if (Build.VERSION.SDK_INT >= 16) { text += "\u200C" + firstName.substring(a + 1, a + 2); } else { text += firstName.substring(a + 1, a + 2); diff --git a/TMessagesProj/src/main/java/org/telegram/ui/Components/ChatActivityEnterView.java b/TMessagesProj/src/main/java/org/telegram/ui/Components/ChatActivityEnterView.java index dbf865a97..33fd87355 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/Components/ChatActivityEnterView.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/Components/ChatActivityEnterView.java @@ -47,6 +47,7 @@ import org.telegram.android.NotificationCenter; import org.telegram.messenger.R; import org.telegram.messenger.TLRPC; import org.telegram.messenger.UserConfig; +import org.telegram.ui.ActionBar.BaseFragment; import org.telegram.ui.AnimationCompat.AnimatorListenerAdapterProxy; import org.telegram.ui.AnimationCompat.AnimatorSetProxy; import org.telegram.ui.AnimationCompat.ObjectAnimatorProxy; @@ -96,11 +97,12 @@ public class ChatActivityEnterView extends LinearLayout implements NotificationC private boolean recordingAudio; private Activity parentActivity; + private BaseFragment parentFragment; private long dialog_id; private boolean ignoreTextChange; private ChatActivityEnterViewDelegate delegate; - public ChatActivityEnterView(Activity context, SizeNotifierRelativeLayout parent, boolean isChat) { + public ChatActivityEnterView(Activity context, SizeNotifierRelativeLayout parent, BaseFragment fragment, boolean isChat) { super(context); setOrientation(HORIZONTAL); setBackgroundResource(R.drawable.compose_panel); @@ -117,6 +119,7 @@ public class ChatActivityEnterView extends LinearLayout implements NotificationC NotificationCenter.getInstance().addObserver(this, NotificationCenter.hideEmojiKeyboard); NotificationCenter.getInstance().addObserver(this, NotificationCenter.audioRouteChanged); parentActivity = context; + parentFragment = fragment; sizeNotifierRelativeLayout = parent; sizeNotifierRelativeLayout.setDelegate(this); SharedPreferences preferences = ApplicationLoader.applicationContext.getSharedPreferences("mainconfig", Activity.MODE_PRIVATE); @@ -148,20 +151,6 @@ public class ChatActivityEnterView extends LinearLayout implements NotificationC } }); - /* - - */ - messsageEditText = new EditText(context); messsageEditText.setHint(LocaleController.getString("TypeMessage", R.string.TypeMessage)); messsageEditText.setImeOptions(EditorInfo.IME_FLAG_NO_EXTRACT_UI); @@ -383,6 +372,23 @@ public class ChatActivityEnterView extends LinearLayout implements NotificationC @Override public boolean onTouch(View view, MotionEvent motionEvent) { if (motionEvent.getAction() == MotionEvent.ACTION_DOWN) { + if (parentFragment != null) { + String action = null; + TLRPC.Chat currentChat = null; + if ((int) dialog_id < 0) { + currentChat = MessagesController.getInstance().getChat(-(int) dialog_id); + if (currentChat != null && currentChat.participants_count > MessagesController.getInstance().groupBigSize) { + action = "bigchat_upload_audio"; + } else { + action = "chat_upload_audio"; + } + } else { + action = "pm_upload_audio"; + } + if (!MessagesController.isFeatureEnabled(action, parentFragment)) { + return false; + } + } startedDraggingX = -1; MediaController.getInstance().startRecording(dialog_id); updateAudioRecordIntefrace(); @@ -488,6 +494,23 @@ public class ChatActivityEnterView extends LinearLayout implements NotificationC } private void sendMessage() { + if (parentFragment != null) { + String action = null; + TLRPC.Chat currentChat = null; + if ((int) dialog_id < 0) { + currentChat = MessagesController.getInstance().getChat(-(int) dialog_id); + if (currentChat != null && currentChat.participants_count > MessagesController.getInstance().groupBigSize) { + action = "bigchat_message"; + } else { + action = "chat_message"; + } + } else { + action = "pm_message"; + } + if (!MessagesController.isFeatureEnabled(action, parentFragment)) { + return; + } + } if (processSendingText(messsageEditText.getText().toString())) { messsageEditText.setText(""); lastTypingTimeSend = 0; diff --git a/TMessagesProj/src/main/java/org/telegram/ui/Components/PhotoFilterLinearBlurControl.java b/TMessagesProj/src/main/java/org/telegram/ui/Components/PhotoFilterLinearBlurControl.java new file mode 100644 index 000000000..86e4505f7 --- /dev/null +++ b/TMessagesProj/src/main/java/org/telegram/ui/Components/PhotoFilterLinearBlurControl.java @@ -0,0 +1,417 @@ +/* + * This is the source code of Telegram for Android v. 2.x + * It is licensed under GNU GPL v. 2 or later. + * You should have received a copy of the license in this archive (see LICENSE). + * + * Copyright Nikolai Kudashov, 2013-2015. + */ + +package org.telegram.ui.Components; + +import android.content.Context; +import android.graphics.Canvas; +import android.graphics.PointF; +import android.graphics.RectF; +import android.util.SizeF; +import android.widget.FrameLayout; + +public class PhotoFilterLinearBlurControl extends FrameLayout { + + private final static float LinearBlurInsetProximity = 20; + private final static float LinearBlurMinimumFalloff = 0.1f; + private final static float LinearBlurMinimumDifference = 0.02f; + private final static float LinearBlurViewCenterInset = 30.0f; + private final static float LinearBlurViewRadiusInset = 30.0f; + + private enum LinearBlurViewActiveControl { + TGLinearBlurViewActiveControlNone, + TGLinearBlurViewActiveControlCenter, + TGLinearBlurViewActiveControlInnerRadius, + TGLinearBlurViewActiveControlOuterRadius, + TGLinearBlurViewActiveControlWholeArea, + TGLinearBlurViewActiveControlRotation + } + + private LinearBlurViewActiveControl activeControl; + private PointF startCenterPoint = new PointF(); + private PointF startDistance = new PointF(); + private PointF startRadius = new PointF(); + private boolean isTracking; + private SizeF actualAreaSize; + private PointF centerPoint; + private float falloff; + private float size; + private float angle; + + //@property (nonatomic, copy) void (^valueChanged)(CGPoint centerPoint, CGFloat falloff, CGFloat size, CGFloat angle); + //@property (nonatomic, copy) void(^interactionEnded)(void); + //UILongPressGestureRecognizer *_pressGestureRecognizer; + //UIPanGestureRecognizer *_panGestureRecognizer; + //UIPinchGestureRecognizer *_pinchGestureRecognizer; + + public PhotoFilterLinearBlurControl(Context context) { + super(context); + + setWillNotDraw(false); + + centerPoint = new PointF(0.5f, 0.5f); + falloff = 0.15f; + size = 0.35f; + + /*_pressGestureRecognizer = [[UILongPressGestureRecognizer alloc] initWithTarget:self action:@selector(handlePress:)]; + _pressGestureRecognizer.delegate = self; + _pressGestureRecognizer.minimumPressDuration = 0.1f; + [self addGestureRecognizer:_pressGestureRecognizer]; + + _panGestureRecognizer = [[UIPanGestureRecognizer alloc] initWithTarget:self action:@selector(handlePan:)]; + _panGestureRecognizer.delegate = self; + [self addGestureRecognizer:_panGestureRecognizer]; + + _pinchGestureRecognizer = [[UIPinchGestureRecognizer alloc] initWithTarget:self action:@selector(handlePinch:)]; + _pinchGestureRecognizer.delegate = self; + [self addGestureRecognizer:_pinchGestureRecognizer];*/ + } + + + private void handlePress() { + /*switch (gestureRecognizer.state) { + case UIGestureRecognizerStateBegan: + [self setSelected:true animated:true]; + break; + + case UIGestureRecognizerStateEnded: + case UIGestureRecognizerStateCancelled: + case UIGestureRecognizerStateFailed: + [self setSelected:false animated:true]; + break; + + default: + break; + }*/ + } + + private void handlePan() { + /*CGPoint location = [gestureRecognizer locationInView:self]; + CGPoint centerPoint = [self _actualCenterPoint]; + CGPoint delta = CGPointMake(location.x - centerPoint.x, location.y - centerPoint.y); + CGFloat radialDistance = sqrtf(delta.x * delta.x + delta.y * delta.y); + CGFloat distance = fabsf(delta.x * cosf(self.angle + (CGFloat)M_PI_2) + delta.y * sinf(self.angle + (CGFloat)M_PI_2)); + + CGFloat shorterSide = (self.actualAreaSize.width > self.actualAreaSize.height) ? self.actualAreaSize.height : self.actualAreaSize.width; + + CGFloat innerRadius = shorterSide * self.falloff; + CGFloat outerRadius = shorterSide * self.size; + + switch (gestureRecognizer.state) { + case UIGestureRecognizerStateBegan: + { + bool close = fabsf(outerRadius - innerRadius) < TGLinearBlurInsetProximity; + CGFloat innerRadiusOuterInset = close ? 0 : TGLinearBlurViewRadiusInset; + CGFloat outerRadiusInnerInset = close ? 0 : TGLinearBlurViewRadiusInset; + + if (radialDistance < TGLinearBlurViewCenterInset) + { + _activeControl = TGLinearBlurViewActiveControlCenter; + _startCenterPoint = centerPoint; + } + else if (distance > innerRadius - TGLinearBlurViewRadiusInset && distance < innerRadius + innerRadiusOuterInset) + { + _activeControl = TGLinearBlurViewActiveControlInnerRadius; + _startDistance = distance; + _startRadius = innerRadius; + } + else if (distance > outerRadius - outerRadiusInnerInset && distance < outerRadius + TGLinearBlurViewRadiusInset) + { + _activeControl = TGLinearBlurViewActiveControlOuterRadius; + _startDistance = distance; + _startRadius = outerRadius; + } + else if (distance <= innerRadius - TGLinearBlurViewRadiusInset || distance >= outerRadius + TGLinearBlurViewRadiusInset) + { + _activeControl = TGLinearBlurViewActiveControlRotation; + } + + [self setSelected:true animated:true]; + } + break; + + case UIGestureRecognizerStateChanged: + { + switch (_activeControl) + { + case TGLinearBlurViewActiveControlCenter: + { + CGPoint translation = [gestureRecognizer translationInView:self]; + + CGRect actualArea = CGRectMake((self.frame.size.width - self.actualAreaSize.width) / 2, (self.frame.size.height - self.actualAreaSize.height) / 2, self.actualAreaSize.width, self.actualAreaSize.height); + + CGPoint newPoint = CGPointMake(MAX(CGRectGetMinX(actualArea), MIN(CGRectGetMaxX(actualArea), _startCenterPoint.x + translation.x)), + MAX(CGRectGetMinY(actualArea), MIN(CGRectGetMaxY(actualArea), _startCenterPoint.y + translation.y))); + + CGPoint offset = CGPointMake(0, (self.actualAreaSize.width - self.actualAreaSize.height) / 2); + CGPoint actualPoint = CGPointMake(newPoint.x - actualArea.origin.x, newPoint.y - actualArea.origin.y); + self.centerPoint = CGPointMake((actualPoint.x + offset.x) / self.actualAreaSize.width, (actualPoint.y + offset.y) / self.actualAreaSize.width); + } + break; + + case TGLinearBlurViewActiveControlInnerRadius: + { + CGFloat delta = distance - _startDistance; + self.falloff = MIN(MAX(TGLinearBlurMinimumFalloff, (_startRadius + delta) / shorterSide), self.size - TGLinearBlurMinimumDifference); + } + break; + + case TGLinearBlurViewActiveControlOuterRadius: + { + CGFloat delta = distance - _startDistance; + self.size = MAX(self.falloff + TGLinearBlurMinimumDifference, (_startRadius + delta) / shorterSide); + } + break; + + case TGLinearBlurViewActiveControlRotation: + { + CGPoint translation = [gestureRecognizer translationInView:self]; + bool clockwise = false; + + bool right = location.x > centerPoint.x; + bool bottom = location.y > centerPoint.y; + + if (!right && !bottom) + { + if (fabsf(translation.y) > fabsf(translation.x)) + { + if (translation.y < 0) + clockwise = true; + } + else + { + if (translation.x > 0) + clockwise = true; + } + } + else if (right && !bottom) + { + if (fabsf(translation.y) > fabsf(translation.x)) + { + if (translation.y > 0) + clockwise = true; + } + else + { + if (translation.x > 0) + clockwise = true; + } + } + else if (right && bottom) + { + if (fabsf(translation.y) > fabsf(translation.x)) + { + if (translation.y > 0) + clockwise = true; + } + else + { + if (translation.x < 0) + clockwise = true; + } + } + else + { + if (fabsf(translation.y) > fabsf(translation.x)) + { + if (translation.y < 0) + clockwise = true; + } + else + { + if (translation.x < 0) + clockwise = true; + } + } + + CGFloat delta = sqrtf(translation.x * translation.x + translation.y * translation.y); + + CGFloat angleInDegrees = TGRadiansToDegrees(_angle); + CGFloat newAngleInDegrees = angleInDegrees + delta * (clockwise * 2 - 1) / (CGFloat)M_PI / 1.15f; + + _angle = TGDegreesToRadians(newAngleInDegrees); + + [gestureRecognizer setTranslation:CGPointZero inView:self]; + } + break; + + default: + break; + } + + [self setNeedsDisplay]; + + if (self.valueChanged != nil) + self.valueChanged(self.centerPoint, self.falloff, self.size, self.angle); + } + break; + + case UIGestureRecognizerStateEnded: + case UIGestureRecognizerStateCancelled: + case UIGestureRecognizerStateFailed: + { + _activeControl = TGLinearBlurViewActiveControlNone; + + [self setSelected:false animated:true]; + + if (self.interactionEnded != nil) + self.interactionEnded(); + } + break; + + default: + break; + }*/ + } + + private void handlePinch() { + /*switch (gestureRecognizer.state) { + case UIGestureRecognizerStateBegan: { + _activeControl = TGLinearBlurViewActiveControlWholeArea; + [self setSelected:true animated:true]; + } + case UIGestureRecognizerStateChanged: { + CGFloat scale = gestureRecognizer.scale; + + self.falloff = MAX(TGLinearBlurMinimumFalloff, self.falloff * scale); + self.size = MAX(self.falloff + TGLinearBlurMinimumDifference, self.size * scale); + + gestureRecognizer.scale = 1.0f; + + [self setNeedsDisplay]; + + if (self.valueChanged != nil) + self.valueChanged(self.centerPoint, self.falloff, self.size, self.angle); + } + break; + + case UIGestureRecognizerStateEnded: { + _activeControl = TGLinearBlurViewActiveControlNone; + [self setSelected:false animated:true]; + } + break; + + case UIGestureRecognizerStateCancelled: + case UIGestureRecognizerStateFailed: { + _activeControl = TGLinearBlurViewActiveControlNone; + [self setSelected:false animated:true]; + } + break; + + default: + break; + }*/ + } + + /*- (BOOL)gestureRecognizerShouldBegin:(UIGestureRecognizer *)gestureRecognizer + { + if (gestureRecognizer == _pressGestureRecognizer || gestureRecognizer == _panGestureRecognizer) + { + CGPoint location = [gestureRecognizer locationInView:self]; + CGPoint centerPoint = [self _actualCenterPoint]; + CGPoint delta = CGPointMake(location.x - centerPoint.x, location.y - centerPoint.y); + CGFloat radialDistance = sqrtf(delta.x * delta.x + delta.y * delta.y); + CGFloat distance = fabsf(delta.x * cosf(self.angle + (CGFloat)M_PI_2) + delta.y * sinf(self.angle + (CGFloat)M_PI_2)); + + CGFloat innerRadius = [self _actualInnerRadius]; + CGFloat outerRadius = [self _actualOuterRadius]; + + bool close = fabsf(outerRadius - innerRadius) < TGLinearBlurInsetProximity; + CGFloat innerRadiusOuterInset = close ? 0 : TGLinearBlurViewRadiusInset; + CGFloat outerRadiusInnerInset = close ? 0 : TGLinearBlurViewRadiusInset; + + if (radialDistance < TGLinearBlurViewCenterInset && gestureRecognizer == _panGestureRecognizer) + return true; + else if (distance > innerRadius - TGLinearBlurViewRadiusInset && distance < innerRadius + innerRadiusOuterInset) + return true; + else if (distance > outerRadius - outerRadiusInnerInset && distance < outerRadius + TGLinearBlurViewRadiusInset) + return true; + else if ((distance <= innerRadius - TGLinearBlurViewRadiusInset) || distance >= outerRadius + TGLinearBlurViewRadiusInset) + return true; + + return false; + } + + return true; + } + + - (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldRecognizeSimultaneouslyWithGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizer + { + if (gestureRecognizer == _pressGestureRecognizer || otherGestureRecognizer == _pressGestureRecognizer) + return true; + + return false; + }*/ + + private void setSelected(boolean selected, boolean animated) { + /*if (animated) { + [UIView animateWithDuration:0.16f delay:0.0f options:UIViewAnimationOptionBeginFromCurrentState animations:^ + { + self.alpha = selected ? 0.6f : 1.0f; + } completion:nil]; + } else { + self.alpha = selected ? 0.6f : 1.0f; + }*/ + } + + @Override + protected void onDraw(Canvas canvas) { + super.onDraw(canvas); + + /*PointF centerPoint = getActualCenterPoint(); + float innerRadius = getActualInnerRadius(); + float outerRadius = getActualOuterRadius(); + + CGContextTranslateCTM(context, centerPoint.x, centerPoint.y); + CGContextRotateCTM(context, self.angle); + + CGContextSetFillColorWithColor(context, [UIColor whiteColor].CGColor); + CGContextSetShadowWithColor(context, CGSizeZero, 2.5f, [UIColor colorWithWhite:0.0f alpha:0.3f].CGColor); + + float space = 6.0f; + float length = 12.0f; + float thickness = 1.5f; + for (int i = 0; i < 30; i++) { + CGContextAddRect(context, CGRectMake(i * (length + space), -innerRadius, length, thickness)); + CGContextAddRect(context, CGRectMake(-i * (length + space) - space - length, -innerRadius, length, thickness)); + + CGContextAddRect(context, CGRectMake(i * (length + space), innerRadius, length, thickness)); + CGContextAddRect(context, CGRectMake(-i * (length + space) - space - length, innerRadius, length, thickness)); + } + + length = 6.0f; + thickness = 1.5f; + for (int i = 0; i < 64; i++) { + CGContextAddRect(context, CGRectMake(i * (length + space), -outerRadius, length, thickness)); + CGContextAddRect(context, CGRectMake(-i * (length + space) - space - length, -outerRadius, length, thickness)); + + CGContextAddRect(context, CGRectMake(i * (length + space), outerRadius, length, thickness)); + CGContextAddRect(context, CGRectMake(-i * (length + space) - space - length, outerRadius, length, thickness)); + } + + CGContextFillPath(context); + + CGContextFillEllipseInRect(context, CGRectMake(-16 / 2, - 16 / 2, 16, 16));*/ + } + + private PointF getActualCenterPoint() { + RectF actualArea = new RectF((getWidth() - actualAreaSize.getWidth()) / 2, (getHeight() - actualAreaSize.getHeight()) / 2, actualAreaSize.getWidth(), actualAreaSize.getHeight()); + PointF offset = new PointF(0, (actualAreaSize.getWidth() - actualAreaSize.getHeight()) / 2); + return new PointF(actualArea.left - offset.x + centerPoint.x * actualAreaSize.getWidth(), actualArea.top - offset.y + centerPoint.y * actualAreaSize.getWidth()); + } + + private float getActualInnerRadius() { + float shorterSide = (actualAreaSize.getWidth() > actualAreaSize.getHeight()) ? actualAreaSize.getHeight() : actualAreaSize.getWidth(); + return shorterSide * falloff; + } + + private float getActualOuterRadius() { + float shorterSide = (actualAreaSize.getWidth() > actualAreaSize.getHeight()) ? actualAreaSize.getHeight() : actualAreaSize.getWidth(); + return shorterSide * size; + } +} diff --git a/TMessagesProj/src/main/java/org/telegram/ui/Components/PhotoFilterRadialBlurControl.java b/TMessagesProj/src/main/java/org/telegram/ui/Components/PhotoFilterRadialBlurControl.java new file mode 100644 index 000000000..1dd438fb0 --- /dev/null +++ b/TMessagesProj/src/main/java/org/telegram/ui/Components/PhotoFilterRadialBlurControl.java @@ -0,0 +1,12 @@ +/* + * This is the source code of Telegram for Android v. 2.x + * It is licensed under GNU GPL v. 2 or later. + * You should have received a copy of the license in this archive (see LICENSE). + * + * Copyright Nikolai Kudashov, 2013-2015. + */ + +package org.telegram.ui.Components; + +public class PhotoFilterRadialBlurControl { +} diff --git a/TMessagesProj/src/main/java/org/telegram/ui/Components/PhotoFilterView.java b/TMessagesProj/src/main/java/org/telegram/ui/Components/PhotoFilterView.java index 140b4e248..2037f1d13 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/Components/PhotoFilterView.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/Components/PhotoFilterView.java @@ -71,6 +71,7 @@ public class PhotoFilterView extends FrameLayout { private int shadowsTool = 6; private int vignetteTool = 7; private int grainTool = 8; + private int blurTool = -1; private int sharpenTool = 9; private float highlightsValue = 0; //0 100 @@ -1028,6 +1029,10 @@ public class PhotoFilterView extends FrameLayout { orientation = rotation; textureView = new TextureView(context); + if (Build.VERSION.SDK_INT == 14 || Build.VERSION.SDK_INT == 15) { + //setLayerType(LAYER_TYPE_HARDWARE, null); + //textureView.setLayerType(LAYER_TYPE_HARDWARE, null); + } addView(textureView); textureView.setVisibility(INVISIBLE); LayoutParams layoutParams = (LayoutParams) textureView.getLayoutParams(); @@ -1176,10 +1181,12 @@ public class PhotoFilterView extends FrameLayout { previousValue = grainValue; valueSeekBar.setMinMax(0, 100); paramTextView.setText(LocaleController.getString("Grain", R.string.Grain)); - } else if (i == sharpenTool) { + } else if (i == sharpenTool) { previousValue = sharpenValue; valueSeekBar.setMinMax(0, 100); paramTextView.setText(LocaleController.getString("Sharpen", R.string.Sharpen)); + } else if (i == blurTool) { + } valueSeekBar.setProgress((int) previousValue, false); updateValueTextView(); @@ -1239,7 +1246,9 @@ public class PhotoFilterView extends FrameLayout { } else if (selectedTool == sharpenTool) { sharpenValue = previousValue; } - eglThread.requestRender(); + if (eglThread != null) { + eglThread.requestRender(); + } switchToOrFromEditMode(); } }); @@ -1641,6 +1650,8 @@ public class PhotoFilterView extends FrameLayout { ((PhotoEditToolCell) holder.itemView).setIconAndTextAndValue(R.drawable.tool_grain, LocaleController.getString("Grain", R.string.Grain), grainValue); } else if (i == sharpenTool) { ((PhotoEditToolCell) holder.itemView).setIconAndTextAndValue(R.drawable.tool_details, LocaleController.getString("Sharpen", R.string.Sharpen), sharpenValue); + } else if (i == blurTool) { + ((PhotoEditToolCell) holder.itemView).setIconAndTextAndValue(R.drawable.tool_details, LocaleController.getString("Blur", R.string.Blur), 0); //TODO add value } } } diff --git a/TMessagesProj/src/main/java/org/telegram/ui/ContactsActivity.java b/TMessagesProj/src/main/java/org/telegram/ui/ContactsActivity.java index 9e44dcc0d..6720dce7b 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/ContactsActivity.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/ContactsActivity.java @@ -302,6 +302,9 @@ public class ContactsActivity extends BaseFragment implements NotificationCenter } } else { if (row == 0) { + if (!MessagesController.isFeatureEnabled("chat_create", ContactsActivity.this)) { + return; + } presentFragment(new GroupCreateActivity(), false); } else if (row == 1) { Bundle args = new Bundle(); @@ -310,6 +313,9 @@ public class ContactsActivity extends BaseFragment implements NotificationCenter args.putBoolean("createSecretChat", true); presentFragment(new ContactsActivity(args), false); } else if (row == 2) { + if (!MessagesController.isFeatureEnabled("broadcast_create", ContactsActivity.this)) { + return; + } Bundle args = new Bundle(); args.putBoolean("broadcast", true); presentFragment(new GroupCreateActivity(args), false); diff --git a/TMessagesProj/src/main/java/org/telegram/ui/LaunchActivity.java b/TMessagesProj/src/main/java/org/telegram/ui/LaunchActivity.java index 952492d01..2355535fb 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/LaunchActivity.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/LaunchActivity.java @@ -266,6 +266,9 @@ public class LaunchActivity extends Activity implements ActionBarLayout.ActionBa @Override public void onItemClick(AdapterView parent, View view, int position, long id) { if (position == 2) { + if (!MessagesController.isFeatureEnabled("chat_create", actionBarLayout.fragmentsStack.get(actionBarLayout.fragmentsStack.size() - 1))) { + return; + } presentFragment(new GroupCreateActivity()); drawerLayoutContainer.closeDrawer(false); } else if (position == 3) { @@ -276,6 +279,9 @@ public class LaunchActivity extends Activity implements ActionBarLayout.ActionBa presentFragment(new ContactsActivity(args)); drawerLayoutContainer.closeDrawer(false); } else if (position == 4) { + if (!MessagesController.isFeatureEnabled("broadcast_create", actionBarLayout.fragmentsStack.get(actionBarLayout.fragmentsStack.size() - 1))) { + return; + } Bundle args = new Bundle(); args.putBoolean("broadcast", true); presentFragment(new GroupCreateActivity(args)); @@ -546,6 +552,12 @@ public class LaunchActivity extends Activity implements ActionBarLayout.ActionBa } } } + try { + bufferedReader.close(); + stream.close(); + } catch (Exception e) { + FileLog.e("tmessages", e); + } if (name != null && !phones.isEmpty()) { contactsToSend = new ArrayList<>(); for (String phone : phones) { diff --git a/TMessagesProj/src/main/java/org/telegram/ui/LoginActivity.java b/TMessagesProj/src/main/java/org/telegram/ui/LoginActivity.java index 67f329f65..851d972cf 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/LoginActivity.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/LoginActivity.java @@ -58,6 +58,7 @@ import org.telegram.messenger.RPCRequest; import org.telegram.messenger.TLObject; import org.telegram.messenger.TLRPC; import org.telegram.messenger.UserConfig; +import org.telegram.messenger.Utilities; import org.telegram.ui.ActionBar.ActionBar; import org.telegram.ui.ActionBar.ActionBarMenu; import org.telegram.ui.ActionBar.BaseFragment; @@ -685,6 +686,7 @@ public class LoginActivity extends BaseFragment { codesMap.put(args[0], args[2]); languageMap.put(args[1], args[2]); } + reader.close(); } catch (Exception e) { FileLog.e("tmessages", e); } @@ -1233,6 +1235,12 @@ public class LoginActivity extends BaseFragment { MessagesController.getInstance().getBlockedUsers(true); needFinishActivity(); ConnectionsManager.getInstance().initPushConnection(); + Utilities.stageQueue.postRunnable(new Runnable() { + @Override + public void run() { + ConnectionsManager.getInstance().updateDcSettings(0); + } + }); } else { lastError = error.text; @@ -1536,6 +1544,12 @@ public class LoginActivity extends BaseFragment { MessagesController.getInstance().getBlockedUsers(true); needFinishActivity(); ConnectionsManager.getInstance().initPushConnection(); + Utilities.stageQueue.postRunnable(new Runnable() { + @Override + public void run() { + ConnectionsManager.getInstance().updateDcSettings(0); + } + }); } else { if (error.text.contains("PHONE_NUMBER_INVALID")) { needShowAlert(LocaleController.getString("InvalidPhoneNumber", R.string.InvalidPhoneNumber)); diff --git a/TMessagesProj/src/main/java/org/telegram/ui/MediaActivity.java b/TMessagesProj/src/main/java/org/telegram/ui/MediaActivity.java index b0b16d52f..4b328481e 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/MediaActivity.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/MediaActivity.java @@ -793,7 +793,7 @@ public class MediaActivity extends BaseFragment implements NotificationCenter.No emptyImageView.setVisibility(View.VISIBLE); if (selectedMode == 0) { listView.setAdapter(photoVideoAdapter); - dropDown.setText(LocaleController.getString("SharedMedia", R.string.SharedMedia)); + dropDown.setText(LocaleController.getString("SharedMediaTitle", R.string.SharedMediaTitle)); emptyImageView.setImageResource(R.drawable.tip1); emptyTextView.setText(LocaleController.getString("NoMedia", R.string.NoMedia)); searchItem.setVisibility(View.GONE); diff --git a/TMessagesProj/src/main/java/org/telegram/ui/NotificationsSettingsActivity.java b/TMessagesProj/src/main/java/org/telegram/ui/NotificationsSettingsActivity.java index 993396853..b35674fda 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/NotificationsSettingsActivity.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/NotificationsSettingsActivity.java @@ -753,7 +753,7 @@ public class NotificationsSettingsActivity extends BaseFragment implements Notif } else if (value == 1) { textCell.setTextAndValue(LocaleController.getString("Vibrate", R.string.Vibrate), LocaleController.getString("Short", R.string.Short), true); } else if (value == 2) { - textCell.setTextAndValue(LocaleController.getString("Vibrate", R.string.Vibrate), LocaleController.getString("Disabled", R.string.Disabled), true); + textCell.setTextAndValue(LocaleController.getString("Vibrate", R.string.Vibrate), LocaleController.getString("VibrationDisabled", R.string.VibrationDisabled), true); } else if (value == 3) { textCell.setTextAndValue(LocaleController.getString("Vibrate", R.string.Vibrate), LocaleController.getString("Long", R.string.Long), true); } diff --git a/TMessagesProj/src/main/java/org/telegram/ui/PhotoViewer.java b/TMessagesProj/src/main/java/org/telegram/ui/PhotoViewer.java index efd0e4df9..4cf2e10aa 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/PhotoViewer.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/PhotoViewer.java @@ -1875,7 +1875,7 @@ public class PhotoViewer implements NotificationCenter.NotificationCenterDelegat canShowBottom = false; Object obj = imagesArrLocals.get(index); cropItem.setVisibility(obj instanceof MediaController.PhotoEntry || obj instanceof MediaController.SearchImage && ((MediaController.SearchImage) obj).type == 0 ? View.VISIBLE : View.GONE); - if (Build.VERSION.SDK_INT >= 14) { + if (Build.VERSION.SDK_INT >= 16) { tuneItem.setVisibility(cropItem.getVisibility()); } updateSelectedCount(); @@ -2313,12 +2313,10 @@ public class PhotoViewer implements NotificationCenter.NotificationCenterDelegat } try { - if (windowView.getParent() != null) { - WindowManager wm = (WindowManager) parentActivity.getSystemService(Context.WINDOW_SERVICE); - wm.removeView(windowView); - } + WindowManager wm = (WindowManager) parentActivity.getSystemService(Context.WINDOW_SERVICE); + wm.removeView(windowView); } catch (Exception e) { - FileLog.e("tmessages", e); + //don't promt } WindowManager wm = (WindowManager) parentActivity.getSystemService(Context.WINDOW_SERVICE); diff --git a/TMessagesProj/src/main/java/org/telegram/ui/PopupNotificationActivity.java b/TMessagesProj/src/main/java/org/telegram/ui/PopupNotificationActivity.java index 3aac25c12..11c821ec0 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/PopupNotificationActivity.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/PopupNotificationActivity.java @@ -185,7 +185,7 @@ public class PopupNotificationActivity extends Activity implements NotificationC if (chatActivityEnterView != null) { chatActivityEnterView.onDestroy(); } - chatActivityEnterView = new ChatActivityEnterView(this, contentView, true); + chatActivityEnterView = new ChatActivityEnterView(this, contentView, null, true); popupContainer.addView(chatActivityEnterView); layoutParams3 = (RelativeLayout.LayoutParams) chatActivityEnterView.getLayoutParams(); layoutParams3.width = RelativeLayout.LayoutParams.MATCH_PARENT; diff --git a/TMessagesProj/src/main/java/org/telegram/ui/ProfileActivity.java b/TMessagesProj/src/main/java/org/telegram/ui/ProfileActivity.java index 94d875a90..ec241248f 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/ProfileActivity.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/ProfileActivity.java @@ -800,11 +800,13 @@ public class ProfileActivity extends BaseFragment implements NotificationCenter. updateProfileData(); } if ((mask & MessagesController.UPDATE_MASK_AVATAR) != 0 || (mask & MessagesController.UPDATE_MASK_NAME) != 0 || (mask & MessagesController.UPDATE_MASK_STATUS) != 0) { - int count = listView.getChildCount(); - for (int a = 0; a < count; a++) { - View child = listView.getChildAt(a); - if (child instanceof UserCell) { - ((UserCell) child).update(mask); + if (listView != null) { + int count = listView.getChildCount(); + for (int a = 0; a < count; a++) { + View child = listView.getChildAt(a); + if (child instanceof UserCell) { + ((UserCell) child).update(mask); + } } } } diff --git a/TMessagesProj/src/main/java/org/telegram/ui/ProfileNotificationsActivity.java b/TMessagesProj/src/main/java/org/telegram/ui/ProfileNotificationsActivity.java index 9f6a141a4..9e30daadc 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/ProfileNotificationsActivity.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/ProfileNotificationsActivity.java @@ -120,7 +120,7 @@ public class ProfileNotificationsActivity extends BaseFragment implements Notifi AlertDialog.Builder builder = new AlertDialog.Builder(getParentActivity()); builder.setTitle(LocaleController.getString("Vibrate", R.string.Vibrate)); builder.setItems(new CharSequence[] { - LocaleController.getString("Disabled", R.string.Disabled), + LocaleController.getString("VibrationDisabled", R.string.VibrationDisabled), LocaleController.getString("SettingsDefault", R.string.SettingsDefault), LocaleController.getString("SystemDefault", R.string.SystemDefault), LocaleController.getString("Short", R.string.Short), @@ -158,7 +158,7 @@ public class ProfileNotificationsActivity extends BaseFragment implements Notifi builder.setItems(new CharSequence[] { LocaleController.getString("Default", R.string.Default), LocaleController.getString("Enabled", R.string.Enabled), - LocaleController.getString("Disabled", R.string.Disabled) + LocaleController.getString("NotificationsDisabled", R.string.NotificationsDisabled) }, new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface d, int which) { @@ -402,7 +402,7 @@ public class ProfileNotificationsActivity extends BaseFragment implements Notifi } else if (value == 1) { textCell.setTextAndValue(LocaleController.getString("Vibrate", R.string.Vibrate), LocaleController.getString("Short", R.string.Short), true); } else if (value == 2) { - textCell.setTextAndValue(LocaleController.getString("Vibrate", R.string.Vibrate), LocaleController.getString("Disabled", R.string.Disabled), true); + textCell.setTextAndValue(LocaleController.getString("Vibrate", R.string.Vibrate), LocaleController.getString("VibrationDisabled", R.string.VibrationDisabled), true); } else if (value == 3) { textCell.setTextAndValue(LocaleController.getString("Vibrate", R.string.Vibrate), LocaleController.getString("Long", R.string.Long), true); } else if (value == 4) { @@ -415,7 +415,7 @@ public class ProfileNotificationsActivity extends BaseFragment implements Notifi } else if (value == 1) { textCell.setTextAndValue(LocaleController.getString("Notifications", R.string.Notifications), LocaleController.getString("Enabled", R.string.Enabled), true); } else if (value == 2) { - textCell.setTextAndValue(LocaleController.getString("Notifications", R.string.Notifications), LocaleController.getString("Disabled", R.string.Disabled), true); + textCell.setTextAndValue(LocaleController.getString("Notifications", R.string.Notifications), LocaleController.getString("NotificationsDisabled", R.string.NotificationsDisabled), true); } else if (value == 3) { int delta = preferences.getInt("notifyuntil_" + dialog_id, 0) - ConnectionsManager.getInstance().getCurrentTime(); String val; @@ -433,7 +433,7 @@ public class ProfileNotificationsActivity extends BaseFragment implements Notifi if (val != null) { textCell.setTextAndValue(LocaleController.getString("Notifications", R.string.Notifications), val, true); } else { - textCell.setTextAndValue(LocaleController.getString("Notifications", R.string.Notifications), LocaleController.getString("Disabled", R.string.Disabled), true); + textCell.setTextAndValue(LocaleController.getString("Notifications", R.string.Notifications), LocaleController.getString("NotificationsDisabled", R.string.NotificationsDisabled), true); } } } else if (i == settingsSoundRow) { diff --git a/TMessagesProj/src/main/java/org/telegram/ui/SettingsActivity.java b/TMessagesProj/src/main/java/org/telegram/ui/SettingsActivity.java index b09173af0..a6c4ce3a8 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/SettingsActivity.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/SettingsActivity.java @@ -782,6 +782,7 @@ public class SettingsActivity extends BaseFragment implements NotificationCenter if (supportUser != null && supportUser.id == 333000) { supportUser = null; } + data.cleanup(); } } catch (Exception e) { FileLog.e("tmessages", e); @@ -812,6 +813,7 @@ public class SettingsActivity extends BaseFragment implements NotificationCenter res.user.serializeToStream(data); editor.putString("support_user", Base64.encodeToString(data.toByteArray(), Base64.DEFAULT)); editor.commit(); + data.cleanup(); try { progressDialog.dismiss(); } catch (Exception e) { diff --git a/TMessagesProj/src/main/java/org/telegram/ui/WallpapersActivity.java b/TMessagesProj/src/main/java/org/telegram/ui/WallpapersActivity.java index 9ac605040..b6fe28272 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/WallpapersActivity.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/WallpapersActivity.java @@ -223,17 +223,26 @@ public class WallpapersActivity extends BaseFragment implements NotificationCent if (resultCode == Activity.RESULT_OK) { if (requestCode == 10) { Utilities.addMediaToGallery(currentPicturePath); + FileOutputStream stream = null; try { Point screenSize = AndroidUtilities.getRealScreenSize(); Bitmap bitmap = ImageLoader.loadBitmap(currentPicturePath, null, screenSize.x, screenSize.y, true); File toFile = new File(ApplicationLoader.applicationContext.getFilesDir(), "wallpaper-temp.jpg"); - FileOutputStream stream = new FileOutputStream(toFile); + stream = new FileOutputStream(toFile); bitmap.compress(Bitmap.CompressFormat.JPEG, 87, stream); selectedBackground = -1; selectedColor = 0; backgroundImage.setImageBitmap(bitmap); } catch (Exception e) { FileLog.e("tmessages", e); + } finally { + try { + if (stream != null) { + stream.close(); + } + } catch (Exception e) { + FileLog.e("tmessages", e); + } } currentPicturePath = null; } else if (requestCode == 11) { diff --git a/TMessagesProj/src/main/res/values-ar/strings.xml b/TMessagesProj/src/main/res/values-ar/strings.xml index b81609edf..685e5fb17 100644 --- a/TMessagesProj/src/main/res/values-ar/strings.xml +++ b/TMessagesProj/src/main/res/values-ar/strings.xml @@ -16,7 +16,7 @@ رمز التفعيل تم إرسال رسالة قصيرة تحتوي على رمز التفعيل الخاص بك %1$d:%2$02d سنتصل بك خلال - جاري الاتصال بك ... + جارٍ الاتصال بك ... رمز التفعيل الرقم خاطئ؟ هل استقبلت الرمز؟ @@ -36,12 +36,12 @@ ...لا توجد محادثات بعد إبدأ المراسلة بالضغط على\nأيقونة النقاط في أعلى يمين الشاشة\nأو اذهب لقسم جهات الاتصال. في إنتظار الشبكة... - جاري الاتصال... - جاري التحديث... + جارٍ الاتصال... + جارٍ التحديث... محادثة سرية جديدة في إنتظار اتصال %s … تم إلغاء المحادثة السرية - جاري إرسال المفاتيح المشفرة... + جارٍ إرسال المفاتيح المشفرة... %s قام بالدخول للمحادثة السرية. لقد قمت بالدخول للمحادثة السرية. مسح سجل المحادثات @@ -81,7 +81,7 @@ أرسل الصورة بدون ضغطها مخفي - جاري الكتابة… + جارٍ الكتابة… يكتب… يكتبون… هل يوجد لديك سؤال\nحول تيليجرام؟ @@ -108,7 +108,7 @@ لقد تم إخراجك من هذه المجموعة لقد قمت بمغادرة المجموعة حذف هذه المجموعة - حذف هذه الدردشة + حذف هذه المحادثة قم بالسحب للإلغاء حفظ في الجهاز مشاركة @@ -244,7 +244,7 @@ لا يوجد صوت افتراضي الدعم - خلفية الدردشة + خلفية المحادثة الرسائل أرسل بزر الإدخال سجل الخروج من كافة الأجهزة الأخرى @@ -298,6 +298,8 @@ سيتم إرسال رسالة قصيرة تحتوي على رمز التفعيل الخاص إلى رقمك الجديد. الرقم %1$s لديه حساب تيليجرام مسبقًا. يرجى حذف هذا الحساب قبل محاولة تغيير رقمك. آخر + تعطيل + تعطيل رمز المرور غيًر رمز المرور @@ -477,14 +479,14 @@ الرمز غير صحيح الاسم الأول غير صحيح اسم العائلة غير صحيح - جاري التحميل ... + جارٍ التحميل ... ليس لديك أي مشغل مقاطع مرئية، يرجى تنزيل أية مشغل يرجى إرسال رسالة بواسطة البريد الإلكتروني إلى sms@telegram.org لتخبرنا عن مشكلتك. لا يوجد لديك تطبيق يمكنه فتح \'%1$s\'، يرجى تنزيل تطبيق مناسب للإستمرار هذا المستخدم ليس لديه تيليجرام بعد ، هل ترغب في دعوته الآن؟ هل أنت متأكد؟ هل ترغب في إضافة %1$s للمجموعة؟\n\nعدد الرسائل الحديثة المراد إعادة تحويلها: - ؟%1$s هل تريد إعادة توجيه الرسائل إلى + هل تريد إعادة توجيه الرسائل إلى %1$s؟ هل ترغب في إرسال رسالة إلى %1$s؟ نرجو الأخذ بالعلم أنه يمكنك استخدام تيليجرام على أجهزتك المتعددة بسهولة تامة وفي وقت واحد.\n\nوتذكر، تسجيل الخروج يحذف كافة محادثاتك السرية. هل أنت متأكد من تسجيل الخروج من جميع الأجهزة الأخرى باستثناء هذا الجهاز؟ @@ -499,7 +501,7 @@ هل أنت متأكد من رغبتك في حذف سجل المحادثات؟ هل أنت متأكد من رغبتك في حذف %1$s؟ هل ترغب في إرسال رسالة إلى %1$s؟ - ؟%1$s هل تريد إعادة توجيه الرسائل إلى + هل تريد إعادة توجيه الرسائل إلى %1$s؟ .Sorry, this feature is currently not available in your country تيليجرام diff --git a/TMessagesProj/src/main/res/values-de/strings.xml b/TMessagesProj/src/main/res/values-de/strings.xml index 0ed32660a..6a00c0f6d 100644 --- a/TMessagesProj/src/main/res/values-de/strings.xml +++ b/TMessagesProj/src/main/res/values-de/strings.xml @@ -298,6 +298,8 @@ Der Bestätigungscode kommt per SMS an deine neue Nummer. Die Telefonnummer %1$s ist bereits ein Telegram Konto. Bitte lösche es, bevor du mit der Übertragung auf das neue Konto startest. Sonstige + Deaktiviert + Deaktiviert Pincode Pincode ändern diff --git a/TMessagesProj/src/main/res/values-es/strings.xml b/TMessagesProj/src/main/res/values-es/strings.xml index 7872194de..0d576537c 100644 --- a/TMessagesProj/src/main/res/values-es/strings.xml +++ b/TMessagesProj/src/main/res/values-es/strings.xml @@ -298,6 +298,8 @@ Enviaremos un SMS con el código de confirmación a tu nuevo número. El número %1$s ya está vinculado a una cuenta de Telegram. Por favor, elimina esa cuenta antes de migrar al nuevo número. Otras + Desactivadas + Desactivadas Código de acceso Cambiar código de acceso diff --git a/TMessagesProj/src/main/res/values-it/strings.xml b/TMessagesProj/src/main/res/values-it/strings.xml index 8f4d876d8..5362a26a2 100644 --- a/TMessagesProj/src/main/res/values-it/strings.xml +++ b/TMessagesProj/src/main/res/values-it/strings.xml @@ -298,6 +298,8 @@ Invieremo un SMS con un codice di conferma al tuo nuovo numero. Il numero %1$s è già connesso a un account Telegram. Per favore elimina quell\'account prima di migrare ad un nuovo numero. Altro + Disabilitate + Disabilitata Codice Cambia codice diff --git a/TMessagesProj/src/main/res/values-ko/strings.xml b/TMessagesProj/src/main/res/values-ko/strings.xml index 770d8960c..2f89c7e8c 100644 --- a/TMessagesProj/src/main/res/values-ko/strings.xml +++ b/TMessagesProj/src/main/res/values-ko/strings.xml @@ -298,6 +298,8 @@ 인증코드 메시지를 새 번호로 전송하겠습니다. 그 번호는 이미 텔레그램 계정에 연결되어 있습니다. 새 번호로 이동하기 전에 %1$s 계정에서 탈퇴해 주세요. 기타 + 끄기 + 끄기 잠금번호 잠금번호 변경 diff --git a/TMessagesProj/src/main/res/values-nl/strings.xml b/TMessagesProj/src/main/res/values-nl/strings.xml index f765c87db..162cfbf94 100644 --- a/TMessagesProj/src/main/res/values-nl/strings.xml +++ b/TMessagesProj/src/main/res/values-nl/strings.xml @@ -298,6 +298,8 @@ We sturen een sms-bericht met verificatiecode naar je nieuwe nummer. Aan telefoonnummer %1$s is al een Telegram-account gekoppeld. Verwijder het account om te kunnen migreren naar het nieuwe nummer. Overig + Uitgeschakeld + Uitgeschakeld Toegangscode Toegangscode wijzigen diff --git a/TMessagesProj/src/main/res/values-pt-rBR/strings.xml b/TMessagesProj/src/main/res/values-pt-rBR/strings.xml index 701ca6f5b..c4eddf668 100644 --- a/TMessagesProj/src/main/res/values-pt-rBR/strings.xml +++ b/TMessagesProj/src/main/res/values-pt-rBR/strings.xml @@ -298,6 +298,8 @@ Vamos enviar uma SMS com um código de confirmação para o seu novo número. O número %1$s já possui uma conta do Telegram. Por favor, exclua esta conta antes de migrar para o novo número. Outro + Desativado + Desativado Senha Alterar Senha diff --git a/TMessagesProj/src/main/res/values-pt-rPT/strings.xml b/TMessagesProj/src/main/res/values-pt-rPT/strings.xml index 040317928..6deb25e57 100644 --- a/TMessagesProj/src/main/res/values-pt-rPT/strings.xml +++ b/TMessagesProj/src/main/res/values-pt-rPT/strings.xml @@ -298,6 +298,8 @@ Vamos enviar uma SMS com um código de confirmação para o seu novo número. O número %1$s já possui uma conta do Telegram. Por favor, exclua esta conta antes de migrar para o novo número. Outro + Desativado + Desativado Senha Alterar Senha diff --git a/TMessagesProj/src/main/res/values-v14/bools.xml b/TMessagesProj/src/main/res/values-v14/bools.xml new file mode 100644 index 000000000..639cedeac --- /dev/null +++ b/TMessagesProj/src/main/res/values-v14/bools.xml @@ -0,0 +1,5 @@ + + + + false + \ No newline at end of file diff --git a/TMessagesProj/src/main/res/values-v15/bools.xml b/TMessagesProj/src/main/res/values-v15/bools.xml new file mode 100644 index 000000000..639cedeac --- /dev/null +++ b/TMessagesProj/src/main/res/values-v15/bools.xml @@ -0,0 +1,5 @@ + + + + false + \ No newline at end of file diff --git a/TMessagesProj/src/main/res/values-v16/bools.xml b/TMessagesProj/src/main/res/values-v16/bools.xml new file mode 100644 index 000000000..9e9160ec0 --- /dev/null +++ b/TMessagesProj/src/main/res/values-v16/bools.xml @@ -0,0 +1,5 @@ + + + + true + \ No newline at end of file diff --git a/TMessagesProj/src/main/res/values/bools.xml b/TMessagesProj/src/main/res/values/bools.xml new file mode 100644 index 000000000..9e9160ec0 --- /dev/null +++ b/TMessagesProj/src/main/res/values/bools.xml @@ -0,0 +1,5 @@ + + + + true + \ No newline at end of file diff --git a/TMessagesProj/src/main/res/values/strings.xml b/TMessagesProj/src/main/res/values/strings.xml index 085fb7bd6..81181db86 100644 --- a/TMessagesProj/src/main/res/values/strings.xml +++ b/TMessagesProj/src/main/res/values/strings.xml @@ -298,6 +298,8 @@ We will send an SMS with a confirmation code to your new number. The number %1$s is already connected to a Telegram account. Please delete that account before migrating to the new number. Other + Disabled + Disabled Passcode Change Passcode