Update to 3.6.1

This commit is contained in:
DrKLO 2016-03-06 02:49:31 +01:00
parent 2114024ab1
commit 6154c891bd
166 changed files with 10224 additions and 4470 deletions

View File

@ -83,7 +83,7 @@ android {
defaultConfig {
minSdkVersion 9
targetSdkVersion 23
versionCode 719
versionName "3.4.2"
versionCode 755
versionName "3.6.1"
}
}

View File

@ -235,7 +235,7 @@ include $(BUILD_STATIC_LIBRARY)
include $(CLEAR_VARS)
LOCAL_PRELINK_MODULE := false
LOCAL_MODULE := tmessages.17
LOCAL_MODULE := tmessages.19
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 -D__STDC_CONSTANT_MACROS

View File

@ -5,6 +5,7 @@
#include <stdlib.h>
#include <time.h>
#include <opusfile.h>
#include <math.h>
#include "utils.h"
typedef struct {
@ -663,6 +664,156 @@ JNIEXPORT int Java_org_telegram_messenger_MediaController_isOpusFile(JNIEnv *env
result = error == OPUS_OK;
}
if (pathStr != 0) {
(*env)->ReleaseStringUTFChars(env, path, pathStr);
}
return result;
}
static inline void set_bits(uint8_t *bytes, int32_t bitOffset, int32_t numBits, int32_t value) {
numBits = (unsigned int) (2 << (numBits - 1)) - 1;
bytes += bitOffset / 8;
bitOffset %= 8;
*((int32_t *) bytes) |= (value << bitOffset);
}
JNIEXPORT jbyteArray Java_org_telegram_messenger_MediaController_getWaveform2(JNIEnv *env, jclass class, jshortArray array, jint length) {
jshort *sampleBuffer = (*env)->GetShortArrayElements(env, array, 0);
jbyteArray result = 0;
int32_t resultSamples = 100;
uint16_t *samples = malloc(100 * 2);
uint64_t sampleIndex = 0;
uint16_t peakSample = 0;
int32_t sampleRate = (int32_t) max(1, length / resultSamples);
int index = 0;
for (int i = 0; i < length; i++) {
uint16_t sample = (uint16_t) abs(sampleBuffer[i]);
if (sample > peakSample) {
peakSample = sample;
}
if (sampleIndex++ % sampleRate == 0) {
if (index < resultSamples) {
samples[index++] = peakSample;
}
peakSample = 0;
}
}
int64_t sumSamples = 0;
for (int i = 0; i < resultSamples; i++) {
sumSamples += samples[i];
}
uint16_t peak = (uint16_t) (sumSamples * 1.8f / resultSamples);
if (peak < 2500) {
peak = 2500;
}
for (int i = 0; i < resultSamples; i++) {
uint16_t sample = (uint16_t) ((int64_t) samples[i]);
if (sample > peak) {
samples[i] = peak;
}
}
(*env)->ReleaseShortArrayElements(env, array, sampleBuffer, 0);
int bitstreamLength = (resultSamples * 5) / 8 + (((resultSamples * 5) % 8) == 0 ? 0 : 1);
result = (*env)->NewByteArray(env, bitstreamLength);
jbyte *bytes = (*env)->GetByteArrayElements(env, result, NULL);
for (int i = 0; i < resultSamples; i++) {
int32_t value = min(31, abs((int32_t) samples[i]) * 31 / peak);
set_bits(bytes, i * 5, 5, value & 31);
}
(*env)->ReleaseByteArrayElements(env, result, bytes, JNI_COMMIT);
free(samples);
return result;
}
int16_t *sampleBuffer = NULL;
JNIEXPORT jbyteArray Java_org_telegram_messenger_MediaController_getWaveform(JNIEnv *env, jclass class, jstring path) {
const char *pathStr = (*env)->GetStringUTFChars(env, path, 0);
jbyteArray result = 0;
int error = OPUS_OK;
OggOpusFile *opusFile = op_open_file(pathStr, &error);
if (opusFile != NULL && error == OPUS_OK) {
int64_t totalSamples = op_pcm_total(opusFile, -1);
int32_t resultSamples = 100;
int32_t sampleRate = (int32_t) max(1, totalSamples / resultSamples);
uint16_t *samples = malloc(100 * 2);
int bufferSize = 1024 * 128;
if (sampleBuffer == NULL) {
sampleBuffer = malloc(bufferSize);
}
uint64_t sampleIndex = 0;
uint16_t peakSample = 0;
int index = 0;
while (1) {
int readSamples = op_read(opusFile, sampleBuffer, bufferSize / 2, NULL);
for (int i = 0; i < readSamples; i++) {
uint16_t sample = (uint16_t) abs(sampleBuffer[i]);
if (sample > peakSample) {
peakSample = sample;
}
if (sampleIndex++ % sampleRate == 0) {
if (index < resultSamples) {
samples[index++] = peakSample;
}
peakSample = 0;
}
}
if (readSamples == 0) {
break;
}
}
int64_t sumSamples = 0;
for (int i = 0; i < resultSamples; i++) {
sumSamples += samples[i];
}
uint16_t peak = (uint16_t) (sumSamples * 1.8f / resultSamples);
if (peak < 2500) {
peak = 2500;
}
for (int i = 0; i < resultSamples; i++) {
uint16_t sample = (uint16_t) ((int64_t) samples[i]);
if (sample > peak) {
samples[i] = peak;
}
}
//free(sampleBuffer);
op_free(opusFile);
int bitstreamLength = (resultSamples * 5) / 8 + (((resultSamples * 5) % 8) == 0 ? 0 : 1);
result = (*env)->NewByteArray(env, bitstreamLength);
jbyte *bytes = (*env)->GetByteArrayElements(env, result, NULL);
for (int i = 0; i < resultSamples; i++) {
int32_t value = min(31, abs((int32_t) samples[i]) * 31 / peak);
set_bits(bytes, i * 5, 5, value & 31);
}
(*env)->ReleaseByteArrayElements(env, result, bytes, JNI_COMMIT);
free(samples);
}
if (pathStr != 0) {
(*env)->ReleaseStringUTFChars(env, path, pathStr);
}

View File

@ -59,3 +59,16 @@ JNIEXPORT void Java_org_telegram_messenger_Utilities_aesIgeEncryption(JNIEnv *en
(*env)->ReleaseByteArrayElements(env, key, keyBuff, JNI_ABORT);
(*env)->ReleaseByteArrayElements(env, iv, ivBuff, 0);
}
JNIEXPORT jstring Java_org_telegram_messenger_Utilities_readlink(JNIEnv *env, jclass class, jstring path) {
static char buf[1000];
char *fileName = (*env)->GetStringUTFChars(env, path, NULL);
int result = readlink(fileName, buf, 999);
jstring value = 0;
if (result != -1) {
buf[result] = '\0';
value = (*env)->NewStringUTF(env, buf);
}
(*env)->ReleaseStringUTFChars(env, path, fileName);
return value;
}

View File

@ -6,6 +6,8 @@
* Copyright Nikolai Kudashov, 2015.
*/
#include <openssl/rand.h>
#include <stdlib.h>
#include "Connection.h"
#include "ConnectionsManager.h"
#include "BuffersStorage.h"
@ -55,6 +57,8 @@ void Connection::suspendConnection() {
}
void Connection::onReceivedData(NativeByteBuffer *buffer) {
//AES_ctr128_encrypt(buffer->bytes(), buffer->bytes(), buffer->limit(), &decryptKey, decryptIv, decryptCount, &decryptNum);
failedConnectionCount = 0;
NativeByteBuffer *parseLaterBuffer = nullptr;
@ -305,12 +309,47 @@ void Connection::sendData(NativeByteBuffer *buff, bool reportAck) {
bufferLen += 4;
}
if (!firstPacketSent) {
bufferLen++;
bufferLen += 64;
}
NativeByteBuffer *buffer = BuffersStorage::getInstance().getFreeBuffer(bufferLen);
uint8_t *bytes = buffer->bytes();
if (!firstPacketSent) {
buffer->writeByte(0xef);
buffer->position(64);
static uint8_t temp[64];
while (true) {
RAND_bytes(bytes, 64);
uint32_t val = (bytes[3] << 24) | (bytes[2] << 16) | (bytes[1] << 8) | (bytes[0]);
uint32_t val2 = (bytes[7] << 24) | (bytes[6] << 16) | (bytes[5] << 8) | (bytes[4]);
if (bytes[0] != 0xef && val != 0x44414548 && val != 0x54534f50 && val != 0x20544547 && val != 0x4954504f && val != 0xeeeeeeee && val2 != 0x00000000) {
//bytes[56] = bytes[57] = bytes[58] = bytes[59] = 0xef;
break;
}
}
/*for (int a = 0; a < 48; a++) {
temp[a] = bytes[55 - a];
}
encryptNum = decryptNum = 0;
memset(encryptCount, 0, 16);
memset(decryptCount, 0, 16);
if (AES_set_encrypt_key(bytes + 8, 256, &encryptKey) < 0) {
DEBUG_E("unable to set encryptKey");
exit(1);
}
memcpy(encryptIv, bytes + 40, 16);
if (AES_set_encrypt_key(temp, 256, &decryptKey) < 0) {
DEBUG_E("unable to set decryptKey");
exit(1);
}
memcpy(decryptIv, temp + 32, 16);
AES_ctr128_encrypt(bytes, temp, 64, &encryptKey, encryptIv, encryptCount, &encryptNum);
memcpy(bytes + 56, temp + 56, 8);*/
firstPacketSent = true;
}
if (packetLength < 0x7f) {
@ -318,17 +357,22 @@ void Connection::sendData(NativeByteBuffer *buff, bool reportAck) {
packetLength |= (1 << 7);
}
buffer->writeByte((uint8_t) packetLength);
bytes += (buffer->limit() - 1);
//AES_ctr128_encrypt(bytes, bytes, 1, &encryptKey, encryptIv, encryptCount, &encryptNum);
} else {
packetLength = (packetLength << 8) + 0x7f;
if (reportAck) {
packetLength |= (1 << 7);
}
buffer->writeInt32(packetLength);
bytes += (buffer->limit() - 4);
//AES_ctr128_encrypt(bytes, bytes, 4, &encryptKey, encryptIv, encryptCount, &encryptNum);
}
buffer->rewind();
writeBuffer(buffer);
buff->rewind();
//AES_ctr128_encrypt(buff->bytes(), buff->bytes(), buff->limit(), &encryptKey, encryptIv, encryptCount, &encryptNum);
writeBuffer(buff);
}

View File

@ -12,6 +12,7 @@
#include <pthread.h>
#include <vector>
#include <string>
#include <openssl/aes.h>
#include "ConnectionSession.h"
#include "ConnectionSocket.h"
#include "Defines.h"
@ -67,6 +68,16 @@ private:
bool wasConnected = false;
uint32_t willRetryConnectCount = 5;
Timer *reconnectTimer;
AES_KEY encryptKey;
uint8_t encryptIv[16];
uint32_t encryptNum;
uint8_t encryptCount[16];
AES_KEY decryptKey;
uint8_t decryptIv[16];
uint32_t decryptNum;
uint8_t decryptCount[16];
friend class ConnectionsManager;
};

View File

@ -946,6 +946,7 @@ void TL_config::readParams(NativeByteBuffer *stream, bool &error) {
push_chat_period_ms = stream->readInt32(&error);
push_chat_limit = stream->readInt32(&error);
saved_gifs_limit = stream->readInt32(&error);
edit_time_limit = stream->readInt32(&error);
magic = stream->readUint32(&error);
if (magic != 0x1cb5c415) {
error = true;
@ -987,6 +988,7 @@ void TL_config::serializeToStream(NativeByteBuffer *stream) {
stream->writeInt32(push_chat_period_ms);
stream->writeInt32(push_chat_limit);
stream->writeInt32(saved_gifs_limit);
stream->writeInt32(edit_time_limit);
stream->writeInt32(0x1cb5c415);
count = (uint32_t) disabled_features.size();
stream->writeInt32(count);

View File

@ -657,7 +657,7 @@ public:
class TL_config : public TLObject {
public:
static const uint32_t constructor = 0x6bbc5f8;
static const uint32_t constructor = 0x317ceef4;
int32_t date;
int32_t expires;
@ -677,6 +677,7 @@ public:
int32_t push_chat_period_ms;
int32_t push_chat_limit;
int32_t saved_gifs_limit;
int32_t edit_time_limit;
std::vector<std::unique_ptr<TL_disabledFeature>> disabled_features;
static TL_config *TLdeserialize(NativeByteBuffer *stream, uint32_t constructor, bool &error);

View File

@ -129,18 +129,28 @@
android:windowSoftInputMode="adjustResize|stateHidden">
</activity>
<receiver android:name=".AutoMessageHeardReceiver">
<receiver
android:name=".AutoMessageHeardReceiver"
android:exported="false">
<intent-filter>
<action android:name="org.telegram.messenger.ACTION_MESSAGE_HEARD"/>
</intent-filter>
</receiver>
<receiver android:name=".AutoMessageReplyReceiver">
<receiver
android:name=".AutoMessageReplyReceiver"
android:exported="false">
<intent-filter>
<action android:name="org.telegram.messenger.ACTION_MESSAGE_REPLY"/>
</intent-filter>
</receiver>
<receiver android:name=".CallReceiver" >
<intent-filter>
<action android:name="android.intent.action.PHONE_STATE" />
</intent-filter>
</receiver>
<receiver android:name=".SmsListener">
<intent-filter>
<action android:name="android.provider.Telephony.SMS_RECEIVED" />

View File

@ -27,6 +27,8 @@ import android.graphics.drawable.Drawable;
import android.net.Uri;
import android.os.Build;
import android.os.Environment;
import android.os.Parcelable;
import android.provider.Browser;
import android.provider.DocumentsContract;
import android.provider.MediaStore;
import android.text.Spannable;
@ -409,6 +411,29 @@ public class AndroidUtilities {
}
}
public static void openUrl(Context context, String url) {
if (context == null || url == null) {
return;
}
openUrl(context, Uri.parse(url));
}
public static void openUrl(Context context, Uri uri) {
if (context == null || uri == null) {
return;
}
try {
Intent intent = new Intent(Intent.ACTION_VIEW, uri);
intent.putExtra("android.support.customtabs.extra.SESSION", (Parcelable) null);
intent.putExtra("android.support.customtabs.extra.TOOLBAR_COLOR", 0xff54759e);
intent.putExtra("android.support.customtabs.extra.TITLE_VISIBILITY", 1);
intent.putExtra(Browser.EXTRA_APPLICATION_ID, context.getPackageName());
context.startActivity(intent);
} catch (Exception e) {
FileLog.e("tmessages", e);
}
}
public static int getPhotoSize() {
if (photoSize == null) {
if (Build.VERSION.SDK_INT >= 16) {
@ -1057,4 +1082,11 @@ public class AndroidUtilities {
}
return true;
}
public static byte[] calcAuthKeyHash(byte[] auth_key) {
byte[] sha1 = Utilities.computeSHA1(auth_key);
byte[] key_hash = new byte[16];
System.arraycopy(sha1, 0, key_hash, 0, 16);
return key_hash;
}
}

View File

@ -325,6 +325,8 @@ public class ApplicationLoader extends Application {
FileLog.d("tmessages", "GCM Registration not found.");
Intent intent = new Intent(applicationContext, GcmRegistrationIntentService.class);
startService(intent);
} else {
FileLog.d("tmessages", "GCM regId = " + UserConfig.pushString);
}
} else {
FileLog.d("tmessages", "No valid Google Play Services APK found.");

View File

@ -3,14 +3,15 @@
* It is licensed under GNU GPL v. 2 or later.
* You should have received a copy of the license in this archive (see LICENSE).
*
* Copyright Nikolai Kudashov, 2013-2015.
* Copyright Nikolai Kudashov, 2013-2016.
*/
package org.telegram.messenger;
public class BuildVars {
public static boolean DEBUG_VERSION = false;
public static int BUILD_VERSION = 719;
public static int BUILD_VERSION = 753;
public static String BUILD_VERSION_STRING = "3.6";
public static int APP_ID = 0; //obtain your own APP_ID at https://core.telegram.org/api/obtaining_api_id
public static String APP_HASH = ""; //obtain your own APP_HASH at https://core.telegram.org/api/obtaining_api_id
public static String HOCKEY_APP_HASH = "your-hockeyapp-api-key-here";

View File

@ -0,0 +1,30 @@
/*
* 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-2016.
*/
package org.telegram.messenger;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
public class CallReceiver extends BroadcastReceiver {
@Override
public void onReceive(final Context context, Intent intent) {
/*TelephonyManager telephony = (TelephonyManager) context.getSystemService(Context.TELEPHONY_SERVICE);
telephony.listen(new PhoneStateListener() {
@Override
public void onCallStateChanged(int state, String incomingNumber) {
super.onCallStateChanged(state, incomingNumber);
if (state == 1 && incomingNumber != null && incomingNumber.length() > 0) {
NotificationCenter.getInstance().postNotificationName(NotificationCenter.didReceiveCall, incomingNumber);
}
}
}, PhoneStateListener.LISTEN_CALL_STATE);*/
}
}

View File

@ -48,6 +48,9 @@ public class ClearCacheService extends IntentService {
for (int b = 0; b < array.length; b++) {
File f = array[b];
if (f.isFile()) {
if (f.getName().equals(".nomedia")) {
continue;
}
if (Build.VERSION.SDK_INT >= 21) {
try {
StructStat stat = Os.stat(f.getPath());

View File

@ -56,7 +56,9 @@ public class ContactsController {
private int loadingDeleteInfo = 0;
private int deleteAccountTTL;
private int loadingLastSeenInfo = 0;
private int loadingGroupInfo = 0;
private ArrayList<TLRPC.PrivacyRule> privacyRules = null;
private ArrayList<TLRPC.PrivacyRule> groupPrivacyRules = null;
public static class Contact {
public int id;
@ -160,6 +162,7 @@ public class ContactsController {
loadingDeleteInfo = 0;
deleteAccountTTL = 0;
loadingLastSeenInfo = 0;
loadingGroupInfo = 0;
privacyRules = null;
}
@ -177,8 +180,8 @@ public class ContactsController {
ConnectionsManager.getInstance().sendRequest(req, new RequestDelegate() {
@Override
public void run(TLObject response, TLRPC.TL_error error) {
if (error == null) {
final TLRPC.TL_help_inviteText res = (TLRPC.TL_help_inviteText)response;
if (response != null) {
final TLRPC.TL_help_inviteText res = (TLRPC.TL_help_inviteText) response;
if (res.message.length() != 0) {
AndroidUtilities.runOnUIThread(new Runnable() {
@Override
@ -1859,6 +1862,30 @@ public class ContactsController {
}
});
}
if (loadingGroupInfo == 0) {
loadingGroupInfo = 1;
TLRPC.TL_account_getPrivacy req = new TLRPC.TL_account_getPrivacy();
req.key = new TLRPC.TL_inputPrivacyKeyChatInvite();
ConnectionsManager.getInstance().sendRequest(req, new RequestDelegate() {
@Override
public void run(final TLObject response, final TLRPC.TL_error error) {
AndroidUtilities.runOnUIThread(new Runnable() {
@Override
public void run() {
if (error == null) {
TLRPC.TL_account_privacyRules rules = (TLRPC.TL_account_privacyRules) response;
MessagesController.getInstance().putUsers(rules.users, false);
groupPrivacyRules = rules.rules;
loadingGroupInfo = 2;
} else {
loadingGroupInfo = 0;
}
NotificationCenter.getInstance().postNotificationName(NotificationCenter.privacyRulesUpdated);
}
});
}
});
}
NotificationCenter.getInstance().postNotificationName(NotificationCenter.privacyRulesUpdated);
}
@ -1878,12 +1905,24 @@ public class ContactsController {
return loadingLastSeenInfo != 2;
}
public ArrayList<TLRPC.PrivacyRule> getPrivacyRules() {
return privacyRules;
public boolean getLoadingGroupInfo() {
return loadingGroupInfo != 2;
}
public void setPrivacyRules(ArrayList<TLRPC.PrivacyRule> rules) {
privacyRules = rules;
public ArrayList<TLRPC.PrivacyRule> getPrivacyRules(boolean isGroup) {
if (isGroup) {
return groupPrivacyRules;
} else {
return privacyRules;
}
}
public void setPrivacyRules(ArrayList<TLRPC.PrivacyRule> rules, boolean isGroup) {
if (isGroup) {
groupPrivacyRules = rules;
} else {
privacyRules = rules;
}
NotificationCenter.getInstance().postNotificationName(NotificationCenter.privacyRulesUpdated);
reloadContactsStatuses();
}

View File

@ -94,73 +94,59 @@ public class FileLoadOperation {
ext = extension != null ? extension : "jpg";
}
public FileLoadOperation(TLRPC.Video videoLocation) {
if (videoLocation instanceof TLRPC.TL_videoEncrypted) {
location = new TLRPC.TL_inputEncryptedFileLocation();
location.id = videoLocation.id;
location.access_hash = videoLocation.access_hash;
datacenter_id = videoLocation.dc_id;
iv = new byte[32];
System.arraycopy(videoLocation.iv, 0, iv, 0, iv.length);
key = videoLocation.key;
} else if (videoLocation instanceof TLRPC.TL_video) {
location = new TLRPC.TL_inputVideoFileLocation();
datacenter_id = videoLocation.dc_id;
location.id = videoLocation.id;
location.access_hash = videoLocation.access_hash;
}
totalBytesCount = videoLocation.size;
ext = ".mp4";
}
public FileLoadOperation(TLRPC.Audio audioLocation) {
if (audioLocation instanceof TLRPC.TL_audioEncrypted) {
location = new TLRPC.TL_inputEncryptedFileLocation();
location.id = audioLocation.id;
location.access_hash = audioLocation.access_hash;
datacenter_id = audioLocation.dc_id;
iv = new byte[32];
System.arraycopy(audioLocation.iv, 0, iv, 0, iv.length);
key = audioLocation.key;
} else if (audioLocation instanceof TLRPC.TL_audio) {
location = new TLRPC.TL_inputAudioFileLocation();
datacenter_id = audioLocation.dc_id;
location.id = audioLocation.id;
location.access_hash = audioLocation.access_hash;
}
totalBytesCount = audioLocation.size;
ext = ".ogg";
}
public FileLoadOperation(TLRPC.Document documentLocation) {
if (documentLocation instanceof TLRPC.TL_documentEncrypted) {
location = new TLRPC.TL_inputEncryptedFileLocation();
location.id = documentLocation.id;
location.access_hash = documentLocation.access_hash;
datacenter_id = documentLocation.dc_id;
iv = new byte[32];
System.arraycopy(documentLocation.iv, 0, iv, 0, iv.length);
key = documentLocation.key;
} else if (documentLocation instanceof TLRPC.TL_document) {
location = new TLRPC.TL_inputDocumentFileLocation();
location.id = documentLocation.id;
location.access_hash = documentLocation.access_hash;
datacenter_id = documentLocation.dc_id;
}
if (totalBytesCount <= 0) {
totalBytesCount = documentLocation.size;
}
if (ext == null) {
try {
if (documentLocation instanceof TLRPC.TL_documentEncrypted) {
location = new TLRPC.TL_inputEncryptedFileLocation();
location.id = documentLocation.id;
location.access_hash = documentLocation.access_hash;
datacenter_id = documentLocation.dc_id;
iv = new byte[32];
System.arraycopy(documentLocation.iv, 0, iv, 0, iv.length);
key = documentLocation.key;
} else if (documentLocation instanceof TLRPC.TL_document) {
location = new TLRPC.TL_inputDocumentFileLocation();
location.id = documentLocation.id;
location.access_hash = documentLocation.access_hash;
datacenter_id = documentLocation.dc_id;
}
if (totalBytesCount <= 0) {
totalBytesCount = documentLocation.size;
}
ext = FileLoader.getDocumentFileName(documentLocation);
int idx;
if (ext == null || (idx = ext.lastIndexOf(".")) == -1) {
ext = "";
} else {
ext = ext.substring(idx);
if (ext.length() <= 1) {
}
if (ext.length() <= 1) {
if (documentLocation.mime_type != null) {
switch (documentLocation.mime_type) {
case "video/mp4":
ext = ".mp4";
break;
case "audio/ogg":
ext = ".ogg";
break;
default:
ext = "";
break;
}
} else {
ext = "";
}
}
} catch (Exception e) {
FileLog.e("tmessages", e);
state = stateFailed;
cleanup();
Utilities.stageQueue.postRunnable(new Runnable() {
@Override
public void run() {
delegate.didFailedLoadingFile(FileLoadOperation.this, 0);
}
});
}
}
@ -187,6 +173,7 @@ public class FileLoadOperation {
delayedRequestInfos = new ArrayList<>(currentMaxDownloadRequests - 1);
state = stateDownloading;
if (location == null) {
cleanup();
Utilities.stageQueue.postRunnable(new Runnable() {
@Override
public void run() {
@ -315,7 +302,8 @@ public class FileLoadOperation {
state = stateFailed;
cleanup();
if (requestInfos != null) {
for (RequestInfo requestInfo : requestInfos) {
for (int a = 0; a < requestInfos.size(); a++) {
RequestInfo requestInfo = requestInfos.get(a);
if (requestInfo.requestToken != 0) {
ConnectionsManager.getInstance().cancelRequest(requestInfo.requestToken, true);
}

View File

@ -272,50 +272,37 @@ public class FileLoader {
});
}
public void cancelLoadFile(TLRPC.Video video) {
cancelLoadFile(video, null, null, null, null);
}
public void cancelLoadFile(TLRPC.Document document) {
cancelLoadFile(null, document, null, null, null);
}
public void cancelLoadFile(TLRPC.Audio audio) {
cancelLoadFile(null, null, audio, null, null);
cancelLoadFile(document, null, null);
}
public void cancelLoadFile(TLRPC.PhotoSize photo) {
cancelLoadFile(null, null, null, photo.location, null);
cancelLoadFile(null, photo.location, null);
}
public void cancelLoadFile(TLRPC.FileLocation location, String ext) {
cancelLoadFile(null, null, null, location, ext);
cancelLoadFile(null, location, ext);
}
private void cancelLoadFile(final TLRPC.Video video, final TLRPC.Document document, final TLRPC.Audio audio, final TLRPC.FileLocation location, final String locationExt) {
if (video == null && location == null && document == null && audio == null) {
private void cancelLoadFile(final TLRPC.Document document, final TLRPC.FileLocation location, final String locationExt) {
if (location == null && document == null) {
return;
}
fileLoaderQueue.postRunnable(new Runnable() {
@Override
public void run() {
String fileName = null;
if (video != null) {
fileName = getAttachFileName(video);
} else if (location != null) {
if (location != null) {
fileName = getAttachFileName(location, locationExt);
} else if (document != null) {
fileName = getAttachFileName(document);
} else if (audio != null) {
fileName = getAttachFileName(audio);
}
if (fileName == null) {
return;
}
FileLoadOperation operation = loadOperationPaths.get(fileName);
FileLoadOperation operation = loadOperationPaths.remove(fileName);
if (operation != null) {
loadOperationPaths.remove(fileName);
if (audio != null) {
if (MessageObject.isVoiceDocument(document)) {
audioLoadOperationQueue.remove(operation);
} else if (location != null) {
photoLoadOperationQueue.remove(operation);
@ -346,39 +333,27 @@ public class FileLoader {
return result[0];
}
public void loadFile(TLRPC.Video video, boolean force) {
loadFile(video, null, null, null, null, 0, force, video != null && video.key != null);
}
public void loadFile(TLRPC.PhotoSize photo, String ext, boolean cacheOnly) {
loadFile(null, null, null, photo.location, ext, photo.size, false, cacheOnly || (photo != null && photo.size == 0 || photo.location.key != null));
loadFile(null, photo.location, ext, photo.size, false, cacheOnly || (photo != null && photo.size == 0 || photo.location.key != null));
}
public void loadFile(TLRPC.Document document, boolean force, boolean cacheOnly) {
loadFile(null, document, null, null, null, 0, force, cacheOnly || document != null && document.key != null);
}
public void loadFile(TLRPC.Audio audio, boolean force) {
loadFile(null, null, audio, null, null, 0, false, audio != null && audio.key != null);
loadFile(document, null, null, 0, force, cacheOnly || document != null && document.key != null);
}
public void loadFile(TLRPC.FileLocation location, String ext, int size, boolean cacheOnly) {
loadFile(null, null, null, location, ext, size, true, cacheOnly || size == 0 || (location != null && location.key != null));
loadFile(null, location, ext, size, true, cacheOnly || size == 0 || (location != null && location.key != null));
}
private void loadFile(final TLRPC.Video video, final TLRPC.Document document, final TLRPC.Audio audio, final TLRPC.FileLocation location, final String locationExt, final int locationSize, final boolean force, final boolean cacheOnly) {
private void loadFile(final TLRPC.Document document, final TLRPC.FileLocation location, final String locationExt, final int locationSize, final boolean force, final boolean cacheOnly) {
fileLoaderQueue.postRunnable(new Runnable() {
@Override
public void run() {
String fileName = null;
if (video != null) {
fileName = getAttachFileName(video);
} else if (location != null) {
if (location != null) {
fileName = getAttachFileName(location, locationExt);
} else if (document != null) {
fileName = getAttachFileName(document);
} else if (audio != null) {
fileName = getAttachFileName(audio);
}
if (fileName == null || fileName.contains("" + Integer.MIN_VALUE)) {
return;
@ -389,7 +364,7 @@ public class FileLoader {
if (operation != null) {
if (force) {
LinkedList<FileLoadOperation> downloadQueue;
if (audio != null) {
if (MessageObject.isVoiceDocument(document)) {
downloadQueue = audioLoadOperationQueue;
} else if (location != null) {
downloadQueue = photoLoadOperationQueue;
@ -412,18 +387,18 @@ public class FileLoader {
File storeDir = tempDir;
int type = MEDIA_DIR_CACHE;
if (video != null) {
operation = new FileLoadOperation(video);
type = MEDIA_DIR_VIDEO;
} else if (location != null) {
if (location != null) {
operation = new FileLoadOperation(location, locationExt, locationSize);
type = MEDIA_DIR_IMAGE;
} else if (document != null) {
operation = new FileLoadOperation(document);
type = MEDIA_DIR_DOCUMENT;
} else if (audio != null) {
operation = new FileLoadOperation(audio);
type = MEDIA_DIR_AUDIO;
if (MessageObject.isVoiceDocument(document)) {
type = MEDIA_DIR_AUDIO;
} else if (MessageObject.isVideoDocument(document)) {
type = MEDIA_DIR_VIDEO;
} else {
type = MEDIA_DIR_DOCUMENT;
}
}
if (!cacheOnly) {
storeDir = getDirectory(type);
@ -439,12 +414,12 @@ public class FileLoader {
if (delegate != null) {
delegate.fileDidLoaded(finalFileName, finalFile, finalType);
}
checkDownloadQueue(audio, location, finalFileName);
checkDownloadQueue(document, location, finalFileName);
}
@Override
public void didFailedLoadingFile(FileLoadOperation operation, int canceled) {
checkDownloadQueue(audio, location, finalFileName);
checkDownloadQueue(document, location, finalFileName);
if (delegate != null) {
delegate.fileDidFailedLoad(finalFileName, canceled);
}
@ -458,7 +433,7 @@ public class FileLoader {
}
});
int maxCount = force ? 3 : 1;
if (audio != null) {
if (type == MEDIA_DIR_AUDIO) {
if (currentAudioLoadOperationsCount < maxCount) {
currentAudioLoadOperationsCount++;
operation.start();
@ -496,13 +471,13 @@ public class FileLoader {
});
}
private void checkDownloadQueue(final TLRPC.Audio audio, final TLRPC.FileLocation location, final String arg1) {
private void checkDownloadQueue(final TLRPC.Document document, final TLRPC.FileLocation location, final String arg1) {
fileLoaderQueue.postRunnable(new Runnable() {
@Override
public void run() {
loadOperationPaths.remove(arg1);
FileLoadOperation operation;
if (audio != null) {
if (MessageObject.isVoiceDocument(document)) {
currentAudioLoadOperationsCount--;
if (!audioLoadOperationQueue.isEmpty()) {
operation = audioLoadOperationQueue.get(0);
@ -550,6 +525,44 @@ public class FileLoader {
this.delegate = delegate;
}
public static String getMessageFileName(TLRPC.Message message) {
if (message == null) {
return "";
}
if (message instanceof TLRPC.TL_messageService) {
if (message.action.photo != null) {
ArrayList<TLRPC.PhotoSize> sizes = message.action.photo.sizes;
if (sizes.size() > 0) {
TLRPC.PhotoSize sizeFull = getClosestPhotoSizeWithSize(sizes, AndroidUtilities.getPhotoSize());
if (sizeFull != null) {
return getAttachFileName(sizeFull);
}
}
}
} else {
if (message.media instanceof TLRPC.TL_messageMediaDocument) {
return getAttachFileName(message.media.document);
} else if (message.media instanceof TLRPC.TL_messageMediaPhoto) {
ArrayList<TLRPC.PhotoSize> sizes = message.media.photo.sizes;
if (sizes.size() > 0) {
TLRPC.PhotoSize sizeFull = getClosestPhotoSizeWithSize(sizes, AndroidUtilities.getPhotoSize());
if (sizeFull != null) {
return getAttachFileName(sizeFull);
}
}
} else if (message.media instanceof TLRPC.TL_messageMediaWebPage && message.media.webpage.photo != null) {
ArrayList<TLRPC.PhotoSize> sizes = message.media.webpage.photo.sizes;
if (sizes.size() > 0) {
TLRPC.PhotoSize sizeFull = getClosestPhotoSizeWithSize(sizes, AndroidUtilities.getPhotoSize());
if (sizeFull != null) {
return getAttachFileName(sizeFull);
}
}
}
}
return "";
}
public static File getPathToMessage(TLRPC.Message message) {
if (message == null) {
return new File("");
@ -565,12 +578,8 @@ public class FileLoader {
}
}
} else {
if (message.media instanceof TLRPC.TL_messageMediaVideo) {
return getPathToAttach(message.media.video);
} else if (message.media instanceof TLRPC.TL_messageMediaDocument) {
if (message.media instanceof TLRPC.TL_messageMediaDocument) {
return getPathToAttach(message.media.document);
} else if (message.media instanceof TLRPC.TL_messageMediaAudio) {
return getPathToAttach(message.media.audio);
} else if (message.media instanceof TLRPC.TL_messageMediaPhoto) {
ArrayList<TLRPC.PhotoSize> sizes = message.media.photo.sizes;
if (sizes.size() > 0) {
@ -605,19 +614,18 @@ public class FileLoader {
if (forceCache) {
dir = getInstance().getDirectory(MEDIA_DIR_CACHE);
} else {
if (attach instanceof TLRPC.Video) {
TLRPC.Video video = (TLRPC.Video) attach;
if (video.key != null) {
dir = getInstance().getDirectory(MEDIA_DIR_CACHE);
} else {
dir = getInstance().getDirectory(MEDIA_DIR_VIDEO);
}
} else if (attach instanceof TLRPC.Document) {
if (attach instanceof TLRPC.Document) {
TLRPC.Document document = (TLRPC.Document) attach;
if (document.key != null) {
dir = getInstance().getDirectory(MEDIA_DIR_CACHE);
} else {
dir = getInstance().getDirectory(MEDIA_DIR_DOCUMENT);
if (MessageObject.isVoiceDocument(document)) {
dir = getInstance().getDirectory(MEDIA_DIR_AUDIO);
} else if (MessageObject.isVideoDocument(document)) {
dir = getInstance().getDirectory(MEDIA_DIR_VIDEO);
} else {
dir = getInstance().getDirectory(MEDIA_DIR_DOCUMENT);
}
}
} else if (attach instanceof TLRPC.PhotoSize) {
TLRPC.PhotoSize photoSize = (TLRPC.PhotoSize) attach;
@ -626,13 +634,6 @@ public class FileLoader {
} else {
dir = getInstance().getDirectory(MEDIA_DIR_IMAGE);
}
} else if (attach instanceof TLRPC.Audio) {
TLRPC.Audio audio = (TLRPC.Audio) attach;
if (audio.key != null) {
dir = getInstance().getDirectory(MEDIA_DIR_CACHE);
} else {
dir = getInstance().getDirectory(MEDIA_DIR_AUDIO);
}
} else if (attach instanceof TLRPC.FileLocation) {
TLRPC.FileLocation fileLocation = (TLRPC.FileLocation) attach;
if (fileLocation.key != null || fileLocation.volume_id == Integer.MIN_VALUE && fileLocation.local_id < 0) {
@ -708,10 +709,7 @@ public class FileLoader {
}
public static String getAttachFileName(TLObject attach, String ext) {
if (attach instanceof TLRPC.Video) {
TLRPC.Video video = (TLRPC.Video) attach;
return video.dc_id + "_" + video.id + "." + (ext != null ? ext : "mp4");
} else if (attach instanceof TLRPC.Document) {
if (attach instanceof TLRPC.Document) {
TLRPC.Document document = (TLRPC.Document) attach;
String docExt = null;
if (docExt == null) {
@ -723,6 +721,23 @@ public class FileLoader {
docExt = docExt.substring(idx);
}
}
if (docExt.length() <= 1) {
if (document.mime_type != null) {
switch (document.mime_type) {
case "video/mp4":
docExt = ".mp4";
break;
case "audio/ogg":
docExt = ".ogg";
break;
default:
docExt = "";
break;
}
} else {
docExt = "";
}
}
if (docExt.length() > 1) {
return document.dc_id + "_" + document.id + docExt;
} else {
@ -734,9 +749,6 @@ public class FileLoader {
return "";
}
return photo.location.volume_id + "_" + photo.location.local_id + "." + (ext != null ? ext : "jpg");
} else if (attach instanceof TLRPC.Audio) {
TLRPC.Audio audio = (TLRPC.Audio) attach;
return audio.dc_id + "_" + audio.id + "." + (ext != null ? ext : "ogg");
} else if (attach instanceof TLRPC.FileLocation) {
if (attach instanceof TLRPC.TL_fileLocationUnavailable) {
return "";

View File

@ -1001,8 +1001,8 @@ public class ImageLoader {
}
}
if (imageReceiverArray.size() == 0) {
for (ImageReceiver receiver : imageReceiverArray) {
imageLoadingByTag.remove(receiver.getTag(thumb));
for (int a = 0; a < imageReceiverArray.size(); a++) {
imageLoadingByTag.remove(imageReceiverArray.get(a).getTag(thumb));
}
imageReceiverArray.clear();
if (location != null) {
@ -1233,18 +1233,7 @@ public class ImageLoader {
FileLog.e("tmessages", "file system changed");
Runnable r = new Runnable() {
public void run() {
cacheOutQueue.postRunnable(new Runnable() {
@Override
public void run() {
final HashMap<Integer, File> paths = createMediaPaths();
AndroidUtilities.runOnUIThread(new Runnable() {
@Override
public void run() {
FileLoader.getInstance().setMediaDirs(paths);
}
});
}
});
checkMediaPaths();
}
};
if (Intent.ACTION_MEDIA_UNMOUNTED.equals(intent.getAction())) {
@ -1285,6 +1274,10 @@ public class ImageLoader {
mediaDirs.put(FileLoader.MEDIA_DIR_CACHE, cachePath);
FileLoader.getInstance().setMediaDirs(mediaDirs);
checkMediaPaths();
}
public void checkMediaPaths() {
cacheOutQueue.postRunnable(new Runnable() {
@Override
public void run() {
@ -1702,7 +1695,7 @@ public class ImageLoader {
if (thumb != 2) {
CacheImage img = new CacheImage();
if (httpLocation != null && (httpLocation.endsWith("mp4") || httpLocation.endsWith("gif")) || imageLocation instanceof TLRPC.Document && MessageObject.isGifDocument((TLRPC.Document) imageLocation)) {
if (httpLocation != null && !httpLocation.startsWith("vthumb") && !httpLocation.startsWith("thumb") && (httpLocation.endsWith("mp4") || httpLocation.endsWith("gif")) || imageLocation instanceof TLRPC.Document && MessageObject.isGifDocument((TLRPC.Document) imageLocation)) {
img.animatedFile = true;
}
@ -1801,7 +1794,7 @@ public class ImageLoader {
}
if (httpLocation != null) {
key = Utilities.MD5(httpLocation);
url = key + "." + getHttpUrlExtension(httpLocation);
url = key + "." + getHttpUrlExtension(httpLocation, "jpg");
} else if (imageLocation != null) {
if (imageLocation instanceof TLRPC.FileLocation) {
TLRPC.FileLocation location = (TLRPC.FileLocation) imageLocation;
@ -1822,7 +1815,11 @@ public class ImageLoader {
docExt = "";
} else {
docExt = docExt.substring(idx);
if (docExt.length() <= 1) {
}
if (docExt.length() <= 1) {
if (document.mime_type != null && document.mime_type.equals("video/mp4")) {
docExt = ".mp4";
} else {
docExt = "";
}
}
@ -1965,7 +1962,7 @@ public class ImageLoader {
ext = "jpg";
}
}
File file = new File(FileLoader.getInstance().getDirectory(FileLoader.MEDIA_DIR_CACHE), Utilities.MD5(url) + "_temp." + ext);
File file = new File(FileLoader.getInstance().getDirectory(FileLoader.MEDIA_DIR_CACHE), Utilities.MD5(url) + "_temp." + getHttpUrlExtension(url, extension));
file.delete();
HttpFileTask task = new HttpFileTask(url, file, ext);
@ -2279,14 +2276,14 @@ public class ImageLoader {
}
}
public static String getHttpUrlExtension(String url) {
public static String getHttpUrlExtension(String url, String defaultExt) {
String ext = null;
int idx = url.lastIndexOf(".");
if (idx != -1) {
ext = url.substring(idx + 1);
}
if (ext == null || ext.length() == 0 || ext.length() > 4) {
ext = "jpg";
ext = defaultExt;
}
return ext;
}
@ -2300,10 +2297,6 @@ public class ImageLoader {
break;
}
}
} else if (message.media instanceof TLRPC.TL_messageMediaVideo) {
if (message.media.video.thumb instanceof TLRPC.TL_photoCachedSize) {
photoSize = message.media.video.thumb;
}
} else if (message.media instanceof TLRPC.TL_messageMediaDocument) {
if (message.media.document.thumb instanceof TLRPC.TL_photoCachedSize) {
photoSize = message.media.document.thumb;
@ -2350,8 +2343,6 @@ public class ImageLoader {
break;
}
}
} else if (message.media instanceof TLRPC.TL_messageMediaVideo) {
message.media.video.thumb = newPhotoSize;
} else if (message.media instanceof TLRPC.TL_messageMediaDocument) {
message.media.document.thumb = newPhotoSize;
} else if (message.media instanceof TLRPC.TL_messageMediaWebPage) {
@ -2369,7 +2360,8 @@ public class ImageLoader {
if (messages == null || messages.isEmpty()) {
return;
}
for (TLRPC.Message message : messages) {
for (int a = 0; a < messages.size(); a++) {
TLRPC.Message message = messages.get(a);
saveMessageThumbs(message);
}
}

View File

@ -138,7 +138,8 @@ public class ImageReceiver implements NotificationCenter.NotificationCenterDeleg
if ((fileLocation == null && httpUrl == null && thumbLocation == null)
|| (fileLocation != null && !(fileLocation instanceof TLRPC.TL_fileLocation)
&& !(fileLocation instanceof TLRPC.TL_fileEncryptedLocation)
&& !(fileLocation instanceof TLRPC.TL_document))) {
&& !(fileLocation instanceof TLRPC.TL_document)
&& !(fileLocation instanceof TLRPC.TL_documentEncrypted))) {
recycleBitmap(null, false);
recycleBitmap(null, true);
currentKey = null;
@ -260,6 +261,12 @@ public class ImageReceiver implements NotificationCenter.NotificationCenterDeleg
}
public void setOrientation(int angle, boolean center) {
while (angle < 0) {
angle += 360;
}
while (angle > 360) {
angle -= 360;
}
orientation = angle;
centerRotation = center;
}
@ -376,7 +383,7 @@ public class ImageReceiver implements NotificationCenter.NotificationCenterDeleg
} else {
int bitmapW;
int bitmapH;
if (orientation == 90 || orientation == 270) {
if (orientation % 360 == 90 || orientation % 360 == 270) {
bitmapW = bitmapDrawable.getIntrinsicHeight();
bitmapH = bitmapDrawable.getIntrinsicWidth();
} else {
@ -413,7 +420,7 @@ public class ImageReceiver implements NotificationCenter.NotificationCenterDeleg
canvas.save();
canvas.clipRect(imageX, imageY, imageX + imageW, imageY + imageH);
if (orientation != 0) {
if (orientation % 360 != 0) {
if (centerRotation) {
canvas.rotate(orientation, imageW / 2, imageH / 2);
} else {
@ -428,7 +435,7 @@ public class ImageReceiver implements NotificationCenter.NotificationCenterDeleg
bitmapH /= scaleW;
drawRegion.set(imageX, imageY - (bitmapH - imageH) / 2, imageX + imageW, imageY + (bitmapH + imageH) / 2);
}
if (orientation == 90 || orientation == 270) {
if (orientation % 360 == 90 || orientation % 360 == 270) {
int width = (drawRegion.right - drawRegion.left) / 2;
int height = (drawRegion.bottom - drawRegion.top) / 2;
int centerX = (drawRegion.right + drawRegion.left) / 2;
@ -457,7 +464,7 @@ public class ImageReceiver implements NotificationCenter.NotificationCenterDeleg
canvas.restore();
} else {
canvas.save();
if (orientation != 0) {
if (orientation % 360 != 0) {
if (centerRotation) {
canvas.rotate(orientation, imageW / 2, imageH / 2);
} else {
@ -465,7 +472,7 @@ public class ImageReceiver implements NotificationCenter.NotificationCenterDeleg
}
}
drawRegion.set(imageX, imageY, imageX + imageW, imageY + imageH);
if (orientation == 90 || orientation == 270) {
if (orientation % 360 == 90 || orientation % 360 == 270) {
int width = (drawRegion.right - drawRegion.left) / 2;
int height = (drawRegion.bottom - drawRegion.top) / 2;
int centerX = (drawRegion.right + drawRegion.left) / 2;
@ -597,18 +604,18 @@ public class ImageReceiver implements NotificationCenter.NotificationCenterDeleg
public int getBitmapWidth() {
if (currentImage instanceof AnimatedFileDrawable) {
return orientation == 0 || orientation == 180 ? currentImage.getIntrinsicWidth() : currentImage.getIntrinsicHeight();
return orientation % 360 == 0 || orientation % 360 == 180 ? currentImage.getIntrinsicWidth() : currentImage.getIntrinsicHeight();
}
Bitmap bitmap = getBitmap();
return orientation == 0 || orientation == 180 ? bitmap.getWidth() : bitmap.getHeight();
return orientation % 360 == 0 || orientation % 360 == 180 ? bitmap.getWidth() : bitmap.getHeight();
}
public int getBitmapHeight() {
if (currentImage instanceof AnimatedFileDrawable) {
return orientation == 0 || orientation == 180 ? currentImage.getIntrinsicHeight() : currentImage.getIntrinsicWidth();
return orientation % 360 == 0 || orientation % 360 == 180 ? currentImage.getIntrinsicHeight() : currentImage.getIntrinsicWidth();
}
Bitmap bitmap = getBitmap();
return orientation == 0 || orientation == 180 ? bitmap.getHeight() : bitmap.getWidth();
return orientation % 360 == 0 || orientation % 360 == 180 ? bitmap.getHeight() : bitmap.getWidth();
}
public void setVisible(boolean value, boolean invalidate) {

View File

@ -700,6 +700,30 @@ public class LocaleController {
return "LOC_ERR";
}
public static String formatDateAudio(long date) {
try {
Calendar rightNow = Calendar.getInstance();
int day = rightNow.get(Calendar.DAY_OF_YEAR);
int year = rightNow.get(Calendar.YEAR);
rightNow.setTimeInMillis(date * 1000);
int dateDay = rightNow.get(Calendar.DAY_OF_YEAR);
int dateYear = rightNow.get(Calendar.YEAR);
if (dateDay == day && year == dateYear) {
return String.format("%s %s", LocaleController.getString("TodayAt", R.string.TodayAt), getInstance().formatterDay.format(new Date(date * 1000)));
} else if (dateDay + 1 == day && year == dateYear) {
return String.format("%s %s", LocaleController.getString("YesterdayAt", R.string.YesterdayAt), getInstance().formatterDay.format(new Date(date * 1000)));
} else if (year == dateYear) {
return LocaleController.formatString("formatDateAtTime", R.string.formatDateAtTime, getInstance().formatterMonth.format(new Date(date * 1000)), getInstance().formatterDay.format(new Date(date * 1000)));
} else {
return LocaleController.formatString("formatDateAtTime", R.string.formatDateAtTime, getInstance().formatterYear.format(new Date(date * 1000)), getInstance().formatterDay.format(new Date(date * 1000)));
}
} catch (Exception e) {
FileLog.e("tmessages", e);
}
return "LOC_ERR";
}
public static String formatDateOnline(long date) {
try {
Calendar rightNow = Calendar.getInstance();

View File

@ -64,6 +64,8 @@ public class MessageObject {
public int textHeight;
public int blockHeight = Integer.MAX_VALUE;
private boolean layoutCreated;
public static Pattern urlPattern;
public static class TextLayoutBlock {
@ -96,15 +98,18 @@ public class MessageObject {
replyMessageObject = new MessageObject(message.replyMessage, users, chats, false);
}
TLRPC.User fromUser = null;
if (isFromUser()) {
if (users != null) {
fromUser = users.get(message.from_id);
}
if (fromUser == null) {
fromUser = MessagesController.getInstance().getUser(message.from_id);
}
}
if (message instanceof TLRPC.TL_messageService) {
if (message.action != null) {
TLRPC.User fromUser = null;
if (users != null) {
fromUser = users.get(message.from_id);
}
if (fromUser == null) {
fromUser = MessagesController.getInstance().getUser(message.from_id);
}
if (message.action instanceof TLRPC.TL_messageActionChatCreate) {
if (isOut()) {
messageText = LocaleController.getString("ActionYouCreateGroup", R.string.ActionYouCreateGroup);
@ -357,8 +362,10 @@ public class MessageObject {
} else if (!isMediaEmpty()) {
if (message.media instanceof TLRPC.TL_messageMediaPhoto) {
messageText = LocaleController.getString("AttachPhoto", R.string.AttachPhoto);
} else if (message.media instanceof TLRPC.TL_messageMediaVideo) {
} else if (isVideo()) {
messageText = LocaleController.getString("AttachVideo", R.string.AttachVideo);
} else if (isVoice()) {
messageText = LocaleController.getString("AttachAudio", R.string.AttachAudio);
} else if (message.media instanceof TLRPC.TL_messageMediaGeo || message.media instanceof TLRPC.TL_messageMediaVenue) {
messageText = LocaleController.getString("AttachLocation", R.string.AttachLocation);
} else if (message.media instanceof TLRPC.TL_messageMediaContact) {
@ -385,8 +392,6 @@ public class MessageObject {
messageText = LocaleController.getString("AttachDocument", R.string.AttachDocument);
}
}
} else if (message.media instanceof TLRPC.TL_messageMediaAudio) {
messageText = LocaleController.getString("AttachAudio", R.string.AttachAudio);
}
} else {
messageText = message.message;
@ -394,9 +399,6 @@ public class MessageObject {
if (messageText == null) {
messageText = "";
}
if (generateLayout) {
messageText = Emoji.replaceEmoji(messageText, textPaint.getFontMetricsInt(), AndroidUtilities.dp(20), false);
}
if (message instanceof TLRPC.TL_message || message instanceof TLRPC.TL_messageForwarded_old2) {
if (isMediaEmpty()) {
@ -409,9 +411,11 @@ public class MessageObject {
} else if (message.media instanceof TLRPC.TL_messageMediaGeo || message.media instanceof TLRPC.TL_messageMediaVenue) {
contentType = 1;
type = 4;
} else if (message.media instanceof TLRPC.TL_messageMediaVideo) {
} else if (isVideo()) {
contentType = 1;
type = 3;
} else if (isVoice()) {
contentType = type = 2;
} else if (message.media instanceof TLRPC.TL_messageMediaContact) {
contentType = 3;
type = 12;
@ -433,8 +437,6 @@ public class MessageObject {
} else {
type = 9;
}
} else if (message.media instanceof TLRPC.TL_messageMediaAudio) {
contentType = type = 2;
}
} else if (message instanceof TLRPC.TL_messageService) {
if (message.action instanceof TLRPC.TL_messageActionLoginUnknownLocation) {
@ -468,18 +470,32 @@ public class MessageObject {
//dateKey = "0_0_0";
}
if (messageOwner.message != null && messageOwner.id < 0 && messageOwner.message.length() > 6 && messageOwner.media instanceof TLRPC.TL_messageMediaVideo) {
if (messageOwner.message != null && messageOwner.id < 0 && messageOwner.message.length() > 6 && isVideo()) {
videoEditedInfo = new VideoEditedInfo();
videoEditedInfo.parseString(messageOwner.message);
}
generateCaption();
if (generateLayout) {
generateLayout();
messageText = Emoji.replaceEmoji(messageText, textPaint.getFontMetricsInt(), AndroidUtilities.dp(20), false);
generateLayout(fromUser);
}
layoutCreated = generateLayout;
generateThumbs(false);
}
public void checkLayout() {
if (!layoutCreated) {
layoutCreated = true;
TLRPC.User fromUser = null;
if (isFromUser()) {
fromUser = MessagesController.getInstance().getUser(messageOwner.from_id);
}
messageText = Emoji.replaceEmoji(messageText, textPaint.getFontMetricsInt(), AndroidUtilities.dp(20), false);
generateLayout(fromUser);
}
}
public static boolean isGifDocument(TLRPC.Document document) {
return document != null && document.thumb != null && document.mime_type != null && (document.mime_type.equals("image/gif") || isNewGifDocument(document));
}
@ -535,14 +551,6 @@ public class MessageObject {
}
}
}
} else if (messageOwner.media instanceof TLRPC.TL_messageMediaVideo) {
if (!update) {
photoThumbs = new ArrayList<>();
photoThumbs.add(messageOwner.media.video.thumb);
} else if (photoThumbs != null && !photoThumbs.isEmpty() && messageOwner.media.video.thumb != null) {
TLRPC.PhotoSize photoObject = photoThumbs.get(0);
photoObject.location = messageOwner.media.video.thumb.location;
}
} else if (messageOwner.media instanceof TLRPC.TL_messageMediaDocument) {
if (!(messageOwner.media.document.thumb instanceof TLRPC.TL_photoSizeEmpty)) {
if (!update) {
@ -644,12 +652,8 @@ public class MessageObject {
}
public String getFileName() {
if (messageOwner.media instanceof TLRPC.TL_messageMediaVideo) {
return FileLoader.getAttachFileName(messageOwner.media.video);
} else if (messageOwner.media instanceof TLRPC.TL_messageMediaDocument) {
if (messageOwner.media instanceof TLRPC.TL_messageMediaDocument) {
return FileLoader.getAttachFileName(messageOwner.media.document);
} else if (messageOwner.media instanceof TLRPC.TL_messageMediaAudio) {
return FileLoader.getAttachFileName(messageOwner.media.audio);
} else if (messageOwner.media instanceof TLRPC.TL_messageMediaPhoto) {
ArrayList<TLRPC.PhotoSize> sizes = messageOwner.media.photo.sizes;
if (sizes.size() > 0) {
@ -663,12 +667,12 @@ public class MessageObject {
}
public int getFileType() {
if (messageOwner.media instanceof TLRPC.TL_messageMediaVideo) {
if (isVideo()) {
return FileLoader.MEDIA_DIR_VIDEO;
} else if (isVoice()) {
return FileLoader.MEDIA_DIR_AUDIO;
} else if (messageOwner.media instanceof TLRPC.TL_messageMediaDocument) {
return FileLoader.MEDIA_DIR_DOCUMENT;
} else if (messageOwner.media instanceof TLRPC.TL_messageMediaAudio) {
return FileLoader.MEDIA_DIR_AUDIO;
} else if (messageOwner.media instanceof TLRPC.TL_messageMediaPhoto) {
return FileLoader.MEDIA_DIR_IMAGE;
}
@ -772,7 +776,7 @@ public class MessageObject {
private static void addUsernamesAndHashtags(CharSequence charSequence, boolean botCommands) {
try {
if (urlPattern == null) {
urlPattern = Pattern.compile("(^|\\s)/[a-zA-Z@\\d_]{1,255}|(^|\\s)@[a-zA-Z\\d_]{3,32}|(^|\\s)#[\\w\\.]+");
urlPattern = Pattern.compile("(^|\\s)/[a-zA-Z@\\d_]{1,255}|(^|\\s)@[a-zA-Z\\d_]{1,32}|(^|\\s)#[\\w\\.]+");
}
Matcher matcher = urlPattern.matcher(charSequence);
while (matcher.find()) {
@ -822,7 +826,7 @@ public class MessageObject {
}
}
private void generateLayout() {
private void generateLayout(TLRPC.User fromUser) {
if (type != 0 || messageOwner.to_id == null || messageText == null || messageText.length() == 0) {
return;
}
@ -856,6 +860,7 @@ public class MessageObject {
if (messageText instanceof Spannable) {
Spannable spannable = (Spannable) messageText;
int count = messageOwner.entities.size();
URLSpan[] spans = spannable.getSpans(0, messageText.length(), URLSpan.class);
for (int a = 0; a < count; a++) {
TLRPC.MessageEntity entity = messageOwner.entities.get(a);
if (entity.length <= 0 || entity.offset < 0 || entity.offset >= messageOwner.message.length()) {
@ -863,6 +868,19 @@ public class MessageObject {
} else if (entity.offset + entity.length > messageOwner.message.length()) {
entity.length = messageOwner.message.length() - entity.offset;
}
if (spans != null && spans.length > 0) {
for (int b = 0; b < spans.length; b++) {
if (spans[b] == null) {
continue;
}
int start = spannable.getSpanStart(spans[b]);
int end = spannable.getSpanEnd(spans[b]);
if (entity.offset <= start && entity.offset + entity.length >= start || entity.offset <= end && entity.offset + entity.length >= end) {
spannable.removeSpan(spans[b]);
spans[b] = null;
}
}
}
if (entity instanceof TLRPC.TL_messageEntityBold) {
spannable.setSpan(new TypefaceSpan(AndroidUtilities.getTypeface("fonts/rmedium.ttf")), entity.offset, entity.offset + entity.length, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
} else if (entity instanceof TLRPC.TL_messageEntityItalic) {
@ -904,6 +922,9 @@ public class MessageObject {
maxWidth = Math.min(AndroidUtilities.displaySize.x, AndroidUtilities.displaySize.y) - AndroidUtilities.dp(80);
}
}
if (fromUser != null && fromUser.bot) {
maxWidth -= AndroidUtilities.dp(20);
}
StaticLayout textLayout;
@ -1056,7 +1077,11 @@ public class MessageObject {
}
public boolean isOutOwner() {
return messageOwner.out && messageOwner.from_id > 0;
return messageOwner.out && messageOwner.from_id > 0 && !messageOwner.post;
}
public boolean isFromUser() {
return messageOwner.from_id > 0 && !messageOwner.post;
}
public boolean isUnread() {
@ -1100,9 +1125,7 @@ public class MessageObject {
public boolean isSecretMedia() {
return messageOwner instanceof TLRPC.TL_message_secret &&
(messageOwner.media instanceof TLRPC.TL_messageMediaPhoto && messageOwner.ttl > 0 && messageOwner.ttl <= 60 ||
messageOwner.media instanceof TLRPC.TL_messageMediaAudio ||
messageOwner.media instanceof TLRPC.TL_messageMediaVideo);
(messageOwner.media instanceof TLRPC.TL_messageMediaPhoto && messageOwner.ttl > 0 && messageOwner.ttl <= 60 || isVoice() || isVideo());
}
public static void setUnreadFlags(TLRPC.Message message, int flag) {
@ -1128,9 +1151,15 @@ public class MessageObject {
public static boolean isImportant(TLRPC.Message message) {
if (isMegagroup(message)) {
return message.from_id <= 0;
return message.post;
}
return message.to_id.channel_id != 0 && (message.from_id <= 0 || message.mentioned || message.out || (message.flags & TLRPC.MESSAGE_FLAG_HAS_FROM_ID) == 0);
if (message.to_id.channel_id != 0) {
if (message instanceof TLRPC.TL_message_layer47 || message instanceof TLRPC.TL_message_old7) {
return message.to_id.channel_id != 0 && (message.from_id <= 0 || message.mentioned || message.out || (message.flags & TLRPC.MESSAGE_FLAG_HAS_FROM_ID) == 0);
}
return message.post;
}
return false;
}
public static boolean isMegagroup(TLRPC.Message message) {
@ -1200,9 +1229,10 @@ public class MessageObject {
return "";
}
public static boolean isStickerMessage(TLRPC.Message message) {
if (message.media != null && message.media.document != null) {
for (TLRPC.DocumentAttribute attribute : message.media.document.attributes) {
public static boolean isStickerDocument(TLRPC.Document document) {
if (document != null) {
for (int a = 0; a < document.attributes.size(); a++) {
TLRPC.DocumentAttribute attribute = document.attributes.get(a);
if (attribute instanceof TLRPC.TL_documentAttributeSticker) {
return true;
}
@ -1211,17 +1241,60 @@ public class MessageObject {
return false;
}
public static boolean isMusicMessage(TLRPC.Message message) {
if (message.media != null && message.media.document != null) {
for (TLRPC.DocumentAttribute attribute : message.media.document.attributes) {
public static boolean isVoiceDocument(TLRPC.Document document) {
if (document != null) {
for (int a = 0; a < document.attributes.size(); a++) {
TLRPC.DocumentAttribute attribute = document.attributes.get(a);
if (attribute instanceof TLRPC.TL_documentAttributeAudio) {
return true;
return attribute.voice;
}
}
}
return false;
}
public static boolean isVideoDocument(TLRPC.Document document) {
if (document != null) {
boolean isAnimated = false;
boolean isVideo = false;
for (int a = 0; a < document.attributes.size(); a++) {
TLRPC.DocumentAttribute attribute = document.attributes.get(a);
if (attribute instanceof TLRPC.TL_documentAttributeVideo) {
isVideo = true;
} else if (attribute instanceof TLRPC.TL_documentAttributeAnimated) {
isAnimated = true;
}
}
return isVideo && !isAnimated;
}
return false;
}
public static boolean isStickerMessage(TLRPC.Message message) {
return message.media != null && message.media.document != null && isStickerDocument(message.media.document);
}
public static boolean isMusicMessage(TLRPC.Message message) {
if (message.media != null && message.media.document != null) {
for (int a = 0; a < message.media.document.attributes.size(); a++) {
TLRPC.DocumentAttribute attribute = message.media.document.attributes.get(a);
if (attribute instanceof TLRPC.TL_documentAttributeAudio) {
return !attribute.voice;
}
}
}
return false;
}
public static boolean isVoiceMessage(TLRPC.Message message) {
return message.media != null && message.media.document != null && isVoiceDocument(message.media.document);
}
public static boolean isVideoMessage(TLRPC.Message message) {
return message.media != null && message.media.document != null && isVideoDocument(message.media.document);
/* && message.media.document.mime_type.equals("video/mp4")*/
}
public static TLRPC.InputStickerSet getInputStickerSet(TLRPC.Message message) {
if (message.media != null && message.media.document != null) {
for (TLRPC.DocumentAttribute attribute : message.media.document.attributes) {
@ -1339,6 +1412,14 @@ public class MessageObject {
return isMusicMessage(messageOwner);
}
public boolean isVoice() {
return isVoiceMessage(messageOwner);
}
public boolean isVideo() {
return isVideoMessage(messageOwner);
}
public boolean isGif() {
return isGifDocument(messageOwner.media.document);
}
@ -1348,8 +1429,12 @@ public class MessageObject {
}
public String getMusicTitle() {
for (TLRPC.DocumentAttribute attribute : messageOwner.media.document.attributes) {
for (int a = 0; a < messageOwner.media.document.attributes.size(); a++) {
TLRPC.DocumentAttribute attribute = messageOwner.media.document.attributes.get(a);
if (attribute instanceof TLRPC.TL_documentAttributeAudio) {
if (attribute.voice) {
return LocaleController.formatDateAudio(messageOwner.date);
}
String title = attribute.title;
if (title == null || title.length() == 0) {
title = FileLoader.getDocumentFileName(messageOwner.media.document);
@ -1364,8 +1449,30 @@ public class MessageObject {
}
public String getMusicAuthor() {
for (TLRPC.DocumentAttribute attribute : messageOwner.media.document.attributes) {
for (int a = 0; a < messageOwner.media.document.attributes.size(); a++) {
TLRPC.DocumentAttribute attribute = messageOwner.media.document.attributes.get(a);
if (attribute instanceof TLRPC.TL_documentAttributeAudio) {
if (attribute.voice) {
if (isOutOwner() || messageOwner.fwd_from != null && messageOwner.fwd_from.from_id == UserConfig.getClientUserId()) {
return LocaleController.getString("FromYou", R.string.FromYou);
}
TLRPC.User user = null;
TLRPC.Chat chat = null;
if (messageOwner.fwd_from != null && messageOwner.fwd_from.channel_id != 0) {
chat = MessagesController.getInstance().getChat(messageOwner.fwd_from.channel_id);
} else if (messageOwner.fwd_from != null && messageOwner.fwd_from.from_id != 0) {
user = MessagesController.getInstance().getUser(messageOwner.fwd_from.from_id);
} else if (messageOwner.from_id < 0) {
chat = MessagesController.getInstance().getChat(-messageOwner.from_id);
} else {
user = MessagesController.getInstance().getUser(messageOwner.from_id);
}
if (user != null) {
return UserObject.getUserName(user);
} else if (chat != null) {
return chat.title;
}
}
String performer = attribute.performer;
if (performer == null || performer.length() == 0) {
performer = LocaleController.getString("AudioUnknownArtist", R.string.AudioUnknownArtist);
@ -1381,11 +1488,15 @@ public class MessageObject {
}
public boolean isForwarded() {
return (messageOwner.flags & TLRPC.MESSAGE_FLAG_FWD) != 0;
return isForwardedMessage(messageOwner);
}
public static boolean isForwardedMessage(TLRPC.Message message) {
return (message.flags & TLRPC.MESSAGE_FLAG_FWD) != 0;
}
public boolean isReply() {
return !(replyMessageObject != null && replyMessageObject.messageOwner instanceof TLRPC.TL_messageEmpty) && messageOwner.reply_to_msg_id != 0 && (messageOwner.flags & TLRPC.MESSAGE_FLAG_REPLY) != 0;
return !(replyMessageObject != null && replyMessageObject.messageOwner instanceof TLRPC.TL_messageEmpty) && (messageOwner.reply_to_msg_id != 0 || messageOwner.reply_to_random_id != 0) && (messageOwner.flags & TLRPC.MESSAGE_FLAG_REPLY) != 0;
}
public boolean isMediaEmpty() {
@ -1396,6 +1507,32 @@ public class MessageObject {
return message == null || message.media == null || message.media instanceof TLRPC.TL_messageMediaEmpty || message.media instanceof TLRPC.TL_messageMediaWebPage;
}
public boolean canEditMessage(TLRPC.Chat chat) {
return canEditMessage(messageOwner, chat);
}
public static boolean canEditMessage(TLRPC.Message message, TLRPC.Chat chat) {
if (message.action != null && !(message.action instanceof TLRPC.TL_messageActionEmpty) || isForwardedMessage(message) || message.via_bot_id != 0 || message.id < 0 || Math.abs(message.date - ConnectionsManager.getInstance().getCurrentTime()) > MessagesController.getInstance().maxEditTime) {
return false;
}
if (chat == null && message.to_id.channel_id != 0) {
chat = MessagesController.getInstance().getChat(message.to_id.channel_id);
}
if (ChatObject.isChannel(chat) && chat.megagroup) {
return message.out;
}
if (ChatObject.isChannel(chat) && !chat.megagroup && (chat.creator || chat.editor && isOut(message)) && isImportant(message)) {
if (message.media instanceof TLRPC.TL_messageMediaPhoto ||
message.media instanceof TLRPC.TL_messageMediaDocument && (isVideoMessage(message) || isGifDocument(message.media.document)) ||
message.media instanceof TLRPC.TL_messageMediaEmpty ||
message.media instanceof TLRPC.TL_messageMediaWebPage ||
message.media == null) {
return true;
}
}
return false;
}
public boolean canDeleteMessage(TLRPC.Chat chat) {
return canDeleteMessage(messageOwner, chat);
}
@ -1414,11 +1551,11 @@ public class MessageObject {
if (chat.creator) {
return true;
} else if (chat.editor) {
if (isOut(message) || message.from_id > 0) {
if (isOut(message) || message.from_id > 0 && !message.post) {
return true;
}
} else if (chat.moderator) {
if (message.from_id > 0) {
if (message.from_id > 0 && !message.post) {
return true;
}
} else if (isOut(message) && message.from_id > 0) {
@ -1429,15 +1566,17 @@ public class MessageObject {
}
public String getForwardedName() {
if (messageOwner.fwd_from_id instanceof TLRPC.TL_peerChannel) {
TLRPC.Chat chat = MessagesController.getInstance().getChat(messageOwner.fwd_from_id.channel_id);
if (chat != null) {
return chat.title;
}
} else if (messageOwner.fwd_from_id instanceof TLRPC.TL_peerUser) {
TLRPC.User user = MessagesController.getInstance().getUser(messageOwner.fwd_from_id.user_id);
if (user != null) {
return UserObject.getUserName(user);
if (messageOwner.fwd_from != null) {
if (messageOwner.fwd_from.channel_id != 0) {
TLRPC.Chat chat = MessagesController.getInstance().getChat(messageOwner.fwd_from.channel_id);
if (chat != null) {
return chat.title;
}
} else if (messageOwner.fwd_from.from_id != 0) {
TLRPC.User user = MessagesController.getInstance().getUser(messageOwner.fwd_from.from_id);
if (user != null) {
return UserObject.getUserName(user);
}
}
}
return null;

View File

@ -22,7 +22,6 @@ import org.telegram.messenger.query.BotQuery;
import org.telegram.messenger.query.SharedMediaQuery;
import org.telegram.tgnet.ConnectionsManager;
import org.telegram.tgnet.NativeByteBuffer;
import org.telegram.tgnet.TLClassStore;
import org.telegram.tgnet.TLObject;
import org.telegram.tgnet.TLRPC;
@ -166,7 +165,7 @@ public class MessagesStorage {
database.executeFast("CREATE TABLE bot_info(uid INTEGER PRIMARY KEY, info BLOB)").stepThis().dispose();
//version
database.executeFast("PRAGMA user_version = 29").stepThis().dispose();
database.executeFast("PRAGMA user_version = 30").stepThis().dispose();
//database.executeFast("CREATE TABLE secret_holes(uid INTEGER, seq_in INTEGER, seq_out INTEGER, data BLOB, PRIMARY KEY (uid, seq_in, seq_out));").stepThis().dispose();
//database.executeFast("CREATE TABLE attach_data(uid INTEGER, id INTEGER, data BLOB, PRIMARY KEY (uid, id))").stepThis().dispose();
@ -200,7 +199,7 @@ public class MessagesStorage {
}
}
int version = database.executeInt("PRAGMA user_version");
if (version < 29) {
if (version < 30) {
updateDbToLastVersion(version);
}
}
@ -464,11 +463,6 @@ public class MessagesStorage {
database.executeFast("PRAGMA user_version = 23").stepThis().dispose();
version = 23;
}
if (version == 23) {
database.executeFast("DELETE FROM sent_files_v2 WHERE 1").stepThis().dispose();
database.executeFast("PRAGMA user_version = 24").stepThis().dispose();
version = 24;
}
if (version == 24) {
database.executeFast("DELETE FROM media_holes_v2 WHERE uid != 0 AND type >= 0 AND start IN (0, 1)").stepThis().dispose();
database.executeFast("PRAGMA user_version = 25").stepThis().dispose();
@ -487,7 +481,13 @@ public class MessagesStorage {
if (version == 28) {
database.executeFast("CREATE TABLE IF NOT EXISTS bot_recent(id INTEGER PRIMARY KEY, date INTEGER);").stepThis().dispose();
database.executeFast("PRAGMA user_version = 29").stepThis().dispose();
//version = 29;
version = 29;
}
if (version == 29) {
database.executeFast("DELETE FROM sent_files_v2 WHERE 1").stepThis().dispose();
database.executeFast("DELETE FROM download_queue WHERE 1").stepThis().dispose();
database.executeFast("PRAGMA user_version = 30").stepThis().dispose();
//version = 30;
}
} catch (Exception e) {
FileLog.e("tmessages", e);
@ -1028,27 +1028,13 @@ public class MessagesStorage {
if (message == null || message.media == null) {
continue;
}
if (message.media instanceof TLRPC.TL_messageMediaAudio) {
File file = FileLoader.getPathToAttach(message.media.audio);
if (file != null && file.toString().length() > 0) {
filesToDelete.add(file);
}
} else if (message.media instanceof TLRPC.TL_messageMediaPhoto) {
if (message.media instanceof TLRPC.TL_messageMediaPhoto) {
for (TLRPC.PhotoSize photoSize : message.media.photo.sizes) {
File file = FileLoader.getPathToAttach(photoSize);
if (file != null && file.toString().length() > 0) {
filesToDelete.add(file);
}
}
} else if (message.media instanceof TLRPC.TL_messageMediaVideo) {
File file = FileLoader.getPathToAttach(message.media.video);
if (file != null && file.toString().length() > 0) {
filesToDelete.add(file);
}
file = FileLoader.getPathToAttach(message.media.video.thumb);
if (file != null && file.toString().length() > 0) {
filesToDelete.add(file);
}
} else if (message.media instanceof TLRPC.TL_messageMediaDocument) {
File file = FileLoader.getPathToAttach(message.media.document);
if (file != null && file.toString().length() > 0) {
@ -1287,6 +1273,7 @@ public class MessagesStorage {
try {
int minDate = Integer.MAX_VALUE;
SparseArray<ArrayList<Integer>> messages = new SparseArray<>();
final ArrayList<Long> midsArray = new ArrayList<>();
StringBuilder mids = new StringBuilder();
SQLiteCursor cursor;
if (random_ids == null) {
@ -1297,10 +1284,13 @@ public class MessagesStorage {
}
while (cursor.next()) {
int ttl = cursor.intValue(1);
int mid = cursor.intValue(0);
if (random_ids != null) {
midsArray.add((long) mid);
}
if (ttl <= 0) {
continue;
}
int mid = cursor.intValue(0);
int date = Math.min(readTime, time) + ttl;
minDate = Math.min(minDate, date);
ArrayList<Integer> arr = messages.get(date);
@ -1315,15 +1305,26 @@ public class MessagesStorage {
arr.add(mid);
}
cursor.dispose();
if (random_ids != null) {
AndroidUtilities.runOnUIThread(new Runnable() {
@Override
public void run() {
MessagesStorage.getInstance().markMessagesContentAsRead(midsArray);
NotificationCenter.getInstance().postNotificationName(NotificationCenter.messagesReadContent, midsArray);
}
});
}
if (messages.size() != 0) {
database.beginTransaction();
SQLitePreparedStatement state = database.executeFast("REPLACE INTO enc_tasks_v2 VALUES(?, ?)");
for (int a = 0; a < messages.size(); a++) {
int key = messages.keyAt(a);
ArrayList<Integer> arr = messages.get(key);
for (Integer mid : arr) {
for (int b = 0; b < arr.size(); b++) {
state.requery();
state.bindInteger(1, mid);
state.bindInteger(1, arr.get(b));
state.bindInteger(2, key);
state.step();
}
@ -2116,6 +2117,36 @@ public class MessagesStorage {
});
}
public boolean checkMessageId(final long dialog_id, final int mid) {
final boolean[] result = new boolean[1];
final Semaphore semaphore = new Semaphore(0);
storageQueue.postRunnable(new Runnable() {
@Override
public void run() {
SQLiteCursor cursor = null;
try {
cursor = database.queryFinalized(String.format(Locale.US, "SELECT mid FROM messages WHERE uid = %d AND mid = %d", dialog_id, mid));
if (cursor.next()) {
result[0] = true;
}
} catch (Exception e) {
FileLog.e("tmessages", e);
} finally {
if (cursor != null) {
cursor.dispose();
}
}
semaphore.release();
}
});
try {
semaphore.acquire();
} catch (Exception e) {
FileLog.e("tmessages", e);
}
return result[0];
}
public void getMessages(final long dialog_id, final int count, final int max_id, final int minDate, final int classGuid, final int load_type, final int important, final int loadIndex) {
storageQueue.postRunnable(new Runnable() {
@Override
@ -2143,6 +2174,7 @@ public class MessagesStorage {
ArrayList<Integer> chatsToLoad = new ArrayList<>();
ArrayList<Long> replyMessages = new ArrayList<>();
HashMap<Integer, ArrayList<TLRPC.Message>> replyMessageOwners = new HashMap<>();
HashMap<Long, ArrayList<TLRPC.Message>> replyMessageRandomOwners = new HashMap<>();
SQLiteCursor cursor;
int lower_id = (int) dialog_id;
@ -2389,7 +2421,7 @@ public class MessagesStorage {
addUsersAndChatsFromMessage(message, usersToLoad, chatsToLoad);
if (message.reply_to_msg_id != 0) {
if (message.reply_to_msg_id != 0 || message.reply_to_random_id != 0) {
boolean ok = false;
if (!cursor.isNull(6)) {
NativeByteBuffer data2 = new NativeByteBuffer(cursor.byteArrayLength(6));
@ -2403,19 +2435,31 @@ public class MessagesStorage {
data2.reuse();
}
if (!ok) {
long messageId = message.reply_to_msg_id;
if (message.to_id.channel_id != 0) {
messageId |= ((long) message.to_id.channel_id) << 32;
if (message.reply_to_msg_id != 0) {
long messageId = message.reply_to_msg_id;
if (message.to_id.channel_id != 0) {
messageId |= ((long) message.to_id.channel_id) << 32;
}
if (!replyMessages.contains(messageId)) {
replyMessages.add(messageId);
}
ArrayList<TLRPC.Message> messages = replyMessageOwners.get(message.reply_to_msg_id);
if (messages == null) {
messages = new ArrayList<>();
replyMessageOwners.put(message.reply_to_msg_id, messages);
}
messages.add(message);
} else {
if (!replyMessages.contains(message.reply_to_random_id)) {
replyMessages.add(message.reply_to_random_id);
}
ArrayList<TLRPC.Message> messages = replyMessageRandomOwners.get(message.reply_to_random_id);
if (messages == null) {
messages = new ArrayList<>();
replyMessageRandomOwners.put(message.reply_to_random_id, messages);
}
messages.add(message);
}
if (!replyMessages.contains(messageId)) {
replyMessages.add(messageId);
}
ArrayList<TLRPC.Message> messages = replyMessageOwners.get(message.reply_to_msg_id);
if (messages == null) {
messages = new ArrayList<>();
replyMessageOwners.put(message.reply_to_msg_id, messages);
}
messages.add(message);
}
}
message.send_state = cursor.intValue(2);
@ -2499,7 +2543,11 @@ public class MessagesStorage {
}
if (!replyMessages.isEmpty()) {
cursor = database.queryFinalized(String.format(Locale.US, "SELECT data, mid, date FROM messages WHERE mid IN(%s)", TextUtils.join(",", replyMessages)));
if (!replyMessageOwners.isEmpty()) {
cursor = database.queryFinalized(String.format(Locale.US, "SELECT data, mid, date FROM messages WHERE mid IN(%s)", TextUtils.join(",", replyMessages)));
} else {
cursor = database.queryFinalized(String.format(Locale.US, "SELECT m.data, m.mid, m.date, r.random_id FROM randoms as r INNER JOIN messages as m ON r.mid = m.mid WHERE r.random_id IN(%s)", TextUtils.join(",", replyMessages)));
}
while (cursor.next()) {
NativeByteBuffer data = new NativeByteBuffer(cursor.byteArrayLength(0));
if (data != null && cursor.byteBufferValue(0, data) != 0) {
@ -2510,16 +2558,35 @@ public class MessagesStorage {
addUsersAndChatsFromMessage(message, usersToLoad, chatsToLoad);
ArrayList<TLRPC.Message> arrayList = replyMessageOwners.get(message.id);
if (arrayList != null) {
for (TLRPC.Message m : arrayList) {
m.replyMessage = message;
if (!replyMessageOwners.isEmpty()) {
ArrayList<TLRPC.Message> arrayList = replyMessageOwners.get(message.id);
if (arrayList != null) {
for (int a = 0; a < arrayList.size(); a++) {
arrayList.get(a).replyMessage = message;
}
}
} else {
ArrayList<TLRPC.Message> arrayList = replyMessageRandomOwners.remove(cursor.longValue(3));
if (arrayList != null) {
for (int a = 0; a < arrayList.size(); a++) {
TLRPC.Message object = arrayList.get(a);
object.replyMessage = message;
object.reply_to_msg_id = message.id;
}
}
}
}
data.reuse();
}
cursor.dispose();
if (!replyMessageRandomOwners.isEmpty()) {
for (HashMap.Entry<Long, ArrayList<TLRPC.Message>> entry : replyMessageRandomOwners.entrySet()) {
ArrayList<TLRPC.Message> arrayList = entry.getValue();
for (int a = 0; a < arrayList.size(); a++) {
arrayList.get(a).reply_to_random_id = 0;
}
}
}
}
if (!usersToLoad.isEmpty()) {
@ -2599,9 +2666,11 @@ public class MessagesStorage {
if (cursor.next()) {
NativeByteBuffer data = new NativeByteBuffer(cursor.byteArrayLength(0));
if (data != null && cursor.byteBufferValue(0, data) != 0) {
TLObject file = TLClassStore.Instance().TLdeserialize(data, data.readInt32(false), false);
if (file != null) {
result.add(file);
TLObject file = TLRPC.MessageMedia.TLdeserialize(data, data.readInt32(false), false);
if (file instanceof TLRPC.TL_messageMediaDocument) {
result.add(((TLRPC.TL_messageMediaDocument) file).document);
} else if (file instanceof TLRPC.TL_messageMediaPhoto) {
result.add(((TLRPC.TL_messageMediaDocument) file).photo);
}
}
data.reuse();
@ -2634,10 +2703,23 @@ public class MessagesStorage {
try {
String id = Utilities.MD5(path);
if (id != null) {
TLRPC.MessageMedia messageMedia = null;
if (file instanceof TLRPC.Photo) {
messageMedia = new TLRPC.TL_messageMediaPhoto();
messageMedia.caption = "";
messageMedia.photo = (TLRPC.Photo) file;
} else if (file instanceof TLRPC.Document) {
messageMedia = new TLRPC.TL_messageMediaDocument();
messageMedia.caption = "";
messageMedia.document = (TLRPC.Document) file;
}
if (messageMedia == null) {
return;
}
state = database.executeFast("REPLACE INTO sent_files_v2 VALUES(?, ?, ?)");
state.requery();
NativeByteBuffer data = new NativeByteBuffer(file.getObjectSize());
file.serializeToStream(data);
NativeByteBuffer data = new NativeByteBuffer(messageMedia.getObjectSize());
messageMedia.serializeToStream(data);
state.bindString(1, id);
state.bindInteger(2, type);
state.bindByteBuffer(3, data);
@ -2738,10 +2820,8 @@ public class MessagesStorage {
public void run() {
SQLitePreparedStatement state = null;
try {
if ((chat.key_hash == null || chat.key_hash.length != 16) && chat.auth_key != null) {
byte[] sha1 = Utilities.computeSHA1(chat.auth_key);
chat.key_hash = new byte[16];
System.arraycopy(sha1, 0, chat.key_hash, 0, chat.key_hash.length);
if ((chat.key_hash == null || chat.key_hash.length < 16) && chat.auth_key != null) {
chat.key_hash = AndroidUtilities.calcAuthKeyHash(chat.auth_key);
}
state = database.executeFast("UPDATE enc_chats SET data = ?, g = ?, authkey = ?, ttl = ?, layer = ?, seq_in = ?, seq_out = ?, use_count = ?, exchange_id = ?, key_date = ?, fprint = ?, fauthkey = ?, khash = ? WHERE uid = ?");
@ -2856,10 +2936,8 @@ public class MessagesStorage {
@Override
public void run() {
try {
if ((chat.key_hash == null || chat.key_hash.length != 16) && chat.auth_key != null) {
byte[] sha1 = Utilities.computeSHA1(chat.auth_key);
chat.key_hash = new byte[16];
System.arraycopy(sha1, 0, chat.key_hash, 0, chat.key_hash.length);
if ((chat.key_hash == null || chat.key_hash.length < 16) && chat.auth_key != null) {
chat.key_hash = AndroidUtilities.calcAuthKeyHash(chat.auth_key);
}
SQLitePreparedStatement state = database.executeFast("REPLACE INTO enc_chats VALUES(?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)");
NativeByteBuffer data = new NativeByteBuffer(chat.getObjectSize());
@ -2950,7 +3028,46 @@ public class MessagesStorage {
return;
}
SQLitePreparedStatement state = database.executeFast("REPLACE INTO users VALUES(?, ?, ?, ?)");
for (TLRPC.User user : users) {
for (int a = 0; a < users.size(); a++) {
TLRPC.User user = users.get(a);
if (user.min) {
SQLiteCursor cursor = database.queryFinalized(String.format(Locale.US, "SELECT data FROM users WHERE uid = %d", user.id));
if (cursor.next()) {
try {
NativeByteBuffer data = new NativeByteBuffer(cursor.byteArrayLength(0));
if (data != null && cursor.byteBufferValue(0, data) != 0) {
TLRPC.User oldUser = TLRPC.User.TLdeserialize(data, data.readInt32(false), false);
if (user != null) {
if (user.first_name != null) {
oldUser.first_name = user.first_name;
oldUser.flags |= 2;
} else {
oldUser.first_name = null;
oldUser.flags = oldUser.flags &~ 2;
}
if (user.last_name != null) {
oldUser.last_name = user.last_name;
oldUser.flags |= 4;
} else {
oldUser.last_name = null;
oldUser.flags = oldUser.flags &~ 4;
}
if (user.photo != null) {
oldUser.photo = user.photo;
oldUser.flags |= 32;
} else {
oldUser.photo = null;
oldUser.flags = oldUser.flags &~ 32;
}
}
user = oldUser;
}
data.reuse();
} catch (Exception e) {
FileLog.e("tmessages", e);
}
}
}
state.requery();
NativeByteBuffer data = new NativeByteBuffer(user.getObjectSize());
user.serializeToStream(data);
@ -2980,7 +3097,8 @@ public class MessagesStorage {
return;
}
SQLitePreparedStatement state = database.executeFast("REPLACE INTO chats VALUES(?, ?, ?)");
for (TLRPC.Chat chat : chats) {
for (int a = 0; a < chats.size(); a++) {
TLRPC.Chat chat = chats.get(a);
state.requery();
NativeByteBuffer data = new NativeByteBuffer(chat.getObjectSize());
chat.serializeToStream(data);
@ -3171,7 +3289,12 @@ public class MessagesStorage {
downloadObject.id = cursor.longValue(0);
NativeByteBuffer data = new NativeByteBuffer(cursor.byteArrayLength(2));
if (data != null && cursor.byteBufferValue(2, data) != 0) {
downloadObject.object = TLClassStore.Instance().TLdeserialize(data, data.readInt32(false), false);
TLRPC.MessageMedia messageMedia = TLRPC.MessageMedia.TLdeserialize(data, data.readInt32(false), false);
if (messageMedia.document != null) {
downloadObject.object = messageMedia.document;
} else if (messageMedia.photo != null) {
downloadObject.object = FileLoader.getClosestPhotoSizeWithSize(messageMedia.photo.sizes, AndroidUtilities.getPhotoSize());
}
}
data.reuse();
objects.add(downloadObject);
@ -3194,10 +3317,10 @@ public class MessagesStorage {
private int getMessageMediaType(TLRPC.Message message) {
if (message instanceof TLRPC.TL_message_secret && (
message.media instanceof TLRPC.TL_messageMediaPhoto && message.ttl > 0 && message.ttl <= 60 ||
message.media instanceof TLRPC.TL_messageMediaAudio ||
message.media instanceof TLRPC.TL_messageMediaVideo)) {
MessageObject.isVoiceMessage(message) ||
MessageObject.isVideoMessage(message))) {
return 1;
} else if (message.media instanceof TLRPC.TL_messageMediaPhoto || message.media instanceof TLRPC.TL_messageMediaVideo) {
} else if (message.media instanceof TLRPC.TL_messageMediaPhoto || MessageObject.isVideoMessage(message)) {
return 0;
}
return -1;
@ -3611,15 +3734,17 @@ public class MessagesStorage {
data.reuse();
if ((message.to_id.channel_id == 0 || MessageObject.isImportant(message)) && message.date >= ConnectionsManager.getInstance().getCurrentTime() - 60 * 60 && downloadMask != 0) {
if (message.media instanceof TLRPC.TL_messageMediaAudio || message.media instanceof TLRPC.TL_messageMediaPhoto || message.media instanceof TLRPC.TL_messageMediaVideo || message.media instanceof TLRPC.TL_messageMediaDocument) {
if (message.media instanceof TLRPC.TL_messageMediaPhoto || message.media instanceof TLRPC.TL_messageMediaDocument) {
int type = 0;
long id = 0;
TLObject object = null;
if (message.media instanceof TLRPC.TL_messageMediaAudio) {
if ((downloadMask & MediaController.AUTODOWNLOAD_MASK_AUDIO) != 0 && message.media.audio.size < 1024 * 1024 * 5) {
id = message.media.audio.id;
TLRPC.MessageMedia object = null;
if (MessageObject.isVoiceMessage(message)) {
if ((downloadMask & MediaController.AUTODOWNLOAD_MASK_AUDIO) != 0 && message.media.document.size < 1024 * 1024 * 5) {
id = message.media.document.id;
type = MediaController.AUTODOWNLOAD_MASK_AUDIO;
object = message.media.audio;
object = new TLRPC.TL_messageMediaDocument();
object.caption = "";
object.document = message.media.document;
}
} else if (message.media instanceof TLRPC.TL_messageMediaPhoto) {
if ((downloadMask & MediaController.AUTODOWNLOAD_MASK_PHOTO) != 0) {
@ -3627,20 +3752,26 @@ public class MessagesStorage {
if (photoSize != null) {
id = message.media.photo.id;
type = MediaController.AUTODOWNLOAD_MASK_PHOTO;
object = photoSize;
object = new TLRPC.TL_messageMediaPhoto();
object.caption = "";
object.photo = message.media.photo;
}
}
} else if (message.media instanceof TLRPC.TL_messageMediaVideo) {
} else if (MessageObject.isVideoMessage(message)) {
if ((downloadMask & MediaController.AUTODOWNLOAD_MASK_VIDEO) != 0) {
id = message.media.video.id;
id = message.media.document.id;
type = MediaController.AUTODOWNLOAD_MASK_VIDEO;
object = message.media.video;
object = new TLRPC.TL_messageMediaDocument();
object.caption = "";
object.document = message.media.document;
}
} else if (message.media instanceof TLRPC.TL_messageMediaDocument && !MessageObject.isMusicMessage(message) && !MessageObject.isGifDocument(message.media.document)) {
if ((downloadMask & MediaController.AUTODOWNLOAD_MASK_DOCUMENT) != 0) {
id = message.media.document.id;
type = MediaController.AUTODOWNLOAD_MASK_DOCUMENT;
object = message.media.document;
object = new TLRPC.TL_messageMediaDocument();
object.caption = "";
object.document = message.media.document;
}
}
if (object != null) {
@ -4260,27 +4391,13 @@ public class MessagesStorage {
if (message == null || message.media == null) {
continue;
}
if (message.media instanceof TLRPC.TL_messageMediaAudio) {
File file = FileLoader.getPathToAttach(message.media.audio);
if (file != null && file.toString().length() > 0) {
filesToDelete.add(file);
}
} else if (message.media instanceof TLRPC.TL_messageMediaPhoto) {
if (message.media instanceof TLRPC.TL_messageMediaPhoto) {
for (TLRPC.PhotoSize photoSize : message.media.photo.sizes) {
File file = FileLoader.getPathToAttach(photoSize);
if (file != null && file.toString().length() > 0) {
filesToDelete.add(file);
}
}
} else if (message.media instanceof TLRPC.TL_messageMediaVideo) {
File file = FileLoader.getPathToAttach(message.media.video);
if (file != null && file.toString().length() > 0) {
filesToDelete.add(file);
}
file = FileLoader.getPathToAttach(message.media.video.thumb);
if (file != null && file.toString().length() > 0) {
filesToDelete.add(file);
}
} else if (message.media instanceof TLRPC.TL_messageMediaDocument) {
File file = FileLoader.getPathToAttach(message.media.document);
if (file != null && file.toString().length() > 0) {
@ -4792,6 +4909,15 @@ public class MessagesStorage {
messageId |= ((long) channelId) << 32;
}
if (load_type == -2) {
SQLiteCursor cursor = database.queryFinalized(String.format(Locale.US, "SELECT mid FROM messages WHERE mid = %d", messageId));
boolean exist = cursor.next();
cursor.dispose();
if (!exist) {
continue;
}
}
if (a == 0 && createDialog) {
SQLitePreparedStatement state3 = database.executeFast("REPLACE INTO dialogs VALUES(?, ?, ?, ?, ?, ?, ?, ?, ?, ?)");
state3.bindLong(1, dialog_id);
@ -4801,7 +4927,7 @@ public class MessagesStorage {
state3.bindInteger(5, message.id);
state3.bindInteger(6, 0);
state3.bindLong(7, messageId);
state3.bindInteger(8, 0);
state3.bindInteger(8, load_type < 0 ? message.ttl : 0);
state3.bindInteger(9, messages.pts);
state3.bindInteger(10, message.date);
state3.step();
@ -4809,7 +4935,7 @@ public class MessagesStorage {
}
boolean isImportant = MessageObject.isImportant(message);
if (load_type != -1 && important == 1) {
if (load_type >= 0 && important == 1) {
if (isImportant) {
minChannelMessageId = Math.min(minChannelMessageId, message.id);
maxChannelMessageId = Math.max(maxChannelMessageId, message.id);
@ -4874,7 +5000,7 @@ public class MessagesStorage {
BotQuery.putBotKeyboard(dialog_id, botKeyboard);
}
if (load_type != -1 && important != 0) {
if (load_type >= 0 && important != 0) {
/*if ((messages.flags & 1) == 0) {
if (countBeforeImportant != 0) {
if (load_type == 0) {
@ -4979,17 +5105,17 @@ public class MessagesStorage {
if (message.media.user_id != 0 && !usersToLoad.contains(message.media.user_id)) {
usersToLoad.add(message.media.user_id);
}
if (message.media.audio != null && message.media.audio.user_id != 0 && !usersToLoad.contains(message.media.audio.user_id)) {
usersToLoad.add(message.media.audio.user_id);
}
}
if (message.fwd_from_id instanceof TLRPC.TL_peerUser) {
if (!usersToLoad.contains(message.fwd_from_id.user_id)) {
usersToLoad.add(message.fwd_from_id.user_id);
if (message.fwd_from != null) {
if (message.fwd_from.from_id != 0) {
if (!usersToLoad.contains(message.fwd_from.from_id)) {
usersToLoad.add(message.fwd_from.from_id);
}
}
} else if (message.fwd_from_id instanceof TLRPC.TL_peerChannel) {
if (!chatsToLoad.contains(message.fwd_from_id.channel_id)) {
chatsToLoad.add(message.fwd_from_id.channel_id);
if (message.fwd_from.channel_id != 0) {
if (!chatsToLoad.contains(message.fwd_from.channel_id)) {
chatsToLoad.add(message.fwd_from.channel_id);
}
}
}
if (message.ttl < 0) {
@ -5010,7 +5136,7 @@ public class MessagesStorage {
usersToLoad.add(UserConfig.getClientUserId());
ArrayList<Integer> chatsToLoad = new ArrayList<>();
ArrayList<Integer> encryptedToLoad = new ArrayList<>();
SQLiteCursor cursor = database.queryFinalized(String.format(Locale.US, "SELECT d.did, d.last_mid, d.unread_count, d.date, m.data, m.read_state, m.mid, m.send_state, s.flags, m.date, d.last_mid_i, d.unread_count_i, d.pts, d.inbox_max FROM dialogs as d LEFT JOIN messages as m ON d.last_mid = m.mid LEFT JOIN dialog_settings as s ON d.did = s.did ORDER BY d.date DESC LIMIT %d,%d", offset, count));
SQLiteCursor cursor = database.queryFinalized(String.format(Locale.US, "SELECT d.did, d.last_mid, d.unread_count, d.date, m.data, m.read_state, m.mid, m.send_state, s.flags, m.date, d.last_mid_i, d.unread_count_i, d.pts, d.inbox_max, d.date_i FROM dialogs as d LEFT JOIN messages as m ON d.last_mid = m.mid LEFT JOIN dialog_settings as s ON d.did = s.did ORDER BY d.date DESC LIMIT %d,%d", offset, count));
while (cursor.next()) {
TLRPC.Dialog dialog;
int pts = cursor.intValue(12);
@ -5026,6 +5152,7 @@ public class MessagesStorage {
dialog.last_message_date = cursor.intValue(3);
dialog.pts = pts;
dialog.read_inbox_max_id = cursor.intValue(13);
dialog.last_message_date_i = cursor.intValue(14);
dialog.top_not_important_message = cursor.intValue(10);
dialog.unread_not_important_count = cursor.intValue(11);
long flags = cursor.longValue(8);

View File

@ -21,15 +21,13 @@ import android.media.RemoteControlClient;
import android.os.Build;
import android.os.IBinder;
import android.support.v4.app.NotificationCompat;
import android.telephony.PhoneStateListener;
import android.telephony.TelephonyManager;
import android.view.View;
import android.widget.RemoteViews;
import org.telegram.messenger.audioinfo.AudioInfo;
import org.telegram.ui.LaunchActivity;
public class MusicPlayerService extends Service implements AudioManager.OnAudioFocusChangeListener, NotificationCenter.NotificationCenterDelegate {
public class MusicPlayerService extends Service implements NotificationCenter.NotificationCenterDelegate {
public static final String NOTIFY_PREVIOUS = "org.telegram.android.musicplayer.previous";
public static final String NOTIFY_CLOSE = "org.telegram.android.musicplayer.close";
@ -39,8 +37,6 @@ public class MusicPlayerService extends Service implements AudioManager.OnAudioF
private RemoteControlClient remoteControlClient;
private AudioManager audioManager;
private static boolean ignoreAudioFocus = false;
private PhoneStateListener phoneStateListener;
private static boolean supportBigNotifications = Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN;
private static boolean supportLockScreenControls = Build.VERSION.SDK_INT >= Build.VERSION_CODES.ICE_CREAM_SANDWICH;
@ -55,29 +51,6 @@ public class MusicPlayerService extends Service implements AudioManager.OnAudioF
audioManager = (AudioManager) getSystemService(AUDIO_SERVICE);
NotificationCenter.getInstance().addObserver(this, NotificationCenter.audioProgressDidChanged);
NotificationCenter.getInstance().addObserver(this, NotificationCenter.audioPlayStateChanged);
try {
phoneStateListener = new PhoneStateListener() {
@Override
public void onCallStateChanged(int state, String incomingNumber) {
if (state == TelephonyManager.CALL_STATE_RINGING) {
if (MediaController.getInstance().isPlayingAudio(MediaController.getInstance().getPlayingMessageObject()) && !MediaController.getInstance().isAudioPaused()) {
MediaController.getInstance().pauseAudio(MediaController.getInstance().getPlayingMessageObject());
}
} else if (state == TelephonyManager.CALL_STATE_IDLE) {
} else if (state == TelephonyManager.CALL_STATE_OFFHOOK) {
}
super.onCallStateChanged(state, incomingNumber);
}
};
TelephonyManager mgr = (TelephonyManager) getSystemService(TELEPHONY_SERVICE);
if (mgr != null) {
mgr.listen(phoneStateListener, PhoneStateListener.LISTEN_CALL_STATE);
}
} catch (Exception e) {
FileLog.e("tmessages", e);
}
super.onCreate();
}
@ -220,7 +193,6 @@ public class MusicPlayerService extends Service implements AudioManager.OnAudioF
metadataEditor.putBitmap(RemoteControlClient.MetadataEditor.BITMAP_KEY_ARTWORK, audioInfo.getCover());
}
metadataEditor.apply();
audioManager.requestAudioFocus(this, AudioManager.STREAM_MUSIC, AudioManager.AUDIOFOCUS_GAIN);
}
}
@ -246,35 +218,11 @@ public class MusicPlayerService extends Service implements AudioManager.OnAudioF
metadataEditor.clear();
metadataEditor.apply();
audioManager.unregisterRemoteControlClient(remoteControlClient);
audioManager.abandonAudioFocus(this);
}
try {
TelephonyManager mgr = (TelephonyManager) getSystemService(TELEPHONY_SERVICE);
if (mgr != null) {
mgr.listen(phoneStateListener, PhoneStateListener.LISTEN_NONE);
}
} catch (Exception e) {
FileLog.e("tmessages", e);
}
NotificationCenter.getInstance().removeObserver(this, NotificationCenter.audioProgressDidChanged);
NotificationCenter.getInstance().removeObserver(this, NotificationCenter.audioPlayStateChanged);
}
@Override
public void onAudioFocusChange(int focusChange) {
if (ignoreAudioFocus) {
ignoreAudioFocus = false;
return;
}
if (focusChange == AudioManager.AUDIOFOCUS_LOSS) {
if (MediaController.getInstance().isPlayingAudio(MediaController.getInstance().getPlayingMessageObject()) && !MediaController.getInstance().isAudioPaused()) {
MediaController.getInstance().pauseAudio(MediaController.getInstance().getPlayingMessageObject());
}
} else if (focusChange == AudioManager.AUDIOFOCUS_GAIN) {
//MediaController.getInstance().playAudio(MediaController.getInstance().getPlayingMessageObject());
}
}
@Override
public void didReceivedNotification(int id, Object... args) {
if (id == NotificationCenter.audioPlayStateChanged) {
@ -286,8 +234,4 @@ public class MusicPlayerService extends Service implements AudioManager.OnAudioF
}
}
}
public static void setIgnoreAudioFocus() {
ignoreAudioFocus = true;
}
}

View File

@ -23,7 +23,7 @@ import java.util.zip.ZipFile;
public class NativeLoader {
private final static int LIB_VERSION = 17;
private final static int LIB_VERSION = 19;
private final static String LIB_NAME = "tmessages." + LIB_VERSION;
private final static String LIB_SO_NAME = "lib" + LIB_NAME + ".so";
private final static String LOCALE_LIB_SO_NAME = "lib" + LIB_NAME + "loc.so";

View File

@ -77,6 +77,7 @@ public class NotificationCenter {
public static final int closeOtherAppActivities = totalEvents++;
public static final int didUpdatedConnectionState = totalEvents++;
public static final int didReceiveSmsCode = totalEvents++;
public static final int didReceiveCall = totalEvents++;
public static final int emojiDidLoaded = totalEvents++;
public static final int appDidLogout = totalEvents++;

View File

@ -78,8 +78,10 @@ public class NotificationsController {
private SoundPool soundPool;
private int soundIn;
private int soundOut;
private int soundRecord;
private boolean soundInLoaded;
private boolean soundOutLoaded;
private boolean soundRecordLoaded;
protected AudioManager audioManager;
private AlarmManager alarmManager;
@ -681,7 +683,11 @@ public class NotificationsController {
int chat_id = messageObject.messageOwner.to_id.chat_id != 0 ? messageObject.messageOwner.to_id.chat_id : messageObject.messageOwner.to_id.channel_id;
int from_id = messageObject.messageOwner.to_id.user_id;
if (from_id == 0) {
from_id = messageObject.messageOwner.from_id;
if (messageObject.isFromUser()) {
from_id = messageObject.messageOwner.from_id;
} else {
from_id = -chat_id;
}
} else if (from_id == UserConfig.getClientUserId()) {
from_id = messageObject.messageOwner.from_id;
}
@ -747,8 +753,10 @@ public class NotificationsController {
}
} else if (messageObject.messageOwner.media instanceof TLRPC.TL_messageMediaPhoto) {
msg = LocaleController.formatString("NotificationMessagePhoto", R.string.NotificationMessagePhoto, name);
} else if (messageObject.messageOwner.media instanceof TLRPC.TL_messageMediaVideo) {
} else if (messageObject.isVideo()) {
msg = LocaleController.formatString("NotificationMessageVideo", R.string.NotificationMessageVideo, name);
} else if (messageObject.isVoice()) {
msg = LocaleController.formatString("NotificationMessageAudio", R.string.NotificationMessageAudio, name);
} else if (messageObject.messageOwner.media instanceof TLRPC.TL_messageMediaContact) {
msg = LocaleController.formatString("NotificationMessageContact", R.string.NotificationMessageContact, name);
} else if (messageObject.messageOwner.media instanceof TLRPC.TL_messageMediaGeo || messageObject.messageOwner.media instanceof TLRPC.TL_messageMediaVenue) {
@ -761,8 +769,6 @@ public class NotificationsController {
} else {
msg = LocaleController.formatString("NotificationMessageDocument", R.string.NotificationMessageDocument, name);
}
} else if (messageObject.messageOwner.media instanceof TLRPC.TL_messageMediaAudio) {
msg = LocaleController.formatString("NotificationMessageAudio", R.string.NotificationMessageAudio, name);
}
}
} else {
@ -857,8 +863,10 @@ public class NotificationsController {
}
} else if (messageObject.messageOwner.media instanceof TLRPC.TL_messageMediaPhoto) {
msg = LocaleController.formatString("ChannelMessagePhoto", R.string.ChannelMessagePhoto, name, chat.title);
} else if (messageObject.messageOwner.media instanceof TLRPC.TL_messageMediaVideo) {
} else if (messageObject.isVideo()) {
msg = LocaleController.formatString("ChannelMessageVideo", R.string.ChannelMessageVideo, name, chat.title);
} else if (messageObject.isVoice()) {
msg = LocaleController.formatString("ChannelMessageAudio", R.string.ChannelMessageAudio, name, chat.title);
} else if (messageObject.messageOwner.media instanceof TLRPC.TL_messageMediaContact) {
msg = LocaleController.formatString("ChannelMessageContact", R.string.ChannelMessageContact, name, chat.title);
} else if (messageObject.messageOwner.media instanceof TLRPC.TL_messageMediaGeo || messageObject.messageOwner.media instanceof TLRPC.TL_messageMediaVenue) {
@ -871,8 +879,6 @@ public class NotificationsController {
} else {
msg = LocaleController.formatString("ChannelMessageDocument", R.string.ChannelMessageDocument, name, chat.title);
}
} else if (messageObject.messageOwner.media instanceof TLRPC.TL_messageMediaAudio) {
msg = LocaleController.formatString("ChannelMessageAudio", R.string.ChannelMessageAudio, name, chat.title);
}
} else {
if (messageObject.isMediaEmpty()) {
@ -883,8 +889,10 @@ public class NotificationsController {
}
} else if (messageObject.messageOwner.media instanceof TLRPC.TL_messageMediaPhoto) {
msg = LocaleController.formatString("ChannelMessageGroupPhoto", R.string.ChannelMessageGroupPhoto, name, chat.title);
} else if (messageObject.messageOwner.media instanceof TLRPC.TL_messageMediaVideo) {
} else if (messageObject.isVideo()) {
msg = LocaleController.formatString("ChannelMessageGroupVideo", R.string.ChannelMessageGroupVideo, name, chat.title);
} else if (messageObject.isVoice()) {
msg = LocaleController.formatString("ChannelMessageGroupAudio", R.string.ChannelMessageGroupAudio, name, chat.title);
} else if (messageObject.messageOwner.media instanceof TLRPC.TL_messageMediaContact) {
msg = LocaleController.formatString("ChannelMessageGroupContact", R.string.ChannelMessageGroupContact, name, chat.title);
} else if (messageObject.messageOwner.media instanceof TLRPC.TL_messageMediaGeo || messageObject.messageOwner.media instanceof TLRPC.TL_messageMediaVenue) {
@ -897,8 +905,6 @@ public class NotificationsController {
} else {
msg = LocaleController.formatString("ChannelMessageGroupDocument", R.string.ChannelMessageGroupDocument, name, chat.title);
}
} else if (messageObject.messageOwner.media instanceof TLRPC.TL_messageMediaAudio) {
msg = LocaleController.formatString("ChannelMessageGroupAudio", R.string.ChannelMessageGroupAudio, name, chat.title);
}
}
} else {
@ -910,8 +916,10 @@ public class NotificationsController {
}
} else if (messageObject.messageOwner.media instanceof TLRPC.TL_messageMediaPhoto) {
msg = LocaleController.formatString("NotificationMessageGroupPhoto", R.string.NotificationMessageGroupPhoto, name, chat.title);
} else if (messageObject.messageOwner.media instanceof TLRPC.TL_messageMediaVideo) {
} else if (messageObject.isVideo()) {
msg = LocaleController.formatString("NotificationMessageGroupVideo", R.string.NotificationMessageGroupVideo, name, chat.title);
} else if (messageObject.isVoice()) {
msg = LocaleController.formatString("NotificationMessageGroupAudio", R.string.NotificationMessageGroupAudio, name, chat.title);
} else if (messageObject.messageOwner.media instanceof TLRPC.TL_messageMediaContact) {
msg = LocaleController.formatString("NotificationMessageGroupContact", R.string.NotificationMessageGroupContact, name, chat.title);
} else if (messageObject.messageOwner.media instanceof TLRPC.TL_messageMediaGeo || messageObject.messageOwner.media instanceof TLRPC.TL_messageMediaVenue) {
@ -924,13 +932,15 @@ public class NotificationsController {
} else {
msg = LocaleController.formatString("NotificationMessageGroupDocument", R.string.NotificationMessageGroupDocument, name, chat.title);
}
} else if (messageObject.messageOwner.media instanceof TLRPC.TL_messageMediaAudio) {
msg = LocaleController.formatString("NotificationMessageGroupAudio", R.string.NotificationMessageGroupAudio, name, chat.title);
}
}
}
} else {
msg = LocaleController.formatString("NotificationMessageGroupNoText", R.string.NotificationMessageGroupNoText, name, chat.title);
if (ChatObject.isChannel(chat) && !chat.megagroup) {
msg = LocaleController.formatString("ChannelMessageNoText", R.string.ChannelMessageNoText, name, chat.title);
} else {
msg = LocaleController.formatString("NotificationMessageGroupNoText", R.string.NotificationMessageGroupNoText, name, chat.title);
}
}
}
}
@ -1012,8 +1022,45 @@ public class NotificationsController {
}
}
/*public void playRecordSound() {
try {
if (audioManager.getRingerMode() == AudioManager.RINGER_MODE_SILENT) {
return;
}
notificationsQueue.postRunnable(new Runnable() {
@Override
public void run() {
try {
if (soundPool == null) {
soundPool = new SoundPool(3, AudioManager.STREAM_SYSTEM, 0);
soundPool.setOnLoadCompleteListener(new SoundPool.OnLoadCompleteListener() {
@Override
public void onLoadComplete(SoundPool soundPool, int sampleId, int status) {
if (status == 0) {
soundPool.play(sampleId, 1.0f, 1.0f, 1, 0, 1.0f);
}
}
});
}
if (soundRecord == 0 && !soundRecordLoaded) {
soundRecordLoaded = true;
soundRecord = soundPool.load(ApplicationLoader.applicationContext, R.raw.sound_record, 1);
}
if (soundRecord != 0) {
soundPool.play(soundRecord, 1.0f, 1.0f, 1, 0, 1.0f);
}
} catch (Exception e) {
FileLog.e("tmessages", e);
}
}
});
} catch (Exception e) {
FileLog.e("tmessages", e);
}
}*/
private void playInChatSound() {
if (!inChatSoundEnabled) {
if (!inChatSoundEnabled || MediaController.getInstance().isRecordingAudio()) {
return;
}
try {
@ -1038,7 +1085,7 @@ public class NotificationsController {
}
try {
if (soundPool == null) {
soundPool = new SoundPool(2, AudioManager.STREAM_SYSTEM, 0);
soundPool = new SoundPool(3, AudioManager.STREAM_SYSTEM, 0);
soundPool.setOnLoadCompleteListener(new SoundPool.OnLoadCompleteListener() {
@Override
public void onLoadComplete(SoundPool soundPool, int sampleId, int status) {
@ -1298,26 +1345,17 @@ public class NotificationsController {
.setGroupSummary(true)
.setColor(0xff2ca5e0);
if (!notifyAboutLast) {
mBuilder.setPriority(NotificationCompat.PRIORITY_LOW);
} else {
if (priority == 0) {
mBuilder.setPriority(NotificationCompat.PRIORITY_DEFAULT);
} else if (priority == 1) {
mBuilder.setPriority(NotificationCompat.PRIORITY_HIGH);
} else if (priority == 2) {
mBuilder.setPriority(NotificationCompat.PRIORITY_MAX);
}
}
mBuilder.setCategory(NotificationCompat.CATEGORY_MESSAGE);
if (chat == null && user != null && user.phone != null && user.phone.length() > 0) {
mBuilder.addPerson("tel:+" + user.phone);
}
int silent = 2;
String lastMessage = null;
if (pushMessages.size() == 1) {
String message = lastMessage = getStringForMessage(pushMessages.get(0), false);
MessageObject messageObject = pushMessages.get(0);
String message = lastMessage = getStringForMessage(messageObject, false);
silent = messageObject.messageOwner.silent ? 1 : 0;
if (message == null) {
return;
}
@ -1336,12 +1374,14 @@ public class NotificationsController {
inboxStyle.setBigContentTitle(name);
int count = Math.min(10, pushMessages.size());
for (int i = 0; i < count; i++) {
String message = getStringForMessage(pushMessages.get(i), false);
MessageObject messageObject = pushMessages.get(i);
String message = getStringForMessage(messageObject, false);
if (message == null) {
continue;
}
if (i == 0) {
if (silent == 2) {
lastMessage = message;
silent = messageObject.messageOwner.silent ? 1 : 0;
}
if (pushDialogs.size() == 1) {
if (replace) {
@ -1365,29 +1405,44 @@ public class NotificationsController {
}
}
if (!notifyDisabled) {
if (silent == 1) {
FileLog.e("tmessages", "don't notify " + lastMessage);
} else {
FileLog.e("tmessages", "notify" + lastMessage);
}
if (!notifyAboutLast || silent == 1) {
mBuilder.setPriority(NotificationCompat.PRIORITY_LOW);
} else {
if (priority == 0) {
mBuilder.setPriority(NotificationCompat.PRIORITY_DEFAULT);
} else if (priority == 1) {
mBuilder.setPriority(NotificationCompat.PRIORITY_HIGH);
} else if (priority == 2) {
mBuilder.setPriority(NotificationCompat.PRIORITY_MAX);
}
}
if (silent != 1 && !notifyDisabled) {
if (ApplicationLoader.mainInterfacePaused || inAppPreview) {
if (lastMessage.length() > 100) {
lastMessage = lastMessage.substring(0, 100).replace("\n", " ").trim() + "...";
}
mBuilder.setTicker(lastMessage);
}
if (choosenSoundPath != null && !choosenSoundPath.equals("NoSound")) {
if (choosenSoundPath.equals(defaultPath)) {
/*MediaPlayer mediaPlayer = new MediaPlayer();
mediaPlayer.setAudioStreamType(AudioManager.STREAM_ALARM);
mediaPlayer.setDataSource(ApplicationLoader.applicationContext, Settings.System.DEFAULT_NOTIFICATION_URI);
mediaPlayer.prepare();
mediaPlayer.start();*/
mBuilder.setSound(Settings.System.DEFAULT_NOTIFICATION_URI, AudioManager.STREAM_NOTIFICATION);
} else {
mBuilder.setSound(Uri.parse(choosenSoundPath), AudioManager.STREAM_NOTIFICATION);
if (!MediaController.getInstance().isRecordingAudio()) {
if (choosenSoundPath != null && !choosenSoundPath.equals("NoSound")) {
if (choosenSoundPath.equals(defaultPath)) {
mBuilder.setSound(Settings.System.DEFAULT_NOTIFICATION_URI, AudioManager.STREAM_NOTIFICATION);
} else {
mBuilder.setSound(Uri.parse(choosenSoundPath), AudioManager.STREAM_NOTIFICATION);
}
}
}
if (ledColor != 0) {
mBuilder.setLights(ledColor, 1000, 1000);
}
if (needVibrate == 2) {
if (needVibrate == 2 || MediaController.getInstance().isRecordingAudio()) {
mBuilder.setVibrate(new long[]{0, 0});
} else if (needVibrate == 1) {
mBuilder.setVibrate(new long[]{0, 100, 0, 100});
@ -1597,7 +1652,7 @@ public class NotificationsController {
}
public void playOutChatSound() {
if (!inChatSoundEnabled) {
if (!inChatSoundEnabled || MediaController.getInstance().isRecordingAudio()) {
return;
}
try {
@ -1616,7 +1671,7 @@ public class NotificationsController {
}
lastSoundOutPlay = System.currentTimeMillis();
if (soundPool == null) {
soundPool = new SoundPool(2, AudioManager.STREAM_SYSTEM, 0);
soundPool = new SoundPool(3, AudioManager.STREAM_SYSTEM, 0);
soundPool.setOnLoadCompleteListener(new SoundPool.OnLoadCompleteListener() {
@Override
public void onLoadComplete(SoundPool soundPool, int sampleId, int status) {
@ -1642,14 +1697,13 @@ public class NotificationsController {
public static void updateServerNotificationsSettings(long dialog_id) {
NotificationCenter.getInstance().postNotificationName(NotificationCenter.notificationsSettingsUpdated);
if ((int)dialog_id == 0) {
if ((int) dialog_id == 0) {
return;
}
SharedPreferences preferences = ApplicationLoader.applicationContext.getSharedPreferences("Notifications", Activity.MODE_PRIVATE);
TLRPC.TL_account_updateNotifySettings req = new TLRPC.TL_account_updateNotifySettings();
req.settings = new TLRPC.TL_inputPeerNotifySettings();
req.settings.sound = "default";
req.settings.events_mask = 0;
int mute_type = preferences.getInt("notify2_" + dialog_id, 0);
if (mute_type == 3) {
req.settings.mute_until = preferences.getInt("notifyuntil_" + dialog_id, 0);
@ -1657,14 +1711,9 @@ public class NotificationsController {
req.settings.mute_until = mute_type != 2 ? 0 : Integer.MAX_VALUE;
}
req.settings.show_previews = preferences.getBoolean("preview_" + dialog_id, true);
req.settings.silent = preferences.getBoolean("silent_" + dialog_id, false);
req.peer = new TLRPC.TL_inputNotifyPeer();
((TLRPC.TL_inputNotifyPeer)req.peer).peer = MessagesController.getInputPeer((int) dialog_id);
if (((TLRPC.TL_inputNotifyPeer)req.peer).peer == null) {
return;
}
((TLRPC.TL_inputNotifyPeer) req.peer).peer = MessagesController.getInputPeer((int) dialog_id);
ConnectionsManager.getInstance().sendRequest(req, new RequestDelegate() {
@Override
public void run(TLObject response, TLRPC.TL_error error) {

View File

@ -39,7 +39,7 @@ public class UserConfig {
public static int lastPauseTime = 0;
public static boolean isWaitingForPasscodeEnter = false;
public static boolean useFingerprint = true;
public static int lastUpdateVersion;
public static String lastUpdateVersion;
public static int lastContactsSyncTime;
public static int migrateOffsetId = -1;
@ -83,7 +83,7 @@ public class UserConfig {
editor.putInt("passcodeType", passcodeType);
editor.putInt("autoLockIn", autoLockIn);
editor.putInt("lastPauseTime", lastPauseTime);
editor.putInt("lastUpdateVersion", lastUpdateVersion);
editor.putString("lastUpdateVersion2", lastUpdateVersion);
editor.putInt("lastContactsSyncTime", lastContactsSyncTime);
editor.putBoolean("useFingerprint", useFingerprint);
@ -224,7 +224,7 @@ public class UserConfig {
autoLockIn = preferences.getInt("autoLockIn", 60 * 60);
lastPauseTime = preferences.getInt("lastPauseTime", 0);
useFingerprint = preferences.getBoolean("useFingerprint", true);
lastUpdateVersion = preferences.getInt("lastUpdateVersion", 511);
lastUpdateVersion = preferences.getString("lastUpdateVersion2", "3.5");
lastContactsSyncTime = preferences.getInt("lastContactsSyncTime", (int) (System.currentTimeMillis() / 1000) - 23 * 60 * 60);
migrateOffsetId = preferences.getInt("migrateOffsetId", 0);
@ -314,7 +314,7 @@ public class UserConfig {
lastPauseTime = 0;
useFingerprint = true;
isWaitingForPasscodeEnter = false;
lastUpdateVersion = BuildVars.BUILD_VERSION;
lastUpdateVersion = BuildVars.BUILD_VERSION_STRING;
lastContactsSyncTime = (int) (System.currentTimeMillis() / 1000) - 23 * 60 * 60;
saveConfig(true);
}

View File

@ -53,6 +53,7 @@ public class Utilities {
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 native static String readlink(String path);
public static void aesIgeEncryption(ByteBuffer buffer, byte[] key, byte[] iv, boolean encrypt, boolean changeIv, int offset, int length) {
aesIgeEncryption(buffer, key, changeIv ? iv : iv.clone(), encrypt, offset, length);

View File

@ -156,7 +156,7 @@ public class ID3v2Info extends AudioInfo {
smallCover = cover;
}
}
} catch (Exception e) {
} catch (Throwable e) {
e.printStackTrace();
}
coverPictureType = picture.type;

View File

@ -60,6 +60,9 @@ public class MessagesSearchQuery {
lastReturnedNum--;
return;
}
if (searchResultMessages.isEmpty()) {
return;
}
query = lastSearchQuery;
MessageObject messageObject = searchResultMessages.get(searchResultMessages.size() - 1);
if (messageObject.getDialogId() == dialog_id && !messagesSearchEndReached[0]) {

View File

@ -32,111 +32,188 @@ import java.util.Locale;
public class ReplyMessageQuery {
public static void loadReplyMessagesForMessages(final ArrayList<MessageObject> messages, final long dialog_id) {
final ArrayList<Integer> replyMessages = new ArrayList<>();
final HashMap<Integer, ArrayList<MessageObject>> replyMessageOwners = new HashMap<>();
final StringBuilder stringBuilder = new StringBuilder();
int channelId = 0;
for (MessageObject messageObject : messages) {
if (messageObject.getId() > 0 && messageObject.isReply() && messageObject.replyMessageObject == null) {
Integer id = messageObject.messageOwner.reply_to_msg_id;
long messageId = id;
if (messageObject.messageOwner.to_id.channel_id != 0) {
messageId |= ((long) messageObject.messageOwner.to_id.channel_id) << 32;
channelId = messageObject.messageOwner.to_id.channel_id;
}
if (stringBuilder.length() > 0) {
stringBuilder.append(',');
}
stringBuilder.append(messageId);
ArrayList<MessageObject> messageObjects = replyMessageOwners.get(id);
if (messageObjects == null) {
messageObjects = new ArrayList<>();
replyMessageOwners.put(id, messageObjects);
}
messageObjects.add(messageObject);
if (!replyMessages.contains(id)) {
replyMessages.add(id);
if ((int) dialog_id == 0) {
final ArrayList<Long> replyMessages = new ArrayList<>();
final HashMap<Long, ArrayList<MessageObject>> replyMessageRandomOwners = new HashMap<>();
final StringBuilder stringBuilder = new StringBuilder();
for (int a = 0; a < messages.size(); a++) {
MessageObject messageObject = messages.get(a);
if (messageObject.isReply() && messageObject.replyMessageObject == null) {
Long id = messageObject.messageOwner.reply_to_random_id;
if (stringBuilder.length() > 0) {
stringBuilder.append(',');
}
stringBuilder.append(id);
ArrayList<MessageObject> messageObjects = replyMessageRandomOwners.get(id);
if (messageObjects == null) {
messageObjects = new ArrayList<>();
replyMessageRandomOwners.put(id, messageObjects);
}
messageObjects.add(messageObject);
if (!replyMessages.contains(id)) {
replyMessages.add(id);
}
}
}
}
if (replyMessages.isEmpty()) {
return;
}
if (replyMessages.isEmpty()) {
return;
}
final int channelIdFinal = channelId;
MessagesStorage.getInstance().getStorageQueue().postRunnable(new Runnable() {
@Override
public void run() {
try {
final ArrayList<TLRPC.Message> result = new ArrayList<>();
final ArrayList<TLRPC.User> users = new ArrayList<>();
final ArrayList<TLRPC.Chat> chats = new ArrayList<>();
ArrayList<Integer> usersToLoad = new ArrayList<>();
ArrayList<Integer> chatsToLoad = new ArrayList<>();
MessagesStorage.getInstance().getStorageQueue().postRunnable(new Runnable() {
@Override
public void run() {
try {
SQLiteCursor cursor = MessagesStorage.getInstance().getDatabase().queryFinalized(String.format(Locale.US, "SELECT m.data, m.mid, m.date, r.random_id FROM randoms as r INNER JOIN messages as m ON r.mid = m.mid WHERE r.random_id IN(%s)", TextUtils.join(",", replyMessages)));
while (cursor.next()) {
NativeByteBuffer data = new NativeByteBuffer(cursor.byteArrayLength(0));
if (data != null && cursor.byteBufferValue(0, data) != 0) {
TLRPC.Message message = TLRPC.Message.TLdeserialize(data, data.readInt32(false), false);
message.id = cursor.intValue(1);
message.date = cursor.intValue(2);
message.dialog_id = dialog_id;
SQLiteCursor cursor = MessagesStorage.getInstance().getDatabase().queryFinalized(String.format(Locale.US, "SELECT data, mid, date FROM messages WHERE mid IN(%s)", stringBuilder.toString()));
while (cursor.next()) {
NativeByteBuffer data = new NativeByteBuffer(cursor.byteArrayLength(0));
if (data != null && cursor.byteBufferValue(0, data) != 0) {
TLRPC.Message message = TLRPC.Message.TLdeserialize(data, data.readInt32(false), false);
message.id = cursor.intValue(1);
message.date = cursor.intValue(2);
message.dialog_id = dialog_id;
MessagesStorage.addUsersAndChatsFromMessage(message, usersToLoad, chatsToLoad);
result.add(message);
replyMessages.remove((Integer) message.id);
}
data.reuse();
}
cursor.dispose();
if (!usersToLoad.isEmpty()) {
MessagesStorage.getInstance().getUsersInternal(TextUtils.join(",", usersToLoad), users);
}
if (!chatsToLoad.isEmpty()) {
MessagesStorage.getInstance().getChatsInternal(TextUtils.join(",", chatsToLoad), chats);
}
broadcastReplyMessages(result, replyMessageOwners, users, chats, dialog_id, true);
if (!replyMessages.isEmpty()) {
if (channelIdFinal != 0) {
final TLRPC.TL_channels_getMessages req = new TLRPC.TL_channels_getMessages();
req.channel = MessagesController.getInputChannel(channelIdFinal);
req.id = replyMessages;
ConnectionsManager.getInstance().sendRequest(req, new RequestDelegate() {
@Override
public void run(TLObject response, TLRPC.TL_error error) {
if (error == null) {
TLRPC.messages_Messages messagesRes = (TLRPC.messages_Messages) response;
ImageLoader.saveMessagesThumbs(messagesRes.messages);
broadcastReplyMessages(messagesRes.messages, replyMessageOwners, messagesRes.users, messagesRes.chats, dialog_id, false);
MessagesStorage.getInstance().putUsersAndChats(messagesRes.users, messagesRes.chats, true, true);
saveReplyMessages(replyMessageOwners, messagesRes.messages);
ArrayList<MessageObject> arrayList = replyMessageRandomOwners.remove(cursor.longValue(3));
if (arrayList != null) {
MessageObject messageObject = new MessageObject(message, null, null, false);
for (int b = 0; b < arrayList.size(); b++) {
MessageObject object = arrayList.get(b);
object.replyMessageObject = messageObject;
object.messageOwner.reply_to_msg_id = messageObject.getId();
}
}
});
} else {
TLRPC.TL_messages_getMessages req = new TLRPC.TL_messages_getMessages();
req.id = replyMessages;
ConnectionsManager.getInstance().sendRequest(req, new RequestDelegate() {
@Override
public void run(TLObject response, TLRPC.TL_error error) {
if (error == null) {
TLRPC.messages_Messages messagesRes = (TLRPC.messages_Messages) response;
ImageLoader.saveMessagesThumbs(messagesRes.messages);
broadcastReplyMessages(messagesRes.messages, replyMessageOwners, messagesRes.users, messagesRes.chats, dialog_id, false);
MessagesStorage.getInstance().putUsersAndChats(messagesRes.users, messagesRes.chats, true, true);
saveReplyMessages(replyMessageOwners, messagesRes.messages);
}
}
});
}
data.reuse();
}
cursor.dispose();
if (!replyMessageRandomOwners.isEmpty()) {
for (HashMap.Entry<Long, ArrayList<MessageObject>> entry : replyMessageRandomOwners.entrySet()) {
ArrayList<MessageObject> arrayList = entry.getValue();
for (int a = 0; a < arrayList.size(); a++) {
arrayList.get(a).messageOwner.reply_to_random_id = 0;
}
}
}
AndroidUtilities.runOnUIThread(new Runnable() {
@Override
public void run() {
NotificationCenter.getInstance().postNotificationName(NotificationCenter.didLoadedReplyMessages, dialog_id);
}
});
} catch (Exception e) {
FileLog.e("tmessages", e);
}
}
});
} else {
final ArrayList<Integer> replyMessages = new ArrayList<>();
final HashMap<Integer, ArrayList<MessageObject>> replyMessageOwners = new HashMap<>();
final StringBuilder stringBuilder = new StringBuilder();
int channelId = 0;
for (int a = 0; a < messages.size(); a++) {
MessageObject messageObject = messages.get(a);
if (messageObject.getId() > 0 && messageObject.isReply() && messageObject.replyMessageObject == null) {
Integer id = messageObject.messageOwner.reply_to_msg_id;
long messageId = id;
if (messageObject.messageOwner.to_id.channel_id != 0) {
messageId |= ((long) messageObject.messageOwner.to_id.channel_id) << 32;
channelId = messageObject.messageOwner.to_id.channel_id;
}
if (stringBuilder.length() > 0) {
stringBuilder.append(',');
}
stringBuilder.append(messageId);
ArrayList<MessageObject> messageObjects = replyMessageOwners.get(id);
if (messageObjects == null) {
messageObjects = new ArrayList<>();
replyMessageOwners.put(id, messageObjects);
}
messageObjects.add(messageObject);
if (!replyMessages.contains(id)) {
replyMessages.add(id);
}
} catch (Exception e) {
FileLog.e("tmessages", e);
}
}
});
if (replyMessages.isEmpty()) {
return;
}
final int channelIdFinal = channelId;
MessagesStorage.getInstance().getStorageQueue().postRunnable(new Runnable() {
@Override
public void run() {
try {
final ArrayList<TLRPC.Message> result = new ArrayList<>();
final ArrayList<TLRPC.User> users = new ArrayList<>();
final ArrayList<TLRPC.Chat> chats = new ArrayList<>();
ArrayList<Integer> usersToLoad = new ArrayList<>();
ArrayList<Integer> chatsToLoad = new ArrayList<>();
SQLiteCursor cursor = MessagesStorage.getInstance().getDatabase().queryFinalized(String.format(Locale.US, "SELECT data, mid, date FROM messages WHERE mid IN(%s)", stringBuilder.toString()));
while (cursor.next()) {
NativeByteBuffer data = new NativeByteBuffer(cursor.byteArrayLength(0));
if (data != null && cursor.byteBufferValue(0, data) != 0) {
TLRPC.Message message = TLRPC.Message.TLdeserialize(data, data.readInt32(false), false);
message.id = cursor.intValue(1);
message.date = cursor.intValue(2);
message.dialog_id = dialog_id;
MessagesStorage.addUsersAndChatsFromMessage(message, usersToLoad, chatsToLoad);
result.add(message);
replyMessages.remove((Integer) message.id);
}
data.reuse();
}
cursor.dispose();
if (!usersToLoad.isEmpty()) {
MessagesStorage.getInstance().getUsersInternal(TextUtils.join(",", usersToLoad), users);
}
if (!chatsToLoad.isEmpty()) {
MessagesStorage.getInstance().getChatsInternal(TextUtils.join(",", chatsToLoad), chats);
}
broadcastReplyMessages(result, replyMessageOwners, users, chats, dialog_id, true);
if (!replyMessages.isEmpty()) {
if (channelIdFinal != 0) {
final TLRPC.TL_channels_getMessages req = new TLRPC.TL_channels_getMessages();
req.channel = MessagesController.getInputChannel(channelIdFinal);
req.id = replyMessages;
ConnectionsManager.getInstance().sendRequest(req, new RequestDelegate() {
@Override
public void run(TLObject response, TLRPC.TL_error error) {
if (error == null) {
TLRPC.messages_Messages messagesRes = (TLRPC.messages_Messages) response;
ImageLoader.saveMessagesThumbs(messagesRes.messages);
broadcastReplyMessages(messagesRes.messages, replyMessageOwners, messagesRes.users, messagesRes.chats, dialog_id, false);
MessagesStorage.getInstance().putUsersAndChats(messagesRes.users, messagesRes.chats, true, true);
saveReplyMessages(replyMessageOwners, messagesRes.messages);
}
}
});
} else {
TLRPC.TL_messages_getMessages req = new TLRPC.TL_messages_getMessages();
req.id = replyMessages;
ConnectionsManager.getInstance().sendRequest(req, new RequestDelegate() {
@Override
public void run(TLObject response, TLRPC.TL_error error) {
if (error == null) {
TLRPC.messages_Messages messagesRes = (TLRPC.messages_Messages) response;
ImageLoader.saveMessagesThumbs(messagesRes.messages);
broadcastReplyMessages(messagesRes.messages, replyMessageOwners, messagesRes.users, messagesRes.chats, dialog_id, false);
MessagesStorage.getInstance().putUsersAndChats(messagesRes.users, messagesRes.chats, true, true);
saveReplyMessages(replyMessageOwners, messagesRes.messages);
}
}
});
}
}
} catch (Exception e) {
FileLog.e("tmessages", e);
}
}
});
}
}
private static void saveReplyMessages(final HashMap<Integer, ArrayList<MessageObject>> replyMessageOwners, final ArrayList<TLRPC.Message> result) {

View File

@ -56,11 +56,11 @@ public class SharedMediaQuery {
} else if (type == MEDIA_FILE) {
req.filter = new TLRPC.TL_inputMessagesFilterDocument();
} else if (type == MEDIA_AUDIO) {
req.filter = new TLRPC.TL_inputMessagesFilterAudio();
req.filter = new TLRPC.TL_inputMessagesFilterVoice();
} else if (type == MEDIA_URL) {
req.filter = new TLRPC.TL_inputMessagesFilterUrl();
} else if (type == MEDIA_MUSIC) {
req.filter = new TLRPC.TL_inputMessagesFilterAudioDocuments();
req.filter = new TLRPC.TL_inputMessagesFilterMusic();
}
req.q = "";
req.peer = MessagesController.getInputPeer(lower_part);
@ -101,11 +101,11 @@ public class SharedMediaQuery {
} else if (type == MEDIA_FILE) {
req.filter = new TLRPC.TL_inputMessagesFilterDocument();
} else if (type == MEDIA_AUDIO) {
req.filter = new TLRPC.TL_inputMessagesFilterAudio();
req.filter = new TLRPC.TL_inputMessagesFilterVoice();
} else if (type == MEDIA_URL) {
req.filter = new TLRPC.TL_inputMessagesFilterUrl();
} else if (type == MEDIA_MUSIC) {
req.filter = new TLRPC.TL_inputMessagesFilterAudioDocuments();
req.filter = new TLRPC.TL_inputMessagesFilterMusic();
}
req.q = "";
req.peer = MessagesController.getInputPeer(lower_part);
@ -144,8 +144,10 @@ public class SharedMediaQuery {
if (message == null) {
return -1;
}
if (message.media instanceof TLRPC.TL_messageMediaPhoto || message.media instanceof TLRPC.TL_messageMediaVideo) {
if (message.media instanceof TLRPC.TL_messageMediaPhoto || MessageObject.isVideoMessage(message)) {
return MEDIA_PHOTOVIDEO;
} else if (MessageObject.isVoiceMessage(message)) {
return MEDIA_AUDIO;
} else if (message.media instanceof TLRPC.TL_messageMediaDocument) {
if (MessageObject.isStickerMessage(message)) {
return -1;
@ -154,8 +156,6 @@ public class SharedMediaQuery {
} else {
return MEDIA_FILE;
}
} else if (message.media instanceof TLRPC.TL_messageMediaAudio) {
return MEDIA_AUDIO;
} else if (!message.entities.isEmpty()) {
for (int a = 0; a < message.entities.size(); a++) {
TLRPC.MessageEntity entity = message.entities.get(a);
@ -171,9 +171,7 @@ public class SharedMediaQuery {
if (message instanceof TLRPC.TL_message_secret && message.media instanceof TLRPC.TL_messageMediaPhoto && message.ttl != 0 && message.ttl <= 60) {
return false;
} else if (message.media instanceof TLRPC.TL_messageMediaPhoto ||
message.media instanceof TLRPC.TL_messageMediaVideo ||
message.media instanceof TLRPC.TL_messageMediaDocument && !MessageObject.isGifDocument(message.media.document) ||
message.media instanceof TLRPC.TL_messageMediaAudio) {
message.media instanceof TLRPC.TL_messageMediaDocument && !MessageObject.isGifDocument(message.media.document)) {
return true;
} else if (!message.entities.isEmpty()) {
for (int a = 0; a < message.entities.size(); a++) {

View File

@ -43,6 +43,7 @@ public class StickersQuery {
private static int loadDate;
private static ArrayList<TLRPC.TL_messages_stickerSet> stickerSets = new ArrayList<>();
private static HashMap<Long, TLRPC.TL_messages_stickerSet> stickerSetsById = new HashMap<>();
private static HashMap<String, TLRPC.TL_messages_stickerSet> stickerSetsByName = new HashMap<>();
private static HashMap<Long, String> stickersByEmoji = new HashMap<>();
private static HashMap<Long, TLRPC.Document> stickersById = new HashMap<>();
private static HashMap<String, ArrayList<TLRPC.Document>> allStickers = new HashMap<>();
@ -57,6 +58,7 @@ public class StickersQuery {
stickerSets.clear();
stickersByEmoji.clear();
stickerSetsById.clear();
stickerSetsByName.clear();
loadingStickers = false;
stickersLoaded = false;
}
@ -95,6 +97,10 @@ public class StickersQuery {
return stickerSetsById.containsKey(id);
}
public static boolean isStickerPackInstalled(String name) {
return stickerSetsByName.containsKey(name);
}
public static String getEmojiForSticker(long id) {
String value = stickersByEmoji.get(id);
return value != null ? value : "";
@ -124,32 +130,34 @@ public class StickersQuery {
}
public static void addNewStickerSet(final TLRPC.TL_messages_stickerSet set) {
if (!stickerSetsById.containsKey(set.set.id)) {
stickerSets.add(0, set);
stickerSetsById.put(set.set.id, set);
for (int a = 0; a < set.documents.size(); a++) {
TLRPC.Document document = set.documents.get(a);
stickersById.put(document.id, document);
}
for (int a = 0; a < set.packs.size(); a++) {
TLRPC.TL_stickerPack stickerPack = set.packs.get(a);
stickerPack.emoticon = stickerPack.emoticon.replace("\uFE0F", "");
ArrayList<TLRPC.Document> arrayList = allStickers.get(stickerPack.emoticon);
if (arrayList == null) {
arrayList = new ArrayList<>();
allStickers.put(stickerPack.emoticon, arrayList);
}
for (int c = 0; c < stickerPack.documents.size(); c++) {
Long id = stickerPack.documents.get(c);
if (!stickersByEmoji.containsKey(id)) {
stickersByEmoji.put(id, stickerPack.emoticon);
}
arrayList.add(stickersById.get(id));
}
}
loadHash = calcStickersHash(stickerSets);
NotificationCenter.getInstance().postNotificationName(NotificationCenter.stickersDidLoaded);
if (stickerSetsById.containsKey(set.set.id) || stickerSetsByName.containsKey(set.set.short_name)) {
return;
}
stickerSets.add(0, set);
stickerSetsById.put(set.set.id, set);
stickerSetsByName.put(set.set.short_name, set);
for (int a = 0; a < set.documents.size(); a++) {
TLRPC.Document document = set.documents.get(a);
stickersById.put(document.id, document);
}
for (int a = 0; a < set.packs.size(); a++) {
TLRPC.TL_stickerPack stickerPack = set.packs.get(a);
stickerPack.emoticon = stickerPack.emoticon.replace("\uFE0F", "");
ArrayList<TLRPC.Document> arrayList = allStickers.get(stickerPack.emoticon);
if (arrayList == null) {
arrayList = new ArrayList<>();
allStickers.put(stickerPack.emoticon, arrayList);
}
for (int c = 0; c < stickerPack.documents.size(); c++) {
Long id = stickerPack.documents.get(c);
if (!stickersByEmoji.containsKey(id)) {
stickersByEmoji.put(id, stickerPack.emoticon);
}
arrayList.add(stickersById.get(id));
}
}
loadHash = calcStickersHash(stickerSets);
NotificationCenter.getInstance().postNotificationName(NotificationCenter.stickersDidLoaded);
StickersQuery.loadStickers(false, true);
}
@ -258,22 +266,23 @@ public class StickersQuery {
}
}
private static void putStickersToCache(final ArrayList<TLRPC.TL_messages_stickerSet> stickers, final int date, final int hash) {
private static void putStickersToCache(ArrayList<TLRPC.TL_messages_stickerSet> stickers, final int date, final int hash) {
final ArrayList<TLRPC.TL_messages_stickerSet> stickersFinal = stickers != null ? new ArrayList<>(stickers) : null;
MessagesStorage.getInstance().getStorageQueue().postRunnable(new Runnable() {
@Override
public void run() {
try {
if (stickers != null) {
if (stickersFinal != null) {
SQLitePreparedStatement state = MessagesStorage.getInstance().getDatabase().executeFast("REPLACE INTO stickers_v2 VALUES(?, ?, ?, ?)");
state.requery();
int size = 4;
for (int a = 0; a < stickers.size(); a++) {
size += stickers.get(a).getObjectSize();
for (int a = 0; a < stickersFinal.size(); a++) {
size += stickersFinal.get(a).getObjectSize();
}
NativeByteBuffer data = new NativeByteBuffer(size);
data.writeInt32(stickers.size());
for (int a = 0; a < stickers.size(); a++) {
stickers.get(a).serializeToStream(data);
data.writeInt32(stickersFinal.size());
for (int a = 0; a < stickersFinal.size(); a++) {
stickersFinal.get(a).serializeToStream(data);
}
state.bindInteger(1, 1);
state.bindByteBuffer(2, data);
@ -296,6 +305,11 @@ public class StickersQuery {
});
}
public static String getStickerSetName(long setId) {
TLRPC.TL_messages_stickerSet stickerSet = stickerSetsById.get(setId);
return stickerSet != null ? stickerSet.set.short_name : null;
}
public static long getStickerSetId(TLRPC.Document document) {
for (int a = 0; a < document.attributes.size(); a++) {
TLRPC.DocumentAttribute attribute = document.attributes.get(a);
@ -350,6 +364,7 @@ public class StickersQuery {
try {
final ArrayList<TLRPC.TL_messages_stickerSet> stickerSetsNew = new ArrayList<>();
final HashMap<Long, TLRPC.TL_messages_stickerSet> stickerSetsByIdNew = new HashMap<>();
final HashMap<String, TLRPC.TL_messages_stickerSet> stickerSetsByNameNew = new HashMap<>();
final HashMap<Long, String> stickersByEmojiNew = new HashMap<>();
final HashMap<Long, TLRPC.Document> stickersByIdNew = new HashMap<>();
final HashMap<String, ArrayList<TLRPC.Document>> allStickersNew = new HashMap<>();
@ -361,6 +376,7 @@ public class StickersQuery {
}
stickerSetsNew.add(stickerSet);
stickerSetsByIdNew.put(stickerSet.set.id, stickerSet);
stickerSetsByNameNew.put(stickerSet.set.short_name, stickerSet);
for (int b = 0; b < stickerSet.documents.size(); b++) {
TLRPC.Document document = stickerSet.documents.get(b);
@ -400,6 +416,7 @@ public class StickersQuery {
public void run() {
stickersById = stickersByIdNew;
stickerSetsById = stickerSetsByIdNew;
stickerSetsByName = stickerSetsByNameNew;
stickerSets = stickerSetsNew;
allStickers = allStickersNew;
stickersByEmoji = stickersByEmojiNew;
@ -469,7 +486,11 @@ public class StickersQuery {
if (error == null) {
Toast.makeText(fragment.getParentActivity(), LocaleController.getString("AddStickersInstalled", R.string.AddStickersInstalled), Toast.LENGTH_SHORT).show();
} else {
Toast.makeText(fragment.getParentActivity(), LocaleController.getString("ErrorOccurred", R.string.ErrorOccurred), Toast.LENGTH_SHORT).show();
if (error.text.equals("STICKERSETS_TOO_MUCH")) {
Toast.makeText(fragment.getParentActivity(), LocaleController.getString("TooMuchStickersets", R.string.TooMuchStickersets), Toast.LENGTH_SHORT).show();
} else {
Toast.makeText(fragment.getParentActivity(), LocaleController.getString("ErrorOccurred", R.string.ErrorOccurred), Toast.LENGTH_SHORT).show();
}
}
}
loadStickers(false, true);
@ -539,6 +560,7 @@ public class StickersQuery {
}
}
loadHash = calcStickersHash(stickerSets);
putStickersToCache(stickerSets, loadDate, loadHash);
NotificationCenter.getInstance().postNotificationName(NotificationCenter.stickersDidLoaded);
TLRPC.TL_messages_installStickerSet req = new TLRPC.TL_messages_installStickerSet();
req.stickerset = stickerSetID;

View File

@ -120,42 +120,46 @@ public class ConnectionsManager {
@Override
public void run() {
FileLog.d("tmessages", "send request " + object + " with token = " + requestToken);
NativeByteBuffer buffer = new NativeByteBuffer(object.getObjectSize());
object.serializeToStream(buffer);
object.freeResources();
try {
NativeByteBuffer buffer = new NativeByteBuffer(object.getObjectSize());
object.serializeToStream(buffer);
object.freeResources();
native_sendRequest(buffer.address, new RequestDelegateInternal() {
@Override
public void run(int response, int errorCode, String errorText) {
try {
TLObject resp = null;
TLRPC.TL_error error = null;
if (response != 0) {
NativeByteBuffer buff = NativeByteBuffer.wrap(response);
resp = object.deserializeResponse(buff, buff.readInt32(true), true);
} else if (errorText != null) {
error = new TLRPC.TL_error();
error.code = errorCode;
error.text = errorText;
FileLog.e("tmessages", object + " got error " + error.code + " " + error.text);
}
FileLog.d("tmessages", "java received " + resp + " error = " + error);
final TLObject finalResponse = resp;
final TLRPC.TL_error finalError = error;
Utilities.stageQueue.postRunnable(new Runnable() {
@Override
public void run() {
onComplete.run(finalResponse, finalError);
if (finalResponse != null) {
finalResponse.freeResources();
}
native_sendRequest(buffer.address, new RequestDelegateInternal() {
@Override
public void run(int response, int errorCode, String errorText) {
try {
TLObject resp = null;
TLRPC.TL_error error = null;
if (response != 0) {
NativeByteBuffer buff = NativeByteBuffer.wrap(response);
resp = object.deserializeResponse(buff, buff.readInt32(true), true);
} else if (errorText != null) {
error = new TLRPC.TL_error();
error.code = errorCode;
error.text = errorText;
FileLog.e("tmessages", object + " got error " + error.code + " " + error.text);
}
});
} catch (Exception e) {
FileLog.e("tmessages", e);
FileLog.d("tmessages", "java received " + resp + " error = " + error);
final TLObject finalResponse = resp;
final TLRPC.TL_error finalError = error;
Utilities.stageQueue.postRunnable(new Runnable() {
@Override
public void run() {
onComplete.run(finalResponse, finalError);
if (finalResponse != null) {
finalResponse.freeResources();
}
}
});
} catch (Exception e) {
FileLog.e("tmessages", e);
}
}
}
}, onQuickAck, flags, datacenterId, connetionType, immediate, requestToken);
}, onQuickAck, flags, datacenterId, connetionType, immediate, requestToken);
} catch (Exception e) {
FileLog.e("tmessages", e);
}
}
});
return requestToken;

View File

@ -40,13 +40,17 @@ public class NativeByteBuffer extends AbstractSerializedData {
}
public NativeByteBuffer(int size) {
address = native_getFreeBuffer(size);
if (address != 0) {
buffer = native_getJavaByteBuffer(address);
buffer.position(0);
buffer.limit(size);
buffer.order(ByteOrder.LITTLE_ENDIAN);
public NativeByteBuffer(int size) throws Exception {
if (size >= 0) {
address = native_getFreeBuffer(size);
if (address != 0) {
buffer = native_getJavaByteBuffer(address);
buffer.position(0);
buffer.limit(size);
buffer.order(ByteOrder.LITTLE_ENDIAN);
}
} else {
throw new Exception("invalid NativeByteBuffer size");
}
}

View File

@ -23,11 +23,12 @@ public class TLClassStore {
classStore.put(TLRPC.TL_decryptedMessage.constructor, TLRPC.TL_decryptedMessage.class);
classStore.put(TLRPC.TL_config.constructor, TLRPC.TL_config.class);
classStore.put(TLRPC.TL_decryptedMessageLayer.constructor, TLRPC.TL_decryptedMessageLayer.class);
classStore.put(TLRPC.TL_decryptedMessageService_old.constructor, TLRPC.TL_decryptedMessageService_old.class);
classStore.put(TLRPC.TL_decryptedMessage_old.constructor, TLRPC.TL_decryptedMessage_old.class);
classStore.put(TLRPC.TL_decryptedMessage_layer17.constructor, TLRPC.TL_decryptedMessage.class);
classStore.put(TLRPC.TL_decryptedMessageService_layer8.constructor, TLRPC.TL_decryptedMessageService_layer8.class);
classStore.put(TLRPC.TL_decryptedMessage_layer8.constructor, TLRPC.TL_decryptedMessage_layer8.class);
classStore.put(TLRPC.TL_message_secret.constructor, TLRPC.TL_message_secret.class);
classStore.put(TLRPC.TL_message_secret_old.constructor, TLRPC.TL_message_secret_old.class);
classStore.put(TLRPC.TL_messageEncryptedAction.constructor, TLRPC.TL_messageEncryptedAction.class);
classStore.put(TLRPC.TL_decryptedMessageHolder.constructor, TLRPC.TL_decryptedMessageHolder.class);
classStore.put(TLRPC.TL_null.constructor, TLRPC.TL_null.class);
classStore.put(TLRPC.TL_updateShortChatMessage.constructor, TLRPC.TL_updateShortChatMessage.class);
@ -37,33 +38,6 @@ public class TLClassStore {
classStore.put(TLRPC.TL_updatesCombined.constructor, TLRPC.TL_updatesCombined.class);
classStore.put(TLRPC.TL_updateShortSentMessage.constructor, TLRPC.TL_updateShortSentMessage.class);
classStore.put(TLRPC.TL_updatesTooLong.constructor, TLRPC.TL_updatesTooLong.class);
classStore.put(TLRPC.TL_video.constructor, TLRPC.TL_video.class);
classStore.put(TLRPC.TL_videoEmpty.constructor, TLRPC.TL_videoEmpty.class);
classStore.put(TLRPC.TL_video_old2.constructor, TLRPC.TL_video_old2.class);
classStore.put(TLRPC.TL_video_old.constructor, TLRPC.TL_video_old.class);
classStore.put(TLRPC.TL_videoEncrypted.constructor, TLRPC.TL_videoEncrypted.class);
classStore.put(TLRPC.TL_video_old3.constructor, TLRPC.TL_video_old3.class);
classStore.put(TLRPC.TL_audio.constructor, TLRPC.TL_audio.class);
classStore.put(TLRPC.TL_audioEncrypted.constructor, TLRPC.TL_audioEncrypted.class);
classStore.put(TLRPC.TL_audioEmpty.constructor, TLRPC.TL_audioEmpty.class);
classStore.put(TLRPC.TL_audio_old.constructor, TLRPC.TL_audio_old.class);
classStore.put(TLRPC.TL_audio_old2.constructor, TLRPC.TL_audio_old2.class);
classStore.put(TLRPC.TL_document.constructor, TLRPC.TL_document.class);
classStore.put(TLRPC.TL_documentEmpty.constructor, TLRPC.TL_documentEmpty.class);
classStore.put(TLRPC.TL_documentEncrypted_old.constructor, TLRPC.TL_documentEncrypted_old.class);
classStore.put(TLRPC.TL_documentEncrypted.constructor, TLRPC.TL_documentEncrypted.class);
classStore.put(TLRPC.TL_document_old.constructor, TLRPC.TL_document_old.class);
classStore.put(TLRPC.TL_photo.constructor, TLRPC.TL_photo.class);
classStore.put(TLRPC.TL_photoEmpty.constructor, TLRPC.TL_photoEmpty.class);
classStore.put(TLRPC.TL_photoSize.constructor, TLRPC.TL_photoSize.class);
classStore.put(TLRPC.TL_photoSizeEmpty.constructor, TLRPC.TL_photoSizeEmpty.class);
classStore.put(TLRPC.TL_photoCachedSize.constructor, TLRPC.TL_photoCachedSize.class);
classStore.put(TLRPC.TL_photo_old.constructor, TLRPC.TL_photo_old.class);
classStore.put(TLRPC.TL_photo_old2.constructor, TLRPC.TL_photo_old2.class);
}
static TLClassStore store = null;

File diff suppressed because it is too large Load Diff

View File

@ -384,6 +384,7 @@ public class BottomSheet extends Dialog {
titleView.setText(title);
titleView.setTextColor(0xff757575);
titleView.setTextSize(TypedValue.COMPLEX_UNIT_DIP, 16);
titleView.setEllipsize(TextUtils.TruncateAt.MIDDLE);
titleView.setPadding(AndroidUtilities.dp(16), 0, AndroidUtilities.dp(16), AndroidUtilities.dp(8));
titleView.setGravity(Gravity.CENTER_VERTICAL);
containerView.addView(titleView, LayoutHelper.createLinear(LayoutHelper.MATCH_PARENT, 48));

View File

@ -71,6 +71,7 @@ public class MentionsAdapter extends BaseSearchAdapterRecycler {
private boolean isDarkTheme;
private int botsCount;
private boolean loadingBotRecent;
private boolean botRecentLoaded;
private String searchingContextUsername;
private String searchingContextQuery;
@ -96,7 +97,7 @@ public class MentionsAdapter extends BaseSearchAdapterRecycler {
}
private void loadBotRecent() {
if (loadingBotRecent) {
if (loadingBotRecent || botRecentLoaded) {
return;
}
loadingBotRecent = true;
@ -120,6 +121,7 @@ public class MentionsAdapter extends BaseSearchAdapterRecycler {
public void run() {
botRecent = users;
loadingBotRecent = false;
botRecentLoaded = true;
if (lastText != null) {
searchUsernameOrHashtag(lastText, lastPosition, messages);
}
@ -130,6 +132,7 @@ public class MentionsAdapter extends BaseSearchAdapterRecycler {
@Override
public void run() {
loadingBotRecent = false;
botRecentLoaded = true;
}
});
}
@ -241,6 +244,10 @@ public class MentionsAdapter extends BaseSearchAdapterRecycler {
return foundContextBot != null ? foundContextBot.id : 0;
}
public String getContextBotName() {
return foundContextBot != null ? foundContextBot.username : "";
}
private void searchForContextBot(final String username, final String query) {
searchResultBotContext = null;
searchResultBotContextById = null;
@ -457,7 +464,7 @@ public class MentionsAdapter extends BaseSearchAdapterRecycler {
int index = text.indexOf(' ');
if (index > 0) {
String username = text.substring(1, index);
if (username.length() >= 3) {
if (username.length() >= 1) {
for (int a = 1; a < username.length(); a++) {
char ch = username.charAt(a);
if (!(ch >= '0' && ch <= '9' || ch >= 'a' && ch <= 'z' || ch >= 'A' && ch <= 'Z' || ch == '_')) {
@ -488,7 +495,7 @@ public class MentionsAdapter extends BaseSearchAdapterRecycler {
char ch = text.charAt(a);
if (a == 0 || text.charAt(a - 1) == ' ' || text.charAt(a - 1) == '\n') {
if (ch == '@') {
if (needUsernames || botRecent != null && a == 0) {
if (needUsernames || needBotContext && botRecent != null && a == 0) {
if (hasIllegalUsernameCharacters) {
delegate.needChangePanelVisibility(false);
return;
@ -556,7 +563,7 @@ public class MentionsAdapter extends BaseSearchAdapterRecycler {
String usernameString = result.toString().toLowerCase();
ArrayList<TLRPC.User> newResult = new ArrayList<>();
final HashMap<Integer, TLRPC.User> newResultsHashMap = new HashMap<>();
if (dogPostion == 0 && botRecent != null) {
if (needBotContext && dogPostion == 0 && botRecent != null) {
for (int a = 0; a < botRecent.size(); a++) {
TLRPC.User user = botRecent.get(a);
if (user.username != null && user.username.length() > 0 && (usernameString.length() > 0 && user.username.toLowerCase().startsWith(usernameString) || usernameString.length() == 0)) {
@ -609,7 +616,8 @@ public class MentionsAdapter extends BaseSearchAdapterRecycler {
} else if (foundType == 1) {
ArrayList<String> newResult = new ArrayList<>();
String hashtagString = result.toString().toLowerCase();
for (HashtagObject hashtagObject : hashtags) {
for (int a = 0; a < hashtags.size(); a++) {
HashtagObject hashtagObject = hashtags.get(a);
if (hashtagObject != null && hashtagObject.hashtag != null && hashtagObject.hashtag.startsWith(hashtagString)) {
newResult.add(hashtagObject.hashtag);
}
@ -711,7 +719,7 @@ public class MentionsAdapter extends BaseSearchAdapterRecycler {
}
public boolean isLongClickEnabled() {
return searchResultHashtags != null;
return searchResultHashtags != null || searchResultCommands != null;
}
public boolean isBotCommands() {

View File

@ -415,7 +415,7 @@ public class AudioPlayerActivity extends BaseFragment implements NotificationCen
private void updateTitle(boolean shutdown) {
MessageObject messageObject = MediaController.getInstance().getPlayingMessageObject();
if (messageObject == null && shutdown || messageObject != null && !messageObject.isMusic()) {
if (!parentLayout.fragmentsStack.isEmpty() && parentLayout.fragmentsStack.get(parentLayout.fragmentsStack.size() - 1) == this) {
if (parentLayout != null && !parentLayout.fragmentsStack.isEmpty() && parentLayout.fragmentsStack.get(parentLayout.fragmentsStack.size() - 1) == this) {
finishFragment();
} else {
removeSelfFromStack();

View File

@ -85,7 +85,7 @@ public class AudioSelectActivity extends BaseFragment implements NotificationCen
public View createView(Context context) {
actionBar.setBackButtonImage(R.drawable.ic_ab_back);
actionBar.setAllowOverlayTitle(true);
actionBar.setTitle(LocaleController.getString("AttachAudio", R.string.AttachAudio));
actionBar.setTitle(LocaleController.getString("AttachMusic", R.string.AttachMusic));
actionBar.setActionBarMenuOnItemClick(new ActionBar.ActionBarMenuOnItemClick() {
@Override
public void onItemClick(int id) {
@ -243,6 +243,7 @@ public class AudioSelectActivity extends BaseFragment implements NotificationCen
attributeAudio.duration = audioEntry.duration;
attributeAudio.title = audioEntry.title;
attributeAudio.performer = audioEntry.author;
attributeAudio.flags |= 3;
message.media.document.attributes.add(attributeAudio);
TLRPC.TL_documentAttributeFilename fileName = new TLRPC.TL_documentAttributeFilename();

View File

@ -241,8 +241,8 @@ public class CacheControlActivity extends BaseFragment {
File[] array = file.listFiles();
if (array != null) {
for (int b = 0; b < array.length; b++) {
String name = array[b].getName().toLowerCase();
if (documentsMusicType == 1 || documentsMusicType == 2) {
String name = array[b].getName().toLowerCase();
if (name.endsWith(".mp3") || name.endsWith(".m4a")) {
if (documentsMusicType == 1) {
continue;
@ -251,6 +251,9 @@ public class CacheControlActivity extends BaseFragment {
continue;
}
}
if (name.equals(".nomedia")) {
continue;
}
if (array[b].isFile()) {
array[b].delete();
}

View File

@ -18,6 +18,7 @@ import android.text.SpannableStringBuilder;
import android.text.StaticLayout;
import android.text.TextPaint;
import android.text.style.ClickableSpan;
import android.text.style.URLSpan;
import android.view.Gravity;
import android.view.MotionEvent;
import android.widget.FrameLayout;
@ -152,7 +153,11 @@ public class AboutLinkCell extends FrameLayout {
}
}
} else {
pressedLink.onClick(this);
if (pressedLink instanceof URLSpan) {
AndroidUtilities.openUrl(getContext(), ((URLSpan) pressedLink).getURL());
} else {
pressedLink.onClick(this);
}
}
} catch (Exception e) {
FileLog.e("tmessages", e);

View File

@ -18,6 +18,7 @@ import android.text.Spanned;
import android.text.StaticLayout;
import android.text.TextPaint;
import android.text.style.ClickableSpan;
import android.text.style.URLSpan;
import android.view.MotionEvent;
import android.view.View;
@ -160,7 +161,11 @@ public class BotHelpCell extends View {
}
}
} else {
pressedLink.onClick(this);
if (pressedLink instanceof URLSpan) {
AndroidUtilities.openUrl(getContext(), ((URLSpan) pressedLink).getURL());
} else {
pressedLink.onClick(this);
}
}
} catch (Exception e) {
FileLog.e("tmessages", e);

View File

@ -20,25 +20,30 @@ 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.FileLoader;
import org.telegram.messenger.MediaController;
import org.telegram.messenger.MessageObject;
import org.telegram.messenger.FileLog;
import org.telegram.tgnet.TLRPC;
import org.telegram.ui.Components.RadialProgress;
import org.telegram.ui.Components.ResourceLoader;
import org.telegram.ui.Components.SeekBar;
import org.telegram.ui.Components.SeekBarWaveform;
import java.io.File;
public class ChatAudioCell extends ChatBaseCell implements SeekBar.SeekBarDelegate {
public interface ChatAudioCellDelegate {
boolean needPlayAudio(MessageObject messageObject);
}
private static TextPaint timePaint;
private static Paint circlePaint;
private boolean hasWaveform;
private SeekBar seekBar;
private SeekBarWaveform seekBarWaveform;
private int seekBarX;
private int seekBarY;
@ -50,14 +55,21 @@ public class ChatAudioCell extends ChatBaseCell implements SeekBar.SeekBarDelega
private StaticLayout timeLayout;
private int timeX;
private int timeWidth;
private int timeWidth2;
private String lastTimeString = null;
private ChatAudioCellDelegate audioDelegate;
public ChatAudioCell(Context context) {
super(context);
seekBar = new SeekBar(context);
seekBar.delegate = this;
seekBar.setDelegate(this);
seekBarWaveform = new SeekBarWaveform(context);
seekBarWaveform.setDelegate(this);
seekBarWaveform.setParentView(this);
radialProgress = new RadialProgress(this);
drawForwardedName = true;
@ -85,55 +97,83 @@ public class ChatAudioCell extends ChatBaseCell implements SeekBar.SeekBarDelega
public boolean onTouchEvent(MotionEvent event) {
float x = event.getX();
float y = event.getY();
boolean result = seekBar.onTouch(event.getAction(), event.getX() - seekBarX, event.getY() - seekBarY);
if (result) {
if (event.getAction() == MotionEvent.ACTION_DOWN) {
getParent().requestDisallowInterceptTouchEvent(true);
boolean result = false;
if (delegate.canPerformActions()) {
if (hasWaveform) {
result = seekBarWaveform.onTouch(event.getAction(), event.getX() - seekBarX - AndroidUtilities.dp(13), event.getY() - seekBarY);
} else {
result = seekBar.onTouch(event.getAction(), event.getX() - seekBarX, event.getY() - seekBarY);
}
invalidate();
} else {
int side = AndroidUtilities.dp(36);
if (event.getAction() == MotionEvent.ACTION_DOWN) {
if (x >= buttonX && x <= buttonX + side && y >= buttonY && y <= buttonY + side) {
buttonPressed = true;
invalidate();
result = true;
radialProgress.swapBackground(getDrawableForCurrentState());
}
} else if (buttonPressed) {
if (event.getAction() == MotionEvent.ACTION_UP) {
buttonPressed = false;
playSoundEffect(SoundEffectConstants.CLICK);
if (result) {
if (!hasWaveform && event.getAction() == MotionEvent.ACTION_DOWN) {
getParent().requestDisallowInterceptTouchEvent(true);
} else if (hasWaveform && !seekBarWaveform.isStartDraging() && event.getAction() == MotionEvent.ACTION_UP) {
didPressedButton();
invalidate();
} else if (event.getAction() == MotionEvent.ACTION_CANCEL) {
buttonPressed = false;
invalidate();
} else if (event.getAction() == MotionEvent.ACTION_MOVE) {
if (!(x >= buttonX && x <= buttonX + side && y >= buttonY && y <= buttonY + side)) {
}
invalidate();
} else {
int side = AndroidUtilities.dp(36);
boolean area;
if (buttonState == 0 || buttonState == 1) {
area = x >= buttonX - AndroidUtilities.dp(12) && x <= buttonX - AndroidUtilities.dp(12) + backgroundWidth && y >= namesOffset && y <= getMeasuredHeight();
} else {
area = x >= buttonX && x <= buttonX + side && y >= buttonY && y <= buttonY + side;
}
if (event.getAction() == MotionEvent.ACTION_DOWN) {
if (area) {
buttonPressed = true;
invalidate();
result = true;
radialProgress.swapBackground(getDrawableForCurrentState());
}
} else if (buttonPressed) {
if (event.getAction() == MotionEvent.ACTION_UP) {
buttonPressed = false;
playSoundEffect(SoundEffectConstants.CLICK);
didPressedButton();
invalidate();
} else if (event.getAction() == MotionEvent.ACTION_CANCEL) {
buttonPressed = false;
invalidate();
} else if (event.getAction() == MotionEvent.ACTION_MOVE) {
if (!area) {
buttonPressed = false;
invalidate();
}
}
radialProgress.swapBackground(getDrawableForCurrentState());
}
if (result && event.getAction() == MotionEvent.ACTION_DOWN) {
startCheckLongPress();
}
if (event.getAction() != MotionEvent.ACTION_DOWN && event.getAction() != MotionEvent.ACTION_MOVE) {
cancelCheckLongPress();
}
if (!result) {
result = super.onTouchEvent(event);
}
radialProgress.swapBackground(getDrawableForCurrentState());
}
if (!result) {
result = super.onTouchEvent(event);
}
}
return result;
}
@Override
protected void onLongPress() {
super.onLongPress();
if (buttonPressed) {
buttonPressed = false;
invalidate();
}
}
public void setAudioDelegate(ChatAudioCellDelegate delegate) {
audioDelegate = delegate;
}
private void didPressedButton() {
if (buttonState == 0) {
boolean result = MediaController.getInstance().playAudio(currentMessageObject);
if (!currentMessageObject.isOut() && currentMessageObject.isContentUnread()) {
if (currentMessageObject.messageOwner.to_id.channel_id == 0) {
MessagesController.getInstance().markMessageContentAsRead(currentMessageObject.messageOwner);
}
}
if (result) {
if (audioDelegate.needPlayAudio(currentMessageObject)) {
buttonState = 1;
radialProgress.setBackground(getDrawableForCurrentState(), false, false);
invalidate();
@ -147,12 +187,12 @@ public class ChatAudioCell extends ChatBaseCell implements SeekBar.SeekBarDelega
}
} else if (buttonState == 2) {
radialProgress.setProgress(0, false);
FileLoader.getInstance().loadFile(currentMessageObject.messageOwner.media.audio, true);
FileLoader.getInstance().loadFile(currentMessageObject.messageOwner.media.document, true, false);
buttonState = 3;
radialProgress.setBackground(getDrawableForCurrentState(), true, false);
invalidate();
} else if (buttonState == 3) {
FileLoader.getInstance().cancelLoadFile(currentMessageObject.messageOwner.media.audio);
FileLoader.getInstance().cancelLoadFile(currentMessageObject.messageOwner.media.document);
buttonState = 2;
radialProgress.setBackground(getDrawableForCurrentState(), false, false);
invalidate();
@ -170,28 +210,40 @@ public class ChatAudioCell extends ChatBaseCell implements SeekBar.SeekBarDelega
return;
}
if (!seekBar.isDragging()) {
seekBar.setProgress(currentMessageObject.audioProgress);
if (hasWaveform) {
if (!seekBarWaveform.isDragging()) {
seekBarWaveform.setProgress(currentMessageObject.audioProgress);
}
} else {
if (!seekBar.isDragging()) {
seekBar.setProgress(currentMessageObject.audioProgress);
}
}
int duration;
int duration = 0;
if (!MediaController.getInstance().isPlayingAudio(currentMessageObject)) {
duration = currentMessageObject.messageOwner.media.audio.duration;
for (int a = 0; a < currentMessageObject.messageOwner.media.document.attributes.size(); a++) {
TLRPC.DocumentAttribute attribute = currentMessageObject.messageOwner.media.document.attributes.get(a);
if (attribute instanceof TLRPC.TL_documentAttributeAudio) {
duration = attribute.duration;
break;
}
}
} else {
duration = currentMessageObject.audioProgressSec;
}
String timeString = String.format("%02d:%02d", duration / 60, duration % 60);
if (lastTimeString == null || lastTimeString != null && !lastTimeString.equals(timeString)) {
lastTimeString = timeString;
timeWidth = (int)Math.ceil(timePaint.measureText(timeString));
timeLayout = new StaticLayout(timeString, timePaint, timeWidth, Layout.Alignment.ALIGN_NORMAL, 1.0f, 0.0f, false);
timeWidth2 = (int)Math.ceil(timePaint.measureText(timeString));
timeLayout = new StaticLayout(timeString, timePaint, timeWidth2, Layout.Alignment.ALIGN_NORMAL, 1.0f, 0.0f, false);
}
invalidate();
}
public void downloadAudioIfNeed() {
if (buttonState == 2) {
FileLoader.getInstance().loadFile(currentMessageObject.messageOwner.media.audio, true);
FileLoader.getInstance().loadFile(currentMessageObject.messageOwner.media.document, true, false);
buttonState = 3;
radialProgress.setBackground(getDrawableForCurrentState(), false, false);
}
@ -221,9 +273,6 @@ public class ChatAudioCell extends ChatBaseCell implements SeekBar.SeekBarDelega
if (cacheFile == null) {
cacheFile = FileLoader.getPathToMessage(currentMessageObject.messageOwner);
}
if (BuildVars.DEBUG_VERSION) {
FileLog.d("tmessages", "looking for audio in " + cacheFile);
}
if (cacheFile.exists()) {
MediaController.getInstance().removeLoadingFileObserver(this);
boolean playing = MediaController.getInstance().isPlayingAudio(currentMessageObject);
@ -264,6 +313,7 @@ public class ChatAudioCell extends ChatBaseCell implements SeekBar.SeekBarDelega
@Override
public void onSuccessDownload(String fileName) {
updateButtonState(true);
updateWaveform();
}
@Override
@ -303,7 +353,7 @@ public class ChatAudioCell extends ChatBaseCell implements SeekBar.SeekBarDelega
buttonX = layoutWidth - backgroundWidth + AndroidUtilities.dp(13);
timeX = layoutWidth - backgroundWidth + AndroidUtilities.dp(66);
} else {
if (isChat && currentMessageObject.messageOwner.from_id > 0) {
if (isChat && currentMessageObject.isFromUser()) {
seekBarX = AndroidUtilities.dp(116);
buttonX = AndroidUtilities.dp(74);
timeX = AndroidUtilities.dp(127);
@ -313,9 +363,9 @@ public class ChatAudioCell extends ChatBaseCell implements SeekBar.SeekBarDelega
timeX = AndroidUtilities.dp(75);
}
}
seekBar.width = backgroundWidth - AndroidUtilities.dp(70);
seekBar.height = AndroidUtilities.dp(30);
seekBarWaveform.width = seekBar.width = backgroundWidth - AndroidUtilities.dp(70);
seekBarWaveform.height = seekBar.height = AndroidUtilities.dp(30);
seekBarWaveform.width -= AndroidUtilities.dp(20);
seekBarY = AndroidUtilities.dp(11) + namesOffset;
buttonY = AndroidUtilities.dp(13) + namesOffset;
radialProgress.setProgressRect(buttonX, buttonY, buttonX + AndroidUtilities.dp(40), buttonY + AndroidUtilities.dp(40));
@ -328,28 +378,51 @@ 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.isFromUser() && !messageObject.isOutOwner() ? 102 : 50), AndroidUtilities.dp(300));
} else {
backgroundWidth = Math.min(AndroidUtilities.displaySize.x - AndroidUtilities.dp(isChat && messageObject.messageOwner.from_id > 0 ? 102 : 50), AndroidUtilities.dp(300));
backgroundWidth = Math.min(AndroidUtilities.displaySize.x - AndroidUtilities.dp(isChat && messageObject.isFromUser() && !messageObject.isOutOwner() ? 102 : 50), AndroidUtilities.dp(300));
}
if (messageObject.isOutOwner()) {
seekBar.type = 0;
} else {
seekBar.type = 1;
int duration = 0;
for (int a = 0; a < messageObject.messageOwner.media.document.attributes.size(); a++) {
TLRPC.DocumentAttribute attribute = messageObject.messageOwner.media.document.attributes.get(a);
if (attribute instanceof TLRPC.TL_documentAttributeAudio) {
duration = attribute.duration;
break;
}
}
availableTimeWidth = backgroundWidth - AndroidUtilities.dp(75 + 14) - (int) Math.ceil(timePaint.measureText("00:00"));
measureTime(messageObject);
int minSize = AndroidUtilities.dp(40 + 14 + 20 + 90 + 10) + timeWidth;
backgroundWidth = Math.min(backgroundWidth, minSize + duration * AndroidUtilities.dp(10));
hasWaveform = false;
if (messageObject.isOutOwner()) {
seekBarWaveform.setColors(0xffc3e3ab, 0xff87bf78, 0xffa9d389);
} else {
seekBarWaveform.setColors(0xffdee5eb, 0xff4195e5, 0xffaed5e2);
}
seekBar.type = messageObject.isOutOwner() ? 0 : 1;
super.setMessageObject(messageObject);
}
updateWaveform();
updateButtonState(dataChanged);
}
@Override
protected int getMaxNameWidth() {
return backgroundWidth - AndroidUtilities.dp(24);
}
@Override
public void setCheckPressed(boolean value, boolean pressed) {
super.setCheckPressed(value, pressed);
if (radialProgress.swapBackground(getDrawableForCurrentState())) {
invalidate();
}
seekBarWaveform.setSelected(isDrawSelectedBackground());
}
@Override
@ -358,6 +431,7 @@ public class ChatAudioCell extends ChatBaseCell implements SeekBar.SeekBarDelega
if (radialProgress.swapBackground(getDrawableForCurrentState())) {
invalidate();
}
seekBarWaveform.setSelected(isDrawSelectedBackground());
}
@Override
@ -366,12 +440,29 @@ public class ChatAudioCell extends ChatBaseCell implements SeekBar.SeekBarDelega
if (radialProgress.swapBackground(getDrawableForCurrentState())) {
invalidate();
}
seekBarWaveform.setSelected(isDrawSelectedBackground());
}
private Drawable getDrawableForCurrentState() {
return ResourceLoader.audioStatesDrawable[currentMessageObject.isOutOwner() ? buttonState : buttonState + 5][isDrawSelectedBackground() ? 2 : (buttonPressed ? 1 : 0)];
}
private void updateWaveform() {
File path = FileLoader.getPathToMessage(currentMessageObject.messageOwner);
for (int a = 0; a < currentMessageObject.messageOwner.media.document.attributes.size(); a++) {
TLRPC.DocumentAttribute attribute = currentMessageObject.messageOwner.media.document.attributes.get(a);
if (attribute instanceof TLRPC.TL_documentAttributeAudio) {
if (attribute.waveform == null || attribute.waveform.length == 0) {
MediaController.getInstance().generateWaveform(currentMessageObject);
}
hasWaveform = attribute.waveform != null;
seekBarWaveform.setWaveform(attribute.waveform);
seekBarWaveform.setMessageObject(currentMessageObject);
break;
}
}
}
@Override
protected void onDraw(Canvas canvas) {
if (currentMessageObject == null) {
@ -381,8 +472,13 @@ public class ChatAudioCell extends ChatBaseCell implements SeekBar.SeekBarDelega
super.onDraw(canvas);
canvas.save();
canvas.translate(seekBarX, seekBarY);
seekBar.draw(canvas);
if (hasWaveform) {
canvas.translate(seekBarX + AndroidUtilities.dp(13), seekBarY);
seekBarWaveform.draw(canvas);
} else {
canvas.translate(seekBarX, seekBarY);
seekBar.draw(canvas);
}
canvas.restore();
radialProgress.setProgressColor(currentMessageObject.isOutOwner() ? 0xff87bf78 : (isDrawSelectedBackground() ? 0xff83b2c2 : 0xffa2b5c7));
@ -396,7 +492,7 @@ public class ChatAudioCell extends ChatBaseCell implements SeekBar.SeekBarDelega
canvas.restore();
if (currentMessageObject.messageOwner.to_id.channel_id == 0 && currentMessageObject.isContentUnread()) {
canvas.drawCircle(timeX + timeWidth + AndroidUtilities.dp(8), AndroidUtilities.dp(49.5f) + namesOffset, AndroidUtilities.dp(3), circlePaint);
canvas.drawCircle(timeX + timeWidth2 + AndroidUtilities.dp(8), AndroidUtilities.dp(49.5f) + namesOffset, AndroidUtilities.dp(3), circlePaint);
}
}
}

View File

@ -25,6 +25,7 @@ import android.view.MotionEvent;
import android.view.SoundEffectConstants;
import org.telegram.messenger.AndroidUtilities;
import org.telegram.messenger.ContactsController;
import org.telegram.messenger.Emoji;
import org.telegram.messenger.LocaleController;
import org.telegram.messenger.MediaController;
@ -47,8 +48,8 @@ public class ChatBaseCell extends BaseCell implements MediaController.FileDownlo
public interface ChatBaseCellDelegate {
void didPressedUserAvatar(ChatBaseCell cell, TLRPC.User user);
void didPressedViaBot(ChatBaseCell cell, TLRPC.User user);
void didPressedChannelAvatar(ChatBaseCell cell, TLRPC.Chat chat);
void didPressedViaBot(ChatBaseCell cell, String username);
void didPressedChannelAvatar(ChatBaseCell cell, TLRPC.Chat chat, int postId);
void didPressedCancelSendButton(ChatBaseCell cell);
void didLongPressed(ChatBaseCell cell);
void didPressReplyMessage(ChatBaseCell cell, int id);
@ -78,6 +79,7 @@ public class ChatBaseCell extends BaseCell implements MediaController.FileDownlo
protected MessageObject currentMessageObject;
private int viaWidth;
private int viaNameWidth;
protected int availableTimeWidth;
private static TextPaint timePaint;
private static TextPaint namePaint;
@ -110,7 +112,7 @@ public class ChatBaseCell extends BaseCell implements MediaController.FileDownlo
private boolean replyPressed;
private TLRPC.FileLocation currentReplyPhoto;
private boolean drawShareButton;
protected boolean drawShareButton;
private boolean sharePressed;
private int shareStartX;
private int shareStartY;
@ -255,10 +257,12 @@ public class ChatBaseCell extends BaseCell implements MediaController.FileDownlo
TLRPC.User newUser = null;
TLRPC.Chat newChat = null;
if (currentMessageObject.messageOwner.from_id > 0) {
if (currentMessageObject.isFromUser()) {
newUser = MessagesController.getInstance().getUser(currentMessageObject.messageOwner.from_id);
} else if (currentMessageObject.messageOwner.from_id < 0) {
newChat = MessagesController.getInstance().getChat(-currentMessageObject.messageOwner.from_id);
} else if (currentMessageObject.messageOwner.post) {
newChat = MessagesController.getInstance().getChat(currentMessageObject.messageOwner.to_id.channel_id);
}
TLRPC.FileLocation newPhoto = null;
@ -312,12 +316,52 @@ public class ChatBaseCell extends BaseCell implements MediaController.FileDownlo
}
protected void measureTime(MessageObject messageObject) {
currentTimeString = LocaleController.getInstance().formatterDay.format((long) (messageObject.messageOwner.date) * 1000);
boolean hasSign = !messageObject.isOutOwner() && messageObject.messageOwner.from_id > 0 && messageObject.messageOwner.post;
TLRPC.User signUser = MessagesController.getInstance().getUser(messageObject.messageOwner.from_id);
if (hasSign && signUser == null) {
hasSign = false;
}
if (hasSign) {
currentTimeString = ", " + LocaleController.getInstance().formatterDay.format((long) (messageObject.messageOwner.date) * 1000);
} else {
currentTimeString = LocaleController.getInstance().formatterDay.format((long) (messageObject.messageOwner.date) * 1000);
}
timeTextWidth = timeWidth = (int) Math.ceil(timePaint.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));
timeWidth += (int) Math.ceil(timePaint.measureText(currentViewsString)) + ResourceLoader.viewsCountDrawable.getIntrinsicWidth() + AndroidUtilities.dp(10);
viewsTextWidth = (int) Math.ceil(timePaint.measureText(currentViewsString));
timeWidth += viewsTextWidth + ResourceLoader.viewsCountDrawable[0].getIntrinsicWidth() + AndroidUtilities.dp(10);
}
if (hasSign) {
if (availableTimeWidth == 0) {
availableTimeWidth = AndroidUtilities.dp(100);
}
CharSequence name = ContactsController.formatName(signUser.first_name, signUser.last_name).replace('\n', ' ');
int widthForSign = availableTimeWidth - timeWidth;
int width = (int) Math.ceil(timePaint.measureText(name, 0, name.length()));
if (width > widthForSign) {
name = TextUtils.ellipsize(name, timePaint, widthForSign, TextUtils.TruncateAt.END);
width = widthForSign;
}
currentTimeString = name + currentTimeString;
timeTextWidth += width;
timeWidth += width;
}
}
protected boolean checkNeedDrawShareButton(MessageObject messageObject) {
if (messageObject.isFromUser()) {
TLRPC.User user = MessagesController.getInstance().getUser(messageObject.messageOwner.from_id);
if (user != null && user.bot && messageObject.type != 13 && !(messageObject.messageOwner.media instanceof TLRPC.TL_messageMediaEmpty || messageObject.messageOwner.media == null
|| messageObject.messageOwner.media instanceof TLRPC.TL_messageMediaWebPage && !(messageObject.messageOwner.media.webpage instanceof TLRPC.TL_webPage))) {
return true;
}
} else if (messageObject.messageOwner.from_id < 0 || messageObject.messageOwner.post) {
if (messageObject.messageOwner.to_id.channel_id != 0 && (messageObject.messageOwner.reply_to_msg_id == 0 || messageObject.type != 13)) {
return true;
}
}
return false;
}
public void setMessageObject(MessageObject messageObject) {
@ -329,7 +373,7 @@ public class ChatBaseCell extends BaseCell implements MediaController.FileDownlo
isCheckPressed = true;
isAvatarVisible = false;
wasLayout = false;
drawShareButton = false;
drawShareButton = checkNeedDrawShareButton(messageObject);
replyNameLayout = null;
replyTextLayout = null;
replyNameWidth = 0;
@ -351,15 +395,15 @@ public class ChatBaseCell extends BaseCell implements MediaController.FileDownlo
}
}
if (messageObject.messageOwner.from_id > 0) {
currentUser = MessagesController.getInstance().getUser(messageObject.messageOwner.from_id);
} else if (messageObject.messageOwner.from_id < 0) {
currentChat = MessagesController.getInstance().getChat(-messageObject.messageOwner.from_id);
if (messageObject.messageOwner.to_id.channel_id != 0 && (messageObject.messageOwner.reply_to_msg_id == 0 || messageObject.type != 13)) {
drawShareButton = true;
}
if (currentMessageObject.isFromUser()) {
currentUser = MessagesController.getInstance().getUser(currentMessageObject.messageOwner.from_id);
} else if (currentMessageObject.messageOwner.from_id < 0) {
currentChat = MessagesController.getInstance().getChat(-currentMessageObject.messageOwner.from_id);
} else if (currentMessageObject.messageOwner.post) {
currentChat = MessagesController.getInstance().getChat(currentMessageObject.messageOwner.to_id.channel_id);
}
if (isChat && !messageObject.isOutOwner() && messageObject.messageOwner.from_id > 0) {
if (isChat && !messageObject.isOutOwner() && messageObject.isFromUser()) {
isAvatarVisible = true;
if (currentUser != null) {
if (currentUser.photo != null) {
@ -382,13 +426,8 @@ public class ChatBaseCell extends BaseCell implements MediaController.FileDownlo
avatarImage.setImage(currentPhoto, "50_50", avatarDrawable, null, false);
}
currentTimeString = LocaleController.getInstance().formatterDay.format((long) (messageObject.messageOwner.date) * 1000);
timeTextWidth = timeWidth = (int)Math.ceil(timePaint.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(timePaint.measureText(currentViewsString));
timeWidth += viewsTextWidth + ResourceLoader.viewsCountDrawable.getIntrinsicWidth() + AndroidUtilities.dp(10);
}
measureTime(messageObject);
namesOffset = 0;
@ -402,10 +441,14 @@ public class ChatBaseCell extends BaseCell implements MediaController.FileDownlo
viaWidth = (int) Math.ceil(forwardNamePaint.measureText(viaString));
currentViaBotUser = botUser;
}
} else if (messageObject.messageOwner.via_bot_name != null && messageObject.messageOwner.via_bot_name.length() > 0) {
viaUsername = "@" + messageObject.messageOwner.via_bot_name;
viaString = " via " + messageObject.messageOwner.via_bot_name;
viaWidth = (int) Math.ceil(forwardNamePaint.measureText(viaString));
}
boolean authorName = drawName && isChat && !currentMessageObject.isOutOwner();
boolean viaBot = messageObject.messageOwner.fwd_from_id == null && currentViaBotUser != null;
boolean viaBot = messageObject.messageOwner.fwd_from == null && viaUsername != null;
if (authorName || viaBot) {
drawName = true;
nameWidth = getMaxNameWidth();
@ -413,7 +456,7 @@ public class ChatBaseCell extends BaseCell implements MediaController.FileDownlo
nameWidth = AndroidUtilities.dp(100);
}
if (authorName || !currentMessageObject.isOutOwner()) {
if (authorName) {
if (currentUser != null) {
currentNameString = UserObject.getUserName(currentUser);
} else if (currentChat != null) {
@ -432,12 +475,12 @@ public class ChatBaseCell extends BaseCell implements MediaController.FileDownlo
viaNameWidth += AndroidUtilities.dp(4);
}
if (currentNameString.length() > 0) {
SpannableStringBuilder stringBuilder = new SpannableStringBuilder(String.format("%s via @%s", nameStringFinal, currentViaBotUser.username));
SpannableStringBuilder stringBuilder = new SpannableStringBuilder(String.format("%s via %s", nameStringFinal, viaUsername));
stringBuilder.setSpan(new TypefaceSpan(null, 0, currentMessageObject.isOutOwner() ? 0xff4a923c : 0xff006fc8), nameStringFinal.length() + 1, nameStringFinal.length() + 4, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
stringBuilder.setSpan(new TypefaceSpan(AndroidUtilities.getTypeface("fonts/rmedium.ttf"), 0, currentMessageObject.isOutOwner() ? 0xff4a923c : 0xff006fc8), nameStringFinal.length() + 5, stringBuilder.length(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
nameStringFinal = stringBuilder;
} else {
SpannableStringBuilder stringBuilder = new SpannableStringBuilder(String.format("via @%s", currentViaBotUser.username));
SpannableStringBuilder stringBuilder = new SpannableStringBuilder(String.format("via %s", viaUsername));
stringBuilder.setSpan(new TypefaceSpan(null, 0, currentMessageObject.isOutOwner() ? 0xff4a923c : 0xff006fc8), 0, 4, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
stringBuilder.setSpan(new TypefaceSpan(AndroidUtilities.getTypeface("fonts/rmedium.ttf"), 0, currentMessageObject.isOutOwner() ? 0xff4a923c : 0xff006fc8), 4, stringBuilder.length(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
nameStringFinal = stringBuilder;
@ -462,19 +505,24 @@ public class ChatBaseCell extends BaseCell implements MediaController.FileDownlo
}
if (drawForwardedName && messageObject.isForwarded()) {
if (messageObject.messageOwner.fwd_from_id instanceof TLRPC.TL_peerChannel) {
currentForwardChannel = MessagesController.getInstance().getChat(messageObject.messageOwner.fwd_from_id.channel_id);
currentForwardUser = null;
} else if (messageObject.messageOwner.fwd_from_id instanceof TLRPC.TL_peerUser) {
currentForwardChannel = null;
currentForwardUser = MessagesController.getInstance().getUser(messageObject.messageOwner.fwd_from_id.user_id);
currentForwardUser = null;
currentForwardChannel = null;
if (messageObject.messageOwner.fwd_from.channel_id != 0) {
currentForwardChannel = MessagesController.getInstance().getChat(messageObject.messageOwner.fwd_from.channel_id);
}
if (messageObject.messageOwner.fwd_from.from_id != 0) {
currentForwardUser = MessagesController.getInstance().getUser(messageObject.messageOwner.fwd_from.from_id);
}
if (currentForwardUser != null || currentForwardChannel != null) {
if (currentForwardUser != null) {
if (currentForwardChannel != null) {
if (currentForwardUser != null) {
currentForwardNameString = String.format("%s (%s)", currentForwardChannel.title, UserObject.getUserName(currentForwardUser));
} else {
currentForwardNameString = currentForwardChannel.title;
}
} else if (currentForwardUser != null) {
currentForwardNameString = UserObject.getUserName(currentForwardUser);
} else {
currentForwardNameString = currentForwardChannel.title;
}
forwardedNameWidth = getMaxNameWidth();
@ -537,7 +585,7 @@ public class ChatBaseCell extends BaseCell implements MediaController.FileDownlo
if (messageObject.isOutOwner()) {
maxWidth = width - backgroundWidth - AndroidUtilities.dp(60);
} else {
maxWidth = width - backgroundWidth - AndroidUtilities.dp(56 + (isChat && messageObject.messageOwner.from_id > 0 ? 61 : 0));
maxWidth = width - backgroundWidth - AndroidUtilities.dp(56 + (isChat && messageObject.isFromUser() ? 61 : 0));
}
} else {
maxWidth = getMaxNameWidth() - AndroidUtilities.dp(22);
@ -550,7 +598,7 @@ public class ChatBaseCell extends BaseCell implements MediaController.FileDownlo
CharSequence stringFinalText = null;
if (messageObject.replyMessageObject != null) {
TLRPC.PhotoSize photoSize = FileLoader.getClosestPhotoSizeWithSize(messageObject.replyMessageObject.photoThumbs, 80);
if (photoSize == null || messageObject.replyMessageObject.type == 13 || messageObject.type == 13 && !AndroidUtilities.isTablet()) {
if (photoSize == null || messageObject.replyMessageObject.type == 13 || messageObject.type == 13 && !AndroidUtilities.isTablet() || messageObject.replyMessageObject.isSecretMedia()) {
replyImageReceiver.setImageBitmap((Drawable) null);
needReplyImage = false;
} else {
@ -561,16 +609,21 @@ public class ChatBaseCell extends BaseCell implements MediaController.FileDownlo
}
String name = null;
if (messageObject.replyMessageObject.messageOwner.from_id > 0) {
if (messageObject.replyMessageObject.isFromUser()) {
TLRPC.User user = MessagesController.getInstance().getUser(messageObject.replyMessageObject.messageOwner.from_id);
if (user != null) {
name = UserObject.getUserName(user);
}
} else {
} else if (messageObject.replyMessageObject.messageOwner.from_id < 0) {
TLRPC.Chat chat = MessagesController.getInstance().getChat(-messageObject.replyMessageObject.messageOwner.from_id);
if (chat != null) {
name = chat.title;
}
} else {
TLRPC.Chat chat = MessagesController.getInstance().getChat(messageObject.replyMessageObject.messageOwner.to_id.channel_id);
if (chat != null) {
name = chat.title;
}
}
if (name != null) {
@ -666,7 +719,7 @@ public class ChatBaseCell extends BaseCell implements MediaController.FileDownlo
if (currentUser != null) {
delegate.didPressedUserAvatar(this, currentUser);
} else if (currentChat != null) {
delegate.didPressedChannelAvatar(this, currentChat);
delegate.didPressedChannelAvatar(this, currentChat, 0);
}
}
} else if (event.getAction() == MotionEvent.ACTION_CANCEL) {
@ -681,10 +734,10 @@ public class ChatBaseCell extends BaseCell implements MediaController.FileDownlo
forwardNamePressed = false;
playSoundEffect(SoundEffectConstants.CLICK);
if (delegate != null) {
if (currentForwardUser != null) {
if (currentForwardChannel != null) {
delegate.didPressedChannelAvatar(this, currentForwardChannel, currentMessageObject.messageOwner.fwd_from.channel_post);
} else if (currentForwardUser != null) {
delegate.didPressedUserAvatar(this, currentForwardUser);
} else {
delegate.didPressedChannelAvatar(this, currentForwardChannel);
}
}
} else if (event.getAction() == MotionEvent.ACTION_CANCEL) {
@ -699,7 +752,7 @@ public class ChatBaseCell extends BaseCell implements MediaController.FileDownlo
forwardBotPressed = false;
playSoundEffect(SoundEffectConstants.CLICK);
if (delegate != null) {
delegate.didPressedViaBot(this, currentViaBotUser);
delegate.didPressedViaBot(this, currentViaBotUser != null ? currentViaBotUser.username : currentMessageObject.messageOwner.via_bot_name);
}
} else if (event.getAction() == MotionEvent.ACTION_CANCEL) {
forwardBotPressed = false;
@ -763,13 +816,13 @@ public class ChatBaseCell extends BaseCell implements MediaController.FileDownlo
timeLayout = new StaticLayout(currentTimeString, timePaint, 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);
timeX = backgroundWidth - AndroidUtilities.dp(9) - timeWidth + (isChat && currentMessageObject.isFromUser() ? AndroidUtilities.dp(52) : 0);
} else {
timeX = layoutWidth - timeWidth - AndroidUtilities.dp(38.5f);
}
} else {
if (!currentMessageObject.isOutOwner()) {
timeX = backgroundWidth - AndroidUtilities.dp(4) - timeWidth + (isChat && currentMessageObject.messageOwner.from_id > 0 ? AndroidUtilities.dp(52) : 0);
timeX = backgroundWidth - AndroidUtilities.dp(4) - timeWidth + (isChat && currentMessageObject.isFromUser() ? AndroidUtilities.dp(52) : 0);
} else {
timeX = layoutWidth - timeWidth - AndroidUtilities.dp(42.0f);
}
@ -863,7 +916,7 @@ public class ChatBaseCell extends BaseCell implements MediaController.FileDownlo
currentBackgroundDrawable = ResourceLoader.backgroundMediaDrawableIn;
}
}
if (isChat && currentMessageObject.messageOwner.from_id > 0) {
if (isChat && currentMessageObject.isFromUser()) {
setDrawableBounds(currentBackgroundDrawable, AndroidUtilities.dp(52 + (!media ? 0 : 9)), AndroidUtilities.dp(1), backgroundWidth, layoutHeight - AndroidUtilities.dp(2));
} else {
setDrawableBounds(currentBackgroundDrawable, (!media ? 0 : AndroidUtilities.dp(9)), AndroidUtilities.dp(1), backgroundWidth, layoutHeight - AndroidUtilities.dp(2));
@ -1012,7 +1065,7 @@ public class ChatBaseCell extends BaseCell implements MediaController.FileDownlo
ResourceLoader.errorDrawable.draw(canvas);
}
} else {
Drawable countDrawable = ResourceLoader.viewsMediaCountDrawable[isDrawSelectedBackground() ? 1 : 0];
Drawable countDrawable = ResourceLoader.viewsMediaCountDrawable;
setDrawableBounds(countDrawable, timeX, layoutHeight - AndroidUtilities.dp(10) - timeLayout.getHeight());
countDrawable.draw(canvas);
@ -1047,8 +1100,8 @@ public class ChatBaseCell extends BaseCell implements MediaController.FileDownlo
}
} else {
if (!currentMessageObject.isOutOwner()) {
setDrawableBounds(ResourceLoader.viewsCountDrawable, timeX, layoutHeight - AndroidUtilities.dp(4.5f) - timeLayout.getHeight());
ResourceLoader.viewsCountDrawable.draw(canvas);
setDrawableBounds(ResourceLoader.viewsCountDrawable[isDrawSelectedBackground() ? 1 : 0], timeX, layoutHeight - AndroidUtilities.dp(4.5f) - timeLayout.getHeight());
ResourceLoader.viewsCountDrawable[isDrawSelectedBackground() ? 1 : 0].draw(canvas);
} else {
setDrawableBounds(ResourceLoader.viewsOutCountDrawable, timeX, layoutHeight - AndroidUtilities.dp(4.5f) - timeLayout.getHeight());
ResourceLoader.viewsOutCountDrawable.draw(canvas);

View File

@ -112,7 +112,7 @@ public class ChatContactCell extends ChatBaseCell {
if (x >= avatarImage.getImageX() && x <= avatarImage.getImageX() + namesWidth + AndroidUtilities.dp(42) && y >= avatarImage.getImageY() && y <= avatarImage.getImageY() + avatarImage.getImageHeight()) {
avatarPressed = true;
result = true;
} else if (x >= avatarImage.getImageX() + namesWidth + AndroidUtilities.dp(52) && y >= AndroidUtilities.dp(13) + namesOffset && x <= avatarImage.getImageX() + namesWidth + AndroidUtilities.dp(92) && y <= AndroidUtilities.dp(52) + namesOffset) {
} else if (drawAddButton && x >= avatarImage.getImageX() + namesWidth + AndroidUtilities.dp(52) && y >= AndroidUtilities.dp(13) + namesOffset && x <= avatarImage.getImageX() + namesWidth + AndroidUtilities.dp(92) && y <= AndroidUtilities.dp(52) + namesOffset) {
buttonPressed = true;
result = true;
}
@ -196,7 +196,20 @@ public class ChatContactCell extends ChatBaseCell {
}
avatarImage.setImage(currentPhoto, "50_50", avatarDrawable, null, false);
String phone = messageObject.messageOwner.media.phone_number;
if (phone != null && phone.length() != 0) {
if (!phone.startsWith("+")) {
phone = "+" + phone;
}
phone = PhoneFormat.getInstance().format(phone);
} else {
phone = LocaleController.getString("NumberUnknown", R.string.NumberUnknown);
}
String currentNameString = ContactsController.formatName(messageObject.messageOwner.media.first_name, messageObject.messageOwner.media.last_name);
if (currentNameString.length() == 0) {
currentNameString = phone;
}
int nameWidth = Math.min((int) Math.ceil(namePaint.measureText(currentNameString)), maxWidth);
if (maxWidth < 0) {
maxWidth = AndroidUtilities.dp(100);
@ -210,15 +223,7 @@ public class ChatContactCell extends ChatBaseCell {
nameWidth = 0;
}
String phone = messageObject.messageOwner.media.phone_number;
if (phone != null && phone.length() != 0) {
if (!phone.startsWith("+")) {
phone = "+" + phone;
}
phone = PhoneFormat.getInstance().format(phone);
} else {
phone = LocaleController.getString("NumberUnknown", R.string.NumberUnknown);
}
int phoneWidth = Math.min((int) Math.ceil(phonePaint.measureText(phone)), maxWidth);
stringFinal = TextUtils.ellipsize(phone.replace("\n", " "), phonePaint, phoneWidth, TextUtils.TruncateAt.END);
phoneLayout = new StaticLayout(stringFinal, phonePaint, phoneWidth, Layout.Alignment.ALIGN_NORMAL, 1.0f, 0.0f, false);
@ -230,6 +235,7 @@ public class ChatContactCell extends ChatBaseCell {
namesWidth = Math.max(nameWidth, phoneWidth);
backgroundWidth = AndroidUtilities.dp(77 + (drawAddButton ? 42 : 0)) + namesWidth;
availableTimeWidth = backgroundWidth - AndroidUtilities.dp(29);
super.setMessageObject(messageObject);
}
@ -237,7 +243,7 @@ public class ChatContactCell extends ChatBaseCell {
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
setMeasuredDimension(MeasureSpec.getSize(widthMeasureSpec), AndroidUtilities.dp(71) + namesOffset);
setMeasuredDimension(MeasureSpec.getSize(widthMeasureSpec), AndroidUtilities.dp(75) + namesOffset);
}
@Override
@ -253,7 +259,7 @@ public class ChatContactCell extends ChatBaseCell {
if (currentMessageObject.isOutOwner()) {
x = layoutWidth - backgroundWidth + AndroidUtilities.dp(8);
} else {
if (isChat && currentMessageObject.messageOwner.from_id > 0) {
if (isChat && currentMessageObject.isFromUser()) {
x = AndroidUtilities.dp(69);
} else {
x = AndroidUtilities.dp(16);

View File

@ -21,6 +21,7 @@ import android.text.StaticLayout;
import android.text.TextPaint;
import android.text.TextUtils;
import android.text.style.ClickableSpan;
import android.text.style.URLSpan;
import android.view.MotionEvent;
import android.view.SoundEffectConstants;
@ -39,6 +40,7 @@ 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 org.telegram.ui.PhotoViewer;
import org.telegram.messenger.ImageReceiver;
@ -417,7 +419,7 @@ public class ChatMediaCell extends ChatBaseCell {
} else if (currentMessageObject.type == 9) {
FileLoader.getInstance().loadFile(currentMessageObject.messageOwner.media.document, false, false);
} else if (currentMessageObject.type == 3) {
FileLoader.getInstance().loadFile(currentMessageObject.messageOwner.media.video, true);
FileLoader.getInstance().loadFile(currentMessageObject.messageOwner.media.document, true, false);
}
buttonState = 1;
radialProgress.setBackground(getDrawableForCurrentState(), true, animated);
@ -431,10 +433,8 @@ public class ChatMediaCell extends ChatBaseCell {
cancelLoading = true;
if (currentMessageObject.type == 1 || currentMessageObject.type == 8) {
photoImage.cancelLoadImage();
} else if (currentMessageObject.type == 9) {
} else if (currentMessageObject.type == 9 || currentMessageObject.type == 3) {
FileLoader.getInstance().cancelLoadFile(currentMessageObject.messageOwner.media.document);
} else if (currentMessageObject.type == 3) {
FileLoader.getInstance().cancelLoadFile(currentMessageObject.messageOwner.media.video);
}
buttonState = 0;
radialProgress.setBackground(getDrawableForCurrentState(), false, animated);
@ -475,12 +475,23 @@ public class ChatMediaCell extends ChatBaseCell {
return false;
}
@Override
protected void onLongPress() {
if (pressedLink instanceof URLSpanNoUnderline) {
} else if (pressedLink instanceof URLSpan) {
delegate.didPressUrl(currentMessageObject, pressedLink, true);
return;
}
super.onLongPress();
}
@Override
public void setMessageObject(MessageObject messageObject) {
boolean messageChanged = currentMessageObject != messageObject;
boolean dataChanged = currentMessageObject == messageObject && (isUserDataChanged() || photoNotSet);
if (currentMessageObject != messageObject || isPhotoDataChanged(messageObject) || dataChanged) {
drawForwardedName = messageObject.messageOwner.fwd_from_id != null && messageObject.type != 13;
drawForwardedName = messageObject.messageOwner.fwd_from != null && messageObject.type != 13;
media = messageObject.type != 9;
cancelLoading = false;
additionHeight = 0;
@ -510,14 +521,24 @@ public class ChatMediaCell extends ChatBaseCell {
} else {
maxWidth = Math.min(AndroidUtilities.displaySize.x, AndroidUtilities.displaySize.y) - AndroidUtilities.dp(122 + 86 + 24);
}
if (checkNeedDrawShareButton(messageObject)) {
maxWidth -= AndroidUtilities.dp(20);
}
if (currentNameString == null || !currentNameString.equals(name)) {
currentNameString = name;
nameLayout = StaticLayoutEx.createStaticLayout(currentNameString, namePaint, maxWidth, Layout.Alignment.ALIGN_NORMAL, 1.0f, 0.0f, false, TextUtils.TruncateAt.END, maxWidth, 1);
nameLayout = StaticLayoutEx.createStaticLayout(currentNameString, namePaint, maxWidth, Layout.Alignment.ALIGN_NORMAL, 1.0f, 0.0f, false, TextUtils.TruncateAt.MIDDLE, maxWidth, 3);
nameOffsetX = Integer.MIN_VALUE;
if (nameLayout != null && nameLayout.getLineCount() > 0) {
nameWidth = Math.min(maxWidth, (int) Math.ceil(nameLayout.getLineWidth(0)));
nameOffsetX = (int) Math.ceil(-nameLayout.getLineLeft(0));
int maxLineWidth = 0;
int maxLeft = 0;
for (int a = 0; a < nameLayout.getLineCount(); a++) {
maxLineWidth = Math.max(maxLineWidth, (int) Math.ceil(nameLayout.getLineWidth(a)));
nameOffsetX = Math.max(maxLeft, (int) Math.ceil(-nameLayout.getLineLeft(a)));
}
nameWidth = Math.min(maxWidth, maxLineWidth);
} else {
nameWidth = maxWidth;
nameOffsetX = 0;
}
}
@ -528,7 +549,14 @@ public class ChatMediaCell extends ChatBaseCell {
infoOffset = 0;
infoWidth = Math.min(maxWidth, (int) Math.ceil(infoPaint.measureText(currentInfoString)));
CharSequence str2 = TextUtils.ellipsize(currentInfoString, infoPaint, infoWidth, TextUtils.TruncateAt.END);
infoLayout = new StaticLayout(str2, infoPaint, infoWidth, Layout.Alignment.ALIGN_NORMAL, 1.0f, 0.0f, false);
try {
if (infoWidth < 0) {
infoWidth = AndroidUtilities.dp(10);
}
infoLayout = new StaticLayout(str2, infoPaint, infoWidth, Layout.Alignment.ALIGN_NORMAL, 1.0f, 0.0f, false);
} catch (Exception e) {
FileLog.e("tmessages", e);
}
}
} else if (messageObject.type == 8) {
String str = AndroidUtilities.formatFileSize(messageObject.messageOwner.media.document.size);
@ -541,10 +569,17 @@ public class ChatMediaCell extends ChatBaseCell {
nameLayout = null;
currentNameString = null;
} else if (messageObject.type == 3) {
int duration = messageObject.messageOwner.media.video.duration;
int duration = 0;
for (int a = 0; a < messageObject.messageOwner.media.document.attributes.size(); a++) {
TLRPC.DocumentAttribute attribute = messageObject.messageOwner.media.document.attributes.get(a);
if (attribute instanceof TLRPC.TL_documentAttributeVideo) {
duration = attribute.duration;
break;
}
}
int minutes = duration / 60;
int seconds = duration - minutes * 60;
String str = String.format("%d:%02d, %s", minutes, seconds, AndroidUtilities.formatFileSize(messageObject.messageOwner.media.video.size));
String str = String.format("%d:%02d, %s", minutes, seconds, AndroidUtilities.formatFileSize(messageObject.messageOwner.media.document.size));
if (currentInfoString == null || !currentInfoString.equals(str)) {
currentInfoString = str;
infoOffset = ResourceLoader.videoIconDrawable.getIntrinsicWidth() + AndroidUtilities.dp(4);
@ -560,10 +595,11 @@ public class ChatMediaCell extends ChatBaseCell {
nameLayout = null;
updateSecretTimeText(messageObject);
}
if (messageObject.type == 9) { //doc
if (messageObject.type == 9) {
photoWidth = AndroidUtilities.dp(86);
photoHeight = AndroidUtilities.dp(86);
backgroundWidth = photoWidth + Math.max(nameWidth, infoWidth) + AndroidUtilities.dp(68);
availableTimeWidth = Math.max(nameWidth, infoWidth) + AndroidUtilities.dp(37);
backgroundWidth = photoWidth + availableTimeWidth + AndroidUtilities.dp(31);
currentPhotoObject = FileLoader.getClosestPhotoSizeWithSize(messageObject.photoThumbs, AndroidUtilities.getPhotoSize());
photoImage.setNeedsQualityThumb(true);
photoImage.setShouldGenerateQualityThumb(true);
@ -589,6 +625,7 @@ public class ChatMediaCell extends ChatBaseCell {
}
media = false;
availableTimeWidth = maxWidth - AndroidUtilities.dp(7);
measureTime(messageObject);
photoWidth = AndroidUtilities.dp(86);
photoHeight = AndroidUtilities.dp(86);
@ -604,6 +641,7 @@ 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=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 {
availableTimeWidth = AndroidUtilities.dp(200 - 14);
photoWidth = AndroidUtilities.dp(200);
photoHeight = AndroidUtilities.dp(100);
backgroundWidth = photoWidth + AndroidUtilities.dp(12);
@ -643,6 +681,7 @@ public class ChatMediaCell extends ChatBaseCell {
photoHeight *= maxWidth / photoWidth;
photoWidth = (int) maxWidth;
}
availableTimeWidth = photoWidth - AndroidUtilities.dp(14);
backgroundWidth = photoWidth + AndroidUtilities.dp(12);
currentPhotoObjectThumb = FileLoader.getClosestPhotoSizeWithSize(messageObject.photoThumbs, 80);
photoImage.setNeedsQualityThumb(false);
@ -667,10 +706,11 @@ public class ChatMediaCell extends ChatBaseCell {
messageObject.messageOwner.media.document.size, "webp", true);
}
} else {
int maxPhotoWidth;
if (AndroidUtilities.isTablet()) {
photoWidth = (int) (AndroidUtilities.getMinTabletSide() * 0.7f);
maxPhotoWidth = photoWidth = (int) (AndroidUtilities.getMinTabletSide() * 0.7f);
} else {
photoWidth = (int) (Math.min(AndroidUtilities.displaySize.x, AndroidUtilities.displaySize.y) * 0.7f);
maxPhotoWidth = photoWidth = (int) (Math.min(AndroidUtilities.displaySize.x, AndroidUtilities.displaySize.y) * 0.7f);
}
photoHeight = photoWidth + AndroidUtilities.dp(100);
@ -767,6 +807,7 @@ public class ChatMediaCell extends ChatBaseCell {
w = h = AndroidUtilities.dp(100);
}
availableTimeWidth = maxPhotoWidth - AndroidUtilities.dp(14);
measureTime(messageObject);
int timeWidthTotal = timeWidth + AndroidUtilities.dp(14 + (messageObject.isOutOwner() ? 20 : 0));
if (w < timeWidthTotal) {
@ -1022,7 +1063,7 @@ public class ChatMediaCell extends ChatBaseCell {
x = layoutWidth - backgroundWidth + AndroidUtilities.dp(6);
}
} else {
if (isChat && currentMessageObject.messageOwner.from_id > 0) {
if (isChat && currentMessageObject.isFromUser()) {
x = AndroidUtilities.dp(67);
} else {
x = AndroidUtilities.dp(15);
@ -1218,11 +1259,15 @@ public class ChatMediaCell extends ChatBaseCell {
nameLayout.draw(canvas);
canvas.restore();
if (infoLayout != null) {
canvas.save();
canvas.translate(photoImage.getImageX() + photoImage.getImageWidth() + AndroidUtilities.dp(10), photoImage.getImageY() + AndroidUtilities.dp(30));
infoLayout.draw(canvas);
canvas.restore();
try {
if (infoLayout != null) {
canvas.save();
canvas.translate(photoImage.getImageX() + photoImage.getImageWidth() + AndroidUtilities.dp(10), photoImage.getImageY() + nameLayout.getLineBottom(nameLayout.getLineCount() - 1) + AndroidUtilities.dp(10));
infoLayout.draw(canvas);
canvas.restore();
}
} catch (Exception e) {
FileLog.e("tmessages", e);
}
}
}

View File

@ -9,13 +9,10 @@
package org.telegram.ui.Cells;
import android.content.Context;
import android.content.Intent;
import android.graphics.Canvas;
import android.graphics.Paint;
import android.graphics.drawable.Drawable;
import android.net.Uri;
import android.os.Build;
import android.provider.Browser;
import android.text.Layout;
import android.text.Spannable;
import android.text.SpannableStringBuilder;
@ -23,6 +20,7 @@ import android.text.StaticLayout;
import android.text.TextPaint;
import android.text.TextUtils;
import android.text.style.ClickableSpan;
import android.text.style.URLSpan;
import android.view.MotionEvent;
import android.view.SoundEffectConstants;
import android.view.ViewStructure;
@ -218,7 +216,11 @@ public class ChatMessageCell extends ChatBaseCell {
} else if (linkPreviewPressed) {
try {
if (pressedLink != null) {
pressedLink.onClick(this);
if (pressedLink instanceof URLSpan) {
AndroidUtilities.openUrl(getContext(), ((URLSpan) pressedLink).getURL());
} else {
pressedLink.onClick(this);
}
} else {
if (drawImageButton && delegate != null) {
if (isGifDocument) {
@ -243,10 +245,7 @@ public class ChatMessageCell extends ChatBaseCell {
if (Build.VERSION.SDK_INT >= 16 && webPage.embed_url != null && webPage.embed_url.length() != 0) {
delegate.needOpenWebView(webPage.embed_url, webPage.site_name, webPage.url, webPage.embed_width, webPage.embed_height);
} else {
Uri uri = Uri.parse(webPage.url);
Intent intent = new Intent(Intent.ACTION_VIEW, uri);
intent.putExtra(Browser.EXTRA_APPLICATION_ID, getContext().getPackageName());
getContext().startActivity(intent);
AndroidUtilities.openUrl(getContext(), webPage.url);
}
}
}
@ -388,6 +387,9 @@ public class ChatMessageCell extends ChatBaseCell {
delegate.didPressUrl(currentMessageObject, pressedLink, true);
return;
}
} else if (pressedLink instanceof URLSpan) {
delegate.didPressUrl(currentMessageObject, pressedLink, true);
return;
}
super.onLongPress();
}
@ -420,7 +422,7 @@ public class ChatMessageCell extends ChatBaseCell {
int maxWidth;
if (AndroidUtilities.isTablet()) {
if (isChat && !messageObject.isOutOwner() && messageObject.messageOwner.from_id > 0) {
if (isChat && !messageObject.isOutOwner() && messageObject.isFromUser()) {
maxWidth = AndroidUtilities.getMinTabletSide() - AndroidUtilities.dp(122);
drawName = true;
} else {
@ -428,7 +430,7 @@ public class ChatMessageCell extends ChatBaseCell {
maxWidth = AndroidUtilities.getMinTabletSide() - AndroidUtilities.dp(80);
}
} else {
if (isChat && !messageObject.isOutOwner() && messageObject.messageOwner.from_id > 0) {
if (isChat && !messageObject.isOutOwner() && messageObject.isFromUser()) {
maxWidth = Math.min(AndroidUtilities.displaySize.x, AndroidUtilities.displaySize.y) - AndroidUtilities.dp(122);
drawName = true;
} else {
@ -438,6 +440,7 @@ public class ChatMessageCell extends ChatBaseCell {
}
backgroundWidth = maxWidth;
availableTimeWidth = backgroundWidth - AndroidUtilities.dp(29);
super.setMessageObject(messageObject);
@ -458,18 +461,21 @@ public class ChatMessageCell extends ChatBaseCell {
if (messageObject.messageOwner.media instanceof TLRPC.TL_messageMediaWebPage && messageObject.messageOwner.media.webpage instanceof TLRPC.TL_webPage) {
int linkPreviewMaxWidth;
if (AndroidUtilities.isTablet()) {
if (messageObject.messageOwner.from_id > 0 && (currentMessageObject.messageOwner.to_id.channel_id != 0 || currentMessageObject.messageOwner.to_id.chat_id != 0) && !currentMessageObject.isOut()) {
if (messageObject.isFromUser() && (currentMessageObject.messageOwner.to_id.channel_id != 0 || currentMessageObject.messageOwner.to_id.chat_id != 0) && !currentMessageObject.isOut()) {
linkPreviewMaxWidth = AndroidUtilities.getMinTabletSide() - AndroidUtilities.dp(122);
} else {
linkPreviewMaxWidth = AndroidUtilities.getMinTabletSide() - AndroidUtilities.dp(80);
}
} else {
if (messageObject.messageOwner.from_id > 0 && (currentMessageObject.messageOwner.to_id.channel_id != 0 || currentMessageObject.messageOwner.to_id.chat_id != 0) && !currentMessageObject.isOutOwner()) {
if (messageObject.isFromUser() && (currentMessageObject.messageOwner.to_id.channel_id != 0 || currentMessageObject.messageOwner.to_id.chat_id != 0) && !currentMessageObject.isOutOwner()) {
linkPreviewMaxWidth = Math.min(AndroidUtilities.displaySize.x, AndroidUtilities.displaySize.y) - AndroidUtilities.dp(122);
} else {
linkPreviewMaxWidth = Math.min(AndroidUtilities.displaySize.x, AndroidUtilities.displaySize.y) - AndroidUtilities.dp(80);
}
}
if (drawShareButton) {
linkPreviewMaxWidth -= AndroidUtilities.dp(20);
}
TLRPC.TL_webPage webPage = (TLRPC.TL_webPage) messageObject.messageOwner.media.webpage;
@ -791,6 +797,7 @@ public class ChatMessageCell extends ChatBaseCell {
if (hasLinkPreview || maxWidth - messageObject.lastLineWidth < timeMore) {
totalHeight += AndroidUtilities.dp(14);
backgroundWidth = Math.max(maxChildWidth, messageObject.lastLineWidth) + AndroidUtilities.dp(29);
backgroundWidth = Math.max(backgroundWidth, timeWidth + AndroidUtilities.dp(29));
} else {
int diff = maxChildWidth - messageObject.lastLineWidth;
if (diff >= 0 && diff <= timeMore) {
@ -816,7 +823,7 @@ public class ChatMessageCell extends ChatBaseCell {
textX = layoutWidth - backgroundWidth + AndroidUtilities.dp(10);
textY = AndroidUtilities.dp(10) + namesOffset;
} else {
textX = AndroidUtilities.dp(19) + (isChat && currentMessageObject.messageOwner.from_id > 0 ? AndroidUtilities.dp(52) : 0);
textX = AndroidUtilities.dp(19) + (isChat && currentMessageObject.isFromUser() ? AndroidUtilities.dp(52) : 0);
textY = AndroidUtilities.dp(10) + namesOffset;
}
}
@ -832,7 +839,7 @@ public class ChatMessageCell extends ChatBaseCell {
textX = layoutWidth - backgroundWidth + AndroidUtilities.dp(10);
textY = AndroidUtilities.dp(10) + namesOffset;
} else {
textX = AndroidUtilities.dp(19) + (isChat && currentMessageObject.messageOwner.from_id > 0 ? AndroidUtilities.dp(52) : 0);
textX = AndroidUtilities.dp(19) + (isChat && currentMessageObject.isFromUser() ? AndroidUtilities.dp(52) : 0);
textY = AndroidUtilities.dp(10) + namesOffset;
}

View File

@ -68,7 +68,7 @@ public class ChatMusicCell extends ChatBaseCell implements SeekBar.SeekBarDelega
super(context);
seekBar = new SeekBar(context);
seekBar.delegate = this;
seekBar.setDelegate(this);
radialProgress = new RadialProgress(this);
drawForwardedName = false;
@ -194,7 +194,8 @@ public class ChatMusicCell extends ChatBaseCell implements SeekBar.SeekBarDelega
int duration = 0;
int currentProgress = 0;
for (TLRPC.DocumentAttribute attribute : currentMessageObject.messageOwner.media.document.attributes) {
for (int a = 0; a < currentMessageObject.messageOwner.media.document.attributes.size(); a++) {
TLRPC.DocumentAttribute attribute = currentMessageObject.messageOwner.media.document.attributes.get(a);
if (attribute instanceof TLRPC.TL_documentAttributeAudio) {
duration = attribute.duration;
break;
@ -323,7 +324,7 @@ public class ChatMusicCell extends ChatBaseCell implements SeekBar.SeekBarDelega
buttonX = layoutWidth - backgroundWidth + AndroidUtilities.dp(13);
timeX = layoutWidth - backgroundWidth + AndroidUtilities.dp(63);
} else {
if (isChat && currentMessageObject.messageOwner.from_id > 0) {
if (isChat && currentMessageObject.isFromUser()) {
seekBarX = AndroidUtilities.dp(113);
buttonX = AndroidUtilities.dp(74);
timeX = AndroidUtilities.dp(124);
@ -348,9 +349,9 @@ public class ChatMusicCell 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.isFromUser() && !messageObject.isOutOwner() ? 102 : 50), AndroidUtilities.dp(300));
} else {
backgroundWidth = Math.min(AndroidUtilities.displaySize.x - AndroidUtilities.dp(isChat && messageObject.messageOwner.from_id > 0 ? 102 : 50), AndroidUtilities.dp(300));
backgroundWidth = Math.min(AndroidUtilities.displaySize.x - AndroidUtilities.dp(isChat && messageObject.isFromUser() && !messageObject.isOutOwner() ? 102 : 50), AndroidUtilities.dp(300));
}
if (messageObject.isOutOwner()) {
@ -375,6 +376,16 @@ public class ChatMusicCell extends ChatBaseCell implements SeekBar.SeekBarDelega
authorX = -(int) Math.ceil(authorLayout.getLineLeft(0));
}
int duration = 0;
for (int a = 0; a < messageObject.messageOwner.media.document.attributes.size(); a++) {
TLRPC.DocumentAttribute attribute = messageObject.messageOwner.media.document.attributes.get(a);
if (attribute instanceof TLRPC.TL_documentAttributeAudio) {
duration = attribute.duration;
break;
}
}
availableTimeWidth = backgroundWidth - AndroidUtilities.dp(72 + 14) - (int) Math.ceil(timePaint.measureText(String.format("%d:%02d / %d:%02d", duration / 60, duration % 60, duration / 60, duration % 60)));
super.setMessageObject(messageObject);
}
updateButtonState(dataChanged);

View File

@ -434,10 +434,10 @@ public class ContextLinkCell extends View implements MediaController.FileDownloa
fileName = FileLoader.getAttachFileName(result.document);
cacheFile = FileLoader.getPathToAttach(result.document);
} else if (result.content_url != null) {
fileName = Utilities.MD5(result.content_url) + "." + ImageLoader.getHttpUrlExtension(result.content_url);
fileName = Utilities.MD5(result.content_url) + "." + ImageLoader.getHttpUrlExtension(result.content_url, "jpg");
cacheFile = new File(FileLoader.getInstance().getDirectory(FileLoader.MEDIA_DIR_CACHE), fileName);
} else if (result.thumb_url != null) {
fileName = Utilities.MD5(result.thumb_url) + "." + ImageLoader.getHttpUrlExtension(result.thumb_url);
fileName = Utilities.MD5(result.thumb_url) + "." + ImageLoader.getHttpUrlExtension(result.thumb_url, "jpg");
cacheFile = new File(FileLoader.getInstance().getDirectory(FileLoader.MEDIA_DIR_CACHE), fileName);
}
} else if (gif != null) {

View File

@ -358,10 +358,10 @@ public class DialogCell extends BaseCell {
} else {
TLRPC.User fromUser = null;
TLRPC.Chat fromChat = null;
if (message.messageOwner.from_id > 0) {
if (message.isFromUser()) {
fromUser = MessagesController.getInstance().getUser(message.messageOwner.from_id);
} else if (message.messageOwner.from_id < 0) {
fromChat = MessagesController.getInstance().getChat(-message.messageOwner.from_id);
} else {
fromChat = MessagesController.getInstance().getChat(message.messageOwner.to_id.channel_id);
}
if (lastMessageDate != 0) {
@ -859,7 +859,11 @@ public class DialogCell extends BaseCell {
if (messageLayout != null) {
canvas.save();
canvas.translate(messageLeft, messageTop);
messageLayout.draw(canvas);
try {
messageLayout.draw(canvas);
} catch (Exception e) {
FileLog.e("tmessages", e);
}
canvas.restore();
}

View File

@ -16,6 +16,7 @@ import android.widget.LinearLayout;
import android.widget.TextView;
import org.telegram.messenger.AndroidUtilities;
import org.telegram.messenger.R;
import org.telegram.messenger.UserObject;
import org.telegram.tgnet.TLRPC;
import org.telegram.ui.Components.AvatarDrawable;
@ -34,6 +35,8 @@ public class MentionCell extends LinearLayout {
setOrientation(HORIZONTAL);
setBackgroundResource(R.drawable.list_selector);
avatarDrawable = new AvatarDrawable();
avatarDrawable.setSmallStyle(true);

View File

@ -22,14 +22,14 @@ import org.telegram.messenger.LocaleController;
import org.telegram.ui.Components.LayoutHelper;
import org.telegram.ui.Components.RadioButton;
public class LastSeenRadioCell extends FrameLayout {
public class RadioCell extends FrameLayout {
private TextView textView;
private RadioButton radioButton;
private static Paint paint;
private boolean needDivider;
public LastSeenRadioCell(Context context) {
public RadioCell(Context context) {
super(context);
if (paint == null) {

View File

@ -207,6 +207,11 @@ public class SharedDocumentCell extends FrameLayout implements MediaController.F
if (document != null && document.messageOwner.media != null && document.messageOwner.media.document != null) {
int idx;
String name = FileLoader.getDocumentFileName(document.messageOwner.media.document);
if (name.length() == 0) {
if (document.isMusic()) {
name = document.getMusicAuthor() + " - " + document.getMusicTitle();
}
}
placeholderImabeView.setVisibility(VISIBLE);
extTextView.setVisibility(VISIBLE);
placeholderImabeView.setImageResource(getThumbForNameOrMime(name, document.messageOwner.media.document.mime_type));

View File

@ -390,10 +390,7 @@ public class SharedLinkCell extends FrameLayout {
if (webPage != null && Build.VERSION.SDK_INT >= 16 && webPage.embed_url != null && webPage.embed_url.length() != 0) {
delegate.needOpenWebView(webPage);
} else {
Uri uri = Uri.parse(links.get(pressedLink));
Intent intent = new Intent(Intent.ACTION_VIEW, uri);
intent.putExtra(Browser.EXTRA_APPLICATION_ID, getContext().getPackageName());
getContext().startActivity(intent);
AndroidUtilities.openUrl(getContext(), links.get(pressedLink));
}
} catch (Exception e) {
FileLog.e("tmessages", e);

View File

@ -226,14 +226,21 @@ public class SharedPhotoVideoCell extends FrameLayoutFixed {
PhotoVideoView photoVideoView = photoVideoViews[a];
photoVideoView.imageView.getImageReceiver().setParentMessageObject(messageObject);
photoVideoView.imageView.getImageReceiver().setVisible(!PhotoViewer.getInstance().isShowingImage(messageObject), false);
if (messageObject.messageOwner.media instanceof TLRPC.TL_messageMediaVideo && messageObject.messageOwner.media.video != null) {
if (messageObject.isVideo()) {
photoVideoView.videoInfoContainer.setVisibility(VISIBLE);
int duration = messageObject.messageOwner.media.video.duration;
int duration = 0;
for (int b = 0; b < messageObject.messageOwner.media.document.attributes.size(); b++) {
TLRPC.DocumentAttribute attribute = messageObject.messageOwner.media.document.attributes.get(b);
if (attribute instanceof TLRPC.TL_documentAttributeVideo) {
duration = attribute.duration;
break;
}
}
int minutes = duration / 60;
int seconds = duration - minutes * 60;
photoVideoView.videoTextView.setText(String.format("%d:%02d", minutes, seconds));
if (messageObject.messageOwner.media.video.thumb != null) {
TLRPC.FileLocation location = messageObject.messageOwner.media.video.thumb.location;
if (messageObject.messageOwner.media.document.thumb != null) {
TLRPC.FileLocation location = messageObject.messageOwner.media.document.thumb.location;
photoVideoView.imageView.setImage(null, null, null, ApplicationLoader.applicationContext.getResources().getDrawable(R.drawable.photo_placeholder_in), null, location, "b", null, 0);
} else {
photoVideoView.imageView.setImageResource(R.drawable.photo_placeholder_in);

View File

@ -9,7 +9,11 @@
package org.telegram.ui.Cells;
import android.content.Context;
import android.graphics.Canvas;
import android.os.Build;
import android.view.Gravity;
import android.view.View;
import android.view.animation.AccelerateInterpolator;
import org.telegram.messenger.AndroidUtilities;
import org.telegram.messenger.R;
@ -21,6 +25,12 @@ import org.telegram.ui.Components.LayoutHelper;
public class StickerCell extends FrameLayoutFixed {
private BackupImageView imageView;
private TLRPC.Document sticker;
private long lastUpdateTime;
private boolean scaled;
private float scale;
private long time = 0;
private static AccelerateInterpolator interpolator = new AccelerateInterpolator(0.5f);
public StickerCell(Context context) {
super(context);
@ -48,6 +58,7 @@ public class StickerCell extends FrameLayoutFixed {
if (document != null && document.thumb != null) {
imageView.setImage(document.thumb.location, null, "webp", null);
}
sticker = document;
if (side == -1) {
setBackgroundResource(R.drawable.stickers_back_left);
setPadding(AndroidUtilities.dp(7), 0, 0, 0);
@ -65,4 +76,46 @@ public class StickerCell extends FrameLayoutFixed {
getBackground().setAlpha(230);
}
}
public TLRPC.Document getSticker() {
return sticker;
}
public void setScaled(boolean value) {
scaled = value;
lastUpdateTime = System.currentTimeMillis();
invalidate();
}
public boolean showingBitmap() {
return imageView.getImageReceiver().getBitmap() != null;
}
@Override
protected boolean drawChild(Canvas canvas, View child, long drawingTime) {
boolean result = super.drawChild(canvas, child, drawingTime);
if (child == imageView && (scaled && scale != 0.8f || !scaled && scale != 1.0f)) {
long newTime = System.currentTimeMillis();
long dt = (newTime - lastUpdateTime);
lastUpdateTime = newTime;
if (scaled && scale != 0.8f) {
scale -= dt / 400.0f;
if (scale < 0.8f) {
scale = 0.8f;
}
} else {
scale += dt / 400.0f;
if (scale > 1.0f) {
scale = 1.0f;
}
}
if (Build.VERSION.SDK_INT >= 11) {
imageView.setScaleX(scale);
imageView.setScaleY(scale);
}
imageView.invalidate();
invalidate();
}
return result;
}
}

View File

@ -36,7 +36,7 @@ public class StickerEmojiCell extends FrameLayout {
private boolean scaled;
private float scale;
private long time = 0;
private AccelerateInterpolator interpolator = new AccelerateInterpolator(0.5f);
private static AccelerateInterpolator interpolator = new AccelerateInterpolator(0.5f);
public StickerEmojiCell(Context context) {
super(context);
@ -63,7 +63,8 @@ public class StickerEmojiCell extends FrameLayout {
if (showEmoji) {
boolean set = false;
for (TLRPC.DocumentAttribute attribute : document.attributes) {
for (int a = 0; a < document.attributes.size(); a++) {
TLRPC.DocumentAttribute attribute = document.attributes.get(a);
if (attribute instanceof TLRPC.TL_documentAttributeSticker) {
if (attribute.alt != null && attribute.alt.length() > 0) {
emojiTextView.setText(Emoji.replaceEmoji(attribute.alt, emojiTextView.getPaint().getFontMetricsInt(), AndroidUtilities.dp(16), false));

View File

@ -252,7 +252,7 @@ public class ChannelCreateActivity extends BaseFragment implements NotificationC
progressDialog.show();
return;
}
final int reqId = MessagesController.getInstance().createChat(nameTextView.getText().toString(), new ArrayList<Integer>(), descriptionTextView.getText().toString(), ChatObject.CHAT_TYPE_CHANNEL);
final int reqId = MessagesController.getInstance().createChat(nameTextView.getText().toString(), new ArrayList<Integer>(), descriptionTextView.getText().toString(), ChatObject.CHAT_TYPE_CHANNEL, ChannelCreateActivity.this);
progressDialog = new ProgressDialog(getParentActivity());
progressDialog.setMessage(LocaleController.getString("Loading", R.string.Loading));
progressDialog.setCanceledOnTouchOutside(false);

View File

@ -47,6 +47,7 @@ import org.telegram.ui.ActionBar.ActionBar;
import org.telegram.ui.ActionBar.ActionBarMenu;
import org.telegram.ui.ActionBar.BaseFragment;
import org.telegram.ui.Cells.ShadowSectionCell;
import org.telegram.ui.Cells.TextCheckCell;
import org.telegram.ui.Cells.TextInfoPrivacyCell;
import org.telegram.ui.Cells.TextSettingsCell;
import org.telegram.ui.Components.AvatarDrawable;
@ -81,6 +82,7 @@ public class ChannelEditActivity extends BaseFragment implements AvatarUpdater.A
private TLRPC.InputFile uploadedAvatar;
private boolean wasPrivate;
private boolean privateAlertShown;
private boolean signMessages;
private boolean createAfterUpload;
private boolean donePressed;
@ -133,6 +135,7 @@ public class ChannelEditActivity extends BaseFragment implements AvatarUpdater.A
avatarUpdater.parentFragment = this;
avatarUpdater.delegate = this;
allowComments = !currentChat.broadcast;
signMessages = currentChat.signatures;
return super.onFragmentCreate();
}
@ -229,6 +232,10 @@ public class ChannelEditActivity extends BaseFragment implements AvatarUpdater.A
MessagesController.getInstance().updateChannelUserName(chatId, userNameTextView.getText().toString());
}
}
if (signMessages != currentChat.signatures) {
currentChat.signatures = true;
MessagesController.getInstance().toogleChannelSignatures(chatId, signMessages);
}
if (uploadedAvatar != null) {
MessagesController.getInstance().changeChatAvatar(chatId, uploadedAvatar);
} else if (avatar == null && currentChat.photo instanceof TLRPC.TL_chatPhoto) {
@ -392,13 +399,14 @@ public class ChannelEditActivity extends BaseFragment implements AvatarUpdater.A
TextInfoPrivacyCell infoCell = new TextInfoPrivacyCell(context);
if (currentChat.megagroup) {
infoCell.setText(LocaleController.getString("DescriptionInfoMega", R.string.DescriptionInfoMega));
infoCell.setBackgroundResource(currentChat.creator ? R.drawable.greydivider : R.drawable.greydivider_bottom);
} else {
infoCell.setText(LocaleController.getString("DescriptionInfo", R.string.DescriptionInfo));
infoCell.setBackgroundResource(R.drawable.greydivider);
}
infoCell.setBackgroundResource(R.drawable.greydivider);
linearLayout.addView(infoCell, LayoutHelper.createLinear(LayoutHelper.MATCH_PARENT, LayoutHelper.WRAP_CONTENT));
if (!currentChat.megagroup) {
if (/*BuildVars.DEBUG_VERSION && currentChat.megagroup && currentChat.creator || */!currentChat.megagroup) {
linearLayout2 = new LinearLayout(context);
linearLayout2.setOrientation(LinearLayout.VERTICAL);
linearLayout2.setBackgroundColor(0xffffffff);
@ -443,7 +451,11 @@ public class ChannelEditActivity extends BaseFragment implements AvatarUpdater.A
if (wasPrivate && hasFocus && !privateAlertShown) {
AlertDialog.Builder builder = new AlertDialog.Builder(getParentActivity());
builder.setTitle(LocaleController.getString("AppName", R.string.AppName));
builder.setMessage(LocaleController.getString("ChannelWasPrivateAlert", R.string.ChannelWasPrivateAlert));
if (currentChat.megagroup) {
//builder.setMessage(LocaleController.getString("MegaWasPrivateAlert", R.string.MegaWasPrivateAlert));
} else {
builder.setMessage(LocaleController.getString("ChannelWasPrivateAlert", R.string.ChannelWasPrivateAlert));
}
builder.setPositiveButton(LocaleController.getString("Close", R.string.Close), null);
showDialog(builder.create());
}
@ -476,11 +488,14 @@ public class ChannelEditActivity extends BaseFragment implements AvatarUpdater.A
infoCell = new TextInfoPrivacyCell(context);
infoCell.setBackgroundResource(R.drawable.greydivider);
infoCell.setText(LocaleController.getString("ChannelUsernameHelp", R.string.ChannelUsernameHelp));
if (currentChat.megagroup) {
//infoCell.setText(LocaleController.getString("MegaUsernameHelp", R.string.MegaUsernameHelp));
} else {
infoCell.setText(LocaleController.getString("ChannelUsernameHelp", R.string.ChannelUsernameHelp));
}
linearLayout.addView(infoCell, LayoutHelper.createLinear(LayoutHelper.MATCH_PARENT, LayoutHelper.WRAP_CONTENT));
}
/*frameLayout = new FrameLayoutFixed(context);
frameLayout.setBackgroundColor(0xffffffff);
linearLayout.addView(frameLayout, LayoutHelper.createLinear(LayoutHelper.MATCH_PARENT, LayoutHelper.WRAP_CONTENT));
@ -502,55 +517,80 @@ public class ChannelEditActivity extends BaseFragment implements AvatarUpdater.A
infoCell.setBackgroundResource(R.drawable.greydivider);
linearLayout.addView(infoCell, LayoutHelper.createLinear(LayoutHelper.MATCH_PARENT, LayoutHelper.WRAP_CONTENT));*/
frameLayout = new FrameLayoutFixed(context);
frameLayout.setBackgroundColor(0xffffffff);
linearLayout.addView(frameLayout, LayoutHelper.createLinear(LayoutHelper.MATCH_PARENT, LayoutHelper.WRAP_CONTENT));
if (!currentChat.megagroup && currentChat.creator) {
frameLayout = new FrameLayoutFixed(context);
frameLayout.setBackgroundColor(0xffffffff);
linearLayout.addView(frameLayout, LayoutHelper.createLinear(LayoutHelper.MATCH_PARENT, LayoutHelper.WRAP_CONTENT));
TextSettingsCell textCell = new TextSettingsCell(context);
textCell.setTextColor(0xffed3d39);
textCell.setBackgroundResource(R.drawable.list_selector);
if (currentChat.megagroup) {
textCell.setText(LocaleController.getString("DeleteMega", R.string.DeleteMega), false);
} else {
textCell.setText(LocaleController.getString("ChannelDelete", R.string.ChannelDelete), false);
}
frameLayout.addView(textCell, LayoutHelper.createFrame(LayoutHelper.MATCH_PARENT, LayoutHelper.WRAP_CONTENT));
textCell.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
AlertDialog.Builder builder = new AlertDialog.Builder(getParentActivity());
if (currentChat.megagroup) {
builder.setMessage(LocaleController.getString("MegaDeleteAlert", R.string.MegaDeleteAlert));
} else {
builder.setMessage(LocaleController.getString("ChannelDeleteAlert", R.string.ChannelDeleteAlert));
TextCheckCell textCell = new TextCheckCell(context);
textCell.setBackgroundResource(R.drawable.list_selector);
textCell.setTextAndCheck(LocaleController.getString("ChannelSignMessages", R.string.ChannelSignMessages), signMessages, false);
frameLayout.addView(textCell, LayoutHelper.createFrame(LayoutHelper.MATCH_PARENT, LayoutHelper.WRAP_CONTENT));
textCell.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
signMessages = !signMessages;
((TextCheckCell) v).setChecked(signMessages);
}
builder.setTitle(LocaleController.getString("AppName", R.string.AppName));
builder.setPositiveButton(LocaleController.getString("OK", R.string.OK), new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialogInterface, int i) {
NotificationCenter.getInstance().removeObserver(this, NotificationCenter.closeChats);
if (AndroidUtilities.isTablet()) {
NotificationCenter.getInstance().postNotificationName(NotificationCenter.closeChats, -(long) chatId);
} else {
NotificationCenter.getInstance().postNotificationName(NotificationCenter.closeChats);
}
MessagesController.getInstance().deleteUserFromChat(chatId, MessagesController.getInstance().getUser(UserConfig.getClientUserId()), info);
finishFragment();
}
});
builder.setNegativeButton(LocaleController.getString("Cancel", R.string.Cancel), null);
showDialog(builder.create());
}
});
});
infoCell = new TextInfoPrivacyCell(context);
infoCell.setBackgroundResource(R.drawable.greydivider_bottom);
if (currentChat.megagroup) {
infoCell.setText(LocaleController.getString("MegaDeleteInfo", R.string.MegaDeleteInfo));
} else {
infoCell.setText(LocaleController.getString("ChannelDeleteInfo", R.string.ChannelDeleteInfo));
infoCell = new TextInfoPrivacyCell(context);
infoCell.setBackgroundResource(R.drawable.greydivider);
infoCell.setText(LocaleController.getString("ChannelSignMessagesInfo", R.string.ChannelSignMessagesInfo));
linearLayout.addView(infoCell, LayoutHelper.createLinear(LayoutHelper.MATCH_PARENT, LayoutHelper.WRAP_CONTENT));
}
if (currentChat.creator) {
frameLayout = new FrameLayoutFixed(context);
frameLayout.setBackgroundColor(0xffffffff);
linearLayout.addView(frameLayout, LayoutHelper.createLinear(LayoutHelper.MATCH_PARENT, LayoutHelper.WRAP_CONTENT));
TextSettingsCell textCell = new TextSettingsCell(context);
textCell.setTextColor(0xffed3d39);
textCell.setBackgroundResource(R.drawable.list_selector);
if (currentChat.megagroup) {
textCell.setText(LocaleController.getString("DeleteMega", R.string.DeleteMega), false);
} else {
textCell.setText(LocaleController.getString("ChannelDelete", R.string.ChannelDelete), false);
}
frameLayout.addView(textCell, LayoutHelper.createFrame(LayoutHelper.MATCH_PARENT, LayoutHelper.WRAP_CONTENT));
textCell.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
AlertDialog.Builder builder = new AlertDialog.Builder(getParentActivity());
if (currentChat.megagroup) {
builder.setMessage(LocaleController.getString("MegaDeleteAlert", R.string.MegaDeleteAlert));
} else {
builder.setMessage(LocaleController.getString("ChannelDeleteAlert", R.string.ChannelDeleteAlert));
}
builder.setTitle(LocaleController.getString("AppName", R.string.AppName));
builder.setPositiveButton(LocaleController.getString("OK", R.string.OK), new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialogInterface, int i) {
NotificationCenter.getInstance().removeObserver(this, NotificationCenter.closeChats);
if (AndroidUtilities.isTablet()) {
NotificationCenter.getInstance().postNotificationName(NotificationCenter.closeChats, -(long) chatId);
} else {
NotificationCenter.getInstance().postNotificationName(NotificationCenter.closeChats);
}
MessagesController.getInstance().deleteUserFromChat(chatId, MessagesController.getInstance().getUser(UserConfig.getClientUserId()), info);
finishFragment();
}
});
builder.setNegativeButton(LocaleController.getString("Cancel", R.string.Cancel), null);
showDialog(builder.create());
}
});
infoCell = new TextInfoPrivacyCell(context);
infoCell.setBackgroundResource(R.drawable.greydivider_bottom);
if (currentChat.megagroup) {
infoCell.setText(LocaleController.getString("MegaDeleteInfo", R.string.MegaDeleteInfo));
} else {
infoCell.setText(LocaleController.getString("ChannelDeleteInfo", R.string.ChannelDeleteInfo));
}
linearLayout.addView(infoCell, LayoutHelper.createLinear(LayoutHelper.MATCH_PARENT, LayoutHelper.WRAP_CONTENT));
}
linearLayout.addView(infoCell, LayoutHelper.createLinear(LayoutHelper.MATCH_PARENT, LayoutHelper.WRAP_CONTENT));
nameTextView.setText(currentChat.title);
nameTextView.setSelection(nameTextView.length());
@ -655,11 +695,20 @@ public class ChannelEditActivity extends BaseFragment implements AvatarUpdater.A
for (int a = 0; a < name.length(); a++) {
char ch = name.charAt(a);
if (a == 0 && ch >= '0' && ch <= '9') {
if (alert) {
showErrorAlert(LocaleController.getString("LinkInvalidStartNumber", R.string.LinkInvalidStartNumber));
if (currentChat.megagroup) {
if (alert) {
//showErrorAlert(LocaleController.getString("LinkInvalidStartNumberMega", R.string.LinkInvalidStartNumberMega));
} else {
//checkTextView.setText(LocaleController.getString("LinkInvalidStartNumberMega", R.string.LinkInvalidStartNumberMega));
checkTextView.setTextColor(0xffcf3030);
}
} else {
checkTextView.setText(LocaleController.getString("LinkInvalidStartNumber", R.string.LinkInvalidStartNumber));
checkTextView.setTextColor(0xffcf3030);
if (alert) {
showErrorAlert(LocaleController.getString("LinkInvalidStartNumber", R.string.LinkInvalidStartNumber));
} else {
checkTextView.setText(LocaleController.getString("LinkInvalidStartNumber", R.string.LinkInvalidStartNumber));
checkTextView.setTextColor(0xffcf3030);
}
}
return false;
}
@ -675,11 +724,20 @@ public class ChannelEditActivity extends BaseFragment implements AvatarUpdater.A
}
}
if (name == null || name.length() < 5) {
if (alert) {
showErrorAlert(LocaleController.getString("LinkInvalidShort", R.string.LinkInvalidShort));
if (currentChat.megagroup) {
if (alert) {
//showErrorAlert(LocaleController.getString("LinkInvalidShortMega", R.string.LinkInvalidShortMega));
} else {
//checkTextView.setText(LocaleController.getString("LinkInvalidShortMega", R.string.LinkInvalidShortMega));
checkTextView.setTextColor(0xffcf3030);
}
} else {
checkTextView.setText(LocaleController.getString("LinkInvalidShort", R.string.LinkInvalidShort));
checkTextView.setTextColor(0xffcf3030);
if (alert) {
showErrorAlert(LocaleController.getString("LinkInvalidShort", R.string.LinkInvalidShort));
} else {
checkTextView.setText(LocaleController.getString("LinkInvalidShort", R.string.LinkInvalidShort));
checkTextView.setTextColor(0xffcf3030);
}
}
return false;
}

View File

@ -36,7 +36,10 @@ import org.telegram.ui.ActionBar.ActionBar;
import org.telegram.ui.ActionBar.ActionBarMenu;
import org.telegram.ui.ActionBar.BaseFragment;
import org.telegram.ui.Adapters.BaseFragmentAdapter;
import org.telegram.ui.Cells.HeaderCell;
import org.telegram.ui.Cells.RadioCell;
import org.telegram.ui.Cells.ShadowSectionCell;
import org.telegram.ui.Cells.TextCell;
import org.telegram.ui.Cells.TextInfoPrivacyCell;
import org.telegram.ui.Cells.TextSettingsCell;
import org.telegram.ui.Cells.UserCell;
@ -78,7 +81,7 @@ public class ChannelUsersActivity extends BaseFragment implements NotificationCe
if (type == 0) {
participantsStartRow = 0;
} else if (type == 1) {
participantsStartRow = isAdmin ? 2 : 0;
participantsStartRow = isAdmin && isMegagroup ? 4 : 0;
} else if (type == 2) {
participantsStartRow = isAdmin ? (isPublic ? 2 : 3) : 0;
}
@ -134,7 +137,7 @@ public class ChannelUsersActivity extends BaseFragment implements NotificationCe
}
frameLayout.addView(emptyView, LayoutHelper.createFrame(LayoutHelper.MATCH_PARENT, LayoutHelper.MATCH_PARENT));
ListView listView = new ListView(context);
final ListView listView = new ListView(context);
listView.setEmptyView(emptyView);
listView.setDivider(null);
listView.setDividerHeight(0);
@ -173,7 +176,33 @@ public class ChannelUsersActivity extends BaseFragment implements NotificationCe
} else if (type == 1) {
if (isAdmin) {
if (i == 0) {
if (isMegagroup && (i == 1 || i == 2)) {
TLRPC.Chat chat = MessagesController.getInstance().getChat(chatId);
if (chat == null) {
return;
}
boolean changed = false;
if (i == 1 && !chat.democracy) {
chat.democracy = true;
changed = true;
} else if (i == 2 && chat.democracy) {
chat.democracy = false;
changed = true;
}
if (changed) {
MessagesController.getInstance().toogleChannelInvites(chatId, chat.democracy);
int count = listView.getChildCount();
for (int a = 0; a < count; a++) {
View child = listView.getChildAt(a);
if (child instanceof RadioCell) {
int num = (Integer) child.getTag();
((RadioCell) child).setChecked(num == 0 && chat.democracy || num == 1 && !chat.democracy, true);
}
}
}
return;
}
if (i == participantsStartRow + participants.size()) {
Bundle args = new Bundle();
args.putBoolean("onlyUsers", true);
args.putBoolean("destroyAfterSelect", true);
@ -192,6 +221,7 @@ public class ChannelUsersActivity extends BaseFragment implements NotificationCe
}
});
presentFragment(fragment);
return;
}
}
}
@ -243,16 +273,18 @@ public class ChannelUsersActivity extends BaseFragment implements NotificationCe
ConnectionsManager.getInstance().sendRequest(req, new RequestDelegate() {
@Override
public void run(TLObject response, TLRPC.TL_error error) {
final TLRPC.Updates updates = (TLRPC.Updates) response;
MessagesController.getInstance().processUpdates(updates, false);
if (!updates.chats.isEmpty()) {
AndroidUtilities.runOnUIThread(new Runnable() {
@Override
public void run() {
TLRPC.Chat chat = updates.chats.get(0);
MessagesController.getInstance().loadFullChat(chat.id, 0, true);
}
}, 1000);
if (response != null) {
final TLRPC.Updates updates = (TLRPC.Updates) response;
MessagesController.getInstance().processUpdates(updates, false);
if (!updates.chats.isEmpty()) {
AndroidUtilities.runOnUIThread(new Runnable() {
@Override
public void run() {
TLRPC.Chat chat = updates.chats.get(0);
MessagesController.getInstance().loadFullChat(chat.id, 0, true);
}
}, 1000);
}
}
}
});
@ -487,12 +519,12 @@ public class ChannelUsersActivity extends BaseFragment implements NotificationCe
}
}
} else if (type == 1) {
if (isAdmin) {
if (i == 0) {
return true;
} else if (i == 1) {
return false;
}
if (i == participantsStartRow + participants.size()) {
return isAdmin;
} else if (i == participantsStartRow + participants.size() + 1) {
return false;
} else if (isMegagroup && isAdmin && i < 4) {
return i == 1 || i == 2;
}
}
return i != participants.size() + participantsStartRow && participants.get(i - participantsStartRow).user_id != UserConfig.getClientUserId();
@ -502,6 +534,8 @@ public class ChannelUsersActivity extends BaseFragment implements NotificationCe
public int getCount() {
if (participants.isEmpty() && type == 0 || loadingUsers && !firstLoaded) {
return 0;
} else if (type == 1) {
return participants.size() + (isAdmin ? 2 : 1) + (isAdmin && isMegagroup ? 4 : 0);
}
return participants.size() + participantsStartRow + 1;
}
@ -557,13 +591,14 @@ public class ChannelUsersActivity extends BaseFragment implements NotificationCe
((TextInfoPrivacyCell) view).setText(String.format("%1$s\n\n%2$s", LocaleController.getString("NoBlockedGroup", R.string.NoBlockedGroup), LocaleController.getString("UnblockText", R.string.UnblockText)));
view.setBackgroundResource(R.drawable.greydivider_bottom);
} else if (type == 1) {
if (i == 1 && isAdmin) {
if (isAdmin) {
if (isMegagroup) {
((TextInfoPrivacyCell) view).setText(LocaleController.getString("MegaAdminsInfo", R.string.MegaAdminsInfo));
view.setBackgroundResource(R.drawable.greydivider_bottom);
} else {
((TextInfoPrivacyCell) view).setText(LocaleController.getString("ChannelAdminsInfo", R.string.ChannelAdminsInfo));
view.setBackgroundResource(R.drawable.greydivider_bottom);
}
view.setBackgroundResource(R.drawable.greydivider);
} else {
((TextInfoPrivacyCell) view).setText("");
view.setBackgroundResource(R.drawable.greydivider_bottom);
@ -594,12 +629,38 @@ public class ChannelUsersActivity extends BaseFragment implements NotificationCe
actionCell.setText(LocaleController.getString("ChannelInviteViaLink", R.string.ChannelInviteViaLink), false);
}
} else if (type == 1) {
actionCell.setText(LocaleController.getString("ChannelAddAdmin", R.string.ChannelAddAdmin), true);
actionCell.setTextAndIcon(LocaleController.getString("ChannelAddAdmin", R.string.ChannelAddAdmin), R.drawable.managers, false);
}
} else if (viewType == 3) {
if (view == null) {
view = new ShadowSectionCell(mContext);
}
} else if (viewType == 4) {
if (view == null) {
view = new TextCell(mContext);
view.setBackgroundColor(0xffffffff);
}
((TextCell) view).setTextAndIcon(LocaleController.getString("ChannelAddAdmin", R.string.ChannelAddAdmin), R.drawable.managers);
} else if (viewType == 5) {
if (view == null) {
view = new HeaderCell(mContext);
view.setBackgroundColor(0xffffffff);
}
((HeaderCell) view).setText(LocaleController.getString("WhoCanAddMembers", R.string.WhoCanAddMembers));
} else if (viewType == 6) {
if (view == null) {
view = new RadioCell(mContext);
view.setBackgroundColor(0xffffffff);
}
RadioCell radioCell = (RadioCell) view;
TLRPC.Chat chat = MessagesController.getInstance().getChat(chatId);
if (i == 1) {
radioCell.setTag(0);
radioCell.setText(LocaleController.getString("WhoCanAddMembersAllMembers", R.string.WhoCanAddMembersAllMembers), chat != null && chat.democracy, true);
} else if (i == 2) {
radioCell.setTag(1);
radioCell.setText(LocaleController.getString("WhoCanAddMembersAdmins", R.string.WhoCanAddMembersAdmins), chat != null && !chat.democracy, false);
}
}
return view;
}
@ -608,9 +669,18 @@ public class ChannelUsersActivity extends BaseFragment implements NotificationCe
public int getItemViewType(int i) {
if (type == 1) {
if (isAdmin) {
if (i == 0) {
return 2;
} else if (i == 1) {
if (isMegagroup) {
if (i == 0) {
return 5;
} else if (i == 1 || i == 2) {
return 6;
} else if (i == 3) {
return 3;
}
}
if (i == participantsStartRow + participants.size()) {
return 4;
} else if (i == participantsStartRow + participants.size() + 1) {
return 1;
}
}
@ -639,12 +709,12 @@ public class ChannelUsersActivity extends BaseFragment implements NotificationCe
@Override
public int getViewTypeCount() {
return 4;
return 7;
}
@Override
public boolean isEmpty() {
return participants.isEmpty();
return getCount() == 0 || participants.isEmpty() && loadingUsers;
}
}
}

File diff suppressed because it is too large Load Diff

View File

@ -13,12 +13,9 @@ import android.app.AlertDialog;
import android.app.Dialog;
import android.content.Context;
import android.content.DialogInterface;
import android.content.Intent;
import android.content.SharedPreferences;
import android.net.Uri;
import android.provider.Browser;
import org.telegram.messenger.FileLog;
import org.telegram.messenger.AndroidUtilities;
import org.telegram.messenger.LocaleController;
import org.telegram.messenger.MessagesController;
import org.telegram.messenger.MessagesStorage;
@ -97,13 +94,7 @@ public class AlertsCreator {
builder.setNegativeButton(LocaleController.getString("MoreInfo", R.string.MoreInfo), new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialogInterface, int i) {
try {
Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse(LocaleController.getString("NobodyLikesSpamUrl", R.string.NobodyLikesSpamUrl)));
intent.putExtra(Browser.EXTRA_APPLICATION_ID, fragment.getParentActivity().getPackageName());
fragment.getParentActivity().startActivity(intent);
} catch (Exception e) {
FileLog.e("tmessages", e);
}
AndroidUtilities.openUrl(fragment.getParentActivity(), LocaleController.getString("NobodyLikesSpamUrl", R.string.NobodyLikesSpamUrl));
}
});
break;
@ -144,6 +135,16 @@ public class AlertsCreator {
builder.setMessage(LocaleController.getString("GroupUserCantBot", R.string.GroupUserCantBot));
}
break;
case "USER_PRIVACY_RESTRICTED":
if (isChannel) {
builder.setMessage(LocaleController.getString("InviteToChannelError", R.string.InviteToChannelError));
} else {
builder.setMessage(LocaleController.getString("InviteToGroupError", R.string.InviteToGroupError));
}
break;
case "USERS_TOO_FEW":
builder.setMessage(LocaleController.getString("CreateGroupError", R.string.CreateGroupError));
break;
}
builder.setPositiveButton(LocaleController.getString("OK", R.string.OK), null);
fragment.showDialog(builder.create(), true);

View File

@ -21,7 +21,9 @@ import android.media.AudioManager;
import android.os.Build;
import android.os.PowerManager;
import android.text.Editable;
import android.text.InputFilter;
import android.text.Layout;
import android.text.SpannableStringBuilder;
import android.text.StaticLayout;
import android.text.TextPaint;
import android.text.TextUtils;
@ -42,6 +44,7 @@ import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.PopupWindow;
import android.widget.TextView;
import android.widget.Toast;
import org.telegram.messenger.AndroidUtilities;
import org.telegram.messenger.ChatObject;
@ -50,6 +53,7 @@ import org.telegram.messenger.LocaleController;
import org.telegram.messenger.MediaController;
import org.telegram.messenger.MessageObject;
import org.telegram.messenger.MessagesController;
import org.telegram.messenger.NotificationsController;
import org.telegram.messenger.SendMessagesHelper;
import org.telegram.messenger.FileLog;
import org.telegram.messenger.NotificationCenter;
@ -66,6 +70,7 @@ import org.telegram.messenger.AnimationCompat.ViewProxy;
import org.telegram.messenger.ApplicationLoader;
import org.telegram.ui.StickersActivity;
import java.io.File;
import java.util.Locale;
public class ChatActivityEnterView extends FrameLayoutFixed implements NotificationCenter.NotificationCenterDelegate, SizeNotifierFrameLayout.SizeNotifierFrameLayoutDelegate {
@ -78,6 +83,64 @@ public class ChatActivityEnterView extends FrameLayoutFixed implements Notificat
void onAttachButtonShow();
void onWindowSizeChanged(int size);
void onStickersTab(boolean opened);
void onMessageEditEnd();
}
private class SeekBarWaveformView extends View {
private SeekBarWaveform seekBarWaveform;
public SeekBarWaveformView(Context context) {
super(context);
seekBarWaveform = new SeekBarWaveform(context);
seekBarWaveform.setColors(0xffa2cef8, 0xffffffff, 0xffa2cef8);
seekBarWaveform.setDelegate(new SeekBar.SeekBarDelegate() {
@Override
public void onSeekBarDrag(float progress) {
audioToSendMessageObject.audioProgress = progress;
MediaController.getInstance().seekToProgress(audioToSendMessageObject, progress);
}
});
}
public void setWaveform(byte[] waveform) {
seekBarWaveform.setWaveform(waveform);
invalidate();
}
public void setProgress(float progress) {
seekBarWaveform.setProgress(progress);
invalidate();
}
public boolean isDragging() {
return seekBarWaveform.isDragging();
}
@Override
public boolean onTouchEvent(MotionEvent event) {
boolean result = seekBarWaveform.onTouch(event.getAction(), event.getX(), event.getY());
if (result) {
if (event.getAction() == MotionEvent.ACTION_DOWN) {
requestDisallowInterceptTouchEvent(true);
}
invalidate();
}
return result || super.onTouchEvent(event);
}
@Override
protected void onLayout(boolean changed, int left, int top, int right, int bottom) {
super.onLayout(changed, left, top, right, bottom);
seekBarWaveform.width = right - left;
seekBarWaveform.height = bottom - top;
}
@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
seekBarWaveform.draw(canvas);
}
}
private class EditTextCaption extends EditText {
@ -137,16 +200,20 @@ public class ChatActivityEnterView extends FrameLayoutFixed implements Notificat
@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
if (captionLayout != null && userNameLength == length()) {
Paint paint = getPaint();
int oldColor = getPaint().getColor();
paint.setColor(0xffb2b2b2);
canvas.save();
canvas.translate(xOffset, yOffset);
captionLayout.draw(canvas);
canvas.restore();
paint.setColor(oldColor);
try {
super.onDraw(canvas);
if (captionLayout != null && userNameLength == length()) {
Paint paint = getPaint();
int oldColor = getPaint().getColor();
paint.setColor(0xffb2b2b2);
canvas.save();
canvas.translate(xOffset, yOffset);
captionLayout.draw(canvas);
canvas.restore();
paint.setColor(oldColor);
}
} catch (Exception e) {
FileLog.e("tmessages", e);
}
}
@ -167,21 +234,33 @@ public class ChatActivityEnterView extends FrameLayoutFixed implements Notificat
private TextView recordTimeText;
private ImageView audioSendButton;
private FrameLayout recordPanel;
private FrameLayout recordedAudioPanel;
private SeekBarWaveformView recordedAudioSeekBar;
private ImageView recordedAudioPlayButton;
private TextView recordedAudioTimeTextView;
private LinearLayout slideText;
private RecordDot recordDot;
private SizeNotifierFrameLayout sizeNotifierLayout;
private LinearLayout attachButton;
private ImageView botButton;
private LinearLayout textFieldContainer;
private FrameLayout sendButtonContainer;
private View topView;
private PopupWindow botKeyboardPopup;
private BotKeyboardView botKeyboardView;
private ImageView asAdminButton;
private ImageView notifyButton;
private RecordCircle recordCircle;
private ContextProgressView contextProgressView;
private MessageObject editingMessageObject;
private boolean editingCaption;
private int currentPopupContentType = -1;
private boolean silent;
private boolean canWriteToChannel;
private boolean isAsAdmin;
private boolean adminModeAvailable;
@ -228,6 +307,10 @@ public class ChatActivityEnterView extends FrameLayoutFixed implements Notificat
private boolean messageWebPageSearch = true;
private ChatActivityEnterViewDelegate delegate;
private TLRPC.TL_document audioToSend;
private String audioToSendPath;
private MessageObject audioToSendMessageObject;
private float topViewAnimation;
private boolean topViewShowed;
private boolean needShowTopView;
@ -270,16 +353,16 @@ public class ChatActivityEnterView extends FrameLayoutFixed implements Notificat
@Override
protected void onDraw(Canvas canvas) {
dotDrawable.setBounds(0, 0, AndroidUtilities.dp(11), AndroidUtilities.dp(11));
dotDrawable.setAlpha(185 + (int) (70 * alpha));
dotDrawable.setAlpha((int) (255 * alpha));
long dt = (System.currentTimeMillis() - lastUpdateTime);
if (!isIncr) {
alpha -= dt / 200.0f;
alpha -= dt / 400.0f;
if (alpha <= 0) {
alpha = 0;
isIncr = true;
}
} else {
alpha += dt / 200.0f;
alpha += dt / 400.0f;
if (alpha >= 1) {
alpha = 1;
isIncr = false;
@ -379,6 +462,8 @@ public class ChatActivityEnterView extends FrameLayoutFixed implements Notificat
NotificationCenter.getInstance().addObserver(this, NotificationCenter.audioDidSent);
NotificationCenter.getInstance().addObserver(this, NotificationCenter.emojiDidLoaded);
NotificationCenter.getInstance().addObserver(this, NotificationCenter.audioRouteChanged);
NotificationCenter.getInstance().addObserver(this, NotificationCenter.audioDidReset);
NotificationCenter.getInstance().addObserver(this, NotificationCenter.audioProgressDidChanged);
parentActivity = context;
parentFragment = fragment;
sizeNotifierLayout = parent;
@ -491,7 +576,9 @@ public class ChatActivityEnterView extends FrameLayoutFixed implements Notificat
if (count > 2 || charSequence == null || charSequence.length() == 0) {
messageWebPageSearch = true;
}
delegate.onTextChanged(charSequence, before > count + 1 || (count - before) > 2);
if (!ignoreTextChange) {
delegate.onTextChanged(charSequence, before > count + 1 || (count - before) > 2);
}
}
if (innerTextChange != 2 && before != count && (count - before) > 1) {
processChange = true;
@ -584,8 +671,88 @@ public class ChatActivityEnterView extends FrameLayoutFixed implements Notificat
preferences.edit().putBoolean("asadmin_" + dialog_id, isAsAdmin).commit();
}
});
notifyButton = new ImageView(context);
notifyButton.setImageResource(silent ? R.drawable.notify_members_off : R.drawable.notify_members_on);
notifyButton.setScaleType(ImageView.ScaleType.CENTER);
notifyButton.setVisibility(canWriteToChannel ? VISIBLE : GONE);
attachButton.addView(notifyButton, LayoutHelper.createLinear(48, 48));
notifyButton.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
silent = !silent;
notifyButton.setImageResource(silent ? R.drawable.notify_members_off : R.drawable.notify_members_on);
ApplicationLoader.applicationContext.getSharedPreferences("Notifications", Activity.MODE_PRIVATE).edit().putBoolean("silent_" + dialog_id, silent).commit();
NotificationsController.updateServerNotificationsSettings(dialog_id);
if (silent) {
Toast.makeText(parentActivity, LocaleController.getString("ChannelNotifyMembersInfoOff", R.string.ChannelNotifyMembersInfoOff), Toast.LENGTH_SHORT).show();
} else {
Toast.makeText(parentActivity, LocaleController.getString("ChannelNotifyMembersInfoOn", R.string.ChannelNotifyMembersInfoOn), Toast.LENGTH_SHORT).show();
}
}
});
}
recordedAudioPanel = new FrameLayoutFixed(context);
recordedAudioPanel.setVisibility(audioToSend == null ? GONE : VISIBLE);
recordedAudioPanel.setBackgroundColor(0xffffffff);
recordedAudioPanel.setFocusable(true);
recordedAudioPanel.setFocusableInTouchMode(true);
recordedAudioPanel.setClickable(true);
frameLayout.addView(recordedAudioPanel, LayoutHelper.createFrame(LayoutHelper.MATCH_PARENT, 48, Gravity.BOTTOM));
ImageView imageView = new ImageView(context);
imageView.setScaleType(ImageView.ScaleType.CENTER);
imageView.setImageResource(R.drawable.ic_ab_fwd_delete);
recordedAudioPanel.addView(imageView, LayoutHelper.createFrame(48, 48));
imageView.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
MessageObject playing = MediaController.getInstance().getPlayingMessageObject();
if (playing != null && playing == audioToSendMessageObject) {
MediaController.getInstance().cleanupPlayer(true, true);
}
if (audioToSendPath != null) {
new File(audioToSendPath).delete();
}
hideRecordedAudioPanel();
checkSendButton(true);
}
});
View view = new View(context);
view.setBackgroundResource(R.drawable.recorded);
recordedAudioPanel.addView(view, LayoutHelper.createFrame(LayoutHelper.MATCH_PARENT, 32, Gravity.CENTER_VERTICAL | Gravity.LEFT, 48, 0, 0, 0));
recordedAudioSeekBar = new SeekBarWaveformView(context);
recordedAudioPanel.addView(recordedAudioSeekBar, LayoutHelper.createFrame(LayoutHelper.MATCH_PARENT, 32, Gravity.CENTER_VERTICAL | Gravity.LEFT, 48 + 44, 0, 52, 0));
recordedAudioPlayButton = new ImageView(context);
recordedAudioPlayButton.setImageResource(R.drawable.s_player_play_states);
recordedAudioPlayButton.setScaleType(ImageView.ScaleType.CENTER);
recordedAudioPanel.addView(recordedAudioPlayButton, LayoutHelper.createFrame(48, 48, Gravity.LEFT | Gravity.BOTTOM, 48, 0, 0, 0));
recordedAudioPlayButton.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
if (audioToSend == null) {
return;
}
if (MediaController.getInstance().isPlayingAudio(audioToSendMessageObject) && !MediaController.getInstance().isAudioPaused()) {
MediaController.getInstance().pauseAudio(audioToSendMessageObject);
recordedAudioPlayButton.setImageResource(R.drawable.s_player_play_states);
} else {
recordedAudioPlayButton.setImageResource(R.drawable.s_player_pause_states);
MediaController.getInstance().playAudio(audioToSendMessageObject);
}
}
});
recordedAudioTimeTextView = new TextView(context);
recordedAudioTimeTextView.setTextColor(0xffffffff);
recordedAudioTimeTextView.setTextSize(TypedValue.COMPLEX_UNIT_DIP, 13);
recordedAudioTimeTextView.setText("0:13");
recordedAudioPanel.addView(recordedAudioTimeTextView, LayoutHelper.createFrame(LayoutHelper.WRAP_CONTENT, LayoutHelper.WRAP_CONTENT, Gravity.RIGHT | Gravity.CENTER_VERTICAL, 0, 0, 13, 0));
recordPanel = new FrameLayoutFixed(context);
recordPanel.setVisibility(GONE);
recordPanel.setBackgroundColor(0xffffffff);
@ -595,7 +762,7 @@ public class ChatActivityEnterView extends FrameLayoutFixed implements Notificat
slideText.setOrientation(LinearLayout.HORIZONTAL);
recordPanel.addView(slideText, LayoutHelper.createFrame(LayoutHelper.WRAP_CONTENT, LayoutHelper.WRAP_CONTENT, Gravity.CENTER, 30, 0, 0, 0));
ImageView imageView = new ImageView(context);
imageView = new ImageView(context);
imageView.setImageResource(R.drawable.slidearrow);
slideText.addView(imageView, LayoutHelper.createLinear(LayoutHelper.WRAP_CONTENT, LayoutHelper.WRAP_CONTENT, Gravity.CENTER_VERTICAL, 0, 1, 0, 0));
@ -620,8 +787,8 @@ public class ChatActivityEnterView extends FrameLayoutFixed implements Notificat
recordTimeText.setTextSize(TypedValue.COMPLEX_UNIT_DIP, 16);
linearLayout.addView(recordTimeText, LayoutHelper.createLinear(LayoutHelper.WRAP_CONTENT, LayoutHelper.WRAP_CONTENT, Gravity.CENTER_VERTICAL, 6, 0, 0, 0));
FrameLayout frameLayout1 = new FrameLayout(context);
textFieldContainer.addView(frameLayout1, LayoutHelper.createLinear(48, 48, Gravity.BOTTOM));
sendButtonContainer = new FrameLayout(context);
textFieldContainer.addView(sendButtonContainer, LayoutHelper.createLinear(48, 48, Gravity.BOTTOM));
audioSendButton = new ImageView(context);
audioSendButton.setScaleType(ImageView.ScaleType.CENTER_INSIDE);
@ -629,7 +796,7 @@ public class ChatActivityEnterView extends FrameLayoutFixed implements Notificat
audioSendButton.setBackgroundColor(0xffffffff);
audioSendButton.setSoundEffectsEnabled(false);
audioSendButton.setPadding(0, 0, AndroidUtilities.dp(4), 0);
frameLayout1.addView(audioSendButton, LayoutHelper.createFrame(48, 48));
sendButtonContainer.addView(audioSendButton, LayoutHelper.createFrame(48, 48));
audioSendButton.setOnTouchListener(new View.OnTouchListener() {
@Override
public boolean onTouch(View view, MotionEvent motionEvent) {
@ -664,13 +831,13 @@ public class ChatActivityEnterView extends FrameLayoutFixed implements Notificat
audioSendButton.getParent().requestDisallowInterceptTouchEvent(true);
} else if (motionEvent.getAction() == MotionEvent.ACTION_UP || motionEvent.getAction() == MotionEvent.ACTION_CANCEL) {
startedDraggingX = -1;
MediaController.getInstance().stopRecording(true);
MediaController.getInstance().stopRecording(1);
recordingAudio = false;
updateAudioRecordIntefrace();
} else if (motionEvent.getAction() == MotionEvent.ACTION_MOVE && recordingAudio) {
float x = motionEvent.getX();
if (x < -distCanMove) {
MediaController.getInstance().stopRecording(false);
MediaController.getInstance().stopRecording(0);
recordingAudio = false;
updateAudioRecordIntefrace();
}
@ -727,7 +894,7 @@ public class ChatActivityEnterView extends FrameLayoutFixed implements Notificat
ViewProxy.setScaleY(sendButton, 0.1f);
ViewProxy.setAlpha(sendButton, 0.0f);
sendButton.clearAnimation();
frameLayout1.addView(sendButton, LayoutHelper.createFrame(48, 48));
sendButtonContainer.addView(sendButton, LayoutHelper.createFrame(48, 48));
sendButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
@ -787,6 +954,13 @@ public class ChatActivityEnterView extends FrameLayoutFixed implements Notificat
}
public void setAllowStickersAndGifs(boolean value, boolean value2) {
if ((allowStickers != value || allowGifs != value2) && emojiView != null) {
if (emojiView.getVisibility() == VISIBLE) {
hidePopup(false);
}
sizeNotifierLayout.removeView(emojiView);
emojiView = null;
}
allowStickers = value;
allowGifs = value2;
}
@ -824,7 +998,7 @@ public class ChatActivityEnterView extends FrameLayoutFixed implements Notificat
public void onAnimationEnd(Object animation) {
if (currentTopViewAnimation != null && currentTopViewAnimation.equals(animation)) {
setTopViewAnimation(1.0f);
if (!forceShowSendButton || openKeyboard) {
if (recordedAudioPanel.getVisibility() != VISIBLE && (!forceShowSendButton || openKeyboard)) {
openKeyboard();
}
currentTopViewAnimation = null;
@ -835,7 +1009,7 @@ public class ChatActivityEnterView extends FrameLayoutFixed implements Notificat
currentTopViewAnimation.start();
} else {
setTopViewAnimation(1.0f);
if (!forceShowSendButton || openKeyboard) {
if (recordedAudioPanel.getVisibility() != VISIBLE && (!forceShowSendButton || openKeyboard)) {
openKeyboard();
}
}
@ -925,6 +1099,11 @@ public class ChatActivityEnterView extends FrameLayoutFixed implements Notificat
NotificationCenter.getInstance().removeObserver(this, NotificationCenter.audioDidSent);
NotificationCenter.getInstance().removeObserver(this, NotificationCenter.emojiDidLoaded);
NotificationCenter.getInstance().removeObserver(this, NotificationCenter.audioRouteChanged);
NotificationCenter.getInstance().removeObserver(this, NotificationCenter.audioDidReset);
NotificationCenter.getInstance().removeObserver(this, NotificationCenter.audioProgressDidChanged);
if (emojiView != null) {
emojiView.onDestroy();
}
if (mWakeLock != null) {
try {
mWakeLock.release();
@ -961,8 +1140,10 @@ public class ChatActivityEnterView extends FrameLayoutFixed implements Notificat
dialog_id = id;
if ((int) dialog_id < 0) {
TLRPC.Chat currentChat = MessagesController.getInstance().getChat(-(int) dialog_id);
silent = ApplicationLoader.applicationContext.getSharedPreferences("Notifications", Activity.MODE_PRIVATE).getBoolean("silent_" + dialog_id, false);
isAsAdmin = ChatObject.isChannel(currentChat) && (currentChat.creator || currentChat.editor) && !currentChat.megagroup;
adminModeAvailable = isAsAdmin && !currentChat.broadcast;
canWriteToChannel = isAsAdmin;
if (adminModeAvailable) {
SharedPreferences preferences = ApplicationLoader.applicationContext.getSharedPreferences("mainconfig", Activity.MODE_PRIVATE);
isAsAdmin = preferences.getBoolean("asadmin_" + dialog_id, true);
@ -972,6 +1153,11 @@ public class ChatActivityEnterView extends FrameLayoutFixed implements Notificat
asAdminButton.setImageResource(isAsAdmin ? R.drawable.publish_active : R.drawable.publish);
updateFieldHint();
}
if (notifyButton != null) {
notifyButton.setVisibility(canWriteToChannel ? VISIBLE : GONE);
notifyButton.setImageResource(silent ? R.drawable.notify_members_off : R.drawable.notify_members_on);
ViewProxy.setPivotX(attachButton, AndroidUtilities.dp((botButton == null || botButton.getVisibility() == GONE) && (notifyButton == null || notifyButton.getVisibility() == GONE) ? 48 : 96));
}
}
}
@ -982,7 +1168,11 @@ public class ChatActivityEnterView extends FrameLayoutFixed implements Notificat
isChannel = ChatObject.isChannel(chat) && !chat.megagroup;
}
if (isChannel) {
messageEditText.setHint(isAsAdmin ? LocaleController.getString("ChannelBroadcast", R.string.ChannelBroadcast) : LocaleController.getString("ChannelComment", R.string.ChannelComment));
if (editingMessageObject != null) {
messageEditText.setHint(editingCaption ? LocaleController.getString("Caption", R.string.Caption) : LocaleController.getString("TypeMessage", R.string.TypeMessage));
} else {
messageEditText.setHint(isAsAdmin ? LocaleController.getString("ChannelBroadcast", R.string.ChannelBroadcast) : LocaleController.getString("ChannelComment", R.string.ChannelComment));
}
} else {
messageEditText.setHint(LocaleController.getString("TypeMessage", R.string.TypeMessage));
}
@ -1013,6 +1203,26 @@ public class ChatActivityEnterView extends FrameLayoutFixed implements Notificat
return messageWebPageSearch;
}
private void hideRecordedAudioPanel() {
audioToSendPath = null;
audioToSend = null;
audioToSendMessageObject = null;
AnimatorSetProxy animatorSetProxy = new AnimatorSetProxy();
animatorSetProxy.playTogether(
ObjectAnimatorProxy.ofFloat(recordedAudioPanel, "alpha", 0.0f)
);
animatorSetProxy.setDuration(200);
animatorSetProxy.addListener(new AnimatorListenerAdapterProxy() {
@Override
public void onAnimationEnd(Object animation) {
recordedAudioPanel.clearAnimation();
recordedAudioPanel.setVisibility(View.GONE);
}
});
animatorSetProxy.start();
}
private void sendMessage() {
if (parentFragment != null) {
String action;
@ -1031,6 +1241,19 @@ public class ChatActivityEnterView extends FrameLayoutFixed implements Notificat
return;
}
}
if (audioToSend != null) {
MessageObject playing = MediaController.getInstance().getPlayingMessageObject();
if (playing != null && playing == audioToSendMessageObject) {
MediaController.getInstance().cleanupPlayer(true, true);
}
SendMessagesHelper.getInstance().sendMessage(audioToSend, null, audioToSendPath, dialog_id, replyingMessageObject, isAsAdmin, null);
if (delegate != null) {
delegate.onMessageSend(null);
}
hideRecordedAudioPanel();
checkSendButton(true);
return;
}
String message = messageEditText.getText().toString();
if (processSendingText(message)) {
messageEditText.setText("");
@ -1045,6 +1268,13 @@ public class ChatActivityEnterView extends FrameLayoutFixed implements Notificat
}
}
public void doneEditingMessage() {
if (editingMessageObject != null) {
SendMessagesHelper.getInstance().editMessage(editingMessageObject, messageEditText.getText().toString(), messageWebPageSearch, parentFragment);
setEditinigMessageObject(null, false);
}
}
public boolean processSendingText(String text) {
text = getTrimmedString(text);
if (text.length() != 0) {
@ -1073,8 +1303,11 @@ public class ChatActivityEnterView extends FrameLayoutFixed implements Notificat
}
private void checkSendButton(final boolean animated) {
if (editingMessageObject != null) {
return;
}
String message = getTrimmedString(messageEditText.getText().toString());
if (message.length() > 0 || forceShowSendButton) {
if (message.length() > 0 || forceShowSendButton || audioToSend != null) {
if (audioSendButton.getVisibility() == View.VISIBLE) {
if (animated) {
if (runningAnimationType == 1) {
@ -1109,7 +1342,9 @@ public class ChatActivityEnterView extends FrameLayoutFixed implements Notificat
updateFieldRight(0);
delegate.onAttachButtonHidden();
if (delegate != null) {
delegate.onAttachButtonHidden();
}
}
sendButton.setVisibility(View.VISIBLE);
@ -1152,7 +1387,9 @@ public class ChatActivityEnterView extends FrameLayoutFixed implements Notificat
if (attachButton != null) {
attachButton.setVisibility(View.GONE);
attachButton.clearAnimation();
delegate.onAttachButtonHidden();
if (delegate != null) {
delegate.onAttachButtonHidden();
}
updateFieldRight(0);
}
}
@ -1234,19 +1471,19 @@ public class ChatActivityEnterView extends FrameLayoutFixed implements Notificat
}
private void updateFieldRight(int attachVisible) {
if (messageEditText == null) {
if (messageEditText == null || editingMessageObject != null) {
return;
}
FrameLayout.LayoutParams layoutParams = (FrameLayout.LayoutParams) messageEditText.getLayoutParams();
if (attachVisible == 1) {
if (botButton != null && botButton.getVisibility() == VISIBLE) {
if (botButton != null && botButton.getVisibility() == VISIBLE || notifyButton != null && notifyButton.getVisibility() == VISIBLE) {
layoutParams.rightMargin = AndroidUtilities.dp(98);
} else {
layoutParams.rightMargin = AndroidUtilities.dp(50);
}
} else if (attachVisible == 2) {
if (layoutParams.rightMargin != AndroidUtilities.dp(2)) {
if (botButton != null && botButton.getVisibility() == VISIBLE) {
if (botButton != null && botButton.getVisibility() == VISIBLE || notifyButton != null && notifyButton.getVisibility() == VISIBLE) {
layoutParams.rightMargin = AndroidUtilities.dp(98);
} else {
layoutParams.rightMargin = AndroidUtilities.dp(50);
@ -1369,6 +1606,9 @@ public class ChatActivityEnterView extends FrameLayoutFixed implements Notificat
messageEditText.setText(text);
messageEditText.setSelection(messageEditText.getText().length());
ignoreTextChange = false;
if (delegate != null) {
delegate.onTextChanged(messageEditText.getText(), true);
}
if (!keyboardVisible && currentPopupContentType == -1) {
openKeyboard();
}
@ -1382,7 +1622,66 @@ public class ChatActivityEnterView extends FrameLayoutFixed implements Notificat
}
}
public void setFieldText(String text) {
public void setEditinigMessageObject(MessageObject messageObject, boolean caption) {
if (audioToSend != null || editingMessageObject == messageObject) {
return;
}
editingMessageObject = messageObject;
editingCaption = caption;
if (editingMessageObject != null) {
InputFilter[] inputFilters = new InputFilter[1];
if (caption) {
inputFilters[0] = new InputFilter.LengthFilter(200);
if (editingMessageObject.caption != null) {
setFieldText(Emoji.replaceEmoji(new SpannableStringBuilder(editingMessageObject.caption.toString()), messageEditText.getPaint().getFontMetricsInt(), AndroidUtilities.dp(20), false));
} else {
setFieldText("");
}
} else {
inputFilters[0] = new InputFilter.LengthFilter(4096);
if (editingMessageObject.messageText != null) {
setFieldText(Emoji.replaceEmoji(new SpannableStringBuilder(editingMessageObject.messageText.toString()), messageEditText.getPaint().getFontMetricsInt(), AndroidUtilities.dp(20), false));
} else {
setFieldText("");
}
}
messageEditText.setFilters(inputFilters);
openKeyboard();
FrameLayout.LayoutParams layoutParams = (FrameLayout.LayoutParams) messageEditText.getLayoutParams();
layoutParams.rightMargin = AndroidUtilities.dp(4);
messageEditText.setLayoutParams(layoutParams);
sendButton.clearAnimation();
audioSendButton.clearAnimation();
attachButton.clearAnimation();
sendButtonContainer.clearAnimation();
sendButton.setVisibility(GONE);
audioSendButton.setVisibility(GONE);
attachButton.setVisibility(GONE);
sendButtonContainer.setVisibility(GONE);
} else {
messageEditText.setFilters(new InputFilter[0]);
delegate.onMessageEditEnd();
audioSendButton.setVisibility(VISIBLE);
attachButton.setVisibility(VISIBLE);
sendButtonContainer.setVisibility(VISIBLE);
ViewProxy.setScaleX(attachButton, 1.0f);
ViewProxy.setAlpha(attachButton, 1.0f);
ViewProxy.setScaleX(sendButton, 0.1f);
ViewProxy.setScaleY(sendButton, 0.1f);
ViewProxy.setAlpha(sendButton, 0.0f);
ViewProxy.setScaleX(audioSendButton, 1.0f);
ViewProxy.setScaleY(audioSendButton, 1.0f);
ViewProxy.setAlpha(audioSendButton, 1.0f);
sendButton.setVisibility(View.GONE);
sendButton.clearAnimation();
messageEditText.setText("");
delegate.onAttachButtonShow();
updateFieldRight(1);
}
updateFieldHint();
}
public void setFieldText(CharSequence text) {
if (messageEditText == null) {
return;
}
@ -1489,7 +1788,7 @@ public class ChatActivityEnterView extends FrameLayoutFixed implements Notificat
botButton.setVisibility(GONE);
}
updateFieldRight(2);
ViewProxy.setPivotX(attachButton, AndroidUtilities.dp(botButton.getVisibility() == GONE ? 48 : 96));
ViewProxy.setPivotX(attachButton, AndroidUtilities.dp((botButton == null || botButton.getVisibility() == GONE) && (notifyButton == null || notifyButton.getVisibility() == GONE) ? 48 : 96));
attachButton.clearAnimation();
}
@ -1621,7 +1920,7 @@ public class ChatActivityEnterView extends FrameLayoutFixed implements Notificat
@Override
public void onGifSelected(TLRPC.Document gif) {
SendMessagesHelper.getInstance().sendMessage((TLRPC.TL_document) gif, null, dialog_id, replyingMessageObject, asAdmin(), null);
SendMessagesHelper.getInstance().sendMessage((TLRPC.TL_document) gif, null, null, dialog_id, replyingMessageObject, asAdmin(), null);
if (delegate != null) {
delegate.onMessageSend(null);
}
@ -1759,6 +2058,14 @@ public class ChatActivityEnterView extends FrameLayoutFixed implements Notificat
}
}
public boolean isEditingMessage() {
return editingMessageObject != null;
}
public boolean isEditingCaption() {
return editingCaption;
}
public void openKeyboard() {
AndroidUtilities.showKeyboard(messageEditText);
}
@ -1868,8 +2175,10 @@ public class ChatActivityEnterView extends FrameLayoutFixed implements Notificat
botKeyboardView.invalidateViews();
}
} else if (id == NotificationCenter.recordProgressChanged) {
Long time = (Long) args[0] / 1000;
String str = String.format("%02d:%02d", time / 60, time % 60);
long t = (Long) args[0];
Long time = t / 1000;
int ms = (int) (t % 1000L) / 10;
String str = String.format("%02d:%02d.%02d", time / 60, time % 60, ms);
if (lastTimeString == null || !lastTimeString.equals(str)) {
if (time % 5 == 0) {
MessagesController.getInstance().sendTyping(dialog_id, 1, 0);
@ -1897,14 +2206,77 @@ public class ChatActivityEnterView extends FrameLayoutFixed implements Notificat
updateAudioRecordIntefrace();
}
} else if (id == NotificationCenter.audioDidSent) {
if (delegate != null) {
delegate.onMessageSend(null);
audioToSend = (TLRPC.TL_document) args[0];
audioToSendPath = (String) args[1];
if (audioToSend != null) {
if (recordedAudioPanel == null) {
return;
}
TLRPC.TL_message message = new TLRPC.TL_message();
message.out = true;
message.id = 0;
message.to_id = new TLRPC.TL_peerUser();
message.to_id.user_id = message.from_id = UserConfig.getClientUserId();
message.date = (int) (System.currentTimeMillis() / 1000);
message.message = "-1";
message.attachPath = audioToSendPath;
message.media = new TLRPC.TL_messageMediaDocument();
message.media.document = audioToSend;
message.flags |= TLRPC.MESSAGE_FLAG_HAS_MEDIA | TLRPC.MESSAGE_FLAG_HAS_FROM_ID;
audioToSendMessageObject = new MessageObject(message, null, false);
ViewProxy.setAlpha(recordedAudioPanel, 1.0f);
recordedAudioPanel.clearAnimation();
recordedAudioPanel.setVisibility(VISIBLE);
int duration = 0;
for (int a = 0; a < audioToSend.attributes.size(); a++) {
TLRPC.DocumentAttribute attribute = audioToSend.attributes.get(a);
if (attribute instanceof TLRPC.TL_documentAttributeAudio) {
duration = attribute.duration;
break;
}
}
for (int a = 0; a < audioToSend.attributes.size(); a++) {
TLRPC.DocumentAttribute attribute = audioToSend.attributes.get(a);
if (attribute instanceof TLRPC.TL_documentAttributeAudio) {
if (attribute.waveform == null || attribute.waveform.length == 0) {
attribute.waveform = MediaController.getInstance().getWaveform(audioToSendPath);
}
recordedAudioSeekBar.setWaveform(attribute.waveform);
break;
}
}
recordedAudioTimeTextView.setText(String.format("%d:%02d", duration / 60, duration % 60));
closeKeyboard();
hidePopup(false);
checkSendButton(false);
} else {
if (delegate != null) {
delegate.onMessageSend(null);
}
}
} else if (id == NotificationCenter.audioRouteChanged) {
if (parentActivity != null) {
boolean frontSpeaker = (Boolean) args[0];
parentActivity.setVolumeControlStream(frontSpeaker ? AudioManager.STREAM_VOICE_CALL : AudioManager.USE_DEFAULT_STREAM_TYPE);
}
} else if (id == NotificationCenter.audioDidReset) {
if (audioToSendMessageObject != null && !MediaController.getInstance().isPlayingAudio(audioToSendMessageObject)) {
recordedAudioPlayButton.setImageResource(R.drawable.s_player_play_states);
recordedAudioSeekBar.setProgress(0);
}
} else if (id == NotificationCenter.audioProgressDidChanged) {
Integer mid = (Integer) args[0];
if (audioToSendMessageObject != null && MediaController.getInstance().isPlayingAudio(audioToSendMessageObject)) {
MessageObject player = MediaController.getInstance().getPlayingMessageObject();
audioToSendMessageObject.audioProgress = player.audioProgress;
audioToSendMessageObject.audioProgressSec = player.audioProgressSec;
if (!recordedAudioSeekBar.isDragging()) {
recordedAudioSeekBar.setProgress(audioToSendMessageObject.audioProgress);
}
}
}
}
}

View File

@ -173,7 +173,7 @@ public class ChatAttachView extends FrameLayout implements NotificationCenter.No
LocaleController.getString("ChatCamera", R.string.ChatCamera),
LocaleController.getString("ChatGallery", R.string.ChatGallery),
LocaleController.getString("ChatVideo", R.string.ChatVideo),
LocaleController.getString("AttachAudio", R.string.AttachAudio),
LocaleController.getString("AttachMusic", R.string.AttachMusic),
LocaleController.getString("ChatDocument", R.string.ChatDocument),
LocaleController.getString("AttachContact", R.string.AttachContact),
LocaleController.getString("ChatLocation", R.string.ChatLocation),

View File

@ -488,7 +488,7 @@ public class EmojiView extends FrameLayout implements NotificationCenter.Notific
private HashMap<String, Integer> emojiUseHistory = new HashMap<>();
private static HashMap<String, String> emojiColor = new HashMap<>();
private ArrayList<String> recentEmoji = new ArrayList<>();
private HashMap<Long, Integer> stickersUseHistory = new HashMap<>();
private ArrayList<Long> newRecentStickers = new ArrayList<>();
private ArrayList<TLRPC.Document> recentStickers = new ArrayList<>();
private ArrayList<TLRPC.TL_messages_stickerSet> stickerSets = new ArrayList<>();
private ArrayList<MediaController.SearchImage> recentImages;
@ -518,8 +518,8 @@ public class EmojiView extends FrameLayout implements NotificationCenter.Notific
private FlowLayoutManager flowLayoutManager;
private GifsAdapter gifsAdapter;
private AdapterView.OnItemClickListener stickersOnItemClickListener;
private Runnable openStickerPreviewRunnable;
private StickerEmojiCell currentStickerPreviewCell;
private EmojiColorPickerView pickerView;
private EmojiPopupWindow pickerViewPopup;
private int popupWidth;
@ -531,8 +531,7 @@ public class EmojiView extends FrameLayout implements NotificationCenter.Notific
private int gifTabBum = -2;
private boolean switchToGifTab;
private int startX;
private int startY;
private int oldWidth;
private int lastNotifyWidth;
@ -572,45 +571,8 @@ public class EmojiView extends FrameLayout implements NotificationCenter.Notific
stickersGridView = new GridView(context) {
@Override
public boolean onInterceptTouchEvent(MotionEvent event) {
if (event.getAction() == MotionEvent.ACTION_DOWN) {
int x = (int) event.getX();
int y = (int) event.getY();
int count = stickersGridView.getChildCount();
for (int a = 0; a < count; a++) {
View view = stickersGridView.getChildAt(a);
int top = view.getTop();
int bottom = view.getBottom();
int left = view.getLeft();
int right = view.getRight();
if (top > y || bottom < y || left > x || right < x) {
continue;
}
if (!(view instanceof StickerEmojiCell) || !((StickerEmojiCell) view).showingBitmap()) {
return super.onInterceptTouchEvent(event);
}
startX = x;
startY = y;
currentStickerPreviewCell = (StickerEmojiCell) view;
openStickerPreviewRunnable = new Runnable() {
@Override
public void run() {
if (openStickerPreviewRunnable == null) {
return;
}
stickersGridView.setOnItemClickListener(null);
stickersGridView.requestDisallowInterceptTouchEvent(true);
openStickerPreviewRunnable = null;
StickerPreviewViewer.getInstance().setParentActivity((Activity) getContext());
StickerPreviewViewer.getInstance().setKeyboardHeight(EmojiView.this.getMeasuredHeight());
StickerPreviewViewer.getInstance().open(currentStickerPreviewCell.getSticker());
currentStickerPreviewCell.setScaled(true);
}
};
AndroidUtilities.runOnUIThread(openStickerPreviewRunnable, 200);
return true;
}
}
return false;
boolean result = StickerPreviewViewer.getInstance().onInterceptTouchEvent(event, stickersGridView, EmojiView.this.getMeasuredHeight());
return super.onInterceptTouchEvent(event) || result;
}
@Override
@ -633,67 +595,7 @@ public class EmojiView extends FrameLayout implements NotificationCenter.Notific
stickersGridView.setOnTouchListener(new OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
if (openStickerPreviewRunnable != null || StickerPreviewViewer.getInstance().isVisible()) {
if (event.getAction() == MotionEvent.ACTION_UP || event.getAction() == MotionEvent.ACTION_CANCEL || event.getAction() == MotionEvent.ACTION_POINTER_UP) {
AndroidUtilities.runOnUIThread(new Runnable() {
@Override
public void run() {
stickersGridView.setOnItemClickListener(stickersOnItemClickListener);
}
}, 150);
if (openStickerPreviewRunnable != null) {
AndroidUtilities.cancelRunOnUIThread(openStickerPreviewRunnable);
openStickerPreviewRunnable = null;
} else if (StickerPreviewViewer.getInstance().isVisible()) {
StickerPreviewViewer.getInstance().close();
if (currentStickerPreviewCell != null) {
currentStickerPreviewCell.setScaled(false);
currentStickerPreviewCell = null;
}
}
} else if (event.getAction() != MotionEvent.ACTION_DOWN) {
if (StickerPreviewViewer.getInstance().isVisible()) {
if (event.getAction() == MotionEvent.ACTION_MOVE) {
int x = (int) event.getX();
int y = (int) event.getY();
int count = stickersGridView.getChildCount();
for (int a = 0; a < count; a++) {
View view = stickersGridView.getChildAt(a);
int top = view.getTop();
int bottom = view.getBottom();
int left = view.getLeft();
int right = view.getRight();
if (top > y || bottom < y || left > x || right < x) {
continue;
}
if (!(view instanceof StickerEmojiCell) || view == currentStickerPreviewCell) {
break;
}
if (currentStickerPreviewCell != null) {
currentStickerPreviewCell.setScaled(false);
}
currentStickerPreviewCell = (StickerEmojiCell) view;
StickerPreviewViewer.getInstance().setKeyboardHeight(EmojiView.this.getMeasuredHeight());
StickerPreviewViewer.getInstance().open(currentStickerPreviewCell.getSticker());
currentStickerPreviewCell.setScaled(true);
return true;
}
}
return true;
} else if (openStickerPreviewRunnable != null) {
if (event.getAction() == MotionEvent.ACTION_MOVE) {
if (Math.hypot(startX - event.getX(), startY - event.getY()) > AndroidUtilities.dp(10)) {
AndroidUtilities.cancelRunOnUIThread(openStickerPreviewRunnable);
openStickerPreviewRunnable = null;
}
} else {
AndroidUtilities.cancelRunOnUIThread(openStickerPreviewRunnable);
openStickerPreviewRunnable = null;
}
}
}
}
return false;
return StickerPreviewViewer.getInstance().onTouch(event, stickersGridView, EmojiView.this.getMeasuredHeight(), stickersOnItemClickListener);
}
});
stickersOnItemClickListener = new AdapterView.OnItemClickListener() {
@ -702,35 +604,23 @@ public class EmojiView extends FrameLayout implements NotificationCenter.Notific
if (!(view instanceof StickerEmojiCell)) {
return;
}
if (openStickerPreviewRunnable != null) {
AndroidUtilities.cancelRunOnUIThread(openStickerPreviewRunnable);
openStickerPreviewRunnable = null;
}
if (currentStickerPreviewCell != null) {
currentStickerPreviewCell.setScaled(false);
currentStickerPreviewCell = null;
}
StickerPreviewViewer.getInstance().reset();
StickerEmojiCell cell = (StickerEmojiCell) view;
if (cell.isDisabled()) {
return;
}
cell.disable();
TLRPC.Document document = cell.getSticker();
Integer count = stickersUseHistory.get(document.id);
if (count == null) {
count = 0;
}
if (count == 0 && stickersUseHistory.size() > 19) {
for (int a = recentStickers.size() - 1; a >= 0; a--) {
TLRPC.Document sticker = recentStickers.get(a);
stickersUseHistory.remove(sticker.id);
recentStickers.remove(a);
if (stickersUseHistory.size() <= 19) {
break;
}
int index = newRecentStickers.indexOf(document.id);
if (index == -1) {
newRecentStickers.add(0, document.id);
if (newRecentStickers.size() > 20) {
newRecentStickers.remove(newRecentStickers.size() - 1);
}
} else if (index != 0) {
newRecentStickers.remove(index);
newRecentStickers.add(0, document.id);
}
stickersUseHistory.put(document.id, ++count);
saveRecentStickers();
if (listener != null) {
@ -763,12 +653,6 @@ public class EmojiView extends FrameLayout implements NotificationCenter.Notific
break;
}
}
if (size.width == 0) {
size.width = 100;
}
if (size.height == 0) {
size.height = 100;
}
return size;
}
});
@ -821,7 +705,7 @@ public class EmojiView extends FrameLayout implements NotificationCenter.Notific
}
});
builder.setNegativeButton(LocaleController.getString("Cancel", R.string.Cancel), null);
builder.show();
builder.show().setCanceledOnTouchOutside(true);
return true;
}
});
@ -1213,16 +1097,13 @@ public class EmojiView extends FrameLayout implements NotificationCenter.Notific
private void saveRecentStickers() {
SharedPreferences.Editor editor = getContext().getSharedPreferences("emoji", Activity.MODE_PRIVATE).edit();
StringBuilder stringBuilder = new StringBuilder();
for (HashMap.Entry<Long, Integer> entry : stickersUseHistory.entrySet()) {
for (int a = 0; a < newRecentStickers.size(); a++) {
if (stringBuilder.length() != 0) {
stringBuilder.append(",");
}
stringBuilder.append(entry.getKey());
stringBuilder.append("=");
stringBuilder.append(entry.getValue());
stringBuilder.append(newRecentStickers.get(a));
}
editor.putString("stickers", stringBuilder.toString());
editor.putString("stickers2", stringBuilder.toString());
editor.commit();
}
@ -1270,43 +1151,28 @@ public class EmojiView extends FrameLayout implements NotificationCenter.Notific
return;
}
recentStickers.clear();
HashMap<Long, Integer> hashMap = new HashMap<>();
for (HashMap.Entry<Long, Integer> entry : stickersUseHistory.entrySet()) {
TLRPC.Document sticker = StickersQuery.getStickerById(entry.getKey());
for (int a = 0; a < newRecentStickers.size(); a++) {
TLRPC.Document sticker = StickersQuery.getStickerById(newRecentStickers.get(a));
if (sticker != null) {
recentStickers.add(sticker);
hashMap.put(sticker.id, entry.getValue());
}
}
if (stickersUseHistory.size() != hashMap.size()) {
stickersUseHistory = hashMap;
saveRecentStickers();
}
Collections.sort(recentStickers, new Comparator<TLRPC.Document>() {
@Override
public int compare(TLRPC.Document lhs, TLRPC.Document rhs) {
Integer count1 = stickersUseHistory.get(lhs.id);
Integer count2 = stickersUseHistory.get(rhs.id);
if (count1 == null) {
count1 = 0;
}
if (count2 == null) {
count2 = 0;
}
if (count1 > count2) {
return -1;
} else if (count1 < count2) {
return 1;
}
return 0;
}
});
while (recentStickers.size() > 20) {
recentStickers.remove(recentStickers.size() - 1);
}
if (newRecentStickers.size() != recentStickers.size()) {
newRecentStickers.clear();
for (int a = 0; a < recentStickers.size(); a++) {
newRecentStickers.add(recentStickers.get(a).id);
}
saveRecentStickers();
}
}
private void updateStickerTabs() {
if (scrollSlidingTabStrip == null) {
return;
}
recentTabBum = -2;
gifTabBum = -2;
@ -1452,7 +1318,8 @@ public class EmojiView extends FrameLayout implements NotificationCenter.Notific
str = preferences.getString("color", "");
if (str != null && str.length() > 0) {
String[] args = str.split(",");
for (String arg : args) {
for (int a = 0; a < args.length; a++) {
String arg = args[a];
String[] args2 = arg.split("=");
emojiColor.put(args2[0], args2[1]);
}
@ -1463,13 +1330,44 @@ public class EmojiView extends FrameLayout implements NotificationCenter.Notific
if (showStickers) {
try {
stickersUseHistory.clear();
newRecentStickers.clear();
str = preferences.getString("stickers", "");
if (str != null && str.length() > 0) {
String[] args = str.split(",");
for (String arg : args) {
final HashMap<Long, Integer> stickersUseHistory = new HashMap<>();
for (int a = 0; a < args.length; a++) {
String arg = args[a];
String[] args2 = arg.split("=");
stickersUseHistory.put(Long.parseLong(args2[0]), Integer.parseInt(args2[1]));
Long key = Long.parseLong(args2[0]);
stickersUseHistory.put(key, Integer.parseInt(args2[1]));
newRecentStickers.add(key);
}
Collections.sort(newRecentStickers, new Comparator<Long>() {
@Override
public int compare(Long lhs, Long rhs) {
Integer count1 = stickersUseHistory.get(lhs);
Integer count2 = stickersUseHistory.get(rhs);
if (count1 == null) {
count1 = 0;
}
if (count2 == null) {
count2 = 0;
}
if (count1 > count2) {
return -1;
} else if (count1 < count2) {
return 1;
}
return 0;
}
});
preferences.edit().remove("stickers").commit();
saveRecentStickers();
} else {
str = preferences.getString("stickers2", "");
String[] args = str.split(",");
for (int a = 0; a < args.length; a++) {
newRecentStickers.add(Long.parseLong(args[a]));
}
}
sortStickers();
@ -1518,14 +1416,7 @@ public class EmojiView extends FrameLayout implements NotificationCenter.Notific
if (StickerPreviewViewer.getInstance().isVisible()) {
StickerPreviewViewer.getInstance().close();
}
if (openStickerPreviewRunnable != null) {
AndroidUtilities.cancelRunOnUIThread(openStickerPreviewRunnable);
openStickerPreviewRunnable = null;
}
if (currentStickerPreviewCell != null) {
currentStickerPreviewCell.setScaled(false);
currentStickerPreviewCell = null;
}
StickerPreviewViewer.getInstance().reset();
}
public void setListener(Listener value) {
@ -1546,6 +1437,13 @@ public class EmojiView extends FrameLayout implements NotificationCenter.Notific
if (stickersGridAdapter != null) {
NotificationCenter.getInstance().addObserver(this, NotificationCenter.stickersDidLoaded);
NotificationCenter.getInstance().addObserver(this, NotificationCenter.recentImagesDidLoaded);
AndroidUtilities.runOnUIThread(new Runnable() {
@Override
public void run() {
updateStickerTabs();
reloadStickersAdapter();
}
});
}
}
@ -1576,13 +1474,16 @@ public class EmojiView extends FrameLayout implements NotificationCenter.Notific
}
}
@Override
protected void onDetachedFromWindow() {
super.onDetachedFromWindow();
public void onDestroy() {
if (stickersGridAdapter != null) {
NotificationCenter.getInstance().removeObserver(this, NotificationCenter.stickersDidLoaded);
NotificationCenter.getInstance().removeObserver(this, NotificationCenter.recentImagesDidLoaded);
}
}
@Override
protected void onDetachedFromWindow() {
super.onDetachedFromWindow();
if (pickerViewPopup != null && pickerViewPopup.isShowing()) {
pickerViewPopup.dismiss();
}
@ -1666,7 +1567,9 @@ public class EmojiView extends FrameLayout implements NotificationCenter.Notific
int previousCount = recentImages != null ? recentImages.size() : 0;
recentImages = (ArrayList<MediaController.SearchImage>) args[1];
loadingRecent = false;
gifsAdapter.notifyDataSetChanged();
if (gifsAdapter != null) {
gifsAdapter.notifyDataSetChanged();
}
if (previousCount != recentImages.size()) {
updateStickerTabs();
}

View File

@ -13,6 +13,8 @@ import android.view.View;
import android.view.ViewGroup;
import org.telegram.messenger.AndroidUtilities;
import org.telegram.messenger.BuildVars;
import org.telegram.messenger.FileLog;
import org.telegram.messenger.support.widget.RecyclerView;
import java.util.ArrayList;
@ -356,11 +358,14 @@ public class FlowLayoutManager extends RecyclerView.LayoutManager {
}
preferredRowSize = getHeight() / 2.0f;
float viewPortAvailableSize = getWidth();
if (BuildVars.DEBUG_VERSION) {
FileLog.d("tmessages", "preferredRowSize = " + preferredRowSize + " width = " + viewPortAvailableSize);
}
float totalItemSize = 0;
int[] weights = new int[getItemCount()];
for (int a = 0; a < getItemCount(); a++) {
Size size = getSizeForItem(a);
Size size = sizeForItem(a);
totalItemSize += (size.width / size.height) * preferredRowSize;
weights[a] = Math.round(size.width / size.height * 100);
}
@ -377,7 +382,7 @@ public class FlowLayoutManager extends RecyclerView.LayoutManager {
float summedRatios = 0;
for (int j = i, n = i + row.size(); j < n; j++) {
Size preferredSize = getSizeForItem(j);
Size preferredSize = sizeForItem(j);
summedRatios += preferredSize.width / preferredSize.height;
}
@ -392,7 +397,7 @@ public class FlowLayoutManager extends RecyclerView.LayoutManager {
}
for (int j = i, n = i + row.size(); j < n; j++) {
Size preferredSize = getSizeForItem(j);
Size preferredSize = sizeForItem(j);
actualSize.width = Math.round(rowSize / summedRatios * (preferredSize.width / preferredSize.height));
actualSize.height = preferredRowSize;//Math.round(rowSize / summedRatios);
@ -503,7 +508,22 @@ public class FlowLayoutManager extends RecyclerView.LayoutManager {
return answer;
}
private Size sizeForItem(int i) {
Size size = getSizeForItem(i);
if (size.width == 0) {
size.width = 100;
}
if (size.height == 0) {
size.height = 100;
}
float aspect = size.width / size.height;
if (aspect > 4.0f || aspect < 0.2f) {
size.height = size.width = Math.max(size.width, size.height);
}
return size;
}
protected Size getSizeForItem(int i) {
return new Size(1, 1);
return new Size(100, 100);
}
}

View File

@ -15,7 +15,6 @@ import android.graphics.drawable.Drawable;
import org.telegram.messenger.AndroidUtilities;
import org.telegram.tgnet.TLRPC;
import org.telegram.messenger.Utilities;
public class IdenticonDrawable extends Drawable {
@ -35,9 +34,7 @@ public class IdenticonDrawable extends Drawable {
public void setEncryptedChat(TLRPC.EncryptedChat encryptedChat) {
data = encryptedChat.key_hash;
if (data == null) {
byte[] sha1 = Utilities.computeSHA1(encryptedChat.auth_key);
encryptedChat.key_hash = data = new byte[16];
System.arraycopy(sha1, 0, data, 0, data.length);
encryptedChat.key_hash = data = AndroidUtilities.calcAuthKeyHash(encryptedChat.auth_key);
}
invalidateSelf();
}
@ -48,17 +45,33 @@ public class IdenticonDrawable extends Drawable {
return;
}
int bitPointer = 0;
float rectSize = (float)Math.floor(Math.min(getBounds().width(), getBounds().height()) / 8.0f);
float xOffset = Math.max(0, (getBounds().width() - rectSize * 8) / 2);
float yOffset = Math.max(0, (getBounds().height() - rectSize * 8) / 2);
for (int iy = 0; iy < 8; iy++) {
for (int ix = 0; ix < 8; ix++) {
int byteValue = getBits(bitPointer);
bitPointer += 2;
int colorIndex = Math.abs(byteValue) % 4;
paint.setColor(colors[colorIndex]);
canvas.drawRect(xOffset + ix * rectSize, iy * rectSize + yOffset, xOffset + ix * rectSize + rectSize, iy * rectSize + rectSize + yOffset, paint);
if (data.length == 16) {
int bitPointer = 0;
float rectSize = (float) Math.floor(Math.min(getBounds().width(), getBounds().height()) / 8.0f);
float xOffset = Math.max(0, (getBounds().width() - rectSize * 8) / 2);
float yOffset = Math.max(0, (getBounds().height() - rectSize * 8) / 2);
for (int iy = 0; iy < 8; iy++) {
for (int ix = 0; ix < 8; ix++) {
int byteValue = getBits(bitPointer);
bitPointer += 2;
int colorIndex = Math.abs(byteValue) % 4;
paint.setColor(colors[colorIndex]);
canvas.drawRect(xOffset + ix * rectSize, iy * rectSize + yOffset, xOffset + ix * rectSize + rectSize, iy * rectSize + rectSize + yOffset, paint);
}
}
} else {
int bitPointer = 0;
float rectSize = (float) Math.floor(Math.min(getBounds().width(), getBounds().height()) / 12.0f);
float xOffset = Math.max(0, (getBounds().width() - rectSize * 12) / 2);
float yOffset = Math.max(0, (getBounds().height() - rectSize * 12) / 2);
for (int iy = 0; iy < 12; iy++) {
for (int ix = 0; ix < 12; ix++) {
int byteValue = getBits(bitPointer);
int colorIndex = Math.abs(byteValue) % 4;
paint.setColor(colors[colorIndex]);
canvas.drawRect(xOffset + ix * rectSize, iy * rectSize + yOffset, xOffset + ix * rectSize + rectSize, iy * rectSize + rectSize + yOffset, paint);
bitPointer += 2;
}
}
}
}

View File

@ -80,6 +80,132 @@ public class PhotoCropView extends FrameLayout {
requestLayout();
}
public void setOrientation(int rotation) {
orientation = rotation;
rectX = -1;
rectY = -1;
rectSizeX = 600;
rectSizeY = 600;
delegate.needMoveImageTo(0, 0, 1, false);
requestLayout();
/*float bitmapScaledWidth = bitmapWidth * bitmapGlobalScale;
float bitmapScaledHeight = bitmapHeight * bitmapGlobalScale;
float bitmapStartX = (getWidth() - AndroidUtilities.dp(28) - bitmapScaledWidth) / 2 + bitmapGlobalX + AndroidUtilities.dp(14);
float bitmapStartY = (getHeight() - AndroidUtilities.dp(28) - bitmapScaledHeight) / 2 + bitmapGlobalY + AndroidUtilities.dp(14);
float percSizeX = rectSizeX / bitmapScaledWidth;
float percSizeY = rectSizeY / bitmapScaledHeight;
float percX = (rectX - bitmapStartX) / bitmapScaledWidth + percSizeX;
float percY = (rectY - bitmapStartY) / bitmapScaledHeight;
int width;
int height;
if (orientation % 360 == 90 || orientation % 360 == 270) {
width = bitmapToEdit.getHeight();
height = bitmapToEdit.getWidth();
} else {
width = bitmapToEdit.getWidth();
height = bitmapToEdit.getHeight();
}
int x = (int) (percX * width);
int y = (int) (percY * height);
int sizeX = (int) (percSizeX * width);
int sizeY = (int) (percSizeY * height);
if (x < 0) {
x = 0;
}
if (y < 0) {
y = 0;
}
if (x + sizeX > width) {
sizeX = width - x;
}
if (y + sizeY > height) {
sizeY = height - y;
}
double cx = (x + sizeX) - width / 2.0f;
double cy = y - height / 2.0f;
double newX = cx * Math.cos(-Math.PI / 2) - cy * Math.sin(-Math.PI / 2) + height / 2.0f;
double newY = cx * Math.sin(-Math.PI / 2) + cy * Math.cos(-Math.PI / 2) + width / 2.0f;
int temp = sizeX;
sizeY = sizeY;
sizeY = temp;*/
/*int temp = bitmapWidth;
orientation = rotation;
bitmapWidth = bitmapHeight;
bitmapHeight = temp;
bitmapScaledWidth = bitmapWidth * bitmapGlobalScale;
bitmapScaledHeight = bitmapHeight * bitmapGlobalScale;
rectX = (float) (newX * bitmapScaledWidth);
rectY = (float) (newX * bitmapScaledHeight);
float temp2 = rectSizeX;
rectSizeX = rectSizeY;
rectSizeY = temp2;
moveToFill(false);
invalidate();*/
/*float temp = rectX;
rectX = rectY;
rectY = temp;
temp = rectSizeX;
rectSizeX = rectSizeY;
rectSizeY = temp;
int temp2 = bitmapWidth;*/
//requestLayout();
/*
bitmapWidth = bitmapHeight;
bitmapHeight = temp2;*/
/*float bitmapScaledWidth = bitmapWidth * bitmapGlobalScale;
float bitmapScaledHeight = bitmapHeight * bitmapGlobalScale;
float bitmapStartX = (getWidth() - AndroidUtilities.dp(28) - bitmapScaledWidth) / 2 + bitmapGlobalX + AndroidUtilities.dp(14);
float bitmapStartY = (getHeight() - AndroidUtilities.dp(28) - bitmapScaledHeight) / 2 + bitmapGlobalY + AndroidUtilities.dp(14);
float percX = (rectX - bitmapStartX) / bitmapScaledWidth;
float percY = (rectY - bitmapStartY) / bitmapScaledHeight;
float percSizeX = rectSizeX / bitmapScaledWidth;
float percSizeY = rectSizeY / bitmapScaledHeight;
rectX = percY
int width;
int height;
if (orientation % 360 == 90 || orientation % 360 == 270) {
width = bitmapToEdit.getHeight();
height = bitmapToEdit.getWidth();
} else {
width = bitmapToEdit.getWidth();
height = bitmapToEdit.getHeight();
}
int x = (int) (percX * width);
int y = (int) (percY * height);
int sizeX = (int) (percSizeX * width);
int sizeY = (int) (percSizeY * height);
if (x < 0) {
x = 0;
}
if (y < 0) {
y = 0;
}
if (x + sizeX > width) {
sizeX = width - x;
}
if (y + sizeY > height) {
sizeY = height - y;
}*/
//moveToFill(false);
}
public boolean onTouch(MotionEvent motionEvent) {
if (motionEvent == null) {
draggingState = 0;
@ -353,7 +479,7 @@ public class PhotoCropView extends FrameLayout {
Matrix matrix = new Matrix();
matrix.setTranslate(-bitmapToEdit.getWidth() / 2, -bitmapToEdit.getHeight() / 2);
matrix.postRotate(orientation);
if (orientation == 90 || orientation == 270) {
if (orientation % 360 == 90 || orientation % 360 == 270) {
matrix.postTranslate(bitmapToEdit.getHeight() / 2 - x, bitmapToEdit.getWidth() / 2 - y);
} else {
matrix.postTranslate(bitmapToEdit.getWidth() / 2 - x, bitmapToEdit.getHeight() / 2 - y);
@ -381,7 +507,7 @@ public class PhotoCropView extends FrameLayout {
int width;
int height;
if (orientation == 90 || orientation == 270) {
if (orientation % 360 == 90 || orientation % 360 == 270) {
width = bitmapToEdit.getHeight();
height = bitmapToEdit.getWidth();
} else {
@ -467,7 +593,7 @@ public class PhotoCropView extends FrameLayout {
public void run() {
if (animationRunnable == this) {
animationRunnable = null;
animateToFill();
moveToFill(true);
}
}
};
@ -502,7 +628,7 @@ public class PhotoCropView extends FrameLayout {
}
}
public void animateToFill() {
public void moveToFill(boolean animated) {
float scaleToX = bitmapWidth / rectSizeX;
float scaleToY = bitmapHeight / rectSizeY;
float scaleTo = scaleToX > scaleToY ? scaleToY : scaleToX;
@ -521,7 +647,7 @@ public class PhotoCropView extends FrameLayout {
float newBitmapGlobalX = newX + getWidth() / 2 * (scaleTo - 1) + (bitmapGlobalX - rectX) * scaleTo;
float newBitmapGlobalY = newY + getHeight() / 2 * (scaleTo - 1) + (bitmapGlobalY - rectY) * scaleTo;
delegate.needMoveImageTo(newBitmapGlobalX, newBitmapGlobalY, bitmapGlobalScale * scaleTo, true);
delegate.needMoveImageTo(newBitmapGlobalX, newBitmapGlobalY, bitmapGlobalScale * scaleTo, animated);
}
public void setDelegate(PhotoCropViewDelegate delegate) {
@ -541,7 +667,7 @@ public class PhotoCropView extends FrameLayout {
float bitmapW;
float bitmapH;
if (orientation == 90 || orientation == 270) {
if (orientation % 360 == 90 || orientation % 360 == 270) {
bitmapW = bitmapToEdit.getHeight();
bitmapH = bitmapToEdit.getWidth();
} else {

View File

@ -61,7 +61,7 @@ public class PhotoFilterBlurControl extends FrameLayout {
private float pointerScale = 1;
private boolean isMoving;
private boolean isZooming;
private boolean checkForMoving;
private boolean checkForMoving = true;
private boolean checkForZooming;
private int type;

View File

@ -0,0 +1,322 @@
/*
* 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-2016.
*/
package org.telegram.ui.Components;
import android.annotation.SuppressLint;
import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Paint;
import android.graphics.Path;
import android.text.TextPaint;
import android.view.MotionEvent;
import android.view.View;
import org.telegram.messenger.AndroidUtilities;
import java.util.Locale;
public class PhotoFilterCurvesControl extends View {
public interface PhotoFilterCurvesControlDelegate {
void valueChanged();
}
private final static int CurvesSegmentNone = 0;
private final static int CurvesSegmentBlacks = 1;
private final static int CurvesSegmentShadows = 2;
private final static int CurvesSegmentMidtones = 3;
private final static int CurvesSegmentHighlights = 4;
private final static int CurvesSegmentWhites = 5;
private final static int GestureStateBegan = 1;
private final static int GestureStateChanged = 2;
private final static int GestureStateEnded = 3;
private final static int GestureStateCancelled = 4;
private final static int GestureStateFailed = 5;
private int activeSegment = CurvesSegmentNone;
private boolean isMoving;
private boolean checkForMoving = true;
private float lastX;
private float lastY;
private Rect actualArea = new Rect();
private Paint paint = new Paint(Paint.ANTI_ALIAS_FLAG);
private Paint paintDash = new Paint(Paint.ANTI_ALIAS_FLAG);
private Paint paintCurve = new Paint(Paint.ANTI_ALIAS_FLAG);
private TextPaint textPaint = new TextPaint(Paint.ANTI_ALIAS_FLAG);
private Path path = new Path();
private PhotoFilterCurvesControlDelegate delegate;
private PhotoFilterView.CurvesToolValue curveValue;
public PhotoFilterCurvesControl(Context context, PhotoFilterView.CurvesToolValue value) {
super(context);
setWillNotDraw(false);
curveValue = value;
paint.setColor(0x99ffffff);
paint.setStrokeWidth(AndroidUtilities.dp(1));
paint.setStyle(Paint.Style.STROKE);
paintDash.setColor(0x99ffffff);
paintDash.setStrokeWidth(AndroidUtilities.dp(2));
paintDash.setStyle(Paint.Style.STROKE);
paintCurve.setColor(0xffffffff);
paintCurve.setStrokeWidth(AndroidUtilities.dp(2));
paintCurve.setStyle(Paint.Style.STROKE);
textPaint.setColor(0xffbfbfbf);
textPaint.setTextSize(AndroidUtilities.dp(13));
}
public void setDelegate(PhotoFilterCurvesControlDelegate photoFilterCurvesControlDelegate) {
delegate = photoFilterCurvesControlDelegate;
}
public void setActualArea(float x, float y, float width, float height) {
actualArea.x = x;
actualArea.y = y;
actualArea.width = width;
actualArea.height = height;
}
@Override
public boolean onTouchEvent(MotionEvent event) {
int action = event.getActionMasked();
switch (action) {
case MotionEvent.ACTION_POINTER_DOWN:
case MotionEvent.ACTION_DOWN: {
if (event.getPointerCount() == 1) {
if (checkForMoving && !isMoving) {
float locationX = event.getX();
float locationY = event.getY();
lastX = locationX;
lastY = locationY;
if (locationX >= actualArea.x && locationX <= actualArea.x + actualArea.width && locationY >= actualArea.y && locationY <= actualArea.y + actualArea.height) {
isMoving = true;
}
checkForMoving = false;
if (isMoving) {
handlePan(GestureStateBegan, event);
}
}
} else {
if (isMoving) {
handlePan(GestureStateEnded, event);
checkForMoving = true;
isMoving = false;
}
}
break;
}
case MotionEvent.ACTION_POINTER_UP:
case MotionEvent.ACTION_CANCEL:
case MotionEvent.ACTION_UP: {
if (isMoving) {
handlePan(GestureStateEnded, event);
isMoving = false;
}
checkForMoving = true;
break;
}
case MotionEvent.ACTION_MOVE: {
if (isMoving) {
handlePan(GestureStateChanged, event);
}
}
}
return true;
}
private void handlePan(int state, MotionEvent event) {
float locationX = event.getX();
float locationY = event.getY();
switch (state) {
case GestureStateBegan: {
selectSegmentWithPoint(locationX);
break;
}
case GestureStateChanged: {
float delta = Math.min(2, (lastY - locationY) / 8.0f);
PhotoFilterView.CurvesValue curveValue = null;
switch (this.curveValue.activeType) {
case PhotoFilterView.CurvesToolValue.CurvesTypeLuminance:
curveValue = this.curveValue.luminanceCurve;
break;
case PhotoFilterView.CurvesToolValue.CurvesTypeRed:
curveValue = this.curveValue.redCurve;
break;
case PhotoFilterView.CurvesToolValue.CurvesTypeGreen:
curveValue = this.curveValue.greenCurve;
break;
case PhotoFilterView.CurvesToolValue.CurvesTypeBlue:
curveValue = this.curveValue.blueCurve;
break;
default:
break;
}
switch (activeSegment) {
case CurvesSegmentBlacks:
curveValue.blacksLevel = Math.max(0, Math.min(100, curveValue.blacksLevel + delta));
break;
case CurvesSegmentShadows:
curveValue.shadowsLevel = Math.max(0, Math.min(100, curveValue.shadowsLevel + delta));
break;
case CurvesSegmentMidtones:
curveValue.midtonesLevel = Math.max(0, Math.min(100, curveValue.midtonesLevel + delta));
break;
case CurvesSegmentHighlights:
curveValue.highlightsLevel = Math.max(0, Math.min(100, curveValue.highlightsLevel + delta));
break;
case CurvesSegmentWhites:
curveValue.whitesLevel = Math.max(0, Math.min(100, curveValue.whitesLevel + delta));
break;
default:
break;
}
invalidate();
if (delegate != null) {
delegate.valueChanged();
}
lastX = locationX;
lastY = locationY;
}
break;
case GestureStateEnded:
case GestureStateCancelled:
case GestureStateFailed: {
unselectSegments();
}
break;
default:
break;
}
}
private void selectSegmentWithPoint(float pointx) {
if (activeSegment != CurvesSegmentNone) {
return;
}
float segmentWidth = actualArea.width / 5.0f;
pointx -= actualArea.x;
activeSegment = (int) Math.floor((pointx / segmentWidth) + 1);
}
private void unselectSegments() {
if (activeSegment == CurvesSegmentNone) {
return;
}
activeSegment = CurvesSegmentNone;
}
@SuppressLint("DrawAllocation")
@Override
protected void onDraw(Canvas canvas) {
float segmentWidth = actualArea.width / 5.0f;
for (int i = 0; i < 4; i++) {
canvas.drawLine(actualArea.x + segmentWidth + i * segmentWidth, actualArea.y, actualArea.x + segmentWidth + i * segmentWidth, actualArea.y + actualArea.height, paint);
}
canvas.drawLine(actualArea.x, actualArea.y + actualArea.height, actualArea.x + actualArea.width, actualArea.y, paintDash);
PhotoFilterView.CurvesValue curvesValue = null;
switch (curveValue.activeType) {
case PhotoFilterView.CurvesToolValue.CurvesTypeLuminance:
paintCurve.setColor(0xffffffff);
curvesValue = curveValue.luminanceCurve;
break;
case PhotoFilterView.CurvesToolValue.CurvesTypeRed:
paintCurve.setColor(0xffed3d4c);
curvesValue = curveValue.redCurve;
break;
case PhotoFilterView.CurvesToolValue.CurvesTypeGreen:
paintCurve.setColor(0xff10ee9d);
curvesValue = curveValue.greenCurve;
break;
case PhotoFilterView.CurvesToolValue.CurvesTypeBlue:
paintCurve.setColor(0xff3377fb);
curvesValue = curveValue.blueCurve;
break;
default:
break;
}
for (int a = 0; a < 5; a++) {
String str;
switch (a) {
case 0:
str = String.format(Locale.US, "%.2f", curvesValue.blacksLevel / 100.0f);
break;
case 1:
str = String.format(Locale.US, "%.2f", curvesValue.shadowsLevel / 100.0f);
break;
case 2:
str = String.format(Locale.US, "%.2f", curvesValue.midtonesLevel / 100.0f);
break;
case 3:
str = String.format(Locale.US, "%.2f", curvesValue.highlightsLevel / 100.0f);
break;
case 4:
str = String.format(Locale.US, "%.2f", curvesValue.whitesLevel / 100.0f);
break;
default:
str = "";
break;
}
float width = textPaint.measureText(str);
canvas.drawText(str, actualArea.x + (segmentWidth - width) / 2 + segmentWidth * a, actualArea.y + actualArea.height - AndroidUtilities.dp(4), textPaint);
}
float[] points = curvesValue.interpolateCurve();
invalidate();
path.reset();
for (int a = 0; a < points.length / 2; a++) {
if (a == 0) {
path.moveTo(actualArea.x + points[a * 2] * actualArea.width, actualArea.y + (1.0f - points[a * 2 + 1]) * actualArea.height);
} else {
path.lineTo(actualArea.x + points[a * 2] * actualArea.width, actualArea.y + (1.0f - points[a * 2 + 1]) * actualArea.height);
}
}
canvas.drawPath(path, paintCurve);
}
}

View File

@ -22,7 +22,6 @@ import android.widget.EditText;
import android.widget.FrameLayout;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.TextView;
import org.telegram.messenger.AndroidUtilities;
import org.telegram.messenger.Emoji;
@ -99,8 +98,8 @@ public class PhotoViewerCaptionEnterView extends FrameLayoutFixed implements Not
messageEditText = new EditText(context);
messageEditText.setHint(LocaleController.getString("AddCaption", R.string.AddCaption));
messageEditText.setImeOptions(EditorInfo.IME_FLAG_NO_EXTRACT_UI | EditorInfo.IME_ACTION_DONE);
messageEditText.setInputType(EditorInfo.TYPE_TEXT_FLAG_CAP_SENTENCES | EditorInfo.TYPE_CLASS_TEXT);
messageEditText.setImeOptions(EditorInfo.IME_FLAG_NO_EXTRACT_UI);
messageEditText.setInputType(messageEditText.getInputType() | EditorInfo.TYPE_TEXT_FLAG_CAP_SENTENCES);
messageEditText.setMaxLines(4);
messageEditText.setHorizontallyScrolling(false);
messageEditText.setTextSize(TypedValue.COMPLEX_UNIT_DIP, 18);
@ -111,7 +110,7 @@ public class PhotoViewerCaptionEnterView extends FrameLayoutFixed implements Not
messageEditText.setTextColor(0xffffffff);
messageEditText.setHintTextColor(0xb2ffffff);
InputFilter[] inputFilters = new InputFilter[1];
inputFilters[0] = new InputFilter.LengthFilter(140);
inputFilters[0] = new InputFilter.LengthFilter(200);
messageEditText.setFilters(inputFilters);
frameLayout.addView(messageEditText, LayoutHelper.createFrame(LayoutHelper.MATCH_PARENT, LayoutHelper.WRAP_CONTENT, Gravity.LEFT | Gravity.BOTTOM, 52, 0, 6, 0));
messageEditText.setOnKeyListener(new OnKeyListener() {
@ -122,9 +121,6 @@ public class PhotoViewerCaptionEnterView extends FrameLayoutFixed implements Not
showPopup(0);
}
return true;
} else if (i == KeyEvent.KEYCODE_ENTER && keyEvent.getAction() == KeyEvent.ACTION_DOWN) {
delegate.onCaptionEnter();
return true;
}
return false;
}
@ -137,19 +133,20 @@ public class PhotoViewerCaptionEnterView extends FrameLayoutFixed implements Not
}
}
});
messageEditText.setOnEditorActionListener(new TextView.OnEditorActionListener() {
/*messageEditText.setOnEditorActionListener(new TextView.OnEditorActionListener() {
@Override
public boolean onEditorAction(TextView textView, int i, KeyEvent keyEvent) {
if (i == EditorInfo.IME_ACTION_DONE || i == EditorInfo.IME_ACTION_NEXT) {
delegate.onCaptionEnter();
return true;
} else if (keyEvent != null && i == EditorInfo.IME_NULL && keyEvent.getAction() == KeyEvent.ACTION_DOWN) {
} else
if (keyEvent != null && i == EditorInfo.IME_NULL && keyEvent.getAction() == KeyEvent.ACTION_DOWN) {
delegate.onCaptionEnter();
return true;
}
return false;
}
});
});*/
messageEditText.addTextChangedListener(new TextWatcher() {
boolean processChange = false;

View File

@ -99,7 +99,8 @@ public class PlayerView extends FrameLayout implements NotificationCenter.Notifi
setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if (fragment != null) {
MessageObject messageObject = MediaController.getInstance().getPlayingMessageObject();
if (messageObject != null && messageObject.isMusic() && fragment != null) {
fragment.presentFragment(new AudioPlayerActivity());
}
}
@ -158,7 +159,7 @@ public class PlayerView extends FrameLayout implements NotificationCenter.Notifi
create = true;
}
}
if (messageObject == null || !messageObject.isMusic()) {
if (messageObject == null || messageObject.getId() == 0/* || !messageObject.isMusic()*/) {
lastMessageObject = null;
if (visible) {
visible = false;
@ -224,7 +225,14 @@ public class PlayerView extends FrameLayout implements NotificationCenter.Notifi
}
if (lastMessageObject != messageObject) {
lastMessageObject = messageObject;
SpannableStringBuilder stringBuilder = new SpannableStringBuilder(String.format("%s - %s", messageObject.getMusicAuthor(), messageObject.getMusicTitle()));
SpannableStringBuilder stringBuilder;
if (lastMessageObject.isVoice()) {
stringBuilder = new SpannableStringBuilder(String.format("%s %s", messageObject.getMusicAuthor(), messageObject.getMusicTitle()));
titleTextView.setEllipsize(TextUtils.TruncateAt.MIDDLE);
} else {
stringBuilder = new SpannableStringBuilder(String.format("%s - %s", messageObject.getMusicAuthor(), messageObject.getMusicTitle()));
titleTextView.setEllipsize(TextUtils.TruncateAt.END);
}
TypefaceSpan span = new TypefaceSpan(AndroidUtilities.getTypeface("fonts/rmedium.ttf"));
stringBuilder.setSpan(span, 0, messageObject.getMusicAuthor().length(), Spanned.SPAN_INCLUSIVE_INCLUSIVE);
titleTextView.setText(stringBuilder);

View File

@ -24,6 +24,7 @@ import org.telegram.messenger.MessagesController;
import org.telegram.messenger.FileLoader;
import org.telegram.messenger.R;
import org.telegram.messenger.MessageObject;
import org.telegram.tgnet.TLRPC;
import org.telegram.ui.Cells.BaseCell;
import java.io.File;
@ -84,7 +85,7 @@ public class PopupAudioView extends BaseCell implements SeekBar.SeekBarDelegate,
TAG = MediaController.getInstance().generateObserverTag();
seekBar = new SeekBar(getContext());
seekBar.delegate = this;
seekBar.setDelegate(this);
progressView = new ProgressView();
}
@ -232,7 +233,7 @@ public class PopupAudioView extends BaseCell implements SeekBar.SeekBarDelegate,
boolean result = MediaController.getInstance().playAudio(currentMessageObject);
if (!currentMessageObject.isOut() && currentMessageObject.isContentUnread()) {
if (currentMessageObject.messageOwner.to_id.channel_id == 0) {
MessagesController.getInstance().markMessageContentAsRead(currentMessageObject.messageOwner);
MessagesController.getInstance().markMessageContentAsRead(currentMessageObject);
currentMessageObject.setContentIsRead();
}
}
@ -247,11 +248,11 @@ public class PopupAudioView extends BaseCell implements SeekBar.SeekBarDelegate,
invalidate();
}
} else if (buttonState == 2) {
FileLoader.getInstance().loadFile(currentMessageObject.messageOwner.media.audio, true);
FileLoader.getInstance().loadFile(currentMessageObject.messageOwner.media.document, true, false);
buttonState = 3;
invalidate();
} else if (buttonState == 3) {
FileLoader.getInstance().cancelLoadFile(currentMessageObject.messageOwner.media.audio);
FileLoader.getInstance().cancelLoadFile(currentMessageObject.messageOwner.media.document);
buttonState = 2;
invalidate();
}
@ -266,9 +267,15 @@ public class PopupAudioView extends BaseCell implements SeekBar.SeekBarDelegate,
seekBar.setProgress(currentMessageObject.audioProgress);
}
int duration;
int duration = 0;
if (!MediaController.getInstance().isPlayingAudio(currentMessageObject)) {
duration = currentMessageObject.messageOwner.media.audio.duration;
for (int a = 0; a < currentMessageObject.messageOwner.media.document.attributes.size(); a++) {
TLRPC.DocumentAttribute attribute = currentMessageObject.messageOwner.media.document.attributes.get(a);
if (attribute instanceof TLRPC.TL_documentAttributeAudio) {
duration = attribute.duration;
break;
}
}
} else {
duration = currentMessageObject.audioProgressSec;
}
@ -282,7 +289,7 @@ public class PopupAudioView extends BaseCell implements SeekBar.SeekBarDelegate,
public void downloadAudioIfNeed() {
if (buttonState == 2) {
FileLoader.getInstance().loadFile(currentMessageObject.messageOwner.media.audio, true);
FileLoader.getInstance().loadFile(currentMessageObject.messageOwner.media.document, true, false);
buttonState = 3;
invalidate();
}

View File

@ -85,6 +85,7 @@ public class RadioButton extends View {
public void setColor(int color1, int color2) {
color = color1;
checkedColor = color2;
invalidate();
}
private void cancelCheckAnimator() {

View File

@ -9,11 +9,16 @@
package org.telegram.ui.Components;
public class Rect {
public float x;
public float y;
public float width;
public float height;
public Rect() {
}
public Rect(float x, float y, float width, float height) {
this.x = x;
this.y = y;

View File

@ -39,9 +39,9 @@ public class ResourceLoader {
public static Drawable[][] shareDrawable = new Drawable[2][2];
public static Drawable viewsCountDrawable;
public static Drawable[] viewsCountDrawable = new Drawable[2];
public static Drawable viewsOutCountDrawable;
public static Drawable[] viewsMediaCountDrawable = new Drawable[2];
public static Drawable viewsMediaCountDrawable;
public static Drawable geoInDrawable;
public static Drawable geoOutDrawable;
@ -79,10 +79,10 @@ public class ResourceLoader {
backgroundBlack = context.getResources().getDrawable(R.drawable.system_black);
backgroundBlue = context.getResources().getDrawable(R.drawable.system_blue);
viewsCountDrawable = context.getResources().getDrawable(R.drawable.post_views);
viewsCountDrawable[0] = context.getResources().getDrawable(R.drawable.post_views);
viewsCountDrawable[1] = context.getResources().getDrawable(R.drawable.post_views_s);
viewsOutCountDrawable = context.getResources().getDrawable(R.drawable.post_viewsg);
viewsMediaCountDrawable[0] = context.getResources().getDrawable(R.drawable.post_views_w);
viewsMediaCountDrawable[1] = context.getResources().getDrawable(R.drawable.post_views_s);
viewsMediaCountDrawable = context.getResources().getDrawable(R.drawable.post_views_w);
audioStatesDrawable[0][2] = audioStatesDrawable[0][0] = context.getResources().getDrawable(R.drawable.play_w2);
audioStatesDrawable[0][1] = context.getResources().getDrawable(R.drawable.play_w2_pressed);

View File

@ -33,7 +33,7 @@ public class SeekBar {
private boolean pressed = false;
public int width;
public int height;
public SeekBarDelegate delegate;
private SeekBarDelegate delegate;
public SeekBar(Context context) {
if (innerPaint1 == null) {
@ -54,6 +54,10 @@ public class SeekBar {
}
}
public void setDelegate(SeekBarDelegate seekBarDelegate) {
delegate = seekBarDelegate;
}
public boolean onTouch(int action, float x, float y) {
if (action == MotionEvent.ACTION_DOWN) {
int additionWidth = (height - thumbWidth) / 2;

View File

@ -0,0 +1,190 @@
/*
* 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-2016.
*/
package org.telegram.ui.Components;
import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Paint;
import android.view.MotionEvent;
import android.view.View;
import org.telegram.messenger.AndroidUtilities;
import org.telegram.messenger.MessageObject;
public class SeekBarWaveform {
private static Paint paintInner;
private static Paint paintOuter;
public int thumbX = 0;
public int thumbDX = 0;
private float startX;
private boolean startDraging = false;
private boolean pressed = false;
public int width;
public int height;
private SeekBar.SeekBarDelegate delegate;
private byte[] waveformBytes;
private MessageObject messageObject;
private View parentView;
private boolean selected;
private int innerColor;
private int outerColor;
private int selectedColor;
public SeekBarWaveform(Context context) {
if (paintInner == null) {
paintInner = new Paint();
paintOuter = new Paint();
}
}
public void setDelegate(SeekBar.SeekBarDelegate seekBarDelegate) {
delegate = seekBarDelegate;
}
public void setColors(int inner, int outer, int selected) {
innerColor = inner;
outerColor = outer;
selectedColor = selected;
}
public void setWaveform(byte[] waveform) {
waveformBytes = waveform;
}
public void setSelected(boolean value) {
selected = value;
}
public void setMessageObject(MessageObject object) {
messageObject = object;
}
public void setParentView(View view) {
parentView = view;
}
public boolean isStartDraging() {
return startDraging;
}
public boolean onTouch(int action, float x, float y) {
if (action == MotionEvent.ACTION_DOWN) {
if (0 <= x && x <= width && y >= 0 && y <= height) {
startX = x;
pressed = true;
thumbDX = (int) (x - thumbX);
startDraging = false;
return true;
}
} else if (action == MotionEvent.ACTION_UP || action == MotionEvent.ACTION_CANCEL) {
if (pressed) {
if (action == MotionEvent.ACTION_UP && delegate != null) {
delegate.onSeekBarDrag((float) thumbX / (float) width);
}
pressed = false;
return true;
}
} else if (action == MotionEvent.ACTION_MOVE) {
if (pressed) {
if (startDraging) {
thumbX = (int) (x - thumbDX);
if (thumbX < 0) {
thumbX = 0;
} else if (thumbX > width) {
thumbX = width;
}
}
if (startX != -1 && Math.abs(x - startX) > AndroidUtilities.getPixelsInCM(0.2f, true)) {
if (parentView != null) {
parentView.getParent().requestDisallowInterceptTouchEvent(true);
}
startDraging = true;
startX = -1;
}
return true;
}
}
return false;
}
public void setProgress(float progress) {
thumbX = (int)Math.ceil(width * progress);
if (thumbX < 0) {
thumbX = 0;
} else if (thumbX > width) {
thumbX = width;
}
}
public boolean isDragging() {
return pressed;
}
public void draw(Canvas canvas) {
if (waveformBytes == null || width == 0) {
return;
}
float totalBarsCount = width / AndroidUtilities.dp(3);
if (totalBarsCount <= 0.1f) {
return;
}
byte value;
int samplesCount = (waveformBytes.length * 8 / 5);
float samplesPerBar = samplesCount / totalBarsCount;
float barCounter = 0;
int nextBarNum = 0;
paintInner.setColor(messageObject != null && !messageObject.isOutOwner() && messageObject.isContentUnread() && messageObject.messageOwner.to_id.channel_id == 0 ? outerColor : (selected ? selectedColor : innerColor));
paintOuter.setColor(outerColor);
int y = (height - AndroidUtilities.dp(14)) / 2;
int barNum = 0;
int lastBarNum;
int drawBarCount;
for (int a = 0; a < samplesCount; a++) {
if (a != nextBarNum) {
continue;
}
drawBarCount = 0;
lastBarNum = nextBarNum;
while (lastBarNum == nextBarNum) {
barCounter += samplesPerBar;
nextBarNum = (int) barCounter;
drawBarCount++;
}
int bitPointer = a * 5;
int byteNum = bitPointer / 8;
int byteBitOffset = bitPointer - byteNum * 8;
int currentByteCount = 8 - byteBitOffset;
int nextByteRest = 5 - currentByteCount;
value = (byte) ((waveformBytes[byteNum] >> byteBitOffset) & ((2 << (Math.min(5, currentByteCount) - 1)) - 1));
if (nextByteRest > 0) {
value <<= nextByteRest;
value |= waveformBytes[byteNum + 1] & ((2 << (nextByteRest - 1)) - 1);
}
for (int b = 0; b < drawBarCount; b++) {
int x = barNum * AndroidUtilities.dp(3);
if (x < thumbX && x + AndroidUtilities.dp(2) < thumbX) {
canvas.drawRect(x, y + AndroidUtilities.dp(14 - Math.max(1, 14.0f * value / 31.0f)), x + AndroidUtilities.dp(2), y + AndroidUtilities.dp(14), paintOuter);
} else {
canvas.drawRect(x, y + AndroidUtilities.dp(14 - Math.max(1, 14.0f * value / 31.0f)), x + AndroidUtilities.dp(2), y + AndroidUtilities.dp(14), paintInner);
if (x < thumbX) {
canvas.drawRect(x, y + AndroidUtilities.dp(14 - Math.max(1, 14.0f * value / 31.0f)), thumbX, y + AndroidUtilities.dp(14), paintOuter);
}
}
barNum++;
}
}
}
}

View File

@ -9,6 +9,7 @@
package org.telegram.ui.Components;
import android.content.Context;
import android.os.Build;
import android.text.Editable;
import android.text.InputType;
import android.text.TextUtils;
@ -26,9 +27,11 @@ import android.widget.GridView;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.TextView;
import android.widget.Toast;
import org.telegram.SQLite.SQLiteCursor;
import org.telegram.messenger.AndroidUtilities;
import org.telegram.messenger.ApplicationLoader;
import org.telegram.messenger.ChatObject;
import org.telegram.messenger.FileLog;
import org.telegram.messenger.LocaleController;
@ -37,7 +40,9 @@ import org.telegram.messenger.MessagesController;
import org.telegram.messenger.MessagesStorage;
import org.telegram.messenger.R;
import org.telegram.messenger.SendMessagesHelper;
import org.telegram.tgnet.ConnectionsManager;
import org.telegram.tgnet.NativeByteBuffer;
import org.telegram.tgnet.RequestDelegate;
import org.telegram.tgnet.TLObject;
import org.telegram.tgnet.TLRPC;
import org.telegram.ui.ActionBar.BottomSheet;
@ -66,12 +71,44 @@ public class ShareFrameLayout extends FrameLayout {
private EmptyTextProgressView searchEmptyView;
private HashMap<Long, TLRPC.Dialog> selectedDialogs = new HashMap<>();
public ShareFrameLayout(Context context, BottomSheet bottomSheet, MessageObject messageObject) {
private TLRPC.TL_exportedMessageLink exportedMessageLink;
private boolean loadingLink;
private boolean copyLinkOnEnd;
private boolean isPublicChannel;
public ShareFrameLayout(final Context context, BottomSheet bottomSheet, final MessageObject messageObject, boolean publicChannel) {
super(context);
parentBottomSheet = bottomSheet;
sendingMessageObject = messageObject;
searchAdapter = new ShareSearchAdapter(context);
isPublicChannel = publicChannel;
if (publicChannel) {
loadingLink = true;
TLRPC.TL_channels_exportMessageLink req = new TLRPC.TL_channels_exportMessageLink();
req.id = messageObject.getId();
req.channel = MessagesController.getInputChannel(messageObject.messageOwner.to_id.channel_id);
ConnectionsManager.getInstance().sendRequest(req, new RequestDelegate() {
@Override
public void run(final TLObject response, TLRPC.TL_error error) {
AndroidUtilities.runOnUIThread(new Runnable() {
@Override
public void run() {
if (response != null) {
exportedMessageLink = (TLRPC.TL_exportedMessageLink) response;
if (copyLinkOnEnd) {
copyLink(context);
}
}
loadingLink = false;
}
});
}
});
}
FrameLayout frameLayout = new FrameLayout(context);
frameLayout.setBackgroundColor(0xffffffff);
@ -85,21 +122,31 @@ public class ShareFrameLayout extends FrameLayout {
doneButton.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
ArrayList<MessageObject> arrayList = new ArrayList<>();
arrayList.add(sendingMessageObject);
for (HashMap.Entry<Long, TLRPC.Dialog> entry : selectedDialogs.entrySet()) {
TLRPC.Dialog dialog = entry.getValue();
boolean asAdmin = true;
int lower_id = (int) dialog.id;
if (lower_id < 0) {
TLRPC.Chat chat = MessagesController.getInstance().getChat(-lower_id);
if (chat.megagroup) {
asAdmin = false;
}
if (selectedDialogs.isEmpty() && isPublicChannel) {
if (loadingLink) {
copyLinkOnEnd = true;
Toast.makeText(ShareFrameLayout.this.getContext(), LocaleController.getString("Loading", R.string.Loading), Toast.LENGTH_SHORT).show();
} else {
copyLink(ShareFrameLayout.this.getContext());
}
SendMessagesHelper.getInstance().sendMessage(arrayList, entry.getKey(), asAdmin);
parentBottomSheet.dismiss();
} else {
ArrayList<MessageObject> arrayList = new ArrayList<>();
arrayList.add(sendingMessageObject);
for (HashMap.Entry<Long, TLRPC.Dialog> entry : selectedDialogs.entrySet()) {
TLRPC.Dialog dialog = entry.getValue();
boolean asAdmin = true;
int lower_id = (int) dialog.id;
if (lower_id < 0) {
TLRPC.Chat chat = MessagesController.getInstance().getChat(-lower_id);
if (chat.megagroup) {
asAdmin = false;
}
}
SendMessagesHelper.getInstance().sendMessage(arrayList, entry.getKey(), asAdmin);
}
parentBottomSheet.dismiss();
}
parentBottomSheet.dismiss();
}
});
@ -118,7 +165,6 @@ public class ShareFrameLayout extends FrameLayout {
doneButtonTextView.setTextColor(0xff19a7e8);
doneButtonTextView.setGravity(Gravity.CENTER);
doneButtonTextView.setCompoundDrawablePadding(AndroidUtilities.dp(8));
doneButtonTextView.setText(LocaleController.getString("Send", R.string.Send).toUpperCase());
doneButtonTextView.setTypeface(AndroidUtilities.getTypeface("fonts/rmedium.ttf"));
doneButton.addView(doneButtonTextView, LayoutHelper.createLinear(LayoutHelper.WRAP_CONTENT, LayoutHelper.WRAP_CONTENT, Gravity.CENTER_VERTICAL));
@ -218,7 +264,7 @@ public class ShareFrameLayout extends FrameLayout {
selectedDialogs.put(dialog.id, dialog);
cell.setChecked(true, true);
}
updateSelectedCount(selectedDialogs.size(), true);
updateSelectedCount();
}
});
@ -229,20 +275,47 @@ public class ShareFrameLayout extends FrameLayout {
gridView.setEmptyView(searchEmptyView);
addView(searchEmptyView, LayoutHelper.createFrame(LayoutHelper.MATCH_PARENT, LayoutHelper.MATCH_PARENT, Gravity.TOP | Gravity.LEFT, 0, 48, 0, 0));
updateSelectedCount(selectedDialogs.size(), true);
updateSelectedCount();
}
public void updateSelectedCount(int count, boolean disable) {
if (count == 0) {
public void copyLink(Context context) {
if (exportedMessageLink == null) {
return;
}
try {
if (Build.VERSION.SDK_INT < 11) {
android.text.ClipboardManager clipboard = (android.text.ClipboardManager) ApplicationLoader.applicationContext.getSystemService(Context.CLIPBOARD_SERVICE);
clipboard.setText(exportedMessageLink.link);
} else {
android.content.ClipboardManager clipboard = (android.content.ClipboardManager) ApplicationLoader.applicationContext.getSystemService(Context.CLIPBOARD_SERVICE);
android.content.ClipData clip = android.content.ClipData.newPlainText("label", exportedMessageLink.link);
clipboard.setPrimaryClip(clip);
}
Toast.makeText(context, LocaleController.getString("LinkCopied", R.string.LinkCopied), Toast.LENGTH_SHORT).show();
} catch (Exception e) {
FileLog.e("tmessages", e);
}
}
public void updateSelectedCount() {
if (selectedDialogs.isEmpty()) {
doneButtonBadgeTextView.setVisibility(View.GONE);
doneButtonTextView.setTextColor(0xffb3b3b3);
doneButton.setEnabled(false);
if (!isPublicChannel) {
doneButtonTextView.setTextColor(0xffb3b3b3);
doneButton.setEnabled(false);
doneButtonTextView.setText(LocaleController.getString("Send", R.string.Send).toUpperCase());
} else {
doneButtonTextView.setTextColor(0xff517fad);
doneButton.setEnabled(true);
doneButtonTextView.setText(LocaleController.getString("CopyLink", R.string.CopyLink).toUpperCase());
}
} else {
doneButtonTextView.setCompoundDrawablesWithIntrinsicBounds(0, 0, 0, 0);
doneButtonBadgeTextView.setVisibility(View.VISIBLE);
doneButtonBadgeTextView.setText(String.format("%d", count));
doneButtonBadgeTextView.setText(String.format("%d", selectedDialogs.size()));
doneButtonTextView.setTextColor(0xff3ec1f9);
doneButton.setEnabled(true);
doneButtonTextView.setText(LocaleController.getString("Send", R.string.Send).toUpperCase());
}
}

View File

@ -12,6 +12,7 @@ import android.app.AlertDialog;
import android.content.Context;
import android.content.DialogInterface;
import android.database.DataSetObserver;
import android.view.MotionEvent;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
@ -22,6 +23,7 @@ import org.telegram.messenger.AndroidUtilities;
import org.telegram.messenger.NotificationCenter;
import org.telegram.tgnet.TLRPC;
import org.telegram.ui.Cells.StickerEmojiCell;
import org.telegram.ui.StickerPreviewViewer;
import java.util.ArrayList;
@ -42,10 +44,22 @@ public class StickersAlert extends AlertDialog implements NotificationCenter.Not
};
setView(container, AndroidUtilities.dp(16), 0, AndroidUtilities.dp(16), 0);
gridView = new GridView(context);
gridView = new GridView(context) {
@Override
public boolean onInterceptTouchEvent(MotionEvent event) {
boolean result = StickerPreviewViewer.getInstance().onInterceptTouchEvent(event, gridView, 0);
return super.onInterceptTouchEvent(event) || result;
}
};
gridView.setNumColumns(4);
gridView.setAdapter(new GridAdapter(context));
gridView.setVerticalScrollBarEnabled(false);
gridView.setOnTouchListener(new View.OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
return StickerPreviewViewer.getInstance().onTouch(event, gridView, 0, null);
}
});
container.addView(gridView, LayoutHelper.createFrame(LayoutHelper.MATCH_PARENT, LayoutHelper.MATCH_PARENT));
setTitle(set.set.title);
@ -77,6 +91,10 @@ public class StickersAlert extends AlertDialog implements NotificationCenter.Not
if (gridView != null) {
gridView.invalidateViews();
}
if (StickerPreviewViewer.getInstance().isVisible()) {
StickerPreviewViewer.getInstance().close();
}
StickerPreviewViewer.getInstance().reset();
}
}

View File

@ -10,10 +10,7 @@ package org.telegram.ui.Components;
import android.annotation.SuppressLint;
import android.content.Context;
import android.content.Intent;
import android.net.Uri;
import android.os.Build;
import android.provider.Browser;
import android.text.TextUtils;
import android.util.TypedValue;
import android.view.Gravity;
@ -95,10 +92,7 @@ public class WebFrameLayout extends FrameLayout {
textView.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
Uri uri = Uri.parse(openUrl);
Intent intent = new Intent(Intent.ACTION_VIEW, uri);
intent.putExtra(Browser.EXTRA_APPLICATION_ID, getContext().getPackageName());
getContext().startActivity(intent);
AndroidUtilities.openUrl(getContext(), openUrl);
if (dialog != null) {
dialog.dismiss();
}

View File

@ -39,6 +39,7 @@ import android.widget.ProgressBar;
import android.widget.TextView;
import org.telegram.messenger.AndroidUtilities;
import org.telegram.messenger.BuildVars;
import org.telegram.messenger.ChatObject;
import org.telegram.messenger.ImageLoader;
import org.telegram.messenger.LocaleController;
@ -277,7 +278,11 @@ public class DialogsActivity extends BaseFragment implements NotificationCenter.
} else {
actionBar.setBackButtonDrawable(new MenuDrawable());
}
actionBar.setTitle(LocaleController.getString("AppName", R.string.AppName));
if (BuildVars.DEBUG_VERSION) {
actionBar.setTitle(LocaleController.getString("AppNameBeta", R.string.AppNameBeta));
} else {
actionBar.setTitle(LocaleController.getString("AppName", R.string.AppName));
}
}
actionBar.setAllowOverlayTitle(true);
@ -849,7 +854,7 @@ public class DialogsActivity extends BaseFragment implements NotificationCenter.
ContactsController.getInstance().readContacts();
break;
case Manifest.permission.WRITE_EXTERNAL_STORAGE:
ImageLoader.getInstance().createMediaPaths();
ImageLoader.getInstance().checkMediaPaths();
break;
}
}

View File

@ -9,6 +9,7 @@
package org.telegram.ui;
import android.app.Activity;
import android.app.AlertDialog;
import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.Canvas;
@ -77,12 +78,13 @@ public class GroupCreateActivity extends BaseFragment implements NotificationCen
private int beforeChangeIndex;
private boolean ignoreChange;
private CharSequence changeString;
private int maxCount = 199;
private int maxCount = 1000;
private int chatType = ChatObject.CHAT_TYPE_CHAT;
private boolean isAlwaysShare;
private boolean isNeverShare;
private boolean searchWas;
private boolean searching;
private boolean isGroup;
private HashMap<Integer, ChipSpan> selectedContacts = new HashMap<>();
private ArrayList<ChipSpan> allSpans = new ArrayList<>();
@ -97,7 +99,8 @@ public class GroupCreateActivity extends BaseFragment implements NotificationCen
chatType = args.getInt("chatType", ChatObject.CHAT_TYPE_CHAT);
isAlwaysShare = args.getBoolean("isAlwaysShare", false);
isNeverShare = args.getBoolean("isNeverShare", false);
maxCount = chatType == ChatObject.CHAT_TYPE_CHAT ? (MessagesController.getInstance().maxGroupCount - 1) : MessagesController.getInstance().maxBroadcastCount;
isGroup = args.getBoolean("isGroup", false);
maxCount = chatType == ChatObject.CHAT_TYPE_CHAT ? MessagesController.getInstance().maxMegagroupCount : MessagesController.getInstance().maxBroadcastCount;
}
@Override
@ -124,9 +127,17 @@ public class GroupCreateActivity extends BaseFragment implements NotificationCen
actionBar.setBackButtonImage(R.drawable.ic_ab_back);
actionBar.setAllowOverlayTitle(true);
if (isAlwaysShare) {
actionBar.setTitle(LocaleController.getString("AlwaysShareWithTitle", R.string.AlwaysShareWithTitle));
if (isGroup) {
actionBar.setTitle(LocaleController.getString("AlwaysAllow", R.string.AlwaysAllow));
} else {
actionBar.setTitle(LocaleController.getString("AlwaysShareWithTitle", R.string.AlwaysShareWithTitle));
}
} else if (isNeverShare) {
actionBar.setTitle(LocaleController.getString("NeverShareWithTitle", R.string.NeverShareWithTitle));
if (isGroup) {
actionBar.setTitle(LocaleController.getString("NeverAllow", R.string.NeverAllow));
} else {
actionBar.setTitle(LocaleController.getString("NeverShareWithTitle", R.string.NeverShareWithTitle));
}
} else {
actionBar.setTitle(chatType == ChatObject.CHAT_TYPE_CHAT ? LocaleController.getString("NewGroup", R.string.NewGroup) : LocaleController.getString("NewBroadcastList", R.string.NewBroadcastList));
actionBar.setSubtitle(LocaleController.formatString("MembersCount", R.string.MembersCount, selectedContacts.size(), maxCount));
@ -191,9 +202,17 @@ public class GroupCreateActivity extends BaseFragment implements NotificationCen
frameLayout.addView(userSelectEditText, LayoutHelper.createFrame(LayoutHelper.MATCH_PARENT, LayoutHelper.WRAP_CONTENT, Gravity.TOP | Gravity.LEFT, 10, 0, 10, 0));
if (isAlwaysShare) {
userSelectEditText.setHint(LocaleController.getString("AlwaysShareWithPlaceholder", R.string.AlwaysShareWithPlaceholder));
if (isGroup) {
userSelectEditText.setHint(LocaleController.getString("AlwaysAllowPlaceholder", R.string.AlwaysAllowPlaceholder));
} else {
userSelectEditText.setHint(LocaleController.getString("AlwaysShareWithPlaceholder", R.string.AlwaysShareWithPlaceholder));
}
} else if (isNeverShare) {
userSelectEditText.setHint(LocaleController.getString("NeverShareWithPlaceholder", R.string.NeverShareWithPlaceholder));
if (isGroup) {
userSelectEditText.setHint(LocaleController.getString("NeverAllowPlaceholder", R.string.NeverAllowPlaceholder));
} else {
userSelectEditText.setHint(LocaleController.getString("NeverShareWithPlaceholder", R.string.NeverShareWithPlaceholder));
}
} else {
userSelectEditText.setHint(LocaleController.getString("SendMessageTo", R.string.SendMessageTo));
}
@ -356,6 +375,14 @@ public class GroupCreateActivity extends BaseFragment implements NotificationCen
if (maxCount != 0 && selectedContacts.size() == maxCount) {
return;
}
if (chatType == ChatObject.CHAT_TYPE_CHAT && selectedContacts.size() == MessagesController.getInstance().maxGroupCount - 1) {
AlertDialog.Builder builder = new AlertDialog.Builder(getParentActivity());
builder.setTitle(LocaleController.getString("AppName", R.string.AppName));
builder.setMessage(LocaleController.getString("SoftUserLimitAlert", R.string.SoftUserLimitAlert));
builder.setPositiveButton(LocaleController.getString("OK", R.string.OK), null);
showDialog(builder.create());
return;
}
ignoreChange = true;
ChipSpan span = createAndPutChipForUser(user);
span.uid = user.id;

View File

@ -164,7 +164,7 @@ public class GroupCreateFinalActivity extends BaseFragment implements Notificati
donePressed = true;
if (chatType == ChatObject.CHAT_TYPE_BROADCAST) {
MessagesController.getInstance().createChat(nameTextView.getText().toString(), selectedContacts, null, chatType);
MessagesController.getInstance().createChat(nameTextView.getText().toString(), selectedContacts, null, chatType, GroupCreateFinalActivity.this);
} else {
if (avatarUpdater.uploadingAvatar != null) {
createAfterUpload = true;
@ -174,7 +174,7 @@ public class GroupCreateFinalActivity extends BaseFragment implements Notificati
progressDialog.setCanceledOnTouchOutside(false);
progressDialog.setCancelable(false);
final int reqId = MessagesController.getInstance().createChat(nameTextView.getText().toString(), selectedContacts, null, chatType);
final int reqId = MessagesController.getInstance().createChat(nameTextView.getText().toString(), selectedContacts, null, chatType, GroupCreateFinalActivity.this);
progressDialog.setButton(DialogInterface.BUTTON_NEGATIVE, LocaleController.getString("Cancel", R.string.Cancel), new DialogInterface.OnClickListener() {
@Override
@ -335,7 +335,7 @@ public class GroupCreateFinalActivity extends BaseFragment implements Notificati
avatarImage.setImage(avatar, "50_50", avatarDrawable);
if (createAfterUpload) {
FileLog.e("tmessages", "avatar did uploaded");
MessagesController.getInstance().createChat(nameTextView.getText().toString(), selectedContacts, null, chatType);
MessagesController.getInstance().createChat(nameTextView.getText().toString(), selectedContacts, null, chatType, GroupCreateFinalActivity.this);
}
}
});

View File

@ -10,28 +10,53 @@ package org.telegram.ui;
import android.content.Context;
import android.os.Bundle;
import android.support.annotation.NonNull;
import android.text.Spannable;
import android.text.SpannableStringBuilder;
import android.text.Spanned;
import android.text.method.LinkMovementMethod;
import android.util.TypedValue;
import android.view.Gravity;
import android.view.MotionEvent;
import android.view.Surface;
import android.view.View;
import android.view.ViewTreeObserver;
import android.view.WindowManager;
import android.widget.FrameLayout;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.TextView;
import org.telegram.messenger.AndroidUtilities;
import org.telegram.messenger.FileLog;
import org.telegram.messenger.LocaleController;
import org.telegram.messenger.ApplicationLoader;
import org.telegram.messenger.Utilities;
import org.telegram.tgnet.TLRPC;
import org.telegram.messenger.MessagesController;
import org.telegram.messenger.R;
import org.telegram.ui.ActionBar.ActionBar;
import org.telegram.ui.ActionBar.BaseFragment;
import org.telegram.ui.Components.IdenticonDrawable;
import org.telegram.ui.Components.LayoutHelper;
import org.telegram.ui.Components.URLSpanReplacement;
public class IdenticonActivity extends BaseFragment {
private int chat_id;
private static class LinkMovementMethodMy extends LinkMovementMethod {
@Override
public boolean onTouchEvent(@NonNull TextView widget, @NonNull Spannable buffer, @NonNull MotionEvent event) {
try {
return super.onTouchEvent(widget, buffer, event);
} catch (Exception e) {
FileLog.e("tmessages", e);
}
return false;
}
}
public IdenticonActivity(Bundle args) {
super(args);
}
@ -57,18 +82,11 @@ public class IdenticonActivity extends BaseFragment {
}
});
fragmentView = getParentActivity().getLayoutInflater().inflate(R.layout.identicon_layout, null, false);
ImageView identiconView = (ImageView) fragmentView.findViewById(R.id.identicon_view);
TextView textView = (TextView) fragmentView.findViewById(R.id.identicon_text);
TLRPC.EncryptedChat encryptedChat = MessagesController.getInstance().getEncryptedChat(chat_id);
if (encryptedChat != null) {
IdenticonDrawable drawable = new IdenticonDrawable();
identiconView.setImageDrawable(drawable);
drawable.setEncryptedChat(encryptedChat);
TLRPC.User user = MessagesController.getInstance().getUser(encryptedChat.user_id);
textView.setText(AndroidUtilities.replaceTags(LocaleController.formatString("EncryptionKeyDescription", R.string.EncryptionKeyDescription, user.first_name, user.first_name)));
}
fragmentView = new LinearLayout(context);
LinearLayout linearLayout = (LinearLayout) fragmentView;
linearLayout.setOrientation(LinearLayout.VERTICAL);
linearLayout.setWeightSum(100);
linearLayout.setBackgroundColor(0xfff0f0f0);
fragmentView.setOnTouchListener(new View.OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
@ -76,6 +94,61 @@ public class IdenticonActivity extends BaseFragment {
}
});
FrameLayout frameLayout = new FrameLayout(context);
frameLayout.setPadding(AndroidUtilities.dp(20), AndroidUtilities.dp(20), AndroidUtilities.dp(20), AndroidUtilities.dp(20));
linearLayout.addView(frameLayout, LayoutHelper.createLinear(LayoutHelper.MATCH_PARENT, LayoutHelper.MATCH_PARENT, 50.0f));
ImageView identiconView = new ImageView(context);
identiconView.setScaleType(ImageView.ScaleType.FIT_XY);
frameLayout.addView(identiconView, LayoutHelper.createFrame(LayoutHelper.MATCH_PARENT, LayoutHelper.MATCH_PARENT));
frameLayout = new FrameLayout(context);
frameLayout.setBackgroundColor(0xffffffff);
frameLayout.setPadding(AndroidUtilities.dp(10), 0, AndroidUtilities.dp(10), AndroidUtilities.dp(10));
linearLayout.addView(frameLayout, LayoutHelper.createLinear(LayoutHelper.MATCH_PARENT, LayoutHelper.MATCH_PARENT, 50.0f));
TextView textView = new TextView(context);
textView.setTextColor(0xff7f7f7f);
textView.setTextSize(TypedValue.COMPLEX_UNIT_DIP, 16);
textView.setLinksClickable(true);
textView.setClickable(true);
textView.setMovementMethod(new LinkMovementMethodMy());
//textView.setAutoLinkMask(Linkify.WEB_URLS);
textView.setLinkTextColor(0xff316f9f);
textView.setGravity(Gravity.CENTER);
frameLayout.addView(textView, LayoutHelper.createFrame(LayoutHelper.MATCH_PARENT, LayoutHelper.MATCH_PARENT));
TLRPC.EncryptedChat encryptedChat = MessagesController.getInstance().getEncryptedChat(chat_id);
if (encryptedChat != null) {
IdenticonDrawable drawable = new IdenticonDrawable();
identiconView.setImageDrawable(drawable);
drawable.setEncryptedChat(encryptedChat);
TLRPC.User user = MessagesController.getInstance().getUser(encryptedChat.user_id);
SpannableStringBuilder hash = new SpannableStringBuilder();
if (encryptedChat.key_hash.length > 16) {
String hex = Utilities.bytesToHex(encryptedChat.key_hash);
for (int a = 0; a < 32; a++) {
if (a != 0) {
if (a % 8 == 0) {
hash.append('\n');
} else if (a % 4 == 0) {
hash.append(' ');
}
}
hash.append(hex.substring(a * 2, a * 2 + 2));
hash.append(' ');
}
hash.append("\n\n");
}
hash.append(AndroidUtilities.replaceTags(LocaleController.formatString("EncryptionKeyDescription", R.string.EncryptionKeyDescription, user.first_name, user.first_name)));
final String url = "telegram.org";
int index = hash.toString().indexOf(url);
if (index != -1) {
hash.setSpan(new URLSpanReplacement(LocaleController.getString("EncryptionKeyLink", R.string.EncryptionKeyLink)), index, index + url.length(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
}
textView.setText(hash);
}
return fragmentView;
}
@ -100,7 +173,7 @@ public class IdenticonActivity extends BaseFragment {
return true;
}
fragmentView.getViewTreeObserver().removeOnPreDrawListener(this);
LinearLayout layout = (LinearLayout)fragmentView;
LinearLayout layout = (LinearLayout) fragmentView;
WindowManager manager = (WindowManager) ApplicationLoader.applicationContext.getSystemService(Context.WINDOW_SERVICE);
int rotation = manager.getDefaultDisplay().getRotation();

View File

@ -28,7 +28,7 @@ import android.widget.ImageView;
import android.widget.TextView;
import org.telegram.messenger.AndroidUtilities;
import org.telegram.messenger.BuildConfig;
import org.telegram.messenger.BuildVars;
import org.telegram.messenger.LocaleController;
import org.telegram.messenger.R;
import org.telegram.tgnet.ConnectionsManager;
@ -221,7 +221,7 @@ public class IntroActivity extends Activity {
finish();
}
});
if (BuildConfig.DEBUG) {
if (BuildVars.DEBUG_VERSION) {
startMessagingButton.setOnLongClickListener(new View.OnLongClickListener() {
@Override
public boolean onLongClick(View v) {

View File

@ -24,7 +24,6 @@ import android.net.Uri;
import android.os.Build;
import android.os.Bundle;
import android.os.Parcelable;
import android.provider.Browser;
import android.provider.ContactsContract;
import android.support.annotation.NonNull;
import android.view.ActionMode;
@ -53,6 +52,7 @@ import org.telegram.messenger.MessagesStorage;
import org.telegram.messenger.NativeCrashManager;
import org.telegram.messenger.SendMessagesHelper;
import org.telegram.messenger.UserObject;
import org.telegram.messenger.Utilities;
import org.telegram.messenger.query.StickersQuery;
import org.telegram.messenger.ApplicationLoader;
import org.telegram.messenger.FileLog;
@ -75,6 +75,7 @@ import java.io.BufferedReader;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
public class LaunchActivity extends Activity implements ActionBarLayout.ActionBarLayoutDelegate, NotificationCenter.NotificationCenterDelegate, DialogsActivity.MessagesActivityDelegate {
@ -327,12 +328,7 @@ public class LaunchActivity extends Activity implements ActionBarLayout.ActionBa
presentFragment(new SettingsActivity());
drawerLayoutContainer.closeDrawer(false);
} else if (position == 9) {
try {
Intent pickIntent = new Intent(Intent.ACTION_VIEW, Uri.parse(LocaleController.getString("TelegramFaqUrl", R.string.TelegramFaqUrl)));
startActivityForResult(pickIntent, 500);
} catch (Exception e) {
FileLog.e("tmessages", e);
}
AndroidUtilities.openUrl(LaunchActivity.this, LocaleController.getString("TelegramFaqUrl", R.string.TelegramFaqUrl));
drawerLayoutContainer.closeDrawer(false);
}
}
@ -610,7 +606,7 @@ public class LaunchActivity extends Activity implements ActionBarLayout.ActionBa
error = true;
}
} else {
if (type != null && (type.equals("text/plain") || type.equals("message/rfc822")) && (intent.getStringExtra(Intent.EXTRA_TEXT) != null || intent.getCharSequenceExtra(Intent.EXTRA_TEXT) != null)) {
if ((type == null || type != null && (type.equals("text/plain") || type.equals("message/rfc822"))) && (intent.getStringExtra(Intent.EXTRA_TEXT) != null || intent.getCharSequenceExtra(Intent.EXTRA_TEXT) != null)) {
String text = intent.getStringExtra(Intent.EXTRA_TEXT);
if (text == null) {
text = intent.getCharSequenceExtra(Intent.EXTRA_TEXT).toString();
@ -622,8 +618,8 @@ public class LaunchActivity extends Activity implements ActionBarLayout.ActionBa
text = subject + "\n" + text;
}
sendingText = text;
} else {
error = true;
} else if (subject != null && subject.length() > 0) {
sendingText = subject;
}
}
Parcelable parcelable = intent.getParcelableExtra(Intent.EXTRA_STREAM);
@ -633,38 +629,48 @@ public class LaunchActivity extends Activity implements ActionBarLayout.ActionBa
parcelable = Uri.parse(parcelable.toString());
}
Uri uri = (Uri) parcelable;
if (uri != null && (type != null && type.startsWith("image/") || uri.toString().toLowerCase().endsWith(".jpg"))) {
if (photoPathsArray == null) {
photoPathsArray = new ArrayList<>();
}
photoPathsArray.add(uri);
} else {
path = AndroidUtilities.getPath(uri);
if (path != null) {
if (path.startsWith("file:")) {
path = path.replace("file://", "");
if (uri != null) {
if (ContentResolver.SCHEME_FILE.equals(uri.getScheme())) {
String pathString = Utilities.readlink(uri.getPath());
if (pathString != null && pathString.contains("/data/data/" + getPackageName() + "/files")) {
error = true;
}
if (type != null && type.startsWith("video/")) {
videoPath = path;
} else {
if (documentsPathsArray == null) {
documentsPathsArray = new ArrayList<>();
documentsOriginalPathsArray = new ArrayList<>();
}
documentsPathsArray.add(path);
documentsOriginalPathsArray.add(uri.toString());
}
} else {
if (documentsUrisArray == null) {
documentsUrisArray = new ArrayList<>();
}
documentsUrisArray.add(uri);
documentsMimeType = type;
}
}
if (sendingText != null) {
if (sendingText.contains("WhatsApp")) { //remove unnecessary caption 'sent from WhatsApp' from photos forwarded from WhatsApp
sendingText = null;
if (!error) {
if (uri != null && (type != null && type.startsWith("image/") || uri.toString().toLowerCase().endsWith(".jpg"))) {
if (photoPathsArray == null) {
photoPathsArray = new ArrayList<>();
}
photoPathsArray.add(uri);
} else {
path = AndroidUtilities.getPath(uri);
if (path != null) {
if (path.startsWith("file:")) {
path = path.replace("file://", "");
}
if (type != null && type.startsWith("video/")) {
videoPath = path;
} else {
if (documentsPathsArray == null) {
documentsPathsArray = new ArrayList<>();
documentsOriginalPathsArray = new ArrayList<>();
}
documentsPathsArray.add(path);
documentsOriginalPathsArray.add(uri.toString());
}
} else {
if (documentsUrisArray == null) {
documentsUrisArray = new ArrayList<>();
}
documentsUrisArray.add(uri);
documentsMimeType = type;
}
}
if (sendingText != null) {
if (sendingText.contains("WhatsApp")) { //remove unnecessary caption 'sent from WhatsApp' from photos forwarded from WhatsApp
sendingText = null;
}
}
}
} else if (sendingText == null) {
@ -679,9 +685,31 @@ public class LaunchActivity extends Activity implements ActionBarLayout.ActionBa
try {
ArrayList<Parcelable> uris = intent.getParcelableArrayListExtra(Intent.EXTRA_STREAM);
String type = intent.getType();
if (uris != null) {
for (int a = 0; a < uris.size(); a++) {
Parcelable parcelable = uris.get(a);
if (!(parcelable instanceof Uri)) {
parcelable = Uri.parse(parcelable.toString());
}
Uri uri = (Uri) parcelable;
if (uri != null) {
if (ContentResolver.SCHEME_FILE.equals(uri.getScheme())) {
String pathString = Utilities.readlink(uri.getPath());
if (pathString != null && pathString.contains("/data/data/" + getPackageName() + "/files")) {
uris.remove(a);
a--;
}
}
}
}
if (uris.isEmpty()) {
uris = null;
}
}
if (uris != null) {
if (type != null && type.startsWith("image/")) {
for (Parcelable parcelable : uris) {
for (int a = 0; a < uris.size(); a++) {
Parcelable parcelable = uris.get(a);
if (!(parcelable instanceof Uri)) {
parcelable = Uri.parse(parcelable.toString());
}
@ -692,7 +720,8 @@ public class LaunchActivity extends Activity implements ActionBarLayout.ActionBa
photoPathsArray.add(uri);
}
} else {
for (Parcelable parcelable : uris) {
for (int a = 0; a < uris.size(); a++) {
Parcelable parcelable = uris.get(a);
if (!(parcelable instanceof Uri)) {
parcelable = Uri.parse(parcelable.toString());
}
@ -733,6 +762,7 @@ public class LaunchActivity extends Activity implements ActionBarLayout.ActionBa
String botUser = null;
String botChat = null;
String message = null;
Integer messageId = null;
boolean hasUrl = false;
String scheme = data.getScheme();
if (scheme != null) {
@ -758,8 +788,17 @@ public class LaunchActivity extends Activity implements ActionBarLayout.ActionBa
}
message += data.getQueryParameter("text");
}
} else if (path.length() >= 3) {
username = data.getLastPathSegment();
} else if (path.length() >= 1) {
List<String> segments = data.getPathSegments();
if (segments.size() > 0) {
username = segments.get(0);
if (segments.size() > 1) {
messageId = Utilities.parseInt(segments.get(1));
if (messageId == 0) {
messageId = null;
}
}
}
botUser = data.getQueryParameter("start");
botChat = data.getQueryParameter("startgroup");
}
@ -799,7 +838,7 @@ public class LaunchActivity extends Activity implements ActionBarLayout.ActionBa
}
}
if (username != null || group != null || sticker != null || message != null) {
runLinkRequest(username, group, sticker, botUser, botChat, message, hasUrl, 0);
runLinkRequest(username, group, sticker, botUser, botChat, message, hasUrl, messageId, 0);
} else {
try {
Cursor cursor = getContentResolver().query(intent.getData(), null, null, null, null);
@ -986,7 +1025,7 @@ public class LaunchActivity extends Activity implements ActionBarLayout.ActionBa
return false;
}
private void runLinkRequest(final String username, final String group, final String sticker, final String botUser, final String botChat, final String message, final boolean hasUrl, final int state) {
private void runLinkRequest(final String username, final String group, final String sticker, final String botUser, final String botChat, final String message, final boolean hasUrl, final Integer messageId, final int state) {
final ProgressDialog progressDialog = new ProgressDialog(this);
progressDialog.setMessage(LocaleController.getString("Loading", R.string.Loading));
progressDialog.setCanceledOnTouchOutside(false);
@ -1051,6 +1090,9 @@ public class LaunchActivity extends Activity implements ActionBarLayout.ActionBa
if (botUser != null && res.users.size() > 0 && res.users.get(0).bot) {
args.putString("botUser", botUser);
}
if (messageId != null) {
args.putInt("message_id", messageId);
}
ChatActivity fragment = new ChatActivity(args);
NotificationCenter.getInstance().postNotificationName(NotificationCenter.closeChats);
actionBarLayout.presentFragment(fragment, false, true, true);
@ -1106,7 +1148,7 @@ public class LaunchActivity extends Activity implements ActionBarLayout.ActionBa
builder.setPositiveButton(LocaleController.getString("OK", R.string.OK), new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialogInterface, int i) {
runLinkRequest(username, group, sticker, botUser, botChat, message, hasUrl, 1);
runLinkRequest(username, group, sticker, botUser, botChat, message, hasUrl, messageId, 1);
}
});
builder.setNegativeButton(LocaleController.getString("Cancel", R.string.Cancel), null);
@ -1494,7 +1536,7 @@ public class LaunchActivity extends Activity implements ActionBarLayout.ActionBa
if (requestCode == 3 || requestCode == 4 || requestCode == 5) {
if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
if (requestCode == 4) {
ImageLoader.getInstance().createMediaPaths();
ImageLoader.getInstance().checkMediaPaths();
} else if (requestCode == 5) {
ContactsController.getInstance().readContacts();
}
@ -1678,13 +1720,7 @@ public class LaunchActivity extends Activity implements ActionBarLayout.ActionBa
builder.setNegativeButton(LocaleController.getString("MoreInfo", R.string.MoreInfo), new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialogInterface, int i) {
try {
Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse(LocaleController.getString("NobodyLikesSpamUrl", R.string.NobodyLikesSpamUrl)));
intent.putExtra(Browser.EXTRA_APPLICATION_ID, getPackageName());
startActivity(intent);
} catch (Exception e) {
FileLog.e("tmessages", e);
}
AndroidUtilities.openUrl(LaunchActivity.this, LocaleController.getString("NobodyLikesSpamUrl", R.string.NobodyLikesSpamUrl));
}
});
}
@ -1882,7 +1918,7 @@ public class LaunchActivity extends Activity implements ActionBarLayout.ActionBa
@Override
public boolean onKeyUp(int keyCode, @NonNull KeyEvent event) {
if (keyCode == KeyEvent.KEYCODE_MENU) {
if (keyCode == KeyEvent.KEYCODE_MENU && !UserConfig.isWaitingForPasscodeEnter) {
if (AndroidUtilities.isTablet()) {
if (layersActionBarLayout.getVisibility() == View.VISIBLE && !layersActionBarLayout.fragmentsStack.isEmpty()) {
layersActionBarLayout.onKeyUp(keyCode, event);

View File

@ -817,10 +817,10 @@ public class LocationActivity extends BaseFragment implements NotificationCenter
if (messageObject != null && avatarImageView != null) {
int fromId = messageObject.messageOwner.from_id;
if (messageObject.isForwarded()) {
if (messageObject.messageOwner.fwd_from_id.user_id != 0) {
fromId = messageObject.messageOwner.fwd_from_id.user_id;
if (messageObject.messageOwner.fwd_from.channel_id != 0) {
fromId = -messageObject.messageOwner.fwd_from.channel_id;
} else {
fromId = -messageObject.messageOwner.fwd_from_id.channel_id;
fromId = messageObject.messageOwner.fwd_from.from_id;
}
}
String name = "";

View File

@ -400,7 +400,7 @@ public class LoginActivity extends BaseFragment {
NotificationCenter.getInstance().postNotificationName(NotificationCenter.mainUserInfoChanged);
}
public class PhoneView extends SlideView implements AdapterView.OnItemSelectedListener {
public class PhoneView extends SlideView implements AdapterView.OnItemSelectedListener, NotificationCenter.NotificationCenterDelegate {
private EditText codeField;
private HintEditText phoneField;
@ -752,6 +752,17 @@ public class LoginActivity extends BaseFragment {
}
}
@Override
public void didReceivedNotification(int id, final Object... args) {
/*if (id == NotificationCenter.didReceiveCall) {
if (codeField != null) {
String phone = (String) args[0];
phone = PhoneFormat.stripExceptNumbers(phone);
codeField.setText(phone);
}
}*/
}
@Override
public void onItemSelected(AdapterView<?> adapterView, View view, int i, long l) {
if (ignoreSelection) {
@ -785,6 +796,7 @@ public class LoginActivity extends BaseFragment {
needShowAlert(LocaleController.getString("AppName", R.string.AppName), LocaleController.getString("InvalidPhoneNumber", R.string.InvalidPhoneNumber));
return;
}
//NotificationCenter.getInstance().removeObserver(this, NotificationCenter.didReceiveCall);
ConnectionsManager.getInstance().cleanUp();
TLRPC.TL_auth_sendCode req = new TLRPC.TL_auth_sendCode();
@ -857,6 +869,7 @@ public class LoginActivity extends BaseFragment {
codeField.requestFocus();
}
}
//NotificationCenter.getInstance().addObserver(this, NotificationCenter.didReceiveCall);
}
@Override
@ -1071,9 +1084,14 @@ public class LoginActivity extends BaseFragment {
destroyTimer();
destroyCodeTimer();
timeText.setText(LocaleController.formatString("CallText", R.string.CallText, 1, 0));
lastCurrentTime = System.currentTimeMillis();
problemText.setVisibility(time < 1000 ? VISIBLE : GONE);
if (time >= 3600 * 1000) {
timeText.setVisibility(GONE);
problemText.setVisibility(GONE);
} else {
timeText.setText(LocaleController.formatString("CallText", R.string.CallText, 1, 0));
lastCurrentTime = System.currentTimeMillis();
problemText.setVisibility(time < 1000 ? VISIBLE : GONE);
}
createTimer();
}
@ -1119,7 +1137,7 @@ public class LoginActivity extends BaseFragment {
}
private void createTimer() {
if (timeTimer != null) {
if (timeTimer != null || time >= 3600 * 1000) {
return;
}
timeTimer = new Timer();

View File

@ -18,7 +18,6 @@ import android.graphics.Bitmap;
import android.net.Uri;
import android.os.Build;
import android.os.Bundle;
import android.provider.Browser;
import android.text.TextUtils;
import android.util.TypedValue;
import android.view.Gravity;
@ -446,6 +445,11 @@ public class MediaActivity extends BaseFragment implements NotificationCenter.No
if ((int) dialog_id != 0) {
dropDownContainer.addSubItem(links_item, LocaleController.getString("LinksTitle", R.string.LinksTitle), 0);
dropDownContainer.addSubItem(music_item, LocaleController.getString("AudioTitle", R.string.AudioTitle), 0);
} else {
TLRPC.EncryptedChat currentEncryptedChat = MessagesController.getInstance().getEncryptedChat((int) (dialog_id >> 32));
if (currentEncryptedChat != null && AndroidUtilities.getPeerLayerVersion(currentEncryptedChat.layer) >= 46) {
dropDownContainer.addSubItem(music_item, LocaleController.getString("AudioTitle", R.string.AudioTitle), 0);
}
}
actionBar.addView(dropDownContainer, 0, LayoutHelper.createFrame(LayoutHelper.WRAP_CONTENT, LayoutHelper.MATCH_PARENT, Gravity.TOP | Gravity.LEFT, AndroidUtilities.isTablet() ? 64 : 56, 0, 40, 0));
dropDownContainer.setOnClickListener(new View.OnClickListener() {
@ -1115,10 +1119,7 @@ public class MediaActivity extends BaseFragment implements NotificationCenter.No
link = ((SharedLinkCell) view).getLink(0);
}
if (link != null) {
Uri uri = Uri.parse(link);
Intent intent = new Intent(Intent.ACTION_VIEW, uri);
intent.putExtra(Browser.EXTRA_APPLICATION_ID, getParentActivity().getPackageName());
getParentActivity().startActivity(intent);
AndroidUtilities.openUrl(getParentActivity(), link);
}
} catch (Exception e) {
FileLog.e("tmessages", e);
@ -1541,7 +1542,7 @@ public class MediaActivity extends BaseFragment implements NotificationCenter.No
} else if (currentType == 3) {
req.filter = new TLRPC.TL_inputMessagesFilterUrl();
} else if (currentType == 4) {
req.filter = new TLRPC.TL_inputMessagesFilterAudioDocuments();
req.filter = new TLRPC.TL_inputMessagesFilterMusic();
}
req.q = query;
req.peer = MessagesController.getInputPeer(uid);

View File

@ -28,7 +28,7 @@ import android.graphics.drawable.Drawable;
import android.net.Uri;
import android.os.Build;
import android.os.Bundle;
import android.provider.Browser;
import android.text.SpannableStringBuilder;
import android.text.TextUtils;
import android.util.TypedValue;
import android.view.GestureDetector;
@ -48,6 +48,7 @@ import android.widget.Scroller;
import android.widget.TextView;
import org.telegram.messenger.AndroidUtilities;
import org.telegram.messenger.Emoji;
import org.telegram.messenger.ImageLoader;
import org.telegram.messenger.MessagesStorage;
import org.telegram.messenger.UserObject;
@ -180,19 +181,20 @@ public class PhotoViewer implements NotificationCenter.NotificationCenterDelegat
private boolean draggingDown = false;
private float dragY;
private float translationX = 0;
private float translationY = 0;
private float translationX;
private float translationY;
private float scale = 1;
private float animateToX;
private float animateToY;
private float animateToScale;
private float animationValue;
private int currentRotation;
private long animationStartTime;
private AnimatorSetProxy imageMoveAnimation;
private AnimatorSetProxy changeModeAnimation;
private GestureDetector gestureDetector;
private DecelerateInterpolator interpolator = new DecelerateInterpolator(1.5f);
private float pinchStartDistance = 0;
private float pinchStartDistance;
private float pinchStartScale = 1;
private float pinchCenterX;
private float pinchCenterY;
@ -960,7 +962,7 @@ public class PhotoViewer implements NotificationCenter.NotificationCenterDelegat
}
if (f != null && f.exists()) {
MediaController.saveFile(f.toString(), parentActivity, currentFileNames[0].endsWith("mp4") ? 1 : 0, null);
MediaController.saveFile(f.toString(), parentActivity, currentMessageObject != null && currentMessageObject.isVideo() ? 1 : 0, null);
} else {
AlertDialog.Builder builder = new AlertDialog.Builder(parentActivity);
builder.setTitle(LocaleController.getString("AppName", R.string.AppName));
@ -1020,7 +1022,7 @@ public class PhotoViewer implements NotificationCenter.NotificationCenterDelegat
return;
}
AlertDialog.Builder builder = new AlertDialog.Builder(parentActivity);
if (currentFileNames[0] != null && currentFileNames[0].endsWith("mp4")) {
if (currentMessageObject != null && currentMessageObject.isVideo()) {
builder.setMessage(LocaleController.formatString("AreYouSureDeleteVideo", R.string.AreYouSureDeleteVideo));
} else {
builder.setMessage(LocaleController.formatString("AreYouSureDeletePhoto", R.string.AreYouSureDeletePhoto));
@ -1200,13 +1202,12 @@ public class PhotoViewer implements NotificationCenter.NotificationCenterDelegat
}
try {
File f = null;
boolean isVideo = false;
if (currentMessageObject != null) {
isVideo = currentMessageObject.isVideo();
if (currentMessageObject.messageOwner.media instanceof TLRPC.TL_messageMediaWebPage) {
Uri uri = Uri.parse(currentMessageObject.messageOwner.media.webpage.url);
Intent intent = new Intent(Intent.ACTION_VIEW, uri);
intent.putExtra(Browser.EXTRA_APPLICATION_ID, parentActivity.getPackageName());
parentActivity.startActivity(intent);
AndroidUtilities.openUrl(parentActivity, currentMessageObject.messageOwner.media.webpage.url);
return;
}
f = FileLoader.getPathToMessage(currentMessageObject.messageOwner);
@ -1216,7 +1217,7 @@ public class PhotoViewer implements NotificationCenter.NotificationCenterDelegat
if (f.exists()) {
Intent intent = new Intent(Intent.ACTION_SEND);
if (f.toString().endsWith("mp4")) {
if (isVideo) {
intent.setType("video/mp4");
} else {
intent.setType("image/jpeg");
@ -1306,6 +1307,20 @@ public class PhotoViewer implements NotificationCenter.NotificationCenterDelegat
}
});
ImageView rotateButton = new ImageView(parentActivity);
rotateButton.setScaleType(ImageView.ScaleType.CENTER);
rotateButton.setImageResource(R.drawable.tool_rotate);
rotateButton.setBackgroundResource(R.drawable.bar_selector_white);
editorDoneLayout.addView(rotateButton, LayoutHelper.createFrame(48, 48, Gravity.CENTER));
rotateButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
centerImage.setOrientation(centerImage.getOrientation() - 90, false);
photoCropView.setOrientation(centerImage.getOrientation());
containerView.invalidate();
}
});
gestureDetector = new GestureDetector(containerView.getContext(), this);
gestureDetector.setOnDoubleTapListener(this);
@ -2074,23 +2089,17 @@ public class PhotoViewer implements NotificationCenter.NotificationCenterDelegat
return null;
}
if (!imagesArrLocations.isEmpty() || !imagesArr.isEmpty()) {
TLRPC.InputFileLocation file = getInputFileLocation(index);
if (file == null) {
return null;
}
if (!imagesArrLocations.isEmpty()) {
return file.volume_id + "_" + file.local_id + ".jpg";
} else if (!imagesArr.isEmpty()) {
MessageObject message = imagesArr.get(index);
if (message.messageOwner instanceof TLRPC.TL_messageService) {
return file.volume_id + "_" + file.local_id + ".jpg";
} else if (message.messageOwner.media != null) {
if (message.messageOwner.media instanceof TLRPC.TL_messageMediaVideo) {
return file.volume_id + "_" + file.id + ".mp4";
} else if (message.messageOwner.media instanceof TLRPC.TL_messageMediaPhoto || message.messageOwner.media instanceof TLRPC.TL_messageMediaWebPage) {
return file.volume_id + "_" + file.local_id + ".jpg";
}
if (index >= imagesArrLocations.size()) {
return null;
}
TLRPC.FileLocation location = imagesArrLocations.get(index);
return location.volume_id + "_" + location.local_id + ".jpg";
} else if (!imagesArr.isEmpty()) {
if (index >= imagesArr.size()) {
return null;
}
return FileLoader.getMessageFileName(imagesArr.get(index).messageOwner);
}
} else if (!imagesArrLocals.isEmpty()) {
if (index >= imagesArrLocals.size()) {
@ -2109,7 +2118,7 @@ public class PhotoViewer implements NotificationCenter.NotificationCenterDelegat
searchImage.localUrl = "";
}
}
return Utilities.MD5(searchImage.imageUrl) + "." + ImageLoader.getHttpUrlExtension(searchImage.imageUrl);
return Utilities.MD5(searchImage.imageUrl) + "." + ImageLoader.getHttpUrlExtension(searchImage.imageUrl, "jpg");
}
}
return null;
@ -2156,72 +2165,12 @@ public class PhotoViewer implements NotificationCenter.NotificationCenterDelegat
} else {
size[0] = -1;
}
} else if (message.messageOwner.media instanceof TLRPC.TL_messageMediaVideo && message.messageOwner.media.video != null && message.messageOwner.media.video.thumb != null) {
size[0] = message.messageOwner.media.video.thumb.size;
} else if (message.messageOwner.media instanceof TLRPC.TL_messageMediaDocument && message.messageOwner.media.document != null && message.messageOwner.media.document.thumb != null) {
size[0] = message.messageOwner.media.document.thumb.size;
if (size[0] == 0) {
size[0] = -1;
}
return message.messageOwner.media.video.thumb.location;
}
}
return null;
}
private TLRPC.InputFileLocation getInputFileLocation(int index) {
if (index < 0) {
return null;
}
if (!imagesArrLocations.isEmpty()) {
if (index >= imagesArrLocations.size()) {
return null;
}
TLRPC.FileLocation sizeFull = imagesArrLocations.get(index);
TLRPC.TL_inputFileLocation location = new TLRPC.TL_inputFileLocation();
location.local_id = sizeFull.local_id;
location.volume_id = sizeFull.volume_id;
location.id = sizeFull.dc_id;
location.secret = sizeFull.secret;
return location;
} else if (!imagesArr.isEmpty()) {
if (index >= imagesArr.size()) {
return null;
}
MessageObject message = imagesArr.get(index);
if (message.messageOwner instanceof TLRPC.TL_messageService) {
if (message.messageOwner.action instanceof TLRPC.TL_messageActionUserUpdatedPhoto) {
TLRPC.FileLocation sizeFull = message.messageOwner.action.newUserPhoto.photo_big;
TLRPC.TL_inputFileLocation location = new TLRPC.TL_inputFileLocation();
location.local_id = sizeFull.local_id;
location.volume_id = sizeFull.volume_id;
location.id = sizeFull.dc_id;
location.secret = sizeFull.secret;
return location;
} else {
TLRPC.PhotoSize sizeFull = FileLoader.getClosestPhotoSizeWithSize(message.photoThumbs, AndroidUtilities.getPhotoSize());
if (sizeFull != null) {
TLRPC.TL_inputFileLocation location = new TLRPC.TL_inputFileLocation();
location.local_id = sizeFull.location.local_id;
location.volume_id = sizeFull.location.volume_id;
location.id = sizeFull.location.dc_id;
location.secret = sizeFull.location.secret;
return location;
}
}
} else if (message.messageOwner.media instanceof TLRPC.TL_messageMediaPhoto || message.messageOwner.media instanceof TLRPC.TL_messageMediaWebPage) {
TLRPC.PhotoSize sizeFull = FileLoader.getClosestPhotoSizeWithSize(message.photoThumbs, AndroidUtilities.getPhotoSize());
if (sizeFull != null) {
TLRPC.TL_inputFileLocation location = new TLRPC.TL_inputFileLocation();
location.local_id = sizeFull.location.local_id;
location.volume_id = sizeFull.location.volume_id;
location.id = sizeFull.location.dc_id;
location.secret = sizeFull.location.secret;
return location;
}
} else if (message.messageOwner.media instanceof TLRPC.TL_messageMediaVideo) {
TLRPC.TL_inputVideoFileLocation location = new TLRPC.TL_inputVideoFileLocation();
location.volume_id = message.messageOwner.media.video.dc_id;
location.id = message.messageOwner.media.video.id;
return location;
return message.messageOwner.media.document.thumb.location;
}
}
return null;
@ -2353,7 +2302,7 @@ public class PhotoViewer implements NotificationCenter.NotificationCenterDelegat
canShowBottom = false;
Object obj = imagesArrLocals.get(index);
cropItem.setVisibility(obj instanceof MediaController.PhotoEntry || obj instanceof MediaController.SearchImage && ((MediaController.SearchImage) obj).type == 0 ? View.VISIBLE : View.GONE);
if (parentChatActivity != null && parentChatActivity.currentEncryptedChat == null) {
if (parentChatActivity != null && (parentChatActivity.currentEncryptedChat == null || AndroidUtilities.getPeerLayerVersion(parentChatActivity.currentEncryptedChat.layer) >= 46)) {
mentionsAdapter.setChatInfo(parentChatActivity.info);
mentionsAdapter.setNeedUsernames(parentChatActivity.currentChat != null);
mentionsAdapter.setNeedBotContext(false);
@ -2401,7 +2350,7 @@ public class PhotoViewer implements NotificationCenter.NotificationCenterDelegat
placeProvider.willSwitchFromPhoto(currentMessageObject, currentFileLocation, currentIndex);
int prevIndex = currentIndex;
currentIndex = index;
boolean isVideo = false;
boolean sameImage = false;
if (!imagesArr.isEmpty()) {
@ -2410,12 +2359,13 @@ public class PhotoViewer implements NotificationCenter.NotificationCenterDelegat
return;
}
currentMessageObject = imagesArr.get(currentIndex);
isVideo = currentMessageObject.isVideo();
if (currentMessageObject.canDeleteMessage(null)) {
menuItem.showSubItem(gallery_menu_delete);
} else {
menuItem.hideSubItem(gallery_menu_delete);
}
if (currentMessageObject.messageOwner.from_id > 0) {
if (currentMessageObject.isFromUser()) {
TLRPC.User user = MessagesController.getInstance().getUser(currentMessageObject.messageOwner.from_id);
if (user != null) {
nameTextView.setText(UserObject.getUserName(user));
@ -2423,7 +2373,7 @@ public class PhotoViewer implements NotificationCenter.NotificationCenterDelegat
nameTextView.setText("");
}
} else {
TLRPC.Chat chat = MessagesController.getInstance().getChat(-currentMessageObject.messageOwner.from_id);
TLRPC.Chat chat = MessagesController.getInstance().getChat(currentMessageObject.messageOwner.to_id.channel_id);
if (chat != null) {
nameTextView.setText(chat.title);
} else {
@ -2432,8 +2382,8 @@ public class PhotoViewer implements NotificationCenter.NotificationCenterDelegat
}
long date = (long) currentMessageObject.messageOwner.date * 1000;
String dateString = LocaleController.formatString("formatDateAtTime", R.string.formatDateAtTime, LocaleController.getInstance().formatterYear.format(new Date(date)), LocaleController.getInstance().formatterDay.format(new Date(date)));
if (currentFileNames[0] != null && currentFileNames[0].endsWith("mp4")) {
dateTextView.setText(String.format("%s (%s)", dateString, AndroidUtilities.formatFileSize(currentMessageObject.messageOwner.media.video.size)));
if (currentFileNames[0] != null && isVideo) {
dateTextView.setText(String.format("%s (%s)", dateString, AndroidUtilities.formatFileSize(currentMessageObject.messageOwner.media.document.size)));
} else {
dateTextView.setText(dateString);
}
@ -2580,7 +2530,7 @@ public class PhotoViewer implements NotificationCenter.NotificationCenterDelegat
canDragDown = true;
changingPage = false;
switchImageAfterAnimation = 0;
canZoom = !imagesArrLocals.isEmpty() || (currentFileNames[0] != null && !currentFileNames[0].endsWith("mp4") && radialProgressViews[0].backgroundState != 0);
canZoom = !imagesArrLocals.isEmpty() || (currentFileNames[0] != null && !isVideo && radialProgressViews[0].backgroundState != 0);
updateMinMax(scale);
}
@ -2629,8 +2579,9 @@ public class PhotoViewer implements NotificationCenter.NotificationCenterDelegat
captionTextViewNew = captionTextView;
captionItem.setIcon(R.drawable.photo_text2);
captionTextView.setTag(caption);
captionTextView.setText(caption);
CharSequence str = Emoji.replaceEmoji(new SpannableStringBuilder(caption.toString()), MessageObject.textPaint.getFontMetricsInt(), AndroidUtilities.dp(20), false);
captionTextView.setTag(str);
captionTextView.setText(str);
ViewProxy.setAlpha(captionTextView, bottomLayout.getVisibility() == View.VISIBLE || pickerView.getVisibility() == View.VISIBLE ? 1.0f : 0.0f);
AndroidUtilities.runOnUIThread(new Runnable() {
@Override
@ -2658,9 +2609,11 @@ public class PhotoViewer implements NotificationCenter.NotificationCenterDelegat
index -= 1;
}
File f = null;
boolean isVideo = false;
if (currentMessageObject != null) {
MessageObject messageObject = imagesArr.get(index);
f = FileLoader.getPathToMessage(messageObject.messageOwner);
isVideo = messageObject.isVideo();
} else if (currentFileLocation != null) {
TLRPC.FileLocation location = imagesArrLocations.get(index);
f = FileLoader.getPathToAttach(location, avatarsUserId != 0);
@ -2671,13 +2624,13 @@ public class PhotoViewer implements NotificationCenter.NotificationCenterDelegat
}
}
if (f != null && f.exists()) {
if (currentPathObject == null && currentFileNames[a].endsWith("mp4")) {
if (isVideo) {
radialProgressViews[a].setBackgroundState(3, animated);
} else {
radialProgressViews[a].setBackgroundState(-1, animated);
}
} else {
if (currentPathObject == null && currentFileNames[a].endsWith("mp4")) {
if (isVideo) {
if (!FileLoader.getInstance().isLoadingFile(currentFileNames[a])) {
radialProgressViews[a].setBackgroundState(2, false);
} else {
@ -2693,7 +2646,7 @@ public class PhotoViewer implements NotificationCenter.NotificationCenterDelegat
radialProgressViews[a].setProgress(progress, false);
}
if (a == 0) {
canZoom = !imagesArrLocals.isEmpty() || (currentFileNames[0] != null && !currentFileNames[0].endsWith("mp4") && radialProgressViews[0].backgroundState != 0);
canZoom = !imagesArrLocals.isEmpty() || (currentFileNames[0] != null && !isVideo && radialProgressViews[0].backgroundState != 0);
}
} else {
radialProgressViews[a].setBackgroundState(-1, animated);
@ -2762,9 +2715,9 @@ public class PhotoViewer implements NotificationCenter.NotificationCenterDelegat
imageReceiver.setShouldGenerateQualityThumb(true);
}
if (messageObject != null && messageObject.messageOwner.media instanceof TLRPC.TL_messageMediaVideo) {
if (messageObject != null && messageObject.isVideo()) {
imageReceiver.setNeedsQualityThumb(true);
if (messageObject.messageOwner.media.video.thumb != null) {
if (messageObject.photoThumbs != null && !messageObject.photoThumbs.isEmpty()) {
Bitmap placeHolder = null;
if (currentThumb != null && imageReceiver == centerImage) {
placeHolder = currentThumb;
@ -3963,9 +3916,9 @@ public class PhotoViewer implements NotificationCenter.NotificationCenterDelegat
}
if (loadFile) {
if (!FileLoader.getInstance().isLoadingFile(currentFileNames[0])) {
FileLoader.getInstance().loadFile(currentMessageObject.messageOwner.media.video, true);
FileLoader.getInstance().loadFile(currentMessageObject.messageOwner.media.document, true, false);
} else {
FileLoader.getInstance().cancelLoadFile(currentMessageObject.messageOwner.media.video);
FileLoader.getInstance().cancelLoadFile(currentMessageObject.messageOwner.media.document);
}
}
}

View File

@ -308,6 +308,11 @@ public class PopupNotificationActivity extends Activity implements NotificationC
}
@Override
public void onMessageEditEnd() {
}
@Override
public void needSendTyping() {
if (currentMessageObject != null) {

View File

@ -43,14 +43,14 @@ import org.telegram.ui.ActionBar.ActionBarMenu;
import org.telegram.ui.ActionBar.BaseFragment;
import org.telegram.ui.Adapters.BaseFragmentAdapter;
import org.telegram.ui.Cells.HeaderCell;
import org.telegram.ui.Cells.LastSeenRadioCell;
import org.telegram.ui.Cells.RadioCell;
import org.telegram.ui.Cells.TextInfoPrivacyCell;
import org.telegram.ui.Cells.TextSettingsCell;
import org.telegram.ui.Components.LayoutHelper;
import java.util.ArrayList;
public class LastSeenActivity extends BaseFragment implements NotificationCenter.NotificationCenterDelegate {
public class PrivacyControlActivity extends BaseFragment implements NotificationCenter.NotificationCenterDelegate {
private ListAdapter listAdapter;
private View doneButton;
@ -60,11 +60,15 @@ public class LastSeenActivity extends BaseFragment implements NotificationCenter
private ArrayList<Integer> currentMinus;
private int lastCheckedType = -1;
private int lastSeenSectionRow;
private boolean isGroup;
private boolean enableAnimation;
private int sectionRow;
private int everybodyRow;
private int myContactsRow;
private int nobodyRow;
private int lastSeenDetailRow;
private int detailRow;
private int shareSectionRow;
private int alwaysShareRow;
private int neverShareRow;
@ -85,6 +89,11 @@ public class LastSeenActivity extends BaseFragment implements NotificationCenter
}
}
public PrivacyControlActivity(boolean group) {
super();
isGroup = group;
}
@Override
public boolean onFragmentCreate() {
super.onFragmentCreate();
@ -104,7 +113,11 @@ public class LastSeenActivity extends BaseFragment implements NotificationCenter
public View createView(Context context) {
actionBar.setBackButtonImage(R.drawable.ic_ab_back);
actionBar.setAllowOverlayTitle(true);
actionBar.setTitle(LocaleController.getString("PrivacyLastSeen", R.string.PrivacyLastSeen));
if (isGroup) {
actionBar.setTitle(LocaleController.getString("GroupsAndChannels", R.string.GroupsAndChannels));
} else {
actionBar.setTitle(LocaleController.getString("PrivacyLastSeen", R.string.PrivacyLastSeen));
}
actionBar.setActionBarMenuOnItemClick(new ActionBar.ActionBarMenuOnItemClick() {
@Override
public void onItemClick(int id) {
@ -115,12 +128,16 @@ public class LastSeenActivity extends BaseFragment implements NotificationCenter
return;
}
if (currentType != 0) {
if (currentType != 0 && !isGroup) {
final SharedPreferences preferences = ApplicationLoader.applicationContext.getSharedPreferences("mainconfig", Activity.MODE_PRIVATE);
boolean showed = preferences.getBoolean("privacyAlertShowed", false);
if (!showed) {
AlertDialog.Builder builder = new AlertDialog.Builder(getParentActivity());
builder.setMessage(LocaleController.getString("CustomHelp", R.string.CustomHelp));
if (isGroup) {
builder.setMessage(LocaleController.getString("WhoCanAddMeInfo", R.string.WhoCanAddMeInfo));
} else {
builder.setMessage(LocaleController.getString("CustomHelp", R.string.CustomHelp));
}
builder.setTitle(LocaleController.getString("AppName", R.string.AppName));
builder.setPositiveButton(LocaleController.getString("OK", R.string.OK), new DialogInterface.OnClickListener() {
@Override
@ -176,6 +193,7 @@ public class LastSeenActivity extends BaseFragment implements NotificationCenter
if (newType == currentType) {
return;
}
enableAnimation = true;
doneButton.setVisibility(View.VISIBLE);
lastCheckedType = currentType;
currentType = newType;
@ -190,19 +208,20 @@ public class LastSeenActivity extends BaseFragment implements NotificationCenter
if (createFromArray.isEmpty()) {
Bundle args = new Bundle();
args.putBoolean(i == neverShareRow ? "isNeverShare" : "isAlwaysShare", true);
args.putBoolean("isGroup", isGroup);
GroupCreateActivity fragment = new GroupCreateActivity(args);
fragment.setDelegate(new GroupCreateActivity.GroupCreateActivityDelegate() {
@Override
public void didSelectUsers(ArrayList<Integer> ids) {
if (i == neverShareRow) {
currentMinus = ids;
for (Integer id : currentMinus) {
currentPlus.remove(id);
for (int a = 0; a < currentMinus.size(); a++) {
currentPlus.remove(currentMinus.get(a));
}
} else {
currentPlus = ids;
for (Integer id : currentPlus) {
currentMinus.remove(id);
for (int a = 0; a < currentPlus.size(); a++) {
currentMinus.remove(currentPlus.get(a));
}
}
doneButton.setVisibility(View.VISIBLE);
@ -212,22 +231,22 @@ public class LastSeenActivity extends BaseFragment implements NotificationCenter
});
presentFragment(fragment);
} else {
LastSeenUsersActivity fragment = new LastSeenUsersActivity(createFromArray, i == alwaysShareRow);
fragment.setDelegate(new LastSeenUsersActivity.LastSeenUsersActivityDelegate() {
PrivacyUsersActivity fragment = new PrivacyUsersActivity(createFromArray, isGroup, i == alwaysShareRow);
fragment.setDelegate(new PrivacyUsersActivity.PrivacyActivityDelegate() {
@Override
public void didUpdatedUserList(ArrayList<Integer> ids, boolean added) {
if (i == neverShareRow) {
currentMinus = ids;
if (added) {
for (Integer id : currentMinus) {
currentPlus.remove(id);
for (int a = 0; a < currentMinus.size(); a++) {
currentPlus.remove(currentMinus.get(a));
}
}
} else {
currentPlus = ids;
if (added) {
for (Integer id : currentPlus) {
currentMinus.remove(id);
for (int a = 0; a < currentPlus.size(); a++) {
currentMinus.remove(currentPlus.get(a));
}
}
}
@ -253,11 +272,15 @@ public class LastSeenActivity extends BaseFragment implements NotificationCenter
private void applyCurrentPrivacySettings() {
TLRPC.TL_account_setPrivacy req = new TLRPC.TL_account_setPrivacy();
req.key = new TLRPC.TL_inputPrivacyKeyStatusTimestamp();
if (isGroup) {
req.key = new TLRPC.TL_inputPrivacyKeyChatInvite();
} else {
req.key = new TLRPC.TL_inputPrivacyKeyStatusTimestamp();
}
if (currentType != 0 && currentPlus.size() > 0) {
TLRPC.TL_inputPrivacyValueAllowUsers rule = new TLRPC.TL_inputPrivacyValueAllowUsers();
for (Integer uid : currentPlus) {
TLRPC.User user = MessagesController.getInstance().getUser(uid);
for (int a = 0; a < currentPlus.size(); a++) {
TLRPC.User user = MessagesController.getInstance().getUser(currentPlus.get(a));
if (user != null) {
TLRPC.InputUser inputUser = MessagesController.getInputUser(user);
if (inputUser != null) {
@ -269,8 +292,8 @@ public class LastSeenActivity extends BaseFragment implements NotificationCenter
}
if (currentType != 1 && currentMinus.size() > 0) {
TLRPC.TL_inputPrivacyValueDisallowUsers rule = new TLRPC.TL_inputPrivacyValueDisallowUsers();
for (Integer uid : currentMinus) {
TLRPC.User user = MessagesController.getInstance().getUser(uid);
for (int a = 0; a < currentMinus.size(); a++) {
TLRPC.User user = MessagesController.getInstance().getUser(currentMinus.get(a));
if (user != null) {
TLRPC.InputUser inputUser = MessagesController.getInputUser(user);
if (inputUser != null) {
@ -313,7 +336,7 @@ public class LastSeenActivity extends BaseFragment implements NotificationCenter
finishFragment();
TLRPC.TL_account_privacyRules rules = (TLRPC.TL_account_privacyRules) response;
MessagesController.getInstance().putUsers(rules.users, false);
ContactsController.getInstance().setPrivacyRules(rules.rules);
ContactsController.getInstance().setPrivacyRules(rules.rules, isGroup);
} else {
showErrorAlert();
}
@ -337,13 +360,14 @@ public class LastSeenActivity extends BaseFragment implements NotificationCenter
private void checkPrivacy() {
currentPlus = new ArrayList<>();
currentMinus = new ArrayList<>();
ArrayList<TLRPC.PrivacyRule> privacyRules = ContactsController.getInstance().getPrivacyRules();
ArrayList<TLRPC.PrivacyRule> privacyRules = ContactsController.getInstance().getPrivacyRules(isGroup);
if (privacyRules.size() == 0) {
currentType = 1;
return;
}
int type = -1;
for (TLRPC.PrivacyRule rule : privacyRules) {
for (int a = 0; a < privacyRules.size(); a++) {
TLRPC.PrivacyRule rule = privacyRules.get(a);
if (rule instanceof TLRPC.TL_privacyValueAllowUsers) {
currentPlus.addAll(rule.users);
} else if (rule instanceof TLRPC.TL_privacyValueDisallowUsers) {
@ -371,11 +395,15 @@ public class LastSeenActivity extends BaseFragment implements NotificationCenter
private void updateRows() {
rowCount = 0;
lastSeenSectionRow = rowCount++;
sectionRow = rowCount++;
everybodyRow = rowCount++;
myContactsRow = rowCount++;
nobodyRow = rowCount++;
lastSeenDetailRow = rowCount++;
if (isGroup) {
nobodyRow = -1;
} else {
nobodyRow = rowCount++;
}
detailRow = rowCount++;
shareSectionRow = rowCount++;
if (currentType == 1 || currentType == 2) {
alwaysShareRow = rowCount++;
@ -397,9 +425,7 @@ public class LastSeenActivity extends BaseFragment implements NotificationCenter
public void onResume() {
super.onResume();
lastCheckedType = -1;
if (listAdapter != null) {
listAdapter.notifyDataSetChanged();
}
enableAnimation = false;
}
private class ListAdapter extends BaseFragmentAdapter {
@ -455,7 +481,11 @@ public class LastSeenActivity extends BaseFragment implements NotificationCenter
} else {
value = LocaleController.getString("EmpryUsersPlaceholder", R.string.EmpryUsersPlaceholder);
}
textCell.setTextAndValue(LocaleController.getString("AlwaysShareWith", R.string.AlwaysShareWith), value, neverShareRow != -1);
if (isGroup) {
textCell.setTextAndValue(LocaleController.getString("AlwaysAllow", R.string.AlwaysAllow), value, neverShareRow != -1);
} else {
textCell.setTextAndValue(LocaleController.getString("AlwaysShareWith", R.string.AlwaysShareWith), value, neverShareRow != -1);
}
} else if (i == neverShareRow) {
String value;
if (currentMinus.size() != 0) {
@ -463,18 +493,30 @@ public class LastSeenActivity extends BaseFragment implements NotificationCenter
} else {
value = LocaleController.getString("EmpryUsersPlaceholder", R.string.EmpryUsersPlaceholder);
}
textCell.setTextAndValue(LocaleController.getString("NeverShareWith", R.string.NeverShareWith), value, false);
if (isGroup) {
textCell.setTextAndValue(LocaleController.getString("NeverAllow", R.string.NeverAllow), value, false);
} else {
textCell.setTextAndValue(LocaleController.getString("NeverShareWith", R.string.NeverShareWith), value, false);
}
}
} else if (type == 1) {
if (view == null) {
view = new TextInfoPrivacyCell(mContext);
view.setBackgroundColor(0xffffffff);
}
if (i == lastSeenDetailRow) {
((TextInfoPrivacyCell) view).setText(LocaleController.getString("CustomHelp", R.string.CustomHelp));
if (i == detailRow) {
if (isGroup) {
((TextInfoPrivacyCell) view).setText(LocaleController.getString("WhoCanAddMeInfo", R.string.WhoCanAddMeInfo));
} else {
((TextInfoPrivacyCell) view).setText(LocaleController.getString("CustomHelp", R.string.CustomHelp));
}
view.setBackgroundResource(R.drawable.greydivider);
} else if (i == shareDetailRow) {
((TextInfoPrivacyCell) view).setText(LocaleController.getString("CustomShareSettingsHelp", R.string.CustomShareSettingsHelp));
if (isGroup) {
((TextInfoPrivacyCell) view).setText(LocaleController.getString("CustomShareInfo", R.string.CustomShareInfo));
} else {
((TextInfoPrivacyCell) view).setText(LocaleController.getString("CustomShareSettingsHelp", R.string.CustomShareSettingsHelp));
}
view.setBackgroundResource(R.drawable.greydivider_bottom);
}
} else if (type == 2) {
@ -482,32 +524,36 @@ public class LastSeenActivity extends BaseFragment implements NotificationCenter
view = new HeaderCell(mContext);
view.setBackgroundColor(0xffffffff);
}
if (i == lastSeenSectionRow) {
((HeaderCell) view).setText(LocaleController.getString("LastSeenTitle", R.string.LastSeenTitle));
if (i == sectionRow) {
if (isGroup) {
((HeaderCell) view).setText(LocaleController.getString("WhoCanAddMe", R.string.WhoCanAddMe));
} else {
((HeaderCell) view).setText(LocaleController.getString("LastSeenTitle", R.string.LastSeenTitle));
}
} else if (i == shareSectionRow) {
((HeaderCell) view).setText(LocaleController.getString("AddExceptions", R.string.AddExceptions));
}
} else if (type == 3) {
if (view == null) {
view = new LastSeenRadioCell(mContext);
view = new RadioCell(mContext);
view.setBackgroundColor(0xffffffff);
}
LastSeenRadioCell textCell = (LastSeenRadioCell) view;
RadioCell textCell = (RadioCell) view;
int checkedType = 0;
if (i == everybodyRow) {
textCell.setText(LocaleController.getString("LastSeenEverybody", R.string.LastSeenEverybody), lastCheckedType == 0, true);
checkedType = 0;
} else if (i == myContactsRow) {
textCell.setText(LocaleController.getString("LastSeenContacts", R.string.LastSeenContacts), lastCheckedType == 2, true);
textCell.setText(LocaleController.getString("LastSeenContacts", R.string.LastSeenContacts), lastCheckedType == 2, nobodyRow != -1);
checkedType = 2;
} else if (i == nobodyRow) {
textCell.setText(LocaleController.getString("LastSeenNobody", R.string.LastSeenNobody), lastCheckedType == 1, false);
checkedType = 1;
}
if (lastCheckedType == checkedType) {
textCell.setChecked(false, true);
textCell.setChecked(false, enableAnimation);
} else if (currentType == checkedType) {
textCell.setChecked(true, true);
textCell.setChecked(true, enableAnimation);
}
}
return view;
@ -517,9 +563,9 @@ public class LastSeenActivity extends BaseFragment implements NotificationCenter
public int getItemViewType(int i) {
if (i == alwaysShareRow || i == neverShareRow) {
return 0;
} else if (i == shareDetailRow || i == lastSeenDetailRow) {
} else if (i == shareDetailRow || i == detailRow) {
return 1;
} else if (i == lastSeenSectionRow || i == shareSectionRow) {
} else if (i == sectionRow || i == shareSectionRow) {
return 2;
} else if (i == everybodyRow || i == myContactsRow || i == nobodyRow) {
return 3;

Some files were not shown because too many files have changed in this diff Show More