Commit 16346188 authored by DrKLO's avatar DrKLO

Merge branch 'dev'

parents 9d113ccb f8e8d089
...@@ -3,7 +3,7 @@ buildscript { ...@@ -3,7 +3,7 @@ buildscript {
mavenCentral() mavenCentral()
} }
dependencies { dependencies {
classpath 'com.android.tools.build:gradle:1.1.3' classpath 'com.android.tools.build:gradle:1.2.3'
} }
} }
apply plugin: 'com.android.application' apply plugin: 'com.android.application'
...@@ -13,11 +13,10 @@ repositories { ...@@ -13,11 +13,10 @@ repositories {
} }
dependencies { dependencies {
compile 'com.android.support:support-v4:22.0.+' compile 'com.android.support:support-v4:22.1.+'
compile 'com.google.android.gms:play-services:3.2.+' compile 'com.google.android.gms:play-services:3.2.+'
compile 'net.hockeyapp.android:HockeySDK:3.5.+' compile 'net.hockeyapp.android:HockeySDK:3.5.+'
compile 'com.googlecode.mp4parser:isoparser:1.0.+' compile 'com.googlecode.mp4parser:isoparser:1.0.+'
compile 'com.android.support:recyclerview-v7:+'
} }
android { android {
...@@ -82,7 +81,7 @@ android { ...@@ -82,7 +81,7 @@ android {
defaultConfig { defaultConfig {
minSdkVersion 8 minSdkVersion 8
targetSdkVersion 22 targetSdkVersion 22
versionCode 492 versionCode 542
versionName "2.7.0" versionName "2.9.1"
} }
} }
...@@ -104,7 +104,7 @@ include $(BUILD_STATIC_LIBRARY) ...@@ -104,7 +104,7 @@ include $(BUILD_STATIC_LIBRARY)
include $(CLEAR_VARS) include $(CLEAR_VARS)
LOCAL_PRELINK_MODULE := false LOCAL_PRELINK_MODULE := false
LOCAL_STATIC_LIBRARIES := webp sqlite LOCAL_STATIC_LIBRARIES := webp sqlite
LOCAL_MODULE := tmessages.7 LOCAL_MODULE := tmessages.8
LOCAL_CFLAGS := -w -std=gnu99 -O2 -DNULL=0 -DSOCKLEN_T=socklen_t -DLOCALE_NOT_USED -D_LARGEFILE_SOURCE=1 -D_FILE_OFFSET_BITS=64 LOCAL_CFLAGS := -w -std=gnu99 -O2 -DNULL=0 -DSOCKLEN_T=socklen_t -DLOCALE_NOT_USED -D_LARGEFILE_SOURCE=1 -D_FILE_OFFSET_BITS=64
LOCAL_CFLAGS += -Drestrict='' -D__EMX__ -DOPUS_BUILD -DFIXED_POINT -DUSE_ALLOCA -DHAVE_LRINT -DHAVE_LRINTF -fno-math-errno LOCAL_CFLAGS += -Drestrict='' -D__EMX__ -DOPUS_BUILD -DFIXED_POINT -DUSE_ALLOCA -DHAVE_LRINT -DHAVE_LRINTF -fno-math-errno
LOCAL_CFLAGS += -DANDROID_NDK -DDISABLE_IMPORTGL -fno-strict-aliasing -fprefetch-loop-arrays -DAVOID_TABLES -DANDROID_TILE_BASED_DECODE -DANDROID_ARMV6_IDCT -ffast-math LOCAL_CFLAGS += -DANDROID_NDK -DDISABLE_IMPORTGL -fno-strict-aliasing -fprefetch-loop-arrays -DAVOID_TABLES -DANDROID_TILE_BASED_DECODE -DANDROID_ARMV6_IDCT -ffast-math
......
...@@ -288,7 +288,7 @@ METHODDEF(void) my_error_exit(j_common_ptr cinfo) { ...@@ -288,7 +288,7 @@ METHODDEF(void) my_error_exit(j_common_ptr cinfo) {
longjmp(myerr->setjmp_buffer, 1); longjmp(myerr->setjmp_buffer, 1);
} }
JNIEXPORT void Java_org_telegram_messenger_Utilities_blurBitmap(JNIEnv *env, jclass class, jobject bitmap, int radius) { JNIEXPORT void Java_org_telegram_messenger_Utilities_blurBitmap(JNIEnv *env, jclass class, jobject bitmap, int radius, int unpin) {
if (!bitmap) { if (!bitmap) {
return; return;
} }
...@@ -312,7 +312,9 @@ JNIEXPORT void Java_org_telegram_messenger_Utilities_blurBitmap(JNIEnv *env, jcl ...@@ -312,7 +312,9 @@ JNIEXPORT void Java_org_telegram_messenger_Utilities_blurBitmap(JNIEnv *env, jcl
} else { } else {
fastBlurMore(info.width, info.height, info.stride, pixels, radius); fastBlurMore(info.width, info.height, info.stride, pixels, radius);
} }
if (unpin) {
AndroidBitmap_unlockPixels(env, bitmap); AndroidBitmap_unlockPixels(env, bitmap);
}
} }
JNIEXPORT void Java_org_telegram_messenger_Utilities_calcCDT(JNIEnv *env, jclass class, jobject hsvBuffer, int width, int height, jobject buffer) { JNIEXPORT void Java_org_telegram_messenger_Utilities_calcCDT(JNIEnv *env, jclass class, jobject hsvBuffer, int width, int height, jobject buffer) {
......
This diff is collapsed.
This diff is collapsed.
...@@ -123,6 +123,18 @@ ...@@ -123,6 +123,18 @@
android:windowSoftInputMode="adjustResize|stateHidden"> android:windowSoftInputMode="adjustResize|stateHidden">
</activity> </activity>
<receiver android:name="org.telegram.android.AutoMessageHeardReceiver">
<intent-filter>
<action android:name="org.telegram.messenger.ACTION_MESSAGE_HEARD"/>
</intent-filter>
</receiver>
<receiver android:name="org.telegram.android.AutoMessageReplyReceiver">
<intent-filter>
<action android:name="org.telegram.messenger.ACTION_MESSAGE_REPLY"/>
</intent-filter>
</receiver>
<receiver android:name="org.telegram.android.SmsListener"> <receiver android:name="org.telegram.android.SmsListener">
<intent-filter> <intent-filter>
<action android:name="android.provider.Telephony.SMS_RECEIVED" /> <action android:name="android.provider.Telephony.SMS_RECEIVED" />
...@@ -168,6 +180,8 @@ ...@@ -168,6 +180,8 @@
<meta-data android:name="com.sec.android.multiwindow.MINIMUM_SIZE_W" android:value="632dp" /> <meta-data android:name="com.sec.android.multiwindow.MINIMUM_SIZE_W" android:value="632dp" />
<meta-data android:name="com.sec.android.multiwindow.MINIMUM_SIZE_H" android:value="598dp" /> <meta-data android:name="com.sec.android.multiwindow.MINIMUM_SIZE_H" android:value="598dp" />
<meta-data android:name="com.google.android.gms.car.application" android:resource="@xml/automotive_app_desc" />
</application> </application>
</manifest> </manifest>
...@@ -27,11 +27,11 @@ package org.telegram.PhoneFormat; ...@@ -27,11 +27,11 @@ package org.telegram.PhoneFormat;
import java.util.ArrayList; import java.util.ArrayList;
public class CallingCodeInfo { public class CallingCodeInfo {
public ArrayList<String> countries = new ArrayList<String>(); public ArrayList<String> countries = new ArrayList<>();
public String callingCode = ""; public String callingCode = "";
public ArrayList<String> trunkPrefixes = new ArrayList<String>(); public ArrayList<String> trunkPrefixes = new ArrayList<>();
public ArrayList<String> intlPrefixes = new ArrayList<String>(); public ArrayList<String> intlPrefixes = new ArrayList<>();
public ArrayList<RuleSet> ruleSets = new ArrayList<RuleSet>(); public ArrayList<RuleSet> ruleSets = new ArrayList<>();
//public ArrayList formatStrings; //public ArrayList formatStrings;
String matchingAccessCode(String str) { String matchingAccessCode(String str) {
...@@ -107,14 +107,14 @@ public class CallingCodeInfo { ...@@ -107,14 +107,14 @@ public class CallingCodeInfo {
for (RuleSet set : ruleSets) { for (RuleSet set : ruleSets) {
boolean valid = set.isValid(str, intlPrefix, trunkPrefix, true); boolean valid = set.isValid(str, intlPrefix, trunkPrefix, true);
if (valid) { if (valid) {
return valid; return true;
} }
} }
for (RuleSet set : ruleSets) { for (RuleSet set : ruleSets) {
boolean valid = set.isValid(str, intlPrefix, trunkPrefix, false); boolean valid = set.isValid(str, intlPrefix, trunkPrefix, false);
if (valid) { if (valid) {
return valid; return true;
} }
} }
......
...@@ -14,7 +14,7 @@ ...@@ -14,7 +14,7 @@
* limitations under the License. * limitations under the License.
*/ */
package org.telegram.ui.Animation; package org.telegram.android.Animation;
import android.view.animation.Interpolator; import android.view.animation.Interpolator;
......
...@@ -14,7 +14,7 @@ ...@@ -14,7 +14,7 @@
* limitations under the License. * limitations under the License.
*/ */
package org.telegram.ui.Animation; package org.telegram.android.Animation;
public abstract class AnimatorListenerAdapter10 implements Animator10.AnimatorListener, Animator10.AnimatorPauseListener { public abstract class AnimatorListenerAdapter10 implements Animator10.AnimatorListener, Animator10.AnimatorPauseListener {
......
...@@ -14,7 +14,7 @@ ...@@ -14,7 +14,7 @@
* limitations under the License. * limitations under the License.
*/ */
package org.telegram.ui.Animation; package org.telegram.android.Animation;
import android.view.animation.Interpolator; import android.view.animation.Interpolator;
......
...@@ -14,7 +14,7 @@ ...@@ -14,7 +14,7 @@
* limitations under the License. * limitations under the License.
*/ */
package org.telegram.ui.Animation; package org.telegram.android.Animation;
public class FloatEvaluator implements TypeEvaluator<Number> { public class FloatEvaluator implements TypeEvaluator<Number> {
public Float evaluate(float fraction, Number startValue, Number endValue) { public Float evaluate(float fraction, Number startValue, Number endValue) {
......
...@@ -14,11 +14,11 @@ ...@@ -14,11 +14,11 @@
* limitations under the License. * limitations under the License.
*/ */
package org.telegram.ui.Animation; package org.telegram.android.Animation;
import android.view.animation.Interpolator; import android.view.animation.Interpolator;
import org.telegram.ui.Animation.Keyframe.FloatKeyframe; import org.telegram.android.Animation.Keyframe.FloatKeyframe;
import java.util.ArrayList; import java.util.ArrayList;
......
...@@ -13,7 +13,7 @@ ...@@ -13,7 +13,7 @@
* See the License for the specific language governing permissions and * See the License for the specific language governing permissions and
* limitations under the License. * limitations under the License.
*/ */
package org.telegram.ui.Animation; package org.telegram.android.Animation;
public abstract class FloatProperty10<T> extends Property<T, Float> { public abstract class FloatProperty10<T> extends Property<T, Float> {
......
...@@ -14,7 +14,7 @@ ...@@ -14,7 +14,7 @@
* limitations under the License. * limitations under the License.
*/ */
package org.telegram.ui.Animation; package org.telegram.android.Animation;
public class IntEvaluator implements TypeEvaluator<Integer> { public class IntEvaluator implements TypeEvaluator<Integer> {
public Integer evaluate(float fraction, Integer startValue, Integer endValue) { public Integer evaluate(float fraction, Integer startValue, Integer endValue) {
......
...@@ -14,11 +14,11 @@ ...@@ -14,11 +14,11 @@
* limitations under the License. * limitations under the License.
*/ */
package org.telegram.ui.Animation; package org.telegram.android.Animation;
import android.view.animation.Interpolator; import android.view.animation.Interpolator;
import org.telegram.ui.Animation.Keyframe.IntKeyframe; import org.telegram.android.Animation.Keyframe.IntKeyframe;
import java.util.ArrayList; import java.util.ArrayList;
......
...@@ -13,7 +13,7 @@ ...@@ -13,7 +13,7 @@
* See the License for the specific language governing permissions and * See the License for the specific language governing permissions and
* limitations under the License. * limitations under the License.
*/ */
package org.telegram.ui.Animation; package org.telegram.android.Animation;
public abstract class IntProperty<T> extends Property<T, Integer> { public abstract class IntProperty<T> extends Property<T, Integer> {
......
...@@ -14,7 +14,7 @@ ...@@ -14,7 +14,7 @@
* limitations under the License. * limitations under the License.
*/ */
package org.telegram.ui.Animation; package org.telegram.android.Animation;
import android.view.animation.Interpolator; import android.view.animation.Interpolator;
......
...@@ -14,16 +14,16 @@ ...@@ -14,16 +14,16 @@
* limitations under the License. * limitations under the License.
*/ */
package org.telegram.ui.Animation; package org.telegram.android.Animation;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Arrays; import java.util.Arrays;
import android.util.Log; import android.util.Log;
import android.view.animation.Interpolator; import android.view.animation.Interpolator;
import org.telegram.ui.Animation.Keyframe.IntKeyframe; import org.telegram.android.Animation.Keyframe.IntKeyframe;
import org.telegram.ui.Animation.Keyframe.FloatKeyframe; import org.telegram.android.Animation.Keyframe.FloatKeyframe;
import org.telegram.ui.Animation.Keyframe.ObjectKeyframe; import org.telegram.android.Animation.Keyframe.ObjectKeyframe;
class KeyframeSet { class KeyframeSet {
......
...@@ -13,7 +13,7 @@ ...@@ -13,7 +13,7 @@
* See the License for the specific language governing permissions and * See the License for the specific language governing permissions and
* limitations under the License. * limitations under the License.
*/ */
package org.telegram.ui.Animation; package org.telegram.android.Animation;
public class NoSuchPropertyException extends RuntimeException { public class NoSuchPropertyException extends RuntimeException {
......
...@@ -14,7 +14,7 @@ ...@@ -14,7 +14,7 @@
* limitations under the License. * limitations under the License.
*/ */
package org.telegram.ui.Animation; package org.telegram.android.Animation;
import android.view.View; import android.view.View;
......
...@@ -13,7 +13,7 @@ ...@@ -13,7 +13,7 @@
* See the License for the specific language governing permissions and * See the License for the specific language governing permissions and
* limitations under the License. * limitations under the License.
*/ */
package org.telegram.ui.Animation; package org.telegram.android.Animation;
public abstract class Property<T, V> { public abstract class Property<T, V> {
......
...@@ -14,9 +14,8 @@ ...@@ -14,9 +14,8 @@
* limitations under the License. * limitations under the License.
*/ */
package org.telegram.ui.Animation; package org.telegram.android.Animation;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method; import java.lang.reflect.Method;
import java.util.HashMap; import java.util.HashMap;
import java.util.concurrent.locks.ReentrantReadWriteLock; import java.util.concurrent.locks.ReentrantReadWriteLock;
......
...@@ -13,7 +13,7 @@ ...@@ -13,7 +13,7 @@
* See the License for the specific language governing permissions and * See the License for the specific language governing permissions and
* limitations under the License. * limitations under the License.
*/ */
package org.telegram.ui.Animation; package org.telegram.android.Animation;
import java.lang.reflect.Field; import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException; import java.lang.reflect.InvocationTargetException;
......
...@@ -14,7 +14,7 @@ ...@@ -14,7 +14,7 @@
* limitations under the License. * limitations under the License.
*/ */
package org.telegram.ui.Animation; package org.telegram.android.Animation;
public interface TypeEvaluator<T> { public interface TypeEvaluator<T> {
T evaluate(float fraction, T startValue, T endValue); T evaluate(float fraction, T startValue, T endValue);
......
...@@ -14,7 +14,7 @@ ...@@ -14,7 +14,7 @@
* limitations under the License. * limitations under the License.
*/ */
package org.telegram.ui.Animation; package org.telegram.android.Animation;
import android.os.Looper; import android.os.Looper;
import android.util.AndroidRuntimeException; import android.util.AndroidRuntimeException;
......
...@@ -14,7 +14,7 @@ See the License for the specific language governing permissions and ...@@ -14,7 +14,7 @@ See the License for the specific language governing permissions and
limitations under the License. limitations under the License.
*/ */
package org.telegram.ui.Animation; package org.telegram.android.Animation;
import android.graphics.Camera; import android.graphics.Camera;
import android.graphics.Matrix; import android.graphics.Matrix;
......
...@@ -6,14 +6,14 @@ ...@@ -6,14 +6,14 @@
* Copyright Nikolai Kudashov, 2013-2014. * Copyright Nikolai Kudashov, 2013-2014.
*/ */
package org.telegram.ui.AnimationCompat; package org.telegram.android.AnimationCompat;
import android.animation.Animator; import android.animation.Animator;
import android.animation.AnimatorListenerAdapter; import android.animation.AnimatorListenerAdapter;
import org.telegram.ui.Animation.Animator10; import org.telegram.android.Animation.Animator10;
import org.telegram.ui.Animation.AnimatorListenerAdapter10; import org.telegram.android.Animation.AnimatorListenerAdapter10;
import org.telegram.ui.Animation.View10; import org.telegram.android.Animation.View10;
public class AnimatorListenerAdapterProxy { public class AnimatorListenerAdapterProxy {
protected Object animatorListenerAdapter; protected Object animatorListenerAdapter;
......
...@@ -6,17 +6,17 @@ ...@@ -6,17 +6,17 @@
* Copyright Nikolai Kudashov, 2013-2014. * Copyright Nikolai Kudashov, 2013-2014.
*/ */
package org.telegram.ui.AnimationCompat; package org.telegram.android.AnimationCompat;
import android.animation.Animator; import android.animation.Animator;
import android.animation.AnimatorListenerAdapter; import android.animation.AnimatorListenerAdapter;
import android.animation.AnimatorSet; import android.animation.AnimatorSet;
import android.view.animation.Interpolator; import android.view.animation.Interpolator;
import org.telegram.ui.Animation.Animator10; import org.telegram.android.Animation.Animator10;
import org.telegram.ui.Animation.AnimatorListenerAdapter10; import org.telegram.android.Animation.AnimatorListenerAdapter10;
import org.telegram.ui.Animation.AnimatorSet10; import org.telegram.android.Animation.AnimatorSet10;
import org.telegram.ui.Animation.View10; import org.telegram.android.Animation.View10;
import java.lang.reflect.Array; import java.lang.reflect.Array;
import java.util.ArrayList; import java.util.ArrayList;
......
...@@ -6,15 +6,15 @@ ...@@ -6,15 +6,15 @@
* Copyright Nikolai Kudashov, 2013-2014. * Copyright Nikolai Kudashov, 2013-2014.
*/ */
package org.telegram.ui.AnimationCompat; package org.telegram.android.AnimationCompat;
import android.animation.AnimatorListenerAdapter; import android.animation.AnimatorListenerAdapter;
import android.animation.ObjectAnimator; import android.animation.ObjectAnimator;
import android.view.animation.Interpolator; import android.view.animation.Interpolator;
import org.telegram.ui.Animation.AnimatorListenerAdapter10; import org.telegram.android.Animation.AnimatorListenerAdapter10;
import org.telegram.ui.Animation.ObjectAnimator10; import org.telegram.android.Animation.ObjectAnimator10;
import org.telegram.ui.Animation.View10; import org.telegram.android.Animation.View10;
public class ObjectAnimatorProxy { public class ObjectAnimatorProxy {
......
...@@ -6,11 +6,11 @@ ...@@ -6,11 +6,11 @@
* Copyright Nikolai Kudashov, 2013-2014. * Copyright Nikolai Kudashov, 2013-2014.
*/ */
package org.telegram.ui.AnimationCompat; package org.telegram.android.AnimationCompat;
import android.view.View; import android.view.View;
import org.telegram.ui.Animation.View10; import org.telegram.android.Animation.View10;
public class ViewProxy { public class ViewProxy {
......
/*
* This is the source code of Telegram for Android v. 2.x.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.android;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
public class AutoMessageHeardReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
long dialog_id = intent.getLongExtra("dialog_id", 0);
int max_id = intent.getIntExtra("max_id", 0);
if (dialog_id == 0 || max_id == 0) {
return;
}
MessagesController.getInstance().markDialogAsRead(dialog_id, max_id, max_id, 0, 0, true, false);
}
}
/*
* This is the source code of Telegram for Android v. 2.x.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-2014.
*/
package org.telegram.android;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.os.Bundle;
import android.support.v4.app.RemoteInput;
public class AutoMessageReplyReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
Bundle remoteInput = RemoteInput.getResultsFromIntent(intent);
if (remoteInput == null) {
return;
}
CharSequence text = remoteInput.getCharSequence(NotificationsController.EXTRA_VOICE_REPLY);
if (text == null || text.length() == 0) {
return;
}
long dialog_id = intent.getLongExtra("dialog_id", 0);
int max_id = intent.getIntExtra("max_id", 0);
if (dialog_id == 0 || max_id == 0) {
return;
}
SendMessagesHelper.getInstance().sendMessage(text.toString(), dialog_id, null, null, true);
MessagesController.getInstance().markDialogAsRead(dialog_id, max_id, max_id, 0, 0, true, false);
}
}
...@@ -14,6 +14,7 @@ import android.app.Activity; ...@@ -14,6 +14,7 @@ import android.app.Activity;
import android.content.ContentProviderOperation; import android.content.ContentProviderOperation;
import android.content.ContentProviderResult; import android.content.ContentProviderResult;
import android.content.ContentResolver; import android.content.ContentResolver;
import android.content.ContentValues;
import android.content.SharedPreferences; import android.content.SharedPreferences;
import android.database.Cursor; import android.database.Cursor;
import android.net.Uri; import android.net.Uri;
...@@ -37,7 +38,6 @@ import java.util.ArrayList; ...@@ -37,7 +38,6 @@ import java.util.ArrayList;
import java.util.Collections; import java.util.Collections;
import java.util.Comparator; import java.util.Comparator;
import java.util.HashMap; import java.util.HashMap;
import java.util.Locale;
import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.ConcurrentHashMap;
public class ContactsController { public class ContactsController {
...@@ -168,7 +168,7 @@ public class ContactsController { ...@@ -168,7 +168,7 @@ public class ContactsController {
if (!updatingInviteText && (inviteText == null || time + 86400 < (int)(System.currentTimeMillis() / 1000))) { if (!updatingInviteText && (inviteText == null || time + 86400 < (int)(System.currentTimeMillis() / 1000))) {
updatingInviteText = true; updatingInviteText = true;
TLRPC.TL_help_getInviteText req = new TLRPC.TL_help_getInviteText(); TLRPC.TL_help_getInviteText req = new TLRPC.TL_help_getInviteText();
req.lang_code = LocaleController.getLocaleString(Locale.getDefault()); req.lang_code = LocaleController.getLocaleString(LocaleController.getInstance().getSystemDefaultLocale());
if (req.lang_code == null || req.lang_code.length() == 0) { if (req.lang_code == null || req.lang_code.length() == 0) {
req.lang_code = "en"; req.lang_code = "en";
} }
...@@ -202,7 +202,19 @@ public class ContactsController { ...@@ -202,7 +202,19 @@ public class ContactsController {
public void checkAppAccount() { public void checkAppAccount() {
AccountManager am = AccountManager.get(ApplicationLoader.applicationContext); AccountManager am = AccountManager.get(ApplicationLoader.applicationContext);
Account[] accounts = am.getAccountsByType("org.telegram.account"); Account[] accounts;
try {
accounts = am.getAccountsByType("org.telegram.account");
if (accounts != null && accounts.length > 0) {
for (Account c : accounts) {
am.removeAccount(c, null, null);
}
}
} catch (Exception e) {
FileLog.e("tmessages", e);
}
accounts = am.getAccountsByType("org.telegram.messenger");
boolean recreateAccount = false; boolean recreateAccount = false;
if (UserConfig.isClientActivated()) { if (UserConfig.isClientActivated()) {
if (accounts.length == 1) { if (accounts.length == 1) {
...@@ -227,7 +239,7 @@ public class ContactsController { ...@@ -227,7 +239,7 @@ public class ContactsController {
} }
if (UserConfig.isClientActivated()) { if (UserConfig.isClientActivated()) {
try { try {
currentAccount = new Account(UserConfig.getCurrentUser().phone, "org.telegram.account"); currentAccount = new Account(UserConfig.getCurrentUser().phone, "org.telegram.messenger");
am.addAccountExplicitly(currentAccount, "", null); am.addAccountExplicitly(currentAccount, "", null);
} catch (Exception e) { } catch (Exception e) {
FileLog.e("tmessages", e); FileLog.e("tmessages", e);
...@@ -239,7 +251,7 @@ public class ContactsController { ...@@ -239,7 +251,7 @@ public class ContactsController {
public void deleteAllAppAccounts() { public void deleteAllAppAccounts() {
try { try {
AccountManager am = AccountManager.get(ApplicationLoader.applicationContext); AccountManager am = AccountManager.get(ApplicationLoader.applicationContext);
Account[] accounts = am.getAccountsByType("org.telegram.account"); Account[] accounts = am.getAccountsByType("org.telegram.messenger");
for (Account c : accounts) { for (Account c : accounts) {
am.removeAccount(c, null, null); am.removeAccount(c, null, null);
} }
...@@ -1246,7 +1258,7 @@ public class ContactsController { ...@@ -1246,7 +1258,7 @@ public class ContactsController {
private void performWriteContactsToPhoneBook() { private void performWriteContactsToPhoneBook() {
final ArrayList<TLRPC.TL_contact> contactsArray = new ArrayList<>(); final ArrayList<TLRPC.TL_contact> contactsArray = new ArrayList<>();
contactsArray.addAll(contacts); contactsArray.addAll(contacts);
Utilities.photoBookQueue.postRunnable(new Runnable() { Utilities.phoneBookQueue.postRunnable(new Runnable() {
@Override @Override
public void run() { public void run() {
performWriteContactsToPhoneBookInternal(contactsArray); performWriteContactsToPhoneBookInternal(contactsArray);
...@@ -1303,7 +1315,7 @@ public class ContactsController { ...@@ -1303,7 +1315,7 @@ public class ContactsController {
} }
for (final Integer uid : contactsTD) { for (final Integer uid : contactsTD) {
Utilities.photoBookQueue.postRunnable(new Runnable() { Utilities.phoneBookQueue.postRunnable(new Runnable() {
@Override @Override
public void run() { public void run() {
deleteContactFromPhoneBook(uid); deleteContactFromPhoneBook(uid);
...@@ -1463,7 +1475,7 @@ public class ContactsController { ...@@ -1463,7 +1475,7 @@ public class ContactsController {
builder = ContentProviderOperation.newInsert(ContactsContract.Data.CONTENT_URI); builder = ContentProviderOperation.newInsert(ContactsContract.Data.CONTENT_URI);
builder.withValueBackReference(ContactsContract.Data.RAW_CONTACT_ID, 0); builder.withValueBackReference(ContactsContract.Data.RAW_CONTACT_ID, 0);
builder.withValue(ContactsContract.Data.MIMETYPE, "vnd.android.cursor.item/vnd.org.telegram.messenger.android.profile"); builder.withValue(ContactsContract.Data.MIMETYPE, "vnd.android.cursor.item/vnd.org.telegram.messenger.android.profile");
builder.withValue(ContactsContract.Data.DATA1, "+" + user.phone); builder.withValue(ContactsContract.Data.DATA1, user.id);
builder.withValue(ContactsContract.Data.DATA2, "Telegram Profile"); builder.withValue(ContactsContract.Data.DATA2, "Telegram Profile");
builder.withValue(ContactsContract.Data.DATA3, "+" + user.phone); builder.withValue(ContactsContract.Data.DATA3, "+" + user.phone);
builder.withValue(ContactsContract.Data.DATA4, user.id); builder.withValue(ContactsContract.Data.DATA4, user.id);
...@@ -1496,6 +1508,22 @@ public class ContactsController { ...@@ -1496,6 +1508,22 @@ public class ContactsController {
} }
} }
protected void markAsContacted(final String contactId) {
if (contactId == null) {
return;
}
Utilities.phoneBookQueue.postRunnable(new Runnable() {
@Override
public void run() {
Uri uri = Uri.parse(contactId);
ContentValues values = new ContentValues();
values.put(ContactsContract.Contacts.LAST_TIME_CONTACTED, System.currentTimeMillis());
ContentResolver cr = ApplicationLoader.applicationContext.getContentResolver();
cr.update(uri, values, null, null);
}
});
}
public void addContact(TLRPC.User user) { public void addContact(TLRPC.User user) {
if (user == null || user.phone == null) { if (user == null || user.phone == null) {
return; return;
...@@ -1533,7 +1561,7 @@ public class ContactsController { ...@@ -1533,7 +1561,7 @@ public class ContactsController {
// } // }
for (final TLRPC.User u : res.users) { for (final TLRPC.User u : res.users) {
Utilities.photoBookQueue.postRunnable(new Runnable() { Utilities.phoneBookQueue.postRunnable(new Runnable() {
@Override @Override
public void run() { public void run() {
addContactToPhoneBook(u, true); addContactToPhoneBook(u, true);
...@@ -1546,7 +1574,7 @@ public class ContactsController { ...@@ -1546,7 +1574,7 @@ public class ContactsController {
MessagesStorage.getInstance().putContacts(arrayList, false); MessagesStorage.getInstance().putContacts(arrayList, false);
if (u.phone != null && u.phone.length() > 0) { if (u.phone != null && u.phone.length() > 0) {
String name = formatName(u.first_name, u.last_name); CharSequence name = formatName(u.first_name, u.last_name);
MessagesStorage.getInstance().applyPhoneBookUpdates(u.phone, ""); MessagesStorage.getInstance().applyPhoneBookUpdates(u.phone, "");
Contact contact = contactsBookSPhones.get(u.phone); Contact contact = contactsBookSPhones.get(u.phone);
if (contact != null) { if (contact != null) {
...@@ -1599,7 +1627,7 @@ public class ContactsController { ...@@ -1599,7 +1627,7 @@ public class ContactsController {
return; return;
} }
MessagesStorage.getInstance().deleteContacts(uids); MessagesStorage.getInstance().deleteContacts(uids);
Utilities.photoBookQueue.postRunnable(new Runnable() { Utilities.phoneBookQueue.postRunnable(new Runnable() {
@Override @Override
public void run() { public void run() {
for (TLRPC.User user : users) { for (TLRPC.User user : users) {
...@@ -1610,7 +1638,7 @@ public class ContactsController { ...@@ -1610,7 +1638,7 @@ public class ContactsController {
for (TLRPC.User user : users) { for (TLRPC.User user : users) {
if (user.phone != null && user.phone.length() > 0) { if (user.phone != null && user.phone.length() > 0) {
String name = ContactsController.formatName(user.first_name, user.last_name); CharSequence name = ContactsController.formatName(user.first_name, user.last_name);
MessagesStorage.getInstance().applyPhoneBookUpdates(user.phone, ""); MessagesStorage.getInstance().applyPhoneBookUpdates(user.phone, "");
Contact contact = contactsBookSPhones.get(user.phone); Contact contact = contactsBookSPhones.get(user.phone);
if (contact != null) { if (contact != null) {
...@@ -1772,22 +1800,37 @@ public class ContactsController { ...@@ -1772,22 +1800,37 @@ public class ContactsController {
} }
public static String formatName(String firstName, String lastName) { public static String formatName(String firstName, String lastName) {
String result = ""; /*if ((firstName == null || firstName.length() == 0) && (lastName == null || lastName.length() == 0)) {
return LocaleController.getString("HiddenName", R.string.HiddenName);
}*/
if (firstName != null) {
firstName = firstName.trim();
}
if (lastName != null) {
lastName = lastName.trim();
}
StringBuilder result = new StringBuilder((firstName != null ? firstName.length() : 0) + (lastName != null ? lastName.length() : 0) + 1);
if (LocaleController.nameDisplayOrder == 1) { if (LocaleController.nameDisplayOrder == 1) {
result = firstName; if (firstName != null && firstName.length() > 0) {
if (result == null || result.length() == 0) { result.append(firstName);
result = lastName; if (lastName != null && lastName.length() > 0) {
} else if (result.length() != 0 && lastName != null && lastName.length() != 0) { result.append(" ");
result += " " + lastName; result.append(lastName);
}
} else if (lastName != null && lastName.length() > 0) {
result.append(lastName);
} }
} else { } else {
result = lastName; if (lastName != null && lastName.length() > 0) {
if (result == null || result.length() == 0) { result.append(lastName);
result = firstName; if (firstName != null && firstName.length() > 0) {
} else if (result.length() != 0 && firstName != null && firstName.length() != 0) { result.append(" ");
result += " " + firstName; result.append(firstName);
}
} else if (firstName != null && firstName.length() > 0) {
result.append(firstName);
} }
} }
return result.trim(); return result.toString();
} }
} }
...@@ -33,7 +33,8 @@ import org.telegram.messenger.ApplicationLoader; ...@@ -33,7 +33,8 @@ import org.telegram.messenger.ApplicationLoader;
public class Emoji { public class Emoji {
private static HashMap<Long, DrawableInfo> rects = new HashMap<>(); private static HashMap<Long, DrawableInfo> rects = new HashMap<>();
private static int drawImgSize, bigImgSize; private static int drawImgSize;
private static int bigImgSize;
private static boolean inited = false; private static boolean inited = false;
private static Paint placeholderPaint; private static Paint placeholderPaint;
private static Bitmap emojiBmp[] = new Bitmap[5]; private static Bitmap emojiBmp[] = new Bitmap[5];
...@@ -193,19 +194,19 @@ public class Emoji { ...@@ -193,19 +194,19 @@ public class Emoji {
static { static {
int emojiFullSize; int emojiFullSize;
if (AndroidUtilities.density <= 1.0f) { if (AndroidUtilities.density <= 1.0f) {
emojiFullSize = 30; emojiFullSize = 32;
} else if (AndroidUtilities.density <= 1.5f) { } else if (AndroidUtilities.density <= 1.5f) {
emojiFullSize = 45; emojiFullSize = 48;
} else if (AndroidUtilities.density <= 2.0f) { } else if (AndroidUtilities.density <= 2.0f) {
emojiFullSize = 60; emojiFullSize = 64;
} else { } else {
emojiFullSize = 90; emojiFullSize = 96;
} }
drawImgSize = AndroidUtilities.dp(20); drawImgSize = AndroidUtilities.dp(20);
if (AndroidUtilities.isTablet()) { if (AndroidUtilities.isTablet()) {
bigImgSize = AndroidUtilities.dp(40); bigImgSize = AndroidUtilities.dp(40);
} else { } else {
bigImgSize = AndroidUtilities.dp(30); bigImgSize = AndroidUtilities.dp(32);
} }
for (int j = 1; j < data.length; j++) { for (int j = 1; j < data.length; j++) {
...@@ -220,7 +221,7 @@ public class Emoji { ...@@ -220,7 +221,7 @@ public class Emoji {
private static void loadEmoji(final int page) { private static void loadEmoji(final int page) {
try { try {
float scale = 1.0f; float scale;
int imageResize = 1; int imageResize = 1;
if (AndroidUtilities.density <= 1.0f) { if (AndroidUtilities.density <= 1.0f) {
scale = 2.0f; scale = 2.0f;
...@@ -234,11 +235,29 @@ public class Emoji { ...@@ -234,11 +235,29 @@ public class Emoji {
scale = 3.0f; scale = 3.0f;
} }
String imageName = String.format(Locale.US, "emoji%.01fx_%d.jpg", scale, page); String imageName;
File imageFile = ApplicationLoader.applicationContext.getFileStreamPath(imageName); File imageFile;
try {
imageName = String.format(Locale.US, "emoji%.01fx_%d.jpg", scale, page);
imageFile = ApplicationLoader.applicationContext.getFileStreamPath(imageName);
if (imageFile.exists()) {
imageFile.delete();
}
imageName = String.format(Locale.US, "emoji%.01fx_a_%d.jpg", scale, page);
imageFile = ApplicationLoader.applicationContext.getFileStreamPath(imageName);
if (imageFile.exists()) {
imageFile.delete();
}
} catch (Exception e) {
FileLog.e("tmessages", e);
}
imageName = String.format(Locale.US, "v4_emoji%.01fx_%d.jpg", scale, page);
imageFile = ApplicationLoader.applicationContext.getFileStreamPath(imageName);
if (!imageFile.exists()) { if (!imageFile.exists()) {
InputStream is = ApplicationLoader.applicationContext.getAssets().open("emoji/" + imageName); InputStream is = ApplicationLoader.applicationContext.getAssets().open("emoji/" + imageName);
Utilities.copyFile(is, imageFile); AndroidUtilities.copyFile(is, imageFile);
is.close(); is.close();
} }
...@@ -253,11 +272,11 @@ public class Emoji { ...@@ -253,11 +272,11 @@ public class Emoji {
final Bitmap bitmap = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888); final Bitmap bitmap = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888);
Utilities.loadBitmap(imageFile.getAbsolutePath(), bitmap, imageResize, width, height, stride); Utilities.loadBitmap(imageFile.getAbsolutePath(), bitmap, imageResize, width, height, stride);
imageName = String.format(Locale.US, "emoji%.01fx_a_%d.jpg", scale, page); imageName = String.format(Locale.US, "v4_emoji%.01fx_a_%d.jpg", scale, page);
imageFile = ApplicationLoader.applicationContext.getFileStreamPath(imageName); imageFile = ApplicationLoader.applicationContext.getFileStreamPath(imageName);
if (!imageFile.exists()) { if (!imageFile.exists()) {
InputStream is = ApplicationLoader.applicationContext.getAssets().open("emoji/" + imageName); InputStream is = ApplicationLoader.applicationContext.getAssets().open("emoji/" + imageName);
Utilities.copyFile(is, imageFile); AndroidUtilities.copyFile(is, imageFile);
is.close(); is.close();
} }
......
...@@ -23,7 +23,6 @@ import org.telegram.messenger.ConnectionsManager; ...@@ -23,7 +23,6 @@ import org.telegram.messenger.ConnectionsManager;
import org.telegram.messenger.FileLog; import org.telegram.messenger.FileLog;
import org.telegram.messenger.R; import org.telegram.messenger.R;
import org.telegram.messenger.TLRPC; import org.telegram.messenger.TLRPC;
import org.telegram.messenger.Utilities;
import org.telegram.messenger.ApplicationLoader; import org.telegram.messenger.ApplicationLoader;
import org.xmlpull.v1.XmlPullParser; import org.xmlpull.v1.XmlPullParser;
...@@ -309,6 +308,10 @@ public class LocaleController { ...@@ -309,6 +308,10 @@ public class LocaleController {
} }
} }
public Locale getSystemDefaultLocale() {
return systemDefaultLocale;
}
public static String getLocaleString(Locale locale) { public static String getLocaleString(Locale locale) {
if (locale == null) { if (locale == null) {
return "en"; return "en";
...@@ -355,7 +358,7 @@ public class LocaleController { ...@@ -355,7 +358,7 @@ public class LocaleController {
} }
File finalFile = new File(ApplicationLoader.applicationContext.getFilesDir(), languageCode + ".xml"); File finalFile = new File(ApplicationLoader.applicationContext.getFilesDir(), languageCode + ".xml");
if (!Utilities.copyFile(file, finalFile)) { if (!AndroidUtilities.copyFile(file, finalFile)) {
return false; return false;
} }
...@@ -490,7 +493,6 @@ public class LocaleController { ...@@ -490,7 +493,6 @@ public class LocaleController {
try { try {
if (stream != null) { if (stream != null) {
stream.close(); stream.close();
stream = null;
} }
} catch (Exception e) { } catch (Exception e) {
FileLog.e("tmessages", e); FileLog.e("tmessages", e);
...@@ -508,7 +510,7 @@ public class LocaleController { ...@@ -508,7 +510,7 @@ public class LocaleController {
return; return;
} }
try { try {
Locale newLocale = null; Locale newLocale;
if (localeInfo.shortName != null) { if (localeInfo.shortName != null) {
String[] args = localeInfo.shortName.split("_"); String[] args = localeInfo.shortName.split("_");
if (args.length == 1) { if (args.length == 1) {
...@@ -607,11 +609,12 @@ public class LocaleController { ...@@ -607,11 +609,12 @@ public class LocaleController {
} }
public static String formatString(String key, int res, Object... args) { public static String formatString(String key, int res, Object... args) {
try {
String value = getInstance().localeValues.get(key); String value = getInstance().localeValues.get(key);
if (value == null) { if (value == null) {
value = ApplicationLoader.applicationContext.getString(res); value = ApplicationLoader.applicationContext.getString(res);
} }
try {
if (getInstance().currentLocale != null) { if (getInstance().currentLocale != null) {
return String.format(getInstance().currentLocale, value, args); return String.format(getInstance().currentLocale, value, args);
} else { } else {
...@@ -677,6 +680,7 @@ public class LocaleController { ...@@ -677,6 +680,7 @@ public class LocaleController {
} }
public static String formatDate(long date) { public static String formatDate(long date) {
try {
Calendar rightNow = Calendar.getInstance(); Calendar rightNow = Calendar.getInstance();
int day = rightNow.get(Calendar.DAY_OF_YEAR); int day = rightNow.get(Calendar.DAY_OF_YEAR);
int year = rightNow.get(Calendar.YEAR); int year = rightNow.get(Calendar.YEAR);
...@@ -693,9 +697,14 @@ public class LocaleController { ...@@ -693,9 +697,14 @@ public class LocaleController {
} else { } else {
return formatterYear.format(new Date(date * 1000)); return formatterYear.format(new Date(date * 1000));
} }
} catch (Exception e) {
FileLog.e("tmessages", e);
}
return "LOC_ERR";
} }
public static String formatDateOnline(long date) { public static String formatDateOnline(long date) {
try {
Calendar rightNow = Calendar.getInstance(); Calendar rightNow = Calendar.getInstance();
int day = rightNow.get(Calendar.DAY_OF_YEAR); int day = rightNow.get(Calendar.DAY_OF_YEAR);
int year = rightNow.get(Calendar.YEAR); int year = rightNow.get(Calendar.YEAR);
...@@ -714,13 +723,17 @@ public class LocaleController { ...@@ -714,13 +723,17 @@ public class LocaleController {
String format = LocaleController.formatString("formatDateAtTime", R.string.formatDateAtTime, formatterYear.format(new Date(date * 1000)), formatterDay.format(new Date(date * 1000))); String format = LocaleController.formatString("formatDateAtTime", R.string.formatDateAtTime, formatterYear.format(new Date(date * 1000)), formatterDay.format(new Date(date * 1000)));
return String.format("%s %s", LocaleController.getString("LastSeenDate", R.string.LastSeenDate), format); return String.format("%s %s", LocaleController.getString("LastSeenDate", R.string.LastSeenDate), format);
} }
} catch (Exception e) {
FileLog.e("tmessages", e);
}
return "LOC_ERR";
} }
private FastDateFormat createFormatter(Locale locale, String format, String defaultFormat) { private FastDateFormat createFormatter(Locale locale, String format, String defaultFormat) {
if (format == null || format.length() == 0) { if (format == null || format.length() == 0) {
format = defaultFormat; format = defaultFormat;
} }
FastDateFormat formatter = null; FastDateFormat formatter;
try { try {
formatter = FastDateFormat.getInstance(format, locale); formatter = FastDateFormat.getInstance(format, locale);
} catch (Exception e) { } catch (Exception e) {
...@@ -753,6 +766,7 @@ public class LocaleController { ...@@ -753,6 +766,7 @@ public class LocaleController {
} }
public static String stringForMessageListDate(long date) { public static String stringForMessageListDate(long date) {
try {
Calendar rightNow = Calendar.getInstance(); Calendar rightNow = Calendar.getInstance();
int day = rightNow.get(Calendar.DAY_OF_YEAR); int day = rightNow.get(Calendar.DAY_OF_YEAR);
int year = rightNow.get(Calendar.YEAR); int year = rightNow.get(Calendar.YEAR);
...@@ -772,6 +786,10 @@ public class LocaleController { ...@@ -772,6 +786,10 @@ public class LocaleController {
return formatterMonth.format(new Date(date * 1000)); return formatterMonth.format(new Date(date * 1000));
} }
} }
} catch (Exception e) {
FileLog.e("tmessages", e);
}
return "LOC_ERR";
} }
public static String formatUserStatus(TLRPC.User user) { public static String formatUserStatus(TLRPC.User user) {
......
...@@ -107,7 +107,6 @@ public class LruCache { ...@@ -107,7 +107,6 @@ public class LruCache {
if (previous != null) { if (previous != null) {
entryRemoved(false, key, previous, value); entryRemoved(false, key, previous, value);
ImageLoader.getInstance().callGC();
} }
trimToSize(maxSize, key); trimToSize(maxSize, key);
...@@ -148,7 +147,6 @@ public class LruCache { ...@@ -148,7 +147,6 @@ public class LruCache {
entryRemoved(true, key, value, null); entryRemoved(true, key, value, null);
} }
ImageLoader.getInstance().callGC();
} }
} }
...@@ -183,7 +181,6 @@ public class LruCache { ...@@ -183,7 +181,6 @@ public class LruCache {
} }
entryRemoved(false, key, previous, null); entryRemoved(false, key, previous, null);
ImageLoader.getInstance().callGC();
} }
return previous; return previous;
......
...@@ -23,7 +23,7 @@ import java.util.zip.ZipFile; ...@@ -23,7 +23,7 @@ import java.util.zip.ZipFile;
public class NativeLoader { public class NativeLoader {
private final static int LIB_VERSION = 7; private final static int LIB_VERSION = 8;
private final static String LIB_NAME = "tmessages." + LIB_VERSION; private final static String LIB_NAME = "tmessages." + LIB_VERSION;
private final static String LIB_SO_NAME = "lib" + LIB_NAME + ".so"; private final static String LIB_SO_NAME = "lib" + LIB_NAME + ".so";
private final static String LOCALE_LIB_SO_NAME = "lib" + LIB_NAME + "loc.so"; private final static String LOCALE_LIB_SO_NAME = "lib" + LIB_NAME + "loc.so";
......
...@@ -17,6 +17,7 @@ import org.telegram.messenger.FileLog; ...@@ -17,6 +17,7 @@ import org.telegram.messenger.FileLog;
import org.telegram.messenger.ApplicationLoader; import org.telegram.messenger.ApplicationLoader;
public class ScreenReceiver extends BroadcastReceiver { public class ScreenReceiver extends BroadcastReceiver {
@Override @Override
public void onReceive(Context context, Intent intent) { public void onReceive(Context context, Intent intent) {
if (intent.getAction().equals(Intent.ACTION_SCREEN_OFF)) { if (intent.getAction().equals(Intent.ACTION_SCREEN_OFF)) {
......
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment