- New animations and many visual improvements
- Support for new emoji - Android 6.0 support - Now on Tap - Direct Share - Fingerprint support for Passcodes (Android 6.0 only) - Other improvements and bug fixes
@ -5,19 +5,20 @@ repositories {
|
||||
}
|
||||
|
||||
dependencies {
|
||||
compile 'com.android.support:support-v4:23.0.+'
|
||||
compile 'com.android.support:support-v4:23.1.+'
|
||||
compile 'com.google.android.gms:play-services:3.2.+'
|
||||
//compile 'com.google.android.gms:play-services:7.5.0'
|
||||
compile 'net.hockeyapp.android:HockeySDK:3.5.+'
|
||||
compile 'com.googlecode.mp4parser:isoparser:1.0.+'
|
||||
compile 'org.apache.httpcomponents:httpmime:4.2.1'
|
||||
//compile 'com.android.support:multidex:1.0.1'
|
||||
}
|
||||
|
||||
android {
|
||||
compileSdkVersion 22
|
||||
compileSdkVersion 23
|
||||
buildToolsVersion '23.0.1'
|
||||
|
||||
useLibrary 'org.apache.http.legacy'
|
||||
|
||||
packagingOptions {
|
||||
exclude 'META-INF/NOTICE.txt'
|
||||
exclude 'META-INF/LICENSE.txt'
|
||||
@ -87,9 +88,8 @@ android {
|
||||
defaultConfig {
|
||||
applicationId "org.telegram.plus"
|
||||
minSdkVersion 8
|
||||
targetSdkVersion 22
|
||||
versionCode 632
|
||||
versionName "3.2.2.2"
|
||||
//multiDexEnabled true
|
||||
targetSdkVersion 23
|
||||
versionCode 655
|
||||
versionName "3.2.6.0"
|
||||
}
|
||||
}
|
||||
|
@ -34,7 +34,7 @@
|
||||
<activity android:name="net.hockeyapp.android.UpdateActivity" />
|
||||
|
||||
<receiver
|
||||
android:name="org.telegram.messenger.GcmBroadcastReceiver"
|
||||
android:name=".GcmBroadcastReceiver"
|
||||
android:permission="com.google.android.c2dm.permission.SEND" >
|
||||
<intent-filter>
|
||||
<action android:name="com.google.android.c2dm.intent.RECEIVE" />
|
||||
|
@ -187,7 +187,7 @@ include $(CLEAR_VARS)
|
||||
LOCAL_PRELINK_MODULE := false
|
||||
LOCAL_STATIC_LIBRARIES := webp sqlite tgnet breakpad
|
||||
|
||||
LOCAL_MODULE := tmessages.12
|
||||
LOCAL_MODULE := tmessages.14
|
||||
LOCAL_CFLAGS := -w -std=c11 -Os -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 += -DANDROID_NDK -DDISABLE_IMPORTGL -fno-strict-aliasing -fprefetch-loop-arrays -DAVOID_TABLES -DANDROID_TILE_BASED_DECODE -DANDROID_ARMV6_IDCT -ffast-math
|
||||
|
@ -16,11 +16,6 @@ jfieldID jclass_Options_inJustDecodeBounds;
|
||||
jfieldID jclass_Options_outHeight;
|
||||
jfieldID jclass_Options_outWidth;
|
||||
|
||||
jclass jclass_Bitmap;
|
||||
jmethodID jclass_Bitmap_createBitmap;
|
||||
jclass jclass_Config;
|
||||
jfieldID jclass_Config_ARGB_8888;
|
||||
|
||||
const uint32_t PGPhotoEnhanceHistogramBins = 256;
|
||||
const uint32_t PGPhotoEnhanceSegments = 4;
|
||||
|
||||
@ -58,24 +53,6 @@ jint imageOnJNILoad(JavaVM *vm, void *reserved, JNIEnv *env) {
|
||||
return -1;
|
||||
}
|
||||
|
||||
jclass_Bitmap = createGlobarRef(env, (*env)->FindClass(env, "android/graphics/Bitmap"));
|
||||
if (jclass_Bitmap == 0) {
|
||||
return -1;
|
||||
}
|
||||
jclass_Bitmap_createBitmap = (*env)->GetStaticMethodID(env, jclass_Bitmap, "createBitmap", "(IILandroid/graphics/Bitmap$Config;)Landroid/graphics/Bitmap;");
|
||||
if (jclass_Bitmap_createBitmap == 0) {
|
||||
return -1;
|
||||
}
|
||||
|
||||
jclass_Config = createGlobarRef(env, (*env)->FindClass(env, "android/graphics/Bitmap$Config"));
|
||||
if (jclass_Config == 0) {
|
||||
return -1;
|
||||
}
|
||||
jclass_Config_ARGB_8888 = (*env)->GetStaticFieldID(env, jclass_Config, "ARGB_8888", "Landroid/graphics/Bitmap$Config;");
|
||||
if (jclass_Config_ARGB_8888 == 0) {
|
||||
return -1;
|
||||
}
|
||||
|
||||
return JNI_VERSION_1_6;
|
||||
}
|
||||
|
||||
@ -511,7 +488,7 @@ JNIEXPORT void Java_org_telegram_messenger_Utilities_loadBitmap(JNIEnv *env, jcl
|
||||
}
|
||||
}
|
||||
|
||||
JNIEXPORT jobject Java_org_telegram_messenger_Utilities_loadWebpImage(JNIEnv *env, jclass class, jobject buffer, int len, jobject options) {
|
||||
JNIEXPORT jboolean Java_org_telegram_messenger_Utilities_loadWebpImage(JNIEnv *env, jclass class, jobject outputBitmap, jobject buffer, jint len, jobject options, jboolean unpin) {
|
||||
if (!buffer) {
|
||||
(*env)->ThrowNew(env, jclass_NullPointerException, "Input buffer can not be null");
|
||||
return 0;
|
||||
@ -529,43 +506,36 @@ JNIEXPORT jobject Java_org_telegram_messenger_Utilities_loadWebpImage(JNIEnv *en
|
||||
if (options && (*env)->GetBooleanField(env, options, jclass_Options_inJustDecodeBounds) == JNI_TRUE) {
|
||||
(*env)->SetIntField(env, options, jclass_Options_outWidth, bitmapWidth);
|
||||
(*env)->SetIntField(env, options, jclass_Options_outHeight, bitmapHeight);
|
||||
return 0;
|
||||
return 1;
|
||||
}
|
||||
|
||||
jobject value__ARGB_8888 = (*env)->GetStaticObjectField(env, jclass_Config, jclass_Config_ARGB_8888);
|
||||
jobject outputBitmap = (*env)->CallStaticObjectMethod(env, jclass_Bitmap, jclass_Bitmap_createBitmap, (jint)bitmapWidth, (jint)bitmapHeight, value__ARGB_8888);
|
||||
if (!outputBitmap) {
|
||||
(*env)->ThrowNew(env, jclass_RuntimeException, "Failed to allocate Bitmap");
|
||||
(*env)->ThrowNew(env, jclass_NullPointerException, "output bitmap can not be null");
|
||||
return 0;
|
||||
}
|
||||
outputBitmap = (*env)->NewLocalRef(env, outputBitmap);
|
||||
|
||||
AndroidBitmapInfo bitmapInfo;
|
||||
if (AndroidBitmap_getInfo(env, outputBitmap, &bitmapInfo) != ANDROID_BITMAP_RESUT_SUCCESS) {
|
||||
(*env)->DeleteLocalRef(env, outputBitmap);
|
||||
(*env)->ThrowNew(env, jclass_RuntimeException, "Failed to get Bitmap information");
|
||||
return 0;
|
||||
}
|
||||
|
||||
void *bitmapPixels = 0;
|
||||
if (AndroidBitmap_lockPixels(env, outputBitmap, &bitmapPixels) != ANDROID_BITMAP_RESUT_SUCCESS) {
|
||||
(*env)->DeleteLocalRef(env, outputBitmap);
|
||||
(*env)->ThrowNew(env, jclass_RuntimeException, "Failed to lock Bitmap pixels");
|
||||
return 0;
|
||||
}
|
||||
|
||||
if (!WebPDecodeRGBAInto((uint8_t*)inputBuffer, len, (uint8_t*)bitmapPixels, bitmapInfo.height * bitmapInfo.stride, bitmapInfo.stride)) {
|
||||
AndroidBitmap_unlockPixels(env, outputBitmap);
|
||||
(*env)->DeleteLocalRef(env, outputBitmap);
|
||||
(*env)->ThrowNew(env, jclass_RuntimeException, "Failed to decode webp image");
|
||||
return 0;
|
||||
}
|
||||
|
||||
if (AndroidBitmap_unlockPixels(env, outputBitmap) != ANDROID_BITMAP_RESUT_SUCCESS) {
|
||||
(*env)->DeleteLocalRef(env, outputBitmap);
|
||||
if (unpin && AndroidBitmap_unlockPixels(env, outputBitmap) != ANDROID_BITMAP_RESUT_SUCCESS) {
|
||||
(*env)->ThrowNew(env, jclass_RuntimeException, "Failed to unlock Bitmap pixels");
|
||||
return 0;
|
||||
}
|
||||
|
||||
return outputBitmap;
|
||||
return 1;
|
||||
}
|
||||
|
@ -12,8 +12,6 @@
|
||||
|
||||
<uses-feature android:glEsVersion="0x00020000" android:required="false"/>
|
||||
<uses-feature android:name="android.hardware.telephony" android:required="false" />
|
||||
<uses-feature android:name="android.hardware.camera.autofocus" android:required="false" />
|
||||
<uses-feature android:name="android.hardware.camera" android:required="false" />
|
||||
<uses-feature android:name="android.hardware.wifi" android:required="false" />
|
||||
<uses-feature android:name="android.hardware.screen.PORTRAIT" android:required="false" />
|
||||
<uses-feature android:name="android.hardware.microphone" android:required="false" />
|
||||
@ -26,7 +24,6 @@
|
||||
<uses-permission android:name="android.permission.WAKE_LOCK" />
|
||||
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
|
||||
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
|
||||
<uses-permission android:name="android.permission.CAMERA" />
|
||||
<uses-permission android:name="android.permission.GET_ACCOUNTS" />
|
||||
<uses-permission android:name="android.permission.READ_CONTACTS" />
|
||||
<uses-permission android:name="android.permission.WRITE_CONTACTS" />
|
||||
@ -39,6 +36,7 @@
|
||||
<uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW" />
|
||||
<uses-permission android:name="android.permission.READ_PHONE_STATE" />
|
||||
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />
|
||||
<uses-permission android:name="android.permission.USE_FINGERPRINT" />
|
||||
|
||||
<application
|
||||
android:name=".ApplicationLoader"
|
||||
@ -108,6 +106,7 @@
|
||||
<category android:name="android.intent.category.DEFAULT" />
|
||||
<data android:scheme="tg" />
|
||||
</intent-filter>
|
||||
<meta-data android:name="android.service.chooser.chooser_target_service" android:value=".TgChooserTargetService" />
|
||||
</activity>
|
||||
<activity
|
||||
android:name="org.telegram.ui.IntroActivity"
|
||||
@ -159,6 +158,15 @@
|
||||
android:resource="@xml/contacts" />
|
||||
</service>
|
||||
|
||||
<service
|
||||
android:name=".TgChooserTargetService"
|
||||
android:label="@string/AppName"
|
||||
android:permission="android.permission.BIND_CHOOSER_TARGET_SERVICE">
|
||||
<intent-filter>
|
||||
<action android:name="android.service.chooser.ChooserTargetService" />
|
||||
</intent-filter>
|
||||
</service>
|
||||
|
||||
<service android:name=".NotificationsService" android:enabled="true"/>
|
||||
<service android:name=".NotificationRepeat" android:exported="false"/>
|
||||
<service android:name=".VideoEncodingService" android:enabled="true"/>
|
||||
|
Before Width: | Height: | Size: 152 KiB |
Before Width: | Height: | Size: 83 KiB |
Before Width: | Height: | Size: 167 KiB |
Before Width: | Height: | Size: 86 KiB |
Before Width: | Height: | Size: 154 KiB |
Before Width: | Height: | Size: 112 KiB |
Before Width: | Height: | Size: 76 KiB |
Before Width: | Height: | Size: 136 KiB |
Before Width: | Height: | Size: 52 KiB |
Before Width: | Height: | Size: 103 KiB |
Before Width: | Height: | Size: 260 KiB |
Before Width: | Height: | Size: 146 KiB |
Before Width: | Height: | Size: 297 KiB |
Before Width: | Height: | Size: 160 KiB |
Before Width: | Height: | Size: 280 KiB |
Before Width: | Height: | Size: 180 KiB |
Before Width: | Height: | Size: 126 KiB |
Before Width: | Height: | Size: 222 KiB |
Before Width: | Height: | Size: 85 KiB |
Before Width: | Height: | Size: 182 KiB |
@ -1,9 +1,9 @@
|
||||
/*
|
||||
* This is the source code of Telegram for Android v. 1.3.2.
|
||||
* This is the source code of Telegram for Android v. 3.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.
|
||||
* Copyright Nikolai Kudashov, 2013-2015.
|
||||
*/
|
||||
|
||||
package org.telegram.SQLite;
|
||||
|
@ -1,9 +1,9 @@
|
||||
/*
|
||||
* This is the source code of Telegram for Android v. 1.3.2.
|
||||
* This is the source code of Telegram for Android v. 3.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.
|
||||
* Copyright Nikolai Kudashov, 2013-2015.
|
||||
*/
|
||||
|
||||
package org.telegram.SQLite;
|
||||
@ -22,7 +22,7 @@ public class SQLiteDatabase {
|
||||
}
|
||||
|
||||
public SQLiteDatabase(String fileName) throws SQLiteException {
|
||||
sqliteHandle = opendb(fileName, ApplicationLoader.applicationContext.getFilesDir().getPath());
|
||||
sqliteHandle = opendb(fileName, ApplicationLoader.getFilesDirFixed().getPath());
|
||||
isOpen = true;
|
||||
}
|
||||
|
||||
|
@ -1,9 +1,9 @@
|
||||
/*
|
||||
* This is the source code of Telegram for Android v. 1.3.2.
|
||||
* This is the source code of Telegram for Android v. 3.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.
|
||||
* Copyright Nikolai Kudashov, 2013-2015.
|
||||
*/
|
||||
|
||||
package org.telegram.SQLite;
|
||||
|
@ -1,9 +1,9 @@
|
||||
/*
|
||||
* This is the source code of Telegram for Android v. 1.3.2.
|
||||
* This is the source code of Telegram for Android v. 3.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.
|
||||
* Copyright Nikolai Kudashov, 2013-2015.
|
||||
*/
|
||||
|
||||
package org.telegram.SQLite;
|
||||
|
@ -1,9 +1,9 @@
|
||||
/*
|
||||
* This is the source code of Telegram for Android v. 1.3.2.
|
||||
* This is the source code of Telegram for Android v. 3.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.
|
||||
* Copyright Nikolai Kudashov, 2013-2015.
|
||||
*/
|
||||
|
||||
package org.telegram.SQLite;
|
||||
|
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* This is the source code of Telegram for Android v. 2.x.x.
|
||||
* This is the source code of Telegram for Android v. 3.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).
|
||||
*
|
||||
@ -17,6 +17,7 @@ import android.content.Context;
|
||||
import android.content.Intent;
|
||||
import android.content.IntentFilter;
|
||||
import android.content.SharedPreferences;
|
||||
import android.content.pm.ApplicationInfo;
|
||||
import android.content.pm.PackageInfo;
|
||||
import android.content.res.Configuration;
|
||||
import android.graphics.drawable.ColorDrawable;
|
||||
@ -96,7 +97,7 @@ public class ApplicationLoader extends Application {
|
||||
cachedWallpaper = applicationContext.getResources().getDrawable(R.drawable.background_hd);
|
||||
isCustomTheme = false;
|
||||
} else {
|
||||
File toFile = new File(ApplicationLoader.applicationContext.getFilesDir(), "wallpaper.jpg");
|
||||
File toFile = new File(getFilesDirFixed(), "wallpaper.jpg");
|
||||
if (toFile.exists()) {
|
||||
cachedWallpaper = Drawable.createFromPath(toFile.getAbsolutePath());
|
||||
isCustomTheme = true;
|
||||
@ -155,7 +156,7 @@ public class ApplicationLoader extends Application {
|
||||
}
|
||||
|
||||
try {
|
||||
File file = new File(ApplicationLoader.applicationContext.getFilesDir(), "tgnet.dat");
|
||||
File file = new File(getFilesDirFixed(), "tgnet.dat");
|
||||
RandomAccessFile fileOutputStream = new RandomAccessFile(file, "rws");
|
||||
byte[] bytes = buffer.toByteArray();
|
||||
fileOutputStream.writeInt(Integer.reverseBytes(bytes.length));
|
||||
@ -169,6 +170,24 @@ public class ApplicationLoader extends Application {
|
||||
}
|
||||
}
|
||||
|
||||
public static File getFilesDirFixed() {
|
||||
for (int a = 0; a < 10; a++) {
|
||||
File path = ApplicationLoader.applicationContext.getFilesDir();
|
||||
if (path != null) {
|
||||
return path;
|
||||
}
|
||||
}
|
||||
try {
|
||||
ApplicationInfo info = applicationContext.getApplicationInfo();
|
||||
File path = new File(info.dataDir, "files");
|
||||
path.mkdirs();
|
||||
return path;
|
||||
} catch (Exception e) {
|
||||
FileLog.e("tmessages", e);
|
||||
}
|
||||
return new File("/data/data/org.telegram.messenger/files");
|
||||
}
|
||||
|
||||
public static void postInitApplication() {
|
||||
if (applicationInited) {
|
||||
return;
|
||||
@ -205,7 +224,7 @@ public class ApplicationLoader extends Application {
|
||||
String langCode;
|
||||
String appVersion;
|
||||
String systemVersion;
|
||||
String configPath = ApplicationLoader.applicationContext.getFilesDir().toString();
|
||||
String configPath = getFilesDirFixed().toString();
|
||||
|
||||
try {
|
||||
langCode = LocaleController.getLocaleString(LocaleController.getInstance().getSystemDefaultLocale());
|
||||
@ -233,7 +252,7 @@ public class ApplicationLoader extends Application {
|
||||
}
|
||||
|
||||
MessagesController.getInstance();
|
||||
ConnectionsManager.getInstance().init(BuildVars.BUILD_VERSION, TLRPC.LAYER, BuildVars.APP_ID, deviceModel, systemVersion, appVersion, langCode, configPath, UserConfig.getClientUserId());
|
||||
ConnectionsManager.getInstance().init(BuildVars.BUILD_VERSION, TLRPC.LAYER, BuildVars.APP_ID, deviceModel, systemVersion, appVersion, langCode, configPath, FileLog.getNetworkLogPath(), UserConfig.getClientUserId());
|
||||
if (UserConfig.getCurrentUser() != null) {
|
||||
MessagesController.getInstance().putUser(UserConfig.getCurrentUser(), true);
|
||||
ConnectionsManager.getInstance().applyCountryPortNumber(UserConfig.getCurrentUser().phone);
|
||||
|
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* This is the source code of Telegram for Android v. 2.x.x.
|
||||
* This is the source code of Telegram for Android v. 3.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).
|
||||
*
|
||||
|
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* This is the source code of Telegram for Android v. 2.x.x.
|
||||
* This is the source code of Telegram for Android v. 3.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).
|
||||
*
|
||||
@ -256,7 +256,8 @@ public class FileLoadOperation {
|
||||
nextDownloadOffset = downloadedBytes = downloadedBytes / currentDownloadChunkSize * currentDownloadChunkSize;
|
||||
}
|
||||
|
||||
if (BuildVars.DEBUG_VERSION) {
|
||||
//if (BuildVars.DEBUG_VERSION) {
|
||||
if (BuildConfig.DEBUG) {
|
||||
FileLog.d("tmessages", "start loading file to temp = " + cacheFileTemp + " final = " + cacheFileFinal);
|
||||
}
|
||||
|
||||
@ -377,13 +378,15 @@ public class FileLoadOperation {
|
||||
}
|
||||
if (cacheFileTemp != null) {
|
||||
if (!cacheFileTemp.renameTo(cacheFileFinal)) {
|
||||
if (BuildVars.DEBUG_VERSION) {
|
||||
//if (BuildVars.DEBUG_VERSION) {
|
||||
if (BuildConfig.DEBUG) {
|
||||
FileLog.e("tmessages", "unable to rename temp = " + cacheFileTemp + " to final = " + cacheFileFinal);
|
||||
}
|
||||
cacheFileFinal = cacheFileTemp;
|
||||
}
|
||||
}
|
||||
if (BuildVars.DEBUG_VERSION) {
|
||||
//if (BuildVars.DEBUG_VERSION) {
|
||||
if (BuildConfig.DEBUG) {
|
||||
FileLog.e("tmessages", "finished downloading file to " + cacheFileFinal);
|
||||
}
|
||||
delegate.didFinishLoadingFile(FileLoadOperation.this, cacheFileFinal);
|
||||
|
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* This is the source code of Telegram for Android v. 2.x.x.
|
||||
* This is the source code of Telegram for Android v. 3.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).
|
||||
*
|
||||
@ -8,7 +8,6 @@
|
||||
|
||||
package org.telegram.messenger;
|
||||
|
||||
|
||||
import org.telegram.tgnet.TLObject;
|
||||
import org.telegram.tgnet.TLRPC;
|
||||
|
||||
@ -27,7 +26,7 @@ public class FileLoader {
|
||||
public interface FileLoaderDelegate {
|
||||
void fileUploadProgressChanged(String location, float progress, boolean isEncrypted);
|
||||
|
||||
void fileDidUploaded(String location, TLRPC.InputFile inputFile, TLRPC.InputEncryptedFile inputEncryptedFile, byte[] key, byte[] iv);
|
||||
void fileDidUploaded(String location, TLRPC.InputFile inputFile, TLRPC.InputEncryptedFile inputEncryptedFile, byte[] key, byte[] iv, long totalFileSize);
|
||||
|
||||
void fileDidFailedUpload(String location, boolean isEncrypted);
|
||||
|
||||
@ -112,6 +111,7 @@ public class FileLoader {
|
||||
}
|
||||
uploadSizes.remove(location);
|
||||
if (operation != null) {
|
||||
uploadOperationPathsEnc.remove(location);
|
||||
uploadOperationQueue.remove(operation);
|
||||
uploadSmallOperationQueue.remove(operation);
|
||||
operation.cancel();
|
||||
@ -175,7 +175,7 @@ public class FileLoader {
|
||||
}
|
||||
operation.delegate = new FileUploadOperation.FileUploadOperationDelegate() {
|
||||
@Override
|
||||
public void didFinishUploadingFile(FileUploadOperation operation, final TLRPC.InputFile inputFile, final TLRPC.InputEncryptedFile inputEncryptedFile, final byte[] key, final byte[] iv) {
|
||||
public void didFinishUploadingFile(final FileUploadOperation operation, final TLRPC.InputFile inputFile, final TLRPC.InputEncryptedFile inputEncryptedFile, final byte[] key, final byte[] iv) {
|
||||
fileLoaderQueue.postRunnable(new Runnable() {
|
||||
@Override
|
||||
public void run() {
|
||||
@ -204,7 +204,7 @@ public class FileLoader {
|
||||
}
|
||||
}
|
||||
if (delegate != null) {
|
||||
delegate.fileDidUploaded(location, inputFile, inputEncryptedFile, key, iv);
|
||||
delegate.fileDidUploaded(location, inputFile, inputEncryptedFile, key, iv, operation.getTotalFileSize());
|
||||
}
|
||||
}
|
||||
});
|
||||
|
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* This is the source code of Telegram for Android v. 2.x.x.
|
||||
* This is the source code of Telegram for Android v. 3.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).
|
||||
*
|
||||
@ -22,6 +22,7 @@ public class FileLog {
|
||||
private FastDateFormat dateFormat = null;
|
||||
private DispatchQueue logQueue = null;
|
||||
private File currentFile = null;
|
||||
private File networkFile = null;
|
||||
|
||||
private static volatile FileLog Instance = null;
|
||||
public static FileLog getInstance() {
|
||||
@ -66,6 +67,22 @@ public class FileLog {
|
||||
}
|
||||
}
|
||||
|
||||
public static String getNetworkLogPath() {
|
||||
try {
|
||||
File sdCard = ApplicationLoader.applicationContext.getExternalFilesDir(null);
|
||||
if (sdCard == null) {
|
||||
return "";
|
||||
}
|
||||
File dir = new File(sdCard.getAbsolutePath() + "/logs");
|
||||
dir.mkdirs();
|
||||
getInstance().networkFile = new File(dir, getInstance().dateFormat.format(System.currentTimeMillis()) + "_net.txt");
|
||||
return getInstance().networkFile.getAbsolutePath();
|
||||
} catch (Throwable e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
return "";
|
||||
}
|
||||
|
||||
public static void e(final String tag, final String message, final Throwable exception) {
|
||||
//if (!BuildVars.DEBUG_VERSION) {
|
||||
if (!BuildConfig.DEBUG) {
|
||||
@ -186,6 +203,9 @@ public class FileLog {
|
||||
if (getInstance().currentFile != null && file.getAbsolutePath().equals(getInstance().currentFile.getAbsolutePath())) {
|
||||
continue;
|
||||
}
|
||||
if (getInstance().networkFile != null && file.getAbsolutePath().equals(getInstance().networkFile.getAbsolutePath())) {
|
||||
continue;
|
||||
}
|
||||
file.delete();
|
||||
}
|
||||
}
|
||||
|
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* This is the source code of Telegram for Android v. 2.x.x.
|
||||
* This is the source code of Telegram for Android v. 3.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).
|
||||
*
|
||||
@ -63,6 +63,10 @@ public class FileUploadOperation {
|
||||
estimatedSize = estimated;
|
||||
}
|
||||
|
||||
public long getTotalFileSize() {
|
||||
return totalFileSize;
|
||||
}
|
||||
|
||||
public void start() {
|
||||
if (state != 0) {
|
||||
return;
|
||||
@ -77,7 +81,7 @@ public class FileUploadOperation {
|
||||
}
|
||||
|
||||
public void cancel() {
|
||||
if (state != 1) {
|
||||
if (state == 3) {
|
||||
return;
|
||||
}
|
||||
state = 2;
|
||||
|
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* This is the source code of Telegram for Android v. 2.x.x.
|
||||
* This is the source code of Telegram for Android v. 3.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).
|
||||
*
|
||||
|
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* This is the source code of Telegram for Android v. 2.x.x.
|
||||
* This is the source code of Telegram for Android v. 3.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).
|
||||
*
|
||||
@ -38,6 +38,7 @@ public class UserConfig {
|
||||
public static int autoLockIn = 60 * 60;
|
||||
public static int lastPauseTime = 0;
|
||||
public static boolean isWaitingForPasscodeEnter = false;
|
||||
public static boolean useFingerprint = true;
|
||||
public static int lastUpdateVersion;
|
||||
public static int lastContactsSyncTime;
|
||||
public static boolean channelsLoaded = false;
|
||||
@ -79,6 +80,7 @@ public class UserConfig {
|
||||
editor.putInt("lastUpdateVersion", lastUpdateVersion);
|
||||
editor.putInt("lastContactsSyncTime", lastContactsSyncTime);
|
||||
editor.putBoolean("channelsLoaded", channelsLoaded);
|
||||
editor.putBoolean("useFingerprint", useFingerprint);
|
||||
|
||||
if (currentUser != null) {
|
||||
if (withFile) {
|
||||
@ -128,7 +130,7 @@ public class UserConfig {
|
||||
|
||||
public static void loadConfig() {
|
||||
synchronized (sync) {
|
||||
final File configFile = new File(ApplicationLoader.applicationContext.getFilesDir(), "user.dat");
|
||||
final File configFile = new File(ApplicationLoader.getFilesDirFixed(), "user.dat");
|
||||
if (configFile.exists()) {
|
||||
try {
|
||||
SerializedData data = new SerializedData(configFile);
|
||||
@ -207,6 +209,7 @@ public class UserConfig {
|
||||
passcodeType = preferences.getInt("passcodeType", 0);
|
||||
autoLockIn = preferences.getInt("autoLockIn", 60 * 60);
|
||||
lastPauseTime = preferences.getInt("lastPauseTime", 0);
|
||||
useFingerprint = preferences.getBoolean("useFingerprint", true);
|
||||
lastUpdateVersion = preferences.getInt("lastUpdateVersion", 511);
|
||||
lastContactsSyncTime = preferences.getInt("lastContactsSyncTime", (int) (System.currentTimeMillis() / 1000) - 23 * 60 * 60);
|
||||
channelsLoaded = preferences.getBoolean("channelsLoaded", false);
|
||||
@ -281,6 +284,7 @@ public class UserConfig {
|
||||
passcodeSalt = new byte[0];
|
||||
autoLockIn = 60 * 60;
|
||||
lastPauseTime = 0;
|
||||
useFingerprint = true;
|
||||
isWaitingForPasscodeEnter = false;
|
||||
lastUpdateVersion = BuildVars.BUILD_VERSION;
|
||||
lastContactsSyncTime = (int) (System.currentTimeMillis() / 1000) - 23 * 60 * 60;
|
||||
|
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* This is the source code of Telegram for Android v. 2.x.x.
|
||||
* This is the source code of Telegram for Android v. 3.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).
|
||||
*
|
||||
@ -63,17 +63,11 @@ public class Utilities {
|
||||
}
|
||||
|
||||
public native static void loadBitmap(String path, Bitmap bitmap, int scale, int width, int height, int stride);
|
||||
|
||||
public native static int pinBitmap(Bitmap bitmap);
|
||||
|
||||
public native static void blurBitmap(Object bitmap, int radius, int unpin);
|
||||
|
||||
public native static void calcCDT(ByteBuffer hsvBuffer, int width, int height, ByteBuffer buffer);
|
||||
|
||||
public native static Bitmap loadWebpImage(ByteBuffer buffer, int len, BitmapFactory.Options options);
|
||||
|
||||
public native static boolean loadWebpImage(Bitmap bitmap, ByteBuffer buffer, int len, BitmapFactory.Options options, boolean unpin);
|
||||
public native static int convertVideoFrame(ByteBuffer src, ByteBuffer dest, int destFormat, int width, int height, int padding, int swap);
|
||||
|
||||
private native static void aesIgeEncryption(ByteBuffer buffer, byte[] key, byte[] iv, boolean encrypt, int offset, int length);
|
||||
|
||||
public static void aesIgeEncryption(ByteBuffer buffer, byte[] key, byte[] iv, boolean encrypt, boolean changeIv, int offset, int length) {
|
||||
@ -172,6 +166,11 @@ public class Utilities {
|
||||
}
|
||||
}
|
||||
|
||||
String hex = bytesToHex(prime);
|
||||
if (hex.equals("C71CAEB9C6B1C9048E6C522F70F13F73980D40238E3E21C14934D037563D930F48198A0AA7C14058229493D22530F4DBFA336F6E0AC925139543AED44CCE7C3720FD51F69458705AC68CD4FE6B6B13ABDC9746512969328454F18FAF8C595F642477FE96BB2A941D5BCD1D4AC8CC49880708FA9B378E3C4F3A9060BEE67CF9A4A4A695811051907E162753B56B0F6B410DBA74D8A84B2A14B3144E0EF1284754FD17ED950D5965B4B9DD46582DB1178D169C6BC465B0D6FF9CA3928FEF5B9AE4E418FC15E83EBEA0F87FA9FF5EED70050DED2849F47BF959D956850CE929851F0D8115F635B105EE2E4E15D04B2454BF6F4FADF034B10403119CD8E3B92FCC5B")) {
|
||||
return true;
|
||||
}
|
||||
|
||||
BigInteger dhBI2 = dhBI.subtract(BigInteger.valueOf(1)).divide(BigInteger.valueOf(2));
|
||||
return !(!dhBI.isProbablePrime(30) || !dhBI2.isProbablePrime(30));
|
||||
}
|
||||
|
@ -1,9 +1,9 @@
|
||||
/*
|
||||
* This is the source code of Telegram for Android v. 1.4.x.
|
||||
* This is the source code of Telegram for Android v. 3.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.
|
||||
* Copyright Nikolai Kudashov, 2013-2015.
|
||||
*/
|
||||
|
||||
package org.telegram.ui.ActionBar;
|
||||
@ -22,10 +22,15 @@ import android.widget.ImageView;
|
||||
import android.widget.TextView;
|
||||
|
||||
import org.telegram.messenger.AndroidUtilities;
|
||||
import org.telegram.messenger.AnimationCompat.AnimatorListenerAdapterProxy;
|
||||
import org.telegram.messenger.AnimationCompat.AnimatorSetProxy;
|
||||
import org.telegram.messenger.AnimationCompat.ObjectAnimatorProxy;
|
||||
import org.telegram.messenger.ApplicationLoader;
|
||||
import org.telegram.messenger.R;
|
||||
import org.telegram.ui.Components.LayoutHelper;
|
||||
|
||||
import java.util.ArrayList;
|
||||
|
||||
public class ActionBar extends FrameLayout {
|
||||
|
||||
public static class ActionBarMenuOnItemClick {
|
||||
@ -45,6 +50,8 @@ public class ActionBar extends FrameLayout {
|
||||
private ActionBarMenu menu;
|
||||
private ActionBarMenu actionMode;
|
||||
private boolean occupyStatusBar = Build.VERSION.SDK_INT >= 21;
|
||||
private boolean actionModeVisible;
|
||||
private boolean addToContainer = true;
|
||||
|
||||
private boolean allowOverlayTitle;
|
||||
private CharSequence lastTitle;
|
||||
@ -55,7 +62,6 @@ public class ActionBar extends FrameLayout {
|
||||
private boolean isBackOverlayVisible;
|
||||
protected BaseFragment parentFragment;
|
||||
public ActionBarMenuOnItemClick actionBarMenuOnItemClick;
|
||||
private int extraHeight;
|
||||
|
||||
public ActionBar(Context context) {
|
||||
super(context);
|
||||
@ -68,6 +74,7 @@ public class ActionBar extends FrameLayout {
|
||||
backButtonImageView = new ImageView(getContext());
|
||||
backButtonImageView.setScaleType(ImageView.ScaleType.CENTER);
|
||||
backButtonImageView.setBackgroundResource(itemsBackgroundResourceId);
|
||||
backButtonImageView.setPadding(AndroidUtilities.dp(1), 0, 0, 0);
|
||||
addView(backButtonImageView, LayoutHelper.createFrame(54, 54, Gravity.LEFT | Gravity.TOP));
|
||||
|
||||
backButtonImageView.setOnClickListener(new OnClickListener() {
|
||||
@ -90,6 +97,9 @@ public class ActionBar extends FrameLayout {
|
||||
}
|
||||
backButtonImageView.setVisibility(drawable == null ? GONE : VISIBLE);
|
||||
backButtonImageView.setImageDrawable(drawable);
|
||||
if (drawable instanceof BackDrawable) {
|
||||
((BackDrawable) drawable).setRotation(isActionModeShowed() ? 1 : 0, false);
|
||||
}
|
||||
}
|
||||
|
||||
public void setBackButtonImage(int resource) {
|
||||
@ -111,7 +121,15 @@ public class ActionBar extends FrameLayout {
|
||||
subTitleTextView.setLines(1);
|
||||
subTitleTextView.setMaxLines(1);
|
||||
subTitleTextView.setEllipsize(TextUtils.TruncateAt.END);
|
||||
addView(subTitleTextView, LayoutHelper.createFrame(LayoutHelper.WRAP_CONTENT, LayoutHelper.WRAP_CONTENT, Gravity.LEFT | Gravity.TOP));
|
||||
addView(subTitleTextView, 0, LayoutHelper.createFrame(LayoutHelper.WRAP_CONTENT, LayoutHelper.WRAP_CONTENT, Gravity.LEFT | Gravity.TOP));
|
||||
}
|
||||
|
||||
public void setAddToContainer(boolean value) {
|
||||
addToContainer = value;
|
||||
}
|
||||
|
||||
public boolean getAddToContainer() {
|
||||
return addToContainer;
|
||||
}
|
||||
|
||||
public void setSubtitle(CharSequence value) {
|
||||
@ -136,7 +154,7 @@ public class ActionBar extends FrameLayout {
|
||||
titleTextView.setEllipsize(TextUtils.TruncateAt.END);
|
||||
titleTextView.setTextColor(0xffffffff);
|
||||
titleTextView.setTypeface(AndroidUtilities.getTypeface("fonts/rmedium.ttf"));
|
||||
addView(titleTextView, LayoutHelper.createFrame(LayoutHelper.WRAP_CONTENT, LayoutHelper.WRAP_CONTENT, Gravity.LEFT | Gravity.TOP));
|
||||
addView(titleTextView, 0, LayoutHelper.createFrame(LayoutHelper.WRAP_CONTENT, LayoutHelper.WRAP_CONTENT, Gravity.LEFT | Gravity.TOP));
|
||||
}
|
||||
|
||||
public void setTitle(CharSequence value) {
|
||||
@ -183,12 +201,7 @@ public class ActionBar extends FrameLayout {
|
||||
return menu;
|
||||
}
|
||||
menu = new ActionBarMenu(getContext(), this);
|
||||
addView(menu);
|
||||
FrameLayout.LayoutParams layoutParams = (FrameLayout.LayoutParams)menu.getLayoutParams();
|
||||
layoutParams.height = LayoutHelper.MATCH_PARENT;
|
||||
layoutParams.width = LayoutHelper.WRAP_CONTENT;
|
||||
layoutParams.gravity = Gravity.RIGHT;
|
||||
menu.setLayoutParams(layoutParams);
|
||||
addView(menu, 0, LayoutHelper.createFrame(LayoutHelper.WRAP_CONTENT, LayoutHelper.MATCH_PARENT, Gravity.RIGHT));
|
||||
return menu;
|
||||
}
|
||||
|
||||
@ -201,8 +214,8 @@ public class ActionBar extends FrameLayout {
|
||||
return actionMode;
|
||||
}
|
||||
actionMode = new ActionBarMenu(getContext(), this);
|
||||
actionMode.setBackgroundResource(R.drawable.editheader);
|
||||
addView(actionMode);
|
||||
actionMode.setBackgroundColor(0xffffffff);
|
||||
addView(actionMode, indexOfChild(backButtonImageView));
|
||||
actionMode.setPadding(0, occupyStatusBar ? AndroidUtilities.statusBarHeight : 0, 0, 0);
|
||||
FrameLayout.LayoutParams layoutParams = (FrameLayout.LayoutParams)actionMode.getLayoutParams();
|
||||
layoutParams.height = LayoutHelper.MATCH_PARENT;
|
||||
@ -227,9 +240,43 @@ public class ActionBar extends FrameLayout {
|
||||
}
|
||||
|
||||
public void showActionMode() {
|
||||
if (actionMode == null) {
|
||||
if (actionMode == null || actionModeVisible) {
|
||||
return;
|
||||
}
|
||||
actionModeVisible = true;
|
||||
if (Build.VERSION.SDK_INT >= 14) {
|
||||
ArrayList<Object> animators = new ArrayList<>();
|
||||
animators.add(ObjectAnimatorProxy.ofFloat(actionMode, "alpha", 0.0f, 1.0f));
|
||||
if (occupyStatusBar && actionModeTop != null) {
|
||||
animators.add(ObjectAnimatorProxy.ofFloat(actionModeTop, "alpha", 0.0f, 1.0f));
|
||||
}
|
||||
AnimatorSetProxy animatorSetProxy = new AnimatorSetProxy();
|
||||
animatorSetProxy.playTogether(animators);
|
||||
animatorSetProxy.setDuration(200);
|
||||
animatorSetProxy.addListener(new AnimatorListenerAdapterProxy() {
|
||||
@Override
|
||||
public void onAnimationStart(Object animation) {
|
||||
actionMode.setVisibility(VISIBLE);
|
||||
if (occupyStatusBar && actionModeTop != null) {
|
||||
actionModeTop.setVisibility(VISIBLE);
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onAnimationEnd(Object animation) {
|
||||
if (titleTextView != null) {
|
||||
titleTextView.setVisibility(INVISIBLE);
|
||||
}
|
||||
if (subTitleTextView != null) {
|
||||
subTitleTextView.setVisibility(INVISIBLE);
|
||||
}
|
||||
if (menu != null) {
|
||||
menu.setVisibility(INVISIBLE);
|
||||
}
|
||||
}
|
||||
});
|
||||
animatorSetProxy.start();
|
||||
} else {
|
||||
actionMode.setVisibility(VISIBLE);
|
||||
if (occupyStatusBar && actionModeTop != null) {
|
||||
actionModeTop.setVisibility(VISIBLE);
|
||||
@ -240,34 +287,65 @@ public class ActionBar extends FrameLayout {
|
||||
if (subTitleTextView != null) {
|
||||
subTitleTextView.setVisibility(INVISIBLE);
|
||||
}
|
||||
if (backButtonImageView != null) {
|
||||
backButtonImageView.setVisibility(INVISIBLE);
|
||||
}
|
||||
if (menu != null) {
|
||||
menu.setVisibility(INVISIBLE);
|
||||
}
|
||||
}
|
||||
if (backButtonImageView != null) {
|
||||
Drawable drawable = backButtonImageView.getDrawable();
|
||||
if (drawable instanceof BackDrawable) {
|
||||
((BackDrawable) drawable).setRotation(1, true);
|
||||
}
|
||||
backButtonImageView.setBackgroundResource(R.drawable.bar_selector_mode);
|
||||
}
|
||||
}
|
||||
|
||||
public void hideActionMode() {
|
||||
if (actionMode == null) {
|
||||
if (actionMode == null || !actionModeVisible) {
|
||||
return;
|
||||
}
|
||||
actionModeVisible = false;
|
||||
if (Build.VERSION.SDK_INT >= 14) {
|
||||
ArrayList<Object> animators = new ArrayList<>();
|
||||
animators.add(ObjectAnimatorProxy.ofFloat(actionMode, "alpha", 0.0f));
|
||||
if (occupyStatusBar && actionModeTop != null) {
|
||||
animators.add(ObjectAnimatorProxy.ofFloat(actionModeTop, "alpha", 0.0f));
|
||||
}
|
||||
AnimatorSetProxy animatorSetProxy = new AnimatorSetProxy();
|
||||
animatorSetProxy.playTogether(animators);
|
||||
animatorSetProxy.setDuration(200);
|
||||
animatorSetProxy.addListener(new AnimatorListenerAdapterProxy() {
|
||||
@Override
|
||||
public void onAnimationEnd(Object animation) {
|
||||
actionMode.setVisibility(INVISIBLE);
|
||||
if (occupyStatusBar && actionModeTop != null) {
|
||||
actionModeTop.setVisibility(INVISIBLE);
|
||||
}
|
||||
}
|
||||
});
|
||||
animatorSetProxy.start();
|
||||
} else {
|
||||
actionMode.setVisibility(INVISIBLE);
|
||||
if (occupyStatusBar && actionModeTop != null) {
|
||||
actionModeTop.setVisibility(INVISIBLE);
|
||||
}
|
||||
}
|
||||
if (titleTextView != null) {
|
||||
titleTextView.setVisibility(VISIBLE);
|
||||
}
|
||||
if (subTitleTextView != null) {
|
||||
subTitleTextView.setVisibility(VISIBLE);
|
||||
}
|
||||
if (backButtonImageView != null) {
|
||||
backButtonImageView.setVisibility(VISIBLE);
|
||||
}
|
||||
if (menu != null) {
|
||||
menu.setVisibility(VISIBLE);
|
||||
}
|
||||
if (backButtonImageView != null) {
|
||||
Drawable drawable = backButtonImageView.getDrawable();
|
||||
if (drawable instanceof BackDrawable) {
|
||||
((BackDrawable) drawable).setRotation(0, true);
|
||||
}
|
||||
backButtonImageView.setBackgroundResource(itemsBackgroundResourceId);
|
||||
}
|
||||
}
|
||||
|
||||
public void showActionModeTop() {
|
||||
@ -284,7 +362,7 @@ public class ActionBar extends FrameLayout {
|
||||
}
|
||||
|
||||
public boolean isActionModeShowed() {
|
||||
return actionMode != null && actionMode.getVisibility() == VISIBLE;
|
||||
return actionMode != null && actionModeVisible;
|
||||
}
|
||||
|
||||
protected void onSearchFieldVisibilityChanged(boolean visible) {
|
||||
@ -297,7 +375,7 @@ public class ActionBar extends FrameLayout {
|
||||
}
|
||||
Drawable drawable = backButtonImageView.getDrawable();
|
||||
if (drawable != null && drawable instanceof MenuDrawable) {
|
||||
((MenuDrawable)drawable).setRotation(visible ? 1 : 0, true);
|
||||
((MenuDrawable) drawable).setRotation(visible ? 1 : 0, true);
|
||||
}
|
||||
}
|
||||
|
||||
@ -322,7 +400,7 @@ public class ActionBar extends FrameLayout {
|
||||
int actionBarHeight = getCurrentActionBarHeight();
|
||||
int actionBarHeightSpec = MeasureSpec.makeMeasureSpec(actionBarHeight, MeasureSpec.EXACTLY);
|
||||
|
||||
setMeasuredDimension(width, actionBarHeight + extraHeight + (occupyStatusBar ? AndroidUtilities.statusBarHeight : 0));
|
||||
setMeasuredDimension(width, actionBarHeight + (occupyStatusBar ? AndroidUtilities.statusBarHeight : 0));
|
||||
|
||||
int textLeft;
|
||||
if (backButtonImageView != null && backButtonImageView.getVisibility() != GONE) {
|
||||
@ -483,17 +561,6 @@ public class ActionBar extends FrameLayout {
|
||||
return isSearchFieldVisible;
|
||||
}
|
||||
|
||||
public void setExtraHeight(int value, boolean layout) {
|
||||
extraHeight = value;
|
||||
if (layout) {
|
||||
requestLayout();
|
||||
}
|
||||
}
|
||||
|
||||
public int getExtraHeight() {
|
||||
return extraHeight;
|
||||
}
|
||||
|
||||
public void setOccupyStatusBar(boolean value) {
|
||||
occupyStatusBar = value;
|
||||
if (actionMode != null) {
|
||||
@ -536,4 +603,9 @@ public class ActionBar extends FrameLayout {
|
||||
return AndroidUtilities.dp(56);
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean hasOverlappingRendering() {
|
||||
return false;
|
||||
}
|
||||
}
|
@ -1,9 +1,9 @@
|
||||
/*
|
||||
* This is the source code of Telegram for Android v. 1.4.x.
|
||||
* This is the source code of Telegram for Android v. 3.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.
|
||||
* Copyright Nikolai Kudashov, 2013-2015.
|
||||
*/
|
||||
|
||||
package org.telegram.ui.ActionBar;
|
||||
@ -59,7 +59,6 @@ public class ActionBarLayout extends FrameLayout {
|
||||
if (child instanceof ActionBar) {
|
||||
return super.drawChild(canvas, child, drawingTime);
|
||||
} else {
|
||||
//boolean wasActionBar = false;
|
||||
int actionBarHeight = 0;
|
||||
int childCount = getChildCount();
|
||||
for (int a = 0; a < childCount; a++) {
|
||||
@ -70,24 +69,10 @@ public class ActionBarLayout extends FrameLayout {
|
||||
if (view instanceof ActionBar && view.getVisibility() == VISIBLE) {
|
||||
if (((ActionBar) view).getCastShadows()) {
|
||||
actionBarHeight = view.getMeasuredHeight();
|
||||
//wasActionBar = true;
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
/*if (!wasActionBar) {
|
||||
if (child instanceof ViewGroup) {
|
||||
ViewGroup viewGroup = (ViewGroup) child;
|
||||
childCount = viewGroup.getChildCount();
|
||||
for (int a = 0; a < childCount; a++) {
|
||||
View possibleActionBar = viewGroup.getChildAt(a);
|
||||
if (possibleActionBar instanceof ActionBar) {
|
||||
actionBarHeight = possibleActionBar.getMeasuredHeight();
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
}*/
|
||||
boolean result = super.drawChild(canvas, child, drawingTime);
|
||||
if (actionBarHeight != 0 && headerShadowDrawable != null) {
|
||||
headerShadowDrawable.setBounds(0, actionBarHeight, getMeasuredWidth(), actionBarHeight + headerShadowDrawable.getIntrinsicHeight());
|
||||
@ -96,6 +81,11 @@ public class ActionBarLayout extends FrameLayout {
|
||||
return result;
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean hasOverlappingRendering() {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
private static Drawable headerShadowDrawable;
|
||||
@ -129,6 +119,7 @@ public class ActionBarLayout extends FrameLayout {
|
||||
private boolean useAlphaAnimations;
|
||||
private View backgroundView;
|
||||
private boolean removeActionBarExtraHeight;
|
||||
private Runnable animationRunnable;
|
||||
|
||||
private float animationProgress = 0.0f;
|
||||
private long lastFrameTime;
|
||||
@ -257,7 +248,7 @@ public class ActionBarLayout extends FrameLayout {
|
||||
}
|
||||
|
||||
final int restoreCount = canvas.save();
|
||||
if (!transitionAnimationInProgress) {
|
||||
if (!transitionAnimationInProgress && clipLeft != 0 && clipRight != 0) {
|
||||
canvas.clipRect(clipLeft, 0, clipRight, getHeight());
|
||||
}
|
||||
final boolean result = super.drawChild(canvas, child, drawingTime);
|
||||
@ -312,7 +303,7 @@ public class ActionBarLayout extends FrameLayout {
|
||||
parent.removeView(lastFragment.fragmentView);
|
||||
}
|
||||
}
|
||||
if (lastFragment.needAddActionBar() && lastFragment.actionBar != null) {
|
||||
if (lastFragment.actionBar != null && lastFragment.actionBar.getAddToContainer()) {
|
||||
ViewGroup parent = (ViewGroup) lastFragment.actionBar.getParent();
|
||||
if (parent != null) {
|
||||
parent.removeView(lastFragment.actionBar);
|
||||
@ -320,7 +311,6 @@ public class ActionBarLayout extends FrameLayout {
|
||||
}
|
||||
}
|
||||
containerViewBack.setVisibility(View.GONE);
|
||||
//AndroidUtilities.unlockOrientation(parentActivity);
|
||||
startedTracking = false;
|
||||
animationInProgress = false;
|
||||
|
||||
@ -350,7 +340,7 @@ public class ActionBarLayout extends FrameLayout {
|
||||
if (parent != null) {
|
||||
parent.removeView(fragmentView);
|
||||
}
|
||||
if (lastFragment.needAddActionBar() && lastFragment.actionBar != null) {
|
||||
if (lastFragment.actionBar != null && lastFragment.actionBar.getAddToContainer()) {
|
||||
parent = (ViewGroup) lastFragment.actionBar.getParent();
|
||||
if (parent != null) {
|
||||
parent.removeView(lastFragment.actionBar);
|
||||
@ -370,8 +360,6 @@ public class ActionBarLayout extends FrameLayout {
|
||||
fragmentView.setBackgroundColor(0xffffffff);
|
||||
}
|
||||
lastFragment.onResume();
|
||||
|
||||
//AndroidUtilities.lockOrientation(parentActivity);
|
||||
}
|
||||
|
||||
public boolean onTouchEvent(MotionEvent ev) {
|
||||
@ -516,6 +504,10 @@ public class ActionBarLayout extends FrameLayout {
|
||||
}
|
||||
currentAnimation = null;
|
||||
}
|
||||
if (animationRunnable != null) {
|
||||
AndroidUtilities.cancelRunOnUIThread(animationRunnable);
|
||||
animationRunnable = null;
|
||||
}
|
||||
ViewProxy.setAlpha(this, 1.0f);
|
||||
ViewProxy.setAlpha(containerView, 1.0f);
|
||||
ViewProxy.setScaleX(containerView, 1.0f);
|
||||
@ -548,7 +540,7 @@ public class ActionBarLayout extends FrameLayout {
|
||||
parent.removeView(fragment.fragmentView);
|
||||
}
|
||||
}
|
||||
if (fragment.needAddActionBar() && fragment.actionBar != null) {
|
||||
if (fragment.actionBar != null && fragment.actionBar.getAddToContainer()) {
|
||||
ViewGroup parent = (ViewGroup) fragment.actionBar.getParent();
|
||||
if (parent != null) {
|
||||
parent.removeView(fragment.actionBar);
|
||||
@ -570,17 +562,18 @@ public class ActionBarLayout extends FrameLayout {
|
||||
if (first) {
|
||||
animationProgress = 0.0f;
|
||||
lastFrameTime = System.nanoTime() / 1000000;
|
||||
if (Build.VERSION.SDK_INT >= 11) {
|
||||
if (open) {
|
||||
if (Build.VERSION.SDK_INT > 15) {
|
||||
containerView.setLayerType(LAYER_TYPE_HARDWARE, null);
|
||||
} else {
|
||||
containerViewBack.setLayerType(LAYER_TYPE_HARDWARE, null);
|
||||
}
|
||||
}
|
||||
}
|
||||
AndroidUtilities.runOnUIThread(new Runnable() {
|
||||
AndroidUtilities.runOnUIThread(animationRunnable = new Runnable() {
|
||||
@Override
|
||||
public void run() {
|
||||
if (animationRunnable != this) {
|
||||
return;
|
||||
}
|
||||
animationRunnable = null;
|
||||
if (first) {
|
||||
transitionAnimationStartTime = System.currentTimeMillis();
|
||||
}
|
||||
@ -632,7 +625,7 @@ public class ActionBarLayout extends FrameLayout {
|
||||
parent.removeView(fragmentView);
|
||||
}
|
||||
}
|
||||
if (fragment.needAddActionBar() && fragment.actionBar != null) {
|
||||
if (fragment.actionBar != null && fragment.actionBar.getAddToContainer()) {
|
||||
if (removeActionBarExtraHeight) {
|
||||
fragment.actionBar.setOccupyStatusBar(false);
|
||||
}
|
||||
@ -663,7 +656,6 @@ public class ActionBarLayout extends FrameLayout {
|
||||
setInnerTranslationX(0);
|
||||
|
||||
bringChildToFront(containerView);
|
||||
|
||||
if (!needAnimation) {
|
||||
presentFragmentInternalRemoveOld(removeLast, currentFragment);
|
||||
if (backgroundView != null) {
|
||||
@ -680,7 +672,7 @@ public class ActionBarLayout extends FrameLayout {
|
||||
onOpenAnimationEndRunnable = new Runnable() {
|
||||
@Override
|
||||
public void run() {
|
||||
fragment.onOpenAnimationEnd();
|
||||
fragment.onTransitionAnimationEnd(true, false);
|
||||
fragment.onBecomeFullyVisible();
|
||||
}
|
||||
};
|
||||
@ -691,7 +683,7 @@ public class ActionBarLayout extends FrameLayout {
|
||||
animators.add(ObjectAnimatorProxy.ofFloat(backgroundView, "alpha", 0.0f, 1.0f));
|
||||
}
|
||||
|
||||
fragment.onOpenAnimationStart();
|
||||
fragment.onTransitionAnimationStart(true, false);
|
||||
currentAnimation = new AnimatorSetProxy();
|
||||
currentAnimation.playTogether(animators);
|
||||
currentAnimation.setInterpolator(accelerateDecelerateInterpolator);
|
||||
@ -714,50 +706,44 @@ public class ActionBarLayout extends FrameLayout {
|
||||
onOpenAnimationEndRunnable = new Runnable() {
|
||||
@Override
|
||||
public void run() {
|
||||
if (Build.VERSION.SDK_INT >= 18) {
|
||||
if (Build.VERSION.SDK_INT > 15) {
|
||||
containerView.setLayerType(LAYER_TYPE_NONE, null);
|
||||
containerViewBack.setLayerType(LAYER_TYPE_NONE, null);
|
||||
}
|
||||
presentFragmentInternalRemoveOld(removeLast, currentFragment);
|
||||
fragment.onOpenAnimationEnd();
|
||||
fragment.onTransitionAnimationEnd(true, false);
|
||||
fragment.onBecomeFullyVisible();
|
||||
ViewProxy.setTranslationX(containerView, 0);
|
||||
}
|
||||
};
|
||||
ViewProxy.setAlpha(containerView, 0.0f);
|
||||
ViewProxy.setTranslationX(containerView, 48.0f);
|
||||
fragment.onOpenAnimationStart();
|
||||
startLayoutAnimation(true, true);
|
||||
/*currentAnimation = new AnimatorSetProxy();
|
||||
currentAnimation.playTogether(
|
||||
ObjectAnimatorProxy.ofFloat(containerView, "alpha", 0.0f, 1.0f),
|
||||
ObjectAnimatorProxy.ofFloat(containerView, "translationX", AndroidUtilities.dp(48), 0));
|
||||
currentAnimation.setInterpolator(decelerateInterpolator);
|
||||
currentAnimation.setDuration(200);
|
||||
currentAnimation.addListener(new AnimatorListenerAdapterProxy() {
|
||||
fragment.onTransitionAnimationStart(true, false);
|
||||
AnimatorSetProxy animation = fragment.onCustomTransitionAnimation(true, new Runnable() {
|
||||
@Override
|
||||
public void onAnimationStart(Object animation) {
|
||||
transitionAnimationStartTime = System.currentTimeMillis();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onAnimationEnd(Object animation) {
|
||||
onAnimationEndCheck(false);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onAnimationCancel(Object animation) {
|
||||
public void run() {
|
||||
onAnimationEndCheck(false);
|
||||
}
|
||||
});
|
||||
currentAnimation.start();*/
|
||||
if (animation == null) {
|
||||
ViewProxy.setAlpha(containerView, 0.0f);
|
||||
ViewProxy.setTranslationX(containerView, 48.0f);
|
||||
startLayoutAnimation(true, true);
|
||||
} else {
|
||||
if (Build.VERSION.SDK_INT > 15) {
|
||||
//containerView.setLayerType(LAYER_TYPE_HARDWARE, null);
|
||||
//containerViewBack.setLayerType(LAYER_TYPE_HARDWARE, null);
|
||||
}
|
||||
ViewProxy.setAlpha(containerView, 1.0f);
|
||||
ViewProxy.setTranslationX(containerView, 0.0f);
|
||||
currentAnimation = animation;
|
||||
}
|
||||
}
|
||||
} else {
|
||||
if (backgroundView != null) {
|
||||
ViewProxy.setAlpha(backgroundView, 1.0f);
|
||||
backgroundView.setVisibility(VISIBLE);
|
||||
}
|
||||
fragment.onOpenAnimationStart();
|
||||
fragment.onOpenAnimationEnd();
|
||||
fragment.onTransitionAnimationStart(true, false);
|
||||
fragment.onTransitionAnimationEnd(true, false);
|
||||
fragment.onBecomeFullyVisible();
|
||||
}
|
||||
return true;
|
||||
@ -836,7 +822,7 @@ public class ActionBarLayout extends FrameLayout {
|
||||
parent.removeView(fragmentView);
|
||||
}
|
||||
}
|
||||
if (previousFragment.needAddActionBar() && previousFragment.actionBar != null) {
|
||||
if (previousFragment.actionBar != null && previousFragment.actionBar.getAddToContainer()) {
|
||||
if (removeActionBarExtraHeight) {
|
||||
previousFragment.actionBar.setOccupyStatusBar(false);
|
||||
}
|
||||
@ -852,7 +838,8 @@ public class ActionBarLayout extends FrameLayout {
|
||||
layoutParams.width = LayoutHelper.MATCH_PARENT;
|
||||
layoutParams.height = LayoutHelper.MATCH_PARENT;
|
||||
fragmentView.setLayoutParams(layoutParams);
|
||||
previousFragment.onOpenAnimationStart();
|
||||
previousFragment.onTransitionAnimationStart(true, true);
|
||||
currentFragment.onTransitionAnimationStart(false, false);
|
||||
previousFragment.onResume();
|
||||
currentActionBar = previousFragment.actionBar;
|
||||
if (!previousFragment.hasOwnBackground && fragmentView.getBackground() == null) {
|
||||
@ -870,42 +857,35 @@ public class ActionBarLayout extends FrameLayout {
|
||||
onCloseAnimationEndRunnable = new Runnable() {
|
||||
@Override
|
||||
public void run() {
|
||||
if (Build.VERSION.SDK_INT >= 18) {
|
||||
if (Build.VERSION.SDK_INT > 15) {
|
||||
containerView.setLayerType(LAYER_TYPE_NONE, null);
|
||||
containerViewBack.setLayerType(LAYER_TYPE_NONE, null);
|
||||
}
|
||||
closeLastFragmentInternalRemoveOld(currentFragment);
|
||||
ViewProxy.setTranslationX(containerViewBack, 0);
|
||||
previousFragmentFinal.onOpenAnimationEnd();
|
||||
currentFragment.onTransitionAnimationEnd(false, false);
|
||||
previousFragmentFinal.onTransitionAnimationEnd(true, true);
|
||||
previousFragmentFinal.onBecomeFullyVisible();
|
||||
}
|
||||
};
|
||||
startLayoutAnimation(false, true);
|
||||
|
||||
/*currentAnimation = new AnimatorSetProxy();
|
||||
currentAnimation.playTogether(
|
||||
ObjectAnimatorProxy.ofFloat(containerViewBack, "alpha", 1.0f, 0.0f),
|
||||
ObjectAnimatorProxy.ofFloat(containerViewBack, "translationX", 0, AndroidUtilities.dp(48)));
|
||||
currentAnimation.setInterpolator(decelerateInterpolator);
|
||||
currentAnimation.setDuration(200);
|
||||
currentAnimation.addListener(new AnimatorListenerAdapterProxy() {
|
||||
AnimatorSetProxy animation = currentFragment.onCustomTransitionAnimation(false, new Runnable() {
|
||||
@Override
|
||||
public void onAnimationStart(Object animation) {
|
||||
transitionAnimationStartTime = System.currentTimeMillis();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onAnimationEnd(Object animation) {
|
||||
onAnimationEndCheck(false);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onAnimationCancel(Object animation) {
|
||||
public void run() {
|
||||
onAnimationEndCheck(false);
|
||||
}
|
||||
});
|
||||
currentAnimation.start();*/
|
||||
if (animation == null) {
|
||||
startLayoutAnimation(false, true);
|
||||
} else {
|
||||
previousFragment.onOpenAnimationEnd();
|
||||
if (Build.VERSION.SDK_INT > 15) {
|
||||
//containerView.setLayerType(LAYER_TYPE_HARDWARE, null);
|
||||
//containerViewBack.setLayerType(LAYER_TYPE_HARDWARE, null);
|
||||
}
|
||||
currentAnimation = animation;
|
||||
}
|
||||
} else {
|
||||
currentFragment.onTransitionAnimationEnd(false, false);
|
||||
previousFragment.onTransitionAnimationEnd(true, true);
|
||||
previousFragment.onBecomeFullyVisible();
|
||||
}
|
||||
} else {
|
||||
@ -968,6 +948,22 @@ public class ActionBarLayout extends FrameLayout {
|
||||
if (fragmentsStack.isEmpty()) {
|
||||
return;
|
||||
}
|
||||
for (int a = 0; a < fragmentsStack.size() - 1; a++) {
|
||||
BaseFragment previousFragment = fragmentsStack.get(a);
|
||||
if (previousFragment.actionBar != null) {
|
||||
ViewGroup parent = (ViewGroup) previousFragment.actionBar.getParent();
|
||||
if (parent != null) {
|
||||
parent.removeView(previousFragment.actionBar);
|
||||
}
|
||||
}
|
||||
if (previousFragment.fragmentView != null) {
|
||||
ViewGroup parent = (ViewGroup) previousFragment.fragmentView.getParent();
|
||||
if (parent != null) {
|
||||
previousFragment.onPause();
|
||||
parent.removeView(previousFragment.fragmentView);
|
||||
}
|
||||
}
|
||||
}
|
||||
BaseFragment previousFragment = fragmentsStack.get(fragmentsStack.size() - 1);
|
||||
previousFragment.setParentLayout(this);
|
||||
View fragmentView = previousFragment.fragmentView;
|
||||
@ -979,7 +975,7 @@ public class ActionBarLayout extends FrameLayout {
|
||||
parent.removeView(fragmentView);
|
||||
}
|
||||
}
|
||||
if (previousFragment.needAddActionBar() && previousFragment.actionBar != null) {
|
||||
if (previousFragment.actionBar != null && previousFragment.actionBar.getAddToContainer()) {
|
||||
if (removeActionBarExtraHeight) {
|
||||
previousFragment.actionBar.setOccupyStatusBar(false);
|
||||
}
|
||||
@ -1136,4 +1132,9 @@ public class ActionBarLayout extends FrameLayout {
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean hasOverlappingRendering() {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
@ -1,9 +1,9 @@
|
||||
/*
|
||||
* This is the source code of Telegram for Android v. 1.4.x.
|
||||
* This is the source code of Telegram for Android v. 3.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.
|
||||
* Copyright Nikolai Kudashov, 2013-2015.
|
||||
*/
|
||||
|
||||
package org.telegram.ui.ActionBar;
|
||||
|
@ -1,9 +1,9 @@
|
||||
/*
|
||||
* This is the source code of Telegram for Android v. 1.4.x.
|
||||
* This is the source code of Telegram for Android v. 3.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.
|
||||
* Copyright Nikolai Kudashov, 2013-2015.
|
||||
*/
|
||||
|
||||
package org.telegram.ui.ActionBar;
|
||||
|
@ -1,9 +1,9 @@
|
||||
/*
|
||||
* This is the source code of Telegram for Android v. 1.4.x.
|
||||
* This is the source code of Telegram for Android v. 3.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.
|
||||
* Copyright Nikolai Kudashov, 2013-2015.
|
||||
*/
|
||||
|
||||
//Thanks to https://github.com/JakeWharton/ActionBarSherlock/
|
||||
|
@ -1,9 +1,9 @@
|
||||
/*
|
||||
* This is the source code of Telegram for Android v. 1.3.2.
|
||||
* This is the source code of Telegram for Android v. 3.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.
|
||||
* Copyright Nikolai Kudashov, 2013-2015.
|
||||
*/
|
||||
|
||||
package org.telegram.ui.ActionBar;
|
||||
@ -21,6 +21,7 @@ import android.widget.Button;
|
||||
import android.widget.TextView;
|
||||
|
||||
import org.telegram.messenger.AndroidUtilities;
|
||||
import org.telegram.messenger.AnimationCompat.AnimatorSetProxy;
|
||||
import org.telegram.messenger.ApplicationLoader;
|
||||
import org.telegram.messenger.FileLog;
|
||||
import org.telegram.messenger.R;
|
||||
@ -49,6 +50,14 @@ public class BaseFragment {
|
||||
classGuid = ConnectionsManager.getInstance().generateClassGuid();
|
||||
}
|
||||
|
||||
public ActionBar getActionBar() {
|
||||
return actionBar;
|
||||
}
|
||||
|
||||
public View getFragmentView() {
|
||||
return fragmentView;
|
||||
}
|
||||
|
||||
public View createView(Context context) {
|
||||
return null;
|
||||
}
|
||||
@ -164,7 +173,7 @@ public class BaseFragment {
|
||||
actionBar.onPause();
|
||||
}
|
||||
try {
|
||||
if (visibleDialog != null && visibleDialog.isShowing()) {
|
||||
if (visibleDialog != null && visibleDialog.isShowing() && dismissDialogOnPause(visibleDialog)) {
|
||||
visibleDialog.dismiss();
|
||||
visibleDialog = null;
|
||||
}
|
||||
@ -185,6 +194,10 @@ public class BaseFragment {
|
||||
|
||||
}
|
||||
|
||||
public void onRequestPermissionsResultFragment(int requestCode, String[] permissions, int[] grantResults) {
|
||||
|
||||
}
|
||||
|
||||
public void saveSelfArgs(Bundle args) {
|
||||
|
||||
}
|
||||
@ -218,6 +231,10 @@ public class BaseFragment {
|
||||
}
|
||||
}
|
||||
|
||||
public boolean dismissDialogOnPause(Dialog dialog) {
|
||||
return true;
|
||||
}
|
||||
|
||||
public void onBeginSlide() {
|
||||
try {
|
||||
if (visibleDialog != null && visibleDialog.isShowing()) {
|
||||
@ -232,11 +249,11 @@ public class BaseFragment {
|
||||
}
|
||||
}
|
||||
|
||||
protected void onOpenAnimationEnd() {
|
||||
protected void onTransitionAnimationStart(boolean isOpen, boolean backward) {
|
||||
|
||||
}
|
||||
|
||||
protected void onOpenAnimationStart() {
|
||||
protected void onTransitionAnimationEnd(boolean isOpen, boolean backward) {
|
||||
|
||||
}
|
||||
|
||||
@ -244,12 +261,12 @@ public class BaseFragment {
|
||||
|
||||
}
|
||||
|
||||
public void onLowMemory() {
|
||||
|
||||
protected AnimatorSetProxy onCustomTransitionAnimation(boolean isOpen, final Runnable callback) {
|
||||
return null;
|
||||
}
|
||||
|
||||
public boolean needAddActionBar() {
|
||||
return true;
|
||||
public void onLowMemory() {
|
||||
|
||||
}
|
||||
|
||||
public Dialog showDialog(Dialog dialog) {
|
||||
|
@ -1,13 +1,14 @@
|
||||
/*
|
||||
* This is the source code of Telegram for Android v. 1.7.x.
|
||||
* This is the source code of Telegram for Android v. 3.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.
|
||||
* Copyright Nikolai Kudashov, 2013-2015.
|
||||
*/
|
||||
|
||||
package org.telegram.ui.ActionBar;
|
||||
|
||||
import android.annotation.SuppressLint;
|
||||
import android.app.Activity;
|
||||
import android.content.Context;
|
||||
import android.content.SharedPreferences;
|
||||
@ -72,12 +73,14 @@ public class DrawerLayoutContainer extends FrameLayout {
|
||||
|
||||
if (Build.VERSION.SDK_INT >= 21) {
|
||||
setFitsSystemWindows(true);
|
||||
configureApplyInsets(this);
|
||||
setOnApplyWindowInsetsListener(new InsetsListener());
|
||||
setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_STABLE | View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN);
|
||||
}
|
||||
|
||||
shadowLeft = getResources().getDrawable(R.drawable.menu_shadow);
|
||||
}
|
||||
|
||||
@SuppressLint("NewApi")
|
||||
private class InsetsListener implements View.OnApplyWindowInsetsListener {
|
||||
@Override
|
||||
public WindowInsets onApplyWindowInsets(View v, WindowInsets insets) {
|
||||
@ -87,13 +90,7 @@ public class DrawerLayoutContainer extends FrameLayout {
|
||||
}
|
||||
}
|
||||
|
||||
private void configureApplyInsets(View drawerLayout) {
|
||||
if (Build.VERSION.SDK_INT >= 21) {
|
||||
drawerLayout.setOnApplyWindowInsetsListener(new InsetsListener());
|
||||
drawerLayout.setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_STABLE | View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN);
|
||||
}
|
||||
}
|
||||
|
||||
@SuppressLint("NewApi")
|
||||
private void dispatchChildInsets(View child, Object insets, int drawerGravity) {
|
||||
WindowInsets wi = (WindowInsets) insets;
|
||||
if (drawerGravity == Gravity.LEFT) {
|
||||
@ -104,6 +101,7 @@ public class DrawerLayoutContainer extends FrameLayout {
|
||||
child.dispatchApplyWindowInsets(wi);
|
||||
}
|
||||
|
||||
@SuppressLint("NewApi")
|
||||
private void applyMarginInsets(MarginLayoutParams lp, Object insets, int drawerGravity, boolean topOnly) {
|
||||
WindowInsets wi = (WindowInsets) insets;
|
||||
if (drawerGravity == Gravity.LEFT) {
|
||||
@ -416,6 +414,7 @@ public class DrawerLayoutContainer extends FrameLayout {
|
||||
}
|
||||
}
|
||||
|
||||
@SuppressLint("NewApi")
|
||||
@Override
|
||||
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
|
||||
int widthSize = MeasureSpec.getSize(widthMeasureSpec);
|
||||
@ -438,7 +437,7 @@ public class DrawerLayoutContainer extends FrameLayout {
|
||||
if (applyInsets) {
|
||||
if (child.getFitsSystemWindows()) {
|
||||
dispatchChildInsets(child, lastInsets, lp.gravity);
|
||||
} else {
|
||||
} else if (child.getTag() == null) {
|
||||
applyMarginInsets(lp, lastInsets, lp.gravity, Build.VERSION.SDK_INT >= 21);
|
||||
}
|
||||
}
|
||||
@ -495,6 +494,7 @@ public class DrawerLayoutContainer extends FrameLayout {
|
||||
}
|
||||
final int height = getHeight();
|
||||
final boolean drawingContent = child != drawerLayout;
|
||||
int lastVisibleChild = 0;
|
||||
int clipLeft = 0, clipRight = getWidth();
|
||||
|
||||
final int restoreCount = canvas.save();
|
||||
@ -502,6 +502,9 @@ public class DrawerLayoutContainer extends FrameLayout {
|
||||
final int childCount = getChildCount();
|
||||
for (int i = 0; i < childCount; i++) {
|
||||
final View v = getChildAt(i);
|
||||
if (v.getVisibility() == VISIBLE && v != drawerLayout) {
|
||||
lastVisibleChild = i;
|
||||
}
|
||||
if (v == child || v.getVisibility() != VISIBLE || v != drawerLayout || v.getHeight() < height) {
|
||||
continue;
|
||||
}
|
||||
@ -511,14 +514,18 @@ public class DrawerLayoutContainer extends FrameLayout {
|
||||
clipLeft = vright;
|
||||
}
|
||||
}
|
||||
if (clipLeft != 0) {
|
||||
canvas.clipRect(clipLeft, 0, clipRight, getHeight());
|
||||
}
|
||||
}
|
||||
final boolean result = super.drawChild(canvas, child, drawingTime);
|
||||
canvas.restoreToCount(restoreCount);
|
||||
|
||||
if (scrimOpacity > 0 && drawingContent) {
|
||||
if (indexOfChild(child) == lastVisibleChild) {
|
||||
scrimPaint.setColor((int) (((0x99000000 & 0xff000000) >>> 24) * scrimOpacity) << 24);
|
||||
canvas.drawRect(clipLeft, 0, clipRight, getHeight(), scrimPaint);
|
||||
}
|
||||
} else if (shadowLeft != null) {
|
||||
final float alpha = Math.max(0, Math.min(drawerPosition / AndroidUtilities.dp(20), 1.0f));
|
||||
if (alpha != 0) {
|
||||
@ -529,4 +536,9 @@ public class DrawerLayoutContainer extends FrameLayout {
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean hasOverlappingRendering() {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
@ -1,9 +1,9 @@
|
||||
/*
|
||||
* This is the source code of Telegram for Android v. 1.7.x.
|
||||
* This is the source code of Telegram for Android v. 3.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.
|
||||
* Copyright Nikolai Kudashov, 2013-2015.
|
||||
*/
|
||||
|
||||
package org.telegram.ui.ActionBar;
|
||||
@ -11,6 +11,7 @@ package org.telegram.ui.ActionBar;
|
||||
import android.graphics.Canvas;
|
||||
import android.graphics.ColorFilter;
|
||||
import android.graphics.Paint;
|
||||
import android.graphics.PixelFormat;
|
||||
import android.graphics.drawable.Drawable;
|
||||
import android.view.animation.DecelerateInterpolator;
|
||||
|
||||
@ -80,11 +81,11 @@ public class MenuDrawable extends Drawable {
|
||||
canvas.save();
|
||||
canvas.translate(getIntrinsicWidth() / 2, getIntrinsicHeight() / 2);
|
||||
canvas.rotate(currentRotation * (reverseAngle ? -180 : 180));
|
||||
canvas.drawLine(-AndroidUtilities.dp(9), 0, AndroidUtilities.dp(9) - AndroidUtilities.dp(1) * currentRotation, 0, paint);
|
||||
canvas.drawLine(-AndroidUtilities.dp(9), 0, AndroidUtilities.dp(9) - AndroidUtilities.dp(3.0f) * currentRotation, 0, paint);
|
||||
float endYDiff = AndroidUtilities.dp(5) * (1 - Math.abs(currentRotation)) - AndroidUtilities.dp(0.5f) * Math.abs(currentRotation);
|
||||
float endXDiff = AndroidUtilities.dp(9) - AndroidUtilities.dp(0.5f) * Math.abs(currentRotation);
|
||||
float startYDiff = AndroidUtilities.dp(5) + AndroidUtilities.dp(3.5f) * Math.abs(currentRotation);
|
||||
float startXDiff = -AndroidUtilities.dp(9) + AndroidUtilities.dp(8.5f) * Math.abs(currentRotation);
|
||||
float endXDiff = AndroidUtilities.dp(9) - AndroidUtilities.dp(2.5f) * Math.abs(currentRotation);
|
||||
float startYDiff = AndroidUtilities.dp(5) + AndroidUtilities.dp(2.0f) * Math.abs(currentRotation);
|
||||
float startXDiff = -AndroidUtilities.dp(9) + AndroidUtilities.dp(7.5f) * Math.abs(currentRotation);
|
||||
canvas.drawLine(startXDiff, -startYDiff, endXDiff, -endYDiff, paint);
|
||||
canvas.drawLine(startXDiff, startYDiff, endXDiff, endYDiff, paint);
|
||||
canvas.restore();
|
||||
@ -103,7 +104,7 @@ public class MenuDrawable extends Drawable {
|
||||
|
||||
@Override
|
||||
public int getOpacity() {
|
||||
return 0;
|
||||
return PixelFormat.TRANSPARENT;
|
||||
}
|
||||
|
||||
@Override
|
||||
|
@ -3,7 +3,7 @@
|
||||
* 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.
|
||||
* Copyright Nikolai Kudashov, 2013-2015.
|
||||
*/
|
||||
|
||||
package org.telegram.ui.Adapters;
|
||||
|
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* This is the source code of Telegram for Android v. 2.x
|
||||
* This is the source code of Telegram for Android v. 3.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).
|
||||
*
|
||||
|
@ -1,9 +1,9 @@
|
||||
/*
|
||||
* This is the source code of Telegram for Android v. 1.7.x.
|
||||
* This is the source code of Telegram for Android v. 3.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.
|
||||
* Copyright Nikolai Kudashov, 2013-2015.
|
||||
*/
|
||||
|
||||
package org.telegram.ui.Adapters;
|
||||
|
@ -1,9 +1,9 @@
|
||||
/*
|
||||
* This is the source code of Telegram for Android v. 1.7.x.
|
||||
* This is the source code of Telegram for Android v. 3.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.
|
||||
* Copyright Nikolai Kudashov, 2013-2015.
|
||||
*/
|
||||
|
||||
package org.telegram.ui.Adapters;
|
||||
|
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* This is the source code of Telegram for Android v. 2.x
|
||||
* This is the source code of Telegram for Android v. 3.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).
|
||||
*
|
||||
|
@ -3,7 +3,7 @@
|
||||
* 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.
|
||||
* Copyright Nikolai Kudashov, 2013-2015.
|
||||
*/
|
||||
|
||||
package org.telegram.ui.Adapters;
|
||||
@ -18,15 +18,13 @@ import android.view.View;
|
||||
import android.view.ViewGroup;
|
||||
|
||||
import org.telegram.messenger.AndroidUtilities;
|
||||
import org.telegram.messenger.AnimationCompat.ViewProxy;
|
||||
|
||||
import org.telegram.messenger.LocaleController;
|
||||
import org.telegram.tgnet.TLRPC;
|
||||
import org.telegram.messenger.ContactsController;
|
||||
import org.telegram.messenger.MessagesController;
|
||||
import org.telegram.messenger.ApplicationLoader;
|
||||
import org.telegram.messenger.R;
|
||||
|
||||
import org.telegram.messenger.AnimationCompat.ViewProxy;
|
||||
import org.telegram.ui.Cells.DividerCell;
|
||||
import org.telegram.ui.Cells.GreySectionCell;
|
||||
import org.telegram.ui.Cells.LetterSectionCell;
|
||||
@ -298,12 +296,6 @@ public class ContactsAdapter extends BaseSectionsAdapter {
|
||||
ViewProxy.setAlpha(convertView, 1.0f);
|
||||
}
|
||||
}
|
||||
//((UserCell) convertView).setStatusColors(0xffa8a8a8, 0xff3b84c0);
|
||||
//((UserCell) convertView).setStatusColors(themePrefs.getInt("contactsStatusColor", 0xffa8a8a8), themePrefs.getInt("contactsOnlineColor", AndroidUtilities.getIntDarkerColor("themeColor", 0x15)));
|
||||
//((UserCell) convertView).setNameColor(cColorBlack);
|
||||
//((UserCell) convertView).setNameSize(themePrefs.getInt("contactsNameSize", 17));
|
||||
//((UserCell) convertView).setStatusSize(themePrefs.getInt("contactsStatusSize", 14));
|
||||
//((UserCell) convertView).setAvatarRadius(themePrefs.getInt("contactsAvatarRadius", 32));
|
||||
}
|
||||
//parent.setBackgroundColor(themePrefs.getInt("contactsRowColor", 0xffffffff)); //Plus
|
||||
updateListBG(parent);
|
||||
|
@ -1,9 +1,9 @@
|
||||
/*
|
||||
* This is the source code of Telegram for Android v. 1.7.x.
|
||||
* This is the source code of Telegram for Android v. 3.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.
|
||||
* Copyright Nikolai Kudashov, 2013-2015.
|
||||
*/
|
||||
|
||||
package org.telegram.ui.Adapters;
|
||||
|
@ -1,9 +1,9 @@
|
||||
/*
|
||||
* This is the source code of Telegram for Android v. 1.7.x.
|
||||
* This is the source code of Telegram for Android v. 3.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.
|
||||
* Copyright Nikolai Kudashov, 2013-2015.
|
||||
*/
|
||||
|
||||
package org.telegram.ui.Adapters;
|
||||
|
@ -1,9 +1,9 @@
|
||||
/*
|
||||
* This is the source code of Telegram for Android v. 1.7.x.
|
||||
* This is the source code of Telegram for Android v. 3.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.
|
||||
* Copyright Nikolai Kudashov, 2013-2015.
|
||||
*/
|
||||
|
||||
package org.telegram.ui.Adapters;
|
||||
|
@ -1,9 +1,9 @@
|
||||
/*
|
||||
* This is the source code of Telegram for Android v. 1.7.x.
|
||||
* This is the source code of Telegram for Android v. 3.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.
|
||||
* Copyright Nikolai Kudashov, 2013-2015.
|
||||
*/
|
||||
|
||||
package org.telegram.ui.Adapters;
|
||||
@ -180,7 +180,7 @@ public class DialogsSearchAdapter extends BaseSearchAdapterRecycler {
|
||||
}
|
||||
|
||||
public boolean isRecentSearchDisplayed() {
|
||||
return (lastSearchText == null || lastSearchText.length() == 0) && !recentSearchObjects.isEmpty();
|
||||
return needMessagesSearch != 2 && (lastSearchText == null || lastSearchText.length() == 0) && !recentSearchObjects.isEmpty();
|
||||
}
|
||||
|
||||
public void loadRecentSearch() {
|
||||
@ -778,7 +778,7 @@ public class DialogsSearchAdapter extends BaseSearchAdapterRecycler {
|
||||
|
||||
@Override
|
||||
public int getItemCount() {
|
||||
if ((lastSearchText == null || lastSearchText.length() == 0) && !recentSearchObjects.isEmpty()) {
|
||||
if (needMessagesSearch != 2 && (lastSearchText == null || lastSearchText.length() == 0) && !recentSearchObjects.isEmpty()) {
|
||||
return recentSearchObjects.size() + 1;
|
||||
}
|
||||
if (!searchResultHashtags.isEmpty()) {
|
||||
@ -797,7 +797,7 @@ public class DialogsSearchAdapter extends BaseSearchAdapterRecycler {
|
||||
}
|
||||
|
||||
public Object getItem(int i) {
|
||||
if ((lastSearchText == null || lastSearchText.length() == 0) && !recentSearchObjects.isEmpty()) {
|
||||
if (needMessagesSearch != 2 && (lastSearchText == null || lastSearchText.length() == 0) && !recentSearchObjects.isEmpty()) {
|
||||
if (i > 0 && i - 1 < recentSearchObjects.size()) {
|
||||
return recentSearchObjects.get(i - 1).object;
|
||||
} else {
|
||||
@ -868,7 +868,6 @@ public class DialogsSearchAdapter extends BaseSearchAdapterRecycler {
|
||||
boolean isRecent = false;
|
||||
String un = null;
|
||||
String hexDarkColor = String.format("#%08X", (0xFFFFFFFF & AndroidUtilities.getIntDarkerColor("themeColor", 0x15)));
|
||||
|
||||
Object obj = getItem(position);
|
||||
|
||||
if (obj instanceof TLRPC.User) {
|
||||
@ -885,7 +884,7 @@ public class DialogsSearchAdapter extends BaseSearchAdapterRecycler {
|
||||
user = MessagesController.getInstance().getUser(encryptedChat.user_id);
|
||||
}
|
||||
|
||||
if ((lastSearchText == null || lastSearchText.length() == 0) && !recentSearchObjects.isEmpty()) {
|
||||
if (needMessagesSearch != 2 && (lastSearchText == null || lastSearchText.length() == 0) && !recentSearchObjects.isEmpty()) {
|
||||
isRecent = true;
|
||||
cell.useSeparator = position != getItemCount() - 1;
|
||||
} else {
|
||||
@ -922,7 +921,7 @@ public class DialogsSearchAdapter extends BaseSearchAdapterRecycler {
|
||||
GreySectionCell cell = (GreySectionCell) holder.itemView;
|
||||
cell.setBackgroundColor(themePrefs.getInt("chatsRowColor", 0xfff2f2f2));
|
||||
cell.setTextColor(themePrefs.getInt("chatsNameColor", 0xff8a8a8a));
|
||||
if ((lastSearchText == null || lastSearchText.length() == 0) && !recentSearchObjects.isEmpty()) {
|
||||
if (needMessagesSearch != 2 && (lastSearchText == null || lastSearchText.length() == 0) && !recentSearchObjects.isEmpty()) {
|
||||
cell.setText(LocaleController.getString("Recent", R.string.Recent).toUpperCase());
|
||||
} else if (!searchResultHashtags.isEmpty()) {
|
||||
cell.setText(LocaleController.getString("Hashtags", R.string.Hashtags).toUpperCase());
|
||||
@ -957,7 +956,7 @@ public class DialogsSearchAdapter extends BaseSearchAdapterRecycler {
|
||||
|
||||
@Override
|
||||
public int getItemViewType(int i) {
|
||||
if ((lastSearchText == null || lastSearchText.length() == 0) && !recentSearchObjects.isEmpty()) {
|
||||
if (needMessagesSearch != 2 && (lastSearchText == null || lastSearchText.length() == 0) && !recentSearchObjects.isEmpty()) {
|
||||
return i == 0 ? 1 : 0;
|
||||
}
|
||||
if (!searchResultHashtags.isEmpty()) {
|
||||
|
@ -1,9 +1,9 @@
|
||||
/*
|
||||
* This is the source code of Telegram for Android v. 1.7.x.
|
||||
* This is the source code of Telegram for Android v. 3.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.
|
||||
* Copyright Nikolai Kudashov, 2013-2015.
|
||||
*/
|
||||
|
||||
package org.telegram.ui.Adapters;
|
||||
|
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* This is the source code of Telegram for Android v. 2.x
|
||||
* This is the source code of Telegram for Android v. 3.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).
|
||||
*
|
||||
|
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* This is the source code of Telegram for Android v. 2.x
|
||||
* This is the source code of Telegram for Android v. 3.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).
|
||||
*
|
||||
|
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* This is the source code of Telegram for Android v. 2.x
|
||||
* This is the source code of Telegram for Android v. 3.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).
|
||||
*
|
||||
|
@ -3,7 +3,7 @@
|
||||
* 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.
|
||||
* Copyright Nikolai Kudashov, 2013-2015.
|
||||
*/
|
||||
|
||||
package org.telegram.ui.Adapters;
|
||||
|
@ -3,12 +3,13 @@
|
||||
* 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.
|
||||
* Copyright Nikolai Kudashov, 2013-2015.
|
||||
*/
|
||||
|
||||
package org.telegram.ui.Adapters;
|
||||
|
||||
import android.content.Context;
|
||||
import android.text.TextUtils;
|
||||
import android.view.View;
|
||||
import android.view.ViewGroup;
|
||||
|
||||
@ -87,8 +88,18 @@ public class StickersAdapter extends RecyclerView.Adapter implements Notificatio
|
||||
}
|
||||
|
||||
public void loadStikersForEmoji(CharSequence emoji) {
|
||||
boolean search = emoji != null && emoji.length() > 0 && emoji.length() <= 4;
|
||||
boolean search = emoji != null && emoji.length() > 0 && emoji.length() <= 14;
|
||||
if (search) {
|
||||
int length = emoji.length();
|
||||
for (int a = 0; a < length; a++) {
|
||||
if (a < length - 1 && emoji.charAt(a) == 0xD83C && emoji.charAt(a + 1) >= 0xDFFB && emoji.charAt(a + 1) <= 0xDFFF) {
|
||||
emoji = TextUtils.concat(emoji.subSequence(0, a), emoji.subSequence(a + 2, emoji.length()));
|
||||
break;
|
||||
} else if (emoji.charAt(a) == 0xfe0f) {
|
||||
emoji = TextUtils.concat(emoji.subSequence(0, a), emoji.subSequence(a + 1, emoji.length()));
|
||||
length--;
|
||||
}
|
||||
}
|
||||
lastSticker = emoji.toString();
|
||||
HashMap<String, ArrayList<TLRPC.Document>> allStickers = StickersQuery.getAllStickers();
|
||||
if (allStickers != null) {
|
||||
|
@ -1,9 +1,9 @@
|
||||
/*
|
||||
* This is the source code of Telegram for Android v. 1.3.2.
|
||||
* This is the source code of Telegram for Android v. 3.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.
|
||||
* Copyright Nikolai Kudashov, 2013-2015.
|
||||
*/
|
||||
|
||||
package org.telegram.ui;
|
||||
|
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* This is the source code of Telegram for Android v. 2.x
|
||||
* This is the source code of Telegram for Android v. 3.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).
|
||||
*
|
||||
@ -11,7 +11,9 @@ package org.telegram.ui.Cells;
|
||||
import android.content.Context;
|
||||
import android.graphics.PorterDuff;
|
||||
import android.graphics.drawable.Drawable;
|
||||
import android.os.Build;
|
||||
import android.view.Gravity;
|
||||
import android.view.MotionEvent;
|
||||
import android.widget.FrameLayout;
|
||||
import android.widget.ImageView;
|
||||
|
||||
@ -42,9 +44,19 @@ public class AddMemberCell extends FrameLayout {
|
||||
addView(textView, LayoutHelper.createFrame(LayoutHelper.MATCH_PARENT, 20, (LocaleController.isRTL ? Gravity.RIGHT : Gravity.LEFT) | Gravity.TOP, LocaleController.isRTL ? 28 : 129, 22.5f, LocaleController.isRTL ? 129 : 28, 0));
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean onTouchEvent(MotionEvent event) {
|
||||
if (Build.VERSION.SDK_INT >= 21 && getBackground() != null) {
|
||||
if (event.getAction() == MotionEvent.ACTION_DOWN || event.getAction() == MotionEvent.ACTION_MOVE) {
|
||||
getBackground().setHotspot(event.getX(), event.getY());
|
||||
}
|
||||
}
|
||||
return super.onTouchEvent(event);
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
|
||||
super.onMeasure(widthMeasureSpec, MeasureSpec.makeMeasureSpec(AndroidUtilities.dp(64), MeasureSpec.EXACTLY));
|
||||
super.onMeasure(MeasureSpec.makeMeasureSpec(MeasureSpec.getSize(widthMeasureSpec), MeasureSpec.EXACTLY), MeasureSpec.makeMeasureSpec(AndroidUtilities.dp(64), MeasureSpec.EXACTLY));
|
||||
}
|
||||
|
||||
public void setTextColor(int color) {
|
||||
|
@ -3,7 +3,7 @@
|
||||
* 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.
|
||||
* Copyright Nikolai Kudashov, 2013-2015.
|
||||
*/
|
||||
|
||||
package org.telegram.ui.Cells;
|
||||
@ -33,11 +33,11 @@ public class BaseCell extends View {
|
||||
public void run() {
|
||||
if (checkingForLongPress && getParent() != null && currentPressCount == pressCount) {
|
||||
checkingForLongPress = false;
|
||||
performHapticFeedback(HapticFeedbackConstants.LONG_PRESS);
|
||||
onLongPress();
|
||||
MotionEvent event = MotionEvent.obtain(0, 0, MotionEvent.ACTION_CANCEL, 0, 0, 0);
|
||||
onTouchEvent(event);
|
||||
event.recycle();
|
||||
performHapticFeedback(HapticFeedbackConstants.LONG_PRESS);
|
||||
onLongPress();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -1,9 +1,9 @@
|
||||
/*
|
||||
* This is the source code of Telegram for Android v. 1.7.x.
|
||||
* This is the source code of Telegram for Android v. 3.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.
|
||||
* Copyright Nikolai Kudashov, 2013-2015.
|
||||
*/
|
||||
|
||||
package org.telegram.ui.Cells;
|
||||
|
@ -3,7 +3,7 @@
|
||||
* 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.
|
||||
* Copyright Nikolai Kudashov, 2013-2015.
|
||||
*/
|
||||
|
||||
package org.telegram.ui.Cells;
|
||||
@ -19,14 +19,14 @@ import android.view.MotionEvent;
|
||||
import android.view.SoundEffectConstants;
|
||||
|
||||
import org.telegram.messenger.AndroidUtilities;
|
||||
import org.telegram.messenger.ImageLoader;
|
||||
import org.telegram.messenger.MessagesController;
|
||||
import org.telegram.messenger.SendMessagesHelper;
|
||||
import org.telegram.messenger.BuildVars;
|
||||
import org.telegram.messenger.BuildConfig;
|
||||
import org.telegram.messenger.FileLoader;
|
||||
import org.telegram.messenger.FileLog;
|
||||
import org.telegram.messenger.ImageLoader;
|
||||
import org.telegram.messenger.MediaController;
|
||||
import org.telegram.messenger.MessageObject;
|
||||
import org.telegram.messenger.FileLog;
|
||||
import org.telegram.messenger.MessagesController;
|
||||
import org.telegram.messenger.SendMessagesHelper;
|
||||
import org.telegram.ui.Components.RadialProgress;
|
||||
import org.telegram.ui.Components.ResourceLoader;
|
||||
import org.telegram.ui.Components.SeekBar;
|
||||
@ -149,6 +149,7 @@ public class ChatAudioCell extends ChatBaseCell implements SeekBar.SeekBarDelega
|
||||
invalidate();
|
||||
}
|
||||
} else if (buttonState == 2) {
|
||||
radialProgress.setProgress(0, false);
|
||||
FileLoader.getInstance().loadFile(currentMessageObject.messageOwner.media.audio, true);
|
||||
buttonState = 3;
|
||||
radialProgress.setBackground(getDrawableForCurrentState(), true, false);
|
||||
@ -223,7 +224,8 @@ public class ChatAudioCell extends ChatBaseCell implements SeekBar.SeekBarDelega
|
||||
if (cacheFile == null) {
|
||||
cacheFile = FileLoader.getPathToMessage(currentMessageObject.messageOwner);
|
||||
}
|
||||
if (BuildVars.DEBUG_VERSION) {
|
||||
//if (BuildVars.DEBUG_VERSION) {
|
||||
if (BuildConfig.DEBUG) {
|
||||
FileLog.d("tmessages", "looking for audio in " + cacheFile);
|
||||
}
|
||||
if (cacheFile.exists()) {
|
||||
@ -308,6 +310,7 @@ public class ChatAudioCell extends ChatBaseCell implements SeekBar.SeekBarDelega
|
||||
buttonX = layoutWidth - backgroundWidth + AndroidUtilities.dp(13) - (((showMyAvatar && !isChat) || (showMyAvatarGroup && isChat)) ? AndroidUtilities.dp(leftBound) : 0);
|
||||
timeX = layoutWidth - backgroundWidth + AndroidUtilities.dp(66) - (((showMyAvatar && !isChat) || (showMyAvatarGroup && isChat)) ? AndroidUtilities.dp(leftBound) : 0);
|
||||
} else {
|
||||
//if (isChat && currentMessageObject.messageOwner.from_id > 0) {
|
||||
if ((isChat || showAvatar) && currentMessageObject.messageOwner.from_id > 0) {
|
||||
//seekBarX = AndroidUtilities.dp(116);
|
||||
//buttonX = AndroidUtilities.dp(74);
|
||||
@ -336,7 +339,7 @@ public class ChatAudioCell extends ChatBaseCell implements SeekBar.SeekBarDelega
|
||||
boolean dataChanged = currentMessageObject == messageObject && isUserDataChanged();
|
||||
if (currentMessageObject != messageObject || dataChanged) {
|
||||
if (AndroidUtilities.isTablet()) {
|
||||
backgroundWidth = Math.min(AndroidUtilities.getMinTabletSide() - AndroidUtilities.dp(isChat && messageObject.messageOwner.from_id > 0 ? 102 : 50), AndroidUtilities.dp(300));
|
||||
//backgroundWidth = Math.min(AndroidUtilities.getMinTabletSide() - AndroidUtilities.dp(isChat && messageObject.messageOwner.from_id > 0 ? 102 : 50), AndroidUtilities.dp(300));
|
||||
backgroundWidth = Math.min(AndroidUtilities.getMinTabletSide() - AndroidUtilities.dp( ((isChat || showAvatar) && messageObject.messageOwner.from_id > 0) || (messageObject.isOutOwner() && ((showMyAvatar && !isChat) || (showMyAvatarGroup && isChat))) ? leftBound + 50 : 50), AndroidUtilities.dp(300));
|
||||
} else {
|
||||
//backgroundWidth = Math.min(AndroidUtilities.displaySize.x - AndroidUtilities.dp(isChat && messageObject.messageOwner.from_id > 0 ? 102 : 50), AndroidUtilities.dp(300));
|
||||
|
@ -3,7 +3,7 @@
|
||||
* 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.
|
||||
* Copyright Nikolai Kudashov, 2013-2015.
|
||||
*/
|
||||
|
||||
package org.telegram.ui.Cells;
|
||||
@ -50,7 +50,7 @@ public class ChatBaseCell extends BaseCell implements MediaController.FileDownlo
|
||||
void didPressedCancelSendButton(ChatBaseCell cell);
|
||||
void didLongPressed(ChatBaseCell cell);
|
||||
void didPressReplyMessage(ChatBaseCell cell, int id);
|
||||
void didPressUrl(MessageObject messageObject, ClickableSpan url);
|
||||
void didPressUrl(MessageObject messageObject, ClickableSpan url, boolean longPress);
|
||||
void needOpenWebView(String url, String title, String originalUrl, int w, int h);
|
||||
void didClickedImage(ChatBaseCell cell);
|
||||
boolean canPerformActions();
|
||||
@ -71,6 +71,7 @@ public class ChatBaseCell extends BaseCell implements MediaController.FileDownlo
|
||||
private boolean wasLayout = false;
|
||||
protected boolean isAvatarVisible = false;
|
||||
protected boolean drawBackground = true;
|
||||
protected boolean allowAssistant = false;
|
||||
protected MessageObject currentMessageObject;
|
||||
|
||||
private static TextPaint timePaintIn;
|
||||
@ -119,11 +120,16 @@ public class ChatBaseCell extends BaseCell implements MediaController.FileDownlo
|
||||
|
||||
private StaticLayout timeLayout;
|
||||
protected int timeWidth;
|
||||
private int timeTextWidth;
|
||||
private int timeX;
|
||||
private TextPaint currentTimePaint;
|
||||
private String currentTimeString;
|
||||
protected boolean drawTime = true;
|
||||
|
||||
private StaticLayout viewsLayout;
|
||||
private int viewsTextWidth;
|
||||
private String currentViewsString;
|
||||
|
||||
private TLRPC.User currentUser;
|
||||
private TLRPC.Chat currentChat;
|
||||
private TLRPC.FileLocation currentPhoto;
|
||||
@ -301,6 +307,10 @@ public class ChatBaseCell extends BaseCell implements MediaController.FileDownlo
|
||||
invalidate();
|
||||
}
|
||||
|
||||
public void setAllowAssistant(boolean value) {
|
||||
allowAssistant = value;
|
||||
}
|
||||
|
||||
protected boolean isUserDataChanged() {
|
||||
if (currentMessageObject == null || currentUser == null && currentChat == null) {
|
||||
return false;
|
||||
@ -371,27 +381,11 @@ public class ChatBaseCell extends BaseCell implements MediaController.FileDownlo
|
||||
}
|
||||
|
||||
protected void measureTime(MessageObject messageObject) {
|
||||
if (!media) {
|
||||
if (messageObject.isOutOwner()) {
|
||||
currentTimePaint = timePaintOut;
|
||||
} else {
|
||||
currentTimePaint = timePaintIn;
|
||||
}
|
||||
} else {
|
||||
currentTimePaint = timeMediaPaint;
|
||||
}
|
||||
String timeString = LocaleController.formatterDay.format((long) (messageObject.messageOwner.date) * 1000);
|
||||
currentTimeString = LocaleController.formatterDay.format((long) (messageObject.messageOwner.date) * 1000);
|
||||
timeTextWidth = timeWidth = (int) Math.ceil(timeMediaPaint.measureText(currentTimeString));
|
||||
if ((messageObject.messageOwner.flags & TLRPC.MESSAGE_FLAG_HAS_VIEWS) != 0) {
|
||||
currentTimeString = String.format("%s ", LocaleController.formatShortNumber(messageObject.messageOwner.views, null)) + timeString;
|
||||
} else {
|
||||
currentTimeString = timeString;
|
||||
}
|
||||
timeWidth = (int) Math.ceil(currentTimePaint.measureText(currentTimeString));
|
||||
if ((messageObject.messageOwner.flags & TLRPC.MESSAGE_FLAG_HAS_VIEWS) != 0) {
|
||||
timeWidth += ResourceLoader.viewsCountDrawable.getIntrinsicWidth() + AndroidUtilities.dp(4);
|
||||
}
|
||||
if ((messageObject.messageOwner.flags & TLRPC.MESSAGE_FLAG_HAS_VIEWS) != 0 && (messageObject.isSending() || messageObject.isSendError())) {
|
||||
currentTimeString = timeString;
|
||||
currentViewsString = String.format("%s", LocaleController.formatShortNumber(Math.max(1, messageObject.messageOwner.views), null));
|
||||
timeWidth += (int) Math.ceil(timeMediaPaint.measureText(currentViewsString)) + ResourceLoader.viewsCountDrawable.getIntrinsicWidth() + AndroidUtilities.dp(10);
|
||||
}
|
||||
}
|
||||
|
||||
@ -462,18 +456,12 @@ public class ChatBaseCell extends BaseCell implements MediaController.FileDownlo
|
||||
currentTimePaint = timeMediaPaint;
|
||||
}
|
||||
|
||||
String timeString = LocaleController.formatterDay.format((long) (currentMessageObject.messageOwner.date) * 1000);
|
||||
if ((currentMessageObject.messageOwner.flags & TLRPC.MESSAGE_FLAG_HAS_VIEWS) != 0) {
|
||||
currentTimeString = String.format("%s ", LocaleController.formatShortNumber(currentMessageObject.messageOwner.views, null)) + timeString;
|
||||
} else {
|
||||
currentTimeString = timeString;
|
||||
}
|
||||
timeWidth = (int)Math.ceil(currentTimePaint.measureText(currentTimeString));
|
||||
if ((currentMessageObject.messageOwner.flags & TLRPC.MESSAGE_FLAG_HAS_VIEWS) != 0) {
|
||||
timeWidth += ResourceLoader.viewsCountDrawable.getIntrinsicWidth() + AndroidUtilities.dp(4);
|
||||
}
|
||||
if ((currentMessageObject.messageOwner.flags & TLRPC.MESSAGE_FLAG_HAS_VIEWS) != 0 && (currentMessageObject.isSending() || currentMessageObject.isSendError())) {
|
||||
currentTimeString = timeString;
|
||||
currentTimeString = LocaleController.formatterDay.format((long) (messageObject.messageOwner.date) * 1000);
|
||||
timeTextWidth = timeWidth = (int)Math.ceil(currentTimePaint.measureText(currentTimeString));
|
||||
if ((messageObject.messageOwner.flags & TLRPC.MESSAGE_FLAG_HAS_VIEWS) != 0) {
|
||||
currentViewsString = String.format("%s", LocaleController.formatShortNumber(Math.max(1, messageObject.messageOwner.views), null));
|
||||
viewsTextWidth = (int) Math.ceil(currentTimePaint.measureText(currentViewsString));
|
||||
timeWidth += viewsTextWidth + ResourceLoader.viewsCountDrawable.getIntrinsicWidth() + AndroidUtilities.dp(10);
|
||||
}
|
||||
|
||||
namesOffset = 0;
|
||||
@ -493,8 +481,6 @@ public class ChatBaseCell extends BaseCell implements MediaController.FileDownlo
|
||||
}
|
||||
nameWidth = getMaxNameWidth();
|
||||
|
||||
|
||||
|
||||
CharSequence nameStringFinal = TextUtils.ellipsize(currentNameString.replace("\n", " "), namePaint, nameWidth - AndroidUtilities.dp(12), TextUtils.TruncateAt.END);
|
||||
nameLayout = new StaticLayout(nameStringFinal, namePaint, nameWidth, Layout.Alignment.ALIGN_NORMAL, 1.0f, 0.0f, false);
|
||||
if (nameLayout.getLineCount() > 0) {
|
||||
@ -764,7 +750,7 @@ public class ChatBaseCell extends BaseCell implements MediaController.FileDownlo
|
||||
layoutWidth = getMeasuredWidth();
|
||||
layoutHeight = getMeasuredHeight();
|
||||
|
||||
timeLayout = new StaticLayout(currentTimeString, currentTimePaint, timeWidth, Layout.Alignment.ALIGN_NORMAL, 1.0f, 0.0f, false);
|
||||
timeLayout = new StaticLayout(currentTimeString, currentTimePaint, timeTextWidth, Layout.Alignment.ALIGN_NORMAL, 1.0f, 0.0f, false);
|
||||
if (!media) {
|
||||
if (!currentMessageObject.isOutOwner()) {
|
||||
//timeX = backgroundWidth - AndroidUtilities.dp(9) - timeWidth + (isChat && currentMessageObject.messageOwner.from_id > 0 ? AndroidUtilities.dp(52) : 0);
|
||||
@ -785,6 +771,12 @@ public class ChatBaseCell extends BaseCell implements MediaController.FileDownlo
|
||||
}
|
||||
}
|
||||
|
||||
if ((currentMessageObject.messageOwner.flags & TLRPC.MESSAGE_FLAG_HAS_VIEWS) != 0) {
|
||||
viewsLayout = new StaticLayout(currentViewsString, currentTimePaint, viewsTextWidth, Layout.Alignment.ALIGN_NORMAL, 1.0f, 0.0f, false);
|
||||
} else {
|
||||
viewsLayout = null;
|
||||
}
|
||||
|
||||
if (isAvatarVisible) {
|
||||
//avatarImage.setImageCoords(AndroidUtilities.dp(6), layoutHeight - AndroidUtilities.dp(45), AndroidUtilities.dp(42), AndroidUtilities.dp(42));
|
||||
if(((showMyAvatar && !isChat) || (showMyAvatarGroup && isChat)) && currentMessageObject.isOutOwner()){
|
||||
@ -1036,6 +1028,13 @@ public class ChatBaseCell extends BaseCell implements MediaController.FileDownlo
|
||||
} else {
|
||||
setDrawableBounds(ResourceLoader.viewsMediaCountDrawable, timeX, layoutHeight - AndroidUtilities.dp(10) - timeLayout.getHeight());
|
||||
ResourceLoader.viewsMediaCountDrawable.draw(canvas);
|
||||
|
||||
if (viewsLayout != null) {
|
||||
canvas.save();
|
||||
canvas.translate(timeX + ResourceLoader.viewsMediaCountDrawable.getIntrinsicWidth() + AndroidUtilities.dp(3), layoutHeight - AndroidUtilities.dp(12.0f) - timeLayout.getHeight());
|
||||
viewsLayout.draw(canvas);
|
||||
canvas.restore();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@ -1066,6 +1065,13 @@ public class ChatBaseCell extends BaseCell implements MediaController.FileDownlo
|
||||
setDrawableBounds(ResourceLoader.viewsOutCountDrawable, timeX, layoutHeight - AndroidUtilities.dp(4.5f) - timeLayout.getHeight());
|
||||
ResourceLoader.viewsOutCountDrawable.draw(canvas);
|
||||
}
|
||||
|
||||
if (viewsLayout != null) {
|
||||
canvas.save();
|
||||
canvas.translate(timeX + ResourceLoader.viewsOutCountDrawable.getIntrinsicWidth() + AndroidUtilities.dp(3), layoutHeight - AndroidUtilities.dp(6.5f) - timeLayout.getHeight());
|
||||
viewsLayout.draw(canvas);
|
||||
canvas.restore();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -1,9 +1,9 @@
|
||||
/*
|
||||
* This is the source code of Telegram for Android v. 1.7.x.
|
||||
* This is the source code of Telegram for Android v. 3.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.
|
||||
* Copyright Nikolai Kudashov, 2013-2015.
|
||||
*/
|
||||
|
||||
package org.telegram.ui.Cells;
|
||||
@ -28,8 +28,8 @@ import org.telegram.messenger.LocaleController;
|
||||
import org.telegram.messenger.MessageObject;
|
||||
import org.telegram.messenger.MessagesController;
|
||||
import org.telegram.messenger.R;
|
||||
import org.telegram.messenger.UserConfig;
|
||||
import org.telegram.tgnet.TLRPC;
|
||||
import org.telegram.messenger.UserConfig;
|
||||
import org.telegram.ui.Components.AvatarDrawable;
|
||||
|
||||
public class ChatContactCell extends ChatBaseCell {
|
||||
|
@ -1,9 +1,9 @@
|
||||
/*
|
||||
* This is the source code of Telegram for Android v. 1.4.x.
|
||||
* This is the source code of Telegram for Android v. 3.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.
|
||||
* Copyright Nikolai Kudashov, 2013-2015.
|
||||
*/
|
||||
|
||||
package org.telegram.ui.Cells;
|
||||
@ -46,6 +46,7 @@ import org.telegram.ui.Components.GifDrawable;
|
||||
import org.telegram.ui.Components.RadialProgress;
|
||||
import org.telegram.ui.Components.ResourceLoader;
|
||||
import org.telegram.ui.Components.StaticLayoutEx;
|
||||
import org.telegram.ui.Components.URLSpanBotCommand;
|
||||
import org.telegram.ui.PhotoViewer;
|
||||
|
||||
import java.io.File;
|
||||
@ -100,6 +101,7 @@ public class ChatMediaCell extends ChatBaseCell {
|
||||
//
|
||||
private StaticLayout nameLayout;
|
||||
private int nameWidth = 0;
|
||||
private int nameOffsetX = 0;
|
||||
private String currentNameString;
|
||||
|
||||
private ChatMediaCellDelegate mediaDelegate = null;
|
||||
@ -196,7 +198,11 @@ public class ChatMediaCell extends ChatBaseCell {
|
||||
if (left <= x2 && left + nameLayout.getLineWidth(line) >= x2) {
|
||||
Spannable buffer = (Spannable) currentMessageObject.caption;
|
||||
ClickableSpan[] link = buffer.getSpans(off, off, ClickableSpan.class);
|
||||
if (link.length != 0) {
|
||||
boolean ignore = false;
|
||||
if (link.length == 0 || link.length != 0 && link[0] instanceof URLSpanBotCommand && !URLSpanBotCommand.enabled) {
|
||||
ignore = true;
|
||||
}
|
||||
if (!ignore) {
|
||||
resetPressedLink();
|
||||
pressedLink = link[0];
|
||||
linkPreviewPressed = true;
|
||||
@ -220,7 +226,7 @@ public class ChatMediaCell extends ChatBaseCell {
|
||||
}
|
||||
} else if (linkPreviewPressed) {
|
||||
try {
|
||||
delegate.didPressUrl(currentMessageObject, pressedLink);
|
||||
delegate.didPressUrl(currentMessageObject, pressedLink, false);
|
||||
} catch (Exception e) {
|
||||
FileLog.e("tmessages", e);
|
||||
}
|
||||
@ -460,7 +466,7 @@ public class ChatMediaCell extends ChatBaseCell {
|
||||
}
|
||||
double lat = object.messageOwner.media.geo.lat;
|
||||
double lon = object.messageOwner.media.geo._long;
|
||||
String url = String.format(Locale.US, "https://maps.googleapis.com/maps/api/staticmap?center=%f,%f&zoom=13&size=100x100&maptype=roadmap&scale=%d&markers=color:red|size:big|%f,%f&sensor=false", lat, lon, Math.min(2, (int) Math.ceil(AndroidUtilities.density)), lat, lon);
|
||||
String url = String.format(Locale.US, "https://maps.googleapis.com/maps/api/staticmap?center=%f,%f&zoom=15&size=100x100&maptype=roadmap&scale=%d&markers=color:red|size:big|%f,%f&sensor=false", lat, lon, Math.min(2, (int) Math.ceil(AndroidUtilities.density)), lat, lon);
|
||||
if (!url.equals(currentUrl)) {
|
||||
return true;
|
||||
}
|
||||
@ -504,6 +510,7 @@ public class ChatMediaCell extends ChatBaseCell {
|
||||
public void setMessageObject(MessageObject messageObject) {
|
||||
boolean dataChanged = currentMessageObject == messageObject && (isUserDataChanged() || photoNotSet);
|
||||
if (currentMessageObject != messageObject || isPhotoDataChanged(messageObject) || dataChanged) {
|
||||
drawForwardedName = (messageObject.type == 3 || messageObject.type == 1) && messageObject.messageOwner.fwd_from_id != null && messageObject.messageOwner.fwd_from_id.channel_id != 0;
|
||||
media = messageObject.type != 9;
|
||||
cancelLoading = false;
|
||||
additionHeight = 0;
|
||||
@ -518,7 +525,6 @@ public class ChatMediaCell extends ChatBaseCell {
|
||||
drawBackground = true;
|
||||
|
||||
photoImage.setForcePreview(messageObject.isSecretPhoto());
|
||||
|
||||
if (messageObject.type == 9) {
|
||||
String name = messageObject.getDocumentName();
|
||||
if (name == null || name.length() == 0) {
|
||||
@ -535,6 +541,7 @@ public class ChatMediaCell extends ChatBaseCell {
|
||||
nameLayout = StaticLayoutEx.createStaticLayout(currentNameString, namePaint, maxWidth, Layout.Alignment.ALIGN_NORMAL, 1.0f, 0.0f, false, TextUtils.TruncateAt.END, maxWidth, 1);
|
||||
if (nameLayout.getLineCount() > 0) {
|
||||
nameWidth = Math.min(maxWidth, (int) Math.ceil(nameLayout.getLineWidth(0)));
|
||||
nameOffsetX = (int) Math.ceil(-nameLayout.getLineLeft(0));
|
||||
} else {
|
||||
nameWidth = maxWidth;
|
||||
}
|
||||
@ -554,7 +561,7 @@ public class ChatMediaCell extends ChatBaseCell {
|
||||
}
|
||||
ext = ext.toUpperCase();
|
||||
|
||||
String str = AndroidUtilities.formatFileSize(messageObject.messageOwner.media.document.size) + " " + ext;
|
||||
String str = AndroidUtilities.formatFileSize(messageObject.messageOwner.media.document.size) + " " + messageObject.getExtension();
|
||||
|
||||
if (currentInfoString == null || !currentInfoString.equals(str)) {
|
||||
currentInfoString = str;
|
||||
@ -641,7 +648,7 @@ public class ChatMediaCell extends ChatBaseCell {
|
||||
currentNameString = null;
|
||||
infoLayout = null;
|
||||
nameLayout = null;
|
||||
updateSecretTimeText();
|
||||
updateSecretTimeText(messageObject);
|
||||
infoLayout2 = null; //Plus
|
||||
}
|
||||
if (messageObject.type == 9) { //doc
|
||||
@ -663,7 +670,7 @@ public class ChatMediaCell extends ChatBaseCell {
|
||||
double lon = messageObject.messageOwner.media.geo._long;
|
||||
|
||||
if (messageObject.messageOwner.media.title != null && messageObject.messageOwner.media.title.length() > 0) {
|
||||
//int maxWidth = (AndroidUtilities.isTablet() ? AndroidUtilities.getMinTabletSide() : Math.min(AndroidUtilities.displaySize.x, AndroidUtilities.displaySize.y)) - AndroidUtilities.dp((isChat && !messageObject.isOut() ? 102 : 40) + 86 + 24);
|
||||
//int maxWidth = (AndroidUtilities.isTablet() ? AndroidUtilities.getMinTabletSide() : Math.min(AndroidUtilities.displaySize.x, AndroidUtilities.displaySize.y)) - AndroidUtilities.dp((isChat && !messageObject.isOutOwner() ? 102 : 40) + 86 + 24);
|
||||
int maxWidth = (AndroidUtilities.isTablet() ? AndroidUtilities.getMinTabletSide() : Math.min(AndroidUtilities.displaySize.x, AndroidUtilities.displaySize.y)) - AndroidUtilities.dp(((isChat || showAvatar) && !messageObject.isOutOwner() ? leftBound + 50 : 40) + 86 + 24);
|
||||
nameLayout = StaticLayoutEx.createStaticLayout(messageObject.messageOwner.media.title, locationTitlePaint, maxWidth, Layout.Alignment.ALIGN_NORMAL, 1.0f, 0.0f, false, TextUtils.TruncateAt.END, maxWidth - AndroidUtilities.dp(4), 3);
|
||||
int lineCount = nameLayout.getLineCount();
|
||||
@ -687,12 +694,12 @@ public class ChatMediaCell extends ChatBaseCell {
|
||||
}
|
||||
}
|
||||
backgroundWidth = photoWidth + AndroidUtilities.dp(21) + maxWidth;
|
||||
currentUrl = String.format(Locale.US, "https://maps.googleapis.com/maps/api/staticmap?center=%f,%f&zoom=13&size=72x72&maptype=roadmap&scale=%d&markers=color:red|size:big|%f,%f&sensor=false", lat, lon, Math.min(2, (int) Math.ceil(AndroidUtilities.density)), lat, lon);
|
||||
currentUrl = String.format(Locale.US, "https://maps.googleapis.com/maps/api/staticmap?center=%f,%f&zoom=15&size=72x72&maptype=roadmap&scale=%d&markers=color:red|size:big|%f,%f&sensor=false", lat, lon, Math.min(2, (int) Math.ceil(AndroidUtilities.density)), lat, lon);
|
||||
} else {
|
||||
photoWidth = AndroidUtilities.dp(200);
|
||||
photoHeight = AndroidUtilities.dp(100);
|
||||
backgroundWidth = photoWidth + AndroidUtilities.dp(12);
|
||||
currentUrl = String.format(Locale.US, "https://maps.googleapis.com/maps/api/staticmap?center=%f,%f&zoom=13&size=200x100&maptype=roadmap&scale=%d&markers=color:red|size:big|%f,%f&sensor=false", lat, lon, Math.min(2, (int) Math.ceil(AndroidUtilities.density)), lat, lon);
|
||||
currentUrl = String.format(Locale.US, "https://maps.googleapis.com/maps/api/staticmap?center=%f,%f&zoom=15&size=200x100&maptype=roadmap&scale=%d&markers=color:red|size:big|%f,%f&sensor=false", lat, lon, Math.min(2, (int) Math.ceil(AndroidUtilities.density)), lat, lon);
|
||||
}
|
||||
|
||||
photoImage.setNeedsQualityThumb(false);
|
||||
@ -914,11 +921,20 @@ public class ChatMediaCell extends ChatBaseCell {
|
||||
}
|
||||
super.setMessageObject(messageObject);
|
||||
|
||||
if (drawForwardedName) {
|
||||
namesOffset += AndroidUtilities.dp(5);
|
||||
}
|
||||
|
||||
invalidate();
|
||||
}
|
||||
updateButtonState(dataChanged);
|
||||
}
|
||||
|
||||
@Override
|
||||
protected int getMaxNameWidth() {
|
||||
return backgroundWidth - AndroidUtilities.dp(14);
|
||||
}
|
||||
|
||||
@Override
|
||||
public ImageReceiver getPhotoImage() {
|
||||
return photoImage;
|
||||
@ -1040,12 +1056,13 @@ public class ChatMediaCell extends ChatBaseCell {
|
||||
deleteProgressRect.set(buttonX + AndroidUtilities.dp(3), buttonY + AndroidUtilities.dp(3), buttonX + AndroidUtilities.dp(45), buttonY + AndroidUtilities.dp(45));
|
||||
}
|
||||
|
||||
private void updateSecretTimeText() {
|
||||
if (currentMessageObject == null || currentMessageObject.isOut()) {
|
||||
private void updateSecretTimeText(MessageObject messageObject) {
|
||||
if (messageObject == null || messageObject.isOut()) {
|
||||
return;
|
||||
}
|
||||
String str = currentMessageObject.getSecretTimeString();
|
||||
String str = messageObject.getSecretTimeString();
|
||||
if (str == null) {
|
||||
infoLayout = null;
|
||||
return;
|
||||
}
|
||||
if (currentInfoString == null || !currentInfoString.equals(str)) {
|
||||
@ -1166,7 +1183,7 @@ public class ChatMediaCell extends ChatBaseCell {
|
||||
int offset = AndroidUtilities.dp(2);
|
||||
invalidate((int) deleteProgressRect.left - offset, (int) deleteProgressRect.top - offset, (int) deleteProgressRect.right + offset * 2, (int) deleteProgressRect.bottom + offset * 2);
|
||||
}
|
||||
updateSecretTimeText();
|
||||
updateSecretTimeText(currentMessageObject);
|
||||
}
|
||||
}
|
||||
|
||||
@ -1187,7 +1204,11 @@ public class ChatMediaCell extends ChatBaseCell {
|
||||
if (pressedLink != null) {
|
||||
canvas.drawPath(urlPath, urlPaint);
|
||||
}
|
||||
try {
|
||||
nameLayout.draw(canvas);
|
||||
} catch (Exception e) {
|
||||
FileLog.e("tmessages", e);
|
||||
}
|
||||
canvas.restore();
|
||||
}
|
||||
//if (infoLayout != null && (buttonState == 1 || buttonState == 0 || buttonState == 3 || currentMessageObject.isSecretPhoto())) {
|
||||
@ -1226,7 +1247,7 @@ public class ChatMediaCell extends ChatBaseCell {
|
||||
locationAddressPaint.setColor(currentMessageObject.isOutOwner() ? 0xff70b15c : 0xff999999);
|
||||
|
||||
canvas.save();
|
||||
canvas.translate(photoImage.getImageX() + photoImage.getImageWidth() + AndroidUtilities.dp(10), photoImage.getImageY() + AndroidUtilities.dp(3));
|
||||
canvas.translate(nameOffsetX + photoImage.getImageX() + photoImage.getImageWidth() + AndroidUtilities.dp(10), photoImage.getImageY() + AndroidUtilities.dp(3));
|
||||
nameLayout.draw(canvas);
|
||||
canvas.restore();
|
||||
|
||||
@ -1260,7 +1281,7 @@ public class ChatMediaCell extends ChatBaseCell {
|
||||
}
|
||||
} else if (nameLayout != null) {
|
||||
canvas.save();
|
||||
canvas.translate(photoImage.getImageX() + photoImage.getImageWidth() + AndroidUtilities.dp(10), photoImage.getImageY() + AndroidUtilities.dp(8));
|
||||
canvas.translate(nameOffsetX + photoImage.getImageX() + photoImage.getImageWidth() + AndroidUtilities.dp(10), photoImage.getImageY() + AndroidUtilities.dp(8));
|
||||
nameLayout.draw(canvas);
|
||||
canvas.restore();
|
||||
|
||||
|
@ -3,7 +3,7 @@
|
||||
* 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.
|
||||
* Copyright Nikolai Kudashov, 2013-2015.
|
||||
*/
|
||||
|
||||
package org.telegram.ui.Cells;
|
||||
@ -26,6 +26,7 @@ import android.text.TextUtils;
|
||||
import android.text.style.ClickableSpan;
|
||||
import android.view.MotionEvent;
|
||||
import android.view.SoundEffectConstants;
|
||||
import android.view.ViewStructure;
|
||||
|
||||
import org.telegram.messenger.AndroidUtilities;
|
||||
import org.telegram.messenger.ApplicationLoader;
|
||||
@ -40,6 +41,8 @@ import org.telegram.tgnet.TLRPC;
|
||||
import org.telegram.ui.Components.RadialProgress;
|
||||
import org.telegram.ui.Components.ResourceLoader;
|
||||
import org.telegram.ui.Components.StaticLayoutEx;
|
||||
import org.telegram.ui.Components.URLSpanBotCommand;
|
||||
import org.telegram.ui.Components.URLSpanNoUnderline;
|
||||
|
||||
import java.io.File;
|
||||
import java.util.Locale;
|
||||
@ -116,7 +119,11 @@ public class ChatMessageCell extends ChatBaseCell {
|
||||
if (left <= x && left + block.textLayout.getLineWidth(line) >= x) {
|
||||
Spannable buffer = (Spannable) currentMessageObject.messageText;
|
||||
ClickableSpan[] link = buffer.getSpans(off, off, ClickableSpan.class);
|
||||
if (link.length != 0) {
|
||||
boolean ignore = false;
|
||||
if (link.length == 0 || link.length != 0 && link[0] instanceof URLSpanBotCommand && !URLSpanBotCommand.enabled) {
|
||||
ignore = true;
|
||||
}
|
||||
if (!ignore) {
|
||||
if (event.getAction() == MotionEvent.ACTION_DOWN) {
|
||||
resetPressedLink();
|
||||
pressedLink = link[0];
|
||||
@ -132,7 +139,7 @@ public class ChatMessageCell extends ChatBaseCell {
|
||||
} else {
|
||||
if (link[0] == pressedLink) {
|
||||
try {
|
||||
delegate.didPressUrl(currentMessageObject, pressedLink);
|
||||
delegate.didPressUrl(currentMessageObject, pressedLink, false);
|
||||
} catch (Exception e) {
|
||||
FileLog.e("tmessages", e);
|
||||
}
|
||||
@ -176,7 +183,11 @@ public class ChatMessageCell extends ChatBaseCell {
|
||||
if (left <= x && left + descriptionLayout.getLineWidth(line) >= x) {
|
||||
Spannable buffer = (Spannable) currentMessageObject.linkDescription;
|
||||
ClickableSpan[] link = buffer.getSpans(off, off, ClickableSpan.class);
|
||||
if (link.length != 0) {
|
||||
boolean ignore = false;
|
||||
if (link.length == 0 || link.length != 0 && link[0] instanceof URLSpanBotCommand && !URLSpanBotCommand.enabled) {
|
||||
ignore = true;
|
||||
}
|
||||
if (!ignore) {
|
||||
resetPressedLink();
|
||||
pressedLink = link[0];
|
||||
linkPreviewPressed = true;
|
||||
@ -352,6 +363,18 @@ public class ChatMessageCell extends ChatBaseCell {
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void onLongPress() {
|
||||
if (pressedLink instanceof URLSpanNoUnderline) {
|
||||
URLSpanNoUnderline url = (URLSpanNoUnderline) pressedLink;
|
||||
if (url.getURL().startsWith("/")) {
|
||||
delegate.didPressUrl(currentMessageObject, pressedLink, true);
|
||||
return;
|
||||
}
|
||||
}
|
||||
super.onLongPress();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void setMessageObject(MessageObject messageObject) {
|
||||
boolean dataChanged = currentMessageObject == messageObject && (isUserDataChanged() || photoNotSet);
|
||||
@ -379,23 +402,25 @@ public class ChatMessageCell extends ChatBaseCell {
|
||||
int maxWidth;
|
||||
|
||||
if (AndroidUtilities.isTablet()) {
|
||||
//if (isChat && !messageObject.isOutOwner() && messageObject.messageOwner.from_id > 0) {
|
||||
if ((isChat || showAvatar) && !messageObject.isOutOwner() && messageObject.messageOwner.from_id > 0
|
||||
|| ( (showMyAvatar && !isChat) || (showMyAvatarGroup && isChat)) && messageObject.isOutOwner()) {
|
||||
//maxWidth = AndroidUtilities.getMinTabletSide() - AndroidUtilities.dp(122);
|
||||
maxWidth = AndroidUtilities.getMinTabletSide() - AndroidUtilities.dp(leftBound + 70);
|
||||
drawName = true;
|
||||
} else {
|
||||
drawName = messageObject.messageOwner.to_id.channel_id != 0;
|
||||
drawName = messageObject.messageOwner.to_id.channel_id != 0 && !messageObject.isOutOwner();
|
||||
maxWidth = AndroidUtilities.getMinTabletSide() - AndroidUtilities.dp(80);
|
||||
}
|
||||
} else {
|
||||
//if (isChat && !messageObject.isOutOwner() && messageObject.messageOwner.from_id > 0) {
|
||||
if ((isChat || showAvatar) && !messageObject.isOutOwner() && messageObject.messageOwner.from_id > 0
|
||||
|| ( (showMyAvatar && !isChat) || (showMyAvatarGroup && isChat)) && messageObject.isOutOwner()) {
|
||||
maxWidth = Math.min(AndroidUtilities.displaySize.x, AndroidUtilities.displaySize.y) - AndroidUtilities.dp(122);
|
||||
drawName = true;
|
||||
} else {
|
||||
maxWidth = Math.min(AndroidUtilities.displaySize.x, AndroidUtilities.displaySize.y) - AndroidUtilities.dp(80);
|
||||
drawName = messageObject.messageOwner.to_id.channel_id != 0;
|
||||
drawName = messageObject.messageOwner.to_id.channel_id != 0 && !messageObject.isOutOwner();
|
||||
}
|
||||
}
|
||||
|
||||
@ -563,7 +588,7 @@ public class ChatMessageCell extends ChatBaseCell {
|
||||
totalHeight += height;
|
||||
for (int a = 0; a < descriptionLayout.getLineCount(); a++) {
|
||||
int lineLeft = (int) Math.ceil(descriptionLayout.getLineLeft(a));
|
||||
if (descriptionX == 0) {
|
||||
if (a == 0 && descriptionX == 0) {
|
||||
descriptionX = -lineLeft;
|
||||
} else {
|
||||
descriptionX = Math.max(descriptionX, -lineLeft);
|
||||
@ -990,4 +1015,12 @@ public class ChatMessageCell extends ChatBaseCell {
|
||||
updateButtonState(false);
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onProvideStructure(ViewStructure structure) {
|
||||
super.onProvideStructure(structure);
|
||||
if (allowAssistant && Build.VERSION.SDK_INT >= 23) {
|
||||
structure.setText(currentMessageObject.messageText);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -3,7 +3,7 @@
|
||||
* 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.
|
||||
* Copyright Nikolai Kudashov, 2013-2015.
|
||||
*/
|
||||
|
||||
package org.telegram.ui.Cells;
|
||||
@ -23,23 +23,18 @@ import android.view.MotionEvent;
|
||||
|
||||
import org.telegram.PhoneFormat.PhoneFormat;
|
||||
import org.telegram.messenger.AndroidUtilities;
|
||||
import org.telegram.messenger.ApplicationLoader;
|
||||
import org.telegram.messenger.ContactsController;
|
||||
import org.telegram.messenger.Emoji;
|
||||
import org.telegram.messenger.FileLog;
|
||||
import org.telegram.messenger.ImageReceiver;
|
||||
import org.telegram.messenger.LocaleController;
|
||||
import org.telegram.messenger.MessageObject;
|
||||
import org.telegram.messenger.MessagesController;
|
||||
import org.telegram.messenger.UserObject;
|
||||
import org.telegram.messenger.ApplicationLoader;
|
||||
import org.telegram.messenger.FileLog;
|
||||
import org.telegram.messenger.R;
|
||||
import org.telegram.tgnet.TLRPC;
|
||||
import org.telegram.messenger.ContactsController;
|
||||
import org.telegram.messenger.Emoji;
|
||||
import org.telegram.messenger.MessagesController;
|
||||
import org.telegram.messenger.R;
|
||||
import org.telegram.messenger.UserConfig;
|
||||
import org.telegram.messenger.ImageReceiver;
|
||||
import org.telegram.messenger.UserObject;
|
||||
import org.telegram.tgnet.TLRPC;
|
||||
import org.telegram.ui.Components.AvatarDrawable;
|
||||
|
||||
import java.util.ArrayList;
|
||||
@ -64,9 +59,11 @@ public class DialogCell extends BaseCell {
|
||||
private static Drawable errorDrawable;
|
||||
private static Drawable lockDrawable;
|
||||
private static Drawable countDrawable;
|
||||
private static Drawable countDrawableGrey;
|
||||
private static Drawable groupDrawable;
|
||||
private static Drawable broadcastDrawable;
|
||||
private static Drawable muteDrawable;
|
||||
private static Drawable verifiedDrawable;
|
||||
|
||||
private static Paint linePaint;
|
||||
private static Paint backPaint;
|
||||
@ -126,6 +123,8 @@ public class DialogCell extends BaseCell {
|
||||
private int countWidth;
|
||||
private StaticLayout countLayout;
|
||||
|
||||
private boolean drawVerified;
|
||||
|
||||
private int avatarTop = AndroidUtilities.dp(10);
|
||||
|
||||
private boolean isSelected;
|
||||
@ -196,11 +195,11 @@ public class DialogCell extends BaseCell {
|
||||
clockDrawable = getResources().getDrawable(R.drawable.msg_clock);
|
||||
errorDrawable = getResources().getDrawable(R.drawable.dialogs_warning);
|
||||
countDrawable = getResources().getDrawable(R.drawable.dialogs_badge);
|
||||
countDrawableGrey = getResources().getDrawable(R.drawable.dialogs_badge2);
|
||||
groupDrawable = getResources().getDrawable(R.drawable.list_group);
|
||||
broadcastDrawable = getResources().getDrawable(R.drawable.list_broadcast);
|
||||
muteDrawable = getResources().getDrawable(R.drawable.mute_grey);
|
||||
|
||||
updateTheme();
|
||||
verifiedDrawable = getResources().getDrawable(R.drawable.check_list);
|
||||
}
|
||||
|
||||
setBackgroundResource(R.drawable.list_selector);
|
||||
@ -289,6 +288,7 @@ public class DialogCell extends BaseCell {
|
||||
drawNameGroup = false;
|
||||
drawNameBroadcast = false;
|
||||
drawNameLock = false;
|
||||
drawVerified = false;
|
||||
|
||||
if (encryptedChat != null) {
|
||||
drawNameLock = true;
|
||||
@ -309,6 +309,7 @@ public class DialogCell extends BaseCell {
|
||||
drawNameGroup = true;
|
||||
nameLockTop = AndroidUtilities.dp(17.5f);
|
||||
}
|
||||
drawVerified = (chat.flags & TLRPC.CHAT_FLAG_IS_VERIFIED) != 0;
|
||||
|
||||
if (!LocaleController.isRTL) {
|
||||
nameLockLeft = AndroidUtilities.dp(AndroidUtilities.leftBaseline);
|
||||
@ -390,7 +391,7 @@ public class DialogCell extends BaseCell {
|
||||
messageString = message.messageText;
|
||||
currentMessagePaint = messagePrintingPaint;
|
||||
} else {
|
||||
if (chat != null && chat.id > 0) {
|
||||
if (chat != null && chat.id > 0 && fromChat == null) {
|
||||
String name;
|
||||
if (message.isOutOwner()) {
|
||||
name = LocaleController.getString("FromYou", R.string.FromYou);
|
||||
@ -567,12 +568,18 @@ public class DialogCell extends BaseCell {
|
||||
}
|
||||
}
|
||||
|
||||
if (dialogMuted) {
|
||||
if (dialogMuted && !drawVerified) {
|
||||
int w = AndroidUtilities.dp(6) + muteDrawable.getIntrinsicWidth();
|
||||
nameWidth -= w;
|
||||
if (LocaleController.isRTL) {
|
||||
nameLeft += w;
|
||||
}
|
||||
} else if (drawVerified) {
|
||||
int w = AndroidUtilities.dp(6) + verifiedDrawable.getIntrinsicWidth();
|
||||
nameWidth -= w;
|
||||
if (LocaleController.isRTL) {
|
||||
nameLeft += w;
|
||||
}
|
||||
}
|
||||
|
||||
nameWidth = Math.max(AndroidUtilities.dp(12), nameWidth);
|
||||
@ -647,8 +654,10 @@ public class DialogCell extends BaseCell {
|
||||
if (nameLayout != null && nameLayout.getLineCount() > 0) {
|
||||
left = nameLayout.getLineLeft(0);
|
||||
widthpx = Math.ceil(nameLayout.getLineWidth(0));
|
||||
if (dialogMuted) {
|
||||
if (dialogMuted && !drawVerified) {
|
||||
nameMuteLeft = (int) (nameLeft + (nameWidth - widthpx) - AndroidUtilities.dp(6) - muteDrawable.getIntrinsicWidth());
|
||||
} else if (drawVerified) {
|
||||
nameMuteLeft = (int) (nameLeft + (nameWidth - widthpx) - AndroidUtilities.dp(6) - verifiedDrawable.getIntrinsicWidth());
|
||||
}
|
||||
if (left == 0) {
|
||||
if (widthpx < nameWidth) {
|
||||
@ -674,7 +683,7 @@ public class DialogCell extends BaseCell {
|
||||
nameLeft -= (nameWidth - widthpx);
|
||||
}
|
||||
}
|
||||
if (dialogMuted) {
|
||||
if (dialogMuted || drawVerified) {
|
||||
nameMuteLeft = (int) (nameLeft + left + AndroidUtilities.dp(6));
|
||||
}
|
||||
}
|
||||
@ -877,6 +886,7 @@ public class DialogCell extends BaseCell {
|
||||
clockDrawable.setColorFilter(themePrefs.getInt("chatsChecksColor", tColor), PorterDuff.Mode.SRC_IN);
|
||||
|
||||
countDrawable.setColorFilter(themePrefs.getInt("chatsCountBGColor", tColor), PorterDuff.Mode.SRC_IN);
|
||||
countDrawableGrey.setColorFilter(themePrefs.getInt("chatsCountBGColor", tColor), PorterDuff.Mode.SRC_IN);
|
||||
|
||||
nColor = themePrefs.getInt("chatsGroupIconColor", themePrefs.getInt("chatsGroupNameColor", 0xff000000));
|
||||
groupDrawable.setColorFilter(nColor, PorterDuff.Mode.SRC_IN);
|
||||
@ -951,21 +961,29 @@ public class DialogCell extends BaseCell {
|
||||
}
|
||||
}
|
||||
|
||||
if (dialogMuted) {
|
||||
if (dialogMuted && !drawVerified) {
|
||||
setDrawableBounds(muteDrawable, nameMuteLeft, AndroidUtilities.dp(16.5f));
|
||||
muteDrawable.draw(canvas);
|
||||
} else if (drawVerified) {
|
||||
setDrawableBounds(verifiedDrawable, nameMuteLeft, AndroidUtilities.dp(16.5f));
|
||||
verifiedDrawable.draw(canvas);
|
||||
}
|
||||
|
||||
if (drawError) {
|
||||
setDrawableBounds(errorDrawable, errorLeft, errorTop);
|
||||
errorDrawable.draw(canvas);
|
||||
} else if (drawCount) {
|
||||
if (dialogMuted) {
|
||||
setDrawableBounds(countDrawableGrey, countLeft - AndroidUtilities.dp(5.5f), countTop, countWidth + AndroidUtilities.dp(11), countDrawable.getIntrinsicHeight());
|
||||
countDrawableGrey.draw(canvas);
|
||||
} else {
|
||||
SharedPreferences themePrefs = ApplicationLoader.applicationContext.getSharedPreferences(AndroidUtilities.THEME_PREFS, AndroidUtilities.THEME_PREFS_MODE);
|
||||
int size = themePrefs.getInt("chatsCountSize", 13);
|
||||
size = size > 13 ? (size - 13) / 2 : 0;
|
||||
//setDrawableBounds(countDrawable, countLeft - AndroidUtilities.dp(5.5f), countTop, countWidth + AndroidUtilities.dp(11), countDrawable.getIntrinsicHeight());
|
||||
setDrawableBounds(countDrawable, countLeft - AndroidUtilities.dp(5.5f), countTop + AndroidUtilities.dp(size), countWidth + AndroidUtilities.dp(11), countDrawable.getIntrinsicHeight());
|
||||
countDrawable.draw(canvas);
|
||||
}
|
||||
canvas.save();
|
||||
canvas.translate(countLeft, countTop + AndroidUtilities.dp(4));
|
||||
countLayout.draw(canvas);
|
||||
|
@ -1,9 +1,9 @@
|
||||
/*
|
||||
* This is the source code of Telegram for Android v. 1.7.x.
|
||||
* This is the source code of Telegram for Android v. 3.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.
|
||||
* Copyright Nikolai Kudashov, 2013-2015.
|
||||
*/
|
||||
|
||||
package org.telegram.ui.Cells;
|
||||
|
@ -1,9 +1,9 @@
|
||||
/*
|
||||
* This is the source code of Telegram for Android v. 1.7.x.
|
||||
* This is the source code of Telegram for Android v. 3.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.
|
||||
* Copyright Nikolai Kudashov, 2013-2015.
|
||||
*/
|
||||
|
||||
package org.telegram.ui.Cells;
|
||||
@ -17,6 +17,7 @@ import android.widget.FrameLayout;
|
||||
import android.widget.TextView;
|
||||
|
||||
import org.telegram.messenger.AndroidUtilities;
|
||||
import org.telegram.messenger.FileLog;
|
||||
import org.telegram.ui.Components.LayoutHelper;
|
||||
|
||||
public class DrawerActionCell extends FrameLayout {
|
||||
@ -36,7 +37,6 @@ public class DrawerActionCell extends FrameLayout {
|
||||
textView.setGravity(Gravity.LEFT | Gravity.CENTER_VERTICAL);
|
||||
textView.setCompoundDrawablePadding(AndroidUtilities.dp(34));
|
||||
addView(textView, LayoutHelper.createFrame(LayoutHelper.MATCH_PARENT, LayoutHelper.MATCH_PARENT, Gravity.LEFT | Gravity.TOP, 14, 0, 16, 0));
|
||||
//updateTheme();
|
||||
}
|
||||
|
||||
@Override
|
||||
@ -49,9 +49,14 @@ public class DrawerActionCell extends FrameLayout {
|
||||
textView.setText(text);
|
||||
//textView.setCompoundDrawablesWithIntrinsicBounds(resId, 0, 0, 0);
|
||||
int color = AndroidUtilities.getIntDef("drawerIconColor", 0xff737373);
|
||||
try{
|
||||
Drawable d = getResources().getDrawable(resId);
|
||||
d.setColorFilter(color, PorterDuff.Mode.SRC_IN);
|
||||
textView.setCompoundDrawablesWithIntrinsicBounds(d, null, null, null);
|
||||
} catch (Exception e) {
|
||||
textView.setCompoundDrawablesWithIntrinsicBounds(resId, 0, 0, 0);
|
||||
FileLog.e("tmessages", e);
|
||||
}
|
||||
}
|
||||
|
||||
public void setTextAndIcon(String text, Drawable drawable) {
|
||||
|
@ -1,9 +1,9 @@
|
||||
/*
|
||||
* This is the source code of Telegram for Android v. 1.7.x.
|
||||
* This is the source code of Telegram for Android v. 3.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.
|
||||
* Copyright Nikolai Kudashov, 2013-2015.
|
||||
*/
|
||||
|
||||
package org.telegram.ui.Cells;
|
||||
@ -260,7 +260,9 @@ public class DrawerProfileCell extends FrameLayout implements PhotoViewer.PhotoV
|
||||
public void setPhotoChecked(int index) { }
|
||||
|
||||
@Override
|
||||
public void cancelButtonPressed() { }
|
||||
public boolean cancelButtonPressed() {
|
||||
return true;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void sendButtonPressed(int index) { }
|
||||
|
@ -1,9 +1,9 @@
|
||||
/*
|
||||
* This is the source code of Telegram for Android v. 1.7.x.
|
||||
* This is the source code of Telegram for Android v. 3.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.
|
||||
* Copyright Nikolai Kudashov, 2013-2015.
|
||||
*/
|
||||
|
||||
package org.telegram.ui.Cells;
|
||||
|
@ -1,9 +1,9 @@
|
||||
/*
|
||||
* This is the source code of Telegram for Android v. 1.7.x.
|
||||
* This is the source code of Telegram for Android v. 3.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.
|
||||
* Copyright Nikolai Kudashov, 2013-2015.
|
||||
*/
|
||||
|
||||
package org.telegram.ui.Cells;
|
||||
|
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* This is the source code of Telegram for Android v. 2.x
|
||||
* This is the source code of Telegram for Android v. 3.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).
|
||||
*
|
||||
|
@ -1,9 +1,9 @@
|
||||
/*
|
||||
* This is the source code of Telegram for Android v. 1.7.x.
|
||||
* This is the source code of Telegram for Android v. 3.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.
|
||||
* Copyright Nikolai Kudashov, 2013-2015.
|
||||
*/
|
||||
|
||||
package org.telegram.ui.Cells;
|
||||
|
@ -1,9 +1,9 @@
|
||||
/*
|
||||
* This is the source code of Telegram for Android v. 1.7.x.
|
||||
* This is the source code of Telegram for Android v. 3.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.
|
||||
* Copyright Nikolai Kudashov, 2013-2015.
|
||||
*/
|
||||
|
||||
package org.telegram.ui.Cells;
|
||||
|
@ -1,9 +1,9 @@
|
||||
/*
|
||||
* This is the source code of Telegram for Android v. 1.7.x.
|
||||
* This is the source code of Telegram for Android v. 3.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.
|
||||
* Copyright Nikolai Kudashov, 2013-2015.
|
||||
*/
|
||||
|
||||
package org.telegram.ui.Cells;
|
||||
|
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* This is the source code of Telegram for Android v. 2.x
|
||||
* This is the source code of Telegram for Android v. 3.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).
|
||||
*
|
||||
|
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* This is the source code of Telegram for Android v. 2.x
|
||||
* This is the source code of Telegram for Android v. 3.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).
|
||||
*
|
||||
|
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* This is the source code of Telegram for Android v. 2.x
|
||||
* This is the source code of Telegram for Android v. 3.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).
|
||||
*
|
||||
|
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* This is the source code of Telegram for Android v. 2.x
|
||||
* This is the source code of Telegram for Android v. 3.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).
|
||||
*
|
||||
|
@ -3,7 +3,7 @@
|
||||
* 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.
|
||||
* Copyright Nikolai Kudashov, 2013-2015.
|
||||
*/
|
||||
|
||||
package org.telegram.ui.Cells;
|
||||
|
@ -3,7 +3,7 @@
|
||||
* 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.
|
||||
* Copyright Nikolai Kudashov, 2013-2015.
|
||||
*/
|
||||
|
||||
package org.telegram.ui.Cells;
|
||||
|
@ -3,7 +3,7 @@
|
||||
* 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.
|
||||
* Copyright Nikolai Kudashov, 2013-2015.
|
||||
*/
|
||||
|
||||
package org.telegram.ui.Cells;
|
||||
@ -13,6 +13,10 @@ import android.view.Gravity;
|
||||
import android.widget.FrameLayout;
|
||||
|
||||
import org.telegram.messenger.AndroidUtilities;
|
||||
import org.telegram.messenger.AnimationCompat.AnimatorListenerAdapterProxy;
|
||||
import org.telegram.messenger.AnimationCompat.AnimatorSetProxy;
|
||||
import org.telegram.messenger.AnimationCompat.ObjectAnimatorProxy;
|
||||
import org.telegram.messenger.AnimationCompat.ViewProxy;
|
||||
import org.telegram.messenger.R;
|
||||
import org.telegram.ui.Components.BackupImageView;
|
||||
import org.telegram.ui.Components.CheckBox;
|
||||
@ -23,6 +27,7 @@ public class PhotoPickerPhotoCell extends FrameLayout {
|
||||
public BackupImageView photoImage;
|
||||
public FrameLayout checkFrame;
|
||||
public CheckBox checkBox;
|
||||
private AnimatorSetProxy animator;
|
||||
public int itemWidth;
|
||||
|
||||
public PhotoPickerPhotoCell(Context context) {
|
||||
@ -39,11 +44,44 @@ public class PhotoPickerPhotoCell extends FrameLayout {
|
||||
checkBox.setCheckOffset(AndroidUtilities.dp(1));
|
||||
checkBox.setDrawBackground(true);
|
||||
checkBox.setColor(0xff3ccaef);
|
||||
addView(checkBox, LayoutHelper.createFrame(30, 30, Gravity.RIGHT | Gravity.TOP, 0, 6, 6, 0));
|
||||
addView(checkBox, LayoutHelper.createFrame(30, 30, Gravity.RIGHT | Gravity.TOP, 0, 4, 4, 0));
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
|
||||
super.onMeasure(MeasureSpec.makeMeasureSpec(itemWidth, MeasureSpec.EXACTLY), MeasureSpec.makeMeasureSpec(itemWidth, MeasureSpec.EXACTLY));
|
||||
}
|
||||
|
||||
public void setChecked(final boolean checked, boolean animated) {
|
||||
checkBox.setChecked(checked, animated);
|
||||
if (animator != null) {
|
||||
animator.cancel();
|
||||
animator = null;
|
||||
}
|
||||
if (animated) {
|
||||
if (checked) {
|
||||
setBackgroundColor(0xff0A0A0A);
|
||||
}
|
||||
animator = new AnimatorSetProxy();
|
||||
animator.playTogether(ObjectAnimatorProxy.ofFloat(photoImage, "scaleX", checked ? 0.85f : 1.0f),
|
||||
ObjectAnimatorProxy.ofFloat(photoImage, "scaleY", checked ? 0.85f : 1.0f));
|
||||
animator.setDuration(200);
|
||||
animator.addListener(new AnimatorListenerAdapterProxy() {
|
||||
@Override
|
||||
public void onAnimationEnd(Object animation) {
|
||||
if (animator.equals(animation)) {
|
||||
animator = null;
|
||||
if (!checked) {
|
||||
setBackgroundColor(0);
|
||||
}
|
||||
}
|
||||
}
|
||||
});
|
||||
animator.start();
|
||||
} else {
|
||||
setBackgroundColor(checked ? 0xff0A0A0A : 0);
|
||||
ViewProxy.setScaleX(photoImage, checked ? 0.85f : 1.0f);
|
||||
ViewProxy.setScaleY(photoImage, checked ? 0.85f : 1.0f);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -3,7 +3,7 @@
|
||||
* 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.
|
||||
* Copyright Nikolai Kudashov, 2013-2015.
|
||||
*/
|
||||
|
||||
package org.telegram.ui.Cells;
|
||||
|
@ -1,9 +1,9 @@
|
||||
/*
|
||||
* This is the source code of Telegram for Android v. 1.7.x.
|
||||
* This is the source code of Telegram for Android v. 3.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.
|
||||
* Copyright Nikolai Kudashov, 2013-2015.
|
||||
*/
|
||||
|
||||
package org.telegram.ui.Cells;
|
||||
@ -24,6 +24,7 @@ import android.view.MotionEvent;
|
||||
import org.telegram.PhoneFormat.PhoneFormat;
|
||||
import org.telegram.messenger.AndroidUtilities;
|
||||
import org.telegram.messenger.ApplicationLoader;
|
||||
import org.telegram.messenger.ChatObject;
|
||||
import org.telegram.messenger.ImageReceiver;
|
||||
import org.telegram.messenger.LocaleController;
|
||||
import org.telegram.messenger.MessagesController;
|
||||
@ -46,6 +47,7 @@ public class ProfileSearchCell extends BaseCell {
|
||||
private static Drawable broadcastDrawable;
|
||||
private static Drawable groupDrawable;
|
||||
private static Drawable countDrawable;
|
||||
private static Drawable checkDrawable;
|
||||
private static Paint linePaint;
|
||||
|
||||
private CharSequence currentName;
|
||||
@ -81,6 +83,8 @@ public class ProfileSearchCell extends BaseCell {
|
||||
private int countWidth;
|
||||
private StaticLayout countLayout;
|
||||
|
||||
private boolean drawCheck;
|
||||
|
||||
private int onlineLeft;
|
||||
private StaticLayout onlineLayout;
|
||||
|
||||
@ -120,7 +124,7 @@ public class ProfileSearchCell extends BaseCell {
|
||||
lockDrawable = getResources().getDrawable(R.drawable.list_secret);
|
||||
groupDrawable = getResources().getDrawable(R.drawable.list_group);
|
||||
countDrawable = getResources().getDrawable(R.drawable.dialogs_badge);
|
||||
|
||||
checkDrawable = getResources().getDrawable(R.drawable.check_list);
|
||||
updateTheme();
|
||||
}
|
||||
|
||||
@ -132,11 +136,9 @@ public class ProfileSearchCell extends BaseCell {
|
||||
private void updateTheme(){
|
||||
SharedPreferences themePrefs = ApplicationLoader.applicationContext.getSharedPreferences(AndroidUtilities.THEME_PREFS, AndroidUtilities.THEME_PREFS_MODE);
|
||||
int tColor = themePrefs.getInt("themeColor", AndroidUtilities.defColor);
|
||||
|
||||
countPaint.setTextSize(AndroidUtilities.dp(themePrefs.getInt("chatsCountSize", 13)));
|
||||
countPaint.setColor(themePrefs.getInt("chatsCountColor", 0xffffffff));
|
||||
countDrawable.setColorFilter(themePrefs.getInt("chatsCountBGColor", tColor), PorterDuff.Mode.SRC_IN);
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
@ -199,6 +201,7 @@ public class ProfileSearchCell extends BaseCell {
|
||||
drawNameBroadcast = false;
|
||||
drawNameLock = false;
|
||||
drawNameGroup = false;
|
||||
drawCheck = false;
|
||||
|
||||
if (encryptedChat != null) {
|
||||
drawNameLock = true;
|
||||
@ -219,9 +222,15 @@ public class ProfileSearchCell extends BaseCell {
|
||||
nameLockTop = AndroidUtilities.dp(28.5f);
|
||||
} else {
|
||||
dialog_id = -chat.id;
|
||||
if (ChatObject.isChannel(chat)) {
|
||||
drawNameBroadcast = true;
|
||||
nameLockTop = AndroidUtilities.dp(28.5f);
|
||||
} else {
|
||||
drawNameGroup = true;
|
||||
nameLockTop = AndroidUtilities.dp(30);
|
||||
}
|
||||
}
|
||||
drawCheck = (chat.flags & TLRPC.CHAT_FLAG_IS_VERIFIED) != 0;
|
||||
if (!LocaleController.isRTL) {
|
||||
nameLockLeft = AndroidUtilities.dp(AndroidUtilities.leftBaseline);
|
||||
nameLeft = AndroidUtilities.dp(AndroidUtilities.leftBaseline + 4) + (drawNameGroup ? groupDrawable.getIntrinsicWidth() : broadcastDrawable.getIntrinsicWidth());
|
||||
@ -504,6 +513,14 @@ public class ProfileSearchCell extends BaseCell {
|
||||
canvas.translate(nameLeft, nameTop);
|
||||
nameLayout.draw(canvas);
|
||||
canvas.restore();
|
||||
if (drawCheck) {
|
||||
if (LocaleController.isRTL) {
|
||||
setDrawableBounds(checkDrawable, nameLeft - AndroidUtilities.dp(4) - checkDrawable.getIntrinsicWidth(), nameLockTop);
|
||||
} else {
|
||||
setDrawableBounds(checkDrawable, nameLeft + (int) nameLayout.getLineWidth(0) + AndroidUtilities.dp(4), nameLockTop);
|
||||
}
|
||||
checkDrawable.draw(canvas);
|
||||
}
|
||||
}
|
||||
|
||||
if (onlineLayout != null) {
|
||||
|
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* This is the source code of Telegram for Android v. 2.x
|
||||
* This is the source code of Telegram for Android v. 3.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).
|
||||
*
|
||||
|
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* This is the source code of Telegram for Android v. 2.x
|
||||
* This is the source code of Telegram for Android v. 3.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).
|
||||
*
|
||||
|
@ -1,9 +1,9 @@
|
||||
/*
|
||||
* This is the source code of Telegram for Android v. 1.7.x.
|
||||
* This is the source code of Telegram for Android v. 3.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.
|
||||
* Copyright Nikolai Kudashov, 2013-2015.
|
||||
*/
|
||||
|
||||
package org.telegram.ui.Cells;
|
||||
|
@ -1,9 +1,9 @@
|
||||
/*
|
||||
* This is the source code of Telegram for Android v. 1.7.x.
|
||||
* This is the source code of Telegram for Android v. 3.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.
|
||||
* Copyright Nikolai Kudashov, 2013-2015.
|
||||
*/
|
||||
|
||||
package org.telegram.ui.Cells;
|
||||
@ -33,7 +33,7 @@ public class ShadowSectionCell extends View {
|
||||
|
||||
@Override
|
||||
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
|
||||
super.onMeasure(widthMeasureSpec, MeasureSpec.makeMeasureSpec(AndroidUtilities.dp(12), MeasureSpec.EXACTLY));
|
||||
super.onMeasure(MeasureSpec.makeMeasureSpec(MeasureSpec.getSize(widthMeasureSpec), MeasureSpec.EXACTLY), MeasureSpec.makeMeasureSpec(AndroidUtilities.dp(12), MeasureSpec.EXACTLY));
|
||||
if(bTheme)setTheme();
|
||||
}
|
||||
|
||||
|
@ -3,7 +3,7 @@
|
||||
* 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.
|
||||
* Copyright Nikolai Kudashov, 2013-2015.
|
||||
*/
|
||||
|
||||
package org.telegram.ui.Cells;
|
||||
@ -204,8 +204,7 @@ public class SharedDocumentCell extends FrameLayout implements MediaController.F
|
||||
loaded = false;
|
||||
loading = false;
|
||||
|
||||
//if (document != null && document.messageOwner.media != null) {
|
||||
if (document != null && document.messageOwner.media != null && document.messageOwner.media.document != null) { //To try to fix NullPointerException: Attempt to read from field 'java.lang.String org.telegram.tgnet.TLRPC$Document.mime_type' on a null object reference
|
||||
if (document != null && document.messageOwner.media != null && document.messageOwner.media.document != null) {
|
||||
int idx;
|
||||
String name = FileLoader.getDocumentFileName(document.messageOwner.media.document);
|
||||
placeholderImabeView.setVisibility(VISIBLE);
|
||||
|
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* This is the source code of Telegram for Android v. 2.x
|
||||
* This is the source code of Telegram for Android v. 3.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).
|
||||
*
|
||||
|
@ -3,7 +3,7 @@
|
||||
* 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.
|
||||
* Copyright Nikolai Kudashov, 2013-2015.
|
||||
*/
|
||||
|
||||
package org.telegram.ui.Cells;
|
||||
@ -19,6 +19,10 @@ import android.widget.LinearLayout;
|
||||
import android.widget.TextView;
|
||||
|
||||
import org.telegram.messenger.AndroidUtilities;
|
||||
import org.telegram.messenger.AnimationCompat.AnimatorListenerAdapterProxy;
|
||||
import org.telegram.messenger.AnimationCompat.AnimatorSetProxy;
|
||||
import org.telegram.messenger.AnimationCompat.ObjectAnimatorProxy;
|
||||
import org.telegram.messenger.AnimationCompat.ViewProxy;
|
||||
import org.telegram.messenger.MessageObject;
|
||||
import org.telegram.messenger.ApplicationLoader;
|
||||
import org.telegram.messenger.FileLoader;
|
||||
@ -51,21 +55,26 @@ public class SharedPhotoVideoCell extends FrameLayoutFixed {
|
||||
private LinearLayout videoInfoContainer;
|
||||
private View selector;
|
||||
private CheckBox checkBox;
|
||||
private FrameLayoutFixed container;
|
||||
private AnimatorSetProxy animator;
|
||||
|
||||
public PhotoVideoView(Context context) {
|
||||
super(context);
|
||||
|
||||
container = new FrameLayoutFixed(context);
|
||||
addView(container, LayoutHelper.createFrame(LayoutHelper.MATCH_PARENT, LayoutHelper.MATCH_PARENT));
|
||||
|
||||
imageView = new BackupImageView(context);
|
||||
imageView.getImageReceiver().setNeedsQualityThumb(true);
|
||||
imageView.getImageReceiver().setShouldGenerateQualityThumb(true);
|
||||
addView(imageView, LayoutHelper.createFrame(LayoutHelper.MATCH_PARENT, LayoutHelper.MATCH_PARENT));
|
||||
container.addView(imageView, LayoutHelper.createFrame(LayoutHelper.MATCH_PARENT, LayoutHelper.MATCH_PARENT));
|
||||
|
||||
videoInfoContainer = new LinearLayout(context);
|
||||
videoInfoContainer.setOrientation(LinearLayout.HORIZONTAL);
|
||||
videoInfoContainer.setBackgroundResource(R.drawable.phototime);
|
||||
videoInfoContainer.setPadding(AndroidUtilities.dp(3), 0, AndroidUtilities.dp(3), 0);
|
||||
videoInfoContainer.setGravity(Gravity.CENTER_VERTICAL);
|
||||
addView(videoInfoContainer, LayoutHelper.createFrame(LayoutHelper.MATCH_PARENT, 16, Gravity.BOTTOM | Gravity.LEFT));
|
||||
container.addView(videoInfoContainer, LayoutHelper.createFrame(LayoutHelper.MATCH_PARENT, 16, Gravity.BOTTOM | Gravity.LEFT));
|
||||
|
||||
ImageView imageView1 = new ImageView(context);
|
||||
imageView1.setImageResource(R.drawable.ic_video);
|
||||
@ -83,7 +92,7 @@ public class SharedPhotoVideoCell extends FrameLayoutFixed {
|
||||
|
||||
checkBox = new CheckBox(context, R.drawable.round_check2);
|
||||
checkBox.setVisibility(INVISIBLE);
|
||||
addView(checkBox, LayoutHelper.createFrame(22, 22, Gravity.RIGHT | Gravity.TOP, 0, 6, 6, 0));
|
||||
addView(checkBox, LayoutHelper.createFrame(22, 22, Gravity.RIGHT | Gravity.TOP, 0, 2, 2, 0));
|
||||
}
|
||||
|
||||
@Override
|
||||
@ -93,6 +102,51 @@ public class SharedPhotoVideoCell extends FrameLayoutFixed {
|
||||
}
|
||||
return super.onTouchEvent(event);
|
||||
}
|
||||
|
||||
public void setChecked(final boolean checked, boolean animated) {
|
||||
if (checkBox.getVisibility() != VISIBLE) {
|
||||
checkBox.setVisibility(VISIBLE);
|
||||
}
|
||||
checkBox.setChecked(checked, animated);
|
||||
if (animator != null) {
|
||||
animator.cancel();
|
||||
animator = null;
|
||||
}
|
||||
if (animated) {
|
||||
if (checked) {
|
||||
setBackgroundColor(0xfff5f5f5);
|
||||
}
|
||||
animator = new AnimatorSetProxy();
|
||||
animator.playTogether(ObjectAnimatorProxy.ofFloat(container, "scaleX", checked ? 0.85f : 1.0f),
|
||||
ObjectAnimatorProxy.ofFloat(container, "scaleY", checked ? 0.85f : 1.0f));
|
||||
animator.setDuration(200);
|
||||
animator.addListener(new AnimatorListenerAdapterProxy() {
|
||||
@Override
|
||||
public void onAnimationEnd(Object animation) {
|
||||
if (animator.equals(animation)) {
|
||||
animator = null;
|
||||
if (!checked) {
|
||||
setBackgroundColor(0);
|
||||
}
|
||||
}
|
||||
}
|
||||
});
|
||||
animator.start();
|
||||
} else {
|
||||
setBackgroundColor(checked ? 0xfff5f5f5 : 0);
|
||||
ViewProxy.setScaleX(container, checked ? 0.85f : 1.0f);
|
||||
ViewProxy.setScaleY(container, checked ? 0.85f : 1.0f);
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void clearAnimation() {
|
||||
super.clearAnimation();
|
||||
if (animator != null) {
|
||||
animator.cancel();
|
||||
animator = null;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public SharedPhotoVideoCell(Context context) {
|
||||
@ -134,6 +188,7 @@ public class SharedPhotoVideoCell extends FrameLayoutFixed {
|
||||
|
||||
public void setItemsCount(int count) {
|
||||
for (int a = 0; a < photoVideoViews.length; a++) {
|
||||
photoVideoViews[a].clearAnimation();
|
||||
photoVideoViews[a].setVisibility(a < count ? VISIBLE : INVISIBLE);
|
||||
}
|
||||
itemsCount = count;
|
||||
@ -158,10 +213,7 @@ public class SharedPhotoVideoCell extends FrameLayoutFixed {
|
||||
}
|
||||
|
||||
public void setChecked(int a, boolean checked, boolean animated) {
|
||||
if (photoVideoViews[a].checkBox.getVisibility() != VISIBLE) {
|
||||
photoVideoViews[a].checkBox.setVisibility(VISIBLE);
|
||||
}
|
||||
photoVideoViews[a].checkBox.setChecked(checked, animated);
|
||||
photoVideoViews[a].setChecked(checked, animated);
|
||||
}
|
||||
|
||||
public void setItem(int a, int index, MessageObject messageObject) {
|
||||
@ -195,6 +247,7 @@ public class SharedPhotoVideoCell extends FrameLayoutFixed {
|
||||
photoVideoView.imageView.setImageResource(R.drawable.photo_placeholder_in);
|
||||
}
|
||||
} else {
|
||||
photoVideoViews[a].clearAnimation();
|
||||
photoVideoViews[a].setVisibility(INVISIBLE);
|
||||
messageObjects[a] = null;
|
||||
}
|
||||
|
@ -3,7 +3,7 @@
|
||||
* 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.
|
||||
* Copyright Nikolai Kudashov, 2013-2015.
|
||||
*/
|
||||
|
||||
package org.telegram.ui.Cells;
|
||||
@ -45,7 +45,7 @@ public class StickerCell extends FrameLayoutFixed {
|
||||
}
|
||||
|
||||
public void setSticker(TLRPC.Document document, int side) {
|
||||
if (document != null) {
|
||||
if (document != null && document.thumb != null) {
|
||||
imageView.setImage(document.thumb.location, null, "webp", null);
|
||||
}
|
||||
if (side == -1) {
|
||||
|
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* This is the source code of Telegram for Android v. 2.x
|
||||
* This is the source code of Telegram for Android v. 3.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).
|
||||
*
|
||||
@ -57,7 +57,9 @@ public class StickerEmojiCell extends FrameLayout {
|
||||
public void setSticker(TLRPC.Document document, boolean showEmoji) {
|
||||
if (document != null) {
|
||||
sticker = document;
|
||||
if (document.thumb != null) {
|
||||
imageView.setImage(document.thumb.location, null, "webp", null);
|
||||
}
|
||||
|
||||
if (showEmoji) {
|
||||
boolean set = false;
|
||||
|